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

Richard Hughes hughsient at kemper.freedesktop.org
Tue May 4 10:04:59 PDT 2010


 backends/apt/aptBackend.py                  |    2 
 backends/entropy/entropyBackend.py          |   16 
 backends/yum/Makefile.am                    |   13 
 backends/yum/libzif/egg-string.c            |    1 
 backends/yum/libzif/egg-string.h            |    1 
 backends/yum/libzif/zif-changeset.c         |  479 +++++++++
 backends/yum/libzif/zif-changeset.h         |   84 +
 backends/yum/libzif/zif-completion.c        |   94 +
 backends/yum/libzif/zif-completion.h        |   27 
 backends/yum/libzif/zif-config.c            |   86 +
 backends/yum/libzif/zif-download.c          |    8 
 backends/yum/libzif/zif-groups.c            |   11 
 backends/yum/libzif/zif-lock.c              |    2 
 backends/yum/libzif/zif-md-comps.c          |    1 
 backends/yum/libzif/zif-md-filelists-sql.c  |  542 +++++++++++
 backends/yum/libzif/zif-md-filelists-sql.h  |   63 +
 backends/yum/libzif/zif-md-filelists-xml.c  |  675 ++++++++++++++
 backends/yum/libzif/zif-md-filelists-xml.h  |   63 +
 backends/yum/libzif/zif-md-filelists.c      |  450 ---------
 backends/yum/libzif/zif-md-filelists.h      |   68 -
 backends/yum/libzif/zif-md-metalink.c       |    1 
 backends/yum/libzif/zif-md-mirrorlist.c     |    1 
 backends/yum/libzif/zif-md-other-sql.c      |  524 ++++++++++
 backends/yum/libzif/zif-md-other-sql.h      |   63 +
 backends/yum/libzif/zif-md-primary-sql.c    |  199 ++--
 backends/yum/libzif/zif-md-primary-xml.c    |  169 ++-
 backends/yum/libzif/zif-md-updateinfo.c     |   24 
 backends/yum/libzif/zif-md.c                |  155 ++-
 backends/yum/libzif/zif-md.h                |   49 -
 backends/yum/libzif/zif-monitor.c           |    1 
 backends/yum/libzif/zif-package-local.c     |   10 
 backends/yum/libzif/zif-package-remote.c    |  113 ++
 backends/yum/libzif/zif-package-remote.h    |    6 
 backends/yum/libzif/zif-package.c           |  141 +-
 backends/yum/libzif/zif-package.h           |   37 
 backends/yum/libzif/zif-repos.c             |    3 
 backends/yum/libzif/zif-self-test.c         |   87 -
 backends/yum/libzif/zif-store-array.c       |   43 
 backends/yum/libzif/zif-store-array.h       |   14 
 backends/yum/libzif/zif-store-local.c       |  171 ++-
 backends/yum/libzif/zif-store-remote.c      |  302 ++++--
 backends/yum/libzif/zif-store-remote.h      |    5 
 backends/yum/libzif/zif-store.c             |   15 
 backends/yum/libzif/zif-store.h             |   28 
 backends/yum/libzif/zif-update.c            |   87 +
 backends/yum/libzif/zif-update.h            |    7 
 backends/yum/libzif/zif-utils.c             |   11 
 backends/yum/licenses.txt                   |  187 +++
 backends/yum/pk-backend-yum.c               |  263 ++---
 backends/yum/yumBackend.py                  |   39 
 backends/yum/yumComps.py                    |    5 
 backends/zypp/pk-backend-zypp.cpp           |  492 +++++-----
 backends/zypp/zypp-utils.cpp                |  209 ++--
 backends/zypp/zypp-utils.h                  |   24 
 client/pk-console.c                         |   17 
 configure.ac                                |   12 
 contrib/Makefile.am                         |    4 
 contrib/PackageKit.spec.in                  |    6 
 contrib/ruck/AUTHORS                        |    3 
 contrib/ruck/Makefile.am                    |    9 
 contrib/ruck/README                         |   20 
 contrib/ruck/src/.gitignore                 |    2 
 contrib/ruck/src/Makefile.am                |   31 
 contrib/ruck/src/i18n.py                    |   32 
 contrib/ruck/src/ruck.in                    |   52 -
 contrib/ruck/src/ruckcachecmds.py           |  349 -------
 contrib/ruck/src/ruckcommand.py             |  641 -------------
 contrib/ruck/src/ruckformat.py              |  293 ------
 contrib/ruck/src/ruckmain.py                |  175 ---
 contrib/ruck/src/ruckpackagecmds.py         | 1343 ----------------------------
 contrib/ruck/src/rucktalk.py                |   81 -
 contrib/ruck/src/rucktransactcmds.py        |  244 -----
 contrib/ruck/src/ruckyum.py                 |  295 ------
 etc/PackageKit.conf.in                      |   14 
 lib/packagekit-glib2/pk-control-sync.c      |   53 +
 lib/packagekit-glib2/pk-control-sync.h      |    4 
 lib/packagekit-glib2/pk-control.c           |  148 +++
 lib/packagekit-glib2/pk-control.h           |    8 
 lib/packagekit-glib2/pk-enum.c              |    1 
 lib/packagekit-glib2/pk-enum.h              |    1 
 lib/packagekit-qt/src/Makefile.am           |    5 
 po/da.po                                    |  468 ++++-----
 po/es.po                                    |  232 +---
 po/id.po                                    |   83 -
 po/nl.po                                    |  133 +-
 po/pa.po                                    |  631 ++++++-------
 po/pl.po                                    |  133 +-
 po/pt.po                                    |  341 +++----
 po/sr.po                                    |  136 +-
 po/sr at latin.po                              |  136 +-
 po/uk.po                                    |  156 +--
 policy/org.freedesktop.packagekit.policy.in |   17 
 src/egg-string.c                            |    2 
 src/org.freedesktop.PackageKit.xml          |   21 
 src/pk-backend-internal.h                   |    2 
 src/pk-backend-spawn.c                      |    8 
 src/pk-backend.c                            |   33 
 src/pk-backend.h                            |    1 
 src/pk-engine.c                             |  299 +++++-
 src/pk-engine.h                             |    4 
 src/pk-spawn.c                              |    7 
 src/pk-transaction-db.c                     |  193 ++++
 src/pk-transaction-db.h                     |    8 
 src/pk-transaction.c                        |   26 
 tools/pk-refresh-licenses.c                 |   17 
 105 files changed, 6746 insertions(+), 6355 deletions(-)

New commits:
commit c7f9942f597cea2da551a1f65ea948837a49e4a1
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue May 4 14:59:02 2010 +0100

    yum: ensure we catch the exception if there are no groups. Fixes rh#587196

diff --git a/backends/yum/yumBackend.py b/backends/yum/yumBackend.py
index 29b6d8f..c88e0b7 100755
--- a/backends/yum/yumBackend.py
+++ b/backends/yum/yumBackend.py
@@ -833,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 yum.Errors.GroupsError, e:
+            self.error(ERROR_GROUP_LIST_INVALID, "Failed to get groups 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:
commit b4c32e864abbdf1d7ed359657e4bf4a90359faca
Author: Michael Meeks <michael.meeks at novell.com>
Date:   Tue May 4 11:57:08 2010 +0100

    cleanup calling convention

diff --git a/backends/zypp/pk-backend-zypp.cpp b/backends/zypp/pk-backend-zypp.cpp
index 45557c6..0e0e3ac 100644
--- a/backends/zypp/pk-backend-zypp.cpp
+++ b/backends/zypp/pk-backend-zypp.cpp
@@ -1346,7 +1346,7 @@ backend_find_packages_thread (PkBackend *backend)
 	if ( ! q.empty() ) {
 		std::copy( q.begin(), q.end(), std::back_inserter( v ) );
 	}
-	zypp_emit_filtered_packages_in_list (backend, &v);
+	zypp_emit_filtered_packages_in_list (backend, v);
 
 	pk_backend_finished (backend);
 	return TRUE;
@@ -1406,7 +1406,7 @@ backend_search_group_thread (PkBackend *backend)
 
 	pk_backend_set_percentage (backend, 70);
 
-	zypp_emit_filtered_packages_in_list (backend, &v);
+	zypp_emit_filtered_packages_in_list (backend, v);
 
 	pk_backend_set_percentage (backend, 100);
 	pk_backend_finished (backend);
@@ -1596,7 +1596,7 @@ backend_get_packages_thread (PkBackend *backend)
 		v.push_back (it->satSolvable ());
 	}
 
-	zypp_emit_filtered_packages_in_list (backend, &v);
+	zypp_emit_filtered_packages_in_list (backend, v);
 
 	pk_backend_finished (backend);
 	return TRUE;
diff --git a/backends/zypp/zypp-utils.cpp b/backends/zypp/zypp-utils.cpp
index 825f1df..03aeed4 100644
--- a/backends/zypp/zypp-utils.cpp
+++ b/backends/zypp/zypp-utils.cpp
@@ -575,12 +575,12 @@ zypp_filter_solvable (PkBitfield filters, const zypp::sat::Solvable &item)
 }
 
 void
-zypp_emit_filtered_packages_in_list (PkBackend *backend, std::vector<zypp::sat::Solvable> *v)
+zypp_emit_filtered_packages_in_list (PkBackend *backend, const std::vector<zypp::sat::Solvable> &v)
 {
 	PkBitfield filters = (PkBitfield) pk_backend_get_uint (backend, "filters");
 
-	for (std::vector<zypp::sat::Solvable>::iterator it = v->begin ();
-			it != v->end (); it++) {
+	for (std::vector<zypp::sat::Solvable>::const_iterator it = v.begin ();
+			it != v.end (); it++) {
 		gchar *package_id = zypp_build_package_id_from_resolvable (*it);
 
 		if (zypp_filter_solvable (filters, *it))
diff --git a/backends/zypp/zypp-utils.h b/backends/zypp/zypp-utils.h
index 775f482..ad2cda6 100644
--- a/backends/zypp/zypp-utils.h
+++ b/backends/zypp/zypp-utils.h
@@ -191,7 +191,7 @@ gboolean zypp_filter_solvable (PkBitfield filters, const zypp::sat::Solvable &it
 /**
  * apply filters to a list.
  */
-void zypp_emit_filtered_packages_in_list (PkBackend *backend, std::vector<zypp::sat::Solvable> *v);
+void zypp_emit_filtered_packages_in_list (PkBackend *backend, const std::vector<zypp::sat::Solvable> &list);
 
 /**
   * convert a std::set<zypp::sat::Solvable to gchar ** array
commit a933fa10661df435e45a812b340b81b8301f2e83
Author: Michael Meeks <michael.meeks at novell.com>
Date:   Tue May 4 11:52:26 2010 +0100

    cleanup 'resolve' filtering code
    cosmetic error return cleanup to improve readability

diff --git a/backends/zypp/pk-backend-zypp.cpp b/backends/zypp/pk-backend-zypp.cpp
index b5f124f..45557c6 100644
--- a/backends/zypp/pk-backend-zypp.cpp
+++ b/backends/zypp/pk-backend-zypp.cpp
@@ -131,9 +131,8 @@ backend_get_requires_thread (PkBackend *backend)
 
 	package_ids = pk_backend_get_strv (backend, "package_ids");
 	if (!pk_package_ids_check (package_ids)) {
-		pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_ID_INVALID, "invalid package id");
-		pk_backend_finished (backend);
-		return FALSE;
+		return zypp_backend_finished_error (
+			backend, PK_ERROR_ENUM_PACKAGE_ID_INVALID, "invalid package id");
 	}
 
 	pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
@@ -161,18 +160,18 @@ backend_get_requires_thread (PkBackend *backend)
 			g_strfreev (id_parts);
 
 			if (found == FALSE) {
-				pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_NOT_INSTALLED, "Package is not installed");
-				pk_backend_finished (backend);
-				return FALSE;
+				return zypp_backend_finished_error (
+					backend, PK_ERROR_ENUM_PACKAGE_NOT_INSTALLED,
+					"Package is not installed");
 			}
 
 			// set Package as to be uninstalled
 			package.status ().setToBeUninstalled (zypp::ResStatus::USER);
 		} else {
 			if (solvable == zypp::sat::Solvable::noSolvable) {
-				pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_NOT_FOUND, "Package couldn't be found");
-				pk_backend_finished (backend);
-				return FALSE;
+				return zypp_backend_finished_error (
+					backend, PK_ERROR_ENUM_PACKAGE_NOT_FOUND,
+					"Package couldn't be found");
 			}
 
 			zypp::ResPool pool = zypp::ResPool::instance ();
@@ -192,9 +191,9 @@ backend_get_requires_thread (PkBackend *backend)
 			for (std::list<zypp::ResolverProblem_Ptr>::iterator it = problems.begin (); it != problems.end (); it++){
 				egg_warning("Solver problem (This should never happen): '%s'", (*it)->description ().c_str ());
 			}
-			pk_backend_error_code (backend, PK_ERROR_ENUM_DEP_RESOLUTION_FAILED, "Resolution failed");
-			pk_backend_finished (backend);
-			return FALSE;
+			return zypp_backend_finished_error (
+				backend, PK_ERROR_ENUM_DEP_RESOLUTION_FAILED,
+				"Resolution failed");
 		}
 
 		// look for packages which would be uninstalled
@@ -316,9 +315,9 @@ backend_get_depends_thread (PkBackend *backend)
 
 	package_ids = pk_backend_get_strv (backend, "package_ids");
 	if (!pk_package_ids_check (package_ids)) {
-		pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_ID_INVALID, "invalid package id");
-		pk_backend_finished (backend);
-		return FALSE;
+		return zypp_backend_finished_error (
+			backend, PK_ERROR_ENUM_PACKAGE_ID_INVALID,
+			"invalid package id");
 	}
 
 	zypp::ZYpp::Ptr zypp;
@@ -359,9 +358,9 @@ backend_get_depends_thread (PkBackend *backend)
 		pk_backend_set_percentage (backend, 40);
 
 		if (pool_item_found == FALSE) {
-			pk_backend_error_code (backend, PK_ERROR_ENUM_DEP_RESOLUTION_FAILED, "Did not find the specified package.");
-			pk_backend_finished (backend);
-			return FALSE;
+			return zypp_backend_finished_error (
+				backend, PK_ERROR_ENUM_DEP_RESOLUTION_FAILED,
+				"Did not find the specified package.");
 		}
 
 		// Gather up any dependencies
@@ -464,15 +463,11 @@ backend_get_depends_thread (PkBackend *backend)
 
 		pk_backend_set_percentage (backend, 100);
 	} catch (const zypp::repo::RepoNotFoundException &ex) {
-		// TODO: make sure this dumps out the right sring.
-		pk_backend_error_code (backend, PK_ERROR_ENUM_REPO_NOT_FOUND, ex.asUserString().c_str() );
-		pk_backend_finished (backend);
-		return FALSE;
+		return zypp_backend_finished_error (
+			backend, PK_ERROR_ENUM_REPO_NOT_FOUND, ex.asUserString().c_str());
 	} catch (const zypp::Exception &ex) {
-		//pk_backend_error_code (backend, PK_ERROR_ENUM_INTERNAL_ERROR, "Error enumerating repositories");
-		pk_backend_error_code (backend, PK_ERROR_ENUM_INTERNAL_ERROR, ex.asUserString().c_str() );
-		pk_backend_finished (backend);
-		return FALSE;
+		return zypp_backend_finished_error (
+			backend, PK_ERROR_ENUM_INTERNAL_ERROR, ex.asUserString().c_str());
 	}
 
 	pk_backend_finished (backend);
@@ -496,9 +491,8 @@ backend_get_details_thread (PkBackend *backend)
 
 	package_ids = pk_backend_get_strv (backend, "package_ids");
 	if (!pk_package_ids_check (package_ids)) {
-		pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_ID_INVALID, "invalid package id");
-		pk_backend_finished (backend);
-		return FALSE;
+		return zypp_backend_finished_error (
+			backend, PK_ERROR_ENUM_PACKAGE_ID_INVALID, "invalid package id");
 	}
 	pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
 
@@ -534,9 +528,8 @@ backend_get_details_thread (PkBackend *backend)
 		g_strfreev (id_parts);
 
 		if (package == NULL) {
-			pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_NOT_FOUND, "couldn't find package");
-			pk_backend_finished (backend);
-			return FALSE;
+			return zypp_backend_finished_error (
+				backend, PK_ERROR_ENUM_PACKAGE_NOT_FOUND, "couldn't find package");
 		}
 
 		try {
@@ -564,15 +557,11 @@ backend_get_details_thread (PkBackend *backend)
 			}
 
 		} catch (const zypp::target::rpm::RpmException &ex) {
-			pk_backend_error_code (backend, PK_ERROR_ENUM_REPO_NOT_FOUND, "Couldn't open rpm-database");
-			pk_backend_finished (backend);
-
-			return FALSE;
+			return zypp_backend_finished_error (
+				backend, PK_ERROR_ENUM_REPO_NOT_FOUND, "Couldn't open rpm-database");
 		} catch (const zypp::Exception &ex) {
-			pk_backend_error_code (backend, PK_ERROR_ENUM_INTERNAL_ERROR, ex.asUserString ().c_str ());
-			pk_backend_finished (backend);
-
-			return FALSE;
+			return zypp_backend_finished_error (
+				backend, PK_ERROR_ENUM_INTERNAL_ERROR, ex.asUserString ().c_str ());
 		}
 	}
 
@@ -596,9 +585,8 @@ backend_get_distro_upgrades_thread(PkBackend *backend)
 
 	std::vector<zypp::parser::ProductFileData> result;
 	if (!zypp::parser::ProductFileReader::scanDir (zypp::functor::getAll (std::back_inserter (result)), "/etc/products.d")) {
-		pk_backend_error_code (backend, PK_ERROR_ENUM_INTERNAL_ERROR, "Could not parse /etc/products.d");
-		pk_backend_finished (backend);
-		return FALSE;
+		return zypp_backend_finished_error (
+			backend, PK_ERROR_ENUM_INTERNAL_ERROR, "Could not parse /etc/products.d");
 	}
 
 	for (std::vector<zypp::parser::ProductFileData>::iterator it = result.begin (); it != result.end (); it++) {
@@ -773,9 +761,9 @@ backend_install_files_thread (PkBackend *backend)
 	// create a temporary directory
 	zypp::filesystem::TmpDir tmpDir;
 	if (tmpDir == NULL) {
-		pk_backend_error_code (backend, PK_ERROR_ENUM_LOCAL_INSTALL_FAILED, "Could not create a temporary directory");
-		pk_backend_finished (backend);
-		return FALSE;
+		return zypp_backend_finished_error (
+			backend, PK_ERROR_ENUM_LOCAL_INSTALL_FAILED,
+			"Could not create a temporary directory");
 	}
 
 	for (guint i = 0; i < g_strv_length (full_paths); i++) {
@@ -785,17 +773,17 @@ backend_install_files_thread (PkBackend *backend)
 		zypp::target::rpm::RpmHeader::constPtr rpmHeader = zypp::target::rpm::RpmHeader::readPackage (rpmPath, zypp::target::rpm::RpmHeader::NOSIGNATURE);
 
 		if (rpmHeader == NULL) {
-			pk_backend_error_code (backend, PK_ERROR_ENUM_LOCAL_INSTALL_FAILED, "%s is not valid rpm-File", full_paths[i]);
-			pk_backend_finished (backend);
-			return FALSE;
+			return zypp_backend_finished_error (
+				backend, PK_ERROR_ENUM_LOCAL_INSTALL_FAILED,
+				"%s is not valid rpm-File", full_paths[i]);
 		}
 
 		// copy the rpm into tmpdir
 		std::string tempDest = tmpDir.path ().asString () + "/" + rpmHeader->tag_name () + ".rpm";
 		if (zypp::filesystem::copy (full_paths[i], tempDest) != 0) {
-			pk_backend_error_code (backend, PK_ERROR_ENUM_LOCAL_INSTALL_FAILED, "Could not copy the rpm-file into the temp-dir");
-			pk_backend_finished (backend);
-			return FALSE;
+			return zypp_backend_finished_error (
+				backend, PK_ERROR_ENUM_LOCAL_INSTALL_FAILED,
+				"Could not copy the rpm-file into the temp-dir");
 		}
 	}
 
@@ -821,15 +809,11 @@ backend_install_files_thread (PkBackend *backend)
 		manager.buildCache (tmpRepo);
 
 	} catch (const zypp::url::UrlException &ex) {
-		pk_backend_error_code (backend, PK_ERROR_ENUM_INTERNAL_ERROR, ex.asUserString ().c_str ());
-
-		pk_backend_finished (backend);
-		return FALSE;
+		return zypp_backend_finished_error (
+			backend, PK_ERROR_ENUM_INTERNAL_ERROR, ex.asUserString ().c_str ());
 	} catch (const zypp::Exception &ex) {
-		pk_backend_error_code (backend, PK_ERROR_ENUM_INTERNAL_ERROR, ex.asUserString().c_str() );
-
-		pk_backend_finished (backend);
-		return FALSE;
+		return zypp_backend_finished_error (
+			backend, PK_ERROR_ENUM_INTERNAL_ERROR, ex.asUserString ().c_str ());
 	}
 
 	for (guint i = 0; i < g_strv_length (full_paths); i++) {
@@ -893,10 +877,8 @@ backend_get_update_detail_thread (PkBackend *backend)
 
 	package_ids = pk_backend_get_strv (backend, "package_ids");
 	if (package_ids == NULL) {
-		pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_ID_INVALID, "invalid package id");
-
-		pk_backend_finished (backend);
-		return FALSE;
+		return zypp_backend_finished_error (
+			backend, PK_ERROR_ENUM_PACKAGE_ID_INVALID, "invalid package id");
 	}
 	pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
 
@@ -1022,9 +1004,9 @@ backend_update_system_thread (PkBackend *backend)
 	}
 
 	if (!zypp_perform_execution (backend, UPDATE, FALSE)) {
-		pk_backend_error_code (backend, PK_ERROR_ENUM_TRANSACTION_ERROR, "Couldn't perform the installation.");
-		pk_backend_finished (backend);
-		return FALSE;
+		return zypp_backend_finished_error (
+			backend, PK_ERROR_ENUM_TRANSACTION_ERROR,
+			"Couldn't perform the installation.");
 	}
 
 	if (restart != PK_RESTART_ENUM_NONE)
@@ -1059,9 +1041,8 @@ backend_install_packages_thread (PkBackend *backend)
 
 	package_ids = pk_backend_get_strv (backend, "package_ids");
 	if (!pk_package_ids_check (package_ids)) {
-		pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_ID_INVALID, "invalid package id");
-		pk_backend_finished (backend);
-		return FALSE;
+		return zypp_backend_finished_error (
+			backend, PK_ERROR_ENUM_PACKAGE_ID_INVALID, "invalid package id");
 	}
 	/* FIXME: support only_trusted */
 
@@ -1101,9 +1082,9 @@ backend_install_packages_thread (PkBackend *backend)
 			g_strfreev (id_parts);
 
 			if (!hit) {
-				pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_NOT_FOUND, "Couldn't find the package.");
-				pk_backend_finished (backend);
-				return FALSE;
+				return zypp_backend_finished_error (
+					backend, PK_ERROR_ENUM_PACKAGE_NOT_FOUND,
+					"Couldn't find the package.");
 			}
 
 			pk_backend_set_percentage (backend, 40);
@@ -1125,9 +1106,8 @@ backend_install_packages_thread (PkBackend *backend)
 		pk_backend_set_percentage (backend, 100);
 
 	} catch (const zypp::Exception &ex) {
-		pk_backend_error_code (backend, PK_ERROR_ENUM_INTERNAL_ERROR, ex.asUserString().c_str() );
-		pk_backend_finished (backend);
-		return FALSE;
+		return zypp_backend_finished_error (
+			backend, PK_ERROR_ENUM_INTERNAL_ERROR, ex.asUserString().c_str());
 	}
 
 	pk_backend_finished (backend);
@@ -1186,9 +1166,8 @@ backend_remove_packages_thread (PkBackend *backend)
 
 	package_ids = pk_backend_get_strv (backend, "package_ids");
 	if (!pk_package_ids_check (package_ids)) {
-		pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_ID_INVALID, "invalid package id");
-		pk_backend_finished (backend);
-		return FALSE;
+		return zypp_backend_finished_error (
+			backend, PK_ERROR_ENUM_PACKAGE_ID_INVALID, "invalid package id");
 	}
 	for (guint i = 0; i < g_strv_length (package_ids); i++) {
 		gchar **id_parts = pk_package_id_split (package_ids[i]);
@@ -1216,24 +1195,20 @@ backend_remove_packages_thread (PkBackend *backend)
 				it->statusReset();
 			}
 			delete (items);
-			pk_backend_error_code (backend, PK_ERROR_ENUM_TRANSACTION_ERROR, "Couldn't remove the package");
-			pk_backend_finished (backend);
-			return FALSE;
+			return zypp_backend_finished_error (
+				backend, PK_ERROR_ENUM_TRANSACTION_ERROR,
+				"Couldn't remove the package");
 		}
 
 		delete (items);
 		pk_backend_set_percentage (backend, 100);
 
 	} catch (const zypp::repo::RepoNotFoundException &ex) {
-		// TODO: make sure this dumps out the right sring.
-		pk_backend_error_code (backend, PK_ERROR_ENUM_REPO_NOT_FOUND, ex.asUserString().c_str() );
-		pk_backend_finished (backend);
-		return FALSE;
+		return zypp_backend_finished_error (
+			backend, PK_ERROR_ENUM_REPO_NOT_FOUND, ex.asUserString().c_str());
 	} catch (const zypp::Exception &ex) {
-		//pk_backend_error_code (backend, PK_ERROR_ENUM_INTERNAL_ERROR, "Error enumerating repositories");
-		pk_backend_error_code (backend, PK_ERROR_ENUM_INTERNAL_ERROR, ex.asUserString().c_str() );
-		pk_backend_finished (backend);
-		return FALSE;
+		return zypp_backend_finished_error (
+			backend, PK_ERROR_ENUM_INTERNAL_ERROR, ex.asUserString().c_str());
 	}
 
 	pk_backend_finished (backend);
@@ -1269,9 +1244,7 @@ backend_resolve_thread (PkBackend *backend)
 		zypp::sat::Solvable package;
 		for (std::vector<zypp::sat::Solvable>::iterator it = v->begin ();
 				it != v->end (); it++) {
-			if (!it->isSystem() && pk_bitfield_contain (_filters, PK_FILTER_ENUM_INSTALLED))
-				continue;
-			if (it->isSystem() && pk_bitfield_contain (_filters, PK_FILTER_ENUM_NOT_INSTALLED))
+			if (zypp_filter_solvable (_filters, *it))
 				continue;
 
 			const char *version = it->edition ().asString ().c_str ();
@@ -1286,9 +1259,9 @@ backend_resolve_thread (PkBackend *backend)
 		delete (v2);
 
 		if (package == NULL) {
-			pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_NOT_FOUND, "couldn't find package");
-			pk_backend_finished (backend);
-			return FALSE;
+			return zypp_backend_finished_error (
+				backend, PK_ERROR_ENUM_PACKAGE_NOT_FOUND,
+				"couldn't find package");
 		}
 
 		if (zypp_filter_solvable (_filters, package))
@@ -1409,9 +1382,8 @@ backend_search_group_thread (PkBackend *backend)
 	group = values[0];  //Fixme - add support for possible multiple values.
 
 	if (group == NULL) {
-		pk_backend_error_code (backend, PK_ERROR_ENUM_GROUP_NOT_FOUND, "Group is invalid.");
-		pk_backend_finished (backend);
-		return FALSE;
+		return zypp_backend_finished_error (
+			backend, PK_ERROR_ENUM_GROUP_NOT_FOUND, "Group is invalid.");
 	}
 
 	pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
@@ -1475,12 +1447,13 @@ backend_get_repo_list (PkBackend *backend, PkBitfield filters)
 	try
 	{
 		repos = std::list<zypp::RepoInfo>(manager.repoBegin(),manager.repoEnd());
-	}
-	catch ( const zypp::Exception &e)
-	{
-		// FIXME: make sure this dumps out the right sring.
-		pk_backend_error_code (backend, PK_ERROR_ENUM_REPO_NOT_FOUND, e.asUserString().c_str() );
-		pk_backend_finished (backend);
+	} catch (const zypp::repo::RepoNotFoundException &ex) {
+		zypp_backend_finished_error (
+			backend, PK_ERROR_ENUM_REPO_NOT_FOUND, ex.asUserString().c_str());
+		return;
+	} catch (const zypp::Exception &ex) {
+		zypp_backend_finished_error (
+			backend, PK_ERROR_ENUM_INTERNAL_ERROR, ex.asUserString().c_str());
 		return;
 	}
 
@@ -1516,12 +1489,15 @@ backend_repo_enable (PkBackend *backend, const gchar *rid, gboolean enabled)
 			zypp::Repository repository = zypp::sat::Pool::instance ().reposFind (repo.alias ());
 			repository.eraseFromPool ();
 		}
+
 	} catch (const zypp::repo::RepoNotFoundException &ex) {
-		pk_backend_error_code (backend, PK_ERROR_ENUM_REPO_NOT_FOUND, "Couldn't find the specified repository");
-		pk_backend_finished (backend);
+		zypp_backend_finished_error (
+			backend, PK_ERROR_ENUM_REPO_NOT_FOUND, ex.asUserString().c_str());
 		return;
 	} catch (const zypp::Exception &ex) {
-		pk_backend_error_code (backend, PK_ERROR_ENUM_INTERNAL_ERROR, "Could not enable/disable the repo");
+		zypp_backend_finished_error (
+			backend, PK_ERROR_ENUM_INTERNAL_ERROR, ex.asUserString().c_str());
+		return;
 	}
 
 	pk_backend_finished (backend);
@@ -1534,9 +1510,8 @@ backend_get_files_thread (PkBackend *backend)
 
 	package_ids = pk_backend_get_strv (backend, "package_ids");
 	if (!pk_package_ids_check (package_ids)) {
-		pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_ID_INVALID, "invalid package id");
-		pk_backend_finished (backend);
-		return FALSE;
+		return zypp_backend_finished_error (
+			backend, PK_ERROR_ENUM_PACKAGE_ID_INVALID, "invalid package id");
 	}
 
 	for(uint i = 0; i < g_strv_length(package_ids); i++) {
@@ -1567,9 +1542,9 @@ backend_get_files_thread (PkBackend *backend)
 		g_strfreev (id_parts);
 
 		if (package == NULL) {
-			pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_NOT_FOUND, "couldn't find package");
-			pk_backend_finished (backend);
-			return FALSE;
+			return zypp_backend_finished_error (
+				backend, PK_ERROR_ENUM_PACKAGE_NOT_FOUND,
+				"couldn't find package");
 		}
 
 		std::string temp;
@@ -1584,9 +1559,9 @@ backend_get_files_thread (PkBackend *backend)
 				}
 
 			} catch (const zypp::target::rpm::RpmException &ex) {
-				pk_backend_error_code (backend, PK_ERROR_ENUM_REPO_NOT_FOUND, "Couldn't open rpm-database");
-				pk_backend_finished (backend);
-				return FALSE;
+				return zypp_backend_finished_error (
+					backend, PK_ERROR_ENUM_REPO_NOT_FOUND,
+					 "Couldn't open rpm-database");
 			}
 		} else {
 			temp = "Only available for installed packages";
@@ -1834,9 +1809,8 @@ backend_what_provides_thread (PkBackend *backend)
 				egg_warning("Solver problem (This should never happen): '%s'", (*it)->description ().c_str ());
 			}
 			solver.setIgnoreAlreadyRecommended (FALSE);
-			pk_backend_error_code (backend, PK_ERROR_ENUM_DEP_RESOLUTION_FAILED, "Resolution failed");
-			pk_backend_finished (backend);
-			return FALSE;
+			return zypp_backend_finished_error (
+				backend, PK_ERROR_ENUM_DEP_RESOLUTION_FAILED, "Resolution failed");
 		}
 
 		// look for packages which would be installed
diff --git a/backends/zypp/zypp-utils.cpp b/backends/zypp/zypp-utils.cpp
index 34cc164..825f1df 100644
--- a/backends/zypp/zypp-utils.cpp
+++ b/backends/zypp/zypp-utils.cpp
@@ -968,3 +968,24 @@ zypp_refresh_cache (PkBackend *backend, gboolean force)
 	g_free (repo_messages);
 	return TRUE;
 }
+
+gboolean
+zypp_backend_finished_error (PkBackend  *backend, PkErrorEnum err_code,
+			     const char *format, ...)
+{
+	va_list args;
+	gchar *buffer;
+
+	/* sadly no _va variant for error code setting */
+	va_start (args, format);
+	buffer = g_strdup_vprintf (format, args);
+	va_end (args);
+
+	pk_backend_error_code (backend, err_code, "%s", buffer);
+	
+	g_free (buffer);
+
+	pk_backend_finished (backend);
+
+	return FALSE;
+}
diff --git a/backends/zypp/zypp-utils.h b/backends/zypp/zypp-utils.h
index ec38ab9..775f482 100644
--- a/backends/zypp/zypp-utils.h
+++ b/backends/zypp/zypp-utils.h
@@ -36,6 +36,7 @@
 #include <zypp/ResPool.h>
 #include <zypp/PoolQuery.h>
 #include <zypp/ResFilters.h>
+#include <packagekit-glib2/pk-enum.h>
 
 #include <iterator>
 #include <list>
@@ -207,5 +208,11 @@ gchar * zypp_build_package_id_capabilities (zypp::Capabilities caps);
   */
 gboolean zypp_refresh_cache (PkBackend *backend, gboolean force);
 
+/**
+  * helper to simplify returning errors
+  */
+gboolean zypp_backend_finished_error (PkBackend  *backend, PkErrorEnum err_code,
+				      const char *format, ...);
+
 #endif // _ZYPP_UTILS_H_
 
commit 8d766104b804c2672568d976eff9bc2477c2c319
Author: Michael Meeks <michael.meeks at novell.com>
Date:   Tue May 4 11:14:25 2010 +0100

    fix dummy security model proxy support

diff --git a/src/pk-engine.c b/src/pk-engine.c
index 142ed16..77f37cc 100644
--- a/src/pk-engine.c
+++ b/src/pk-engine.c
@@ -924,7 +924,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, sender);
+	ret = pk_engine_set_proxy_internal (engine, sender, proxy_http, proxy_ftp);
 	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 b28d224984de9899cf30ccb0d2a0ed18cdb4c4f6
Author: Michael Meeks <michael.meeks at novell.com>
Date:   Tue May 4 11:12:11 2010 +0100

    downgrade required autoconf version

diff --git a/configure.ac b/configure.ac
index 4b9152b..5e857d1 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,5 +1,5 @@
 # Copyright (C) 2007-2009 Richard Hughes <richard at hughsie.com>
-AC_PREREQ(2.65)
+AC_PREREQ(2.63)
 
 m4_define([pk_major_version], [0])
 m4_define([pk_minor_version], [6])
commit a53ce81e8ff638bbb47703821ff9f3448468a832
Author: Michael Meeks <michael.meeks at novell.com>
Date:   Tue May 4 11:11:57 2010 +0100

    fix parallel-build snafu wrt. MOC generated files

diff --git a/lib/packagekit-qt/src/Makefile.am b/lib/packagekit-qt/src/Makefile.am
index 1b05c4f..8a458b9 100644
--- a/lib/packagekit-qt/src/Makefile.am
+++ b/lib/packagekit-qt/src/Makefile.am
@@ -58,8 +58,9 @@ libpackagekit_qt_la_SOURCES =					\
 	bitfield.h						\
 	bitfield.cpp						\
 	enum.h							\
-	enum.cpp							\
-	dbus_proxies.stamp				\
+	enum.cpp						\
+	dbus_proxies.stamp					\
+	$(MOCFILES)						\
 	$(NULL)
 
 libpackagekit_qt_la_LIBADD =					\
commit 48c58d36fc435a3c14f3d352673fc2a17767307f
Author: Michael Meeks <michael.meeks at novell.com>
Date:   Tue May 4 09:58:59 2010 +0100

    Cleanup a certain amount of superstitious coding:
      + no need to g_strdup before checking for null strings
      + no need to heap allocate and delete stl types in the same scope
      + no need to convert pk-bitfields to strings, and use strstr
    Misc whitespace, comment, naming cleanups
    Split out the filtering functionality into zypp_filter_solvable
      + re-use this for emit_filtered_packages
      + re-use filtering where it was missing.
    Fixes several key pkcon bugs:
      + bogus (installed) dependencies shown during install
      + resolve not doing filtering broke remove - by sometimes
        returning 'available' and not 'installed' packages of
        the same name

diff --git a/backends/zypp/pk-backend-zypp.cpp b/backends/zypp/pk-backend-zypp.cpp
index 8b54132..b5f124f 100644
--- a/backends/zypp/pk-backend-zypp.cpp
+++ b/backends/zypp/pk-backend-zypp.cpp
@@ -127,6 +127,7 @@ static gboolean
 backend_get_requires_thread (PkBackend *backend)
 {
 	gchar **package_ids;
+	PkBitfield _filters = (PkBitfield) pk_backend_get_uint (backend, "filters");
 
 	package_ids = pk_backend_get_strv (backend, "package_ids");
 	if (!pk_package_ids_check (package_ids)) {
@@ -217,7 +218,7 @@ backend_get_requires_thread (PkBackend *backend)
 				hit = TRUE;
 			}
 
-			if (hit) {
+			if (hit && !zypp_filter_solvable (_filters, it->resolvable()->satSolvable())) {
 				gchar *package_id;
 				package_id = pk_package_id_build ( it->resolvable ()->name ().c_str(),
 						it->resolvable ()->edition ().asString ().c_str(),
@@ -292,10 +293,23 @@ backend_get_filters (PkBackend *backend)
 		-1);
 }
 
+static bool
+zypp_is_no_solvable (const zypp::sat::Solvable &solv)
+{
+	return solv.id() == zypp::sat::detail::noSolvableId;
+}
+
+/*
+ * This method is a bit of a travesty of the complexity of
+ * solving dependencies. We try to give a simple answer to
+ * "what packages are required for these packages" - but,
+ * clearly often there is no simple answer.
+ */
 static gboolean
 backend_get_depends_thread (PkBackend *backend)
 {
 	gchar **package_ids;
+	PkBitfield _filters = (PkBitfield) pk_backend_get_uint (backend, "filters");
 
 	pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
 	pk_backend_set_percentage (backend, 0);
@@ -310,6 +324,8 @@ backend_get_depends_thread (PkBackend *backend)
 	zypp::ZYpp::Ptr zypp;
 	zypp = get_zypp ();
 
+	egg_debug ("get_depends with filter '%s'", pk_filter_bitfield_to_string (_filters));
+
 	try
 	{
 		gchar **id_parts = pk_package_id_split (package_ids[0]);
@@ -357,28 +373,60 @@ backend_get_depends_thread (PkBackend *backend)
 		zypp::sat::Solvable solvable = pool_item.satSolvable ();
 		zypp::Capabilities req = solvable[zypp::Dep::REQUIRES];
 
+		// which package each capability
 		std::map<std::string, zypp::sat::Solvable> caps;
-		std::vector<std::string> temp;
-
-		for (zypp::Capabilities::const_iterator it = req.begin (); it != req.end (); ++it) {
-			zypp::sat::WhatProvides provider (*it);
-			for (zypp::sat::WhatProvides::const_iterator it2 = provider.begin ();
-					it2 != provider.end ();
-					it2++) {
-				// Adding Packages only one time
-				std::map<std::string, zypp::sat::Solvable>::iterator mIt;
-				mIt = caps.find(it->asString ());
-				if (std::find (temp.begin (), temp.end(), it2->name ()) == temp.end()) {
-					if( mIt != caps.end()){
-						if(it2->isSystem ()){
-							caps.erase (mIt);
-							caps[it->asString ()] = *it2;
-						}
-					} else {
-						caps[it->asString ()] = *it2;
-					}
-					temp.push_back(it2->name ());
+		// packages already providing a capability
+		std::vector<std::string> pkg_names;
+
+		for (zypp::Capabilities::const_iterator cap = req.begin (); cap != req.end (); ++cap) {
+			egg_debug ("get_depends - capability '%s'", cap->asString().c_str());
+
+			if (caps.find (cap->asString ()) != caps.end()) {
+				egg_debug ("Interesting ! already have capability '%s'", cap->asString().c_str());
+				continue;
+			}
+
+			// Look for packages providing each capability
+			bool have_preference = false;
+			zypp::sat::Solvable preferred;
+
+			zypp::sat::WhatProvides prov_list (*cap);
+			for (zypp::sat::WhatProvides::const_iterator provider = prov_list.begin ();
+			     provider != prov_list.end (); provider++) {
+
+				egg_debug ("provider: '%s'", provider->asString().c_str());
+
+				// filter out caps like "rpmlib(PayloadFilesHavePrefix) <= 4.0-1" (bnc#372429)
+				if (zypp_is_no_solvable (*provider))
+					continue;
+
+
+				// Is this capability provided by a package we already have listed ?
+				if (std::find (pkg_names.begin (), pkg_names.end(),
+					       provider->name ()) != pkg_names.end()) {
+					preferred = *provider;
+					have_preference = true;
+					break;
 				}
+
+				// Something is better than nothing
+				if (!have_preference) {
+					preferred = *provider;
+					have_preference = true;
+
+				// Prefer system packages
+				} else if (provider->isSystem()) {
+					preferred = *provider;
+					break;
+
+				} // else keep our first love
+			}
+
+			if (have_preference &&
+			    std::find (pkg_names.begin (), pkg_names.end(),
+				       preferred.name ()) == pkg_names.end()) {
+				caps[cap->asString()] = preferred;
+				pkg_names.push_back (preferred.name ());
 			}
 		}
 
@@ -386,42 +434,32 @@ backend_get_depends_thread (PkBackend *backend)
 		for (std::map<std::string, zypp::sat::Solvable>::iterator it = caps.begin ();
 				it != caps.end();
 				it++) {
-			gchar *package_id_temp;
-			gchar *package_name;
-
-			/* do not emit packages with invalid names generated above via dependencies such as "rpmlib(PayloadFilesHavePrefix) <= 4.0-1"
-			   this was causing a crash - BNC# 372429
-			   Fixme - need to find if those dependencies should actually be in the list above and if so a better way to strip them out
-			*/
-			package_name = g_strdup (it->second.name ().c_str());
 
-			if (package_name == NULL || *package_name == '\0')
-			{
-				egg_debug ("Skipping emitting a non valid package");
-				g_free (package_name);
+			// backup sanity check for no-solvables
+			if (! it->second.name ().c_str() ||
+			    it->second.name ().c_str()[0] == '\0')
 				continue;
-			}
-			g_free (package_name);
-
-			package_id_temp = pk_package_id_build (it->second.name ().c_str(),
-					it->second.edition ().asString ().c_str(),
-					it->second.arch ().c_str(),
-					it->second.repository ().alias ().c_str());
 
 			zypp::PoolItem item = zypp::ResPool::instance ().find (it->second);
-
-			if (it->second.isSystem ()) {
-				pk_backend_package (backend,
-						PK_INFO_ENUM_INSTALLED,
-						package_id_temp,
-						item->summary ().c_str());
-			} else {
-				pk_backend_package (backend,
-						PK_INFO_ENUM_AVAILABLE,
-						package_id_temp,
-						item->summary ().c_str());
+			PkInfoEnum info = it->second.isSystem () ? PK_INFO_ENUM_INSTALLED : PK_INFO_ENUM_AVAILABLE;
+
+			egg_debug ("add dep - '%s' '%s' %d [%s]", it->second.name().c_str(),
+				   info == PK_INFO_ENUM_INSTALLED ? "installed" : "available",
+				   it->second.isSystem(), 
+				   zypp_filter_solvable (_filters, it->second) ? "don't add" : "add" );
+
+			if (!zypp_filter_solvable (_filters, it->second)) {
+				gchar *package_id_temp;
+
+				package_id_temp = pk_package_id_build (it->second.name ().c_str(),
+								       it->second.edition ().asString ().c_str(),
+								       it->second.arch ().c_str(),
+								       it->second.repository ().alias ().c_str());
+				pk_backend_package (backend, info,
+						    package_id_temp,
+						    item->summary ().c_str());
+				g_free (package_id_temp);
 			}
-			g_free (package_id_temp);
 		}
 
 		pk_backend_set_percentage (backend, 100);
@@ -641,6 +679,8 @@ check_for_self_update (PkBackend *backend, std::set<zypp::PoolItem> *candidates)
 static gboolean
 backend_get_updates_thread (PkBackend *backend)
 {
+	PkBitfield _filters = (PkBitfield) pk_backend_get_uint (backend, "filters");
+
 	pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
 	pk_backend_set_percentage (backend, 0);
 
@@ -695,13 +735,15 @@ backend_get_updates_thread (PkBackend *backend)
 			}
 		}
 
-		gchar *package_id = zypp_build_package_id_from_resolvable (res->satSolvable ());
-		pk_backend_package (backend, infoEnum, package_id, res->summary ().c_str ());
-					// some package descriptions generate markup parse failures
-					// causing the update to show empty package lines, comment for now
-					// res->summary ().c_str ());
-					// Test if this still happens!
-		g_free (package_id);
+		if (!zypp_filter_solvable (_filters, res->satSolvable())) {
+			gchar *package_id = zypp_build_package_id_from_resolvable (res->satSolvable ());
+			pk_backend_package (backend, infoEnum, package_id, res->summary ().c_str ());
+			// some package descriptions generate markup parse failures
+			// causing the update to show empty package lines, comment for now
+			// res->summary ().c_str ());
+			// Test if this still happens!
+			g_free (package_id);
+		}
 	}
 
 	delete (candidates);
@@ -1067,8 +1109,10 @@ backend_install_packages_thread (PkBackend *backend)
 			pk_backend_set_percentage (backend, 40);
 		}
 
+		// Todo: ideally we should call pk_backend_package (...
+		// PK_INFO_ENUM_DOWNLOADING | INSTALLING) for each package.
 		if (!zypp_perform_execution (backend, INSTALL, FALSE)) {
-			//reset the status of the marked packages
+			// reset the status of the marked packages
 			for (std::vector<zypp::PoolItem>::iterator it = items->begin (); it != items->end (); it++) {
 				it->statusReset ();
 			}
@@ -1210,8 +1254,7 @@ static gboolean
 backend_resolve_thread (PkBackend *backend)
 {
 	gchar **package_ids = pk_backend_get_strv (backend, "package_ids");
-	PkBitfield filters_field = (PkBitfield) pk_backend_get_uint (backend, "filters");
-	gchar *filters = pk_filter_bitfield_to_string(filters_field);
+	PkBitfield _filters = (PkBitfield) pk_backend_get_uint (backend, "filters");
 
 	pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
 
@@ -1226,6 +1269,11 @@ backend_resolve_thread (PkBackend *backend)
 		zypp::sat::Solvable package;
 		for (std::vector<zypp::sat::Solvable>::iterator it = v->begin ();
 				it != v->end (); it++) {
+			if (!it->isSystem() && pk_bitfield_contain (_filters, PK_FILTER_ENUM_INSTALLED))
+				continue;
+			if (it->isSystem() && pk_bitfield_contain (_filters, PK_FILTER_ENUM_NOT_INSTALLED))
+				continue;
+
 			const char *version = it->edition ().asString ().c_str ();
 			if (package == zypp::sat::Solvable::noSolvable) {
 				package = *it;
@@ -1238,23 +1286,16 @@ backend_resolve_thread (PkBackend *backend)
 		delete (v2);
 
 		if (package == NULL) {
-			g_free (filters);
 			pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_NOT_FOUND, "couldn't find package");
 			pk_backend_finished (backend);
 			return FALSE;
 		}
 
-		const gchar *package_id = zypp_build_package_id_from_resolvable (package);
+		if (zypp_filter_solvable (_filters, package))
+			continue;
 
-		PkInfoEnum info = PK_INFO_ENUM_AVAILABLE;
-		if( package.isSystem ()){
-			info = PK_INFO_ENUM_INSTALLED;
-			if (g_strrstr (filters, "~installed") != NULL)
-				continue;
-		}else{
-			if (g_strrstr (filters, "~installed") == NULL)
-				continue;
-		}
+		const gchar *package_id = zypp_build_package_id_from_resolvable (package);
+		PkInfoEnum info = package.isSystem () ? PK_INFO_ENUM_INSTALLED : PK_INFO_ENUM_AVAILABLE;
 
 		pk_backend_package (backend,
 				    info,
@@ -1262,7 +1303,6 @@ backend_resolve_thread (PkBackend *backend)
 				    package.lookupStrAttribute (zypp::sat::SolvAttr::summary).c_str ());
 	}
 
-	g_free (filters);
 	pk_backend_finished (backend);
 	return TRUE;
 }
@@ -1281,13 +1321,11 @@ backend_find_packages_thread (PkBackend *backend)
 {
 	gchar **values;
 	const gchar *search;
-	PkBitfield filters;
 	guint mode;
 	//GList *list = NULL;
 
 	values = pk_backend_get_strv (backend, "search");
 	search = values[0];  //Fixme - support the possible multiple values (logical OR search)
-	filters = (PkBitfield) pk_backend_get_uint (backend, "filters");
 	mode = pk_backend_get_uint (backend, "mode");
 
 	pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
@@ -1335,7 +1373,7 @@ backend_find_packages_thread (PkBackend *backend)
 	if ( ! q.empty() ) {
 		std::copy( q.begin(), q.end(), std::back_inserter( v ) );
 	}
-	zypp_emit_packages_in_list (backend, &v, filters);
+	zypp_emit_filtered_packages_in_list (backend, &v);
 
 	pk_backend_finished (backend);
 	return TRUE;
@@ -1366,11 +1404,9 @@ backend_search_group_thread (PkBackend *backend)
 {
 	gchar **values;
 	const gchar *group;
-	PkBitfield filters;
 
 	values = pk_backend_get_strv (backend, "search");
 	group = values[0];  //Fixme - add support for possible multiple values.
-	filters = (PkBitfield) pk_backend_get_uint (backend, "filters");
 
 	if (group == NULL) {
 		pk_backend_error_code (backend, PK_ERROR_ENUM_GROUP_NOT_FOUND, "Group is invalid.");
@@ -1385,7 +1421,7 @@ backend_search_group_thread (PkBackend *backend)
 
 	pk_backend_set_percentage (backend, 30);
 
-	std::vector<zypp::sat::Solvable> *v = new std::vector<zypp::sat::Solvable> ();
+	std::vector<zypp::sat::Solvable> v;
 	PkGroupEnum pkGroup = pk_group_enum_from_string (group);
 
 	zypp::sat::LookupAttr look (zypp::sat::SolvAttr::group);
@@ -1393,13 +1429,12 @@ backend_search_group_thread (PkBackend *backend)
 	for (zypp::sat::LookupAttr::iterator it = look.begin (); it != look.end (); it++) {
 		PkGroupEnum rpmGroup = get_enum_group (it.asString ());
 		if (pkGroup == rpmGroup)
-			v->push_back (it.inSolvable ());
+			v.push_back (it.inSolvable ());
 	}
 
 	pk_backend_set_percentage (backend, 70);
 
-	zypp_emit_packages_in_list (backend ,v, filters);
-	delete (v);
+	zypp_emit_filtered_packages_in_list (backend, &v);
 
 	pk_backend_set_percentage (backend, 100);
 	pk_backend_finished (backend);
@@ -1576,22 +1611,18 @@ backend_get_files(PkBackend *backend, gchar **package_ids)
 static gboolean
 backend_get_packages_thread (PkBackend *backend)
 {
-	PkBitfield filters;
-	filters = (PkBitfield) pk_backend_get_uint (backend, "filters");
-
 	pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
 
-	std::vector<zypp::sat::Solvable> *v = new std::vector<zypp::sat::Solvable>;
+	std::vector<zypp::sat::Solvable> v;
 
 	zypp_build_pool (TRUE);
 	zypp::ResPool pool = zypp::ResPool::instance ();
 	for (zypp::ResPool::byKind_iterator it = pool.byKindBegin (zypp::ResKind::package); it != pool.byKindEnd (zypp::ResKind::package); it++) {
-		v->push_back (it->satSolvable ());
+		v.push_back (it->satSolvable ());
 	}
 
-	zypp_emit_packages_in_list (backend, v, filters);
+	zypp_emit_filtered_packages_in_list (backend, &v);
 
-	delete (v);
 	pk_backend_finished (backend);
 	return TRUE;
 }
@@ -1787,8 +1818,7 @@ backend_what_provides_thread (PkBackend *backend)
 	gchar **values = pk_backend_get_strv (backend, "search");
 	const gchar *search = values[0]; //Fixme - support possible multiple search values (logical OR)
 	PkProvidesEnum provides = (PkProvidesEnum) pk_backend_get_uint (backend, "provides");
-	PkBitfield filters_field = (PkBitfield) pk_backend_get_uint (backend, "filters");
-	gchar *filters = pk_filter_bitfield_to_string(filters_field);
+	PkBitfield _filters = (PkBitfield) pk_backend_get_uint (backend, "filters");
 	zypp::Capability cap (search);
 	zypp::sat::WhatProvides prov (cap);
 
@@ -1804,7 +1834,6 @@ backend_what_provides_thread (PkBackend *backend)
 				egg_warning("Solver problem (This should never happen): '%s'", (*it)->description ().c_str ());
 			}
 			solver.setIgnoreAlreadyRecommended (FALSE);
-			g_free (filters);
 			pk_backend_error_code (backend, PK_ERROR_ENUM_DEP_RESOLUTION_FAILED, "Resolution failed");
 			pk_backend_finished (backend);
 			return FALSE;
@@ -1822,10 +1851,7 @@ backend_what_provides_thread (PkBackend *backend)
 				hit = TRUE;
 			}
 
-			if (hit) {
-				if (g_strrstr(filters, "~installed") != NULL)
-					continue;
-
+			if (hit && !zypp_filter_solvable (_filters, it->resolvable()->satSolvable())) {
 				gchar *package_id;
 				package_id = pk_package_id_build ( it->resolvable ()->name ().c_str(),
 						it->resolvable ()->edition ().asString ().c_str(),
@@ -1841,22 +1867,16 @@ backend_what_provides_thread (PkBackend *backend)
 		solver.setIgnoreAlreadyRecommended (FALSE);
 	}else{
 		for(zypp::sat::WhatProvides::const_iterator it = prov.begin (); it != prov.end (); it++) {
-			gchar *package_id = zypp_build_package_id_from_resolvable (*it);
 
-			PkInfoEnum info = PK_INFO_ENUM_AVAILABLE;
-			if( it->isSystem ()){
-				info = PK_INFO_ENUM_INSTALLED;
-				if (g_strrstr (filters, "~installed") != NULL)
-					continue;
-			}else{
-				if (g_strrstr (filters, "~installed") == NULL)
-					continue;
-			}
+			if (zypp_filter_solvable (_filters, *it))
+				continue;
+			
+			gchar *package_id = zypp_build_package_id_from_resolvable (*it);
+			PkInfoEnum info = it->isSystem () ? PK_INFO_ENUM_INSTALLED : PK_INFO_ENUM_AVAILABLE;
 			pk_backend_package (backend, info, package_id, it->lookupStrAttribute (zypp::sat::SolvAttr::summary).c_str ());
 		}
 	}
 
-	g_free (filters);
 	pk_backend_finished (backend);
 	return TRUE;
 }
diff --git a/backends/zypp/zypp-utils.cpp b/backends/zypp/zypp-utils.cpp
index ee478d5..34cc164 100644
--- a/backends/zypp/zypp-utils.cpp
+++ b/backends/zypp/zypp-utils.cpp
@@ -535,46 +535,56 @@ system_and_package_are_x86 (zypp::sat::Solvable item)
 			!strcmp (zypp::ZConfig::defaultSystemArchitecture ().asString().c_str(), "i686"));
 }
 
+/* should we filter out this package ? */
+gboolean
+zypp_filter_solvable (PkBitfield filters, const zypp::sat::Solvable &item)
+{
+	// iterate through the given filters
+	if (!filters)
+		return FALSE;
+
+	for (guint i = 0; i < PK_FILTER_ENUM_LAST; i++) {
+		if ((filters & pk_bitfield_value (i)) == 0)
+			continue;
+		if (i == PK_FILTER_ENUM_INSTALLED && !(item.isSystem ()))
+			return TRUE;
+		if (i == PK_FILTER_ENUM_NOT_INSTALLED && item.isSystem ())
+			return TRUE;
+		if (i == PK_FILTER_ENUM_ARCH) {
+			if (item.arch () != zypp::ZConfig::defaultSystemArchitecture () &&
+			    item.arch () != zypp::Arch_noarch &&
+			    ! system_and_package_are_x86 (item))
+				return TRUE;
+		}
+		if (i == PK_FILTER_ENUM_NOT_ARCH) {
+			if (item.arch () == zypp::ZConfig::defaultSystemArchitecture () ||
+			    system_and_package_are_x86 (item))
+				return TRUE;
+		}
+		if (i == PK_FILTER_ENUM_SOURCE && !(zypp::isKind<zypp::SrcPackage>(item))) {
+			return TRUE;
+		}
+		if (i == PK_FILTER_ENUM_NOT_SOURCE && zypp::isKind<zypp::SrcPackage>(item)) {
+			return TRUE;
+		}
+		//const gchar * myarch = zypp::ZConfig::defaultSystemArchitecture().asString().c_str();
+		//egg_debug ("my default arch is %s", myarch);
+	}
+
+	return FALSE;
+}
+
 void
-zypp_emit_packages_in_list (PkBackend *backend, std::vector<zypp::sat::Solvable> *v, PkBitfield filters)
+zypp_emit_filtered_packages_in_list (PkBackend *backend, std::vector<zypp::sat::Solvable> *v)
 {
+	PkBitfield filters = (PkBitfield) pk_backend_get_uint (backend, "filters");
+
 	for (std::vector<zypp::sat::Solvable>::iterator it = v->begin ();
 			it != v->end (); it++) {
 		gchar *package_id = zypp_build_package_id_from_resolvable (*it);
 
-		// iterate through the given filters
-		if (filters != 0){
-			gboolean print = TRUE;
-			for (guint i = 0; i < PK_FILTER_ENUM_LAST; i++) {
-				if ((filters & pk_bitfield_value (i)) == 0)
-					continue;
-				if (i == PK_FILTER_ENUM_INSTALLED && !(it->isSystem ()))
-					print = FALSE;
-				if (i == PK_FILTER_ENUM_NOT_INSTALLED && it->isSystem ())
-					print = FALSE;;
-				if (i == PK_FILTER_ENUM_ARCH) {
-					if (it->arch () != zypp::ZConfig::defaultSystemArchitecture () &&
-							it->arch () != zypp::Arch_noarch &&
-							! system_and_package_are_x86 (*it))
-						print = FALSE;
-				}
-				if (i == PK_FILTER_ENUM_NOT_ARCH) {
-					if (it->arch () == zypp::ZConfig::defaultSystemArchitecture () ||
-							system_and_package_are_x86 (*it))
-						print = FALSE;
-				}
-				if (i == PK_FILTER_ENUM_SOURCE && !(zypp::isKind<zypp::SrcPackage>(*it))) {
-					print = FALSE;
-				}
-				if (i == PK_FILTER_ENUM_NOT_SOURCE && zypp::isKind<zypp::SrcPackage>(*it)) {
-					print = FALSE;
-				}
-				//const gchar * myarch = zypp::ZConfig::defaultSystemArchitecture().asString().c_str();
-				//egg_debug ("my default arch is %s", myarch);
-			}
-			if (!print)
-				continue;
-		}
+		if (zypp_filter_solvable (filters, *it))
+			continue;
 
 		pk_backend_package (backend,
 			    it->isSystem() == true ?
@@ -777,8 +787,9 @@ zypp_perform_execution (PkBackend *backend, PerformType type, gboolean force)
 
                 // Perform the installation
                 zypp::ZYppCommitPolicy policy;
-                policy.restrictToMedia (0);	// 0 - install all packages regardless to media
-				policy.downloadMode (zypp::DownloadInHeaps);
+                policy.restrictToMedia (0); // 0 == install all packages regardless to media
+		policy.downloadMode (zypp::DownloadInHeaps);
+		policy.syncPoolAfterCommit (true);
 
                 zypp::ZYppCommitResult result = zypp->commit (policy);
 
diff --git a/backends/zypp/zypp-utils.h b/backends/zypp/zypp-utils.h
index ea75c57..ec38ab9 100644
--- a/backends/zypp/zypp-utils.h
+++ b/backends/zypp/zypp-utils.h
@@ -182,7 +182,15 @@ gboolean zypp_get_restart (PkRestartEnum &restart, zypp::Patch::constPtr patch);
   */
 gboolean zypp_perform_execution (PkBackend *backend, PerformType type, gboolean force);
 
-void zypp_emit_packages_in_list (PkBackend *backend, std::vector<zypp::sat::Solvable> *v, PkBitfield filters);
+/**
+ * should we omit a solvable from a result because of filtering ?
+ */
+gboolean zypp_filter_solvable (PkBitfield filters, const zypp::sat::Solvable &item);
+
+/**
+ * apply filters to a list.
+ */
+void zypp_emit_filtered_packages_in_list (PkBackend *backend, std::vector<zypp::sat::Solvable> *v);
 
 /**
   * convert a std::set<zypp::sat::Solvable to gchar ** array
commit ee4a1d13df5b6ca3faaf0c6a2e14a11caa98517e
Author: Fabio Erculiani <lxnay at sabayon.org>
Date:   Mon May 3 18:24:35 2010 +0200

    entropy: catch DependenciesNotRemovable exception during reverse dependencies calculation

diff --git a/backends/entropy/entropyBackend.py b/backends/entropy/entropyBackend.py
index a89e2ea..b81e440 100755
--- a/backends/entropy/entropyBackend.py
+++ b/backends/entropy/entropyBackend.py
@@ -60,6 +60,10 @@ from entropy.client.interfaces import Client
 from entropy.core.settings.base import SystemSettings
 from entropy.misc import LogFile
 from entropy.exceptions import SystemDatabaseError
+try:
+    from entropy.exceptions import DependenciesNotRemovable
+except ImportError:
+    DependenciesNotRemovable = Exception
 from entropy.fetchers import UrlFetcher
 
 import entropy.tools
@@ -416,7 +420,17 @@ class PackageKitEntropyMixin(object):
         matches = [pkg_id for pkg_id, c_repo, pk_pkg in pkgs]
 
         # calculate deps
-        run_queue = self._entropy.get_removal_queue(matches)
+        try:
+            run_queue = self._entropy.get_removal_queue(matches)
+        except DependenciesNotRemovable as err:
+            c_repo = self._entropy.installed_repository()
+            vpkgs = getattr(err, 'value', set())
+            vit_pkgs = ', '.join(sorted([c_repo.retrieveAtom(x[0]) for x in vpkgs],
+                key = lambda x: c_repo.retrieveAtom(x)))
+            self.error(ERROR_DEP_RESOLUTION_FAILED,
+                "Could not perform remove operation, these packages are vital: %s" % (vit_pkgs,))
+            return
+
         added_pkgs = [x for x in run_queue if x not in matches]
 
         # if there are required packages, allowdep must be on
commit 6bf9b8676548acdeb4657a751a9e761f8a00dc88
Author: ruigo <ruigo at fedoraproject.org>
Date:   Fri Apr 30 17:15:09 2010 +0000

    l10n: Updates to Portuguese (pt) translation
    
    Transmitted-via: Transifex (translate.fedoraproject.org)

diff --git a/po/pt.po b/po/pt.po
index 7bc9d15..ee87497 100644
--- a/po/pt.po
+++ b/po/pt.po
@@ -3,10 +3,10 @@ msgid ""
 msgstr ""
 "Project-Id-Version: packagekit\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-04-14 19:46+0000\n"
-"PO-Revision-Date: 2010-04-14 22:07+0100\n"
+"POT-Creation-Date: 2010-04-30 14:41+0000\n"
+"PO-Revision-Date: 2010-04-30 18:14+0100\n"
 "Last-Translator: Rui Gouveia <rui.gouveia at gmail.com>\n"
-"Language-Team: trans-pt at fedoraproject.org\n"
+"Language-Team: fedora-trans-pt at redhat.com\n"
 "Language: pt\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -383,160 +383,170 @@ msgstr ""
 "Não foi possível obter a hora da última vez que esta acção foi concluída"
 
 #. TRANSLATORS: command line argument, just show the version string
-#: ../client/pk-console.c:1267 ../client/pk-monitor.c:326
+#: ../client/pk-console.c:1268 ../client/pk-monitor.c:326
 msgid "Show the program version and exit"
 msgstr "Mostrar a versão da aplicação e terminar"
 
 #. TRANSLATORS: command line argument, use a filter to narrow down results
-#: ../client/pk-console.c:1270
+#: ../client/pk-console.c:1271
 msgid "Set the filter, e.g. installed"
 msgstr "Configurar o filtro, exemplo, instalado"
 
+#. TRANSLATORS: command line argument, use a non-standard install prefix
+#: ../client/pk-console.c:1274
+msgid "Set the install root, e.g. '/' or '/mnt/ltsp'"
+msgstr "Defina a raiz da instalação, por exemplo, '/' ou '/mnt/ltsp'"
+
 #. TRANSLATORS: command line argument, work asynchronously
-#: ../client/pk-console.c:1273
+#: ../client/pk-console.c:1277
 msgid "Exit without waiting for actions to complete"
 msgstr "Sair sem esperar que as acções completem"
 
 #. command line argument, do we ask questions
-#: ../client/pk-console.c:1276
+#: ../client/pk-console.c:1280
 #: ../contrib/debuginfo-install/pk-debuginfo-install.c:527
 msgid "Install the packages without asking for confirmation"
 msgstr "Instalar os pacotes sem pedir por confirmação"
 
 #. TRANSLATORS: command line argument, this command is not a priority
-#: ../client/pk-console.c:1279
+#: ../client/pk-console.c:1283
 msgid "Run the command using idle network bandwidth and also using less power"
 msgstr ""
 "Executar o comando utilizando períodos de inactividade da rede e também "
 "utilizando menos energia"
 
 #. TRANSLATORS: command line argument, just output without fancy formatting
-#: ../client/pk-console.c:1282
+#: ../client/pk-console.c:1286
 msgid ""
 "Print to screen a machine readable output, rather than using animated widgets"
 msgstr ""
 "Escrever no ecrã o resultado legível, ao invés de utilizar objectos animados"
 
 #. TRANSLATORS: we failed to contact the daemon
-#: ../client/pk-console.c:1304
+#: ../client/pk-console.c:1308
 msgid "Failed to contact PackageKit"
 msgstr "Falhou o contacto com o PackageKit"
 
 #. TRANSLATORS: The user specified an incorrect filter
-#: ../client/pk-console.c:1365
+#: ../client/pk-console.c:1369
 msgid "The proxy could not be set"
 msgstr "Não foi possível definir o proxy"
 
 #. TRANSLATORS: The user specified an incorrect filter
-#: ../client/pk-console.c:1377
+#: ../client/pk-console.c:1381
+msgid "The install root could not be set"
+msgstr "Não foi possível definir a raiz da instalação"
+
+#. TRANSLATORS: The user specified an incorrect filter
+#: ../client/pk-console.c:1393
 msgid "The filter specified was invalid"
 msgstr "O filtro especificado era inválido"
 
 #. TRANSLATORS: a search type can be name, details, file, etc
-#: ../client/pk-console.c:1396
+#: ../client/pk-console.c:1412
 msgid "A search type is required, e.g. name"
 msgstr "Um tipo de pesquisa é necessário. Por exemplo, nome"
 
 #. TRANSLATORS: the user needs to provide a search term
-#: ../client/pk-console.c:1403 ../client/pk-console.c:1415
-#: ../client/pk-console.c:1427 ../client/pk-console.c:1439
+#: ../client/pk-console.c:1419 ../client/pk-console.c:1431
+#: ../client/pk-console.c:1443 ../client/pk-console.c:1455
 msgid "A search term is required"
 msgstr "Um termo de pesquisa é necessário"
 
 #. TRANSLATORS: the search type was provided, but invalid
-#: ../client/pk-console.c:1449
+#: ../client/pk-console.c:1465
 msgid "Invalid search type"
 msgstr "Tipo de pesquisa inválida"
 
 #. TRANSLATORS: the user did not specify what they wanted to install
-#: ../client/pk-console.c:1455
+#: ../client/pk-console.c:1471
 msgid "A package name to install is required"
 msgstr "É necessário indicar um nome de pacote a instalar"
 
 #. TRANSLATORS: the user did not specify what they wanted to install
-#: ../client/pk-console.c:1464
+#: ../client/pk-console.c:1480
 msgid "A filename to install is required"
 msgstr "É necessário um nome de ficheiro a instalar"
 
 #. TRANSLATORS: geeky error, 99.9999% of users won't see this
-#: ../client/pk-console.c:1476
+#: ../client/pk-console.c:1492
 msgid "A type, key_id and package_id are required"
 msgstr "São necessários um tipo, id de chave e id de pacote"
 
 #. TRANSLATORS: the user did not specify what they wanted to remove
-#: ../client/pk-console.c:1487
+#: ../client/pk-console.c:1503
 msgid "A package name to remove is required"
 msgstr "É necessário um nome de pacote para remover"
 
 #. TRANSLATORS: the user did not specify anything about what to download or where
-#: ../client/pk-console.c:1496
+#: ../client/pk-console.c:1512
 msgid "A destination directory and the package names to download are required"
 msgstr ""
 "São necessários uma directoria de destino assim como os nomes dos pacotes a "
 "transferir"
 
 #. TRANSLATORS: the directory does not exist, so we can't continue
-#: ../client/pk-console.c:1503
+#: ../client/pk-console.c:1519
 msgid "Directory not found"
 msgstr "Directório não encontrado"
 
 #. TRANSLATORS: geeky error, 99.9999% of users won't see this
-#: ../client/pk-console.c:1512
+#: ../client/pk-console.c:1528
 msgid "A licence identifier (eula-id) is required"
 msgstr "É necessário um identificador de licença (eula-id)"
 
 #. TRANSLATORS: geeky error, 99.9999% of users won't see this
-#: ../client/pk-console.c:1523
+#: ../client/pk-console.c:1539
 msgid "A transaction identifier (tid) is required"
 msgstr "É necessário um identificador de transacção (tid)"
 
 #. TRANSLATORS: The user did not specify a package name
-#: ../client/pk-console.c:1544
+#: ../client/pk-console.c:1560
 msgid "A package name to resolve is required"
 msgstr "É necessário indicar um nome de pacote"
 
 #. TRANSLATORS: The user did not specify a repository (software source) name
-#: ../client/pk-console.c:1555 ../client/pk-console.c:1566
+#: ../client/pk-console.c:1571 ../client/pk-console.c:1582
 msgid "A repository name is required"
 msgstr "É obrigatório um nome de repositório"
 
 #. TRANSLATORS: The user didn't provide any data
-#: ../client/pk-console.c:1577
+#: ../client/pk-console.c:1593
 msgid "A repo name, parameter and value are required"
 msgstr "É necessário indicar um repositório, parâmetro e valor"
 
 #. TRANSLATORS: The user didn't specify what action to use
-#: ../client/pk-console.c:1594
+#: ../client/pk-console.c:1610
 msgid "An action, e.g. 'update-system' is required"
 msgstr "É necessária uma acção, por exemplo 'update-system'"
 
 #. TRANSLATORS: The user specified an invalid action
-#: ../client/pk-console.c:1601
+#: ../client/pk-console.c:1617
 msgid "A correct role is required"
 msgstr "É necessária uma função correcta"
 
 #. 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: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
+#: ../client/pk-console.c:1627 ../client/pk-console.c:1642
+#: ../client/pk-console.c:1651 ../client/pk-console.c:1671
+#: ../client/pk-console.c:1680 ../client/pk-generate-pack.c:316
 msgid "A package name is required"
 msgstr "É obrigatório um nome de pacote"
 
 #. TRANSLATORS: each package "provides" certain things, e.g. mime(gstreamer-decoder-mp3), the user didn't specify it
-#: ../client/pk-console.c:1644
+#: ../client/pk-console.c:1660
 msgid "A package provide string is required"
 msgstr ""
 "É necessário especificar a string que define o que o pacote disponibiliza"
 
 #. TRANSLATORS: The user tried to use an unsupported option on the command line
-#: ../client/pk-console.c:1724
+#: ../client/pk-console.c:1740
 #, c-format
 msgid "Option '%s' is not supported"
 msgstr "A opção '%s' não é suportada"
 
 #. TRANSLATORS: Generic failure of what they asked to do
-#: ../client/pk-console.c:1734
+#: ../client/pk-console.c:1750
 msgid "Command failed"
 msgstr "Comando falhou"
 
@@ -1735,39 +1745,47 @@ msgstr "Autenticação é necessária para alterar parâmetros do código fonte"
 
 #: ../policy/org.freedesktop.packagekit.policy.in.h:11
 msgid ""
+"Authentication is required to change the location used to decompress "
+"packages"
+msgstr ""
+"A autenticação é necessária para alterar a localização utilizada para "
+"descomprimir pacotes"
+
+#: ../policy/org.freedesktop.packagekit.policy.in.h:12
+msgid ""
 "Authentication is required to consider a key used for signing packages as "
 "trusted"
 msgstr ""
 "Autenticação é necessária para considerar segura uma chave utilizada para "
 "assinar pacotes"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:12
+#: ../policy/org.freedesktop.packagekit.policy.in.h:13
 msgid "Authentication is required to install a signed package"
 msgstr "Autenticação é necessária para instalar um pacote assinado"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:13
+#: ../policy/org.freedesktop.packagekit.policy.in.h:14
 msgid "Authentication is required to install an untrusted package"
 msgstr "Autenticação é necessária para instalar um pacote não confiável"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:14
+#: ../policy/org.freedesktop.packagekit.policy.in.h:15
 msgid "Authentication is required to refresh the system sources"
 msgstr "Autenticação é necessária para actualizar as fontes do sistema"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:15
+#: ../policy/org.freedesktop.packagekit.policy.in.h:16
 msgid "Authentication is required to reload the device with a new driver"
 msgstr ""
 "Autenticação é necessária para recarregar o dispositivo com o novo "
 "controlador"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:16
+#: ../policy/org.freedesktop.packagekit.policy.in.h:17
 msgid "Authentication is required to remove packages"
 msgstr "Autenticação é necessária para remover pacotes"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:17
+#: ../policy/org.freedesktop.packagekit.policy.in.h:18
 msgid "Authentication is required to rollback a transaction"
 msgstr "Autenticação é necessária para voltar atrás uma transacção"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:18
+#: ../policy/org.freedesktop.packagekit.policy.in.h:19
 msgid ""
 "Authentication is required to set the network proxy used for downloading "
 "packages"
@@ -1775,7 +1793,7 @@ msgstr ""
 "Autenticação é necessária para configurar o proxy de rede utilizado para "
 "transferir pacotes"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:19
+#: ../policy/org.freedesktop.packagekit.policy.in.h:20
 msgid "Authentication is required to update packages"
 msgstr "Autenticação é necessária para actualizar pacotes"
 
@@ -1784,16 +1802,26 @@ msgstr "Autenticação é necessária para actualizar pacotes"
 #. authentication, but a different user id needs the admin password
 #. to cancel another users task.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:25
+#: ../policy/org.freedesktop.packagekit.policy.in.h:26
 msgid "Cancel foreign task"
 msgstr "Cancelar tarefa externa"
 
 #. SECURITY:
+#. - This is used when users want to install to a different prefix, for
+#. instance to a LTSP image or a virtual machine.
+#. - This could be used to overwrite files not owned by the user using
+#. a carefully created package file.
+#.
+#: ../policy/org.freedesktop.packagekit.policy.in.h:33
+msgid "Change location that packages are installed"
+msgstr "Mudar a localização onde os pacotes são instalados"
+
+#. SECURITY:
 #. - Normal users require admin authentication to enable or disable
 #. software sources as this can be used to enable new updates or
 #. install different versions of software.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:31
+#: ../policy/org.freedesktop.packagekit.policy.in.h:39
 msgid "Change software source parameters"
 msgstr "Alterar parâmetros do código fonte"
 
@@ -1803,7 +1831,7 @@ msgstr "Alterar parâmetros do código fonte"
 #. - Paranoid users (or parents!) can change this to 'auth_admin' or
 #. 'auth_admin_keep'.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:38
+#: ../policy/org.freedesktop.packagekit.policy.in.h:46
 msgid "Install signed package"
 msgstr "Instalar pacote assinado"
 
@@ -1813,7 +1841,7 @@ msgstr "Instalar pacote assinado"
 #. password would be a massive security hole.
 #. - This is not retained as each package should be authenticated.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:45
+#: ../policy/org.freedesktop.packagekit.policy.in.h:53
 msgid "Install untrusted local file"
 msgstr "Instalar ficheiro local não confiável"
 
@@ -1821,7 +1849,7 @@ msgstr "Instalar ficheiro local não confiável"
 #. - Normal users do not require admin authentication to refresh the
 #. cache, as this doesn't actually install or remove software.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:50
+#: ../policy/org.freedesktop.packagekit.policy.in.h:58
 msgid "Refresh system sources"
 msgstr "Actualizar fontes do sistema"
 
@@ -1832,7 +1860,7 @@ msgstr "Actualizar fontes do sistema"
 #. try to rebind drivers in use, for instance security authentication
 #. devices.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:58
+#: ../policy/org.freedesktop.packagekit.policy.in.h:66
 msgid "Reload a device"
 msgstr "Recarregar dispositivo"
 
@@ -1845,7 +1873,7 @@ msgstr "Recarregar dispositivo"
 #. be removed. If this is not possible, change this authentication to
 #. 'auth_admin'.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:68
+#: ../policy/org.freedesktop.packagekit.policy.in.h:76
 msgid "Remove package"
 msgstr "Remover pacote"
 
@@ -1854,7 +1882,7 @@ msgstr "Remover pacote"
 #. as this will change a large number of packages, and could expose the
 #. system to previously patched security vulnerabilities.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:74
+#: ../policy/org.freedesktop.packagekit.policy.in.h:82
 msgid "Rollback to a previous transaction"
 msgstr "Voltar a uma transacção anterior"
 
@@ -1862,7 +1890,7 @@ msgstr "Voltar a uma transacção anterior"
 #. - Normal users do not require admin authentication to set the proxy
 #. used for downloading packages.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:79
+#: ../policy/org.freedesktop.packagekit.policy.in.h:87
 msgid "Set network proxy"
 msgstr "Configurar o proxy da rede"
 
@@ -1872,7 +1900,7 @@ msgstr "Configurar o proxy da rede"
 #. without a secure authentication.
 #. - This is not kept as each package should be authenticated.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:86
+#: ../policy/org.freedesktop.packagekit.policy.in.h:94
 msgid "Trust a key used for signing packages"
 msgstr "Confiar numa chave utilizada para assinar pacotes"
 
@@ -1883,7 +1911,7 @@ msgstr "Confiar numa chave utilizada para assinar pacotes"
 #. - Changing this to anything other than 'yes' will break unattended
 #. updates.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:94
+#: ../policy/org.freedesktop.packagekit.policy.in.h:102
 msgid "Update packages"
 msgstr "Actualizar pacotes"
 
commit c25e4244c72ca73ea9c2beee31ed4b5b562c2e81
Author: warrink <warrink at fedoraproject.org>
Date:   Fri Apr 30 10:45:26 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 4e823bd..29df075 100644
--- a/po/nl.po
+++ b/po/nl.po
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: packagekit.master\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-04-04 08:18+0000\n"
-"PO-Revision-Date: 2010-04-04 12:13+0200\n"
+"POT-Creation-Date: 2010-04-30 09:50+0000\n"
+"PO-Revision-Date: 2010-04-30 12:45+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"
@@ -381,35 +381,40 @@ 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:1267 ../client/pk-monitor.c:326
+#: ../client/pk-console.c:1268 ../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:1270
+#: ../client/pk-console.c:1271
 msgid "Set the filter, e.g. installed"
 msgstr "Filter instellen, bijvoorbeeld geïnstalleerd"
 
+#. TRANSLATORS: command line argument, use a non-standard install prefix
+#: ../client/pk-console.c:1274
+msgid "Set the install root, e.g. '/' or '/mnt/ltsp'"
+msgstr "Stel de installeer root in, b.v.  '/' of '/mnt/ltsp'"
+
 #. TRANSLATORS: command line argument, work asynchronously
-#: ../client/pk-console.c:1273
+#: ../client/pk-console.c:1277
 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:1276
+#: ../client/pk-console.c:1280
 #: ../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:1279
+#: ../client/pk-console.c:1283
 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:1282
+#: ../client/pk-console.c:1286
 msgid ""
 "Print to screen a machine readable output, rather than using animated widgets"
 msgstr ""
@@ -417,122 +422,127 @@ msgstr ""
 "widgets te gebruiken"
 
 #. TRANSLATORS: we failed to contact the daemon
-#: ../client/pk-console.c:1304
+#: ../client/pk-console.c:1308
 msgid "Failed to contact PackageKit"
 msgstr "Contact met PackageKit krijgen mislukte."
 
 #. TRANSLATORS: The user specified an incorrect filter
-#: ../client/pk-console.c:1365
+#: ../client/pk-console.c:1369
 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
+#: ../client/pk-console.c:1381
+msgid "The install root could not be set"
+msgstr "De installeer root kon niet ingesteld worden"
+
+#. TRANSLATORS: The user specified an incorrect filter
+#: ../client/pk-console.c:1393
 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:1396
+#: ../client/pk-console.c:1412
 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:1403 ../client/pk-console.c:1415
-#: ../client/pk-console.c:1427 ../client/pk-console.c:1439
+#: ../client/pk-console.c:1419 ../client/pk-console.c:1431
+#: ../client/pk-console.c:1443 ../client/pk-console.c:1455
 msgid "A search term is required"
 msgstr "Een zoekterm is vereist"
 
 #. TRANSLATORS: the search type was provided, but invalid
-#: ../client/pk-console.c:1449
+#: ../client/pk-console.c:1465
 msgid "Invalid search type"
 msgstr "Ongeldig zoektype"
 
 #. TRANSLATORS: the user did not specify what they wanted to install
-#: ../client/pk-console.c:1455
+#: ../client/pk-console.c:1471
 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:1464
+#: ../client/pk-console.c:1480
 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:1476
+#: ../client/pk-console.c:1492
 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:1487
+#: ../client/pk-console.c:1503
 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:1496
+#: ../client/pk-console.c:1512
 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:1503
+#: ../client/pk-console.c:1519
 msgid "Directory not found"
 msgstr "Map niet gevonden"
 
 #. TRANSLATORS: geeky error, 99.9999% of users won't see this
-#: ../client/pk-console.c:1512
+#: ../client/pk-console.c:1528
 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:1523
+#: ../client/pk-console.c:1539
 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:1544
+#: ../client/pk-console.c:1560
 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:1555 ../client/pk-console.c:1566
+#: ../client/pk-console.c:1571 ../client/pk-console.c:1582
 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:1577
+#: ../client/pk-console.c:1593
 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:1594
+#: ../client/pk-console.c:1610
 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:1601
+#: ../client/pk-console.c:1617
 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: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
+#: ../client/pk-console.c:1627 ../client/pk-console.c:1642
+#: ../client/pk-console.c:1651 ../client/pk-console.c:1671
+#: ../client/pk-console.c:1680 ../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:1644
+#: ../client/pk-console.c:1660
 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:1724
+#: ../client/pk-console.c:1740
 #, 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:1734
+#: ../client/pk-console.c:1750
 msgid "Command failed"
 msgstr "Opdracht mislukt"
 
@@ -1731,38 +1741,45 @@ msgstr ""
 
 #: ../policy/org.freedesktop.packagekit.policy.in.h:11
 msgid ""
+"Authentication is required to change the location used to decompress packages"
+msgstr ""
+"Authenticatie is vereist om de om de locatie waar pakketten gedecomprimeerd "
+"worden te veranderen"
+
+#: ../policy/org.freedesktop.packagekit.policy.in.h:12
+msgid ""
 "Authentication is required to consider a key used for signing packages as "
 "trusted"
 msgstr ""
 "Authenticatie is vereist om de sleutel te overleggen die gebruikt wordt om "
 "een pakket als vertrouwt te tekenen "
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:12
+#: ../policy/org.freedesktop.packagekit.policy.in.h:13
 msgid "Authentication is required to install a signed package"
 msgstr "Authenticatie is vereist om een getekend pakket te installeren"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:13
+#: ../policy/org.freedesktop.packagekit.policy.in.h:14
 msgid "Authentication is required to install an untrusted package"
 msgstr "Authenticatie is vereist om een untrused pakket te installeren"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:14
+#: ../policy/org.freedesktop.packagekit.policy.in.h:15
 msgid "Authentication is required to refresh the system sources"
 msgstr "Authenticatie is vereist om de systeembronnen te vernieuwen"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:15
+#: ../policy/org.freedesktop.packagekit.policy.in.h:16
 msgid "Authentication is required to reload the device with a new driver"
 msgstr ""
 "Authenticatie is vereist om het device te herladen met een nieuwe driver"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:16
+#: ../policy/org.freedesktop.packagekit.policy.in.h:17
 msgid "Authentication is required to remove packages"
 msgstr "Authenticatie is vereist om pakketen te verwijderen"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:17
+#: ../policy/org.freedesktop.packagekit.policy.in.h:18
 msgid "Authentication is required to rollback a transaction"
 msgstr "Authenticatie is vereist om een transactie terug te draaien"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:18
+#: ../policy/org.freedesktop.packagekit.policy.in.h:19
 msgid ""
 "Authentication is required to set the network proxy used for downloading "
 "packages"
@@ -1770,7 +1787,7 @@ msgstr ""
 "Authenticatie is vereist om de netwerkproxy die gebruikt wordt om pakketten "
 "te installeren in te stellen "
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:19
+#: ../policy/org.freedesktop.packagekit.policy.in.h:20
 msgid "Authentication is required to update packages"
 msgstr "Authenticatie is vereist om pakketen bij te werken"
 
@@ -1779,16 +1796,26 @@ msgstr "Authenticatie is vereist om pakketen bij te werken"
 #. authentication, but a different user id needs the admin password
 #. to cancel another users task.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:25
+#: ../policy/org.freedesktop.packagekit.policy.in.h:26
 msgid "Cancel foreign task"
 msgstr "Breek uitheemse taak af"
 
 #. SECURITY:
+#. - This is used when users want to install to a different prefix, for
+#. instance to a LTSP image or a virtual machine.
+#. - This could be used to overwrite files not owned by the user using
+#. a carefully created package file.
+#.
+#: ../policy/org.freedesktop.packagekit.policy.in.h:33
+msgid "Change location that packages are installed"
+msgstr "Verander de locatie waar pakketten geïnstalleerd worden"
+
+#. SECURITY:
 #. - Normal users require admin authentication to enable or disable
 #. software sources as this can be used to enable new updates or
 #. install different versions of software.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:31
+#: ../policy/org.freedesktop.packagekit.policy.in.h:39
 msgid "Change software source parameters"
 msgstr "Parameters van de softwarebronnen wijzigen"
 
@@ -1798,7 +1825,7 @@ msgstr "Parameters van de softwarebronnen wijzigen"
 #. - Paranoid users (or parents!) can change this to 'auth_admin' or
 #. 'auth_admin_keep'.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:38
+#: ../policy/org.freedesktop.packagekit.policy.in.h:46
 msgid "Install signed package"
 msgstr "Getekend pakket installeren"
 
@@ -1808,7 +1835,7 @@ msgstr "Getekend pakket installeren"
 #. password would be a massive security hole.
 #. - This is not retained as each package should be authenticated.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:45
+#: ../policy/org.freedesktop.packagekit.policy.in.h:53
 msgid "Install untrusted local file"
 msgstr "Lokaal untrusted bestand installeren"
 
@@ -1816,7 +1843,7 @@ msgstr "Lokaal untrusted bestand installeren"
 #. - Normal users do not require admin authentication to refresh the
 #. cache, as this doesn't actually install or remove software.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:50
+#: ../policy/org.freedesktop.packagekit.policy.in.h:58
 msgid "Refresh system sources"
 msgstr "Herlaad systeembronnen"
 
@@ -1827,7 +1854,7 @@ msgstr "Herlaad systeembronnen"
 #. try to rebind drivers in use, for instance security authentication
 #. devices.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:58
+#: ../policy/org.freedesktop.packagekit.policy.in.h:66
 msgid "Reload a device"
 msgstr "Herlaad een device"
 
@@ -1840,7 +1867,7 @@ msgstr "Herlaad een device"
 #. be removed. If this is not possible, change this authentication to
 #. 'auth_admin'.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:68
+#: ../policy/org.freedesktop.packagekit.policy.in.h:76
 msgid "Remove package"
 msgstr "Pakket verwijderen"
 
@@ -1849,7 +1876,7 @@ msgstr "Pakket verwijderen"
 #. as this will change a large number of packages, and could expose the
 #. system to previously patched security vulnerabilities.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:74
+#: ../policy/org.freedesktop.packagekit.policy.in.h:82
 msgid "Rollback to a previous transaction"
 msgstr "Terugdraaien tot een voorgaande transactie"
 
@@ -1857,7 +1884,7 @@ msgstr "Terugdraaien tot een voorgaande transactie"
 #. - Normal users do not require admin authentication to set the proxy
 #. used for downloading packages.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:79
+#: ../policy/org.freedesktop.packagekit.policy.in.h:87
 msgid "Set network proxy"
 msgstr "Stel netwerkproxy in"
 
@@ -1867,7 +1894,7 @@ msgstr "Stel netwerkproxy in"
 #. without a secure authentication.
 #. - This is not kept as each package should be authenticated.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:86
+#: ../policy/org.freedesktop.packagekit.policy.in.h:94
 msgid "Trust a key used for signing packages"
 msgstr "Vertrouw een sleutel die gebruikt wordt voor het tekenen van pakketten"
 
@@ -1878,7 +1905,7 @@ msgstr "Vertrouw een sleutel die gebruikt wordt voor het tekenen van pakketten"
 #. - Changing this to anything other than 'yes' will break unattended
 #. updates.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:94
+#: ../policy/org.freedesktop.packagekit.policy.in.h:102
 msgid "Update packages"
 msgstr "Pakketten bijwerken"
 
commit ee5669cbdd1cf9d4116cf71a063fd77036ee78a1
Author: kmilos <kmilos at fedoraproject.org>
Date:   Thu Apr 29 20:26:52 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 49b7a5d..c8fb0be 100644
--- a/po/sr at latin.po
+++ b/po/sr at latin.po
@@ -7,12 +7,13 @@
 #
 # Igor Miletic (Igor Miletić) <grejigl-gnomeprevod at yahoo.ca>, 2009.
 # Miloš Komarčević <kmilos at gmail.com>, 2009.
+#
 msgid ""
 msgstr ""
 "Project-Id-Version: PackageKit\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-04-07 19:20+0000\n"
-"PO-Revision-Date: 2010-04-07 23:02-0000\n"
+"POT-Creation-Date: 2010-04-29 19:54+0000\n"
+"PO-Revision-Date: 2010-04-29 21:19+0100\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"
@@ -387,157 +388,167 @@ 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:1267 ../client/pk-monitor.c:326
+#: ../client/pk-console.c:1268 ../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:1270
+#: ../client/pk-console.c:1271
 msgid "Set the filter, e.g. installed"
 msgstr "Namesti filter, npr. instalirani"
 
+#. TRANSLATORS: command line argument, use a non-standard install prefix
+#: ../client/pk-console.c:1274
+msgid "Set the install root, e.g. '/' or '/mnt/ltsp'"
+msgstr "Postavi koren instalacije, npr. „/“ ili „/mnt/ltsp“"
+
 #. TRANSLATORS: command line argument, work asynchronously
-#: ../client/pk-console.c:1273
+#: ../client/pk-console.c:1277
 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:1276
+#: ../client/pk-console.c:1280
 #: ../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:1279
+#: ../client/pk-console.c:1283
 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:1282
+#: ../client/pk-console.c:1286
 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:1304
+#: ../client/pk-console.c:1308
 msgid "Failed to contact PackageKit"
 msgstr "Neuspešno kontaktiranje PaketKita."
 
 #. TRANSLATORS: The user specified an incorrect filter
-#: ../client/pk-console.c:1365
+#: ../client/pk-console.c:1369
 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
+#: ../client/pk-console.c:1381
+msgid "The install root could not be set"
+msgstr "Koren instalacije nije mogao da bude postavljen"
+
+#. TRANSLATORS: The user specified an incorrect filter
+#: ../client/pk-console.c:1393
 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:1396
+#: ../client/pk-console.c:1412
 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:1403 ../client/pk-console.c:1415
-#: ../client/pk-console.c:1427 ../client/pk-console.c:1439
+#: ../client/pk-console.c:1419 ../client/pk-console.c:1431
+#: ../client/pk-console.c:1443 ../client/pk-console.c:1455
 msgid "A search term is required"
 msgstr "Morate navesti termin za pretragu"
 
 #. TRANSLATORS: the search type was provided, but invalid
-#: ../client/pk-console.c:1449
+#: ../client/pk-console.c:1465
 msgid "Invalid search type"
 msgstr "Neispravna vrsta pretrage"
 
 #. TRANSLATORS: the user did not specify what they wanted to install
-#: ../client/pk-console.c:1455
+#: ../client/pk-console.c:1471
 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:1464
+#: ../client/pk-console.c:1480
 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:1476
+#: ../client/pk-console.c:1492
 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:1487
+#: ../client/pk-console.c:1503
 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:1496
+#: ../client/pk-console.c:1512
 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:1503
+#: ../client/pk-console.c:1519
 msgid "Directory not found"
 msgstr "Direktorijum nije nađen"
 
 #. TRANSLATORS: geeky error, 99.9999% of users won't see this
-#: ../client/pk-console.c:1512
+#: ../client/pk-console.c:1528
 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:1523
+#: ../client/pk-console.c:1539
 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:1544
+#: ../client/pk-console.c:1560
 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:1555 ../client/pk-console.c:1566
+#: ../client/pk-console.c:1571 ../client/pk-console.c:1582
 msgid "A repository name is required"
 msgstr "Morate navesti ime riznice"
 
 #. TRANSLATORS: The user didn't provide any data
-#: ../client/pk-console.c:1577
+#: ../client/pk-console.c:1593
 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:1594
+#: ../client/pk-console.c:1610
 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:1601
+#: ../client/pk-console.c:1617
 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: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
+#: ../client/pk-console.c:1627 ../client/pk-console.c:1642
+#: ../client/pk-console.c:1651 ../client/pk-console.c:1671
+#: ../client/pk-console.c:1680 ../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:1644
+#: ../client/pk-console.c:1660
 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:1724
+#: ../client/pk-console.c:1740
 #, 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:1734
+#: ../client/pk-console.c:1750
 msgid "Command failed"
 msgstr "Naredba nije uspela"
 
@@ -1732,48 +1743,55 @@ msgstr "Neophodna je autentifikacija za izmenu parametara izvora softvera"
 
 #: ../policy/org.freedesktop.packagekit.policy.in.h:11
 msgid ""
+"Authentication is required to change the location used to decompress packages"
+msgstr ""
+"Neophodna je autentifikacija za izmenu lokacije upotrebljene za raspakivanje "
+"paketa"
+
+#: ../policy/org.freedesktop.packagekit.policy.in.h:12
+msgid ""
 "Authentication is required to consider a key used for signing packages as "
 "trusted"
 msgstr ""
 "Neophodna je autentifikacija da bi se ključ korišćen za potpisivanje paketa "
 "smatrao poverljivim"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:12
+#: ../policy/org.freedesktop.packagekit.policy.in.h:13
 msgid "Authentication is required to install a signed package"
 msgstr "Neophodna je autentifikacija za instalaciju potpisanog paketa"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:13
+#: ../policy/org.freedesktop.packagekit.policy.in.h:14
 msgid "Authentication is required to install an untrusted package"
 msgstr ""
 "Neophodna je autentifikacija za instalaciju paketa iz nepoverljivog izvora"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:14
+#: ../policy/org.freedesktop.packagekit.policy.in.h:15
 msgid "Authentication is required to refresh the system sources"
 msgstr "Neophodna je autentifikacija za osvežavanje sistemskih riznica"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:15
+#: ../policy/org.freedesktop.packagekit.policy.in.h:16
 msgid "Authentication is required to reload the device with a new driver"
 msgstr ""
 "Neophodna je autentifikacija za ponovno učitavanje uređaja sa novim "
 "upravljačkim programom"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:16
+#: ../policy/org.freedesktop.packagekit.policy.in.h:17
 msgid "Authentication is required to remove packages"
 msgstr "Neophodna je autentifikacija za uklanjanje paketa"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:17
+#: ../policy/org.freedesktop.packagekit.policy.in.h:18
 msgid "Authentication is required to rollback a transaction"
 msgstr "Neophodna je autentifikacija za poništavanje sve-ili-ništa promena"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:18
+#: ../policy/org.freedesktop.packagekit.policy.in.h:19
 msgid ""
 "Authentication is required to set the network proxy used for downloading "
 "packages"
 msgstr ""
-"Neophodna je autentifikacija  kako bise namestio mrežni posrednik korišćen "
+"Neophodna je autentifikacija kako bi se namestio mrežni posrednik korišćen "
 "za preuzimanje paketa"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:19
+#: ../policy/org.freedesktop.packagekit.policy.in.h:20
 msgid "Authentication is required to update packages"
 msgstr "Neophodna je autentifikacija za ažuriranje paketa"
 
@@ -1782,16 +1800,26 @@ msgstr "Neophodna je autentifikacija za ažuriranje paketa"
 #. authentication, but a different user id needs the admin password
 #. to cancel another users task.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:25
+#: ../policy/org.freedesktop.packagekit.policy.in.h:26
 msgid "Cancel foreign task"
 msgstr "Otkaži strani posao"
 
 #. SECURITY:
+#. - This is used when users want to install to a different prefix, for
+#. instance to a LTSP image or a virtual machine.
+#. - This could be used to overwrite files not owned by the user using
+#. a carefully created package file.
+#.
+#: ../policy/org.freedesktop.packagekit.policy.in.h:33
+msgid "Change location that packages are installed"
+msgstr "Izmeni lokaciju instalacije paketa"
+
+#. SECURITY:
 #. - Normal users require admin authentication to enable or disable
 #. software sources as this can be used to enable new updates or
 #. install different versions of software.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:31
+#: ../policy/org.freedesktop.packagekit.policy.in.h:39
 msgid "Change software source parameters"
 msgstr "Izmeni parametre izvora softvera"
 
@@ -1801,7 +1829,7 @@ msgstr "Izmeni parametre izvora softvera"
 #. - Paranoid users (or parents!) can change this to 'auth_admin' or
 #. 'auth_admin_keep'.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:38
+#: ../policy/org.freedesktop.packagekit.policy.in.h:46
 msgid "Install signed package"
 msgstr "Instaliraj potpisani paket"
 
@@ -1811,7 +1839,7 @@ msgstr "Instaliraj potpisani paket"
 #. password would be a massive security hole.
 #. - This is not retained as each package should be authenticated.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:45
+#: ../policy/org.freedesktop.packagekit.policy.in.h:53
 msgid "Install untrusted local file"
 msgstr "Instaliraj nepoverljivu lokalnu datoteku"
 
@@ -1819,7 +1847,7 @@ msgstr "Instaliraj nepoverljivu lokalnu datoteku"
 #. - Normal users do not require admin authentication to refresh the
 #. cache, as this doesn't actually install or remove software.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:50
+#: ../policy/org.freedesktop.packagekit.policy.in.h:58
 msgid "Refresh system sources"
 msgstr "Osveži sistemske riznice"
 
@@ -1830,7 +1858,7 @@ msgstr "Osveži sistemske riznice"
 #. try to rebind drivers in use, for instance security authentication
 #. devices.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:58
+#: ../policy/org.freedesktop.packagekit.policy.in.h:66
 msgid "Reload a device"
 msgstr "Ponovo učitaj uređaj"
 
@@ -1843,7 +1871,7 @@ msgstr "Ponovo učitaj uređaj"
 #. be removed. If this is not possible, change this authentication to
 #. 'auth_admin'.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:68
+#: ../policy/org.freedesktop.packagekit.policy.in.h:76
 msgid "Remove package"
 msgstr "Ukloni paket"
 
@@ -1852,7 +1880,7 @@ msgstr "Ukloni paket"
 #. as this will change a large number of packages, and could expose the
 #. system to previously patched security vulnerabilities.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:74
+#: ../policy/org.freedesktop.packagekit.policy.in.h:82
 msgid "Rollback to a previous transaction"
 msgstr "Vrati se na stanje prethodne promene"
 
@@ -1860,7 +1888,7 @@ msgstr "Vrati se na stanje prethodne promene"
 #. - Normal users do not require admin authentication to set the proxy
 #. used for downloading packages.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:79
+#: ../policy/org.freedesktop.packagekit.policy.in.h:87
 msgid "Set network proxy"
 msgstr "Postavi mrežnog posrednika"
 
@@ -1870,7 +1898,7 @@ msgstr "Postavi mrežnog posrednika"
 #. without a secure authentication.
 #. - This is not kept as each package should be authenticated.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:86
+#: ../policy/org.freedesktop.packagekit.policy.in.h:94
 msgid "Trust a key used for signing packages"
 msgstr "Veruj ključu korišćenom za potpisivanje paketa"
 
@@ -1881,7 +1909,7 @@ msgstr "Veruj ključu korišćenom za potpisivanje paketa"
 #. - Changing this to anything other than 'yes' will break unattended
 #. updates.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:94
+#: ../policy/org.freedesktop.packagekit.policy.in.h:102
 msgid "Update packages"
 msgstr "Ažuriraj pakete"
 
commit e918b92acf38d307a4c79b1efd2f262f242ad5a8
Author: kmilos <kmilos at fedoraproject.org>
Date:   Thu Apr 29 20:26:20 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 84b1876..02a494d 100644
--- a/po/sr.po
+++ b/po/sr.po
@@ -7,12 +7,13 @@
 #
 # Igor Miletic (Игор Милетић) <grejigl-gnomeprevod at yahoo.ca>, 2009.
 # Miloš Komarčević <kmilos at gmail.com>, 2009.
+#
 msgid ""
 msgstr ""
 "Project-Id-Version: PackageKit\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-04-07 19:20+0000\n"
-"PO-Revision-Date: 2010-04-07 23:02-0000\n"
+"POT-Creation-Date: 2010-04-29 19:54+0000\n"
+"PO-Revision-Date: 2010-04-29 21:19+0100\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"
@@ -386,157 +387,167 @@ 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:1267 ../client/pk-monitor.c:326
+#: ../client/pk-console.c:1268 ../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:1270
+#: ../client/pk-console.c:1271
 msgid "Set the filter, e.g. installed"
 msgstr "Намести филтер, нпр. инсталирани"
 
+#. TRANSLATORS: command line argument, use a non-standard install prefix
+#: ../client/pk-console.c:1274
+msgid "Set the install root, e.g. '/' or '/mnt/ltsp'"
+msgstr "Постави корен инсталације, нпр. „/“ или „/mnt/ltsp“"
+
 #. TRANSLATORS: command line argument, work asynchronously
-#: ../client/pk-console.c:1273
+#: ../client/pk-console.c:1277
 msgid "Exit without waiting for actions to complete"
 msgstr "Заврши рад без чекања да се послови заврше"
 
 #. command line argument, do we ask questions
-#: ../client/pk-console.c:1276
+#: ../client/pk-console.c:1280
 #: ../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:1279
+#: ../client/pk-console.c:1283
 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:1282
+#: ../client/pk-console.c:1286
 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:1304
+#: ../client/pk-console.c:1308
 msgid "Failed to contact PackageKit"
 msgstr "Неуспешно контактирање ПакетКита."
 
 #. TRANSLATORS: The user specified an incorrect filter
-#: ../client/pk-console.c:1365
+#: ../client/pk-console.c:1369
 msgid "The proxy could not be set"
 msgstr "Прокси није могао да буде постављен"
 
 #. TRANSLATORS: The user specified an incorrect filter
-#: ../client/pk-console.c:1377
+#: ../client/pk-console.c:1381
+msgid "The install root could not be set"
+msgstr "Корен инсталације није могао да буде постављен"
+
+#. TRANSLATORS: The user specified an incorrect filter
+#: ../client/pk-console.c:1393
 msgid "The filter specified was invalid"
 msgstr "Наведени филтер није исправан"
 
 #. TRANSLATORS: a search type can be name, details, file, etc
-#: ../client/pk-console.c:1396
+#: ../client/pk-console.c:1412
 msgid "A search type is required, e.g. name"
 msgstr "Морате навести врсту претраге, нпр. по имену"
 
 #. TRANSLATORS: the user needs to provide a search term
-#: ../client/pk-console.c:1403 ../client/pk-console.c:1415
-#: ../client/pk-console.c:1427 ../client/pk-console.c:1439
+#: ../client/pk-console.c:1419 ../client/pk-console.c:1431
+#: ../client/pk-console.c:1443 ../client/pk-console.c:1455
 msgid "A search term is required"
 msgstr "Морате навести термин за претрагу"
 
 #. TRANSLATORS: the search type was provided, but invalid
-#: ../client/pk-console.c:1449
+#: ../client/pk-console.c:1465
 msgid "Invalid search type"
 msgstr "Неисправна врста претраге"
 
 #. TRANSLATORS: the user did not specify what they wanted to install
-#: ../client/pk-console.c:1455
+#: ../client/pk-console.c:1471
 msgid "A package name to install is required"
 msgstr "Неопходно је име пакета за инсталацију"
 
 #. TRANSLATORS: the user did not specify what they wanted to install
-#: ../client/pk-console.c:1464
+#: ../client/pk-console.c:1480
 msgid "A filename to install is required"
 msgstr "Неопходно је име датотеке за инсталацију"
 
 #. TRANSLATORS: geeky error, 99.9999% of users won't see this
-#: ../client/pk-console.c:1476
+#: ../client/pk-console.c:1492
 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:1487
+#: ../client/pk-console.c:1503
 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:1496
+#: ../client/pk-console.c:1512
 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:1503
+#: ../client/pk-console.c:1519
 msgid "Directory not found"
 msgstr "Директоријум није нађен"
 
 #. TRANSLATORS: geeky error, 99.9999% of users won't see this
-#: ../client/pk-console.c:1512
+#: ../client/pk-console.c:1528
 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:1523
+#: ../client/pk-console.c:1539
 msgid "A transaction identifier (tid) is required"
 msgstr "Морате навести идентификатор трансакције (tid)"
 
 #. TRANSLATORS: The user did not specify a package name
-#: ../client/pk-console.c:1544
+#: ../client/pk-console.c:1560
 msgid "A package name to resolve is required"
 msgstr "Морате навести име пакета за разрешавање"
 
 #. TRANSLATORS: The user did not specify a repository (software source) name
-#: ../client/pk-console.c:1555 ../client/pk-console.c:1566
+#: ../client/pk-console.c:1571 ../client/pk-console.c:1582
 msgid "A repository name is required"
 msgstr "Морате навести име ризнице"
 
 #. TRANSLATORS: The user didn't provide any data
-#: ../client/pk-console.c:1577
+#: ../client/pk-console.c:1593
 msgid "A repo name, parameter and value are required"
 msgstr "Морате навести име, параметар и вредност ризнице"
 
 #. TRANSLATORS: The user didn't specify what action to use
-#: ../client/pk-console.c:1594
+#: ../client/pk-console.c:1610
 msgid "An action, e.g. 'update-system' is required"
 msgstr "Морате навести радњу, нпр. „update-system“ (ажурирање система)"
 
 #. TRANSLATORS: The user specified an invalid action
-#: ../client/pk-console.c:1601
+#: ../client/pk-console.c:1617
 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: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
+#: ../client/pk-console.c:1627 ../client/pk-console.c:1642
+#: ../client/pk-console.c:1651 ../client/pk-console.c:1671
+#: ../client/pk-console.c:1680 ../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:1644
+#: ../client/pk-console.c:1660
 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:1724
+#: ../client/pk-console.c:1740
 #, c-format
 msgid "Option '%s' is not supported"
 msgstr "Опција „%s“ није подржана"
 
 #. TRANSLATORS: Generic failure of what they asked to do
-#: ../client/pk-console.c:1734
+#: ../client/pk-console.c:1750
 msgid "Command failed"
 msgstr "Наредба није успела"
 
@@ -1731,48 +1742,55 @@ msgstr "Неопходна је аутентификација за измену
 
 #: ../policy/org.freedesktop.packagekit.policy.in.h:11
 msgid ""
+"Authentication is required to change the location used to decompress packages"
+msgstr ""
+"Неопходна је аутентификација за измену локације употребљене за распакивање "
+"пакета"
+
+#: ../policy/org.freedesktop.packagekit.policy.in.h:12
+msgid ""
 "Authentication is required to consider a key used for signing packages as "
 "trusted"
 msgstr ""
 "Неопходна је аутентификација да би се кључ коришћен за потписивање пакета "
 "сматрао поверљивим"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:12
+#: ../policy/org.freedesktop.packagekit.policy.in.h:13
 msgid "Authentication is required to install a signed package"
 msgstr "Неопходна је аутентификација за инсталацију потписаног пакета"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:13
+#: ../policy/org.freedesktop.packagekit.policy.in.h:14
 msgid "Authentication is required to install an untrusted package"
 msgstr ""
 "Неопходна је аутентификација за инсталацију пакета из неповерљивог извора"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:14
+#: ../policy/org.freedesktop.packagekit.policy.in.h:15
 msgid "Authentication is required to refresh the system sources"
 msgstr "Неопходна је аутентификација за освежавање системских ризница"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:15
+#: ../policy/org.freedesktop.packagekit.policy.in.h:16
 msgid "Authentication is required to reload the device with a new driver"
 msgstr ""
 "Неопходна је аутентификација за поновно учитавање уређаја са новим "
 "управљачким програмом"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:16
+#: ../policy/org.freedesktop.packagekit.policy.in.h:17
 msgid "Authentication is required to remove packages"
 msgstr "Неопходна је аутентификација за уклањање пакета"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:17
+#: ../policy/org.freedesktop.packagekit.policy.in.h:18
 msgid "Authentication is required to rollback a transaction"
 msgstr "Неопходна је аутентификација за поништавање све-или-ништа промена"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:18
+#: ../policy/org.freedesktop.packagekit.policy.in.h:19
 msgid ""
 "Authentication is required to set the network proxy used for downloading "
 "packages"
 msgstr ""
-"Неопходна је аутентификација  како бисе наместио мрежни посредник коришћен "
+"Неопходна је аутентификација како би се наместио мрежни посредник коришћен "
 "за преузимање пакета"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:19
+#: ../policy/org.freedesktop.packagekit.policy.in.h:20
 msgid "Authentication is required to update packages"
 msgstr "Неопходна је аутентификација за ажурирање пакета"
 
@@ -1781,16 +1799,26 @@ msgstr "Неопходна је аутентификација за ажурир
 #. authentication, but a different user id needs the admin password
 #. to cancel another users task.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:25
+#: ../policy/org.freedesktop.packagekit.policy.in.h:26
 msgid "Cancel foreign task"
 msgstr "Откажи страни посао"
 
 #. SECURITY:
+#. - This is used when users want to install to a different prefix, for
+#. instance to a LTSP image or a virtual machine.
+#. - This could be used to overwrite files not owned by the user using
+#. a carefully created package file.
+#.
+#: ../policy/org.freedesktop.packagekit.policy.in.h:33
+msgid "Change location that packages are installed"
+msgstr "Измени локацију инсталације пакета"
+
+#. SECURITY:
 #. - Normal users require admin authentication to enable or disable
 #. software sources as this can be used to enable new updates or
 #. install different versions of software.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:31
+#: ../policy/org.freedesktop.packagekit.policy.in.h:39
 msgid "Change software source parameters"
 msgstr "Измени параметре извора софтвера"
 
@@ -1800,7 +1828,7 @@ msgstr "Измени параметре извора софтвера"
 #. - Paranoid users (or parents!) can change this to 'auth_admin' or
 #. 'auth_admin_keep'.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:38
+#: ../policy/org.freedesktop.packagekit.policy.in.h:46
 msgid "Install signed package"
 msgstr "Инсталирај потписани пакет"
 
@@ -1810,7 +1838,7 @@ msgstr "Инсталирај потписани пакет"
 #. password would be a massive security hole.
 #. - This is not retained as each package should be authenticated.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:45
+#: ../policy/org.freedesktop.packagekit.policy.in.h:53
 msgid "Install untrusted local file"
 msgstr "Инсталирај неповерљиву локалну датотеку"
 
@@ -1818,7 +1846,7 @@ msgstr "Инсталирај неповерљиву локалну датоте
 #. - Normal users do not require admin authentication to refresh the
 #. cache, as this doesn't actually install or remove software.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:50
+#: ../policy/org.freedesktop.packagekit.policy.in.h:58
 msgid "Refresh system sources"
 msgstr "Освежи системске ризнице"
 
@@ -1829,7 +1857,7 @@ msgstr "Освежи системске ризнице"
 #. try to rebind drivers in use, for instance security authentication
 #. devices.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:58
+#: ../policy/org.freedesktop.packagekit.policy.in.h:66
 msgid "Reload a device"
 msgstr "Поново учитај уређај"
 
@@ -1842,7 +1870,7 @@ msgstr "Поново учитај уређај"
 #. be removed. If this is not possible, change this authentication to
 #. 'auth_admin'.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:68
+#: ../policy/org.freedesktop.packagekit.policy.in.h:76
 msgid "Remove package"
 msgstr "Уклони пакет"
 
@@ -1851,7 +1879,7 @@ msgstr "Уклони пакет"
 #. as this will change a large number of packages, and could expose the
 #. system to previously patched security vulnerabilities.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:74
+#: ../policy/org.freedesktop.packagekit.policy.in.h:82
 msgid "Rollback to a previous transaction"
 msgstr "Врати се на стање претходне промене"
 
@@ -1859,7 +1887,7 @@ msgstr "Врати се на стање претходне промене"
 #. - Normal users do not require admin authentication to set the proxy
 #. used for downloading packages.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:79
+#: ../policy/org.freedesktop.packagekit.policy.in.h:87
 msgid "Set network proxy"
 msgstr "Постави мрежног посредника"
 
@@ -1869,7 +1897,7 @@ msgstr "Постави мрежног посредника"
 #. without a secure authentication.
 #. - This is not kept as each package should be authenticated.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:86
+#: ../policy/org.freedesktop.packagekit.policy.in.h:94
 msgid "Trust a key used for signing packages"
 msgstr "Веруј кључу коришћеном за потписивање пакета"
 
@@ -1880,7 +1908,7 @@ msgstr "Веруј кључу коришћеном за потписивање 
 #. - Changing this to anything other than 'yes' will break unattended
 #. updates.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:94
+#: ../policy/org.freedesktop.packagekit.policy.in.h:102
 msgid "Update packages"
 msgstr "Ажурирај пакете"
 
commit 5610fe964e537d16f49b9cc45f999a2bb90a6659
Author: raven <raven at fedoraproject.org>
Date:   Thu Apr 29 20:08:45 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 f8d6c60..bd46ce8 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-03 11:30+0000\n"
-"PO-Revision-Date: 2010-04-03 13:35+0200\n"
+"POT-Creation-Date: 2010-04-29 19:54+0000\n"
+"PO-Revision-Date: 2010-04-29 22:08+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"
@@ -381,35 +381,40 @@ 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:1267 ../client/pk-monitor.c:326
+#: ../client/pk-console.c:1268 ../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:1270
+#: ../client/pk-console.c:1271
 msgid "Set the filter, e.g. installed"
 msgstr "Ustawia filtr, np. zainstalowane"
 
+#. TRANSLATORS: command line argument, use a non-standard install prefix
+#: ../client/pk-console.c:1274
+msgid "Set the install root, e.g. '/' or '/mnt/ltsp'"
+msgstr "Ustawia główny katalog instalacji, np. \"/\" lub \"/mnt/ltsp\""
+
 #. TRANSLATORS: command line argument, work asynchronously
-#: ../client/pk-console.c:1273
+#: ../client/pk-console.c:1277
 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:1276
+#: ../client/pk-console.c:1280
 #: ../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:1279
+#: ../client/pk-console.c:1283
 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:1282
+#: ../client/pk-console.c:1286
 msgid ""
 "Print to screen a machine readable output, rather than using animated widgets"
 msgstr ""
@@ -417,122 +422,127 @@ msgstr ""
 "widgetów"
 
 #. TRANSLATORS: we failed to contact the daemon
-#: ../client/pk-console.c:1304
+#: ../client/pk-console.c:1308
 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:1365
+#: ../client/pk-console.c:1369
 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
+#: ../client/pk-console.c:1381
+msgid "The install root could not be set"
+msgstr "Nie można ustawić głównego katalogu instalacji"
+
+#. TRANSLATORS: The user specified an incorrect filter
+#: ../client/pk-console.c:1393
 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:1396
+#: ../client/pk-console.c:1412
 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:1403 ../client/pk-console.c:1415
-#: ../client/pk-console.c:1427 ../client/pk-console.c:1439
+#: ../client/pk-console.c:1419 ../client/pk-console.c:1431
+#: ../client/pk-console.c:1443 ../client/pk-console.c:1455
 msgid "A search term is required"
 msgstr "Wymagany jest wyszukiwany termin"
 
 #. TRANSLATORS: the search type was provided, but invalid
-#: ../client/pk-console.c:1449
+#: ../client/pk-console.c:1465
 msgid "Invalid search type"
 msgstr "Nieprawidłowy typ wyszukiwania"
 
 #. TRANSLATORS: the user did not specify what they wanted to install
-#: ../client/pk-console.c:1455
+#: ../client/pk-console.c:1471
 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:1464
+#: ../client/pk-console.c:1480
 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:1476
+#: ../client/pk-console.c:1492
 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:1487
+#: ../client/pk-console.c:1503
 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:1496
+#: ../client/pk-console.c:1512
 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:1503
+#: ../client/pk-console.c:1519
 msgid "Directory not found"
 msgstr "Nie odnaleziono katalogu"
 
 #. TRANSLATORS: geeky error, 99.9999% of users won't see this
-#: ../client/pk-console.c:1512
+#: ../client/pk-console.c:1528
 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:1523
+#: ../client/pk-console.c:1539
 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:1544
+#: ../client/pk-console.c:1560
 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:1555 ../client/pk-console.c:1566
+#: ../client/pk-console.c:1571 ../client/pk-console.c:1582
 msgid "A repository name is required"
 msgstr "Wymagana jest nazwa repozytorium"
 
 #. TRANSLATORS: The user didn't provide any data
-#: ../client/pk-console.c:1577
+#: ../client/pk-console.c:1593
 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:1594
+#: ../client/pk-console.c:1610
 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:1601
+#: ../client/pk-console.c:1617
 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: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
+#: ../client/pk-console.c:1627 ../client/pk-console.c:1642
+#: ../client/pk-console.c:1651 ../client/pk-console.c:1671
+#: ../client/pk-console.c:1680 ../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:1644
+#: ../client/pk-console.c:1660
 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:1724
+#: ../client/pk-console.c:1740
 #, 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:1734
+#: ../client/pk-console.c:1750
 msgid "Command failed"
 msgstr "Polecenie nie powiodło się"
 
@@ -1729,39 +1739,46 @@ msgstr ""
 
 #: ../policy/org.freedesktop.packagekit.policy.in.h:11
 msgid ""
+"Authentication is required to change the location used to decompress packages"
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby ustawić położenie używane do "
+"dekompresowania pakietów"
+
+#: ../policy/org.freedesktop.packagekit.policy.in.h:12
+msgid ""
 "Authentication is required to consider a key used for signing packages as "
 "trusted"
 msgstr ""
 "Wymagane jest uwierzytelnienie, aby oznaczyć klucz używany do podpisywania "
 "pakietów jako zaufany"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:12
+#: ../policy/org.freedesktop.packagekit.policy.in.h:13
 msgid "Authentication is required to install a signed package"
 msgstr "Wymagane jest uwierzytelnienie, aby zainstalować podpisany pakiet"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:13
+#: ../policy/org.freedesktop.packagekit.policy.in.h:14
 msgid "Authentication is required to install an untrusted package"
 msgstr "Wymagane jest uwierzytelnienie, aby zainstalować niezaufany pakiet"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:14
+#: ../policy/org.freedesktop.packagekit.policy.in.h:15
 msgid "Authentication is required to refresh the system sources"
 msgstr "Wymagane jest uwierzytelnienie, aby odświeżyć źródła systemu"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:15
+#: ../policy/org.freedesktop.packagekit.policy.in.h:16
 msgid "Authentication is required to reload the device with a new driver"
 msgstr ""
 "Wymagane jest uwierzytelnienie, aby ponownie wczytać urządzenie za pomocą "
 "nowego sterownika"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:16
+#: ../policy/org.freedesktop.packagekit.policy.in.h:17
 msgid "Authentication is required to remove packages"
 msgstr "Wymagane jest uwierzytelnienie, aby usunąć pakiety"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:17
+#: ../policy/org.freedesktop.packagekit.policy.in.h:18
 msgid "Authentication is required to rollback a transaction"
 msgstr "Wymagane jest uwierzytelnienie, aby przywrócić transakcję"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:18
+#: ../policy/org.freedesktop.packagekit.policy.in.h:19
 msgid ""
 "Authentication is required to set the network proxy used for downloading "
 "packages"
@@ -1769,7 +1786,7 @@ msgstr ""
 "Wymagane jest uwierzytelnienie, aby ustawić pośrednika sieciowego używanego "
 "do pobierania pakietów"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:19
+#: ../policy/org.freedesktop.packagekit.policy.in.h:20
 msgid "Authentication is required to update packages"
 msgstr "Wymagane jest uwierzytelnienie, aby zaktualizować pakiety"
 
@@ -1778,16 +1795,26 @@ msgstr "Wymagane jest uwierzytelnienie, aby zaktualizować pakiety"
 #. authentication, but a different user id needs the admin password
 #. to cancel another users task.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:25
+#: ../policy/org.freedesktop.packagekit.policy.in.h:26
 msgid "Cancel foreign task"
 msgstr "Anulowanie obcego zadania"
 
 #. SECURITY:
+#. - This is used when users want to install to a different prefix, for
+#. instance to a LTSP image or a virtual machine.
+#. - This could be used to overwrite files not owned by the user using
+#. a carefully created package file.
+#.
+#: ../policy/org.freedesktop.packagekit.policy.in.h:33
+msgid "Change location that packages are installed"
+msgstr "Zmiana położenia, w którym są instalowane pakiety"
+
+#. SECURITY:
 #. - Normal users require admin authentication to enable or disable
 #. software sources as this can be used to enable new updates or
 #. install different versions of software.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:31
+#: ../policy/org.freedesktop.packagekit.policy.in.h:39
 msgid "Change software source parameters"
 msgstr "Zmiana parametrów źródła oprogramowania"
 
@@ -1797,7 +1824,7 @@ msgstr "Zmiana parametrów źródła oprogramowania"
 #. - Paranoid users (or parents!) can change this to 'auth_admin' or
 #. 'auth_admin_keep'.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:38
+#: ../policy/org.freedesktop.packagekit.policy.in.h:46
 msgid "Install signed package"
 msgstr "Instalacja podpisanego pakietu"
 
@@ -1807,7 +1834,7 @@ msgstr "Instalacja podpisanego pakietu"
 #. password would be a massive security hole.
 #. - This is not retained as each package should be authenticated.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:45
+#: ../policy/org.freedesktop.packagekit.policy.in.h:53
 msgid "Install untrusted local file"
 msgstr "Instalacja niezaufanego lokalnego pliku"
 
@@ -1815,7 +1842,7 @@ msgstr "Instalacja niezaufanego lokalnego pliku"
 #. - Normal users do not require admin authentication to refresh the
 #. cache, as this doesn't actually install or remove software.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:50
+#: ../policy/org.freedesktop.packagekit.policy.in.h:58
 msgid "Refresh system sources"
 msgstr "Odświeżenie źródeł systemu"
 
@@ -1826,7 +1853,7 @@ msgstr "Odświeżenie źródeł systemu"
 #. try to rebind drivers in use, for instance security authentication
 #. devices.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:58
+#: ../policy/org.freedesktop.packagekit.policy.in.h:66
 msgid "Reload a device"
 msgstr "Ponowne wczytanie urzÄ…dzenia"
 
@@ -1839,7 +1866,7 @@ msgstr "Ponowne wczytanie urzÄ…dzenia"
 #. be removed. If this is not possible, change this authentication to
 #. 'auth_admin'.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:68
+#: ../policy/org.freedesktop.packagekit.policy.in.h:76
 msgid "Remove package"
 msgstr "Usunięcie pakietu"
 
@@ -1848,7 +1875,7 @@ msgstr "Usunięcie pakietu"
 #. as this will change a large number of packages, and could expose the
 #. system to previously patched security vulnerabilities.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:74
+#: ../policy/org.freedesktop.packagekit.policy.in.h:82
 msgid "Rollback to a previous transaction"
 msgstr "Przywrócenie poprzedniej transakcji"
 
@@ -1856,7 +1883,7 @@ msgstr "Przywrócenie poprzedniej transakcji"
 #. - Normal users do not require admin authentication to set the proxy
 #. used for downloading packages.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:79
+#: ../policy/org.freedesktop.packagekit.policy.in.h:87
 msgid "Set network proxy"
 msgstr "Ustawienie pośrednika sieciowego"
 
@@ -1866,7 +1893,7 @@ msgstr "Ustawienie pośrednika sieciowego"
 #. without a secure authentication.
 #. - This is not kept as each package should be authenticated.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:86
+#: ../policy/org.freedesktop.packagekit.policy.in.h:94
 msgid "Trust a key used for signing packages"
 msgstr "Oznaczenie klucza używanego do podpisywania pakietów jako zaufanego"
 
@@ -1877,7 +1904,7 @@ msgstr "Oznaczenie klucza używanego do podpisywania pakietów jako zaufanego"
 #. - Changing this to anything other than 'yes' will break unattended
 #. updates.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:94
+#: ../policy/org.freedesktop.packagekit.policy.in.h:102
 msgid "Update packages"
 msgstr "Aktualizacja pakietów"
 
commit e58b15064059fca2bd8a43366814463ed582b0b4
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu Apr 29 09:18:28 2010 +0100

    Ensure we send MESSAGE_OTHER_UPDATES_HELD_BACK when we hold packages back

diff --git a/backends/yum/yumBackend.py b/backends/yum/yumBackend.py
index 3891589..29b6d8f 100755
--- a/backends/yum/yumBackend.py
+++ b/backends/yum/yumBackend.py
@@ -2555,13 +2555,13 @@ 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:
-                msg.append(pkg.name)
-            self.message(MESSAGE_BACKEND_ERROR, "The packages '%s' will be updated before other packages" % msg)
+            if len(infra_pkgs) < len(pkgs):
+                msg = []
+                for pkg in infra_pkgs:
+                    msg.append(pkg.name)
+                self.message(MESSAGE_OTHER_UPDATES_HELD_BACK, "Infrastructure packages take priority. " \
+                             "The packages '%s' will be updated before other packages" % msg)
             pkgs = infra_pkgs
 
         # get the list of installed updates as this is needed for get_applicable_notices()
commit 87399341e4f122b8bd81dcb98c0f1127dd92e958
Author: yurchor <yurchor at fedoraproject.org>
Date:   Thu Apr 29 16:10:17 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 f7a3967..84bc8c7 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-03 04:18+0000\n"
-"PO-Revision-Date: 2010-04-03 08:56+0300\n"
+"POT-Creation-Date: 2010-04-29 08:42+0000\n"
+"PO-Revision-Date: 2010-04-29 19:09+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"
@@ -382,35 +382,41 @@ 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:1267 ../client/pk-monitor.c:326
+#: ../client/pk-console.c:1268 ../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:1270
+#: ../client/pk-console.c:1271
 msgid "Set the filter, e.g. installed"
 msgstr "Встановити фільтр, наприклад, встановлені"
 
+#. TRANSLATORS: command line argument, use a non-standard install prefix
+#: ../client/pk-console.c:1274
+msgid "Set the install root, e.g. '/' or '/mnt/ltsp'"
+msgstr ""
+"Встановити кореневий каталог встановлення, наприклад, '/' або '/mnt/ltsp'"
+
 #. TRANSLATORS: command line argument, work asynchronously
-#: ../client/pk-console.c:1273
+#: ../client/pk-console.c:1277
 msgid "Exit without waiting for actions to complete"
 msgstr "Завершити роботу, не чекаючи на завершення дії"
 
 #. command line argument, do we ask questions
-#: ../client/pk-console.c:1276
+#: ../client/pk-console.c:1280
 #: ../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:1279
+#: ../client/pk-console.c:1283
 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:1282
+#: ../client/pk-console.c:1286
 msgid ""
 "Print to screen a machine readable output, rather than using animated widgets"
 msgstr ""
@@ -418,123 +424,128 @@ msgstr ""
 "анімованих віджетів"
 
 #. TRANSLATORS: we failed to contact the daemon
-#: ../client/pk-console.c:1304
+#: ../client/pk-console.c:1308
 msgid "Failed to contact PackageKit"
 msgstr "Не вдалося зв’язатися з PackageKit"
 
 #. TRANSLATORS: The user specified an incorrect filter
-#: ../client/pk-console.c:1365
+#: ../client/pk-console.c:1369
 msgid "The proxy could not be set"
 msgstr "Не вдалося встановити параметри проксі-сервера"
 
 #. TRANSLATORS: The user specified an incorrect filter
-#: ../client/pk-console.c:1377
+#: ../client/pk-console.c:1381
+msgid "The install root could not be set"
+msgstr "Не вдалося призначити кореневий каталог встановлення"
+
+#. TRANSLATORS: The user specified an incorrect filter
+#: ../client/pk-console.c:1393
 msgid "The filter specified was invalid"
 msgstr "Вказано некоректний фільтр"
 
 #. TRANSLATORS: a search type can be name, details, file, etc
-#: ../client/pk-console.c:1396
+#: ../client/pk-console.c:1412
 msgid "A search type is required, e.g. name"
 msgstr "Тип пошуку, якщо такий потрібен, наприклад, назва"
 
 #. TRANSLATORS: the user needs to provide a search term
-#: ../client/pk-console.c:1403 ../client/pk-console.c:1415
-#: ../client/pk-console.c:1427 ../client/pk-console.c:1439
+#: ../client/pk-console.c:1419 ../client/pk-console.c:1431
+#: ../client/pk-console.c:1443 ../client/pk-console.c:1455
 msgid "A search term is required"
 msgstr "Потрібен ключ пошуку"
 
 #. TRANSLATORS: the search type was provided, but invalid
-#: ../client/pk-console.c:1449
+#: ../client/pk-console.c:1465
 msgid "Invalid search type"
 msgstr "Некоректний тип пошуку"
 
 #. TRANSLATORS: the user did not specify what they wanted to install
-#: ../client/pk-console.c:1455
+#: ../client/pk-console.c:1471
 msgid "A package name to install is required"
 msgstr "Слід вказати назву пакунка, який слід встановити"
 
 #. TRANSLATORS: the user did not specify what they wanted to install
-#: ../client/pk-console.c:1464
+#: ../client/pk-console.c:1480
 msgid "A filename to install is required"
 msgstr "Слід вказати назву файла, який слід встановити"
 
 #. TRANSLATORS: geeky error, 99.9999% of users won't see this
-#: ../client/pk-console.c:1476
+#: ../client/pk-console.c:1492
 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:1487
+#: ../client/pk-console.c:1503
 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:1496
+#: ../client/pk-console.c:1512
 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:1503
+#: ../client/pk-console.c:1519
 msgid "Directory not found"
 msgstr "Каталог не знайдено"
 
 #. TRANSLATORS: geeky error, 99.9999% of users won't see this
-#: ../client/pk-console.c:1512
+#: ../client/pk-console.c:1528
 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:1523
+#: ../client/pk-console.c:1539
 msgid "A transaction identifier (tid) is required"
 msgstr "Слід вказати ідентифікатор операції (tid)"
 
 #. TRANSLATORS: The user did not specify a package name
-#: ../client/pk-console.c:1544
+#: ../client/pk-console.c:1560
 msgid "A package name to resolve is required"
 msgstr "Слід вказати назву пакунка для розв’язання конфлікту"
 
 #. TRANSLATORS: The user did not specify a repository (software source) name
-#: ../client/pk-console.c:1555 ../client/pk-console.c:1566
+#: ../client/pk-console.c:1571 ../client/pk-console.c:1582
 msgid "A repository name is required"
 msgstr "Слід вказати назву сховища"
 
 #. TRANSLATORS: The user didn't provide any data
-#: ../client/pk-console.c:1577
+#: ../client/pk-console.c:1593
 msgid "A repo name, parameter and value are required"
 msgstr "Слід вказати назву сховища, параметр і значення"
 
 #. TRANSLATORS: The user didn't specify what action to use
-#: ../client/pk-console.c:1594
+#: ../client/pk-console.c:1610
 msgid "An action, e.g. 'update-system' is required"
 msgstr "Слід вказати дію, наприклад «update-system»"
 
 #. TRANSLATORS: The user specified an invalid action
-#: ../client/pk-console.c:1601
+#: ../client/pk-console.c:1617
 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: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
+#: ../client/pk-console.c:1627 ../client/pk-console.c:1642
+#: ../client/pk-console.c:1651 ../client/pk-console.c:1671
+#: ../client/pk-console.c:1680 ../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:1644
+#: ../client/pk-console.c:1660
 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:1724
+#: ../client/pk-console.c:1740
 #, c-format
 msgid "Option '%s' is not supported"
 msgstr "Підтримки параметра «%s» не передбачено"
 
 #. TRANSLATORS: Generic failure of what they asked to do
-#: ../client/pk-console.c:1734
+#: ../client/pk-console.c:1750
 msgid "Command failed"
 msgstr "Спроба виконання команди зазнала невдачі"
 
@@ -1721,74 +1732,91 @@ msgstr "Для підтвердження EULA слід виконати роз
 #: ../policy/org.freedesktop.packagekit.policy.in.h:9
 msgid ""
 "Authentication is required to cancel a task that was not started by yourself"
-msgstr "Для скасування дії, започаткованої не вами, слід пройти автентифікацію"
+msgstr "Для скасування дії, започаткованої не вами, слід пройти розпізнавання"
 
 #: ../policy/org.freedesktop.packagekit.policy.in.h:10
 msgid "Authentication is required to change software source parameters"
 msgstr ""
 "Для зміни параметрів джерел програмного забезпечення слід пройти "
-"автентифікацію"
+"розпізнавання"
 
 #: ../policy/org.freedesktop.packagekit.policy.in.h:11
 msgid ""
+"Authentication is required to change the location used to decompress packages"
+msgstr ""
+"Для визначення адреси каталогу, куди буде видобуто вміст пакунків, слід "
+"пройти розпізнавання"
+
+#: ../policy/org.freedesktop.packagekit.policy.in.h:12
+msgid ""
 "Authentication is required to consider a key used for signing packages as "
 "trusted"
 msgstr ""
 "Для визнання ключа, використаного для підписування пакунків, як надійного "
-"слід пройти автентифікацію"
+"слід пройти розпізнавання"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:12
+#: ../policy/org.freedesktop.packagekit.policy.in.h:13
 msgid "Authentication is required to install a signed package"
-msgstr "Для встановлення підписаного пакунка слід пройти автентифікацію"
+msgstr "Для встановлення підписаного пакунка слід пройти розпізнавання"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:13
+#: ../policy/org.freedesktop.packagekit.policy.in.h:14
 msgid "Authentication is required to install an untrusted package"
-msgstr "Для встановлення ненадійного пакунка слід пройти автентифікацію"
+msgstr "Для встановлення ненадійного пакунка слід пройти розпізнавання"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:14
+#: ../policy/org.freedesktop.packagekit.policy.in.h:15
 msgid "Authentication is required to refresh the system sources"
-msgstr "Для оновлення списку джерел системи слід пройти автентифікацію"
+msgstr "Для оновлення списку джерел системи слід пройти розпізнавання"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:15
+#: ../policy/org.freedesktop.packagekit.policy.in.h:16
 msgid "Authentication is required to reload the device with a new driver"
 msgstr ""
-"Для перезавантаження пристрою з новим драйвером слід пройти автентифікацію"
+"Для перезавантаження пристрою з новим драйвером слід пройти розпізнавання"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:16
+#: ../policy/org.freedesktop.packagekit.policy.in.h:17
 msgid "Authentication is required to remove packages"
-msgstr "Для вилучення пакунків слід пройти автентифікацію"
+msgstr "Для вилучення пакунків слід пройти розпізнавання"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:17
+#: ../policy/org.freedesktop.packagekit.policy.in.h:18
 msgid "Authentication is required to rollback a transaction"
-msgstr "Для скасування дії слід пройти автентифікацію"
+msgstr "Для скасування дії слід пройти розпізнавання"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:18
+#: ../policy/org.freedesktop.packagekit.policy.in.h:19
 msgid ""
 "Authentication is required to set the network proxy used for downloading "
 "packages"
 msgstr ""
 "Для визначення проксі-сервера, який буде використано для звантаження "
-"пакунків, слід пройти автентифікацію"
+"пакунків, слід пройти розпізнавання"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:19
+#: ../policy/org.freedesktop.packagekit.policy.in.h:20
 msgid "Authentication is required to update packages"
-msgstr "Для оновлення пакунків слід пройти автентифікацію"
+msgstr "Для оновлення пакунків слід пройти розпізнавання"
 
 #. SECURITY:
 #. - Normal users are allowed to cancel their own task without
 #. authentication, but a different user id needs the admin password
 #. to cancel another users task.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:25
+#: ../policy/org.freedesktop.packagekit.policy.in.h:26
 msgid "Cancel foreign task"
 msgstr "Скасування сторонніх завдань"
 
 #. SECURITY:
+#. - This is used when users want to install to a different prefix, for
+#. instance to a LTSP image or a virtual machine.
+#. - This could be used to overwrite files not owned by the user using
+#. a carefully created package file.
+#.
+#: ../policy/org.freedesktop.packagekit.policy.in.h:33
+msgid "Change location that packages are installed"
+msgstr "Змінити каталог, куди встановлюватимуться пакунки"
+
+#. SECURITY:
 #. - Normal users require admin authentication to enable or disable
 #. software sources as this can be used to enable new updates or
 #. install different versions of software.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:31
+#: ../policy/org.freedesktop.packagekit.policy.in.h:39
 msgid "Change software source parameters"
 msgstr "Зміна параметрів джерела програм"
 
@@ -1798,7 +1826,7 @@ msgstr "Зміна параметрів джерела програм"
 #. - Paranoid users (or parents!) can change this to 'auth_admin' or
 #. 'auth_admin_keep'.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:38
+#: ../policy/org.freedesktop.packagekit.policy.in.h:46
 msgid "Install signed package"
 msgstr "Встановлення підписаного пакунка"
 
@@ -1808,7 +1836,7 @@ msgstr "Встановлення підписаного пакунка"
 #. password would be a massive security hole.
 #. - This is not retained as each package should be authenticated.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:45
+#: ../policy/org.freedesktop.packagekit.policy.in.h:53
 msgid "Install untrusted local file"
 msgstr "Встановлення ненадійного локального файла"
 
@@ -1816,7 +1844,7 @@ msgstr "Встановлення ненадійного локального ф
 #. - Normal users do not require admin authentication to refresh the
 #. cache, as this doesn't actually install or remove software.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:50
+#: ../policy/org.freedesktop.packagekit.policy.in.h:58
 msgid "Refresh system sources"
 msgstr "Оновлення списків джерел системи"
 
@@ -1827,7 +1855,7 @@ msgstr "Оновлення списків джерел системи"
 #. try to rebind drivers in use, for instance security authentication
 #. devices.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:58
+#: ../policy/org.freedesktop.packagekit.policy.in.h:66
 msgid "Reload a device"
 msgstr "Перезавантаження пристрою"
 
@@ -1840,7 +1868,7 @@ msgstr "Перезавантаження пристрою"
 #. be removed. If this is not possible, change this authentication to
 #. 'auth_admin'.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:68
+#: ../policy/org.freedesktop.packagekit.policy.in.h:76
 msgid "Remove package"
 msgstr "Вилучення пакунка"
 
@@ -1849,7 +1877,7 @@ msgstr "Вилучення пакунка"
 #. as this will change a large number of packages, and could expose the
 #. system to previously patched security vulnerabilities.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:74
+#: ../policy/org.freedesktop.packagekit.policy.in.h:82
 msgid "Rollback to a previous transaction"
 msgstr "Повернення до попередньої операції"
 
@@ -1857,7 +1885,7 @@ msgstr "Повернення до попередньої операції"
 #. - Normal users do not require admin authentication to set the proxy
 #. used for downloading packages.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:79
+#: ../policy/org.freedesktop.packagekit.policy.in.h:87
 msgid "Set network proxy"
 msgstr "Встановлення проксі-сервер"
 
@@ -1867,7 +1895,7 @@ msgstr "Встановлення проксі-сервер"
 #. without a secure authentication.
 #. - This is not kept as each package should be authenticated.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:86
+#: ../policy/org.freedesktop.packagekit.policy.in.h:94
 msgid "Trust a key used for signing packages"
 msgstr "Визначення надійності ключа, яким підписано пакунки"
 
@@ -1878,7 +1906,7 @@ msgstr "Визначення надійності ключа, яким підп
 #. - Changing this to anything other than 'yes' will break unattended
 #. updates.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:94
+#: ../policy/org.freedesktop.packagekit.policy.in.h:102
 msgid "Update packages"
 msgstr "Оновлення пакунків"
 
commit c4d199e1183458149491ffbc537b9a9d78b3ddf3
Author: logan <logan at fedoraproject.org>
Date:   Thu Apr 29 13:05:30 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 94b6c9e..798fe54 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-03 16:16+0000\n"
-"PO-Revision-Date: 2010-04-03 14:43-0300\n"
+"POT-Creation-Date: 2010-04-29 08:42+0000\n"
+"PO-Revision-Date: 2010-04-29 10:04-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"
@@ -383,160 +383,170 @@ 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:1267
+#: ../client/pk-console.c:1268
 #: ../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:1270
+#: ../client/pk-console.c:1271
 msgid "Set the filter, e.g. installed"
 msgstr "Establecer el filtro, p. ej. instalado"
 
+#. TRANSLATORS: command line argument, use a non-standard install prefix
+#: ../client/pk-console.c:1274
+msgid "Set the install root, e.g. '/' or '/mnt/ltsp'"
+msgstr "Establecer la raíz de instalación, p. ej., '/', o '/mnt/ltsp'"
+
 #. TRANSLATORS: command line argument, work asynchronously
-#: ../client/pk-console.c:1273
+#: ../client/pk-console.c:1277
 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:1276
+#: ../client/pk-console.c:1280
 #: ../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:1279
+#: ../client/pk-console.c:1283
 msgid "Run the command using idle network bandwidth and also using less power"
 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
+#: ../client/pk-console.c:1286
 msgid "Print to screen a machine readable output, rather than using animated widgets"
 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
+#: ../client/pk-console.c:1308
 msgid "Failed to contact PackageKit"
 msgstr "Falló al contactar con PackageKit"
 
 #. TRANSLATORS: The user specified an incorrect filter
-#: ../client/pk-console.c:1365
+#: ../client/pk-console.c:1369
 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
+#: ../client/pk-console.c:1381
+msgid "The install root could not be set"
+msgstr "La raíz de instalación no pudo ser definida"
+
+#. TRANSLATORS: The user specified an incorrect filter
+#: ../client/pk-console.c:1393
 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:1396
+#: ../client/pk-console.c:1412
 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:1403
-#: ../client/pk-console.c:1415
-#: ../client/pk-console.c:1427
-#: ../client/pk-console.c:1439
+#: ../client/pk-console.c:1419
+#: ../client/pk-console.c:1431
+#: ../client/pk-console.c:1443
+#: ../client/pk-console.c:1455
 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:1449
+#: ../client/pk-console.c:1465
 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:1455
+#: ../client/pk-console.c:1471
 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:1464
+#: ../client/pk-console.c:1480
 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:1476
+#: ../client/pk-console.c:1492
 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:1487
+#: ../client/pk-console.c:1503
 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:1496
+#: ../client/pk-console.c:1512
 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:1503
+#: ../client/pk-console.c:1519
 msgid "Directory not found"
 msgstr "Directorio no encontrado"
 
 #. TRANSLATORS: geeky error, 99.9999% of users won't see this
-#: ../client/pk-console.c:1512
+#: ../client/pk-console.c:1528
 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:1523
+#: ../client/pk-console.c:1539
 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:1544
+#: ../client/pk-console.c:1560
 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:1555
-#: ../client/pk-console.c:1566
+#: ../client/pk-console.c:1571
+#: ../client/pk-console.c:1582
 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:1577
+#: ../client/pk-console.c:1593
 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:1594
+#: ../client/pk-console.c:1610
 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:1601
+#: ../client/pk-console.c:1617
 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:1611
-#: ../client/pk-console.c:1626
-#: ../client/pk-console.c:1635
-#: ../client/pk-console.c:1655
-#: ../client/pk-console.c:1664
+#: ../client/pk-console.c:1627
+#: ../client/pk-console.c:1642
+#: ../client/pk-console.c:1651
+#: ../client/pk-console.c:1671
+#: ../client/pk-console.c:1680
 #: ../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:1644
+#: ../client/pk-console.c:1660
 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:1724
+#: ../client/pk-console.c:1740
 #, 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:1734
+#: ../client/pk-console.c:1750
 msgid "Command failed"
 msgstr "Falló el comando"
 
@@ -1721,38 +1731,42 @@ msgid "Authentication is required to change software source parameters"
 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 change the location used to decompress packages"
+msgstr "Es necesario autenticarse para modificar la ubicación utilizada para descomprimir paquetes"
+
+#: ../policy/org.freedesktop.packagekit.policy.in.h:12
 msgid "Authentication is required to consider a key used for signing packages as trusted"
 msgstr "Es necesario autenticarse para considerar confiable a una clave utilizada para identificar paquetes"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:12
+#: ../policy/org.freedesktop.packagekit.policy.in.h:13
 msgid "Authentication is required to install a signed package"
 msgstr "Es necesario autenticarse para instalar un paquete firmado"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:13
+#: ../policy/org.freedesktop.packagekit.policy.in.h:14
 msgid "Authentication is required to install an untrusted package"
 msgstr "Es necesario autenticarse para instalar un paquete no confiable"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:14
+#: ../policy/org.freedesktop.packagekit.policy.in.h:15
 msgid "Authentication is required to refresh the system sources"
 msgstr "Es necesario autenticarse para actualizar las fuentes del sistema"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:15
+#: ../policy/org.freedesktop.packagekit.policy.in.h:16
 msgid "Authentication is required to reload the device with a new driver"
 msgstr "Es necesario autenticarse para recargar el dispositivo con un controlador nuevo"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:16
+#: ../policy/org.freedesktop.packagekit.policy.in.h:17
 msgid "Authentication is required to remove packages"
 msgstr "Es necesario autenticarse para eliminar paquetes"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:17
+#: ../policy/org.freedesktop.packagekit.policy.in.h:18
 msgid "Authentication is required to rollback a transaction"
 msgstr "Es necesario autenticarse para deshacer una transacción"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:18
+#: ../policy/org.freedesktop.packagekit.policy.in.h:19
 msgid "Authentication is required to set the network proxy used for downloading packages"
 msgstr "Es necesario autenticarse para modificar el proxy de red utilizado para descargar paquetes"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:19
+#: ../policy/org.freedesktop.packagekit.policy.in.h:20
 msgid "Authentication is required to update packages"
 msgstr "Es necesario autenticarse para actualizar paquetes"
 
@@ -1761,16 +1775,26 @@ msgstr "Es necesario autenticarse para actualizar paquetes"
 #. authentication, but a different user id needs the admin password
 #. to cancel another users task.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:25
+#: ../policy/org.freedesktop.packagekit.policy.in.h:26
 msgid "Cancel foreign task"
 msgstr "Cancelar tarea externa"
 
 #. SECURITY:
+#. - This is used when users want to install to a different prefix, for
+#. instance to a LTSP image or a virtual machine.
+#. - This could be used to overwrite files not owned by the user using
+#. a carefully created package file.
+#.
+#: ../policy/org.freedesktop.packagekit.policy.in.h:33
+msgid "Change location that packages are installed"
+msgstr "Modificar la ubicación en donde instalar los paquetes"
+
+#. SECURITY:
 #. - Normal users require admin authentication to enable or disable
 #. software sources as this can be used to enable new updates or
 #. install different versions of software.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:31
+#: ../policy/org.freedesktop.packagekit.policy.in.h:39
 msgid "Change software source parameters"
 msgstr "Modificar los parámetros de fuente de software"
 
@@ -1780,7 +1804,7 @@ msgstr "Modificar los parámetros de fuente de software"
 #. - Paranoid users (or parents!) can change this to 'auth_admin' or
 #. 'auth_admin_keep'.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:38
+#: ../policy/org.freedesktop.packagekit.policy.in.h:46
 msgid "Install signed package"
 msgstr "Instalar paquete firmado"
 
@@ -1790,7 +1814,7 @@ msgstr "Instalar paquete firmado"
 #. password would be a massive security hole.
 #. - This is not retained as each package should be authenticated.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:45
+#: ../policy/org.freedesktop.packagekit.policy.in.h:53
 msgid "Install untrusted local file"
 msgstr "Instalar archivo local no-confiable"
 
@@ -1798,7 +1822,7 @@ msgstr "Instalar archivo local no-confiable"
 #. - Normal users do not require admin authentication to refresh the
 #. cache, as this doesn't actually install or remove software.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:50
+#: ../policy/org.freedesktop.packagekit.policy.in.h:58
 msgid "Refresh system sources"
 msgstr "Actualizar las fuentes del sistema"
 
@@ -1809,7 +1833,7 @@ msgstr "Actualizar las fuentes del sistema"
 #. try to rebind drivers in use, for instance security authentication
 #. devices.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:58
+#: ../policy/org.freedesktop.packagekit.policy.in.h:66
 msgid "Reload a device"
 msgstr "Recargar un dispositivo"
 
@@ -1822,7 +1846,7 @@ msgstr "Recargar un dispositivo"
 #. be removed. If this is not possible, change this authentication to
 #. 'auth_admin'.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:68
+#: ../policy/org.freedesktop.packagekit.policy.in.h:76
 msgid "Remove package"
 msgstr "Eliminar paquete"
 
@@ -1831,7 +1855,7 @@ msgstr "Eliminar paquete"
 #. as this will change a large number of packages, and could expose the
 #. system to previously patched security vulnerabilities.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:74
+#: ../policy/org.freedesktop.packagekit.policy.in.h:82
 msgid "Rollback to a previous transaction"
 msgstr "Deshacer hasta una transacción anterior"
 
@@ -1839,7 +1863,7 @@ msgstr "Deshacer hasta una transacción anterior"
 #. - Normal users do not require admin authentication to set the proxy
 #. used for downloading packages.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:79
+#: ../policy/org.freedesktop.packagekit.policy.in.h:87
 msgid "Set network proxy"
 msgstr "Establecer el proxy de la red"
 
@@ -1849,7 +1873,7 @@ msgstr "Establecer el proxy de la red"
 #. without a secure authentication.
 #. - This is not kept as each package should be authenticated.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:86
+#: ../policy/org.freedesktop.packagekit.policy.in.h:94
 msgid "Trust a key used for signing packages"
 msgstr "Confiar en una llave utilizada para firmar paquetes"
 
@@ -1860,7 +1884,7 @@ msgstr "Confiar en una llave utilizada para firmar paquetes"
 #. - Changing this to anything other than 'yes' will break unattended
 #. updates.
 #.
-#: ../policy/org.freedesktop.packagekit.policy.in.h:94
+#: ../policy/org.freedesktop.packagekit.policy.in.h:102
 msgid "Update packages"
 msgstr "Actualizar paquetes"
 
@@ -1997,316 +2021,226 @@ 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 "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 b5d70ba0c4b77e1e181edb5d185de84b5cda396d
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Apr 28 16:38:55 2010 +0100

    Allow clients to request a relocatable root, but only with admin authority

diff --git a/backends/yum/pk-backend-yum.c b/backends/yum/pk-backend-yum.c
index b6862f0..4070dae 100644
--- a/backends/yum/pk-backend-yum.c
+++ b/backends/yum/pk-backend-yum.c
@@ -573,10 +573,11 @@ static void
 backend_initialize (PkBackend *backend)
 {
 	gboolean ret;
-	GFile *file;
+	GFile *file = NULL;
 	GError *error = NULL;
 	GKeyFile *key_file = NULL;
 	gchar *config_file = NULL;
+	const gchar *root;
 
 	/* create private area */
 	priv = g_new0 (PkBackendYumPrivate, 1);
@@ -588,6 +589,13 @@ backend_initialize (PkBackend *backend)
 	pk_backend_spawn_set_name (priv->spawn, "yum");
 	pk_backend_spawn_set_allow_sigkill (priv->spawn, FALSE);
 
+	/* this backend does not support a relocatable root */
+	root = pk_backend_get_root (backend);
+	if (g_strcmp0 (root, "/") != 0) {
+		pk_backend_error_code (backend, PK_ERROR_ENUM_INSTALL_ROOT_INVALID, "backend does not support this root: '%s'", root);
+		goto out;
+	}
+
 	/* setup a file monitor on the repos directory */
 	file = g_file_new_for_path (YUM_REPOS_DIRECTORY);
 	priv->monitor = g_file_monitor_directory (file, G_FILE_MONITOR_NONE, NULL, &error);
@@ -651,7 +659,7 @@ backend_initialize (PkBackend *backend)
 
 	/* ZifStoreLocal */
 	priv->store_local = zif_store_local_new ();
-	ret = zif_store_local_set_prefix (priv->store_local, "/", &error);
+	ret = zif_store_local_set_prefix (priv->store_local, root, &error);
 	if (!ret) {
 		pk_backend_error_code (backend, PK_ERROR_ENUM_INTERNAL_ERROR, "failed to set prefix: %s", error->message);
 		g_error_free (error);
@@ -686,8 +694,10 @@ backend_initialize (PkBackend *backend)
 	backend_profile ("read groups");
 out:
 	g_free (config_file);
-	g_key_file_free (key_file);
-	g_object_unref (file);
+	if (key_file != NULL)
+		g_key_file_free (key_file);
+	if (file != NULL)
+		g_object_unref (file);
 }
 
 /**
diff --git a/client/pk-console.c b/client/pk-console.c
index 24a4402..34e4132 100644
--- a/client/pk-console.c
+++ b/client/pk-console.c
@@ -1250,6 +1250,7 @@ main (int argc, char *argv[])
 	GOptionContext *context;
 	gchar *options_help;
 	gchar *filter = NULL;
+	gchar *root = NULL;
 	gchar *summary = NULL;
 	const gchar *mode;
 	const gchar *http_proxy;
@@ -1268,6 +1269,9 @@ main (int argc, char *argv[])
 		{ "filter", '\0', 0, G_OPTION_ARG_STRING, &filter,
 			/* TRANSLATORS: command line argument, use a filter to narrow down results */
 			_("Set the filter, e.g. installed"), NULL},
+		{ "root", '\0', 0, G_OPTION_ARG_STRING, &root,
+			/* TRANSLATORS: command line argument, use a non-standard install prefix */
+			_("Set the install root, e.g. '/' or '/mnt/ltsp'"), NULL},
 		{ "nowait", 'n', 0, G_OPTION_ARG_NONE, &nowait,
 			/* TRANSLATORS: command line argument, work asynchronously */
 			_("Exit without waiting for actions to complete"), NULL},
@@ -1369,6 +1373,18 @@ main (int argc, char *argv[])
 		}
 	}
 
+	/* set the install root if set */
+	if (root != NULL) {
+		ret = pk_control_set_root (control, root, NULL, &error_local);
+		if (!ret) {
+			/* TRANSLATORS: The user specified an incorrect filter */
+			error = g_error_new (1, 0, "%s: %s", _("The install root 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);
@@ -1738,6 +1754,7 @@ out:
 
 	g_free (options_help);
 	g_free (filter);
+	g_free (root);
 	g_free (summary);
 	g_object_unref (progressbar);
 	g_object_unref (control);
diff --git a/etc/PackageKit.conf.in b/etc/PackageKit.conf.in
index 054c659..c814e47 100644
--- a/etc/PackageKit.conf.in
+++ b/etc/PackageKit.conf.in
@@ -279,3 +279,17 @@ NoUpdateProcessList=/usr/lib/*/firefox
 #
 # default=true
 UseThreadsInBackend=true
+
+# If a custom root should be used when installing packages
+#
+# A custom route can be used to install to a LTSP instance or a virtual machine
+# image, typically using chroot or by mounting an image using virt-inspector.
+#
+# Additional authentication is required to change the root from the default.
+#
+# Most users do not need to change this value, as you need to have setup a
+# native package database (e.g. the rpmdb) on the new root.
+#
+# default=/
+UseRoot=/
+
diff --git a/lib/packagekit-glib2/pk-control-sync.c b/lib/packagekit-glib2/pk-control-sync.c
index e7410c4..8da2ec0 100644
--- a/lib/packagekit-glib2/pk-control-sync.c
+++ b/lib/packagekit-glib2/pk-control-sync.c
@@ -197,6 +197,59 @@ pk_control_suggest_daemon_quit (PkControl *control, GCancellable *cancellable, G
 }
 
 /**
+ * pk_control_set_root_cb:
+ **/
+static void
+pk_control_set_root_cb (PkControl *control, GAsyncResult *res, PkControlHelper *helper)
+{
+	/* get the result */
+	helper->ret = pk_control_set_root_finish (control, res, helper->error);
+	g_main_loop_quit (helper->loop);
+}
+
+/**
+ * pk_control_set_root:
+ * @control: a valid #PkControl instance
+ * @root: the install root, e.g. '/'
+ * @cancellable: a #GCancellable or %NULL
+ * @error: A #GError or %NULL
+ *
+ * Sets the install root 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 root was set correctly
+ *
+ * Since: 0.6.4
+ **/
+gboolean
+pk_control_set_root (PkControl *control, const gchar *root, 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_root_async (control, root, cancellable, (GAsyncReadyCallback) pk_control_set_root_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;
+}
+
+/**
  * pk_control_set_proxy_cb:
  **/
 static void
diff --git a/lib/packagekit-glib2/pk-control-sync.h b/lib/packagekit-glib2/pk-control-sync.h
index 74be972..c25f536 100644
--- a/lib/packagekit-glib2/pk-control-sync.h
+++ b/lib/packagekit-glib2/pk-control-sync.h
@@ -36,6 +36,10 @@ gchar		**pk_control_get_transaction_list	(PkControl		*control,
 gboolean	 pk_control_suggest_daemon_quit		(PkControl		*control,
 							 GCancellable		*cancellable,
 							 GError			**error);
+gboolean	 pk_control_set_root			(PkControl		*control,
+							 const gchar		*root,
+							 GCancellable		*cancellable,
+							 GError			**error);
 gboolean	 pk_control_set_proxy			(PkControl		*control,
 							 const gchar		*proxy_http,
 							 const gchar		*proxy_ftp,
diff --git a/lib/packagekit-glib2/pk-control.c b/lib/packagekit-glib2/pk-control.c
index 682d9c7..4982036 100644
--- a/lib/packagekit-glib2/pk-control.c
+++ b/lib/packagekit-glib2/pk-control.c
@@ -783,6 +783,154 @@ pk_control_set_proxy_finish (PkControl *control, GAsyncResult *res, GError **err
 /***************************************************************************************************/
 
 /**
+ * pk_control_set_root_state_finish:
+ **/
+static void
+pk_control_set_root_state_finish (PkControlState *state, const GError *error)
+{
+	/* get result */
+	if (state->ret) {
+		g_simple_async_result_set_op_res_gboolean (state->res, state->ret);
+	} else {
+		g_simple_async_result_set_from_error (state->res, error);
+	}
+
+	/* remove from list */
+	g_ptr_array_remove (state->control->priv->calls, state);
+	if (state->call != NULL)
+		egg_warning ("state array remove %p (%p)", state, state->call);
+	else
+		egg_debug ("state array remove %p", state);
+
+	/* complete */
+	g_simple_async_result_complete_in_idle (state->res);
+
+	/* deallocate */
+	if (state->cancellable != NULL) {
+		g_cancellable_disconnect (state->cancellable, state->cancellable_id);
+		g_object_unref (state->cancellable);
+	}
+	g_object_unref (state->res);
+	g_object_unref (state->control);
+	g_slice_free (PkControlState, state);
+}
+
+/**
+ * pk_control_set_root_cb:
+ **/
+static void
+pk_control_set_root_cb (DBusGProxy *root, DBusGProxyCall *call, PkControlState *state)
+{
+	GError *error = NULL;
+	gchar *tid = NULL;
+	gboolean ret;
+
+	/* finished this call */
+	state->call = NULL;
+
+	/* get the result */
+	ret = dbus_g_proxy_end_call (root, call, &error,
+				     G_TYPE_INVALID);
+	if (!ret) {
+		egg_warning ("failed to set root: %s", error->message);
+		pk_control_set_root_state_finish (state, error);
+		g_error_free (error);
+		goto out;
+	}
+
+	/* save data */
+	state->ret = TRUE;
+
+	/* we're done */
+	pk_control_set_root_state_finish (state, NULL);
+out:
+	g_free (tid);
+}
+
+/**
+ * pk_control_set_root_async:
+ * @control: a valid #PkControl instance
+ * @root: an install root string such as "/mnt/ltsp"
+ * @cancellable: a #GCancellable or %NULL
+ * @callback: the function to run on completion
+ * @user_data: the data to pass to @callback
+ *
+ * Set the install root for the backend used by PackageKit
+ *
+ * Since: 0.6.4
+ **/
+void
+pk_control_set_root_async (PkControl *control, const gchar *root, GCancellable *cancellable,
+			   GAsyncReadyCallback callback, gpointer user_data)
+{
+	GSimpleAsyncResult *res;
+	PkControlState *state;
+
+	g_return_if_fail (PK_IS_CONTROL (control));
+	g_return_if_fail (callback != NULL);
+
+	res = g_simple_async_result_new (G_OBJECT (control), callback, user_data, pk_control_set_root_async);
+
+	/* save state */
+	state = g_slice_new0 (PkControlState);
+	state->res = g_object_ref (res);
+	state->control = g_object_ref (control);
+	if (cancellable != NULL) {
+		state->cancellable = g_object_ref (cancellable);
+		state->cancellable_id = g_cancellable_connect (cancellable, G_CALLBACK (pk_control_cancellable_cancel_cb), state, NULL);
+	}
+
+	/* call D-Bus set_root async */
+	state->call = dbus_g_proxy_begin_call (control->priv->proxy, "SetRoot",
+					       (DBusGProxyCallNotify) pk_control_set_root_cb, state, NULL,
+					       G_TYPE_STRING, root,
+					       G_TYPE_INVALID);
+	if (state->call == NULL)
+		egg_error ("failed to setup call, maybe OOM or no connection");
+
+	/* track state */
+	g_ptr_array_add (control->priv->calls, state);
+	egg_debug ("state array add %p (%p)", state, state->call);
+
+	g_object_unref (res);
+}
+
+/**
+ * pk_control_set_root_finish:
+ * @control: a valid #PkControl instance
+ * @res: the #GAsyncResult
+ * @error: A #GError or %NULL
+ *
+ * Gets the result from the asynchronous function.
+ *
+ * Return value: %TRUE if we set the root successfully
+ *
+ * Since: 0.6.4
+ **/
+gboolean
+pk_control_set_root_finish (PkControl *control, GAsyncResult *res, GError **error)
+{
+	GSimpleAsyncResult *simple;
+	gpointer source_tag;
+
+	g_return_val_if_fail (PK_IS_CONTROL (control), FALSE);
+	g_return_val_if_fail (G_IS_SIMPLE_ASYNC_RESULT (res), FALSE);
+	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+
+	simple = G_SIMPLE_ASYNC_RESULT (res);
+	source_tag = g_simple_async_result_get_source_tag (simple);
+
+	g_return_val_if_fail (source_tag == pk_control_set_root_async, FALSE);
+
+	if (g_simple_async_result_propagate_error (simple, error))
+		return FALSE;
+
+	return g_simple_async_result_get_op_res_gboolean (simple);
+}
+
+/***************************************************************************************************/
+
+/**
  * pk_control_get_transaction_list_state_finish:
  **/
 static void
diff --git a/lib/packagekit-glib2/pk-control.h b/lib/packagekit-glib2/pk-control.h
index d3d14d1..7292cda 100644
--- a/lib/packagekit-glib2/pk-control.h
+++ b/lib/packagekit-glib2/pk-control.h
@@ -122,6 +122,14 @@ void		 pk_control_set_proxy_async		(PkControl		*control,
 gboolean	 pk_control_set_proxy_finish		(PkControl		*control,
 							 GAsyncResult		*res,
 							 GError			**error);
+void		 pk_control_set_root_async		(PkControl		*control,
+							 const gchar		*root,
+							 GCancellable		*cancellable,
+							 GAsyncReadyCallback	 callback,
+							 gpointer		 user_data);
+gboolean	 pk_control_set_root_finish		(PkControl		*control,
+							 GAsyncResult		*res,
+							 GError			**error);
 void		 pk_control_get_network_state_async	(PkControl		*control,
 							 GCancellable		*cancellable,
 							 GAsyncReadyCallback	 callback,
diff --git a/lib/packagekit-glib2/pk-enum.c b/lib/packagekit-glib2/pk-enum.c
index 488eb65..a8de42f 100644
--- a/lib/packagekit-glib2/pk-enum.c
+++ b/lib/packagekit-glib2/pk-enum.c
@@ -194,6 +194,7 @@ static const PkEnumMatch enum_error[] = {
 	{PK_ERROR_ENUM_UPDATE_FAILED_DUE_TO_RUNNING_PROCESS, "failed-due-to-running-process"},
 	{PK_ERROR_ENUM_PACKAGE_DATABASE_CHANGED, "package-database-changed"},
 	{PK_ERROR_ENUM_PROVIDE_TYPE_NOT_SUPPORTED, "provide-type-not-supported"},
+	{PK_ERROR_ENUM_INSTALL_ROOT_INVALID,	"install-root-invalid"},
 	{0, NULL}
 };
 
diff --git a/lib/packagekit-glib2/pk-enum.h b/lib/packagekit-glib2/pk-enum.h
index 96e9974..2b121b7 100644
--- a/lib/packagekit-glib2/pk-enum.h
+++ b/lib/packagekit-glib2/pk-enum.h
@@ -361,6 +361,7 @@ typedef enum {
 	PK_ERROR_ENUM_UPDATE_FAILED_DUE_TO_RUNNING_PROCESS,
 	PK_ERROR_ENUM_PACKAGE_DATABASE_CHANGED,
 	PK_ERROR_ENUM_PROVIDE_TYPE_NOT_SUPPORTED,
+	PK_ERROR_ENUM_INSTALL_ROOT_INVALID,
 	PK_ERROR_ENUM_LAST
 } PkErrorEnum;
 
diff --git a/policy/org.freedesktop.packagekit.policy.in b/policy/org.freedesktop.packagekit.policy.in
index b514a71..7d59fb3 100644
--- a/policy/org.freedesktop.packagekit.policy.in
+++ b/policy/org.freedesktop.packagekit.policy.in
@@ -197,6 +197,23 @@
     </defaults>
   </action>
 
+  <action id="org.freedesktop.packagekit.system-change-install-root">
+    <!-- SECURITY:
+          - This is used when users want to install to a different prefix, for
+            instance to a LTSP image or a virtual machine.
+          - This could be used to overwrite files not owned by the user using
+            a carefully created package file.
+     -->
+    <_description>Change location that packages are installed</_description>
+    <_message>Authentication is required to change the location used to decompress packages</_message>
+    <icon_name>security-high</icon_name>
+    <defaults>
+      <allow_any>no</allow_any>
+      <allow_inactive>no</allow_inactive>
+      <allow_active>auth_admin_keep</allow_active>
+    </defaults>
+  </action>
+
   <action id="org.freedesktop.packagekit.device-rebind">
     <!-- SECURITY:
           - Normal users require admin authentication to rebind a driver
diff --git a/src/org.freedesktop.PackageKit.xml b/src/org.freedesktop.PackageKit.xml
index 3df51b1..9dfb832 100644
--- a/src/org.freedesktop.PackageKit.xml
+++ b/src/org.freedesktop.PackageKit.xml
@@ -352,6 +352,27 @@
       </arg>
     </method>
 
+    <!--*****************************************************************************************-->
+    <method name="SetRoot">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            Sets the root used by the dameon backend.
+          </doc:para>
+        </doc:description>
+        <doc:permission>Callers need the org.freedesktop.packagekit.system-change-install-root</doc:permission>
+      </doc:doc>
+      <arg type="s" name="root" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              The install root, e.g. <doc:tt>/</doc:tt> or <doc:tt>/mnt/ltsp</doc:tt>.
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+    </method>
 
     <!--*****************************************************************************************-->
     <signal name="TransactionListChanged">
diff --git a/src/pk-backend-internal.h b/src/pk-backend-internal.h
index d7d4e0a..0628f71 100644
--- a/src/pk-backend-internal.h
+++ b/src/pk-backend-internal.h
@@ -64,6 +64,8 @@ gboolean	 pk_backend_set_name			(PkBackend	*backend,
 gboolean	 pk_backend_set_proxy			(PkBackend	*backend,
 							 const gchar	*proxy_http,
 							 const gchar	*proxy_ftp);
+gboolean	 pk_backend_set_root			(PkBackend	*backend,
+							 const gchar	*root);
 gchar		*pk_backend_get_name			(PkBackend	*backend)
 							 G_GNUC_WARN_UNUSED_RESULT;
 gchar		*pk_backend_get_description		(PkBackend	*backend)
diff --git a/src/pk-backend-spawn.c b/src/pk-backend-spawn.c
index 8fee5fd..6856337 100644
--- a/src/pk-backend-spawn.c
+++ b/src/pk-backend-spawn.c
@@ -675,6 +675,7 @@ pk_backend_spawn_get_envp (PkBackendSpawn *backend_spawn)
 	gchar *uri;
 	gchar *eulas;
 	gchar *transaction_id = NULL;
+	const gchar *value;
 	guint i;
 	GPtrArray *array;
 	gboolean ret;
@@ -725,6 +726,13 @@ pk_backend_spawn_get_envp (PkBackendSpawn *backend_spawn)
 		g_ptr_array_add (array, line);
 	}
 
+	/* ROOT */
+	value = pk_backend_get_root (priv->backend);
+	if (!egg_strzero (value)) {
+		line = g_strdup_printf ("%s=%s", "ROOT", value);
+		g_ptr_array_add (array, line);
+	}
+
 	/* NETWORK */
 	ret = pk_backend_is_online (priv->backend);
 	line = g_strdup_printf ("%s=%s", "NETWORK", ret ? "TRUE" : "FALSE");
diff --git a/src/pk-backend.c b/src/pk-backend.c
index 3b2b670..168d63e 100644
--- a/src/pk-backend.c
+++ b/src/pk-backend.c
@@ -97,6 +97,7 @@ struct _PkBackendPrivate
 	gchar			*name;
 	gchar			*proxy_ftp;
 	gchar			*proxy_http;
+	gchar			*root;
 	gpointer		 file_changed_data;
 	guint			 download_files;
 	guint			 last_percentage;
@@ -566,6 +567,36 @@ pk_backend_get_proxy_ftp (PkBackend *backend)
 }
 
 /**
+ * pk_backend_set_root:
+ **/
+gboolean
+pk_backend_set_root (PkBackend	*backend, const gchar *root)
+{
+	g_return_val_if_fail (PK_IS_BACKEND (backend), FALSE);
+
+	/* NULL is actually the default, which is '/' */
+	if (root == NULL)
+		root = "/";
+
+	g_free (backend->priv->root);
+	backend->priv->root = g_strdup (root);
+	egg_debug ("install root now %s", backend->priv->root);
+	return TRUE;
+}
+
+/**
+ * pk_backend_get_root:
+ *
+ * Return value: root to use for installing, or %NULL
+ **/
+const gchar *
+pk_backend_get_root (PkBackend *backend)
+{
+	g_return_val_if_fail (PK_IS_BACKEND (backend), NULL);
+	return backend->priv->root;
+}
+
+/**
  * pk_backend_lock:
  *
  * Responsible for initialising the external backend object.
@@ -2446,6 +2477,7 @@ pk_backend_finalize (GObject *object)
 	pk_backend_reset (backend);
 	g_free (backend->priv->proxy_http);
 	g_free (backend->priv->proxy_ftp);
+	g_free (backend->priv->root);
 	g_free (backend->priv->name);
 	g_free (backend->priv->locale);
 	g_free (backend->priv->frontend_socket);
@@ -3093,6 +3125,7 @@ pk_backend_init (PkBackend *backend)
 	backend->priv->transaction_id = NULL;
 	backend->priv->proxy_http = NULL;
 	backend->priv->proxy_ftp = NULL;
+	backend->priv->root = NULL;
 	backend->priv->file_changed_func = NULL;
 	backend->priv->file_changed_data = NULL;
 	backend->priv->last_package = NULL;
diff --git a/src/pk-backend.h b/src/pk-backend.h
index 48d083e..7f805f3 100644
--- a/src/pk-backend.h
+++ b/src/pk-backend.h
@@ -85,6 +85,7 @@ gboolean	 pk_backend_get_progress		(PkBackend	*backend,
 guint		 pk_backend_get_runtime			(PkBackend	*backend);
 gchar		*pk_backend_get_proxy_ftp		(PkBackend	*backend);
 gchar		*pk_backend_get_proxy_http		(PkBackend	*backend);
+const gchar	*pk_backend_get_root			(PkBackend	*backend);
 gchar		*pk_backend_get_locale			(PkBackend	*backend);
 gchar		*pk_backend_get_frontend_socket		(PkBackend	*backend);
 
diff --git a/src/pk-engine.c b/src/pk-engine.c
index 912e6aa..142ed16 100644
--- a/src/pk-engine.c
+++ b/src/pk-engine.c
@@ -98,8 +98,6 @@ struct PkEnginePrivate
 #ifdef USE_SECURITY_POLKIT
 	PolkitAuthority		*authority;
 #endif
-	gchar			*proxy_http;
-	gchar			*proxy_ftp;
 	gchar			*sender;
 	gboolean		 locked;
 	PkNetworkEnum		 network_state;
@@ -168,6 +166,7 @@ pk_engine_error_get_type (void)
 			ENUM_ENTRY (PK_ENGINE_ERROR_INVALID_STATE, "InvalidState"),
 			ENUM_ENTRY (PK_ENGINE_ERROR_REFUSED_BY_POLICY, "RefusedByPolicy"),
 			ENUM_ENTRY (PK_ENGINE_ERROR_CANNOT_SET_PROXY, "CannotSetProxy"),
+			ENUM_ENTRY (PK_ENGINE_ERROR_CANNOT_SET_ROOT, "CannotSetRoot"),
 			ENUM_ENTRY (PK_ENGINE_ERROR_NOT_SUPPORTED, "NotSupported"),
 			ENUM_ENTRY (PK_ENGINE_ERROR_CANNOT_ALLOCATE_TID, "CannotAllocateTid"),
 			ENUM_ENTRY (PK_ENGINE_ERROR_CANNOT_CHECK_AUTH, "CannotCheckAuth"),
@@ -691,14 +690,14 @@ pk_engine_suggest_daemon_quit (PkEngine *engine, GError **error)
  * pk_engine_set_proxy_internal:
  **/
 static gboolean
-pk_engine_set_proxy_internal (PkEngine *engine, const gchar *sender)
+pk_engine_set_proxy_internal (PkEngine *engine, const gchar *sender, const gchar *proxy_http, const gchar *proxy_ftp)
 {
 	gboolean ret;
 	guint uid;
 	gchar *session = NULL;
 
 	/* try to set the new proxy */
-	ret = pk_backend_set_proxy (engine->priv->backend, engine->priv->proxy_http, engine->priv->proxy_ftp);
+	ret = pk_backend_set_proxy (engine->priv->backend, proxy_http, proxy_ftp);
 	if (!ret) {
 		egg_warning ("setting the proxy failed");
 		goto out;
@@ -719,8 +718,7 @@ pk_engine_set_proxy_internal (PkEngine *engine, const gchar *sender)
 	}
 
 	/* save to database */
-	ret = pk_transaction_db_set_proxy (engine->priv->transaction_db, uid, session,
-					   engine->priv->proxy_http, engine->priv->proxy_ftp);
+	ret = pk_transaction_db_set_proxy (engine->priv->transaction_db, uid, session, proxy_http, proxy_ftp);
 	if (!ret) {
 		egg_warning ("failed to save the proxy in the database");
 		goto out;
@@ -735,6 +733,8 @@ typedef struct {
 	DBusGMethodInvocation	*context;
 	PkEngine		*engine;
 	gchar			*sender;
+	gchar			*value1;
+	gchar			*value2;
 } PkEngineDbusState;
 #endif
 
@@ -743,15 +743,16 @@ typedef struct {
  * pk_engine_action_obtain_authorization:
  **/
 static void
-pk_engine_action_obtain_authorization_finished_cb (GObject *source_object, GAsyncResult *res, PkEngineDbusState *state)
+pk_engine_action_obtain_proxy_authorization_finished_cb (PolkitAuthority *authority, GAsyncResult *res, PkEngineDbusState *state)
 {
 	PolkitAuthorizationResult *result;
 	GError *error_local = NULL;
 	GError *error;
 	gboolean ret;
+	PkEnginePrivate *priv = state->engine->priv;
 
 	/* finish the call */
-	result = polkit_authority_check_authorization_finish (state->engine->priv->authority, res, &error_local);
+	result = polkit_authority_check_authorization_finish (priv->authority, res, &error_local);
 
 	/* failed */
 	if (result == NULL) {
@@ -771,7 +772,7 @@ pk_engine_action_obtain_authorization_finished_cb (GObject *source_object, GAsyn
 	}
 
 	/* try to set the new proxy and save to database */
-	ret = pk_engine_set_proxy_internal (state->engine, state->sender);
+	ret = pk_engine_set_proxy_internal (state->engine, state->sender, state->value1, state->value2);
 	if (!ret) {
 		error = g_error_new_literal (PK_ENGINE_ERROR, PK_ENGINE_ERROR_CANNOT_SET_PROXY,
 					     "setting the proxy failed");
@@ -779,6 +780,10 @@ pk_engine_action_obtain_authorization_finished_cb (GObject *source_object, GAsyn
 		goto out;
 	}
 
+	/* only set after the auth success */
+	egg_debug ("changing http proxy to %s for %s", state->value1, state->sender);
+	egg_debug ("changing ftp proxy to %s for %s", state->value2, state->sender);
+
 	/* all okay */
 	dbus_g_method_return (state->context);
 out:
@@ -788,6 +793,8 @@ out:
 	/* unref state, we're done */
 	g_object_unref (state->engine);
 	g_free (state->sender);
+	g_free (state->value1);
+	g_free (state->value2);
 	g_free (state);
 }
 #endif
@@ -886,14 +893,6 @@ pk_engine_set_proxy (PkEngine *engine, const gchar *proxy_http, const gchar *pro
 		goto out;
 	}
 
-	/* save these so we can set them after the auth success */
-	g_free (engine->priv->proxy_http);
-	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, 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 (sender);
@@ -907,6 +906,8 @@ pk_engine_set_proxy (PkEngine *engine, const gchar *proxy_http, const gchar *pro
 	state->context = context;
 	state->engine = g_object_ref (engine);
 	state->sender = g_strdup (sender);
+	state->value1 = g_strdup (proxy_http);
+	state->value2 = g_strdup (proxy_ftp);
 
 	/* do authorization async */
 	polkit_authority_check_authorization (engine->priv->authority, subject,
@@ -914,7 +915,7 @@ pk_engine_set_proxy (PkEngine *engine, const gchar *proxy_http, const gchar *pro
 					      details,
 					      POLKIT_CHECK_AUTHORIZATION_FLAGS_ALLOW_USER_INTERACTION,
 					      NULL,
-					      (GAsyncReadyCallback) pk_engine_action_obtain_authorization_finished_cb,
+					      (GAsyncReadyCallback) pk_engine_action_obtain_proxy_authorization_finished_cb,
 					      state);
 
 	/* check_authorization ref's this */
@@ -945,6 +946,248 @@ out:
 }
 
 /**
+ * pk_engine_set_root_internal:
+ **/
+static gboolean
+pk_engine_set_root_internal (PkEngine *engine, const gchar *root)
+{
+	gboolean ret;
+	guint uid;
+	gchar *session = NULL;
+
+	/* try to set the new root */
+	ret = pk_backend_set_root (engine->priv->backend, root);
+	if (!ret) {
+		egg_warning ("setting the root failed");
+		goto out;
+	}
+
+	/* get uid */
+	uid = pk_dbus_get_uid (engine->priv->dbus, engine->priv->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);
+	if (session == NULL) {
+		egg_warning ("failed to get the session");
+		goto out;
+	}
+
+	/* save to database */
+	ret = pk_transaction_db_set_root (engine->priv->transaction_db, uid, session, root);
+	if (!ret) {
+		egg_warning ("failed to save the root in the database");
+		goto out;
+	}
+out:
+	g_free (session);
+	return ret;
+}
+
+#ifdef USE_SECURITY_POLKIT
+/**
+ * pk_engine_action_obtain_authorization:
+ **/
+static void
+pk_engine_action_obtain_root_authorization_finished_cb (PolkitAuthority *authority, GAsyncResult *res, PkEngineDbusState *state)
+{
+	PolkitAuthorizationResult *result;
+	GError *error_local = NULL;
+	GError *error;
+	gboolean ret;
+	PkEnginePrivate *priv = state->engine->priv;
+
+	/* finish the call */
+	result = polkit_authority_check_authorization_finish (priv->authority, res, &error_local);
+
+	/* failed */
+	if (result == NULL) {
+		error = g_error_new (PK_ENGINE_ERROR, PK_ENGINE_ERROR_CANNOT_SET_PROXY,
+				     "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)) {
+		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 root and save to database */
+	ret = pk_engine_set_root_internal (state->engine, state->value1);
+	if (!ret) {
+		error = g_error_new_literal (PK_ENGINE_ERROR, PK_ENGINE_ERROR_CANNOT_SET_PROXY,
+					     "setting the root failed");
+		dbus_g_method_return_error (state->context, error);
+		goto out;
+	}
+
+	/* save these so we can set them after the auth success */
+	egg_debug ("changing root to %s for %s", state->value1, state->sender);
+
+	/* 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->value1);
+	g_free (state->value2);
+	g_free (state);
+}
+#endif
+
+/**
+ * pk_engine_is_root_unchanged:
+ **/
+static gboolean
+pk_engine_is_root_unchanged (PkEngine *engine, const gchar *sender, const gchar *root)
+{
+	guint uid;
+	gboolean ret = FALSE;
+	gchar *session = NULL;
+	gchar *root_tmp = NULL;
+
+	/* get uid */
+	uid = pk_dbus_get_uid (engine->priv->dbus, sender);
+	if (uid == G_MAXUINT) {
+		egg_warning ("failed to get the uid for %s", sender);
+		goto out;
+	}
+
+	/* get session */
+	session = pk_dbus_get_session (engine->priv->dbus, sender);
+	if (session == NULL) {
+		egg_warning ("failed to get the session for %s", sender);
+		goto out;
+	}
+
+	/* find out if they are the same as what we tried to set before */
+	ret = pk_transaction_db_get_root (engine->priv->transaction_db, uid, session, &root_tmp);
+	if (!ret)
+		goto out;
+
+	/* are different? */
+	if (g_strcmp0 (root_tmp, root) != 0)
+		ret = FALSE;
+out:
+	g_free (session);
+	g_free (root_tmp);
+	return ret;
+}
+
+/**
+ * pk_engine_set_root:
+ **/
+void
+pk_engine_set_root (PkEngine *engine, const gchar *root, DBusGMethodInvocation *context)
+{
+	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));
+
+	/* blank is default */
+	if (root == NULL ||
+	    root[0] == '\0')
+		root = "/";
+
+	egg_debug ("SetRoot method called: %s", root);
+
+	/* check length of root */
+	len = egg_strlen (root, 1024);
+	if (len == 1024) {
+		error = g_error_new (PK_ENGINE_ERROR, PK_ENGINE_ERROR_CANNOT_SET_ROOT, "root was too long: %s", root);
+		dbus_g_method_return_error (context, error);
+		goto out;
+	}
+
+	/* check prefix of root */
+	if (root[0] != '/') {
+		error = g_error_new (PK_ENGINE_ERROR, PK_ENGINE_ERROR_CANNOT_SET_ROOT, "root is not absolute: %s", root);
+		dbus_g_method_return_error (context, error);
+		goto out;
+	}
+
+	/* save sender */
+	sender = dbus_g_method_get_sender (context);
+
+	/* is exactly the same root? */
+	ret = pk_engine_is_root_unchanged (engine, sender, root);
+	if (ret) {
+		egg_debug ("not changing root as the same as before");
+		dbus_g_method_return (context);
+		goto out;
+	}
+
+#ifdef USE_SECURITY_POLKIT
+	/* check subject */
+	subject = polkit_system_bus_name_new (engine->priv->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);
+	state->value1 = g_strdup (root);
+
+	/* do authorization async */
+	polkit_authority_check_authorization (engine->priv->authority, subject,
+					      "org.freedesktop.packagekit.system-change-install-root",
+					      details,
+					      POLKIT_CHECK_AUTHORIZATION_FLAGS_ALLOW_USER_INTERACTION,
+					      NULL,
+					      (GAsyncReadyCallback) pk_engine_action_obtain_root_authorization_finished_cb,
+					      state);
+
+	/* check_authorization ref's this */
+	g_object_unref (details);
+#else
+	egg_warning ("*** THERE IS NO SECURITY MODEL BEING USED!!! ***");
+
+	/* try to set the new root and save to database */
+	ret = pk_engine_set_root_internal (engine, root);
+	if (!ret) {
+		error = g_error_new (PK_ENGINE_ERROR, PK_ENGINE_ERROR_CANNOT_SET_ROOT, "%s", "setting the root failed");
+		dbus_g_method_return_error (context, error);
+		goto out;
+	}
+
+	/* all okay, TODO: return only when done the polkit auth */
+	dbus_g_method_return (context);
+#endif
+
+	/* reset the timer */
+	pk_engine_reset_timer (engine);
+
+#ifdef USE_SECURITY_POLKIT
+	g_object_unref (subject);
+#endif
+out:
+	g_free (sender);
+}
+
+/**
  * pk_engine_can_authorize:
  **/
 static PkAuthorizeEnum
@@ -1309,6 +1552,9 @@ pk_engine_init (PkEngine *engine)
 	DBusGConnection *connection;
 	gboolean ret;
 	gchar *filename;
+	gchar *root;
+	gchar *proxy_http;
+	gchar *proxy_ftp;
 
 	engine->priv = PK_ENGINE_GET_PRIVATE (engine);
 	engine->priv->notify_clients_of_upgrade = FALSE;
@@ -1409,9 +1655,16 @@ pk_engine_init (PkEngine *engine)
 			  G_CALLBACK (pk_engine_binary_file_changed_cb), engine);
 
 	/* set the default proxy */
-	engine->priv->proxy_http = pk_conf_get_string (engine->priv->conf, "ProxyHTTP");
-	engine->priv->proxy_ftp = pk_conf_get_string (engine->priv->conf, "ProxyFTP");
-	pk_backend_set_proxy (engine->priv->backend, engine->priv->proxy_http, engine->priv->proxy_ftp);
+	proxy_http = pk_conf_get_string (engine->priv->conf, "ProxyHTTP");
+	proxy_ftp = pk_conf_get_string (engine->priv->conf, "ProxyFTP");
+	pk_backend_set_proxy (engine->priv->backend, proxy_http, proxy_ftp);
+	g_free (proxy_http);
+	g_free (proxy_ftp);
+
+	/* set the default root */
+	root = pk_conf_get_string (engine->priv->conf, "UseRoot");
+	pk_backend_set_root (engine->priv->backend, root);
+	g_free (root);
 
 	/* get the StateHasChanged timeouts */
 	engine->priv->timeout_priority = (guint) pk_conf_get_int (engine->priv->conf, "StateChangedTimeoutPriority");
@@ -1478,8 +1731,6 @@ pk_engine_finalize (GObject *object)
 	g_object_unref (engine->priv->conf);
 	g_object_unref (engine->priv->dbus);
 	g_free (engine->priv->mime_types);
-	g_free (engine->priv->proxy_http);
-	g_free (engine->priv->proxy_ftp);
 	g_free (engine->priv->backend_name);
 	g_free (engine->priv->backend_description);
 	g_free (engine->priv->backend_author);
diff --git a/src/pk-engine.h b/src/pk-engine.h
index 9f5fa6f..a057419 100644
--- a/src/pk-engine.h
+++ b/src/pk-engine.h
@@ -59,6 +59,7 @@ typedef enum
 	PK_ENGINE_ERROR_INVALID_STATE,
 	PK_ENGINE_ERROR_REFUSED_BY_POLICY,
 	PK_ENGINE_ERROR_CANNOT_SET_PROXY,
+	PK_ENGINE_ERROR_CANNOT_SET_ROOT,
 	PK_ENGINE_ERROR_NOT_SUPPORTED,
 	PK_ENGINE_ERROR_CANNOT_ALLOCATE_TID,
 	PK_ENGINE_ERROR_CANNOT_CHECK_AUTH,
@@ -96,6 +97,9 @@ void		 pk_engine_set_proxy			(PkEngine	*engine,
 							 const gchar	*proxy_http,
 							 const gchar	*proxy_ftp,
 							 DBusGMethodInvocation *context);
+void		 pk_engine_set_root			(PkEngine	*engine,
+							 const gchar	*root,
+							 DBusGMethodInvocation *context);
 void		 pk_engine_can_authorize		(PkEngine	*engine,
 							 const gchar	*action_id,
 							 DBusGMethodInvocation *context);
diff --git a/src/pk-transaction-db.c b/src/pk-transaction-db.c
index 4fa41e9..ede1d5c 100644
--- a/src/pk-transaction-db.c
+++ b/src/pk-transaction-db.c
@@ -880,6 +880,169 @@ pk_transaction_db_init (PkTransactionDb *tdb)
 		statement = "CREATE TABLE proxy (created TEXT, proxy_http TEXT, proxy_ftp TEXT, uid INTEGER, session TEXT);";
 		sqlite3_exec (tdb->priv->db, statement, NULL, NULL, NULL);
 	}
+
+	/* transaction root (since 0.6.4) */
+	rc = sqlite3_exec (tdb->priv->db, "SELECT * FROM root LIMIT 1", NULL, NULL, &error_msg);
+	if (rc != SQLITE_OK) {
+		egg_debug ("adding table root: %s", error_msg);
+		statement = "CREATE TABLE root (created TEXT, root TEXT, uid INTEGER, session TEXT);";
+		sqlite3_exec (tdb->priv->db, statement, NULL, NULL, NULL);
+	}
+}
+
+/**
+ * pk_transaction_sqlite_root_cb:
+ **/
+static gint
+pk_transaction_sqlite_root_cb (void *data, gint argc, gchar **argv, gchar **col_name)
+{
+	gchar **root = (gchar **) data;
+	gint i;
+
+	g_return_val_if_fail (root != NULL, 0);
+
+	for (i=0; i<argc; i++) {
+		if (g_strcmp0 (col_name[i], "root") == 0) {
+			*root = g_strdup (argv[i]);
+		} else {
+			egg_warning ("%s = %s\n", col_name[i], argv[i]);
+		}
+	}
+	return 0;
+}
+
+/**
+ * pk_transaction_db_get_root:
+ * @tdb: the #PkTransactionDb instance
+ * @uid: the user ID of the user
+ * @session: the ConsoleKit session
+ * @root: the install root
+ *
+ * Retrieves the root information from the database.
+ *
+ * Return value: %TRUE if we matched a root
+ **/
+gboolean
+pk_transaction_db_get_root (PkTransactionDb *tdb, guint uid, const gchar *session,
+			     gchar **root)
+{
+	gchar *error_msg = NULL;
+	gchar *statement;
+	gboolean ret = FALSE;
+	gint rc;
+
+	g_return_val_if_fail (PK_IS_TRANSACTION_DB (tdb), FALSE);
+	g_return_val_if_fail (uid != G_MAXUINT, FALSE);
+	g_return_val_if_fail (root != NULL, FALSE);
+
+	/* get existing data */
+	statement = g_strdup_printf ("SELECT root FROM root WHERE uid = '%i' AND session = '%s' LIMIT 1",
+				     uid, session);
+	rc = sqlite3_exec (tdb->priv->db, statement, pk_transaction_sqlite_root_cb, root, &error_msg);
+	if (rc != SQLITE_OK) {
+		egg_warning ("SQL error: %s\n", error_msg);
+		sqlite3_free (error_msg);
+		goto out;
+	}
+
+	/* nothing matched */
+	if (*root == NULL) {
+		egg_debug ("no data");
+		goto out;
+	}
+
+	/* success, even if we got no data */
+	ret = TRUE;
+out:
+	g_free (statement);
+	return ret;
+}
+
+/**
+ * pk_transaction_db_set_root:
+ * @tdb: the #PkTransactionDb instance
+ * @uid: the user ID of the user
+ * @session: the ConsoleKit session
+ * @root: the HTTP root
+ *
+ * Saves the root install prefix to the database.
+ *
+ * Return value: %TRUE for success
+ **/
+gboolean
+pk_transaction_db_set_root (PkTransactionDb *tdb, guint uid, const gchar *session,
+			    const gchar *root)
+{
+	gchar *timespec = NULL;
+	gchar *root_tmp = NULL;
+	gboolean ret = FALSE;
+	gint rc;
+	sqlite3_stmt *statement = NULL;
+
+	g_return_val_if_fail (PK_IS_TRANSACTION_DB (tdb), FALSE);
+	g_return_val_if_fail (uid != G_MAXUINT, FALSE);
+
+	/* check for previous entries */
+	ret = pk_transaction_db_get_root (tdb, uid, session, &root_tmp);
+	if (ret) {
+		egg_debug ("updated root %s for uid:%i and session:%s", root, uid, session);
+
+		/* prepare statement */
+		rc = sqlite3_prepare_v2 (tdb->priv->db,
+					 "UPDATE root SET root = ? WHERE uid = ? AND session = ?",
+					 -1, &statement, NULL);
+		if (rc != SQLITE_OK) {
+			egg_warning ("failed to prepare statement: %s", sqlite3_errmsg (tdb->priv->db));
+			goto out;
+		}
+
+		/* bind data, so that the freeform root text cannot be used to inject SQL */
+		sqlite3_bind_text (statement, 1, root, -1, SQLITE_STATIC);
+		sqlite3_bind_int (statement, 2, uid);
+		sqlite3_bind_text (statement, 3, session, -1, SQLITE_STATIC);
+
+		/* execute statement */
+		rc = sqlite3_step (statement);
+		if (rc != SQLITE_DONE) {
+			egg_warning ("failed to execute statement: %s", sqlite3_errmsg (tdb->priv->db));
+			goto out;
+		}
+		goto out;
+	}
+
+	/* insert new entry */
+	timespec = pk_iso8601_present ();
+	egg_debug ("set root %s for uid:%i and session:%s", root, uid, session);
+
+	/* prepare statement */
+	rc = sqlite3_prepare_v2 (tdb->priv->db,
+				 "INSERT INTO root (created, uid, session, root) VALUES (?, ?, ?, ?)",
+				 -1, &statement, NULL);
+	if (rc != SQLITE_OK) {
+		egg_warning ("failed to prepare statement: %s", sqlite3_errmsg (tdb->priv->db));
+		goto out;
+	}
+
+	/* bind data, so that the freeform root text cannot be used to inject SQL */
+	sqlite3_bind_text (statement, 1, timespec, -1, SQLITE_STATIC);
+	sqlite3_bind_int (statement, 2, uid);
+	sqlite3_bind_text (statement, 3, session, -1, SQLITE_STATIC);
+	sqlite3_bind_text (statement, 4, root, -1, SQLITE_STATIC);
+
+	/* execute statement */
+	rc = sqlite3_step (statement);
+	if (rc != SQLITE_DONE) {
+		egg_warning ("failed to execute statement: %s", sqlite3_errmsg (tdb->priv->db));
+		goto out;
+	}
+
+	ret = TRUE;
+out:
+	if (statement != NULL)
+		sqlite3_finalize (statement);
+	g_free (timespec);
+	g_free (root_tmp);
+	return ret;
 }
 
 /**
@@ -936,6 +1099,7 @@ pk_transaction_db_test (EggTest *test)
 	guint ms;
 	gchar *proxy_http = NULL;
 	gchar *proxy_ftp = NULL;
+	gchar *root = NULL;
 	guint seconds;
 
 	if (!egg_test_start (test, "PkTransactionDb"))
@@ -1066,6 +1230,35 @@ pk_transaction_db_test (EggTest *test)
 	else
 		egg_test_failed (test, "failed to get correct proxies, %s and %s", proxy_http, proxy_ftp);
 
+	/************************************************************
+	 ****************            ROOT          ******************
+	 ************************************************************/
+	egg_test_title (test, "can we set the root");
+	ret = pk_transaction_db_set_root (db, 500, "session1", "/mnt/chroot");
+	egg_test_assert (test, ret);
+
+	/************************************************************/
+	egg_test_title (test, "can we set the root (overwrite)");
+	ret = pk_transaction_db_set_root (db, 500, "session1", "/mnt/chroot2");
+	egg_test_assert (test, ret);
+
+	/************************************************************/
+	egg_test_title (test, "can we get the root (non-existant user)");
+	ret = pk_transaction_db_get_root (db, 501, "session1", &root);
+	if (root == NULL)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to get correct root: %s", root);
+
+	/************************************************************/
+	egg_test_title (test, "can we get the root (match)");
+	ret = pk_transaction_db_get_root (db, 500, "session1", &root);
+	if (g_strcmp0 (root, "/mnt/chroot2") == 0)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to get correct root: %s", root);
+
+	g_free (root);
 	g_free (proxy_http);
 	g_free (proxy_ftp);
 	g_object_unref (db);
diff --git a/src/pk-transaction-db.h b/src/pk-transaction-db.h
index 78d2998..05eef5a 100644
--- a/src/pk-transaction-db.h
+++ b/src/pk-transaction-db.h
@@ -87,6 +87,14 @@ gboolean	 pk_transaction_db_set_proxy		(PkTransactionDb	*tdb,
 							 const gchar		*session,
 							 const gchar		*proxy_http,
 							 const gchar		*proxy_ftp);
+gboolean	 pk_transaction_db_get_root		(PkTransactionDb	*tdb,
+							 guint			 uid,
+							 const gchar		*session,
+							 gchar			**root);
+gboolean	 pk_transaction_db_set_root		(PkTransactionDb	*tdb,
+							 guint			 uid,
+							 const gchar		*session,
+							 const gchar		*root);
 
 G_END_DECLS
 
diff --git a/src/pk-transaction.c b/src/pk-transaction.c
index a0e9d33..d4da443 100644
--- a/src/pk-transaction.c
+++ b/src/pk-transaction.c
@@ -1544,15 +1544,16 @@ out:
 }
 
 /**
- * pk_transaction_set_proxy:
+ * pk_transaction_set_session_state:
  */
 static gboolean
-pk_transaction_set_proxy (PkTransaction *transaction, GError **error)
+pk_transaction_set_session_state (PkTransaction *transaction, GError **error)
 {
 	gboolean ret = FALSE;
 	gchar *session = NULL;
 	gchar *proxy_http = NULL;
 	gchar *proxy_ftp = NULL;
+	gchar *root = NULL;
 
 	/* get session */
 	session = pk_dbus_get_session (transaction->priv->dbus, transaction->priv->sender);
@@ -1574,7 +1575,22 @@ pk_transaction_set_proxy (PkTransaction *transaction, GError **error)
 		g_set_error_literal (error, 1, 0, "failed to set the proxy");
 		goto out;
 	}
-	egg_debug ("using http_proxy=%s, ftp_proxy=%s for %i:%s", proxy_http, proxy_ftp, transaction->priv->uid, session);
+
+	/* get from database */
+	ret = pk_transaction_db_get_root (transaction->priv->transaction_db, transaction->priv->uid, session, &root);
+	if (!ret) {
+		g_set_error_literal (error, 1, 0, "failed to get the root from the database");
+		goto out;
+	}
+
+	/* try to set the new proxy */
+	ret = pk_backend_set_root (transaction->priv->backend, root);
+	if (!ret) {
+		g_set_error_literal (error, 1, 0, "failed to set the root");
+		goto out;
+	}
+	egg_debug ("using http_proxy=%s, ftp_proxy=%s, root=%s for %i:%s",
+		   proxy_http, proxy_ftp, root, transaction->priv->uid, session);
 out:
 	g_free (proxy_http);
 	g_free (proxy_ftp);
@@ -1637,9 +1653,9 @@ pk_transaction_set_running (PkTransaction *transaction)
 	egg_debug ("setting role for %s to %s", priv->tid, pk_role_enum_to_string (priv->role));
 
 	/* set proxy */
-	ret = pk_transaction_set_proxy (transaction, &error);
+	ret = pk_transaction_set_session_state (transaction, &error);
 	if (!ret) {
-		egg_warning ("failed to set the proxy: %s", error->message);
+		egg_warning ("failed to set the session state: %s", error->message);
 		g_error_free (error);
 	}
 
commit 59d5111dd620a3978cd02946a94ecc7d9bc6e3cf
Author: Michael Andres <ma at suse.de>
Date:   Wed Apr 28 15:05:37 2010 +0200

    zypp: let libzypp determine whether a patch is needed.
    
    - with libzypp-6(>= 6.32) or libzypp-7(>=7.3) locked patches are no longer
      classified as being needed. Thus locking unwanted patches should prevent
      them from being shown.

diff --git a/backends/zypp/zypp-utils.cpp b/backends/zypp/zypp-utils.cpp
index 4fbfee4..ee478d5 100644
--- a/backends/zypp/zypp-utils.cpp
+++ b/backends/zypp/zypp-utils.cpp
@@ -655,7 +655,7 @@ zypp_get_patches ()
         for (zypp::ResPoolProxy::const_iterator it = zypp->poolProxy ().byKindBegin<zypp::Patch>();
                         it != zypp->poolProxy ().byKindEnd<zypp::Patch>(); it ++) {
                 // check if patch is needed
-                if((*it)->candidateObj ().isRelevant() && !((*it)->candidateObj ().isSatisfied())) {
+                if((*it)->isNeeded()) {
 			zypp::Patch::constPtr patch = zypp::asKind<zypp::Patch>((*it)->candidateObj ().resolvable ());
 			if (_updating_self) {
 				if (patch->restartSuggested ())
commit 3a26c7c8515df9dac1c60052213d721cd2fecf83
Author: Michael Andres <ma at suse.de>
Date:   Wed Apr 21 18:19:29 2010 +0200

    zypp: attempt to improve backend_find_packages

diff --git a/backends/zypp/pk-backend-zypp.cpp b/backends/zypp/pk-backend-zypp.cpp
index 4486f25..8b54132 100644
--- a/backends/zypp/pk-backend-zypp.cpp
+++ b/backends/zypp/pk-backend-zypp.cpp
@@ -1293,26 +1293,49 @@ backend_find_packages_thread (PkBackend *backend)
 	pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
 	pk_backend_set_percentage (backend, PK_BACKEND_PERCENTAGE_INVALID);
 
-	std::vector<zypp::sat::Solvable> *v = 0;
-	std::vector<zypp::sat::Solvable> *v2 = 0;
+	std::vector<zypp::sat::Solvable> v;
+
+	zypp::PoolQuery q;
+	q.addString( search ); // may be called multiple times (OR'ed)
+	q.setCaseSensitive( true );
+	q.setMatchSubstring();
 
 	switch (mode) {
 		case SEARCH_TYPE_NAME:
-			v = zypp_get_packages_by_name (search, zypp::ResKind::package, TRUE);
-			v2 = zypp_get_packages_by_name (search, zypp::ResKind::srcpackage, TRUE);
-			v->insert (v->end (), v2->begin (), v2->end ());
+			zypp_build_pool (TRUE); // seems to be necessary?
+			q.addKind( zypp::ResKind::package );
+			q.addKind( zypp::ResKind::srcpackage );
+			q.addAttribute( zypp::sat::SolvAttr::name );
+			// Note: The query result is NOT sorted packages first, then srcpackage.
+			// If that's necessary you need to sort the vector accordongly or use
+			// two separate queries.
 			break;
 		case SEARCH_TYPE_DETAILS:
-			v = zypp_get_packages_by_details (search, TRUE);
+			zypp_build_pool (TRUE); // seems to be necessary?
+			q.addKind( zypp::ResKind::package );
+			//q.addKind( zypp::ResKind::srcpackage );
+			q.addAttribute( zypp::sat::SolvAttr::name );
+			q.addAttribute( zypp::sat::SolvAttr::description );
+			// Note: Don't know if zypp_get_packages_by_details intentionally
+			// did not search in srcpackages.
 			break;
 		case SEARCH_TYPE_FILE:
-			v = zypp_get_packages_by_file (search);
+			{
+			  // zypp_build_pool (TRUE); called by zypp_get_packages_by_file
+			  std::vector<zypp::sat::Solvable> * r = zypp_get_packages_by_file (search);
+			  v.swap( *r );
+			  delete r;
+			  // zypp_get_packages_by_file does strange things :)
+			  // Maybe it would be sufficient to simply query
+			  // zypp::sat::SolvAttr::filelist instead?
+			}
 			break;
 	};
 
-	zypp_emit_packages_in_list (backend, v, filters);
-	delete (v);
-	delete (v2);
+	if ( ! q.empty() ) {
+		std::copy( q.begin(), q.end(), std::back_inserter( v ) );
+	}
+	zypp_emit_packages_in_list (backend, &v, filters);
 
 	pk_backend_finished (backend);
 	return TRUE;
diff --git a/backends/zypp/zypp-utils.cpp b/backends/zypp/zypp-utils.cpp
index d17a5af..4fbfee4 100644
--- a/backends/zypp/zypp-utils.cpp
+++ b/backends/zypp/zypp-utils.cpp
@@ -90,7 +90,7 @@ get_zypp ()
 
         try {
 	        zypp = zypp::ZYppFactory::instance ().getZYpp ();
-	
+
 	        // TODO: Make this threadsafe
 	        if (initialized == FALSE) {
 		        zypp::filesystem::Pathname pathname("/");
@@ -195,25 +195,25 @@ zypp_build_pool (gboolean include_local)
 	return zypp->pool ();
 }
 
-void  
-warn_outdated_repos(PkBackend *backend, const zypp::ResPool & pool)  
-{  
-	zypp::Repository repoobj;  
-	zypp::ResPool::repository_iterator it;  
-	for ( it = pool.knownRepositoriesBegin();  
-		it != pool.knownRepositoriesEnd();  
-		++it )  
-	{  
-		zypp::Repository repo(*it);  
-		if ( repo.maybeOutdated() )  
-		{  
-			// warn the user  
+void
+warn_outdated_repos(PkBackend *backend, const zypp::ResPool & pool)
+{
+	zypp::Repository repoobj;
+	zypp::ResPool::repository_iterator it;
+	for ( it = pool.knownRepositoriesBegin();
+		it != pool.knownRepositoriesEnd();
+		++it )
+	{
+		zypp::Repository repo(*it);
+		if ( repo.maybeOutdated() )
+		{
+			// warn the user
 			pk_backend_message (backend,
 					PK_MESSAGE_ENUM_BROKEN_MIRROR,
 					zypp::str::form("The repository %s seems to be outdated. You may want to try another mirror.",
 					repo.alias().c_str()).c_str() );
-		}  
-	}  
+		}
+	}
 }
 
 zypp::ResPool
@@ -227,7 +227,7 @@ zypp_build_local_pool ()
 			if (! it->isSystemRepo ())
 				pool.reposErase(it->alias ());
 		}
-		
+
 		if (zypp::sat::Pool::instance().reposFind( zypp::sat::Pool::systemRepoAlias() ).solvablesEmpty ())
                 {
 		        // Add local resolvables
@@ -255,7 +255,7 @@ zypp_get_rpmHeader (std::string name, zypp::Edition edition)
 
 	return result;
 }
-		
+
 
 std::string
 zypp_get_group (zypp::sat::Solvable item)
@@ -277,7 +277,7 @@ zypp_get_group (zypp::sat::Solvable item)
 PkGroupEnum
 get_enum_group (std::string group)
 {
-        
+
         // TODO Look for a faster and nice way to do this conversion
         std::transform(group.begin(), group.end(), group.begin(), tolower);
 
@@ -287,7 +287,7 @@ get_enum_group (std::string group)
                 return PK_GROUP_ENUM_PROGRAMMING;
         } else if (group.find ("hardware") != std::string::npos) {
                 return PK_GROUP_ENUM_SYSTEM;
-        } else if (group.find ("archiving") != std::string::npos 
+        } else if (group.find ("archiving") != std::string::npos
                   || group.find("clustering") != std::string::npos
                   || group.find("system/monitoring") != std::string::npos
                   || group.find("databases") != std::string::npos
@@ -299,7 +299,7 @@ get_enum_group (std::string group)
                 return PK_GROUP_ENUM_MULTIMEDIA;
         } else if (group.find ("network") != std::string::npos) {
                 return PK_GROUP_ENUM_NETWORK;
-        } else if (group.find ("office") != std::string::npos 
+        } else if (group.find ("office") != std::string::npos
                   || group.find("text") != std::string::npos
                   || group.find("editors") != std::string::npos) {
                 return PK_GROUP_ENUM_OFFICE;
@@ -344,23 +344,6 @@ zypp_get_packages_by_name (const gchar *package_name, const zypp::ResKind kind,
 }
 
 std::vector<zypp::sat::Solvable> *
-zypp_get_packages_by_details (const gchar *search_term, gboolean include_local)
-{
-        std::vector<zypp::sat::Solvable> *v = new std::vector<zypp::sat::Solvable> ();
-
-        zypp::ResPool pool = zypp_build_pool (include_local);
-
-        std::string term (search_term);
-        for (zypp::ResPool::byKind_iterator it = pool.byKindBegin (zypp::ResKind::package);
-                        it != pool.byKindEnd (zypp::ResKind::package); it++) {
-                if ((*it)->name ().find (term) != std::string::npos || (*it)->description ().find (term) != std::string::npos )
-                    v->push_back ((*it)->satSolvable ());
-        }
-
-        return v;
-}
-
-std::vector<zypp::sat::Solvable> * 
 zypp_get_packages_by_file (const gchar *search_file)
 {
         std::vector<zypp::sat::Solvable> *v = new std::vector<zypp::sat::Solvable> ();
@@ -404,7 +387,7 @@ zypp_get_package_by_id (const gchar *package_id)
 	std::vector<zypp::sat::Solvable> *v2 = zypp_get_packages_by_name (id_parts[PK_PACKAGE_ID_NAME], zypp::ResKind::patch, TRUE);
 
 	v->insert (v->end (), v2->begin (), v2->end ());
-	
+
 	if (v == NULL)
 		return zypp::sat::Solvable::noSolvable;
 
@@ -432,7 +415,7 @@ gchar *
 zypp_build_package_id_from_resolvable (zypp::sat::Solvable resolvable)
 {
 	gchar *package_id;
-	
+
 	package_id = pk_package_id_build (resolvable.name ().c_str (),
 					  resolvable.edition ().asString ().c_str (),
 					  resolvable.arch ().asString ().c_str (),
@@ -490,14 +473,14 @@ gboolean
 zypp_signature_required (PkBackend *backend, const std::string &file, const std::string &id)
 {
         gboolean ok = FALSE;
-	
+
 	if (std::find (_signatures[backend]->begin (), _signatures[backend]->end (), id) == _signatures[backend]->end ()) {
 		zypp::RepoInfo info = zypp_get_Repository (backend, _repoName);
 		if (info.type () == zypp::repo::RepoType::NONE) {
 			pk_backend_error_code (backend, PK_ERROR_ENUM_INTERNAL_ERROR, "Repository unknown");
 			return FALSE;
 		}
-		
+
 		pk_backend_repo_signature_required (backend,
 				"dummy;0.0.1;i386;data",
 	                        _repoName,
@@ -526,7 +509,7 @@ zypp_signature_required (PkBackend *backend, const std::string &file)
 			pk_backend_error_code (backend, PK_ERROR_ENUM_INTERNAL_ERROR, "Repository unknown");
 			return FALSE;
 		}
-		
+
 		pk_backend_repo_signature_required (backend,
 				"dummy;0.0.1;i386;data",
 	                        _repoName,
@@ -590,7 +573,7 @@ zypp_emit_packages_in_list (PkBackend *backend, std::vector<zypp::sat::Solvable>
 				//egg_debug ("my default arch is %s", myarch);
 			}
 			if (!print)
-				continue;		
+				continue;
 		}
 
 		pk_backend_package (backend,
@@ -636,7 +619,7 @@ zypp_get_updates (std::string repo)
 {
         std::set<zypp::PoolItem> *pks = new std::set<zypp::PoolItem> ();
         zypp::ResPool pool = zypp::ResPool::instance ();
-        
+
         zypp::ResObject::Kind kind = zypp::ResTraits<zypp::Package>::kind;
         zypp::ResPool::byKind_iterator it = pool.byKindBegin (kind);
         zypp::ResPool::byKind_iterator e = pool.byKindEnd (kind);
@@ -671,7 +654,7 @@ zypp_get_patches ()
 
         for (zypp::ResPoolProxy::const_iterator it = zypp->poolProxy ().byKindBegin<zypp::Patch>();
                         it != zypp->poolProxy ().byKindEnd<zypp::Patch>(); it ++) {
-                // check if patch is needed 
+                // check if patch is needed
                 if((*it)->candidateObj ().isRelevant() && !((*it)->candidateObj ().isSatisfied())) {
 			zypp::Patch::constPtr patch = zypp::asKind<zypp::Patch>((*it)->candidateObj ().resolvable ());
 			if (_updating_self) {
@@ -719,8 +702,8 @@ zypp_perform_execution (PkBackend *backend, PerformType type, gboolean force)
                 if (force)
                         zypp->resolver ()->setForceResolve (force);
 		if (type == UPDATE) {
-			//zypp->resolver ()->setOnlyRequires (TRUE);		
-			zypp->resolver ()->setIgnoreAlreadyRecommended (TRUE);		
+			//zypp->resolver ()->setOnlyRequires (TRUE);
+			zypp->resolver ()->setIgnoreAlreadyRecommended (TRUE);
 		}
 
                 // Gather up any dependencies
@@ -756,7 +739,7 @@ zypp_perform_execution (PkBackend *backend, PerformType type, gboolean force)
 			zypp->resolver ()->setForceResolve (FALSE);
 			return FALSE;
 		}
-        
+
                 switch (type) {
                         case INSTALL:
                                 pk_backend_set_status (backend, PK_STATUS_ENUM_INSTALL);
@@ -782,7 +765,7 @@ zypp_perform_execution (PkBackend *backend, PerformType type, gboolean force)
 							eula_id,
 							package_id,
 							(*it)->vendor ().c_str (),
-							it->satSolvable ().lookupStrAttribute (zypp::sat::SolvAttr::eula).c_str ()); 
+							it->satSolvable ().lookupStrAttribute (zypp::sat::SolvAttr::eula).c_str ());
 					pk_backend_error_code (backend, PK_ERROR_ENUM_NO_LICENSE_AGREEMENT, "You've to agree/decline a license");
 					g_free (package_id);
 					g_free (eula_id);
@@ -800,7 +783,7 @@ zypp_perform_execution (PkBackend *backend, PerformType type, gboolean force)
                 zypp::ZYppCommitResult result = zypp->commit (policy);
 
                 if(!result._errors.empty () || !result._remaining.empty () || !result._srcremaining.empty ()){
-			
+
 			zypp::ZYppCommitResult::PoolItemList errors = result._errors;
 			gchar *emsg = NULL, *tmpmsg = NULL;
 
@@ -813,7 +796,7 @@ zypp_perform_execution (PkBackend *backend, PerformType type, gboolean force)
 					g_free (tmpmsg);
 				}
 			}
-			
+
 			zypp::ZYppCommitResult::PoolItemList remaining = result._remaining;
 			for (zypp::ZYppCommitResult::PoolItemList::iterator it = remaining.begin (); it != remaining.end (); it++){
 				if (emsg == NULL) {
@@ -824,7 +807,7 @@ zypp_perform_execution (PkBackend *backend, PerformType type, gboolean force)
 					g_free (tmpmsg);
 				}
 			}
-			
+
 			zypp::ZYppCommitResult::PoolItemList srcremaining = result._srcremaining;
 			for (zypp::ZYppCommitResult::PoolItemList::iterator it = srcremaining.begin (); it != srcremaining.end (); it++){
 				if (emsg == NULL) {
@@ -847,7 +830,7 @@ zypp_perform_execution (PkBackend *backend, PerformType type, gboolean force)
 
 		zypp->resolver ()->setForceResolve (FALSE);
 		if (type == UPDATE) {
-			zypp->resolver ()->setIgnoreAlreadyRecommended (FALSE);		
+			zypp->resolver ()->setIgnoreAlreadyRecommended (FALSE);
 		}
 
         } catch (const zypp::repo::RepoNotFoundException &ex) {
@@ -859,8 +842,8 @@ zypp_perform_execution (PkBackend *backend, PerformType type, gboolean force)
 	} catch (const zypp::Exception &ex) {
 		pk_backend_error_code (backend, PK_ERROR_ENUM_INTERNAL_ERROR, ex.asUserString().c_str() );
 		return FALSE;
-	}       
-        
+	}
+
         return TRUE;
 }
 
@@ -890,7 +873,7 @@ zypp_build_package_id_capabilities (zypp::Capabilities caps)
 	for (zypp::sat::WhatProvides::const_iterator it = provs.begin (); it != provs.end (); it++) {
 		gchar *package_id = zypp_build_package_id_from_resolvable (*it);
 		//package_ids = g_strconcat (package_ids, package_id, PK_PACKAGE_IDS_DELIM, (gchar *)NULL);
-		if (strlen (package_ids) == 0) {			
+		if (strlen (package_ids) == 0) {
 			package_ids = g_strdup (package_id);
 		} else {
 			package_ids = g_strconcat (package_ids, PK_PACKAGE_IDS_DELIM, package_id, (gchar *)NULL);
@@ -955,9 +938,9 @@ zypp_refresh_cache (PkBackend *backend, gboolean force)
 				zypp::RepoManager::BuildIfNeeded);
 		} catch (const zypp::Exception &ex) {
 			if (repo_messages == NULL) {
-				repo_messages = g_strdup_printf ("%s: %s%s", repo.alias ().c_str (), ex.asUserString ().c_str (), "\n");	
+				repo_messages = g_strdup_printf ("%s: %s%s", repo.alias ().c_str (), ex.asUserString ().c_str (), "\n");
 			}else{
-				repo_messages = g_strdup_printf ("%s%s: %s%s", repo_messages, repo.alias ().c_str (), ex.asUserString ().c_str (), "\n");	
+				repo_messages = g_strdup_printf ("%s%s: %s%s", repo_messages, repo.alias ().c_str (), ex.asUserString ().c_str (), "\n");
 			}
 			if (repo_messages == NULL || !g_utf8_validate (repo_messages, -1, NULL))
 				repo_messages = g_strdup ("A repository could not be refreshed");
diff --git a/backends/zypp/zypp-utils.h b/backends/zypp/zypp-utils.h
index 450be80..ea75c57 100644
--- a/backends/zypp/zypp-utils.h
+++ b/backends/zypp/zypp-utils.h
@@ -34,8 +34,10 @@
 #include <zypp/media/MediaManager.h>
 #include <zypp/Resolvable.h>
 #include <zypp/ResPool.h>
+#include <zypp/PoolQuery.h>
 #include <zypp/ResFilters.h>
 
+#include <iterator>
 #include <list>
 #include <set>
 
@@ -119,11 +121,6 @@ PkGroupEnum get_enum_group (std::string group);
 std::vector<zypp::sat::Solvable> * zypp_get_packages_by_name (const gchar *package_name, const zypp::ResKind kind, gboolean include_local);
 
 /**
- * Returns a list of packages that match the specified term in its name or description.
- */
-std::vector<zypp::sat::Solvable> * zypp_get_packages_by_details (const gchar *search_term, gboolean include_local);
-
-/**
  * Returns a list of packages that owns the specified file.
  */
 std::vector<zypp::sat::Solvable> * zypp_get_packages_by_file (const gchar *search_file);
commit 7f48336a852e584c43a1c34154ceb15b995f7e3d
Author: Michael Andres <ma at suse.de>
Date:   Wed Apr 21 17:35:57 2010 +0200

    zypp: fix memeory leaks

diff --git a/backends/zypp/pk-backend-zypp.cpp b/backends/zypp/pk-backend-zypp.cpp
index a6b00b3..4486f25 100644
--- a/backends/zypp/pk-backend-zypp.cpp
+++ b/backends/zypp/pk-backend-zypp.cpp
@@ -796,7 +796,7 @@ backend_install_files_thread (PkBackend *backend)
 		zypp::target::rpm::RpmHeader::constPtr rpmHeader = zypp::target::rpm::RpmHeader::readPackage (rpmPath, zypp::target::rpm::RpmHeader::NOSIGNATURE);
 
 		// look for the packages and set them to toBeInstalled
-		std::vector<zypp::sat::Solvable> *solvables = new std::vector<zypp::sat::Solvable>;
+		std::vector<zypp::sat::Solvable> *solvables = 0;
 		solvables = zypp_get_packages_by_name (rpmHeader->tag_name ().c_str (), zypp::ResKind::package, FALSE);
 		zypp::PoolItem *item = NULL;
 		gboolean found = FALSE;
@@ -1033,7 +1033,7 @@ backend_install_packages_thread (PkBackend *backend)
 		for (guint i = 0; i < g_strv_length (package_ids); i++) {
 
 			gchar **id_parts = pk_package_id_split (package_ids[i]);
-			
+
 			// Iterate over the selectables and mark the one with the right name
 			zypp::ui::Selectable::Ptr selectable;
 			for (zypp::ResPoolProxy::const_iterator it = zypp->poolProxy().byKindBegin <zypp::Package>();
@@ -1293,13 +1293,14 @@ backend_find_packages_thread (PkBackend *backend)
 	pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
 	pk_backend_set_percentage (backend, PK_BACKEND_PERCENTAGE_INVALID);
 
-	std::vector<zypp::sat::Solvable> *v = new std::vector<zypp::sat::Solvable>;
-	std::vector<zypp::sat::Solvable> *v2 = new std::vector<zypp::sat::Solvable>;
+	std::vector<zypp::sat::Solvable> *v = 0;
+	std::vector<zypp::sat::Solvable> *v2 = 0;
 
 	switch (mode) {
 		case SEARCH_TYPE_NAME:
 			v = zypp_get_packages_by_name (search, zypp::ResKind::package, TRUE);
 			v2 = zypp_get_packages_by_name (search, zypp::ResKind::srcpackage, TRUE);
+			v->insert (v->end (), v2->begin (), v2->end ());
 			break;
 		case SEARCH_TYPE_DETAILS:
 			v = zypp_get_packages_by_details (search, TRUE);
@@ -1309,8 +1310,6 @@ backend_find_packages_thread (PkBackend *backend)
 			break;
 	};
 
-	v->insert (v->end (), v2->begin (), v2->end ());
-
 	zypp_emit_packages_in_list (backend, v, filters);
 	delete (v);
 	delete (v2);
@@ -1591,7 +1590,7 @@ backend_update_packages_thread (PkBackend *backend)
 	package_ids = pk_backend_get_strv (backend, "package_ids");
 	PkRestartEnum restart = PK_RESTART_ENUM_NONE;
 
-	zypp_get_patches (); // make sure _updating_self is set
+	delete zypp_get_patches (); // make sure _updating_self is set
 
 	if (_updating_self) {
 		egg_debug ("updating self and setting restart");
commit 90c0aee993691e698d414cbf450284dd8f8db0ab
Author: Richard Hughes <richard at hughsie.com>
Date:   Sun Apr 25 22:03:58 2010 +0100

    yum: Ensure the lock failure message is proper unicode. Fixes rh#585620

diff --git a/backends/yum/yumBackend.py b/backends/yum/yumBackend.py
index 67111a2..3891589 100755
--- a/backends/yum/yumBackend.py
+++ b/backends/yum/yumBackend.py
@@ -343,7 +343,7 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
                 # give up, and print process information
                 if retries > 100:
                     msg = "The other process has the command line '%s' (PID %i)" % (cmdline, e.pid)
-                    self.error(ERROR_CANNOT_GET_LOCK, "Yum is locked by another application. %s" % msg)
+                    self.error(ERROR_CANNOT_GET_LOCK, "Yum is locked by another application. %s" % _to_unicode(msg))
 
     def unLock(self):
         ''' Unlock Yum'''
commit 8e884eca6153a6be2a1099d65a239b9dc79c4420
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Apr 20 18:53:10 2010 +0100

    yum: fix up two runtime critical warnings when using the zif accellerator

diff --git a/backends/yum/libzif/zif-md-filelists-xml.c b/backends/yum/libzif/zif-md-filelists-xml.c
index 1eec0c9..00269ad 100644
--- a/backends/yum/libzif/zif-md-filelists-xml.c
+++ b/backends/yum/libzif/zif-md-filelists-xml.c
@@ -434,12 +434,20 @@ zif_md_filelists_xml_search_file (ZifMd *md, gchar **search,
 		zif_completion_done (completion);
 	}
 
+	/* create results array */
+	array = g_ptr_array_new_with_free_func (g_free);
+
+	/* no entries, so shortcut */
+	if (md_filelists->priv->array->len == 0) {
+		zif_completion_done (completion);
+		goto out;
+	}
+
 	/* setup steps */
 	completion_local = zif_completion_get_child (completion);
 	zif_completion_set_number_steps (completion_local, md_filelists->priv->array->len);
 
 	/* search array */
-	array = g_ptr_array_new_with_free_func (g_free);
 	packages = md_filelists->priv->array;
 	for (i=0; i<packages->len; i++) {
 		package = g_ptr_array_index (packages, i);
diff --git a/backends/yum/libzif/zif-md-primary-sql.c b/backends/yum/libzif/zif-md-primary-sql.c
index 7b8cb9b..3a32786 100644
--- a/backends/yum/libzif/zif-md-primary-sql.c
+++ b/backends/yum/libzif/zif-md-primary-sql.c
@@ -177,7 +177,7 @@ zif_md_primary_sql_search (ZifMdPrimarySql *md, const gchar *statement,
 	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);
+			     "SQL error, failed to execute '%s': %s\n", statement, error_msg);
 		sqlite3_free (error_msg);
 		g_ptr_array_unref (data->packages);
 		goto out;
@@ -229,7 +229,9 @@ zif_md_primary_sql_get_statement_for_pred (const gchar *pred, gchar **search)
 			g_string_append (statement, " OR ");
 		g_free (temp);
 	}
-	if (i % max_items != max_items - 1) {
+
+	/* remove trailing OR entry */
+	if (g_str_has_suffix (statement->str, " OR ")) {
 		g_string_set_size (statement, statement->len - 4);
 		g_string_append (statement, ";\n");
 	}
commit 491af515effdd4683222fd8d0c17ea4abe149126
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Apr 20 13:21:25 2010 +0100

    yum: Fix a crash when there are no updates and the user is using zif

diff --git a/backends/yum/pk-backend-yum.c b/backends/yum/pk-backend-yum.c
index 24c35a1..b6862f0 100644
--- a/backends/yum/pk-backend-yum.c
+++ b/backends/yum/pk-backend-yum.c
@@ -1529,7 +1529,8 @@ backend_get_updates_thread (PkBackend *backend)
 
 	/* setup steps on updatinfo completion */
 	completion_local = zif_completion_get_child (priv->completion);
-	zif_completion_set_number_steps (completion_local, array->len);
+	if (array->len > 0)
+		zif_completion_set_number_steps (completion_local, array->len);
 
 	/* get update info */
 	for (i=0; i<array->len; i++) {
commit c61e9664ed7d33084b7d00b9c664c521004d74dc
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Apr 20 11:35:22 2010 +0100

    yum: Ship a standalone version of licenses.txt for future code

diff --git a/backends/yum/Makefile.am b/backends/yum/Makefile.am
index 95293d7..a0af1a4 100644
--- a/backends/yum/Makefile.am
+++ b/backends/yum/Makefile.am
@@ -1,6 +1,7 @@
 helperdir = $(datadir)/PackageKit/helpers/yum
 dist_helper_DATA = 			\
 	yum-comps-groups.conf		\
+	licenses.txt			\
 	yumBackend.py			\
 	yumComps.py			\
 	yumMediaManager.py		\
diff --git a/backends/yum/licenses.txt b/backends/yum/licenses.txt
new file mode 100644
index 0000000..6a6232c
--- /dev/null
+++ b/backends/yum/licenses.txt
@@ -0,0 +1,187 @@
+AAL
+Adobe
+ADSL
+AFL
+AGPLv1
+AMDPLPA
+AML
+AMPAS BSD
+APSL 2.0
+ARL
+Arphic
+Artistic 2.0
+Artistic clarified
+ASL 1.0
+ASL 1.1
+ASL 2.0
+Baekmuk
+BitTorrent
+Boost
+BSD
+BSD Protection
+BSD with advertising
+CATOSL
+CC0
+CC-BY
+CC-BY-SA
+CDDL
+CDL
+CeCILL
+CeCILL-B
+CeCILL-C
+CNRI
+Condor
+Copyright only
+CPAL
+CPL
+Crystal Stacker
+DOC
+DSL
+dvipdfm
+ECL 1.0
+ECL 2.0
+eCos
+EFL 2.0
+Entessa
+EPL
+ERPL
+EUPL 1.1
+Eurosym
+EU Datagrid
+Fair
+FBSDDL
+Free Art
+FTL
+GeoGratis
+GFDL
+Giftware
+GL2PS
+Glide
+gnuplot
+GPLv1
+GPLv2
+GPLv2 or Artistic
+GPLv2+
+GPLv2+ or Artistic
+GPLv2+ with exceptions
+GPLv2 with exceptions
+GPLv3
+GPLv3+
+GPLv3+ with exceptions
+GPLv3 with exceptions
+GPL+
+GPL+ or Artistic
+GPL+ with exceptions
+IBM
+IEEE
+IJG
+ImageMagick
+iMatix
+Imlib2
+Intel ACPI
+Interbase
+IPA
+ISC
+Jabber
+JasPer
+JPython
+Knuth
+LBNL BSD
+LGPLv2
+LGPLv2+
+LGPLv2+ or Artistic
+LGPLv2+ with exceptions
+LGPLv2 with exceptions
+LGPLv3
+LGPLv3+
+LGPLv3+ with exceptions
+LGPLv3 with exceptions
+Liberation
+libtiff
+LLGPL
+Logica
+LPL
+LPPL
+mecab-ipadic
+MirOS
+MIT
+MIT with advertising
+mod_macro
+Motosoto
+mplus
+MPLv1.0
+MPLv1.1
+MS-PL
+MS-RL
+Naumen
+NCSA
+NetCDF
+Netscape
+Newmat
+NGPL
+Nokia
+NOSL
+Noweb
+OAL
+OFL
+OFSFDL
+OpenLDAP
+OpenPBS
+OpenSSL
+OReilly
+OSL 1.0
+OSL 1.1
+OSL 2.0
+OSL 2.1
+OSL 3.0
+Phorum
+PHP
+Plexus
+PostgreSQL
+psutils
+PTFL
+Public Domain
+Public Use
+Python
+Qhull
+QPL
+Rdisc
+RiceBSD
+Romio
+RPSL
+Ruby
+Saxpath
+SCEA
+SCRIP
+Sendmail
+SISSL
+Sleepycat
+SLIB
+SNIA
+SPL
+STIX
+TCL
+TMate
+TOSL
+TPL
+UCD
+Vim
+VNLSL
+VOSTROM
+VSL
+W3C
+Wadalab
+Webmin
+WTFPL
+wxWidgets
+XANO
+Xerox
+xinetd
+XSkat
+YPLv1.1
+Zend
+zlib
+zlib with acknowledgement
+ZPLv1.0
+ZPLv2.0
+ZPLv2.1
diff --git a/tools/pk-refresh-licenses.c b/tools/pk-refresh-licenses.c
index f5d2e5c..969e415 100644
--- a/tools/pk-refresh-licenses.c
+++ b/tools/pk-refresh-licenses.c
@@ -126,6 +126,7 @@ main (int argc, char *argv[])
 	gboolean is_col;
 	GString *string_h = NULL;
 	GString *string_c = NULL;
+	GString *string_txt = NULL;
 	PkRefreshLicenseItem *item;
 	PkRefreshLicenseItem *item_tmp;
 	const gchar *locations[] =  {
@@ -263,8 +264,9 @@ skip:
 	g_ptr_array_sort (data, pk_refresh_licenses_compare_func);
 
 	/* process data, and output to header file */
-	string_h = g_string_new ("automatically geneated, do not edit\n\n");	
-	string_c = g_string_new ("automatically geneated, do not edit\n\n");	
+	string_h = g_string_new ("automatically geneated, do not edit\n\n");
+	string_c = g_string_new ("automatically geneated, do not edit\n\n");
+	string_txt = g_string_new (NULL);
 	for (i=0; i<data->len; i++) {
 		gchar *tabs;
 		guint len;
@@ -284,6 +286,7 @@ skip:
 		
 		/* need to tab properly */
 		g_string_append_printf (string_c, "\t{%s,%s\"%s\"},\n", item->enum_name, tabs, item->full_name);
+		g_string_append_printf (string_txt, "%s\n", item->full_name);
 		g_free (tabs);
 	}
 	g_string_append (string_c, "\n");
@@ -305,12 +308,22 @@ skip:
 		goto out;
 	}
 
+	/* set c contents */
+	ret = g_file_set_contents ("./licenses.txt", string_txt->str, -1, &error);
+	if (!ret) {
+		g_warning ("failed to set contents: %s", error->message);
+		g_error_free (error);
+		goto out;
+	}
+
 	retval = EXIT_SUCCESS;
 out:
 	if (string_h != NULL)
 		g_string_free (string_h, TRUE);
 	if (string_c != NULL)
 		g_string_free (string_c, TRUE);
+	if (string_txt != NULL)
+		g_string_free (string_txt, TRUE);
 	if (data != NULL)
 		g_ptr_array_unref (data);
 	g_string_free (contents, TRUE);
commit 06c0dd3bf417387de36fbd2b9290ec768b4c7458
Author: Richard Hughes <richard at hughsie.com>
Date:   Mon Apr 19 14:29:14 2010 +0100

    yum: update to a newer version of libzif that supports getting the file lists for a remote package

diff --git a/backends/yum/libzif/zif-completion.c b/backends/yum/libzif/zif-completion.c
index f96dd8f..e057e32 100644
--- a/backends/yum/libzif/zif-completion.c
+++ b/backends/yum/libzif/zif-completion.c
@@ -91,8 +91,10 @@ struct _ZifCompletionPrivate
 	guint			 current;
 	guint			 last_percentage;
 	ZifCompletion		*child;
+	ZifCompletion		*parent;
 	gulong			 percentage_child_id;
 	gulong			 subpercentage_child_id;
+	gchar			*id;
 };
 
 enum {
@@ -205,7 +207,6 @@ zif_completion_child_percentage_changed_cb (ZifCompletion *child, guint percenta
 	/* did we call done on a completion that did not have a size set? */
 	if (completion->priv->steps == 0) {
 		egg_warning ("done on a completion %p that did not have a size set!", completion);
-		zif_debug_crash ();
 		return;
 	}
 
@@ -316,6 +317,7 @@ zif_completion_get_child (ZifCompletion *completion)
 	/* connect up signals */
 	child = zif_completion_new ();
 	completion->priv->child = g_object_ref (child);
+	completion->priv->child->priv->parent = g_object_ref (completion);
 	completion->priv->percentage_child_id =
 		g_signal_connect (child, "percentage-changed", G_CALLBACK (zif_completion_child_percentage_changed_cb), completion);
 	completion->priv->subpercentage_child_id =
@@ -341,18 +343,21 @@ zif_completion_get_child (ZifCompletion *completion)
  * Since: 0.0.1
  **/
 gboolean
-zif_completion_set_number_steps (ZifCompletion *completion, guint steps)
+zif_completion_set_number_steps_real (ZifCompletion *completion, guint steps, const gchar *function_name, gint function_line)
 {
 	g_return_val_if_fail (ZIF_IS_COMPLETION (completion), FALSE);
 	g_return_val_if_fail (steps != 0, FALSE);
 
 	/* did we call done on a completion that did not have a size set? */
 	if (completion->priv->steps != 0) {
-		egg_warning ("steps already set (%i)!", completion->priv->steps);
-		zif_debug_crash ();
+		egg_warning ("steps already set (%i)! [%s:%i]",
+			     completion->priv->steps, function_name, function_line);
 		return FALSE;
 	}
 
+	/* set id */
+	completion->priv->id = g_strdup_printf ("%s:%i", function_name, function_line);
+
 	/* imply reset */
 	zif_completion_reset (completion);
 
@@ -363,6 +368,18 @@ zif_completion_set_number_steps (ZifCompletion *completion, guint steps)
 }
 
 /**
+ * zif_completion_print_parent_chain:
+ **/
+static void
+zif_completion_print_parent_chain (ZifCompletion *completion, guint level)
+{
+	if (completion->priv->parent != NULL)
+		zif_completion_print_parent_chain (completion->priv->parent, level + 1);
+	g_print ("%i) %s (%i/%i)\n",
+		 level, completion->priv->id, completion->priv->current, completion->priv->steps);
+}
+
+/**
  * zif_completion_done:
  * @completion: the #ZifCompletion object
  *
@@ -373,23 +390,40 @@ zif_completion_set_number_steps (ZifCompletion *completion, guint steps)
  * Since: 0.0.1
  **/
 gboolean
-zif_completion_done (ZifCompletion *completion)
+zif_completion_done_real (ZifCompletion *completion, const gchar *function_name, gint function_line)
 {
+	gboolean ret = TRUE;
 	gfloat percentage;
 
 	g_return_val_if_fail (ZIF_IS_COMPLETION (completion), FALSE);
 
 	/* did we call done on a completion that did not have a size set? */
 	if (completion->priv->steps == 0) {
-		egg_warning ("done on a completion %p that did not have a size set!", completion);
-		zif_debug_crash ();
-		return FALSE;
+		egg_warning ("done on a completion %p that did not have a size set! [%s:%i]",
+			     completion, function_name, function_line);
+		zif_completion_print_parent_chain (completion, 0);
+		ret = FALSE;
+		goto out;
 	}
 
 	/* is already at 100%? */
 	if (completion->priv->current == completion->priv->steps) {
-		egg_warning ("already at 100%% completion");
-		return FALSE;
+		egg_warning ("already at 100%% completion [%s:%i]", function_name, function_line);
+		zif_completion_print_parent_chain (completion, 0);
+		ret = FALSE;
+		goto out;
+	}
+
+	/* is child not at 100%? */
+	if (completion->priv->child != NULL) {
+		ZifCompletionPrivate *child_priv = completion->priv->child->priv;
+		if (child_priv->current != child_priv->steps) {
+			egg_warning ("child is at %i/%i steps and parent done [%s:%i]",
+				     child_priv->current, child_priv->steps, function_name, function_line);
+			zif_completion_print_parent_chain (completion->priv->child, 0);
+			ret = FALSE;
+			/* do not abort, as we want to clean this up */
+		}
 	}
 
 	/* another */
@@ -402,6 +436,43 @@ zif_completion_done (ZifCompletion *completion)
 	/* reset child if it exists */
 	if (completion->priv->child != NULL)
 		zif_completion_reset (completion->priv->child);
+out:
+	return ret;
+}
+
+/**
+ * zif_completion_finished:
+ * @completion: the #ZifCompletion object
+ *
+ * Called when the current sub-task wants to finish early and still complete.
+ *
+ * Return value: %TRUE for success, %FALSE for failure
+ *
+ * Since: 0.0.1
+ **/
+gboolean
+zif_completion_finished_real (ZifCompletion *completion, const gchar *function_name, gint function_line)
+{
+	g_return_val_if_fail (ZIF_IS_COMPLETION (completion), FALSE);
+
+	/* did we call done on a completion that did not have a size set? */
+	if (completion->priv->steps == 0) {
+		egg_warning ("finished on a completion %p that did not have a size set! [%s:%i]",
+			     completion, function_name, function_line);
+		return FALSE;
+	}
+
+	/* is already at 100%? */
+	if (completion->priv->current == completion->priv->steps) {
+		egg_warning ("already at 100%% completion [%s:%i]", function_name, function_line);
+		return FALSE;
+	}
+
+	/* all done */
+	completion->priv->current = completion->priv->steps;
+
+	/* set new percentage */
+	zif_completion_set_percentage (completion, 100);
 
 	return TRUE;
 }
@@ -420,6 +491,8 @@ zif_completion_finalize (GObject *object)
 
 	/* unref child too */
 	zif_completion_reset (completion);
+	if (completion->priv->parent != NULL)
+		g_object_unref (completion->priv->parent);
 
 	G_OBJECT_CLASS (zif_completion_parent_class)->finalize (object);
 }
@@ -458,6 +531,7 @@ zif_completion_init (ZifCompletion *completion)
 {
 	completion->priv = ZIF_COMPLETION_GET_PRIVATE (completion);
 	completion->priv->child = NULL;
+	completion->priv->parent = NULL;
 	completion->priv->steps = 0;
 	completion->priv->current = 0;
 	completion->priv->last_percentage = 0;
diff --git a/backends/yum/libzif/zif-completion.h b/backends/yum/libzif/zif-completion.h
index 33a2598..1429172 100644
--- a/backends/yum/libzif/zif-completion.h
+++ b/backends/yum/libzif/zif-completion.h
@@ -62,15 +62,36 @@ struct _ZifCompletionClass
 	void (*_zif_reserved4) (void);
 };
 
+#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+#define zif_completion_done(completion)				zif_completion_done_real (completion, __func__, __LINE__)
+#define zif_completion_finished(completion)			zif_completion_finished_real (completion, __func__, __LINE__)
+#define zif_completion_set_number_steps(completion, steps)	zif_completion_set_number_steps_real (completion, steps, __func__, __LINE__)
+#elif defined(__GNUC__) && __GNUC__ >= 3
+#define zif_completion_done(completion)				zif_completion_done_real (completion, __FUNCTION__, __LINE__)
+#define zif_completion_finished(completion)			zif_completion_finished_real (completion, __FUNCTION__, __LINE__)
+#define zif_completion_set_number_steps(completion, steps)	zif_completion_set_number_steps_real (completion, steps, __FUNCTION__, __LINE__)
+#else
+#define zif_completion_done(completion)
+#define zif_completion_finished(completion)
+#define zif_completion_set_number_steps(completion, steps)
+#endif
+
 GType		 zif_completion_get_type		(void);
 ZifCompletion	*zif_completion_new			(void);
 ZifCompletion	*zif_completion_get_child		(ZifCompletion		*completion);
-gboolean	 zif_completion_set_number_steps	(ZifCompletion		*completion,
-							 guint			 steps);
+gboolean	 zif_completion_set_number_steps_real	(ZifCompletion		*completion,
+							 guint			 steps,
+							 const gchar		*function_name,
+							 gint			 function_line);
 gboolean	 zif_completion_set_percentage		(ZifCompletion		*completion,
 							 guint			 percentage);
 guint		 zif_completion_get_percentage		(ZifCompletion		*completion);
-gboolean	 zif_completion_done			(ZifCompletion		*completion);
+gboolean	 zif_completion_done_real		(ZifCompletion		*completion,
+							 const gchar		*function_name,
+							 gint			 function_line);
+gboolean	 zif_completion_finished_real		(ZifCompletion		*completion,
+							 const gchar		*function_name,
+							 gint			 function_line);
 gboolean	 zif_completion_reset			(ZifCompletion		*completion);
 
 G_END_DECLS
diff --git a/backends/yum/libzif/zif-config.c b/backends/yum/libzif/zif-config.c
index 1fba6cb..f904bb1 100644
--- a/backends/yum/libzif/zif-config.c
+++ b/backends/yum/libzif/zif-config.c
@@ -412,6 +412,22 @@ zif_config_get_basearch_array (ZifConfig *config)
 }
 
 /**
+ * zif_config_get_release_filename:
+ **/
+static const gchar *
+zif_config_get_release_filename (ZifConfig *config)
+{
+	const gchar *filename;
+	filename = "/etc/fedora-release";
+	if (g_file_test (filename, G_FILE_TEST_EXISTS))
+		return filename;
+	filename = "/etc/redhat-release";
+	if (g_file_test (filename, G_FILE_TEST_EXISTS))
+		return filename;
+	return NULL;
+}
+
+/**
  * zif_config_set_filename:
  * @config: the #ZifConfig object
  * @filename: the system wide config file, e.g. "/etc/yum.conf"
@@ -430,6 +446,7 @@ zif_config_set_filename (ZifConfig *config, const gchar *filename, GError **erro
 	GError *error_local = NULL;
 	gchar *basearch = NULL;
 	gchar *releasever = NULL;
+	const gchar *release_filename;
 	const gchar *text;
 	GPtrArray *array;
 	guint i;
@@ -471,8 +488,18 @@ zif_config_set_filename (ZifConfig *config, const gchar *filename, GError **erro
 	/* calculate the release version if not specified in the config file */
 	releasever = zif_config_get_string (config, "releasever", NULL);
 	if (releasever == NULL) {
+
+		/* get correct file */
+		release_filename = zif_config_get_release_filename (config);
+		if (release_filename == NULL) {
+			ret = FALSE;
+			g_set_error_literal (error, ZIF_CONFIG_ERROR, ZIF_CONFIG_ERROR_FAILED,
+					     "could not get a correct release filename");
+			goto out;
+		}
+
 		/* get distro constants from fedora-release */
-		ret = g_file_get_contents ("/etc/fedora-release", &releasever, NULL, &error_local);
+		ret = g_file_get_contents (release_filename, &releasever, NULL, &error_local);
 		if (!ret) {
 			g_set_error (error, ZIF_CONFIG_ERROR, ZIF_CONFIG_ERROR_FAILED,
 				     "failed to get distro release version: %s", error_local->message);
diff --git a/backends/yum/libzif/zif-download.c b/backends/yum/libzif/zif-download.c
index a389484..d896615 100644
--- a/backends/yum/libzif/zif-download.c
+++ b/backends/yum/libzif/zif-download.c
@@ -255,6 +255,10 @@ zif_download_set_proxy (ZifDownload *download, const gchar *http_proxy, GError *
 		connection_timeout = 5;
 
 	/* setup the session */
+	if (http_proxy != NULL) {
+		egg_debug ("using proxy %s", http_proxy);
+		proxy = soup_uri_new (http_proxy);
+	}
 	download->priv->session = soup_session_sync_new_with_options (SOUP_SESSION_PROXY_URI, proxy,
 								      SOUP_SESSION_USER_AGENT, "zif",
 								      SOUP_SESSION_TIMEOUT, connection_timeout,
@@ -266,6 +270,8 @@ zif_download_set_proxy (ZifDownload *download, const gchar *http_proxy, GError *
 	}
 	ret = TRUE;
 out:
+	if (proxy != NULL)
+		soup_uri_free (proxy);
 	return ret;
 }
 
@@ -419,7 +425,7 @@ zif_download_test (EggTest *test)
 		egg_test_failed (test, "got %i updates", _updates);
 
 	/* setup cancel */
-	g_thread_create (zif_download_cancel_thread_cb, cancellable, FALSE, NULL);
+	g_thread_create ((GThreadFunc) zif_download_cancel_thread_cb, cancellable, FALSE, NULL);
 
 	/************************************************************/
 	egg_test_title (test, "download second file (should be cancelled)");
diff --git a/backends/yum/libzif/zif-md-filelists-sql.c b/backends/yum/libzif/zif-md-filelists-sql.c
index 4ee6a55..200c5cd 100644
--- a/backends/yum/libzif/zif-md-filelists-sql.c
+++ b/backends/yum/libzif/zif-md-filelists-sql.c
@@ -39,6 +39,7 @@
 
 #include "zif-md.h"
 #include "zif-md-filelists-sql.h"
+#include "zif-package-remote.h"
 
 #include "egg-debug.h"
 
@@ -114,7 +115,7 @@ out:
 }
 
 /**
- * zif_store_remote_sqlite_get_id_cb:
+ * zif_md_filelists_sql_sqlite_get_id_cb:
  **/
 static gint
 zif_md_filelists_sql_sqlite_get_id_cb (void *data, gint argc, gchar **argv, gchar **col_name)
@@ -125,10 +126,10 @@ zif_md_filelists_sql_sqlite_get_id_cb (void *data, gint argc, gchar **argv, gcha
 }
 
 /**
- * zif_md_filelists_sql_sqlite_get_files_cb:
+ * zif_md_filelists_sql_sqlite_get_pkgkey_cb:
  **/
 static gint
-zif_md_filelists_sql_sqlite_get_files_cb (void *data, gint argc, gchar **argv, gchar **col_name)
+zif_md_filelists_sql_sqlite_get_pkgkey_cb (void *data, gint argc, gchar **argv, gchar **col_name)
 {
 	gint i;
 	gchar **filenames = NULL;
@@ -165,6 +166,104 @@ out:
 }
 
 /**
+ * zif_md_filelists_sql_sqlite_get_files_cb:
+ **/
+static gint
+zif_md_filelists_sql_sqlite_get_files_cb (void *data, gint argc, gchar **argv, gchar **col_name)
+{
+	gint i;
+	gchar **filename = NULL;
+	gchar **dirname = NULL;
+	GPtrArray **array = (GPtrArray **) data;
+
+	/* get pointers to the arguments */
+	for (i=0;i<argc;i++) {
+		if (g_strcmp0 (col_name[i], "filenames") == 0)
+			filename = &argv[i];
+		else if (g_strcmp0 (col_name[i], "dirname") == 0)
+			dirname = &argv[i];
+	}
+
+	/* check for invalid entries */
+	if (filename == NULL || dirname == NULL) {
+		egg_warning ("failed on %p, %p", filename, dirname);
+		return 0;
+	}
+
+	/* add complete path */
+	g_ptr_array_add (*array, g_strdup (g_build_filename (*dirname, *filename, NULL)));
+	return 0;
+}
+
+/**
+ * zif_md_filelists_sql_get_files:
+ **/
+static GPtrArray *
+zif_md_filelists_sql_get_files (ZifMd *md, ZifPackage *package,
+				GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	gchar *statement = NULL;
+	gint rc;
+	gboolean ret;
+	const gchar *pkgid;
+	gchar *pkgkey = NULL;
+	GError *error_local = NULL;
+	gchar *error_msg = NULL;
+	GPtrArray *array = NULL;
+	GPtrArray *files = NULL;
+	ZifMdFilelistsSql *md_filelists_sql = ZIF_MD_FILELISTS_SQL (md);
+
+	/* if not already loaded, load */
+	if (!md_filelists_sql->priv->loaded) {
+		ret = zif_md_load (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;
+		}
+	}
+
+	/* get pkgkey from pkgid */
+	pkgid = zif_package_remote_get_pkgid (ZIF_PACKAGE_REMOTE (package));
+	statement = g_strdup_printf ("SELECT pkgKey FROM packages WHERE pkgId = '%s' LIMIT 1", pkgid);
+	rc = sqlite3_exec (md_filelists_sql->priv->db, statement, zif_md_filelists_sql_sqlite_get_id_cb, &pkgkey, &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;
+	}
+
+	/* failed */
+	if (pkgkey == NULL) {
+		g_set_error (error, ZIF_MD_ERROR, ZIF_MD_ERROR_BAD_SQL,
+			     "failed to get pkgkey for %s", pkgid);
+		goto out;
+	}
+
+	/* get files for pkgkey */
+	files = g_ptr_array_new_with_free_func (g_free);
+	statement = g_strdup_printf ("SELECT dirname, filenames FROM filelist WHERE pkgKey = '%s'", pkgkey);
+	rc = sqlite3_exec (md_filelists_sql->priv->db, statement, zif_md_filelists_sql_sqlite_get_files_cb, &files, &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;
+	}
+
+	/* success */
+	array = g_ptr_array_ref (files);
+out:
+	if (files != NULL)
+		g_ptr_array_unref (files);
+	return array;
+}
+
+/**
  * zif_md_filelists_sql_search_file:
  **/
 static GPtrArray *
@@ -209,7 +308,7 @@ zif_md_filelists_sql_search_file (ZifMd *md, gchar **search,
 
 	/* populate _array with guint pkgKey */
 	statement = g_strdup_printf ("SELECT filenames, pkgKey FROM filelist WHERE dirname = '%s'", dirname);
-	rc = sqlite3_exec (md_filelists_sql->priv->db, statement, zif_md_filelists_sql_sqlite_get_files_cb, data, &error_msg);
+	rc = sqlite3_exec (md_filelists_sql->priv->db, statement, zif_md_filelists_sql_sqlite_get_pkgkey_cb, data, &error_msg);
 	g_free (statement);
 	if (rc != SQLITE_OK) {
 		g_set_error (error, ZIF_MD_ERROR, ZIF_MD_ERROR_BAD_SQL,
@@ -288,6 +387,7 @@ zif_md_filelists_sql_class_init (ZifMdFilelistsSqlClass *klass)
 	md_class->load = zif_md_filelists_sql_load;
 	md_class->unload = zif_md_filelists_sql_unload;
 	md_class->search_file = zif_md_filelists_sql_search_file;
+	md_class->get_files = zif_md_filelists_sql_get_files;
 	g_type_class_add_private (klass, sizeof (ZifMdFilelistsSqlPrivate));
 }
 
@@ -413,7 +513,7 @@ zif_md_filelists_sql_test (EggTest *test)
 
 	/************************************************************/
 	egg_test_title (test, "search for files");
-	array = zif_md_filelists_sql_search_file (md, data, cancellable, completion, &error);
+	array = zif_md_filelists_sql_search_file (ZIF_MD (md), (gchar**)data, cancellable, completion, &error);
 	if (array != NULL)
 		egg_test_success (test, NULL);
 	else
diff --git a/backends/yum/libzif/zif-md-filelists-xml.c b/backends/yum/libzif/zif-md-filelists-xml.c
index 07cee6c..1eec0c9 100644
--- a/backends/yum/libzif/zif-md-filelists-xml.c
+++ b/backends/yum/libzif/zif-md-filelists-xml.c
@@ -54,6 +54,7 @@ typedef enum {
 
 #include "zif-md.h"
 #include "zif-md-filelists-xml.h"
+#include "zif-package-remote.h"
 
 #include "egg-debug.h"
 
@@ -120,12 +121,12 @@ zif_md_filelists_xml_parser_start_element (GMarkupParseContext *context, const g
 
 			if (g_strcmp0 (element_name, "package") == 0) {
 				filelists_xml->priv->section_list = ZIF_MD_FILELISTS_XML_SECTION_LIST_PACKAGE;
-				filelists_xml->priv->package_temp = zif_package_new ();
+				filelists_xml->priv->package_temp = ZIF_PACKAGE (zif_package_remote_new ());
 				filelists_xml->priv->array_temp = g_ptr_array_new_with_free_func (g_free);
 				for (i=0; attribute_names[i] != NULL; i++) {
 					if (g_strcmp0 (attribute_names[i], "pkgid") == 0) {
-						g_object_set_data_full (G_OBJECT (filelists_xml->priv->package_temp),
-									"pkgid", g_strdup (attribute_values[i]), g_free);
+						zif_package_remote_set_pkgid (ZIF_PACKAGE_REMOTE (filelists_xml->priv->package_temp),
+									      attribute_values[i]);
 					}
 				}
 				goto out;
@@ -321,6 +322,75 @@ out:
 }
 
 /**
+ * zif_md_filelists_xml_get_files:
+ **/
+static GPtrArray *
+zif_md_filelists_xml_get_files (ZifMd *md, ZifPackage *package,
+				GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	GPtrArray *array = NULL;
+	GPtrArray *packages;
+	ZifPackage *package_tmp;
+	guint i;
+	gboolean ret;
+	const gchar *pkgid;
+	const gchar *pkgid_tmp;
+	GError *error_local = NULL;
+	ZifCompletion *completion_local;
+	ZifCompletion *completion_loop;
+	ZifMdFilelistsXml *md_filelists = ZIF_MD_FILELISTS_XML (md);
+
+	g_return_val_if_fail (ZIF_IS_MD_FILELISTS_XML (md), NULL);
+	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+	/* setup completion */
+	if (md_filelists->priv->loaded)
+		zif_completion_set_number_steps (completion, 1);
+	else
+		zif_completion_set_number_steps (completion, 2);
+
+	/* if not already loaded, load */
+	if (!md_filelists->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_filelists_xml file: %s", error_local->message);
+			g_error_free (error_local);
+			goto out;
+		}
+
+		/* this section done */
+		zif_completion_done (completion);
+	}
+
+	/* setup steps */
+	completion_local = zif_completion_get_child (completion);
+	zif_completion_set_number_steps (completion_local, md_filelists->priv->array->len);
+
+	/* search array */
+	pkgid = zif_package_remote_get_pkgid (ZIF_PACKAGE_REMOTE (package));
+	packages = md_filelists->priv->array;
+	for (i=0; i<packages->len; i++) {
+		package_tmp = g_ptr_array_index (packages, i);
+		pkgid_tmp = zif_package_remote_get_pkgid (ZIF_PACKAGE_REMOTE (package_tmp));
+		if (g_strcmp0 (pkgid, pkgid_tmp) == 0) {
+			completion_loop = zif_completion_get_child (completion_local);
+			array = zif_package_get_files (package_tmp, cancellable, completion_loop, NULL);
+			break;
+		}
+
+		/* this section done */
+		zif_completion_done (completion_local);
+	}
+
+	/* this section done */
+	zif_completion_done (completion);
+out:
+	return array;
+}
+
+/**
  * zif_md_filelists_xml_search_file:
  **/
 static GPtrArray *
@@ -337,6 +407,7 @@ zif_md_filelists_xml_search_file (ZifMd *md, gchar **search,
 	const gchar *pkgid;
 	GError *error_local = NULL;
 	ZifCompletion *completion_local;
+	ZifCompletion *completion_loop;
 	ZifMdFilelistsXml *md_filelists = ZIF_MD_FILELISTS_XML (md);
 
 	g_return_val_if_fail (ZIF_IS_MD_FILELISTS_XML (md), NULL);
@@ -363,13 +434,18 @@ zif_md_filelists_xml_search_file (ZifMd *md, gchar **search,
 		zif_completion_done (completion);
 	}
 
+	/* setup steps */
+	completion_local = zif_completion_get_child (completion);
+	zif_completion_set_number_steps (completion_local, md_filelists->priv->array->len);
+
 	/* search array */
 	array = g_ptr_array_new_with_free_func (g_free);
 	packages = md_filelists->priv->array;
 	for (i=0; i<packages->len; i++) {
 		package = g_ptr_array_index (packages, i);
-		pkgid = g_object_get_data (G_OBJECT (package), "pkgid");
-		files = zif_package_get_files (package, NULL);
+		pkgid = zif_package_remote_get_pkgid (ZIF_PACKAGE_REMOTE (package));
+		completion_loop = zif_completion_get_child (completion_local);
+		files = zif_package_get_files (package, cancellable, completion_loop, NULL);
 		for (k=0; k<files->len; k++) {
 			filename = g_ptr_array_index (files, k);
 			for (j=0; search[j] != NULL; j++) {
@@ -379,6 +455,9 @@ zif_md_filelists_xml_search_file (ZifMd *md, gchar **search,
 				}
 			}
 		}
+
+		/* this section done */
+		zif_completion_done (completion_local);
 	}
 
 	/* this section done */
@@ -420,6 +499,7 @@ zif_md_filelists_xml_class_init (ZifMdFilelistsXmlClass *klass)
 	md_class->load = zif_md_filelists_xml_load;
 	md_class->unload = zif_md_filelists_xml_unload;
 	md_class->search_file = zif_md_filelists_xml_search_file;
+	md_class->get_files = zif_md_filelists_xml_get_files;
 
 	g_type_class_add_private (klass, sizeof (ZifMdFilelistsXmlPrivate));
 }
@@ -569,7 +649,9 @@ zif_md_filelists_xml_test (EggTest *test)
 	/************************************************************/
 	egg_test_title (test, "correct value");
 	pkgid = g_ptr_array_index (array, 0);
-	if (pkgid[0] != '\0' && strlen (pkgid) == 64)
+	if (pkgid == NULL)
+		egg_test_failed (test, "failed to get a pkgId");
+	else 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));
diff --git a/backends/yum/libzif/zif-md-other-sql.c b/backends/yum/libzif/zif-md-other-sql.c
index f5ccba8..9ff6bde 100644
--- a/backends/yum/libzif/zif-md-other-sql.c
+++ b/backends/yum/libzif/zif-md-other-sql.c
@@ -145,7 +145,7 @@ zif_md_other_sql_sqlite_create_changelog_cb (void *data, gint argc, gchar **argv
 	changeset = zif_changeset_new ();
 	zif_changeset_set_date (changeset, date);
 	zif_changeset_set_description (changeset, changelog);
-	ret = zif_changeset_parse_header (changeset, author, NULL);
+	ret = zif_changeset_parse_header (changeset, author, &error);
 	if (!ret) {
 		egg_warning ("failed to parse header: %s", error->message);
 		g_error_free (error);
@@ -299,6 +299,9 @@ zif_md_other_sql_get_changelog (ZifMd *md, const gchar *pkgid,
 
 		/* clear array */
 		g_ptr_array_unref (array_tmp);
+
+		/* this section done */
+		zif_completion_done (completion_local);
 	}
 
 	/* this section done */
@@ -467,7 +470,7 @@ zif_md_other_sql_test (EggTest *test)
 	/************************************************************/
 	egg_test_title (test, "search for files");
 	zif_completion_reset (completion);
-	array = zif_md_other_sql_get_changelog (ZIF_MD_OTHER_SQL (md),
+	array = zif_md_other_sql_get_changelog (ZIF_MD (md),
 						"42b8d71b303b19c2fcc2b06bb9c764f2902dd72b9376525025ee9ba4a41c38e9",
 						cancellable, completion, &error);
 	if (array != NULL)
diff --git a/backends/yum/libzif/zif-md-primary-sql.c b/backends/yum/libzif/zif-md-primary-sql.c
index bec2495..7b8cb9b 100644
--- a/backends/yum/libzif/zif-md-primary-sql.c
+++ b/backends/yum/libzif/zif-md-primary-sql.c
@@ -59,6 +59,7 @@ struct _ZifMdPrimarySqlPrivate
 typedef struct {
 	const gchar		*id;
 	GPtrArray		*packages;
+	ZifMdPrimarySql		*md;
 } ZifMdPrimarySqlData;
 
 G_DEFINE_TYPE (ZifMdPrimarySql, zif_md_primary_sql, ZIF_TYPE_MD)
@@ -123,8 +124,16 @@ zif_md_primary_sql_sqlite_create_package_cb (void *data, gint argc, gchar **argv
 {
 	ZifMdPrimarySqlData *fldata = (ZifMdPrimarySqlData *) data;
 	ZifPackageRemote *package;
+	ZifStoreRemote *store_remote;
 
 	package = zif_package_remote_new ();
+	store_remote = zif_md_get_store_remote (ZIF_MD (fldata->md));
+	if (store_remote != NULL) {
+		/* this is not set in a test harness */
+		zif_package_remote_set_store_remote (package, store_remote);
+	} else {
+		egg_warning ("no remote store for %s", argv[1]);
+	}
 	zif_package_remote_set_from_repo (package, argc, col_name, argv, fldata->id, NULL);
 	g_ptr_array_add (fldata->packages, package);
 
@@ -162,6 +171,7 @@ zif_md_primary_sql_search (ZifMdPrimarySql *md, const gchar *statement,
 
 	/* create data struct we can pass to the callback */
 	data = g_new0 (ZifMdPrimarySqlData, 1);
+	data->md = md;
 	data->id = zif_md_get_id (ZIF_MD (md));
 	data->packages = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
 	rc = sqlite3_exec (md->priv->db, statement, zif_md_primary_sql_sqlite_create_package_cb, data, &error_msg);
@@ -449,7 +459,7 @@ zif_md_primary_sql_what_provides (ZifMd *md, gchar **search,
 
 		/* 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);
+		array_tmp = zif_md_primary_sql_search_pkgkey (md, pkgkey, cancellable, completion_loop, error);
 		if (array_tmp == NULL) {
 			g_ptr_array_unref (array);
 			array = NULL;
@@ -468,6 +478,9 @@ zif_md_primary_sql_what_provides (ZifMd *md, gchar **search,
 
 		/* clear array */
 		g_ptr_array_unref (array_tmp);
+
+		/* this section done */
+		zif_completion_done (completion_local);
 	}
 
 	/* this section done */
@@ -602,7 +615,7 @@ zif_md_primary_sql_test (EggTest *test)
 	GError *error = NULL;
 	GPtrArray *array;
 	ZifPackage *package;
-	ZifString *summary;
+	const gchar *summary;
 	GCancellable *cancellable;
 	ZifCompletion *completion;
 	gchar *data[] = { "gnome-power-manager", "gnome-color-manager", NULL };
@@ -685,7 +698,7 @@ zif_md_primary_sql_test (EggTest *test)
 
 	/************************************************************/
 	egg_test_title (test, "resolve");
-	array = zif_md_primary_sql_resolve (md, data, cancellable, completion, &error);
+	array = zif_md_primary_sql_resolve (ZIF_MD (md), data, cancellable, completion, &error);
 	if (array != NULL)
 		egg_test_success (test, NULL);
 	else
@@ -698,12 +711,12 @@ zif_md_primary_sql_test (EggTest *test)
 	/************************************************************/
 	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)
+	zif_completion_reset (completion);
+	summary = zif_package_get_summary (package, NULL, completion, NULL);
+	if (g_strcmp0 (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);
+		egg_test_failed (test, "failed to get correct summary '%s'", summary);
 	g_ptr_array_unref (array);
 
 	g_object_unref (cancellable);
diff --git a/backends/yum/libzif/zif-md-primary-xml.c b/backends/yum/libzif/zif-md-primary-xml.c
index c1d3564..6e3454b 100644
--- a/backends/yum/libzif/zif-md-primary-xml.c
+++ b/backends/yum/libzif/zif-md-primary-xml.c
@@ -124,7 +124,7 @@ zif_md_primary_xml_parser_start_element (GMarkupParseContext *context, const gch
 		/* 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 ();
+			primary_xml->priv->package_temp = ZIF_PACKAGE (zif_package_remote_new ());
 			goto out;
 		}
 
@@ -376,8 +376,7 @@ zif_md_primary_xml_parser_text (GMarkupParseContext *context, const gchar *text,
 			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);
+			zif_package_remote_set_pkgid (ZIF_PACKAGE_REMOTE (primary_xml->priv->package_temp), text);
 			goto out;
 		}
 		egg_warning ("not saving: %s", text);
@@ -468,9 +467,9 @@ zif_md_primary_xml_filter (ZifMd *md, ZifPackageFilterFunc filter_func, gpointer
 
 	/* setup completion */
 	if (md_primary->priv->loaded)
-		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);
 
 	/* if not already loaded, load */
 	if (!md_primary->priv->loaded) {
@@ -565,29 +564,42 @@ zif_md_primary_xml_search_details_cb (ZifPackage *package, gpointer user_data)
 	guint i;
 	gboolean ret = FALSE;
 	const gchar *name;
-	ZifString *summary;
-	ZifString *description;
+	const gchar *summary;
+	const gchar *description;
+	ZifCompletion *completion_tmp;
+	GError *error = NULL;
 	gchar **search = (gchar **) user_data;
 
+	completion_tmp = zif_completion_new ();
 	name = zif_package_get_name (package);
-	summary = zif_package_get_summary (package, NULL);
-	description = zif_package_get_description (package, NULL);
+	summary = zif_package_get_summary (package, NULL, completion_tmp, &error);
+	if (summary == NULL) {
+		egg_warning ("failed to get summary: %s", error->message);
+		g_error_free (error);
+		goto out;
+	}
+	description = zif_package_get_description (package, NULL, completion_tmp, &error);
+	if (description == NULL) {
+		egg_warning ("failed to get description: %s", error->message);
+		g_error_free (error);
+		goto out;
+	}
 	for (i=0; search[i] != NULL; i++) {
 		if (g_strstr_len (name, -1, search[i]) != NULL) {
 			ret = TRUE;
 			break;
 		}
-		if (g_strstr_len (zif_string_get_value (summary), -1, search[i]) != NULL) {
+		if (g_strstr_len (summary, -1, search[i]) != NULL) {
 			ret = TRUE;
 			break;
 		}
-		if (g_strstr_len (zif_string_get_value (description), -1, search[i]) != NULL) {
+		if (g_strstr_len (description, -1, search[i]) != NULL) {
 			ret = TRUE;
 			break;
 		}
 	}
-	zif_string_unref (summary);
-	zif_string_unref (description);
+out:
+	g_object_unref (completion_tmp);
 	return ret;
 }
 
@@ -608,17 +620,27 @@ static gboolean
 zif_md_primary_xml_search_group_cb (ZifPackage *package, gpointer user_data)
 {
 	guint i;
-	gboolean ret;
-	ZifString *value;
+	gboolean ret = FALSE;
+	const gchar *value;
+	ZifCompletion *completion_tmp;
+	GError *error = NULL;
 	gchar **search = (gchar **) user_data;
-	value = zif_package_get_category (package, NULL);
+
+	completion_tmp = zif_completion_new ();
+	value = zif_package_get_category (package, NULL, completion_tmp, &error);
+	if (value == NULL) {
+		egg_warning ("failed to get category: %s", error->message);
+		g_error_free (error);
+		goto out;
+	}
 	for (i=0; search[i] != NULL; i++) {
-		if (g_strstr_len (zif_string_get_value (value), -1, search[i]) != NULL) {
+		if (g_strstr_len (value, -1, search[i]) != NULL) {
 			ret = TRUE;
-			break;
+			goto out;
 		}
 	}
-	zif_string_unref (value);
+out:
+	g_object_unref (completion_tmp);
 	return ret;
 }
 
@@ -639,11 +661,11 @@ static gboolean
 zif_md_primary_xml_search_pkgid_cb (ZifPackage *package, gpointer user_data)
 {
 	guint i;
-	const gchar *value;
+	const gchar *pkgid;
 	gchar **search = (gchar **) user_data;
-	value = (const gchar *) g_object_get_data (G_OBJECT (package), "pkgid");
+	pkgid = zif_package_remote_get_pkgid (ZIF_PACKAGE_REMOTE (package));
 	for (i=0; search[i] != NULL; i++) {
-		if (g_strcmp0 (value, search[i]) == 0)
+		if (g_strcmp0 (pkgid, search[i]) == 0)
 			return TRUE;
 	}
 	return FALSE;
@@ -667,12 +689,24 @@ zif_md_primary_xml_what_provides_cb (ZifPackage *package, gpointer user_data)
 {
 //	guint i;
 	gboolean ret;
-	GPtrArray *array;
+	GPtrArray *array = NULL;
+	ZifCompletion *completion_tmp;
+	GError *error = NULL;
 //	gchar **search = (gchar **) user_data;
-	array = zif_package_get_provides (package, NULL);
+
+	completion_tmp = zif_completion_new ();
+	array = zif_package_get_provides (package, NULL, completion_tmp, &error);
+	if (array == NULL) {
+		egg_warning ("failed to get provides: %s", error->message);
+		g_error_free (error);
+		goto out;
+	}
 	/* TODO: do something with the ZifDepend objects */
 	ret = FALSE;
-	g_ptr_array_unref (array);
+	g_object_unref (completion_tmp);
+out:
+	if (array != NULL)
+		g_ptr_array_unref (array);
 	return ret;
 }
 
@@ -804,7 +838,7 @@ zif_md_primary_xml_test (EggTest *test)
 	GError *error = NULL;
 	GPtrArray *array;
 	ZifPackage *package;
-	ZifString *summary;
+	const gchar *summary;
 	GCancellable *cancellable;
 	ZifCompletion *completion;
 	gchar *data[] = { "gnome-power-manager", NULL };
@@ -888,7 +922,7 @@ zif_md_primary_xml_test (EggTest *test)
 	/************************************************************/
 	egg_test_title (test, "search for files");
 	zif_completion_reset (completion);
-	array = zif_md_primary_xml_resolve (md, data, cancellable, completion, &error);
+	array = zif_md_primary_xml_resolve (ZIF_MD (md), data, cancellable, completion, &error);
 	if (array != NULL)
 		egg_test_success (test, NULL);
 	else
@@ -901,12 +935,12 @@ zif_md_primary_xml_test (EggTest *test)
 	/************************************************************/
 	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)
+	zif_completion_reset (completion);
+	summary = zif_package_get_summary (package, NULL, completion, NULL);
+	if (g_strcmp0 (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);
+		egg_test_failed (test, "failed to get correct summary '%s'", summary);
 	g_ptr_array_unref (array);
 
 	g_object_unref (cancellable);
diff --git a/backends/yum/libzif/zif-md.c b/backends/yum/libzif/zif-md.c
index 7bdea8d..9ba1e9d 100644
--- a/backends/yum/libzif/zif-md.c
+++ b/backends/yum/libzif/zif-md.c
@@ -379,11 +379,11 @@ zif_md_set_id (ZifMd *md, const gchar *id)
 }
 
 /**
- * zif_md_set_id:
+ * zif_md_set_store_remote:
  * @md: the #ZifMd object
- * @id: the repository id, e.g. "fedora"
+ * @remote: the #ZifStoreRemote that created this metadata object
  *
- * Sets the repository ID for this metadata.
+ * Sets the remote store for this metadata.
  *
  * Return value: %TRUE for success, %FALSE for failure
  *
@@ -402,6 +402,23 @@ zif_md_set_store_remote (ZifMd *md, ZifStoreRemote *remote)
 }
 
 /**
+ * zif_md_get_store_remote:
+ * @md: the #ZifMd object
+ *
+ * Gets the remote store for this metadata.
+ *
+ * Return value: A #ZifStoreRemote or %NULL for unset
+ *
+ * Since: 0.0.1
+ **/
+ZifStoreRemote *
+zif_md_get_store_remote (ZifMd *md)
+{
+	g_return_val_if_fail (ZIF_IS_MD (md), NULL);
+	return md->priv->remote;
+}
+
+/**
  * zif_md_delete_file:
  **/
 static gboolean
@@ -943,6 +960,42 @@ out:
 }
 
 /**
+ * zif_md_get_files:
+ * @md: the #ZifMd object
+ * @package: the %ZifPackage
+ * @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 file list for a specific package.
+ *
+ * Return value: an array of strings, free with g_ptr_array_unref()
+ *
+ * Since: 0.0.1
+ **/
+GPtrArray *
+zif_md_get_files (ZifMd *md, ZifPackage *package, 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_files == 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_files (md, package, 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
diff --git a/backends/yum/libzif/zif-md.h b/backends/yum/libzif/zif-md.h
index a0e93b5..dd9c7a8 100644
--- a/backends/yum/libzif/zif-md.h
+++ b/backends/yum/libzif/zif-md.h
@@ -114,6 +114,11 @@ struct _ZifMdClass
 						 GCancellable		*cancellable,
 						 ZifCompletion		*completion,
 						 GError			**error);
+	GPtrArray	*(*get_files)		(ZifMd			*md,
+						 ZifPackage		*package,
+						 GCancellable		*cancellable,
+						 ZifCompletion		*completion,
+						 GError			**error);
 };
 
 /* types of metadata */
@@ -152,6 +157,7 @@ gboolean	 zif_md_set_mdtype			(ZifMd		*md,
 							 ZifMdType	 type);
 gboolean	 zif_md_set_store_remote		(ZifMd		*md,
 							 ZifStoreRemote	*remote);
+ZifStoreRemote	*zif_md_get_store_remote		(ZifMd		*md);
 gboolean	 zif_md_set_id				(ZifMd		*md,
 							 const gchar	*id);
 gboolean	 zif_md_set_filename			(ZifMd		*md,
@@ -240,6 +246,11 @@ GPtrArray	*zif_md_get_changelog			(ZifMd		*md,
 							 GCancellable	*cancellable,
 							 ZifCompletion	*completion,
 							 GError		**error);
+GPtrArray	*zif_md_get_files			(ZifMd		*md,
+							 ZifPackage	*package,
+							 GCancellable	*cancellable,
+							 ZifCompletion	*completion,
+							 GError		**error);
 
 G_END_DECLS
 
diff --git a/backends/yum/libzif/zif-package-local.c b/backends/yum/libzif/zif-package-local.c
index d0a5cde..4a6cf5b 100644
--- a/backends/yum/libzif/zif-package-local.c
+++ b/backends/yum/libzif/zif-package-local.c
@@ -253,7 +253,7 @@ zif_package_local_get_depends_from_name_flags_version (GPtrArray *names, GPtrArr
  * zif_package_local_ensure_data:
  */
 static gboolean
-zif_package_local_ensure_data (ZifPackage *pkg, ZifPackageEnsureType type, GError **error)
+zif_package_local_ensure_data (ZifPackage *pkg, ZifPackageEnsureType type, GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
 	GPtrArray *files;
 	GPtrArray *dirnames;
@@ -263,6 +263,7 @@ zif_package_local_ensure_data (ZifPackage *pkg, ZifPackageEnsureType type, GErro
 	gchar *filename;
 	guint size;
 	ZifString *tmp;
+	const gchar *text;
 	PkGroupEnum group;
 //	GPtrArray *tmparray;
 	GPtrArray *depends;
@@ -374,13 +375,12 @@ zif_package_local_ensure_data (ZifPackage *pkg, ZifPackageEnsureType type, GErro
 
 	} else if (type == ZIF_PACKAGE_ENSURE_TYPE_GROUP) {
 		/* group */
-		tmp = zif_package_get_category (pkg, error);
-		if (tmp == NULL)
+		text = zif_package_get_category (pkg, cancellable, completion, error);
+		if (text == NULL)
 			goto out;
-		group = zif_groups_get_group_for_cat (ZIF_PACKAGE_LOCAL (pkg)->priv->groups, zif_string_get_value (tmp), NULL);
+		group = zif_groups_get_group_for_cat (ZIF_PACKAGE_LOCAL (pkg)->priv->groups, text, NULL);
 		if (group != PK_GROUP_ENUM_UNKNOWN)
 			zif_package_set_group (pkg, group);
-		zif_string_unref (tmp);
 
 	} else if (type == ZIF_PACKAGE_ENSURE_TYPE_REQUIRES) {
 		/* requires */
diff --git a/backends/yum/libzif/zif-package-remote.c b/backends/yum/libzif/zif-package-remote.c
index fb74008..6c552ad 100644
--- a/backends/yum/libzif/zif-package-remote.c
+++ b/backends/yum/libzif/zif-package-remote.c
@@ -40,6 +40,7 @@
 #include "zif-package-remote.h"
 #include "zif-groups.h"
 #include "zif-string.h"
+#include "zif-store-remote.h"
 
 #define ZIF_PACKAGE_REMOTE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), ZIF_TYPE_PACKAGE_REMOTE, ZifPackageRemotePrivate))
 
@@ -51,6 +52,7 @@
 struct _ZifPackageRemotePrivate
 {
 	ZifGroups		*groups;
+	ZifStoreRemote		*store_remote;
 	gchar			*pkgid;
 };
 
@@ -161,6 +163,80 @@ zif_package_remote_get_pkgid (ZifPackageRemote *pkg)
 }
 
 /**
+ * zif_package_remote_set_pkgid:
+ * @pkg: the #ZifPackageRemote object
+ * @pkgid: the pkgid hash.
+ *
+ * Sets the pkgid used internally to track the package item.
+ *
+ * Return value: the pkgid hash.
+ *
+ * Since: 0.0.1
+ **/
+void
+zif_package_remote_set_pkgid (ZifPackageRemote *pkg, const gchar *pkgid)
+{
+	g_return_if_fail (ZIF_IS_PACKAGE_REMOTE (pkg));
+	g_return_if_fail (pkgid != NULL);
+	g_return_if_fail (pkg->priv->pkgid == NULL);
+	pkg->priv->pkgid = g_strdup (pkgid);
+}
+
+/**
+ * zif_package_remote_set_store_remote:
+ * @pkg: the #ZifPackageRemote object
+ * @store: the #ZifStoreRemote that created this package
+ *
+ * Sets the store used to create this package, which we may need of we ever
+ * need to ensure() data at runtime.
+ *
+ * Return value: the pkgid hash.
+ *
+ * Since: 0.0.1
+ **/
+void
+zif_package_remote_set_store_remote (ZifPackageRemote *pkg, ZifStoreRemote *store)
+{
+	g_return_if_fail (ZIF_IS_PACKAGE_REMOTE (pkg));
+	g_return_if_fail (ZIF_IS_STORE_REMOTE (store));
+	g_return_if_fail (pkg->priv->store_remote == NULL);
+	pkg->priv->store_remote = g_object_ref (store);
+}
+
+/*
+ * zif_package_remote_ensure_data:
+ */
+static gboolean
+zif_package_remote_ensure_data (ZifPackage *pkg, ZifPackageEnsureType type, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	gboolean ret = TRUE;
+	GPtrArray *array = NULL;
+	ZifPackageRemote *pkg_remote = ZIF_PACKAGE_REMOTE (pkg);
+
+	if (type == ZIF_PACKAGE_ENSURE_TYPE_FILES) {
+
+		/* get the file list for this package */
+		array = zif_store_remote_get_files (pkg_remote->priv->store_remote, pkg, cancellable, completion, error);
+		if (array == NULL) {
+			ret = FALSE;
+			goto out;
+		}
+
+		/* set for this package */
+		zif_package_set_files (pkg, array);
+	} else {
+		g_set_error (error, 1, 0,
+			     "Getting ensure type '%s' not supported on a ZifPackageRemote",
+			     zif_package_ensure_type_to_string (type));
+		ret = FALSE;
+	}
+out:
+	if (array != NULL)
+		g_ptr_array_unref (array);
+	return ret;
+}
+
+/**
  * zif_package_remote_finalize:
  **/
 static void
@@ -174,6 +250,8 @@ zif_package_remote_finalize (GObject *object)
 
 	g_free (pkg->priv->pkgid);
 	g_object_unref (pkg->priv->groups);
+	if (pkg->priv->store_remote != NULL)
+		g_object_unref (pkg->priv->store_remote);
 
 	G_OBJECT_CLASS (zif_package_remote_parent_class)->finalize (object);
 }
@@ -185,7 +263,9 @@ static void
 zif_package_remote_class_init (ZifPackageRemoteClass *klass)
 {
 	GObjectClass *object_class = G_OBJECT_CLASS (klass);
+	ZifPackageClass *package_class = ZIF_PACKAGE_CLASS (klass);
 	object_class->finalize = zif_package_remote_finalize;
+	package_class->ensure_data = zif_package_remote_ensure_data;
 	g_type_class_add_private (klass, sizeof (ZifPackageRemotePrivate));
 }
 
@@ -197,6 +277,7 @@ zif_package_remote_init (ZifPackageRemote *pkg)
 {
 	pkg->priv = ZIF_PACKAGE_REMOTE_GET_PRIVATE (pkg);
 	pkg->priv->pkgid = NULL;
+	pkg->priv->store_remote = NULL;
 	pkg->priv->groups = zif_groups_new ();
 }
 
diff --git a/backends/yum/libzif/zif-package-remote.h b/backends/yum/libzif/zif-package-remote.h
index d29de69..02fab89 100644
--- a/backends/yum/libzif/zif-package-remote.h
+++ b/backends/yum/libzif/zif-package-remote.h
@@ -29,6 +29,7 @@
 #include <glib-object.h>
 
 #include "zif-package.h"
+#include "zif-store-remote.h"
 
 G_BEGIN_DECLS
 
@@ -63,6 +64,10 @@ gboolean		 zif_package_remote_set_from_repo	(ZifPackageRemote *pkg,
 								 const gchar	*repo_id,
 								 GError		**error);
 const gchar		*zif_package_remote_get_pkgid		(ZifPackageRemote *pkg);
+void			 zif_package_remote_set_pkgid		(ZifPackageRemote *pkg,
+								 const gchar	*pkgid);
+void			 zif_package_remote_set_store_remote	(ZifPackageRemote *pkg,
+								 ZifStoreRemote	*store);
 
 G_END_DECLS
 
diff --git a/backends/yum/libzif/zif-package.c b/backends/yum/libzif/zif-package.c
index 5621a1a..d0795ec 100644
--- a/backends/yum/libzif/zif-package.c
+++ b/backends/yum/libzif/zif-package.c
@@ -466,27 +466,32 @@ zif_package_is_devel (ZifPackage *package)
 gboolean
 zif_package_is_gui (ZifPackage *package)
 {
+	gboolean ret = FALSE;
 	guint i;
 	const ZifDepend *depend;
 	GPtrArray *array;
+	ZifCompletion *completion_tmp;
 
 	g_return_val_if_fail (ZIF_IS_PACKAGE (package), FALSE);
 	g_return_val_if_fail (package->priv->package_id_split != NULL, FALSE);
 
 	/* get list of requires */
-	array = zif_package_get_requires (package, NULL);
+	completion_tmp = zif_completion_new ();
+	array = zif_package_get_requires (package, NULL, completion_tmp, NULL);
 	if (array == NULL)
 		goto out;
 	for (i=0; i<array->len; i++) {
 		depend = g_ptr_array_index (array, i);
-		if (g_strstr_len (depend->name, -1, "gtk") != NULL)
-			return TRUE;
-		if (g_strstr_len (depend->name, -1, "kde") != NULL)
-			return TRUE;
+		if (g_strstr_len (depend->name, -1, "gtk") != NULL ||
+		    g_strstr_len (depend->name, -1, "kde") != NULL) {
+			ret = TRUE;
+			break;
+		}
 	}
 	g_ptr_array_unref (array);
 out:
-	return FALSE;
+	g_object_unref (completion_tmp);
+	return ret;
 }
 
 /**
@@ -686,7 +691,7 @@ zif_package_get_package_id (ZifPackage *package)
  *
  * Return value: The #ZifPackageEnsureType represented as a string
  **/
-static const gchar *
+const gchar *
 zif_package_ensure_type_to_string (ZifPackageEnsureType type)
 {
 	if (type == ZIF_PACKAGE_ENSURE_TYPE_FILES)
@@ -718,7 +723,8 @@ zif_package_ensure_type_to_string (ZifPackageEnsureType type)
  * zif_package_ensure_data:
  **/
 static gboolean
-zif_package_ensure_data (ZifPackage *package, ZifPackageEnsureType type, GError **error)
+zif_package_ensure_data (ZifPackage *package, ZifPackageEnsureType type,
+			 GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
 	gboolean ret = FALSE;
 	ZifPackageClass *klass = ZIF_PACKAGE_GET_CLASS (package);
@@ -733,7 +739,7 @@ zif_package_ensure_data (ZifPackage *package, ZifPackageEnsureType type, GError
 		goto out;
 	}
 
-	ret = klass->ensure_data (package, type, error);
+	ret = klass->ensure_data (package, type, cancellable, completion, error);
 out:
 	return ret;
 }
@@ -745,12 +751,12 @@ out:
  *
  * Gets the package summary.
  *
- * Return value: the reference counted #ZifString or %NULL, use zif_string_unref() when done
+ * Return value: the const string or %NULL
  *
  * Since: 0.0.1
  **/
-ZifString *
-zif_package_get_summary (ZifPackage *package, GError **error)
+const gchar *
+zif_package_get_summary (ZifPackage *package, GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
 	gboolean ret;
 
@@ -760,13 +766,13 @@ zif_package_get_summary (ZifPackage *package, GError **error)
 
 	/* not exists */
 	if (package->priv->summary == NULL) {
-		ret = zif_package_ensure_data (package, ZIF_PACKAGE_ENSURE_TYPE_SUMMARY, error);
+		ret = zif_package_ensure_data (package, ZIF_PACKAGE_ENSURE_TYPE_SUMMARY, cancellable, completion, error);
 		if (!ret)
 			return NULL;
 	}
 
-	/* return refcounted */
-	return zif_string_ref (package->priv->summary);
+	/* return const string */
+	return zif_string_get_value (package->priv->summary);
 }
 
 /**
@@ -776,12 +782,12 @@ zif_package_get_summary (ZifPackage *package, GError **error)
  *
  * Gets the package description.
  *
- * Return value: the reference counted #ZifString or %NULL, use zif_string_unref() when done
+ * Return value: the const string or %NULL
  *
  * Since: 0.0.1
  **/
-ZifString *
-zif_package_get_description (ZifPackage *package, GError **error)
+const gchar *
+zif_package_get_description (ZifPackage *package, GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
 	gboolean ret;
 
@@ -791,13 +797,13 @@ zif_package_get_description (ZifPackage *package, GError **error)
 
 	/* not exists */
 	if (package->priv->description == NULL) {
-		ret = zif_package_ensure_data (package, ZIF_PACKAGE_ENSURE_TYPE_DESCRIPTION, error);
+		ret = zif_package_ensure_data (package, ZIF_PACKAGE_ENSURE_TYPE_DESCRIPTION, cancellable, completion, error);
 		if (!ret)
 			return NULL;
 	}
 
-	/* return refcounted */
-	return zif_string_ref (package->priv->description);
+	/* return const string */
+	return zif_string_get_value (package->priv->description);
 }
 
 /**
@@ -807,12 +813,12 @@ zif_package_get_description (ZifPackage *package, GError **error)
  *
  * Gets the package licence.
  *
- * Return value: the reference counted #ZifString or %NULL, use zif_string_unref() when done
+ * Return value: the const string or %NULL
  *
  * Since: 0.0.1
  **/
-ZifString *
-zif_package_get_license (ZifPackage *package, GError **error)
+const gchar *
+zif_package_get_license (ZifPackage *package, GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
 	gboolean ret;
 
@@ -822,13 +828,13 @@ zif_package_get_license (ZifPackage *package, GError **error)
 
 	/* not exists */
 	if (package->priv->license == NULL) {
-		ret = zif_package_ensure_data (package, ZIF_PACKAGE_ENSURE_TYPE_LICENCE, error);
+		ret = zif_package_ensure_data (package, ZIF_PACKAGE_ENSURE_TYPE_LICENCE, cancellable, completion, error);
 		if (!ret)
 			return NULL;
 	}
 
-	/* return refcounted */
-	return zif_string_ref (package->priv->license);
+	/* return const string */
+	return zif_string_get_value (package->priv->license);
 }
 
 /**
@@ -838,12 +844,12 @@ zif_package_get_license (ZifPackage *package, GError **error)
  *
  * Gets the homepage URL for the package.
  *
- * Return value: the reference counted #ZifString or %NULL, use zif_string_unref() when done
+ * Return value: the const string or %NULL
  *
  * Since: 0.0.1
  **/
-ZifString *
-zif_package_get_url (ZifPackage *package, GError **error)
+const gchar *
+zif_package_get_url (ZifPackage *package, GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
 	gboolean ret;
 
@@ -853,13 +859,13 @@ zif_package_get_url (ZifPackage *package, GError **error)
 
 	/* not exists */
 	if (package->priv->url == NULL) {
-		ret = zif_package_ensure_data (package, ZIF_PACKAGE_ENSURE_TYPE_URL, error);
+		ret = zif_package_ensure_data (package, ZIF_PACKAGE_ENSURE_TYPE_URL, cancellable, completion, error);
 		if (!ret)
 			return NULL;
 	}
 
-	/* return refcounted */
-	return zif_string_ref (package->priv->url);
+	/* return const string */
+	return zif_string_get_value (package->priv->url);
 }
 
 /**
@@ -869,12 +875,12 @@ zif_package_get_url (ZifPackage *package, GError **error)
  *
  * Gets the remote filename for the package, e.g. Packages/net-snmp-5.4.2-3.fc10.i386.rpm
  *
- * Return value: the reference counted #ZifString or %NULL, use zif_string_unref() when done
+ * Return value: the const string or %NULL
  *
  * Since: 0.0.1
  **/
-ZifString *
-zif_package_get_filename (ZifPackage *package, GError **error)
+const gchar *
+zif_package_get_filename (ZifPackage *package, GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
 	g_return_val_if_fail (ZIF_IS_PACKAGE (package), NULL);
 	g_return_val_if_fail (package->priv->package_id_split != NULL, NULL);
@@ -894,8 +900,8 @@ zif_package_get_filename (ZifPackage *package, GError **error)
 		return NULL;
 	}
 
-	/* return refcounted */
-	return zif_string_ref (package->priv->location_href);
+	/* return const string */
+	return zif_string_get_value (package->priv->location_href);
 }
 
 /**
@@ -905,12 +911,12 @@ zif_package_get_filename (ZifPackage *package, GError **error)
  *
  * Gets the category the packag is in.
  *
- * Return value: the reference counted #ZifString or %NULL, use zif_string_unref() when done
+ * Return value: the const string or %NULL
  *
  * Since: 0.0.1
  **/
-ZifString *
-zif_package_get_category (ZifPackage *package, GError **error)
+const gchar *
+zif_package_get_category (ZifPackage *package, GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
 	gboolean ret;
 
@@ -920,13 +926,13 @@ zif_package_get_category (ZifPackage *package, GError **error)
 
 	/* not exists */
 	if (package->priv->category == NULL) {
-		ret = zif_package_ensure_data (package, ZIF_PACKAGE_ENSURE_TYPE_CATEGORY, error);
+		ret = zif_package_ensure_data (package, ZIF_PACKAGE_ENSURE_TYPE_CATEGORY, cancellable, completion, error);
 		if (!ret)
 			return NULL;
 	}
 
-	/* return refcounted */
-	return zif_string_ref (package->priv->category);
+	/* return const string */
+	return zif_string_get_value (package->priv->category);
 }
 
 /**
@@ -941,7 +947,7 @@ zif_package_get_category (ZifPackage *package, GError **error)
  * Since: 0.0.1
  **/
 PkGroupEnum
-zif_package_get_group (ZifPackage *package, GError **error)
+zif_package_get_group (ZifPackage *package, GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
 	gboolean ret;
 
@@ -950,7 +956,7 @@ zif_package_get_group (ZifPackage *package, GError **error)
 
 	/* not exists */
 	if (package->priv->group == PK_GROUP_ENUM_UNKNOWN) {
-		ret = zif_package_ensure_data (package, ZIF_PACKAGE_ENSURE_TYPE_GROUP, error);
+		ret = zif_package_ensure_data (package, ZIF_PACKAGE_ENSURE_TYPE_GROUP, cancellable, completion, error);
 		if (!ret)
 			return PK_GROUP_ENUM_UNKNOWN;
 	}
@@ -974,7 +980,7 @@ zif_package_get_group (ZifPackage *package, GError **error)
  * Since: 0.0.1
  **/
 guint64
-zif_package_get_size (ZifPackage *package, GError **error)
+zif_package_get_size (ZifPackage *package, GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
 	gboolean ret;
 
@@ -982,7 +988,7 @@ zif_package_get_size (ZifPackage *package, GError **error)
 	g_return_val_if_fail (error == NULL || *error == NULL, 0);
 
 	if (package->priv->size == 0) {
-		ret = zif_package_ensure_data (package, ZIF_PACKAGE_ENSURE_TYPE_SIZE, error);
+		ret = zif_package_ensure_data (package, ZIF_PACKAGE_ENSURE_TYPE_SIZE, cancellable, completion, error);
 		if (!ret)
 			return 0;
 	}
@@ -1004,7 +1010,7 @@ zif_package_get_size (ZifPackage *package, GError **error)
  * Since: 0.0.1
  **/
 GPtrArray *
-zif_package_get_files (ZifPackage *package, GError **error)
+zif_package_get_files (ZifPackage *package, GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
 	gboolean ret;
 
@@ -1013,7 +1019,7 @@ zif_package_get_files (ZifPackage *package, GError **error)
 
 	/* not exists */
 	if (package->priv->files == NULL) {
-		ret = zif_package_ensure_data (package, ZIF_PACKAGE_ENSURE_TYPE_FILES, error);
+		ret = zif_package_ensure_data (package, ZIF_PACKAGE_ENSURE_TYPE_FILES, cancellable, completion, error);
 		if (!ret)
 			return NULL;
 	}
@@ -1034,7 +1040,7 @@ zif_package_get_files (ZifPackage *package, GError **error)
  * Since: 0.0.1
  **/
 GPtrArray *
-zif_package_get_requires (ZifPackage *package, GError **error)
+zif_package_get_requires (ZifPackage *package, GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
 	gboolean ret;
 
@@ -1044,7 +1050,7 @@ zif_package_get_requires (ZifPackage *package, GError **error)
 
 	/* not exists */
 	if (package->priv->requires == NULL) {
-		ret = zif_package_ensure_data (package, ZIF_PACKAGE_ENSURE_TYPE_REQUIRES, error);
+		ret = zif_package_ensure_data (package, ZIF_PACKAGE_ENSURE_TYPE_REQUIRES, cancellable, completion, error);
 		if (!ret)
 			return NULL;
 	}
@@ -1065,7 +1071,7 @@ zif_package_get_requires (ZifPackage *package, GError **error)
  * Since: 0.0.1
  **/
 GPtrArray *
-zif_package_get_provides (ZifPackage *package, GError **error)
+zif_package_get_provides (ZifPackage *package, GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
 	gboolean ret;
 
@@ -1075,7 +1081,7 @@ zif_package_get_provides (ZifPackage *package, GError **error)
 
 	/* not exists */
 	if (package->priv->provides == NULL) {
-		ret = zif_package_ensure_data (package, ZIF_PACKAGE_ENSURE_TYPE_PROVIDES, error);
+		ret = zif_package_ensure_data (package, ZIF_PACKAGE_ENSURE_TYPE_PROVIDES, cancellable, completion, error);
 		if (!ret)
 			return NULL;
 	}
diff --git a/backends/yum/libzif/zif-package.h b/backends/yum/libzif/zif-package.h
index c958365..bd5ef2f 100644
--- a/backends/yum/libzif/zif-package.h
+++ b/backends/yum/libzif/zif-package.h
@@ -78,6 +78,8 @@ struct _ZifPackageClass
 	/* vtable */
 	gboolean	 (*ensure_data)			(ZifPackage	*package,
 							 ZifPackageEnsureType type,
+							 GCancellable	*cancellable,
+							 ZifCompletion	*completion,
 							 GError		**error);
 };
 
@@ -93,27 +95,49 @@ ZifPackage		*zif_package_new		(void);
 /* public getters */
 const gchar		*zif_package_get_id		(ZifPackage	*package);
 const gchar		*zif_package_get_name		(ZifPackage	*package);
-ZifString		*zif_package_get_summary	(ZifPackage	*package,
+const gchar		*zif_package_get_summary	(ZifPackage	*package,
+							 GCancellable	*cancellable,
+							 ZifCompletion	*completion,
 							 GError		**error);
-ZifString		*zif_package_get_description	(ZifPackage	*package,
+const gchar		*zif_package_get_description	(ZifPackage	*package,
+							 GCancellable	*cancellable,
+							 ZifCompletion	*completion,
 							 GError		**error);
-ZifString		*zif_package_get_license	(ZifPackage	*package,
+const gchar		*zif_package_get_license	(ZifPackage	*package,
+							 GCancellable	*cancellable,
+							 ZifCompletion	*completion,
 							 GError		**error);
-ZifString		*zif_package_get_url		(ZifPackage	*package,
+const gchar		*zif_package_get_url		(ZifPackage	*package,
+							 GCancellable	*cancellable,
+							 ZifCompletion	*completion,
 							 GError		**error);
-ZifString		*zif_package_get_filename	(ZifPackage	*package,
+const gchar		*zif_package_get_filename	(ZifPackage	*package,
+							 GCancellable	*cancellable,
+							 ZifCompletion	*completion,
 							 GError		**error);
-ZifString		*zif_package_get_category	(ZifPackage	*package,
+const gchar		*zif_package_get_category	(ZifPackage	*package,
+							 GCancellable	*cancellable,
+							 ZifCompletion	*completion,
 							 GError		**error);
 PkGroupEnum		 zif_package_get_group		(ZifPackage	*package,
+							 GCancellable	*cancellable,
+							 ZifCompletion	*completion,
 							 GError		**error);
 guint64			 zif_package_get_size		(ZifPackage	*package,
+							 GCancellable	*cancellable,
+							 ZifCompletion	*completion,
 							 GError		**error);
 GPtrArray		*zif_package_get_files		(ZifPackage	*package,
+							 GCancellable	*cancellable,
+							 ZifCompletion	*completion,
 							 GError		**error);
 GPtrArray		*zif_package_get_requires	(ZifPackage	*package,
+							 GCancellable	*cancellable,
+							 ZifCompletion	*completion,
 							 GError		**error);
 GPtrArray		*zif_package_get_provides	(ZifPackage	*package,
+							 GCancellable	*cancellable,
+							 ZifCompletion	*completion,
 							 GError		**error);
 
 /* internal setters: TODO, in seporate -internal header file */
@@ -165,6 +189,7 @@ gint			 zif_package_compare		(ZifPackage	*a,
 ZifPackage		*zif_package_array_get_newest	(GPtrArray	*array,
 							 GError		**error);
 gboolean		 zif_package_array_filter_newest (GPtrArray	*packages);
+const gchar		*zif_package_ensure_type_to_string (ZifPackageEnsureType type);
 
 G_END_DECLS
 
diff --git a/backends/yum/libzif/zif-store-array.c b/backends/yum/libzif/zif-store-array.c
index d3867fd..6542b91 100644
--- a/backends/yum/libzif/zif-store-array.c
+++ b/backends/yum/libzif/zif-store-array.c
@@ -275,6 +275,7 @@ zif_store_array_repos_search (GPtrArray *store_array, PkRoleEnum role, gchar **s
 			/* do we need to skip this error */
 			if (error_cb != NULL && error_cb (store_array, error_local, user_data)) {
 				g_clear_error (&error_local);
+				zif_completion_finished (completion_local);
 				goto skip_error;
 			}
 			g_set_error (error, ZIF_STORE_ERROR, ZIF_STORE_ERROR_FAILED,
@@ -318,6 +319,7 @@ zif_store_array_find_package (GPtrArray *store_array, const gchar *package_id, G
 	guint i;
 	ZifStore *store;
 	ZifPackage *package = NULL;
+	GError *error_local = NULL;
 	ZifCompletion *completion_local = NULL;
 
 	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
@@ -337,9 +339,23 @@ zif_store_array_find_package (GPtrArray *store_array, const gchar *package_id, G
 		store = g_ptr_array_index (store_array, i);
 
 		completion_local = zif_completion_get_child (completion);
-		package = zif_store_find_package (store, package_id, cancellable, completion_local, NULL);
-		if (package != NULL)
+		package = zif_store_find_package (store, package_id, cancellable, completion_local, &error_local);
+
+		/* get results */
+		if (package == NULL) {
+			if (error_local->code == ZIF_STORE_ERROR_FAILED_TO_FIND) {
+				/* do not abort */
+				g_clear_error (&error_local);
+				zif_completion_finished (completion_local);
+			} else {
+				g_set_error (error, 1, 0, "failed to find package: %s", error_local->message);
+				g_error_free (error_local);
+				goto out;
+			}
+		} else {
+			zif_completion_finished (completion);
 			break;
+		}
 
 		/* this section done */
 		zif_completion_done (completion);
@@ -404,6 +420,7 @@ zif_store_array_clean (GPtrArray *store_array,
 			if (error_cb != NULL && error_cb (store_array, error_local, user_data)) {
 				ret = TRUE;
 				g_clear_error (&error_local);
+				zif_completion_finished (completion_local);
 				goto skip_error;
 			}
 			g_set_error (error, ZIF_STORE_ERROR, ZIF_STORE_ERROR_FAILED,
@@ -469,6 +486,7 @@ zif_store_array_refresh (GPtrArray *store_array, gboolean force,
 			if (error_cb != NULL && error_cb (store_array, error_local, user_data)) {
 				ret = TRUE;
 				g_clear_error (&error_local);
+				zif_completion_finished (completion_local);
 				goto skip_error;
 			}
 			g_set_error (error, ZIF_STORE_ERROR, ZIF_STORE_ERROR_FAILED,
diff --git a/backends/yum/libzif/zif-store-local.c b/backends/yum/libzif/zif-store-local.c
index 0c830c0..4dbc3a5 100644
--- a/backends/yum/libzif/zif-store-local.c
+++ b/backends/yum/libzif/zif-store-local.c
@@ -284,10 +284,11 @@ zif_store_local_search_category (ZifStore *store, gchar **search, GCancellable *
 	guint i, j;
 	GPtrArray *array = NULL;
 	ZifPackage *package;
-	ZifString *category;
+	const gchar *category;
 	GError *error_local = NULL;
 	gboolean ret;
 	ZifCompletion *completion_local = NULL;
+	ZifCompletion *completion_loop = NULL;
 	ZifStoreLocal *local = ZIF_STORE_LOCAL (store);
 
 	g_return_val_if_fail (ZIF_IS_STORE_LOCAL (store), NULL);
@@ -338,14 +339,14 @@ zif_store_local_search_category (ZifStore *store, gchar **search, GCancellable *
 	array = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
 	for (i=0;i<local->priv->packages->len;i++) {
 		package = g_ptr_array_index (local->priv->packages, i);
-		category = zif_package_get_category (package, NULL);
+		completion_loop = zif_completion_get_child (completion_local);
+		category = zif_package_get_category (package, cancellable, completion_loop, NULL);
 		for (j=0; search[j] != NULL; j++) {
-			if (g_strcmp0 (zif_string_get_value (category), search[j]) == 0) {
+			if (g_strcmp0 (category, search[j]) == 0) {
 				g_ptr_array_add (array, g_object_ref (package));
 				break;
 			}
 		}
-		zif_string_unref (category);
 
 		/* this section done */
 		zif_completion_done (completion_local);
@@ -367,11 +368,12 @@ zif_store_local_search_details (ZifStore *store, gchar **search, GCancellable *c
 	GPtrArray *array = NULL;
 	ZifPackage *package;
 	const gchar *package_id;
-	ZifString *description;
+	const gchar *description;
 	gchar **split;
 	GError *error_local = NULL;
 	gboolean ret;
 	ZifCompletion *completion_local = NULL;
+	ZifCompletion *completion_loop = NULL;
 	ZifStoreLocal *local = ZIF_STORE_LOCAL (store);
 
 	g_return_val_if_fail (ZIF_IS_STORE_LOCAL (store), NULL);
@@ -423,18 +425,18 @@ zif_store_local_search_details (ZifStore *store, gchar **search, GCancellable *c
 	for (i=0;i<local->priv->packages->len;i++) {
 		package = g_ptr_array_index (local->priv->packages, i);
 		package_id = zif_package_get_id (package);
-		description = zif_package_get_description (package, NULL);
+		completion_loop = zif_completion_get_child (completion_local);
+		description = zif_package_get_description (package, cancellable, completion_loop, NULL);
 		split = pk_package_id_split (package_id);
 		for (j=0; search[j] != NULL; j++) {
 			if (strcasestr (split[PK_PACKAGE_ID_NAME], search[j]) != NULL) {
 				g_ptr_array_add (array, g_object_ref (package));
 				break;
-			} else if (strcasestr (zif_string_get_value (description), search[j]) != NULL) {
+			} else if (strcasestr (description, search[j]) != NULL) {
 				g_ptr_array_add (array, g_object_ref (package));
 				break;
 			}
 		}
-		zif_string_unref (description);
 		g_strfreev (split);
 
 		/* this section done */
@@ -461,6 +463,7 @@ zif_store_local_search_group (ZifStore *store, gchar **search, GCancellable *can
 	gboolean ret;
 	PkGroupEnum group;
 	ZifCompletion *completion_local = NULL;
+	ZifCompletion *completion_loop = NULL;
 	ZifStoreLocal *local = ZIF_STORE_LOCAL (store);
 
 	g_return_val_if_fail (ZIF_IS_STORE_LOCAL (store), NULL);
@@ -512,7 +515,8 @@ zif_store_local_search_group (ZifStore *store, gchar **search, GCancellable *can
 		package = g_ptr_array_index (local->priv->packages, i);
 		for (j=0; search[j] != NULL; j++) {
 			group = pk_group_enum_from_text (search[j]);
-			group_tmp = zif_package_get_group (package, NULL);
+			completion_loop = zif_completion_get_child (completion_local);
+			group_tmp = zif_package_get_group (package, cancellable, completion_loop, NULL);
 			if (group == group_tmp) {
 				g_ptr_array_add (array, g_object_ref (package));
 				break;
@@ -543,6 +547,7 @@ zif_store_local_search_file (ZifStore *store, gchar **search, GCancellable *canc
 	const gchar *filename;
 	gboolean ret;
 	ZifCompletion *completion_local = NULL;
+	ZifCompletion *completion_loop = NULL;
 	ZifStoreLocal *local = ZIF_STORE_LOCAL (store);
 
 	g_return_val_if_fail (ZIF_IS_STORE_LOCAL (store), NULL);
@@ -592,7 +597,8 @@ zif_store_local_search_file (ZifStore *store, gchar **search, GCancellable *canc
 	array = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
 	for (i=0;i<local->priv->packages->len;i++) {
 		package = g_ptr_array_index (local->priv->packages, i);
-		files = zif_package_get_files (package, &error_local);
+		completion_loop = zif_completion_get_child (completion_local);
+		files = zif_package_get_files (package, cancellable, completion_loop, &error_local);
 		if (files == NULL) {
 			g_set_error (error, ZIF_STORE_ERROR, ZIF_STORE_ERROR_FAILED,
 				     "failed to get file lists: %s", error_local->message);
@@ -718,6 +724,7 @@ zif_store_local_what_provides (ZifStore *store, gchar **search, GCancellable *ca
 	gboolean ret;
 	const ZifDepend *provide;
 	ZifCompletion *completion_local = NULL;
+	ZifCompletion *completion_loop = NULL;
 	ZifStoreLocal *local = ZIF_STORE_LOCAL (store);
 
 	g_return_val_if_fail (ZIF_IS_STORE_LOCAL (store), NULL);
@@ -768,7 +775,8 @@ zif_store_local_what_provides (ZifStore *store, gchar **search, GCancellable *ca
 	array = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
 	for (i=0;i<local->priv->packages->len;i++) {
 		package = g_ptr_array_index (local->priv->packages, i);
-		provides = zif_package_get_provides (package, NULL);
+		completion_loop = zif_completion_get_child (completion_local);
+		provides = zif_package_get_provides (package, cancellable, completion_loop, NULL);
 		for (j=0; j<provides->len; j++) {
 			provide = g_ptr_array_index (provides, j);
 			for (k=0; search[k] != NULL; k++) {
@@ -874,7 +882,6 @@ zif_store_local_find_package (ZifStore *store, const gchar *package_id, GCancell
 	ZifPackage *package_tmp = NULL;
 	GError *error_local = NULL;
 	gboolean ret;
-	guint jump;
 	const gchar *package_id_tmp;
 	ZifCompletion *completion_local = NULL;
 	ZifStoreLocal *local = ZIF_STORE_LOCAL (store);
@@ -921,10 +928,8 @@ zif_store_local_find_package (ZifStore *store, const gchar *package_id, GCancell
 	/* setup completion with the correct number of steps */
 	completion_local = zif_completion_get_child (completion);
 
-	/* we only do a few jumps as there could be thousands of packages, and
-	 * this makes up an inner loop of possibly deep notifications */
-	jump = local->priv->packages->len / 10;
-	zif_completion_set_number_steps (completion_local, jump);
+	/* setup completion */
+	zif_completion_set_number_steps (completion_local, local->priv->packages->len);
 
 	/* iterate list */
 	array = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
@@ -935,8 +940,7 @@ zif_store_local_find_package (ZifStore *store, const gchar *package_id, GCancell
 			g_ptr_array_add (array, g_object_ref (package_tmp));
 
 		/* this section done */
-		if (i % jump == 0)
-			zif_completion_done (completion_local);
+		zif_completion_done (completion_local);
 	}
 
 	/* nothing */
@@ -1111,9 +1115,10 @@ zif_store_local_test (EggTest *test)
 	GError *error = NULL;
 	guint elapsed;
 	const gchar *text;
-	ZifString *string;
+	const gchar *string;
 	const gchar *package_id;
 	gchar **split;
+	const gchar *to_array[] = { NULL, NULL };
 
 	if (!egg_test_start (test, "ZifStoreLocal"))
 		return;
@@ -1190,7 +1195,8 @@ zif_store_local_test (EggTest *test)
 	/************************************************************/
 	egg_test_title (test, "resolve");
 	zif_completion_reset (completion);
-	array = zif_store_local_resolve (ZIF_STORE (store), "kernel", NULL, completion, NULL);
+	to_array[0] = "kernel";
+	array = zif_store_local_resolve (ZIF_STORE (store), (gchar**)to_array, NULL, completion, NULL);
 	elapsed = egg_test_elapsed (test);
 	if (array->len >= 1)
 		egg_test_success (test, NULL);
@@ -1208,7 +1214,8 @@ zif_store_local_test (EggTest *test)
 	/************************************************************/
 	egg_test_title (test, "search name");
 	zif_completion_reset (completion);
-	array = zif_store_local_search_name (ZIF_STORE (store), "gnome-p", NULL, completion, NULL);
+	to_array[0] = "gnome-p";
+	array = zif_store_local_search_name (ZIF_STORE (store), (gchar**)to_array, NULL, completion, NULL);
 	if (array->len > 10)
 		egg_test_success (test, NULL);
 	else
@@ -1218,7 +1225,8 @@ zif_store_local_test (EggTest *test)
 	/************************************************************/
 	egg_test_title (test, "search details");
 	zif_completion_reset (completion);
-	array = zif_store_local_search_details (ZIF_STORE (store), "manage packages", NULL, completion, NULL);
+	to_array[0] = "manage packages";
+	array = zif_store_local_search_details (ZIF_STORE (store), (gchar**)to_array, NULL, completion, NULL);
 	if (array->len == 1)
 		egg_test_success (test, NULL);
 	else
@@ -1228,7 +1236,8 @@ zif_store_local_test (EggTest *test)
 	/************************************************************/
 	egg_test_title (test, "what-provides");
 	zif_completion_reset (completion);
-	array = zif_store_local_what_provides (ZIF_STORE (store), "config(PackageKit)", NULL, completion, NULL);
+	to_array[0] = "config(PackageKit)";
+	array = zif_store_local_what_provides (ZIF_STORE (store), (gchar**)to_array, NULL, completion, NULL);
 	if (array->len == 1)
 		egg_test_success (test, NULL);
 	else
@@ -1257,30 +1266,30 @@ zif_store_local_test (EggTest *test)
 
 	/************************************************************/
 	egg_test_title (test, "get summary");
-	string = zif_package_get_summary (package, NULL);
-	if (g_strcmp0 (zif_string_get_value(string), "Package management service") == 0)
+	zif_completion_reset (completion);
+	string = zif_package_get_summary (package, NULL, completion, NULL);
+	if (g_strcmp0 (string, "Package management service") == 0)
 		egg_test_success (test, NULL);
 	else
-		egg_test_failed (test, "incorrect summary: %s", zif_string_get_value (string));
-	zif_string_unref (string);
+		egg_test_failed (test, "incorrect summary: %s", string);
 
 	/************************************************************/
 	egg_test_title (test, "get license");
-	string = zif_package_get_license (package, NULL);
-	if (g_strcmp0 (zif_string_get_value(string), "GPLv2+") == 0)
+	zif_completion_reset (completion);
+	string = zif_package_get_license (package, NULL, completion, NULL);
+	if (g_strcmp0 (string, "GPLv2+") == 0)
 		egg_test_success (test, NULL);
 	else
-		egg_test_failed (test, "incorrect license: %s", zif_string_get_value (string));
-	zif_string_unref (string);
+		egg_test_failed (test, "incorrect license: %s", string);
 
 	/************************************************************/
 	egg_test_title (test, "get category");
-	string = zif_package_get_category (package, NULL);
-	if (g_strcmp0 (zif_string_get_value(string), "System Environment/Libraries") == 0)
+	zif_completion_reset (completion);
+	string = zif_package_get_category (package, NULL, completion, NULL);
+	if (g_strcmp0 (string, "System Environment/Libraries") == 0)
 		egg_test_success (test, NULL);
 	else
-		egg_test_failed (test, "incorrect category: %s", zif_string_get_value (string));
-	zif_string_unref (string);
+		egg_test_failed (test, "incorrect category: %s", string);
 
 	/************************************************************/
 	egg_test_title (test, "is devel");
@@ -1290,7 +1299,7 @@ zif_store_local_test (EggTest *test)
 	/************************************************************/
 	egg_test_title (test, "is gui");
 	ret = zif_package_is_gui (package);
-	egg_test_assert (test, ret);
+	egg_test_assert (test, !ret);
 
 	/************************************************************/
 	egg_test_title (test, "is installed");
diff --git a/backends/yum/libzif/zif-store-remote.c b/backends/yum/libzif/zif-store-remote.c
index ba60afa..313573d 100644
--- a/backends/yum/libzif/zif-store-remote.c
+++ b/backends/yum/libzif/zif-store-remote.c
@@ -1563,7 +1563,14 @@ zif_store_remote_set_enabled (ZifStoreRemote *store, gboolean enabled, GError **
 	g_key_file_set_boolean (file, store->priv->id, "enabled", store->priv->enabled);
 
 	/* save new data to file */
-	data = g_key_file_to_data (file, NULL, NULL);
+	data = g_key_file_to_data (file, NULL, &error_local);
+	if (data == NULL) {
+		ret = FALSE;
+		g_set_error (error, ZIF_STORE_ERROR, ZIF_STORE_ERROR_FAILED,
+			     "failed to get save data: %s", error_local->message);
+		g_error_free (error_local);
+		goto out;
+	}
 	ret = g_file_set_contents (store->priv->repo_filename, data, -1, &error_local);
 	if (!ret) {
 		g_set_error (error, ZIF_STORE_ERROR, ZIF_STORE_ERROR_FAILED,
@@ -1888,6 +1895,7 @@ zif_store_remote_search_category (ZifStore *store, gchar **group_id, GCancellabl
 	if (location == NULL) {
 		/* empty array, as we want success */
 		array = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
+		zif_completion_finished (completion);
 		goto out;
 	}
 
@@ -1900,6 +1908,7 @@ zif_store_remote_search_category (ZifStore *store, gchar **group_id, GCancellabl
 		if (g_str_has_prefix (error_local->message, "could not find group")) {
 			array = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
 			g_error_free (error_local);
+			zif_completion_finished (completion);
 			goto out;
 		}
 		g_set_error (error, ZIF_STORE_ERROR, ZIF_STORE_ERROR_FAILED,
@@ -2717,6 +2726,22 @@ out:
 }
 
 /**
+ * zif_store_remote_get_files:
+ **/
+GPtrArray *
+zif_store_remote_get_files (ZifStoreRemote *store, ZifPackage *package,
+			    GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	ZifMd *filelists;
+
+	g_return_val_if_fail (ZIF_IS_STORE_REMOTE (store), NULL);
+	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+	filelists = zif_store_remote_get_filelists (store);
+	return zif_md_get_files (filelists, package, cancellable, completion, error);
+}
+
+/**
  * zif_store_remote_file_monitor_cb:
  **/
 static void
@@ -3179,7 +3204,8 @@ zif_store_remote_test (EggTest *test)
 	/************************************************************/
 	egg_test_title (test, "search category");
 	zif_completion_reset (completion);
-	array = zif_store_remote_search_category (ZIF_STORE (store), "admin-tools", NULL, completion, &error);
+	in_array[0] = "admin-tools";
+	array = zif_store_remote_search_category (ZIF_STORE (store), (gchar**)in_array, NULL, completion, &error);
 	if (array == NULL)
 		egg_test_failed (test, "no data: %s", error->message);
 	else if (array->len > 0)
diff --git a/backends/yum/libzif/zif-store-remote.h b/backends/yum/libzif/zif-store-remote.h
index e6d95de..67ad327 100644
--- a/backends/yum/libzif/zif-store-remote.h
+++ b/backends/yum/libzif/zif-store-remote.h
@@ -73,6 +73,11 @@ const gchar	*zif_store_remote_get_name		(ZifStoreRemote		*store,
 							 GCancellable		*cancellable,
 							 ZifCompletion		*completion,
 							 GError			**error);
+GPtrArray	*zif_store_remote_get_files		(ZifStoreRemote		*store,
+							 ZifPackage		*package,
+							 GCancellable		*cancellable,
+							 ZifCompletion		*completion,
+							 GError			**error);
 gboolean	 zif_store_remote_get_enabled		(ZifStoreRemote		*store,
 							 GCancellable		*cancellable,
 							 ZifCompletion		*completion,
diff --git a/backends/yum/pk-backend-yum.c b/backends/yum/pk-backend-yum.c
index 7cd488c..24c35a1 100644
--- a/backends/yum/pk-backend-yum.c
+++ b/backends/yum/pk-backend-yum.c
@@ -349,14 +349,14 @@ backend_filter_package_array (GPtrArray *array, PkBitfield filters)
  * backend_emit_package_array:
  **/
 static gboolean
-backend_emit_package_array (PkBackend *backend, GPtrArray *array)
+backend_emit_package_array (PkBackend *backend, GPtrArray *array, ZifCompletion *completion)
 {
 	guint i;
 	gboolean installed;
 	PkInfoEnum info;
 	const gchar *info_hint;
 	const gchar *package_id;
-	ZifString *summary;
+	const gchar *summary;
 	ZifPackage *package;
 
 	g_return_val_if_fail (array != NULL, FALSE);
@@ -365,7 +365,10 @@ backend_emit_package_array (PkBackend *backend, GPtrArray *array)
 		package = g_ptr_array_index (array, i);
 		installed = zif_package_is_installed (package);
 		package_id = zif_package_get_package_id (package);
-		summary = zif_package_get_summary (package, NULL);
+
+		/* FIXME: should be okay as shouldn't be doing any action */
+		zif_completion_reset (completion);
+		summary = zif_package_get_summary (package, priv->cancellable, completion, NULL);
 
 		/* 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");
@@ -375,8 +378,7 @@ backend_emit_package_array (PkBackend *backend, GPtrArray *array)
 			info = pk_info_enum_from_string (info_hint);
 		}
 
-		pk_backend_package (backend, info, package_id, zif_string_get_value (summary));
-		zif_string_unref (summary);
+		pk_backend_package (backend, info, package_id, summary);
 	}
 	return TRUE;
 }
@@ -462,7 +464,7 @@ backend_search_thread (PkBackend *backend)
 
 	/* setup completion */
 	zif_completion_reset (priv->completion);
-	zif_completion_set_number_steps (priv->completion, 3);
+	zif_completion_set_number_steps (priv->completion, 4);
 
 	/* get default store_array */
 	completion_local = zif_completion_get_child (priv->completion);
@@ -548,7 +550,11 @@ backend_search_thread (PkBackend *backend)
 	pk_backend_set_percentage (backend, 100);
 
 	/* emit */
-	backend_emit_package_array (backend, result);
+	completion_local = zif_completion_get_child (priv->completion);
+	backend_emit_package_array (backend, result, completion_local);
+
+	/* this section done */
+	zif_completion_done (priv->completion);
 out:
 	if (store_array != NULL)
 		g_ptr_array_unref (store_array);
@@ -870,7 +876,7 @@ backend_download_packages_thread (PkBackend *backend)
 	guint len;
 	gboolean ret;
 	GError *error = NULL;
-	ZifString *filename;
+	const gchar *filename;
 	gchar *basename;
 	gchar *path;
 
@@ -887,7 +893,7 @@ backend_download_packages_thread (PkBackend *backend)
 	/* setup completion */
 	zif_completion_reset (priv->completion);
 	len = g_strv_length (package_ids);
-	zif_completion_set_number_steps (priv->completion, (len * 2) + 1);
+	zif_completion_set_number_steps (priv->completion, (len * 4) + 1);
 
 	/* find all the packages */
 	packages = g_ptr_array_new ();
@@ -920,13 +926,17 @@ backend_download_packages_thread (PkBackend *backend)
 		g_object_unref (package);
 	}
 
+	/* this section done */
+	zif_completion_done (priv->completion);
+
 	/* download list */
 	pk_backend_set_status (backend, PK_STATUS_ENUM_DOWNLOAD);
 	for (i=0; i<packages->len; i++) {
 		package = g_ptr_array_index (packages, i);
 
 		/* get filename */
-		filename = zif_package_get_filename (package, &error);
+		completion_local = zif_completion_get_child (priv->completion);
+		filename = zif_package_get_filename (package, priv->cancellable, completion_local, &error);
 		if (filename == NULL) {
 			pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_DOWNLOAD_FAILED,
 					       "failed to get filename for %s: %s", zif_package_get_id (package), error->message);
@@ -934,20 +944,23 @@ backend_download_packages_thread (PkBackend *backend)
 			goto out;
 		}
 
+		/* this section done */
+		zif_completion_done (priv->completion);
+
+		/* download */
+		completion_local = zif_completion_get_child (priv->completion);
 		ret = zif_package_download (package, directory, priv->cancellable, completion_local, &error);
 		if (!ret) {
 			pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_DOWNLOAD_FAILED,
-					       "failed to download %s: %s", zif_string_get_value (filename), error->message);
-			zif_string_unref (filename);
+					       "failed to download %s: %s", filename, error->message);
 			g_error_free (error);
 			goto out;
 		}
 
 		/* send a signal for the daemon so the file is copied */
-		basename = g_path_get_basename (zif_string_get_value (filename));
+		basename = g_path_get_basename (filename);
 		path = g_build_filename (directory, basename, NULL);
 		pk_backend_files (backend, zif_package_get_id (package), path);
-		zif_string_unref (filename);
 		g_free (basename);
 		g_free (path);
 
@@ -1009,13 +1022,14 @@ backend_get_details_thread (PkBackend *backend)
 	GPtrArray *store_array = NULL;
 	ZifPackage *package;
 	ZifCompletion *completion_local;
+	ZifCompletion *completion_loop;
 	const gchar *id;
 	guint i;
 	guint len;
 	GError *error = NULL;
-	ZifString *license;
-	ZifString *description;
-	ZifString *url;
+	const gchar *license;
+	const gchar *description;
+	const gchar *url;
 	PkGroupEnum group;
 	guint64 size;
 	PkBitfield filters = PK_FILTER_ENUM_UNKNOWN;
@@ -1053,37 +1067,71 @@ backend_get_details_thread (PkBackend *backend)
 	pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
 	for (i=0; package_ids[i] != NULL; i++) {
 		id = package_ids[i];
+
+		/* set up completion */
 		completion_local = zif_completion_get_child (priv->completion);
-		package = zif_store_array_find_package (store_array, id, priv->cancellable, completion_local, &error);
+		zif_completion_set_number_steps (completion_local, 6);
+
+		/* find package */
+		completion_loop = zif_completion_get_child (completion_local);
+		package = zif_store_array_find_package (store_array, id, priv->cancellable, completion_loop, &error);
 		if (package == NULL) {
 			pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_NOT_FOUND, "failed to find %s: %s", package_ids[i], error->message);
 			g_error_free (error);
 			goto out;
 		}
 
-		/* get data */
-		license = zif_package_get_license (package, NULL);
-		group = zif_package_get_group (package, NULL);
-		description = zif_package_get_description (package, NULL);
-		url = zif_package_get_url (package, NULL);
-		size = zif_package_get_size (package, NULL);
+		/* this section done */
+		zif_completion_done (completion_local);
+
+		/* get license */
+		completion_loop = zif_completion_get_child (completion_local);
+		license = zif_package_get_license (package, priv->cancellable, completion_loop, NULL);
+
+		/* this section done */
+		zif_completion_done (completion_local);
+
+		/* get group */
+		completion_loop = zif_completion_get_child (completion_local);
+		group = zif_package_get_group (package, priv->cancellable, completion_loop, NULL);
+
+		/* this section done */
+		zif_completion_done (completion_local);
+
+		/* get description */
+		completion_loop = zif_completion_get_child (completion_local);
+		description = zif_package_get_description (package, priv->cancellable, completion_loop, NULL);
+
+		/* this section done */
+		zif_completion_done (completion_local);
+
+		/* get url */
+		completion_loop = zif_completion_get_child (completion_local);
+		url = zif_package_get_url (package, priv->cancellable, completion_loop, NULL);
+
+		/* this section done */
+		zif_completion_done (completion_local);
+
+		/* get size */
+		completion_loop = zif_completion_get_child (completion_local);
+		size = zif_package_get_size (package, priv->cancellable, completion_loop, NULL);
+
+		/* this section done */
+		zif_completion_done (completion_local);
 
 		/* emit */
 		pk_backend_details (backend,
 				    package_ids[i],
-				    zif_string_get_value (license),
+				    license,
 				    group,
-				    zif_string_get_value (description),
-				    zif_string_get_value (url),
+				    description,
+				    url,
 				    (gulong) size);
 
 		/* this section done */
 		zif_completion_done (priv->completion);
 
 		/* free */
-		zif_string_unref (license);
-		zif_string_unref (description);
-		zif_string_unref (url);
 		g_object_unref (package);
 	}
 out:
@@ -1272,7 +1320,7 @@ backend_get_files_thread (PkBackend *backend)
 
 	/* setup completion */
 	zif_completion_reset (priv->completion);
-	zif_completion_set_number_steps (priv->completion, len + 1);
+	zif_completion_set_number_steps (priv->completion, (len * 2) + 1);
 
 	/* find all the packages */
 	completion_local = zif_completion_get_child (priv->completion);
@@ -1305,7 +1353,12 @@ backend_get_files_thread (PkBackend *backend)
 		/* profile */
 		backend_profile ("find package");
 
-		files = zif_package_get_files (package, &error);
+		/* this section done */
+		zif_completion_done (priv->completion);
+
+		/* get files */
+		completion_local = zif_completion_get_child (priv->completion);
+		files = zif_package_get_files (package, priv->cancellable, completion_local, &error);
 		if (files == NULL) {
 			pk_backend_error_code (backend, PK_ERROR_ENUM_INTERNAL_ERROR, "no files for %s: %s", package_ids[i], error->message);
 			g_error_free (error);
@@ -1486,6 +1539,7 @@ backend_get_updates_thread (PkBackend *backend)
 		if (update == NULL) {
 			egg_debug ("failed to get updateinfo for %s", zif_package_get_id (package));
 			g_clear_error (&error);
+			zif_completion_finished (completion_loop);
 			info = PK_INFO_ENUM_NORMAL;
 		} else {
 			info = zif_update_get_kind (update);
@@ -1512,7 +1566,8 @@ backend_get_updates_thread (PkBackend *backend)
 	pk_backend_set_percentage (backend, 100);
 
 	/* emit */
-	backend_emit_package_array (backend, result);
+	completion_local = zif_completion_get_child (priv->completion);
+	backend_emit_package_array (backend, result, completion_local);
 
 	/* profile */
 	backend_profile ("filter and emit");
commit 76e2ca1a89e490e52ce1e4e2da96ccfb8243061a
Author: Richard Hughes <richard at hughsie.com>
Date:   Mon Apr 19 14:28:08 2010 +0100

    trivial: don't print a scary error message when there is simply no process running

diff --git a/src/pk-spawn.c b/src/pk-spawn.c
index 8a11eec..7091b60 100644
--- a/src/pk-spawn.c
+++ b/src/pk-spawn.c
@@ -407,6 +407,13 @@ pk_spawn_send_stdin (PkSpawn *spawn, const gchar *command)
 		goto out;
 	}
 
+	/* is there a process running? */
+	if (spawn->priv->child_pid == -1) {
+		egg_debug ("no child pid");
+		ret = FALSE;
+		goto out;
+	}
+
 	/* buffer always has to have trailing newline */
 	egg_debug ("sending '%s'", command);
 	buffer = g_strdup_printf ("%s\n", command);
commit 7da52e55abed1b650cf5b262ecf025986afaccd9
Author: Richard Hughes <richard at hughsie.com>
Date:   Mon Apr 19 14:27:35 2010 +0100

    trivial: update the fedora spec file

diff --git a/contrib/PackageKit.spec.in b/contrib/PackageKit.spec.in
index ffcfb53..a6c1356 100644
--- a/contrib/PackageKit.spec.in
+++ b/contrib/PackageKit.spec.in
@@ -11,7 +11,6 @@ Name:      PackageKit
 Version:   #VERSION#
 Release:   0.#BUILD#%{?alphatag}%{?dist}
 License:   GPLv2+
-Group:     System Environment/Libraries
 URL:       http://www.packagekit.org
 Source0:   http://www.packagekit.org/releases/%{name}-%{version}.tar.gz
 
@@ -53,8 +52,6 @@ BuildRequires: pango-devel
 BuildRequires: pm-utils-devel
 BuildRequires: fontconfig-devel
 BuildRequires: gobject-introspection-devel
-#BuildRequires: gtk-sharp2-devel
-#BuildRequires: mono-core
 
 # for the fancy new yum accelerator
 BuildRequires: rpm-devel
@@ -278,9 +275,6 @@ popd > /dev/null
 
 %find_lang %name
 
-%clean
-rm -rf $RPM_BUILD_ROOT
-
 %post
 update-mime-database %{_datadir}/mime &> /dev/null || :
 
commit 8a8c92949f385fa7ac8f953531910d96e3cf13f2
Author: Richard Hughes <richard at hughsie.com>
Date:   Mon Apr 19 12:51:33 2010 +0100

    yum: Ensure we create /var/cache/PackageKit if the user nukes it and then tries to re-create the comps cache

diff --git a/backends/yum/yumComps.py b/backends/yum/yumComps.py
index 2c918bf..cb80688 100644
--- a/backends/yum/yumComps.py
+++ b/backends/yum/yumComps.py
@@ -34,6 +34,11 @@ class yumComps:
             db = '/var/cache/PackageKit/groups.sqlite'
         self.db = db
 
+        # ensure the directory exists
+        dirname = os.path.dirname(db)
+        if not os.path.isdir(dirname):
+            os.makedirs(dirname)
+
         # load the group map
         self.groupMap = {}
         mapping = open('/usr/share/PackageKit/helpers/yum/yum-comps-groups.conf', 'r')
commit 1622a0c5dba6cf8e6294fab5609478a6d4cdd4e8
Author: dichi <dichi at fedoraproject.org>
Date:   Mon Apr 19 15:59:31 2010 +0000

    l10n: Updates to Indonesian (id) translation
    
    Transmitted-via: Transifex (translate.fedoraproject.org)

diff --git a/po/id.po b/po/id.po
index 7420bf8..be6a568 100644
--- a/po/id.po
+++ b/po/id.po
@@ -6,15 +6,15 @@ msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2010-02-10 20:56+0000\n"
-"PO-Revision-Date: 2010-02-12 09:54+0700\n"
+"PO-Revision-Date: 2010-04-19 22:58+0700\n"
 "Last-Translator: Dichi Al Faridi <dichi at alfaridi.info>\n"
-"Language-Team: American English <>\n"
+"Language-Team: Fedora-id\n"
 "Language: id\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Lokalize 1.0\n"
+"X-Generator: Virtaal 0.5.2\n"
 
 #. TRANSLATORS: this is an atomic transaction
 #. TRANSLATORS: the role is the point of the transaction, e.g. update-system
@@ -322,24 +322,26 @@ msgid ""
 "Extected package name, actually got file. Try using 'pkcon install-local %s' "
 "instead."
 msgstr ""
+"Dibutuhkan nama paket, benar-benar mendapatkan file. Coba gunakan 'pkcon "
+"install-lokal% s' sebagai gantinya."
 
 #. TRANSLATORS: There was an error getting the list of files for the package. The detailed error follows
 #: ../client/pk-console.c:857
 #, c-format
 msgid "This tool could not find any available package: %s"
-msgstr ""
+msgstr "Alat ini tidak dapat menemukan paket yang tersedia: %s"
 
 #. TRANSLATORS: There was an error getting the list of files for the package. The detailed error follows
 #: ../client/pk-console.c:885
 #, c-format
 msgid "This tool could not find the installed package: %s"
-msgstr ""
+msgstr "Alat ini tidak dapat menemukan paket yang tersedia: %s"
 
 #. TRANSLATORS: There was an error getting the list of files for the package. The detailed error follows
 #: ../client/pk-console.c:913 ../client/pk-console.c:941
 #, c-format
 msgid "This tool could not find the package: %s"
-msgstr ""
+msgstr "Alat ini tidak bisa menemukan paket: %s"
 
 #. TRANSLATORS: There was an error getting the list of files for the package. The detailed error follows
 #. TRANSLATORS: There was an error getting the dependencies for the package. The detailed error follows
@@ -350,150 +352,156 @@ msgstr ""
 #: ../client/pk-console.c:1081
 #, c-format
 msgid "This tool could not find all the packages: %s"
-msgstr ""
+msgstr "Alat ini tidak bisa menemukan semua paket: %s"
 
 #. TRANSLATORS: This is when the daemon crashed, and we are up shit creek without a paddle
 #: ../client/pk-console.c:1110
 msgid "The daemon crashed mid-transaction!"
-msgstr ""
+msgstr "Daemon crash pada pertengahan transaksi!"
 
 #. TRANSLATORS: This is the header to the --help menu
 #: ../client/pk-console.c:1144
 msgid "PackageKit Console Interface"
-msgstr ""
+msgstr "Konsol Antarmuka PackageKit"
 
 #. these are commands we can use with pkcon
 #: ../client/pk-console.c:1146
 msgid "Subcommands:"
-msgstr ""
+msgstr "Subcommands:"
 
 #. TRANSLATORS: we keep a database updated with the time that an action was last executed
 #: ../client/pk-console.c:1225
 msgid "Failed to get the time since this action was last completed"
-msgstr ""
+msgstr "Gagal mendapatkan waktu sejak tindakan ini terakhir selesai"
 
 #. TRANSLATORS: command line argument, just show the version string
 #: ../client/pk-console.c:1261 ../client/pk-monitor.c:306
 msgid "Show the program version and exit"
-msgstr ""
+msgstr "Tampilkan versi program dan keluar"
 
 #. TRANSLATORS: command line argument, use a filter to narrow down results
 #: ../client/pk-console.c:1264
 msgid "Set the filter, e.g. installed"
-msgstr ""
+msgstr "Set filter, misalnya diinstal"
 
 #. TRANSLATORS: command line argument, work asynchronously
 #: ../client/pk-console.c:1267
 msgid "Exit without waiting for actions to complete"
-msgstr ""
+msgstr "Keluar tanpa menunggu tindakan untuk selesai"
 
 #. command line argument, do we ask questions
 #: ../client/pk-console.c:1270
 #: ../contrib/debuginfo-install/pk-debuginfo-install.c:527
 msgid "Install the packages without asking for confirmation"
-msgstr ""
+msgstr "Instal paket tanpa meminta konfirmasi"
 
 #. TRANSLATORS: command line argument, this command is not a priority
 #: ../client/pk-console.c:1273
 msgid "Run the command using idle network bandwidth and also using less power"
 msgstr ""
+"Jalankan perintah menggunakan bandwidth menganggur jaringan dan juga "
+"menggunakan daya yang lebih kecil"
 
 #. TRANSLATORS: command line argument, just output without fancy formatting
 #: ../client/pk-console.c:1276
 msgid ""
-"Print to screen a machine readable output, rather than using animated widgets"
+"Print to screen a machine readable output, rather than using animated "
+"widgets"
 msgstr ""
+"Cetak ke layar output mesin yang dapat dibaca, daripada menggunakan widget "
+"animasi"
 
 #. TRANSLATORS: we failed to contact the daemon
 #: ../client/pk-console.c:1298
 msgid "Failed to contact PackageKit"
-msgstr ""
+msgstr "Gagal untuk menghubungi PackageKit"
 
 #. TRANSLATORS: The user specified an incorrect filter
 #: ../client/pk-console.c:1356
 msgid "The filter specified was invalid"
-msgstr ""
+msgstr "Filter ditentukan tidak valid"
 
 #. TRANSLATORS: a search type can be name, details, file, etc
 #: ../client/pk-console.c:1375
 msgid "A search type is required, e.g. name"
-msgstr ""
+msgstr "Sebuah jenis pencarian diperlukan, misalnya nama"
 
 #. TRANSLATORS: the user needs to provide a search term
 #: ../client/pk-console.c:1382 ../client/pk-console.c:1394
 #: ../client/pk-console.c:1406 ../client/pk-console.c:1418
 msgid "A search term is required"
-msgstr ""
+msgstr "Sebuah istilah pencarian diperlukan"
 
 #. TRANSLATORS: the search type was provided, but invalid
 #: ../client/pk-console.c:1428
 msgid "Invalid search type"
-msgstr ""
+msgstr "Jenis pencarian tidak valid"
 
 #. TRANSLATORS: the user did not specify what they wanted to install
 #: ../client/pk-console.c:1434
 msgid "A package name to install is required"
-msgstr ""
+msgstr "Sebuah nama paket diperlukan untuk menginstal"
 
 #. TRANSLATORS: the user did not specify what they wanted to install
 #: ../client/pk-console.c:1443
 msgid "A filename to install is required"
-msgstr ""
+msgstr "Sebuah nama file untuk menginstal diperlukan"
 
 #. TRANSLATORS: geeky error, 99.9999% of users won't see this
 #: ../client/pk-console.c:1455
 msgid "A type, key_id and package_id are required"
-msgstr ""
+msgstr "Tipe A, key_id dan package_id diperlukan"
 
 #. TRANSLATORS: the user did not specify what they wanted to remove
 #: ../client/pk-console.c:1466
 msgid "A package name to remove is required"
-msgstr ""
+msgstr "Diperlukan nama sebuah paket yang akan dihapus"
 
 #. TRANSLATORS: the user did not specify anything about what to download or where
 #: ../client/pk-console.c:1475
 msgid "A destination directory and the package names to download are required"
 msgstr ""
+"Sebuah direktori tujuan dan nama paket yang dibutuhkan untuk men-download"
 
 #. TRANSLATORS: the directory does not exist, so we can't continue
 #: ../client/pk-console.c:1482
 msgid "Directory not found"
-msgstr ""
+msgstr "Direktori tidak ditemukan"
 
 #. TRANSLATORS: geeky error, 99.9999% of users won't see this
 #: ../client/pk-console.c:1491
 msgid "A licence identifier (eula-id) is required"
-msgstr ""
+msgstr "Sebuah pengenal lisensi (EULA-id) diperlukan"
 
 #. TRANSLATORS: geeky error, 99.9999% of users won't see this
 #: ../client/pk-console.c:1502
 msgid "A transaction identifier (tid) is required"
-msgstr ""
+msgstr "Suatu pengenal transaksi (tid) diperlukan"
 
 #. TRANSLATORS: The user did not specify a package name
 #: ../client/pk-console.c:1523
 msgid "A package name to resolve is required"
-msgstr ""
+msgstr "Sebuah nama paket yang dibutuhkan untuk menyelesaikan"
 
 #. TRANSLATORS: The user did not specify a repository (software source) name
 #: ../client/pk-console.c:1534 ../client/pk-console.c:1545
 msgid "A repository name is required"
-msgstr ""
+msgstr "Sebuah nama repositori diperlukan"
 
 #. TRANSLATORS: The user didn't provide any data
 #: ../client/pk-console.c:1556
 msgid "A repo name, parameter and value are required"
-msgstr ""
+msgstr "Nama repo, parameter dan nilai yang diperlukan"
 
 #. TRANSLATORS: The user didn't specify what action to use
 #: ../client/pk-console.c:1573
 msgid "An action, e.g. 'update-system' is required"
-msgstr ""
+msgstr "Sebuah tindakan, misalnya 'update-sistem' diperlukan"
 
 #. TRANSLATORS: The user specified an invalid action
 #: ../client/pk-console.c:1580
 msgid "A correct role is required"
-msgstr ""
+msgstr "Peran yang benar diperlukan"
 
 #. TRANSLATORS: The user did not provide a package name
 #. TRANSLATORS: This is when the user fails to supply the package name
@@ -501,23 +509,23 @@ msgstr ""
 #: ../client/pk-console.c:1614 ../client/pk-console.c:1634
 #: ../client/pk-console.c:1643 ../client/pk-generate-pack.c:316
 msgid "A package name is required"
-msgstr ""
+msgstr "Sebuah nama paket yang dibutuhkan"
 
 #. TRANSLATORS: each package "provides" certain things, e.g. mime(gstreamer-decoder-mp3), the user didn't specify it
 #: ../client/pk-console.c:1623
 msgid "A package provide string is required"
-msgstr ""
+msgstr "Sebuah paket memberikan string itu dibutuhkan"
 
 #. TRANSLATORS: The user tried to use an unsupported option on the command line
 #: ../client/pk-console.c:1703
 #, c-format
 msgid "Option '%s' is not supported"
-msgstr ""
+msgstr "Opsi '%s' tidak didukung"
 
 #. TRANSLATORS: Generic failure of what they asked to do
 #: ../client/pk-console.c:1713
 msgid "Command failed"
-msgstr ""
+msgstr "Perintah gagal"
 
 #. TRANSLATORS: we can exclude certain packages (glibc) when we know they'll exist on the target
 #: ../client/pk-generate-pack.c:255
@@ -1980,4 +1988,3 @@ msgstr ""
 #: ../src/egg-debug.c:469
 msgid "Show debugging options"
 msgstr ""
-
commit c3046c09dd4f7395e0c844c8c50d8e19c4718047
Author: kristho <kristho at fedoraproject.org>
Date:   Mon Apr 19 08:17:41 2010 +0000

    l10n: Updates to Danish (da) translation
    
    Transmitted-via: Transifex (translate.fedoraproject.org)

diff --git a/po/da.po b/po/da.po
index da38724..117fee9 100644
--- a/po/da.po
+++ b/po/da.po
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: packagekit\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-10 20:48+0000\n"
-"PO-Revision-Date: 2010-03-10 22:08+0100\n"
+"POT-Creation-Date: 2010-04-19 02:38+0000\n"
+"PO-Revision-Date: 2010-04-19 10:17+0200\n"
 "Last-Translator: Kris Thomsen <lakristho at gmail.com>\n"
 "Language-Team: Danish <dansk at dansk-gruppen.dk>\n"
 "MIME-Version: 1.0\n"
@@ -18,115 +18,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 "Overførsel"
 
 #. 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 "Systemtid"
 
 #. TRANSLATORS: this is if the transaction succeeded or not
-#: ../client/pk-console.c:179
+#: ../client/pk-console.c:180
 msgid "Succeeded"
 msgstr "Gennemført"
 
-#: ../client/pk-console.c:179
+#: ../client/pk-console.c:180
 msgid "True"
 msgstr "Sandt"
 
-#: ../client/pk-console.c:179
+#: ../client/pk-console.c:180
 msgid "False"
 msgstr "Falskt"
 
 #. 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 "Rolle"
 
 #. TRANSLATORS: this is The duration of the transaction
-#: ../client/pk-console.c:186
+#: ../client/pk-console.c:187
 msgid "Duration"
 msgstr "Varighed"
 
-#: ../client/pk-console.c:186
+#: ../client/pk-console.c:187
 msgid "(seconds)"
 msgstr "(sekunder)"
 
 #. 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 "Kommandolinje"
 
 #. 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 "Bruger-id"
 
 #. TRANSLATORS: this is the username, e.g. hughsie
-#: ../client/pk-console.c:199
+#: ../client/pk-console.c:200
 msgid "Username"
 msgstr "Brugernavn"
 
 #. 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 "Rigtige navn"
 
-#: ../client/pk-console.c:211
+#: ../client/pk-console.c:212
 msgid "Affected packages:"
 msgstr "Berørte pakker:"
 
-#: ../client/pk-console.c:213
+#: ../client/pk-console.c:214
 msgid "Affected packages: None"
 msgstr "Berørte pakker: Ingen"
 
 #. TRANSLATORS: this is the distro, e.g. Fedora 10
-#: ../client/pk-console.c:248
+#: ../client/pk-console.c:249
 msgid "Distribution"
 msgstr "Distribution"
 
 #. 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 "Resumé"
 
 #. TRANSLATORS: this is the group category name
-#: ../client/pk-console.c:280
+#: ../client/pk-console.c:281
 msgid "Category"
 msgstr "Kategori"
 
 #. 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 "Overliggende"
 
 #. TRANSLATORS: this is the name of the parent group
-#: ../client/pk-console.c:288
+#: ../client/pk-console.c:289
 msgid "Name"
 msgstr "Navn"
 
 #. TRANSLATORS: this is preferred icon for the group
-#: ../client/pk-console.c:294
+#: ../client/pk-console.c:295
 msgid "Icon"
 msgstr "Ikon"
 
 #. 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 "Detaljer om opdateringen:"
 
@@ -135,7 +135,7 @@ msgstr "Detaljer om opdateringen:"
 #. 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[0] "Pakke"
 msgstr[1] "Pakker"
 
 #. TRANSLATORS: details about the update, any packages that this update updates
-#: ../client/pk-console.c:349
+#: ../client/pk-console.c:350
 msgid "Updates"
 msgstr "Opdateringer"
 
 #. TRANSLATORS: details about the update, any packages that this update obsoletes
-#: ../client/pk-console.c:353
+#: ../client/pk-console.c:354
 msgid "Obsoletes"
 msgstr "Forældede"
 
 #. 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 "Leverandør"
 
 #. 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 "Genstart"
 
 #. TRANSLATORS: details about the update, any description of the update
-#: ../client/pk-console.c:373
+#: ../client/pk-console.c:374
 msgid "Update text"
 msgstr "Opdateringstekst"
 
 #. TRANSLATORS: details about the update, the changelog for the package
-#: ../client/pk-console.c:377
+#: ../client/pk-console.c:378
 msgid "Changes"
 msgstr "Ændringer"
 
 #. 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 "Udgivet"
 
 #. 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 "Opdateret"
 
 #. TRANSLATORS: if the repo is enabled
-#: ../client/pk-console.c:425
+#: ../client/pk-console.c:426
 msgid "Enabled"
 msgstr "Aktiveret"
 
 #. TRANSLATORS: if the repo is disabled
-#: ../client/pk-console.c:428
+#: ../client/pk-console.c:429
 msgid "Disabled"
 msgstr "Deaktiveret"
 
 #. 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 "Systemgenstart kræves af:"
 
 #. TRANSLATORS: a package requires the session to be restarted
-#: ../client/pk-console.c:463
+#: ../client/pk-console.c:464
 msgid "Session restart required:"
 msgstr "Sessionsgenstart kræves:"
 
 #. 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 "Systemgenstart (sikkerhed) kræves af:"
 
 #. 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 "Sessionsgenstart (sikkerhed) kræves:"
 
 #. 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 "Programgenstart kræves af:"
 
 #. TRANSLATORS: This a list of details about the package
-#: ../client/pk-console.c:507
+#: ../client/pk-console.c:508
 msgid "Package description"
 msgstr "Pakkebeskrivelse"
 
 #. 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 "Besked:"
 
 #. TRANSLATORS: This where the package has no files
-#: ../client/pk-console.c:559
+#: ../client/pk-console.c:560
 msgid "No files"
 msgstr "Ingen filer"
 
 #. TRANSLATORS: This a list files contained in the package
-#: ../client/pk-console.c:564
+#: ../client/pk-console.c:565
 msgid "Package files"
 msgstr "Pakkefiler"
 
 #. TRANSLATORS: the percentage complete of the transaction
-#: ../client/pk-console.c:632
+#: ../client/pk-console.c:633
 msgid "Percentage"
 msgstr "Procent"
 
 #. 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 "Resultater:"
 
 #. 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 "Fatal fejl"
 
 #. 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 "Overførslen kunne ikke gennemføres"
 
 #. 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 "Der er ingen tilgængelige opdateringer i øjeblikket."
 
-#: ../client/pk-console.c:749
+#: ../client/pk-console.c:750
 msgid "There are no upgrades available at this time."
 msgstr "Der er ingen tilgængelige opgraderinger i øjeblikket."
 
 #. 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 "Genstart venligst computeren for at fuldføre opdateringen."
 
 #. 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 venligst ud og ind igen for at fuldføre opdateringen."
 
 #. 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 ""
 "sikkerhedsopdateringer er blevet installeret."
 
 #. 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,29 +321,29 @@ msgstr ""
 "sikkerhedsopdateringer er blevet installeret."
 
 #. 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 ""
 "Forventet pakkenavn fik faktisk fil. Prøv at bruge \"pkcon install-local %s"
 "\" istedet."
 
 #. 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 "Dette værktøj kunne ikke finde nogen tilgængelig pakke: %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 "Dette værktøj kunne ikke finde den installerede pakke: %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 "Dette værktøj kunne ikke finde pakken: %s"
@@ -352,63 +352,63 @@ msgstr "Dette værktøj kunne ikke finde pakken: %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 "Dette værktøj kunne ikke finde alle pakkerne: %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 "Dæmonen brød sammen under overførslen!"
 
 #. 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 konsolgrænseflade"
 
 #. these are commands we can use with pkcon
-#: ../client/pk-console.c:1148
+#: ../client/pk-console.c:1149
 msgid "Subcommands:"
 msgstr "Underkommandoer:"
 
 #. 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 "Kunne ikke hente tid siden denne handling sidst blev gennemført"
 
 #. 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 "Vis programversionen og afslut"
 
 #. 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 "Sæt filteret, f.eks. installeret"
 
 #. 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 "Afslut uden at vente på at handlingerne færdiggøres"
 
 #. 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 "Installér pakkerne uden at spørge efter bekræftelse"
 
 #. 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 ""
 "Kør kommandoen ved at bruge lav netværksbåndbredde, hvilket bruger mindre "
 "strøm"
 
 #. 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 +416,122 @@ msgstr ""
 "widgets"
 
 #. TRANSLATORS: we failed to contact the daemon
-#: ../client/pk-console.c:1300
+#: ../client/pk-console.c:1304
 msgid "Failed to contact PackageKit"
 msgstr "Kunne ikke kontakte 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 "Denne proxy kunne ikke blive sat"
+
+#. TRANSLATORS: The user specified an incorrect filter
+#: ../client/pk-console.c:1377
 msgid "The filter specified was invalid"
 msgstr "Filteret det blev angivet er ugyldigt"
 
 #. 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 "En søgetype kræves, f.eks. navn"
 
 #. 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 "En søgeterm kræves"
 
 #. TRANSLATORS: the search type was provided, but invalid
-#: ../client/pk-console.c:1430
+#: ../client/pk-console.c:1449
 msgid "Invalid search type"
 msgstr "Ugyldig søgetype"
 
 #. 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 "Et pakkenavn til installation er påkrævet"
 
 #. 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 "Et filnavn til installation er påkrævet"
 
 #. 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 "En type, nøgle_id og pakke_id kræves"
 
 #. 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 "Et pakkenavn til fjernelse kræves"
 
 #. 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 "En destinationsmappe og pakkenavnene kræves for at blive hentet"
 
 #. 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 "Mappe ikke fundet"
 
 #. 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 "En licensgenkender (eula-id) kræves"
 
 #. 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 "En overførselsgenkender (tid) kræves"
 
 #. 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 "Et pakkenavn til at løse kræves"
 
 #. 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 "Et pakkearkivnavn kræves"
 
 #. 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 "Et pakkearkivnavn, parameter og værdi kræves"
 
 #. 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 "En handling, f.eks. \"update-system\" kræves"
 
 #. TRANSLATORS: The user specified an invalid action
-#: ../client/pk-console.c:1582
+#: ../client/pk-console.c:1601
 msgid "A correct role is required"
 msgstr "En korrekt rolle kræves"
 
 #. 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 "Et pakkenavn kræves"
 
 #. 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 "En pakke udbydningsstreng kræves"
 
 #. 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 "Indstilling \"%s\" er ikke understøttet"
 
 #. TRANSLATORS: Generic failure of what they asked to do
-#: ../client/pk-console.c:1715
+#: ../client/pk-console.c:1734
 msgid "Command failed"
 msgstr "Kommando fejlede"
 
@@ -537,10 +542,8 @@ msgstr "Angiv filnavnet på afhængigheder der skal ekskluderes"
 
 #. TRANSLATORS: the output location
 #: ../client/pk-generate-pack.c:258
-msgid ""
-"The output file or directory (the current directory is used if ommitted)"
-msgstr ""
-"Uddatafilen eller -mappen (den nuværende mappe bliver brugt hvis undladt)"
+msgid "The output file or directory (the current directory is used if omitted)"
+msgstr "Outputfilen eller -mappen (den nuværende mappe bliver brugt hvis undladt)"
 
 #. TRANSLATORS: put a list of packages in the pack
 #: ../client/pk-generate-pack.c:261
@@ -565,11 +568,11 @@ msgstr "Begge tilvalg valgt."
 #. 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 "En uddatamappe eller filnavn kræves"
+msgstr "En outputmappe eller filnavn kræves"
 
-#. 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 "Dæmonen kunne ikke startes"
 
 #. TRANSLATORS: This is when the backend doesn't have the capability to get-depends
@@ -640,12 +643,12 @@ msgstr "Servicepakke oprettet \"%s\""
 msgid "Failed to create '%s': %s"
 msgstr "Kunne ikke oprette \"%s\": %s"
 
-#: ../client/pk-monitor.c:236
+#: ../client/pk-monitor.c:256
 msgid "Failed to get daemon state"
 msgstr "Kunne ikke hente status for dæmon"
 
 #. TRANSLATORS: this is a program that monitors PackageKit
-#: ../client/pk-monitor.c:322
+#: ../client/pk-monitor.c:342
 msgid "PackageKit Monitor"
 msgstr "PackageKit overvåger"
 
@@ -704,42 +707,42 @@ msgid "Installing..."
 msgstr "Installerer..."
 
 #. 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 "Henter detaljer om softwarekilderne."
 
 #. 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 "Henter fillister (dette kan tage noget tid at udføre)."
 
 #. 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 "Venter på at pakkehåndteringsprogrammet låser."
 
 #. 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 "Indlæser liste over pakker."
 
 #. 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 "Kunne ikke søge efter fil"
 
 #. 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 "Kunne ikke starte:"
 
 #. 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 "Kunne ikke installere pakker"
 
 #. 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-kommando ikke fundet"
 
@@ -749,51 +752,51 @@ msgid "Command not found."
 msgstr "Kommando ikke fundet."
 
 #. 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 "Lignende kommando er:"
 
 #. 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 "Kør lignende kommando:"
 
 #. 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 "Lignende kommandoer er:"
 
 #. 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 "Vælg venligst en kommando at køre"
 
 #. 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 "Pakken der udbyder denne fil er:"
 
 #. 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 "Installér pakke \"%s\" for at udbyde kommando \"%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 "Pakker der udbyder denne fil er:"
 
 #. 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 "Passende pakker er:"
 
 #. 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 "Vælg venligst en pakke at installere"
 
@@ -962,7 +965,7 @@ msgstr "Installerer ikke pakker i simuleringstilstand"
 #. 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 "Installerer pakker"
@@ -1099,7 +1102,7 @@ msgid "Please enter a number from 1 to %i: "
 msgstr "Indtast et nummer fra 1 til %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 "Mere end én pakke passede:"
 
@@ -1109,448 +1112,448 @@ msgid "Please choose the correct package: "
 msgstr "Vælg venligst den rigtige pakke: "
 
 #. 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 "Ukendt status"
 
 #. 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 "Starter"
 
 #. 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 "Venter i kø"
 
 #. TRANSLATORS: transaction state, just started
-#: ../lib/packagekit-glib2/pk-console-shared.c:262
+#: ../lib/packagekit-glib2/pk-console-shared.c:263
 msgid "Running"
 msgstr "Kører"
 
 #. 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 "Forespørger"
 
 #. 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 "Henter information"
 
 #. 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 "Fjerner pakker"
 
 #. 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 "Henter pakker"
 
 #. 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 "Genopfrisker liste over pakkearkiver"
 
 #. 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 "Installerer opdateringer"
 
 #. 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 "Rydder op i pakker"
 
 #. 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 "Overflødigører pakker"
 
 #. 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 "Løser afhængigheder"
 
 #. 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 "Kontrollerer signaturer"
 
 #. 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 "Ruller tilbage"
 
 #. 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 "Tester ændringer"
 
 #. 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 "Indsender ændringer"
 
 #. 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 "Forespørger data"
 
 #. TRANSLATORS: transaction state, all done!
-#: ../lib/packagekit-glib2/pk-console-shared.c:326
+#: ../lib/packagekit-glib2/pk-console-shared.c:327
 msgid "Finished"
 msgstr "Afsluttet"
 
 #. 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 "Annullerer"
 
 #. 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 "Henter information om pakkearkiv"
 
 #. 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 "Henter liste over pakker"
 
 #. 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 "Henter fillister"
 
 #. 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 "Henter liste over ændringer"
 
 #. 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 "Henter grupper"
 
 #. 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 "Henter opdateringsinformation"
 
 #. 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 "Genpakker filer"
 
 #. 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 "Indlæser cache"
 
 #. 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 "Skanner programmer"
 
 #. 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 "Genererer pakkelister"
 
 #. 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 "Venter på at pakkehåndteringen låser"
 
 #. 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 "Venter på godkendelse"
 
 #. 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 "Opdaterer kørende programmer"
 
 #. 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 "Kontrollerer programmer som er i brug"
 
 #. 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 "Kontrollerer biblioteker som er i brug"
 
 #. 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 "Kopierer filer"
 
 #. TRANSLATORS: The type of update
-#: ../lib/packagekit-glib2/pk-console-shared.c:412
+#: ../lib/packagekit-glib2/pk-console-shared.c:413
 msgid "Trivial"
 msgstr "Triviel"
 
 #. 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 "Vigtig"
 
 #. TRANSLATORS: The type of update
-#: ../lib/packagekit-glib2/pk-console-shared.c:424
+#: ../lib/packagekit-glib2/pk-console-shared.c:425
 msgid "Security"
 msgstr "Sikkerhed"
 
 #. 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 "Fejlrettelse "
 
 #. TRANSLATORS: The type of update
-#: ../lib/packagekit-glib2/pk-console-shared.c:432
+#: ../lib/packagekit-glib2/pk-console-shared.c:433
 msgid "Enhancement"
 msgstr "Forbedring"
 
 #. TRANSLATORS: The type of update
-#: ../lib/packagekit-glib2/pk-console-shared.c:436
+#: ../lib/packagekit-glib2/pk-console-shared.c:437
 msgid "Blocked"
 msgstr "Blokeret"
 
 #. 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 "Installeret"
 
 #. 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 "Tilgængelig"
 
 #. 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 "Hentning"
 
 #. 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 "Opdaterer"
 
 #. 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 "Installerer"
 
 #. 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 "Fjerner"
 
 #. 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 "Rydder op"
 
 #. 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 "Forælder"
 
 #. 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 "Geninstallerer"
 
 #. 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 "Hentede"
 
 #. 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 "Fjernede"
 
 #. 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 "Ryddede op"
 
 #. 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 "Forældede"
 
 #. 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 "Geninstallerede"
 
 #. 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 "Ukendt rolletype"
 
 #. 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 "Henter afhængigheder"
 
 #. 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 "Henter opdateringsdetaljer"
 
 #. 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 "Henter detaljer"
 
 #. 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 "Henter afhængigheder"
 
 #. 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 "Henter opdateringer"
 
 #. 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 "Søger efter detaljer"
 
 #. 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 "Søger efter fil"
 
 #. 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 "Søger efter grupper"
 
 #. 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 "Søger efter navn"
 
 #. 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 "Installerer filer"
 
 #. 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 "Genopfrisker cache"
 
 #. 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 "Opdaterer pakker"
 
 #. 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 "Opdaterer system"
 
 #. 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 "Annullerer"
 
 #. 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 "Henter pakkearkiver"
 
 #. 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 "Aktiverer pakkearkiv"
 
 #. 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 "Indstiller data"
 
 #. 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 "Løser"
 
 #. 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 "Henter filliste"
 
 #. 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 "Henter udbydere"
 
 #. 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 "Installerer signatur"
 
 #. 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 "Henter pakker"
 
 #. 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 "Accepterer 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 "Henter opgraderinger"
 
 #. 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 "Henter kategorier"
 
 #. 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 "Henter overførsler"
 
 #. 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 "Simulerer installation"
 
 #. 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 "Simulerer fjernelse"
 
 #. 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 "Simulerer opdatering"
 
@@ -1984,25 +1987,25 @@ msgid "Show debugging information for all files"
 msgstr "Vis fejlsøgningsinformation for alle filer"
 
 #. TRANSLATORS: a list of modules to debug
-#: ../src/egg-debug.c:459
+#: ../src/egg-debug.c:458
 msgid "Debug these specific modules"
 msgstr "Fejlsøg disse specifikke moduler"
 
 #. TRANSLATORS: a list of functions to debug
-#: ../src/egg-debug.c:462
+#: ../src/egg-debug.c:461
 msgid "Debug these specific functions"
 msgstr "Fejlsøg disse specifikke funktioner"
 
 #. TRANSLATORS: save to a log
-#: ../src/egg-debug.c:465
+#: ../src/egg-debug.c:464
 msgid "Log debugging data to a file"
 msgstr "Log fejlsøgningsdata til en fil"
 
-#: ../src/egg-debug.c:469
+#: ../src/egg-debug.c:468
 msgid "Debugging Options"
 msgstr "Fejlsøgningsindstillinger"
 
-#: ../src/egg-debug.c:469
+#: ../src/egg-debug.c:468
 msgid "Show debugging options"
 msgstr "Vis fejlsøgningsindstillinger"
 
@@ -2015,9 +2018,6 @@ msgstr "Vis fejlsøgningsindstillinger"
 #~ msgid "This tool could not install the files: %s"
 #~ msgstr "Dette værktøj kunne ikke installere filerne: %s"
 
-#~ msgid "This tool could not remove %s: %s"
-#~ msgstr "Dette værktøj kunne ikke fjerne %s: %s"
-
 #~ msgid "This tool could not remove the packages: %s"
 #~ msgstr "Dette værktøj kunne ikke fjerne pakkerne: %s"
 
commit 48a464074c00acf4213690cba28dae48a577fb8c
Author: aalam <aalam at fedoraproject.org>
Date:   Mon Apr 19 02:40:56 2010 +0000

    l10n: Updates to Panjabi (Punjabi) (pa) translation
    
    Transmitted-via: Transifex (translate.fedoraproject.org)

diff --git a/po/pa.po b/po/pa.po
index a50c3c3..44650d4 100644
--- a/po/pa.po
+++ b/po/pa.po
@@ -3,15 +3,15 @@
 # This file is distributed under the same license as the PACKAGE package.
 #
 # Amanpreet Singh Alam <aalam at users.sf.net>, 2008, 2009.
-# A S Alam <aalam at users.sf.net>, 2009.
+# A S Alam <aalam at users.sf.net>, 2009, 2010.
 # Jaswinder Singh <jsingh at redhat.com>, 2009.
 msgid ""
 msgstr ""
 "Project-Id-Version: packagekit.master.pa\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-12-08 08:21+0000\n"
-"PO-Revision-Date: 2009-12-08 14:45+0530\n"
-"Last-Translator: Jaswinder Singh <jsingh at redhat.com>\n"
+"POT-Creation-Date: 2010-04-18 19:48+0000\n"
+"PO-Revision-Date: 2010-04-19 07:57+0530\n"
+"Last-Translator: A S Alam <aalam at users.sf.net>\n"
 "Language-Team: Punjabi/Panjabi <kde-i18n-doc at kde.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -21,115 +21,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 "ਯੂਜ਼ਰ ID"
 
 #. 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 "ID"
 
 #. 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 "ਅੱਪਡੇਟ ਬਾਰੇ ਵੇਰਵਾ:"
 
@@ -138,7 +138,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,188 +148,200 @@ msgstr[0] "ਪੈਕੇਜ"
 msgstr[1] "ਪੈਕੇਜ"
 
 #. 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 "ਬੱਗਜ਼ੀਲਾ"
 
 #. 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 "ਯੋਗ"
+msgstr "ਚਾਲੂ ਹੈ"
 
 #. TRANSLATORS: if the repo is disabled
-#: ../client/pk-console.c:428
+#: ../client/pk-console.c:429
 msgid "Disabled"
-msgstr "ਅਯੋਗ"
+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 "ਪ੍ਰਤੀਸ਼ਤਤਾ"
+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:678
+#: ../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:685
+#: ../client/pk-console.c:687
 msgid "Fatal error"
 msgstr "ਘਾਤਕ ਗਲਤੀ"
 
 #. TRANSLATORS: the transaction failed in a way we could not expect
-#: ../client/pk-console.c:694
-#: ../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 "ਟਰਾਂਸੈਕਸ਼ਨ ਫੇਲ ਹੋਈ"
+msgstr "ਟਰਾਂਸੈਕਸ਼ਨ ਫੇਲ੍ਹ ਹੋਈ"
 
 #. TRANSLATORS: print a message when there are no updates
-#: ../client/pk-console.c:721
+#: ../client/pk-console.c:727
 msgid "There are no updates available at this time."
 msgstr "ਇਸ ਸਮੇਂ ਕੋਈ ਅੱਪਡੇਟ ਉਪਲੱਬਧ ਨਹੀਂ ਹੈ।"
 
+#: ../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:808
+#: ../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:811
+#: ../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:814
+#: ../client/pk-console.c:823
 msgid ""
 "Please restart the computer to complete the update as important security "
 "updates have been installed."
 msgstr "ਅੱਪਡੇਟ ਨੂੰ ਪੂਰਾ ਕਰਨ ਵਾਸਤੇ ਕੰਪਿਊਟਰ ਮੁੜ-ਚਾਲੂ ਕਰੋ ਜੀ, ਕਿਉਂਕਿ ਸੁਰੱਖਿਆ ਅੱਪਡੇਟ ਇੰਸਟਾਲ ਹੋਏ ਹਨ।"
 
 #. TRANSLATORS: a package needs to restart the session (due to security)
-#: ../client/pk-console.c:817
+#: ../client/pk-console.c:826
 msgid ""
 "Please logout and login to complete the update as important security updates "
 "have been installed."
 msgstr ""
 "ਅੱਪਡੇਟ ਨੂੰ ਪੂਰਾ ਕਰਨ ਵਾਸਤੇ ਲਾਗਆਉਟ ਕਰਕੇ ਲਾਗਇਨ ਕਰੋ ਜੀ, ਕਿਉਂਕਿ ਸੁਰੱਖਿਆ ਅੱਪਡੇਟ ਇੰਸਟਾਲ ਕੀਤੇ ਹਨ।"
 
+#. TRANSLATORS: The user used 'pkcon install dave.rpm' rather than 'pkcon install-local dave.rpm'
+#: ../client/pk-console.c:852
+#, c-format
+msgid ""
+"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:840
+#: ../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:868
+#: ../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:896 ../client/pk-console.c:924
+#: ../client/pk-console.c:916 ../client/pk-console.c:944
 #, c-format
 msgid "This tool could not find the package: %s"
 msgstr "ਇਹ ਟੂਲ ਪੈਕੇਜ ਨਹੀਂ ਲੱਭ ਸਕਿਆ: %s"
@@ -338,227 +350,232 @@ 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:952 ../client/pk-console.c:980
-#: ../client/pk-console.c:1008 ../client/pk-console.c:1036
-#: ../client/pk-console.c:1064
+#: ../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:1093
+#: ../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:1127
+#: ../client/pk-console.c:1147
 msgid "PackageKit Console Interface"
 msgstr "ਪੈਕੇਜਕਿੱਟ ਕਨਸੋਲ ਇੰਟਰਫੇਸ"
 
 #. these are commands we can use with pkcon
-#: ../client/pk-console.c:1129
+#: ../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:1208
+#: ../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:1244 ../client/pk-monitor.c:280
+#: ../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:1247
+#: ../client/pk-console.c:1270
 msgid "Set the filter, e.g. installed"
 msgstr "ਫਿਲਟਰ ਸੈੱਟ ਕਰੋ, ਜਿਵੇਂ ਕਿ ਇੰਸਟਾਲ"
 
 #. TRANSLATORS: command line argument, work asynchronously
-#: ../client/pk-console.c:1250
+#: ../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:1253
+#: ../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:1256
+#: ../client/pk-console.c:1279
 msgid "Run the command using idle network bandwidth and also using less power"
-msgstr "ਕਮਾਂਡ ਨੂੰ ਵੇਹਲੀ ਨੈੱਟਵਰਕ ਬੈਂਡਵਿਦਥ ਦੌਰਾਨ ਚਲਾਓ ਅਤੇ ਘੱਟ ਊਰਜਾ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਵੀ"
+msgstr "ਕਮਾਂਡ ਨੂੰ ਵੇਹਲੀ ਨੈੱਟਵਰਕ ਬੈਂਡਵਿਥ ਦੌਰਾਨ ਚਲਾਓ ਅਤੇ ਘੱਟ ਊਰਜਾ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਵੀ"
 
 #. TRANSLATORS: command line argument, just output without fancy formatting
-#: ../client/pk-console.c:1259
+#: ../client/pk-console.c:1282
 msgid "Print to screen a machine readable output, rather than using animated widgets"
-msgstr "ਐਨੀਮੇਟਡ ਵਿਡਜਿਟ ਵਰਤਣ ਦੀ ਬਜਾਏ, ਮਸ਼ੀਨ ਦੇ ਪੜਨ ਯੋਗ ਜਾਣਕਾਰੀ ਸਕਰੀਨ ਤੇ ਪ੍ਰਿੰਟ ਕਰੋ"
+msgstr "ਐਨੀਮੇਟਡ ਵਿਡਜੈੱਟ ਵਰਤਣ ਦੀ ਬਜਾਏ, ਮਸ਼ੀਨ ਦੇ ਪੜ੍ਹਨ ਯੋਗ ਜਾਣਕਾਰੀ ਸਕਰੀਨ ਤੇ ਪਰਿੰਟ ਕਰੋ"
 
 #. TRANSLATORS: we failed to contact the daemon
-#: ../client/pk-console.c:1281
+#: ../client/pk-console.c:1304
 msgid "Failed to contact PackageKit"
 msgstr "ਪੈਕੇਜਕਿੱਟ ਨਾਲ ਸੰਪਰਕ ਲਈ ਫੇਲ੍ਹ ਹੈ"
 
 #. TRANSLATORS: The user specified an incorrect filter
-#: ../client/pk-console.c:1339
+#: ../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:1358
+#: ../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:1365 ../client/pk-console.c:1377
-#: ../client/pk-console.c:1389 ../client/pk-console.c:1401
+#: ../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:1411
+#: ../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:1417
+#: ../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:1426
+#: ../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:1438
+#: ../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:1449
+#: ../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:1458
+#: ../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:1465
+#: ../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:1474
+#: ../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:1485
+#: ../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:1506
+#: ../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:1517 ../client/pk-console.c:1528
+#: ../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:1539
+#: ../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:1556
+#: ../client/pk-console.c:1594
 msgid "An action, e.g. 'update-system' is required"
 msgstr "ਕਾਰਵਾਈ, ਜਿਵੇਂ 'ਅੱਪਡੇਟ-ਸਿਸਟਮ' ਲੋੜੀਦਾ ਹੈ"
 
 #. TRANSLATORS: The user specified an invalid action
-#: ../client/pk-console.c:1563
+#: ../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:1573 ../client/pk-console.c:1588
-#: ../client/pk-console.c:1597 ../client/pk-console.c:1617
-#: ../client/pk-console.c:1626 ../client/pk-generate-pack.c:298
+#: ../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:1606
+#: ../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:1686
+#: ../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:1696
+#: ../client/pk-console.c:1734
 msgid "Command failed"
 msgstr "ਕਮਾਂਡ ਫੇਲ੍ਹ ਹੈ"
 
 #. TRANSLATORS: we can exclude certain packages (glibc) when we know they'll exist on the target
-#: ../client/pk-generate-pack.c:237
+#: ../client/pk-generate-pack.c:255
 msgid "Set the file name of dependencies to be excluded"
 msgstr "ਨਿਰਭਰਤਾ ਲਈ ਫਾਇਲ ਨਾਂ ਦਿਓ, ਜਿਸ ਨੂੰ ਵੱਖ ਰੱਖਿਆ ਜਾਵੇ"
 
 #. TRANSLATORS: the output location
-#: ../client/pk-generate-pack.c:240
-msgid "The output file or directory (the current directory is used if ommitted)"
+#: ../client/pk-generate-pack.c:258
+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:243
+#: ../client/pk-generate-pack.c:261
 msgid "The package to be put into the service pack"
 msgstr "ਸਰਵਿਸ ਪੈਕ ਵਿੱਚ ਰੱਖਣ ਵਾਸਤੇ ਪੈਕੇਜ"
 
 #. TRANSLATORS: put all pending updates in the pack
-#: ../client/pk-generate-pack.c:246
+#: ../client/pk-generate-pack.c:264
 msgid "Put all updates available in the service pack"
 msgstr "ਸਰਵਿਸ ਪੈਕ ਵਿੱਚ ਸਭ ਉਪਲੱਬਧ ਅੱਪਡੇਟ ਰੱਖੋ"
 
 #. TRANSLATORS: This is when the user fails to supply the correct arguments
-#: ../client/pk-generate-pack.c:282
+#: ../client/pk-generate-pack.c:300
 msgid "Neither --package or --updates option selected."
 msgstr "ਨਾ ਤਾਂ --package ਚੋਣ ਕੀਤੀ ਗਈ ਅਤੇ ਨਾ ਹੀ --updates"
 
 #. TRANSLATORS: This is when the user fails to supply just one argument
-#: ../client/pk-generate-pack.c:290
+#: ../client/pk-generate-pack.c:308
 msgid "Both options selected."
 msgstr "ਦੋਵੇਂ ਚੋਣਾਂ ਕੀਤੀਆਂ।"
 
 #. TRANSLATORS: This is when the user fails to supply the output
-#: ../client/pk-generate-pack.c:306
+#: ../client/pk-generate-pack.c:324
 msgid "A output directory or file name is required"
 msgstr "ਆਉਟਪੁੱਟ ਡਾਇਰੈਕਟਰੀ ਅਤੇ ਫਾਇਲ ਨਾਂ ਲੋੜੀਦਾ ਹੈ"
 
-#. TRANSLATORS: This is when the dameon is not-installed/broken and fails to startup
-#: ../client/pk-generate-pack.c:324
-msgid "The dameon failed to startup"
-msgstr "ਡੈਮਨ ਚਾਲੂ ਹੋਣ ਤੋਂ ਫੇਲ"
+#. TRANSLATORS: This is when the daemon is not-installed/broken and fails to startup
+#: ../client/pk-generate-pack.c:342
+msgid "The daemon failed to startup"
+msgstr "ਡੈਮਨ ਚਾਲੂ ਹੋਣ ਤੋਂ ਫੇਲ੍ਹ"
 
 #. 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
-#: ../client/pk-generate-pack.c:335 ../client/pk-generate-pack.c:341
+#: ../client/pk-generate-pack.c:353 ../client/pk-generate-pack.c:359
 msgid "The package manager cannot perform this type of operation."
 msgstr "ਪੈਕੇਜ ਮੈਨੇਜਰ ਇਸ ਕਿਸਮ ਦੀ ਕਾਰਵਾਈ ਨਹੀਂ ਕਰ ਸਕਦਾ ਹੈ।"
 
 #. TRANSLATORS: This is when the distro didn't include libarchive support into PK
-#: ../client/pk-generate-pack.c:348
+#: ../client/pk-generate-pack.c:366
 msgid ""
 "Service packs cannot be created as PackageKit was not built with libarchive "
 "support."
@@ -567,64 +584,64 @@ msgstr ""
 "ਗਿਆ ਹੈ।"
 
 #. TRANSLATORS: the user specified an absolute path, but didn't get the extension correct
-#: ../client/pk-generate-pack.c:359
+#: ../client/pk-generate-pack.c:377
 msgid "If specifying a file, the service pack name must end with"
 msgstr "ਜੇ ਫਾਇਲ ਦਿੱਤੀ ਤਾਂ ਸਰਵਿਸ ਪੈਕ ਨਾਂ ਖਤਮ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ"
 
 #. TRANSLATORS: This is when file already exists
-#: ../client/pk-generate-pack.c:375
+#: ../client/pk-generate-pack.c:393
 msgid "A pack with the same name already exists, do you want to overwrite it?"
 msgstr "ਇਸ ਨਾਂ ਨਾਲ ਪੈਕ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ, ਕੀ ਇਸ ਉੱਤੇ ਲਿਖਣਾ ਹੈ?"
 
 #. TRANSLATORS: This is when the pack was not overwritten
-#: ../client/pk-generate-pack.c:378
+#: ../client/pk-generate-pack.c:396
 msgid "The pack was not overwritten."
 msgstr "ਪੈਕ ਉੱਤੇ ਨਹੀਂ ਲਿਖਿਆ ਜਾਵੇਗਾ।"
 
 #. TRANSLATORS: This is when the temporary directory cannot be created, the directory name follows
-#: ../client/pk-generate-pack.c:391
+#: ../client/pk-generate-pack.c:409
 msgid "Failed to create directory:"
 msgstr "ਡਾਇਰੈਕਟਰੀ ਬਣਾਉਣ ਲਈ ਫੇਲ੍ਹ ਹੈ:"
 
 #. TRANSLATORS: This is when the list of packages from the remote computer cannot be opened
-#: ../client/pk-generate-pack.c:403
+#: ../client/pk-generate-pack.c:421
 msgid "Failed to open package list."
 msgstr "ਪੈਕੇਜ ਲਿਸਟ ਖੋਲ੍ਹਣ ਲਈ ਫੇਲ੍ਹ ਹੈ।"
 
 #. TRANSLATORS: The package name is being matched up to available packages
-#: ../client/pk-generate-pack.c:412
+#: ../client/pk-generate-pack.c:430
 msgid "Finding package name."
 msgstr "ਪੈਕੇਜ ਨਾਂ ਲੱਭਿਆ ਜਾ ਰਿਹਾ ਹੈ।"
 
 #. TRANSLATORS: This is when the package cannot be found in any software source. The detailed error follows
-#: ../client/pk-generate-pack.c:416
+#: ../client/pk-generate-pack.c:434
 #, c-format
 msgid "Failed to find package '%s': %s"
 msgstr "'%s' ਪੈਕੇਜ ਖੋਜਣ ਲਈ ਫੇਲ੍ਹ ਹੈ: %s"
 
 #. TRANSLATORS: This is telling the user we are in the process of making the pack
-#: ../client/pk-generate-pack.c:424
+#: ../client/pk-generate-pack.c:442
 msgid "Creating service pack..."
 msgstr "ਸਰਵਿਸ ਪੈਕ ਬਣਾਇਆ ਜਾ ਰਿਹਾ ਹੈ..."
 
 #. TRANSLATORS: we succeeded in making the file
-#: ../client/pk-generate-pack.c:439
+#: ../client/pk-generate-pack.c:457
 #, c-format
 msgid "Service pack created '%s'"
 msgstr "ਸਰਵਿਸ ਪੈਕ ਬਣਾਇਆ '%s'"
 
 #. TRANSLATORS: we failed to make te file
-#: ../client/pk-generate-pack.c:444
+#: ../client/pk-generate-pack.c:462
 #, c-format
 msgid "Failed to create '%s': %s"
 msgstr "'%s' ਬਣਾਉਣ ਲਈ ਫੇਲ੍ਹ: %s"
 
-#: ../client/pk-monitor.c:210
+#: ../client/pk-monitor.c:256
 msgid "Failed to get daemon state"
 msgstr "ਡੈਮਨ ਹਾਲਤ ਪਤਾ ਕਰਨ ਲਈ ਫੇਲ੍ਹ ਹੈ।"
 
 #. TRANSLATORS: this is a program that monitors PackageKit
-#: ../client/pk-monitor.c:296
+#: ../client/pk-monitor.c:342
 msgid "PackageKit Monitor"
 msgstr "ਪੈਕੇਜਕਿੱਟ ਮਾਨੀਟਰ"
 
@@ -683,42 +700,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 "ਫਾਇਲ-ਲਿਸਟ ਡਾਊਨਲੋਡ ਕਰ ਰਿਹਾ ਹੈ (ਇਹ ਮੁਕੰਮਲ ਹੋਣ ਲਈ ਕੁਝ ਸਮਾਂ ਲੈ ਸਕਦਾ ਹੈ)।"
+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 "ਪੈਕੇਜ ਮੈਨੇਜਰ ਲਾਕ ਦੀ ਉਡੀਕ ਕਰ ਰਿਹਾ ਹੈ।"
+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 "ਪੈਕੇਜਕਿੱਟ ਕਮਾਂਡ ਨਹੀਂ ਲੱਭੀ"
 
@@ -728,51 +745,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:766
+#: ../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:771
+#: ../contrib/command-not-found/pk-command-not-found.c:780
 #, c-format
 msgid "Install package '%s' to provide command '%s'?"
 msgstr "ਕਮਾਂਡ '%2$s' ਦੇਣ ਲਈ ਪੈਕੇਜ '%1$s' ਇੰਸਟਾਲ ਕਰਨਾ ਹੈ?"
 
 #. TRANSLATORS: Show the user a list of packages that provide this command
-#: ../contrib/command-not-found/pk-command-not-found.c:795
+#: ../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:805
+#: ../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:814
+#: ../contrib/command-not-found/pk-command-not-found.c:823
 msgid "Please choose a package to install"
 msgstr "ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਪੈਕੇਜ ਚੁਣੋ ਜੀ"
 
@@ -785,7 +802,7 @@ msgstr "ਇੰਸਟਾਲ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"
 #: ../contrib/debuginfo-install/pk-debuginfo-install.c:409
 #, c-format
 msgid "Failed to find the package %s, or already installed: %s"
-msgstr "ਪੈਕੇਜ %s ਲੱਭਣ ਵਿੱਚ ਫੇਲ, ਜਾਂ ਪਹਿਲਾਂ ਹੀ ਇੰਸਟਾਲ ਹੈ: %s"
+msgstr "ਪੈਕੇਜ %s ਲੱਭਣ ਵਿੱਚ ਫੇਲ੍ਹ, ਜਾਂ ਪਹਿਲਾਂ ਹੀ ਇੰਸਟਾਲ ਹੈ: %s"
 
 #. command line argument, simulate what would be done, but don't actually do it
 #: ../contrib/debuginfo-install/pk-debuginfo-install.c:518
@@ -851,31 +868,31 @@ msgstr "%i ਯੋਗ ਅਤੇ %i ਅਯੋਗ ਸਰੋਤ ਲੱਭੇ ਹਨ
 #: ../contrib/debuginfo-install/pk-debuginfo-install.c:627
 #, c-format
 msgid "Finding debugging sources"
-msgstr "ਡੀਬੱਗਿੰਗ ਸਰੋਤ ਲੱਭ ਰਿਹਾ ਹੈ"
+msgstr "ਡੀਬੱਗ ਸਰੋਤ ਲੱਭੇ  ਜਾ ਰਹੇ ਹਨ"
 
 #. TRANSLATORS: tell the user what we found
 #: ../contrib/debuginfo-install/pk-debuginfo-install.c:660
 #, c-format
 msgid "Found %i disabled debuginfo repos."
-msgstr "%i ਅਯੋਗ debuginfo ਰਿਪੋ ਲੱਭੀਆਂ ਹਨ।"
+msgstr "%i ਆਯੋਗ debuginfo ਰਿਪੋ ਲੱਭੀਆਂ ਹਨ।"
 
 #. TRANSLATORS: we're now enabling all the debug sources we found
 #: ../contrib/debuginfo-install/pk-debuginfo-install.c:667
 #, c-format
 msgid "Enabling debugging sources"
-msgstr "ਡੀਬੱਗਿੰਗ ਸਰੋਤ ਯੋਗ ਕਰ ਰਿਹਾ ਹੈ"
+msgstr "ਡੀਬੱਗਿ ਸਰੋਤ ਯੋਗ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"
 
 #. TRANSLATORS: tell the user how many we enabled
 #: ../contrib/debuginfo-install/pk-debuginfo-install.c:695
 #, c-format
 msgid "Enabled %i debugging sources."
-msgstr "%i ਡੀਬੱਗਿੰਗ ਸਰੋਤ ਯੋਗ ਕੀਤਾ ਹੈ।"
+msgstr "%i ਡੀਬੱਗ ਸਰੋਤ ਯੋਗ ਕੀਤਾ ਹੈ।"
 
 #. TRANSLATORS: we're now finding packages that match in all the repos
 #: ../contrib/debuginfo-install/pk-debuginfo-install.c:702
 #, c-format
 msgid "Finding debugging packages"
-msgstr "ਡੀਬੱਗਿੰਗ ਪੈਕੇਜ ਲੱਭਿਆ ਜਾ ਰਿਹਾ ਹੈ।"
+msgstr "ਡੀਬੱਗ ਪੈਕੇਜ ਲੱਭੇ ਜਾ ਰਹੇ ਹਨ।"
 
 #. TRANSLATORS: we couldn't find the package name, non-fatal
 #: ../contrib/debuginfo-install/pk-debuginfo-install.c:714
@@ -899,13 +916,13 @@ msgstr "ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਕੋਈ ਨਵਾਂ ਪੈਕੇ
 #: ../contrib/debuginfo-install/pk-debuginfo-install.c:779
 #, c-format
 msgid "Found %i packages:"
-msgstr "%i ਪੈਕੇਜ ਲੱਭਿਆ:"
+msgstr "%i ਪੈਕੇਜ ਲੱਭੇ:"
 
 #. TRANSLATORS: tell the user we are searching for deps
 #: ../contrib/debuginfo-install/pk-debuginfo-install.c:795
 #, c-format
 msgid "Finding packages that depend on these packages"
-msgstr "ਪੈਕੇਜ ਲੱਭ ਰਿਹਾ ਜੋ ਇਹਨਾਂ ਪੈਕੇਜਾਂ ਤੇ ਨਿਰਭਰ ਕਰਦੇ ਹਨ"
+msgstr "ਪੈਕੇਜ ਲੱਭੇ ਜਾ ਰਹੇ ਹਨ, ਜੋ ਇਹਨਾਂ ਪੈਕੇਜਾਂ ਤੇ ਨਿਰਭਰ ਕਰਦੇ ਹਨ"
 
 #. TRANSLATORS: could not install, detailed error follows
 #: ../contrib/debuginfo-install/pk-debuginfo-install.c:808
@@ -940,7 +957,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 "ਪੈਕੇਜ ਇੰਸਟਾਲ ਕੀਤੇ ਜਾ ਰਹੇ ਹਨ"
@@ -949,113 +966,113 @@ msgstr "ਪੈਕੇਜ ਇੰਸਟਾਲ ਕੀਤੇ ਜਾ ਰਹੇ ਹਨ"
 #: ../contrib/debuginfo-install/pk-debuginfo-install.c:875
 #, c-format
 msgid "Could not install packages: %s"
-msgstr "ਪੈਕੇਜ ਇੰਸਟਾਲ ਨਹੀਂ ਕਰ ਸਕਿਆ: %s"
+msgstr "ਪੈਕੇਜ ਇੰਸਟਾਲ ਨਹੀਂ ਕੀਤੇ ਜਾ ਸਕੇ: %s"
 
 #. TRANSLATORS: we are now disabling all debuginfo repos we previously enabled
 #: ../contrib/debuginfo-install/pk-debuginfo-install.c:907
 #, c-format
 msgid "Disabling sources previously enabled"
-msgstr "ਪਹਿਲਾਂ ਯੋਗ ਕੀਤੇ ਸਰੋਤ ਅਯੋਗ ਕਰ ਰਿਹਾ"
+msgstr "ਪਹਿਲਾਂ ਯੋਗ ਕੀਤੇ ਸਰੋਤ ਆਯੋਗ ਕੀਤੇ ਜਾ ਰਹੇ ਹਨ"
 
 #. TRANSLATORS: no debuginfo packages could be found to be installed, detailed error follows
 #: ../contrib/debuginfo-install/pk-debuginfo-install.c:919
 #, c-format
 msgid "Could not disable the debugging sources: %s"
-msgstr "ਡੀਬੱਗਿੰਗ ਸਰੋਤ ਨੂੰ ਅਯੋਗ ਨਹੀਂ ਕਰ ਸਕਿਆ: %s"
+msgstr "ਡੀਬੱਗ ਸਰੋਤ ਨੂੰ ਅਯੋਗ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ: %s"
 
 #. TRANSLATORS: we disabled all the debugging repos that we enabled before
 #: ../contrib/debuginfo-install/pk-debuginfo-install.c:934
 #, c-format
 msgid "Disabled %i debugging sources."
-msgstr "%i ਡੀਬੱਗਿੰਗ ਸਰੋਤ ਅਯੋਗ ਕੀਤੇ ਹਨ।"
+msgstr "%i ਡੀਬੱਗ ਸਰੋਤ ਅਯੋਗ ਕੀਤੇ ਗਏ।"
 
 #. TRANSLATORS: couldn't open device to write
-#: ../contrib/device-rebind/pk-device-rebind.c:61
+#: ../contrib/device-rebind/pk-device-rebind.c:62
 msgid "Failed to open file"
 msgstr "ਫਾਇਲ ਖੋਲਣ ਲਈ ਫੇਲ੍ਹ"
 
 #. TRANSLATORS: could not write to the device
-#: ../contrib/device-rebind/pk-device-rebind.c:70
+#: ../contrib/device-rebind/pk-device-rebind.c:71
 msgid "Failed to write to the file"
 msgstr "ਫਾਇਲ ਵਿੱਚ ਲਿਖਣ ਤੋਂ ਫੇਲ੍ਹ ਹੈ"
 
 #. TRANSLATORS: we failed to release the current driver
-#: ../contrib/device-rebind/pk-device-rebind.c:110
-#: ../contrib/device-rebind/pk-device-rebind.c:147
+#: ../contrib/device-rebind/pk-device-rebind.c:111
+#: ../contrib/device-rebind/pk-device-rebind.c:148
 msgid "Failed to write to device"
 msgstr "ਜੰਤਰ ਤੇ ਲਿਖਣ ਲਈ ਫੇਲ੍ਹ ਹੈ"
 
 #. TRANSLATORS: the device could not be found in sysfs
-#: ../contrib/device-rebind/pk-device-rebind.c:175
+#: ../contrib/device-rebind/pk-device-rebind.c:176
 msgid "Device could not be found"
 msgstr "ਜੰਤਰ ਨਹੀਂ ਲੱਭਿਆ ਜਾ ਸਕਿਆ"
 
 #. TRANSLATORS: we failed to release the current driver
-#: ../contrib/device-rebind/pk-device-rebind.c:202
+#: ../contrib/device-rebind/pk-device-rebind.c:203
 msgid "Failed to unregister driver"
 msgstr "ਡਰਾਈਵਰ ਅਣ-ਰਜਿਸਟਰ ਕਰਨ ਵਿੱਚ ਫੇਲ੍ਹ"
 
 #. TRANSLATORS: we failed to bind the old driver
-#: ../contrib/device-rebind/pk-device-rebind.c:211
+#: ../contrib/device-rebind/pk-device-rebind.c:212
 msgid "Failed to register driver"
 msgstr "ਡਰਾਇਵ ਰਜਿਸਟਰ ਕਰਨ ਲਈ ਫੇਲ੍ਹ"
 
 #. TRANSLATORS: user did not specify a device sysfs path that exists
-#: ../contrib/device-rebind/pk-device-rebind.c:260
+#: ../contrib/device-rebind/pk-device-rebind.c:261
 msgid "Device path not found"
 msgstr "ਜੰਤਰ ਟਿਕਾਣਾ ਨਹੀਂ ਲੱਭਿਆ"
 
 #. TRANSLATORS: user did not specify a valid device sysfs path
-#: ../contrib/device-rebind/pk-device-rebind.c:268
+#: ../contrib/device-rebind/pk-device-rebind.c:269
 msgid "Incorrect device path specified"
 msgstr "ਗਲਤ ਜੰਤਰ ਟਿਕਾਣਾ ਦਿੱਤਾ ਹੈ"
 
-#: ../contrib/device-rebind/pk-device-rebind.c:293
+#: ../contrib/device-rebind/pk-device-rebind.c:294
 msgid "Show extra debugging information"
 msgstr "ਹੋਰ ਡੀਬੱਗ ਜਾਣਕਾਰੀ ਵੇਖੋ"
 
 #. command line argument, simulate what would be done, but don't actually do it
-#: ../contrib/device-rebind/pk-device-rebind.c:296
+#: ../contrib/device-rebind/pk-device-rebind.c:297
 msgid "Don't actually touch the hardware, only simulate what would be done"
 msgstr "ਹਾਰਡਵੇਅਰ ਨੂੰ ਛੇੜੋ ਨਾ, ਸਿਰਫ ਜੋ ਕਰਨਾ ਹੈ, ਉਸ ਦੀ ਨਕਲ ਕਰੋ"
 
 #. TRANSLATORS: command line option: a list of files to install
-#: ../contrib/device-rebind/pk-device-rebind.c:299
+#: ../contrib/device-rebind/pk-device-rebind.c:300
 msgid "Device paths"
 msgstr "ਜੰਤਰ ਟਿਕਾਣਾ"
 
 #. TRANSLATORS: tool that gets called when the device needs reloading after installing firmware
-#: ../contrib/device-rebind/pk-device-rebind.c:314
+#: ../contrib/device-rebind/pk-device-rebind.c:315
 msgid "PackageKit Device Reloader"
 msgstr "ਪੈਕੇਜਕਿੱਟ ਜੰਤਰ ਰੀਲੋਡਰ"
 
 #. TRANSLATORS: user did not specify a valid device sysfs path
-#: ../contrib/device-rebind/pk-device-rebind.c:322
+#: ../contrib/device-rebind/pk-device-rebind.c:323
 msgid "You need to specify at least one valid device path"
 msgstr "ਤੁਹਾਨੂੰ ਘੱਟੋ-ਘੱਟ ਇੱਕ ਯੋਗ ਜੰਤਰ ਟਿਕਾਣਾ ਦੇਣ ਦੀ ਲੋੜ ਹੈ"
 
 #. TRANSLATORS: user did not specify a valid device sysfs path
-#: ../contrib/device-rebind/pk-device-rebind.c:332
+#: ../contrib/device-rebind/pk-device-rebind.c:333
 msgid "This script can only be used by the root user"
-msgstr "ਇਹ ਸਕਰਿਪਟ ਕੇਵਲ ਰੂਟ ਯੂਜ਼ਰ ਵਲੋਂ ਹੀ ਵਰਤੀ ਜਾ ਸਕਦੀ ਹੈ"
+msgstr "ਇਹ ਸਕ੍ਰਿਪਟ ਕੇਵਲ ਰੂਟ ਯੂਜ਼ਰ ਵਲੋਂ ਹੀ ਵਰਤੀ ਜਾ ਸਕਦੀ ਹੈ"
 
 #. TRANSLATORS: we're going to verify the path first
-#: ../contrib/device-rebind/pk-device-rebind.c:341
+#: ../contrib/device-rebind/pk-device-rebind.c:342
 msgid "Verifying device path"
 msgstr "ਜੰਤਰ ਟਿਕਾਣੇ ਦੀ ਜਾਂਚ ਹੋ ਰਹੀ ਹੈ"
 
 #. TRANSLATORS: user did not specify a device sysfs path that exists
-#: ../contrib/device-rebind/pk-device-rebind.c:346
+#: ../contrib/device-rebind/pk-device-rebind.c:347
 msgid "Failed to verify device path"
 msgstr "ਜੰਤਰ ਟਿਕਾਣਾ ਜਾਂਚ ਲਈ ਫੇਲ੍ਹ ਹੈ"
 
 #. TRANSLATORS: we're going to try
-#: ../contrib/device-rebind/pk-device-rebind.c:360
+#: ../contrib/device-rebind/pk-device-rebind.c:361
 msgid "Attempting to rebind device"
 msgstr "ਜੰਤਰ ਰੀਬਾਈਂਡ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਜਾਰੀ"
 
 #. TRANSLATORS: we failed to release the current driver
-#: ../contrib/device-rebind/pk-device-rebind.c:365
+#: ../contrib/device-rebind/pk-device-rebind.c:366
 msgid "Failed to rebind device"
 msgstr "ਜੰਤਰ ਰੀਬਾਈਂਡ ਕਰਨ ਲਈ ਫੇਲ੍ਹ ਹੈ"
 
@@ -1077,7 +1094,7 @@ msgid "Please enter a number from 1 to %i: "
 msgstr "੧ ਤੋਂ %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 "ਇੱਕ ਤੋਂ ਵੱਧ ਰਲਦੇ ਪੈਕੇਜ ਲੱਭੇ:"
 
@@ -1087,448 +1104,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 "ਤਬਦੀਲੀਆਂ ਦੀ ਜਾਂਚ ਹੋ ਰਹੀ ਹੈ"
+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 "ਤਬਦੀਲੀਆਂ ਕਮਿੱਟ ਕਰ ਰਿਹਾ ਹੈ"
+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 "ਮੁਕੰਮਲ ਕਰ ਰਿਹਾ ਹੈ"
+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 "ਰੱਦ ਕਰ ਰਿਹਾ ਹੈ"
+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 "ਥੋੜਾ"
+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 "ਨਿਰਭਰਤਾ ਲੈ ਰਿਹਾ ਹੈ"
+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 "ਰੱਦ ਕਰ ਰਿਹਾ ਹੈ"
+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 "ਟਰਾਂਸੈਕਸ਼ਨ ਲਏ ਜਾ ਰਹੇ ਹਨ"
+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 "ਅੱਪਡੇਟ ਦੀ ਨਕਲ ਜਾਰੀ"
 
@@ -1575,7 +1592,7 @@ msgstr "ਕੁੰਜੀ ਫਿੰਗਰਪਰਿੰਟ"
 #. TRANSLATORS: the timestamp (a bit like a machine readable time)
 #: ../lib/packagekit-glib2/pk-task-text.c:144
 msgid "Key Timestamp"
-msgstr "ਕੁੰਜੀ ਟਾਈਮਸਟੈਂਪ"
+msgstr "ਕੁੰਜੀ ਟਾਈਮ-ਸਟੈਂਪ"
 
 #. TRANSLATORS: ask the user if they want to import
 #: ../lib/packagekit-glib2/pk-task-text.c:157
@@ -1684,7 +1701,7 @@ msgstr "EULA ਮਨਜ਼ੂਰ"
 
 #: ../policy/org.freedesktop.packagekit.policy.in.h:8
 msgid "Authentication is required to accept a EULA"
-msgstr "EULA  ਮਨਜ਼ੂਰ ਕਰਨ ਲਈ ਪਰਮਾਣਕਿਤਾ ਦੀ ਲੋੜ ਹੈ"
+msgstr "EULA ਮਨਜ਼ੂਰ ਕਰਨ ਲਈ ਪਰਮਾਣਕਿਤਾ ਦੀ ਲੋੜ ਹੈ"
 
 #: ../policy/org.freedesktop.packagekit.policy.in.h:9
 msgid "Authentication is required to cancel a task that was not started by yourself"
@@ -1911,7 +1928,7 @@ msgstr "ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਗਲਤੀ:"
 
 #: ../src/pk-polkit-action-lookup.c:150
 msgid "To install debugging packages, extra sources need to be enabled"
-msgstr "ਡੀਬੱਗਿੰਗ ਪੈਕੇਜ ਇੰਸਟਾਲ ਕਰਨ ਲਈ, ਵਾਧੂ ਸਰੋਤ ਯੋਗ ਕਰਨ ਦੀ ਲੋੜ ਹੈ"
+msgstr "ਡੀਬੱਗ ਪੈਕੇਜ ਇੰਸਟਾਲ ਕਰਨ ਲਈ, ਵਾਧੂ ਸਰੋਤ ਯੋਗ ਕਰਨ ਦੀ ਲੋੜ ਹੈ"
 
 #. TRANSLATORS: is not GPG signed
 #: ../src/pk-polkit-action-lookup.c:171 ../src/pk-polkit-action-lookup.c:190
@@ -1920,24 +1937,24 @@ msgstr "ਸਾਫਟਵੇਅਰ ਇੱਕ ਭਰੋਸੇਯੋਗ ਸਰੋਤ
 
 #: ../src/pk-polkit-action-lookup.c:176
 msgid "Do not update this package unless you are sure it is safe to do so."
-msgstr "ਇਸ ਪੈਕੇਜ ਨੂੰ ਅੱਪਡੇਟ ਨਾ ਕਰੋ ਜਦੋਂ ਤੱਕ ਤੁਹਾਨੂੰ ਇਸ ਬਾਰੇ ਪਤਾ ਨਹੀਂ।"
+msgstr "ਇਸ ਪੈਕੇਜ ਨੂੰ ਅੱਪਡੇਟ ਨਾ ਕਰੋ, ਜਦੋਂ ਤੱਕ ਤੁਹਾਨੂੰ ਇਸ ਬਾਰੇ ਪਤਾ ਨਹੀਂ।"
 
 #: ../src/pk-polkit-action-lookup.c:177
 msgid "Do not update these packages unless you are sure it is safe to do so."
-msgstr "ਇਹਨਾਂ ਪੈਕੇਜਾਂ ਨੂੰ ਅੱਪਡੇਟ ਨਾ ਕਰੋ ਜਦੋਂ ਤੱਕ ਤੁਹਾਨੂੰ ਇਸ ਬਾਰੇ ਪਤਾ ਨਹੀਂ।"
+msgstr "ਇਹਨਾਂ ਪੈਕੇਜਾਂ ਨੂੰ ਅੱਪਡੇਟ ਨਾ ਕਰੋ, ਜਦੋਂ ਤੱਕ ਤੁਹਾਨੂੰ ਇਸ ਬਾਰੇ ਪਤਾ ਨਹੀਂ।"
 
 #: ../src/pk-polkit-action-lookup.c:195
 msgid "Do not install this package unless you are sure it is safe to do so."
-msgstr "ਇਸ ਪੈਕੇਜ ਨੂੰ ਇੰਸਟਾਲ ਨਾ ਕਰੋ ਜਦੋਂ ਤੱਕ ਤੁਹਾਨੂੰ ਇਸ ਬਾਰੇ ਪਤਾ ਨਹੀਂ।"
+msgstr "ਇਸ ਪੈਕੇਜ ਨੂੰ ਇੰਸਟਾਲ ਨਾ ਕਰੋ, ਜਦੋਂ ਤੱਕ ਤੁਹਾਨੂੰ ਇਸ ਬਾਰੇ ਪਤਾ ਨਹੀਂ।"
 
 #: ../src/pk-polkit-action-lookup.c:196
 msgid "Do not install these packages unless you are sure it is safe to do so."
-msgstr "ਇਹਨਾਂ ਪੈਕੇਜਾਂ ਨੂੰ ਇੰਸਟਾਲ ਨਾ ਕਰੋ ਜਦੋਂ ਤੱਕ ਤੁਹਾਨੂੰ ਇਸ ਬਾਰੇ ਪਤਾ ਨਹੀਂ।"
+msgstr "ਇਹਨਾਂ ਪੈਕੇਜਾਂ ਨੂੰ ਇੰਸਟਾਲ ਨਾ ਕਰੋ, ਜਦੋਂ ਤੱਕ ਤੁਹਾਨੂੰ ਇਸ ਬਾਰੇ ਪਤਾ ਨਹੀਂ।"
 
 #. TRANSLATORS: too many packages to list each one
 #: ../src/pk-polkit-action-lookup.c:273
 msgid "Many packages"
-msgstr "ਬਹੁਤੇ ਪੈਕੇਜ"
+msgstr "ਕਈ ਪੈਕੇਜ"
 
 #. TRANSLATORS: if the transaction is forced to install only trusted packages
 #: ../src/pk-polkit-action-lookup.c:339
@@ -1947,33 +1964,33 @@ msgstr "ਸਿਰਫ ਭਰੋਸੇਯੋਗ"
 #. TRANSLATORS: turn on all debugging
 #: ../src/egg-debug.c:388
 msgid "Show debugging information for all files"
-msgstr "ਸਭ ਫਾਇਲਾਂ ਲਈ ਡੀਬੱਗਿੰਗ ਜਾਣਕਾਰੀ ਵੇਖਾਓ"
+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 "ਡੀਬੱਗਿੰਗ ਡਾਟੇ ਨੂੰ ਇੱਕ ਫਾਇਲ ਵਿੱਚ ਰੱਖੋ"
+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 "ਡੀਬੱਗਿੰਗ ਚੋਣਾਂ ਵੇਖਾਓ"
+msgstr "ਡੀਬੱਗਿੰਗ ਚੋਣਾਂ ਵੇਖੋ"
 
 #~ msgid "Malicious software can damage your computer or cause other harm."
 #~ msgstr "ਗਲਤ ਸਾਫਟਵੇਅਰ ਤੁਹਾਡੇ ਕੰਪਿਊਟਰ ਨੂੰ ਖਰਾਬ ਜਾਂ ਹੋਰ ਨੁਕਸਾਨ ਕਰ ਸਕਦਾ ਹੈ।"
 
 #~ msgid "Transaction failed with no error"
-#~ msgstr "ਬਿਨਾਂ ਕਿਸੇ ਗਲਤੀ ਟਰਾਂਸੈਕਸ਼ਨ ਫੇਲ ਹੋਈ"
+#~ msgstr "ਬਿਨਾਂ ਕਿਸੇ ਗਲਤੀ ਟਰਾਂਸੈਕਸ਼ਨ ਫੇਲ੍ਹ ਹੋਈ"
commit 2d546c059b47fa9bd77a81fe4935f7e47cd1b441
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu Apr 15 18:29:48 2010 +0100

    yum: Sync with libzif upstream which offers a pretty stellar performance increase

diff --git a/backends/yum/Makefile.am b/backends/yum/Makefile.am
index 241a8a7..95293d7 100644
--- a/backends/yum/Makefile.am
+++ b/backends/yum/Makefile.am
@@ -29,8 +29,6 @@ libpk_backend_yum_la_CFLAGS = $(PK_PLUGIN_CFLAGS) $(WARNINGFLAGS_C)
 libpk_backend_yum_la_SOURCES += 				\
 	libzif/egg-debug.c					\
 	libzif/egg-debug.h					\
-	libzif/egg-string.c					\
-	libzif/egg-string.h					\
 	libzif/zif.h						\
 	libzif/zif-lock.c					\
 	libzif/zif-lock.h					\
@@ -54,8 +52,10 @@ libpk_backend_yum_la_SOURCES += 				\
 	libzif/zif-store-remote.h				\
 	libzif/zif-md.c						\
 	libzif/zif-md.h						\
-	libzif/zif-md-filelists.c				\
-	libzif/zif-md-filelists.h				\
+	libzif/zif-md-filelists-sql.c				\
+	libzif/zif-md-filelists-sql.h				\
+	libzif/zif-md-filelists-xml.c				\
+	libzif/zif-md-filelists-xml.h				\
 	libzif/zif-md-primary-sql.c				\
 	libzif/zif-md-primary-sql.h				\
 	libzif/zif-md-other-sql.c				\
diff --git a/backends/yum/libzif/egg-string.c b/backends/yum/libzif/egg-string.c
deleted file mode 120000
index 2f33770..0000000
--- a/backends/yum/libzif/egg-string.c
+++ /dev/null
@@ -1 +0,0 @@
-../../../src/egg-string.c
\ No newline at end of file
diff --git a/backends/yum/libzif/egg-string.h b/backends/yum/libzif/egg-string.h
deleted file mode 120000
index 1440094..0000000
--- a/backends/yum/libzif/egg-string.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../src/egg-string.h
\ No newline at end of file
diff --git a/backends/yum/libzif/zif-changeset.c b/backends/yum/libzif/zif-changeset.c
index fc6d4f7..9d78c67 100644
--- a/backends/yum/libzif/zif-changeset.c
+++ b/backends/yum/libzif/zif-changeset.c
@@ -220,7 +220,7 @@ zif_changeset_parse_header (ZifChangeset *changeset, const gchar *header, GError
 	/* check if there is a version field */
 	len = strlen (header);
 	if (header[len-1] == '>') {
-		zif_changeset_set_author (changeset, temp);
+		zif_changeset_set_author (changeset, header);
 		ret = TRUE;
 		goto out;
 	}
diff --git a/backends/yum/libzif/zif-config.c b/backends/yum/libzif/zif-config.c
index 54e631e..1fba6cb 100644
--- a/backends/yum/libzif/zif-config.c
+++ b/backends/yum/libzif/zif-config.c
@@ -49,7 +49,6 @@
 #include "zif-monitor.h"
 
 #include "egg-debug.h"
-#include "egg-string.h"
 
 #define ZIF_CONFIG_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), ZIF_TYPE_CONFIG, ZifConfigPrivate))
 
@@ -216,8 +215,8 @@ guint
 zif_config_get_uint (ZifConfig *config, const gchar *key, GError **error)
 {
 	gchar *value;
-	gboolean ret;
 	guint retval = G_MAXUINT;
+	gchar *endptr = NULL;
 
 	g_return_val_if_fail (ZIF_IS_CONFIG (config), G_MAXUINT);
 	g_return_val_if_fail (key != NULL, G_MAXUINT);
@@ -229,8 +228,8 @@ zif_config_get_uint (ZifConfig *config, const gchar *key, GError **error)
 		goto out;
 
 	/* convert to int */
-	ret = egg_strtouint (value, &retval);
-	if (!ret) {
+	retval = g_ascii_strtoull (value, &endptr, 10);
+	if (value == endptr) {
 		g_set_error (error, ZIF_CONFIG_ERROR, ZIF_CONFIG_ERROR_FAILED,
 			     "failed to convert '%s' to unsigned integer", value);
 		goto out;
@@ -252,16 +251,16 @@ out:
 static guint
 zif_config_string_to_time (const gchar *value)
 {
-	gboolean ret;
 	guint len;
 	guint timeval = 0;
 	gchar suffix;
 	gchar *value_copy = NULL;
+	gchar *endptr = NULL;
 
 	g_return_val_if_fail (value != NULL, FALSE);
 
 	/* long enough */
-	len = egg_strlen (value, 10);
+	len = strlen (value);
 	if (len < 2)
 		goto out;
 
@@ -273,8 +272,8 @@ zif_config_string_to_time (const gchar *value)
 	value_copy[len-1] = '\0';
 
 	/* convert to number */
-	ret = egg_strtouint (value_copy, &timeval);
-	if (!ret) {
+	timeval = g_ascii_strtoull (value_copy, &endptr, 10);
+	if (value_copy == endptr) {
 		egg_warning ("failed to convert %s", value_copy);
 		goto out;
 	}
@@ -332,6 +331,27 @@ out:
 }
 
 /**
+ * zif_config_strreplace:
+ **/
+static gchar *
+zif_config_strreplace (const gchar *text, const gchar *find, const gchar *replace)
+{
+	gchar **array;
+	gchar *retval;
+
+	/* common case, not found */
+	if (g_strstr_len (text, -1, find) == NULL) {
+		return g_strdup (text);
+	}
+
+	/* split apart and rejoin with new delimiter */
+	array = g_strsplit (text, find, 0);
+	retval = g_strjoinv (replace, array);
+	g_strfreev (array);
+	return retval;
+}
+
+/**
  * zif_config_expand_substitutions:
  * @config: the #ZifConfig object
  * @text: string to scan, e.g. "http://fedora/$releasever/$basearch/moo.rpm"
@@ -364,8 +384,8 @@ zif_config_expand_substitutions (ZifConfig *config, const gchar *text, GError **
 		goto out;
 
 	/* do the replacements */
-	name1 = egg_strreplace (text, "$releasever", releasever);
-	name2 = egg_strreplace (name1, "$basearch", basearch);
+	name1 = zif_config_strreplace (text, "$releasever", releasever);
+	name2 = zif_config_strreplace (name1, "$basearch", basearch);
 
 out:
 	g_free (basearch);
@@ -673,7 +693,7 @@ zif_config_test (EggTest *test)
 	/************************************************************/
 	egg_test_title (test, "get cachedir");
 	value = zif_config_get_string (config, "cachedir", NULL);
-	if (egg_strequal (value, "../test/cache"))
+	if (g_strcmp0 (value, "../test/cache") == 0)
 		egg_test_success (test, NULL);
 	else
 		egg_test_failed (test, "invalid value '%s'", value);
@@ -706,7 +726,7 @@ zif_config_test (EggTest *test)
 	/************************************************************/
 	egg_test_title (test, "get cachedir");
 	value = zif_config_get_string (config, "cachedir", NULL);
-	if (egg_strequal (value, "/tmp/cache"))
+	if (g_strcmp0 (value, "/tmp/cache") == 0)
 		egg_test_success (test, NULL);
 	else
 		egg_test_failed (test, "invalid value '%s'", value);
@@ -720,7 +740,7 @@ zif_config_test (EggTest *test)
 	/************************************************************/
 	egg_test_title (test, "get cachedir");
 	value = zif_config_get_string (config, "cachedir", NULL);
-	if (egg_strequal (value, "../test/cache"))
+	if (g_strcmp0 (value, "../test/cache") == 0)
 		egg_test_success (test, NULL);
 	else
 		egg_test_failed (test, "invalid value '%s'", value);
@@ -729,7 +749,7 @@ zif_config_test (EggTest *test)
 	/************************************************************/
 	egg_test_title (test, "do substitutions (none)");
 	value = zif_config_expand_substitutions (config, "http://fedora/4/6/moo.rpm", NULL);
-	if (egg_strequal (value, "http://fedora/4/6/moo.rpm"))
+	if (g_strcmp0 (value, "http://fedora/4/6/moo.rpm") == 0)
 		egg_test_success (test, NULL);
 	else
 		egg_test_failed (test, "invalid value '%s'", value);
@@ -738,7 +758,7 @@ zif_config_test (EggTest *test)
 	/************************************************************/
 	egg_test_title (test, "do substitutions (both)");
 	value = zif_config_expand_substitutions (config, "http://fedora/$releasever/$basearch/moo.rpm", NULL);
-	if (egg_strequal (value, "http://fedora/11/i386/moo.rpm"))
+	if (g_strcmp0 (value, "http://fedora/11/i386/moo.rpm") == 0)
 		egg_test_success (test, NULL);
 	else
 		egg_test_failed (test, "invalid value '%s'", value);
@@ -755,7 +775,7 @@ zif_config_test (EggTest *test)
 
 	/************************************************************/
 	egg_test_title (test, "get basearch array value");
-	if (egg_strequal (array[0], "i386"))
+	if (g_strcmp0 (array[0], "i386") == 0)
 		egg_test_success (test, NULL);
 	else
 		egg_test_failed (test, "invalid value '%s'", array[0]);
@@ -776,11 +796,6 @@ zif_config_test (EggTest *test)
 	egg_test_assert (test, (time == 0));
 
 	/************************************************************/
-	egg_test_title (test, "convert time (mixture)");
-	time = zif_config_string_to_time ("10d10s");
-	egg_test_assert (test, (time == 0));
-
-	/************************************************************/
 	egg_test_title (test, "convert time (seconds)");
 	time = zif_config_string_to_time ("10s");
 	egg_test_assert (test, (time == 10));
diff --git a/backends/yum/libzif/zif-groups.c b/backends/yum/libzif/zif-groups.c
index e674cb9..9974d02 100644
--- a/backends/yum/libzif/zif-groups.c
+++ b/backends/yum/libzif/zif-groups.c
@@ -41,7 +41,6 @@
 #include "zif-monitor.h"
 
 #include "egg-debug.h"
-#include "egg-string.h"
 
 #define ZIF_GROUPS_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), ZIF_TYPE_GROUPS, ZifGroupsPrivate))
 
@@ -440,10 +439,10 @@ zif_groups_test (EggTest *test)
 	egg_test_title (test, "get groups");
 	groups_bit = zif_groups_get_groups (groups, NULL);
 	text = pk_group_bitfield_to_string (groups_bit);
-	if (egg_strequal (text, "admin-tools;desktop-gnome;desktop-kde;desktop-other;"
-				"education;fonts;games;graphics;internet;"
-				"legacy;localization;multimedia;office;other;programming;"
-				"publishing;servers;system;virtualization"))
+	if (g_strcmp0 (text, "admin-tools;desktop-gnome;desktop-kde;desktop-other;"
+			     "education;fonts;games;graphics;internet;"
+			     "legacy;localization;multimedia;office;other;programming;"
+			     "publishing;servers;system;virtualization") == 0)
 		egg_test_success (test, NULL);
 	else
 		egg_test_failed (test, "invalid groups '%s'", text);
@@ -461,7 +460,7 @@ zif_groups_test (EggTest *test)
 	/************************************************************/
 	egg_test_title (test, "get group for cat");
 	group = zif_groups_get_group_for_cat (groups, "language-support;kashubian-support", NULL);
-	if (egg_strequal (pk_group_enum_to_text (group), "localization"))
+	if (g_strcmp0 (pk_group_enum_to_text(group), "localization") == 0)
 		egg_test_success (test, NULL);
 	else
 		egg_test_failed (test, "invalid groups '%s'", pk_group_enum_to_text (group));
diff --git a/backends/yum/libzif/zif-lock.c b/backends/yum/libzif/zif-lock.c
index cb80eb9..e5c8f14 100644
--- a/backends/yum/libzif/zif-lock.c
+++ b/backends/yum/libzif/zif-lock.c
@@ -406,7 +406,7 @@ zif_lock_test (EggTest *test)
 	/************************************************************/
 	egg_test_title (test, "get pidfile");
 	pidfile = zif_config_get_string (config, "pidfile", NULL);
-	if (egg_strequal (pidfile, "../test/run/zif.lock"))
+	if (g_strcmp0 (pidfile, "../test/run/zif.lock") == 0)
 		egg_test_success (test, NULL);
 	else
 		egg_test_failed (test, "invalid value '%s'", pidfile);
diff --git a/backends/yum/libzif/zif-md-comps.c b/backends/yum/libzif/zif-md-comps.c
index 29803ff..3d0b966 100644
--- a/backends/yum/libzif/zif-md-comps.c
+++ b/backends/yum/libzif/zif-md-comps.c
@@ -38,7 +38,6 @@
 #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))
 
diff --git a/backends/yum/libzif/zif-md-filelists-sql.c b/backends/yum/libzif/zif-md-filelists-sql.c
new file mode 100644
index 0000000..4ee6a55
--- /dev/null
+++ b/backends/yum/libzif/zif-md-filelists-sql.c
@@ -0,0 +1,442 @@
+/* -*- 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-sql
+ * @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-sql.h"
+
+#include "egg-debug.h"
+
+#define ZIF_MD_FILELISTS_SQL_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), ZIF_TYPE_MD_FILELISTS_SQL, ZifMdFilelistsSqlPrivate))
+
+/**
+ * ZifMdFilelistsSqlPrivate:
+ *
+ * Private #ZifMdFilelistsSql data
+ **/
+struct _ZifMdFilelistsSqlPrivate
+{
+	gboolean		 loaded;
+	sqlite3			*db;
+};
+
+typedef struct {
+	gchar			*filename;
+	GPtrArray		*array;
+} ZifMdFilelistsSqlData;
+
+G_DEFINE_TYPE (ZifMdFilelistsSql, zif_md_filelists_sql, ZIF_TYPE_MD)
+
+/**
+ * zif_md_filelists_sql_unload:
+ **/
+static gboolean
+zif_md_filelists_sql_unload (ZifMd *md, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	gboolean ret = FALSE;
+	return ret;
+}
+
+/**
+ * zif_md_filelists_sql_load:
+ **/
+static gboolean
+zif_md_filelists_sql_load (ZifMd *md, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	const gchar *filename;
+	gint rc;
+	ZifMdFilelistsSql *filelists = ZIF_MD_FILELISTS_SQL (md);
+
+	g_return_val_if_fail (ZIF_IS_MD_FILELISTS_SQL (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_sql_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_sql_sqlite_get_files_cb:
+ **/
+static gint
+zif_md_filelists_sql_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;
+	ZifMdFilelistsSqlData *fldata = (ZifMdFilelistsSqlData *) 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_sql_search_file:
+ **/
+static GPtrArray *
+zif_md_filelists_sql_search_file (ZifMd *md, 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;
+	ZifMdFilelistsSql *md_filelists_sql = ZIF_MD_FILELISTS_SQL (md);
+	ZifMdFilelistsSqlData *data = NULL;
+
+	g_return_val_if_fail (ZIF_IS_MD_FILELISTS_SQL (md), NULL);
+	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+	/* if not already loaded, load */
+	if (!md_filelists_sql->priv->loaded) {
+		ret = zif_md_load (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[0]);
+	filename = g_path_get_basename (search[0]);
+	egg_debug ("dirname=%s, filename=%s", dirname, filename);
+
+	/* create data struct we can pass to the callback */
+	data = g_new0 (ZifMdFilelistsSqlData, 1);
+	data->filename = g_path_get_basename (search[0]);
+	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_filelists_sql->priv->db, statement, zif_md_filelists_sql_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_filelists_sql->priv->db, statement, zif_md_filelists_sql_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_sql_finalize:
+ **/
+static void
+zif_md_filelists_sql_finalize (GObject *object)
+{
+	ZifMdFilelistsSql *md;
+
+	g_return_if_fail (object != NULL);
+	g_return_if_fail (ZIF_IS_MD_FILELISTS_SQL (object));
+	md = ZIF_MD_FILELISTS_SQL (object);
+
+	sqlite3_close (md->priv->db);
+
+	G_OBJECT_CLASS (zif_md_filelists_sql_parent_class)->finalize (object);
+}
+
+/**
+ * zif_md_filelists_sql_class_init:
+ **/
+static void
+zif_md_filelists_sql_class_init (ZifMdFilelistsSqlClass *klass)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS (klass);
+	ZifMdClass *md_class = ZIF_MD_CLASS (klass);
+	object_class->finalize = zif_md_filelists_sql_finalize;
+
+	/* map */
+	md_class->load = zif_md_filelists_sql_load;
+	md_class->unload = zif_md_filelists_sql_unload;
+	md_class->search_file = zif_md_filelists_sql_search_file;
+	g_type_class_add_private (klass, sizeof (ZifMdFilelistsSqlPrivate));
+}
+
+/**
+ * zif_md_filelists_sql_init:
+ **/
+static void
+zif_md_filelists_sql_init (ZifMdFilelistsSql *md)
+{
+	md->priv = ZIF_MD_FILELISTS_SQL_GET_PRIVATE (md);
+	md->priv->loaded = FALSE;
+	md->priv->db = NULL;
+}
+
+/**
+ * zif_md_filelists_sql_new:
+ *
+ * Return value: A new #ZifMdFilelistsSql class instance.
+ *
+ * Since: 0.0.1
+ **/
+ZifMdFilelistsSql *
+zif_md_filelists_sql_new (void)
+{
+	ZifMdFilelistsSql *md;
+	md = g_object_new (ZIF_TYPE_MD_FILELISTS_SQL, NULL);
+	return ZIF_MD_FILELISTS_SQL (md);
+}
+
+/***************************************************************************
+ ***                          MAKE CHECK TESTS                           ***
+ ***************************************************************************/
+#ifdef EGG_TEST
+#include "egg-test.h"
+
+void
+zif_md_filelists_sql_test (EggTest *test)
+{
+	ZifMdFilelistsSql *md;
+	gboolean ret;
+	GError *error = NULL;
+	GPtrArray *array;
+	const gchar *pkgid;
+	GCancellable *cancellable;
+	ZifCompletion *completion;
+	const gchar *data[] = { "/usr/bin/gnome-power-manager", NULL };
+
+	if (!egg_test_start (test, "ZifMdFilelistsSql"))
+		return;
+
+	/* use */
+	cancellable = g_cancellable_new ();
+	completion = zif_completion_new ();
+
+	/************************************************************/
+	egg_test_title (test, "get store_remote md");
+	md = zif_md_filelists_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_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_sql_search_file (md, data, 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-sql.h b/backends/yum/libzif/zif-md-filelists-sql.h
new file mode 100644
index 0000000..ce406bd
--- /dev/null
+++ b/backends/yum/libzif/zif-md-filelists-sql.h
@@ -0,0 +1,63 @@
+/* -*- 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_SQL_H
+#define __ZIF_MD_FILELISTS_SQL_H
+
+#include <glib-object.h>
+
+#include "zif-md.h"
+
+G_BEGIN_DECLS
+
+#define ZIF_TYPE_MD_FILELISTS_SQL		(zif_md_filelists_sql_get_type ())
+#define ZIF_MD_FILELISTS_SQL(o)			(G_TYPE_CHECK_INSTANCE_CAST ((o), ZIF_TYPE_MD_FILELISTS_SQL, ZifMdFilelistsSql))
+#define ZIF_MD_FILELISTS_SQL_CLASS(k)		(G_TYPE_CHECK_CLASS_CAST((k), ZIF_TYPE_MD_FILELISTS_SQL, ZifMdFilelistsSqlClass))
+#define ZIF_IS_MD_FILELISTS_SQL(o)		(G_TYPE_CHECK_INSTANCE_TYPE ((o), ZIF_TYPE_MD_FILELISTS_SQL))
+#define ZIF_IS_MD_FILELISTS_SQL_CLASS(k)	(G_TYPE_CHECK_CLASS_TYPE ((k), ZIF_TYPE_MD_FILELISTS_SQL))
+#define ZIF_MD_FILELISTS_SQL_GET_CLASS(o)	(G_TYPE_INSTANCE_GET_CLASS ((o), ZIF_TYPE_MD_FILELISTS_SQL, ZifMdFilelistsSqlClass))
+
+typedef struct _ZifMdFilelistsSql		ZifMdFilelistsSql;
+typedef struct _ZifMdFilelistsSqlPrivate	ZifMdFilelistsSqlPrivate;
+typedef struct _ZifMdFilelistsSqlClass		ZifMdFilelistsSqlClass;
+
+struct _ZifMdFilelistsSql
+{
+	ZifMd					 parent;
+	ZifMdFilelistsSqlPrivate		*priv;
+};
+
+struct _ZifMdFilelistsSqlClass
+{
+	ZifMdClass				 parent_class;
+};
+
+GType			 zif_md_filelists_sql_get_type		(void);
+ZifMdFilelistsSql	*zif_md_filelists_sql_new		(void);
+
+G_END_DECLS
+
+#endif /* __ZIF_MD_FILELISTS_SQL_H */
+
diff --git a/backends/yum/libzif/zif-md-filelists-xml.c b/backends/yum/libzif/zif-md-filelists-xml.c
new file mode 100644
index 0000000..07cee6c
--- /dev/null
+++ b/backends/yum/libzif/zif-md-filelists-xml.c
@@ -0,0 +1,585 @@
+/* -*- 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-filelists-xml
+ * @short_description: FilelistsXml metadata functionality
+ *
+ * Provide access to the filelists_xml repo metadata.
+ * This object is a subclass of #ZifMd
+ */
+
+typedef enum {
+	ZIF_MD_FILELISTS_XML_SECTION_LIST,
+	ZIF_MD_FILELISTS_XML_SECTION_UNKNOWN
+} ZifMdFilelistsXmlSection;
+
+typedef enum {
+	ZIF_MD_FILELISTS_XML_SECTION_LIST_PACKAGE,
+	ZIF_MD_FILELISTS_XML_SECTION_LIST_UNKNOWN
+} ZifMdFilelistsXmlSectionList;
+
+typedef enum {
+	ZIF_MD_FILELISTS_XML_SECTION_LIST_PACKAGE_FILE,
+	ZIF_MD_FILELISTS_XML_SECTION_LIST_PACKAGE_UNKNOWN
+} ZifMdFilelistsXmlSectionListPackage;
+
+#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-xml.h"
+
+#include "egg-debug.h"
+
+#define ZIF_MD_FILELISTS_XML_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), ZIF_TYPE_MD_FILELISTS_XML, ZifMdFilelistsXmlPrivate))
+
+/**
+ * ZifMdFilelistsXmlPrivate:
+ *
+ * Private #ZifMdFilelistsXml data
+ **/
+struct _ZifMdFilelistsXmlPrivate
+{
+	gboolean			 loaded;
+	ZifMdFilelistsXmlSection	 section;
+	ZifMdFilelistsXmlSectionList	 section_list;
+	ZifMdFilelistsXmlSectionListPackage	section_list_package;
+	ZifPackage			*package_temp;
+	GPtrArray			*array;
+	GPtrArray			*array_temp;
+};
+
+G_DEFINE_TYPE (ZifMdFilelistsXml, zif_md_filelists_xml, ZIF_TYPE_MD)
+
+/**
+ * zif_md_filelists_xml_unload:
+ **/
+static gboolean
+zif_md_filelists_xml_unload (ZifMd *md, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	gboolean ret = FALSE;
+	return ret;
+}
+
+/**
+ * zif_md_filelists_xml_parser_start_element:
+ **/
+static void
+zif_md_filelists_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;
+	ZifMdFilelistsXml *filelists_xml = user_data;
+
+	g_return_if_fail (ZIF_IS_MD_FILELISTS_XML (filelists_xml));
+
+	/* group element */
+	if (filelists_xml->priv->section == ZIF_MD_FILELISTS_XML_SECTION_UNKNOWN) {
+
+		/* start of update */
+		if (g_strcmp0 (element_name, "filelists") == 0) {
+			filelists_xml->priv->section = ZIF_MD_FILELISTS_XML_SECTION_LIST;
+			goto out;
+		}
+
+		egg_warning ("unhandled element: %s", element_name);
+		goto out;
+	}
+
+	/* update element */
+	if (filelists_xml->priv->section == ZIF_MD_FILELISTS_XML_SECTION_LIST) {
+
+		if (filelists_xml->priv->section_list == ZIF_MD_FILELISTS_XML_SECTION_LIST_UNKNOWN) {
+
+			if (g_strcmp0 (element_name, "package") == 0) {
+				filelists_xml->priv->section_list = ZIF_MD_FILELISTS_XML_SECTION_LIST_PACKAGE;
+				filelists_xml->priv->package_temp = zif_package_new ();
+				filelists_xml->priv->array_temp = g_ptr_array_new_with_free_func (g_free);
+				for (i=0; attribute_names[i] != NULL; i++) {
+					if (g_strcmp0 (attribute_names[i], "pkgid") == 0) {
+						g_object_set_data_full (G_OBJECT (filelists_xml->priv->package_temp),
+									"pkgid", g_strdup (attribute_values[i]), g_free);
+					}
+				}
+				goto out;
+			}
+
+			egg_warning ("unhandled update list tag: %s", element_name);
+			goto out;
+
+		}
+		if (filelists_xml->priv->section_list == ZIF_MD_FILELISTS_XML_SECTION_LIST_PACKAGE) {
+
+			if (g_strcmp0 (element_name, "version") == 0) {
+				filelists_xml->priv->section_list_package = ZIF_MD_FILELISTS_XML_SECTION_LIST_UNKNOWN;
+				goto out;
+			}
+
+			if (g_strcmp0 (element_name, "file") == 0) {
+				filelists_xml->priv->section_list_package = ZIF_MD_FILELISTS_XML_SECTION_LIST_PACKAGE_FILE;
+				goto out;
+			}
+			egg_warning ("unhandled update package tag: %s", element_name);
+			goto out;
+		}
+		egg_warning ("unhandled package tag: %s", element_name);
+	}
+
+	egg_warning ("unhandled base tag: %s", element_name);
+
+out:
+	return;
+}
+
+/**
+ * zif_md_filelists_xml_parser_end_element:
+ **/
+static void
+zif_md_filelists_xml_parser_end_element (GMarkupParseContext *context, const gchar *element_name,
+				      gpointer user_data, GError **error)
+{
+	ZifMdFilelistsXml *filelists_xml = user_data;
+
+	/* no element */
+	if (filelists_xml->priv->section == ZIF_MD_FILELISTS_XML_SECTION_UNKNOWN) {
+		egg_warning ("unhandled base end tag: %s", element_name);
+		goto out;
+	}
+
+	/* update element */
+	if (filelists_xml->priv->section == ZIF_MD_FILELISTS_XML_SECTION_LIST) {
+
+		/* update element */
+		if (filelists_xml->priv->section_list == ZIF_MD_FILELISTS_XML_SECTION_LIST_UNKNOWN) {
+
+			/* end of list */
+			if (g_strcmp0 (element_name, "filelists") == 0) {
+				filelists_xml->priv->section = ZIF_MD_FILELISTS_XML_SECTION_UNKNOWN;
+				goto out;
+			}
+			egg_warning ("unhandled outside tag: %s", element_name);
+			goto out;
+		}
+
+		/* update element */
+		if (filelists_xml->priv->section_list == ZIF_MD_FILELISTS_XML_SECTION_LIST_PACKAGE) {
+
+			if (filelists_xml->priv->section_list_package == ZIF_MD_FILELISTS_XML_SECTION_LIST_PACKAGE_UNKNOWN) {
+
+				if (g_strcmp0 (element_name, "version") == 0)
+					goto out;
+
+				/* end of list */
+				if (g_strcmp0 (element_name, "package") == 0) {
+					zif_package_set_files (filelists_xml->priv->package_temp, filelists_xml->priv->array_temp);
+					g_ptr_array_add (filelists_xml->priv->array, filelists_xml->priv->package_temp);
+					filelists_xml->priv->package_temp = NULL;
+					filelists_xml->priv->array_temp = NULL;
+					filelists_xml->priv->section_list = ZIF_MD_FILELISTS_XML_SECTION_LIST_UNKNOWN;
+					goto out;
+				}
+				egg_warning ("unhandled package tag: %s", element_name);
+				goto out;
+			}
+
+			if (filelists_xml->priv->section_list_package == ZIF_MD_FILELISTS_XML_SECTION_LIST_PACKAGE_FILE) {
+				if (g_strcmp0 (element_name, "file") == 0) {
+					filelists_xml->priv->section_list_package = ZIF_MD_FILELISTS_XML_SECTION_LIST_PACKAGE_UNKNOWN;
+					goto out;
+				}
+				egg_warning ("unhandled end of file tag: %s", element_name);
+				goto out;
+			}
+			egg_warning ("unhandled end of package tag: %s", element_name);
+			goto out;
+		}
+
+		egg_warning ("unhandled update end tag: %s", element_name);
+		goto out;
+	}
+
+	egg_warning ("unhandled end tag: %s", element_name);
+out:
+	return;
+}
+
+/**
+ * zif_md_filelists_xml_parser_text:
+ **/
+static void
+zif_md_filelists_xml_parser_text (GMarkupParseContext *context, const gchar *text, gsize text_len,
+			       gpointer user_data, GError **error)
+
+{
+	ZifMdFilelistsXml *filelists_xml = user_data;
+
+	/* skip whitespace */
+	if (text_len < 1 || text[0] == ' ' || text[0] == '\t' || text[0] == '\n')
+		goto out;
+
+	/* group section */
+	if (filelists_xml->priv->section == ZIF_MD_FILELISTS_XML_SECTION_LIST) {
+		if (filelists_xml->priv->section_list == ZIF_MD_FILELISTS_XML_SECTION_LIST_UNKNOWN) {
+			egg_warning ("not saving: %s", text);
+			goto out;
+		}
+		if (filelists_xml->priv->section_list == ZIF_MD_FILELISTS_XML_SECTION_LIST_PACKAGE) {
+			if (filelists_xml->priv->section_list == ZIF_MD_FILELISTS_XML_SECTION_LIST_PACKAGE_FILE) {
+				g_ptr_array_add (filelists_xml->priv->array_temp, g_strdup (text));
+				goto out;
+			};
+			egg_warning ("not saving: %s", text);
+			goto out;
+		}
+		egg_warning ("not saving: %s", text);
+		goto out;
+	}
+out:
+	return;
+}
+
+/**
+ * zif_md_filelists_xml_load:
+ **/
+static gboolean
+zif_md_filelists_xml_load (ZifMd *md, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	const gchar *filename;
+	gboolean ret;
+	gchar *contents = NULL;
+	gsize size;
+	ZifMdFilelistsXml *filelists_xml = ZIF_MD_FILELISTS_XML (md);
+	GMarkupParseContext *context = NULL;
+	const GMarkupParser gpk_md_filelists_xml_markup_parser = {
+		zif_md_filelists_xml_parser_start_element,
+		zif_md_filelists_xml_parser_end_element,
+		zif_md_filelists_xml_parser_text,
+		NULL, /* passthrough */
+		NULL /* error */
+	};
+
+	g_return_val_if_fail (ZIF_IS_MD_FILELISTS_XML (md), FALSE);
+
+	/* already loaded */
+	if (filelists_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 filelists_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_filelists_xml_markup_parser, G_MARKUP_PREFIX_ERROR_POSITION, filelists_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 */
+	filelists_xml->priv->loaded = TRUE;
+out:
+	g_free (contents);
+	return filelists_xml->priv->loaded;
+}
+
+/**
+ * zif_md_filelists_xml_search_file:
+ **/
+static GPtrArray *
+zif_md_filelists_xml_search_file (ZifMd *md, gchar **search,
+				  GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	GPtrArray *array = NULL;
+	GPtrArray *packages;
+	ZifPackage *package;
+	GPtrArray *files = NULL;
+	const gchar *filename;
+	guint i, j, k;
+	gboolean ret;
+	const gchar *pkgid;
+	GError *error_local = NULL;
+	ZifCompletion *completion_local;
+	ZifMdFilelistsXml *md_filelists = ZIF_MD_FILELISTS_XML (md);
+
+	g_return_val_if_fail (ZIF_IS_MD_FILELISTS_XML (md), NULL);
+	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+	/* setup completion */
+	if (md_filelists->priv->loaded)
+		zif_completion_set_number_steps (completion, 1);
+	else
+		zif_completion_set_number_steps (completion, 2);
+
+	/* if not already loaded, load */
+	if (!md_filelists->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_filelists_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 (g_free);
+	packages = md_filelists->priv->array;
+	for (i=0; i<packages->len; i++) {
+		package = g_ptr_array_index (packages, i);
+		pkgid = g_object_get_data (G_OBJECT (package), "pkgid");
+		files = zif_package_get_files (package, NULL);
+		for (k=0; k<files->len; k++) {
+			filename = g_ptr_array_index (files, k);
+			for (j=0; search[j] != NULL; j++) {
+				if (g_strcmp0 (filename, search[j]) == 0) {
+					g_ptr_array_add (array, g_strdup (pkgid));
+					break;
+				}
+			}
+		}
+	}
+
+	/* this section done */
+	zif_completion_done (completion);
+out:
+	if (files != NULL)
+		g_ptr_array_unref (files);
+	return array;
+}
+
+/**
+ * zif_md_filelists_xml_finalize:
+ **/
+static void
+zif_md_filelists_xml_finalize (GObject *object)
+{
+	ZifMdFilelistsXml *md;
+
+	g_return_if_fail (object != NULL);
+	g_return_if_fail (ZIF_IS_MD_FILELISTS_XML (object));
+	md = ZIF_MD_FILELISTS_XML (object);
+
+	g_ptr_array_unref (md->priv->array);
+
+	G_OBJECT_CLASS (zif_md_filelists_xml_parent_class)->finalize (object);
+}
+
+/**
+ * zif_md_filelists_xml_class_init:
+ **/
+static void
+zif_md_filelists_xml_class_init (ZifMdFilelistsXmlClass *klass)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS (klass);
+	ZifMdClass *md_class = ZIF_MD_CLASS (klass);
+	object_class->finalize = zif_md_filelists_xml_finalize;
+
+	/* map */
+	md_class->load = zif_md_filelists_xml_load;
+	md_class->unload = zif_md_filelists_xml_unload;
+	md_class->search_file = zif_md_filelists_xml_search_file;
+
+	g_type_class_add_private (klass, sizeof (ZifMdFilelistsXmlPrivate));
+}
+
+/**
+ * zif_md_filelists_xml_init:
+ **/
+static void
+zif_md_filelists_xml_init (ZifMdFilelistsXml *md)
+{
+	md->priv = ZIF_MD_FILELISTS_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_FILELISTS_XML_SECTION_UNKNOWN;
+	md->priv->section_list = ZIF_MD_FILELISTS_XML_SECTION_LIST_UNKNOWN;
+	md->priv->section_list_package = ZIF_MD_FILELISTS_XML_SECTION_LIST_PACKAGE_UNKNOWN;
+	md->priv->package_temp = NULL;
+	md->priv->array_temp = NULL;
+}
+
+/**
+ * zif_md_filelists_xml_new:
+ *
+ * Return value: A new #ZifMdFilelistsXml class instance.
+ *
+ * Since: 0.0.1
+ **/
+ZifMdFilelistsXml *
+zif_md_filelists_xml_new (void)
+{
+	ZifMdFilelistsXml *md;
+	md = g_object_new (ZIF_TYPE_MD_FILELISTS_XML, NULL);
+	return ZIF_MD_FILELISTS_XML (md);
+}
+
+/***************************************************************************
+ ***                          MAKE CHECK TESTS                           ***
+ ***************************************************************************/
+#ifdef EGG_TEST
+#include "egg-test.h"
+
+void
+zif_md_filelists_xml_test (EggTest *test)
+{
+	ZifMdFilelistsXml *md;
+	gboolean ret;
+	GError *error = NULL;
+	GPtrArray *array;
+	ZifPackage *package;
+	ZifString *summary;
+	GCancellable *cancellable;
+	ZifCompletion *completion;
+	gchar *pkgid;
+	gchar *data[] = { "/usr/lib/debug/usr/bin/gpk-prefs.debug", NULL };
+
+	if (!egg_test_start (test, "ZifMdFilelistsXml"))
+		return;
+
+	/* use */
+	cancellable = g_cancellable_new ();
+	completion = zif_completion_new ();
+
+	/************************************************************/
+	egg_test_title (test, "get md_filelists_xml md");
+	md = zif_md_filelists_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_FILELISTS_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), "cadb324b10d395058ed22c9d984038927a3ea4ff9e0e798116be44b0233eaa49");
+	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), "8018e177379ada1d380b4ebf800e7caa95ff8cf90fdd6899528266719bbfdeab");
+	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/filelists.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_filelists_xml_search_file (ZIF_MD (md), (gchar**)data, 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 != 1)
+		egg_test_failed (test, "got %i", array->len);
+	egg_test_success (test, NULL);
+
+	/************************************************************/
+	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 (cancellable);
+	g_object_unref (completion);
+	g_object_unref (md);
+
+	egg_test_end (test);
+}
+#endif
+
diff --git a/backends/yum/libzif/zif-md-filelists-xml.h b/backends/yum/libzif/zif-md-filelists-xml.h
new file mode 100644
index 0000000..02f7622
--- /dev/null
+++ b/backends/yum/libzif/zif-md-filelists-xml.h
@@ -0,0 +1,63 @@
+/* -*- 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_FILELISTS_XML_H
+#define __ZIF_MD_FILELISTS_XML_H
+
+#include <glib-object.h>
+
+#include "zif-md.h"
+
+G_BEGIN_DECLS
+
+#define ZIF_TYPE_MD_FILELISTS_XML		(zif_md_filelists_xml_get_type ())
+#define ZIF_MD_FILELISTS_XML(o)			(G_TYPE_CHECK_INSTANCE_CAST ((o), ZIF_TYPE_MD_FILELISTS_XML, ZifMdFilelistsXml))
+#define ZIF_MD_FILELISTS_XML_CLASS(k)		(G_TYPE_CHECK_CLASS_CAST((k), ZIF_TYPE_MD_FILELISTS_XML, ZifMdFilelistsXmlClass))
+#define ZIF_IS_MD_FILELISTS_XML(o)		(G_TYPE_CHECK_INSTANCE_TYPE ((o), ZIF_TYPE_MD_FILELISTS_XML))
+#define ZIF_IS_MD_FILELISTS_XML_CLASS(k)	(G_TYPE_CHECK_CLASS_TYPE ((k), ZIF_TYPE_MD_FILELISTS_XML))
+#define ZIF_MD_FILELISTS_XML_GET_CLASS(o)	(G_TYPE_INSTANCE_GET_CLASS ((o), ZIF_TYPE_MD_FILELISTS_XML, ZifMdFilelistsXmlClass))
+
+typedef struct _ZifMdFilelistsXml		ZifMdFilelistsXml;
+typedef struct _ZifMdFilelistsXmlPrivate	ZifMdFilelistsXmlPrivate;
+typedef struct _ZifMdFilelistsXmlClass		ZifMdFilelistsXmlClass;
+
+struct _ZifMdFilelistsXml
+{
+	ZifMd					 parent;
+	ZifMdFilelistsXmlPrivate		*priv;
+};
+
+struct _ZifMdFilelistsXmlClass
+{
+	ZifMdClass				 parent_class;
+};
+
+GType			 zif_md_filelists_xml_get_type		(void);
+ZifMdFilelistsXml	*zif_md_filelists_xml_new		(void);
+
+G_END_DECLS
+
+#endif /* __ZIF_MD_FILELISTS_XML_H */
+
diff --git a/backends/yum/libzif/zif-md-filelists.c b/backends/yum/libzif/zif-md-filelists.c
deleted file mode 100644
index 46140df..0000000
--- a/backends/yum/libzif/zif-md-filelists.c
+++ /dev/null
@@ -1,450 +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-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
deleted file mode 100644
index d270479..0000000
--- a/backends/yum/libzif/zif-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_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
index 91f5cec..936f2af 100644
--- a/backends/yum/libzif/zif-md-metalink.c
+++ b/backends/yum/libzif/zif-md-metalink.c
@@ -40,7 +40,6 @@
 #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))
 
diff --git a/backends/yum/libzif/zif-md-mirrorlist.c b/backends/yum/libzif/zif-md-mirrorlist.c
index 80fdce6..28a2547 100644
--- a/backends/yum/libzif/zif-md-mirrorlist.c
+++ b/backends/yum/libzif/zif-md-mirrorlist.c
@@ -39,7 +39,6 @@
 #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))
 
diff --git a/backends/yum/libzif/zif-md-other-sql.c b/backends/yum/libzif/zif-md-other-sql.c
index 0866a2b..f5ccba8 100644
--- a/backends/yum/libzif/zif-md-other-sql.c
+++ b/backends/yum/libzif/zif-md-other-sql.c
@@ -43,7 +43,6 @@
 #include "zif-package-remote.h"
 
 #include "egg-debug.h"
-#include "egg-string.h"
 
 #define ZIF_MD_OTHER_SQL_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), ZIF_TYPE_MD_OTHER_SQL, ZifMdOtherSqlPrivate))
 
@@ -120,18 +119,19 @@ zif_md_other_sql_sqlite_create_changelog_cb (void *data, gint argc, gchar **argv
 	GPtrArray *array = (GPtrArray *) data;
 	ZifChangeset *changeset;
 	gint i;
-	guint date = 0;
+	guint64 date = 0;
 	const gchar *author = NULL;
 	const gchar *changelog = NULL;
 	gboolean ret;
 	GError *error = NULL;
+	gchar *endptr = NULL;
 
 	/* get the ID */
 	for (i=0; i<argc; i++) {
 		if (g_strcmp0 (col_name[i], "date") == 0) {
-			ret = egg_strtouint (argv[i], &date);
-			if (!ret)
-				egg_warning ("could not parse date '%s'", argv[i]);
+			date = g_ascii_strtoull (argv[i], &endptr, 10);
+			if (argv[i] == endptr)
+				egg_warning ("failed to parse date %s", argv[i]);
 		} else if (g_strcmp0 (col_name[i], "author") == 0) {
 			author = argv[i];
 		} else if (g_strcmp0 (col_name[i], "changelog") == 0) {
@@ -172,7 +172,7 @@ zif_md_other_sql_search_pkgkey (ZifMdOtherSql *md, guint pkgkey,
 	GPtrArray *array = NULL;
 
 	array = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
-	statement = g_strdup_printf ("SELECT author, date, changelog FROM changelog WHERE pkgKey = '%i' ORDER BY date", pkgkey);
+	statement = g_strdup_printf ("SELECT author, date, changelog FROM changelog WHERE pkgKey = '%i' ORDER BY date DESC", pkgkey);
 	rc = sqlite3_exec (md->priv->db, statement, zif_md_other_sql_sqlite_create_changelog_cb, array, &error_msg);
 	if (rc != SQLITE_OK) {
 		g_set_error (error, ZIF_MD_ERROR, ZIF_MD_ERROR_BAD_SQL,
@@ -195,17 +195,17 @@ zif_md_other_sql_sqlite_pkgkey_cb (void *data, gint argc, gchar **argv, gchar **
 {
 	gint i;
 	guint pkgkey;
-	gboolean ret;
+	gchar *endptr = NULL;
 	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
+			pkgkey = g_ascii_strtoull (argv[i], &endptr, 10);
+			if (argv[i] == endptr)
 				egg_warning ("could not parse pkgKey '%s'", argv[i]);
+			else
+				g_ptr_array_add (array, GUINT_TO_POINTER (pkgkey));
 		} else {
 			egg_warning ("unrecognized: %s=%s", col_name[i], argv[i]);
 		}
@@ -383,7 +383,7 @@ zif_md_other_sql_test (EggTest *test)
 	gboolean ret;
 	GError *error = NULL;
 	GPtrArray *array;
-	ZifPackage *changeset;
+	ZifChangeset *changeset;
 	GCancellable *cancellable;
 	ZifCompletion *completion;
 	const gchar *text;
@@ -467,7 +467,8 @@ zif_md_other_sql_test (EggTest *test)
 	/************************************************************/
 	egg_test_title (test, "search for files");
 	zif_completion_reset (completion);
-	array = zif_md_other_sql_get_changelog (md, "42b8d71b303b19c2fcc2b06bb9c764f2902dd72b9376525025ee9ba4a41c38e9",
+	array = zif_md_other_sql_get_changelog (ZIF_MD_OTHER_SQL (md),
+						"42b8d71b303b19c2fcc2b06bb9c764f2902dd72b9376525025ee9ba4a41c38e9",
 						cancellable, completion, &error);
 	if (array != NULL)
 		egg_test_success (test, NULL);
@@ -486,7 +487,7 @@ zif_md_other_sql_test (EggTest *test)
 	/************************************************************/
 	egg_test_title (test, "correct version");
 	text = zif_changeset_get_version (changeset);
-	if (g_strcmp0 (text, "0.9.95-8") == 0)
+	if (g_strcmp0 (text, "1.2-3") == 0)
 		egg_test_success (test, NULL);
 	else
 		egg_test_failed (test, "failed to get correct value '%s'", text);
@@ -494,7 +495,7 @@ zif_md_other_sql_test (EggTest *test)
 	/************************************************************/
 	egg_test_title (test, "correct author");
 	text = zif_changeset_get_author (changeset);
-	if (g_strcmp0 (text, "Rex Dieter <rdieter[AT]fedoraproject.org>") == 0)
+	if (g_strcmp0 (text, "Rex Dieter <rdieter at fedoraproject.org>") == 0)
 		egg_test_success (test, NULL);
 	else
 		egg_test_failed (test, "failed to get correct value '%s'", text);
@@ -502,7 +503,7 @@ zif_md_other_sql_test (EggTest *test)
 	/************************************************************/
 	egg_test_title (test, "correct description");
 	text = zif_changeset_get_description (changeset);
-	if (g_strcmp0 (text, "- ExcludeArch: ppc64 (#253847)") == 0)
+	if (g_strcmp0 (text, "- BR: libfac-devel,factory-devel >= 3.1\n- restore ExcludeArch: ppc64 (#253847)") == 0)
 		egg_test_success (test, NULL);
 	else
 		egg_test_failed (test, "failed to get correct value '%s'", text);
diff --git a/backends/yum/libzif/zif-md-primary-sql.c b/backends/yum/libzif/zif-md-primary-sql.c
index d9bcd7f..bec2495 100644
--- a/backends/yum/libzif/zif-md-primary-sql.c
+++ b/backends/yum/libzif/zif-md-primary-sql.c
@@ -42,7 +42,6 @@
 #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))
 
@@ -109,7 +108,8 @@ zif_md_primary_sql_load (ZifMd *md, GCancellable *cancellable, ZifCompletion *co
 	}
 
 	/* we don't need to keep syncing */
-	sqlite3_exec (primary_sql->priv->db, "PRAGMA synchronous=OFF", NULL, NULL, NULL);
+	sqlite3_exec (primary_sql->priv->db, "PRAGMA synchronous=OFF;", NULL, NULL, NULL);
+
 	primary_sql->priv->loaded = TRUE;
 out:
 	return primary_sql->priv->loaded;
@@ -131,14 +131,17 @@ zif_md_primary_sql_sqlite_create_package_cb (void *data, gint argc, gchar **argv
 	return 0;
 }
 
+#define ZIF_MD_PRIMARY_SQL_HEADER "SELECT pkgId, name, arch, version, " \
+				  "epoch, release, summary, description, url, " \
+				  "rpm_license, rpm_group, size_package, location_href FROM packages"
+
 /**
  * zif_md_primary_sql_search:
  **/
 static GPtrArray *
-zif_md_primary_sql_search (ZifMdPrimarySql *md, const gchar *pred,
+zif_md_primary_sql_search (ZifMdPrimarySql *md, const gchar *statement,
 			   GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
-	gchar *statement = NULL;
 	gchar *error_msg = NULL;
 	gint rc;
 	gboolean ret;
@@ -161,10 +164,6 @@ zif_md_primary_sql_search (ZifMdPrimarySql *md, const gchar *pred,
 	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,
@@ -177,28 +176,74 @@ zif_md_primary_sql_search (ZifMdPrimarySql *md, const gchar *pred,
 	array = data->packages;
 out:
 	g_free (data);
-	g_free (statement);
 	return array;
 }
 
 /**
+ * zif_md_primary_sql_strreplace:
+ **/
+static gchar *
+zif_md_primary_sql_strreplace (const gchar *text, const gchar *find, const gchar *replace)
+{
+	gchar **array;
+	gchar *retval;
+
+	/* split apart and rejoin with new delimiter */
+	array = g_strsplit (text, find, 0);
+	retval = g_strjoinv (replace, array);
+	g_strfreev (array);
+	return retval;
+}
+
+/**
+ * zif_md_primary_sql_get_statement_for_pred:
+ **/
+static gchar *
+zif_md_primary_sql_get_statement_for_pred (const gchar *pred, gchar **search)
+{
+	guint i;
+	const guint max_items = 20;
+	GString *statement;
+	gchar *temp;
+
+	/* search with predicate */
+	statement = g_string_new ("BEGIN;\n");
+	for (i=0; search[i] != NULL; i++) {
+		if (i % max_items == 0)
+			g_string_append (statement, ZIF_MD_PRIMARY_SQL_HEADER " WHERE ");
+		temp = zif_md_primary_sql_strreplace (pred, "###", search[i]);
+		g_string_append (statement, temp);
+		if (i % max_items == max_items - 1)
+			g_string_append (statement, ";\n");
+		else
+			g_string_append (statement, " OR ");
+		g_free (temp);
+	}
+	if (i % max_items != max_items - 1) {
+		g_string_set_size (statement, statement->len - 4);
+		g_string_append (statement, ";\n");
+	}
+	g_string_append (statement, "END;");
+	return g_string_free (statement, FALSE);
+}
+
+/**
  * zif_md_primary_sql_resolve:
  **/
 static GPtrArray *
-zif_md_primary_sql_resolve (ZifMd *md, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+zif_md_primary_sql_resolve (ZifMd *md, gchar **search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
-	gchar *pred;
+	gchar *statement;
 	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);
-
+	/* simple name match */
+	statement = zif_md_primary_sql_get_statement_for_pred ("name = '###'", search);
+	array = zif_md_primary_sql_search (md_primary_sql, statement, cancellable, completion, error);
+	g_free (statement);
 	return array;
 }
 
@@ -206,19 +251,19 @@ zif_md_primary_sql_resolve (ZifMd *md, const gchar *search, GCancellable *cancel
  * 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)
+zif_md_primary_sql_search_name (ZifMd *md, gchar **search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
-	gchar *pred;
+	gchar *statement;
 	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);
+	/* fuzzy name match */
+	statement = zif_md_primary_sql_get_statement_for_pred ("name LIKE '%%###%%'", search);
+	array = zif_md_primary_sql_search (md_primary_sql, statement, cancellable, completion, error);
+	g_free (statement);
 
 	return array;
 }
@@ -227,19 +272,21 @@ zif_md_primary_sql_search_name (ZifMd *md, const gchar *search, GCancellable *ca
  * 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)
+zif_md_primary_sql_search_details (ZifMd *md, gchar **search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
-	gchar *pred;
+	gchar *statement;
 	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);
+	/* fuzzy details match */
+	statement = zif_md_primary_sql_get_statement_for_pred ("name LIKE '%%###%%' OR "
+							       "summary LIKE '%%###%%' OR "
+							       "description LIKE '%%###%%'", search);
+	array = zif_md_primary_sql_search (md_primary_sql, statement, cancellable, completion, error);
+	g_free (statement);
 
 	return array;
 }
@@ -248,19 +295,19 @@ zif_md_primary_sql_search_details (ZifMd *md, const gchar *search, GCancellable
  * 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)
+zif_md_primary_sql_search_group (ZifMd *md, gchar **search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
-	gchar *pred;
+	gchar *statement;
 	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);
+	/* simple group match */
+	statement = zif_md_primary_sql_get_statement_for_pred ("rpm_group = '###'", search);
+	array = zif_md_primary_sql_search (md_primary_sql, statement, cancellable, completion, error);
+	g_free (statement);
 
 	return array;
 }
@@ -269,19 +316,19 @@ zif_md_primary_sql_search_group (ZifMd *md, const gchar *search, GCancellable *c
  * 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)
+zif_md_primary_sql_search_pkgid (ZifMd *md, gchar **search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
-	gchar *pred;
+	gchar *statement;
 	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);
+	/* simple pkgid match */
+	statement = zif_md_primary_sql_get_statement_for_pred ("pkgid = '###'", search);
+	array = zif_md_primary_sql_search (md_primary_sql, statement, cancellable, completion, error);
+	g_free (statement);
 
 	return array;
 }
@@ -291,9 +338,9 @@ zif_md_primary_sql_search_pkgid (ZifMd *md, const gchar *search, GCancellable *c
  **/
 static GPtrArray *
 zif_md_primary_sql_search_pkgkey (ZifMd *md, guint pkgkey,
-			      GCancellable *cancellable, ZifCompletion *completion, GError **error)
+				  GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
-	gchar *pred;
+	gchar *statement;
 	GPtrArray *array;
 	ZifMdPrimarySql *md_primary_sql = ZIF_MD_PRIMARY_SQL (md);
 
@@ -301,10 +348,9 @@ zif_md_primary_sql_search_pkgkey (ZifMd *md, guint pkgkey,
 	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);
-
+	statement = g_strdup_printf (ZIF_MD_PRIMARY_SQL_HEADER " WHERE pkgKey = '%i'", pkgkey);
+	array = zif_md_primary_sql_search (md_primary_sql, statement, cancellable, completion, error);
+	g_free (statement);
 	return array;
 }
 
@@ -316,17 +362,17 @@ zif_md_primary_sql_sqlite_pkgkey_cb (void *data, gint argc, gchar **argv, gchar
 {
 	gint i;
 	guint pkgkey;
-	gboolean ret;
+	gchar *endptr = NULL;
 	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));
+			pkgkey = g_ascii_strtoull (argv[i], &endptr, 10);
+			if (argv[i] == endptr)
+				egg_warning ("failed to parse pkgKey %s", argv[i]);
 			else
-				egg_warning ("could not parse pkgKey '%s'", argv[i]);
+				g_ptr_array_add (array, GUINT_TO_POINTER (pkgkey));
 		} else {
 			egg_warning ("unrecognized: %s=%s", col_name[i], argv[i]);
 		}
@@ -338,8 +384,8 @@ zif_md_primary_sql_sqlite_pkgkey_cb (void *data, gint argc, gchar **argv, gchar
  * 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)
+zif_md_primary_sql_what_provides (ZifMd *md, gchar **search,
+				  GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
 	gchar *statement = NULL;
 	gchar *error_msg = NULL;
@@ -379,7 +425,7 @@ zif_md_primary_sql_what_provides (ZifMd *md, const gchar *search,
 
 	/* 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);
+	statement = g_strdup_printf ("SELECT pkgKey FROM provides WHERE name = '%s'", search[0]);
 	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,
@@ -439,7 +485,7 @@ out:
 static GPtrArray *
 zif_md_primary_sql_find_package (ZifMd *md, const gchar *package_id, GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
-	gchar *pred;
+	gchar *statement;
 	GPtrArray *array;
 	gchar **split;
 	ZifMdPrimarySql *md_primary_sql = ZIF_MD_PRIMARY_SQL (md);
@@ -449,9 +495,10 @@ zif_md_primary_sql_find_package (ZifMd *md, const gchar *package_id, GCancellabl
 
 	/* 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);
+	statement = g_strdup_printf (ZIF_MD_PRIMARY_SQL_HEADER " 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, statement, cancellable, completion, error);
+	g_free (statement);
 	g_strfreev (split);
 
 	return array;
@@ -470,7 +517,7 @@ zif_md_primary_sql_get_packages (ZifMd *md, GCancellable *cancellable, ZifComple
 	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);
+	array = zif_md_primary_sql_search (md_primary_sql, ZIF_MD_PRIMARY_SQL_HEADER, cancellable, completion, error);
 	return array;
 }
 
@@ -558,6 +605,7 @@ zif_md_primary_sql_test (EggTest *test)
 	ZifString *summary;
 	GCancellable *cancellable;
 	ZifCompletion *completion;
+	gchar *data[] = { "gnome-power-manager", "gnome-color-manager", NULL };
 
 	if (!egg_test_start (test, "ZifMdPrimarySql"))
 		return;
@@ -636,8 +684,8 @@ zif_md_primary_sql_test (EggTest *test)
 	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);
+	egg_test_title (test, "resolve");
+	array = zif_md_primary_sql_resolve (md, data, cancellable, completion, &error);
 	if (array != NULL)
 		egg_test_success (test, NULL);
 	else
diff --git a/backends/yum/libzif/zif-md-primary-xml.c b/backends/yum/libzif/zif-md-primary-xml.c
index 1ad8c66..c1d3564 100644
--- a/backends/yum/libzif/zif-md-primary-xml.c
+++ b/backends/yum/libzif/zif-md-primary-xml.c
@@ -66,7 +66,6 @@ typedef enum {
 #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))
 
@@ -381,7 +380,7 @@ zif_md_primary_xml_parser_text (GMarkupParseContext *context, const gchar *text,
 			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);
+		egg_warning ("not saving: %s", text);
 		goto out;
 	}
 out:
@@ -509,17 +508,22 @@ out:
 static gboolean
 zif_md_primary_xml_resolve_cb (ZifPackage *package, gpointer user_data)
 {
+	guint i;
 	const gchar *value;
-	const gchar *search = (const gchar *) user_data;
+	gchar **search = (gchar **) user_data;
 	value = zif_package_get_name (package);
-	return (g_strcmp0 (value, search) == 0);
+	for (i=0; search[i] != NULL; i++) {
+		if (g_strcmp0 (value, search[i]) == 0)
+			return TRUE;
+	}
+	return FALSE;
 }
 
 /**
  * zif_md_primary_xml_resolve:
  **/
 static GPtrArray *
-zif_md_primary_xml_resolve (ZifMd *md, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+zif_md_primary_xml_resolve (ZifMd *md, 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);
@@ -531,17 +535,22 @@ zif_md_primary_xml_resolve (ZifMd *md, const gchar *search, GCancellable *cancel
 static gboolean
 zif_md_primary_xml_search_name_cb (ZifPackage *package, gpointer user_data)
 {
+	guint i;
 	const gchar *value;
-	const gchar *search = (const gchar *) user_data;
+	gchar **search = (gchar **) user_data;
 	value = zif_package_get_name (package);
-	return (g_strstr_len (value, -1, search) != NULL);
+	for (i=0; search[i] != NULL; i++) {
+		if (g_strstr_len (value, -1, search[i]) != NULL)
+			return TRUE;
+	}
+	return FALSE;
 }
 
 /**
  * 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)
+zif_md_primary_xml_search_name (ZifMd *md, 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);
@@ -553,25 +562,32 @@ zif_md_primary_xml_search_name (ZifMd *md, const gchar *search, GCancellable *ca
 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:
+	guint i;
+	gboolean ret = FALSE;
+	const gchar *name;
+	ZifString *summary;
+	ZifString *description;
+	gchar **search = (gchar **) user_data;
+
+	name = zif_package_get_name (package);
+	summary = zif_package_get_summary (package, NULL);
+	description = zif_package_get_description (package, NULL);
+	for (i=0; search[i] != NULL; i++) {
+		if (g_strstr_len (name, -1, search[i]) != NULL) {
+			ret = TRUE;
+			break;
+		}
+		if (g_strstr_len (zif_string_get_value (summary), -1, search[i]) != NULL) {
+			ret = TRUE;
+			break;
+		}
+		if (g_strstr_len (zif_string_get_value (description), -1, search[i]) != NULL) {
+			ret = TRUE;
+			break;
+		}
+	}
+	zif_string_unref (summary);
+	zif_string_unref (description);
 	return ret;
 }
 
@@ -579,7 +595,7 @@ out:
  * 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)
+zif_md_primary_xml_search_details (ZifMd *md, 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);
@@ -591,11 +607,17 @@ zif_md_primary_xml_search_details (ZifMd *md, const gchar *search, GCancellable
 static gboolean
 zif_md_primary_xml_search_group_cb (ZifPackage *package, gpointer user_data)
 {
+	guint i;
 	gboolean ret;
 	ZifString *value;
-	const gchar *search = (const gchar *) user_data;
+	gchar **search = (gchar **) user_data;
 	value = zif_package_get_category (package, NULL);
-	ret = (g_strstr_len (zif_string_get_value (value), -1, search) != NULL);
+	for (i=0; search[i] != NULL; i++) {
+		if (g_strstr_len (zif_string_get_value (value), -1, search[i]) != NULL) {
+			ret = TRUE;
+			break;
+		}
+	}
 	zif_string_unref (value);
 	return ret;
 }
@@ -604,7 +626,7 @@ zif_md_primary_xml_search_group_cb (ZifPackage *package, gpointer user_data)
  * 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)
+zif_md_primary_xml_search_group (ZifMd *md, 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);
@@ -616,17 +638,22 @@ zif_md_primary_xml_search_group (ZifMd *md, const gchar *search, GCancellable *c
 static gboolean
 zif_md_primary_xml_search_pkgid_cb (ZifPackage *package, gpointer user_data)
 {
+	guint i;
 	const gchar *value;
-	const gchar *search = (const gchar *) user_data;
+	gchar **search = (gchar **) user_data;
 	value = (const gchar *) g_object_get_data (G_OBJECT (package), "pkgid");
-	return (g_strcmp0 (value, search) == 0);
+	for (i=0; search[i] != NULL; i++) {
+		if (g_strcmp0 (value, search[i]) == 0)
+			return TRUE;
+	}
+	return FALSE;
 }
 
 /**
  * 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)
+zif_md_primary_xml_search_pkgid (ZifMd *md, 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);
@@ -638,9 +665,10 @@ zif_md_primary_xml_search_pkgid (ZifMd *md, const gchar *search, GCancellable *c
 static gboolean
 zif_md_primary_xml_what_provides_cb (ZifPackage *package, gpointer user_data)
 {
+//	guint i;
 	gboolean ret;
 	GPtrArray *array;
-//	const gchar *search = (const gchar *) user_data;
+//	gchar **search = (gchar **) user_data;
 	array = zif_package_get_provides (package, NULL);
 	/* TODO: do something with the ZifDepend objects */
 	ret = FALSE;
@@ -652,7 +680,7 @@ zif_md_primary_xml_what_provides_cb (ZifPackage *package, gpointer user_data)
  * zif_md_primary_xml_what_provides:
  **/
 static GPtrArray *
-zif_md_primary_xml_what_provides (ZifMd *md, const gchar *search,
+zif_md_primary_xml_what_provides (ZifMd *md, gchar **search,
 				  GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
 	return zif_md_primary_xml_filter (md, zif_md_primary_xml_what_provides_cb, (gpointer) search,
@@ -779,6 +807,7 @@ zif_md_primary_xml_test (EggTest *test)
 	ZifString *summary;
 	GCancellable *cancellable;
 	ZifCompletion *completion;
+	gchar *data[] = { "gnome-power-manager", NULL };
 
 	if (!egg_test_start (test, "ZifMdPrimaryXml"))
 		return;
@@ -859,7 +888,7 @@ zif_md_primary_xml_test (EggTest *test)
 	/************************************************************/
 	egg_test_title (test, "search for files");
 	zif_completion_reset (completion);
-	array = zif_md_primary_xml_resolve (md, "gnome-power-manager", cancellable, completion, &error);
+	array = zif_md_primary_xml_resolve (md, data, cancellable, completion, &error);
 	if (array != NULL)
 		egg_test_success (test, NULL);
 	else
diff --git a/backends/yum/libzif/zif-md-updateinfo.c b/backends/yum/libzif/zif-md-updateinfo.c
index 8e9c3ee..98fe2a4 100644
--- a/backends/yum/libzif/zif-md-updateinfo.c
+++ b/backends/yum/libzif/zif-md-updateinfo.c
@@ -41,7 +41,6 @@
 #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))
 
@@ -55,6 +54,7 @@ typedef enum {
 	ZIF_MD_UPDATEINFO_SECTION_UPDATE_TITLE,
 	ZIF_MD_UPDATEINFO_SECTION_UPDATE_DESCRIPTION,
 	ZIF_MD_UPDATEINFO_SECTION_UPDATE_ISSUED,
+	ZIF_MD_UPDATEINFO_SECTION_UPDATE_REBOOT,
 	ZIF_MD_UPDATEINFO_SECTION_UPDATE_REFERENCES,
 	ZIF_MD_UPDATEINFO_SECTION_UPDATE_PKGLIST,
 	ZIF_MD_UPDATEINFO_SECTION_UPDATE_UNKNOWN
@@ -148,6 +148,10 @@ zif_md_updateinfo_parser_start_element (GMarkupParseContext *context, const gcha
 				updateinfo->priv->section_group = ZIF_MD_UPDATEINFO_SECTION_UPDATE_DESCRIPTION;
 				goto out;
 			}
+			if (g_strcmp0 (element_name, "reboot_suggested") == 0) {
+				updateinfo->priv->section_group = ZIF_MD_UPDATEINFO_SECTION_UPDATE_REBOOT;
+				goto out;
+			}
 			if (g_strcmp0 (element_name, "issued") == 0) {
 				updateinfo->priv->section_group = ZIF_MD_UPDATEINFO_SECTION_UPDATE_ISSUED;
 
@@ -201,6 +205,8 @@ zif_md_updateinfo_parser_start_element (GMarkupParseContext *context, const gcha
 				goto out;
 			if (g_strcmp0 (element_name, "name") == 0)
 				goto out;
+			if (g_strcmp0 (element_name, "reboot_suggested") == 0)
+				goto out;
 			//TODO: is this better than src?
 			if (g_strcmp0 (element_name, "filename") == 0)
 				goto out;
@@ -298,6 +304,18 @@ zif_md_updateinfo_parser_end_element (GMarkupParseContext *context, const gchar
 			goto out;
 		}
 
+		if (updateinfo->priv->section_group == ZIF_MD_UPDATEINFO_SECTION_UPDATE_REBOOT) {
+
+			/* add property */
+			if (g_strcmp0 (element_name, "reboot_suggested") == 0) {
+				zif_update_set_reboot (updateinfo->priv->update_temp, TRUE);
+				updateinfo->priv->section_group = ZIF_MD_UPDATEINFO_SECTION_UPDATE_UNKNOWN;
+				goto out;
+			}
+			egg_warning ("unhandled reboot_suggested end tag: %s", element_name);
+			goto out;
+		}
+
 		if (updateinfo->priv->section_group == ZIF_MD_UPDATEINFO_SECTION_UPDATE_REFERENCES) {
 
 			if (g_strcmp0 (element_name, "references") == 0) {
@@ -329,6 +347,8 @@ zif_md_updateinfo_parser_end_element (GMarkupParseContext *context, const gchar
 				goto out;
 			if (g_strcmp0 (element_name, "collection") == 0)
 				goto out;
+			if (g_strcmp0 (element_name, "reboot_suggested") == 0)
+				goto out;
 
 			/* add to the update */
 			if (g_strcmp0 (element_name, "package") == 0) {
@@ -564,7 +584,7 @@ zif_md_updateinfo_get_detail_for_package (ZifMdUpdateinfo *md, const gchar *pack
 	/* nothing found */
 	if (array == NULL) {
 		g_set_error (error, ZIF_MD_ERROR, ZIF_MD_ERROR_FAILED,
-			     "could not find package: %s", package_id);
+			     "could not find package (%i in sack): %s", len, package_id);
 	}
 out:
 	return array;
diff --git a/backends/yum/libzif/zif-md.c b/backends/yum/libzif/zif-md.c
index 75f9e05..7bdea8d 100644
--- a/backends/yum/libzif/zif-md.c
+++ b/backends/yum/libzif/zif-md.c
@@ -24,7 +24,7 @@
  * @short_description: Metadata file common functionality
  *
  * This provides an abstract metadata class.
- * It is implemented by #ZifMdFilelists, #ZifMdMaster and #ZifMdPrimary.
+ * It is implemented by #ZifMdFilelistsSql, #ZifMdMaster and #ZifMdPrimary.
  */
 
 #ifdef HAVE_CONFIG_H
@@ -41,7 +41,6 @@
 #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))
 
@@ -632,7 +631,7 @@ zif_md_unload (ZifMd *md, GCancellable *cancellable, ZifCompletion *completion,
  * Since: 0.0.1
  **/
 GPtrArray *
-zif_md_resolve (ZifMd *md, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+zif_md_resolve (ZifMd *md, gchar **search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
 	GPtrArray *array = NULL;
 	ZifMdClass *klass = ZIF_MD_GET_CLASS (md);
@@ -654,6 +653,43 @@ out:
 }
 
 /**
+ * zif_md_search_file:
+ * @md: the #ZifMd object
+ * @search: the search term, e.g. "/usr/bin/powertop"
+ * @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
+ *
+ * Since: 0.0.1
+ **/
+GPtrArray *
+zif_md_search_file (ZifMd *md, 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_file == 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_file (md, search, cancellable, completion, error);
+out:
+	return array;
+}
+
+/**
  * zif_md_search_name:
  * @md: the #ZifMd object
  * @search: the search term, e.g. "power"
@@ -668,7 +704,7 @@ out:
  * Since: 0.0.1
  **/
 GPtrArray *
-zif_md_search_name (ZifMd *md, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+zif_md_search_name (ZifMd *md, gchar **search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
 	GPtrArray *array = NULL;
 	ZifMdClass *klass = ZIF_MD_GET_CLASS (md);
@@ -704,7 +740,7 @@ out:
  * Since: 0.0.1
  **/
 GPtrArray *
-zif_md_search_details (ZifMd *md, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+zif_md_search_details (ZifMd *md, gchar **search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
 	GPtrArray *array = NULL;
 	ZifMdClass *klass = ZIF_MD_GET_CLASS (md);
@@ -740,7 +776,7 @@ out:
  * Since: 0.0.1
  **/
 GPtrArray *
-zif_md_search_group (ZifMd *md, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+zif_md_search_group (ZifMd *md, gchar **search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
 	GPtrArray *array = NULL;
 	ZifMdClass *klass = ZIF_MD_GET_CLASS (md);
@@ -776,7 +812,7 @@ out:
  * Since: 0.0.1
  **/
 GPtrArray *
-zif_md_search_pkgid (ZifMd *md, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+zif_md_search_pkgid (ZifMd *md, gchar **search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
 	GPtrArray *array = NULL;
 	ZifMdClass *klass = ZIF_MD_GET_CLASS (md);
@@ -812,7 +848,7 @@ out:
  * Since: 0.0.1
  **/
 GPtrArray *
-zif_md_what_provides (ZifMd *md, const gchar *search,
+zif_md_what_provides (ZifMd *md, gchar **search,
 		      GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
 	GPtrArray *array = NULL;
diff --git a/backends/yum/libzif/zif-md.h b/backends/yum/libzif/zif-md.h
index 6db2400..a0e93b5 100644
--- a/backends/yum/libzif/zif-md.h
+++ b/backends/yum/libzif/zif-md.h
@@ -66,37 +66,37 @@ struct _ZifMdClass
 						 ZifCompletion		*completion,
 						 GError			**error);
 	GPtrArray	*(*search_file)		(ZifMd			*md,
-						 const gchar		*search,
+						 gchar			**search,
 						 GCancellable		*cancellable,
 						 ZifCompletion		*completion,
 						 GError			**error);
 	GPtrArray	*(*search_name)		(ZifMd			*md,
-						 const gchar		*search,
+						 gchar			**search,
 						 GCancellable		*cancellable,
 						 ZifCompletion		*completion,
 						 GError			**error);
 	GPtrArray	*(*search_details)	(ZifMd			*md,
-						 const gchar		*search,
+						 gchar			**search,
 						 GCancellable		*cancellable,
 						 ZifCompletion		*completion,
 						 GError			**error);
 	GPtrArray	*(*search_group)	(ZifMd			*md,
-						 const gchar		*search,
+						 gchar			**search,
 						 GCancellable		*cancellable,
 						 ZifCompletion		*completion,
 						 GError			**error);
 	GPtrArray	*(*search_pkgid)	(ZifMd			*md,
-						 const gchar		*search,
+						 gchar			**search,
 						 GCancellable		*cancellable,
 						 ZifCompletion		*completion,
 						 GError			**error);
 	GPtrArray	*(*what_provides)	(ZifMd			*md,
-						 const gchar		*search,
+						 gchar			**search,
 						 GCancellable		*cancellable,
 						 ZifCompletion		*completion,
 						 GError			**error);
 	GPtrArray	*(*resolve)		(ZifMd			*md,
-						 const gchar		*search,
+						 gchar			**search,
 						 GCancellable		*cancellable,
 						 ZifCompletion		*completion,
 						 GError			**error);
@@ -192,37 +192,37 @@ gboolean	 zif_md_file_check			(ZifMd		*md,
 							 gboolean	 use_uncompressed,
 							 GError		**error);
 GPtrArray	*zif_md_search_file			(ZifMd		*md,
-							 const gchar	*search,
+							 gchar		**search,
 							 GCancellable	*cancellable,
 							 ZifCompletion	*completion,
 							 GError		**error);
 GPtrArray	*zif_md_search_name			(ZifMd		*md,
-							 const gchar	*search,
+							 gchar		**search,
 							 GCancellable	*cancellable,
 							 ZifCompletion	*completion,
 							 GError		**error);
 GPtrArray	*zif_md_search_details			(ZifMd		*md,
-							 const gchar	*search,
+							 gchar		**search,
 							 GCancellable	*cancellable,
 							 ZifCompletion	*completion,
 							 GError		**error);
 GPtrArray	*zif_md_search_group			(ZifMd		*md,
-							 const gchar	*search,
+							 gchar		**search,
 							 GCancellable	*cancellable,
 							 ZifCompletion	*completion,
 							 GError		**error);
 GPtrArray	*zif_md_search_pkgid			(ZifMd		*md,
-							 const gchar	*search,
+							 gchar		**search,
 							 GCancellable	*cancellable,
 							 ZifCompletion	*completion,
 							 GError		**error);
 GPtrArray	*zif_md_what_provides			(ZifMd		*md,
-							 const gchar	*search,
+							 gchar		**search,
 							 GCancellable	*cancellable,
 							 ZifCompletion	*completion,
 							 GError		**error);
 GPtrArray	*zif_md_resolve				(ZifMd		*md,
-							 const gchar	*search,
+							 gchar		**search,
 							 GCancellable	*cancellable,
 							 ZifCompletion	*completion,
 							 GError		**error);
diff --git a/backends/yum/libzif/zif-monitor.c b/backends/yum/libzif/zif-monitor.c
index b87867b..547064a 100644
--- a/backends/yum/libzif/zif-monitor.c
+++ b/backends/yum/libzif/zif-monitor.c
@@ -40,7 +40,6 @@
 #include "zif-monitor.h"
 
 #include "egg-debug.h"
-#include "egg-string.h"
 
 #define ZIF_MONITOR_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), ZIF_TYPE_MONITOR, ZifMonitorPrivate))
 
diff --git a/backends/yum/libzif/zif-package-remote.c b/backends/yum/libzif/zif-package-remote.c
index 63813ba..fb74008 100644
--- a/backends/yum/libzif/zif-package-remote.c
+++ b/backends/yum/libzif/zif-package-remote.c
@@ -35,7 +35,6 @@
 #include <stdlib.h>
 
 #include "egg-debug.h"
-#include "egg-string.h"
 
 #include "zif-utils.h"
 #include "zif-package-remote.h"
@@ -52,7 +51,7 @@
 struct _ZifPackageRemotePrivate
 {
 	ZifGroups		*groups;
-	gchar			*sql_id;
+	gchar			*pkgid;
 };
 
 G_DEFINE_TYPE (ZifPackageRemote, zif_package_remote, ZIF_TYPE_PACKAGE)
@@ -83,7 +82,7 @@ zif_package_remote_set_from_repo (ZifPackageRemote *pkg, guint length, gchar **t
 	const gchar *arch = NULL;
 	gchar *package_id;
 	ZifString *string;
-	gboolean ret;
+	gchar *endptr = NULL;
 
 	g_return_val_if_fail (ZIF_IS_PACKAGE_REMOTE (pkg), FALSE);
 	g_return_val_if_fail (type != NULL, FALSE);
@@ -95,8 +94,8 @@ zif_package_remote_set_from_repo (ZifPackageRemote *pkg, guint length, gchar **t
 		if (g_strcmp0 (type[i], "name") == 0) {
 			name = data[i];
 		} else if (g_strcmp0 (type[i], "epoch") == 0) {
-			ret = egg_strtouint (data[i], &epoch);
-			if (!ret)
+			epoch = g_ascii_strtoull (data[i], &endptr, 10);
+			if (data[i] == endptr)
 				egg_warning ("failed to parse epoch %s", data[i]);
 		} else if (g_strcmp0 (type[i], "version") == 0) {
 			version = data[i];
@@ -127,7 +126,7 @@ zif_package_remote_set_from_repo (ZifPackageRemote *pkg, guint length, gchar **t
 		} else if (g_strcmp0 (type[i], "size_package") == 0) {
 			zif_package_set_size (ZIF_PACKAGE (pkg), atoi (data[i]));
 		} else if (g_strcmp0 (type[i], "pkgId") == 0) {
-			pkg->priv->sql_id = g_strdup (data[i]);
+			pkg->priv->pkgid = g_strdup (data[i]);
 		} else if (g_strcmp0 (type[i], "location_href") == 0) {
 			string = zif_string_new (data[i]);
 			zif_package_set_location_href (ZIF_PACKAGE (pkg), string);
@@ -145,6 +144,23 @@ zif_package_remote_set_from_repo (ZifPackageRemote *pkg, guint length, gchar **t
 }
 
 /**
+ * zif_package_remote_get_pkgid:
+ * @pkg: the #ZifPackageRemote object
+ *
+ * Gets the pkgid used internally to track the package item.
+ *
+ * Return value: the pkgid hash.
+ *
+ * Since: 0.0.1
+ **/
+const gchar *
+zif_package_remote_get_pkgid (ZifPackageRemote *pkg)
+{
+	g_return_val_if_fail (ZIF_IS_PACKAGE_REMOTE (pkg), NULL);
+	return pkg->priv->pkgid;
+}
+
+/**
  * zif_package_remote_finalize:
  **/
 static void
@@ -156,7 +172,7 @@ zif_package_remote_finalize (GObject *object)
 	g_return_if_fail (ZIF_IS_PACKAGE_REMOTE (object));
 	pkg = ZIF_PACKAGE_REMOTE (object);
 
-	g_free (pkg->priv->sql_id);
+	g_free (pkg->priv->pkgid);
 	g_object_unref (pkg->priv->groups);
 
 	G_OBJECT_CLASS (zif_package_remote_parent_class)->finalize (object);
@@ -180,7 +196,7 @@ static void
 zif_package_remote_init (ZifPackageRemote *pkg)
 {
 	pkg->priv = ZIF_PACKAGE_REMOTE_GET_PRIVATE (pkg);
-	pkg->priv->sql_id = NULL;
+	pkg->priv->pkgid = NULL;
 	pkg->priv->groups = zif_groups_new ();
 }
 
diff --git a/backends/yum/libzif/zif-package-remote.h b/backends/yum/libzif/zif-package-remote.h
index 09277ed..d29de69 100644
--- a/backends/yum/libzif/zif-package-remote.h
+++ b/backends/yum/libzif/zif-package-remote.h
@@ -62,6 +62,7 @@ gboolean		 zif_package_remote_set_from_repo	(ZifPackageRemote *pkg,
 								 gchar		**data,
 								 const gchar	*repo_id,
 								 GError		**error);
+const gchar		*zif_package_remote_get_pkgid		(ZifPackageRemote *pkg);
 
 G_END_DECLS
 
diff --git a/backends/yum/libzif/zif-package.c b/backends/yum/libzif/zif-package.c
index 4d6890a..5621a1a 100644
--- a/backends/yum/libzif/zif-package.c
+++ b/backends/yum/libzif/zif-package.c
@@ -93,33 +93,27 @@ zif_package_error_quark (void)
  *
  * Compares one package versions against each other.
  *
- * Return value: 1 for a>b, 0 for a==b, -1 for b>a
+ * Return value: 1 for a>b, 0 for a==b, -1 for b>a, or G_MAXINT for error
  *
  * Since: 0.0.1
  **/
 gint
 zif_package_compare (ZifPackage *a, ZifPackage *b)
 {
-	const gchar *package_ida;
-	const gchar *package_idb;
 	gchar **splita;
 	gchar **splitb;
-	gint val = 0;
+	gint val = G_MAXINT;
 
-	g_return_val_if_fail (ZIF_IS_PACKAGE (a), 0);
-	g_return_val_if_fail (ZIF_IS_PACKAGE (b), 0);
+	g_return_val_if_fail (ZIF_IS_PACKAGE (a), G_MAXINT);
+	g_return_val_if_fail (ZIF_IS_PACKAGE (b), G_MAXINT);
 
-	/* shallow copy */
-	package_ida = zif_package_get_id (a);
-	package_idb = zif_package_get_id (b);
-	splita = pk_package_id_split (package_ida);
-	splitb = pk_package_id_split (package_idb);
+	/* no-copy */
+	splita = a->priv->package_id_split;
+	splitb = b->priv->package_id_split;
 
 	/* check name the same */
-	if (g_strcmp0 (splita[PK_PACKAGE_ID_NAME], splitb[PK_PACKAGE_ID_NAME]) != 0) {
-		egg_warning ("comparing between %s and %s", package_ida, package_idb);
+	if (g_strcmp0 (splita[PK_PACKAGE_ID_NAME], splitb[PK_PACKAGE_ID_NAME]) != 0)
 		goto out;
-	}
 
 	/* do a version compare */
 	val = zif_compare_evr (splita[PK_PACKAGE_ID_VERSION], splitb[PK_PACKAGE_ID_VERSION]);
@@ -128,8 +122,6 @@ zif_package_compare (ZifPackage *a, ZifPackage *b)
 	if (val == 0)
 		val = g_strcmp0 (splitb[PK_PACKAGE_ID_ARCH], splita[PK_PACKAGE_ID_ARCH]);
 out:
-	g_strfreev (splita);
-	g_strfreev (splitb);
 	return val;
 }
 
@@ -140,7 +132,7 @@ out:
  *
  * Returns the newest package from a list.
  *
- * Return value: a single %ZifPackage, or %NULL in the case of an error
+ * Return value: a single %ZifPackage, or %NULL in the case of an error. Use g_object_unref() when done.
  *
  * Since: 0.0.1
  **/
@@ -1017,7 +1009,6 @@ zif_package_get_files (ZifPackage *package, GError **error)
 	gboolean ret;
 
 	g_return_val_if_fail (ZIF_IS_PACKAGE (package), NULL);
-	g_return_val_if_fail (package->priv->package_id_split != NULL, NULL);
 	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
 
 	/* not exists */
diff --git a/backends/yum/libzif/zif-repos.c b/backends/yum/libzif/zif-repos.c
index 1ce63b2..ea8cc67 100644
--- a/backends/yum/libzif/zif-repos.c
+++ b/backends/yum/libzif/zif-repos.c
@@ -42,7 +42,6 @@
 #include "zif-monitor.h"
 
 #include "egg-debug.h"
-#include "egg-string.h"
 
 #define ZIF_REPOS_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), ZIF_TYPE_REPOS, ZifReposPrivate))
 
@@ -620,7 +619,7 @@ zif_repos_test (EggTest *test)
 	/************************************************************/
 	egg_test_title (test, "get name");
 	value = zif_store_remote_get_name (store, NULL, completion, NULL);
-	if (egg_strequal (value, "Fedora 11 - i386"))
+	if (g_strcmp0 (value, "Fedora 11 - i386") == 0)
 		egg_test_success (test, NULL);
 	else
 		egg_test_failed (test, "invalid name '%s'", value);
diff --git a/backends/yum/libzif/zif-store-array.c b/backends/yum/libzif/zif-store-array.c
index 467a1fd..d3867fd 100644
--- a/backends/yum/libzif/zif-store-array.c
+++ b/backends/yum/libzif/zif-store-array.c
@@ -47,7 +47,6 @@
 #include "zif-repos.h"
 
 #include "egg-debug.h"
-#include "egg-string.h"
 
 /* in PackageKit we split categories from groups using a special @ prefix (bodge) */
 #define PK_ROLE_ENUM_SEARCH_CATEGORY	(PK_ROLE_ENUM_UNKNOWN + 1)
@@ -214,7 +213,7 @@ out:
  * zif_store_array_repos_search:
  **/
 static GPtrArray *
-zif_store_array_repos_search (GPtrArray *store_array, PkRoleEnum role, const gchar *search,
+zif_store_array_repos_search (GPtrArray *store_array, PkRoleEnum role, gchar **search,
 			      ZifStoreArrayErrorCb error_cb, gpointer user_data,
 			      GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
@@ -502,7 +501,7 @@ out:
  * Since: 0.0.1
  **/
 GPtrArray *
-zif_store_array_resolve (GPtrArray *store_array, const gchar *search,
+zif_store_array_resolve (GPtrArray *store_array, gchar **search,
 			 ZifStoreArrayErrorCb error_cb, gpointer user_data,
 			 GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
@@ -528,7 +527,7 @@ zif_store_array_resolve (GPtrArray *store_array, const gchar *search,
  * Since: 0.0.1
  **/
 GPtrArray *
-zif_store_array_search_name (GPtrArray *store_array, const gchar *search,
+zif_store_array_search_name (GPtrArray *store_array, gchar **search,
 			     ZifStoreArrayErrorCb error_cb, gpointer user_data,
 			     GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
@@ -554,7 +553,7 @@ zif_store_array_search_name (GPtrArray *store_array, const gchar *search,
  * Since: 0.0.1
  **/
 GPtrArray *
-zif_store_array_search_details (GPtrArray *store_array, const gchar *search,
+zif_store_array_search_details (GPtrArray *store_array, gchar **search,
 				ZifStoreArrayErrorCb error_cb, gpointer user_data,
 				GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
@@ -580,7 +579,7 @@ zif_store_array_search_details (GPtrArray *store_array, const gchar *search,
  * Since: 0.0.1
  **/
 GPtrArray *
-zif_store_array_search_group (GPtrArray *store_array, const gchar *group_enum,
+zif_store_array_search_group (GPtrArray *store_array, gchar **group_enum,
 			      ZifStoreArrayErrorCb error_cb, gpointer user_data,
 			      GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
@@ -606,7 +605,7 @@ zif_store_array_search_group (GPtrArray *store_array, const gchar *group_enum,
  * Since: 0.0.1
  **/
 GPtrArray *
-zif_store_array_search_category (GPtrArray *store_array, const gchar *group_id,
+zif_store_array_search_category (GPtrArray *store_array, gchar **group_id,
 				 ZifStoreArrayErrorCb error_cb, gpointer user_data,
 				 GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
@@ -663,7 +662,7 @@ out:
  * Since: 0.0.1
  **/
 GPtrArray *
-zif_store_array_search_file (GPtrArray *store_array, const gchar *search,
+zif_store_array_search_file (GPtrArray *store_array, gchar **search,
 			     ZifStoreArrayErrorCb error_cb, gpointer user_data,
 			     GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
@@ -718,7 +717,7 @@ zif_store_array_get_updates (GPtrArray *store_array, GPtrArray *packages,
 			     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, (gchar *) packages,
+	return zif_store_array_repos_search (store_array, PK_ROLE_ENUM_GET_UPDATES, (gchar **) packages,
 					     error_cb, user_data, cancellable, completion, error);
 }
 
@@ -739,14 +738,14 @@ zif_store_array_get_updates (GPtrArray *store_array, GPtrArray *packages,
  * Since: 0.0.1
  **/
 GPtrArray *
-zif_store_array_what_provides (GPtrArray *store_array, const gchar *search,
+zif_store_array_what_provides (GPtrArray *store_array, gchar **search,
 			       ZifStoreArrayErrorCb error_cb, gpointer user_data,
 			       GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
 	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
 
 	/* if this is a path, then we use the file list and treat like a SearchFile */
-	if (g_str_has_prefix (search, "/")) {
+	if (g_str_has_prefix (search[0], "/")) {
 		return zif_store_array_repos_search (store_array, PK_ROLE_ENUM_SEARCH_FILE, search,
 						     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 23eeed3..a214cc3 100644
--- a/backends/yum/libzif/zif-store-array.h
+++ b/backends/yum/libzif/zif-store-array.h
@@ -73,49 +73,49 @@ gboolean	 zif_store_array_refresh		(GPtrArray		*store_array,
 							 ZifCompletion		*completion,
 							 GError			**error);
 GPtrArray	*zif_store_array_resolve		(GPtrArray		*store_array,
-							 const gchar		*search,
+							 gchar			**search,
 							 ZifStoreArrayErrorCb	 error_cb,
 							 gpointer		 user_data,
 							 GCancellable		*cancellable,
 							 ZifCompletion		*completion,
 							 GError			**error);
 GPtrArray	*zif_store_array_search_name		(GPtrArray		*store_array,
-							 const gchar		*search,
+							 gchar			**search,
 							 ZifStoreArrayErrorCb	 error_cb,
 							 gpointer		 user_data,
 							 GCancellable		*cancellable,
 							 ZifCompletion		*completion,
 							 GError			**error);
 GPtrArray	*zif_store_array_search_details		(GPtrArray		*store_array,
-							 const gchar		*search,
+							 gchar			**search,
 							 ZifStoreArrayErrorCb	 error_cb,
 							 gpointer		 user_data,
 							 GCancellable		*cancellable,
 							 ZifCompletion		*completion,
 							 GError			**error);
 GPtrArray	*zif_store_array_search_group		(GPtrArray		*store_array,
-							 const gchar		*group_enum,
+							 gchar			**group_enum,
 							 ZifStoreArrayErrorCb	 error_cb,
 							 gpointer		 user_data,
 							 GCancellable		*cancellable,
 							 ZifCompletion		*completion,
 							 GError			**error);
 GPtrArray	*zif_store_array_search_category	(GPtrArray		*store_array,
-							 const gchar		*group_id,
+							 gchar			**group_id,
 							 ZifStoreArrayErrorCb	 error_cb,
 							 gpointer		 user_data,
 							 GCancellable		*cancellable,
 							 ZifCompletion		*completion,
 							 GError			**error);
 GPtrArray	*zif_store_array_search_file		(GPtrArray		*store_array,
-							 const gchar		*search,
+							 gchar			**search,
 							 ZifStoreArrayErrorCb	 error_cb,
 							 gpointer		 user_data,
 							 GCancellable		*cancellable,
 							 ZifCompletion		*completion,
 							 GError			**error);
 GPtrArray	*zif_store_array_what_provides		(GPtrArray		*store_array,
-							 const gchar		*search,
+							 gchar			**search,
 							 ZifStoreArrayErrorCb	 error_cb,
 							 gpointer		 user_data,
 							 GCancellable		*cancellable,
diff --git a/backends/yum/libzif/zif-store-local.c b/backends/yum/libzif/zif-store-local.c
index 6b45237..0c830c0 100644
--- a/backends/yum/libzif/zif-store-local.c
+++ b/backends/yum/libzif/zif-store-local.c
@@ -49,7 +49,6 @@
 #include "zif-lock.h"
 
 #include "egg-debug.h"
-#include "egg-string.h"
 
 #define ZIF_STORE_LOCAL_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), ZIF_TYPE_STORE_LOCAL, ZifStoreLocalPrivate))
 
@@ -196,9 +195,9 @@ out:
  * zif_store_local_search_name:
  **/
 static GPtrArray *
-zif_store_local_search_name (ZifStore *store, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+zif_store_local_search_name (ZifStore *store, gchar **search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
-	guint i;
+	guint i, j;
 	GPtrArray *array = NULL;
 	ZifPackage *package;
 	const gchar *package_id;
@@ -258,8 +257,12 @@ zif_store_local_search_name (ZifStore *store, const gchar *search, GCancellable
 		package = g_ptr_array_index (local->priv->packages, i);
 		package_id = zif_package_get_id (package);
 		split = pk_package_id_split (package_id);
-		if (strcasestr (split[PK_PACKAGE_ID_NAME], search) != NULL)
-			g_ptr_array_add (array, g_object_ref (package));
+		for (j=0; search[j] != NULL; j++) {
+			if (strcasestr (split[PK_PACKAGE_ID_NAME], search[j]) != NULL) {
+				g_ptr_array_add (array, g_object_ref (package));
+				break;
+			}
+		}
 		g_strfreev (split);
 
 		/* this section done */
@@ -276,9 +279,9 @@ out:
  * zif_store_local_search_category:
  **/
 static GPtrArray *
-zif_store_local_search_category (ZifStore *store, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+zif_store_local_search_category (ZifStore *store, gchar **search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
-	guint i;
+	guint i, j;
 	GPtrArray *array = NULL;
 	ZifPackage *package;
 	ZifString *category;
@@ -336,8 +339,12 @@ zif_store_local_search_category (ZifStore *store, const gchar *search, GCancella
 	for (i=0;i<local->priv->packages->len;i++) {
 		package = g_ptr_array_index (local->priv->packages, i);
 		category = zif_package_get_category (package, NULL);
-		if (strcmp (zif_string_get_value (category), search) == 0)
-			g_ptr_array_add (array, g_object_ref (package));
+		for (j=0; search[j] != NULL; j++) {
+			if (g_strcmp0 (zif_string_get_value (category), search[j]) == 0) {
+				g_ptr_array_add (array, g_object_ref (package));
+				break;
+			}
+		}
 		zif_string_unref (category);
 
 		/* this section done */
@@ -354,9 +361,9 @@ out:
  * zif_store_local_earch_details:
  **/
 static GPtrArray *
-zif_store_local_search_details (ZifStore *store, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+zif_store_local_search_details (ZifStore *store, gchar **search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
-	guint i;
+	guint i, j;
 	GPtrArray *array = NULL;
 	ZifPackage *package;
 	const gchar *package_id;
@@ -418,10 +425,15 @@ zif_store_local_search_details (ZifStore *store, const gchar *search, GCancellab
 		package_id = zif_package_get_id (package);
 		description = zif_package_get_description (package, NULL);
 		split = pk_package_id_split (package_id);
-		if (strcasestr (split[PK_PACKAGE_ID_NAME], search) != NULL)
-			g_ptr_array_add (array, g_object_ref (package));
-		else if (strcasestr (zif_string_get_value (description), search) != NULL)
-			g_ptr_array_add (array, g_object_ref (package));
+		for (j=0; search[j] != NULL; j++) {
+			if (strcasestr (split[PK_PACKAGE_ID_NAME], search[j]) != NULL) {
+				g_ptr_array_add (array, g_object_ref (package));
+				break;
+			} else if (strcasestr (zif_string_get_value (description), search[j]) != NULL) {
+				g_ptr_array_add (array, g_object_ref (package));
+				break;
+			}
+		}
 		zif_string_unref (description);
 		g_strfreev (split);
 
@@ -439,9 +451,9 @@ out:
  * zif_store_local_search_group:
  **/
 static GPtrArray *
-zif_store_local_search_group (ZifStore *store, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+zif_store_local_search_group (ZifStore *store, gchar **search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
-	guint i;
+	guint i, j;
 	GPtrArray *array = NULL;
 	ZifPackage *package;
 	PkGroupEnum group_tmp;
@@ -495,13 +507,17 @@ zif_store_local_search_group (ZifStore *store, const gchar *search, GCancellable
 	zif_completion_set_number_steps (completion_local, local->priv->packages->len);
 
 	/* iterate list */
-	group = pk_group_enum_from_text (search);
 	array = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
 	for (i=0;i<local->priv->packages->len;i++) {
 		package = g_ptr_array_index (local->priv->packages, i);
-		group_tmp = zif_package_get_group (package, NULL);
-		if (group == group_tmp)
-			g_ptr_array_add (array, g_object_ref (package));
+		for (j=0; search[j] != NULL; j++) {
+			group = pk_group_enum_from_text (search[j]);
+			group_tmp = zif_package_get_group (package, NULL);
+			if (group == group_tmp) {
+				g_ptr_array_add (array, g_object_ref (package));
+				break;
+			}
+		}
 
 		/* this section done */
 		zif_completion_done (completion_local);
@@ -517,9 +533,9 @@ out:
  * zif_store_local_search_file:
  **/
 static GPtrArray *
-zif_store_local_search_file (ZifStore *store, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+zif_store_local_search_file (ZifStore *store, gchar **search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
-	guint i, j;
+	guint i, j, l;
 	GPtrArray *array = NULL;
 	ZifPackage *package;
 	GPtrArray *files;
@@ -587,8 +603,12 @@ zif_store_local_search_file (ZifStore *store, const gchar *search, GCancellable
 		}
 		for (j=0; j<files->len; j++) {
 			filename = g_ptr_array_index (files, j);
-			if (g_strcmp0 (search, filename) == 0)
-				g_ptr_array_add (array, g_object_ref (package));
+			for (l=0; search[l] != NULL; l++) {
+				if (g_strcmp0 (search[l], filename) == 0) {
+					g_ptr_array_add (array, g_object_ref (package));
+					break;
+				}
+			}
 		}
 		g_ptr_array_unref (files);
 
@@ -603,9 +623,9 @@ out:
  * zif_store_local_resolve:
  **/
 static GPtrArray *
-zif_store_local_resolve (ZifStore *store, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+zif_store_local_resolve (ZifStore *store, gchar **search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
-	guint i;
+	guint i, j;
 	GPtrArray *array = NULL;
 	ZifPackage *package;
 	const gchar *package_id;
@@ -665,8 +685,12 @@ zif_store_local_resolve (ZifStore *store, const gchar *search, GCancellable *can
 		package = g_ptr_array_index (local->priv->packages, i);
 		package_id = zif_package_get_id (package);
 		split = pk_package_id_split (package_id);
-		if (strcmp (split[PK_PACKAGE_ID_NAME], search) == 0)
-			g_ptr_array_add (array, g_object_ref (package));
+		for (j=0; search[j] != NULL; j++) {
+			if (strcmp (split[PK_PACKAGE_ID_NAME], search[j]) == 0) {
+				g_ptr_array_add (array, g_object_ref (package));
+				break;
+			}
+		}
 		g_strfreev (split);
 
 		/* this section done */
@@ -683,10 +707,10 @@ out:
  * zif_store_local_what_provides:
  **/
 static GPtrArray *
-zif_store_local_what_provides (ZifStore *store, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+zif_store_local_what_provides (ZifStore *store, gchar **search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
 	guint i;
-	guint j;
+	guint j, k;
 	GPtrArray *array = NULL;
 	ZifPackage *package;
 	GPtrArray *provides;
@@ -747,9 +771,11 @@ zif_store_local_what_provides (ZifStore *store, const gchar *search, GCancellabl
 		provides = zif_package_get_provides (package, NULL);
 		for (j=0; j<provides->len; j++) {
 			provide = g_ptr_array_index (provides, j);
-			if (strcmp (provide->name, search) == 0) {
-				g_ptr_array_add (array, g_object_ref (package));
-				break;
+			for (k=0; search[k] != NULL; k++) {
+				if (g_strcmp0 (provide->name, search[k]) == 0) {
+					g_ptr_array_add (array, g_object_ref (package));
+					break;
+				}
 			}
 		}
 
@@ -1215,7 +1241,7 @@ zif_store_local_test (EggTest *test)
 	egg_test_title (test, "get id");
 	package_id = zif_package_get_id (package);
 	split = pk_package_id_split (package_id);
-	if (egg_strequal (split[PK_PACKAGE_ID_NAME], "PackageKit"))
+	if (g_strcmp0 (split[PK_PACKAGE_ID_NAME], "PackageKit") == 0)
 		egg_test_success (test, NULL);
 	else
 		egg_test_failed (test, "incorrect name: %s", split[PK_PACKAGE_ID_NAME]);
@@ -1232,7 +1258,7 @@ zif_store_local_test (EggTest *test)
 	/************************************************************/
 	egg_test_title (test, "get summary");
 	string = zif_package_get_summary (package, NULL);
-	if (egg_strequal (zif_string_get_value (string), "Package management service"))
+	if (g_strcmp0 (zif_string_get_value(string), "Package management service") == 0)
 		egg_test_success (test, NULL);
 	else
 		egg_test_failed (test, "incorrect summary: %s", zif_string_get_value (string));
@@ -1241,7 +1267,7 @@ zif_store_local_test (EggTest *test)
 	/************************************************************/
 	egg_test_title (test, "get license");
 	string = zif_package_get_license (package, NULL);
-	if (egg_strequal (zif_string_get_value (string), "GPLv2+"))
+	if (g_strcmp0 (zif_string_get_value(string), "GPLv2+") == 0)
 		egg_test_success (test, NULL);
 	else
 		egg_test_failed (test, "incorrect license: %s", zif_string_get_value (string));
@@ -1250,7 +1276,7 @@ zif_store_local_test (EggTest *test)
 	/************************************************************/
 	egg_test_title (test, "get category");
 	string = zif_package_get_category (package, NULL);
-	if (egg_strequal (zif_string_get_value (string), "System Environment/Libraries"))
+	if (g_strcmp0 (zif_string_get_value(string), "System Environment/Libraries") == 0)
 		egg_test_success (test, NULL);
 	else
 		egg_test_failed (test, "incorrect category: %s", zif_string_get_value (string));
diff --git a/backends/yum/libzif/zif-store-remote.c b/backends/yum/libzif/zif-store-remote.c
index 69729d0..ba60afa 100644
--- a/backends/yum/libzif/zif-store-remote.c
+++ b/backends/yum/libzif/zif-store-remote.c
@@ -43,7 +43,8 @@
 #include "zif-package-remote.h"
 #include "zif-md-comps.h"
 #include "zif-md-updateinfo.h"
-#include "zif-md-filelists.h"
+#include "zif-md-filelists-sql.h"
+#include "zif-md-filelists-xml.h"
 #include "zif-md-metalink.h"
 #include "zif-md-mirrorlist.h"
 #include "zif-md-other-sql.h"
@@ -55,7 +56,6 @@
 #include "zif-utils.h"
 
 #include "egg-debug.h"
-#include "egg-string.h"
 
 #define ZIF_STORE_REMOTE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), ZIF_TYPE_STORE_REMOTE, ZifStoreRemotePrivate))
 
@@ -81,10 +81,11 @@ struct _ZifStoreRemotePrivate
 	gboolean		 enabled;
 	gboolean		 loaded;
 	gboolean		 loaded_metadata;
-	ZifMd			*md_other_db;
-	ZifMd			*md_primary_db;
+	ZifMd			*md_other_sql;
+	ZifMd			*md_primary_sql;
 	ZifMd			*md_primary_xml;
-	ZifMd			*md_filelists;
+	ZifMd			*md_filelists_sql;
+	ZifMd			*md_filelists_xml;
 	ZifMd			*md_metalink;
 	ZifMd			*md_mirrorlist;
 	ZifMd			*md_comps;
@@ -125,8 +126,8 @@ 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_sql) != NULL)
+		return store->priv->md_primary_sql;
 	if (zif_md_get_location (store->priv->md_primary_xml) != NULL)
 		return store->priv->md_primary_xml;
 
@@ -135,6 +136,23 @@ zif_store_remote_get_primary (ZifStoreRemote *store)
 }
 
 /**
+ * zif_store_remote_get_filelists:
+ **/
+static ZifMd *
+zif_store_remote_get_filelists (ZifStoreRemote *store)
+{
+	g_return_val_if_fail (ZIF_IS_STORE_REMOTE (store), NULL);
+
+	if (zif_md_get_location (store->priv->md_filelists_sql) != NULL)
+		return store->priv->md_filelists_sql;
+	if (zif_md_get_location (store->priv->md_filelists_xml) != NULL)
+		return store->priv->md_filelists_xml;
+
+	/* this should never happen */
+	return NULL;
+}
+
+/**
  * zif_store_remote_get_md_from_type:
  **/
 static ZifMd *
@@ -144,13 +162,15 @@ zif_store_remote_get_md_from_type (ZifStoreRemote *store, ZifMdType type)
 	g_return_val_if_fail (type != ZIF_MD_TYPE_UNKNOWN, NULL);
 
 	if (type == ZIF_MD_TYPE_FILELISTS_SQL)
-		return store->priv->md_filelists;
+		return store->priv->md_filelists_sql;
+	if (type == ZIF_MD_TYPE_FILELISTS_XML)
+		return store->priv->md_filelists_xml;
 	if (type == ZIF_MD_TYPE_PRIMARY_SQL)
-		return store->priv->md_primary_db;
+		return store->priv->md_primary_sql;
 	if (type == ZIF_MD_TYPE_PRIMARY_XML)
 		return store->priv->md_primary_xml;
 	if (type == ZIF_MD_TYPE_OTHER_SQL)
-		return store->priv->md_other_db;
+		return store->priv->md_other_sql;
 	if (type == ZIF_MD_TYPE_COMPS_GZ)
 		return store->priv->md_comps;
 	if (type == ZIF_MD_TYPE_UPDATEINFO)
@@ -540,17 +560,30 @@ 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;
+	const gchar *pkgid;
 	gboolean ret;
+	guint i;
+	GError *error_local = NULL;
+	GPtrArray *array = NULL;
+	GPtrArray *array_installed = NULL;
+	GPtrArray *changelog = NULL;
+	GPtrArray *packages = NULL;
+	ZifChangeset *changeset;
+	ZifCompletion *completion_local;
+	ZifMd *md;
+	ZifPackage *package_installed = NULL;
+	ZifUpdate *update = NULL;
+	gchar **split = NULL;
+	gchar **split_installed = NULL;
+	ZifStoreLocal *store_local = NULL;
+	const gchar *version;
+	gchar *to_array[] = { NULL, NULL };
 
 	/* setup completion */
 	if (store->priv->loaded_metadata)
-		zif_completion_set_number_steps (completion, 1);
+		zif_completion_set_number_steps (completion, 4);
 	else
-		zif_completion_set_number_steps (completion, 2);
+		zif_completion_set_number_steps (completion, 5);
 
 	/* if not already loaded, load */
 	if (!store->priv->loaded_metadata) {
@@ -572,22 +605,104 @@ zif_store_remote_get_update_detail (ZifStoreRemote *store, const gchar *package_
 	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) {
+		/* lets try this again with fresh metadata */
+		g_set_error (error, ZIF_STORE_ERROR, ZIF_STORE_ERROR_FAILED,
+			     "failed to find any details in updateinfo (but referenced in primary): %s", error_local->message);
+		g_error_free (error_local);
+		goto out;
+	}
+	if (array->len != 1) {
+		/* FIXME: is this valid? */
+		g_set_error (error, ZIF_STORE_ERROR, ZIF_STORE_ERROR_FAILED,
+			     "invalid number of update entries: %i", array->len);
+		goto out;
+	}
+
+	/* get ZifPackage for package-id */
+	md = zif_store_remote_get_primary (store);
+	packages = zif_md_find_package (md, package_id, cancellable, completion_local, &error_local);
+	if (packages == NULL) {
+		g_set_error (error, ZIF_STORE_ERROR, ZIF_STORE_ERROR_FAILED,
+			     "cannot find package in primary repo: %s", error_local->message);
+		g_error_free (error_local);
+		goto out;
+	}
+	/* FIXME: non-fatal? */
+	if (packages->len == 0) {
+		g_set_error (error, ZIF_STORE_ERROR, ZIF_STORE_ERROR_FAILED,
+			     "cannot find package in primary repo: %s", package_id);
+		goto out;
+	}
+
+	/* this section done */
+	zif_completion_done (completion);
+
+	/* get pkgid */
+	pkgid = zif_package_remote_get_pkgid (ZIF_PACKAGE_REMOTE (g_ptr_array_index (packages, 0)));
+
+	/* get changelog and add to ZifUpdate */
+	completion_local = zif_completion_get_child (completion);
+	changelog = zif_md_get_changelog (ZIF_MD (store->priv->md_other_sql), pkgid, cancellable, completion_local, &error_local);
+	if (changelog == NULL) {
 		g_set_error (error, ZIF_STORE_ERROR, ZIF_STORE_ERROR_FAILED,
-			     "failed to find any details: %s", error_local->message);
+			     "failed to get changelog: %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));
+
+	/* this section done */
+	zif_completion_done (completion);
+
+	/* get the newest installed package with this name */
+	completion_local = zif_completion_get_child (completion);
+	split = pk_package_id_split (package_id);
+	store_local = zif_store_local_new ();
+	to_array[0] = split[PK_PACKAGE_ID_NAME];
+	array_installed = zif_store_resolve (ZIF_STORE (store_local), to_array, cancellable, completion_local, &error_local);
+	if (array_installed == NULL) {
+		g_set_error (error, ZIF_STORE_ERROR, ZIF_STORE_ERROR_FAILED,
+			     "failed to resolve installed package for update: %s", error_local->message);
+		g_error_free (error_local);
 		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);
+	/* this section done */
+	zif_completion_done (completion);
+
+	/* get newest, ignore error */
+	package_installed = zif_package_array_get_newest (array_installed, NULL);
+	split_installed = pk_package_id_split (zif_package_get_package_id (package_installed));
+
+	/* add the changesets (the changelog) to the update */
+	update = g_object_ref (g_ptr_array_index (array, 0));
+	for (i=0; i<changelog->len; i++) {
+		changeset = g_ptr_array_index (changelog, i);
+		zif_update_add_changeset (update, changeset);
+
+		/* abort when the changeset is older than what we have installed */
+		version = zif_changeset_get_version (changeset);
+		if (version != NULL &&
+		    zif_compare_evr (split_installed[PK_PACKAGE_ID_VERSION], version) >= 0)
+			break;
+	}
+
+	/* this section done */
+	zif_completion_done (completion);
 out:
+	g_strfreev (split);
+	g_strfreev (split_installed);
+	if (changelog != NULL)
+		g_ptr_array_unref (changelog);
 	if (array != NULL)
 		g_ptr_array_unref (array);
+	if (array_installed != NULL)
+		g_ptr_array_unref (array_installed);
+	if (packages != NULL)
+		g_ptr_array_unref (packages);
+	if (package_installed != NULL)
+		g_object_unref (package_installed);
+	if (store_local != NULL)
+		g_object_unref (store_local);
 	return update;
 }
 
@@ -1210,7 +1325,10 @@ zif_store_remote_load (ZifStore *store, GCancellable *cancellable, ZifCompletion
 	}
 
 	/* we need either a base url or mirror list for an enabled store */
-	if (remote->priv->enabled && remote->priv->baseurls->len == 0 && remote->priv->metalink == NULL && remote->priv->mirrorlist == NULL) {
+	if (remote->priv->enabled &&
+	    remote->priv->baseurls->len == 0 &&
+	    remote->priv->metalink == NULL &&
+	    remote->priv->mirrorlist == NULL) {
 		g_set_error_literal (error, ZIF_STORE_ERROR, ZIF_STORE_ERROR_FAILED,
 				     "baseurl, metalink or mirrorlist required");
 		ret = FALSE;
@@ -1481,7 +1599,7 @@ zif_store_remote_print (ZifStore *store)
  * zif_store_remote_resolve:
  **/
 static GPtrArray *
-zif_store_remote_resolve (ZifStore *store, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+zif_store_remote_resolve (ZifStore *store, gchar **search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
 	gboolean ret;
 	GError *error_local = NULL;
@@ -1536,7 +1654,7 @@ out:
  * zif_store_remote_search_name:
  **/
 static GPtrArray *
-zif_store_remote_search_name (ZifStore *store, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+zif_store_remote_search_name (ZifStore *store, gchar **search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
 	gboolean ret;
 	GError *error_local = NULL;
@@ -1591,7 +1709,7 @@ out:
  * zif_store_remote_search_details:
  **/
 static GPtrArray *
-zif_store_remote_search_details (ZifStore *store, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+zif_store_remote_search_details (ZifStore *store, gchar **search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
 	gboolean ret;
 	GError *error_local = NULL;
@@ -1653,6 +1771,7 @@ zif_store_remote_search_category_resolve (ZifStore *store, const gchar *name, GC
 	GPtrArray *array = NULL;
 	ZifPackage *package = NULL;
 	ZifCompletion *completion_local;
+	const gchar *to_array[] = { NULL, NULL };
 
 	store_local = zif_store_local_new ();
 
@@ -1661,7 +1780,8 @@ zif_store_remote_search_category_resolve (ZifStore *store, const gchar *name, GC
 
 	/* is already installed? */
 	completion_local = zif_completion_get_child (completion);
-	array = zif_store_resolve (ZIF_STORE (store_local), name, cancellable, completion_local, &error_local);
+	to_array[0] = name;
+	array = zif_store_resolve (ZIF_STORE (store_local), (gchar**) to_array, cancellable, completion_local, &error_local);
 	if (array == NULL) {
 		g_set_error (error, ZIF_STORE_ERROR, ZIF_STORE_ERROR_FAILED,
 			     "failed to resolve installed package %s: %s", name, error_local->message);
@@ -1685,7 +1805,8 @@ zif_store_remote_search_category_resolve (ZifStore *store, const gchar *name, GC
 
 	/* is available in this repo? */
 	completion_local = zif_completion_get_child (completion);
-	array = zif_store_resolve (ZIF_STORE (store), name, cancellable, completion_local, &error_local);
+	to_array[0] = name;
+	array = zif_store_resolve (ZIF_STORE (store), (gchar**)to_array, cancellable, completion_local, &error_local);
 	if (array == NULL) {
 		g_set_error (error, ZIF_STORE_ERROR, ZIF_STORE_ERROR_FAILED,
 			     "failed to resolve installed package %s: %s", name, error_local->message);
@@ -1716,7 +1837,7 @@ out:
  * zif_store_remote_search_category:
  **/
 static GPtrArray *
-zif_store_remote_search_category (ZifStore *store, const gchar *group_id, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+zif_store_remote_search_category (ZifStore *store, gchar **group_id, GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
 	gboolean ret;
 	GError *error_local = NULL;
@@ -1773,7 +1894,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_md_comps_get_packages_for_group (ZIF_MD_COMPS (remote->priv->md_comps),
-								group_id, cancellable, completion_local, &error_local);
+							   group_id[0], cancellable, completion_local, &error_local);
 	if (array_names == NULL) {
 		/* ignore when group isn't present, TODO: use GError code */
 		if (g_str_has_prefix (error_local->message, "could not find group")) {
@@ -1782,7 +1903,7 @@ zif_store_remote_search_category (ZifStore *store, const gchar *group_id, GCance
 			goto out;
 		}
 		g_set_error (error, ZIF_STORE_ERROR, ZIF_STORE_ERROR_FAILED,
-			     "failed to get packages for group %s: %s", group_id, error_local->message);
+			     "failed to get packages for group %s: %s", group_id[0], error_local->message);
 		g_error_free (error_local);
 		goto out;
 	}
@@ -1813,7 +1934,7 @@ zif_store_remote_search_category (ZifStore *store, const gchar *group_id, GCance
 			}
 
 			g_set_error (error, ZIF_STORE_ERROR, ZIF_STORE_ERROR_FAILED,
-				     "failed to get resolve %s for %s: %s", name, group_id, error_local->message);
+				     "failed to get resolve %s for %s: %s", name, group_id[0], error_local->message);
 			g_error_free (error_local);
 
 			/* undo all our hard work */
@@ -1841,7 +1962,7 @@ out:
  * zif_store_remote_search_group:
  **/
 static GPtrArray *
-zif_store_remote_search_group (ZifStore *store, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+zif_store_remote_search_group (ZifStore *store, gchar **search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
 	gboolean ret;
 	GError *error_local = NULL;
@@ -2044,7 +2165,6 @@ zif_store_remote_get_categories (ZifStore *store, GCancellable *cancellable, Zif
 	ZifStoreRemote *remote = ZIF_STORE_REMOTE (store);
 	ZifCompletion *completion_local;
 	ZifCompletion *completion_loop;
-//	PkCategory *comps_category;
 	PkCategory *group;
 	PkCategory *category;
 	PkCategory *category_tmp;
@@ -2166,7 +2286,7 @@ zif_store_remote_get_updates (ZifStore *store, GPtrArray *packages,
 			      GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
 	gboolean ret;
-	GPtrArray *updates;
+	GPtrArray *updates = NULL;
 	GPtrArray *array = NULL;
 	ZifPackage *package;
 	ZifPackage *update;
@@ -2180,6 +2300,7 @@ zif_store_remote_get_updates (ZifStore *store, GPtrArray *packages,
 	gchar **split;
 	gchar **split_update;
 	ZifMd *primary;
+	gchar **resolve_array = NULL;
 
 	/* not locked */
 	ret = zif_lock_is_locked (remote->priv->lock, NULL);
@@ -2216,25 +2337,32 @@ zif_store_remote_get_updates (ZifStore *store, GPtrArray *packages,
 	/* get primary */
 	primary = zif_store_remote_get_primary (remote);
 
-	/* find each one in a remote repo */
-	egg_debug ("searching with %i packages", packages->len);
+	/* get the array of packages to resolve */
+	resolve_array = g_new0 (gchar *, packages->len + 1);
 	for (i=0; i<packages->len; i++) {
 		package = ZIF_PACKAGE (g_ptr_array_index (packages, i));
 		package_id = zif_package_get_id (package);
-
-		/* find package name in repo */
-		completion_local = zif_completion_get_child (completion);
 		split = pk_package_id_split (package_id);
-		updates = zif_md_resolve (primary, split[PK_PACKAGE_ID_NAME],
-					  cancellable, completion_local, NULL);
+		resolve_array[i] = g_strdup (split[PK_PACKAGE_ID_NAME]);
 		g_strfreev (split);
-		if (updates == NULL) {
-			egg_debug ("not found %s", package_id);
-			continue;
-		}
+	}
+
+	/* resolve all of them in one fell swoop */
+	completion_local = zif_completion_get_child (completion);
+	updates = zif_md_resolve (primary, resolve_array,
+				  cancellable, completion_local, &error_local);
+	if (updates == NULL) {
+		egg_error ("failed to resolve: %s", error_local->message);
+		g_error_free (error_local);
+	}
 
-		/* some repos contain lots of versions of one package */
-		zif_package_array_filter_newest (updates);
+	/* some repos contain lots of versions of one package */
+	zif_package_array_filter_newest (updates);
+
+	/* find each one in a remote repo */
+	for (i=0; i<packages->len; i++) {
+		package = ZIF_PACKAGE (g_ptr_array_index (packages, i));
+		package_id = zif_package_get_id (package);
 
 		/* find updates */
 		for (j=0; j<updates->len; j++) {
@@ -2242,6 +2370,8 @@ zif_store_remote_get_updates (ZifStore *store, GPtrArray *packages,
 
 			/* newer? */
 			val = zif_package_compare (update, package);
+			if (val == G_MAXINT)
+				continue;
 			if (val > 0) {
 				package_id_update = zif_package_get_id (update);
 				split = pk_package_id_split (package_id);
@@ -2255,12 +2385,14 @@ zif_store_remote_get_updates (ZifStore *store, GPtrArray *packages,
 				g_ptr_array_add (array, g_object_ref (update));
 			}
 		}
-		g_ptr_array_unref (updates);
 	}
 
 	/* this section done */
 	zif_completion_done (completion);
 out:
+	g_strfreev (resolve_array);
+	if (updates != NULL)
+		g_ptr_array_unref (updates);
 	return array;
 }
 
@@ -2268,7 +2400,7 @@ out:
  * zif_store_remote_what_provides:
  **/
 static GPtrArray *
-zif_store_remote_what_provides (ZifStore *store, const gchar *search,
+zif_store_remote_what_provides (ZifStore *store, gchar **search,
 				GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
 	gboolean ret;
@@ -2323,7 +2455,7 @@ out:
  * zif_store_remote_search_file:
  **/
 static GPtrArray *
-zif_store_remote_search_file (ZifStore *store, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+zif_store_remote_search_file (ZifStore *store, gchar **search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
 	gboolean ret;
 	GError *error_local = NULL;
@@ -2336,6 +2468,8 @@ zif_store_remote_search_file (ZifStore *store, const gchar *search, GCancellable
 	guint i, j;
 	ZifStoreRemote *remote = ZIF_STORE_REMOTE (store);
 	ZifMd *primary;
+	ZifMd *filelists;
+	const gchar *to_array[] = { NULL, NULL };
 
 	/* not locked */
 	ret = zif_lock_is_locked (remote->priv->lock, NULL);
@@ -2368,7 +2502,9 @@ 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_md_filelists_search_file (ZIF_MD_FILELISTS (remote->priv->md_filelists), search, cancellable, completion_local, &error_local);
+	filelists = zif_store_remote_get_filelists (remote);
+	pkgids = zif_md_search_file (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);
@@ -2389,7 +2525,8 @@ 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 (primary, pkgid, cancellable, completion_local, &error_local);
+		to_array[0] = pkgid;
+		tmp = zif_md_search_pkgid (primary, (gchar **) to_array, 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);
@@ -2629,10 +2766,11 @@ zif_store_remote_finalize (GObject *object)
 	g_free (store->priv->repomd_filename);
 	g_free (store->priv->directory);
 
-	g_object_unref (store->priv->md_other_db);
-	g_object_unref (store->priv->md_primary_db);
+	g_object_unref (store->priv->md_other_sql);
+	g_object_unref (store->priv->md_primary_sql);
 	g_object_unref (store->priv->md_primary_xml);
-	g_object_unref (store->priv->md_filelists);
+	g_object_unref (store->priv->md_filelists_sql);
+	g_object_unref (store->priv->md_filelists_xml);
 	g_object_unref (store->priv->md_comps);
 	g_object_unref (store->priv->md_updateinfo);
 	g_object_unref (store->priv->md_metalink);
@@ -2703,9 +2841,10 @@ 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_MD (zif_md_filelists_new ());
-	store->priv->md_other_db = ZIF_MD (zif_md_other_sql_new ());
-	store->priv->md_primary_db = ZIF_MD (zif_md_primary_sql_new ());
+	store->priv->md_filelists_sql = ZIF_MD (zif_md_filelists_sql_new ());
+	store->priv->md_filelists_xml = ZIF_MD (zif_md_filelists_xml_new ());
+	store->priv->md_other_sql = ZIF_MD (zif_md_other_sql_new ());
+	store->priv->md_primary_sql = 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 ());
@@ -2785,6 +2924,7 @@ zif_store_remote_test (EggTest *test)
 	const gchar *id;
 	PkCategory *category;
 	guint i;
+	const gchar *in_array[] = { NULL, NULL };
 
 	if (!egg_test_start (test, "ZifStoreRemote"))
 		return;
@@ -2857,7 +2997,7 @@ zif_store_remote_test (EggTest *test)
 	/************************************************************/
 	egg_test_title (test, "get id");
 	id = zif_store_get_id (ZIF_STORE (store));
-	if (egg_strequal (id, "fedora"))
+	if (g_strcmp0 (id, "fedora") == 0)
 		egg_test_success (test, NULL);
 	else
 		egg_test_failed (test, "invalid id '%s'", id);
@@ -2865,7 +3005,7 @@ zif_store_remote_test (EggTest *test)
 	/************************************************************/
 	egg_test_title (test, "get name");
 	id = zif_store_remote_get_name (store, NULL, completion, NULL);
-	if (egg_strequal (id, "Fedora 11 - i386"))
+	if (g_strcmp0 (id, "Fedora 11 - i386") == 0)
 		egg_test_success (test, NULL);
 	else
 		egg_test_failed (test, "invalid name '%s'", id);
@@ -2882,7 +3022,8 @@ zif_store_remote_test (EggTest *test)
 	/************************************************************/
 	egg_test_title (test, "resolve");
 	zif_completion_reset (completion);
-	array = zif_store_remote_resolve (ZIF_STORE (store), "kernel", NULL, completion, &error);
+	in_array[0] = "kernel";
+	array = zif_store_remote_resolve (ZIF_STORE (store), (gchar**)in_array, NULL, completion, &error);
 	if (array != NULL)
 		egg_test_success (test, NULL);
 	else
@@ -2900,7 +3041,8 @@ zif_store_remote_test (EggTest *test)
 	/************************************************************/
 	egg_test_title (test, "search name");
 	zif_completion_reset (completion);
-	array = zif_store_remote_search_name (ZIF_STORE (store), "power-manager", NULL, completion, &error);
+	in_array[0] = "power-manager";
+	array = zif_store_remote_search_name (ZIF_STORE (store), (gchar**)in_array, NULL, completion, &error);
 	if (array != NULL)
 		egg_test_success (test, NULL);
 	else
@@ -2918,7 +3060,8 @@ zif_store_remote_test (EggTest *test)
 	/************************************************************/
 	egg_test_title (test, "search details");
 	zif_completion_reset (completion);
-	array = zif_store_remote_search_details (ZIF_STORE (store), "browser plugin", NULL, completion, &error);
+	in_array[0] = "browser plugin";
+	array = zif_store_remote_search_details (ZIF_STORE (store), (gchar**)in_array, NULL, completion, &error);
 	if (array != NULL)
 		egg_test_success (test, NULL);
 	else
@@ -2936,7 +3079,8 @@ zif_store_remote_test (EggTest *test)
 	/************************************************************/
 	egg_test_title (test, "search file");
 	zif_completion_reset (completion);
-	array = zif_store_remote_search_file (ZIF_STORE (store), "/usr/bin/gnome-power-manager", NULL, completion, &error);
+	in_array[0] = "/usr/bin/gnome-power-manager";
+	array = zif_store_remote_search_file (ZIF_STORE (store), (gchar**)in_array, NULL, completion, &error);
 	if (array != NULL)
 		egg_test_success (test, NULL);
 	else
diff --git a/backends/yum/libzif/zif-store.c b/backends/yum/libzif/zif-store.c
index fe8b704..958cfe4 100644
--- a/backends/yum/libzif/zif-store.c
+++ b/backends/yum/libzif/zif-store.c
@@ -37,7 +37,6 @@
 #include "zif-package.h"
 
 #include "egg-debug.h"
-#include "egg-string.h"
 
 G_DEFINE_TYPE (ZifStore, zif_store, G_TYPE_OBJECT)
 
@@ -166,7 +165,7 @@ zif_store_refresh (ZifStore *store, gboolean force, GCancellable *cancellable, Z
  * Since: 0.0.1
  **/
 GPtrArray *
-zif_store_search_name (ZifStore *store, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+zif_store_search_name (ZifStore *store, gchar **search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
 	ZifStoreClass *klass = ZIF_STORE_GET_CLASS (store);
 
@@ -199,7 +198,7 @@ zif_store_search_name (ZifStore *store, const gchar *search, GCancellable *cance
  * Since: 0.0.1
  **/
 GPtrArray *
-zif_store_search_category (ZifStore *store, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+zif_store_search_category (ZifStore *store, gchar **search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
 	ZifStoreClass *klass = ZIF_STORE_GET_CLASS (store);
 
@@ -232,7 +231,7 @@ zif_store_search_category (ZifStore *store, const gchar *search, GCancellable *c
  * Since: 0.0.1
  **/
 GPtrArray *
-zif_store_search_details (ZifStore *store, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+zif_store_search_details (ZifStore *store, gchar **search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
 	ZifStoreClass *klass = ZIF_STORE_GET_CLASS (store);
 
@@ -264,7 +263,7 @@ zif_store_search_details (ZifStore *store, const gchar *search, GCancellable *ca
  * Since: 0.0.1
  **/
 GPtrArray *
-zif_store_search_group (ZifStore *store, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+zif_store_search_group (ZifStore *store, gchar **search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
 	ZifStoreClass *klass = ZIF_STORE_GET_CLASS (store);
 
@@ -297,7 +296,7 @@ zif_store_search_group (ZifStore *store, const gchar *search, GCancellable *canc
  * Since: 0.0.1
  **/
 GPtrArray *
-zif_store_search_file (ZifStore *store, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+zif_store_search_file (ZifStore *store, gchar **search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
 	ZifStoreClass *klass = ZIF_STORE_GET_CLASS (store);
 
@@ -330,7 +329,7 @@ zif_store_search_file (ZifStore *store, const gchar *search, GCancellable *cance
  * Since: 0.0.1
  **/
 GPtrArray *
-zif_store_resolve (ZifStore *store, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+zif_store_resolve (ZifStore *store, gchar **search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
 	ZifStoreClass *klass = ZIF_STORE_GET_CLASS (store);
 
@@ -363,7 +362,7 @@ zif_store_resolve (ZifStore *store, const gchar *search, GCancellable *cancellab
  * Since: 0.0.1
  **/
 GPtrArray *
-zif_store_what_provides (ZifStore *store, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+zif_store_what_provides (ZifStore *store, gchar **search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
 	ZifStoreClass *klass = ZIF_STORE_GET_CLASS (store);
 
diff --git a/backends/yum/libzif/zif-store.h b/backends/yum/libzif/zif-store.h
index a0bf212..8828227 100644
--- a/backends/yum/libzif/zif-store.h
+++ b/backends/yum/libzif/zif-store.h
@@ -71,37 +71,37 @@ struct _ZifStoreClass
 						 ZifCompletion		*completion,
 						 GError			**error);
 	GPtrArray	*(*search_name)		(ZifStore		*store,
-						 const gchar		*search,
+						 gchar			**search,
 						 GCancellable		*cancellable,
 						 ZifCompletion		*completion,
 						 GError			**error);
 	GPtrArray	*(*search_category)	(ZifStore		*store,
-						 const gchar		*search,
+						 gchar			**search,
 						 GCancellable		*cancellable,
 						 ZifCompletion		*completion,
 						 GError			**error);
 	GPtrArray	*(*search_details)	(ZifStore		*store,
-						 const gchar		*search,
+						 gchar			**search,
 						 GCancellable		*cancellable,
 						 ZifCompletion		*completion,
 						 GError			**error);
 	GPtrArray	*(*search_group)	(ZifStore		*store,
-						 const gchar		*search,
+						 gchar			**search,
 						 GCancellable		*cancellable,
 						 ZifCompletion		*completion,
 						 GError			**error);
 	GPtrArray	*(*search_file)		(ZifStore		*store,
-						 const gchar		*search,
+						 gchar			**search,
 						 GCancellable		*cancellable,
 						 ZifCompletion		*completion,
 						 GError			**error);
 	GPtrArray	*(*resolve)		(ZifStore		*store,
-						 const gchar		*search,
+						 gchar			**search,
 						 GCancellable		*cancellable,
 						 ZifCompletion		*completion,
 						 GError			**error);
 	GPtrArray	*(*what_provides)	(ZifStore		*store,
-						 const gchar		*search,
+						 gchar			**search,
 						 GCancellable		*cancellable,
 						 ZifCompletion		*completion,
 						 GError			**error);
@@ -156,37 +156,37 @@ gboolean	 zif_store_refresh		(ZifStore		*store,
 						 ZifCompletion		*completion,
 						 GError			**error);
 GPtrArray	*zif_store_search_name		(ZifStore		*store,
-						 const gchar		*search,
+						 gchar			**search,
 						 GCancellable		*cancellable,
 						 ZifCompletion		*completion,
 						 GError			**error);
 GPtrArray	*zif_store_search_category	(ZifStore		*store,
-						 const gchar		*search,
+						 gchar			**search,
 						 GCancellable		*cancellable,
 						 ZifCompletion		*completion,
 						 GError			**error);
 GPtrArray	*zif_store_search_details	(ZifStore		*store,
-						 const gchar		*search,
+						 gchar			**search,
 						 GCancellable		*cancellable,
 						 ZifCompletion		*completion,
 						 GError			**error);
 GPtrArray	*zif_store_search_group		(ZifStore		*store,
-						 const gchar		*search,
+						 gchar			**search,
 						 GCancellable		*cancellable,
 						 ZifCompletion		*completion,
 						 GError			**error);
 GPtrArray	*zif_store_search_file		(ZifStore		*store,
-						 const gchar		*search,
+						 gchar			**search,
 						 GCancellable		*cancellable,
 						 ZifCompletion		*completion,
 						 GError			**error);
 GPtrArray	*zif_store_resolve		(ZifStore		*store,
-						 const gchar		*search,
+						 gchar			**search,
 						 GCancellable		*cancellable,
 						 ZifCompletion		*completion,
 						 GError			**error);
 GPtrArray	*zif_store_what_provides	(ZifStore		*store,
-						 const gchar		*search,
+						 gchar			**search,
 						 GCancellable		*cancellable,
 						 ZifCompletion		*completion,
 						 GError			**error);
diff --git a/backends/yum/libzif/zif-update.c b/backends/yum/libzif/zif-update.c
index 3ba9dcf..fadabcf 100644
--- a/backends/yum/libzif/zif-update.c
+++ b/backends/yum/libzif/zif-update.c
@@ -46,8 +46,10 @@ struct _ZifUpdatePrivate
 	gchar			*title;
 	gchar			*description;
 	gchar			*issued;
+	gboolean		 reboot;
 	GPtrArray		*update_infos;
 	GPtrArray		*packages;
+	GPtrArray		*changelog;
 };
 
 enum {
@@ -58,6 +60,7 @@ enum {
 	PROP_TITLE,
 	PROP_DESCRIPTION,
 	PROP_ISSUED,
+	PROP_REBOOT,
 	PROP_LAST
 };
 
@@ -166,6 +169,23 @@ zif_update_get_issued (ZifUpdate *update)
 }
 
 /**
+ * zif_update_get_reboot:
+ * @update: the #ZifUpdate object
+ *
+ * Gets if the update requires a reboot.
+ *
+ * Return value: %TRUE for a reboot.
+ *
+ * Since: 0.0.1
+ **/
+gboolean
+zif_update_get_reboot (ZifUpdate *update)
+{
+	g_return_val_if_fail (ZIF_IS_UPDATE (update), FALSE);
+	return update->priv->reboot;
+}
+
+/**
  * zif_update_get_update_infos:
  * @update: the #ZifUpdate object
  *
@@ -200,6 +220,23 @@ zif_update_get_packages (ZifUpdate *update)
 }
 
 /**
+ * zif_update_get_changelog:
+ * @update: the #ZifUpdate object
+ *
+ * Gets the changelog for this update.
+ *
+ * Return value: A #GPtrArray of #ZifChangeset's, or %NULL.
+ *
+ * Since: 0.0.1
+ **/
+GPtrArray *
+zif_update_get_changelog (ZifUpdate *update)
+{
+	g_return_val_if_fail (ZIF_IS_UPDATE (update), NULL);
+	return update->priv->changelog;
+}
+
+/**
  * zif_update_set_state:
  * @update: the #ZifUpdate object
  * @state: If the update is state
@@ -308,6 +345,23 @@ zif_update_set_issued (ZifUpdate *update, const gchar *issued)
 }
 
 /**
+ * zif_update_set_reboot:
+ * @update: the #ZifUpdate object
+ * @reboot: if the update requires a reboot
+ *
+ * Sets the update reboot status
+ *
+ * Since: 0.0.1
+ **/
+void
+zif_update_set_reboot (ZifUpdate *update, gboolean reboot)
+{
+	g_return_if_fail (ZIF_IS_UPDATE (update));
+
+	update->priv->reboot = reboot;
+}
+
+/**
  * zif_update_add_update_info:
  * @update: the #ZifUpdate object
  * @update_info: the #ZifUpdateInfo
@@ -342,6 +396,23 @@ zif_update_add_package (ZifUpdate *update, ZifPackage *package)
 }
 
 /**
+ * zif_update_add_changeset:
+ * @update: the #ZifUpdate object
+ * @package: the #ZifPackage
+ *
+ * Adds a changeset to the update.
+ *
+ * Since: 0.0.1
+ **/
+void
+zif_update_add_changeset (ZifUpdate *update, ZifChangeset *changeset)
+{
+	g_return_if_fail (ZIF_IS_UPDATE (update));
+	g_return_if_fail (changeset != NULL);
+	g_ptr_array_add (update->priv->changelog, g_object_ref (changeset));
+}
+
+/**
  * zif_update_get_property:
  **/
 static void
@@ -369,6 +440,9 @@ zif_update_get_property (GObject *object, guint prop_id, GValue *value, GParamSp
 	case PROP_ISSUED:
 		g_value_set_string (value, priv->issued);
 		break;
+	case PROP_REBOOT:
+		g_value_set_boolean (value, priv->reboot);
+		break;
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 		break;
@@ -401,6 +475,7 @@ zif_update_finalize (GObject *object)
 	g_free (update->priv->issued);
 	g_ptr_array_unref (update->priv->update_infos);
 	g_ptr_array_unref (update->priv->packages);
+	g_ptr_array_unref (update->priv->changelog);
 
 	G_OBJECT_CLASS (zif_update_parent_class)->finalize (object);
 }
@@ -477,6 +552,16 @@ zif_update_class_init (ZifUpdateClass *klass)
 				     G_PARAM_READABLE);
 	g_object_class_install_property (object_class, PROP_ISSUED, pspec);
 
+	/**
+	 * ZifUpdate:reboot:
+	 *
+	 * Since: 0.0.1
+	 */
+	pspec = g_param_spec_boolean ("reboot", NULL, NULL,
+				      FALSE,
+				      G_PARAM_READABLE);
+	g_object_class_install_property (object_class, PROP_REBOOT, pspec);
+
 	g_type_class_add_private (klass, sizeof (ZifUpdatePrivate));
 }
 
@@ -493,8 +578,10 @@ zif_update_init (ZifUpdate *update)
 	update->priv->title = NULL;
 	update->priv->description = NULL;
 	update->priv->issued = NULL;
+	update->priv->reboot = FALSE;
 	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);
+	update->priv->changelog = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
 }
 
 /**
diff --git a/backends/yum/libzif/zif-update.h b/backends/yum/libzif/zif-update.h
index 881b0d8..11e6ddd 100644
--- a/backends/yum/libzif/zif-update.h
+++ b/backends/yum/libzif/zif-update.h
@@ -47,6 +47,7 @@ typedef struct _ZifUpdatePrivate ZifUpdatePrivate;
 typedef struct _ZifUpdateClass	 ZifUpdateClass;
 
 #include "zif-package.h"
+#include "zif-changeset.h"
 
 struct _ZifUpdate
 {
@@ -69,8 +70,10 @@ 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);
+gboolean		 zif_update_get_reboot		(ZifUpdate		*update);
 GPtrArray		*zif_update_get_update_infos	(ZifUpdate		*update);
 GPtrArray		*zif_update_get_packages	(ZifUpdate		*update);
+GPtrArray		*zif_update_get_changelog	(ZifUpdate		*update);
 
 /* internal setters: TODO, in seporate -internal header file */
 void			 zif_update_set_state		(ZifUpdate		*update,
@@ -85,10 +88,14 @@ void			 zif_update_set_description	(ZifUpdate		*update,
 							 const gchar		*description);
 void			 zif_update_set_issued		(ZifUpdate		*update,
 							 const gchar		*issued);
+void			 zif_update_set_reboot		(ZifUpdate		*update,
+							 gboolean		 reboot);
 void			 zif_update_add_update_info	(ZifUpdate		*update,
 							 ZifUpdateInfo		*update_info);
 void			 zif_update_add_package		(ZifUpdate		*update,
 							 ZifPackage		*package);
+void			 zif_update_add_changeset	(ZifUpdate		*update,
+							 ZifChangeset		*changeset);
 
 G_END_DECLS
 
diff --git a/backends/yum/libzif/zif-utils.c b/backends/yum/libzif/zif-utils.c
index a384cd8..a310674 100644
--- a/backends/yum/libzif/zif-utils.c
+++ b/backends/yum/libzif/zif-utils.c
@@ -40,7 +40,6 @@
 #include <packagekit-glib2/packagekit.h>
 
 #include "egg-debug.h"
-#include "egg-string.h"
 
 #include "zif-utils.h"
 #include "zif-package.h"
@@ -655,7 +654,7 @@ zif_utils_test (EggTest *test)
 	 ************************************************************/
 	egg_test_title (test, "no epoch");
 	package_id = zif_package_id_from_nevra ("kernel", 0, "0.0.1", "1", "i386", "fedora");
-	if (egg_strequal (package_id, "kernel;0.0.1-1;i386;fedora"))
+	if (g_strcmp0 (package_id, "kernel;0.0.1-1;i386;fedora") == 0)
 		egg_test_success (test, NULL);
 	else
 		egg_test_failed (test, "incorrect package_id '%s'", package_id);
@@ -664,7 +663,7 @@ zif_utils_test (EggTest *test)
 	/************************************************************/
 	egg_test_title (test, "epoch value");
 	package_id = zif_package_id_from_nevra ("kernel", 2, "0.0.1", "1", "i386", "fedora");
-	if (egg_strequal (package_id, "kernel;2:0.0.1-1;i386;fedora"))
+	if (g_strcmp0 (package_id, "kernel;2:0.0.1-1;i386;fedora") == 0)
 		egg_test_success (test, NULL);
 	else
 		egg_test_failed (test, "incorrect package_id '%s'", package_id);
@@ -699,7 +698,7 @@ zif_utils_test (EggTest *test)
 	egg_test_title (test, "convert evr");
 	evr = g_strdup ("7:1.0.0-6");
 	zif_package_convert_evr (evr, &e, &v, &r);
-	if (egg_strequal (e, "7") && egg_strequal (v, "1.0.0") && egg_strequal (r, "6"))
+	if (g_strcmp0 (e, "7") == 0 && g_strcmp0 (v, "1.0.0") == 0 && g_strcmp0 (r, "6") == 0)
 		egg_test_success (test, NULL);
 	else
 		egg_test_failed (test, "incorrect evr '%s','%s','%s'", e, v, r);
@@ -709,7 +708,7 @@ zif_utils_test (EggTest *test)
 	egg_test_title (test, "convert evr no epoch");
 	evr = g_strdup ("1.0.0-6");
 	zif_package_convert_evr (evr, &e, &v, &r);
-	if (e == NULL && egg_strequal (v, "1.0.0") && egg_strequal (r, "6"))
+	if (e == NULL && g_strcmp0 (v, "1.0.0") == 0 && g_strcmp0 (r, "6") == 0)
 		egg_test_success (test, NULL);
 	else
 		egg_test_failed (test, "incorrect evr '%s','%s','%s'", e, v, r);
@@ -719,7 +718,7 @@ zif_utils_test (EggTest *test)
 	egg_test_title (test, "convert evr no epoch or release");
 	evr = g_strdup ("1.0.0");
 	zif_package_convert_evr (evr, &e, &v, &r);
-	if (e == NULL && egg_strequal (v, "1.0.0") && r == NULL)
+	if (e == NULL && g_strcmp0 (v, "1.0.0") == 0 && r == NULL)
 		egg_test_success (test, NULL);
 	else
 		egg_test_failed (test, "incorrect evr '%s','%s','%s'", e, v, r);
diff --git a/backends/yum/pk-backend-yum.c b/backends/yum/pk-backend-yum.c
index 32b1846..7cd488c 100644
--- a/backends/yum/pk-backend-yum.c
+++ b/backends/yum/pk-backend-yum.c
@@ -212,23 +212,6 @@ backend_unlock (PkBackend *backend)
 	return ret;
 }
 
-
-/**
- * backend_add_package_array:
- **/
-static gboolean
-backend_add_package_array (GPtrArray *array, GPtrArray *add)
-{
-	guint i;
-	ZifPackage *package;
-
-	for (i=0;i<add->len;i++) {
-		package = g_ptr_array_index (add, i);
-		g_ptr_array_add (array, g_object_ref (package));
-	}
-	return TRUE;
-}
-
 /**
  * backend_filter_package_array_newest:
  *
@@ -410,46 +393,6 @@ backend_error_handler_cb (GPtrArray *store_array, const GError *error, PkBackend
 }
 
 /**
- * backend_search_thread_get_array:
- */
-static GPtrArray *
-backend_search_thread_get_array (PkBackend *backend, GPtrArray *store_array, const gchar *search, ZifCompletion *completion, GError **error)
-{
-	PkRoleEnum role;
-	GPtrArray *array = NULL;
-
-	role = pk_backend_get_role (backend);
-	if (role == PK_ROLE_ENUM_SEARCH_NAME) {
-		array = zif_store_array_search_name (store_array, search,
-						     (ZifStoreArrayErrorCb) backend_error_handler_cb, backend,
-						     priv->cancellable, completion, error);
-	} else if (role == PK_ROLE_ENUM_SEARCH_DETAILS) {
-		array = zif_store_array_search_details (store_array, search,
-							(ZifStoreArrayErrorCb) backend_error_handler_cb, backend,
-							priv->cancellable, completion, error);
-	} else if (role == PK_ROLE_ENUM_SEARCH_GROUP) {
-		array = zif_store_array_search_category (store_array, search,
-							 (ZifStoreArrayErrorCb) backend_error_handler_cb, backend,
-							 priv->cancellable, completion, error);
-	} else if (role == PK_ROLE_ENUM_SEARCH_FILE) {
-		array = zif_store_array_search_file (store_array, search,
-						     (ZifStoreArrayErrorCb) backend_error_handler_cb, backend,
-						     priv->cancellable, completion, error);
-	} else if (role == PK_ROLE_ENUM_RESOLVE) {
-		array = zif_store_array_resolve (store_array, search,
-						 (ZifStoreArrayErrorCb) backend_error_handler_cb, backend,
-						 priv->cancellable, completion, error);
-	} else if (role == PK_ROLE_ENUM_WHAT_PROVIDES) {
-		array = zif_store_array_what_provides (store_array, search,
-						       (ZifStoreArrayErrorCb) backend_error_handler_cb, backend,
-						       priv->cancellable, completion, error);
-	} else {
-		g_set_error (error, 1, 0, "does not support: %s", pk_role_enum_to_string (role));
-	}
-	return array;
-}
-
-/**
  * backend_get_default_store_array_for_filter:
  */
 static GPtrArray *
@@ -499,11 +442,8 @@ backend_search_thread (PkBackend *backend)
 	PkBitfield filters;
 	PkRoleEnum role;
 	ZifCompletion *completion_local;
-	ZifCompletion *completion_loop;
 	GError *error = NULL;
 	gchar **search;
-	const gchar *search_tmp;
-	guint i;
 	filters = (PkBitfield) pk_backend_get_uint (backend, "filters");
 	role = pk_backend_get_role (backend);
 
@@ -556,34 +496,43 @@ backend_search_thread (PkBackend *backend)
 		}
 		array = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
 
-		completion_local = zif_completion_get_child (priv->completion);
-		zif_completion_set_number_steps (completion_local, g_strv_length (search));
-
 		/* do OR search */
-		for (i=0; search[i] != NULL; i++) {
-			/* make loop deeper */
-			completion_loop = zif_completion_get_child (completion_local);
-
-			/* strip off the prefix '@' */
-			search_tmp = search[i];
-			if (g_str_has_prefix (search_tmp, "@"))
-				search_tmp = search_tmp+1;
-
-			/* get the results */
-			egg_debug ("searching for: %s", search_tmp);
-			result = backend_search_thread_get_array (backend, store_array, search_tmp, completion_loop, &error);
-			if (result == NULL) {
-				pk_backend_error_code (backend, PK_ERROR_ENUM_INTERNAL_ERROR, "failed to search: %s", error->message);
-				g_error_free (error);
-				goto out;
-			}
-
-			/* this section done */
-			zif_completion_done (completion_local);
-
-			backend_add_package_array (array, result);
-			g_ptr_array_unref (result);
+		completion_local = zif_completion_get_child (priv->completion);
+		if (role == PK_ROLE_ENUM_SEARCH_NAME) {
+			array = zif_store_array_search_name (store_array, search,
+							     (ZifStoreArrayErrorCb) backend_error_handler_cb, backend,
+							     priv->cancellable, completion_local, &error);
+		} else if (role == PK_ROLE_ENUM_SEARCH_DETAILS) {
+			array = zif_store_array_search_details (store_array, search,
+								(ZifStoreArrayErrorCb) backend_error_handler_cb, backend,
+								priv->cancellable, completion_local, &error);
+		} else if (role == PK_ROLE_ENUM_SEARCH_GROUP) {
+			array = zif_store_array_search_category (store_array, search,
+								 (ZifStoreArrayErrorCb) backend_error_handler_cb, backend,
+								 priv->cancellable, completion_local, &error);
+		} else if (role == PK_ROLE_ENUM_SEARCH_FILE) {
+			array = zif_store_array_search_file (store_array, search,
+							     (ZifStoreArrayErrorCb) backend_error_handler_cb, backend,
+							     priv->cancellable, completion_local, &error);
+		} else if (role == PK_ROLE_ENUM_RESOLVE) {
+			array = zif_store_array_resolve (store_array, search,
+							 (ZifStoreArrayErrorCb) backend_error_handler_cb, backend,
+							 priv->cancellable, completion_local, &error);
+		} else if (role == PK_ROLE_ENUM_WHAT_PROVIDES) {
+			array = zif_store_array_what_provides (store_array, search,
+							       (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 search: %s", error->message);
+			g_error_free (error);
+			goto out;
+		}
+
+//			/* strip off the prefix '@' */
+//			search_tmp = search[i];
+//			if (g_str_has_prefix (search_tmp, "@"))
+//				search_tmp = search_tmp+1;
 	}
 
 	/* this section done */
diff --git a/src/egg-string.c b/src/egg-string.c
index 5542e46..f04f94c 100644
--- a/src/egg-string.c
+++ b/src/egg-string.c
@@ -220,7 +220,7 @@ egg_strreplace (const gchar *text, const gchar *find, const gchar *replace)
 	gchar *retval;
 
 	/* common case, not found */
-	if (strstr (text, find) == NULL) {
+	if (g_strstr_len (text, -1, find) == NULL) {
 		return g_strdup (text);
 	}
 
commit 91ebf46a4e1b717493a82abf7b3ff76bc47d34e8
Author: ruigo <ruigo at fedoraproject.org>
Date:   Wed Apr 14 21:09:18 2010 +0000

    l10n: Updates to Portuguese (pt) translation
    
    Transmitted-via: Transifex (translate.fedoraproject.org)

diff --git a/po/pt.po b/po/pt.po
index c378ba8..7bc9d15 100644
--- a/po/pt.po
+++ b/po/pt.po
@@ -3,8 +3,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: packagekit\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-16 14:09+0000\n"
-"PO-Revision-Date: 2010-03-16 14:16+0100\n"
+"POT-Creation-Date: 2010-04-14 19:46+0000\n"
+"PO-Revision-Date: 2010-04-14 22:07+0100\n"
 "Last-Translator: Rui Gouveia <rui.gouveia at gmail.com>\n"
 "Language-Team: trans-pt at fedoraproject.org\n"
 "Language: pt\n"
@@ -19,115 +19,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 "Transacção"
 
 #. 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 do sistema"
 
 #. TRANSLATORS: this is if the transaction succeeded or not
-#: ../client/pk-console.c:179
+#: ../client/pk-console.c:180
 msgid "Succeeded"
 msgstr "Sucesso"
 
-#: ../client/pk-console.c:179
+#: ../client/pk-console.c:180
 msgid "True"
 msgstr "Verdadeiro"
 
-#: ../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 ../src/pk-polkit-action-lookup.c:332
+#: ../client/pk-console.c:182 ../src/pk-polkit-action-lookup.c:332
 msgid "Role"
 msgstr "Função"
 
 #. TRANSLATORS: this is The duration of the transaction
-#: ../client/pk-console.c:186
+#: ../client/pk-console.c:187
 msgid "Duration"
 msgstr "Duração"
 
-#: ../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 ../src/pk-polkit-action-lookup.c:346
+#: ../client/pk-console.c:191 ../src/pk-polkit-action-lookup.c:346
 msgid "Command line"
 msgstr "Linha de comando"
 
 #. 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 de Utilizador"
 
 #. TRANSLATORS: this is the username, e.g. hughsie
-#: ../client/pk-console.c:199
+#: ../client/pk-console.c:200
 msgid "Username"
 msgstr "Nome do utilizador"
 
 #. 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 "Nome real"
 
-#: ../client/pk-console.c:211
+#: ../client/pk-console.c:212
 msgid "Affected packages:"
 msgstr "Pacotes afectados"
 
-#: ../client/pk-console.c:213
+#: ../client/pk-console.c:214
 msgid "Affected packages: None"
 msgstr "Pacotes afectados: Nenhum"
 
 #. TRANSLATORS: this is the distro, e.g. Fedora 10
-#: ../client/pk-console.c:248
+#: ../client/pk-console.c:249
 msgid "Distribution"
 msgstr "Distribuição"
 
 #. 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 "Sumário"
 
 #. TRANSLATORS: this is the group category name
-#: ../client/pk-console.c:280
+#: ../client/pk-console.c:281
 msgid "Category"
 msgstr "Categori­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 "Pai"
 
 #. TRANSLATORS: this is the name of the parent group
-#: ../client/pk-console.c:288
+#: ../client/pk-console.c:289
 msgid "Name"
 msgstr "Nome"
 
 #. TRANSLATORS: this is preferred icon for the group
-#: ../client/pk-console.c:294
+#: ../client/pk-console.c:295
 msgid "Icon"
 msgstr "Ícone"
 
 #. 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 "Detalhes acerca da actualização:"
 
@@ -136,7 +136,7 @@ msgstr "Detalhes acerca da actualização:"
 #. 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,166 +146,166 @@ msgstr[0] "Pacote"
 msgstr[1] "Pacotes"
 
 #. TRANSLATORS: details about the update, any packages that this update updates
-#: ../client/pk-console.c:349
+#: ../client/pk-console.c:350
 msgid "Updates"
 msgstr "Actualizações"
 
 #. TRANSLATORS: details about the update, any packages that this update obsoletes
-#: ../client/pk-console.c:353
+#: ../client/pk-console.c:354
 msgid "Obsoletes"
 msgstr "Torna absoleto"
 
 #. 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 "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 "Actualizar texto"
 
 #. TRANSLATORS: details about the update, the changelog for the package
-#: ../client/pk-console.c:377
+#: ../client/pk-console.c:378
 msgid "Changes"
 msgstr "Alterações"
 
 #. 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:511
+#: ../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 "Activado"
 
 #. TRANSLATORS: if the repo is disabled
-#: ../client/pk-console.c:428
+#: ../client/pk-console.c:429
 msgid "Disabled"
 msgstr "Inactivo"
 
 #. 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 "Reinicialização do sistema requerida por:"
 
 #. TRANSLATORS: a package requires the session to be restarted
-#: ../client/pk-console.c:463
+#: ../client/pk-console.c:464
 msgid "Session restart required:"
 msgstr "Reinicialização da sessão requerida:"
 
 #. 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 "Reinicialização do sistema (segurança) requerida 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 "Reinicialização da sessão (segurança) requerida:"
 
 #. 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 "Reinicialização da aplicação requerida por:"
 
 #. TRANSLATORS: This a list of details about the package
-#: ../client/pk-console.c:507
+#: ../client/pk-console.c:508
 msgid "Package description"
 msgstr "Descrição do pacote"
 
 #. 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 "Mensagem:"
 
 #. TRANSLATORS: This where the package has no files
-#: ../client/pk-console.c:559
+#: ../client/pk-console.c:560
 msgid "No files"
 msgstr "Sem ficheiros"
 
 #. TRANSLATORS: This a list files contained in the package
-#: ../client/pk-console.c:564
+#: ../client/pk-console.c:565
 msgid "Package files"
 msgstr "Ficheiros do pacote"
 
 #. TRANSLATORS: the percentage complete of the transaction
-#: ../client/pk-console.c:632
+#: ../client/pk-console.c:633
 msgid "Percentage"
 msgstr "Percentagem"
 
 #. 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 "Erro 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 "A transacção falhou"
 
 #. 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 "Não existem atualizações disponíveis neste momento."
 
-#: ../client/pk-console.c:749
+#: ../client/pk-console.c:750
 msgid "There are no upgrades available at this time."
 msgstr "Não existem atualizações disponíveis neste momento."
 
 #. 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 "Por favor, reinicie o computador para completar a actualização."
 
 #. 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 ""
 "Por favor, termine e volte a iniciar a sessão para completar a actualização."
 
 #. 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 ""
 "instaladas importantes actualizações de segurança."
 
 #. 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,29 +323,29 @@ msgstr ""
 "pois foram instaladas importantes actualizações de segurança."
 
 #. 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 ""
 "Esperado nome de pacote, recebido nome de ficheiro. Alternativamente, tente "
 "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:859
+#: ../client/pk-console.c:860
 #, c-format
 msgid "This tool could not find any available package: %s"
 msgstr "Esta ferramenta não conseguiu encontrar nenhum pacote disponível: %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 ferramenta não conseguiu encontrar o pacote 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 ferramenta não conseguiu encontrar o pacote: %s"
@@ -354,184 +354,189 @@ msgstr "Esta ferramenta não conseguiu encontrar o pacote: %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 ferramenta não conseguiu encontrar todos os pacotes: %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 "O daemon morreu a meio de uma transacção!"
 
 #. TRANSLATORS: This is the header to the --help menu
-#: ../client/pk-console.c:1146
+#: ../client/pk-console.c:1147
 msgid "PackageKit Console Interface"
 msgstr "Consola do PackaheKit"
 
 #. these are commands we can use with pkcon
-#: ../client/pk-console.c:1148
+#: ../client/pk-console.c:1149
 msgid "Subcommands:"
 msgstr "Sub-comandos:"
 
 #. 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 ""
 "Não foi possível obter a hora da última vez que esta acção foi concluída"
 
 #. 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 a versão da aplicação e terminar"
 
 #. 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 "Configurar o filtro, exemplo, 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 "Sair sem esperar que as acções completem"
 
 #. 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 os pacotes sem pedir por confirmação"
 
 #. 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 ""
 "Executar o comando utilizando períodos de inactividade da rede e também "
 "utilizando menos energia"
 
 #. 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 ""
 "Escrever no ecrã o resultado legível, ao invés de utilizar objectos animados"
 
 #. TRANSLATORS: we failed to contact the daemon
-#: ../client/pk-console.c:1300
+#: ../client/pk-console.c:1304
 msgid "Failed to contact PackageKit"
 msgstr "Falhou o contacto com o 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 "Não foi possível definir o proxy"
+
+#. TRANSLATORS: The user specified an incorrect filter
+#: ../client/pk-console.c:1377
 msgid "The filter specified was invalid"
 msgstr "O filtro especificado era 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 "Um tipo de pesquisa é necessário. Por exemplo, nome"
 
 #. 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 "Um termo de pesquisa é necessário"
 
 #. 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 pesquisa inválida"
 
 #. 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 "É necessário indicar um nome de pacote 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 "É necessário um nome de ficheiro 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 "São necessários um tipo, id de chave e id de pacote"
 
 #. 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 "É necessário um nome de pacote para remover"
 
 #. 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 ""
 "São necessários uma directoria de destino assim como os nomes dos pacotes a "
 "transferir"
 
 #. 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 "Directório não 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 "É necessário um identificador de licença (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 "É necessário um identificador de transacção (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 "É necessário indicar um nome de pacote"
 
 #. 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 "É obrigatório um nome de repositório"
 
 #. 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 "É necessário indicar um repositório, parâmetro e 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 "É necessária uma acção, por exemplo '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 "É necessária uma função correcta"
 
 #. 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 "É obrigatório um nome de pacote"
 
 #. 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 ""
 "É necessário especificar a string que define o que o pacote disponibiliza"
 
 #. 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 "A opção '%s' não é suportada"
 
 #. TRANSLATORS: Generic failure of what they asked to do
-#: ../client/pk-console.c:1715
+#: ../client/pk-console.c:1734
 msgid "Command failed"
 msgstr "Comando falhou"
 
@@ -542,8 +547,7 @@ msgstr "Indique o nome do ficheiro para a lista de dependências a excluir"
 
 #. 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 ""
 "O ficheiro ou directório de destino (se omitido, é utilizado o directório "
 "actual)"
@@ -573,9 +577,9 @@ msgstr "Seleccionou ambas as opções"
 msgid "A output directory or file name is required"
 msgstr "É necessário um directório de destino ou nome de ficheiro"
 
-#. 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 "O serviço falhou o arranque"
 
 #. TRANSLATORS: This is when the backend doesn't have the capability to get-depends
@@ -647,12 +651,12 @@ msgstr "\"Service pack\" criado '%s'"
 msgid "Failed to create '%s': %s"
 msgstr "Não foi possível criar '%s': %s"
 
-#: ../client/pk-monitor.c:236
+#: ../client/pk-monitor.c:256
 msgid "Failed to get daemon state"
 msgstr "Falha ao obter o estado do serviço"
 
 #. TRANSLATORS: this is a program that monitors PackageKit
-#: ../client/pk-monitor.c:322
+#: ../client/pk-monitor.c:342
 msgid "PackageKit Monitor"
 msgstr "Monitorizar o PackageKit"
 
@@ -711,44 +715,44 @@ msgid "Installing..."
 msgstr "A instalar..."
 
 #. 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 "A descarregar detalhes acerca das fontes do 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 ""
 "A descarregar lista de ficheiros (isto pode demorar algum tempo para "
 "concluir)."
 
 #. 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 "A esperar pelo bloqueio do gestor de pacotes."
 
 #. 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 "A carregar lista de pacotes."
 
 #. 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 "Não foi possível encontrar o ficheiro"
 
 #. 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 "Incapaz de 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 "Falhou a instalação dos pacotes"
 
 #. 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 "Comando PackageKit não encontrado"
 
@@ -758,51 +762,51 @@ msgid "Command not found."
 msgstr "Comando não 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 "Comando semelhante é:"
 
 #. 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 "Executar um comando semelhante:"
 
 #. 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 "Comandos semelhantes são:"
 
 #. 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 "Por favor, escolha um comando para executar"
 
 #. 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 "O pacote que fornece este ficheiro é o:"
 
 #. 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 pacote '%s' para disponibilizar 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 "Os pacotes que disponibilizam este ficheiro são:"
 
 #. 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 "Pacotes adequados são:"
 
 #. 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 "Por favor, escolha um pacote para instalar"
 
@@ -2001,25 +2005,25 @@ msgid "Show debugging information for all files"
 msgstr "Mostrar informação de depuração para todos os ficheiros"
 
 #. TRANSLATORS: a list of modules to debug
-#: ../src/egg-debug.c:459
+#: ../src/egg-debug.c:458
 msgid "Debug these specific modules"
 msgstr "Depurar estes 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 funções 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 "Registar dados de depuração para um ficheiro"
 
-#: ../src/egg-debug.c:469
+#: ../src/egg-debug.c:468
 msgid "Debugging Options"
 msgstr "Opções de depuração"
 
-#: ../src/egg-debug.c:469
+#: ../src/egg-debug.c:468
 msgid "Show debugging options"
 msgstr "Mostrar opções de depuração"
 
@@ -2168,6 +2172,3 @@ msgstr "Mostrar opções de depuração"
 
 #~ msgid "Media ID"
 #~ msgstr "ID do Suporte:"
-
-#~ msgid "The package could not be found"
-#~ msgstr "O pacote não foi encontrado"
commit 5835debdb751aae682cc8dd922039f5889370cb8
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Apr 14 13:02:34 2010 +0100

    yum: get the correct state for each update. Fixes rh#574658

diff --git a/backends/yum/yumBackend.py b/backends/yum/yumBackend.py
index c85b915..67111a2 100755
--- a/backends/yum/yumBackend.py
+++ b/backends/yum/yumBackend.py
@@ -2564,6 +2564,11 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
             self.message(MESSAGE_BACKEND_ERROR, "The packages '%s' will be updated before other packages" % msg)
             pkgs = infra_pkgs
 
+        # get the list of installed updates as this is needed for get_applicable_notices()
+        installed_dict = {}
+        for pkgtup_updated, pkgtup_installed in self.yumbase.up.getUpdatesTuples():
+            installed_dict[pkgtup_installed[0]] = pkgtup_installed
+
         md = self.updateMetadata
         for pkg in unique(pkgs):
             if pkgfilter.pre_process(pkg):
@@ -2579,14 +2584,18 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
                 except Exception, e:
                     self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
 
-                # Get info about package in updates info
-                notices = md.get_applicable_notices(pkg.pkgtup)
+                # fall back to this if there is no installed update or there is no metadata
                 status = INFO_NORMAL
-                if notices:
-                    for (pkgtup, notice) in notices:
-                        status = self._get_status(notice)
-                        if status == INFO_SECURITY:
-                            break
+
+                # Get info about package in updates info (using the installed update of this name)
+                if installed_dict.has_key(pkg.name):
+                    pkgtup = installed_dict[pkg.name]
+                    notices = md.get_applicable_notices(pkgtup)
+                    if notices:
+                        for (pkgtup, notice) in notices:
+                            status = self._get_status(notice)
+                            if status == INFO_SECURITY:
+                                break
                 pkgfilter.add_custom(pkg, status)
 
         package_list = pkgfilter.post_process()
commit b65b14f8e232b9bcf09e538583b5c20401b4ca80
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Apr 14 08:57:25 2010 +0100

    trivial: sync up with libzif from git master

diff --git a/backends/yum/Makefile.am b/backends/yum/Makefile.am
index 9565231..241a8a7 100644
--- a/backends/yum/Makefile.am
+++ b/backends/yum/Makefile.am
@@ -58,6 +58,8 @@ libpk_backend_yum_la_SOURCES += 				\
 	libzif/zif-md-filelists.h				\
 	libzif/zif-md-primary-sql.c				\
 	libzif/zif-md-primary-sql.h				\
+	libzif/zif-md-other-sql.c				\
+	libzif/zif-md-other-sql.h				\
 	libzif/zif-md-primary-xml.c				\
 	libzif/zif-md-primary-xml.h				\
 	libzif/zif-md-metalink.c				\
@@ -72,6 +74,8 @@ libpk_backend_yum_la_SOURCES += 				\
 	libzif/zif-store-array.h				\
 	libzif/zif-repos.c					\
 	libzif/zif-repos.h					\
+	libzif/zif-changeset.c					\
+	libzif/zif-changeset.h					\
 	libzif/zif-utils.c					\
 	libzif/zif-utils.h					\
 	libzif/zif-groups.c					\
diff --git a/backends/yum/libzif/zif-changeset.c b/backends/yum/libzif/zif-changeset.c
new file mode 100644
index 0000000..fc6d4f7
--- /dev/null
+++ b/backends/yum/libzif/zif-changeset.c
@@ -0,0 +1,479 @@
+/* -*- 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-changeset
+ * @short_description: Generic object to represent some information about a changeset.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <glib.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "egg-debug.h"
+
+#include "zif-changeset.h"
+
+#define ZIF_CHANGESET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), ZIF_TYPE_CHANGESET, ZifChangesetPrivate))
+
+struct _ZifChangesetPrivate
+{
+	guint64			 date;
+	gchar			*author;
+	gchar			*description;
+	gchar			*version;
+};
+
+enum {
+	PROP_0,
+	PROP_DATE,
+	PROP_AUTHOR,
+	PROP_DESCRIPTION,
+	PROP_VERSION,
+	PROP_LAST
+};
+
+G_DEFINE_TYPE (ZifChangeset, zif_changeset, G_TYPE_OBJECT)
+
+/**
+ * zif_changeset_get_date:
+ * @changeset: the #ZifChangeset object
+ *
+ * Gets the date and date of the update.
+ *
+ * Return value: the date of the update, or 0 for unset.
+ *
+ * Since: 0.0.1
+ **/
+guint64
+zif_changeset_get_date (ZifChangeset *changeset)
+{
+	g_return_val_if_fail (ZIF_IS_CHANGESET (changeset), 0);
+	return changeset->priv->date;
+}
+
+/**
+ * zif_changeset_get_author:
+ * @changeset: the #ZifChangeset object
+ *
+ * Gets the author for this changeset.
+ *
+ * Return value: A string value, or %NULL.
+ *
+ * Since: 0.0.1
+ **/
+const gchar *
+zif_changeset_get_author (ZifChangeset *changeset)
+{
+	g_return_val_if_fail (ZIF_IS_CHANGESET (changeset), NULL);
+	return changeset->priv->author;
+}
+
+/**
+ * zif_changeset_get_description:
+ * @changeset: the #ZifChangeset object
+ *
+ * Gets the description for this changeset.
+ *
+ * Return value: A string value, or %NULL.
+ *
+ * Since: 0.0.1
+ **/
+const gchar *
+zif_changeset_get_description (ZifChangeset *changeset)
+{
+	g_return_val_if_fail (ZIF_IS_CHANGESET (changeset), NULL);
+	return changeset->priv->description;
+}
+
+/**
+ * zif_changeset_get_version:
+ * @changeset: the #ZifChangeset object
+ *
+ * Gets the date this changeset was version.
+ *
+ * Return value: A string value, or %NULL.
+ *
+ * Since: 0.0.1
+ **/
+const gchar *
+zif_changeset_get_version (ZifChangeset *changeset)
+{
+	g_return_val_if_fail (ZIF_IS_CHANGESET (changeset), NULL);
+	return changeset->priv->version;
+}
+
+/**
+ * zif_changeset_set_date:
+ * @changeset: the #ZifChangeset object
+ * @date: The date of the changeset
+ *
+ * Sets the changeset date status.
+ *
+ * Since: 0.0.1
+ **/
+void
+zif_changeset_set_date (ZifChangeset *changeset, guint64 date)
+{
+	g_return_if_fail (ZIF_IS_CHANGESET (changeset));
+	changeset->priv->date = date;
+}
+
+/**
+ * zif_changeset_set_author:
+ * @changeset: the #ZifChangeset object
+ * @author: the changeset author
+ *
+ * Sets the changeset author.
+ *
+ * Since: 0.0.1
+ **/
+void
+zif_changeset_set_author (ZifChangeset *changeset, const gchar *author)
+{
+	g_return_if_fail (ZIF_IS_CHANGESET (changeset));
+	g_return_if_fail (author != NULL);
+	g_return_if_fail (changeset->priv->author == NULL);
+
+	changeset->priv->author = g_strdup (author);
+}
+
+/**
+ * zif_changeset_set_description:
+ * @changeset: the #ZifChangeset object
+ * @description: the changeset description
+ *
+ * Sets the changeset description.
+ *
+ * Since: 0.0.1
+ **/
+void
+zif_changeset_set_description (ZifChangeset *changeset, const gchar *description)
+{
+	g_return_if_fail (ZIF_IS_CHANGESET (changeset));
+	g_return_if_fail (description != NULL);
+	g_return_if_fail (changeset->priv->description == NULL);
+
+	changeset->priv->description = g_strdup (description);
+}
+
+/**
+ * zif_changeset_set_version:
+ * @changeset: the #ZifChangeset object
+ * @version: the changeset version date
+ *
+ * Sets the date the changeset was version.
+ *
+ * Since: 0.0.1
+ **/
+void
+zif_changeset_set_version (ZifChangeset *changeset, const gchar *version)
+{
+	g_return_if_fail (ZIF_IS_CHANGESET (changeset));
+	g_return_if_fail (version != NULL);
+	g_return_if_fail (changeset->priv->version == NULL);
+
+	changeset->priv->version = g_strdup (version);
+}
+
+/**
+ * zif_changeset_parse_header:
+ * @changeset: the #ZifChangeset object
+ * @header: the package header, e.g "Ania Hughes <ahughes at redhat.com> - 2.29.91-1.fc13"
+ *
+ * Sets the author and version from the package header.
+ *
+ * Return value: %TRUE if the data was parsed correctly
+ *
+ * Since: 0.0.1
+ **/
+gboolean
+zif_changeset_parse_header (ZifChangeset *changeset, const gchar *header, GError **error)
+{
+	gboolean ret = FALSE;
+	gchar *temp = NULL;
+	gchar *found;
+	guint len;
+
+	/* check if there is a version field */
+	len = strlen (header);
+	if (header[len-1] == '>') {
+		zif_changeset_set_author (changeset, temp);
+		ret = TRUE;
+		goto out;
+	}
+
+	/* operate on copy */
+	temp = g_strdup (header);
+
+	/* get last space */
+	found = g_strrstr (temp, " ");
+	if (found == NULL) {
+		g_set_error (error, 1, 0, "format invalid: %s", header);
+		goto out;
+	}
+
+	/* set version */
+	zif_changeset_set_version (changeset, found + 1);
+
+	/* trim to first non-space or '-' char */
+	for (;found != temp;found--) {
+		if (*found != ' ' && *found != '-')
+			break;
+	}
+
+	/* terminate here */
+	found[1] = '\0';
+
+	/* set author */
+	zif_changeset_set_author (changeset, temp);
+
+	/* success */
+	ret = TRUE;
+out:
+	g_free (temp);
+	return ret;
+}
+
+/**
+ * zif_changeset_get_property:
+ **/
+static void
+zif_changeset_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
+{
+	ZifChangeset *changeset = ZIF_CHANGESET (object);
+	ZifChangesetPrivate *priv = changeset->priv;
+
+	switch (prop_id) {
+	case PROP_DATE:
+		g_value_set_uint64 (value, priv->date);
+		break;
+	case PROP_AUTHOR:
+		g_value_set_string (value, priv->author);
+		break;
+	case PROP_DESCRIPTION:
+		g_value_set_string (value, priv->description);
+		break;
+	case PROP_VERSION:
+		g_value_set_string (value, priv->version);
+		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+		break;
+	}
+}
+
+/**
+ * zif_changeset_set_property:
+ **/
+static void
+zif_changeset_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
+{
+}
+
+/**
+ * zif_changeset_finalize:
+ **/
+static void
+zif_changeset_finalize (GObject *object)
+{
+	ZifChangeset *changeset;
+
+	g_return_if_fail (object != NULL);
+	g_return_if_fail (ZIF_IS_CHANGESET (object));
+	changeset = ZIF_CHANGESET (object);
+
+	g_free (changeset->priv->author);
+	g_free (changeset->priv->description);
+	g_free (changeset->priv->version);
+
+	G_OBJECT_CLASS (zif_changeset_parent_class)->finalize (object);
+}
+
+/**
+ * zif_changeset_class_init:
+ **/
+static void
+zif_changeset_class_init (ZifChangesetClass *klass)
+{
+	GParamSpec *pspec;
+	GObjectClass *object_class = G_OBJECT_CLASS (klass);
+	object_class->finalize = zif_changeset_finalize;
+	object_class->get_property = zif_changeset_get_property;
+	object_class->set_property = zif_changeset_set_property;
+
+	/**
+	 * ZifChangeset:date:
+	 *
+	 * Since: 0.0.1
+	 */
+	pspec = g_param_spec_uint64 ("date", NULL, NULL,
+				     0, G_MAXUINT64, 0,
+				     G_PARAM_READABLE);
+	g_object_class_install_property (object_class, PROP_DATE, pspec);
+
+	/**
+	 * ZifChangeset:author:
+	 *
+	 * Since: 0.0.1
+	 */
+	pspec = g_param_spec_string ("author", NULL, NULL,
+				     NULL,
+				     G_PARAM_READABLE);
+	g_object_class_install_property (object_class, PROP_AUTHOR, pspec);
+
+	/**
+	 * ZifChangeset: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);
+
+	/**
+	 * ZifChangeset:version:
+	 *
+	 * Since: 0.0.1
+	 */
+	pspec = g_param_spec_string ("version", NULL, NULL,
+				     NULL,
+				     G_PARAM_READABLE);
+	g_object_class_install_property (object_class, PROP_VERSION, pspec);
+
+	g_type_class_add_private (klass, sizeof (ZifChangesetPrivate));
+}
+
+/**
+ * zif_changeset_init:
+ **/
+static void
+zif_changeset_init (ZifChangeset *changeset)
+{
+	changeset->priv = ZIF_CHANGESET_GET_PRIVATE (changeset);
+	changeset->priv->date = 0;
+	changeset->priv->author = NULL;
+	changeset->priv->description = NULL;
+	changeset->priv->version = NULL;
+}
+
+/**
+ * zif_changeset_new:
+ *
+ * Return value: A new #ZifChangeset class instance.
+ *
+ * Since: 0.0.1
+ **/
+ZifChangeset *
+zif_changeset_new (void)
+{
+	ZifChangeset *changeset;
+	changeset = g_object_new (ZIF_TYPE_CHANGESET, NULL);
+	return ZIF_CHANGESET (changeset);
+}
+
+/***************************************************************************
+ ***                          MAKE CHECK TESTS                           ***
+ ***************************************************************************/
+#ifdef EGG_TEST
+#include "egg-test.h"
+
+void
+zif_changeset_test (EggTest *test)
+{
+	gboolean ret;
+	const gchar *temp;
+	ZifChangeset *changeset;
+
+	if (!egg_test_start (test, "ZifChangeset"))
+		return;
+
+	/************************************************************/
+	egg_test_title (test, "get changeset");
+	changeset = zif_changeset_new ();
+	zif_changeset_set_description (changeset, "Update to latest stable version");
+	egg_test_assert (test, changeset != NULL);
+
+	/************************************************************/
+	egg_test_title (test, "parse header 0 (fail)");
+	ret = zif_changeset_parse_header (changeset, "this-is-an-invalid-header", NULL);
+	egg_test_assert (test, !ret);
+
+	/************************************************************/
+	egg_test_title (test, "parse header 1 (success)");
+	ret = zif_changeset_parse_header (changeset, "Milan Crha <mcrha at redhat.com> - 2.29.91-1.fc13", NULL);
+	egg_test_assert (test, ret);
+
+	/************************************************************/
+	egg_test_title (test, "check description");
+	temp = zif_changeset_get_description (changeset);
+	if (g_strcmp0 (temp, "Update to latest stable version") != 0)
+		egg_test_failed (test, "incorrect value, got: %s", temp);
+	egg_test_success (test, NULL);
+
+	/************************************************************/
+	egg_test_title (test, "check author");
+	temp = zif_changeset_get_author (changeset);
+	if (g_strcmp0 (temp, "Milan Crha <mcrha at redhat.com>") != 0)
+		egg_test_failed (test, "incorrect value, got: %s", temp);
+	egg_test_success (test, NULL);
+
+	/************************************************************/
+	egg_test_title (test, "check version");
+	temp = zif_changeset_get_version (changeset);
+	if (g_strcmp0 (temp, "2.29.91-1.fc13") != 0)
+		egg_test_failed (test, "incorrect value, got: %s", temp);
+	egg_test_success (test, NULL);
+
+	/* reset */
+	g_object_unref (changeset);
+	changeset = zif_changeset_new ();
+
+	/************************************************************/
+	egg_test_title (test, "parse header 2 (success)");
+	ret = zif_changeset_parse_header (changeset, "Milan Crha <mcrha at redhat.com> 2.29.91-1.fc13", NULL);
+	egg_test_assert (test, ret);
+
+	/************************************************************/
+	egg_test_title (test, "check author");
+	temp = zif_changeset_get_author (changeset);
+	if (g_strcmp0 (temp, "Milan Crha <mcrha at redhat.com>") != 0)
+		egg_test_failed (test, "incorrect value, got: %s", temp);
+	egg_test_success (test, NULL);
+
+	/************************************************************/
+	egg_test_title (test, "check version");
+	temp = zif_changeset_get_version (changeset);
+	if (g_strcmp0 (temp, "2.29.91-1.fc13") != 0)
+		egg_test_failed (test, "incorrect value, got: %s", temp);
+	egg_test_success (test, NULL);
+
+	g_object_unref (changeset);
+
+	egg_test_end (test);
+}
+#endif
+
diff --git a/backends/yum/libzif/zif-changeset.h b/backends/yum/libzif/zif-changeset.h
new file mode 100644
index 0000000..fdde41b
--- /dev/null
+++ b/backends/yum/libzif/zif-changeset.h
@@ -0,0 +1,84 @@
+/* -*- 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_CHANGESET_H
+#define __ZIF_CHANGESET_H
+
+#include <glib-object.h>
+#include <gio/gio.h>
+
+G_BEGIN_DECLS
+
+#define ZIF_TYPE_CHANGESET		(zif_changeset_get_type ())
+#define ZIF_CHANGESET(o)		(G_TYPE_CHECK_INSTANCE_CAST ((o), ZIF_TYPE_CHANGESET, ZifChangeset))
+#define ZIF_CHANGESET_CLASS(k)		(G_TYPE_CHECK_CLASS_CAST((k), ZIF_TYPE_CHANGESET, ZifChangesetClass))
+#define ZIF_IS_CHANGESET(o)		(G_TYPE_CHECK_INSTANCE_TYPE ((o), ZIF_TYPE_CHANGESET))
+#define ZIF_IS_CHANGESET_CLASS(k)	(G_TYPE_CHECK_CLASS_TYPE ((k), ZIF_TYPE_CHANGESET))
+#define ZIF_CHANGESET_GET_CLASS(o)	(G_TYPE_INSTANCE_GET_CLASS ((o), ZIF_TYPE_CHANGESET, ZifChangesetClass))
+#define ZIF_CHANGESET_ERROR		(zif_changeset_error_quark ())
+
+typedef struct _ZifChangeset		 ZifChangeset;
+typedef struct _ZifChangesetPrivate	 ZifChangesetPrivate;
+typedef struct _ZifChangesetClass	 ZifChangesetClass;
+
+#include "zif-package.h"
+
+struct _ZifChangeset
+{
+	GObject			 parent;
+	ZifChangesetPrivate	*priv;
+};
+
+struct _ZifChangesetClass
+{
+	GObjectClass		 parent_class;
+};
+
+GType			 zif_changeset_get_type		(void);
+ZifChangeset		*zif_changeset_new		(void);
+
+/* public getters */
+guint64			 zif_changeset_get_date		(ZifChangeset		*changeset);
+const gchar		*zif_changeset_get_author	(ZifChangeset		*changeset);
+const gchar		*zif_changeset_get_description	(ZifChangeset		*changeset);
+const gchar		*zif_changeset_get_version	(ZifChangeset		*changeset);
+
+/* internal setters: TODO, in seporate -internal header file */
+void			 zif_changeset_set_date		(ZifChangeset		*changeset,
+							 guint64		 date);
+void			 zif_changeset_set_author	(ZifChangeset		*changeset,
+							 const gchar		*author);
+void			 zif_changeset_set_description	(ZifChangeset		*changeset,
+							 const gchar		*description);
+void			 zif_changeset_set_version	(ZifChangeset		*changeset,
+							 const gchar		*version);
+gboolean		 zif_changeset_parse_header	(ZifChangeset		*changeset,
+							 const gchar		*header,
+							 GError			**error);
+
+G_END_DECLS
+
+#endif /* __ZIF_CHANGESET_H */
+
diff --git a/backends/yum/libzif/zif-md-other-sql.c b/backends/yum/libzif/zif-md-other-sql.c
new file mode 100644
index 0000000..0866a2b
--- /dev/null
+++ b/backends/yum/libzif/zif-md-other-sql.c
@@ -0,0 +1,520 @@
+/* -*- 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-other-sql
+ * @short_description: Other metadata functionality
+ *
+ * Provide access to the other 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-changeset.h"
+#include "zif-md-other-sql.h"
+#include "zif-package-remote.h"
+
+#include "egg-debug.h"
+#include "egg-string.h"
+
+#define ZIF_MD_OTHER_SQL_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), ZIF_TYPE_MD_OTHER_SQL, ZifMdOtherSqlPrivate))
+
+/**
+ * ZifMdOtherSqlPrivate:
+ *
+ * Private #ZifMdOtherSql data
+ **/
+struct _ZifMdOtherSqlPrivate
+{
+	gboolean		 loaded;
+	sqlite3			*db;
+};
+
+G_DEFINE_TYPE (ZifMdOtherSql, zif_md_other_sql, ZIF_TYPE_MD)
+
+/**
+ * zif_md_other_sql_unload:
+ **/
+static gboolean
+zif_md_other_sql_unload (ZifMd *md, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	gboolean ret = FALSE;
+	return ret;
+}
+
+/**
+ * zif_md_other_sql_load:
+ **/
+static gboolean
+zif_md_other_sql_load (ZifMd *md, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	const gchar *filename;
+	gint rc;
+	ZifMdOtherSql *other_sql = ZIF_MD_OTHER_SQL (md);
+
+	g_return_val_if_fail (ZIF_IS_MD_OTHER_SQL (md), FALSE);
+
+	/* already loaded */
+	if (other_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 other_sql");
+		goto out;
+	}
+
+	/* open database */
+	egg_debug ("filename = %s", filename);
+	rc = sqlite3_open (filename, &other_sql->priv->db);
+	if (rc != 0) {
+		egg_warning ("Can't open database: %s\n", sqlite3_errmsg (other_sql->priv->db));
+		g_set_error (error, ZIF_MD_ERROR, ZIF_MD_ERROR_BAD_SQL,
+			     "can't open database: %s", sqlite3_errmsg (other_sql->priv->db));
+		goto out;
+	}
+
+	/* we don't need to keep syncing */
+	sqlite3_exec (other_sql->priv->db, "PRAGMA synchronous=OFF", NULL, NULL, NULL);
+	other_sql->priv->loaded = TRUE;
+out:
+	return other_sql->priv->loaded;
+}
+
+/**
+ * zif_md_other_sql_sqlite_create_changelog_cb:
+ **/
+static gint
+zif_md_other_sql_sqlite_create_changelog_cb (void *data, gint argc, gchar **argv, gchar **col_name)
+{
+	GPtrArray *array = (GPtrArray *) data;
+	ZifChangeset *changeset;
+	gint i;
+	guint date = 0;
+	const gchar *author = NULL;
+	const gchar *changelog = NULL;
+	gboolean ret;
+	GError *error = NULL;
+
+	/* get the ID */
+	for (i=0; i<argc; i++) {
+		if (g_strcmp0 (col_name[i], "date") == 0) {
+			ret = egg_strtouint (argv[i], &date);
+			if (!ret)
+				egg_warning ("could not parse date '%s'", argv[i]);
+		} else if (g_strcmp0 (col_name[i], "author") == 0) {
+			author = argv[i];
+		} else if (g_strcmp0 (col_name[i], "changelog") == 0) {
+			changelog = argv[i];
+		} else {
+			egg_warning ("unrecognized: %s=%s", col_name[i], argv[i]);
+		}
+	}
+
+	/* create new object */
+	changeset = zif_changeset_new ();
+	zif_changeset_set_date (changeset, date);
+	zif_changeset_set_description (changeset, changelog);
+	ret = zif_changeset_parse_header (changeset, author, NULL);
+	if (!ret) {
+		egg_warning ("failed to parse header: %s", error->message);
+		g_error_free (error);
+		goto out;
+	}
+
+	/* add to the array */
+	g_ptr_array_add (array, g_object_ref (changeset));
+out:
+	g_object_unref (changeset);
+	return 0;
+}
+
+/**
+ * zif_md_other_sql_search_pkgkey:
+ **/
+static GPtrArray *
+zif_md_other_sql_search_pkgkey (ZifMdOtherSql *md, guint pkgkey,
+			        GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	gchar *statement = NULL;
+	gchar *error_msg = NULL;
+	gint rc;
+	GPtrArray *array = NULL;
+
+	array = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
+	statement = g_strdup_printf ("SELECT author, date, changelog FROM changelog WHERE pkgKey = '%i' ORDER BY date", pkgkey);
+	rc = sqlite3_exec (md->priv->db, statement, zif_md_other_sql_sqlite_create_changelog_cb, 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);
+		g_ptr_array_unref (array);
+		array = NULL;
+		goto out;
+	}
+out:
+	g_free (statement);
+	return array;
+}
+
+/**
+ * zif_md_other_sql_sqlite_pkgkey_cb:
+ **/
+static gint
+zif_md_other_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_other_sql_get_changelog:
+ **/
+static GPtrArray *
+zif_md_other_sql_get_changelog (ZifMd *md, const gchar *pkgid,
+			        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, j;
+	guint pkgkey;
+	ZifCompletion *completion_local;
+	ZifCompletion *completion_loop;
+	ZifChangeset *changeset;
+	ZifMdOtherSql *md_other_sql = ZIF_MD_OTHER_SQL (md);
+
+	/* setup completion */
+	if (md_other_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_other_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_other_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 packages WHERE pkgId = '%s'", pkgid);
+	rc = sqlite3_exec (md_other_sql->priv->db, statement, zif_md_other_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 changeset for pkgKey */
+		completion_loop = zif_completion_get_child (completion_local);
+		array_tmp = zif_md_other_sql_search_pkgkey (md_other_sql, pkgkey, cancellable, completion_loop, error);
+		if (array_tmp == NULL) {
+			g_ptr_array_unref (array);
+			array = NULL;
+			goto out;
+		}
+
+		/* no results */
+		if (array_tmp->len == 0)
+			egg_warning ("no changelog for pkgKey %i", pkgkey);
+		for (j=0; j<array_tmp->len; j++) {
+			changeset = g_ptr_array_index (array_tmp, j);
+			g_ptr_array_add (array, g_object_ref (changeset));
+		}
+
+		/* 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_other_sql_finalize:
+ **/
+static void
+zif_md_other_sql_finalize (GObject *object)
+{
+	ZifMdOtherSql *md;
+
+	g_return_if_fail (object != NULL);
+	g_return_if_fail (ZIF_IS_MD_OTHER_SQL (object));
+	md = ZIF_MD_OTHER_SQL (object);
+
+	sqlite3_close (md->priv->db);
+
+	G_OBJECT_CLASS (zif_md_other_sql_parent_class)->finalize (object);
+}
+
+/**
+ * zif_md_other_sql_class_init:
+ **/
+static void
+zif_md_other_sql_class_init (ZifMdOtherSqlClass *klass)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS (klass);
+	ZifMdClass *md_class = ZIF_MD_CLASS (klass);
+	object_class->finalize = zif_md_other_sql_finalize;
+
+	/* map */
+	md_class->load = zif_md_other_sql_load;
+	md_class->unload = zif_md_other_sql_unload;
+	md_class->get_changelog = zif_md_other_sql_get_changelog;
+	g_type_class_add_private (klass, sizeof (ZifMdOtherSqlPrivate));
+}
+
+/**
+ * zif_md_other_sql_init:
+ **/
+static void
+zif_md_other_sql_init (ZifMdOtherSql *md)
+{
+	md->priv = ZIF_MD_OTHER_SQL_GET_PRIVATE (md);
+	md->priv->loaded = FALSE;
+	md->priv->db = NULL;
+}
+
+/**
+ * zif_md_other_sql_new:
+ *
+ * Return value: A new #ZifMdOtherSql class instance.
+ *
+ * Since: 0.0.1
+ **/
+ZifMdOtherSql *
+zif_md_other_sql_new (void)
+{
+	ZifMdOtherSql *md;
+	md = g_object_new (ZIF_TYPE_MD_OTHER_SQL, NULL);
+	return ZIF_MD_OTHER_SQL (md);
+}
+
+/***************************************************************************
+ ***                          MAKE CHECK TESTS                           ***
+ ***************************************************************************/
+#ifdef EGG_TEST
+#include "egg-test.h"
+
+void
+zif_md_other_sql_test (EggTest *test)
+{
+	ZifMdOtherSql *md;
+	gboolean ret;
+	GError *error = NULL;
+	GPtrArray *array;
+	ZifPackage *changeset;
+	GCancellable *cancellable;
+	ZifCompletion *completion;
+	const gchar *text;
+
+	if (!egg_test_start (test, "ZifMdOtherSql"))
+		return;
+
+	/* use */
+	cancellable = g_cancellable_new ();
+	completion = zif_completion_new ();
+
+	/************************************************************/
+	egg_test_title (test, "get md_other_sql md");
+	md = zif_md_other_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_OTHER_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), "bc58c56b371a83dc546c86e1796d83b9ff78adbf733873c815c3fe5dd48b0d56");
+	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), "c378618f9764ff9fa271a40b962a0c3569ff274e741ada2342d0fe3554614488");
+	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/bc58c56b371a83dc546c86e1796d83b9ff78adbf733873c815c3fe5dd48b0d56-other.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");
+	zif_completion_reset (completion);
+	array = zif_md_other_sql_get_changelog (md, "42b8d71b303b19c2fcc2b06bb9c764f2902dd72b9376525025ee9ba4a41c38e9",
+						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 != 10)
+		egg_test_failed (test, "failed to get correct number: %i", array->len);
+	egg_test_success (test, NULL);
+
+	/* get first entry */
+	changeset = g_ptr_array_index (array, 1);
+
+	/************************************************************/
+	egg_test_title (test, "correct version");
+	text = zif_changeset_get_version (changeset);
+	if (g_strcmp0 (text, "0.9.95-8") == 0)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to get correct value '%s'", text);
+
+	/************************************************************/
+	egg_test_title (test, "correct author");
+	text = zif_changeset_get_author (changeset);
+	if (g_strcmp0 (text, "Rex Dieter <rdieter[AT]fedoraproject.org>") == 0)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to get correct value '%s'", text);
+
+	/************************************************************/
+	egg_test_title (test, "correct description");
+	text = zif_changeset_get_description (changeset);
+	if (g_strcmp0 (text, "- ExcludeArch: ppc64 (#253847)") == 0)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to get correct value '%s'", text);
+
+	/* remove array */
+	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-other-sql.h b/backends/yum/libzif/zif-md-other-sql.h
new file mode 100644
index 0000000..b07aad7
--- /dev/null
+++ b/backends/yum/libzif/zif-md-other-sql.h
@@ -0,0 +1,63 @@
+/* -*- 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_OTHER_SQL_H
+#define __ZIF_MD_OTHER_SQL_H
+
+#include <glib-object.h>
+
+#include "zif-md.h"
+
+G_BEGIN_DECLS
+
+#define ZIF_TYPE_MD_OTHER_SQL		(zif_md_other_sql_get_type ())
+#define ZIF_MD_OTHER_SQL(o)		(G_TYPE_CHECK_INSTANCE_CAST ((o), ZIF_TYPE_MD_OTHER_SQL, ZifMdOtherSql))
+#define ZIF_MD_OTHER_SQL_CLASS(k)	(G_TYPE_CHECK_CLASS_CAST((k), ZIF_TYPE_MD_OTHER_SQL, ZifMdOtherSqlClass))
+#define ZIF_IS_MD_OTHER_SQL(o)		(G_TYPE_CHECK_INSTANCE_TYPE ((o), ZIF_TYPE_MD_OTHER_SQL))
+#define ZIF_IS_MD_OTHER_SQL_CLASS(k)	(G_TYPE_CHECK_CLASS_TYPE ((k), ZIF_TYPE_MD_OTHER_SQL))
+#define ZIF_MD_OTHER_SQL_GET_CLASS(o)	(G_TYPE_INSTANCE_GET_CLASS ((o), ZIF_TYPE_MD_OTHER_SQL, ZifMdOtherSqlClass))
+
+typedef struct _ZifMdOtherSql		ZifMdOtherSql;
+typedef struct _ZifMdOtherSqlPrivate	ZifMdOtherSqlPrivate;
+typedef struct _ZifMdOtherSqlClass	ZifMdOtherSqlClass;
+
+struct _ZifMdOtherSql
+{
+	ZifMd				 parent;
+	ZifMdOtherSqlPrivate		*priv;
+};
+
+struct _ZifMdOtherSqlClass
+{
+	ZifMdClass			 parent_class;
+};
+
+GType		 zif_md_other_sql_get_type		(void);
+ZifMdOtherSql	*zif_md_other_sql_new			(void);
+
+G_END_DECLS
+
+#endif /* __ZIF_MD_OTHER_SQL_H */
+
diff --git a/backends/yum/libzif/zif-md.c b/backends/yum/libzif/zif-md.c
index e85f2e0..75f9e05 100644
--- a/backends/yum/libzif/zif-md.c
+++ b/backends/yum/libzif/zif-md.c
@@ -647,7 +647,6 @@ zif_md_resolve (ZifMd *md, const gchar *search, GCancellable *cancellable, ZifCo
 		goto out;
 	}
 
-	
 	/* do subclassed action */
 	array = klass->resolve (md, search, cancellable, completion, error);
 out:
@@ -684,7 +683,6 @@ zif_md_search_name (ZifMd *md, const gchar *search, GCancellable *cancellable, Z
 		goto out;
 	}
 
-	
 	/* do subclassed action */
 	array = klass->search_name (md, search, cancellable, completion, error);
 out:
@@ -721,7 +719,6 @@ zif_md_search_details (ZifMd *md, const gchar *search, GCancellable *cancellable
 		goto out;
 	}
 
-	
 	/* do subclassed action */
 	array = klass->search_details (md, search, cancellable, completion, error);
 out:
@@ -758,7 +755,6 @@ zif_md_search_group (ZifMd *md, const gchar *search, GCancellable *cancellable,
 		goto out;
 	}
 
-	
 	/* do subclassed action */
 	array = klass->search_group (md, search, cancellable, completion, error);
 out:
@@ -795,7 +791,6 @@ zif_md_search_pkgid (ZifMd *md, const gchar *search, GCancellable *cancellable,
 		goto out;
 	}
 
-	
 	/* do subclassed action */
 	array = klass->search_pkgid (md, search, cancellable, completion, error);
 out:
@@ -833,7 +828,6 @@ zif_md_what_provides (ZifMd *md, const gchar *search,
 		goto out;
 	}
 
-	
 	/* do subclassed action */
 	array = klass->what_provides (md, search, cancellable, completion, error);
 out:
@@ -870,7 +864,6 @@ zif_md_find_package (ZifMd *md, const gchar *package_id, GCancellable *cancellab
 		goto out;
 	}
 
-	
 	/* do subclassed action */
 	array = klass->find_package (md, package_id, cancellable, completion, error);
 out:
@@ -878,6 +871,42 @@ out:
 }
 
 /**
+ * zif_md_get_changelog:
+ * @md: the #ZifMd object
+ * @pkgid: the internal pkgid 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
+ *
+ * Gets the changelog data for a specific package
+ *
+ * Return value: an array of #ZifChangeset's
+ *
+ * Since: 0.0.1
+ **/
+GPtrArray *
+zif_md_get_changelog (ZifMd *md, const gchar *pkgid, 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_changelog == 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_changelog (md, pkgid, 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
@@ -906,7 +935,6 @@ zif_md_get_packages (ZifMd *md, GCancellable *cancellable, ZifCompletion *comple
 		goto out;
 	}
 
-	
 	/* do subclassed action */
 	array = klass->get_packages (md, cancellable, completion, error);
 out:
diff --git a/backends/yum/libzif/zif-md.h b/backends/yum/libzif/zif-md.h
index e589a5f..6db2400 100644
--- a/backends/yum/libzif/zif-md.h
+++ b/backends/yum/libzif/zif-md.h
@@ -109,6 +109,11 @@ struct _ZifMdClass
 						 GCancellable		*cancellable,
 						 ZifCompletion		*completion,
 						 GError			**error);
+	GPtrArray	*(*get_changelog)	(ZifMd			*md,
+						 const gchar		*pkgid,
+						 GCancellable		*cancellable,
+						 ZifCompletion		*completion,
+						 GError			**error);
 };
 
 /* types of metadata */
@@ -230,6 +235,11 @@ GPtrArray	*zif_md_find_package			(ZifMd		*md,
 							 GCancellable	*cancellable,
 							 ZifCompletion	*completion,
 							 GError		**error);
+GPtrArray	*zif_md_get_changelog			(ZifMd		*md,
+							 const gchar	*pkgid,
+							 GCancellable	*cancellable,
+							 ZifCompletion	*completion,
+							 GError		**error);
 
 G_END_DECLS
 
diff --git a/backends/yum/libzif/zif-self-test.c b/backends/yum/libzif/zif-self-test.c
deleted file mode 100644
index c758000..0000000
--- a/backends/yum/libzif/zif-self-test.c
+++ /dev/null
@@ -1,87 +0,0 @@
-/* -*- 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 Shishir Goel <crazyontheedge at gmail.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.
- */
-
-#include "config.h"
-
-#include <glib.h>
-#include <glib-object.h>
-#include "egg-test.h"
-#include "egg-debug.h"
-
-/* prototypes */
-void zif_completion_test (EggTest *test);
-void zif_monitor_test (EggTest *test);
-void zif_config_test (EggTest *test);
-void zif_utils_test (EggTest *test);
-void zif_package_test (EggTest *test);
-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_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)
-{
-	EggTest *test;
-
-	g_type_init ();
-	g_thread_init (NULL);
-	test = egg_test_init ();
-	egg_debug_init (TRUE);
-	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_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);
-	zif_store_local_test (test);
-	zif_package_local_test (test);
-	zif_groups_test (test);
-	zif_store_remote_test (test);
-	zif_repos_test (test);
-	zif_utils_test (test);
-
-	return (egg_test_finish (test));
-}
-
diff --git a/backends/yum/libzif/zif-store-remote.c b/backends/yum/libzif/zif-store-remote.c
index 4ebc3f2..69729d0 100644
--- a/backends/yum/libzif/zif-store-remote.c
+++ b/backends/yum/libzif/zif-store-remote.c
@@ -46,6 +46,7 @@
 #include "zif-md-filelists.h"
 #include "zif-md-metalink.h"
 #include "zif-md-mirrorlist.h"
+#include "zif-md-other-sql.h"
 #include "zif-md-primary-sql.h"
 #include "zif-md-primary-xml.h"
 #include "zif-store.h"
@@ -80,6 +81,7 @@ struct _ZifStoreRemotePrivate
 	gboolean		 enabled;
 	gboolean		 loaded;
 	gboolean		 loaded_metadata;
+	ZifMd			*md_other_db;
 	ZifMd			*md_primary_db;
 	ZifMd			*md_primary_xml;
 	ZifMd			*md_filelists;
@@ -148,7 +150,7 @@ zif_store_remote_get_md_from_type (ZifStoreRemote *store, ZifMdType type)
 	if (type == ZIF_MD_TYPE_PRIMARY_XML)
 		return store->priv->md_primary_xml;
 	if (type == ZIF_MD_TYPE_OTHER_SQL)
-		return NULL;
+		return store->priv->md_other_db;
 	if (type == ZIF_MD_TYPE_COMPS_GZ)
 		return store->priv->md_comps;
 	if (type == ZIF_MD_TYPE_UPDATEINFO)
@@ -2627,6 +2629,7 @@ zif_store_remote_finalize (GObject *object)
 	g_free (store->priv->repomd_filename);
 	g_free (store->priv->directory);
 
+	g_object_unref (store->priv->md_other_db);
 	g_object_unref (store->priv->md_primary_db);
 	g_object_unref (store->priv->md_primary_xml);
 	g_object_unref (store->priv->md_filelists);
@@ -2701,6 +2704,7 @@ zif_store_remote_init (ZifStoreRemote *store)
 	store->priv->monitor = zif_monitor_new ();
 	store->priv->lock = zif_lock_new ();
 	store->priv->md_filelists = ZIF_MD (zif_md_filelists_new ());
+	store->priv->md_other_db = ZIF_MD (zif_md_other_sql_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 ());
commit f74d519ebca2a0a5415d0c928123276e4e9323dd
Author: Richard Hughes <richard at hughsie.com>
Date:   Mon Apr 12 22:34:44 2010 +0100

    Remove the ruck client, it's been broken for the last few releases

diff --git a/configure.ac b/configure.ac
index 1a05a94..4b9152b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -492,13 +492,6 @@ else
 fi
 AM_CONDITIONAL(PK_BUILD_PM_UTILS, test $build_pm_utils = "yes")
 
-dnl ---------------------------------------------------------------------------
-dnl - Build ruck (a rug-like interface for PackageKit)
-dnl ---------------------------------------------------------------------------
-AC_ARG_ENABLE(ruck, AS_HELP_STRING([--enable-ruck],[Build ruck client]),
-	      build_ruck=$enableval,build_ruck=yes)
-AM_CONDITIONAL(PK_BUILD_RUCK, test $build_ruck = "yes")
-
 # backends
 AC_ARG_ENABLE(alpm, AS_HELP_STRING([--enable-alpm],[use the ALPM backend]),enable_alpm=$enableval,enable_alpm=no)
 AC_ARG_ENABLE(apt, AS_HELP_STRING([--enable-apt],[use the APT backend]),enable_apt=$enableval,enable_apt=no)
@@ -805,8 +798,6 @@ contrib/cron/Makefile
 contrib/debuginfo-install/Makefile
 contrib/device-rebind/Makefile
 contrib/pm-utils/Makefile
-contrib/ruck/Makefile
-contrib/ruck/src/Makefile
 backends/Makefile
 backends/alpm/Makefile
 backends/apt/Makefile
@@ -878,7 +869,6 @@ echo "
         debuginfo-install:         ${build_debuginfo_install}
         device-rebind:             ${build_device_rebind}
         pm-utils scripts:          ${build_pm_utils}
-        RUCK client:               ${build_ruck}
         QT library:                ${build_qt}
         Managed bindings:          ${build_managed}
 
diff --git a/contrib/Makefile.am b/contrib/Makefile.am
index 3e8b001..f043b25 100644
--- a/contrib/Makefile.am
+++ b/contrib/Makefile.am
@@ -4,10 +4,6 @@ if BACKEND_TYPE_YUM
 SUBDIRS += yum-packagekit
 endif
 
-if PK_BUILD_RUCK
-SUBDIRS += ruck
-endif
-
 if PK_BUILD_BROWSER_PLUGIN
 SUBDIRS += browser-plugin
 endif
diff --git a/contrib/ruck/AUTHORS b/contrib/ruck/AUTHORS
deleted file mode 100644
index c1a9675..0000000
--- a/contrib/ruck/AUTHORS
+++ /dev/null
@@ -1,3 +0,0 @@
-Tambet Ingo   <tambet at ximian.com>
-James Willcox <snorp at ximian.com>
-Chris Rivera  <cmr at ximian.com>
diff --git a/contrib/ruck/Makefile.am b/contrib/ruck/Makefile.am
deleted file mode 100644
index c2d7878..0000000
--- a/contrib/ruck/Makefile.am
+++ /dev/null
@@ -1,9 +0,0 @@
-SUBDIRS = src
-
-extradir = $(datadir)/ruck
-extra_DATA =			\
-	AUTHORS			\
-	README
-
-EXTRA_DIST = $(extra_DATA)
-
diff --git a/contrib/ruck/README b/contrib/ruck/README
deleted file mode 100644
index 4030bf4..0000000
--- a/contrib/ruck/README
+++ /dev/null
@@ -1,20 +0,0 @@
-ruck is a rug-like interface for PackageKit
-('rug' is the command-line interface for rcd, red carpet daemon.)
-
-
-Answers to some Frequently Asked Questions:
--------------------------------------------
-
-* You got to be kidding me, yet another package management tool?
-No, not really. ruck is just an alternative command line interface
-for PackageKit
-
-* What's wrong pkcon?
-The main reason of writing ruck is for a couple of lazy people who
-got used to Red Carpet's cli 'rug' and are unable to learn any
-new tricks.
-
-* Anything else?
-Glad you asked, yes! It's really easy to extend ruck. Just drop the
-implementation of your new commands to $prefix/share/ruck/commands/
-directory and ruck will find them.
diff --git a/contrib/ruck/src/.gitignore b/contrib/ruck/src/.gitignore
deleted file mode 100644
index 8803d3d..0000000
--- a/contrib/ruck/src/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-ruck
-
diff --git a/contrib/ruck/src/Makefile.am b/contrib/ruck/src/Makefile.am
deleted file mode 100644
index 670e969..0000000
--- a/contrib/ruck/src/Makefile.am
+++ /dev/null
@@ -1,31 +0,0 @@
-#ruckexecdir = $(bindir)
-#ruckexec_DATA = ruck
-
-rucksupportdir = $(datadir)/ruck
-rucksupport_DATA = 			\
-	i18n.py				\
-	ruckcommand.py			\
-	ruckmain.py			\
-	ruckformat.py			\
-	ruckyum.py    			\
-	rucktalk.py
-
-ruckcmdsdir = $(rucksupportdir)/commands
-ruckcmds_DATA = 			\
-	ruckcachecmds.py		\
-	rucktransactcmds.py		\
-	ruckpackagecmds.py
-
-ruckexecdir = $(bindir)
-ruckexec_in_files = ruck.in
-ruckexec_DATA = $(ruckexec_in_files:.in=)
-$(ruckexec_DATA): $(ruckexec_in_files) Makefile
-	@sed -e "s|\@DDIR\@|$(datadir)|" -e "s|\@VERSION\@|$(VERSION)|" $< > $@
-
-EXTRA_DIST = $(rucksupport_DATA) $(ruckcmds_DATA) $(ruckexec_in_files)
-
-install-exec-hook:
-	chmod 0755 $(DESTDIR)$(ruckexecdir)/$(ruckexec_DATA)
-
-DISTCLEANFILES =			\
-	$(ruckexec_DATA)
diff --git a/contrib/ruck/src/i18n.py b/contrib/ruck/src/i18n.py
deleted file mode 100644
index 859c31f..0000000
--- a/contrib/ruck/src/i18n.py
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/usr/bin/env python
-"""i18n abstraction
-
-License: GPL
-Author: Vladimir Bormotov <bor at vb.dn.ua>
-
-$Id: i18n.py,v 1.3 2004/01/28 07:31:02 skvidal Exp $
-"""
-# $RCSfile: i18n.py,v $
-__version__ = "$Revision: 1.3 $"[11:-2]
-__date__ = "$Date: 2004/01/28 07:31:02 $"[7:-2]
-
-try:
-    import gettext
-    import sys
-    if sys.version_info[0] == 2:
-        t = gettext.translation('yum')
-        _ = t.gettext
-    else:
-        gettext.bindtextdomain('yum', '/usr/share/locale')
-        gettext.textdomain('yum')
-        _ = gettext.gettext
-
-except:
-    def _(str):
-        """pass given string as-is"""
-        return str
-
-if __name__ == '__main__':
-    pass
-
-# vim: set ts=4 et :
diff --git a/contrib/ruck/src/ruck.in b/contrib/ruck/src/ruck.in
deleted file mode 100644
index 774473c..0000000
--- a/contrib/ruck/src/ruck.in
+++ /dev/null
@@ -1,52 +0,0 @@
-#!/usr/bin/env /usr/bin/python
-
-###
-### Copyright 2002-2003 Ximian, Inc.
-###
-### This program is free software; you can redistribute it and/or modify
-### it under the terms of the GNU General Public License, version 2,
-### as published by the Free Software Foundation.
-###
-### 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
-###
-
-try:
-    import sys
-    import os
-
-    ruck_dir = "@DDIR@/ruck"
-    ruck_version = "@VERSION@"
-
-    # FIXME: This has a special check to allow us to run ruck in-place
-    # without having done a "make install".  We might want to take this
-    # out at some point.
-
-    if not (os.path.isfile("./ruckmain.py") \
-            or (os.path.isdir(ruck_dir) and os.path.isfile(ruck_dir + "/ruckmain.py"))):
-        print "ERROR: ruck doesn't appear to be installed properly.  Please check your installation."
-        sys.exit(1)
-
-
-    sys.path.append(ruck_dir)
-    import ruckmain
-
-    if "--ruck-profile" in sys.argv:
-        import profile
-        sys.stderr.write("*** Profiling Enabled ***\n")
-        sys.argv = filter(lambda x:x != "--ruck-profile", sys.argv)
-        profile.run("ruckmain.main(ruck_version, ruck_dir)")
-    else:
-        ruckmain.main(ruck_version, ruck_dir)
-except KeyboardInterrupt:
-    # Just quietly exit if we got a ^C
-    print
-    sys.exit(0)
-
-
diff --git a/contrib/ruck/src/ruckcachecmds.py b/contrib/ruck/src/ruckcachecmds.py
deleted file mode 100644
index 3dcbd47..0000000
--- a/contrib/ruck/src/ruckcachecmds.py
+++ /dev/null
@@ -1,349 +0,0 @@
-###
-### Copyright 2002 Ximian, Inc.
-### Copyright 2008 Aidan Skinner <aidan at skinner.me.uk>
-###
-### This program is free software; you can redistribute it and/or modify
-### it under the terms of the GNU General Public License, version 2,
-### as published by the Free Software Foundation.
-###
-### 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
-###
-
-import sys
-import os
-import os.path
-import glob
-from ConfigParser import ConfigParser
-import string
-import rucktalk
-import ruckformat
-import ruckcommand
-
-class CleanCmd(ruckcommand.RuckCommand):
-
-    def name(self):
-        return "clean"
-
-    def aliases(self):
-        return ["cl"]
-
-    def is_basic(self):
-        return 1
-
-    def category(self):
-        return "system"
-
-    def arguments(self):
-        return ""
-
-    def description_short(self):
-        return "Clean cache"
-
-    def local_opt_table(self):
-        return []
-
-    def execute(self, options_dict, non_option_args):
-        pkcon = self.pkcon()
-        pkcon.refresh_cache(True)
-        rucktalk.message('--- Refresh Successful ---')
-
-ruckcommand.register(CleanCmd)
-
-
-class RefreshCmd(ruckcommand.RuckCommand):
-
-    def name(self):
-        return "refresh"
-
-    def aliases(self):
-        return ["ref"]
-
-    def is_basic(self):
-        return 1
-
-    def category(self):
-        return "system"
-
-    def arguments(self):
-        return ""
-
-    def description_short(self):
-        return "Refresh the package cache"
-
-    def execute(self, options_dict, non_option_args):
-        pkcon = self.pkcon()
-        pkcon.refresh_cache(False)
-        rucktalk.message('--- Refresh Successful ---')
-
-
-ruckcommand.register(RefreshCmd)
-
-class RepolistCmd(ruckcommand.RuckCommand):
-
-    def name(self):
-        return "repos"
-
-    def aliases(self):
-        return ["sl", "ca", "ch"]
-
-    def is_basic(self):
-        return 1
-
-    def category(self):
-        return "system"
-
-    def description_short(self):
-        return "List active repositories"
-
-    def local_opt_table(self):
-        return [["", "disabled", "", "Show disabled services"]]
-
-    def execute(self, options_dict, non_option_args):
-        pkcon = self.pkcon()
-
-        enabled_only = not options_dict.has_key("disabled")
-        repos = []
-        for repo in pkcon.get_repo_list():
-            if enabled_only:
-                if repo['enabled']:
-                    line = [repo['id'], repo['desc']]
-                    repos.append(line)
-            else:
-                line = [repo['id'], ruckformat.bool_to_short_str(repo['enabled']), repo['desc']]
-                repos.append(line)
-
-
-        repos.sort(lambda x,y:cmp(x[0], y[0]))
-
-        if len(repos):
-            headers = ['Name', 'Description']
-            if not enabled_only:
-                headers.insert(1, 'Enabled')
-            ruckformat.tabular(headers, repos)
-        else:
-            rucktalk.message("--- No repositories found ---")
-
-ruckcommand.register(RepolistCmd)
-
-class RepoCmd(ruckcommand.RuckCommand):
-
-    def name(self):
-        return "enable"
-
-    def aliases(self):
-        return ["en"]
-
-    def is_basic(self):
-        return 1
-
-    def category(self):
-        return "system"
-
-    def description_short(self):
-        return "Enable a repository"
-
-    def is_hidden(self):
-        return 1
-
-    def setenabled(self, repos, val):
-        pkcon = self.pkcon()
-
-        for repo in repos:
-            pkcon.repo_enable(repo, val)
-            if val:
-                rucktalk.message("--- Enabled repository '%s' ---" % repo)
-            else:
-                rucktalk.message("--- Disabled repository '%s' ---" % repo)
-
-class RepoEnableCmd(RepoCmd):
-
-    def name(self):
-        return "enable"
-
-    def aliases(self):
-        return ["en"]
-
-    def is_basic(self):
-        return 1
-
-    def is_hidden(self):
-        return 0
-
-    def category(self):
-        return "system"
-
-    def description_short(self):
-        return "Enable a repository"
-
-    def execute(self, options_dict, non_option_args):
-        self.setenabled(non_option_args, True)
-
-ruckcommand.register(RepoEnableCmd)
-
-class RepoDisableCmd(RepoCmd):
-
-    def name(self):
-        return "disable"
-
-    def aliases(self):
-        return ["di"]
-
-    def is_basic(self):
-        return 1
-
-    def is_hidden(self):
-        return 0
-
-    def category(self):
-        return "system"
-
-    def description_short(self):
-        return "Disable a repository"
-
-    def execute(self, options_dict, non_option_args):
-        self.setenabled(non_option_args, False)
-
-ruckcommand.register(RepoDisableCmd)
-
-class RepoAddCmd(RepoCmd):
-
-    def name(self):
-        return "repo-add"
-
-    def aliases(self):
-        return ["sa", "ra"]
-
-    def is_basic(self):
-        return 1
-
-    def is_hidden(self):
-        return 1
-
-    def category(self):
-        return "system"
-
-    def arguments(self):
-        return "<name> <url>"
-
-    def description_short(self):
-        return "Add a repository"
-
-    def local_opt_table(self):
-        return [["c", "check-signatures",  "", "Check gpg signatures"],
-                ["n", "name", "name", "Name of the repository"],
-                ["m", "mirrorlist", "", "The url specified is a mirror list"]]
-
-    def check_url(self, url):
-        if url.startswith('http://') or url.startswith('ftp://') or \
-           url.startswith('file://') or url.startswith('https://'):
-            return True
-        else:
-            return False
-
-
-    def execute(self, options_dict, non_option_args):
-        if len(non_option_args) != 2:
-            self.usage()
-            return False
-
-        repoid = non_option_args[0]
-        url = non_option_args[1]
-
-        if not self.check_url(url):
-            rucktalk.error("Invalid url '%s'" % url)
-            return False
-
-        if self.find_repo_file(repoid) != None:
-            rucktalk.error("Repository '%s' already exists" % repoid)
-            return False
-
-        yum = self.yum(repos=False)
-
-        repopath = os.path.join(yum.conf.reposdir[0], repoid + ".repo")
-        if not os.path.exists(os.path.dirname(repopath)):
-            os.makedirs(os.path.dirname(repopath))
-
-        parser = ConfigParser()
-        parser.add_section(repoid)
-
-        name = repoid
-        if options_dict.has_key('name'):
-            name = options_dict['name']
-
-        parser.set(repoid, "name", name)
-
-        if options_dict.has_key('mirrorlist'):
-            parser.set(repoid, "mirrorlist", url)
-        else:
-            parser.set(repoid, "baseurl", url)
-
-        parser.set(repoid, "enabled", "1")
-
-        gpgval = "0"
-        if options_dict.has_key('check-signatures'):
-            gpgval = "1"
-
-        parser.set(repoid, "gpgcheck", gpgval)
-
-
-
-        parser.write(file(repopath, "w+"))
-
-        rucktalk.message("--- Successfully added '%s' ---" % repoid)
-
-
-ruckcommand.register(RepoAddCmd)
-
-class RepoDelCmd(RepoCmd):
-
-    def name(self):
-        return "repo-delete"
-
-    def aliases(self):
-        return ["sd", "rd"]
-
-    def is_basic(self):
-        return 1
-
-    def is_hidden(self):
-        return 1
-
-    def category(self):
-        return "system"
-
-    def arguments(self):
-        return "<id>"
-
-    def description_short(self):
-        return "Remove a repository"
-
-    def execute(self, options_dict, non_option_args):
-        if len(non_option_args) != 1:
-            self.usage()
-            return False
-
-        repoid = non_option_args[0]
-        repopath = self.find_repo_file(repoid)
-        if repopath == None:
-            rucktalk.error("Repository '%s' does not exist" % repoid)
-            return False
-
-        parser = ConfigParser()
-        parser.read(repopath)
-        parser.remove_section(repoid)
-        if len(parser.sections()) == 0:
-            os.unlink(repopath)
-        else:
-            parser.write(file(repopath, 'w+'))
-
-        rucktalk.message("--- Successfully removed '%s' ---" % repoid)
-
-
-ruckcommand.register(RepoDelCmd)
diff --git a/contrib/ruck/src/ruckcommand.py b/contrib/ruck/src/ruckcommand.py
deleted file mode 100644
index 7aa7d68..0000000
--- a/contrib/ruck/src/ruckcommand.py
+++ /dev/null
@@ -1,641 +0,0 @@
-###
-### Copyright 2002 Ximian, Inc.
-### Copyright 2008 Aidan Skinner <aidan at skinner.me.uk>
-###
-### This program is free software; you can redistribute it and/or modify
-### it under the terms of the GNU General Public License, version 2,
-### as published by the Free Software Foundation.
-###
-### 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
-###
-
-import sys
-import os
-import getopt
-import string
-import ruckformat
-import rucktalk
-from packagekit import client
-
-import logging
-
-default_opt_table = [
-    ["",  "version",  "",         "Print client version and exit"],
-    ["V", "verbose",  "",         "Verbose output"],
-    ["p", "no-plugins",  "",      "Don't load yum plugins"],
-    ["C", "cache-only", "",       "Run entirely from cache, don't update cache"],
-    ["",  "normal-output", "",    "Normal output (default)"],
-    ["t", "terse",    "",         "Terse output"],
-    ["",  "quiet",    "",         "Quiet output, print only error messages"],
-    ["",  "read-from-file", "filename",   "Get args from file"],
-    ["",  "read-from-stdin", "",  "Get args from stdin"],
-    ["",  "ignore-rc-file", "",   "Don't read ruck's startup file (~/.ruckrc)"],
-    ["",  "ignore-env", "",       "Ignore the RUCK_ARGS environment variable"],
-    ["?", "help",     "",         "Get help on a specific command"]
-]
-
-default_orthogonal_opts = [["verbose", "no-plugins", "terse", "normal-output", "quiet"]]
-
-
-command_dict = {}
-alias_dict = {}
-
-
-def register(constructor):
-    obj = constructor()
-    name = obj.name()
-    aliases = obj.aliases()
-    hidden = obj.is_hidden()
-    basic = obj.is_basic()
-    description = obj.description_short() or "<No Description Available>"
-    category = obj.category()
-
-    if command_dict.has_key(name):
-        rucktalk.error("Command name collision: '"+name+"'")
-    else:
-        command_dict[name] = (description, constructor, aliases, hidden, basic, category)
-
-    for a in aliases:
-        al = string.lower(a)
-        if command_dict.has_key(al):
-            rucktalk.error("Command/alias collision: '"+a+"'")
-        elif alias_dict.has_key(al):
-            rucktalk.error("Alias collision: '"+a+"'")
-        else:
-            alias_dict[al] = name
-
-
-def construct(name):
-    nl = string.lower(name)
-
-    if alias_dict.has_key(nl):
-        nl = alias_dict[nl]
-
-    if not command_dict.has_key(nl):
-        return None
-
-    cons = command_dict[nl][1]
-
-    return cons()
-
-# It seems bad that this is hard-wired here, but I don't really see
-# any cleaner way around it
-category_data = {"package":["Package management", -1000],
-                 "dependency":["Dependency analysis", 0],
-                 "user":["User management", 0],
-                 "prefs":["Preference management", 0],
-                 "service":["Service management", 0],
-                 "other":["Other", 10000000]}
-
-def command_sort(a, b):
-
-    a_name = string.lower(a[0])
-    b_name = string.lower(b[0])
-
-    a_cat = string.lower(a[2])
-    b_cat = string.lower(b[2])
-
-    if category_data.has_key(a_cat):
-        a_catcode = category_data[a_cat][1]
-    else:
-        a_catcode = 0
-
-    if category_data.has_key(b_cat):
-        b_catcode = category_data[b_cat][1]
-    else:
-        b_catcode = 0
-
-    return cmp(a_catcode, b_catcode) or cmp(a_cat, b_cat) or cmp(a_name, b_name)
-
-def print_command_list(commands, with_categories=0):
-
-    max_len = 0
-    cmd_list = []
-
-    for c in commands:
-        name, aliases, description, category = c
-
-        if aliases:
-            name = name + " (" + string.join(aliases, ", ") + ")"
-
-        cmd_list.append([name, description, category])
-        max_len = max(max_len, len(name))
-
-    desc_len = max_len + 4
-
-    cmd_list.sort(command_sort)
-
-    previous_category = "we will banish all dwarves from the love kingdom"
-
-    for c in cmd_list:
-
-        name, description, category = c
-
-        if with_categories and category != previous_category:
-            if category_data.has_key(category):
-                category_name = category_data[category][0]
-            else:
-                category_name = string.upper(category[0]) + category[1:]
-
-            rucktalk.message("\n" + category_name + " commands:")
-            previous_category = category
-
-        # If, for some reason, the command list is *really* wide (which it never should
-        # be), don't do something stupid.
-        if 79 - desc_len > 10:
-            desc = ruckformat.linebreak(description, 79-desc_len)
-        else:
-            desc = [description]
-
-        desc_first = desc.pop(0)
-        rucktalk.message("  " + string.ljust(name, max_len) + "  " + desc_first)
-        for d in desc:
-            rucktalk.message(" " * desc_len + d)
-
-def usage_basic():
-    rucktalk.message("Usage: ruck <command> <options> ...")
-    rucktalk.message("")
-
-    keys = command_dict.keys()
-
-    if keys:
-        keys.sort()
-        command_list = []
-        for k in keys:
-            description, constructor, aliases, hidden, basic, category  = command_dict[k]
-            if not hidden and basic:
-                command_list.append([k, aliases, description, category])
-
-        rucktalk.message("Some basic commands are:")
-        print_command_list(command_list)
-
-        rucktalk.message("")
-        rucktalk.message("For a more complete list of commands and important options,")
-        rucktalk.message("run \"ruck help\".")
-        rucktalk.message("")
-
-    else:
-        rucktalk.error("<< No commands found --- something is wrong! >>")
-
-def usage_full():
-    rucktalk.message("Usage: ruck <command> <options> ...")
-    rucktalk.message("")
-
-    rucktalk.message("The following options are understood by all commands:")
-    ruckformat.opt_table(default_opt_table)
-
-    keys = command_dict.keys()
-
-    if keys:
-        command_list = []
-        for k in keys:
-            description, constructor, aliases, hidden, basic, category  = command_dict[k]
-            if not hidden:
-                command_list.append([k, aliases, description, category])
-
-        print_command_list(command_list, with_categories=1)
-
-        rucktalk.message("")
-        rucktalk.message("For more detailed information about a specific command,")
-        rucktalk.message("run 'ruck <command name> --help'.")
-        rucktalk.message("")
-
-    else:
-        rucktalk.error("<< No commands found --- something is wrong! >>")
-
-
-def extract_command_from_argv(argv):
-    command = None
-    i = 0
-    unknown_commands = []
-    while i < len(argv) and not command:
-        if argv[i][0] != "-":
-            command = construct(argv[i])
-            if command:
-                argv.pop(i)
-            else:
-                unknown_commands.append(argv[i])
-        else:
-            takes_arg = 0
-            for o in default_opt_table:
-                if not (argv[i][1:] == o[0] or argv[i][2:] == o[1]):
-                    continue
-
-                if o[2] != "":
-                    takes_arg = 1
-                    break
-
-            if takes_arg and string.find(argv[i], "=") == -1:
-                i = i + 1
-
-        i = i + 1
-
-    if not command:
-        map(lambda x:rucktalk.warning("Unknown command '%s'" % x),
-            unknown_commands)
-        rucktalk.warning("No command found on command line.")
-        if "--help" in argv or "-?" in argv:
-            usage_full()
-        else:
-            usage_basic()
-        sys.exit(1)
-
-    return command
-
-###
-### Handle .ruckrc and RUCK_ARGS
-###
-
-def get_user_default_args(argv, command_name):
-
-    # We add arguments to the beginning of argv.  This means we can
-    # override an magically added arg by explicitly putting the
-    # orthogonal arg on the command line.
-    def join_args(arglist, argv):
-        return map(string.strip, arglist + argv)
-
-    # Try to read the .ruckrc file.  It basically works like a .cvsrc file.
-    if "--ignore-rc-file" not in argv:
-        ruckrc_files = (os.path.expanduser("~/.ruckrc"),
-                       os.path.expanduser("~/.rcrc"))
-
-        rc_file = None
-        for f in ruckrc_files:
-            if os.path.exists(f):
-                rc_file = f
-                break
-
-        if rc_file:
-            try:
-                ruckrc = open(rc_file, "r")
-                while 1:
-                    line = ruckrc.readline()
-
-                    # strip out comments
-                    hash_pos = string.find(line, "#")
-                    if hash_pos >= 0:
-                        line = line[0:hash_pos]
-
-                    # skip empty lines
-                    if not line:
-                        break
-
-                    pieces = string.split(line)
-                    if len(pieces) and pieces[0] == command_name:
-                        argv = join_args(pieces[1:], argv)
-                ruckrc.close()
-
-            except IOError:
-                # If we can't open the rc file, that is fine... just
-                # continue as if nothing happened.
-                pass
-
-    if "--ignore-env" not in argv:
-        if os.environ.has_key("RUCK_ARGS"):
-            args = string.split(os.environ["RUCK_ARGS"])
-            argv = join_args(args, argv)
-
-    return argv
-
-###
-### Handle --read-from-file and --read-from-stdin
-###
-
-def expand_synthetic_args(argv):
-
-    ###
-    ### First, walk across our argument list and find any --read-from-file
-    ### options.  For each, read the arguments from the file and insert
-    ### them directly after the --read-from-file option.
-    ###
-
-    i = 0
-    is_file_to_read_from = 0
-    while i < len(argv):
-        arg = argv[i]
-        file_to_read = None
-        if is_file_to_read_from:
-            file_to_read = arg
-            is_file_to_read_from = 0
-        if arg == "--read-from-file":
-            is_file_to_read_from = 1
-        elif string.find(arg, "--read-from-file=") == 0:
-            file_to_read = arg[len("--read-from-file="):]
-            is_file_to_read_from = 0
-
-        if file_to_read:
-            lines = []
-            try:
-                f = open(file_to_read, "r")
-                lines = map(string.strip, f.readlines())
-            except IOError:
-                rucktalk.error("Couldn't open file '%s' to read arguments" % file_to_read)
-                sys.exit(1)
-            argv = argv[:i] + lines + argv[i+1:]
-            i = i + len(lines)
-
-        i = i + 1
-
-    ###
-    ### Next, look for --read-from-stdin options.  If there is more than
-    ### one on the command line, we split our list of options on blank
-    ### lines.
-    ###
-
-    rfs_count = argv.count("--read-from-stdin")
-    if rfs_count > 0:
-        lines = map(string.strip, sys.stdin.readlines())
-
-        i = 0  # position in argv
-        j = 0  # position in lines
-        while i < len(argv):
-
-            if argv[i] == "--read-from-stdin":
-
-                if j < len(lines):
-                    if rfs_count > 1 and "" in lines[j:]:
-                        j1 = j + lines[j:].index("")
-                        argv = argv[:i+1] + lines[j:j1] + argv[i+1:]
-                        j = j1+1
-                    else:
-                        argv = argv[:i+1] + \
-                               filter(lambda x:x!="", lines[j:]) + \
-                               argv[i+1:]
-                        j = len(lines)
-
-
-                rfs_count = rfs_count - 1
-
-            i = i + 1
-
-    ###
-    ### Finally, we filter our all of those --read-from-* arguments
-    ### that we left lying around in argv.
-    ###
-
-    argv = filter(lambda x: \
-                  string.find(x,"--read-from-file") != 0 \
-                  and x != "--read-from-stdin",
-                  argv)
-
-    return argv
-
-
-###
-### The actual Ruckcommand class
-###
-
-class RuckCommand:
-
-    def __init__(self):
-        self.__yum = None
-        self.__pkcon = None
-        self.cache_only = False
-        self.no_plugins = False
-
-    def pkcon(self):
-        if not self.__pkcon:
-            self.__pkcon = client.PackageKitClient()
-        return self.__pkcon
-
-    def name(self):
-        return "Unknown!"
-
-    def aliases(self):
-        return []
-
-    # If is_hidden returns true, the command will not appear in 'usage'
-    # list of available commands.
-    def is_hidden(self):
-        return 0
-
-    def is_basic(self):
-        return 0
-
-    def is_local(self):
-        return 0
-
-    def category(self):
-        return "other"
-
-    def arguments(self):
-        return "..."
-
-    def description_short(self):
-        return ""
-
-    def description_long(self):
-        return ""
-
-    def default_opt_table(self):
-        return default_opt_table
-
-    def local_opt_table(self):
-        return []
-
-    def opt_table(self):
-        return self.default_opt_table() + self.local_opt_table()
-
-
-    def default_orthogonal_opts(self):
-        return default_orthogonal_opts
-
-    def local_orthogonal_opts(self):
-        return []
-
-    def orthogonal_opts(self):
-        return self.default_orthogonal_opts() + self.local_orthogonal_opts()
-
-
-    def usage(self):
-
-        rucktalk.message("")
-        rucktalk.message("Usage: ruck " + self.name() + " <options> " + \
-                       self.arguments())
-        rucktalk.message("")
-
-        description = self.description_long() or self.description_short()
-        if description:
-            description = "'" + self.name() + "': " + description
-            for l in ruckformat.linebreak(description, 72):
-                rucktalk.message(l)
-            rucktalk.message("")
-
-        opts = self.local_opt_table()
-        if opts:
-            rucktalk.message("'" + self.name() + "' Options:")
-            ruckformat.opt_table(opts)
-            rucktalk.message("")
-
-        opts = self.default_opt_table()
-        if opts:
-            rucktalk.message("General Options:")
-            ruckformat.opt_table(opts)
-            rucktalk.message("")
-
-
-
-    def execute(self, server, options_dict, non_option_args):
-        rucktalk.error("Execute not implemented!")
-        sys.exit(1)
-
-    def process_argv(self, argv):
-        ###
-        ### Expand our synthetic args.
-        ### Then compile our list of arguments into something that getopt can
-        ### understand.  Finally, call getopt on argv and massage the results
-        ### in something easy-to-use.
-        ###
-
-        argv = get_user_default_args(argv, self.name())
-
-        opt_table = self.opt_table()
-
-        short_opt_getopt = ""
-        long_opt_getopt  = []
-
-        short2long_dict = {}
-
-        for o in opt_table:
-
-            short_opt = o[0]
-            long_opt  = o[1]
-            opt_desc  = o[2]
-
-            if short_opt:
-
-                if short2long_dict.has_key(short_opt):
-                    rucktalk.error("Short option collision!")
-                    rucktalk.error("-" + short_opt + ", --" + long_opt)
-                    rucktalk.error("  vs.")
-                    rucktalk.error("-" + short_opt + ", --" + short2long_dict[short_opt])
-                    sys.exit(1)
-
-                short2long_dict[short_opt] = long_opt
-                short_opt_getopt = short_opt_getopt + short_opt
-                if opt_desc:
-                    short_opt_getopt = short_opt_getopt + ":"
-
-            if opt_desc:
-                long_opt_getopt.append(long_opt + "=")
-            else:
-                long_opt_getopt.append(long_opt)
-
-        try:
-            optlist, args = getopt.getopt(argv, short_opt_getopt, long_opt_getopt)
-        except getopt.error:
-            did_something = 0
-            for a in argv:
-                if string.find(a,"--") == 0:
-                    if not a[2:] in map(lambda x:x[1], opt_table):
-                        rucktalk.error("Invalid argument " + a)
-                        did_something = 1
-                elif string.find(a, "-") == 0:
-                    if not a[1:] in map(lambda x:x[0], opt_table):
-                        rucktalk.error("Invalid argument " + a)
-                        did_something = 1
-
-            # Just in case something strange went wrong and we weren't
-            # able to describe quite why the options parsing failed,
-            # we print a catch-all error message.
-            if not did_something:
-                rucktalk.error("Invalid arguments")
-
-            self.usage()
-
-            sys.exit(1)
-
-        ###
-        ### Walk through our list of options and replace short options with the
-        ### corresponding long option.
-        ###
-
-        i = 0
-        while i < len(optlist):
-            key = optlist[i][0]
-            if key[0:2] != "--":
-                optlist[i] = ("--" + short2long_dict[key[1:]], optlist[i][1])
-            i = i + 1
-
-
-        ###
-        ### Get the list of "orthogonal" options for this command and, if our
-        ### list of options contains orthogonal elements, remove all but the
-        ### last such option.
-        ### (i.e. if we are handed --quiet --verbose, we drop the --quiet)
-        ###
-
-        optlist.reverse()
-        for oo_list in self.orthogonal_opts():
-            i = 0
-            seen_oo = 0
-            while i < len(optlist):
-                key = optlist[i][0]
-                if key[2:] in oo_list:
-                    if seen_oo:
-                        del optlist[i]
-                        i = i - 1
-                    seen_oo = 1
-                i = i + 1
-        optlist.reverse()
-
-        ###
-        ### Store our options in a dictionary
-        ###
-
-        opt_dict = {}
-
-        for key, value in optlist:
-            opt_dict[key[2:]] = value
-
-
-        return opt_dict, args
-
-class HelpCmd(RuckCommand):
-
-    def name(self):
-        return "help"
-
-    def is_basic(self):
-        return 1
-
-    def is_local(self):
-        return 1
-
-    def description_short(self):
-        return "A list of all of the available commands"
-
-    def execute(self, options_dict, non_option_args):
-        usage_full()
-
-    def usage(self):
-        usage_full()
-
-register(HelpCmd)
-
-
-class PoopCmd(RuckCommand):
-
-    def name(self):
-        return "poop"
-
-    def is_basic(self):
-        return 1
-
-    def is_local(self):
-        return 1
-
-    def is_hidden(self):
-        return 1
-
-    def execute(self, options_dict, non_option_args):
-        os.system("figlet POOP")
-
-register(PoopCmd)
diff --git a/contrib/ruck/src/ruckformat.py b/contrib/ruck/src/ruckformat.py
deleted file mode 100644
index a72f46a..0000000
--- a/contrib/ruck/src/ruckformat.py
+++ /dev/null
@@ -1,293 +0,0 @@
-###
-### Copyright 2002 Ximian, Inc.
-### Copyright 2008 Aidan Skinner <aidan at skinner.me.uk>
-###
-### This program is free software; you can redistribute it and/or modify
-### it under the terms of the GNU General Public License, version 2,
-### as published by the Free Software Foundation.
-###
-### 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
-###
-
-import string
-import re
-import time
-import rucktalk
-
-###
-### Utility functions.  Not really public.
-###
-
-def seconds_to_str(t):
-
-    h = int(t/3600)
-    m = int((t % 3600)/60)
-    s = t % 60
-
-    if h > 0:
-        return "%dh%02dm%0ds" % (h, m, s)
-        return "%ds" % t
-    elif m > 0:
-        return "%dm%02ds" % (m, s)
-    else:
-        return "%ds" % s
-
-def bytes_to_str(x):
-
-    for fmt in ("%db", "%.2fk", "%.2fM", "%.2fg"):
-
-        if x < 1024:
-            return fmt % x
-
-        x = x / 1024.0
-
-    return "!!!"
-
-
-def pad_row(row, col_sizes):
-    return map(string.ljust, row, col_sizes)
-
-
-def clean_row(row, separator):
-    return map(lambda x, sep=separator:string.replace(x,sep,"_"), row)
-
-
-def max_col_widths(table):
-    return reduce(lambda v,w:map(max,v,w),
-                  map(lambda x:map(len,x),table))
-
-
-def stutter(str, N):
-    if N <= 0:
-        return ""
-    return str + stutter(str, N-1)
-
-
-def linebreak(in_str, width):
-
-    str = string.strip(in_str)
-
-    if not str:
-        return []
-
-    if len(str) <= width:
-        return [str]
-
-    if width < len(str) and str[width] == " ":
-        n = width
-    else:
-        n = string.rfind(str[0:width], " ")
-
-    lines = []
-
-    if n == -1:
-        lines.append(str)
-    else:
-        lines.append(str[0:n])
-        lines = lines + linebreak(str[n+1:], width)
-
-    return lines
-
-## Assemble EVRs into strings
-
-def naevr_to_str(naevr):
-    version = ""
-
-    (n,a,e,v,r) = naevr
-
-    if e != '0':
-        version = version + e + ":"
-
-    version = version + v
-
-    if r:
-        version = version + "-" + r
-
-    version = version + '.' + str(a)
-
-    return version
-
-
-## Assemble EVRs into abbreviated strings
-
-def naevr_to_abbrev_str(naevr):
-
-    (n,a,e,v,r) = naevr
-
-    if r and string.find(r, "snap") != -1:
-        r = re.compile(".*(\d\d\d\d)(\d\d)(\d\d)(\d\d)(\d\d)")
-        m = r.match(v) or r.match(r)
-        if m:
-            return "%s-%s-%s, %s:%s" % \
-                   (m.group(1), m.group(2), m.group(3), m.group(4), m.group(5))
-
-    return naevr_to_str(naevr)
-
-
-## Extract data from a package
-
-def package_to_row(pkg, no_abbrev, key_list):
-
-    row = []
-
-    for key in key_list:
-        val = "?"
-        if key == "installed":
-            # FIXME: show newer versions than are installed as 'U'?
-            if (pkg.installed):
-                val = 'I'
-            else:
-                val = 'U'
-        elif key == "repo":
-            val = pkg.repoid
-        elif key == "version":
-            val = pkg.ver
-        elif key == "name":
-            # Trim long names
-            val = pkg.name
-            if not no_abbrev and len(val) > 25:
-                val = val[0:22] + "..."
-
-        row.append(val)
-
-    return row
-
-def package_to_str(pkg, version=True, repo=True):
-    pkg_str = pkg.name
-    if version:
-        if pkg.epoch == '0':
-            pkg_str += "-%s-%s" % (pkg.version, pkg.release)
-        else:
-            pkg_str += "-%s:%s-%s" % (pkg.epoch, pkg.version, pkg.release)
-    pkg_str += ".%s" % pkg.arch
-
-    if repo:
-        pkg_str += " (%s)" % pkg.repoid
-
-    return pkg_str
-
-
-def progress_to_str(pc, completed_size, total_size,
-                    remaining_sec, elapsed_sec, text=None):
-
-    msg = "%3d%%" % pc
-
-    if remaining_sec > 0:
-        hash_max = 10
-    else:
-        hash_max = 20
-    hash_count = int(hash_max * pc / 100)
-    hashes = "#" * hash_count + "-" * (hash_max - hash_count)
-
-    msg = msg + " " + hashes
-
-    if completed_size > 0 and total_size > 0:
-        cs = bytes_to_str(completed_size)
-        ts = bytes_to_str(total_size)
-        msg = msg + " (" + cs + "/" + ts + ")"
-
-    if elapsed_sec > 0:
-        msg = msg + ", " + seconds_to_str(elapsed_sec) + " elapsed"
-
-        if remaining_sec > 0:
-            msg = msg + ", " + seconds_to_str(remaining_sec) + " remain"
-
-            if elapsed_sec > 0 and completed_size > 0:
-                rate = completed_size / elapsed_sec
-                msg = msg + ", " + bytes_to_str(rate) + "/s"
-
-    if text != None:
-        msg += ", " + text
-
-    return msg
-
-
-###
-### Code that actually does something.
-###
-
-def separated(table, separator):
-
-    for r in table:
-        rucktalk.message(string.join(clean_row(r, separator), separator + " "))
-
-
-def aligned(table):
-
-    col_sizes = max_col_widths(table)
-
-    for r in table:
-        rucktalk.message(string.join(pad_row(r, col_sizes), " "))
-
-
-def opt_table(table):
-
-    opt_list = []
-
-    for r in table:
-        opt = "--" + r[1]
-        if r[0]:
-            opt = "-" + r[0] + ", " + opt
-        if r[2]:
-            opt = opt + "=<" + r[2] + ">"
-
-        opt_list.append([opt + "  ", r[3]])
-
-    # By appending [0,0], we insure that this will work even if
-    # opt_list is empty (which it never should be)
-    max_len = apply(max, map(lambda x:len(x[0]), opt_list) + [0,0])
-
-    for opt, desc_str in opt_list:
-
-        if 79 - max_len > 10:
-            desc = linebreak(desc_str, 79 - max_len)
-        else:
-            desc = [desc_str]
-
-        desc_first = desc.pop(0)
-        rucktalk.message(string.ljust(opt, max_len) + desc_first)
-        for d in desc:
-            rucktalk.message(" " * max_len + d)
-
-
-def tabular(headers, table):
-
-    def row_to_string(row, col_sizes):
-        if rucktalk.be_terse:
-            return string.join(row, "|")
-        else:
-            return string.join(pad_row(row, col_sizes), " | ")
-
-    col_sizes = max_col_widths(table)
-
-    if headers and not rucktalk.be_terse:
-        col_sizes = map(max, map(len,headers), col_sizes)
-
-        # print headers
-        rucktalk.message(string.join(pad_row(headers, col_sizes), " | "))
-
-        # print head/body separator
-        rucktalk.message(string.join (map(lambda x:stutter("-",x), col_sizes), "-+-"))
-
-    # print table body
-    for r in table:
-        rucktalk.message(row_to_string(r, col_sizes))
-
-def bool_to_str(b):
-    if b:
-        return 'Yes'
-    else:
-        return 'No'
-
-def bool_to_short_str(b):
-    if b:
-        return 'Y'
-    else:
-        return 'N'
diff --git a/contrib/ruck/src/ruckmain.py b/contrib/ruck/src/ruckmain.py
deleted file mode 100644
index 7f7a7ab..0000000
--- a/contrib/ruck/src/ruckmain.py
+++ /dev/null
@@ -1,175 +0,0 @@
-#!/usr/bin/python
-
-###
-### Copyright 2002 Ximian, Inc.
-### Copyright 2008 Aidan Skinner <aidan at skinner.me.uk>
-###
-### This program is free software; you can redistribute it and/or modify
-### it under the terms of the GNU General Public License, version 2,
-### as published by the Free Software Foundation.
-###
-### 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
-###
-
-import sys
-import string
-import getpass
-import os
-import traceback
-
-import rucktalk
-import ruckcommand
-
-import urlgrabber
-import urlgrabber.grabber
-
-ruck_name = "Red Carpet Command Line Client"
-ruck_copyright = "Copyright (C) 2000-2003 Ximian Inc.  All Rights Reserved."
-ruck_version = None
-
-def import_commands(ruck_dir):
-    import glob, imp
-    sysdir = ruck_dir + "/commands"
-    sys.path.append(sysdir)
-
-    loaded_modules = []
-
-    # First load modules in our current directory, for developers, and then
-    # out of the system dir.
-    files = glob.glob("*cmds.py")
-    files = files + glob.glob("%s/*cmds.py" % sysdir)
-
-    for file in files:
-        (path, name) = os.path.split(file)
-        (name, ext) = os.path.splitext(name)
-
-        if name in loaded_modules:
-            continue
-
-        (file, filename, data) = imp.find_module(name, [path])
-
-        try:
-            module = imp.load_module(name, file, filename, data)
-        except ImportError:
-            rucktalk.warning("Can't import module " + filename)
-        else:
-            loaded_modules.append(name)
-
-        if file:
-            file.close()
-
-def show_exception(e):
-    if rucktalk.show_verbose:
-        trace = ""
-        exception = ""
-        exc_list = traceback.format_exception_only (sys.exc_type, sys.exc_value)
-        for entry in exc_list:
-            exception += entry
-            tb_list = traceback.format_tb(sys.exc_info()[2])
-            for entry in tb_list:
-                trace += entry
-
-        rucktalk.error(str(e))
-        rucktalk.error(trace)
-    else:
-        rucktalk.error(str(e))
-
-def main(ver, ruck_dir):
-
-    global local
-    global ruck_version
-
-    ruck_version = ver
-
-    if os.environ.has_key("RUCK_DEBUG"):
-        rucktalk.show_debug = 1
-
-    import rucklocks
-    rucklocks.init()
-
-    import_commands(ruck_dir)
-
-    ###
-    ### Grab the option list and extract the first non-option argument that
-    ### looks like a command.  This could get weird if someone passes the name
-    ### of a command as the argument to an option.
-    ###
-
-    argv = sys.argv[1:]
-
-    argv = ruckcommand.expand_synthetic_args(argv)
-
-    if "--version" in argv:
-        print
-        print ruck_name + " " + ruck_version
-        print ruck_copyright
-        print
-        sys.exit(0)
-
-    command = ruckcommand.extract_command_from_argv(argv)
-
-    if "-?" in argv or "--help" in argv:
-        command.usage()
-        sys.exit(0)
-
-    # A hack to suppress extra whitespace when dumping.
-    if command.name() == "dump":
-        rucktalk.be_terse = 1
-
-    argv = ruckcommand.get_user_default_args(argv, command)
-
-    opt_dict, args = command.process_argv(argv)
-
-    ###
-    ### Control verbosity
-    ###
-
-    if opt_dict.has_key("terse"):
-        rucktalk.be_terse = 1
-
-    if opt_dict.has_key("quiet"):
-        rucktalk.show_messages = 0
-        rucktalk.show_warnings = 0
-
-    if opt_dict.has_key("verbose"):
-        rucktalk.show_verbose = 1
-
-    ### Whitespace is nice, so we always print a blank line before
-    ### executing the command
-
-    if not rucktalk.be_terse:
-        rucktalk.message("")
-
-    if opt_dict.has_key("cache-only") or os.getuid() != 0:
-        command.cache_only = True
-    elif opt_dict.has_key("no-plugins"):
-        command.no_plugins = True
-
-    try:
-        command.execute(opt_dict, args)
-    except IOError, e:
-        if e.errno == 13:
-            rucktalk.error("You must be root to execute this command")
-        else:
-            show_exception(e)
-
-        sys.exit(1)
-    except Exception, e:
-        show_exception(e)
-        sys.exit(1)
-
-    ### Whitespace is nice, so we always print a blank line after
-    ### executing the command
-
-    if not rucktalk.be_terse:
-        rucktalk.message("")
-
-
-
diff --git a/contrib/ruck/src/ruckpackagecmds.py b/contrib/ruck/src/ruckpackagecmds.py
deleted file mode 100644
index 5edfde4..0000000
--- a/contrib/ruck/src/ruckpackagecmds.py
+++ /dev/null
@@ -1,1343 +0,0 @@
-###
-### Copyright 2002 Ximian, Inc.
-### Copyright 2008 Aidan Skinner <aidan at skinner.me.uk>
-###
-### This program is free software; you can redistribute it and/or modify
-### it under the terms of the GNU General Public License, version 2,
-### as published by the Free Software Foundation.
-###
-### 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
-###
-
-import sys
-import os
-import re
-import os.path
-import shutil
-import glob
-from ConfigParser import ConfigParser
-import string
-import rucktalk
-import ruckformat
-import ruckcommand
-
-import rpmUtils.arch
-from rpmUtils.miscutils import compareEVR
-from packagekit import enums as pkenums
-
-class PackageCmd(ruckcommand.RuckCommand):
-
-    def is_installed(self, p):
-        pkcon = self.pkcon()
-
-        (n,a,e,v,r) = p.pkgtup
-        # FIXME: this only searches name, not full naevr
-        matches = pkcon.search_name(pkcon.PK_FILTER_INSTALLED, n)
-        return len(matches) > 0
-
-    def find_available_packages(self, list):
-        yum = self.yum()
-
-        exactmatches, matches, unmatched = self.find_packages(list)
-
-        if len(unmatched) > 0:
-            raise Exception("Could not find package '%s'" % unmatched[0])
-
-        installable = unique(exactmatches + matches)
-        archlist = yum.conf.exactarchlist
-
-        installs = {}
-        updates = {}
-
-        for pkg in installable:
-            if yum.rpmdb.installed(po=pkg):
-                continue
-
-            # everything installed that matches the name
-            installedByKey = yum.rpmdb.searchNevra(name=pkg.name)
-            comparable = []
-            for instpo in installedByKey:
-                (n2, a2, e2, v2, r2) = instpo.pkgtup
-                if rpmUtils.arch.isMultiLibArch(a2) == rpmUtils.arch.isMultiLibArch(pkg.arch):
-                    comparable.append(instpo)
-
-            # go through each package
-            if len(comparable) > 0:
-                for instpo in comparable:
-                    if pkg > instpo: # we're newer - this is an update, pass to them
-                        if instpo.name in archlist:
-                            if pkg.arch == instpo.arch:
-                                if not updates.has_key(pkg.name):
-                                    updates[pkg.name] = []
-
-                                updates[pkg.name].append(pkg)
-                        else:
-                            if not updates.has_key(pkg.name):
-                                updates[pkg.name] = []
-
-                            updates[pkg.name].append(pkg)
-                    elif pkg == instpo: # same, ignore
-                        continue
-            else: # we've not got any installed that match n or n+a
-                if not installs.has_key(pkg.name):
-                    installs[pkg.name] = []
-
-                installs[pkg.name].append(pkg)
-
-        pkglist = []
-        for name in installs.keys():
-            pkglist.extend(yum.bestPackagesFromList(installs[name]))
-
-        installs = pkglist
-
-        pkglist = []
-        for name in updates.keys():
-            pkglist.extend(yum.bestPackagesFromList(updates[name]))
-
-        updates = pkglist
-
-        return installs, updates
-
-    def filter_installs(self, list):
-        uninstalled = []
-        installed = []
-
-        for p in list:
-            if self.is_installed(p):
-                installed.append(p)
-            else:
-                uninstalled.append(p)
-
-        return uninstalled, installed
-
-    def find_packages(self, list, installed=False):
-        yum = self.yum()
-
-        if installed:
-            avail = yum.rpmdb.returnPackages()
-        else:
-            avail = yum.pkgSack.returnPackages()
-
-        return self.parsePackages(avail, list, casematch=0)
-
-    def buildPkgRefDict(self, pkgs):
-        """take a list of pkg objects and return a dict the contains all the possible
-           naming conventions for them eg: for (name,i386,0,1,1)
-           dict[name] = (name, i386, 0, 1, 1)
-           dict[name.i386] = (name, i386, 0, 1, 1)
-           dict[name-1-1.i386] = (name, i386, 0, 1, 1)
-           dict[name-1] = (name, i386, 0, 1, 1)
-           dict[name-1-1] = (name, i386, 0, 1, 1)
-           dict[0:name-1-1.i386] = (name, i386, 0, 1, 1)
-           dict[name-0:1-1.i386] = (name, i386, 0, 1, 1)
-           """
-        pkgdict = {}
-        for pkg in pkgs:
-            pkgtup = (pkg.name, pkg.arch, pkg.epoch, pkg.version, pkg.release)
-            (n, a, e, v, r) = pkgtup
-            name = n
-            nameArch = '%s.%s' % (n, a)
-            nameVerRelArch = '%s-%s-%s.%s' % (n, v, r, a)
-            nameVer = '%s-%s' % (n, v)
-            nameVerRel = '%s-%s-%s' % (n, v, r)
-            envra = '%s:%s-%s-%s.%s' % (e, n, v, r, a)
-            nevra = '%s-%s:%s-%s.%s' % (n, e, v, r, a)
-            repoName = '%s:%s' % (pkg.repoid, n)
-            repoNameArch = '%s:%s.%s' % (pkg.repoid, n, a)
-
-            for item in [name, nameArch, nameVerRelArch, nameVer, nameVerRel, envra, nevra, repoName, repoNameArch]:
-                if not pkgdict.has_key(item):
-                    pkgdict[item] = []
-                pkgdict[item].append(pkg)
-
-        return pkgdict
-
-    def parsePackages(self, pkgs, usercommands, casematch=0):
-        pkgdict = self.buildPkgRefDict(pkgs)
-        exactmatch = []
-        matched = []
-        unmatched = []
-        for command in usercommands:
-            if pkgdict.has_key(command):
-                exactmatch.extend(pkgdict[command])
-                del pkgdict[command]
-            else:
-                # anything we couldn't find a match for
-                # could mean it's not there, could mean it's a wildcard
-                if re.match('.*[\*,\[,\],\{,\},\?].*', command):
-                    trylist = pkgdict.keys()
-                    restring = fnmatch.translate(command)
-                    if casematch:
-                        regex = re.compile(restring) # case sensitive
-                    else:
-                        regex = re.compile(restring, flags=re.I) # case insensitive
-                    foundit = 0
-                    for item in trylist:
-                        if regex.match(item):
-                            matched.extend(pkgdict[item])
-                            del pkgdict[item]
-                            foundit = 1
-
-                    if not foundit:
-                        unmatched.append(command)
-
-                else:
-                    # we got nada
-                    unmatched.append(command)
-
-        matched = unique(matched)
-        unmatched = unique(unmatched)
-        exactmatch = unique(exactmatch)
-        return exactmatch, matched, unmatched
-
-    def get_package(self, pkg_tuple):
-        yum = self.yum()
-
-        (n,a,e,v,r) = pkg_tuple
-        matches = yum.pkgSack.searchNevra(name=n, arch=a, epoch=e,
-                                          ver=v, rel=r)
-        return matches[0]
-
-    def get_updates(self, repo=None):
-        yum = self.yum()
-
-        yum.doRpmDBSetup()
-        yum.doUpdateSetup()
-
-        updates = yum.up.updating_dict
-
-        tuples = []
-
-        for new in updates:
-            (n,a,e,v,r) = new
-            matches = yum.pkgSack.searchNevra(name=n, arch=a, epoch=e,
-                                              ver=v, rel=r)
-            new_pkg = matches[0]
-            if repo and new_pkg.repoid != repo:
-                continue
-
-            (n,a,e,v,r) = updates[new][0]
-            matches = yum.rpmdb.searchNevra(name=n, arch=a, epoch=e,
-                                            ver=v, rel=r)
-            old_pkg = matches[0]
-
-            tuples.append((new_pkg, old_pkg))
-
-        return tuples
-
-
-    def resolve_deps(self):
-        rucktalk.message('Resolving dependencies...')
-        yum = self.yum()
-
-        return yum.buildTransaction()
-
-    def show_ts_list(self, items, isdep=False):
-        for pkg in items:
-            msg = "  " + ruckformat.package_to_str(pkg)
-            if isdep:
-                msg += " (dependency)"
-            rucktalk.message(msg)
-
-    def show_ts_packages(self):
-        yum = self.yum()
-
-        yum.tsInfo.makelists()
-
-        list = yum.tsInfo.installed
-        dep_list = yum.tsInfo.depinstalled
-        if len(list) > 0 or len(dep_list) > 0:
-            rucktalk.message('The following packages will be installed:')
-            self.show_ts_list(list)
-            self.show_ts_list(dep_list, True)
-
-        list = yum.tsInfo.updated
-        dep_list = yum.tsInfo.depupdated
-        if len(list) > 0 or len(dep_list) > 0:
-            rucktalk.message('The following packages will be upgraded:')
-            self.show_ts_list(list)
-            self.show_ts_list(dep_list, True)
-
-        list = yum.tsInfo.removed
-        dep_list = yum.tsInfo.depremoved
-        if len(list) > 0 or len(dep_list) > 0:
-            rucktalk.message('The following packages will be removed:')
-            self.show_ts_list(list)
-            self.show_ts_list(dep_list, True)
-
-    def get_pkgs_to_download(self):
-        yum = self.yum()
-
-        downloadpkgs = []
-        for txmbr in yum.tsInfo.getMembers():
-            if txmbr.ts_state in ['i', 'u']:
-                po = txmbr.po
-                if po:
-                    downloadpkgs.append(po)
-
-        return downloadpkgs
-
-    def parse_dep_str(self, dep_str):
-        ret = {}
-
-        info = string.split(dep_str)
-        info_len = len(info)
-        if info_len == 1:
-            ret["dep"] = dep_str
-            return ret
-        elif info_len != 3:
-            raise Exception("Invalid dep string")
-
-        valid_relations = ["=", "<", "<=", ">", ">=", "!="]
-
-        if not info[1] in valid_relations:
-            raise Exception("Invalid relation %s" % info[1])
-
-        ret["dep"] = info[0]
-        ret["relation"] = info[1]
-
-        version_regex = re.compile("^(?:(\d+):)?(.*?)(?:-([^-]+))?$")
-        match = version_regex.match(info[2])
-
-        if match.group(1):
-            ret["has_epoch"] = 1
-            ret["epoch"] = int(match.group(1))
-        else:
-            ret["has_epoch"] = 0
-            ret["epoch"] = 0
-
-        ret["version"] = match.group(2)
-
-        if match.group(3):
-            ret["release"] = match.group(3)
-        else:
-            ret["release"] = ""
-
-        return ret
-
-    def need_prompt(self):
-
-        yum = self.yum()
-
-        # prompt if:
-        #  package was added to fill a dependency
-        #  package is being removed
-        #  package wasn't explictly given on the command line
-        for txmbr in yum.tsInfo.getMembers():
-            if txmbr.isDep or txmbr.ts_state == 'e':
-                return True
-
-        return False
-
-    def gpgsigcheck(self, pkgs):
-        yum = self.yum()
-
-        for p in pkgs:
-            result, errmsg = yum.sigCheckPkg(p)
-            if result == 0:
-                # woo!
-                pass
-            elif result == 1:
-                # FIXME: need to download gpg
-                rucktalk.error("Ignoring missing gpg key.")
-                pass
-            else:
-                yumtalk.error(errmsg)
-                return False
-
-        return True
-
-    def tsInfo_is_empty(self, tsInfo):
-        return len(tsInfo.installed) == 0 and \
-               len(tsInfo.depinstalled) == 0 and \
-               len(tsInfo.updated) == 0 and \
-               len(tsInfo.depupdated) == 0 and \
-               len(tsInfo.removed) == 0 and \
-               len(tsInfo.depremoved) == 0
-
-    def start_transaction(self, dryrun=False, download_only=False):
-        yum = self.yum()
-
-        if not download_only:
-            (rescode, resmsgs) = self.resolve_deps()
-            if rescode != 2:
-                for resmsg in resmsgs:
-                    rucktalk.error(resmsg)
-
-                return False
-
-        self.show_ts_packages()
-
-        if self.tsInfo_is_empty(yum.tsInfo):
-            rucktalk.warning("Nothing to do.")
-            return False
-
-        downloadpkgs = self.get_pkgs_to_download()
-
-        if len(downloadpkgs) > 0:
-            total_size = 0
-
-            for p in downloadpkgs:
-                try:
-                    size = int(p.size())
-                    total_size += size
-                except:
-                    pass
-
-            if total_size > 0:
-                rucktalk.message("\nTotal download size: %s\n" % (ruckformat.bytes_to_str(total_size)))
-
-        if self.need_prompt():
-            answer = raw_input('\nProceed with transaction? (y/N) ')
-            if len(answer) != 1 or answer[0] != 'y':
-                rucktalk.message('Transaction Canceled')
-                return False
-
-        problems = yum.downloadPkgs(downloadpkgs)
-        if len(problems.keys()) > 0:
-            rucktalk.error("Error downloading packages:")
-            for key in problems.keys():
-                for error in unique(problems[key]):
-                    rucktalk.message("  %s: %s" % (key, error))
-            return False
-
-        if download_only:
-            for pkg in downloadpkgs:
-                dest = ruckformat.package_to_str(pkg, repo=False) + ".rpm"
-                shutil.move(pkg.localpath, dest)
-                rucktalk.message ("Downloaded '%s'" % dest)
-
-            return True
-
-        # Check GPG signatures
-        if not self.gpgsigcheck(downloadpkgs):
-            return False
-
-        tsConf = {}
-        for feature in ['diskspacecheck']: # more to come, I'm sure
-                tsConf[feature] = getattr(yum.conf, feature)
-
-        if dryrun:
-            testcb = ruckyum.RPMInstallCallback(output=1)
-            testcb.tsInfo = yum.tsInfo
-            # clean out the ts b/c we have to give it new paths to the rpms
-            del yum.ts
-
-            yum.initActionTs()
-            yum.populateTs(keepold=0) # sigh
-            tserrors = yum.ts.test(testcb, conf=tsConf)
-            del testcb
-
-            if len(tserrors) > 0:
-                errstring = ''
-                for descr in tserrors:
-                    errstring += '  %s\n' % descr
-
-                rucktalk.error(errstring)
-                return False
-
-        else:
-            rucktalk.message('Running Transaction Test')
-
-            testcb = ruckyum.RPMInstallCallback(output=0)
-            testcb.tsInfo = yum.tsInfo
-            # clean out the ts b/c we have to give it new paths to the rpms
-            del yum.ts
-
-            yum.initActionTs()
-            # save our dsCallback out
-            dscb = yum.dsCallback
-            yum.dsCallback = None # dumb, dumb dumb dumb!
-            yum.populateTs(keepold=0) # sigh
-            tserrors = yum.ts.test(testcb, conf=tsConf)
-            del testcb
-
-            if len(tserrors) > 0:
-                errstring = 'Transaction Check Error: '
-                for descr in tserrors:
-                    errstring += '  %s\n' % descr
-
-                rucktalk.error(errstring)
-                return False
-
-            rucktalk.message('Transaction Test Succeeded\n')
-            del yum.ts
-
-            yum.initActionTs() # make a new, blank ts to populate
-            yum.populateTs(keepold=0) # populate the ts
-            yum.ts.check() #required for ordering
-            yum.ts.order() # order
-
-            # put back our depcheck callback
-            yum.dsCallback = dscb
-
-            cb = ruckyum.RPMInstallCallback(output=1)
-            cb.tsInfo = yum.tsInfo
-
-            yum.runTransaction(cb=cb)
-
-        rucktalk.message('\nTransaction Finished')
-        return True
-
-class PackagesCmd(PackageCmd):
-
-    def name(self):
-        return "packages"
-
-    def aliases(self):
-        return ["pa"]
-
-    def category(self):
-        return "basic"
-
-    def is_basic(self):
-        return 1
-
-    def arguments(self):
-        return ""
-
-    def description_short(self):
-        return "List all packages"
-
-    def category(self):
-        return "package"
-
-    def local_opt_table(self):
-        return [["",  "no-abbrev", "", "Do not abbreviate channel or version information"],
-                ["i", "installed-only", "", "Show only installed packages"],
-                ["u", "uninstalled-only", "", "Show only uninstalled packages"],
-                ["",  "sort-by-name", "", "Sort packages by name (default)"],
-                ["",  "sort-by-repo", "", "Sort packages by repository"]]
-
-    def local_orthogonal_opts(self):
-        return [["installed-only", "uninstalled-only"]]
-
-    def execute(self, options_dict, non_option_args):
-        # FIXME: does not know about status, not sure all is right default
-        pkcon = self.pkcon()
-
-        table_rows = []
-        no_abbrev = options_dict.has_key("no-abbrev")
-
-        sort_idx = 2
-        table_headers = ["S", "Repository", "Name", "Version"]
-        table_keys = ["installed", "repo", "name", "version"]
-
-        filter = pkenums.FILTER_NEWEST
-        if options_dict.has_key("uninstalled-only"):
-            filter = filter + pkenums.FILTER_NOT_INSTALLED
-        elif options_dict.has_key("installed-only"):
-            filter = pkenums.FILTER_INSTALLED
-
-        filter = pkenums.FILTER_INSTALLED
-        pkgs = pkcon.get_packages(filter)
-
-        remote_tuples = {}
-
-        for p in pkgs:
-            row = ruckformat.package_to_row(p, no_abbrev, table_keys)
-            table_rows.append(row)
-
-        if table_rows:
-            if options_dict.has_key("sort-by-repo"):
-                table_rows.sort(lambda x,y:cmp(string.lower(x[1]), string.lower(y[1])) or\
-                                cmp(string.lower(x[2]), string.lower(y[2])))
-            else:
-                table_rows.sort(lambda x,y:cmp(string.lower(x[sort_idx]), string.lower(y[sort_idx])))
-            ruckformat.tabular(table_headers, table_rows)
-        else:
-            rucktalk.message("--- No packages found ---")
-
-
-###
-### "search" command
-###
-
-class PackageSearchCmd(PackageCmd):
-
-    def name(self):
-        return "search"
-
-    def aliases(self):
-        return ["se"]
-
-    def is_basic(self):
-        return 1
-
-    def category(self):
-        return "package"
-
-    def arguments(self):
-        return "[package name]"
-
-    def description_short(self):
-        return "Search packages"
-
-    def local_opt_table(self):
-        return [['d', "search-descriptions", '', "Search in package descriptions, as well as package names"],
-                ['i', "installed-only", '', "Search only installed packages"],
-                ['u', "uninstalled-only", '', "Search only uninstalled packages"],
-                ["", "sort-by-name", "", "Sort packages by name (default)"],
-                ["", "sort-by-repo", "", "Sort packages by repository, not by name"],
-                ["", "no-abbrev",    "", "Do not abbreviate channel or version information"]]
-
-    def execute(self, options_dict, non_option_args):
-        pkcon = self.pkcon()
-
-        searchlist = ['name']
-        if options_dict.has_key('search-descriptions'):
-            method = pkcon.search_details
-        else:
-            method = pkcon.search_name
-
-        filter = pkenums.FILTER_NONE
-        if options_dict.has_key('installed-only'):
-            filter = pkenums.FILTER_INSTALLED
-        elif options_dict.has_key('uninstalled-only'):
-            filter = pkenums.FILTER_NOT_INSTALLED
-
-        result = {}
-        matches = method(non_option_args[0], filter)
-        if len(matches) > 0:
-            table_keys = ["installed", "repo", "name", "version"]
-            table_rows = []
-            no_abbrev = options_dict.has_key("no-abbrev")
-
-            for pkg in matches:
-                row = ruckformat.package_to_row(pkg, no_abbrev, table_keys)
-                table_rows.append(row)
-
-            if options_dict.has_key("sort-by-repo"):
-                table_rows.sort(lambda x,y:cmp(string.lower(x[1]), string.lower(y[1])) or\
-                                cmp(string.lower(x[2]), string.lower(y[2])))
-            else:
-                table_rows.sort(lambda x,y:cmp(string.lower(x[2]), string.lower(y[2])))
-            ruckformat.tabular(["S", "Repository", "Name", "Version"], table_rows)
-        else:
-            rucktalk.message("--- No packages found ---")
-
-
-
-class PackageListUpdatesCmd(PackageCmd):
-
-    def name(self):
-        return "list-updates"
-
-    def is_basic(self):
-        return 1
-
-    def aliases(self):
-        return ["lu"]
-
-    def arguments(self):
-        return
-
-    def description_short(self):
-        return "List available updates"
-
-    def category(self):
-        return "package"
-
-    def local_opt_table(self):
-        return [["",  "no-abbrev", "", "Do not abbreviate channel or version information"],
-                ["",  "sort-by-name", "", "Sort packages by name (default)"],
-                ["",  "sort-by-repo", "", "Sort packages by repository"]]
-
-    def execute(self, options_dict, non_option_args):
-        no_abbrev = options_dict.has_key("no-abbrev") or \
-                    options_dict.has_key("terse")
-
-        pkcon = self.pkcon()
-
-        table_keys = ["repo", "name", "version"]
-        table_rows = []
-
-        updates = pkcon.get_updates()
-
-        for new_pkg in updates:
-            row = ruckformat.package_to_row(new_pkg, no_abbrev, table_keys)
-            table_rows.append(row)
-
-        if len(table_rows):
-            if options_dict.has_key("sort-by-repo"):
-                table_rows.sort(lambda x,y:cmp(string.lower(x[0]), string.lower(y[0])) or\
-                                cmp(string.lower(x[1]), string.lower(y[1])))
-            else:
-                table_rows.sort(lambda x,y:cmp(string.lower(x[1]), string.lower(y[1])))
-
-            ruckformat.tabular(["Repository", "Name",
-                               "Version"],
-                              table_rows)
-        else:
-            rucktalk.message("--- No updates found ---")
-
-class  PackageUpdatesSummaryCmd(PackageCmd):
-
-    def name(self):
-        return "summary"
-
-    def is_basic(self):
-        return 1
-
-    def aliases(self):
-        return ["sum"]
-
-    def arguments(self):
-        return ""
-
-    def description_short(self):
-        return "Display a summary of available updates updates"
-
-    def category(self):
-        return "package"
-
-    def local_opt_table(self):
-        return [["",  "no-abbrev", "", "Do not abbreviate channel or version information"]]
-
-    def execute(self, options_dict, non_option_args):
-        pkcon = self.pkcon()
-
-        updates = pkcon.get_updates()
-        repos = {}
-        for pkg in updates:
-            bits = ruckformat.package_to_row(pkg, False, ['repo'])
-            if not repos.has_key(bits[0]):
-                repos[bits[0]] = [bits[0], 0]
-            repos[bits[0]][1] = str(int(repos[bits[0]][1])+1)
-
-        repolist = []
-        for repo in repos.keys():
-            repolist.append(repos[repo])
-
-        if len(repolist) > 0:
-            repolist.sort(lambda x,y:cmp(y[1], x[1]))
-            headers = ["Repository", "Total"]
-            ruckformat.tabular(headers, repolist)
-        else:
-            rucktalk.message("--- No updates found ---")
-
-
-class PackageInfoCmd(ruckcommand.RuckCommand):
-
-    def name(self):
-        return "info"
-
-    def is_basic(self):
-        return 1
-
-    def aliases(self):
-        return ["if"]
-
-    def category(self):
-        return "package"
-
-    def arguments(self):
-        return "<package-name>"
-
-    def description_short(self):
-        return "Show detailed information about a package"
-
-    def execute(self, options_dict, non_option_args):
-
-        if not non_option_args:
-            self.usage()
-            sys.exit(1)
-
-        pkcon = self.pkcon()
-
-        for a in non_option_args:
-
-            inform = 0
-            channel = None
-            package = None
-
-            plist = pkcon.resolve("none", a)
-
-            if plist == None or len(plist) == 0:
-                rucktalk.message("--- No packages found ---")
-                sys.exit(1)
-
-            ## Find the latest version
-            latest_ver, latest_id = None, None
-            for pkg in plist:
-                row = ruckformat.package_to_row(pkg, False, ['version'])
-                if latest_ver == None or row[0] > latest_ver:
-                    latest_ver= row[0]
-                    latest_id = pkg
-
-            latest = pkcon.get_details(latest_id['id'])[0]
-            details = ruckformat.package_to_row(latest, False, ['name', 'version', 'repo', 'installed'])
-            latest['name'] = details[0]
-            latest['version'] = details[1]
-            latest['repo'] = details[2]
-            latest['installed'] = (details[3] == 'I')
-
-            rucktalk.message("")
-            rucktalk.message("Name: " + latest['name'])
-            rucktalk.message("Version: " + latest['version'])
-
-            if latest_id['installed']:
-                rucktalk.message("Installed: Yes")
-            else:
-                rucktalk.message("Installed: No")
-
-            rucktalk.message("Package size: " + str(latest['size']))
-
-            rucktalk.message("Group: " + latest['group'])
-            rucktalk.message("Homepage: " + latest['url'])
-            rucktalk.message("Description: " + latest['detail'])
-
-class PackageFileCmd(ruckcommand.RuckCommand):
-
-    def name(self):
-        return "package-file"
-
-    def aliases(self):
-        return ["pf"]
-
-    def arguments(self):
-        return "<file> ..."
-
-    def is_basic(self):
-        return 1
-
-    def category(self):
-        return "package"
-
-    def description_short(self):
-        return "List packages that own the files provided"
-
-    def execute(self, options_dict, non_option_args):
-        size = len(non_option_args)
-        if size < 1:
-            self.usage()
-            return False
-
-        table_rows = []
-        yum = self.yum()
-
-        for file in non_option_args:
-            if not os.access (file, os.F_OK):
-                rucktalk.error("File %s does not exist" % file)
-                continue
-
-            matches = yum.rpmdb.searchFiles (file);
-            if not matches:
-                rucktalk.message("No package owns file %s" % file)
-                continue
-
-            for pkg in matches:
-                row = ruckformat.package_to_row(yum, pkg, False, ["name", "version"])
-                if size > 1:
-                    row.insert (0, file)
-                table_rows.append (row)
-
-        if len(table_rows):
-            if size == 1:
-                ruckformat.tabular(["Name", "Version"], table_rows)
-            else:
-                ruckformat.tabular(["File", "Name", "Version"], table_rows)
-
-
-class PackageFileListCmd(ruckcommand.RuckCommand):
-
-    def name(self):
-        return "file-list"
-
-    def aliases(self):
-        return ["fl"]
-
-    def arguments(self):
-        return "<package>"
-
-    def is_basic(self):
-        return 1
-
-    def category(self):
-        return "package"
-
-    def description_short(self):
-        return "List files within a package"
-
-    def execute(self, options_dict, non_option_args):
-        if len(non_option_args) != 1:
-            self.usage()
-            return False
-
-        yum = self.yum()
-        pkg = non_option_args[0]
-
-        matches = yum.rpmdb.searchNevra (name=pkg);
-        if not matches:
-            yum.doSackFilelistPopulate()
-            matches = yum.pkgSack.searchNevra (name=pkg);
-            if not matches:
-                rucktalk.message("--- No package found ---")
-
-        for p in matches:
-            files = None
-
-            # FIXME: returnFileEntries() is always empty for installed
-            # packages
-            if p.repoid == 'installed':
-                files = p.returnSimple('filenames');
-            else:
-                files = p.returnFileEntries();
-
-            if not files:
-                rucktalk.message("--- No files available ---")
-
-            files.sort(lambda x,y:cmp(x,y))
-            for file in files:
-                rucktalk.message(file)
-
-
-### Dep commands ###
-
-class PackageDepCmd(PackageCmd):
-
-    def category(self):
-        return "package"
-
-    def arguments(self):
-        return "<package-dep> ..."
-
-    def is_basic(self):
-        return 1
-
-    def local_opt_table(self):
-        return [["i", "installed-only", "", "Show only installed packages"],
-                ["u", "uninstalled-only", "", "Show only uninstalled packages"]]
-
-    def check_relation(self, di, pkg):
-        que_rel = di["relation"]
-        eq_list = ['=', '<=', '>=']
-        rel_map = {"EQ":"=", "LT":"<", "LE":"<=", "GT":">", "GE":">="}
-
-        for (n, f, (e, v, r)) in pkg.returnPrco(self.dep_type()):
-            if di["dep"] != n:
-                continue
-
-            # match anything if the package dep doesn't have a relation
-            if not f:
-                return True
-
-            pkg_rel = rel_map[f]
-            result = rpmUtils.miscutils.compareEVR((di["epoch"], di["version"], di["release"]),\
-                                                   (e, v, r))
-
-            if result < 0:
-                if que_rel in ['!=', '>', '>=']:
-                    return True
-            elif result > 0:
-                if que_rel in ['!=', '<', '<=']:
-                    return True
-            elif result == 0:
-                if que_rel in eq_list and pkg_rel in eq_list:
-                    return True
-
-        return False
-
-    def execute(self, options_dict, non_option_args):
-        if len(non_option_args) < 1:
-            self.usage()
-            return False
-
-        table_rows = []
-        yum = self.yum()
-
-        for dep in non_option_args:
-            dep_info = self.parse_dep_str(dep)
-
-            matches = []
-            if not options_dict.has_key('installed-only'):
-                matches = self.dep_search_uninstalled (dep_info["dep"]);
-
-            if not options_dict.has_key('uninstalled-only'):
-                matches += self.dep_search_installed (dep_info["dep"]);
-
-            if dep_info.has_key("relation"):
-                matches = [p for p in matches if self.check_relation (dep_info, p)]
-
-            if not matches:
-                rucktalk.message("--- No matches for %s ---" % dep)
-                continue
-
-            for pkg in matches:
-                row = ruckformat.package_to_row(yum, pkg, False, ["name", "version"])
-
-                repo = pkg.repoid
-                if yum.rpmdb.installed(name=pkg.name, arch=pkg.arch):
-                    repo = "installed"
-
-                row.insert(0, repo)
-                table_rows.append (row)
-
-        if len(table_rows):
-            ruckformat.tabular(["Repository", "Name", "Version"], table_rows)
-
-
-class WhatProvidesCmd(PackageDepCmd):
-
-    def name(self):
-        return "what-provides"
-
-    def aliases(self):
-        return ["wp"]
-
-    def description_short(self):
-        return "List packages that provide what you specify"
-
-    def dep_search_installed(self, name):
-        yum = self.yum()
-        return yum.rpmdb.searchProvides(name)
-
-    def dep_search_uninstalled(self, name):
-        yum = self.yum()
-        return yum.pkgSack.searchProvides(name)
-
-    def dep_type(self):
-        return "provides"
-
-
-class WhatRequiresCmd(PackageDepCmd):
-
-    def name(self):
-        return "what-requires"
-
-    def aliases(self):
-        return ["wr"]
-
-    def category(self):
-        return "package"
-
-    def description_short(self):
-        return "List packages that require what you specify"
-
-    def dep_search_installed(self, name):
-        yum = self.yum()
-        return yum.rpmdb.searchRequires(name)
-
-    def dep_search_uninstalled(self, name):
-        yum = self.yum()
-        return yum.pkgSack.searchRequires(name)
-
-    def dep_type(self):
-        return "requires"
-
-class WhatConflictsCmd(PackageDepCmd):
-
-    def name(self):
-        return "what-conflicts"
-
-    def aliases(self):
-        return ["wc"]
-
-    def category(self):
-        return "package"
-
-    def description_short(self):
-        return "List packages that conflict with what you specify"
-
-    def dep_search_installed(self, name):
-        yum = self.yum()
-        return yum.rpmdb.searchConflicts(name)
-
-    def dep_search_uninstalled(self, name):
-        yum = self.yum()
-        return yum.pkgSack.searchConflicts(name)
-
-    def dep_type(self):
-        return "conflicts"
-
-class PackageInfoBaseCmd(PackageCmd):
-
-    def category(self):
-        return "package"
-
-    def arguments(self):
-        return "<package> ..."
-
-    def is_basic(self):
-        return 1
-
-    def local_opt_table(self):
-        return [["i", "installed-only", "", "Show only installed packages"],
-                ["u", "uninstalled-only", "", "Show only uninstalled packages"]]
-
-
-    def execute(self, options_dict, non_option_args):
-        if len(non_option_args) < 1 or (options_dict.has_key('uninstalled-only') and options_dict.has_key('installed-only')):
-            self.usage()
-            return False
-
-        table_rows = []
-        yum = self.yum()
-        dtype = self.dep_type();
-
-        plist = []
-        unmatched1 = None
-        unmatched2 = None
-
-        if not options_dict.has_key('uninstalled-only'):
-            exactmatches, matches, unmatched1 = self.find_packages (non_option_args, installed=True)
-            plist = exactmatches + matches
-
-        if not options_dict.has_key('installed-only'):
-            exactmatches, matches, unmatched2 = self.find_packages (non_option_args, installed=False)
-            plist += exactmatches
-            plist += matches
-
-        if (unmatched1 is None or len(unmatched1) > 0) and (unmatched2 is None or len(unmatched2)) > 0:
-            if unmatched1 != None:
-                arg = unmatched1[0]
-            else:
-                arg = unmatched2[0]
-
-            rucktalk.error("Could not find package '%s'" % arg)
-            return False
-
-        for p in plist:
-            rucktalk.message("--- %s ---" % ruckformat.package_to_str(p))
-            deps = p.returnPrco(dtype)
-
-            if len(deps) == 0:
-                rucktalk.message("\nNo %s found\n" % dtype)
-            else:
-                for dep in deps:
-                    #FIXME: piece of crap prcoPrintable sometimes chokes
-                    try:
-                        rucktalk.message(p.prcoPrintable(dep))
-                    except:
-                        pass
-                rucktalk.message('')
-
-
-class PackageInfoProvidesCmd(PackageInfoBaseCmd):
-
-    def name(self):
-        return "info-provides"
-
-    def aliases(self):
-        return ["ip"]
-
-    def description_short(self):
-        return "List a package's provides"
-
-    def dep_type(self):
-        return "provides"
-
-
-class PackageInfoRequiresCmd(PackageInfoBaseCmd):
-
-    def name(self):
-        return "info-requires"
-
-    def aliases(self):
-        return ["ir"]
-
-    def description_short(self):
-        return "List a package's requires"
-
-    def dep_type(self):
-        return "requires"
-
-class PackageInfoConflictsCmd(PackageInfoBaseCmd):
-
-    def name(self):
-        return "info-conflicts"
-
-    def aliases(self):
-        return ["ic"]
-
-    def description_short(self):
-        return "List a package's conflicts"
-
-    def dep_type(self):
-        return "conflicts"
-
-class PackageInfoObsoletesCmd(PackageInfoBaseCmd):
-
-    def name(self):
-        return "info-obsoletes"
-
-    def aliases(self):
-        return ["io"]
-
-    def description_short(self):
-        return "List a package's obsoletes"
-
-    def dep_type(self):
-        return "obsoletes"
-
-class LockListCmd(PackageCmd):
-
-    def name(self):
-        return "lock-list"
-
-    def is_basic(self):
-        return 1
-
-    def aliases(self):
-        return ["ll"]
-
-    def description_short(self):
-        return "List locks"
-
-    def category(self):
-        return "package"
-
-    def execute(self, options_dict, non_option_args):
-        yum = self.yum()
-
-        table_rows = []
-
-        locks = rucklocks.get_locks()
-
-        i = 1
-        for (repo, lock) in locks:
-            if repo is None:
-                repo = ''
-
-            table_rows.append((str(i), repo, lock))
-            i += 1
-
-        if len(table_rows):
-            ruckformat.tabular(["#", "Repository", "Lock"], table_rows)
-        else:
-            rucktalk.message("--- No locks found ---")
-
-class LockAddCmd(PackageCmd):
-
-    def name(self):
-        return "lock-add"
-
-    def is_basic(self):
-        return 1
-
-    def aliases(self):
-        return ["la"]
-
-    def description_short(self):
-        return "Add a lock"
-
-    def category(self):
-        return "package"
-
-    def local_opt_table(self):
-        return [["r",  "repo", "repo", "Lock only the given repo"]]
-
-    def execute(self, options_dict, non_option_args):
-        if len(non_option_args) != 1:
-            self.usage()
-            return False
-
-        repo = None
-        if options_dict.has_key('repo'):
-            repo = options_dict['repo']
-
-        rucklocks.add_lock(non_option_args[0], repo=repo)
-        rucktalk.message("--- Lock successfully added ---")
-
-
-class LockRemoveCmd(PackageCmd):
-
-    def name(self):
-        return "lock-remove"
-
-    def is_basic(self):
-        return 1
-
-    def aliases(self):
-        return ["lr"]
-
-    def description_short(self):
-        return "Remove a lock"
-
-    def category(self):
-        return "package"
-
-    def execute(self, options_dict, non_option_args):
-        if len(non_option_args) != 1:
-            self.usage()
-            return False
-
-        locks = rucklocks.get_locks()
-        i = int(non_option_args[0]) - 1
-
-        if i >= len(locks):
-            rucktalk.error("Invalid lock %s" % str(i + 1))
-            return False
-
-        rucklocks.remove_lock(i)
-        rucktalk.message("--- Lock successfully removed ---")
-
-
-class OrphansCmd(PackageCmd):
-
-    def name(self):
-        return "orphans"
-
-    def is_basic(self):
-        return 1
-
-    def aliases(self):
-        return ["or"]
-
-    def description_short(self):
-        return "List installed packages that don't exist in repositories"
-
-    def category(self):
-        return "package"
-
-    def execute(self, options_dict, non_option_args):
-        if len(non_option_args) != 0:
-            self.usage()
-            return False
-
-        table_headers = ["Name", "Version"]
-        table_keys = ["name", "version"]
-        table_rows = []
-
-        no_abbrev = options_dict.has_key("no-abbrev")
-
-        yum = self.yum()
-
-        for installed in yum.rpmdb.returnPackages():
-            matches = yum.pkgSack.searchNevra(name=installed.name)
-
-            if len(matches) == 0:
-                table_rows.append(ruckformat.package_to_row(yum, installed, no_abbrev, table_keys))
-
-        if len(table_rows) > 0:
-            ruckformat.tabular(table_headers, table_rows)
-        else:
-            rucktalk.message('--- No orphans found ---')
-
-if not vars().has_key('registered'):
-#    ruckcommand.register(PackageFileCmd)
-    ruckcommand.register(PackagesCmd)
-    ruckcommand.register(PackageSearchCmd)
-    ruckcommand.register(PackageListUpdatesCmd)
-    ruckcommand.register(PackageInfoCmd)
-#    ruckcommand.register(WhatProvidesCmd)
-#    ruckcommand.register(WhatRequiresCmd)
-#    ruckcommand.register(WhatConflictsCmd)
-#    ruckcommand.register(PackageInfoProvidesCmd)
-#    ruckcommand.register(PackageInfoRequiresCmd)
-#    ruckcommand.register(PackageInfoConflictsCmd)
-#    ruckcommand.register(PackageInfoObsoletesCmd)
-#    ruckcommand.register(PackageFileListCmd)
-#    ruckcommand.register(LockListCmd)
-#    ruckcommand.register(LockAddCmd)
-#    ruckcommand.register(LockRemoveCmd)
-#    ruckcommand.register(OrphansCmd)
-#    ruckcommand.register(PackageUpdatesSummaryCmd)
-    registered = True
diff --git a/contrib/ruck/src/rucktalk.py b/contrib/ruck/src/rucktalk.py
deleted file mode 100644
index 5e4939a..0000000
--- a/contrib/ruck/src/rucktalk.py
+++ /dev/null
@@ -1,81 +0,0 @@
-###
-### Copyright 2002 Ximian, Inc.
-### Copyright 2008 Aidan Skinner <aidan at skinner.me.uk>
-###
-### This program is free software; you can redistribute it and/or modify
-### it under the terms of the GNU General Public License, version 2,
-### as published by the Free Software Foundation.
-###
-### 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
-###
-
-import sys
-import os
-import stat
-
-show_messages = 1
-show_verbose  = 0
-show_warnings = 1
-show_errors   = 1
-show_debug    = 0
-be_terse      = 0
-
-# Check to see if stdout has been redirected to a file.
-stdout_is_file = 0
-if stat.S_ISREG(os.fstat(sys.stdout.fileno())[stat.ST_MODE]):
-    stdout_is_file = 1
-
-def message(str):
-    if show_messages:
-        print str
-
-esc = ""
-
-def message_status(str):
-    if show_messages and not be_terse:
-        # If we've redirected to a file, don't print escape characters
-        if stdout_is_file:
-            print str
-        else:
-            print esc + "[1G" + str + esc + "[0K",
-            sys.stdout.flush()
-
-def message_finished(str, force_output=0):
-    if show_messages and (force_output or not be_terse):
-        # If we've redirected to a file, don't print escape characters
-        if stdout_is_file:
-            print str
-        else:
-            print esc + "[1G" + str + esc + "[0K"
-
-def verbose(str):
-    if show_verbose:
-        print str
-
-def warning(str):
-    if show_warnings:
-        print "Warning: " + str
-
-def error(str):
-    if show_errors:
-        print "ERROR: " + str
-
-def fatal(str):
-    error(str)
-    sys.exit(1)
-
-def debug(str):
-    if show_debug:
-        print "DEBUG: " + str
-
-def prompt(str):
-    sys.stdout.write(str + " ")
-    sys.stdout.flush()
-    return raw_input()
diff --git a/contrib/ruck/src/rucktransactcmds.py b/contrib/ruck/src/rucktransactcmds.py
deleted file mode 100644
index 9ac2c76..0000000
--- a/contrib/ruck/src/rucktransactcmds.py
+++ /dev/null
@@ -1,244 +0,0 @@
-###
-### Copyright 2002 Ximian, Inc.
-### Copyright 2008 Aidan Skinner <aidan at skinner.me.uk>
-###
-### This program is free software; you can redistribute it and/or modify
-### it under the terms of the GNU General Public License, version 2,
-### as published by the Free Software Foundation.
-###
-### 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
-###
-
-import sys
-import os
-import os.path
-import glob
-from ConfigParser import ConfigParser
-import string
-import rucktalk
-import ruckformat
-import ruckcommand
-import ruckpackagecmds
-
-class TransactCmd(ruckpackagecmds.PackageCmd):
-    def local_opt_table(self):
-        return [["N",  "dry-run", "", "Perform a dry run"]]
-
-class UpdateCmd(TransactCmd):
-
-    def name(self):
-        return "update"
-
-    def aliases(self):
-        return ["up"]
-
-    def is_basic(self):
-        return 1
-
-    def category(self):
-        return "package"
-
-    def arguments(self):
-        # TODO: this should optionally call UpdatePackages with a list of packages to update
-        return ""
-
-    def description_short(self):
-        return "Perform an update"
-
-    def local_opt_table(self):
-        return []
-
-    def execute(self, options_dict, non_option_args):
-        pkcon = self.pkcon()
-
-        updates = pkcon.get_updates()
-        if (len(updates) == 0):
-            rucktalk.message("--- No updates found ---")
-            exit()
-
-        rucktalk.message("The following packages will be updated:")
-
-        table_keys = ["repo", "name", "version"]
-        table_rows = []
-        for new_pkg in updates:
-            row = ruckformat.package_to_row(new_pkg, False, table_keys)
-            table_rows.append(row)
-
-        table_rows.sort(lambda x,y:cmp(string.lower(x[1]), string.lower(y[1])))
-
-        ruckformat.tabular(["Repository", "Name","Version"],
-                          table_rows)
-        # FIXME: this prompt is horrid
-        resp = rucktalk.prompt("Continue? Y/[N]")
-        if (resp == 'y'):
-            # FIXME: needs to deal with progress better
-            pkcon.update_packages(updates)
-        else:
-            rucktalk.message("Update aborted")
-
-ruckcommand.register(UpdateCmd)
-
-
-class InstallCmd(TransactCmd):
-
-    def name(self):
-        return "install"
-
-    def aliases(self):
-        return ["in"]
-
-    def is_basic(self):
-        return 1
-
-    def category(self):
-        return "package"
-
-    def arguments(self):
-        return "<package> ..."
-
-    def description_short(self):
-        return "Perform an install"
-
-    def local_opt_table(self):
-        return []
-
-    def separate_args(self, args):
-        installs = []
-        removals = []
-
-        for arg in args:
-            if arg.startswith('~'):
-                removals.append(arg[1:])
-            else:
-                installs.append(arg)
-
-        return installs, removals
-
-    def execute(self, options_dict, non_option_args):
-        if len(non_option_args) < 1:
-            self.usage()
-            return 1
-
-        pk = self.pkcon()
-
-        for arg in non_option_args:
-            if os.path.exists(arg):
-                rucktalk.error("This hasn't been implemented yet") # FIXME
-            else:
-                installs, removals = self.separate_args(non_option_args)
-
-                pkids = pk.resolve(installs)
-                if len(pkids) > 0:
-                    pk.install_packages(pkids)
-                else:
-                    rucktalk.error("No packages found")
-                    return 1
-
-                if len(removals) > 0:
-                    pk.remove_packages(removals)
-
-ruckcommand.register(InstallCmd)
-
-
-class RemoveCmd(TransactCmd):
-
-    def name(self):
-        return "remove"
-
-    def aliases(self):
-        return ["rm"]
-
-    def is_basic(self):
-        return 1
-
-    def category(self):
-        return "package"
-
-    def arguments(self):
-        return "<package> ..."
-
-    def description_short(self):
-        return "Perform a removal"
-
-    def execute(self, options_dict, non_option_args):
-        if len(non_option_args) < 1:
-            self.usage()
-            return 1
-
-        yum = self.yum()
-
-        exactmatches, matches, unmatched = self.find_packages(non_option_args, installed=1)
-        if len(unmatched) > 0:
-            rucktalk.error("Could not find package '%s'" % unmatched[0])
-            return False
-
-        plist = exactmatches + matches
-
-        for p in plist:
-            yum.remove(p)
-
-        self.start_transaction(dryrun=options_dict.has_key('dry-run'))
-
-#ruckcommand.register(RemoveCmd)
-
-class PackageSolveDepsCmd(TransactCmd):
-
-    def name(self):
-        return "solvedeps"
-
-    def aliases(self):
-        return ["solve"]
-
-    def is_basic(self):
-        return 0
-
-    def category(self):
-        return "dependency"
-
-    def arguments(self):
-        return "<package-dep>"
-
-    def description_short(self):
-        return "Resolve dependencies for libraries"
-
-    def execute(self, options_dict, non_option_args):
-        if len(non_option_args) < 1:
-            self.usage()
-            return False
-
-        plist = []
-        yum = self.yum()
-
-        for dep in non_option_args:
-            if yum.returnInstalledPackagesByDep (dep):
-                continue
-
-            try:
-                pkg = yum.returnPackageByDep(dep)
-                plist.append(pkg.name)
-            except:
-                rucktalk.error("Unable to satisfy requirement '%s'" % dep)
-                return False
-
-        installs, updates = self.find_available_packages(plist)
-        if not installs and not updates:
-            rucktalk.message("Requirements are already met on the system.");
-            return True
-
-        for i in installs:
-            yum.install(i)
-
-        for u in updates:
-            exactmatches, matches, unmatched = self.find_packages([u.name], installed=True)
-            yum.tsInfo.addUpdate(u, exactmatches[0])
-
-        self.start_transaction(dryrun=options_dict.has_key('dry-run'))
-
-#ruckcommand.register(PackageSolveDepsCmd)
diff --git a/contrib/ruck/src/ruckyum.py b/contrib/ruck/src/ruckyum.py
deleted file mode 100644
index 8fc41bf..0000000
--- a/contrib/ruck/src/ruckyum.py
+++ /dev/null
@@ -1,295 +0,0 @@
-import sys
-import os
-
-import rucktalk
-import ruckformat
-
-import rpm
-from yum.constants import *
-from i18n import _
-
-__yum = None
-init_funcs = []
-
-
-def get_yum(plugins=True, repos=True, cache_only=False):
-    global __yum
-    global init_funcs
-
-    if __yum is None:
-        import yum
-        __yum = yum.YumBase()
-        __yum.logger.disabled = 1
-        __yum.verbose_logger.disabled = 1
-
-        __yum.doConfigSetup(init_plugins=plugins)
-
-        __yum.repos.setProgressBar(RuckMeter())
-        __yum.repos.callback = CacheProgressCallback()
-        __yum.dsCallback = DepSolveProgressCallback()
-
-        if cache_only or not repos:
-            __yum.conf.cache = 1
-
-        __yum.doTsSetup()
-        __yum.doRpmDBSetup()
-
-        if repos:
-            __yum.doRepoSetup()
-            __yum.doSackSetup()
-
-        for func in init_funcs:
-                func()
-
-    return __yum
-
-
-
-
-from urlgrabber.progress import BaseMeter
-class RuckMeter(BaseMeter):
-
-    def __init__(self, fo=sys.stdout):
-        BaseMeter.__init__(self)
-        self.fo = fo
-        self.last_text = None
-
-    def _do_start(self, now=None):
-        if self.text is not None:
-            text = self.text
-        else:
-            text = self.basename
-
-        rucktalk.message(text)
-
-    def _do_update(self, amount_read, now=None):
-        rucktalk.message_status(ruckformat.progress_to_str(self.re.fraction_read() * 100,
-                                                         self.last_amount_read, self.size, self.re.remaining_time(),
-                                                         self.re.elapsed_time()))
-
-
-
-
-    def _do_end(self, amount_read, now=None):
-        rucktalk.message_status(ruckformat.progress_to_str(self.re.fraction_read() * 100,
-                                                         self.last_amount_read, self.size, self.re.remaining_time(),
-                                                         self.re.elapsed_time()))
-
-        self.fo.write('\n\n')
-        self.fo.flush()
-
-class CacheProgressCallback:
-
-    '''
-    The class handles text output callbacks during metadata cache updates.
-    '''
-
-    def __init__(self):
-        self.last_text = None
-
-    def log(self, level, message):
-        pass
-
-    def errorlog(self, level, message):
-        rucktalk.error(message)
-
-    def filelog(self, level, message):
-        pass
-
-    def progressbar(self, current, total, name=None):
-        if current > total:
-            return
-
-        msg = 'Updating metadata'
-        if name != None:
-            msg = "Updating repository: %s" % name
-
-        if msg != self.last_text:
-            rucktalk.message_finished(msg)
-            self.last_text = msg
-
-        rucktalk.message_status(ruckformat.progress_to_str(float(current) / float(total) * 100,
-                                                         -1, -1, -1, -1))
-        if current == total:
-            rucktalk.message('\n')
-            self.last_text = None
-
-class RPMInstallCallback:
-    def __init__(self, output=1):
-        self.output = output
-        self.callbackfilehandles = {}
-        self.total_actions = 0
-        self.total_installed = 0
-        self.installed_pkg_names = []
-        self.total_removed = 0
-        self.last_message = None
-
-        self.myprocess = { TS_UPDATE : 'Updating',
-                           TS_ERASE: 'Erasing',
-                           TS_INSTALL: 'Installing',
-                           TS_TRUEINSTALL : 'Installing',
-                           TS_OBSOLETED: 'Obsoleted',
-                           TS_OBSOLETING: 'Installing'}
-        self.mypostprocess = { TS_UPDATE: 'Updated',
-                               TS_ERASE: 'Erased',
-                               TS_INSTALL: 'Installed',
-                               TS_TRUEINSTALL: 'Installed',
-                               TS_OBSOLETED: 'Obsoleted',
-                               TS_OBSOLETING: 'Installed'}
-
-        self.tsInfo = None # this needs to be set for anything else to work
-
-    def _dopkgtup(self, hdr):
-        tmpepoch = hdr['epoch']
-        if tmpepoch is None: epoch = '0'
-        else: epoch = str(tmpepoch)
-
-        return (hdr['name'], hdr['arch'], epoch, hdr['version'], hdr['release'])
-
-    def _makeHandle(self, hdr):
-        handle = '%s:%s.%s-%s-%s' % (hdr['epoch'], hdr['name'], hdr['version'],
-          hdr['release'], hdr['arch'])
-
-        return handle
-
-    def _localprint(self, msg):
-        if self.output:
-            rucktalk.message(msg)
-
-    def show_progress(self, percent, process, name):
-        msg = "(%s/%s) %s: %s" % (self.total_installed + self.total_removed, self.total_actions, process, name)
-        rucktalk.message_status(ruckformat.progress_to_str(percent, -1, -1, -1, -1, text=msg))
-
-    def callback(self, what, bytes, total, h, user):
-        if what == rpm.RPMCALLBACK_TRANS_START:
-            if bytes == 6:
-                self.total_actions = total
-
-        elif what == rpm.RPMCALLBACK_TRANS_PROGRESS:
-            pass
-
-        elif what == rpm.RPMCALLBACK_TRANS_STOP:
-            pass
-
-        elif what == rpm.RPMCALLBACK_INST_OPEN_FILE:
-
-            hdr = None
-            if h is not None:
-                hdr, rpmloc = h
-                handle = self._makeHandle(hdr)
-                fd = os.open(rpmloc, os.O_RDONLY)
-                self.callbackfilehandles[handle]=fd
-                self.total_installed += 1
-                self.installed_pkg_names.append(hdr['name'])
-                return fd
-            else:
-                self._localprint("No header - huh?")
-
-        elif what == rpm.RPMCALLBACK_INST_CLOSE_FILE:
-            hdr = None
-            if h is not None:
-                hdr, rpmloc = h
-                handle = self._makeHandle(hdr)
-                os.close(self.callbackfilehandles[handle])
-                fd = 0
-
-                if self.output:
-                    rucktalk.message('')
-
-        elif what == rpm.RPMCALLBACK_INST_PROGRESS:
-            if h is not None:
-                # If h is a string, we're repackaging.
-                # Why the RPMCALLBACK_REPACKAGE_PROGRESS flag isn't set, I have no idea
-                if type(h) == type(""):
-                    if total == 0:
-                        percent = 0
-                    else:
-                        percent = (bytes*100L)/total
-                    if self.output and sys.stdout.isatty():
-                        self.show_progress(percent, 'Repackage', h)
-
-                        if bytes == total:
-                            sys.stdout.write('\n')
-                            sys.stdout.flush()
-                else:
-                    hdr, rpmloc = h
-                    if total == 0:
-                        percent = 0
-                    else:
-                        percent = (bytes*100L)/total
-                    pkgtup = self._dopkgtup(hdr)
-
-                    txmbrs = self.tsInfo.getMembers(pkgtup=pkgtup)
-                    for txmbr in txmbrs:
-                        try:
-                            process = self.myprocess[txmbr.output_state]
-                        except KeyError, e:
-                            rucktalk.message("Error: invalid output state: %s for %s" % \
-                                            (txmbr.output_state, hdr['name']))
-                        else:
-                            if self.output and (sys.stdout.isatty() or bytes == total):
-                                self.show_progress(percent, process, hdr['name'])
-
-
-        elif what == rpm.RPMCALLBACK_UNINST_START:
-            pass
-
-        elif what == rpm.RPMCALLBACK_UNINST_PROGRESS:
-            pass
-
-        elif what == rpm.RPMCALLBACK_UNINST_STOP:
-            self.total_removed += 1
-
-            if self.output and sys.stdout.isatty():
-                if h not in self.installed_pkg_names:
-                    process = "Removing"
-                else:
-                    process = "Cleanup"
-                percent = 100
-
-                self.show_progress(percent, process, h)
-                rucktalk.message('')
-
-        elif what == rpm.RPMCALLBACK_REPACKAGE_START:
-            pass
-        elif what == rpm.RPMCALLBACK_REPACKAGE_STOP:
-            pass
-        elif what == rpm.RPMCALLBACK_REPACKAGE_PROGRESS:
-            pass
-
-
-class DepSolveProgressCallback:
-    """provides text output callback functions for Dependency Solver callback"""
-
-    def __init__(self):
-        self.loops = 0
-
-    def pkgAdded(self, pkgtup, mode):
-        pass
-
-    def start(self):
-        self.loops += 1
-
-    def tscheck(self):
-        pass
-
-    def restartLoop(self):
-        pass
-
-    def end(self):
-        pass
-
-    def procReq(self, name, formatted_req):
-        pass
-
-    def unresolved(self, msg):
-        pass
-
-    def procConflict(self, name, confname):
-        pass
-
-    def transactionPopulation(self):
-        pass
-
-    def downloadHeader(self, name):
-        rucktalk.message("Downloading header for '%s'" % name)
commit 0ee5ef732cb1dae802ceb69ea461ff8e3728e45d
Author: Warren Turkal <wt at penguintechs.org>
Date:   Mon Apr 12 19:46:34 2010 +0100

    apt: Fix a spelling error in the config file prompt message
    
    Signed-off-by: Richard Hughes <richard at hughsie.com>

diff --git a/backends/apt/aptBackend.py b/backends/apt/aptBackend.py
index b238df6..efd508d 100755
--- a/backends/apt/aptBackend.py
+++ b/backends/apt/aptBackend.py
@@ -470,7 +470,7 @@ class PackageKitInstallProgress(apt.progress.InstallProgress):
         if self.conffile_prompts:
             self._backend.message(MESSAGE_CONFIG_FILES_CHANGED, 
                                   "The following conffile prompts were found "
-                                  "and need investiagtion: %s" % \
+                                  "and need investigation: %s" % \
                                   "\n".join(self.conffile_prompts))
         # Check for required restarts
         if os.path.exists("/var/run/reboot-required") and \


More information about the PackageKit-commit mailing list