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

Richard Hughes hughsient at kemper.freedesktop.org
Tue Jun 24 02:57:49 PDT 2008


 backends/alpm/pk-backend-alpm.c               |    4 
 backends/apt.deprecated/pk-backend-apt.c      |    6 
 backends/apt/aptDBUSBackend.py                |    2 
 backends/apt/pk-backend-apt.c                 |    4 
 backends/box/pk-backend-box.c                 |   16 
 backends/conary/pk-backend-conary.c           |    8 
 backends/dummy/pk-backend-dummy.c             |   18 
 backends/opkg/pk-backend-opkg.c               |    6 
 backends/pisi/pk-backend-pisi.c               |   10 
 backends/poldek/pk-backend-poldek.c           |   22 
 backends/smart/pk-backend-smart.c             |    8 
 backends/test/pk-backend-test-fail.c          |   14 
 backends/test/pk-backend-test-succeed.c       |   12 
 backends/urpmi/pk-backend-urpmi.c             |   12 
 backends/yum/helpers/get-depends.py           |    2 
 backends/yum/helpers/get-details.py           |    2 
 backends/yum/helpers/get-files.py             |    2 
 backends/yum/helpers/get-requires.py          |    2 
 backends/yum/helpers/get-update-detail.py     |    2 
 backends/yum/helpers/resolve.py               |    2 
 backends/yum/helpers/yumBackend.py            |  199 +-
 backends/yum/pk-backend-yum.c                 |   43 
 backends/yum2/pk-backend-yum2.c               |   24 
 backends/zypp/pk-backend-zypp.cpp             |   24 
 client/pk-console.c                           |   86 -
 client/pk-import-specspo.c                    |    6 
 configure.ac                                  |    9 
 contrib/PackageKit.spec.in                    |    6 
 data/Makefile.am                              |    4 
 dev/null                                      |binary
 docs/Makefile.am                              |    1 
 docs/api/Makefile.am                          |   19 
 docs/api/PackageKit-docs.sgml                 |   83 +
 docs/api/dbus/.gitignore                      |    2 
 docs/api/dbus/Makefile.am                     |   21 
 docs/api/dbus/dbus-introspect-docs.dtd        |   32 
 docs/api/dbus/spec-to-docbook.xsl             |  436 +++++
 docs/api/spec/.gitignore                      |    2 
 docs/api/spec/pk-backend-compiled.xml         |   25 
 docs/api/spec/pk-backend-dbus.xml             |   33 
 docs/api/spec/pk-backend-spawn.xml            |  236 +++
 docs/api/spec/pk-concepts.xml                 |  820 +++++++++++
 docs/api/spec/pk-developer-faq.xml            |   70 
 docs/api/spec/pk-faq-error-code.png           |binary
 docs/api/spec/pk-faq-status.png               |binary
 docs/api/spec/pk-introduction.xml             |  100 +
 docs/api/spec/pk-structure.png                |binary
 docs/api/spec/pk-structure.svg                |  502 ++++++
 docs/api/spec/pk-transactions-failure.png     |binary
 docs/api/spec/pk-transactions-sig-install.png |binary
 docs/api/spec/pk-transactions-success.png     |binary
 docs/api/spec/pk-transactions-trusted.png     |binary
 docs/api/spec/pk-transactions.svg             | 1275 +++++++++++++++++
 docs/html/pk-download.html                    |    2 
 docs/html/pk-faq.html                         |    4 
 docs/html/pk-help.html                        |    2 
 docs/html/upload.sh                           |    2 
 docs/spec/.gitignore                          |    2 
 docs/spec/Makefile.am                         |   49 
 docs/spec/config.xsl                          |   10 
 docs/spec/docbook.css                         |   50 
 docs/spec/pk-backend-compiled.xml             |   25 
 docs/spec/pk-backend-dbus.xml                 |   33 
 docs/spec/pk-backend-spawn.xml                |  236 ---
 docs/spec/pk-concepts.xml                     |  752 ----------
 docs/spec/pk-developer-faq.xml                |   70 
 docs/spec/pk-introduction.xml                 |  100 -
 docs/spec/pk-methods.xml                      |  995 -------------
 docs/spec/pk-reference.xml                    |   42 
 docs/spec/pk-signals.xml                      |  523 -------
 docs/spec/pk-structure.svg                    |  502 ------
 docs/spec/pk-transactions.svg                 | 1275 -----------------
 libpackagekit/pk-catalog.c                    |    6 
 libpackagekit/pk-client.c                     |  202 --
 libpackagekit/pk-client.h                     |   26 
 libpackagekit/pk-package-ids.c                |   21 
 libpackagekit/pk-package-ids.h                |    1 
 libpackagekit/pk-package-list.c               |   32 
 libpackagekit/pk-package-list.h               |    4 
 python/packagekit/backend.py                  |   44 
 python/packagekit/daemonBackend.py            |  289 +--
 src/pk-backend-dbus.c                         |   36 
 src/pk-backend-dbus.h                         |   12 
 src/pk-backend.h                              |   14 
 src/pk-interface-transaction.xml              | 1938 ++++++++++++++++++++++++--
 src/pk-interface.xml                          |  333 ++++
 src/pk-main.c                                 |    2 
 src/pk-transaction.c                          |  186 +-
 src/pk-transaction.h                          |   12 
 89 files changed, 6526 insertions(+), 5518 deletions(-)

New commits:
commit f0df33939488e4945034da69cef4bd7adac77211
Merge: 47fc8ac... 3d88ab0...
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Jun 24 10:34:14 2008 +0100

    Merge branch 'master' of git+ssh://hughsie@git.packagekit.org/srv/git/PackageKit

commit 3d88ab0c54bc7264848bc9fb3a47a208feeeaa78
Author: Martin Pitt <martin.pitt at ubuntu.com>
Date:   Tue Jun 24 11:02:49 2008 +0200

    Fix building with -Wformat-security. -- fd#16431

diff --git a/src/pk-main.c b/src/pk-main.c
index aa4e5c8..7b0858c 100644
--- a/src/pk-main.c
+++ b/src/pk-main.c
@@ -85,7 +85,7 @@ pk_object_register (DBusGConnection *connection, GObject *object, GError **error
 					   _("The correct user is not launching the executable (usually root)"),
 					   _("The org.freedesktop.PackageKit.conf file is not "
 					     "installed in the system /etc/dbus-1/system.d directory"));
-		g_set_error (error, PK_ENGINE_ERROR, PK_ENGINE_ERROR_DENIED, message);
+		g_set_error (error, PK_ENGINE_ERROR, PK_ENGINE_ERROR_DENIED, "%s", message);
 		g_free (message);
 		return FALSE;
 	}
commit 47fc8accfa84f620611dbdbdd4c5ba84b83da368
Author: Richard Hughes <richard at hughsie.com>
Date:   Mon Jun 23 18:51:19 2008 +0100

    yum: fix up GetRequires and GetDepends logic to do the filtering in the backend when we pass multiple package_ids

diff --git a/backends/yum/helpers/yumBackend.py b/backends/yum/helpers/yumBackend.py
index a72dddd..cbcb90d 100644
--- a/backends/yum/helpers/yumBackend.py
+++ b/backends/yum/helpers/yumBackend.py
@@ -695,11 +695,19 @@ class PackageKitYumBackend(PackageKitBaseBackend):
         self.allow_cancel(True)
         self.percentage(None)
         self.status(STATUS_INFO)
+
+        percentage = 0;
+        bump = 100 / len(package_ids)
+        deps_list = []
+        resolve_list = []
+
         for package in package_ids:
+            self.percentage(percentage)
             pkg,inst = self._findPackage(package)
             # FIXME: This is a hack, it simulates a removal of the
             # package and return the transaction
             if inst and pkg:
+                resolve_list.append(pkg)
                 txmbrs = self.yumbase.remove(po=pkg)
                 if txmbrs:
                     rc,msgs =  self.yumbase.buildTransaction()
@@ -707,8 +715,20 @@ class PackageKitYumBackend(PackageKitBaseBackend):
                         self.error(ERROR_DEP_RESOLUTION_FAILED,self._format_msgs(msgs))
                     else:
                         for txmbr in self.yumbase.tsInfo:
-                            if txmbr.po.name != pkg.name:
-                                self._show_package(txmbr.po,INFO_INSTALLED)
+                            if pkg not in deps_list:
+                                deps_list.append(txmbr.po)
+            percentage += bump
+
+        # remove any of the original names
+        for pkg in resolve_list:
+            if pkg in deps_list:
+                deps_list.remove(pkg)
+
+        # each unique name, emit
+        for pkg in deps_list:
+            id = self._pkg_to_id(pkg)
+            self.package(id,INFO_INSTALLED,pkg.summary)
+        self.percentage(100)
 
     def _is_inst(self,pkg):
         # search only for requested arch
@@ -810,24 +830,43 @@ class PackageKitYumBackend(PackageKitBaseBackend):
 
         fltlist = filters.split(';')
 
+        percentage = 0;
+        bump = 100 / len(package_ids)
+        deps_list = []
+        resolve_list = []
+
         for package in package_ids:
+            self.percentage(percentage)
             name = package.split(';')[0]
             pkg,inst = self._findPackage(package)
             results = {}
             if pkg:
+                resolve_list.append(pkg)
                 deps = self._get_best_dependencies(pkg)
+                # if not present, add
+                for pkg in deps:
+                    if pkg not in deps_list:
+                        deps_list.append(pkg)
             else:
                 self.error(ERROR_PACKAGE_NOT_FOUND,'Package %s was not found' % package)
-            for pkg in deps:
-                if pkg.name != name:
-                    pkgver = self._get_package_ver(pkg)
-                    id = self.get_package_id(pkg.name,pkgver,pkg.arch,pkg.repoid)
+                break
+            percentage += bump
 
-                    if self._is_inst_arch(pkg) and FILTER_NOT_INSTALLED not in fltlist:
-                        self.package(id,INFO_INSTALLED,pkg.summary)
-                    else:
-                        if self._installable(pkg) and FILTER_INSTALLED not in fltlist:
-                            self.package(id,INFO_AVAILABLE,pkg.summary)
+        # remove any of the original names
+        for pkg in resolve_list:
+            if pkg in deps_list:
+                deps_list.remove(pkg)
+
+        # each unique name, emit
+        for pkg in deps_list:
+            id = self._pkg_to_id(pkg)
+
+            if self._is_inst_arch(pkg) and FILTER_NOT_INSTALLED not in fltlist:
+                self.package(id,INFO_INSTALLED,pkg.summary)
+            else:
+                if self._installable(pkg) and FILTER_INSTALLED not in fltlist:
+                    self.package(id,INFO_AVAILABLE,pkg.summary)
+        self.percentage(100)
 
     def update_system(self):
         '''
commit 417fb8e0e4c4fe740a89abedf6d425a6c601ff0b
Author: Richard Hughes <richard at hughsie.com>
Date:   Mon Jun 23 16:41:48 2008 +0100

    provide the new convenience function pk_package_list_to_argv()

diff --git a/libpackagekit/pk-package-list.c b/libpackagekit/pk-package-list.c
index 0614471..fee5ea8 100644
--- a/libpackagekit/pk-package-list.c
+++ b/libpackagekit/pk-package-list.c
@@ -134,10 +134,10 @@ pk_package_list_add_list (PkPackageList *plist, PkPackageList *list)
 }
 
 /**
- * pk_package_list_get_string:
+ * pk_package_list_to_string:
  **/
 gchar *
-pk_package_list_get_string (PkPackageList *plist)
+pk_package_list_to_string (PkPackageList *plist)
 {
 	PkPackageItem *item;
 	guint i;
@@ -164,6 +164,32 @@ pk_package_list_get_string (PkPackageList *plist)
 }
 
 /**
+ * pk_package_list_to_argv:
+ **/
+gchar **
+pk_package_list_to_argv (PkPackageList *plist)
+{
+	PkPackageItem *item;
+	GPtrArray *array;
+	gchar **package_ids;
+	guint length;
+	guint i;
+
+	array = g_ptr_array_new ();
+	length = plist->priv->array->len;
+	for (i=0; i<length; i++) {
+		item = g_ptr_array_index (plist->priv->array, i);
+		g_ptr_array_add (array, item->package_id);
+	}
+
+	/* convert to argv */
+	package_ids = pk_ptr_array_to_argv (array);
+	g_ptr_array_free (array, TRUE);
+
+	return package_ids;
+}
+
+/**
  * pk_package_list_get_size:
  **/
 guint
@@ -485,7 +511,7 @@ libst_package_list (LibSelfTest *test)
 
 	/************************************************************/
 	libst_title (test, "add entry");
-	text = pk_package_list_get_string (plist);
+	text = pk_package_list_to_string (plist);
 	if (pk_strequal (text, "installed\tgnome;1.23;i386;data\tGNOME!")) {
 		libst_success (test, NULL);
 	} else {
diff --git a/libpackagekit/pk-package-list.h b/libpackagekit/pk-package-list.h
index 447bb98..38251b5 100644
--- a/libpackagekit/pk-package-list.h
+++ b/libpackagekit/pk-package-list.h
@@ -67,7 +67,9 @@ gboolean	 pk_package_list_remove			(PkPackageList		*plist,
 							 const gchar		*package_id);
 gboolean	 pk_package_list_contains_item		(PkPackageList		*plist,
 							 PkPackageItem		*item);
-gchar		*pk_package_list_get_string		(PkPackageList		*plist)
+gchar		*pk_package_list_to_string		(PkPackageList		*plist)
+							 G_GNUC_WARN_UNUSED_RESULT;
+gchar		**pk_package_list_to_argv		(PkPackageList		*plist)
 							 G_GNUC_WARN_UNUSED_RESULT;
 guint		 pk_package_list_get_size		(PkPackageList		*plist);
 gboolean	 pk_package_list_sort			(PkPackageList		*plist);
diff --git a/src/pk-transaction.c b/src/pk-transaction.c
index bbc7417..e95281c 100644
--- a/src/pk-transaction.c
+++ b/src/pk-transaction.c
@@ -457,7 +457,7 @@ pk_transaction_finished_cb (PkBackend *backend, PkExitEnum exit, PkTransaction *
 	    transaction->priv->role == PK_ROLE_ENUM_UPDATE_PACKAGES ||
 	    transaction->priv->role == PK_ROLE_ENUM_INSTALL_PACKAGES ||
 	    transaction->priv->role == PK_ROLE_ENUM_REMOVE_PACKAGES) {
-		packages = pk_package_list_get_string (transaction->priv->package_list);
+		packages = pk_package_list_to_string (transaction->priv->package_list);
 		if (pk_strzero (packages) == FALSE) {
 			pk_transaction_db_set_data (transaction->priv->transaction_db, transaction->priv->tid, packages);
 		}
commit ed9f8db26e3585d0c9f55a755f148b8c0d8275f6
Author: Richard Hughes <richard at hughsie.com>
Date:   Mon Jun 23 16:21:19 2008 +0100

    trivial: fix the yum2 backend so that it can compile

diff --git a/backends/yum2/pk-backend-yum2.c b/backends/yum2/pk-backend-yum2.c
index f947105..01a317d 100644
--- a/backends/yum2/pk-backend-yum2.c
+++ b/backends/yum2/pk-backend-yum2.c
@@ -105,7 +105,7 @@ backend_cancel (PkBackend *backend)
 static void
 backend_get_depends (PkBackend *backend, PkFilterEnum filters, gchar **package_ids, gboolean recursive)
 {
-	pk_backend_dbus_get_depends (dbus, filters, package_id, recursive);
+	pk_backend_dbus_get_depends (dbus, filters, package_ids, recursive);
 }
 
 /**
@@ -114,7 +114,7 @@ backend_get_depends (PkBackend *backend, PkFilterEnum filters, gchar **package_i
 static void
 backend_get_details (PkBackend *backend, gchar **package_ids)
 {
-	pk_backend_dbus_get_details (dbus, package_id);
+	pk_backend_dbus_get_details (dbus, package_ids);
 }
 
 /**
@@ -123,7 +123,7 @@ backend_get_details (PkBackend *backend, gchar **package_ids)
 static void
 backend_get_files (PkBackend *backend, gchar **package_ids)
 {
-	pk_backend_dbus_get_files (dbus, package_id);
+	pk_backend_dbus_get_files (dbus, package_ids);
 }
 
 /**
@@ -132,7 +132,7 @@ backend_get_files (PkBackend *backend, gchar **package_ids)
 static void
 backend_get_requires (PkBackend *backend, PkFilterEnum filters, gchar **package_ids, gboolean recursive)
 {
-	pk_backend_dbus_get_requires (dbus, filters, package_id, recursive);
+	pk_backend_dbus_get_requires (dbus, filters, package_ids, recursive);
 }
 
 /**
@@ -150,7 +150,7 @@ backend_get_updates (PkBackend *backend, PkFilterEnum filters)
 static void
 backend_get_update_detail (PkBackend *backend, gchar **package_ids)
 {
-	pk_backend_dbus_get_update_detail (dbus, package_id);
+	pk_backend_dbus_get_update_detail (dbus, package_ids);
 }
 
 /**
@@ -268,9 +268,9 @@ backend_update_system (PkBackend *backend)
  * pk_backend_resolve:
  */
 static void
-backend_resolve (PkBackend *backend, PkFilterEnum filters, gchar **package_ids)
+backend_resolve (PkBackend *backend, PkFilterEnum filters, gchar **packages)
 {
-	pk_backend_dbus_resolve (dbus, filters, package_id);
+	pk_backend_dbus_resolve (dbus, filters, packages);
 }
 
 /**
diff --git a/src/pk-backend-dbus.c b/src/pk-backend-dbus.c
index 8258a93..cf2222e 100644
--- a/src/pk-backend-dbus.c
+++ b/src/pk-backend-dbus.c
@@ -757,7 +757,7 @@ pk_backend_dbus_repo_set_data (PkBackendDbus *backend_dbus, const gchar *rid,
  * pk_backend_dbus_resolve:
  **/
 gboolean
-pk_backend_dbus_resolve (PkBackendDbus *backend_dbus, PkFilterEnum filters, const gchar *package)
+pk_backend_dbus_resolve (PkBackendDbus *backend_dbus, PkFilterEnum filters, gchar **packages)
 {
 	gboolean ret;
 	GError *error = NULL;
@@ -765,14 +765,14 @@ pk_backend_dbus_resolve (PkBackendDbus *backend_dbus, PkFilterEnum filters, cons
 
 	g_return_val_if_fail (PK_IS_BACKEND_DBUS (backend_dbus), FALSE);
 	g_return_val_if_fail (backend_dbus->priv->proxy != NULL, FALSE);
-	g_return_val_if_fail (package != NULL, FALSE);
+	g_return_val_if_fail (packages != NULL, FALSE);
 
 	/* new sync method call */
 	pk_backend_dbus_time_reset (backend_dbus);
 	filters_text = pk_filter_enums_to_text (filters);
 	ret = dbus_g_proxy_call (backend_dbus->priv->proxy, "Resolve", &error,
 				 G_TYPE_STRING, filters_text,
-				 G_TYPE_STRING, package,
+				 G_TYPE_STRV, packages,
 				 G_TYPE_INVALID, G_TYPE_INVALID);
 	if (error != NULL) {
 		pk_warning ("%s", error->message);
@@ -957,7 +957,7 @@ pk_backend_dbus_search_file (PkBackendDbus *backend_dbus, PkFilterEnum filters,
  * pk_backend_dbus_get_depends:
  **/
 gboolean
-pk_backend_dbus_get_depends (PkBackendDbus *backend_dbus, PkFilterEnum filters, const gchar *package_id, gboolean recursive)
+pk_backend_dbus_get_depends (PkBackendDbus *backend_dbus, PkFilterEnum filters, gchar **package_ids, gboolean recursive)
 {
 	gboolean ret;
 	GError *error = NULL;
@@ -965,14 +965,14 @@ pk_backend_dbus_get_depends (PkBackendDbus *backend_dbus, PkFilterEnum filters,
 
 	g_return_val_if_fail (PK_IS_BACKEND_DBUS (backend_dbus), FALSE);
 	g_return_val_if_fail (backend_dbus->priv->proxy != NULL, FALSE);
-	g_return_val_if_fail (package_id != NULL, FALSE);
+	g_return_val_if_fail (package_ids != NULL, FALSE);
 
 	/* new sync method call */
 	pk_backend_dbus_time_reset (backend_dbus);
 	filters_text = pk_filter_enums_to_text (filters);
 	ret = dbus_g_proxy_call (backend_dbus->priv->proxy, "GetDepends", &error,
 				 G_TYPE_STRING, filters_text,
-				 G_TYPE_STRING, package_id,
+				 G_TYPE_STRV, package_ids,
 				 G_TYPE_BOOLEAN, recursive,
 				 G_TYPE_INVALID, G_TYPE_INVALID);
 	if (error != NULL) {
@@ -992,7 +992,7 @@ pk_backend_dbus_get_depends (PkBackendDbus *backend_dbus, PkFilterEnum filters,
  * pk_backend_dbus_get_requires:
  **/
 gboolean
-pk_backend_dbus_get_requires (PkBackendDbus *backend_dbus, PkFilterEnum filters, const gchar *package_id, gboolean recursive)
+pk_backend_dbus_get_requires (PkBackendDbus *backend_dbus, PkFilterEnum filters, gchar **package_ids, gboolean recursive)
 {
 	gboolean ret;
 	GError *error = NULL;
@@ -1000,14 +1000,14 @@ pk_backend_dbus_get_requires (PkBackendDbus *backend_dbus, PkFilterEnum filters,
 
 	g_return_val_if_fail (PK_IS_BACKEND_DBUS (backend_dbus), FALSE);
 	g_return_val_if_fail (backend_dbus->priv->proxy != NULL, FALSE);
-	g_return_val_if_fail (package_id != NULL, FALSE);
+	g_return_val_if_fail (package_ids != NULL, FALSE);
 
 	/* new sync method call */
 	pk_backend_dbus_time_reset (backend_dbus);
 	filters_text = pk_filter_enums_to_text (filters);
 	ret = dbus_g_proxy_call (backend_dbus->priv->proxy, "GetRequires", &error,
 				 G_TYPE_STRING, filters_text,
-				 G_TYPE_STRING, package_id,
+				 G_TYPE_STRV, package_ids,
 				 G_TYPE_BOOLEAN, recursive,
 				 G_TYPE_INVALID, G_TYPE_INVALID);
 	if (error != NULL) {
@@ -1059,19 +1059,19 @@ pk_backend_dbus_get_packages (PkBackendDbus *backend_dbus, PkFilterEnum filters)
  * pk_backend_dbus_get_update_detail:
  **/
 gboolean
-pk_backend_dbus_get_update_detail (PkBackendDbus *backend_dbus, const gchar *package_id)
+pk_backend_dbus_get_update_detail (PkBackendDbus *backend_dbus, gchar **package_ids)
 {
 	gboolean ret;
 	GError *error = NULL;
 
 	g_return_val_if_fail (PK_IS_BACKEND_DBUS (backend_dbus), FALSE);
 	g_return_val_if_fail (backend_dbus->priv->proxy != NULL, FALSE);
-	g_return_val_if_fail (package_id != NULL, FALSE);
+	g_return_val_if_fail (package_ids != NULL, FALSE);
 
 	/* new sync method call */
 	pk_backend_dbus_time_reset (backend_dbus);
 	ret = dbus_g_proxy_call (backend_dbus->priv->proxy, "GetUpdateDetail", &error,
-				 G_TYPE_STRING, package_id,
+				 G_TYPE_STRV, package_ids,
 				 G_TYPE_INVALID, G_TYPE_INVALID);
 	if (error != NULL) {
 		pk_warning ("%s", error->message);
@@ -1089,19 +1089,19 @@ pk_backend_dbus_get_update_detail (PkBackendDbus *backend_dbus, const gchar *pac
  * pk_backend_dbus_get_details:
  **/
 gboolean
-pk_backend_dbus_get_details (PkBackendDbus *backend_dbus, const gchar *package_id)
+pk_backend_dbus_get_details (PkBackendDbus *backend_dbus, gchar **package_ids)
 {
 	gboolean ret;
 	GError *error = NULL;
 
 	g_return_val_if_fail (PK_IS_BACKEND_DBUS (backend_dbus), FALSE);
 	g_return_val_if_fail (backend_dbus->priv->proxy != NULL, FALSE);
-	g_return_val_if_fail (package_id != NULL, FALSE);
+	g_return_val_if_fail (package_ids != NULL, FALSE);
 
 	/* new sync method call */
 	pk_backend_dbus_time_reset (backend_dbus);
 	ret = dbus_g_proxy_call (backend_dbus->priv->proxy, "GetDetails", &error,
-				 G_TYPE_STRING, package_id,
+				 G_TYPE_STRV, package_ids,
 				 G_TYPE_INVALID, G_TYPE_INVALID);
 	if (error != NULL) {
 		pk_warning ("%s", error->message);
@@ -1119,19 +1119,19 @@ pk_backend_dbus_get_details (PkBackendDbus *backend_dbus, const gchar *package_i
  * pk_backend_dbus_get_files:
  **/
 gboolean
-pk_backend_dbus_get_files (PkBackendDbus *backend_dbus, const gchar *package_id)
+pk_backend_dbus_get_files (PkBackendDbus *backend_dbus, gchar **package_ids)
 {
 	gboolean ret;
 	GError *error = NULL;
 
 	g_return_val_if_fail (PK_IS_BACKEND_DBUS (backend_dbus), FALSE);
 	g_return_val_if_fail (backend_dbus->priv->proxy != NULL, FALSE);
-	g_return_val_if_fail (package_id != NULL, FALSE);
+	g_return_val_if_fail (package_ids != NULL, FALSE);
 
 	/* new sync method call */
 	pk_backend_dbus_time_reset (backend_dbus);
 	ret = dbus_g_proxy_call (backend_dbus->priv->proxy, "GetFiles", &error,
-				 G_TYPE_STRING, package_id,
+				 G_TYPE_STRV, package_ids,
 				 G_TYPE_INVALID, G_TYPE_INVALID);
 	if (error != NULL) {
 		pk_warning ("%s", error->message);
diff --git a/src/pk-backend-dbus.h b/src/pk-backend-dbus.h
index 1e8c151..7820890 100644
--- a/src/pk-backend-dbus.h
+++ b/src/pk-backend-dbus.h
@@ -68,7 +68,7 @@ gboolean	 pk_backend_dbus_refresh_cache		(PkBackendDbus	*backend_dbus,
 gboolean	 pk_backend_dbus_update_system		(PkBackendDbus	*backend_dbus);
 gboolean	 pk_backend_dbus_resolve		(PkBackendDbus	*backend_dbus,
 							 PkFilterEnum	 filters,
-							 const gchar	*package);
+							 gchar		**packages);
 gboolean	 pk_backend_dbus_rollback		(PkBackendDbus	*backend_dbus,
 							 const gchar	*transaction_id);
 gboolean	 pk_backend_dbus_search_name		(PkBackendDbus	*backend_dbus,
@@ -87,18 +87,18 @@ gboolean	 pk_backend_dbus_get_packages		(PkBackendDbus	*backend_dbus,
 							 PkFilterEnum	 filters);
 gboolean	 pk_backend_dbus_get_depends		(PkBackendDbus	*backend_dbus,
 							 PkFilterEnum	 filters,
-							 const gchar	*package_id,
+							 gchar		**package_ids,
 							 gboolean	 recursive);
 gboolean	 pk_backend_dbus_get_requires		(PkBackendDbus	*backend_dbus,
 							 PkFilterEnum	 filters,
-							 const gchar	*package_id,
+							 gchar		**package_ids,
 							 gboolean	 recursive);
 gboolean	 pk_backend_dbus_get_update_detail	(PkBackendDbus	*backend_dbus,
-							 const gchar	*package_id);
+							 gchar		**package_ids);
 gboolean	 pk_backend_dbus_get_details		(PkBackendDbus	*backend_dbus,
-							 const gchar	*package_id);
+							 gchar		**package_ids);
 gboolean	 pk_backend_dbus_get_files		(PkBackendDbus	*backend_dbus,
-							 const gchar	*package_id);
+							 gchar		**package_ids);
 gboolean	 pk_backend_dbus_remove_packages	(PkBackendDbus	*backend_dbus,
 							 gchar		**package_ids,
 							 gboolean	 allow_deps,
commit b958277b2f065d3576a1e447ea49578553686251
Author: Richard Hughes <richard at hughsie.com>
Date:   Mon Jun 23 16:14:27 2008 +0100

    post-branch version bump

diff --git a/configure.ac b/configure.ac
index 498e769..6b9678a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,6 +1,6 @@
 AC_PREREQ(2.52)
 
-AC_INIT(PackageKit, 0.2.3)
+AC_INIT(PackageKit, 0.3.0)
 AC_CONFIG_SRCDIR(src)
 AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION)
 AM_CONFIG_HEADER(config.h)
commit 472068c10222999caa06a1ba82abd33a44732e22
Merge: f7e9706... 938d9bf...
Author: Richard Hughes <richard at hughsie.com>
Date:   Mon Jun 23 16:11:46 2008 +0100

    Merge branch 'master' of git+ssh://hughsie@git.packagekit.org/srv/git/PackageKit

commit f7e9706b4d2e9ff2b1bd7c604efb80af31c3bece
Author: Richard Hughes <richard at hughsie.com>
Date:   Mon Jun 23 16:05:23 2008 +0100

    make API changes to GetDetails(), GetFiles(), GetDepends(), GetUpdateDetail and Resolve() - all stable work is in PACKAGEKIT_0_2_X

diff --git a/backends/alpm/pk-backend-alpm.c b/backends/alpm/pk-backend-alpm.c
index 50fc2a8..c6767ed 100644
--- a/backends/alpm/pk-backend-alpm.c
+++ b/backends/alpm/pk-backend-alpm.c
@@ -957,7 +957,7 @@ backend_get_depends (PkBackend *backend, PkFilterEnum filters, const gchar *pack
  * backend_get_details:
  */
 static void
-backend_get_details (PkBackend *backend, const gchar *package_id)
+backend_get_details (PkBackend *backend, gchar **package_ids)
 {
 	pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
 	pk_backend_set_allow_cancel (backend, FALSE);
@@ -993,7 +993,7 @@ backend_get_details (PkBackend *backend, const gchar *package_id)
  * backend_get_files:
  */
 static void
-backend_get_files (PkBackend *backend, const gchar *package_id)
+backend_get_files (PkBackend *backend, gchar **package_ids)
 {
 	pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
 	pk_backend_set_allow_cancel (backend, FALSE);
diff --git a/backends/apt.deprecated/pk-backend-apt.c b/backends/apt.deprecated/pk-backend-apt.c
index f59cd88..2d8addd 100644
--- a/backends/apt.deprecated/pk-backend-apt.c
+++ b/backends/apt.deprecated/pk-backend-apt.c
@@ -100,7 +100,7 @@ pk_backend_bool_to_text (gboolean value)
  * backend_get_depends:
  */
 static void
-backend_get_depends (PkBackend *backend, PkFilterEnum filters, const gchar *package_id, gboolean recursive)
+backend_get_depends (PkBackend *backend, PkFilterEnum filters, gchar **package_ids, gboolean recursive)
 {
 	gchar *filters_text;
 	filters_text = pk_filter_enums_to_text (filters);
@@ -124,7 +124,7 @@ backend_get_updates (PkBackend *backend, PkFilterEnum filters)
  * backend_get_update_detail:
  */
 static void
-backend_get_update_detail (PkBackend *backend, const gchar *package_id)
+backend_get_update_detail (PkBackend *backend, gchar **package_ids)
 {
 	pk_backend_spawn_helper (spawn, "get-update-detail.py", package_id, NULL);
 }
@@ -212,7 +212,7 @@ backend_update_system (PkBackend *backend)
  * pk_backend_resolve:
  */
 static void
-backend_resolve (PkBackend *backend, PkFilterEnum filters, const gchar *package_id)
+backend_resolve (PkBackend *backend, PkFilterEnum filters, gchar **package_ids)
 {
 	gchar *filters_text;
 	filters_text = pk_filter_enums_to_text (filters);
diff --git a/backends/apt/pk-backend-apt.c b/backends/apt/pk-backend-apt.c
index 70836b2..0c5f176 100644
--- a/backends/apt/pk-backend-apt.c
+++ b/backends/apt/pk-backend-apt.c
@@ -135,7 +135,7 @@ backend_remove_packages (PkBackend *backend, gchar **package_ids, gboolean allow
  * backend_get_details:
  *  */
 static void
-backend_get_details (PkBackend *backend, const gchar *package_id)
+backend_get_details (PkBackend *backend, gchar **package_ids)
 {
 	pk_backend_dbus_get_details (dbus, package_id);
 }
@@ -171,7 +171,7 @@ backend_cancel (PkBackend *backend)
  *  * pk_backend_resolve:
  *   */
 static void
-backend_resolve (PkBackend *backend, PkFilterEnum filters, const gchar *package_id)
+backend_resolve (PkBackend *backend, PkFilterEnum filters, gchar **package_ids)
 {
 	        pk_backend_dbus_resolve (dbus, filters, package_id);
 }
diff --git a/backends/box/pk-backend-box.c b/backends/box/pk-backend-box.c
index 9263781..e22d7b1 100644
--- a/backends/box/pk-backend-box.c
+++ b/backends/box/pk-backend-box.c
@@ -204,7 +204,7 @@ backend_install_packages_thread (PkBackend *backend)
 {
 	gboolean result;
 	PkPackageId *pi;
-	const gchar *package_id;
+	gchar **package_ids;
 
 	pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
 
@@ -273,7 +273,7 @@ backend_get_details_thread (PkBackend *backend)
 	PackageSearch *ps;
 	GList *list;
 	sqlite3 *db;
-	const gchar *package_id;
+	gchar **package_ids;
 
 	package_id = pk_backend_get_string (backend, "package_id");
 	db = db_open();
@@ -316,7 +316,7 @@ backend_get_files_thread (PkBackend *backend)
 	PkPackageId *pi;
 	gchar *files;
 	sqlite3 *db;
-	const gchar *package_id;
+	gchar **package_ids;
 
 	db = db_open();
 	package_id = pk_backend_get_string (backend, "package_id");
@@ -349,7 +349,7 @@ backend_get_depends_requires_thread (PkBackend *backend)
 	PkPackageId *pi;
 	GList *list = NULL;
 	sqlite3 *db;
-	const gchar *package_id;
+	gchar **package_ids;
 	int deps_type;
 
 	db = db_open ();
@@ -450,7 +450,7 @@ backend_get_filters (PkBackend *backend)
  * backend_get_depends:
  */
 static void
-backend_get_depends (PkBackend *backend, PkFilterEnum filters, const gchar *package_id, gboolean recursive)
+backend_get_depends (PkBackend *backend, PkFilterEnum filters, gchar **package_ids, gboolean recursive)
 {
 	pk_backend_set_uint (backend, "type", DEPS_TYPE_DEPENDS);
 	pk_backend_thread_create (backend, backend_get_depends_requires_thread);
@@ -460,7 +460,7 @@ backend_get_depends (PkBackend *backend, PkFilterEnum filters, const gchar *pack
  * backend_get_details:
  */
 static void
-backend_get_details (PkBackend *backend, const gchar *package_id)
+backend_get_details (PkBackend *backend, gchar **package_ids)
 {
 	pk_backend_thread_create (backend, backend_get_details_thread);
 }
@@ -469,7 +469,7 @@ backend_get_details (PkBackend *backend, const gchar *package_id)
  * backend_get_files:
  */
 static void
-backend_get_files (PkBackend *backend, const gchar *package_id)
+backend_get_files (PkBackend *backend, gchar **package_ids)
 {
 	pk_backend_thread_create (backend, backend_get_files_thread);
 }
@@ -478,7 +478,7 @@ backend_get_files (PkBackend *backend, const gchar *package_id)
  * backend_get_requires:
  */
 static void
-backend_get_requires (PkBackend *backend, PkFilterEnum filters, const gchar *package_id, gboolean recursive)
+backend_get_requires (PkBackend *backend, PkFilterEnum filters, gchar **package_ids, gboolean recursive)
 {
 	pk_backend_set_uint (backend, "type", DEPS_TYPE_REQUIRES);
 	pk_backend_thread_create (backend, backend_get_depends_requires_thread);
diff --git a/backends/conary/pk-backend-conary.c b/backends/conary/pk-backend-conary.c
index df08b1c..b8da8a9 100644
--- a/backends/conary/pk-backend-conary.c
+++ b/backends/conary/pk-backend-conary.c
@@ -104,7 +104,7 @@ backend_cancel (PkBackend *backend)
  * backend_get_details:
  */
 static void
-backend_get_details (PkBackend *backend, const gchar *package_id)
+backend_get_details (PkBackend *backend, gchar **package_ids)
 {
 	pk_backend_spawn_helper (spawn, "get-details.py", package_id, NULL);
 }
@@ -113,7 +113,7 @@ backend_get_details (PkBackend *backend, const gchar *package_id)
  * backend_get_files:
  */
 static void
-backend_get_files (PkBackend *backend, const gchar *package_id)
+backend_get_files (PkBackend *backend, gchar **package_ids)
 {
 	pk_backend_spawn_helper (spawn, "get-files.py", package_id, NULL);
 }
@@ -134,7 +134,7 @@ backend_get_updates (PkBackend *backend, PkFilterEnum filters)
  * backend_get_update_detail:
  */
 static void
-backend_get_update_detail (PkBackend *backend, const gchar *package_id)
+backend_get_update_detail (PkBackend *backend, gchar **package_ids)
 {
 	pk_backend_spawn_helper (spawn, "get-update-detail.py", package_id, NULL);
 }
@@ -252,7 +252,7 @@ backend_update_system (PkBackend *backend)
  * pk_backend_resolve:
  */
 static void
-backend_resolve (PkBackend *backend, PkFilterEnum filters, const gchar *package_id)
+backend_resolve (PkBackend *backend, PkFilterEnum filters, gchar **package_ids)
 {
 	gchar *filters_text;
 	filters_text = pk_filter_enums_to_text (filters);
diff --git a/backends/dummy/pk-backend-dummy.c b/backends/dummy/pk-backend-dummy.c
index 5714e9f..ffccab5 100644
--- a/backends/dummy/pk-backend-dummy.c
+++ b/backends/dummy/pk-backend-dummy.c
@@ -117,7 +117,7 @@ backend_cancel (PkBackend *backend)
  * backend_get_depends:
  */
 static void
-backend_get_depends (PkBackend *backend, PkFilterEnum filters, const gchar *package_id, gboolean recursive)
+backend_get_depends (PkBackend *backend, PkFilterEnum filters, gchar **package_ids, gboolean recursive)
 {
 	pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
 	pk_backend_package (backend, PK_INFO_ENUM_INSTALLED,
@@ -131,7 +131,7 @@ backend_get_depends (PkBackend *backend, PkFilterEnum filters, const gchar *pack
  * backend_get_details:
  */
 static void
-backend_get_details (PkBackend *backend, const gchar *package_id)
+backend_get_details (PkBackend *backend, gchar **package_ids)
 {
 	pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
 	pk_backend_details (backend, "gnome-power-manager;2.6.19;i386;fedora", "GPL2", PK_GROUP_ENUM_PROGRAMMING,
@@ -150,7 +150,7 @@ backend_get_details (PkBackend *backend, const gchar *package_id)
  * backend_get_files:
  */
 static void
-backend_get_files (PkBackend *backend, const gchar *package_id)
+backend_get_files (PkBackend *backend, gchar **package_ids)
 {
 	pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
 	pk_backend_files (backend, "gnome-power-manager;2.6.19;i386;fedora",
@@ -161,7 +161,7 @@ backend_get_files (PkBackend *backend, const gchar *package_id)
  * backend_get_requires:
  */
 static void
-backend_get_requires (PkBackend *backend, PkFilterEnum filters, const gchar *package_id, gboolean recursive)
+backend_get_requires (PkBackend *backend, PkFilterEnum filters, gchar **package_ids, gboolean recursive)
 {
 	pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
 	pk_backend_package (backend, PK_INFO_ENUM_INSTALLED,
@@ -217,10 +217,10 @@ backend_get_update_detail_timeout (gpointer data)
  * backend_get_update_detail:
  */
 static void
-backend_get_update_detail (PkBackend *backend, const gchar *package_id)
+backend_get_update_detail (PkBackend *backend, gchar **package_ids)
 {
 	pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
-	_package_id = package_id;
+	_package_id = package_ids[0];
 	_signal_timeout = g_timeout_add (500, backend_get_update_detail_timeout, backend);
 }
 
@@ -434,14 +434,14 @@ backend_refresh_cache (PkBackend *backend, gboolean force)
  * backend_resolve:
  */
 static void
-backend_resolve (PkBackend *backend, PkFilterEnum filters, const gchar *package)
+backend_resolve (PkBackend *backend, PkFilterEnum filters, gchar **packages)
 {
 	pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
-	if (pk_strequal (package, "vips-doc")) {
+	if (pk_strequal (packages[0], "vips-doc")) {
 		pk_backend_package (backend, PK_INFO_ENUM_AVAILABLE,
 				    "vips-doc;7.12.4-2.fc8;noarch;linva",
 				    "The vips documentation package.");
-	} else if (pk_strequal (package, "glib2")) {
+	} else if (pk_strequal (packages[0], "glib2")) {
 		pk_backend_package (backend, PK_INFO_ENUM_INSTALLED,
 				    "glib2;2.14.0;i386;fedora", "The GLib library");
 	}
diff --git a/backends/opkg/pk-backend-opkg.c b/backends/opkg/pk-backend-opkg.c
index 02966c9..0050d0e 100644
--- a/backends/opkg/pk-backend-opkg.c
+++ b/backends/opkg/pk-backend-opkg.c
@@ -556,7 +556,7 @@ backend_update_package_thread (PkBackend *backend)
 {
 	PkPackageId *pi;
 	gint err = 0;
-	const gchar *package_id;
+	gchar **package_ids;
 
 	package_id = pk_backend_get_string (backend, "pkgid");
 	pi = pk_package_id_new_from_string (package_id);
@@ -655,7 +655,7 @@ static gboolean
 backend_get_details_thread (PkBackend *backend)
 {
 	PkPackageId *pi;
-	const gchar *package_id;
+	gchar **package_ids;
 	int group_index;
 	PkGroupEnum group = 0;
 	opkg_package_t *pkg;
@@ -699,7 +699,7 @@ backend_get_details_thread (PkBackend *backend)
 }
 
 static void
-backend_get_details (PkBackend *backend, const gchar *package_id)
+backend_get_details (PkBackend *backend, gchar **package_ids)
 {
 	pk_backend_set_percentage (backend, PK_BACKEND_PERCENTAGE_INVALID);
 	pk_backend_thread_create (backend, backend_get_details_thread);
diff --git a/backends/pisi/pk-backend-pisi.c b/backends/pisi/pk-backend-pisi.c
index 150b494..0b792bc 100644
--- a/backends/pisi/pk-backend-pisi.c
+++ b/backends/pisi/pk-backend-pisi.c
@@ -113,7 +113,7 @@ backend_cancel (PkBackend *backend)
  * backend_get_depends:
  */
 static void
-backend_get_depends (PkBackend *backend, PkFilterEnum filters, const gchar *package_id, gboolean recursive)
+backend_get_depends (PkBackend *backend, PkFilterEnum filters, gchar **package_ids, gboolean recursive)
 {
 	gchar *filters_text;
 	filters_text = pk_filter_enums_to_text (filters);
@@ -125,7 +125,7 @@ backend_get_depends (PkBackend *backend, PkFilterEnum filters, const gchar *pack
  * backend_get_details:
  */
 static void
-backend_get_details (PkBackend *backend, const gchar *package_id)
+backend_get_details (PkBackend *backend, gchar **package_ids)
 {
 	pk_backend_spawn_helper (spawn, "get-details.py", package_id, NULL);
 }
@@ -134,7 +134,7 @@ backend_get_details (PkBackend *backend, const gchar *package_id)
  * backend_get_files:
  */
 static void
-backend_get_files (PkBackend *backend, const gchar *package_id)
+backend_get_files (PkBackend *backend, gchar **package_ids)
 {
 	pk_backend_spawn_helper (spawn, "get-files.py", package_id, NULL);
 }
@@ -143,7 +143,7 @@ backend_get_files (PkBackend *backend, const gchar *package_id)
  * backend_get_requires:
  */
 static void
-backend_get_requires (PkBackend *backend, PkFilterEnum filters, const gchar *package_id, gboolean recursive)
+backend_get_requires (PkBackend *backend, PkFilterEnum filters, gchar **package_ids, gboolean recursive)
 {
 	gchar *filters_text;
 	filters_text = pk_filter_enums_to_text (filters);
@@ -311,7 +311,7 @@ backend_update_system (PkBackend *backend)
  * pk_backend_resolve:
  */
 static void
-backend_resolve (PkBackend *backend, PkFilterEnum filters, const gchar *package_id)
+backend_resolve (PkBackend *backend, PkFilterEnum filters, gchar **package_ids)
 {
 	gchar *filters_text;
 	filters_text = pk_filter_enums_to_text (filters);
diff --git a/backends/poldek/pk-backend-poldek.c b/backends/poldek/pk-backend-poldek.c
index e1bdccb..afdfb21 100644
--- a/backends/poldek/pk-backend-poldek.c
+++ b/backends/poldek/pk-backend-poldek.c
@@ -1834,7 +1834,7 @@ backend_get_depends_thread (PkBackend *backend)
 	struct pkg	*pkg;
 	tn_array	*deppkgs, *available, *installed;
 	gint		i;
-	const gchar *package_id;
+	gchar **package_ids;
 
 	pb_load_packages (backend);
 
@@ -1867,7 +1867,7 @@ backend_get_depends_thread (PkBackend *backend)
 }
 
 static void
-backend_get_depends (PkBackend *backend, PkFilterEnum filters, const gchar *package_id, gboolean recursive)
+backend_get_depends (PkBackend *backend, PkFilterEnum filters, gchar **package_ids, gboolean recursive)
 {
 	pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
 	poldek_backend_set_allow_cancel (backend, FALSE, TRUE);
@@ -1882,7 +1882,7 @@ backend_get_depends (PkBackend *backend, PkFilterEnum filters, const gchar *pack
 static gboolean
 backend_get_details_thread (PkBackend *backend)
 {
-	const gchar *package_id;
+	gchar **package_ids;
 	struct pkg	*pkg = NULL;
 
 	package_id = pk_backend_get_string (backend, "package_id");
@@ -1926,7 +1926,7 @@ backend_get_details_thread (PkBackend *backend)
 }
 
 static void
-backend_get_details (PkBackend *backend, const gchar *package_id)
+backend_get_details (PkBackend *backend, gchar **package_ids)
 {
 	pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
 	poldek_backend_set_allow_cancel (backend, FALSE, TRUE);
@@ -1941,7 +1941,7 @@ backend_get_details (PkBackend *backend, const gchar *package_id)
 static gboolean
 backend_get_files_thread (PkBackend *backend)
 {
-	const gchar *package_id;
+	gchar **package_ids;
 	struct pkg	*pkg;
 
 	package_id = pk_backend_get_string (backend, "package_id");
@@ -1999,7 +1999,7 @@ backend_get_files_thread (PkBackend *backend)
 }
 
 static void
-backend_get_files (PkBackend *backend, const gchar *package_id)
+backend_get_files (PkBackend *backend, gchar **package_ids)
 {
 	pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
 	poldek_backend_set_allow_cancel (backend, FALSE, TRUE);
@@ -2031,7 +2031,7 @@ backend_get_requires_thread (PkBackend *backend)
 	struct pkg	*pkg;
 	tn_array	*reqpkgs, *available, *installed;
 	gint		i;
-	const gchar *package_id;
+	gchar **package_ids;
 
 	pb_load_packages (backend);
 
@@ -2062,7 +2062,7 @@ backend_get_requires_thread (PkBackend *backend)
 }
 
 static void
-backend_get_requires (PkBackend	*backend, PkFilterEnum filters, const gchar *package_id, gboolean recursive)
+backend_get_requires (PkBackend	*backend, PkFilterEnum filters, gchar **package_ids, gboolean recursive)
 {
 	pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
 	poldek_backend_set_allow_cancel (backend, FALSE, TRUE);
@@ -2115,7 +2115,7 @@ static gboolean
 backend_get_update_detail_thread (PkBackend *backend)
 {
 	PkPackageId	*pi;
-	const gchar *package_id;
+	gchar **package_ids;
 	struct poclidek_rcmd	*rcmd;
 	gchar		*command;
 
@@ -2207,7 +2207,7 @@ backend_get_update_detail_thread (PkBackend *backend)
 }
 
 static void
-backend_get_update_detail (PkBackend *backend, const gchar *package_id)
+backend_get_update_detail (PkBackend *backend, gchar **package_ids)
 {
 	pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
 	poldek_backend_set_allow_cancel (backend, FALSE, TRUE);
@@ -2487,7 +2487,7 @@ backend_remove_packages (PkBackend *backend, gchar **package_ids, gboolean allow
  * backend_resolve:
  */
 static void
-backend_resolve (PkBackend *backend, PkFilterEnum filters, const gchar *package_id)
+backend_resolve (PkBackend *backend, PkFilterEnum filters, gchar **package_ids)
 {
 	pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
 	poldek_backend_set_allow_cancel (backend, TRUE, TRUE);
diff --git a/backends/smart/pk-backend-smart.c b/backends/smart/pk-backend-smart.c
index 9ef891c..762ee93 100644
--- a/backends/smart/pk-backend-smart.c
+++ b/backends/smart/pk-backend-smart.c
@@ -54,7 +54,7 @@ backend_destroy (PkBackend *backend)
  * backend_get_depends:
  */
 static void
-backend_get_depends (PkBackend *backend, PkFilterEnum filters, const gchar *package_id, gboolean recursive)
+backend_get_depends (PkBackend *backend, PkFilterEnum filters, gchar **package_ids, gboolean recursive)
 {
 	gchar *filters_text;
 	/* FIXME: Use recursive and filter here */
@@ -67,7 +67,7 @@ backend_get_depends (PkBackend *backend, PkFilterEnum filters, const gchar *pack
  * backend_get_details:
  */
 static void
-backend_get_details (PkBackend *backend, const gchar *package_id)
+backend_get_details (PkBackend *backend, gchar **package_ids)
 {
 	pk_backend_spawn_helper (spawn, "get-details.py", package_id, NULL);
 }
@@ -76,7 +76,7 @@ backend_get_details (PkBackend *backend, const gchar *package_id)
  * backend_get_files:
  */
 static void
-backend_get_files (PkBackend *backend, const gchar *package_id)
+backend_get_files (PkBackend *backend, gchar **package_ids)
 {
 	pk_backend_spawn_helper (spawn, "get-files.py", package_id, NULL);
 }
@@ -175,7 +175,7 @@ backend_remove_packages (PkBackend *backend, gchar **package_ids, gboolean allow
  * pk_backend_resolve:
  */
 static void
-backend_resolve (PkBackend *backend, PkFilterEnum filters, const gchar *package_id)
+backend_resolve (PkBackend *backend, PkFilterEnum filters, gchar **package_ids)
 {
 	gchar *filters_text;
 	filters_text = pk_filter_enums_to_text (filters);
diff --git a/backends/test/pk-backend-test-fail.c b/backends/test/pk-backend-test-fail.c
index b429c1b..2dbeb00 100644
--- a/backends/test/pk-backend-test-fail.c
+++ b/backends/test/pk-backend-test-fail.c
@@ -79,7 +79,7 @@ backend_cancel (PkBackend *backend)
  * backend_get_depends:
  */
 static void
-backend_get_depends (PkBackend *backend, PkFilterEnum filters, const gchar *package_id, gboolean recursive)
+backend_get_depends (PkBackend *backend, PkFilterEnum filters, gchar **package_ids, gboolean recursive)
 {
 	pk_backend_finished (backend);
 }
@@ -88,7 +88,7 @@ backend_get_depends (PkBackend *backend, PkFilterEnum filters, const gchar *pack
  * backend_get_details:
  */
 static void
-backend_get_details (PkBackend *backend, const gchar *package_id)
+backend_get_details (PkBackend *backend, gchar **package_ids)
 {
 	pk_backend_finished (backend);
 }
@@ -97,7 +97,7 @@ backend_get_details (PkBackend *backend, const gchar *package_id)
  * backend_get_files:
  */
 static void
-backend_get_files (PkBackend *backend, const gchar *package_id)
+backend_get_files (PkBackend *backend, gchar **package_ids)
 {
 	pk_backend_finished (backend);
 }
@@ -106,7 +106,7 @@ backend_get_files (PkBackend *backend, const gchar *package_id)
  * backend_get_requires:
  */
 static void
-backend_get_requires (PkBackend *backend, PkFilterEnum filters, const gchar *package_id, gboolean recursive)
+backend_get_requires (PkBackend *backend, PkFilterEnum filters, gchar **package_ids, gboolean recursive)
 {
 	pk_backend_finished (backend);
 }
@@ -115,7 +115,7 @@ backend_get_requires (PkBackend *backend, PkFilterEnum filters, const gchar *pac
  * backend_get_update_detail:
  */
 static void
-backend_get_update_detail (PkBackend *backend, const gchar *package_id)
+backend_get_update_detail (PkBackend *backend, gchar **package_ids)
 {
 	pk_backend_finished (backend);
 }
@@ -169,7 +169,7 @@ backend_remove_packages (PkBackend *backend, gchar **package_ids, gboolean allow
  * backend_resolve:
  */
 static void
-backend_resolve (PkBackend *backend, PkFilterEnum filters, const gchar *package_id)
+backend_resolve (PkBackend *backend, PkFilterEnum filters, gchar **package_ids)
 {
 	pk_backend_finished (backend);
 }
@@ -178,7 +178,7 @@ backend_resolve (PkBackend *backend, PkFilterEnum filters, const gchar *package_
  * backend_rollback:
  */
 static void
-backend_rollback (PkBackend *backend, const gchar *package_id)
+backend_rollback (PkBackend *backend, const gchar *transaction_id)
 {
 	pk_backend_finished (backend);
 }
diff --git a/backends/test/pk-backend-test-succeed.c b/backends/test/pk-backend-test-succeed.c
index c046c1d..168f8be 100644
--- a/backends/test/pk-backend-test-succeed.c
+++ b/backends/test/pk-backend-test-succeed.c
@@ -76,7 +76,7 @@ backend_cancel (PkBackend *backend)
  * backend_get_depends:
  */
 static void
-backend_get_depends (PkBackend *backend, PkFilterEnum filters, const gchar *package_id, gboolean recursive)
+backend_get_depends (PkBackend *backend, PkFilterEnum filters, gchar **package_ids, gboolean recursive)
 {
 	pk_backend_finished (backend);
 }
@@ -85,7 +85,7 @@ backend_get_depends (PkBackend *backend, PkFilterEnum filters, const gchar *pack
  * backend_get_details:
  */
 static void
-backend_get_details (PkBackend *backend, const gchar *package_id)
+backend_get_details (PkBackend *backend, gchar **package_ids)
 {
 	pk_backend_finished (backend);
 }
@@ -94,7 +94,7 @@ backend_get_details (PkBackend *backend, const gchar *package_id)
  * backend_get_details:
  */
 static void
-backend_get_files (PkBackend *backend, const gchar *package_id)
+backend_get_files (PkBackend *backend, gchar **package_ids)
 {
 	pk_backend_finished (backend);
 }
@@ -103,7 +103,7 @@ backend_get_files (PkBackend *backend, const gchar *package_id)
  * backend_get_requires:
  */
 static void
-backend_get_requires (PkBackend *backend, PkFilterEnum filters, const gchar *package_id, gboolean recursive)
+backend_get_requires (PkBackend *backend, PkFilterEnum filters, gchar **package_ids, gboolean recursive)
 {
 	pk_backend_finished (backend);
 }
@@ -112,7 +112,7 @@ backend_get_requires (PkBackend *backend, PkFilterEnum filters, const gchar *pac
  * backend_get_update_detail:
  */
 static void
-backend_get_update_detail (PkBackend *backend, const gchar *package_id)
+backend_get_update_detail (PkBackend *backend, gchar **package_ids)
 {
 	pk_backend_finished (backend);
 }
@@ -176,7 +176,7 @@ backend_remove_packages (PkBackend *backend, gchar **package_ids, gboolean allow
  * backend_resolve:
  */
 static void
-backend_resolve (PkBackend *backend, PkFilterEnum filters, const gchar *package_id)
+backend_resolve (PkBackend *backend, PkFilterEnum filters, gchar **package_ids)
 {
 	pk_backend_finished (backend);
 }
diff --git a/backends/urpmi/pk-backend-urpmi.c b/backends/urpmi/pk-backend-urpmi.c
index 9681def..2a78f72 100644
--- a/backends/urpmi/pk-backend-urpmi.c
+++ b/backends/urpmi/pk-backend-urpmi.c
@@ -125,7 +125,7 @@ backend_search_name (PkBackend *backend, PkFilterEnum filters, const gchar *sear
  * backend_get_details:
  */
 static void
-backend_get_details (PkBackend *backend, const gchar *package_id)
+backend_get_details (PkBackend *backend, gchar **package_ids)
 {
 	pk_backend_spawn_helper (spawn, "get-details.pl", package_id, NULL);
 }
@@ -134,7 +134,7 @@ backend_get_details (PkBackend *backend, const gchar *package_id)
  * backend_get_files:
  */
 static void
-backend_get_files (PkBackend *backend, const gchar *package_id)
+backend_get_files (PkBackend *backend, gchar **package_ids)
 {
 	pk_backend_spawn_helper (spawn, "get-files.pl", package_id, NULL);
 }
@@ -143,7 +143,7 @@ backend_get_files (PkBackend *backend, const gchar *package_id)
  * backend_get_depends:
  */
 static void
-backend_get_depends (PkBackend *backend, PkFilterEnum filters, const gchar *package_id, gboolean recursive)
+backend_get_depends (PkBackend *backend, PkFilterEnum filters, gchar **package_ids, gboolean recursive)
 {
 	gchar *filters_text;
 	filters_text = pk_filter_enums_to_text (filters);
@@ -167,7 +167,7 @@ backend_get_updates (PkBackend *backend, PkFilterEnum filters)
  * backend_get_update_detail:
  */
 static void
-backend_get_update_detail (PkBackend *backend, const gchar *package_id)
+backend_get_update_detail (PkBackend *backend, gchar **package_ids)
 {
 	pk_backend_spawn_helper (spawn, "get-update-detail.pl", package_id, NULL);
 }
@@ -251,7 +251,7 @@ backend_get_packages (PkBackend *backend, PkFilterEnum filters)
  * backend_get_requires:
  */
 static void
-backend_get_requires (PkBackend *backend, PkFilterEnum filters, const gchar *package_id, gboolean recursive)
+backend_get_requires (PkBackend *backend, PkFilterEnum filters, gchar **package_ids, gboolean recursive)
 {
 	gchar *filters_text;
 	filters_text = pk_filter_enums_to_text (filters);
@@ -287,7 +287,7 @@ backend_search_file (PkBackend *backend, PkFilterEnum filters, const gchar *sear
  * pk_backend_resolve:
  */
 static void
-backend_resolve (PkBackend *backend, PkFilterEnum filters, const gchar *package_id)
+backend_resolve (PkBackend *backend, PkFilterEnum filters, gchar **package_ids)
 {
 	gchar *filters_text;
 	filters_text = pk_filter_enums_to_text (filters);
diff --git a/backends/yum/helpers/get-depends.py b/backends/yum/helpers/get-depends.py
index f24079c..fd5fade 100755
--- a/backends/yum/helpers/get-depends.py
+++ b/backends/yum/helpers/get-depends.py
@@ -17,5 +17,5 @@ package = sys.argv[2]
 recursive = sys.argv[3]
 
 backend = PackageKitYumBackend(sys.argv[1:])
-backend.get_depends(filters, package, recursive)
+backend.get_depends(filters, package.split('|'), recursive)
 sys.exit(0)
diff --git a/backends/yum/helpers/get-details.py b/backends/yum/helpers/get-details.py
index 0a6e60d..48938d0 100755
--- a/backends/yum/helpers/get-details.py
+++ b/backends/yum/helpers/get-details.py
@@ -15,5 +15,5 @@ import sys
 from yumBackend import PackageKitYumBackend
 package = sys.argv[1]
 backend = PackageKitYumBackend(sys.argv[1:])
-backend.get_details(package)
+backend.get_details(package.split('|'))
 sys.exit(0)
diff --git a/backends/yum/helpers/get-files.py b/backends/yum/helpers/get-files.py
index 92a8e0d..0c8df0a 100755
--- a/backends/yum/helpers/get-files.py
+++ b/backends/yum/helpers/get-files.py
@@ -15,5 +15,5 @@ import sys
 from yumBackend import PackageKitYumBackend
 package = sys.argv[1]
 backend = PackageKitYumBackend(sys.argv[1:])
-backend.get_files(package)
+backend.get_files(package.split('|'))
 sys.exit(0)
diff --git a/backends/yum/helpers/get-requires.py b/backends/yum/helpers/get-requires.py
index 002887c..252dbae 100755
--- a/backends/yum/helpers/get-requires.py
+++ b/backends/yum/helpers/get-requires.py
@@ -17,5 +17,5 @@ package = sys.argv[2]
 recursive = sys.argv[3]
 
 backend = PackageKitYumBackend(sys.argv[1:])
-backend.get_requires(filters, package, recursive)
+backend.get_requires(filters, package.split('|'), recursive)
 sys.exit(0)
diff --git a/backends/yum/helpers/get-update-detail.py b/backends/yum/helpers/get-update-detail.py
index 8ab1f93..8fbc484 100755
--- a/backends/yum/helpers/get-update-detail.py
+++ b/backends/yum/helpers/get-update-detail.py
@@ -14,6 +14,6 @@ import sys
 from yumBackend import PackageKitYumBackend
 package=sys.argv[1]
 backend = PackageKitYumBackend(sys.argv[2:])
-backend.get_update_detail(package)
+backend.get_update_detail(package.split('|'))
 backend.unLock()
 sys.exit(0)
diff --git a/backends/yum/helpers/resolve.py b/backends/yum/helpers/resolve.py
index aadb95b..7807245 100755
--- a/backends/yum/helpers/resolve.py
+++ b/backends/yum/helpers/resolve.py
@@ -15,6 +15,6 @@ from yumBackend import PackageKitYumBackend
 filters = sys.argv[1]
 name=sys.argv[2]
 backend = PackageKitYumBackend(sys.argv[2:])
-backend.resolve(filters, name)
+backend.resolve(filters, name.split('|'))
 backend.unLock()
 sys.exit(0)
diff --git a/backends/yum/helpers/yumBackend.py b/backends/yum/helpers/yumBackend.py
index 52be3d5..a72dddd 100644
--- a/backends/yum/helpers/yumBackend.py
+++ b/backends/yum/helpers/yumBackend.py
@@ -687,7 +687,7 @@ class PackageKitYumBackend(PackageKitBaseBackend):
         else:
             return reqlist
 
-    def get_requires(self,filters,package,recursive):
+    def get_requires(self,filters,package_ids,recursive):
         '''
         Print a list of requires for a given package
         '''
@@ -695,19 +695,20 @@ class PackageKitYumBackend(PackageKitBaseBackend):
         self.allow_cancel(True)
         self.percentage(None)
         self.status(STATUS_INFO)
-        pkg,inst = self._findPackage(package)
-        # FIXME: This is a hack, it simulates a removal of the
-        # package and return the transaction
-        if inst and pkg:
-            txmbrs = self.yumbase.remove(po=pkg)
-            if txmbrs:
-                rc,msgs =  self.yumbase.buildTransaction()
-                if rc !=2:
-                    self.error(ERROR_DEP_RESOLUTION_FAILED,self._format_msgs(msgs))
-                else:
-                    for txmbr in self.yumbase.tsInfo:
-                        if txmbr.po.name != pkg.name:
-                            self._show_package(txmbr.po,INFO_INSTALLED)
+        for package in package_ids:
+            pkg,inst = self._findPackage(package)
+            # FIXME: This is a hack, it simulates a removal of the
+            # package and return the transaction
+            if inst and pkg:
+                txmbrs = self.yumbase.remove(po=pkg)
+                if txmbrs:
+                    rc,msgs =  self.yumbase.buildTransaction()
+                    if rc !=2:
+                        self.error(ERROR_DEP_RESOLUTION_FAILED,self._format_msgs(msgs))
+                    else:
+                        for txmbr in self.yumbase.tsInfo:
+                            if txmbr.po.name != pkg.name:
+                                self._show_package(txmbr.po,INFO_INSTALLED)
 
     def _is_inst(self,pkg):
         # search only for requested arch
@@ -798,7 +799,7 @@ class PackageKitYumBackend(PackageKitBaseBackend):
             bestdeps.append(best)
         return unique(bestdeps)
 
-    def get_depends(self,filters,package,recursive):
+    def get_depends(self,filters,package_ids,recursive):
         '''
         Print a list of depends for a given package
         '''
@@ -808,24 +809,25 @@ class PackageKitYumBackend(PackageKitBaseBackend):
         self.status(STATUS_INFO)
 
         fltlist = filters.split(';')
-        name = package.split(';')[0]
 
-        pkg,inst = self._findPackage(package)
-        results = {}
-        if pkg:
-            deps = self._get_best_dependencies(pkg)
-        else:
-            self.error(ERROR_PACKAGE_NOT_FOUND,'Package %s was not found' % package)
-        for pkg in deps:
-            if pkg.name != name:
-                pkgver = self._get_package_ver(pkg)
-                id = self.get_package_id(pkg.name,pkgver,pkg.arch,pkg.repoid)
-
-                if self._is_inst_arch(pkg) and FILTER_NOT_INSTALLED not in fltlist:
-                    self.package(id,INFO_INSTALLED,pkg.summary)
-                else:
-                    if self._installable(pkg) and FILTER_INSTALLED not in fltlist:
-                        self.package(id,INFO_AVAILABLE,pkg.summary)
+        for package in package_ids:
+            name = package.split(';')[0]
+            pkg,inst = self._findPackage(package)
+            results = {}
+            if pkg:
+                deps = self._get_best_dependencies(pkg)
+            else:
+                self.error(ERROR_PACKAGE_NOT_FOUND,'Package %s was not found' % package)
+            for pkg in deps:
+                if pkg.name != name:
+                    pkgver = self._get_package_ver(pkg)
+                    id = self.get_package_id(pkg.name,pkgver,pkg.arch,pkg.repoid)
+
+                    if self._is_inst_arch(pkg) and FILTER_NOT_INSTALLED not in fltlist:
+                        self.package(id,INFO_INSTALLED,pkg.summary)
+                    else:
+                        if self._installable(pkg) and FILTER_INSTALLED not in fltlist:
+                            self.package(id,INFO_AVAILABLE,pkg.summary)
 
     def update_system(self):
         '''
@@ -904,26 +906,27 @@ class PackageKitYumBackend(PackageKitBaseBackend):
         self.status(STATUS_QUERY)
 
         fltlist = filters.split(';')
-        # Get installed packages
-        installedByKey = self.yumbase.rpmdb.searchNevra(name=name)
-        if FILTER_NOT_INSTALLED not in fltlist:
-            for pkg in installedByKey:
-                self._show_package(pkg,INFO_INSTALLED)
-        # Get available packages
-        if FILTER_INSTALLED not in fltlist:
-            for pkg in self.yumbase.pkgSack.returnNewestByNameArch():
-                if pkg.name == name:
-                    show = True
-                    for instpo in installedByKey:
-                        # Check if package have a smaller & equal EVR to a inst pkg
-                        if pkg.EVR < instpo.EVR or pkg.EVR == instpo.EVR:
-                            show = False
-                    if show:
-                        self._show_package(pkg,INFO_AVAILABLE)
-                        break
+        for package in package_ids:
+            # Get installed packages
+            installedByKey = self.yumbase.rpmdb.searchNevra(name=name)
+            if FILTER_NOT_INSTALLED not in fltlist:
+                for pkg in installedByKey:
+                    self._show_package(pkg,INFO_INSTALLED)
+            # Get available packages
+            if FILTER_INSTALLED not in fltlist:
+                for pkg in self.yumbase.pkgSack.returnNewestByNameArch():
+                    if pkg.name == name:
+                        show = True
+                        for instpo in installedByKey:
+                            # Check if package have a smaller & equal EVR to a inst pkg
+                            if pkg.EVR < instpo.EVR or pkg.EVR == instpo.EVR:
+                                show = False
+                        if show:
+                            self._show_package(pkg,INFO_AVAILABLE)
+                            break
 
     @handle_repo_error
-    def install_packages(self,packages):
+    def install_packages(self,package_ids):
         '''
         Implement the {backend}-install-packages functionality
         This will only work with yum 3.2.4 or higher
@@ -934,7 +937,7 @@ class PackageKitYumBackend(PackageKitBaseBackend):
         self.status(STATUS_RUNNING)
         txmbrs = []
         already_warned = False
-        for package in packages:
+        for package in package_ids:
             pkg,inst = self._findPackage(package)
             if pkg and not inst:
                 repo = self.yumbase.repos.getRepo(pkg.repoid)
@@ -1062,7 +1065,7 @@ class PackageKitYumBackend(PackageKitBaseBackend):
 
         return True
 
-    def update_packages(self,packages):
+    def update_packages(self,package_ids):
         '''
         Implement the {backend}-install functionality
         This will only work with yum 3.2.4 or higher
@@ -1073,7 +1076,7 @@ class PackageKitYumBackend(PackageKitBaseBackend):
         self.status(STATUS_RUNNING)
         txmbrs = []
         try:
-            for package in packages:
+            for package in package_ids:
                 pkg,inst = self._findPackage(package)
                 if pkg:
                     txmbr = self.yumbase.update(po=pkg)
@@ -1193,7 +1196,7 @@ class PackageKitYumBackend(PackageKitBaseBackend):
         else:
             self.error(ERROR_PACKAGE_NOT_INSTALLED,"Package %s is not installed" % package)
 
-    def get_details(self,package):
+    def get_details(self,package_ids):
         '''
         Print a detailed details for a given package
         '''
@@ -1202,11 +1205,12 @@ class PackageKitYumBackend(PackageKitBaseBackend):
         self.percentage(None)
         self.status(STATUS_INFO)
 
-        pkg,inst = self._findPackage(package)
-        if pkg:
-            self._show_details(pkg)
-        else:
-            self.error(ERROR_PACKAGE_NOT_FOUND,'Package %s was not found' % package)
+        for package in package_ids:
+            pkg,inst = self._findPackage(package)
+            if pkg:
+                self._show_details(pkg)
+            else:
+                self.error(ERROR_PACKAGE_NOT_FOUND,'Package %s was not found' % package)
 
     def _show_details(self,pkg):
         pkgver = self._get_package_ver(pkg)
@@ -1226,22 +1230,23 @@ class PackageKitYumBackend(PackageKitBaseBackend):
 
         self.details(id,pkg.license,group,desc,pkg.url,pkg.size)
 
-    def get_files(self,package):
+    def get_files(self,package_ids):
         self._check_init()
         self.allow_cancel(True)
         self.percentage(None)
         self.status(STATUS_INFO)
 
-        pkg,inst = self._findPackage(package)
-        if pkg:
-            files = pkg.returnFileEntries('dir')
-            files.extend(pkg.returnFileEntries()) # regular files
+        for package in package_ids:
+            pkg,inst = self._findPackage(package)
+            if pkg:
+                files = pkg.returnFileEntries('dir')
+                files.extend(pkg.returnFileEntries()) # regular files
 
-            file_list = ";".join(files)
+                file_list = ";".join(files)
 
-            self.files(package,file_list)
-        else:
-            self.error(ERROR_PACKAGE_NOT_FOUND,'Package %s was not found' % package)
+                self.files(package,file_list)
+            else:
+                self.error(ERROR_PACKAGE_NOT_FOUND,'Package %s was not found' % package)
 
     def _pkg_to_id(self,pkg):
         pkgver = self._get_package_ver(pkg)
@@ -1478,7 +1483,7 @@ class PackageKitYumBackend(PackageKitBaseBackend):
         else:
             return "",urls,"none"
 
-    def get_update_detail(self,package):
+    def get_update_detail(self,package_ids):
         '''
         Implement the {backend}-get-update_detail functionality
         '''
@@ -1486,14 +1491,15 @@ class PackageKitYumBackend(PackageKitBaseBackend):
         self.allow_cancel(True)
         self.percentage(None)
         self.status(STATUS_INFO)
-        pkg,inst = self._findPackage(package)
-        update = self._get_updated(pkg)
-        obsolete = self._get_obsoleted(pkg.name)
-        desc,urls,reboot = self._get_update_extras(pkg)
-        cve_url = self._format_list(urls['cve'])
-        bz_url = self._format_list(urls['bugzilla'])
-        vendor_url = self._format_list(urls['vendor'])
-        self.update_detail(package,update,obsolete,vendor_url,bz_url,cve_url,reboot,desc)
+        for package in package_ids:
+            pkg,inst = self._findPackage(package)
+            update = self._get_updated(pkg)
+            obsolete = self._get_obsoleted(pkg.name)
+            desc,urls,reboot = self._get_update_extras(pkg)
+            cve_url = self._format_list(urls['cve'])
+            bz_url = self._format_list(urls['bugzilla'])
+            vendor_url = self._format_list(urls['vendor'])
+            self.update_detail(package,update,obsolete,vendor_url,bz_url,cve_url,reboot,desc)
 
     def repo_set_data(self,repoid,parameter,value):
         '''
diff --git a/backends/yum/pk-backend-yum.c b/backends/yum/pk-backend-yum.c
index b867f75..21350ec 100644
--- a/backends/yum/pk-backend-yum.c
+++ b/backends/yum/pk-backend-yum.c
@@ -116,42 +116,54 @@ backend_cancel (PkBackend *backend)
  * backend_get_depends:
  */
 static void
-backend_get_depends (PkBackend *backend, PkFilterEnum filters, const gchar *package_id, gboolean recursive)
+backend_get_depends (PkBackend *backend, PkFilterEnum filters, gchar **package_ids, gboolean recursive)
 {
 	gchar *filters_text;
+	gchar *package_ids_temp;
+	package_ids_temp = pk_package_ids_to_text (package_ids, "|");
 	filters_text = pk_filter_enums_to_text (filters);
-	pk_backend_spawn_helper (spawn, "get-depends.py", filters_text, package_id, pk_backend_bool_to_text (recursive), NULL);
+	pk_backend_spawn_helper (spawn, "get-depends.py", filters_text, package_ids_temp, pk_backend_bool_to_text (recursive), NULL);
 	g_free (filters_text);
+	g_free (package_ids_temp);
 }
 
 /**
  * backend_get_details:
  */
 static void
-backend_get_details (PkBackend *backend, const gchar *package_id)
+backend_get_details (PkBackend *backend, gchar **package_ids)
 {
-	pk_backend_spawn_helper (spawn, "get-details.py", package_id, NULL);
+	gchar *package_ids_temp;
+	package_ids_temp = pk_package_ids_to_text (package_ids, "|");
+	pk_backend_spawn_helper (spawn, "get-details.py", package_ids_temp, NULL);
+	g_free (package_ids_temp);
 }
 
 /**
  * backend_get_files:
  */
 static void
-backend_get_files (PkBackend *backend, const gchar *package_id)
+backend_get_files (PkBackend *backend, gchar **package_ids)
 {
-	pk_backend_spawn_helper (spawn, "get-files.py", package_id, NULL);
+	gchar *package_ids_temp;
+	package_ids_temp = pk_package_ids_to_text (package_ids, "|");
+	pk_backend_spawn_helper (spawn, "get-files.py", package_ids_temp, NULL);
+	g_free (package_ids_temp);
 }
 
 /**
  * backend_get_requires:
  */
 static void
-backend_get_requires (PkBackend *backend, PkFilterEnum filters, const gchar *package_id, gboolean recursive)
+backend_get_requires (PkBackend *backend, PkFilterEnum filters, gchar **package_ids, gboolean recursive)
 {
+	gchar *package_ids_temp;
+	package_ids_temp = pk_package_ids_to_text (package_ids, "|");
 	gchar *filters_text;
 	filters_text = pk_filter_enums_to_text (filters);
-	pk_backend_spawn_helper (spawn, "get-requires.py", filters_text, package_id, pk_backend_bool_to_text (recursive), NULL);
+	pk_backend_spawn_helper (spawn, "get-requires.py", filters_text, package_ids_temp, pk_backend_bool_to_text (recursive), NULL);
 	g_free (filters_text);
+	g_free (package_ids_temp);
 }
 
 /**
@@ -182,9 +194,12 @@ backend_get_packages (PkBackend *backend, PkFilterEnum filters)
  * backend_get_update_detail:
  */
 static void
-backend_get_update_detail (PkBackend *backend, const gchar *package_id)
+backend_get_update_detail (PkBackend *backend, gchar **package_ids)
 {
-	pk_backend_spawn_helper (spawn, "get-update-detail.py", package_id, NULL);
+	gchar *package_ids_temp;
+	package_ids_temp = pk_package_ids_to_text (package_ids, "|");
+	pk_backend_spawn_helper (spawn, "get-update-detail.py", package_ids_temp, NULL);
+	g_free (package_ids_temp);
 }
 
 /**
@@ -321,7 +336,6 @@ backend_update_packages (PkBackend *backend, gchar **package_ids)
 {
 	gchar *package_ids_temp;
 
-
 	/* check network state */
 	if (!pk_backend_is_online (backend)) {
 		pk_backend_error_code (backend, PK_ERROR_ENUM_NO_NETWORK, "Cannot install when offline");
@@ -348,12 +362,15 @@ backend_update_system (PkBackend *backend)
  * pk_backend_resolve:
  */
 static void
-backend_resolve (PkBackend *backend, PkFilterEnum filters, const gchar *package_id)
+backend_resolve (PkBackend *backend, PkFilterEnum filters, gchar **package_ids)
 {
 	gchar *filters_text;
+	gchar *package_ids_temp;
 	filters_text = pk_filter_enums_to_text (filters);
-	pk_backend_spawn_helper (spawn, "resolve.py", filters_text, package_id, NULL);
+	package_ids_temp = pk_package_ids_to_text (package_ids, "|");
+	pk_backend_spawn_helper (spawn, "resolve.py", filters_text, package_ids_temp, NULL);
 	g_free (filters_text);
+	g_free (package_ids_temp);
 }
 
 /**
diff --git a/backends/yum2/pk-backend-yum2.c b/backends/yum2/pk-backend-yum2.c
index 1fd0f44..f947105 100644
--- a/backends/yum2/pk-backend-yum2.c
+++ b/backends/yum2/pk-backend-yum2.c
@@ -103,7 +103,7 @@ backend_cancel (PkBackend *backend)
  * backend_get_depends:
  */
 static void
-backend_get_depends (PkBackend *backend, PkFilterEnum filters, const gchar *package_id, gboolean recursive)
+backend_get_depends (PkBackend *backend, PkFilterEnum filters, gchar **package_ids, gboolean recursive)
 {
 	pk_backend_dbus_get_depends (dbus, filters, package_id, recursive);
 }
@@ -112,7 +112,7 @@ backend_get_depends (PkBackend *backend, PkFilterEnum filters, const gchar *pack
  * backend_get_details:
  */
 static void
-backend_get_details (PkBackend *backend, const gchar *package_id)
+backend_get_details (PkBackend *backend, gchar **package_ids)
 {
 	pk_backend_dbus_get_details (dbus, package_id);
 }
@@ -121,7 +121,7 @@ backend_get_details (PkBackend *backend, const gchar *package_id)
  * backend_get_files:
  */
 static void
-backend_get_files (PkBackend *backend, const gchar *package_id)
+backend_get_files (PkBackend *backend, gchar **package_ids)
 {
 	pk_backend_dbus_get_files (dbus, package_id);
 }
@@ -130,7 +130,7 @@ backend_get_files (PkBackend *backend, const gchar *package_id)
  * backend_get_requires:
  */
 static void
-backend_get_requires (PkBackend *backend, PkFilterEnum filters, const gchar *package_id, gboolean recursive)
+backend_get_requires (PkBackend *backend, PkFilterEnum filters, gchar **package_ids, gboolean recursive)
 {
 	pk_backend_dbus_get_requires (dbus, filters, package_id, recursive);
 }
@@ -148,7 +148,7 @@ backend_get_updates (PkBackend *backend, PkFilterEnum filters)
  * backend_get_update_detail:
  */
 static void
-backend_get_update_detail (PkBackend *backend, const gchar *package_id)
+backend_get_update_detail (PkBackend *backend, gchar **package_ids)
 {
 	pk_backend_dbus_get_update_detail (dbus, package_id);
 }
@@ -268,7 +268,7 @@ backend_update_system (PkBackend *backend)
  * pk_backend_resolve:
  */
 static void
-backend_resolve (PkBackend *backend, PkFilterEnum filters, const gchar *package_id)
+backend_resolve (PkBackend *backend, PkFilterEnum filters, gchar **package_ids)
 {
 	pk_backend_dbus_resolve (dbus, filters, package_id);
 }
diff --git a/backends/zypp/pk-backend-zypp.cpp b/backends/zypp/pk-backend-zypp.cpp
index e666c8e..d292bb5 100644
--- a/backends/zypp/pk-backend-zypp.cpp
+++ b/backends/zypp/pk-backend-zypp.cpp
@@ -125,7 +125,7 @@ static gboolean
 backend_get_requires_thread (PkBackend *backend)
 {
 	PkPackageId *pi;
-	const gchar *package_id;
+	gchar **package_ids;
 
 	package_id = pk_backend_get_string (backend, "package_id");
 	pi = pk_package_id_new_from_string (package_id);
@@ -249,7 +249,7 @@ backend_get_requires_thread (PkBackend *backend)
   * backend_get_requires:
   */
 static void
-backend_get_requires(PkBackend *backend, PkFilterEnum filters, const gchar *package_id, gboolean recursive)
+backend_get_requires(PkBackend *backend, PkFilterEnum filters, gchar **package_ids, gboolean recursive)
 {
 	pk_backend_thread_create (backend, backend_get_requires_thread);
 }
@@ -297,7 +297,7 @@ backend_get_filters (PkBackend *backend)
 static gboolean
 backend_get_depends_thread (PkBackend *backend)
 {
-	const gchar *package_id;
+	gchar **package_ids;
 
 	pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
 	pk_backend_set_percentage (backend, 0);
@@ -450,7 +450,7 @@ backend_get_depends_thread (PkBackend *backend)
  * backend_get_depends:
  */
 static void
-backend_get_depends (PkBackend *backend, PkFilterEnum filters, const gchar *package_id, gboolean recursive)
+backend_get_depends (PkBackend *backend, PkFilterEnum filters, gchar **package_ids, gboolean recursive)
 {
 	pk_backend_set_uint (backend, "type", DEPS_TYPE_DEPENDS);
 	pk_backend_thread_create (backend, backend_get_depends_thread);
@@ -459,7 +459,7 @@ backend_get_depends (PkBackend *backend, PkFilterEnum filters, const gchar *pack
 static gboolean
 backend_get_details_thread (PkBackend *backend)
 {
-	const gchar *package_id;
+	gchar **package_ids;
 	PkPackageId *pi;
 
 	package_id = pk_backend_get_string (backend, "package_id");
@@ -551,7 +551,7 @@ backend_get_details_thread (PkBackend *backend)
  * backend_get_details:
  */
 static void
-backend_get_details (PkBackend *backend, const gchar *package_id)
+backend_get_details (PkBackend *backend, gchar **package_ids)
 {
 	pk_backend_thread_create (backend, backend_get_details_thread);
 }
@@ -803,7 +803,7 @@ static gboolean
 backend_get_update_detail_thread (PkBackend *backend)
 {
 	PkPackageId *pi;
-	const gchar *package_id;
+	gchar **package_ids;
 
 	package_id = pk_backend_get_string (backend, "package_id");
 	pi = pk_package_id_new_from_string (package_id);
@@ -888,7 +888,7 @@ backend_get_update_detail_thread (PkBackend *backend)
   * backend_get_update_detail
   */
 static void
-backend_get_update_detail (PkBackend *backend, const gchar *package_id)
+backend_get_update_detail (PkBackend *backend, gchar **package_ids)
 {
 	pk_backend_thread_create (backend, backend_get_update_detail_thread);
 }
@@ -1161,7 +1161,7 @@ backend_remove_packages (PkBackend *backend, gchar **package_ids, gboolean allow
 static gboolean
 backend_resolve_thread (PkBackend *backend)
 {
-	const gchar *package_id = pk_backend_get_string (backend, "package_id");
+	gchar **package_ids = pk_backend_get_string (backend, "package_id");
 
 	pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
 
@@ -1207,7 +1207,7 @@ backend_resolve_thread (PkBackend *backend)
  * backend_resolve:
  */
 static void
-backend_resolve (PkBackend *backend, PkFilterEnum filters, const gchar *package_id)
+backend_resolve (PkBackend *backend, PkFilterEnum filters, gchar **package_ids)
 {
 	pk_backend_thread_create (backend, backend_resolve_thread);
 }
@@ -1406,7 +1406,7 @@ static gboolean
 backend_get_files_thread (PkBackend *backend)
 {
 	PkPackageId *pi;
-	const gchar *package_id;
+	gchar **package_ids;
 
 	package_id = pk_backend_get_string (backend, "package_id");
 	pi = pk_package_id_new_from_string (package_id);
@@ -1479,7 +1479,7 @@ backend_get_files_thread (PkBackend *backend)
   * backend_get_files:
   */
 static void
-backend_get_files(PkBackend *backend, const gchar *package_id)
+backend_get_files(PkBackend *backend, gchar **package_ids)
 {
 	pk_backend_thread_create (backend, backend_get_files_thread);
 }
diff --git a/client/pk-console.c b/client/pk-console.c
index 9581dce..bef0ce9 100644
--- a/client/pk-console.c
+++ b/client/pk-console.c
@@ -32,6 +32,7 @@
 #include <dbus/dbus-glib.h>
 
 #include <pk-debug.h>
+#include <pk-package-ids.h>
 #include <pk-client.h>
 #include <pk-control.h>
 #include <pk-package-id.h>
@@ -487,6 +488,7 @@ pk_console_perhaps_resolve (PkClient *client, PkFilterEnum filter, const gchar *
 	guint length;
 	PkPackageItem *item;
 	PkPackageList *list;
+	gchar **packages;
 
 	/* have we passed a complete package_id? */
 	valid = pk_package_id_check (package);
@@ -501,7 +503,9 @@ pk_console_perhaps_resolve (PkClient *client, PkFilterEnum filter, const gchar *
 	}
 
 	/* we need to resolve it */
-	ret = pk_client_resolve (client_task, filter, package, error);
+	packages = pk_package_ids_from_id (package);
+	ret = pk_client_resolve (client_task, filter, packages, error);
+	g_strfreev (packages);
 	if (ret == FALSE) {
 		pk_warning ("Resolve is not supported in this backend");
 		return NULL;
@@ -719,8 +723,7 @@ pk_console_remove_packages (PkClient *client, gchar **packages, GError **error)
 	gboolean ret = TRUE;
 	PkPackageItem *item;
 	PkPackageId *ident;
-	guint i, j;
-	guint size;
+	guint i;
 	guint length;
 	gboolean remove;
 	GPtrArray *array;
@@ -758,33 +761,25 @@ pk_console_remove_packages (PkClient *client, gchar **packages, GError **error)
 		goto out;
 	}
 
-	/* get the requires packages for each package_id */
-	length = g_strv_length (package_ids);
-	for (i=0; i<length; i++) {
-		ret = pk_client_reset (client_task, error);
-		if (!ret) {
-			pk_warning ("failed to reset");
-			break;
-		}
-
-		pk_debug ("Getting installed requires for %s", package_ids[i]);
-		/* see if any packages require this one */
-		ret = pk_client_get_requires (client_task, PK_FILTER_ENUM_INSTALLED, package_ids[i], TRUE, error);
-		if (!ret) {
-			pk_warning ("failed to get requires");
-			break;
-		}
+	ret = pk_client_reset (client_task, error);
+	if (!ret) {
+		pk_warning ("failed to reset");
+		goto out;
+	}
 
-		/* see how many packages there are */
-		list_single = pk_client_get_package_list (client_task);
-		size = pk_package_list_get_size (list_single);
-		for (j=0; j<size; j++) {
-			item = pk_package_list_get_item (list_single, j);
-			pk_package_list_add_item (list, item);
-		}
-		g_object_unref (list_single);
+	pk_debug ("Getting installed requires for %s", package_ids[0]);
+	/* see if any packages require this one */
+	ret = pk_client_get_requires (client_task, PK_FILTER_ENUM_INSTALLED, package_ids, TRUE, error);
+	if (!ret) {
+		pk_warning ("failed to get requires");
+		goto out;
 	}
 
+	/* see how many packages there are */
+	list_single = pk_client_get_package_list (client_task);
+	pk_package_list_add_list (list, list_single);
+	g_object_unref (list_single);
+
 	/* one of the get-requires failed */
 	if (!ret) {
 		goto out;
@@ -839,12 +834,17 @@ pk_console_update_package (PkClient *client, const gchar *package, GError **erro
 {
 	gboolean ret;
 	gchar *package_id;
+	gchar **package_ids;
+
 	package_id = pk_console_perhaps_resolve (client, PK_FILTER_ENUM_INSTALLED, package, error);
 	if (package_id == NULL) {
 		g_print ("%s\n", _("Could not find a package with that name to update"));
 		return FALSE;
 	}
-	ret = pk_client_update_package (client, package_id, error);
+
+	package_ids = pk_package_ids_from_id (package_id);
+	ret = pk_client_update_packages (client, package_ids, error);
+	g_strfreev (package_ids);
 	g_free (package_id);
 	return ret;
 }
@@ -857,12 +857,15 @@ pk_console_get_requires (PkClient *client, const gchar *package, GError **error)
 {
 	gboolean ret;
 	gchar *package_id;
+	gchar **package_ids;
 	package_id = pk_console_perhaps_resolve (client, PK_FILTER_ENUM_NONE, package, error);
 	if (package_id == NULL) {
 		g_print ("%s\n", _("Could not find what packages require this package"));
 		return FALSE;
 	}
-	ret = pk_client_get_requires (client, PK_FILTER_ENUM_NONE, package_id, TRUE, error);
+	package_ids = pk_package_ids_from_id (package_id);
+	ret = pk_client_get_requires (client, PK_FILTER_ENUM_NONE, package_ids, TRUE, error);
+	g_strfreev (package_ids);
 	g_free (package_id);
 	return ret;
 }
@@ -875,12 +878,15 @@ pk_console_get_depends (PkClient *client, const gchar *package, GError **error)
 {
 	gboolean ret;
 	gchar *package_id;
+	gchar **package_ids;
 	package_id = pk_console_perhaps_resolve (client, PK_FILTER_ENUM_NONE, package, error);
 	if (package_id == NULL) {
 		g_print ("%s\n", _("Could not get dependencies for this package"));
 		return FALSE;
 	}
-	ret = pk_client_get_depends (client, PK_FILTER_ENUM_NONE, package_id, FALSE, error);
+	package_ids = pk_package_ids_from_id (package_id);
+	ret = pk_client_get_depends (client, PK_FILTER_ENUM_NONE, package_ids, FALSE, error);
+	g_strfreev (package_ids);
 	g_free (package_id);
 	return ret;
 }
@@ -893,12 +899,15 @@ pk_console_get_details (PkClient *client, const gchar *package, GError **error)
 {
 	gboolean ret;
 	gchar *package_id;
+	gchar **package_ids;
 	package_id = pk_console_perhaps_resolve (client, PK_FILTER_ENUM_NONE, package, error);
 	if (package_id == NULL) {
 		g_print ("%s\n", _("Could not find details for this package"));
 		return FALSE;
 	}
-	ret = pk_client_get_details (client, package_id, error);
+	package_ids = pk_package_ids_from_id (package_id);
+	ret = pk_client_get_details (client, package_ids, error);
+	g_strfreev (package_ids);
 	g_free (package_id);
 	return ret;
 }
@@ -911,12 +920,15 @@ pk_console_get_files (PkClient *client, const gchar *package, GError **error)
 {
 	gboolean ret;
 	gchar *package_id;
+	gchar **package_ids;
 	package_id = pk_console_perhaps_resolve (client, PK_FILTER_ENUM_NONE, package, error);
 	if (package_id == NULL) {
 		g_print (_("Could not find the files for this package"));
 		return FALSE;
 	}
-	ret = pk_client_get_files (client, package_id, error);
+	package_ids = pk_package_ids_from_id (package_id);
+	ret = pk_client_get_files (client, package_ids, error);
+	g_strfreev (package_ids);
 	g_free (package_id);
 	return ret;
 }
@@ -929,12 +941,15 @@ pk_console_get_update_detail (PkClient *client, const gchar *package, GError **e
 {
 	gboolean ret;
 	gchar *package_id;
+	gchar **package_ids;
 	package_id = pk_console_perhaps_resolve (client, PK_FILTER_ENUM_INSTALLED, package, error);
 	if (package_id == NULL) {
 		g_print ("%s\n", "Could not find the update details for this package");
 		return FALSE;
 	}
-	ret = pk_client_get_update_detail (client, package_id, error);
+	package_ids = pk_package_ids_from_id (package_id);
+	ret = pk_client_get_update_detail (client, package_ids, error);
+	g_strfreev (package_ids);
 	g_free (package_id);
 	return ret;
 }
@@ -1274,6 +1289,7 @@ main (int argc, char *argv[])
 	gchar *options_help;
 	gchar *filter = NULL;
 	gchar *summary;
+	gchar **package_ids;
 	gboolean ret;
 	const gchar *mode;
 	const gchar *value = NULL;
@@ -1486,7 +1502,9 @@ main (int argc, char *argv[])
 			g_print (_("You need to specify a package name to resolve"));
 			goto out;
 		}
-		ret = pk_client_resolve (client, filters, value, &error);
+		package_ids = pk_package_ids_from_id (value);
+		ret = pk_client_resolve (client, filters, package_ids, &error);
+		g_strfreev (package_ids);
 
 	} else if (strcmp (mode, "repo-enable") == 0) {
 		if (value == NULL) {
diff --git a/client/pk-import-specspo.c b/client/pk-import-specspo.c
index bffd45b..bc010ee 100644
--- a/client/pk-import-specspo.c
+++ b/client/pk-import-specspo.c
@@ -35,6 +35,7 @@
 #include <pk-client.h>
 #include <pk-common.h>
 #include <pk-package-id.h>
+#include <pk-package-ids.h>
 #include <pk-extra.h>
 
 #include "pk-import-common.h"
@@ -57,6 +58,7 @@ pk_import_specspo_get_summary (const gchar *name)
 	PkPackageItem *item;
 	GError *error = NULL;
 	PkPackageList *list;
+	gchar **names;
 
 	ret = pk_client_reset (client, &error);
 	if (!ret) {
@@ -67,7 +69,9 @@ pk_import_specspo_get_summary (const gchar *name)
 
 	pk_client_set_use_buffer (client, TRUE, NULL);
 	pk_client_set_synchronous (client, TRUE, NULL);
-	ret = pk_client_resolve (client, PK_FILTER_ENUM_NONE, name, &error);
+	names = pk_package_ids_from_id (name);
+	ret = pk_client_resolve (client, PK_FILTER_ENUM_NONE, names, &error);
+	g_strfreev (names);
 	if (!ret) {
 		pk_warning ("failed to resolve: %s", error->message);
 		g_error_free (error);
diff --git a/libpackagekit/pk-catalog.c b/libpackagekit/pk-catalog.c
index 17a0643..598b3d0 100644
--- a/libpackagekit/pk-catalog.c
+++ b/libpackagekit/pk-catalog.c
@@ -29,6 +29,7 @@
 #include "pk-common.h"
 #include "pk-client.h"
 #include "pk-package-list.h"
+#include "pk-package-ids.h"
 #include "pk-marshal.h"
 #include "pk-catalog.h"
 
@@ -112,6 +113,7 @@ pk_catalog_process_type (PkCatalog *catalog)
 	GError *error = NULL;
 	gchar **parts = NULL;
 	gchar *distro_id_part;
+	gchar **packages;
 	const gchar *package;
 	gboolean ret = TRUE;
 	guint i;
@@ -171,7 +173,9 @@ pk_catalog_process_type (PkCatalog *catalog)
 
 		/* do the actions */
 		if (mode == PK_CATALOG_PROGRESS_PACKAGES) {
-			ret = pk_client_resolve (catalog->priv->client, PK_FILTER_ENUM_NOT_INSTALLED, package, &error);
+			packages = pk_package_ids_from_id (package);
+			ret = pk_client_resolve (catalog->priv->client, PK_FILTER_ENUM_NOT_INSTALLED, packages, &error);
+			g_strfreev (packages);
 		} else if (mode == PK_CATALOG_PROGRESS_FILES) {
 			ret = pk_client_search_file (catalog->priv->client, PK_FILTER_ENUM_NOT_INSTALLED, package, &error);
 		} else if (mode == PK_CATALOG_PROGRESS_PROVIDES) {
diff --git a/libpackagekit/pk-client.c b/libpackagekit/pk-client.c
index 7ef665e..f525e43 100644
--- a/libpackagekit/pk-client.c
+++ b/libpackagekit/pk-client.c
@@ -1426,19 +1426,22 @@ pk_client_search_file (PkClient *client, PkFilterEnum filters, const gchar *sear
  * Return value: %TRUE if the daemon queued the transaction
  **/
 gboolean
-pk_client_get_depends (PkClient *client, PkFilterEnum filters, const gchar *package_id, gboolean recursive, GError **error)
+pk_client_get_depends (PkClient *client, PkFilterEnum filters, gchar **package_ids, gboolean recursive, GError **error)
 {
 	gboolean ret;
 	gchar *filter_text;
+	gchar *package_ids_temp;
 
 	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
-	g_return_val_if_fail (package_id != NULL, FALSE);
+	g_return_val_if_fail (package_ids != NULL, FALSE);
 
-	/* check the PackageID here to avoid a round trip if invalid */
-	ret = pk_package_id_check (package_id);
+	/* check the PackageIDs here to avoid a round trip if invalid */
+	ret = pk_package_ids_check (package_ids);
 	if (!ret) {
+		package_ids_temp = pk_package_ids_to_text (package_ids, ", ");
 		pk_client_error_set (error, PK_CLIENT_ERROR_INVALID_PACKAGEID,
-				     "package_id '%s' is not valid", package_id);
+				     "package_ids '%s' are not valid", package_ids_temp);
+		g_free (package_ids_temp);
 		return FALSE;
 	}
 
@@ -1451,7 +1454,7 @@ pk_client_get_depends (PkClient *client, PkFilterEnum filters, const gchar *pack
 	/* save this so we can re-issue it */
 	client->priv->role = PK_ROLE_ENUM_GET_DEPENDS;
 	client->priv->cached_filters = filters;
-	client->priv->cached_package_id = g_strdup (package_id);
+	client->priv->cached_package_ids = g_strdupv (package_ids);
 	client->priv->cached_force = recursive;
 
 	/* check to see if we have a valid proxy */
@@ -1462,7 +1465,7 @@ pk_client_get_depends (PkClient *client, PkFilterEnum filters, const gchar *pack
 	filter_text = pk_filter_enums_to_text (filters);
 	ret = dbus_g_proxy_call (client->priv->proxy, "GetDepends", error,
 				 G_TYPE_STRING, filter_text,
-				 G_TYPE_STRING, package_id,
+				 G_TYPE_STRV, package_ids,
 				 G_TYPE_BOOLEAN, recursive,
 				 G_TYPE_INVALID, G_TYPE_INVALID);
 	g_free (filter_text);
@@ -1543,19 +1546,22 @@ pk_client_get_packages (PkClient *client, PkFilterEnum filters, GError **error)
  * Return value: %TRUE if the daemon queued the transaction
  **/
 gboolean
-pk_client_get_requires (PkClient *client, PkFilterEnum filters, const gchar *package_id, gboolean recursive, GError **error)
+pk_client_get_requires (PkClient *client, PkFilterEnum filters, gchar **package_ids, gboolean recursive, GError **error)
 {
 	gboolean ret;
 	gchar *filter_text;
+	gchar *package_ids_temp;
 
 	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
-	g_return_val_if_fail (package_id != NULL, FALSE);
+	g_return_val_if_fail (package_ids != NULL, FALSE);
 
-	/* check the PackageID here to avoid a round trip if invalid */
-	ret = pk_package_id_check (package_id);
+	/* check the PackageIDs here to avoid a round trip if invalid */
+	ret = pk_package_ids_check (package_ids);
 	if (!ret) {
+		package_ids_temp = pk_package_ids_to_text (package_ids, ", ");
 		pk_client_error_set (error, PK_CLIENT_ERROR_INVALID_PACKAGEID,
-				     "package_id '%s' is not valid", package_id);
+				     "package_ids '%s' are not valid", package_ids_temp);
+		g_free (package_ids_temp);
 		return FALSE;
 	}
 
@@ -1568,7 +1574,7 @@ pk_client_get_requires (PkClient *client, PkFilterEnum filters, const gchar *pac
 	/* save this so we can re-issue it */
 	client->priv->role = PK_ROLE_ENUM_GET_REQUIRES;
 	client->priv->cached_filters = filters;
-	client->priv->cached_package_id = g_strdup (package_id);
+	client->priv->cached_package_ids = g_strdupv (package_ids);
 	client->priv->cached_force = recursive;
 
 	/* check to see if we have a valid proxy */
@@ -1579,7 +1585,7 @@ pk_client_get_requires (PkClient *client, PkFilterEnum filters, const gchar *pac
 	filter_text = pk_filter_enums_to_text (filters);
 	ret = dbus_g_proxy_call (client->priv->proxy, "GetRequires", error,
 				 G_TYPE_STRING, filter_text,
-				 G_TYPE_STRING, package_id,
+				 G_TYPE_STRV, package_ids,
 				 G_TYPE_BOOLEAN, recursive,
 				 G_TYPE_INVALID, G_TYPE_INVALID);
 	g_free (filter_text);
@@ -1673,18 +1679,21 @@ pk_client_what_provides (PkClient *client, PkFilterEnum filters, PkProvidesEnum
  * Return value: %TRUE if the daemon queued the transaction
  **/
 gboolean
-pk_client_get_update_detail (PkClient *client, const gchar *package_id, GError **error)
+pk_client_get_update_detail (PkClient *client, gchar **package_ids, GError **error)
 {
 	gboolean ret;
+	gchar *package_ids_temp;
 
 	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
-	g_return_val_if_fail (package_id != NULL, FALSE);
+	g_return_val_if_fail (package_ids != NULL, FALSE);
 
-	/* check the PackageID here to avoid a round trip if invalid */
-	ret = pk_package_id_check (package_id);
+	/* check the PackageIDs here to avoid a round trip if invalid */
+	ret = pk_package_ids_check (package_ids);
 	if (!ret) {
+		package_ids_temp = pk_package_ids_to_text (package_ids, ", ");
 		pk_client_error_set (error, PK_CLIENT_ERROR_INVALID_PACKAGEID,
-				     "package_id '%s' is not valid", package_id);
+				     "package_ids '%s' are not valid", package_ids_temp);
+		g_free (package_ids_temp);
 		return FALSE;
 	}
 
@@ -1696,7 +1705,7 @@ pk_client_get_update_detail (PkClient *client, const gchar *package_id, GError *
 
 	/* save this so we can re-issue it */
 	client->priv->role = PK_ROLE_ENUM_GET_UPDATE_DETAIL;
-	client->priv->cached_package_id = g_strdup (package_id);
+	client->priv->cached_package_ids = g_strdupv (package_ids);
 
 	/* check to see if we have a valid proxy */
 	if (client->priv->proxy == NULL) {
@@ -1704,7 +1713,7 @@ pk_client_get_update_detail (PkClient *client, const gchar *package_id, GError *
 		return FALSE;
 	}
 	ret = dbus_g_proxy_call (client->priv->proxy, "GetUpdateDetail", error,
-				 G_TYPE_STRING, package_id,
+				 G_TYPE_STRV, package_ids,
 				 G_TYPE_INVALID, G_TYPE_INVALID);
 	if (ret && !client->priv->is_finished) {
 		/* allow clients to respond in the status changed callback */
@@ -1782,13 +1791,13 @@ pk_client_rollback (PkClient *client, const gchar *transaction_id, GError **erro
  * Return value: %TRUE if the daemon queued the transaction
  **/
 gboolean
-pk_client_resolve (PkClient *client, PkFilterEnum filters, const gchar *package, GError **error)
+pk_client_resolve (PkClient *client, PkFilterEnum filters, gchar **packages, GError **error)
 {
 	gboolean ret;
 	gchar *filter_text;
 
 	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
-	g_return_val_if_fail (package != NULL, FALSE);
+	g_return_val_if_fail (packages != NULL, FALSE);
 
 	/* get and set a new ID */
 	ret = pk_client_allocate_transaction_id (client, error);
@@ -1799,7 +1808,7 @@ pk_client_resolve (PkClient *client, PkFilterEnum filters, const gchar *package,
 	/* save this so we can re-issue it */
 	client->priv->role = PK_ROLE_ENUM_RESOLVE;
 	client->priv->cached_filters = filters;
-	client->priv->cached_package_id = g_strdup (package);
+	client->priv->cached_package_ids = g_strdupv (packages);
 
 	/* check to see if we have a valid proxy */
 	if (client->priv->proxy == NULL) {
@@ -1809,7 +1818,7 @@ pk_client_resolve (PkClient *client, PkFilterEnum filters, const gchar *package,
 	filter_text = pk_filter_enums_to_text (filters);
 	ret = dbus_g_proxy_call (client->priv->proxy, "Resolve", error,
 				 G_TYPE_STRING, filter_text,
-				 G_TYPE_STRING, package,
+				 G_TYPE_STRV, packages,
 				 G_TYPE_INVALID, G_TYPE_INVALID);
 	g_free (filter_text);
 	if (ret && !client->priv->is_finished) {
@@ -1837,18 +1846,21 @@ pk_client_resolve (PkClient *client, PkFilterEnum filters, const gchar *package,
  * Return value: %TRUE if the daemon queued the transaction
  **/
 gboolean
-pk_client_get_details (PkClient *client, const gchar *package_id, GError **error)
+pk_client_get_details (PkClient *client, gchar **package_ids, GError **error)
 {
 	gboolean ret;
+	gchar *package_ids_temp;
 
 	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
-	g_return_val_if_fail (package_id != NULL, FALSE);
+	g_return_val_if_fail (package_ids != NULL, FALSE);
 
-	/* check the PackageID here to avoid a round trip if invalid */
-	ret = pk_package_id_check (package_id);
+	/* check the PackageIDs here to avoid a round trip if invalid */
+	ret = pk_package_ids_check (package_ids);
 	if (!ret) {
+		package_ids_temp = pk_package_ids_to_text (package_ids, ", ");
 		pk_client_error_set (error, PK_CLIENT_ERROR_INVALID_PACKAGEID,
-				     "package_id '%s' is not valid", package_id);
+				     "package_ids '%s' are not valid", package_ids_temp);
+		g_free (package_ids_temp);
 		return FALSE;
 	}
 
@@ -1860,7 +1872,7 @@ pk_client_get_details (PkClient *client, const gchar *package_id, GError **error
 
 	/* save this so we can re-issue it */
 	client->priv->role = PK_ROLE_ENUM_GET_DETAILS;
-	client->priv->cached_package_id = g_strdup (package_id);
+	client->priv->cached_package_ids = g_strdupv (package_ids);
 
 	/* check to see if we have a valid proxy */
 	if (client->priv->proxy == NULL) {
@@ -1868,7 +1880,7 @@ pk_client_get_details (PkClient *client, const gchar *package_id, GError **error
 		return FALSE;
 	}
 	ret = dbus_g_proxy_call (client->priv->proxy, "GetDetails", error,
-				 G_TYPE_STRING, package_id,
+				 G_TYPE_STRV, package_ids,
 				 G_TYPE_INVALID, G_TYPE_INVALID);
 	if (ret && !client->priv->is_finished) {
 		/* allow clients to respond in the status changed callback */
@@ -1894,18 +1906,21 @@ pk_client_get_details (PkClient *client, const gchar *package_id, GError **error
  * Return value: %TRUE if the daemon queued the transaction
  **/
 gboolean
-pk_client_get_files (PkClient *client, const gchar *package_id, GError **error)
+pk_client_get_files (PkClient *client, gchar **package_ids, GError **error)
 {
 	gboolean ret;
+	gchar *package_ids_temp;
 
 	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
-	g_return_val_if_fail (package_id != NULL, FALSE);
+	g_return_val_if_fail (package_ids != NULL, FALSE);
 
-	/* check the PackageID here to avoid a round trip if invalid */
-	ret = pk_package_id_check (package_id);
+	/* check the PackageIDs here to avoid a round trip if invalid */
+	ret = pk_package_ids_check (package_ids);
 	if (!ret) {
+		package_ids_temp = pk_package_ids_to_text (package_ids, ", ");
 		pk_client_error_set (error, PK_CLIENT_ERROR_INVALID_PACKAGEID,
-				     "package_id '%s' is not valid", package_id);
+				     "package_ids '%s' are not valid", package_ids_temp);
+		g_free (package_ids_temp);
 		return FALSE;
 	}
 
@@ -1917,7 +1932,7 @@ pk_client_get_files (PkClient *client, const gchar *package_id, GError **error)
 
 	/* save this so we can re-issue it */
 	client->priv->role = PK_ROLE_ENUM_GET_FILES;
-	client->priv->cached_package_id = g_strdup (package_id);
+	client->priv->cached_package_ids = g_strdupv (package_ids);
 
 	/* check to see if we have a valid proxy */
 	if (client->priv->proxy == NULL) {
@@ -1925,7 +1940,7 @@ pk_client_get_files (PkClient *client, const gchar *package_id, GError **error)
 		return FALSE;
 	}
 	ret = dbus_g_proxy_call (client->priv->proxy, "GetFiles", error,
-				 G_TYPE_STRING, package_id,
+				 G_TYPE_STRV, package_ids,
 				 G_TYPE_INVALID, G_TYPE_INVALID);
 	if (ret && !client->priv->is_finished) {
 		/* allow clients to respond in the status changed callback */
@@ -2423,103 +2438,6 @@ pk_client_update_packages (PkClient *client, gchar **package_ids, GError **error
 }
 
 /**
- * pk_client_update_package:
- * @client: a valid #PkClient instance
- * @package_id: a package_id structure such as "gnome-power-manager;0.0.1;i386;fedora"
- * @error: a %GError to put the error code and message in, or %NULL
- *
- * Update a specific package to the newest available version.
- *
- * Return value: %TRUE if the daemon queued the transaction
- **/
-gboolean
-pk_client_update_package (PkClient *client, const gchar *package_id, GError **error)
-{
-	gchar **package_ids;
-	gboolean ret;
-	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
-	g_return_val_if_fail (package_id != NULL, FALSE);
-
-	package_ids = g_strsplit (package_id, "|", 1);
-	ret = pk_client_update_packages (client, package_ids, error);
-	g_strfreev (package_ids);
-	return ret;
-}
-
-/**
- * pk_client_install_package:
- * @client: a valid #PkClient instance
- * @package_id: a package_id structure such as "gnome-power-manager;0.0.1;i386;fedora"
- * @error: a %GError to put the error code and message in, or %NULL
- *
- * Install a specific package.
- *
- * Return value: %TRUE if the daemon queued the transaction
- **/
-gboolean
-pk_client_install_package (PkClient *client, const gchar *package_id, GError **error)
-{
-	gchar **package_ids;
-	gboolean ret;
-	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
-	g_return_val_if_fail (package_id != NULL, FALSE);
-
-	package_ids = g_strsplit (package_id, "|", 1);
-	ret = pk_client_install_packages (client, package_ids, error);
-	g_strfreev (package_ids);
-	return ret;
-}
-
-/**
- * pk_client_install_file:
- * @client: a valid #PkClient instance
- * @package_id: a package_id structure such as "gnome-power-manager;0.0.1;i386;fedora"
- * @error: a %GError to put the error code and message in, or %NULL
- *
- * Install a specific package.
- *
- * Return value: %TRUE if the daemon queued the transaction
- **/
-gboolean
-pk_client_install_file (PkClient *client, gboolean trusted, const gchar *file_rel, GError **error)
-{
-	gchar **files_rel;
-	gboolean ret;
-	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
-	g_return_val_if_fail (file_rel != NULL, FALSE);
-
-	files_rel = g_strsplit (file_rel, "|", 1);
-	ret = pk_client_install_files (client, trusted, files_rel, error);
-	g_strfreev (files_rel);
-	return ret;
-}
-
-/**
- * pk_client_remove_package:
- * @client: a valid #PkClient instance
- * @package_id: a package_id structure such as "gnome-power-manager;0.0.1;i386;fedora"
- * @error: a %GError to put the error code and message in, or %NULL
- *
- * Remove a specific package.
- *
- * Return value: %TRUE if the daemon queued the transaction
- **/
-gboolean
-pk_client_remove_package (PkClient *client, const gchar *package_id, gboolean allow_deps,
-			  gboolean autoremove, GError **error)
-{
-	gchar **package_ids;
-	gboolean ret;
-	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
-	g_return_val_if_fail (package_id != NULL, FALSE);
-
-	package_ids = g_strsplit (package_id, "|", 1);
-	ret = pk_client_remove_packages (client, package_ids, allow_deps, autoremove, error);
-	g_strfreev (package_ids);
-	return ret;
-}
-
-/**
  * pk_client_install_files_action:
  **/
 static gboolean
@@ -3075,19 +2993,19 @@ pk_client_requeue (PkClient *client, GError **error)
 
 	/* do the correct action with the cached parameters */
 	if (priv->role == PK_ROLE_ENUM_GET_DEPENDS) {
-		ret = pk_client_get_depends (client, priv->cached_filters, priv->cached_package_id, priv->cached_force, error);
+		ret = pk_client_get_depends (client, priv->cached_filters, priv->cached_package_ids, priv->cached_force, error);
 	} else if (priv->role == PK_ROLE_ENUM_GET_UPDATE_DETAIL) {
-		ret = pk_client_get_update_detail (client, priv->cached_package_id, error);
+		ret = pk_client_get_update_detail (client, priv->cached_package_ids, error);
 	} else if (priv->role == PK_ROLE_ENUM_RESOLVE) {
-		ret = pk_client_resolve (client, priv->cached_filters, priv->cached_package_id, error);
+		ret = pk_client_resolve (client, priv->cached_filters, priv->cached_package_ids, error);
 	} else if (priv->role == PK_ROLE_ENUM_ROLLBACK) {
 		ret = pk_client_rollback (client, priv->cached_transaction_id, error);
 	} else if (priv->role == PK_ROLE_ENUM_GET_DETAILS) {
-		ret = pk_client_get_details (client, priv->cached_package_id, error);
+		ret = pk_client_get_details (client, priv->cached_package_ids, error);
 	} else if (priv->role == PK_ROLE_ENUM_GET_FILES) {
-		ret = pk_client_get_files (client, priv->cached_package_id, error);
+		ret = pk_client_get_files (client, priv->cached_package_ids, error);
 	} else if (priv->role == PK_ROLE_ENUM_GET_REQUIRES) {
-		ret = pk_client_get_requires (client, priv->cached_filters, priv->cached_package_id, priv->cached_force, error);
+		ret = pk_client_get_requires (client, priv->cached_filters, priv->cached_package_ids, priv->cached_force, error);
 	} else if (priv->role == PK_ROLE_ENUM_GET_UPDATES) {
 		ret = pk_client_get_updates (client, priv->cached_filters, error);
 	} else if (priv->role == PK_ROLE_ENUM_SEARCH_DETAILS) {
diff --git a/libpackagekit/pk-client.h b/libpackagekit/pk-client.h
index 6617159..1582488 100644
--- a/libpackagekit/pk-client.h
+++ b/libpackagekit/pk-client.h
@@ -229,7 +229,7 @@ gboolean	 pk_client_search_file			(PkClient	*client,
 							 G_GNUC_WARN_UNUSED_RESULT;
 gboolean	 pk_client_get_depends			(PkClient	*client,
 							 PkFilterEnum	 filters,
-							 const gchar	*package_id,
+							 gchar		**package_ids,
 							 gboolean	 recursive,
 							 GError		**error)
 							 G_GNUC_WARN_UNUSED_RESULT;
@@ -238,12 +238,12 @@ gboolean	 pk_client_get_packages			(PkClient	*client,
 							 GError		**error)
 							 G_GNUC_WARN_UNUSED_RESULT;
 gboolean	 pk_client_get_update_detail		(PkClient	*client,
-							 const gchar	*package_id,
+							 gchar		**package_ids,
 							 GError		**error)
 							 G_GNUC_WARN_UNUSED_RESULT;
 gboolean	 pk_client_get_requires			(PkClient	*client,
 							 PkFilterEnum	 filters,
-							 const gchar	*package_id,
+							 gchar		**package_ids,
 							 gboolean	 recursive,
 							 GError		**error)
 							 G_GNUC_WARN_UNUSED_RESULT;
@@ -254,16 +254,10 @@ gboolean	 pk_client_what_provides		(PkClient	*client,
 							 GError		**error)
 							 G_GNUC_WARN_UNUSED_RESULT;
 gboolean	 pk_client_get_details			(PkClient	*client,
-							 const gchar	*package_id,
+							 gchar		**package_ids,
 							 GError		**error);
 gboolean	 pk_client_get_files			(PkClient	*client,
-							 const gchar	*package_id,
-							 GError		**error)
-							 G_GNUC_WARN_UNUSED_RESULT;
-gboolean	 pk_client_remove_package		(PkClient	*client,
-							 const gchar	*package_id,
-							 gboolean	 allow_deps,
-							 gboolean	 autoremove,
+							 gchar		**package_ids,
 							 GError		**error)
 							 G_GNUC_WARN_UNUSED_RESULT;
 gboolean	 pk_client_remove_packages		(PkClient	*client,
@@ -276,10 +270,6 @@ gboolean	 pk_client_refresh_cache		(PkClient	*client,
 							 gboolean	 force,
 							 GError		**error)
 							 G_GNUC_WARN_UNUSED_RESULT;
-gboolean	 pk_client_install_package		(PkClient	*client,
-							 const gchar	*package_id,
-							 GError		**error)
-							 G_GNUC_WARN_UNUSED_RESULT;
 gboolean	 pk_client_install_packages		(PkClient	*client,
 							 gchar		**package_ids,
 							 GError		**error)
@@ -290,10 +280,6 @@ gboolean	 pk_client_install_signature		(PkClient	*client,
 							 const gchar	*package_id,
 							 GError		**error)
 							 G_GNUC_WARN_UNUSED_RESULT;
-gboolean	 pk_client_update_package		(PkClient	*client,
-							 const gchar	*package_id,
-							 GError		**error)
-							 G_GNUC_WARN_UNUSED_RESULT;
 gboolean	 pk_client_update_packages		(PkClient	*client,
 							 gchar		**package_ids,
 							 GError		**error)
@@ -310,7 +296,7 @@ gboolean	 pk_client_install_file			(PkClient	*client,
 							 G_GNUC_WARN_UNUSED_RESULT;
 gboolean	 pk_client_resolve			(PkClient	*client,
 							 PkFilterEnum	 filters,
-							 const gchar	*package,
+							 gchar		**packages,
 							 GError		**error)
 							 G_GNUC_WARN_UNUSED_RESULT;
 gboolean	 pk_client_rollback			(PkClient	*client,
diff --git a/libpackagekit/pk-package-ids.c b/libpackagekit/pk-package-ids.c
index 933da1f..ad6f232 100644
--- a/libpackagekit/pk-package-ids.c
+++ b/libpackagekit/pk-package-ids.c
@@ -40,6 +40,21 @@
 #include "pk-package-ids.h"
 
 /**
+ * pk_package_ids_from_id:
+ * @package_id: A single package_id
+ *
+ * Form a composite string array of package_id's from
+ * a single package_id
+ *
+ * Return value: the string array, or %NULL if invalid, free with g_strfreev()
+ **/
+gchar **
+pk_package_ids_from_id (const gchar *package_id)
+{
+	return g_strsplit (package_id, "|", 1);
+}
+
+/**
  * pk_package_ids_from_array:
  * @array: the GPtrArray of package_id's
  *
@@ -160,9 +175,13 @@ pk_package_ids_to_text (gchar **package_ids, const gchar *delimiter)
 	GString *string;
 	gchar *string_ret;
 
-	g_return_val_if_fail (package_ids != NULL, NULL);
 	g_return_val_if_fail (delimiter != NULL, NULL);
 
+	/* special case as this is allowed */
+	if (package_ids == NULL) {
+		return g_strdup ("(null)");
+	}
+
 	string = g_string_new ("");
 
 	/* get size once */
diff --git a/libpackagekit/pk-package-ids.h b/libpackagekit/pk-package-ids.h
index 194a58e..a7cc7ee 100644
--- a/libpackagekit/pk-package-ids.h
+++ b/libpackagekit/pk-package-ids.h
@@ -26,6 +26,7 @@
 
 G_BEGIN_DECLS
 
+gchar		**pk_package_ids_from_id		(const gchar	*package_id);
 gchar		**pk_package_ids_from_array		(GPtrArray	*array);
 gchar		**pk_package_ids_from_va_list		(const gchar	*package_id_first,
 							 va_list	*args);
diff --git a/python/packagekit/backend.py b/python/packagekit/backend.py
index e701e23..96cd50d 100644
--- a/python/packagekit/backend.py
+++ b/python/packagekit/backend.py
@@ -140,12 +140,12 @@ class PackageKitBaseBackend:
         print >> sys.stdout,"details\t%s\t%s\t%s\t%s\t%s\t%ld" % (id,license,group,desc,url,bytes)
         sys.stdout.flush()
 
-    def files(self, id, file_list):
+    def files(self,id,file_list):
         '''
         Send 'files' signal
         @param file_list: List of the files in the package, separated by ';'
         '''
-        print >> sys.stdout,"files\t%s\t%s" % (id, file_list)
+        print >> sys.stdout,"files\t%s\t%s" % (id,file_list)
         sys.stdout.flush()
 
     def update_detail(self,id,updates,obsoletes,vendor_url,bugzilla_url,cve_url,restart,update_text):
@@ -208,7 +208,7 @@ class PackageKitBaseBackend:
         ''' split up a package id name;ver;arch;data into a tuple
             containing (name,ver,arch,data)
         '''
-        return tuple(id.split(';', 4))
+        return tuple(id.split(';',4))
 
     def check_license_field(self,license_field):
         '''
@@ -304,14 +304,14 @@ class PackageKitBaseBackend:
         '''
         self.error(ERROR_NOT_SUPPORTED,"This function is not implemented in this backend")
 
-    def get_update_detail(self,package):
+    def get_update_detail(self,package_ids_ids):
         '''
         Implement the {backend}-get-update-detail functionality
         Needed to be implemented in a sub class
         '''
         self.error(ERROR_NOT_SUPPORTED,"This function is not implemented in this backend")
 
-    def get_depends(self,filters,package,recursive):
+    def get_depends(self,filters,package_ids,recursive):
         '''
         Implement the {backend}-get-depends functionality
         Needed to be implemented in a sub class
@@ -325,7 +325,7 @@ class PackageKitBaseBackend:
         '''
         self.error(ERROR_NOT_SUPPORTED,"This function is not implemented in this backend")
 
-    def get_requires(self,filters,package,recursive):
+    def get_requires(self,filters,package_ids,recursive):
         '''
         Implement the {backend}-get-requires functionality
         Needed to be implemented in a sub class
@@ -353,14 +353,14 @@ class PackageKitBaseBackend:
         '''
         self.error(ERROR_NOT_SUPPORTED,"This function is not implemented in this backend")
 
-    def install_packages(self, packages):
+    def install_packages(self,package_ids):
         '''
         Implement the {backend}-install functionality
         Needed to be implemented in a sub class
         '''
         self.error(ERROR_NOT_SUPPORTED,"This function is not implemented in this backend")
 
-    def install_files (self, trusted, inst_files):
+    def install_files (self,trusted,inst_files):
         '''
         Implement the {backend}-install_files functionality
         Install the package containing the inst_file file
@@ -368,7 +368,7 @@ class PackageKitBaseBackend:
         '''
         self.error(ERROR_NOT_SUPPORTED,"This function is not implemented in this backend")
 
-    def service_pack (self, location):
+    def service_pack (self,location):
         '''
         Implement the {backend}-service-pack functionality
         Update the computer from a service pack in location
@@ -376,40 +376,40 @@ class PackageKitBaseBackend:
         '''
         self.error(ERROR_NOT_SUPPORTED,"This function is not implemented in this backend")
 
-    def resolve(self, name):
+    def resolve(self,name):
         '''
         Implement the {backend}-resolve functionality
         Needed to be implemented in a sub class
         '''
         self.error(ERROR_NOT_SUPPORTED,"This function is not implemented in this backend")
 
-    def remove_packages(self, allowdep, packages):
+    def remove_packages(self,allowdep,package_ids):
         '''
         Implement the {backend}-remove functionality
         Needed to be implemented in a sub class
         '''
         self.error(ERROR_NOT_SUPPORTED,"This function is not implemented in this backend")
 
-    def update_packages(self, package):
+    def update_packages(self,package):
         '''
         Implement the {backend}-update functionality
         Needed to be implemented in a sub class
         '''
         self.error(ERROR_NOT_SUPPORTED,"This function is not implemented in this backend")
 
-    def get_details(self, package):
+    def get_details(self,package):
         '''
         Implement the {backend}-get-details functionality
         Needed to be implemented in a sub class
         '''
         self.error(ERROR_NOT_SUPPORTED,"This function is not implemented in this backend")
 
-    def get_files(self, package):
+    def get_files(self,package):
         '''
         Implement the {backend}-get-files functionality
         Needed to be implemented in a sub class
         '''
-        self.error(ERROR_NOT_SUPPORTED, "This function is not implemented in this backend")
+        self.error(ERROR_NOT_SUPPORTED,"This function is not implemented in this backend")
 
     def get_updates(self,filter):
         '''
@@ -418,21 +418,21 @@ class PackageKitBaseBackend:
         '''
         self.error(ERROR_NOT_SUPPORTED,"This function is not implemented in this backend")
 
-    def repo_enable(self, repoid, enable):
+    def repo_enable(self,repoid,enable):
         '''
         Implement the {backend}-repo-enable functionality
         Needed to be implemented in a sub class
         '''
         self.error(ERROR_NOT_SUPPORTED,"This function is not implemented in this backend")
 
-    def repo_set_data(self, repoid, parameter, value):
+    def repo_set_data(self,repoid,parameter,value):
         '''
         Implement the {backend}-repo-set-data functionality
         Needed to be implemented in a sub class
         '''
         self.error(ERROR_NOT_SUPPORTED,"This function is not implemented in this backend")
 
-    def get_repo_list(self, filters):
+    def get_repo_list(self,filters):
         '''
         Implement the {backend}-get-repo-list functionality
         Needed to be implemented in a sub class
@@ -540,7 +540,7 @@ class PackagekitProgress:
         self.percent = startpct + incr
 
 
-def exceptionHandler(typ, value, tb, base):
+def exceptionHandler(typ,value,tb,base):
     # Restore original exception handler
     sys.excepthook = sys.__excepthook__
     # Call backend custom Traceback handler
@@ -549,13 +549,13 @@ def exceptionHandler(typ, value, tb, base):
         errmsg = 'Error Type: %s;' % str(typ)
         errmsg += 'Error Value: %s;' % str(value)
         for tub in etb:
-            f,l,m,c = tub # file,lineno, function, codeline
-            errmsg += '  File : %s , line %s, in %s;' % (f,str(l),m)
+            f,l,m,c = tub # file,lineno,function,codeline
+            errmsg += '  File : %s, line %s, in %s;' % (f,str(l),m)
             errmsg += '    %s;' % c
         # send the traceback to PackageKit
         base.error(ERROR_INTERNAL_ERROR,errmsg,exit=True)
 
 
 def installExceptionHandler(base):
-    sys.excepthook = lambda typ, value, tb: exceptionHandler(typ, value, tb,base)
+    sys.excepthook = lambda typ,value,tb: exceptionHandler(typ,value,tb,base)
 
diff --git a/python/packagekit/daemonBackend.py b/python/packagekit/daemonBackend.py
index 9fd627a..5632ae4 100644
--- a/python/packagekit/daemonBackend.py
+++ b/python/packagekit/daemonBackend.py
@@ -44,7 +44,7 @@ logging.basicConfig(format="%(levelname)s:%(message)s")
 pklog = logging.getLogger("PackageKitBackend")
 pklog.setLevel(logging.DEBUG)
 
-syslog = logging.handlers.SysLogHandler(facility=logging.handlers.SysLogHandler.LOG_DAEMON, address='/dev/log')
+syslog = logging.handlers.SysLogHandler(facility=logging.handlers.SysLogHandler.LOG_DAEMON,address='/dev/log')
 formatter = logging.Formatter('PackageKit: %(levelname)s: %(message)s')
 syslog.setFormatter(formatter)
 pklog.addHandler(syslog)
@@ -66,13 +66,13 @@ def forked(func):
     
     def doCancel(self):
         if self._child_pid:
-            os.kill(self._child_pid, signal.SIGQUIT)
+            os.kill(self._child_pid,signal.SIGQUIT)
             self._child_pid = None
             self.Finished(EXIT_SUCCESS)
             return
         self.Finished(EXIT_FAILED)
     '''
-    def wrapper(*args, **kwargs):
+    def wrapper(*args,**kwargs):
         self = args[0]
         self.AllowCancel(True)
         # Make sure that we are not in the worker process
@@ -82,7 +82,7 @@ def forked(func):
         # Make sure that there is no another child process running
         retries = 0
         while self._is_child_running() and retries < 5:
-            pklog.warning("Method called, but a child is already running")
+            pklog.warning("Method called,but a child is already running")
             time.sleep(0.1)
             retries += 1
         if self._is_child_running():
@@ -95,10 +95,10 @@ def forked(func):
         self.last_action_time = time.time()
         self._child_pid = os.fork()
         if self._child_pid > 0:
-            gobject.child_watch_add(self._child_pid, self.on_child_exit)
+            gobject.child_watch_add(self._child_pid,self.on_child_exit)
             return
         self.loop.quit()
-        sys.exit(func(*args, **kwargs))
+        sys.exit(func(*args,**kwargs))
     return wrapper
 
 class PackageKitThread(threading.Thread):
@@ -109,7 +109,7 @@ class PackageKitThread(threading.Thread):
     def run(self):
         try:
             threading.Thread.run(self)
-        except (KeyboardInterrupt, SystemExit):
+        except (KeyboardInterrupt,SystemExit):
            raise
         except:
            sys.excepthook(*sys.exc_info())
@@ -118,10 +118,10 @@ def threaded(func):
     '''
     Decorator to run a PackageKitBaseBackend method in a separate thread
     '''
-    def wrapper(*args, **kwargs):
+    def wrapper(*args,**kwargs):
         backend = args[0]
         backend.last_action_time = time.time()
-        thread = PackageKitThread(target=func, args=args, kwargs=kwargs)
+        thread = PackageKitThread(target=func,args=args,kwargs=kwargs)
         thread.start()
     wrapper.__name__ = func.__name__
     return wrapper
@@ -130,10 +130,10 @@ def async(func):
     '''
     Decorator which makes sure no other threads are running before executing function.
     '''
-    def wrapper(*args, **kwargs):
+    def wrapper(*args,**kwargs):
         backend = args[0]
         backend._lock.acquire()
-        func(*args, **kwargs)
+        func(*args,**kwargs)
         backend._lock.release()
     wrapper.__name__ = func.__name__
     return wrapper
@@ -159,12 +159,12 @@ class PackageKitBaseBackend(dbus.service.Object):
 #            self = args[0]
 #            self.last_action_time = time.time()
 #
-#            return func(*args, **kwargs)
+#            return func(*args,**kwargs)
 #
 #        return wrapper
 
-    def __init__(self, bus_name, dbus_path):
-        dbus.service.Object.__init__(self, bus_name, dbus_path)
+    def __init__(self,bus_name,dbus_path):
+        dbus.service.Object.__init__(self,bus_name,dbus_path)
         sys.excepthook = self._excepthook
 
         self._allow_cancel = False
@@ -173,7 +173,7 @@ class PackageKitBaseBackend(dbus.service.Object):
 
         self.loop = gobject.MainLoop()
 
-        gobject.timeout_add(INACTIVE_CHECK_INTERVAL, self.check_for_inactivity)
+        gobject.timeout_add(INACTIVE_CHECK_INTERVAL,self.check_for_inactivity)
         self.last_action_time = time.time()
 
         self.loop.run()
@@ -184,19 +184,19 @@ class PackageKitBaseBackend(dbus.service.Object):
             self.Exit()
         return True
 
-    def on_child_exit(pid, condition, data):
+    def on_child_exit(pid,condition,data):
         pass
 
     def _is_child_running(self):
         pklog.debug("in child_is_running")
         if self._child_pid:
-            pklog.debug("in child_is_running, pid = %s" % self._child_pid)
+            pklog.debug("in child_is_running,pid = %s" % self._child_pid)
             running = True
             try:
-                (pid, status) = os.waitpid(self._child_pid, os.WNOHANG)
+                (pid,status) = os.waitpid(self._child_pid,os.WNOHANG)
                 if pid:
                     running = False
-            except OSError, e:
+            except OSError,e:
                 pklog.error("OS Error: %s" % str(e))
                 running = False
 
@@ -218,44 +218,44 @@ class PackageKitBaseBackend(dbus.service.Object):
     @PKSignalHouseKeeper
     @dbus.service.signal(dbus_interface=PACKAGEKIT_DBUS_INTERFACE,
                          signature='s')
-    def Finished(self, exit):
+    def Finished(self,exit):
         pklog.info("Finished (%s)" % (exit))
 
     @PKSignalHouseKeeper
     @dbus.service.signal(dbus_interface=PACKAGEKIT_DBUS_INTERFACE,
                          signature='ssb')
-    def RepoDetail(self, repo_id, description, enabled):
-        pklog.info("RepoDetail (%s, %s, %i)" % (repo_id, description, enabled))
+    def RepoDetail(self,repo_id,description,enabled):
+        pklog.info("RepoDetail (%s,%s,%i)" % (repo_id,description,enabled))
 
     @PKSignalHouseKeeper
     @dbus.service.signal(dbus_interface=PACKAGEKIT_DBUS_INTERFACE,
                          signature='b')
-    def AllowCancel(self, allow_cancel):
+    def AllowCancel(self,allow_cancel):
         self._allow_cancel = allow_cancel
         pklog.info("AllowCancel (%i)" % allow_cancel)
 
     @PKSignalHouseKeeper
     @dbus.service.signal(dbus_interface=PACKAGEKIT_DBUS_INTERFACE,
                          signature='sss')
-    def Package(self, status, package_id, summary):
-        pklog.info("Package (%s, %s, %s)" % (status, package_id, summary))
+    def Package(self,status,package_id,summary):
+        pklog.info("Package (%s,%s,%s)" % (status,package_id,summary))
 
     @PKSignalHouseKeeper
     @dbus.service.signal(dbus_interface=PACKAGEKIT_DBUS_INTERFACE,
                          signature='ssssst')
-    def Details(self, package_id, license, group, detail, url, size):
-        pklog.info("Details (%s, %s, %s, %s, %s, %u)" % (package_id, license, group, detail, url, size))
+    def Details(self,package_id,license,group,detail,url,size):
+        pklog.info("Details (%s,%s,%s,%s,%s,%u)" % (package_id,license,group,detail,url,size))
 
     @PKSignalHouseKeeper
     @dbus.service.signal(dbus_interface=PACKAGEKIT_DBUS_INTERFACE,
                          signature='ss')
-    def Files(self, package_id, file_list):
-        pklog.info("Files (%s, %s)" % (package_id, file_list))
+    def Files(self,package_id,file_list):
+        pklog.info("Files (%s,%s)" % (package_id,file_list))
 
     @PKSignalHouseKeeper
     @dbus.service.signal(dbus_interface=PACKAGEKIT_DBUS_INTERFACE,
                          signature='s')
-    def StatusChanged(self, status):
+    def StatusChanged(self,status):
         pklog.info("StatusChanged (%s)" % (status))
 
     @PKSignalHouseKeeper
@@ -266,31 +266,31 @@ class PackageKitBaseBackend(dbus.service.Object):
     @PKSignalHouseKeeper
     @dbus.service.signal(dbus_interface=PACKAGEKIT_DBUS_INTERFACE,
                          signature='u')
-    def PercentageChanged(self, percentage):
+    def PercentageChanged(self,percentage):
         pklog.info("PercentageChanged (%i)" % (percentage))
 
     @PKSignalHouseKeeper
     @dbus.service.signal(dbus_interface=PACKAGEKIT_DBUS_INTERFACE,
                          signature='u')
-    def SubPercentageChanged(self, percentage):
+    def SubPercentageChanged(self,percentage):
         pklog.info("SubPercentageChanged (%i)" % (percentage))
 
     @PKSignalHouseKeeper
     @dbus.service.signal(dbus_interface=PACKAGEKIT_DBUS_INTERFACE,
                          signature='ssssssss')
-    def UpdateDetail(self, package_id, updates, obsoletes, vendor_url, bugzilla_url, cve_url, restart, update):
-        pklog.info("UpdateDetail (%s, %s, %s, %s, %s, %s, %s, %s)" % (package_id, updates, obsoletes, vendor_url, bugzilla_url, cve_url, restart, update))
+    def UpdateDetail(self,package_id,updates,obsoletes,vendor_url,bugzilla_url,cve_url,restart,update):
+        pklog.info("UpdateDetail (%s,%s,%s,%s,%s,%s,%s,%s)" % (package_id,updates,obsoletes,vendor_url,bugzilla_url,cve_url,restart,update))
 
     @PKSignalHouseKeeper
     @dbus.service.signal(dbus_interface=PACKAGEKIT_DBUS_INTERFACE,
                          signature='ss')
-    def ErrorCode(self, code, description):
+    def ErrorCode(self,code,description):
         '''
         send 'error'
         @param err: Error Type (ERROR_NO_NETWORK,ERROR_NOT_SUPPORTED,ERROR_INTERNAL_ERROR)
         @param description: Error description
         '''
-        pklog.info("ErrorCode (%s, %s)" % (code, description))
+        pklog.info("ErrorCode (%s,%s)" % (code,description))
 
     @PKSignalHouseKeeper
     @dbus.service.signal(dbus_interface=PACKAGEKIT_DBUS_INTERFACE,
@@ -301,7 +301,7 @@ class PackageKitBaseBackend(dbus.service.Object):
         @param type:   The level of restart required (system,application,session)
         @param details:  Optional details about the restart
         '''
-        pklog.info("RestartRequired (%s, %s)" % (type,details))
+        pklog.info("RestartRequired (%s,%s)" % (type,details))
 
     @PKSignalHouseKeeper
     @dbus.service.signal(dbus_interface=PACKAGEKIT_DBUS_INTERFACE,
@@ -312,7 +312,7 @@ class PackageKitBaseBackend(dbus.service.Object):
         @param type:   The type of message (warning,notice,daemon)
         @param details:  Required details about the message
         '''
-        pklog.info("Message (%s, %s)" % (type,details))
+        pklog.info("Message (%s,%s)" % (type,details))
 
     @PKSignalHouseKeeper
     @dbus.service.signal(dbus_interface=PACKAGEKIT_DBUS_INTERFACE,
@@ -330,7 +330,7 @@ class PackageKitBaseBackend(dbus.service.Object):
         '''
         send 'repo-signature-required' signal:
         '''
-        pklog.info("RepoSignatureRequired (%s, %s, %s, %s, %s, %s, %s, %s)" %
+        pklog.info("RepoSignatureRequired (%s,%s,%s,%s,%s,%s,%s,%s)" %
                    (id,repo_name,key_url,key_userid,key_id,key_fingerprint,key_timestamp,key_type))
 
 
@@ -340,10 +340,10 @@ class PackageKitBaseBackend(dbus.service.Object):
 # Python inheritence with decorators makes implementing these in the
 # base class and overriding them in child classes very ugly.  So
 # they're commented out here.  Just implement the ones you need in
-# your class, and don't forget the decorators.
+# your class,and don't forget the decorators.
 #
     @dbus.service.method(PACKAGEKIT_DBUS_INTERFACE,
-                         in_signature='', out_signature='')
+                         in_signature='',out_signature='')
     def Init(self):
         pklog.info("Init()")
         self.doInit()
@@ -363,7 +363,7 @@ class PackageKitBaseBackend(dbus.service.Object):
         sys.exit(1)
 
     @dbus.service.method(PACKAGEKIT_DBUS_INTERFACE,
-                         in_signature='', out_signature='')
+                         in_signature='',out_signature='')
     def Exit(self):
         pklog.info("Exit()")
         gobject.idle_add (self._doExitDelay)
@@ -378,15 +378,15 @@ class PackageKitBaseBackend(dbus.service.Object):
         self.Finished(EXIT_FAILED)
 
     @dbus.service.method(PACKAGEKIT_DBUS_INTERFACE,
-                         in_signature='ss', out_signature='')
-    def SearchName(self, filters, search):
+                         in_signature='ss',out_signature='')
+    def SearchName(self,filters,search):
         '''
         Implement the {backend}-search-name functionality
         '''
         pklog.info("SearchName()")
-        self.doSearchName(filters, search)
+        self.doSearchName(filters,search)
 
-    def doSearchName(self, filters, search):
+    def doSearchName(self,filters,search):
         '''
         Should be replaced in the corresponding backend sub class
         '''
@@ -395,15 +395,15 @@ class PackageKitBaseBackend(dbus.service.Object):
         self.Finished(EXIT_FAILED)
 
     @dbus.service.method(PACKAGEKIT_DBUS_INTERFACE,
-                         in_signature='s', out_signature='')
-    def GetPackages(self, filters):
+                         in_signature='s',out_signature='')
+    def GetPackages(self,filters):
         '''
         Implement the {backend}-get-packages functionality
         '''
         pklog.info("GetPackages()")
         self.doGetPackages(filters)
 
-    def doGetPackages(self, filters):
+    def doGetPackages(self,filters):
         '''
         Should be replaced in the corresponding backend sub class
         '''
@@ -412,11 +412,11 @@ class PackageKitBaseBackend(dbus.service.Object):
         self.Finished(EXIT_FAILED)
 
     @dbus.service.method(PACKAGEKIT_DBUS_INTERFACE,
-                         in_signature='', out_signature='')
+                         in_signature='',out_signature='')
     def Cancel(self):
         pklog.info("Cancel()")
         if not self._allow_cancel:
-            self.ErrorCode(ERROR_CANNOT_CANCEL, "Current action cannot be cancelled")
+            self.ErrorCode(ERROR_CANNOT_CANCEL,"Current action cannot be cancelled")
             self.Finished(EXIT_FAILED)
             return
         self.doCancel()
@@ -430,15 +430,15 @@ class PackageKitBaseBackend(dbus.service.Object):
         self.Finished(EXIT_FAILED)
 
     @dbus.service.method(PACKAGEKIT_DBUS_INTERFACE,
-                         in_signature='ss', out_signature='')
+                         in_signature='ss',out_signature='')
     def SearchDetails(self,filters,key):
         '''
         Implement the {backend}-search-details functionality
         '''
-        pklog.info("SearchDetails(%s, %s)" % (filters, key))
-        self.doSearchDetails(filters, key)
+        pklog.info("SearchDetails(%s,%s)" % (filters,key))
+        self.doSearchDetails(filters,key)
 
-    def doSearchDetails(self, filters, key):
+    def doSearchDetails(self,filters,key):
         '''
         Should be replaced in the corresponding backend sub class
         '''
@@ -447,15 +447,15 @@ class PackageKitBaseBackend(dbus.service.Object):
         self.Finished(EXIT_FAILED)
 
     @dbus.service.method(PACKAGEKIT_DBUS_INTERFACE,
-                         in_signature='ss', out_signature='')
+                         in_signature='ss',out_signature='')
     def SearchGroup(self,filters,key):
         '''
         Implement the {backend}-search-group functionality
         '''
-        pklog.info("SearchGroup(%s, %s)" % (filters, key))
-        self.doSearchGroup(filters, key)
+        pklog.info("SearchGroup(%s,%s)" % (filters,key))
+        self.doSearchGroup(filters,key)
 
-    def doSearchGroup(self, filters, key):
+    def doSearchGroup(self,filters,key):
         '''
         Should be replaced in the corresponding backend sub class
         '''
@@ -464,15 +464,15 @@ class PackageKitBaseBackend(dbus.service.Object):
         self.Finished(EXIT_FAILED)
 
     @dbus.service.method(PACKAGEKIT_DBUS_INTERFACE,
-                         in_signature='ss', out_signature='')
+                         in_signature='ss',out_signature='')
     def SearchFile(self,filters,key):
         '''
         Implement the {backend}-search-file functionality
         '''
-        pklog.info("SearchFile(%s, %s)" % (filters, key))
-        self.doSearchFile(filters, key)
+        pklog.info("SearchFile(%s,%s)" % (filters,key))
+        self.doSearchFile(filters,key)
 
-    def doSearchFile(self, filters, key):
+    def doSearchFile(self,filters,key):
         '''
         Should be replaced in the corresponding backend sub class
         '''
@@ -481,15 +481,15 @@ class PackageKitBaseBackend(dbus.service.Object):
         self.Finished(EXIT_FAILED)
 
     @dbus.service.method(PACKAGEKIT_DBUS_INTERFACE,
-                         in_signature='ssb', out_signature='')
-    def GetRequires(self,filters,package,recursive):
+                         in_signature='ssb',out_signature='')
+    def GetRequires(self,filters,package_ids,recursive):
         '''
         Print a list of requires for a given package
         '''
-        pklog.info("GetRequires(%s, %s, %s)" % (filters, package, recursive))
-        self.doGetRequires(filters, package, recursive)
+        pklog.info("GetRequires(%s,%s,%s)" % (filters,package,recursive))
+        self.doGetRequires(filters,package,recursive)
 
-    def doGetRequires(self, filters, package, recursive):
+    def doGetRequires(self,filters,package,recursive):
         '''
         Should be replaced in the corresponding backend sub class
         '''
@@ -498,16 +498,15 @@ class PackageKitBaseBackend(dbus.service.Object):
         self.Finished(EXIT_FAILED)
 
     @dbus.service.method(PACKAGEKIT_DBUS_INTERFACE,
-                         in_signature='sss', out_signature='')
+                         in_signature='sss',out_signature='')
     def WhatProvides(self,filters,provides_type,search):
         '''
         Print a list of packages for a given provide string
         '''
-        pklog.info("WhatProvides(%s, %s, %s)" % (filters, provides_type,
-                                                 search))
-        self.doWhatProvides(filters, provides_type, search)
+        pklog.info("WhatProvides(%s,%s,%s)" % (filters,provides_type,search))
+        self.doWhatProvides(filters,provides_type,search)
 
-    def doWhatProvides(self, filters, provides_type, search):
+    def doWhatProvides(self,filters,provides_type,search):
         '''
         Should be replaced in the corresponding backend sub class
         '''
@@ -516,15 +515,15 @@ class PackageKitBaseBackend(dbus.service.Object):
         self.Finished(EXIT_FAILED)
 
     @dbus.service.method(PACKAGEKIT_DBUS_INTERFACE,
-                         in_signature='ssb', out_signature='')
-    def GetDepends(self, filters, package, recursive):
+                         in_signature='ssb',out_signature='')
+    def GetDepends(self,filters,package,recursive):
         '''
         Print a list of depends for a given package
         '''
-        pklog.info("GetDepends(%s, %s, %s)" % (filters, package, recursive))
-        self.doGetDepends(package, recursive)
+        pklog.info("GetDepends(%s,%s,%s)" % (filters,package,recursive))
+        self.doGetDepends(package,recursive)
 
-    def doGetDepends(self, package, recursive):
+    def doGetDepends(self,package,recursive):
         '''
         Should be replaced in the corresponding backend sub class
         '''
@@ -533,7 +532,7 @@ class PackageKitBaseBackend(dbus.service.Object):
         self.Finished(EXIT_FAILED)
 
     @dbus.service.method(PACKAGEKIT_DBUS_INTERFACE,
-                         in_signature='', out_signature='')
+                         in_signature='',out_signature='')
     def UpdateSystem(self):
         '''
         Implement the {backend}-update-system functionality
@@ -550,8 +549,8 @@ class PackageKitBaseBackend(dbus.service.Object):
         self.Finished(EXIT_FAILED)
 
     @dbus.service.method(PACKAGEKIT_DBUS_INTERFACE,
-                         in_signature='b', out_signature='')
-    def RefreshCache(self, force):
+                         in_signature='b',out_signature='')
+    def RefreshCache(self,force):
         '''
         Implement the {backend}-refresh_cache functionality
         '''
@@ -567,15 +566,15 @@ class PackageKitBaseBackend(dbus.service.Object):
         self.Finished(EXIT_FAILED)
 
     @dbus.service.method(PACKAGEKIT_DBUS_INTERFACE,
-                         in_signature='ss', out_signature='')
-    def Resolve(self, filters, name):
+                         in_signature='ss',out_signature='')
+    def Resolve(self,filters,name):
         '''
         Implement the {backend}-resolve functionality
         '''
-        pklog.info("Resolve(%s, %s)" % (filters, name))
-        self.doResolve(filters, name)
+        pklog.info("Resolve(%s,%s)" % (filters,name))
+        self.doResolve(filters,name)
 
-    def doResolve(self, filters, name):
+    def doResolve(self,filters,name):
         '''
         Should be replaced in the corresponding backend sub class
         '''
@@ -584,15 +583,15 @@ class PackageKitBaseBackend(dbus.service.Object):
         self.Finished(EXIT_FAILED)
 
     @dbus.service.method(PACKAGEKIT_DBUS_INTERFACE,
-                         in_signature='as', out_signature='')
-    def InstallPackages(self, packages):
+                         in_signature='as',out_signature='')
+    def InstallPackages(self,package_ids):
         '''
         Implement the {backend}-install functionality
         '''
-        pklog.info("InstallPackages(%s)" % ", ".join(packages))
+        pklog.info("InstallPackages(%s)" % ",".join(packages))
         self.doInstallPackages(packages)
 
-    def doInstallPackages(self, packages):
+    def doInstallPackages(self,package_ids):
         '''
         Should be replaced in the corresponding backend sub class
         '''
@@ -601,8 +600,8 @@ class PackageKitBaseBackend(dbus.service.Object):
         self.Finished(EXIT_FAILED)
 
     @dbus.service.method(PACKAGEKIT_DBUS_INTERFACE,
-                         in_signature='bas', out_signature='')
-    def InstallFiles (self, trusted, full_paths):
+                         in_signature='bas',out_signature='')
+    def InstallFiles (self,trusted,full_paths):
         '''
         Implement the {backend}-install_files functionality
         Install the package containing the full_paths file
@@ -610,7 +609,7 @@ class PackageKitBaseBackend(dbus.service.Object):
         pklog.info("InstallFiles(%i,%s)" % (trusted,full_paths))
         self.doInstallFiles(trusted,full_paths)
 
-    def doInstallFiles(self, full_paths):
+    def doInstallFiles(self,full_paths):
         '''
         Should be replaced in the corresponding backend sub class
         '''
@@ -619,15 +618,15 @@ class PackageKitBaseBackend(dbus.service.Object):
         self.Finished(EXIT_FAILED)
 
     @dbus.service.method(PACKAGEKIT_DBUS_INTERFACE,
-                         in_signature='sb', out_signature='')
-    def ServicePack (self, location, enabled):
+                         in_signature='sb',out_signature='')
+    def ServicePack (self,location,enabled):
         '''
         Implement the {backend}-service-pack functionality
         '''
-        pklog.info("ServicePack(%s, %s)" % (location, enabled))
-        self.doServicePack(location, enabled)
+        pklog.info("ServicePack(%s,%s)" % (location,enabled))
+        self.doServicePack(location,enabled)
 
-    def doServicePack(self, location, enabled):
+    def doServicePack(self,location,enabled):
         '''
         Should be replaced in the corresponding backend sub class
         '''
@@ -636,15 +635,15 @@ class PackageKitBaseBackend(dbus.service.Object):
         self.Finished(EXIT_FAILED)
 
     @dbus.service.method(PACKAGEKIT_DBUS_INTERFACE,
-                         in_signature='as', out_signature='')
-    def UpdatePackages(self, packages):
+                         in_signature='as',out_signature='')
+    def UpdatePackages(self,package_ids):
         '''
         Implement the {backend}-update-packages functionality
         '''
-        pklog.info("UpdatePackages(%s)" % ", ".join(packages))
+        pklog.info("UpdatePackages(%s)" % ",".join(packages))
         self.doUpdatePackages(packages)
 
-    def doUpdatePackages(self, packages):
+    def doUpdatePackages(self,package_ids):
         '''
         Should be replaced in the corresponding backend sub class
         '''
@@ -653,16 +652,16 @@ class PackageKitBaseBackend(dbus.service.Object):
         self.Finished(EXIT_FAILED)
 
     @dbus.service.method(PACKAGEKIT_DBUS_INTERFACE,
-                         in_signature='asbb', out_signature='')
-    def RemovePackages(self, packages, allowdep, autoremove):
+                         in_signature='asbb',out_signature='')
+    def RemovePackages(self,package_ids,allowdep,autoremove):
         '''
         Implement the {backend}-remove functionality
         '''
-        pklog.info("RemovePackages(%s, %s, %s)" % (packages, allowdep,
+        pklog.info("RemovePackages(%s,%s,%s)" % (packages,allowdep,
                                                    autoremove))
-        self.doRemovePackages(packages, allowdep, autoremove)
+        self.doRemovePackages(packages,allowdep,autoremove)
 
-    def doRemovePackages(self, packages, allowdep, autoremove):
+    def doRemovePackages(self,package_ids,allowdep,autoremove):
         '''
         Should be replaced in the corresponding backend sub class
         '''
@@ -671,15 +670,15 @@ class PackageKitBaseBackend(dbus.service.Object):
         self.Finished(EXIT_FAILED)
 
     @dbus.service.method(PACKAGEKIT_DBUS_INTERFACE,
-                         in_signature='s', out_signature='')
-    def GetDetails(self, package):
+                         in_signature='s',out_signature='')
+    def GetDetails(self,package_ids):
         '''
         Print a detailed details for a given package
         '''
         pklog.info("GetDetails(%s)" % package)
         self.doGetDetails(package)
 
-    def doGetDetails(self, package):
+    def doGetDetails(self,package_ids):
         '''
         Should be replaced in the corresponding backend sub class
         '''
@@ -688,15 +687,15 @@ class PackageKitBaseBackend(dbus.service.Object):
         self.Finished(EXIT_FAILED)
 
     @dbus.service.method(PACKAGEKIT_DBUS_INTERFACE,
-                         in_signature='s', out_signature='')
-    def GetFiles(self, package):
+                         in_signature='s',out_signature='')
+    def GetFiles(self,package_ids):
         '''
         Implement the get-files method
         '''
         pklog.info("GetFiles(%s)" % package)
         self.doGetFiles( package)
 
-    def doGetFiles(self, package):
+    def doGetFiles(self,package_ids):
         '''
         Should be replaced in the corresponding backend sub class
         '''
@@ -705,15 +704,15 @@ class PackageKitBaseBackend(dbus.service.Object):
         self.Finished(EXIT_FAILED)
 
     @dbus.service.method(PACKAGEKIT_DBUS_INTERFACE,
-                         in_signature='s', out_signature='')
-    def GetUpdates(self, filters):
+                         in_signature='s',out_signature='')
+    def GetUpdates(self,filters):
         '''
         Implement the {backend}-get-updates functionality
         '''
         pklog.info("GetUpdates(%s)" % filters)
         self.doGetUpdates(filters)
 
-    def doGetUpdates(self, filters):
+    def doGetUpdates(self,filters):
         '''
         Should be replaced in the corresponding backend sub class
         '''
@@ -722,15 +721,15 @@ class PackageKitBaseBackend(dbus.service.Object):
         self.Finished(EXIT_FAILED)
 
     @dbus.service.method(PACKAGEKIT_DBUS_INTERFACE,
-                         in_signature='sb', out_signature='')
-    def RepoEnable(self, repoid, enable):
+                         in_signature='sb',out_signature='')
+    def RepoEnable(self,repoid,enable):
         '''
         Implement the {backend}-repo-enable functionality
         '''
-        pklog.info("RepoEnable(%s, %s)" % (repoid, enable))
-        self.doRepoEnable( repoid, enable)
+        pklog.info("RepoEnable(%s,%s)" % (repoid,enable))
+        self.doRepoEnable( repoid,enable)
 
-    def doRepoEnable(self, repoid, enable):
+    def doRepoEnable(self,repoid,enable):
         '''
         Should be replaced in the corresponding backend sub class
         '''
@@ -739,15 +738,15 @@ class PackageKitBaseBackend(dbus.service.Object):
         self.Finished(EXIT_FAILED)
 
     @dbus.service.method(PACKAGEKIT_DBUS_INTERFACE,
-                         in_signature='', out_signature='')
-    def GetRepoList(self, filters):
+                         in_signature='',out_signature='')
+    def GetRepoList(self,filters):
         '''
         Implement the {backend}-get-repo-list functionality
         '''
         pklog.info("GetRepoList()")
         self.doGetRepoList(filters)
 
-    def doGetRepoList(self, filters):
+    def doGetRepoList(self,filters):
         '''
         Should be replaced in the corresponding backend sub class
         '''
@@ -756,15 +755,15 @@ class PackageKitBaseBackend(dbus.service.Object):
         self.Finished(EXIT_FAILED)
 
     @dbus.service.method(PACKAGEKIT_DBUS_INTERFACE,
-                         in_signature='s', out_signature='')
-    def GetUpdateDetail(self, package):
+                         in_signature='s',out_signature='')
+    def GetUpdateDetail(self,package_ids):
         '''
         Implement the {backend}-get-update_detail functionality
         '''
         pklog.info("GetUpdateDetail(%s)" % package)
         self.doGetUpdateDetail(package)
 
-    def doGetUpdateDetail(self, package):
+    def doGetUpdateDetail(self,package_ids):
         '''
         Should be replaced in the corresponding backend sub class
         '''
@@ -773,15 +772,15 @@ class PackageKitBaseBackend(dbus.service.Object):
         self.Finished(EXIT_FAILED)
 
     @dbus.service.method(PACKAGEKIT_DBUS_INTERFACE,
-                         in_signature='sss', out_signature='')
-    def RepoSetData(self, repoid, parameter, value):
+                         in_signature='sss',out_signature='')
+    def RepoSetData(self,repoid,parameter,value):
         '''
         Implement the {backend}-repo-set-data functionality
         '''
-        pklog.info("RepoSetData(%s, %s, %s)" % (repoid, parameter, value))
-        self.doRepoSetData(repoid, parameter, value)
+        pklog.info("RepoSetData(%s,%s,%s)" % (repoid,parameter,value))
+        self.doRepoSetData(repoid,parameter,value)
 
-    def doRepoSetData(self, repoid, parameter, value):
+    def doRepoSetData(self,repoid,parameter,value):
         '''
         Should be replaced in the corresponding backend sub class
         '''
@@ -790,30 +789,30 @@ class PackageKitBaseBackend(dbus.service.Object):
         self.Finished(EXIT_FAILED)
 
     @dbus.service.method(PACKAGEKIT_DBUS_INTERFACE,
-                         in_signature='ss', out_signature='')
-    def SetProxy(self, proxy_http, proxy_ftp):
+                         in_signature='ss',out_signature='')
+    def SetProxy(self,proxy_http,proxy_ftp):
         '''
         Set the proxy
         '''
-        pklog.info("SetProxy(%s, %s)" % (proxy_http, proxy_ftp))
-        self.doSetProxy(proxy_http, proxy_ftp)
+        pklog.info("SetProxy(%s,%s)" % (proxy_http,proxy_ftp))
+        self.doSetProxy(proxy_http,proxy_ftp)
 
-    def doSetProxy(self, proxy_http, proxy_ftp):
+    def doSetProxy(self,proxy_http,proxy_ftp):
         '''
         Should be replaced in the corresponding backend sub class
         '''
         # do not use Finished() in this method
 
     @dbus.service.method(PACKAGEKIT_DBUS_INTERFACE,
-                         in_signature='s', out_signature='')
-    def InstallPublicKey(self, keyurl):
+                         in_signature='s',out_signature='')
+    def InstallPublicKey(self,keyurl):
         '''
         Implement the {backend}-install-public-key functionality
         '''
         pklog.info("InstallPublicKey(%s)" % keyurl)
         self.doInstallPublicKey(keyurl)
 
-    def doInstallPublicKey(self, keyurl):
+    def doInstallPublicKey(self,keyurl):
         '''
         Should be replaced in the corresponding backend sub class
         '''
@@ -902,20 +901,20 @@ class PackageKitBaseBackend(dbus.service.Object):
         '''
         return False
 
-    def _excepthook(self, exctype, excvalue, exctb):
+    def _excepthook(self,exctype,excvalue,exctb):
         '''
         Handle a crash: try to submit the message to packagekitd and the logger.
         afterwards shutdown the daemon.
         '''
-        if (issubclass(exctype, KeyboardInterrupt) or
-            issubclass(exctype, SystemExit)):
+        if (issubclass(exctype,KeyboardInterrupt) or
+            issubclass(exctype,SystemExit)):
             return
         if self._customTracebackHandler(exctype):
             return
 
-        tbtext = ''.join(traceback.format_exception(exctype, excvalue, exctb))
+        tbtext = ''.join(traceback.format_exception(exctype,excvalue,exctb))
         try:
-            self.ErrorCode(ERROR_INTERNAL_ERROR, tbtext)
+            self.ErrorCode(ERROR_INTERNAL_ERROR,tbtext)
             self.Finished(EXIT_FAILED)
         except:
             pass
diff --git a/src/pk-backend.h b/src/pk-backend.h
index a7ba754..0cfac0e 100644
--- a/src/pk-backend.h
+++ b/src/pk-backend.h
@@ -191,22 +191,22 @@ typedef struct {
 	void		(*cancel)			(PkBackend	*backend);
 	void		(*get_depends)			(PkBackend	*backend,
 							 PkFilterEnum	 filters,
-							 const gchar	*package_id,
+							 gchar		**package_ids,
 							 gboolean	 recursive);
-	void		(*get_details)		(PkBackend	*backend,
-							 const gchar	*package_id);
+	void		(*get_details)			(PkBackend	*backend,
+							 gchar		**package_ids);
 	void		(*get_files)			(PkBackend	*backend,
-							 const gchar	*package_id);
+							 gchar		**package_ids);
 	void		(*get_packages)			(PkBackend	*backend,
 							 PkFilterEnum	 filters);
 	void		(*get_repo_list)		(PkBackend	*backend,
 							 PkFilterEnum	 filters);
 	void		(*get_requires)			(PkBackend	*backend,
 							 PkFilterEnum	 filters,
-							 const gchar	*package_id,
+							 gchar		**package_ids,
 							 gboolean	 recursive);
 	void		(*get_update_detail)		(PkBackend	*backend,
-							 const gchar	*package_id);
+							 gchar		**package_ids);
 	void		(*get_updates)			(PkBackend	*backend,
 							 PkFilterEnum	 filters);
 	void		(*install_files)		(PkBackend	*backend,
@@ -233,7 +233,7 @@ typedef struct {
 							 const gchar	*value);
 	void		(*resolve)			(PkBackend	*backend,
 							 PkFilterEnum	 filters,
-							 const gchar	*package);
+							 gchar		**packages);
 	void		(*rollback)			(PkBackend	*backend,
 							 const gchar	*transaction_id);
 	void		(*search_details)		(PkBackend	*backend,
diff --git a/src/pk-interface-transaction.xml b/src/pk-interface-transaction.xml
index dd952a3..e72d9a4 100644
--- a/src/pk-interface-transaction.xml
+++ b/src/pk-interface-transaction.xml
@@ -96,11 +96,11 @@
           </doc:summary>
         </doc:doc>
       </arg>
-      <arg type="s" name="package_id" direction="in">
+      <arg type="as" name="package_ids" direction="in">
         <doc:doc>
           <doc:summary>
             <doc:para>
-              A single Package ID.
+              An array of package IDs.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -138,11 +138,11 @@
           </doc:para>
         </doc:description>
       </doc:doc>
-      <arg type="s" name="package_id" direction="in">
+      <arg type="as" name="package_ids" direction="in">
         <doc:doc>
           <doc:summary>
             <doc:para>
-              A single Package ID.
+              An array of package IDs.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -166,11 +166,11 @@
           </doc:para>
         </doc:description>
       </doc:doc>
-      <arg type="s" name="package_id" direction="in">
+      <arg type="as" name="package_ids" direction="in">
         <doc:doc>
           <doc:summary>
             <doc:para>
-              A single Package ID.
+              An array of package IDs.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -353,11 +353,11 @@
           </doc:summary>
         </doc:doc>
       </arg>
-      <arg type="s" name="package_id" direction="in">
+      <arg type="as" name="package_ids" direction="in">
         <doc:doc>
           <doc:summary>
             <doc:para>
-              A single Package ID.
+              An array of package IDs.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -441,11 +441,11 @@
           </doc:para>
         </doc:description>
       </doc:doc>
-      <arg type="s" name="package_id" direction="in">
+      <arg type="as" name="package_ids" direction="in">
         <doc:doc>
           <doc:summary>
             <doc:para>
-              A single Package ID.
+              An array of package IDs.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -856,11 +856,11 @@
           </doc:summary>
         </doc:doc>
       </arg>
-      <arg type="s" name="package" direction="in">
+      <arg type="as" name="package" direction="in">
         <doc:doc>
           <doc:summary>
             <doc:para>
-              A single package name, e.g. <literal>scribus-clipart</literal>.
+              An array of package names, e.g. <literal>scribus-clipart</literal>.
             </doc:para>
           </doc:summary>
         </doc:doc>
diff --git a/src/pk-transaction.c b/src/pk-transaction.c
index 15faed3..bbc7417 100644
--- a/src/pk-transaction.c
+++ b/src/pk-transaction.c
@@ -825,19 +825,19 @@ pk_transaction_set_running (PkTransaction *transaction)
 
 	/* do the correct action with the cached parameters */
 	if (priv->role == PK_ROLE_ENUM_GET_DEPENDS) {
-		desc->get_depends (priv->backend, priv->cached_filters, priv->cached_package_id, priv->cached_force);
+		desc->get_depends (priv->backend, priv->cached_filters, priv->cached_package_ids, priv->cached_force);
 	} else if (priv->role == PK_ROLE_ENUM_GET_UPDATE_DETAIL) {
-		desc->get_update_detail (priv->backend, priv->cached_package_id);
+		desc->get_update_detail (priv->backend, priv->cached_package_ids);
 	} else if (priv->role == PK_ROLE_ENUM_RESOLVE) {
-		desc->resolve (priv->backend, priv->cached_filters, priv->cached_package_id);
+		desc->resolve (priv->backend, priv->cached_filters, priv->cached_package_ids);
 	} else if (priv->role == PK_ROLE_ENUM_ROLLBACK) {
 		desc->rollback (priv->backend, priv->cached_transaction_id);
 	} else if (priv->role == PK_ROLE_ENUM_GET_DETAILS) {
-		desc->get_details (priv->backend, priv->cached_package_id);
+		desc->get_details (priv->backend, priv->cached_package_ids);
 	} else if (priv->role == PK_ROLE_ENUM_GET_FILES) {
-		desc->get_files (priv->backend, priv->cached_package_id);
+		desc->get_files (priv->backend, priv->cached_package_ids);
 	} else if (priv->role == PK_ROLE_ENUM_GET_REQUIRES) {
-		desc->get_requires (priv->backend, priv->cached_filters, priv->cached_package_id, priv->cached_force);
+		desc->get_requires (priv->backend, priv->cached_filters, priv->cached_package_ids, priv->cached_force);
 	} else if (priv->role == PK_ROLE_ENUM_WHAT_PROVIDES) {
 		desc->what_provides (priv->backend, priv->cached_filters, priv->cached_provides, priv->cached_search);
 	} else if (priv->role == PK_ROLE_ENUM_GET_UPDATES) {
@@ -1220,16 +1220,19 @@ pk_transaction_get_allow_cancel (PkTransaction *transaction, gboolean *allow_can
  * pk_transaction_get_depends:
  **/
 void
-pk_transaction_get_depends (PkTransaction *transaction, const gchar *filter, const gchar *package_id,
+pk_transaction_get_depends (PkTransaction *transaction, const gchar *filter, gchar **package_ids,
 			    gboolean recursive, DBusGMethodInvocation *context)
 {
 	gboolean ret;
 	GError *error;
+	gchar *package_ids_temp;
 
 	g_return_if_fail (PK_IS_TRANSACTION (transaction));
 	g_return_if_fail (transaction->priv->tid != NULL);
 
-	pk_debug ("GetDepends method called: %s, %i", package_id, recursive);
+	package_ids_temp = pk_package_ids_to_text (package_ids, ", ");
+	pk_debug ("GetDepends method called: %s (recursive %i)", package_ids_temp, recursive);
+	g_free (package_ids_temp);
 
 	/* not implemented yet */
 	if (transaction->priv->backend->desc->get_depends == NULL) {
@@ -1247,20 +1250,13 @@ pk_transaction_get_depends (PkTransaction *transaction, const gchar *filter, con
 		return;
 	}
 
-	/* check for sanity */
-	ret = pk_strvalidate (package_id);
-	if (!ret) {
-		error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_INPUT_INVALID,
-				     "Invalid input passed to daemon");
-		dbus_g_method_return_error (context, error);
-		return;
-	}
-
-	/* check package_id */
-	ret = pk_package_id_check (package_id);
-	if (!ret) {
+	/* check package_ids */
+	ret = pk_package_ids_check (package_ids);
+	if (ret == FALSE) {
+		package_ids_temp = pk_package_ids_to_text (package_ids, ", ");
 		error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_PACKAGE_ID_INVALID,
-				     "The package id '%s' is not valid", package_id);
+				     "The package id's '%s' are not valid", package_ids_temp);
+		g_free (package_ids_temp);
 		dbus_g_method_return_error (context, error);
 		return;
 	}
@@ -1270,7 +1266,7 @@ pk_transaction_get_depends (PkTransaction *transaction, const gchar *filter, con
 
 	/* save so we can run later */
 	transaction->priv->cached_filters = pk_filter_enums_from_text (filter);
-	transaction->priv->cached_package_id = g_strdup (package_id);
+	transaction->priv->cached_package_ids = g_strdupv (package_ids);
 	transaction->priv->cached_force = recursive;
 	transaction->priv->status = PK_STATUS_ENUM_WAIT;
 	pk_transaction_set_role (transaction, PK_ROLE_ENUM_GET_DEPENDS);
@@ -1292,16 +1288,18 @@ pk_transaction_get_depends (PkTransaction *transaction, const gchar *filter, con
  * pk_transaction_get_details:
  **/
 void
-pk_transaction_get_details (PkTransaction *transaction, const gchar *package_id,
-				DBusGMethodInvocation *context)
+pk_transaction_get_details (PkTransaction *transaction, gchar **package_ids, DBusGMethodInvocation *context)
 {
 	gboolean ret;
 	GError *error;
+	gchar *package_ids_temp;
 
 	g_return_if_fail (PK_IS_TRANSACTION (transaction));
 	g_return_if_fail (transaction->priv->tid != NULL);
 
-	pk_debug ("GetDetails method called: %s", package_id);
+	package_ids_temp = pk_package_ids_to_text (package_ids, ", ");
+	pk_debug ("GetDetails method called: %s", package_ids_temp);
+	g_free (package_ids_temp);
 
 	/* not implemented yet */
 	if (transaction->priv->backend->desc->get_details == NULL) {
@@ -1312,20 +1310,13 @@ pk_transaction_get_details (PkTransaction *transaction, const gchar *package_id,
 		return;
 	}
 
-	/* check for sanity */
-	ret = pk_strvalidate (package_id);
-	if (!ret) {
-		error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_INPUT_INVALID,
-				     "Invalid input passed to daemon");
-		dbus_g_method_return_error (context, error);
-		return;
-	}
-
-	/* check package_id */
-	ret = pk_package_id_check (package_id);
-	if (!ret) {
+	/* check package_ids */
+	ret = pk_package_ids_check (package_ids);
+	if (ret == FALSE) {
+		package_ids_temp = pk_package_ids_to_text (package_ids, ", ");
 		error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_PACKAGE_ID_INVALID,
-				     "The package id '%s' is not valid", package_id);
+				     "The package id's '%s' are not valid", package_ids_temp);
+		g_free (package_ids_temp);
 		dbus_g_method_return_error (context, error);
 		return;
 	}
@@ -1334,7 +1325,7 @@ pk_transaction_get_details (PkTransaction *transaction, const gchar *package_id,
 	pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
 
 	/* save so we can run later */
-	transaction->priv->cached_package_id = g_strdup (package_id);
+	transaction->priv->cached_package_ids = g_strdupv (package_ids);
 	transaction->priv->status = PK_STATUS_ENUM_WAIT;
 	pk_transaction_set_role (transaction, PK_ROLE_ENUM_GET_DETAILS);
 
@@ -1355,16 +1346,18 @@ pk_transaction_get_details (PkTransaction *transaction, const gchar *package_id,
  * pk_transaction_get_files:
  **/
 void
-pk_transaction_get_files (PkTransaction *transaction, const gchar *package_id,
-			  DBusGMethodInvocation *context)
+pk_transaction_get_files (PkTransaction *transaction, gchar **package_ids, DBusGMethodInvocation *context)
 {
 	gboolean ret;
 	GError *error;
+	gchar *package_ids_temp;
 
 	g_return_if_fail (PK_IS_TRANSACTION (transaction));
 	g_return_if_fail (transaction->priv->tid != NULL);
 
-	pk_debug ("GetFiles method called: %s", package_id);
+	package_ids_temp = pk_package_ids_to_text (package_ids, ", ");
+	pk_debug ("GetFiles method called: %s", package_ids_temp);
+	g_free (package_ids_temp);
 
 	/* not implemented yet */
 	if (transaction->priv->backend->desc->get_files == NULL) {
@@ -1375,20 +1368,13 @@ pk_transaction_get_files (PkTransaction *transaction, const gchar *package_id,
 		return;
 	}
 
-	/* check for sanity */
-	ret = pk_strvalidate (package_id);
-	if (!ret) {
-		error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_INPUT_INVALID,
-				     "Invalid input passed to daemon");
-		dbus_g_method_return_error (context, error);
-		return;
-	}
-
-	/* check package_id */
-	ret = pk_package_id_check (package_id);
-	if (!ret) {
+	/* check package_ids */
+	ret = pk_package_ids_check (package_ids);
+	if (ret == FALSE) {
+		package_ids_temp = pk_package_ids_to_text (package_ids, ", ");
 		error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_PACKAGE_ID_INVALID,
-				     "The package id '%s' is not valid", package_id);
+				     "The package id's '%s' are not valid", package_ids_temp);
+		g_free (package_ids_temp);
 		dbus_g_method_return_error (context, error);
 		return;
 	}
@@ -1397,7 +1383,7 @@ pk_transaction_get_files (PkTransaction *transaction, const gchar *package_id,
 	pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
 
 	/* save so we can run later */
-	transaction->priv->cached_package_id = g_strdup (package_id);
+	transaction->priv->cached_package_ids = g_strdupv (package_ids);
 	transaction->priv->status = PK_STATUS_ENUM_WAIT;
 	pk_transaction_set_role (transaction, PK_ROLE_ENUM_GET_FILES);
 
@@ -1586,16 +1572,19 @@ pk_transaction_get_repo_list (PkTransaction *transaction, const gchar *filter, D
  * pk_transaction_get_requires:
  **/
 void
-pk_transaction_get_requires (PkTransaction *transaction, const gchar *filter, const gchar *package_id,
-			gboolean recursive, DBusGMethodInvocation *context)
+pk_transaction_get_requires (PkTransaction *transaction, const gchar *filter, gchar **package_ids,
+			     gboolean recursive, DBusGMethodInvocation *context)
 {
 	gboolean ret;
 	GError *error;
+	gchar *package_ids_temp;
 
 	g_return_if_fail (PK_IS_TRANSACTION (transaction));
 	g_return_if_fail (transaction->priv->tid != NULL);
 
-	pk_debug ("GetRequires method called: %s, %i", package_id, recursive);
+	package_ids_temp = pk_package_ids_to_text (package_ids, ", ");
+	pk_debug ("GetRequires method called: %s (recursive %i)", package_ids_temp, recursive);
+	g_free (package_ids_temp);
 
 	/* not implemented yet */
 	if (transaction->priv->backend->desc->get_requires == NULL) {
@@ -1613,20 +1602,13 @@ pk_transaction_get_requires (PkTransaction *transaction, const gchar *filter, co
 		return;
 	}
 
-	/* check for sanity */
-	ret = pk_strvalidate (package_id);
-	if (!ret) {
-		error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_INPUT_INVALID,
-				     "Invalid input passed to daemon");
-		dbus_g_method_return_error (context, error);
-		return;
-	}
-
-	/* check package_id */
-	ret = pk_package_id_check (package_id);
-	if (!ret) {
+	/* check package_ids */
+	ret = pk_package_ids_check (package_ids);
+	if (ret == FALSE) {
+		package_ids_temp = pk_package_ids_to_text (package_ids, ", ");
 		error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_PACKAGE_ID_INVALID,
-				     "The package id '%s' is not valid", package_id);
+				     "The package id's '%s' are not valid", package_ids_temp);
+		g_free (package_ids_temp);
 		dbus_g_method_return_error (context, error);
 		return;
 	}
@@ -1636,7 +1618,7 @@ pk_transaction_get_requires (PkTransaction *transaction, const gchar *filter, co
 
 	/* save so we can run later */
 	transaction->priv->cached_filters = pk_filter_enums_from_text (filter);
-	transaction->priv->cached_package_id = g_strdup (package_id);
+	transaction->priv->cached_package_ids = g_strdupv (package_ids);
 	transaction->priv->cached_force = recursive;
 	transaction->priv->status = PK_STATUS_ENUM_WAIT;
 	pk_transaction_set_role (transaction, PK_ROLE_ENUM_GET_REQUIRES);
@@ -1699,16 +1681,19 @@ pk_transaction_get_status (PkTransaction *transaction,
  * pk_transaction_get_update_detail:
  **/
 void
-pk_transaction_get_update_detail (PkTransaction *transaction, const gchar *package_id,
-			     DBusGMethodInvocation *context)
+pk_transaction_get_update_detail (PkTransaction *transaction, gchar **package_ids,
+				  DBusGMethodInvocation *context)
 {
 	gboolean ret;
 	GError *error;
+	gchar *package_ids_temp;
 
 	g_return_if_fail (PK_IS_TRANSACTION (transaction));
 	g_return_if_fail (transaction->priv->tid != NULL);
 
-	pk_debug ("GetUpdateDetail method called: %s", package_id);
+	package_ids_temp = pk_package_ids_to_text (package_ids, ", ");
+	pk_debug ("GetUpdateDetail method called: %s", package_ids_temp);
+	g_free (package_ids_temp);
 
 	/* not implemented yet */
 	if (transaction->priv->backend->desc->get_update_detail == NULL) {
@@ -1719,20 +1704,13 @@ pk_transaction_get_update_detail (PkTransaction *transaction, const gchar *packa
 		return;
 	}
 
-	/* check for sanity */
-	ret = pk_strvalidate (package_id);
-	if (!ret) {
-		error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_INPUT_INVALID,
-				     "Invalid input passed to daemon");
-		dbus_g_method_return_error (context, error);
-		return;
-	}
-
-	/* check package_id */
-	ret = pk_package_id_check (package_id);
-	if (!ret) {
+	/* check package_ids */
+	ret = pk_package_ids_check (package_ids);
+	if (ret == FALSE) {
+		package_ids_temp = pk_package_ids_to_text (package_ids, ", ");
 		error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_PACKAGE_ID_INVALID,
-				     "The package id '%s' is not valid", package_id);
+				     "The package id's '%s' are not valid", package_ids_temp);
+		g_free (package_ids_temp);
 		dbus_g_method_return_error (context, error);
 		return;
 	}
@@ -1741,7 +1719,7 @@ pk_transaction_get_update_detail (PkTransaction *transaction, const gchar *packa
 	pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
 
 	/* save so we can run later */
-	transaction->priv->cached_package_id = g_strdup (package_id);
+	transaction->priv->cached_package_ids = g_strdupv (package_ids);
 	transaction->priv->status = PK_STATUS_ENUM_WAIT;
 	pk_transaction_set_role (transaction, PK_ROLE_ENUM_GET_UPDATE_DETAIL);
 
@@ -2338,15 +2316,20 @@ pk_transaction_repo_set_data (PkTransaction *transaction, const gchar *repo_id,
  **/
 void
 pk_transaction_resolve (PkTransaction *transaction, const gchar *filter,
-			const gchar *package, DBusGMethodInvocation *context)
+			gchar **packages, DBusGMethodInvocation *context)
 {
 	gboolean ret;
 	GError *error;
+	gchar *packages_temp;
+	guint i;
+	guint length;
 
 	g_return_if_fail (PK_IS_TRANSACTION (transaction));
 	g_return_if_fail (transaction->priv->tid != NULL);
 
-	pk_debug ("Resolve method called: %s, %s", filter, package);
+	packages_temp = pk_package_ids_to_text (packages, ", ");
+	pk_debug ("Resolve method called: %s, %s", filter, packages_temp);
+	g_free (packages_temp);
 
 	/* not implemented yet */
 	if (transaction->priv->backend->desc->resolve == NULL) {
@@ -2365,19 +2348,22 @@ pk_transaction_resolve (PkTransaction *transaction, const gchar *filter,
 	}
 
 	/* check for sanity */
-	ret = pk_strvalidate (package);
-	if (!ret) {
-		error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_INPUT_INVALID,
-				     "Invalid input passed to daemon");
-		dbus_g_method_return_error (context, error);
-		return;
+	length = g_strv_length (packages);
+	for (i=0; i<length; i++) {
+		ret = pk_strvalidate (packages[i]);
+		if (!ret) {
+			error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_INPUT_INVALID,
+					     "Invalid input passed to daemon");
+			dbus_g_method_return_error (context, error);
+			return;
+		}
 	}
 
 	/* set the dbus name, so we can get the disconnect */
 	pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
 
 	/* save so we can run later */
-	transaction->priv->cached_package_id = g_strdup (package);
+	transaction->priv->cached_package_ids = g_strdupv (packages);
 	transaction->priv->cached_filters = pk_filter_enums_from_text (filter);
 	transaction->priv->status = PK_STATUS_ENUM_WAIT;
 	pk_transaction_set_role (transaction, PK_ROLE_ENUM_RESOLVE);
diff --git a/src/pk-transaction.h b/src/pk-transaction.h
index e287cb4..e718f73 100644
--- a/src/pk-transaction.h
+++ b/src/pk-transaction.h
@@ -105,14 +105,14 @@ gboolean	 pk_transaction_get_allow_cancel	(PkTransaction	*transaction,
 							 GError		**error);
 void		 pk_transaction_get_depends		(PkTransaction	*transaction,
 							 const gchar	*filter,
-							 const gchar	*package_id,
+							 gchar		**package_ids,
 							 gboolean	 recursive,
 							 DBusGMethodInvocation *context);
 void		 pk_transaction_get_details		(PkTransaction	*transaction,
-							 const gchar	*package_id,
+							 gchar		**package_ids,
 							 DBusGMethodInvocation *context);
 void		 pk_transaction_get_files		(PkTransaction	*transaction,
-							 const gchar	*package_id,
+							 gchar		**package_ids,
 							 DBusGMethodInvocation *context);
 gboolean	 pk_transaction_get_old_transactions	(PkTransaction	*transaction,
 							 guint		 number,
@@ -134,7 +134,7 @@ void		 pk_transaction_get_repo_list		(PkTransaction	*transaction,
 							 DBusGMethodInvocation *context);
 void		 pk_transaction_get_requires		(PkTransaction	*transaction,
 							 const gchar	*filter,
-							 const gchar	*package_id,
+							 gchar		**package_ids,
 							 gboolean	 recursive,
 							 DBusGMethodInvocation *context);
 gboolean	 pk_transaction_get_role		(PkTransaction	*transaction,
@@ -145,7 +145,7 @@ gboolean	 pk_transaction_get_status		(PkTransaction	*transaction,
 							 const gchar	**status,
 							 GError		**error);
 void		 pk_transaction_get_update_detail	(PkTransaction	*transaction,
-							 const gchar	*package_id,
+							 gchar		**package_ids,
 							 DBusGMethodInvocation *context);
 void		 pk_transaction_get_updates		(PkTransaction	*transaction,
 							 const gchar	*filter,
@@ -184,7 +184,7 @@ void		 pk_transaction_repo_set_data		(PkTransaction	*transaction,
 							 DBusGMethodInvocation *context);
 void		 pk_transaction_resolve			(PkTransaction	*transaction,
 							 const gchar	*filter,
-							 const gchar	*package,
+							 gchar		**packages,
 							 DBusGMethodInvocation *context);
 void		 pk_transaction_rollback		(PkTransaction	*transaction,
 							 const gchar	*transaction_id,
commit 938d9bf622223dd03439179695efd1aa0dec90d6
Merge: d46e48d... b9dc48d...
Author: Sebastian Heinlein <devel at glatzor.de>
Date:   Mon Jun 23 16:31:02 2008 +0200

    Merge branch 'master' of git+ssh://glatzor@git.packagekit.org/srv/git/PackageKit

commit b9dc48deafe36c69457ed5bfab697db51e75bbf4
Author: Richard Hughes <richard at hughsie.com>
Date:   Sun Jun 22 16:23:48 2008 +0100

    fix the permissions of the cron helper, fixes rh#451870

diff --git a/data/Makefile.am b/data/Makefile.am
index df2b3f6..e7919ba 100644
--- a/data/Makefile.am
+++ b/data/Makefile.am
@@ -11,10 +11,10 @@ pkgconfigdir = $(libdir)/pkgconfig
 pkgconfig_DATA = packagekit.pc
 
 cronfiledir = ${SYSCONFDIR}/cron.daily
-cronfile_DATA = packagekit-background.cron
+cronfile_SCRIPTS = packagekit-background.cron
 
 crondatadir = ${SYSCONFDIR}/sysconfig
-crondata_DATA = packagekit-background
+crondata_SCRIPTS = packagekit-background
 
 pmutilsdir = $(libdir)/pm-utils/sleep.d
 pmutils_DATA = 95packagekit
diff --git a/data/packagekit-background b/data/packagekit-background
old mode 100644
new mode 100755
diff --git a/data/packagekit-background.cron b/data/packagekit-background.cron
old mode 100644
new mode 100755
commit 4eff422c58868cde75376ac651ba5b6ae945de35
Author: Richard Hughes <richard at hughsie.com>
Date:   Fri Jun 20 16:37:18 2008 +0100

    trivial: correct links in the HTML documentation

diff --git a/docs/html/pk-download.html b/docs/html/pk-download.html
index 01c28eb..69e58a8 100644
--- a/docs/html/pk-download.html
+++ b/docs/html/pk-download.html
@@ -109,7 +109,7 @@ specific are the backends.<br/>
 To make PackageKit work on a new distribution, you have to write a
 "backend" which is basically a shim layer from the distro tool to
 packagekitd. A backend can have one or more threads and also spawn other processes.<br/>
-See the developer information <a href="pk-reference.html">here</a> for loads more
+See the developer information <a href="gtk-doc/index.html">here</a> for loads more
 information.
 </p>
 
diff --git a/docs/html/pk-faq.html b/docs/html/pk-faq.html
index 20e2151..f8555ee 100644
--- a/docs/html/pk-faq.html
+++ b/docs/html/pk-faq.html
@@ -184,7 +184,7 @@ The daemon lets you schedule transactions using either the raw
 <a href="http://gitweb.freedesktop.org/?p=packagekit.git;a=blob;f=src/pk-interface-transaction.xml">
 DBUS methods</a>, or using <a href="http://www.packagekit.org/gtk-doc/PkClient.html">libpackagekit</a>.
 The transactions are very fine grained, so an application would have to manage
-<a href="http://www.packagekit.org/pk-reference.html#introduction-ideas-transactions">
+<a href="http://www.packagekit.org/gtk-doc/introduction-ideas-transactions.html">
 the transaction process</a> itself.
 This would mean handling the EULA and GPG callbacks in each application. This is less than ideal.
 </p>
@@ -218,7 +218,7 @@ applet then you can use an alternate interface provided by your desktop.
 Using this shared session service you can use the following DBUS methods
 to make PackageKit just do the right thing.
 All the additional
-<a href="http://www.packagekit.org/pk-reference.html#introduction-ideas-transactions">
+<a href="http://www.packagekit.org/gtk-doc/introduction-ideas-transactions.html">
 confirmation, package downloads, GPG and EULA prompting is done automatically.</a>
 </p>
 <p>
diff --git a/docs/html/pk-help.html b/docs/html/pk-help.html
index 5bc7827..0a5fe14 100644
--- a/docs/html/pk-help.html
+++ b/docs/html/pk-help.html
@@ -42,7 +42,7 @@ bugs.freedesktop.org</a>
 
 <p>
 If you want to write a backend, you can see the <a
-href="pk-reference.html">developer information</a>, or you can checkout
+href="gtk-doc/index.html">developer information</a>, or you can checkout
 the source and see the docbook files in doc. Use the <a
 href="pk-faq.html">FAQ</a> and mailing list for questions, and try to use
 existing backends as a template for what you are trying to do.
commit 983f8a3ca53b59a083cd353fd5c0c7a619100c09
Author: Richard Hughes <richard at hughsie.com>
Date:   Fri Jun 20 16:31:09 2008 +0100

    trivial: fix the spec file now we ship the spec as gtk-html

diff --git a/contrib/PackageKit.spec.in b/contrib/PackageKit.spec.in
index 2df1306..611aa25 100644
--- a/contrib/PackageKit.spec.in
+++ b/contrib/PackageKit.spec.in
@@ -113,8 +113,6 @@ rm -f $RPM_BUILD_ROOT%{_libdir}/libpackagekit*.la
 rm -f $RPM_BUILD_ROOT%{_libdir}/packagekit-backend/*.la
 rm -f $RPM_BUILD_ROOT%{_libdir}/packagekit-backend/*.a
 
-install -m644 docs/spec/pk-structure.png $RPM_BUILD_ROOT%{_datadir}/doc/packagekit/
-
 chmod 755 $RPM_BUILD_ROOT%{_libexecdir}/yumDBUSBackend.py
 chmod 755 $RPM_BUILD_ROOT%{_libexecdir}/PackageKitDbusTest.py
 
@@ -136,10 +134,6 @@ update-mime-database %{_datadir}/mime
 %files -f %{name}.lang
 %defattr(-,root,root,-)
 %doc README AUTHORS NEWS COPYING 
-%dir %{_datadir}/doc/packagekit
-%doc %{_datadir}/doc/packagekit/pk-reference.html
-%doc %{_datadir}/doc/packagekit/pk-structure.png
-
 %dir %{_datadir}/PackageKit
 %dir %{_datadir}/PackageKit/helpers
 %dir %{_sysconfdir}/PackageKit
commit a7bdaa5f7fac52e444e27b405d3640140d1050e0
Author: Richard Hughes <richard at hughsie.com>
Date:   Fri Jun 20 16:21:28 2008 +0100

    move the spec files into the autogenerated gtk-doc directory

diff --git a/configure.ac b/configure.ac
index 836b9d3..498e769 100644
--- a/configure.ac
+++ b/configure.ac
@@ -459,7 +459,6 @@ man/Makefile
 docs/Makefile
 docs/html/Makefile
 docs/html/img/Makefile
-docs/spec/Makefile
 docs/api/Makefile
 docs/api/dbus/Makefile
 docs/api/version.xml
diff --git a/docs/Makefile.am b/docs/Makefile.am
index f3c609e..39026b7 100644
--- a/docs/Makefile.am
+++ b/docs/Makefile.am
@@ -3,6 +3,5 @@ NULL =
 SUBDIRS = 						\
 	api						\
 	html						\
-	spec						\
 	$(NULL)
 
diff --git a/docs/api/Makefile.am b/docs/api/Makefile.am
index 02cf1f8..031e6d6 100644
--- a/docs/api/Makefile.am
+++ b/docs/api/Makefile.am
@@ -44,7 +44,16 @@ IGNORE_HFILES =						\
 	$(NULL)
 
 # Images to copy into HTML directory.
-HTML_IMAGES=
+HTML_IMAGES =						\
+	spec/pk-structure.png				\
+	spec/pk-structure.svg				\
+	spec/pk-faq-error-code.png			\
+	spec/pk-faq-status.png				\
+	spec/pk-transactions.svg			\
+	spec/pk-transactions-failure.png		\
+	spec/pk-transactions-sig-install.png		\
+	spec/pk-transactions-success.png		\
+	spec/pk-transactions-trusted.png
 
 # Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
 content_files =						\
diff --git a/docs/api/PackageKit-docs.sgml b/docs/api/PackageKit-docs.sgml
index 70bc690..d1aaaec 100644
--- a/docs/api/PackageKit-docs.sgml
+++ b/docs/api/PackageKit-docs.sgml
@@ -26,7 +26,28 @@
     </copyright>
   </bookinfo>
 
-  <reference id="ref-dbus">
+  <reference id="specification">
+    <title>PackageKit Specification</title>
+    <partintro>
+      <para>
+        PackageKit is a D-Bus abstraction layer that allows the session user
+        to manage packages in a secure way using a cross-distro, cross-architecture API.
+        PackageKit is built using a lightweight backend architecture.
+        PackageKit is product and vendor neutral and is currently being developed by a small team
+        of developers.
+      </para>
+      <para>
+        This part documents core features of PackageKit.
+      </para>
+    </partintro>
+    <xi:include href="spec/pk-introduction.xml"/>
+    <xi:include href="spec/pk-concepts.xml"/>
+    <xi:include href="spec/pk-backend-compiled.xml"/>
+    <xi:include href="spec/pk-backend-dbus.xml"/>
+    <xi:include href="spec/pk-backend-spawn.xml"/>
+  </reference>
+
+  <reference id="api-reference">
     <title>D-Bus API Reference</title>
     <partintro>
       <para>
@@ -37,22 +58,43 @@
     <xi:include href="dbus/pk-interface-transaction.ref.xml"/>
   </reference>
 
-  <chapter>
+  <reference id="libpackagekit-gobject">
     <title>libpackagekit GObjects</title>
+    <partintro>
+      <para>
+        This part documents GObjects used in libpackagekit.
+      </para>
+    </partintro>
     <xi:include href="xml/pk-connection.xml"/>
     <xi:include href="xml/pk-extra.xml"/>
     <xi:include href="xml/pk-client.xml"/>
     <xi:include href="xml/pk-package-list.xml"/>
     <xi:include href="xml/pk-control.xml"/>
     <xi:include href="xml/pk-task-list.xml"/>
-  </chapter>
+  </reference>
 
-  <chapter>
+  <reference id="libpackagekit-helpers">
     <title>libpackagekit glib helpers</title>
+    <partintro>
+      <para>
+        This part documents helper funtions in libpackagekit.
+      </para>
+    </partintro>
     <xi:include href="xml/pk-debug.xml"/>
     <xi:include href="xml/pk-common.xml"/>
     <xi:include href="xml/pk-enum.xml"/>
     <xi:include href="xml/pk-package-id.xml"/>
-  </chapter>
+  </reference>
+
+  <reference id="faq">
+    <title>Frequently asked questions</title>
+    <partintro>
+      <para>
+        This part has answers to developer frequently asked questions.
+      </para>
+    </partintro>
+    <xi:include href="spec/pk-developer-faq.xml"/>
+  </reference>
+
 </book>
 
diff --git a/docs/api/spec/.gitignore b/docs/api/spec/.gitignore
new file mode 100644
index 0000000..3432c3f
--- /dev/null
+++ b/docs/api/spec/.gitignore
@@ -0,0 +1,2 @@
+*.html
+
diff --git a/docs/api/spec/pk-backend-compiled.xml b/docs/api/spec/pk-backend-compiled.xml
new file mode 100644
index 0000000..b510686
--- /dev/null
+++ b/docs/api/spec/pk-backend-compiled.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd">
+
+<chapter id="backend-compiled">
+  <title>Compiled Backends</title>
+  <para>
+    If you have a C or C++ binding for your package system then
+    you can use a compiled backend, which is more efficient than
+    using helpers as described below.
+    You can include the headers in the backend (with extra
+    libraries) and then just write the simple code to interface
+    with the methods of PackageKit.
+    A C example can be found in <literal>backends/box</literal> and a
+    C++ example in <literal>backends/apt</literal>.
+  </para>
+  <para>
+    You will have to use threading if your backend does not support async
+    operation as requests have to return immediately.
+    This is very important. Do any significant processing in a thread, and
+    certainly don't return package results without creating a thread.
+    By keeping the backends async we can make sure that there is no blocking
+    which means the command line and UI do not freeze.
+  </para>
+</chapter>
+
diff --git a/docs/api/spec/pk-backend-dbus.xml b/docs/api/spec/pk-backend-dbus.xml
new file mode 100644
index 0000000..c5db0dc
--- /dev/null
+++ b/docs/api/spec/pk-backend-dbus.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd">
+
+<chapter id="backend-dbus">
+  <title>DBUS Backends</title>
+  <para>
+    Backend helpers communicating over standard out and standard
+    error are easy to write, but can have some performance
+    problems.
+    For instance, if your packages system has to do a lot of work when it
+    starts up and shuts down, performance in the UI may suffer.
+    In these cases, you can use a persistant backend daemon that
+    communicates to the C backend over DBUS.
+  </para>
+  <para>
+    Your daemon will be started by DBUS, and should be responsible
+    for it's own thread management.
+    It should receive an <literal>Init()</literal> method call when the C
+    backend starts, and an <literal>Exit()</literal> method call before it
+    exits.
+    You should also consider adding a timeout value to your daemon so that
+    it will exit after a set time with no activity from the C backend.
+    That way the daemon will still exit even if the C backend crashes for
+    some reason.
+  </para>
+  <para>
+    Again, like the helper backends described above, a compiled
+    backend stub is needed. An example of a DBUS backend written
+    in python can be found in <literal>backends/yum2</literal>,
+    along with a compiled stub written in C.
+  </para>
+</chapter>
+
diff --git a/docs/api/spec/pk-backend-spawn.xml b/docs/api/spec/pk-backend-spawn.xml
new file mode 100644
index 0000000..e2dd0b7
--- /dev/null
+++ b/docs/api/spec/pk-backend-spawn.xml
@@ -0,0 +1,236 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd">
+
+<chapter id="backend-spawn">
+  <title>Spawned Backends</title>
+  <para>
+    If you do not have a C or C++ language binding, PackageKit executes
+    helper scripts written in pretty much any language.
+    It then watches the standard out and standard error and parses the
+    output into compiled backend commands.
+    This means a python library can be interfaced easily with a C backend.
+  </para>
+  <para>
+    Even when using helpers, a compiled backend stub is still used for
+    two reasons:
+  </para>
+  <itemizedlist>
+    <listitem>
+      <para>
+        It is still needed for the dlopen internally in PackageKit.
+      </para>
+    </listitem>
+    <listitem>
+      <para>
+        You can add cleverness in the C backend that you might not want to
+        do in the scripted backend, for example using a hashtable in C
+        rather than checking all the names in awk.
+      </para>
+    </listitem>
+  </itemizedlist>
+  <para>
+    Backends are typically open-programmable, which means we can define a
+    standard for what goes on stdin and stdout to try and maximise
+    the common code between the backends.
+    The following section will explain the convention used on
+    <literal>backends/conary</literal> and <literal>backends/yum</literal>.
+  </para>
+  <para>
+    If you are unable to write scripts that conform to these specifications
+    then just launch a PkSpawn object in the compiled helper with stdout
+    callbacks and then try to do screenscraping in the backend.
+    This screenscraping is least popular for obvious reasons.
+  </para>
+  <para>
+    Backends scripts are run with arguments and data is sent to standard out
+    and standard error asyncronously so that PackageKit can proxy this to DBUS.
+    A method has command line arguments seporated with tabs, and data is also
+    seporated with tabs.
+  </para>
+  <para>
+    It is important to flush the standard output after each output, else
+    Linux will helpfully buffer the output into more efficient size chunks.
+    If you do not flush, then there will be a long IPC delay.
+    Flushing can be achived in C using <literal>fflush</literal> or in python
+    using <literal>sys.stdout.flush()</literal>.
+  </para>
+
+  <sect1 id="backends-spawn-methods">
+    <title>Methods</title>
+    <para>
+      The following methods are mapped from the helper to comand line programs
+      in the spawn helper.
+    </para>
+    <informaltable>
+      <tgroup cols="2">
+        <thead>
+          <row>
+            <entry>Method</entry>
+            <entry>File</entry>
+          </row>
+        </thead>
+        <tbody>
+          <row>
+            <entry>Search Name</entry>
+            <entry><literal>search-name.*</literal></entry>
+          </row>
+          <row>
+            <entry>Search Group</entry>
+            <entry><literal>search-group.*</literal></entry>
+          </row>
+          <row>
+            <entry>Search Details</entry>
+            <entry><literal>search-details.*</literal></entry>
+          </row>
+          <row>
+            <entry>Search File</entry>
+            <entry><literal>search-file.*</literal></entry>
+          </row>
+          <row>
+            <entry>Install Package</entry>
+            <entry><literal>install.*</literal></entry>
+          </row>
+          <row>
+            <entry>Install File</entry>
+            <entry><literal>install-file.*</literal></entry>
+          </row>
+          <row>
+            <entry>Remove Package</entry>
+            <entry><literal>remove.*</literal></entry>
+          </row>
+          <row>
+            <entry>Get Depends</entry>
+            <entry><literal>get-depends.*</literal></entry>
+          </row>
+          <row>
+            <entry>Resolve</entry>
+            <entry><literal>resolve.*</literal></entry>
+          </row>
+          <row>
+            <entry>Get Requires</entry>
+            <entry><literal>get-requires.*</literal></entry>
+          </row>
+          <row>
+            <entry>Get Update Detail</entry>
+            <entry><literal>get-update-detail.*</literal></entry>
+          </row>
+          <row>
+            <entry>Get Details</entry>
+            <entry><literal>get-details.*</literal></entry>
+          </row>
+          <row>
+            <entry>Get Files</entry>
+            <entry><literal>get-files.*</literal></entry>
+          </row>
+          <row>
+            <entry>Update Package</entry>
+            <entry><literal>update.*</literal></entry>
+          </row>
+          <row>
+            <entry>Update System</entry>
+            <entry><literal>update-system.*</literal></entry>
+          </row>
+          <row>
+            <entry>Get Updates</entry>
+            <entry><literal>get-updates.*</literal></entry>
+          </row>
+          <row>
+            <entry>Refresh Cache</entry>
+            <entry><literal>refresh-cache.*</literal></entry>
+          </row>
+          <row>
+            <entry>Get Repo List</entry>
+            <entry><literal>get-repo-list.*</literal></entry>
+          </row>
+          <row>
+            <entry>Repo Enable</entry>
+            <entry><literal>repo-enable.*</literal></entry>
+          </row>
+          <row>
+            <entry>Repo Set Data</entry>
+            <entry><literal>repo-set-data.*</literal></entry>
+          </row>
+        </tbody>
+      </tgroup>
+    </informaltable>
+
+  </sect1>
+
+  <sect1 id="backends-spawn-common">
+    <title>Common function outputs</title>
+    <para>
+      The following commands echoed to standard error will
+      automatically make the backend-launcher do the correct action in the
+      compiled helper.
+    </para>
+    <informaltable>
+      <tgroup cols="2">
+        <thead>
+          <row>
+            <entry>Method</entry>
+            <entry>Data</entry>
+          </row>
+        </thead>
+        <tbody>
+          <row>
+            <entry>Percentage</entry>
+            <entry><literal>percentage[tab]value</literal></entry>
+          </row>
+          <row>
+            <entry>Subpercentage</entry>
+            <entry><literal>subpercentage[tab]value</literal></entry>
+          </row>
+          <row>
+            <entry>NoPercentageUpdates</entry>
+            <entry><literal>no-percentage-updates</literal></entry>
+          </row>
+          <row>
+            <entry>Error</entry>
+            <entry><literal>error[tab]enum[tab]description</literal></entry>
+          </row>
+          <row>
+            <entry>Status</entry>
+            <entry><literal>status[tab]state</literal></entry>
+          </row>
+          <row>
+            <entry>RequireRestart</entry>
+            <entry><literal>requirerestart[tab]type[tab]details</literal></entry>
+          </row>
+          <row>
+            <entry>AllowUpdate</entry>
+            <entry><literal>allow-cancel[tab]enabled</literal></entry>
+          </row>
+          <row>
+            <entry>Package</entry>
+            <entry><literal>package_id[tab]status[tab]summary</literal></entry>
+          </row>
+          <row>
+            <entry>Details</entry>
+            <entry><literal>details[tab]package_id[tab]group[tab]detail[tab]url[tab]size_in_bytes</literal></entry>
+          </row>
+          <row>
+            <entry>Files</entry>
+            <entry><literal>files[tab]package_id[tab]file_list</literal></entry>
+          </row>
+          <row>
+            <entry>UpdateDetail</entry>
+            <entry><literal>package_id[tab]updates[tab]obsoletes[tab]vendor_url[tab]bugzilla_url[tab]cve_url[tab]restart[tab]update_text</literal></entry>
+          </row>
+          <row>
+            <entry>ChangeTransactionData</entry>
+            <entry><literal>change-transaction-data[tab]data</literal></entry>
+          </row>
+          <row>
+            <entry>RepoSignatureRequired</entry>
+            <entry><literal>repository_name[tab]key_url[tab]key_userid[tab]key_id[tab]key_fingerprint[tab]key_timestamp[tab]type</literal></entry>
+          </row>
+          <row>
+            <entry>RepoDetail</entry>
+            <entry><literal>repo-detail[tab]repo_id[tab]description[tab]enabled</literal></entry>
+          </row>
+        </tbody>
+      </tgroup>
+    </informaltable>
+  </sect1>
+
+</chapter>
diff --git a/docs/api/spec/pk-concepts.xml b/docs/api/spec/pk-concepts.xml
new file mode 100644
index 0000000..bbe1b13
--- /dev/null
+++ b/docs/api/spec/pk-concepts.xml
@@ -0,0 +1,820 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd">
+
+<chapter id="concepts">
+  <title>Important Concepts</title>
+  <para>
+    The following sections explain key concepts used internally in PackageKit.
+  </para>
+  <sect1 id="introduction-ideas-packageid">
+    <title>Package ID</title>
+    <para>
+      One important idea is the <literal>package_id</literal>.
+      This is the <literal>name;version;arch;data</literal> in
+      a single string and is meant to represent a single package.
+      This is important when multiple versions of a package are installed and
+      only the correct one is removed.
+    </para>
+    <para>
+      The <literal>package_id</literal> is parsed and checked carefully in
+      the helper code.
+      The package arch and data is optional, but 3 <literal>;</literal>'s must
+      be present.
+      For instance, <literal>gnome-keyring-manager;2.18.0;;</literal> is
+      valid but <literal>gnome-keyring-manager;2.18.0</literal> is not.
+      The data field can be used for the repository name or any other purpose.
+      It is designed to make the life of a backend writer a little bit easier.
+    </para>
+    <para>
+      The data field for an installed package must be
+      <literal>installed</literal> as this is used to identify which packages
+      are installable or installed in the client tools.
+    </para>
+    <para>
+      The data field for an non-installed local package must be
+      <literal>local</literal> as this signifies a repository name is not available
+      and that package resides locally on the client system.
+    </para>
+    <para>
+      For example:
+    </para>
+    <itemizedlist>
+      <listitem>
+        <para>
+          <literal>csup;20060318-5;x86_64;local</literal>: for locally available package file.
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+          <literal>csup;20060318-5;x86_64;fedora-devel</literal>: for package that is not installed
+          and can be downladed from the Fedora development repostory.
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+          <literal>csup;20060318-5;x86_64;installed</literal>: for locally installed package
+        </para>
+      </listitem>
+    </itemizedlist>
+    <informaltable>
+      <tgroup cols="3">
+        <thead>
+          <row>
+            <entry>Situation</entry>
+            <entry>Value</entry>
+            <entry>Description</entry>
+          </row>
+        </thead>
+        <tbody>
+          <row>
+            <entry>Searching</entry>
+            <entry><literal>installed</literal></entry>
+            <entry>If installed</entry>
+          </row>
+          <row>
+            <entry></entry>
+            <entry><literal>available</literal></entry>
+            <entry>If available to install</entry>
+          </row>
+          <row>
+            <entry>Getting Updates</entry>
+            <entry><literal>low</literal></entry>
+            <entry>If update is of low severity</entry>
+          </row>
+          <row>
+            <entry></entry>
+            <entry><literal>normal</literal></entry>
+            <entry>If update is of normal severity</entry>
+          </row>
+          <row>
+            <entry></entry>
+            <entry><literal>important</literal></entry>
+            <entry>If update is very important</entry>
+          </row>
+          <row>
+            <entry></entry>
+            <entry><literal>security</literal></entry>
+            <entry>If the update is security sensitive</entry>
+          </row>
+          <row>
+            <entry>Installing/Updating/Removing</entry>
+            <entry><literal>downloading</literal></entry>
+            <entry>If we are downloading this package</entry>
+          </row>
+          <row>
+            <entry></entry>
+            <entry><literal>updating</literal></entry>
+            <entry>If we are updating this package</entry>
+          </row>
+          <row>
+            <entry></entry>
+            <entry><literal>installing</literal></entry>
+            <entry>If we are installing this package</entry>
+          </row>
+          <row>
+            <entry></entry>
+            <entry><literal>removing</literal></entry>
+            <entry>If we are removing this package</entry>
+          </row>
+          <row>
+            <entry>Otherwise</entry>
+            <entry><literal>unknown</literal></entry>
+            <entry>If we cannot use any other option</entry>
+          </row>
+        </tbody>
+      </tgroup>
+    </informaltable>
+    <para>
+      The backend must ensure that the package_id only matches on one
+      single package.
+      A single package_id must be enough to uniquely identify a single object
+      in any repository used on the system.
+    </para>
+  </sect1>
+
+  <sect1 id="introduction-ideas-filters">
+    <title>Filters</title>
+    <para>
+      Search filtering on the name is done in the backend for efficiency reasons.
+      This can be added into the compiled backend if this is not possible
+      in any new backend design.
+    </para>
+    <para>
+      Filter options are:
+    </para>
+    <informaltable>
+      <tgroup cols="2">
+        <thead>
+          <row>
+            <entry>Option</entry>
+            <entry>Description</entry>
+          </row>
+        </thead>
+        <tbody>
+          <row>
+            <entry><literal>installed</literal> or <literal>~installed</literal></entry>
+            <entry>If the package is installed on the system</entry>
+          </row>
+          <row>
+            <entry><literal>devel</literal> or <literal>~devel</literal></entry>
+            <entry>Development packages typically end -devel, -dgb and -static.</entry>
+          </row>
+          <row>
+            <entry><literal>gui</literal> or <literal>~gui</literal></entry>
+            <entry>GUI programs typically depend on gtk, libkde or libxfce.</entry>
+          </row>
+          <row>
+            <entry><literal>free</literal> or <literal>~free</literal></entry>
+            <entry>
+              Free software. The package contains only software and
+              other content that is available under a free license.
+              See http://fedoraproject.org/wiki/Licensing for a list
+              of licenses that are considered free. If a license
+              cannot be determined from the package metadata, or the
+              status of the license is not known, the package will
+              be marked as 'non-free'.
+            </entry>
+          </row>
+          <row>
+            <entry><literal>visible</literal> or <literal>~visible</literal></entry>
+            <entry>
+              Repositories may want to specify if a package should be visible
+              in an application chooser.
+            </entry>
+          </row>
+          <row>
+            <entry><literal>supported</literal> or <literal>~supported</literal></entry>
+            <entry>
+              If the package is supported or is a third party addon.
+            </entry>
+          </row>
+          <row>
+            <entry><literal>basename</literal> or <literal>~basename</literal></entry>
+            <entry>
+              The basename filter will only return results according to the
+              package basename.
+              This is useful if you are searching for pm-utils and you only
+              want to show the main pm-utils package, not any of the
+              <literal>-devel</literal> or <literal>-debuginfo</literal> or
+              <literal>-common</literal> suffixes in the UI.
+              The basename is normally the original name of the source package.
+            </entry>
+          </row>
+          <row>
+            <entry><literal>newest</literal> or <literal>~newest</literal></entry>
+            <entry>
+              The newest filter will only return the newest package available.
+              This is useful if you are searching for <literal>gimp</literal>
+              and only <literal>gimp-2.4.5-1.fc9.i386</literal> would be returned,
+              not <literal>gimp-2.4.5-1.fc9.i386</literal>,
+              <literal>gimp-2.4.4-1.fc9.i386</literal> and
+              <literal>gimp-2.4.3-1.fc9.i386</literal>.
+            </entry>
+          </row>
+          <row>
+            <entry><literal>arch</literal> or <literal>~arch</literal></entry>
+            <entry>
+              The arch filter will only return the packages that match the exact architecture
+              of the system, for instance only showing x86_64 packages on a AMD Turion 64.
+              This would mean that x86_64 packages could be filtered from non-native 32-bit
+              packages.
+              This allows the used to choose non-native packages if a multi-lib policy is allowed.
+            </entry>
+          </row>
+          <row>
+            <entry><literal>source</literal> or <literal>~source</literal></entry>
+            <entry>
+              The source filter will only return source packages.
+              These are typically useful when rebuilding other packages.
+            </entry>
+          </row>
+        </tbody>
+      </tgroup>
+    </informaltable>
+
+    <para>
+      So valid options would be:
+    </para>
+    <informaltable>
+      <tgroup cols="2">
+        <thead>
+          <row>
+            <entry>Option</entry>
+            <entry>Description</entry>
+          </row>
+        </thead>
+        <tbody>
+          <row>
+            <entry><literal>none</literal></entry>
+            <entry>All packages installed or available with no filtering</entry>
+          </row>
+          <row>
+            <entry><literal>devel;~installed</literal></entry>
+            <entry>All non-installed development packages</entry>
+          </row>
+          <row>
+            <entry><literal>installed;~devel</literal></entry>
+            <entry>All installed non-development packages</entry>
+          </row>
+          <row>
+            <entry><literal>gui;~installed;~devel</literal></entry>
+            <entry>All non-installed, non-devel gui programs</entry>
+          </row>
+        </tbody>
+      </tgroup>
+    </informaltable>
+
+  </sect1>
+
+  <sect1 id="introduction-errors">
+    <title>Error Enums</title>
+    <para>
+      If you have to handle an error, try to use <literal>internal-error</literal>
+      as little as possible.
+      Just ask on the mailing list, and we can add some more error enums to
+      cover the type of error in an abstract way as possible.
+    </para>
+    <para>
+      Every error should have an enumerated type
+      (e.g. <literal>out-of-memory</literal>) and also an error description.
+      The error description is not translated and not converted into the users
+      locale.
+      The error description should be descriptive, as it's for power users
+      and people trying to debug the problem.
+      For instance, "Out of memory" is not helpful as an error description
+      that is reported in a bugzilla, but "Could not create database index" is.
+      For the description use <literal>;</literal> to separate the lines if
+      required.
+    </para>
+    <para>
+      The following error enumerated types are available for use in all
+      backends:
+    </para>
+    <informaltable>
+      <tgroup cols="2">
+        <thead>
+          <row>
+            <entry>Error</entry>
+            <entry>Description</entry>
+          </row>
+        </thead>
+        <tbody>
+          <row>
+            <entry><literal>out-of-memory</literal></entry>
+            <entry>There is an out of memory condition</entry>
+          </row>
+          <row>
+            <entry><literal>no-network</literal></entry>
+            <entry>There is no network connection that can be used</entry>
+          </row>
+          <row>
+            <entry><literal>not-supported</literal></entry>
+            <entry>
+              Not supported by the backend.
+              NOTE: You shouldn't be setting non-NULL in the compiled
+              backend symbol table if you find yourself using this.
+            </entry>
+          </row>
+          <row>
+            <entry><literal>internal-error</literal></entry>
+            <entry>
+              There was an unspecified internal error.
+              NOTE: Please try and be more specific.
+              If you are using this then we should probably add a new type.
+            </entry>
+          </row>
+          <row>
+            <entry><literal>no-cache</literal></entry>
+            <entry>
+              The operation is trying to read from the cache, but the cache
+              is not present or invalid
+            </entry>
+          </row>
+          <row>
+            <entry><literal>gpg-failure</literal></entry>
+            <entry>There was a GPG failure in the transaction</entry>
+          </row>
+          <row>
+            <entry><literal>package-id-invalid</literal></entry>
+            <entry>The package ID is not valid for this transaction</entry>
+          </row>
+          <row>
+            <entry><literal>package-not-installed</literal></entry>
+            <entry>
+              The package that is trying to be removed or updated is not
+              installed
+            </entry>
+          </row>
+          <row>
+            <entry><literal>package-not-found</literal></entry>
+            <entry>
+              The package that is trying to be removed or updated is not
+              installed
+            </entry>
+          </row>
+          <row>
+            <entry><literal>package-already-installed</literal></entry>
+            <entry>
+              The package that is trying to be installed or updated is already
+              installed
+            </entry>
+          </row>
+          <row>
+            <entry><literal>package-download-failed</literal></entry>
+            <entry>A package failed to download correctly</entry>
+          </row>
+          <row>
+            <entry><literal>invalid-package-file</literal></entry>
+            <entry>
+	      The file that is supposed to contain a package to
+              install is corrupt, or is not a valid package file
+	    </entry>
+          </row>
+          <row>
+            <entry><literal>package-install-blocked</literal></entry>
+            <entry>
+	      The backend's configuration or policy prevents the
+              install or updating of a package
+	    </entry>
+          </row>
+          <row>
+            <entry><literal>dep-resolution-failed</literal></entry>
+            <entry>Dependency resolution failed</entry>
+          </row>
+          <row>
+            <entry><literal>filter-invalid</literal></entry>
+            <entry>
+              The filter was invalid.
+              NOTE: syntax checking is done in the backend loader, so you
+              should only use this if the filter is not supported by the
+              backend.
+            </entry>
+          </row>
+          <row>
+            <entry><literal>group-not-found</literal></entry>
+            <entry>
+	      The specified software group was not found.
+            </entry>
+          </row>
+          <row>
+            <entry><literal>create-thread-failed</literal></entry>
+            <entry>Failed to create a thread</entry>
+          </row>
+          <row>
+            <entry><literal>transaction-error</literal></entry>
+            <entry>
+              There was a generic transaction error, but please give more
+              details in the description
+            </entry>
+          </row>
+          <row>
+            <entry><literal>transaction-cancelled</literal></entry>
+            <entry>
+              The transaction was cancelled as the result of a call
+              to Cancel()
+            </entry>
+          </row>
+          <row>
+            <entry><literal>repo-not-found</literal></entry>
+            <entry>The repository name could not be found</entry>
+          </row>
+          <row>
+            <entry><literal>repo-configuration-error</literal></entry>
+            <entry>One of the enabled repositories has invalid configuration</entry>
+          </row>
+	  <row>
+	    <entry><literal>repo-not-available</literal></entry>
+	    <entry>
+	      There was a (possibly transient) problem connecting to a
+	      repository
+	    </entry>
+	  </row>
+          <row>
+            <entry><literal>cannot-remove-system-package</literal></entry>
+            <entry>
+              Could not remove a protected system package that is needed for
+              stable operation of the system
+            </entry>
+          </row>
+          <row>
+            <entry><literal>process-quit</literal></entry>
+            <entry>
+              The process was asked to quit, probably because it was cancelled
+            </entry>
+          </row>
+          <row>
+            <entry><literal>process-kill</literal></entry>
+            <entry>
+              The process was forcibly killed, probably because ignored the
+              quit request. This is probably due to it being cancelled
+            </entry>
+          </row>
+          <row>
+            <entry><literal>failed-config-parsing</literal></entry>
+            <entry>
+	      Configuration files could not be read or parsed.
+            </entry>
+          </row>
+          <row>
+            <entry><literal>cannot-cancel</literal></entry>
+            <entry>
+	      The Cancel() method was called, but it is too late to
+	      cancel the current transaction.
+            </entry>
+          </row>
+          <row>
+            <entry><literal>cannot-get-lock</literal></entry>
+            <entry>
+	      The backend could not acquire a lock on the underlying
+	      package management system.
+            </entry>
+          </row>
+          <row>
+            <entry><literal>no-packages-to-update</literal></entry>
+            <entry>
+	      UpdateSystem() was called, but there are no packages to update.
+            </entry>
+          </row>
+          <row>
+            <entry><literal>cannot-write-repo-config</literal></entry>
+            <entry>
+	      RepoEnable() or RepoSetData() was called, but the
+	      repository configuration file could not be written to.
+            </entry>
+          </row>
+          <row>
+            <entry><literal>local-install-failed</literal></entry>
+            <entry>
+	      A local file could not be installed.  The file might not
+	      be readable, or it might not contain a valid package.
+            </entry>
+          </row>
+          <row>
+            <entry><literal>bad-gpg-signature</literal></entry>
+            <entry>
+	      The package is signed with a GPG signature, but that
+	      signature is not valid in some way.
+            </entry>
+          </row>
+          <row>
+            <entry><literal>package-corrupt</literal></entry>
+            <entry>
+	      The downloaded package is corrupt.
+            </entry>
+          </row>
+
+        </tbody>
+      </tgroup>
+    </informaltable>
+  </sect1>
+
+  <sect1 id="introduction-group-type">
+    <title>Group type</title>
+    <para>
+      Groups are enumerated for localisation.
+      Backends should try to put packages in different groups if possible,
+      else just don't advertise SearchGroup and the options should not be
+      shown in the UI.
+    </para>
+    <para>
+      The following group enumerated types are available, but please check
+      <literal>libpackagekit/pk-enum.h</literal> for the latest list.
+    </para>
+    <informaltable>
+      <tgroup cols="2">
+        <thead>
+          <row>
+            <entry>Group</entry>
+            <entry>Description</entry>
+          </row>
+        </thead>
+        <tbody>
+          <row>
+            <entry><literal>accessibility</literal></entry>
+            <entry>Accessibility</entry>
+          </row>
+          <row>
+            <entry><literal>accessories</literal></entry>
+            <entry>Accessories</entry>
+          </row>
+          <row>
+            <entry><literal>education</literal></entry>
+            <entry>Education</entry>
+          </row>
+          <row>
+            <entry><literal>games</literal></entry>
+            <entry>Games</entry>
+          </row>
+          <row>
+            <entry><literal>graphics</literal></entry>
+            <entry>Graphics</entry>
+          </row>
+          <row>
+            <entry><literal>internet</literal></entry>
+            <entry>Internet</entry>
+          </row>
+          <row>
+            <entry><literal>office</literal></entry>
+            <entry>Office</entry>
+          </row>
+          <row>
+            <entry><literal>other</literal></entry>
+            <entry>Other</entry>
+          </row>
+          <row>
+            <entry><literal>programming</literal></entry>
+            <entry>Programming</entry>
+          </row>
+          <row>
+            <entry><literal>multimedia</literal></entry>
+            <entry>Multimedia</entry>
+          </row>
+          <row>
+            <entry><literal>system</literal></entry>
+            <entry>System</entry>
+          </row>
+        </tbody>
+      </tgroup>
+    </informaltable>
+  </sect1>
+
+  <sect1 id="introduction-cancellation">
+    <title>Cancellation</title>
+    <para>
+      If you have a multipart transaction that can be aborted in one phase but
+      not another then the AllowCancel signal can be sent.
+      This allows for example the yum download to be cancelled, but not the
+      install transaction.
+      By cancelling a job all subtransactions are killed.
+    </para>
+    <para>
+      By default actions cannot be cancelled unless enabled in the backend.
+      Use <literal>AllowCancel(true)</literal> to enable cancellation
+      and <literal>AllowCancel(false)</literal> to disable it.
+      This can be done for any job type.
+    </para>
+    <para>
+      For compiled backends that are threaded, the
+      <literal>cancel()</literal> method can be used to terminate
+      the thread.
+    </para>
+    <para>
+      For spawned backends, there are two staggered signals send to allow
+      locks to be released or for the backend to clean up after itself:
+    </para>
+    <itemizedlist>
+      <listitem>
+        <para>Send the process <literal>SIGQUIT</literal>.</para>
+      </listitem>
+      <listitem>
+        <para>Wait 500ms</para>
+      </listitem>
+      <listitem>
+        <para>
+          If the process has not already quit, send the process
+          <literal>SIGKILL</literal> to terminate it.
+        </para>
+      </listitem>
+    </itemizedlist>
+  </sect1>
+
+  <sect1 id="introduction-ideas-transactions">
+    <title>Transactions</title>
+    <para>
+      PackageKit does not ask the user questions when the transaction is running.
+      It also supports a fire-and-forget method invocation, which means that transactions will
+      have one calling method, and have many signals going back to the caller.
+    </para>
+    <para>
+      Each transaction is a new path on the <literal>org.freedesktop.PackageKit</literal>
+      service, and to create a path you have to call <literal>GetTid</literal> on the base
+      interface which creates the new DBUS path, and returns the new path for you to connect to.
+      In the libpackagekit binding, <literal>PkControl</literal> handles the base interface,
+      whilst <literal>PkClient</literal> handles all the transaction interface stuff.
+      The <literal>org.freedesktop.PackageKit.Transaction</literal> interface can be used
+      on the newly created path, but only used once.
+      New methods require a new transaction path (i.e. another call to <literal>GetTid</literal>)
+      which is synchronous and thus very fast.
+    </para>
+    <para>
+      A typical successful transaction can be seen below.
+    </para>
+    <mediaobject id="pk-transactions-success">
+      <imageobject>
+        <imagedata format="PNG" fileref="pk-transactions-success.png" align="center"/>
+      </imageobject>
+    </mediaobject>
+    <para>
+      A typical simple transaction failure case can be seen below.
+      The user is not given the change to requeue the transaction as it is a fatal error.
+    </para>
+    <mediaobject id="pk-transactions-failure">
+      <imageobject>
+        <imagedata format="PNG" fileref="pk-transactions-failure.png" align="center"/>
+      </imageobject>
+    </mediaobject>
+    <para>
+      In this non-trivial example, a local file install is being attempted.
+      First the <literal>InstallFile</literal> is called with the <literal>trusted</literal>
+      flag set.
+      This will fail if the package does not have a valid GPG key, and ordinarily the transaction
+      would fail. What the client can do, e.g. using <literal>gnome-packagekit</literal>, is
+      to re-request the <literal>InstallFile</literal> with <literal>non-trusted</literal>.
+      This will use a different PolicyKit authentication, and allow the file to succeed.
+    </para>
+    <para>
+      So why do we bother calling <literal>trusted</literal> in the first place?
+      Well, the trusted PolicyKit role can be saved in the gnome-keyring, or could be
+      set to the users password as the GPG key is already trusted by the user.
+      The <literal>non-trusted</literal> action would likely ask for the administrator password,
+      and not allowed to be saved. This gives the user the benifit of installing trusted local
+      files without a password (common case) but requiring something stronger for untrusted or
+      unsigned files.
+    </para>
+    <mediaobject id="pk-transactions-trusted">
+      <imageobject>
+        <imagedata format="PNG" fileref="pk-transactions-trusted.png" align="center"/>
+      </imageobject>
+    </mediaobject>
+    <para>
+      If the package is signed, and a valid GPG signature is available, then we need to ask the
+      user to import the key, and re-run the transaction.
+      This is done as three transactions, as other transactions may be queued and have a higher
+      priority, and to make sure that the transaction object is not reused.
+    </para>
+    <mediaobject id="pk-transactions-sig-install">
+      <imageobject>
+        <imagedata format="PNG" fileref="pk-transactions-sig-install.png" align="center"/>
+      </imageobject>
+    </mediaobject>
+    <para>
+      If the package is signed, and a valid GPG signature is available, then we need to ask the
+      user to import the key, and re-run the transaction.
+      This is done as three transactions, as other transactions may be queued and have a higher
+      priority, and to make sure that the transaction object is not reused.
+    </para>
+  </sect1>
+
+  <sect1 id="introduction-ideas-transactionid">
+    <title>Transaction IDs</title>
+    <para>
+      A <literal>transaction_id</literal> is a unique identifier that
+      identifies the present or past transaction.
+      A transaction is made up of one or more sub-transactions.
+      A transaction has one <literal>role</literal> for the entire lifetime,
+      but the transaction can different values of <literal>status</literal>
+      as the transaction is processed.
+    </para>
+    <para>
+      For example, if the user "Installed OpenOffice" and the backend has to:
+    </para>
+    <itemizedlist>
+      <listitem>
+        <para>
+          update libxml2 as a dependency
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+          install java as dependency
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+          install openoffice-bin
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+          install openoffice-clipart
+        </para>
+      </listitem>
+    </itemizedlist>
+    <para>
+      This is one single transaction with the role <literal>install</literal>,
+      with 4 different sub-transactions.
+      This allows the user to rollback transactions with selected backends,
+      rather than select sub-transactions which may need complex conflict
+      resolution.
+    </para>
+    <para>
+      The <literal>transaction_id</literal> must be of the format
+      <literal>/job_identifier_data</literal> where the daemon controls
+      all parameters.
+      <literal>job</literal> is a monotonically updating number and is
+      retained over reboots.
+      <literal>identifier</literal> is random data used by the daemon to
+      ensure jobs started in parallel cannot race, and also to make a
+      malicious client program harder to write.
+      <literal>data</literal> can be used for ref-counting in the backend or
+      for any other purpose.
+      It is designed to make the life of a backend writer a little bit easier.
+      An example <literal>transaction_id</literal> would be
+      <literal>/45_dafeca_checkpoint32</literal>
+    </para>
+  </sect1>
+
+  <sect1 id="introduction-ideas-status">
+    <title>Status Values</title>
+    <para>
+      A transaction will have different status values as it it queued, prepared
+      and executed.
+      The <literal>::StatusChanged</literal> signal from PkClient allow you
+      to design user interfaces that tell the user what is happening with the
+      transaction.
+    </para>
+    <para>
+      A typical transaction will have the following states:
+    </para>
+    <itemizedlist>
+      <listitem>
+        <para>
+          Queued in the active queue (<literal>PK_STATUS_ENUM_WAIT</literal>)
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+          Transaction started, and is being prepared (<literal>PK_STATUS_ENUM_SETUP</literal>)
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+          The transaction is running (<literal>PK_STATUS_ENUM_RUNNING</literal>)
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+          (optional) Data is downloading (<literal>PK_STATUS_ENUM_DOWNLOADING</literal>)
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+          (optional) Data is installing (<literal>PK_STATUS_ENUM_INSTALLING</literal>)
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+          The transaction is finished (<literal>PK_STATUS_ENUM_FINISHED</literal>)
+        </para>
+      </listitem>
+    </itemizedlist>
+    <para>
+      If the transaction is waiting for other jobs to finish (in the active queue)
+      then the status will be stuck at <literal>PK_STATUS_ENUM_WAIT</literal>
+      and the UI should show a message to this effect.
+    </para>
+    <para>
+      If the transaction is waiting for a package lock (when a legacy tool like
+      <literal>pirut</literal> is loaded and has the <literal>yum</literal> lock)
+      then the transaction will be stuck at <literal>PK_STATUS_ENUM_SETUP</literal>.
+    </para>
+    <para>
+      As a backend writer, you do not have to set <literal>PK_STATUS_ENUM_RUNNING</literal>
+      manually, as this will be set for you if you set any other value such as
+      <literal>PK_STATUS_ENUM_DOWNLOADING</literal> or <literal>PK_STATUS_ENUM_INFO</literal>.
+      However, you will need to avoid setting any status values until a package
+      lock is available and the transaction has started.
+    </para>
+  </sect1>
+</chapter>
+
diff --git a/docs/api/spec/pk-developer-faq.xml b/docs/api/spec/pk-developer-faq.xml
new file mode 100644
index 0000000..eba28eb
--- /dev/null
+++ b/docs/api/spec/pk-developer-faq.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd">
+
+<chapter id="developer-faq">
+  <title>Developer FAQ</title>
+  <para>
+    The following sections explain frequently asked questions from people creating thier own
+    backend.
+    This list is not exhaustive, but please ask before adding to it.
+  </para>
+
+  <sect1 id="developer-faq-status-signals">
+    <title>Backends should send status signals...</title>
+    <para>
+      If your backend does not set status signals you will get the following dialog:
+    </para>
+    <mediaobject id="pk-faq-status">
+      <imageobject>
+        <imagedata format="PNG" fileref="pk-faq-status.png" align="center"/>
+      </imageobject>
+    </mediaobject>
+    <para>
+      For every transaction, you need to tell the datemon what the backend is doing.
+      You need to add to your backend:
+    </para>
+    <itemizedlist>
+      <listitem>
+        <para>
+          For python: <literal>self.status(STATUS_QUERY)</literal>
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+          For compiled C/C++: <literal>pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);</literal>
+        </para>
+      </listitem>
+    </itemizedlist>
+    <para>
+      You can send as many status calls as you need as the transaction progresses.
+      The more calls you send, the more the UI will reflect what is being done, for instance,
+      showing a downloading icon when <literal>PK_STATUS_ENUM_DOWNLOAD</literal> is used.
+    </para>
+  </sect1>
+
+  <sect1 id="developer-faq-error-code-finished">
+    <title>Finished() after ErrorCode()...</title>
+    <para>
+      If your backend does not send <literal>Finished()</literal> after <literal>ErrorCode()</literal>
+      then the following dialog will be shown.
+    </para>
+    <mediaobject id="pk-faq-error-code">
+      <imageobject>
+        <imagedata format="PNG" fileref="pk-faq-error-code.png" align="center"/>
+      </imageobject>
+    </mediaobject>
+    <para>
+      The daemon recovers automatically, so this warning is not fatal, but the automatic recovery
+      is not cost free.
+      Every time the daemon cleans up a transaction like this, an additional 500ms is added to the
+      transaction duration (to allow slow backends to clean up after themselves) and so the
+      next transaction is delayed from starting.
+    </para>
+    <para>
+      You need to ensure that <literal>Finished()</literal> follows <literal>ErrorCode()</literal>
+      to remove this warning.
+    </para>
+  </sect1>
+
+</chapter>
+
diff --git a/docs/api/spec/pk-faq-error-code.png b/docs/api/spec/pk-faq-error-code.png
new file mode 100644
index 0000000..2cccae1
Binary files /dev/null and b/docs/api/spec/pk-faq-error-code.png differ
diff --git a/docs/api/spec/pk-faq-status.png b/docs/api/spec/pk-faq-status.png
new file mode 100644
index 0000000..7c49b9c
Binary files /dev/null and b/docs/api/spec/pk-faq-status.png differ
diff --git a/docs/api/spec/pk-introduction.xml b/docs/api/spec/pk-introduction.xml
new file mode 100644
index 0000000..affb2ae
--- /dev/null
+++ b/docs/api/spec/pk-introduction.xml
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd">
+
+<chapter id="introduction">
+  <title>PackageKit Introduction</title>
+
+  <sect1 id="introduction-description">
+    <title>Overall Description</title>
+
+    <para>
+      PackageKit is a small open source system that abstracts out common package
+      management tasks such as:
+    </para>
+    <itemizedlist>
+      <listitem>
+        <para>
+          Checking for updates and installing them in the background.
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+          Automatically installing new or add-on software.
+        </para>
+      </listitem>
+    </itemizedlist>
+
+    <para>
+      PackageKit has a modular design with an asynchronous API for client programs,
+      a flexible queuing module, and run-time selectable backends.
+    </para>
+
+    <mediaobject id="pk-structure">
+      <imageobject>
+        <imagedata format="PNG" fileref="pk-structure.png" align="center"/>
+      </imageobject>
+    </mediaobject>
+  </sect1>
+
+  <sect1 id="introduction-backends">
+    <title>Backends</title>
+    <para>
+      A backend is just a compiled <literal>.so</literal> object that is
+      loaded at run-time and provides an interface to the underlying package
+      commands.
+      A backend converts an asynchronous request into either a new thread
+      in the same process, executes external "glue" files that
+      can be written in any language, or uses DBUS to signal a
+      daemon process to handle the request.
+    </para>
+    <para>
+      Backends do not have to support all of the commands supported
+      by PackageKit. Each backend advertises the commands and
+      options it supports, and the frontend will only show UI
+      elements for those commands.
+      Please see the <literal>html/pk-faq.html</literal> file for the current
+      status of the existing backends.
+      Backed maintainers, please keep this file updated.
+    </para>
+  </sect1>
+
+  <sect1 id="config-main">
+    <title>Daemon Config Options</title>
+    <para>
+      The config file <literal>/etc/PackageKit/PackageKit.conf</literal> allows to the
+      administrator to change system daemon options.
+      In normal use this file does not have to be changed, but it may be
+      useful to people debugging the daemon or developing backends.
+    </para>
+    <para>
+      The options are:
+    </para>
+    <sect2 id="config-main-logging">
+      <title>TransactionLogging</title>
+      <para>
+        This logs all transactions to <literal>/var/log/PackageKit</literal> so old
+        daemon debugging output can be observed.
+      </para>
+    </sect2>
+    <sect2 id="config-main-timeout">
+      <title>ShutdownTimeout</title>
+      <para>
+        This is the time that the daemon waits when idle before shutting down.
+        A smaller number will result in slower response times when running
+        many transactions in a small amount of time.
+        A longer timeout will lock the underlying packaging backend for longer,
+        although the daemon will start and stop less often.
+      </para>
+    </sect2>
+    <sect2 id="config-main-default">
+      <title>DefaultBackend</title>
+      <para>
+        The default backend that the daemon should use.
+        The default is set at compile time to the
+        <literal>--default-backend=</literal> configure setting.
+      </para>
+    </sect2>
+  </sect1>
+
+</chapter>
+
diff --git a/docs/api/spec/pk-structure.png b/docs/api/spec/pk-structure.png
new file mode 100644
index 0000000..0d8a169
Binary files /dev/null and b/docs/api/spec/pk-structure.png differ
diff --git a/docs/api/spec/pk-structure.svg b/docs/api/spec/pk-structure.svg
new file mode 100644
index 0000000..afbee9e
--- /dev/null
+++ b/docs/api/spec/pk-structure.svg
@@ -0,0 +1,502 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://web.resource.org/cc/"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="744.09448819"
+   height="1052.3622047"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.45.1"
+   sodipodi:docbase="/home/hughsie/Code/PackageKit/docs/spec"
+   sodipodi:docname="pk-structure.svg"
+   inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-structure.png"
+   inkscape:export-xdpi="51.209103"
+   inkscape:export-ydpi="51.209103"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow1Send"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Send"
+       style="overflow:visible;">
+      <path
+         id="path4218"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+         transform="scale(0.2) rotate(180) translate(6,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Mend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Mend"
+       style="overflow:visible;">
+      <path
+         id="path4212"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+         transform="scale(0.4) rotate(180) translate(10,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Sstart"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Sstart"
+       style="overflow:visible">
+      <path
+         id="path4215"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         transform="scale(0.2) translate(6,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Mstart"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Mstart"
+       style="overflow:visible">
+      <path
+         id="path4888"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         transform="scale(0.4) translate(10,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lstart"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Lstart"
+       style="overflow:visible">
+      <path
+         id="path4894"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         transform="scale(0.8) translate(12.5,0)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     gridtolerance="10000"
+     guidetolerance="10"
+     objecttolerance="10"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.49497475"
+     inkscape:cx="195.83799"
+     inkscape:cy="657.01225"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-points="true"
+     inkscape:object-nodes="true"
+     inkscape:object-points="true"
+     inkscape:object-bbox="true"
+     inkscape:window-width="1270"
+     inkscape:window-height="721"
+     inkscape:window-x="0"
+     inkscape:window-y="24"
+     showguides="true"
+     inkscape:guide-bbox="true" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.79076731;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.79076725, 21.48920706;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 157.90632,193.25757 L 719.10462,193.25757 L 719.10462,193.25757"
+       id="path2839" />
+    <rect
+       style="opacity:1;fill:#ededed;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect1882"
+       width="160"
+       height="80"
+       x="360"
+       y="72.362183" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+       x="436.28711"
+       y="106.9657"
+       id="text1942"><tspan
+         sodipodi:role="line"
+         x="436.28711"
+         y="106.9657"
+         style="font-size:28px;text-align:center;text-anchor:middle"
+         id="tspan3730">Update</tspan><tspan
+         sodipodi:role="line"
+         x="436.28711"
+         y="141.9657"
+         style="font-size:28px;text-align:center;text-anchor:middle"
+         id="tspan2226">Icon</tspan></text>
+    <rect
+       style="opacity:1;fill:#729fcf;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect1876"
+       width="340"
+       height="80"
+       x="280"
+       y="232.36218" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+       x="336.07422"
+       y="284.04187"
+       id="text1946"><tspan
+         sodipodi:role="line"
+         id="tspan1948"
+         x="336.07422"
+         y="284.04187"
+         style="font-size:40px">packagekitd</tspan></text>
+    <rect
+       style="opacity:1;fill:#ad7fa8;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect1884"
+       width="200"
+       height="80"
+       x="340"
+       y="352.36218" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+       x="447.54688"
+       y="383.79077"
+       id="text1918"><tspan
+         sodipodi:role="line"
+         x="447.54688"
+         y="383.79077"
+         style="font-size:28px;text-align:center;text-anchor:middle"
+         id="tspan3732">Active</tspan><tspan
+         sodipodi:role="line"
+         x="447.54688"
+         y="418.79077"
+         style="font-size:28px;text-align:center;text-anchor:middle"
+         id="tspan3227">Queue</tspan></text>
+    <rect
+       style="opacity:1;fill:#ededed;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect2230"
+       width="160"
+       height="80"
+       x="160"
+       y="72.362183" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+       x="236.28711"
+       y="106.9657"
+       id="text2232"><tspan
+         sodipodi:role="line"
+         x="236.28711"
+         y="106.9657"
+         style="font-size:28px;text-align:center;text-anchor:middle"
+         id="tspan2236">Software</tspan><tspan
+         sodipodi:role="line"
+         x="236.28711"
+         y="141.9657"
+         style="font-size:28px;text-align:center;text-anchor:middle"
+         id="tspan2240">Installer</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+       x="218.58398"
+       y="187.07898"
+       id="text3217"><tspan
+         sodipodi:role="line"
+         x="218.58398"
+         y="187.07898"
+         style="font-size:20px;text-align:center;text-anchor:middle"
+         id="tspan3221">SYSTEM</tspan><tspan
+         sodipodi:role="line"
+         x="218.58398"
+         y="212.07898"
+         style="font-size:20px;text-align:center;text-anchor:middle"
+         id="tspan2229">DBUS</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:5.81893778;stroke-linecap:square;stroke-linejoin:miter;marker-start:url(#Arrow1Sstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 445.32143,344.35568 C 445.32143,314.46904 445.32143,314.46904 445.32143,314.46904"
+       id="path4398"
+       sodipodi:nodetypes="cc" />
+    <rect
+       style="opacity:1;fill:#ff9955;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect5369"
+       width="160"
+       height="80"
+       x="59.999996"
+       y="232.36218" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+       x="147.54688"
+       y="262.98816"
+       id="text5371"><tspan
+         sodipodi:role="line"
+         x="147.54688"
+         y="262.98816"
+         style="font-size:28px;text-align:center;text-anchor:middle"
+         id="tspan5375">Backend</tspan><tspan
+         sodipodi:role="line"
+         x="147.54688"
+         y="297.98816"
+         style="font-size:28px;text-align:center;text-anchor:middle"
+         id="tspan5381">Instance</tspan></text>
+    <rect
+       style="opacity:1;fill:#ff9955;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect5383"
+       width="135"
+       height="80"
+       x="300"
+       y="452.36218" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+       x="362.6875"
+       y="483.63562"
+       id="text5385"><tspan
+         sodipodi:role="line"
+         x="362.6875"
+         y="483.63562"
+         style="font-size:28px;text-align:center;text-anchor:middle"
+         id="tspan5387">Runner</tspan><tspan
+         sodipodi:role="line"
+         x="362.6875"
+         y="518.63562"
+         style="font-size:28px;text-align:center;text-anchor:middle"
+         id="tspan5389">Task</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Send);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 292.5,152.36218 L 397.5,232.36218"
+       id="path5395"
+       inkscape:connector-type="polyline"
+       inkscape:connection-start="#rect2230"
+       inkscape:connection-end="#rect1876" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Send);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 442.5,152.36218 L 447.5,232.36218"
+       id="path5397"
+       inkscape:connector-type="polyline"
+       inkscape:connection-start="#rect1882"
+       inkscape:connection-end="#rect1876" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Send);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
+       d="M 280,272.36218 L 220,272.36218"
+       id="path5401"
+       inkscape:connector-type="polyline"
+       inkscape:connection-start="#rect1876"
+       inkscape:connection-end="#rect5369" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Send);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 411,432.36218 L 396.5,452.36218"
+       id="path5403"
+       inkscape:connector-type="polyline"
+       inkscape:connection-start="#rect1884"
+       inkscape:connection-end="#rect5383" />
+    <rect
+       style="opacity:1;fill:#87de87;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect6378"
+       width="200"
+       height="80"
+       x="39.999996"
+       y="452.36218" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+       x="144.55272"
+       y="486.9657"
+       id="text6380"><tspan
+         sodipodi:role="line"
+         x="144.55272"
+         y="486.9657"
+         style="font-size:28px;text-align:center;text-anchor:middle"
+         id="tspan6384">Helper</tspan><tspan
+         sodipodi:role="line"
+         x="144.55272"
+         y="521.9657"
+         style="font-size:28px;text-align:center;text-anchor:middle"
+         id="tspan6388">Executable</tspan></text>
+    <rect
+       style="opacity:1;fill:#ededed;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect8340"
+       width="160"
+       height="80"
+       x="560"
+       y="72.362183" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+       x="633.42999"
+       y="106.9657"
+       id="text8342"><tspan
+         sodipodi:role="line"
+         x="633.42999"
+         y="106.9657"
+         style="font-size:28px;text-align:center;text-anchor:middle"
+         id="tspan8344">Update</tspan><tspan
+         sodipodi:role="line"
+         x="633.42999"
+         y="141.9657"
+         style="font-size:28px;text-align:center;text-anchor:middle"
+         id="tspan8346">Viewer</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:7.65923738px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+       x="152.4171"
+       y="479.55511"
+       id="text8348"
+       transform="scale(1.1833814,0.8450361)"><tspan
+         sodipodi:role="line"
+         x="152.4171"
+         y="479.55511"
+         style="font-size:12.76539516px;text-align:center;text-anchor:middle"
+         id="tspan8350">STDIN</tspan><tspan
+         sodipodi:role="line"
+         x="152.4171"
+         y="495.51186"
+         style="font-size:12.76539516px;text-align:center;text-anchor:middle"
+         id="tspan2216">STDERR</tspan><tspan
+         sodipodi:role="line"
+         x="152.4171"
+         y="511.4686"
+         style="font-size:12.76539516px;text-align:center;text-anchor:middle"
+         id="tspan2218">STDOUT</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Send);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 140,312.36218 L 140,452.36218"
+       id="path8352"
+       inkscape:connector-type="polyline"
+       inkscape:connection-start="#rect5369"
+       inkscape:connection-end="#rect6378" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Send);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 592.5,152.36218 L 497.5,232.36218"
+       id="path8356"
+       inkscape:connector-type="polyline"
+       inkscape:connection-start="#rect8340"
+       inkscape:connection-end="#rect1876" />
+    <rect
+       style="opacity:1;fill:#c8b7b7;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect2213"
+       width="125"
+       height="25"
+       x="-65"
+       y="262.36218" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+       x="-2.0898473"
+       y="282.36218"
+       id="text2215"><tspan
+         sodipodi:role="line"
+         x="-2.0898473"
+         y="282.36218"
+         style="font-size:20px;text-align:center;text-anchor:middle"
+         id="tspan2219">Thread #1</tspan></text>
+    <rect
+       style="opacity:1;fill:#916f6f;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect2223"
+       width="125"
+       height="25.101501"
+       x="-65"
+       y="287.26068" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+       x="-2.0898473"
+       y="307.36218"
+       id="text2225"><tspan
+         sodipodi:role="line"
+         x="-2.0898473"
+         y="307.36218"
+         style="font-size:20px;text-align:center;text-anchor:middle"
+         id="tspan2227">Thread #2</tspan></text>
+    <rect
+       style="opacity:1;fill:#ff9955;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect2220"
+       width="135"
+       height="80"
+       x="465"
+       y="452.36218" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+       x="527.6875"
+       y="483.63562"
+       id="text2222"><tspan
+         sodipodi:role="line"
+         x="527.6875"
+         y="483.63562"
+         style="font-size:28px;text-align:center;text-anchor:middle"
+         id="tspan2224">Runner</tspan><tspan
+         sodipodi:role="line"
+         x="527.6875"
+         y="518.63562"
+         style="font-size:28px;text-align:center;text-anchor:middle"
+         id="tspan2228">Task</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Send);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 507,432.36218 L 520.5,452.36218"
+       id="path2230"
+       inkscape:connector-type="polyline"
+       sodipodi:nodetypes="cc" />
+    <rect
+       style="opacity:1;fill:#87de87;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect2232"
+       width="200"
+       height="80"
+       x="-100"
+       y="342.36218" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+       x="4.5527229"
+       y="376.9657"
+       id="text2234"><tspan
+         sodipodi:role="line"
+         x="4.5527229"
+         y="376.9657"
+         style="font-size:28px;text-align:center;text-anchor:middle"
+         id="tspan2239">DBUS</tspan><tspan
+         sodipodi:role="line"
+         x="4.5527229"
+         y="411.9657"
+         style="font-size:28px;text-align:center;text-anchor:middle"
+         id="tspan2245">Service</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Send);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
+       d="M 89.090907,312.36218 L 50.90909,342.36218"
+       id="path2241"
+       inkscape:connector-type="polyline"
+       inkscape:connection-end="#rect2232"
+       inkscape:connection-start="#rect5369" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Send);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;marker-start:url(#Arrow1Sstart)"
+       d="M 326.13636,452.36218 L 181.36363,312.36218"
+       id="path2247"
+       inkscape:connector-type="polyline"
+       inkscape:connection-end="#rect5369"
+       inkscape:connection-start="#rect5383" />
+  </g>
+</svg>
diff --git a/docs/api/spec/pk-transactions-failure.png b/docs/api/spec/pk-transactions-failure.png
new file mode 100644
index 0000000..a038ea3
Binary files /dev/null and b/docs/api/spec/pk-transactions-failure.png differ
diff --git a/docs/api/spec/pk-transactions-sig-install.png b/docs/api/spec/pk-transactions-sig-install.png
new file mode 100644
index 0000000..27949fc
Binary files /dev/null and b/docs/api/spec/pk-transactions-sig-install.png differ
diff --git a/docs/api/spec/pk-transactions-success.png b/docs/api/spec/pk-transactions-success.png
new file mode 100644
index 0000000..b299bfb
Binary files /dev/null and b/docs/api/spec/pk-transactions-success.png differ
diff --git a/docs/api/spec/pk-transactions-trusted.png b/docs/api/spec/pk-transactions-trusted.png
new file mode 100644
index 0000000..4085e8a
Binary files /dev/null and b/docs/api/spec/pk-transactions-trusted.png differ
diff --git a/docs/api/spec/pk-transactions.svg b/docs/api/spec/pk-transactions.svg
new file mode 100644
index 0000000..954e540
--- /dev/null
+++ b/docs/api/spec/pk-transactions.svg
@@ -0,0 +1,1275 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="744.09448819"
+   height="1052.3622047"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.46"
+   sodipodi:docname="pk-transactions.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow2Mstart"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow2Mstart"
+       style="overflow:visible">
+      <path
+         id="path3246"
+         style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         transform="scale(0.6) translate(0,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow2Lend"
+       style="overflow:visible;">
+      <path
+         id="path3243"
+         style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         transform="scale(1.1) rotate(180) translate(1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lstart"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow2Lstart"
+       style="overflow:visible">
+      <path
+         id="path3240"
+         style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         transform="scale(1.1) translate(1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lstart"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Lstart"
+       style="overflow:visible">
+      <path
+         id="path3222"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         transform="scale(0.8) translate(12.5,0)" />
+    </marker>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective10" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     gridtolerance="10000"
+     guidetolerance="10"
+     objecttolerance="10"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.7"
+     inkscape:cx="277.52317"
+     inkscape:cy="649.44446"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     borderlayer="true"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="1280"
+     inkscape:window-height="951"
+     inkscape:window-x="0"
+     inkscape:window-y="25">
+    <inkscape:grid
+       type="xygrid"
+       id="grid2403"
+       visible="true"
+       enabled="true"
+       color="#0000ff"
+       opacity="0.03137255"
+       empcolor="#0000ff"
+       empopacity="0.05882353" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <rect
+       style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.45442721;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect6509"
+       width="475.04556"
+       height="189.96553"
+       x="30.451931"
+       y="862.33252"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-failure.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <rect
+       style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect6507"
+       width="475"
+       height="230"
+       x="30.474718"
+       y="622.35529"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-success.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <rect
+       style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect6505"
+       width="475"
+       height="335"
+       x="30.597656"
+       y="277.36218"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <rect
+       style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.50000000000000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect6503"
+       width="475"
+       height="255"
+       x="30"
+       y="12.362183"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <rect
+       style="opacity:0.76146784999999984;fill:#8d5fd3;fill-opacity:1"
+       id="rect6269"
+       width="35"
+       height="105"
+       x="465"
+       y="37.362183"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <rect
+       style="opacity:0.76146784999999984;fill:#ff8080;fill-opacity:1"
+       id="rect2405"
+       width="35"
+       height="245"
+       x="250"
+       y="17.362183"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <rect
+       style="opacity:0.76146784999999984;fill:#5fd38d;fill-opacity:1"
+       id="rect2407"
+       width="35"
+       height="245"
+       x="35"
+       y="17.362183"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <rect
+       style="opacity:0.76146784999999984;fill:#8d5fd3;fill-opacity:1"
+       id="rect2411"
+       width="35"
+       height="110"
+       x="465"
+       y="152.36218"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-128.495"
+       y="60"
+       id="text2413"
+       transform="matrix(0,-1,1,0,0,0)"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180"><tspan
+         sodipodi:role="line"
+         id="tspan2415"
+         x="-128.495"
+         y="60"
+         style="font-size:20px;text-align:center;text-anchor:middle">Manager</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-88.182495"
+       y="490"
+       id="text2417"
+       transform="matrix(0,-1,1,0,0,0)"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180"><tspan
+         sodipodi:role="line"
+         id="tspan2419"
+         x="-88.182495"
+         y="490"
+         style="font-size:20px;text-align:center;text-anchor:middle">Tran #1</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-128.41687"
+       y="275"
+       id="text2421"
+       transform="matrix(0,-1,1,0,0,0)"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180"><tspan
+         sodipodi:role="line"
+         id="tspan2423"
+         x="-128.41687"
+         y="275"
+         style="font-size:20px;text-align:center;text-anchor:middle">Client</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 459.94306,52.36218 L 285,52.36218"
+       id="path6109"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75172305;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 75,32.36218 L 249.87185,32.36218"
+       id="path6113"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="164.33984"
+       y="27.362183"
+       id="text6115"
+       sodipodi:linespacing="125%"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180"><tspan
+         sodipodi:role="line"
+         id="tspan6117"
+         x="164.33984"
+         y="27.362183"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">GetTid()</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.39060569;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 244.97015,42.36906 L 119.58222,42.36906 L 109.94012,32.33406"
+       id="path6119"
+       sodipodi:nodetypes="ccc"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="370.33984"
+       y="47.362183"
+       id="text6121"
+       sodipodi:linespacing="125%"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180"><tspan
+         sodipodi:role="line"
+         id="tspan6123"
+         x="370.33984"
+         y="47.362183"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">InstallFile(trusted, f)</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 290.05694,92.36218 L 465,92.36218"
+       id="path6125"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="381.17969"
+       y="87.362183"
+       id="text6127"
+       sodipodi:linespacing="125%"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180"><tspan
+         sodipodi:role="line"
+         id="tspan6129"
+         x="381.17969"
+         y="87.362183"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">::ErrorCode(no-sig)</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 459.53741,172.36218 L 284.59435,172.36218"
+       id="path6131"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="362.90131"
+       y="167.36218"
+       id="text6133"
+       sodipodi:linespacing="125%"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180"><tspan
+         sodipodi:role="line"
+         id="tspan6135"
+         x="362.90131"
+         y="167.36218"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">InstallFile(untrusted, f)</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 289.53741,212.36218 L 464.48047,212.36218"
+       id="path6159"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="380.66016"
+       y="207.36218"
+       id="text6161"
+       sodipodi:linespacing="125%"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180"><tspan
+         sodipodi:role="line"
+         id="tspan6163"
+         x="380.66016"
+         y="207.36218"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">::StatusChanged(inst)</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 289.53741,252.36218 L 464.48047,252.36218"
+       id="path6165"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="380.66016"
+       y="247.36218"
+       id="text6167"
+       sodipodi:linespacing="125%"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180"><tspan
+         sodipodi:role="line"
+         id="tspan6169"
+         x="380.66016"
+         y="247.36218"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">::Finished(success)</tspan></text>
+    <rect
+       style="opacity:0.76146785;fill:#ff8080;fill-opacity:1"
+       id="rect6171"
+       width="35"
+       height="325"
+       x="250.65753"
+       y="282.36218"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <rect
+       style="opacity:0.76146785;fill:#5fd38d;fill-opacity:1"
+       id="rect6173"
+       width="35"
+       height="325"
+       x="35.657532"
+       y="282.36218"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-448.495"
+       y="60.597656"
+       id="text6177"
+       transform="matrix(0,-1,1,0,0,0)"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180"><tspan
+         sodipodi:role="line"
+         id="tspan6179"
+         x="-448.495"
+         y="60.597656"
+         style="font-size:20px;text-align:center;text-anchor:middle">Manager</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-423.41687"
+       y="275.59766"
+       id="text6185"
+       transform="matrix(0,-1,1,0,0,0)"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180"><tspan
+         sodipodi:role="line"
+         id="tspan6187"
+         x="-423.41687"
+         y="275.59766"
+         style="font-size:20px;text-align:center;text-anchor:middle">Client</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 460.6006,317.3903 L 285.65754,317.3903"
+       id="path6195"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75172305;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 75.657536,297.3903 L 250.52939,297.3903"
+       id="path6199"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="164.99738"
+       y="292.39032"
+       id="text6201"
+       sodipodi:linespacing="125%"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180"><tspan
+         sodipodi:role="line"
+         id="tspan6203"
+         x="164.99738"
+         y="292.39032"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">GetTid()</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.39060569;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 245.62769,307.39718 L 120.23976,307.39718 L 110.59766,297.36218"
+       id="path6205"
+       sodipodi:nodetypes="ccc"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="370.99738"
+       y="312.39032"
+       id="text6207"
+       sodipodi:linespacing="125%"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180"><tspan
+         sodipodi:role="line"
+         id="tspan6209"
+         x="370.99738"
+         y="312.39032"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">InstallPackage(p)</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 290.71448,357.3903 L 465.65754,357.3903"
+       id="path6211"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="381.83722"
+       y="352.39032"
+       id="text6213"
+       sodipodi:linespacing="125%"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180"><tspan
+         sodipodi:role="line"
+         id="tspan6215"
+         x="381.83722"
+         y="352.39032"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">::RepoSigRequired(key)</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 461.25227,437.36216 L 286.30921,437.36216"
+       id="path6217"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="364.61615"
+       y="432.36218"
+       id="text6219"
+       sodipodi:linespacing="125%"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180"><tspan
+         sodipodi:role="line"
+         id="tspan6221"
+         x="364.61615"
+         y="432.36218"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">InstallSignature(key)</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 290.6546,557.36218 L 465.59766,557.36218"
+       id="path6225"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="381.77734"
+       y="552.36218"
+       id="text6227"
+       sodipodi:linespacing="125%"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180"><tspan
+         sodipodi:role="line"
+         id="tspan6229"
+         x="381.77734"
+         y="552.36218"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">::StatusChanged(inst)</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 291.25227,477.36216 L 466.19533,477.36216"
+       id="path6231"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="382.375"
+       y="472.36218"
+       id="text6233"
+       sodipodi:linespacing="125%"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180"><tspan
+         sodipodi:role="line"
+         id="tspan6235"
+         x="382.375"
+         y="472.36218"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">::Finished(success)</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 290,132.36218 L 464.94306,132.36218"
+       id="path6239"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="381.12274"
+       y="127.36218"
+       id="text6241"
+       sodipodi:linespacing="125%"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180"><tspan
+         sodipodi:role="line"
+         id="tspan6243"
+         x="381.12274"
+         y="127.36218"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">::Finished(failure)</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 290.6546,397.36218 L 465.59766,397.36218"
+       id="path6247"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="381.77734"
+       y="392.36224"
+       id="text6249"
+       sodipodi:linespacing="125%"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180"><tspan
+         sodipodi:role="line"
+         id="tspan6251"
+         x="381.77734"
+         y="392.36224"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">::Finished(key-required)</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75172305;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 75,152.36218 L 249.87185,152.36218"
+       id="path6253"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="164.33984"
+       y="147.36218"
+       id="text6255"
+       sodipodi:linespacing="125%"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180"><tspan
+         sodipodi:role="line"
+         id="tspan6257"
+         x="164.33984"
+         y="147.36218"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">GetTid()</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.39060569;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 244.97015,162.36906 L 119.58222,162.36906 L 109.94012,152.33406"
+       id="path6259"
+       sodipodi:nodetypes="ccc"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-213.1825"
+       y="490"
+       id="text6265"
+       transform="matrix(0,-1,1,0,0,0)"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180"><tspan
+         sodipodi:role="line"
+         id="tspan6267"
+         x="-213.1825"
+         y="490"
+         style="font-size:20px;text-align:center;text-anchor:middle">Tran #2</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75172305;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 76.015436,417.3553 L 250.88729,417.3553"
+       id="path6271"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="165.35527"
+       y="412.35529"
+       id="text6273"
+       sodipodi:linespacing="125%"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180"><tspan
+         sodipodi:role="line"
+         id="tspan6275"
+         x="165.35527"
+         y="412.35529"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">GetTid()</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.39060569;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 245.98559,427.36218 L 120.59766,427.36218 L 110.95556,417.32718"
+       id="path6277"
+       sodipodi:nodetypes="ccc"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <rect
+       style="opacity:0.76146785;fill:#8d5fd3;fill-opacity:1"
+       id="rect6279"
+       width="35"
+       height="110"
+       x="465.59766"
+       y="302.36218"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <rect
+       style="opacity:0.76146785;fill:#8d5fd3;fill-opacity:1"
+       id="rect6281"
+       width="35"
+       height="70"
+       x="465.59766"
+       y="422.36218"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-363.1825"
+       y="490.59766"
+       id="text6283"
+       transform="matrix(0,-1,1,0,0,0)"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180"><tspan
+         sodipodi:role="line"
+         id="tspan6285"
+         x="-363.1825"
+         y="490.59766"
+         style="font-size:20px;text-align:center;text-anchor:middle">Tran #1</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-457.65515"
+       y="490.59766"
+       id="text6287"
+       transform="matrix(0,-1,1,0,0,0)"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180"><tspan
+         sodipodi:role="line"
+         id="tspan6289"
+         x="-457.65515"
+         y="490.59766"
+         style="font-size:20px;text-align:center;text-anchor:middle">#2</tspan></text>
+    <rect
+       style="opacity:0.76146785;fill:#8d5fd3;fill-opacity:1"
+       id="rect6291"
+       width="35"
+       height="100"
+       x="465.59766"
+       y="507.36218"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-558.1825"
+       y="490.59766"
+       id="text6293"
+       transform="matrix(0,-1,1,0,0,0)"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180"><tspan
+         sodipodi:role="line"
+         id="tspan6295"
+         x="-558.1825"
+         y="490.59766"
+         style="font-size:20px;text-align:center;text-anchor:middle">Tran #3</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75172305;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 76.015436,492.3553 L 250.88729,492.3553"
+       id="path6297"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="165.35529"
+       y="487.35535"
+       id="text6299"
+       sodipodi:linespacing="125%"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180"><tspan
+         sodipodi:role="line"
+         id="tspan6301"
+         x="165.35529"
+         y="487.35535"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">GetTid()</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.39060569;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 245.98559,502.36218 L 120.59766,502.36218 L 110.95556,492.32718"
+       id="path6303"
+       sodipodi:nodetypes="ccc"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 460.54072,517.36218 L 285.59766,517.36218"
+       id="path6305"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="370.9375"
+       y="512.36224"
+       id="text6307"
+       sodipodi:linespacing="125%"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180"><tspan
+         sodipodi:role="line"
+         id="tspan6309"
+         x="370.9375"
+         y="512.36224"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">InstallPackage(p)</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 290.6546,597.36218 L 465.59766,597.36218"
+       id="path6311"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="381.77734"
+       y="592.36218"
+       id="text6313"
+       sodipodi:linespacing="125%"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180"><tspan
+         sodipodi:role="line"
+         id="tspan6315"
+         x="381.77734"
+         y="592.36218"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">::Finished(success)</tspan></text>
+    <rect
+       style="opacity:0.76146785;fill:#ff8080;fill-opacity:1"
+       id="rect6317"
+       width="35"
+       height="219.96503"
+       x="250.24495"
+       y="627.39026"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-success.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <rect
+       style="opacity:0.76146785;fill:#5fd38d;fill-opacity:1"
+       id="rect6319"
+       width="35"
+       height="219.96503"
+       x="35.244976"
+       y="627.39026"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-success.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-738.41687"
+       y="275"
+       id="text6325"
+       transform="matrix(0,-1,1,0,0,0)"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-success.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180"><tspan
+         sodipodi:role="line"
+         id="tspan6327"
+         x="-738.41687"
+         y="275"
+         style="font-size:20px;text-align:center;text-anchor:middle">Client</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75172305;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 75.244969,647.39028 L 250.11682,647.39028"
+       id="path6329"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-success.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="167.53403"
+       y="642.39026"
+       id="text6331"
+       sodipodi:linespacing="125%"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-success.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180"><tspan
+         sodipodi:role="line"
+         id="tspan6333"
+         x="167.53403"
+         y="642.39026"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">GetActions()</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 460.18803,717.39028 L 285.24497,717.39028"
+       id="path6335"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-success.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.39060569;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 245.21512,657.39718 L 119.82719,657.39718 L 110.18509,647.36216"
+       id="path6337"
+       sodipodi:nodetypes="ccc"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-success.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75172305;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 75.244969,697.39028 L 250.11682,697.39028"
+       id="path6339"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-success.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="164.58481"
+       y="692.39032"
+       id="text6341"
+       sodipodi:linespacing="125%"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-success.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180"><tspan
+         sodipodi:role="line"
+         id="tspan6343"
+         x="164.58481"
+         y="692.39032"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">GetTid()</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.39060569;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 245.21512,707.39718 L 119.82719,707.39718 L 110.18509,697.36218"
+       id="path6345"
+       sodipodi:nodetypes="ccc"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-success.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="370.58481"
+       y="712.39032"
+       id="text6347"
+       sodipodi:linespacing="125%"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-success.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180"><tspan
+         sodipodi:role="line"
+         id="tspan6349"
+         x="370.58481"
+         y="712.39032"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">InstallPackage(p)</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 290.30191,757.3903 L 465.24497,757.3903"
+       id="path6351"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-success.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="381.42465"
+       y="752.39032"
+       id="text6353"
+       sodipodi:linespacing="125%"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-success.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180"><tspan
+         sodipodi:role="line"
+         id="tspan6355"
+         x="381.42465"
+         y="752.39032"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">::Progress(%)</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 290.53166,797.3553 L 465.47472,797.3553"
+       id="path6365"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-success.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="381.65442"
+       y="792.35529"
+       id="text6367"
+       sodipodi:linespacing="125%"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-success.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180"><tspan
+         sodipodi:role="line"
+         id="tspan6369"
+         x="381.65442"
+         y="792.35529"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">::StatusChanged(inst)</tspan></text>
+    <rect
+       style="opacity:0.76146785;fill:#8d5fd3;fill-opacity:1"
+       id="rect6391"
+       width="35"
+       height="144.99316"
+       x="465.18506"
+       y="702.36212"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-success.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-778.1825"
+       y="490"
+       id="text6395"
+       transform="matrix(0,-1,1,0,0,0)"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-success.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180"><tspan
+         sodipodi:role="line"
+         id="tspan6397"
+         x="-778.1825"
+         y="490"
+         style="font-size:20px;text-align:center;text-anchor:middle">Tran #1</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 290.53166,837.3553 L 465.47472,837.3553"
+       id="path6423"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-success.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="381.65442"
+       y="832.35529"
+       id="text6425"
+       sodipodi:linespacing="125%"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-success.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180"><tspan
+         sodipodi:role="line"
+         id="tspan6427"
+         x="381.65442"
+         y="832.35529"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">::Finished(success)</tspan></text>
+    <rect
+       style="opacity:0.76146785;fill:#ff8080;fill-opacity:1"
+       id="rect6429"
+       width="35"
+       height="180.00696"
+       x="250.41777"
+       y="867.35522"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-failure.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <rect
+       style="opacity:0.76146785;fill:#5fd38d;fill-opacity:1"
+       id="rect6431"
+       width="35"
+       height="180.00696"
+       x="35.417786"
+       y="867.35522"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-failure.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-953.41687"
+       y="275"
+       id="text6433"
+       transform="matrix(0,-1,1,0,0,0)"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-failure.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180"><tspan
+         sodipodi:role="line"
+         id="tspan6435"
+         x="-953.41687"
+         y="275"
+         style="font-size:20px;text-align:center;text-anchor:middle">Client</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75172305;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 75.417779,887.35528 L 250.28963,887.35528"
+       id="path6437"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-failure.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="167.70683"
+       y="882.35522"
+       id="text6439"
+       sodipodi:linespacing="125%"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-failure.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180"><tspan
+         sodipodi:role="line"
+         id="tspan6441"
+         x="167.70683"
+         y="882.35522"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">GetActions()</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 460.36084,957.3553 L 285.41778,957.3553"
+       id="path6443"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-failure.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.39060569;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 245.38793,897.36218 L 120,897.36218 L 110.3579,887.32718"
+       id="path6445"
+       sodipodi:nodetypes="ccc"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-failure.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75172305;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 75.417779,937.3553 L 250.28963,937.3553"
+       id="path6447"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-failure.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="164.75761"
+       y="932.35529"
+       id="text6449"
+       sodipodi:linespacing="125%"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-failure.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180"><tspan
+         sodipodi:role="line"
+         id="tspan6451"
+         x="164.75761"
+         y="932.35529"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">GetTid()</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.39060569;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 245.38793,947.3622 L 120,947.3622 L 110.3579,937.3272"
+       id="path6453"
+       sodipodi:nodetypes="ccc"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-failure.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="370.75763"
+       y="952.35529"
+       id="text6455"
+       sodipodi:linespacing="125%"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-failure.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180"><tspan
+         sodipodi:role="line"
+         id="tspan6457"
+         x="370.75763"
+         y="952.35529"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">InstallPackage(p)</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 290.47472,997.3553 L 465.41778,997.3553"
+       id="path6459"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-failure.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="381.59747"
+       y="992.35529"
+       id="text6461"
+       sodipodi:linespacing="125%"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-failure.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180"><tspan
+         sodipodi:role="line"
+         id="tspan6463"
+         x="381.59747"
+         y="992.35529"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">::ErrorCode(NoNetwork)</tspan></text>
+    <rect
+       style="opacity:0.76146785;fill:#8d5fd3;fill-opacity:1"
+       id="rect6473"
+       width="35"
+       height="105.03503"
+       x="465.35788"
+       y="942.32709"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-failure.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-993.18243"
+       y="490.38794"
+       id="text6475"
+       transform="matrix(0,-1,1,0,0,0)"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-failure.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180"><tspan
+         sodipodi:role="line"
+         id="tspan6477"
+         x="-993.18243"
+         y="490.38794"
+         style="font-size:20px;text-align:center;text-anchor:middle">Tran #1</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 290.44487,1037.3622 L 465.38793,1037.3622"
+       id="path6479"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-failure.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="381.56763"
+       y="1032.3621"
+       id="text6481"
+       sodipodi:linespacing="125%"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-failure.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180"><tspan
+         sodipodi:role="line"
+         id="tspan6483"
+         x="381.56763"
+         y="1032.3621"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">::Finished(failed)</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-738.4881"
+       y="60.47472"
+       id="text6485"
+       transform="matrix(0,-1,1,0,0,0)"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-success.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180"><tspan
+         sodipodi:role="line"
+         id="tspan6487"
+         x="-738.4881"
+         y="60.47472"
+         style="font-size:20px;text-align:center;text-anchor:middle">Manager</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-958.495"
+       y="60"
+       id="text6489"
+       transform="matrix(0,-1,1,0,0,0)"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-failure.png"
+       inkscape:export-xdpi="180"
+       inkscape:export-ydpi="180"><tspan
+         sodipodi:role="line"
+         id="tspan6491"
+         x="-958.495"
+         y="60"
+         style="font-size:20px;text-align:center;text-anchor:middle">Manager</tspan></text>
+  </g>
+</svg>
diff --git a/docs/html/upload.sh b/docs/html/upload.sh
index 09ad264..aae167b 100755
--- a/docs/html/upload.sh
+++ b/docs/html/upload.sh
@@ -14,8 +14,6 @@ LOCATION="/srv/www/html"
 scp img/*.png $USER@$SERVER:/$LOCATION/img/
 scp *.html $USER@$SERVER:/$LOCATION/
 scp *.css $USER@$SERVER:/$LOCATION/
-scp ../spec/pk-reference.html $USER@$SERVER:/$LOCATION/
-scp ../spec/pk-*.png $USER@$SERVER:/$LOCATION/
 scp ../api/html/*.html $USER@$SERVER:/$LOCATION/gtk-doc/
 scp ../api/html/*.png $USER@$SERVER:/$LOCATION/gtk-doc/
 scp ../api/html/*.css $USER@$SERVER:/$LOCATION/gtk-doc/
diff --git a/docs/spec/.gitignore b/docs/spec/.gitignore
deleted file mode 100644
index 3432c3f..0000000
--- a/docs/spec/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.html
-
diff --git a/docs/spec/Makefile.am b/docs/spec/Makefile.am
deleted file mode 100644
index 64d9f91..0000000
--- a/docs/spec/Makefile.am
+++ /dev/null
@@ -1,47 +0,0 @@
-IMAGE_FILES =				\
-	pk-structure.png		\
-	pk-structure.svg		\
-	pk-faq-error-code.png		\
-	pk-faq-status.png		\
-	pk-transactions.svg		\
-	pk-transactions-failure.png	\
-	pk-transactions-sig-install.png	\
-	pk-transactions-success.png	\
-	pk-transactions-trusted.png
-
-SPEC_XML_FILES =			\
-	pk-backend-compiled.xml		\
-	pk-backend-dbus.xml		\
-	pk-backend-spawn.xml		\
-	pk-developer-faq.xml		\
-	pk-concepts.xml			\
-	pk-introduction.xml		\
-	pk-reference.xml		\
-	pk-reference.xml		\
-	pk-introduction.xml
-
-SPEC_HTML_FILES =			\
-	pk-reference.html
-
-clean-local:
-	rm -f *~
-	rm -f *.html
-
-EXTRA_DIST = 				\
-	config.xsl			\
-	docbook.css			\
-	$(SPEC_XML_FILES)		\
-	$(IMAGE_FILES)
-
-if DOCBOOK_DOCS_ENABLED
-
-htmldocdir = $(docdir)
-htmldoc_DATA = pk-reference.html
-
-pk-reference.html : pk-introduction.xml
-	$(XMLTO) html-nochunks -m config.xsl pk-reference.xml
-
-EXTRA_DIST += $(SPEC_HTML_FILES)
-
-endif #DOCBOOK_DOCS_ENABLED
-
diff --git a/docs/spec/config.xsl b/docs/spec/config.xsl
deleted file mode 100644
index 1cb097e..0000000
--- a/docs/spec/config.xsl
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version='1.0'?>
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-                xmlns:fo="http://www.w3.org/1999/XSL/Format"
-                version="1.0">
-  <xsl:param name="html.stylesheet" select="'docbook.css'"/>
-  <xsl:param name="use.id.as.filename" select="1"/>
-  <xsl:param name="chunk.section.depth" select="0"/>
-  <xsl:output method="html" encoding="UTF-8" indent="no"/>
-  
-</xsl:stylesheet>
diff --git a/docs/spec/docbook.css b/docs/spec/docbook.css
deleted file mode 100644
index a29a79f..0000000
--- a/docs/spec/docbook.css
+++ /dev/null
@@ -1,50 +0,0 @@
-body {
-	font-family: luxi sans,sans-serif;
-}
-
-table {
-	border: 0px; 
-	width: 100%;
-}
-
-div.informaltable {
-	border: solid 1px; 
-	background: #eeeeff; 
-	width: 60%;
-}
-
-code.email {
-	color: #a00000;
-}
-
-th {
-	padding: 2px;
-	border: 0px;
-}
-
-hr {
-	border: 0;
-	width: 80%;
-	background-color: #a00000;
-	height: 1px;
-}
-
-td {
-	border: 0px;
-	padding: 5px;
-}
-
-tr {
-	border: 0px;
-	padding: 5px;
-}
-
-a {
-	color: #000000;
-	text-decoration: none;
-}
-
-a:hover {
-	color: #a00000;
-	text-decoration: none;
-}
diff --git a/docs/spec/pk-backend-compiled.xml b/docs/spec/pk-backend-compiled.xml
deleted file mode 100644
index b510686..0000000
--- a/docs/spec/pk-backend-compiled.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd">
-
-<chapter id="backend-compiled">
-  <title>Compiled Backends</title>
-  <para>
-    If you have a C or C++ binding for your package system then
-    you can use a compiled backend, which is more efficient than
-    using helpers as described below.
-    You can include the headers in the backend (with extra
-    libraries) and then just write the simple code to interface
-    with the methods of PackageKit.
-    A C example can be found in <literal>backends/box</literal> and a
-    C++ example in <literal>backends/apt</literal>.
-  </para>
-  <para>
-    You will have to use threading if your backend does not support async
-    operation as requests have to return immediately.
-    This is very important. Do any significant processing in a thread, and
-    certainly don't return package results without creating a thread.
-    By keeping the backends async we can make sure that there is no blocking
-    which means the command line and UI do not freeze.
-  </para>
-</chapter>
-
diff --git a/docs/spec/pk-backend-dbus.xml b/docs/spec/pk-backend-dbus.xml
deleted file mode 100644
index c5db0dc..0000000
--- a/docs/spec/pk-backend-dbus.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd">
-
-<chapter id="backend-dbus">
-  <title>DBUS Backends</title>
-  <para>
-    Backend helpers communicating over standard out and standard
-    error are easy to write, but can have some performance
-    problems.
-    For instance, if your packages system has to do a lot of work when it
-    starts up and shuts down, performance in the UI may suffer.
-    In these cases, you can use a persistant backend daemon that
-    communicates to the C backend over DBUS.
-  </para>
-  <para>
-    Your daemon will be started by DBUS, and should be responsible
-    for it's own thread management.
-    It should receive an <literal>Init()</literal> method call when the C
-    backend starts, and an <literal>Exit()</literal> method call before it
-    exits.
-    You should also consider adding a timeout value to your daemon so that
-    it will exit after a set time with no activity from the C backend.
-    That way the daemon will still exit even if the C backend crashes for
-    some reason.
-  </para>
-  <para>
-    Again, like the helper backends described above, a compiled
-    backend stub is needed. An example of a DBUS backend written
-    in python can be found in <literal>backends/yum2</literal>,
-    along with a compiled stub written in C.
-  </para>
-</chapter>
-
diff --git a/docs/spec/pk-backend-spawn.xml b/docs/spec/pk-backend-spawn.xml
deleted file mode 100644
index e2dd0b7..0000000
--- a/docs/spec/pk-backend-spawn.xml
+++ /dev/null
@@ -1,236 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd">
-
-<chapter id="backend-spawn">
-  <title>Spawned Backends</title>
-  <para>
-    If you do not have a C or C++ language binding, PackageKit executes
-    helper scripts written in pretty much any language.
-    It then watches the standard out and standard error and parses the
-    output into compiled backend commands.
-    This means a python library can be interfaced easily with a C backend.
-  </para>
-  <para>
-    Even when using helpers, a compiled backend stub is still used for
-    two reasons:
-  </para>
-  <itemizedlist>
-    <listitem>
-      <para>
-        It is still needed for the dlopen internally in PackageKit.
-      </para>
-    </listitem>
-    <listitem>
-      <para>
-        You can add cleverness in the C backend that you might not want to
-        do in the scripted backend, for example using a hashtable in C
-        rather than checking all the names in awk.
-      </para>
-    </listitem>
-  </itemizedlist>
-  <para>
-    Backends are typically open-programmable, which means we can define a
-    standard for what goes on stdin and stdout to try and maximise
-    the common code between the backends.
-    The following section will explain the convention used on
-    <literal>backends/conary</literal> and <literal>backends/yum</literal>.
-  </para>
-  <para>
-    If you are unable to write scripts that conform to these specifications
-    then just launch a PkSpawn object in the compiled helper with stdout
-    callbacks and then try to do screenscraping in the backend.
-    This screenscraping is least popular for obvious reasons.
-  </para>
-  <para>
-    Backends scripts are run with arguments and data is sent to standard out
-    and standard error asyncronously so that PackageKit can proxy this to DBUS.
-    A method has command line arguments seporated with tabs, and data is also
-    seporated with tabs.
-  </para>
-  <para>
-    It is important to flush the standard output after each output, else
-    Linux will helpfully buffer the output into more efficient size chunks.
-    If you do not flush, then there will be a long IPC delay.
-    Flushing can be achived in C using <literal>fflush</literal> or in python
-    using <literal>sys.stdout.flush()</literal>.
-  </para>
-
-  <sect1 id="backends-spawn-methods">
-    <title>Methods</title>
-    <para>
-      The following methods are mapped from the helper to comand line programs
-      in the spawn helper.
-    </para>
-    <informaltable>
-      <tgroup cols="2">
-        <thead>
-          <row>
-            <entry>Method</entry>
-            <entry>File</entry>
-          </row>
-        </thead>
-        <tbody>
-          <row>
-            <entry>Search Name</entry>
-            <entry><literal>search-name.*</literal></entry>
-          </row>
-          <row>
-            <entry>Search Group</entry>
-            <entry><literal>search-group.*</literal></entry>
-          </row>
-          <row>
-            <entry>Search Details</entry>
-            <entry><literal>search-details.*</literal></entry>
-          </row>
-          <row>
-            <entry>Search File</entry>
-            <entry><literal>search-file.*</literal></entry>
-          </row>
-          <row>
-            <entry>Install Package</entry>
-            <entry><literal>install.*</literal></entry>
-          </row>
-          <row>
-            <entry>Install File</entry>
-            <entry><literal>install-file.*</literal></entry>
-          </row>
-          <row>
-            <entry>Remove Package</entry>
-            <entry><literal>remove.*</literal></entry>
-          </row>
-          <row>
-            <entry>Get Depends</entry>
-            <entry><literal>get-depends.*</literal></entry>
-          </row>
-          <row>
-            <entry>Resolve</entry>
-            <entry><literal>resolve.*</literal></entry>
-          </row>
-          <row>
-            <entry>Get Requires</entry>
-            <entry><literal>get-requires.*</literal></entry>
-          </row>
-          <row>
-            <entry>Get Update Detail</entry>
-            <entry><literal>get-update-detail.*</literal></entry>
-          </row>
-          <row>
-            <entry>Get Details</entry>
-            <entry><literal>get-details.*</literal></entry>
-          </row>
-          <row>
-            <entry>Get Files</entry>
-            <entry><literal>get-files.*</literal></entry>
-          </row>
-          <row>
-            <entry>Update Package</entry>
-            <entry><literal>update.*</literal></entry>
-          </row>
-          <row>
-            <entry>Update System</entry>
-            <entry><literal>update-system.*</literal></entry>
-          </row>
-          <row>
-            <entry>Get Updates</entry>
-            <entry><literal>get-updates.*</literal></entry>
-          </row>
-          <row>
-            <entry>Refresh Cache</entry>
-            <entry><literal>refresh-cache.*</literal></entry>
-          </row>
-          <row>
-            <entry>Get Repo List</entry>
-            <entry><literal>get-repo-list.*</literal></entry>
-          </row>
-          <row>
-            <entry>Repo Enable</entry>
-            <entry><literal>repo-enable.*</literal></entry>
-          </row>
-          <row>
-            <entry>Repo Set Data</entry>
-            <entry><literal>repo-set-data.*</literal></entry>
-          </row>
-        </tbody>
-      </tgroup>
-    </informaltable>
-
-  </sect1>
-
-  <sect1 id="backends-spawn-common">
-    <title>Common function outputs</title>
-    <para>
-      The following commands echoed to standard error will
-      automatically make the backend-launcher do the correct action in the
-      compiled helper.
-    </para>
-    <informaltable>
-      <tgroup cols="2">
-        <thead>
-          <row>
-            <entry>Method</entry>
-            <entry>Data</entry>
-          </row>
-        </thead>
-        <tbody>
-          <row>
-            <entry>Percentage</entry>
-            <entry><literal>percentage[tab]value</literal></entry>
-          </row>
-          <row>
-            <entry>Subpercentage</entry>
-            <entry><literal>subpercentage[tab]value</literal></entry>
-          </row>
-          <row>
-            <entry>NoPercentageUpdates</entry>
-            <entry><literal>no-percentage-updates</literal></entry>
-          </row>
-          <row>
-            <entry>Error</entry>
-            <entry><literal>error[tab]enum[tab]description</literal></entry>
-          </row>
-          <row>
-            <entry>Status</entry>
-            <entry><literal>status[tab]state</literal></entry>
-          </row>
-          <row>
-            <entry>RequireRestart</entry>
-            <entry><literal>requirerestart[tab]type[tab]details</literal></entry>
-          </row>
-          <row>
-            <entry>AllowUpdate</entry>
-            <entry><literal>allow-cancel[tab]enabled</literal></entry>
-          </row>
-          <row>
-            <entry>Package</entry>
-            <entry><literal>package_id[tab]status[tab]summary</literal></entry>
-          </row>
-          <row>
-            <entry>Details</entry>
-            <entry><literal>details[tab]package_id[tab]group[tab]detail[tab]url[tab]size_in_bytes</literal></entry>
-          </row>
-          <row>
-            <entry>Files</entry>
-            <entry><literal>files[tab]package_id[tab]file_list</literal></entry>
-          </row>
-          <row>
-            <entry>UpdateDetail</entry>
-            <entry><literal>package_id[tab]updates[tab]obsoletes[tab]vendor_url[tab]bugzilla_url[tab]cve_url[tab]restart[tab]update_text</literal></entry>
-          </row>
-          <row>
-            <entry>ChangeTransactionData</entry>
-            <entry><literal>change-transaction-data[tab]data</literal></entry>
-          </row>
-          <row>
-            <entry>RepoSignatureRequired</entry>
-            <entry><literal>repository_name[tab]key_url[tab]key_userid[tab]key_id[tab]key_fingerprint[tab]key_timestamp[tab]type</literal></entry>
-          </row>
-          <row>
-            <entry>RepoDetail</entry>
-            <entry><literal>repo-detail[tab]repo_id[tab]description[tab]enabled</literal></entry>
-          </row>
-        </tbody>
-      </tgroup>
-    </informaltable>
-  </sect1>
-
-</chapter>
diff --git a/docs/spec/pk-concepts.xml b/docs/spec/pk-concepts.xml
deleted file mode 100644
index d43abb0..0000000
--- a/docs/spec/pk-concepts.xml
+++ /dev/null
@@ -1,752 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd">
-
-<chapter id="concepts">
-  <title>Important Concepts</title>
-  <para>
-    The following sections explain key concepts used internally in PackageKit.
-  </para>
-  <sect1 id="introduction-ideas-packageid">
-    <title>Package ID</title>
-    <para>
-      One important idea is the <literal>package_id</literal>.
-      This is the <literal>name;version;arch;data</literal> in
-      a single string and is meant to represent a single package.
-      This is important when multiple versions of a package are installed and
-      only the correct one is removed.
-    </para>
-    <para>
-      The <literal>package_id</literal> is parsed and checked carefully in
-      the helper code.
-      The package arch and data is optional, but 3 <literal>;</literal>'s must
-      be present.
-      For instance, <literal>gnome-keyring-manager;2.18.0;;</literal> is
-      valid but <literal>gnome-keyring-manager;2.18.0</literal> is not.
-      The data field can be used for the repository name or any other purpose.
-      It is designed to make the life of a backend writer a little bit easier.
-    </para>
-    <para>
-      The data field for an installed package must be
-      <literal>installed</literal> as this is used to identify which packages
-      are installable or installed in the client tools.
-    </para>
-    <para>
-      The data field for an non-installed local package must be
-      <literal>local</literal> as this signifies a repository name is not available
-      and that package resides locally on the client system.
-    </para>
-    <para>
-      For example:
-    </para>
-    <itemizedlist>
-      <listitem>
-        <para>
-          <literal>csup;20060318-5;x86_64;local</literal>: for locally available package file.
-        </para>
-      </listitem>
-      <listitem>
-        <para>
-          <literal>csup;20060318-5;x86_64;fedora-devel</literal>: for package that is not installed
-          and can be downladed from the Fedora development repostory.
-        </para>
-      </listitem>
-      <listitem>
-        <para>
-          <literal>csup;20060318-5;x86_64;installed</literal>: for locally installed package
-        </para>
-      </listitem>
-    </itemizedlist>
-    <para>
-      The backend must ensure that the package_id only matches on one
-      single package.
-      A single package_id must be enough to uniquely identify a single object
-      in any repository used on the system.
-    </para>
-  </sect1>
-
-  <sect1 id="introduction-ideas-filters">
-    <title>Filters</title>
-    <para>
-      Search filtering on the name is done in the backend for efficiency reasons.
-      This can be added into the compiled backend if this is not possible
-      in any new backend design.
-    </para>
-    <para>
-      Filter options are:
-    </para>
-    <informaltable>
-      <tgroup cols="2">
-        <thead>
-          <row>
-            <entry>Option</entry>
-            <entry>Description</entry>
-          </row>
-        </thead>
-        <tbody>
-          <row>
-            <entry><literal>installed</literal> or <literal>~installed</literal></entry>
-            <entry>If the package is installed on the system</entry>
-          </row>
-          <row>
-            <entry><literal>devel</literal> or <literal>~devel</literal></entry>
-            <entry>Development packages typically end -devel, -dgb and -static.</entry>
-          </row>
-          <row>
-            <entry><literal>gui</literal> or <literal>~gui</literal></entry>
-            <entry>GUI programs typically depend on gtk, libkde or libxfce.</entry>
-          </row>
-          <row>
-            <entry><literal>free</literal> or <literal>~free</literal></entry>
-            <entry>
-              Free software. The package contains only software and
-              other content that is available under a free license.
-              See http://fedoraproject.org/wiki/Licensing for a list
-              of licenses that are considered free. If a license
-              cannot be determined from the package metadata, or the
-              status of the license is not known, the package will
-              be marked as 'non-free'.
-            </entry>
-          </row>
-          <row>
-            <entry><literal>visible</literal> or <literal>~visible</literal></entry>
-            <entry>
-              Repositories may want to specify if a package should be visible
-              in an application chooser.
-            </entry>
-          </row>
-          <row>
-            <entry><literal>supported</literal> or <literal>~supported</literal></entry>
-            <entry>
-              If the package is supported or is a third party addon.
-            </entry>
-          </row>
-          <row>
-            <entry><literal>basename</literal> or <literal>~basename</literal></entry>
-            <entry>
-              The basename filter will only return results according to the
-              package basename.
-              This is useful if you are searching for pm-utils and you only
-              want to show the main pm-utils package, not any of the
-              <literal>-devel</literal> or <literal>-debuginfo</literal> or
-              <literal>-common</literal> suffixes in the UI.
-              The basename is normally the original name of the source package.
-            </entry>
-          </row>
-          <row>
-            <entry><literal>newest</literal> or <literal>~newest</literal></entry>
-            <entry>
-              The newest filter will only return the newest package available.
-              This is useful if you are searching for <literal>gimp</literal>
-              and only <literal>gimp-2.4.5-1.fc9.i386</literal> would be returned,
-              not <literal>gimp-2.4.5-1.fc9.i386</literal>,
-              <literal>gimp-2.4.4-1.fc9.i386</literal> and
-              <literal>gimp-2.4.3-1.fc9.i386</literal>.
-            </entry>
-          </row>
-          <row>
-            <entry><literal>arch</literal> or <literal>~arch</literal></entry>
-            <entry>
-              The arch filter will only return the packages that match the exact architecture
-              of the system, for instance only showing x86_64 packages on a AMD Turion 64.
-              This would mean that x86_64 packages could be filtered from non-native 32-bit
-              packages.
-              This allows the used to choose non-native packages if a multi-lib policy is allowed.
-            </entry>
-          </row>
-          <row>
-            <entry><literal>source</literal> or <literal>~source</literal></entry>
-            <entry>
-              The source filter will only return source packages.
-              These are typically useful when rebuilding other packages.
-            </entry>
-          </row>
-        </tbody>
-      </tgroup>
-    </informaltable>
-
-    <para>
-      So valid options would be:
-    </para>
-    <informaltable>
-      <tgroup cols="2">
-        <thead>
-          <row>
-            <entry>Option</entry>
-            <entry>Description</entry>
-          </row>
-        </thead>
-        <tbody>
-          <row>
-            <entry><literal>none</literal></entry>
-            <entry>All packages installed or available with no filtering</entry>
-          </row>
-          <row>
-            <entry><literal>devel;~installed</literal></entry>
-            <entry>All non-installed development packages</entry>
-          </row>
-          <row>
-            <entry><literal>installed;~devel</literal></entry>
-            <entry>All installed non-development packages</entry>
-          </row>
-          <row>
-            <entry><literal>gui;~installed;~devel</literal></entry>
-            <entry>All non-installed, non-devel gui programs</entry>
-          </row>
-        </tbody>
-      </tgroup>
-    </informaltable>
-
-  </sect1>
-
-  <sect1 id="introduction-errors">
-    <title>Error Enums</title>
-    <para>
-      If you have to handle an error, try to use <literal>internal-error</literal>
-      as little as possible.
-      Just ask on the mailing list, and we can add some more error enums to
-      cover the type of error in an abstract way as possible.
-    </para>
-    <para>
-      Every error should have an enumerated type
-      (e.g. <literal>out-of-memory</literal>) and also an error description.
-      The error description is not translated and not converted into the users
-      locale.
-      The error description should be descriptive, as it's for power users
-      and people trying to debug the problem.
-      For instance, "Out of memory" is not helpful as an error description
-      that is reported in a bugzilla, but "Could not create database index" is.
-      For the description use <literal>;</literal> to separate the lines if
-      required.
-    </para>
-    <para>
-      The following error enumerated types are available for use in all
-      backends:
-    </para>
-    <informaltable>
-      <tgroup cols="2">
-        <thead>
-          <row>
-            <entry>Error</entry>
-            <entry>Description</entry>
-          </row>
-        </thead>
-        <tbody>
-          <row>
-            <entry><literal>out-of-memory</literal></entry>
-            <entry>There is an out of memory condition</entry>
-          </row>
-          <row>
-            <entry><literal>no-network</literal></entry>
-            <entry>There is no network connection that can be used</entry>
-          </row>
-          <row>
-            <entry><literal>not-supported</literal></entry>
-            <entry>
-              Not supported by the backend.
-              NOTE: You shouldn't be setting non-NULL in the compiled
-              backend symbol table if you find yourself using this.
-            </entry>
-          </row>
-          <row>
-            <entry><literal>internal-error</literal></entry>
-            <entry>
-              There was an unspecified internal error.
-              NOTE: Please try and be more specific.
-              If you are using this then we should probably add a new type.
-            </entry>
-          </row>
-          <row>
-            <entry><literal>no-cache</literal></entry>
-            <entry>
-              The operation is trying to read from the cache, but the cache
-              is not present or invalid
-            </entry>
-          </row>
-          <row>
-            <entry><literal>gpg-failure</literal></entry>
-            <entry>There was a GPG failure in the transaction</entry>
-          </row>
-          <row>
-            <entry><literal>package-id-invalid</literal></entry>
-            <entry>The package ID is not valid for this transaction</entry>
-          </row>
-          <row>
-            <entry><literal>package-not-installed</literal></entry>
-            <entry>
-              The package that is trying to be removed or updated is not
-              installed
-            </entry>
-          </row>
-          <row>
-            <entry><literal>package-not-found</literal></entry>
-            <entry>
-              The package that is trying to be removed or updated is not
-              installed
-            </entry>
-          </row>
-          <row>
-            <entry><literal>package-already-installed</literal></entry>
-            <entry>
-              The package that is trying to be installed or updated is already
-              installed
-            </entry>
-          </row>
-          <row>
-            <entry><literal>package-download-failed</literal></entry>
-            <entry>A package failed to download correctly</entry>
-          </row>
-          <row>
-            <entry><literal>invalid-package-file</literal></entry>
-            <entry>
-	      The file that is supposed to contain a package to
-              install is corrupt, or is not a valid package file
-	    </entry>
-          </row>
-          <row>
-            <entry><literal>package-install-blocked</literal></entry>
-            <entry>
-	      The backend's configuration or policy prevents the
-              install or updating of a package
-	    </entry>
-          </row>
-          <row>
-            <entry><literal>dep-resolution-failed</literal></entry>
-            <entry>Dependency resolution failed</entry>
-          </row>
-          <row>
-            <entry><literal>filter-invalid</literal></entry>
-            <entry>
-              The filter was invalid.
-              NOTE: syntax checking is done in the backend loader, so you
-              should only use this if the filter is not supported by the
-              backend.
-            </entry>
-          </row>
-          <row>
-            <entry><literal>group-not-found</literal></entry>
-            <entry>
-	      The specified software group was not found.
-            </entry>
-          </row>
-          <row>
-            <entry><literal>create-thread-failed</literal></entry>
-            <entry>Failed to create a thread</entry>
-          </row>
-          <row>
-            <entry><literal>transaction-error</literal></entry>
-            <entry>
-              There was a generic transaction error, but please give more
-              details in the description
-            </entry>
-          </row>
-          <row>
-            <entry><literal>transaction-cancelled</literal></entry>
-            <entry>
-              The transaction was cancelled as the result of a call
-              to Cancel()
-            </entry>
-          </row>
-          <row>
-            <entry><literal>repo-not-found</literal></entry>
-            <entry>The repository name could not be found</entry>
-          </row>
-          <row>
-            <entry><literal>repo-configuration-error</literal></entry>
-            <entry>One of the enabled repositories has invalid configuration</entry>
-          </row>
-	  <row>
-	    <entry><literal>repo-not-available</literal></entry>
-	    <entry>
-	      There was a (possibly transient) problem connecting to a
-	      repository
-	    </entry>
-	  </row>
-          <row>
-            <entry><literal>cannot-remove-system-package</literal></entry>
-            <entry>
-              Could not remove a protected system package that is needed for
-              stable operation of the system
-            </entry>
-          </row>
-          <row>
-            <entry><literal>process-quit</literal></entry>
-            <entry>
-              The process was asked to quit, probably because it was cancelled
-            </entry>
-          </row>
-          <row>
-            <entry><literal>process-kill</literal></entry>
-            <entry>
-              The process was forcibly killed, probably because ignored the
-              quit request. This is probably due to it being cancelled
-            </entry>
-          </row>
-          <row>
-            <entry><literal>failed-config-parsing</literal></entry>
-            <entry>
-	      Configuration files could not be read or parsed.
-            </entry>
-          </row>
-          <row>
-            <entry><literal>cannot-cancel</literal></entry>
-            <entry>
-	      The Cancel() method was called, but it is too late to
-	      cancel the current transaction.
-            </entry>
-          </row>
-          <row>
-            <entry><literal>cannot-get-lock</literal></entry>
-            <entry>
-	      The backend could not acquire a lock on the underlying
-	      package management system.
-            </entry>
-          </row>
-          <row>
-            <entry><literal>no-packages-to-update</literal></entry>
-            <entry>
-	      UpdateSystem() was called, but there are no packages to update.
-            </entry>
-          </row>
-          <row>
-            <entry><literal>cannot-write-repo-config</literal></entry>
-            <entry>
-	      RepoEnable() or RepoSetData() was called, but the
-	      repository configuration file could not be written to.
-            </entry>
-          </row>
-          <row>
-            <entry><literal>local-install-failed</literal></entry>
-            <entry>
-	      A local file could not be installed.  The file might not
-	      be readable, or it might not contain a valid package.
-            </entry>
-          </row>
-          <row>
-            <entry><literal>bad-gpg-signature</literal></entry>
-            <entry>
-	      The package is signed with a GPG signature, but that
-	      signature is not valid in some way.
-            </entry>
-          </row>
-          <row>
-            <entry><literal>package-corrupt</literal></entry>
-            <entry>
-	      The downloaded package is corrupt.
-            </entry>
-          </row>
-
-        </tbody>
-      </tgroup>
-    </informaltable>
-  </sect1>
-
-  <sect1 id="introduction-group-type">
-    <title>Group type</title>
-    <para>
-      Groups are enumerated for localisation.
-      Backends should try to put packages in different groups if possible,
-      else just don't advertise SearchGroup and the options should not be
-      shown in the UI.
-    </para>
-    <para>
-      The following group enumerated types are available, but please check
-      <literal>libpackagekit/pk-enum.h</literal> for the latest list.
-    </para>
-    <informaltable>
-      <tgroup cols="2">
-        <thead>
-          <row>
-            <entry>Group</entry>
-            <entry>Description</entry>
-          </row>
-        </thead>
-        <tbody>
-          <row>
-            <entry><literal>accessibility</literal></entry>
-            <entry>Accessibility</entry>
-          </row>
-          <row>
-            <entry><literal>accessories</literal></entry>
-            <entry>Accessories</entry>
-          </row>
-          <row>
-            <entry><literal>education</literal></entry>
-            <entry>Education</entry>
-          </row>
-          <row>
-            <entry><literal>games</literal></entry>
-            <entry>Games</entry>
-          </row>
-          <row>
-            <entry><literal>graphics</literal></entry>
-            <entry>Graphics</entry>
-          </row>
-          <row>
-            <entry><literal>internet</literal></entry>
-            <entry>Internet</entry>
-          </row>
-          <row>
-            <entry><literal>office</literal></entry>
-            <entry>Office</entry>
-          </row>
-          <row>
-            <entry><literal>other</literal></entry>
-            <entry>Other</entry>
-          </row>
-          <row>
-            <entry><literal>programming</literal></entry>
-            <entry>Programming</entry>
-          </row>
-          <row>
-            <entry><literal>multimedia</literal></entry>
-            <entry>Multimedia</entry>
-          </row>
-          <row>
-            <entry><literal>system</literal></entry>
-            <entry>System</entry>
-          </row>
-        </tbody>
-      </tgroup>
-    </informaltable>
-  </sect1>
-
-  <sect1 id="introduction-cancellation">
-    <title>Cancellation</title>
-    <para>
-      If you have a multipart transaction that can be aborted in one phase but
-      not another then the AllowCancel signal can be sent.
-      This allows for example the yum download to be cancelled, but not the
-      install transaction.
-      By cancelling a job all subtransactions are killed.
-    </para>
-    <para>
-      By default actions cannot be cancelled unless enabled in the backend.
-      Use <literal>AllowCancel(true)</literal> to enable cancellation
-      and <literal>AllowCancel(false)</literal> to disable it.
-      This can be done for any job type.
-    </para>
-    <para>
-      For compiled backends that are threaded, the
-      <literal>cancel()</literal> method can be used to terminate
-      the thread.
-    </para>
-    <para>
-      For spawned backends, there are two staggered signals send to allow
-      locks to be released or for the backend to clean up after itself:
-    </para>
-    <itemizedlist>
-      <listitem>
-        <para>Send the process <literal>SIGQUIT</literal>.</para>
-      </listitem>
-      <listitem>
-        <para>Wait 500ms</para>
-      </listitem>
-      <listitem>
-        <para>
-          If the process has not already quit, send the process
-          <literal>SIGKILL</literal> to terminate it.
-        </para>
-      </listitem>
-    </itemizedlist>
-  </sect1>
-
-  <sect1 id="introduction-ideas-transactions">
-    <title>Transactions</title>
-    <para>
-      PackageKit does not ask the user questions when the transaction is running.
-      It also supports a fire-and-forget method invocation, which means that transactions will
-      have one calling method, and have many signals going back to the caller.
-    </para>
-    <para>
-      Each transaction is a new path on the <literal>org.freedesktop.PackageKit</literal>
-      service, and to create a path you have to call <literal>GetTid</literal> on the base
-      interface which creates the new DBUS path, and returns the new path for you to connect to.
-      In the libpackagekit binding, <literal>PkControl</literal> handles the base interface,
-      whilst <literal>PkClient</literal> handles all the transaction interface stuff.
-      The <literal>org.freedesktop.PackageKit.Transaction</literal> interface can be used
-      on the newly created path, but only used once.
-      New methods require a new transaction path (i.e. another call to <literal>GetTid</literal>)
-      which is synchronous and thus very fast.
-    </para>
-    <para>
-      A typical successful transaction can be seen below.
-    </para>
-    <mediaobject id="pk-transactions-success">
-      <imageobject>
-        <imagedata format="PNG" fileref="pk-transactions-success.png" align="center"/>
-      </imageobject>
-    </mediaobject>
-    <para>
-      A typical simple transaction failure case can be seen below.
-      The user is not given the change to requeue the transaction as it is a fatal error.
-    </para>
-    <mediaobject id="pk-transactions-failure">
-      <imageobject>
-        <imagedata format="PNG" fileref="pk-transactions-failure.png" align="center"/>
-      </imageobject>
-    </mediaobject>
-    <para>
-      In this non-trivial example, a local file install is being attempted.
-      First the <literal>InstallFile</literal> is called with the <literal>trusted</literal>
-      flag set.
-      This will fail if the package does not have a valid GPG key, and ordinarily the transaction
-      would fail. What the client can do, e.g. using <literal>gnome-packagekit</literal>, is
-      to re-request the <literal>InstallFile</literal> with <literal>non-trusted</literal>.
-      This will use a different PolicyKit authentication, and allow the file to succeed.
-    </para>
-    <para>
-      So why do we bother calling <literal>trusted</literal> in the first place?
-      Well, the trusted PolicyKit role can be saved in the gnome-keyring, or could be
-      set to the users password as the GPG key is already trusted by the user.
-      The <literal>non-trusted</literal> action would likely ask for the administrator password,
-      and not allowed to be saved. This gives the user the benifit of installing trusted local
-      files without a password (common case) but requiring something stronger for untrusted or
-      unsigned files.
-    </para>
-    <mediaobject id="pk-transactions-trusted">
-      <imageobject>
-        <imagedata format="PNG" fileref="pk-transactions-trusted.png" align="center"/>
-      </imageobject>
-    </mediaobject>
-    <para>
-      If the package is signed, and a valid GPG signature is available, then we need to ask the
-      user to import the key, and re-run the transaction.
-      This is done as three transactions, as other transactions may be queued and have a higher
-      priority, and to make sure that the transaction object is not reused.
-    </para>
-    <mediaobject id="pk-transactions-sig-install">
-      <imageobject>
-        <imagedata format="PNG" fileref="pk-transactions-sig-install.png" align="center"/>
-      </imageobject>
-    </mediaobject>
-    <para>
-      If the package is signed, and a valid GPG signature is available, then we need to ask the
-      user to import the key, and re-run the transaction.
-      This is done as three transactions, as other transactions may be queued and have a higher
-      priority, and to make sure that the transaction object is not reused.
-    </para>
-  </sect1>
-
-  <sect1 id="introduction-ideas-transactionid">
-    <title>Transaction IDs</title>
-    <para>
-      A <literal>transaction_id</literal> is a unique identifier that
-      identifies the present or past transaction.
-      A transaction is made up of one or more sub-transactions.
-      A transaction has one <literal>role</literal> for the entire lifetime,
-      but the transaction can different values of <literal>status</literal>
-      as the transaction is processed.
-    </para>
-    <para>
-      For example, if the user "Installed OpenOffice" and the backend has to:
-    </para>
-    <itemizedlist>
-      <listitem>
-        <para>
-          update libxml2 as a dependency
-        </para>
-      </listitem>
-      <listitem>
-        <para>
-          install java as dependency
-        </para>
-      </listitem>
-      <listitem>
-        <para>
-          install openoffice-bin
-        </para>
-      </listitem>
-      <listitem>
-        <para>
-          install openoffice-clipart
-        </para>
-      </listitem>
-    </itemizedlist>
-    <para>
-      This is one single transaction with the role <literal>install</literal>,
-      with 4 different sub-transactions.
-      This allows the user to rollback transactions with selected backends,
-      rather than select sub-transactions which may need complex conflict
-      resolution.
-    </para>
-    <para>
-      The <literal>transaction_id</literal> must be of the format
-      <literal>/job_identifier_data</literal> where the daemon controls
-      all parameters.
-      <literal>job</literal> is a monotonically updating number and is
-      retained over reboots.
-      <literal>identifier</literal> is random data used by the daemon to
-      ensure jobs started in parallel cannot race, and also to make a
-      malicious client program harder to write.
-      <literal>data</literal> can be used for ref-counting in the backend or
-      for any other purpose.
-      It is designed to make the life of a backend writer a little bit easier.
-      An example <literal>transaction_id</literal> would be
-      <literal>/45_dafeca_checkpoint32</literal>
-    </para>
-  </sect1>
-
-  <sect1 id="introduction-ideas-status">
-    <title>Status Values</title>
-    <para>
-      A transaction will have different status values as it it queued, prepared
-      and executed.
-      The <literal>::StatusChanged</literal> signal from PkClient allow you
-      to design user interfaces that tell the user what is happening with the
-      transaction.
-    </para>
-    <para>
-      A typical transaction will have the following states:
-    </para>
-    <itemizedlist>
-      <listitem>
-        <para>
-          Queued in the active queue (<literal>PK_STATUS_ENUM_WAIT</literal>)
-        </para>
-      </listitem>
-      <listitem>
-        <para>
-          Transaction started, and is being prepared (<literal>PK_STATUS_ENUM_SETUP</literal>)
-        </para>
-      </listitem>
-      <listitem>
-        <para>
-          The transaction is running (<literal>PK_STATUS_ENUM_RUNNING</literal>)
-        </para>
-      </listitem>
-      <listitem>
-        <para>
-          (optional) Data is downloading (<literal>PK_STATUS_ENUM_DOWNLOADING</literal>)
-        </para>
-      </listitem>
-      <listitem>
-        <para>
-          (optional) Data is installing (<literal>PK_STATUS_ENUM_INSTALLING</literal>)
-        </para>
-      </listitem>
-      <listitem>
-        <para>
-          The transaction is finished (<literal>PK_STATUS_ENUM_FINISHED</literal>)
-        </para>
-      </listitem>
-    </itemizedlist>
-    <para>
-      If the transaction is waiting for other jobs to finish (in the active queue)
-      then the status will be stuck at <literal>PK_STATUS_ENUM_WAIT</literal>
-      and the UI should show a message to this effect.
-    </para>
-    <para>
-      If the transaction is waiting for a package lock (when a legacy tool like
-      <literal>pirut</literal> is loaded and has the <literal>yum</literal> lock)
-      then the transaction will be stuck at <literal>PK_STATUS_ENUM_SETUP</literal>.
-    </para>
-    <para>
-      As a backend writer, you do not have to set <literal>PK_STATUS_ENUM_RUNNING</literal>
-      manually, as this will be set for you if you set any other value such as
-      <literal>PK_STATUS_ENUM_DOWNLOADING</literal> or <literal>PK_STATUS_ENUM_INFO</literal>.
-      However, you will need to avoid setting any status values until a package
-      lock is available and the transaction has started.
-    </para>
-  </sect1>
-</chapter>
-
diff --git a/docs/spec/pk-developer-faq.xml b/docs/spec/pk-developer-faq.xml
deleted file mode 100644
index eba28eb..0000000
--- a/docs/spec/pk-developer-faq.xml
+++ /dev/null
@@ -1,70 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd">
-
-<chapter id="developer-faq">
-  <title>Developer FAQ</title>
-  <para>
-    The following sections explain frequently asked questions from people creating thier own
-    backend.
-    This list is not exhaustive, but please ask before adding to it.
-  </para>
-
-  <sect1 id="developer-faq-status-signals">
-    <title>Backends should send status signals...</title>
-    <para>
-      If your backend does not set status signals you will get the following dialog:
-    </para>
-    <mediaobject id="pk-faq-status">
-      <imageobject>
-        <imagedata format="PNG" fileref="pk-faq-status.png" align="center"/>
-      </imageobject>
-    </mediaobject>
-    <para>
-      For every transaction, you need to tell the datemon what the backend is doing.
-      You need to add to your backend:
-    </para>
-    <itemizedlist>
-      <listitem>
-        <para>
-          For python: <literal>self.status(STATUS_QUERY)</literal>
-        </para>
-      </listitem>
-      <listitem>
-        <para>
-          For compiled C/C++: <literal>pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);</literal>
-        </para>
-      </listitem>
-    </itemizedlist>
-    <para>
-      You can send as many status calls as you need as the transaction progresses.
-      The more calls you send, the more the UI will reflect what is being done, for instance,
-      showing a downloading icon when <literal>PK_STATUS_ENUM_DOWNLOAD</literal> is used.
-    </para>
-  </sect1>
-
-  <sect1 id="developer-faq-error-code-finished">
-    <title>Finished() after ErrorCode()...</title>
-    <para>
-      If your backend does not send <literal>Finished()</literal> after <literal>ErrorCode()</literal>
-      then the following dialog will be shown.
-    </para>
-    <mediaobject id="pk-faq-error-code">
-      <imageobject>
-        <imagedata format="PNG" fileref="pk-faq-error-code.png" align="center"/>
-      </imageobject>
-    </mediaobject>
-    <para>
-      The daemon recovers automatically, so this warning is not fatal, but the automatic recovery
-      is not cost free.
-      Every time the daemon cleans up a transaction like this, an additional 500ms is added to the
-      transaction duration (to allow slow backends to clean up after themselves) and so the
-      next transaction is delayed from starting.
-    </para>
-    <para>
-      You need to ensure that <literal>Finished()</literal> follows <literal>ErrorCode()</literal>
-      to remove this warning.
-    </para>
-  </sect1>
-
-</chapter>
-
diff --git a/docs/spec/pk-faq-error-code.png b/docs/spec/pk-faq-error-code.png
deleted file mode 100644
index 2cccae1..0000000
Binary files a/docs/spec/pk-faq-error-code.png and /dev/null differ
diff --git a/docs/spec/pk-faq-status.png b/docs/spec/pk-faq-status.png
deleted file mode 100644
index 7c49b9c..0000000
Binary files a/docs/spec/pk-faq-status.png and /dev/null differ
diff --git a/docs/spec/pk-introduction.xml b/docs/spec/pk-introduction.xml
deleted file mode 100644
index affb2ae..0000000
--- a/docs/spec/pk-introduction.xml
+++ /dev/null
@@ -1,100 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd">
-
-<chapter id="introduction">
-  <title>PackageKit Introduction</title>
-
-  <sect1 id="introduction-description">
-    <title>Overall Description</title>
-
-    <para>
-      PackageKit is a small open source system that abstracts out common package
-      management tasks such as:
-    </para>
-    <itemizedlist>
-      <listitem>
-        <para>
-          Checking for updates and installing them in the background.
-        </para>
-      </listitem>
-      <listitem>
-        <para>
-          Automatically installing new or add-on software.
-        </para>
-      </listitem>
-    </itemizedlist>
-
-    <para>
-      PackageKit has a modular design with an asynchronous API for client programs,
-      a flexible queuing module, and run-time selectable backends.
-    </para>
-
-    <mediaobject id="pk-structure">
-      <imageobject>
-        <imagedata format="PNG" fileref="pk-structure.png" align="center"/>
-      </imageobject>
-    </mediaobject>
-  </sect1>
-
-  <sect1 id="introduction-backends">
-    <title>Backends</title>
-    <para>
-      A backend is just a compiled <literal>.so</literal> object that is
-      loaded at run-time and provides an interface to the underlying package
-      commands.
-      A backend converts an asynchronous request into either a new thread
-      in the same process, executes external "glue" files that
-      can be written in any language, or uses DBUS to signal a
-      daemon process to handle the request.
-    </para>
-    <para>
-      Backends do not have to support all of the commands supported
-      by PackageKit. Each backend advertises the commands and
-      options it supports, and the frontend will only show UI
-      elements for those commands.
-      Please see the <literal>html/pk-faq.html</literal> file for the current
-      status of the existing backends.
-      Backed maintainers, please keep this file updated.
-    </para>
-  </sect1>
-
-  <sect1 id="config-main">
-    <title>Daemon Config Options</title>
-    <para>
-      The config file <literal>/etc/PackageKit/PackageKit.conf</literal> allows to the
-      administrator to change system daemon options.
-      In normal use this file does not have to be changed, but it may be
-      useful to people debugging the daemon or developing backends.
-    </para>
-    <para>
-      The options are:
-    </para>
-    <sect2 id="config-main-logging">
-      <title>TransactionLogging</title>
-      <para>
-        This logs all transactions to <literal>/var/log/PackageKit</literal> so old
-        daemon debugging output can be observed.
-      </para>
-    </sect2>
-    <sect2 id="config-main-timeout">
-      <title>ShutdownTimeout</title>
-      <para>
-        This is the time that the daemon waits when idle before shutting down.
-        A smaller number will result in slower response times when running
-        many transactions in a small amount of time.
-        A longer timeout will lock the underlying packaging backend for longer,
-        although the daemon will start and stop less often.
-      </para>
-    </sect2>
-    <sect2 id="config-main-default">
-      <title>DefaultBackend</title>
-      <para>
-        The default backend that the daemon should use.
-        The default is set at compile time to the
-        <literal>--default-backend=</literal> configure setting.
-      </para>
-    </sect2>
-  </sect1>
-
-</chapter>
-
diff --git a/docs/spec/pk-reference.xml b/docs/spec/pk-reference.xml
deleted file mode 100644
index 25245e4..0000000
--- a/docs/spec/pk-reference.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd">
-
-<book id="index">
-  <bookinfo>
-    <title>PackageKit Documentation</title>
-    <releaseinfo>Version 1.00</releaseinfo>
-    <abstract>
-      <title>Executive Summary</title>
-      <para>
-        PackageKit is a D-Bus abstraction layer that allows the session user
-        to manage packages in a secure way using a cross-distro,
-        cross-architecture API.
-        PackageKit is built using a lightweight backend architecture.
-        PackageKit is product and vendor neutral and is currently being
-        developed by a small team of developers.
-      </para>
-    </abstract>
-    <date>September 8th, 2007</date>
-    <authorgroup>
-      <author>
-        <firstname>Richard</firstname>
-        <surname>Hughes</surname>
-        <affiliation>
-          <address>
-            <email>richard at hughsie.com</email>
-          </address>
-        </affiliation>
-      </author>
-    </authorgroup>
-  </bookinfo>
-  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="pk-introduction.xml" />
-  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="pk-concepts.xml" />
-  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="pk-backend-compiled.xml" />
-  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="pk-backend-spawn.xml" />
-  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="pk-backend-dbus.xml" />
-  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="pk-developer-faq.xml" />
-
-</book>
-
diff --git a/docs/spec/pk-structure.png b/docs/spec/pk-structure.png
deleted file mode 100644
index 0d8a169..0000000
Binary files a/docs/spec/pk-structure.png and /dev/null differ
diff --git a/docs/spec/pk-structure.svg b/docs/spec/pk-structure.svg
deleted file mode 100644
index afbee9e..0000000
--- a/docs/spec/pk-structure.svg
+++ /dev/null
@@ -1,502 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://web.resource.org/cc/"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="744.09448819"
-   height="1052.3622047"
-   id="svg2"
-   sodipodi:version="0.32"
-   inkscape:version="0.45.1"
-   sodipodi:docbase="/home/hughsie/Code/PackageKit/docs/spec"
-   sodipodi:docname="pk-structure.svg"
-   inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-structure.png"
-   inkscape:export-xdpi="51.209103"
-   inkscape:export-ydpi="51.209103"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape">
-  <defs
-     id="defs4">
-    <marker
-       inkscape:stockid="Arrow1Send"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow1Send"
-       style="overflow:visible;">
-      <path
-         id="path4218"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
-         transform="scale(0.2) rotate(180) translate(6,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow1Mend"
-       style="overflow:visible;">
-      <path
-         id="path4212"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
-         transform="scale(0.4) rotate(180) translate(10,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Sstart"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow1Sstart"
-       style="overflow:visible">
-      <path
-         id="path4215"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
-         transform="scale(0.2) translate(6,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow1Mstart"
-       style="overflow:visible">
-      <path
-         id="path4888"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
-         transform="scale(0.4) translate(10,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Lstart"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow1Lstart"
-       style="overflow:visible">
-      <path
-         id="path4894"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
-         transform="scale(0.8) translate(12.5,0)" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     gridtolerance="10000"
-     guidetolerance="10"
-     objecttolerance="10"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="0.49497475"
-     inkscape:cx="195.83799"
-     inkscape:cy="657.01225"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:grid-points="true"
-     inkscape:object-nodes="true"
-     inkscape:object-points="true"
-     inkscape:object-bbox="true"
-     inkscape:window-width="1270"
-     inkscape:window-height="721"
-     inkscape:window-x="0"
-     inkscape:window-y="24"
-     showguides="true"
-     inkscape:guide-bbox="true" />
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1">
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.79076731;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.79076725, 21.48920706;stroke-dashoffset:0;stroke-opacity:1"
-       d="M 157.90632,193.25757 L 719.10462,193.25757 L 719.10462,193.25757"
-       id="path2839" />
-    <rect
-       style="opacity:1;fill:#ededed;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect1882"
-       width="160"
-       height="80"
-       x="360"
-       y="72.362183" />
-    <text
-       xml:space="preserve"
-       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
-       x="436.28711"
-       y="106.9657"
-       id="text1942"><tspan
-         sodipodi:role="line"
-         x="436.28711"
-         y="106.9657"
-         style="font-size:28px;text-align:center;text-anchor:middle"
-         id="tspan3730">Update</tspan><tspan
-         sodipodi:role="line"
-         x="436.28711"
-         y="141.9657"
-         style="font-size:28px;text-align:center;text-anchor:middle"
-         id="tspan2226">Icon</tspan></text>
-    <rect
-       style="opacity:1;fill:#729fcf;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect1876"
-       width="340"
-       height="80"
-       x="280"
-       y="232.36218" />
-    <text
-       xml:space="preserve"
-       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
-       x="336.07422"
-       y="284.04187"
-       id="text1946"><tspan
-         sodipodi:role="line"
-         id="tspan1948"
-         x="336.07422"
-         y="284.04187"
-         style="font-size:40px">packagekitd</tspan></text>
-    <rect
-       style="opacity:1;fill:#ad7fa8;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect1884"
-       width="200"
-       height="80"
-       x="340"
-       y="352.36218" />
-    <text
-       xml:space="preserve"
-       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
-       x="447.54688"
-       y="383.79077"
-       id="text1918"><tspan
-         sodipodi:role="line"
-         x="447.54688"
-         y="383.79077"
-         style="font-size:28px;text-align:center;text-anchor:middle"
-         id="tspan3732">Active</tspan><tspan
-         sodipodi:role="line"
-         x="447.54688"
-         y="418.79077"
-         style="font-size:28px;text-align:center;text-anchor:middle"
-         id="tspan3227">Queue</tspan></text>
-    <rect
-       style="opacity:1;fill:#ededed;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect2230"
-       width="160"
-       height="80"
-       x="160"
-       y="72.362183" />
-    <text
-       xml:space="preserve"
-       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
-       x="236.28711"
-       y="106.9657"
-       id="text2232"><tspan
-         sodipodi:role="line"
-         x="236.28711"
-         y="106.9657"
-         style="font-size:28px;text-align:center;text-anchor:middle"
-         id="tspan2236">Software</tspan><tspan
-         sodipodi:role="line"
-         x="236.28711"
-         y="141.9657"
-         style="font-size:28px;text-align:center;text-anchor:middle"
-         id="tspan2240">Installer</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
-       x="218.58398"
-       y="187.07898"
-       id="text3217"><tspan
-         sodipodi:role="line"
-         x="218.58398"
-         y="187.07898"
-         style="font-size:20px;text-align:center;text-anchor:middle"
-         id="tspan3221">SYSTEM</tspan><tspan
-         sodipodi:role="line"
-         x="218.58398"
-         y="212.07898"
-         style="font-size:20px;text-align:center;text-anchor:middle"
-         id="tspan2229">DBUS</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:5.81893778;stroke-linecap:square;stroke-linejoin:miter;marker-start:url(#Arrow1Sstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 445.32143,344.35568 C 445.32143,314.46904 445.32143,314.46904 445.32143,314.46904"
-       id="path4398"
-       sodipodi:nodetypes="cc" />
-    <rect
-       style="opacity:1;fill:#ff9955;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect5369"
-       width="160"
-       height="80"
-       x="59.999996"
-       y="232.36218" />
-    <text
-       xml:space="preserve"
-       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
-       x="147.54688"
-       y="262.98816"
-       id="text5371"><tspan
-         sodipodi:role="line"
-         x="147.54688"
-         y="262.98816"
-         style="font-size:28px;text-align:center;text-anchor:middle"
-         id="tspan5375">Backend</tspan><tspan
-         sodipodi:role="line"
-         x="147.54688"
-         y="297.98816"
-         style="font-size:28px;text-align:center;text-anchor:middle"
-         id="tspan5381">Instance</tspan></text>
-    <rect
-       style="opacity:1;fill:#ff9955;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect5383"
-       width="135"
-       height="80"
-       x="300"
-       y="452.36218" />
-    <text
-       xml:space="preserve"
-       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
-       x="362.6875"
-       y="483.63562"
-       id="text5385"><tspan
-         sodipodi:role="line"
-         x="362.6875"
-         y="483.63562"
-         style="font-size:28px;text-align:center;text-anchor:middle"
-         id="tspan5387">Runner</tspan><tspan
-         sodipodi:role="line"
-         x="362.6875"
-         y="518.63562"
-         style="font-size:28px;text-align:center;text-anchor:middle"
-         id="tspan5389">Task</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Send);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 292.5,152.36218 L 397.5,232.36218"
-       id="path5395"
-       inkscape:connector-type="polyline"
-       inkscape:connection-start="#rect2230"
-       inkscape:connection-end="#rect1876" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Send);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 442.5,152.36218 L 447.5,232.36218"
-       id="path5397"
-       inkscape:connector-type="polyline"
-       inkscape:connection-start="#rect1882"
-       inkscape:connection-end="#rect1876" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Send);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
-       d="M 280,272.36218 L 220,272.36218"
-       id="path5401"
-       inkscape:connector-type="polyline"
-       inkscape:connection-start="#rect1876"
-       inkscape:connection-end="#rect5369" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Send);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 411,432.36218 L 396.5,452.36218"
-       id="path5403"
-       inkscape:connector-type="polyline"
-       inkscape:connection-start="#rect1884"
-       inkscape:connection-end="#rect5383" />
-    <rect
-       style="opacity:1;fill:#87de87;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect6378"
-       width="200"
-       height="80"
-       x="39.999996"
-       y="452.36218" />
-    <text
-       xml:space="preserve"
-       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
-       x="144.55272"
-       y="486.9657"
-       id="text6380"><tspan
-         sodipodi:role="line"
-         x="144.55272"
-         y="486.9657"
-         style="font-size:28px;text-align:center;text-anchor:middle"
-         id="tspan6384">Helper</tspan><tspan
-         sodipodi:role="line"
-         x="144.55272"
-         y="521.9657"
-         style="font-size:28px;text-align:center;text-anchor:middle"
-         id="tspan6388">Executable</tspan></text>
-    <rect
-       style="opacity:1;fill:#ededed;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect8340"
-       width="160"
-       height="80"
-       x="560"
-       y="72.362183" />
-    <text
-       xml:space="preserve"
-       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
-       x="633.42999"
-       y="106.9657"
-       id="text8342"><tspan
-         sodipodi:role="line"
-         x="633.42999"
-         y="106.9657"
-         style="font-size:28px;text-align:center;text-anchor:middle"
-         id="tspan8344">Update</tspan><tspan
-         sodipodi:role="line"
-         x="633.42999"
-         y="141.9657"
-         style="font-size:28px;text-align:center;text-anchor:middle"
-         id="tspan8346">Viewer</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:7.65923738px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
-       x="152.4171"
-       y="479.55511"
-       id="text8348"
-       transform="scale(1.1833814,0.8450361)"><tspan
-         sodipodi:role="line"
-         x="152.4171"
-         y="479.55511"
-         style="font-size:12.76539516px;text-align:center;text-anchor:middle"
-         id="tspan8350">STDIN</tspan><tspan
-         sodipodi:role="line"
-         x="152.4171"
-         y="495.51186"
-         style="font-size:12.76539516px;text-align:center;text-anchor:middle"
-         id="tspan2216">STDERR</tspan><tspan
-         sodipodi:role="line"
-         x="152.4171"
-         y="511.4686"
-         style="font-size:12.76539516px;text-align:center;text-anchor:middle"
-         id="tspan2218">STDOUT</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Send);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 140,312.36218 L 140,452.36218"
-       id="path8352"
-       inkscape:connector-type="polyline"
-       inkscape:connection-start="#rect5369"
-       inkscape:connection-end="#rect6378" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Send);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 592.5,152.36218 L 497.5,232.36218"
-       id="path8356"
-       inkscape:connector-type="polyline"
-       inkscape:connection-start="#rect8340"
-       inkscape:connection-end="#rect1876" />
-    <rect
-       style="opacity:1;fill:#c8b7b7;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect2213"
-       width="125"
-       height="25"
-       x="-65"
-       y="262.36218" />
-    <text
-       xml:space="preserve"
-       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
-       x="-2.0898473"
-       y="282.36218"
-       id="text2215"><tspan
-         sodipodi:role="line"
-         x="-2.0898473"
-         y="282.36218"
-         style="font-size:20px;text-align:center;text-anchor:middle"
-         id="tspan2219">Thread #1</tspan></text>
-    <rect
-       style="opacity:1;fill:#916f6f;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect2223"
-       width="125"
-       height="25.101501"
-       x="-65"
-       y="287.26068" />
-    <text
-       xml:space="preserve"
-       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
-       x="-2.0898473"
-       y="307.36218"
-       id="text2225"><tspan
-         sodipodi:role="line"
-         x="-2.0898473"
-         y="307.36218"
-         style="font-size:20px;text-align:center;text-anchor:middle"
-         id="tspan2227">Thread #2</tspan></text>
-    <rect
-       style="opacity:1;fill:#ff9955;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect2220"
-       width="135"
-       height="80"
-       x="465"
-       y="452.36218" />
-    <text
-       xml:space="preserve"
-       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
-       x="527.6875"
-       y="483.63562"
-       id="text2222"><tspan
-         sodipodi:role="line"
-         x="527.6875"
-         y="483.63562"
-         style="font-size:28px;text-align:center;text-anchor:middle"
-         id="tspan2224">Runner</tspan><tspan
-         sodipodi:role="line"
-         x="527.6875"
-         y="518.63562"
-         style="font-size:28px;text-align:center;text-anchor:middle"
-         id="tspan2228">Task</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Send);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 507,432.36218 L 520.5,452.36218"
-       id="path2230"
-       inkscape:connector-type="polyline"
-       sodipodi:nodetypes="cc" />
-    <rect
-       style="opacity:1;fill:#87de87;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect2232"
-       width="200"
-       height="80"
-       x="-100"
-       y="342.36218" />
-    <text
-       xml:space="preserve"
-       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
-       x="4.5527229"
-       y="376.9657"
-       id="text2234"><tspan
-         sodipodi:role="line"
-         x="4.5527229"
-         y="376.9657"
-         style="font-size:28px;text-align:center;text-anchor:middle"
-         id="tspan2239">DBUS</tspan><tspan
-         sodipodi:role="line"
-         x="4.5527229"
-         y="411.9657"
-         style="font-size:28px;text-align:center;text-anchor:middle"
-         id="tspan2245">Service</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Send);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
-       d="M 89.090907,312.36218 L 50.90909,342.36218"
-       id="path2241"
-       inkscape:connector-type="polyline"
-       inkscape:connection-end="#rect2232"
-       inkscape:connection-start="#rect5369" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Send);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;marker-start:url(#Arrow1Sstart)"
-       d="M 326.13636,452.36218 L 181.36363,312.36218"
-       id="path2247"
-       inkscape:connector-type="polyline"
-       inkscape:connection-end="#rect5369"
-       inkscape:connection-start="#rect5383" />
-  </g>
-</svg>
diff --git a/docs/spec/pk-transactions-failure.png b/docs/spec/pk-transactions-failure.png
deleted file mode 100644
index a038ea3..0000000
Binary files a/docs/spec/pk-transactions-failure.png and /dev/null differ
diff --git a/docs/spec/pk-transactions-sig-install.png b/docs/spec/pk-transactions-sig-install.png
deleted file mode 100644
index 27949fc..0000000
Binary files a/docs/spec/pk-transactions-sig-install.png and /dev/null differ
diff --git a/docs/spec/pk-transactions-success.png b/docs/spec/pk-transactions-success.png
deleted file mode 100644
index b299bfb..0000000
Binary files a/docs/spec/pk-transactions-success.png and /dev/null differ
diff --git a/docs/spec/pk-transactions-trusted.png b/docs/spec/pk-transactions-trusted.png
deleted file mode 100644
index 4085e8a..0000000
Binary files a/docs/spec/pk-transactions-trusted.png and /dev/null differ
diff --git a/docs/spec/pk-transactions.svg b/docs/spec/pk-transactions.svg
deleted file mode 100644
index 954e540..0000000
--- a/docs/spec/pk-transactions.svg
+++ /dev/null
@@ -1,1275 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="744.09448819"
-   height="1052.3622047"
-   id="svg2"
-   sodipodi:version="0.32"
-   inkscape:version="0.46"
-   sodipodi:docname="pk-transactions.svg"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape">
-  <defs
-     id="defs4">
-    <marker
-       inkscape:stockid="Arrow2Mstart"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow2Mstart"
-       style="overflow:visible">
-      <path
-         id="path3246"
-         style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
-         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
-         transform="scale(0.6) translate(0,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow2Lend"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow2Lend"
-       style="overflow:visible;">
-      <path
-         id="path3243"
-         style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
-         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
-         transform="scale(1.1) rotate(180) translate(1,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow2Lstart"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow2Lstart"
-       style="overflow:visible">
-      <path
-         id="path3240"
-         style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
-         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
-         transform="scale(1.1) translate(1,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Lstart"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow1Lstart"
-       style="overflow:visible">
-      <path
-         id="path3222"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
-         transform="scale(0.8) translate(12.5,0)" />
-    </marker>
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 526.18109 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="744.09448 : 526.18109 : 1"
-       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
-       id="perspective10" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     gridtolerance="10000"
-     guidetolerance="10"
-     objecttolerance="10"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="0.7"
-     inkscape:cx="277.52317"
-     inkscape:cy="649.44446"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     borderlayer="true"
-     inkscape:showpageshadow="false"
-     inkscape:window-width="1280"
-     inkscape:window-height="951"
-     inkscape:window-x="0"
-     inkscape:window-y="25">
-    <inkscape:grid
-       type="xygrid"
-       id="grid2403"
-       visible="true"
-       enabled="true"
-       color="#0000ff"
-       opacity="0.03137255"
-       empcolor="#0000ff"
-       empopacity="0.05882353" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1">
-    <rect
-       style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.45442721;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="rect6509"
-       width="475.04556"
-       height="189.96553"
-       x="30.451931"
-       y="862.33252"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-failure.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <rect
-       style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="rect6507"
-       width="475"
-       height="230"
-       x="30.474718"
-       y="622.35529"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-success.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <rect
-       style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="rect6505"
-       width="475"
-       height="335"
-       x="30.597656"
-       y="277.36218"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <rect
-       style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.50000000000000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="rect6503"
-       width="475"
-       height="255"
-       x="30"
-       y="12.362183"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <rect
-       style="opacity:0.76146784999999984;fill:#8d5fd3;fill-opacity:1"
-       id="rect6269"
-       width="35"
-       height="105"
-       x="465"
-       y="37.362183"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <rect
-       style="opacity:0.76146784999999984;fill:#ff8080;fill-opacity:1"
-       id="rect2405"
-       width="35"
-       height="245"
-       x="250"
-       y="17.362183"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <rect
-       style="opacity:0.76146784999999984;fill:#5fd38d;fill-opacity:1"
-       id="rect2407"
-       width="35"
-       height="245"
-       x="35"
-       y="17.362183"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <rect
-       style="opacity:0.76146784999999984;fill:#8d5fd3;fill-opacity:1"
-       id="rect2411"
-       width="35"
-       height="110"
-       x="465"
-       y="152.36218"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
-       x="-128.495"
-       y="60"
-       id="text2413"
-       transform="matrix(0,-1,1,0,0,0)"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180"><tspan
-         sodipodi:role="line"
-         id="tspan2415"
-         x="-128.495"
-         y="60"
-         style="font-size:20px;text-align:center;text-anchor:middle">Manager</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
-       x="-88.182495"
-       y="490"
-       id="text2417"
-       transform="matrix(0,-1,1,0,0,0)"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180"><tspan
-         sodipodi:role="line"
-         id="tspan2419"
-         x="-88.182495"
-         y="490"
-         style="font-size:20px;text-align:center;text-anchor:middle">Tran #1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
-       x="-128.41687"
-       y="275"
-       id="text2421"
-       transform="matrix(0,-1,1,0,0,0)"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180"><tspan
-         sodipodi:role="line"
-         id="tspan2423"
-         x="-128.41687"
-         y="275"
-         style="font-size:20px;text-align:center;text-anchor:middle">Client</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 459.94306,52.36218 L 285,52.36218"
-       id="path6109"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75172305;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 75,32.36218 L 249.87185,32.36218"
-       id="path6113"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
-       x="164.33984"
-       y="27.362183"
-       id="text6115"
-       sodipodi:linespacing="125%"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180"><tspan
-         sodipodi:role="line"
-         id="tspan6117"
-         x="164.33984"
-         y="27.362183"
-         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">GetTid()</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.39060569;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 244.97015,42.36906 L 119.58222,42.36906 L 109.94012,32.33406"
-       id="path6119"
-       sodipodi:nodetypes="ccc"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
-       x="370.33984"
-       y="47.362183"
-       id="text6121"
-       sodipodi:linespacing="125%"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180"><tspan
-         sodipodi:role="line"
-         id="tspan6123"
-         x="370.33984"
-         y="47.362183"
-         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">InstallFile(trusted, f)</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 290.05694,92.36218 L 465,92.36218"
-       id="path6125"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
-       x="381.17969"
-       y="87.362183"
-       id="text6127"
-       sodipodi:linespacing="125%"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180"><tspan
-         sodipodi:role="line"
-         id="tspan6129"
-         x="381.17969"
-         y="87.362183"
-         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">::ErrorCode(no-sig)</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 459.53741,172.36218 L 284.59435,172.36218"
-       id="path6131"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
-       x="362.90131"
-       y="167.36218"
-       id="text6133"
-       sodipodi:linespacing="125%"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180"><tspan
-         sodipodi:role="line"
-         id="tspan6135"
-         x="362.90131"
-         y="167.36218"
-         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">InstallFile(untrusted, f)</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 289.53741,212.36218 L 464.48047,212.36218"
-       id="path6159"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
-       x="380.66016"
-       y="207.36218"
-       id="text6161"
-       sodipodi:linespacing="125%"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180"><tspan
-         sodipodi:role="line"
-         id="tspan6163"
-         x="380.66016"
-         y="207.36218"
-         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">::StatusChanged(inst)</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 289.53741,252.36218 L 464.48047,252.36218"
-       id="path6165"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
-       x="380.66016"
-       y="247.36218"
-       id="text6167"
-       sodipodi:linespacing="125%"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180"><tspan
-         sodipodi:role="line"
-         id="tspan6169"
-         x="380.66016"
-         y="247.36218"
-         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">::Finished(success)</tspan></text>
-    <rect
-       style="opacity:0.76146785;fill:#ff8080;fill-opacity:1"
-       id="rect6171"
-       width="35"
-       height="325"
-       x="250.65753"
-       y="282.36218"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <rect
-       style="opacity:0.76146785;fill:#5fd38d;fill-opacity:1"
-       id="rect6173"
-       width="35"
-       height="325"
-       x="35.657532"
-       y="282.36218"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
-       x="-448.495"
-       y="60.597656"
-       id="text6177"
-       transform="matrix(0,-1,1,0,0,0)"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180"><tspan
-         sodipodi:role="line"
-         id="tspan6179"
-         x="-448.495"
-         y="60.597656"
-         style="font-size:20px;text-align:center;text-anchor:middle">Manager</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
-       x="-423.41687"
-       y="275.59766"
-       id="text6185"
-       transform="matrix(0,-1,1,0,0,0)"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180"><tspan
-         sodipodi:role="line"
-         id="tspan6187"
-         x="-423.41687"
-         y="275.59766"
-         style="font-size:20px;text-align:center;text-anchor:middle">Client</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 460.6006,317.3903 L 285.65754,317.3903"
-       id="path6195"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75172305;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 75.657536,297.3903 L 250.52939,297.3903"
-       id="path6199"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
-       x="164.99738"
-       y="292.39032"
-       id="text6201"
-       sodipodi:linespacing="125%"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180"><tspan
-         sodipodi:role="line"
-         id="tspan6203"
-         x="164.99738"
-         y="292.39032"
-         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">GetTid()</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.39060569;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 245.62769,307.39718 L 120.23976,307.39718 L 110.59766,297.36218"
-       id="path6205"
-       sodipodi:nodetypes="ccc"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
-       x="370.99738"
-       y="312.39032"
-       id="text6207"
-       sodipodi:linespacing="125%"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180"><tspan
-         sodipodi:role="line"
-         id="tspan6209"
-         x="370.99738"
-         y="312.39032"
-         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">InstallPackage(p)</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 290.71448,357.3903 L 465.65754,357.3903"
-       id="path6211"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
-       x="381.83722"
-       y="352.39032"
-       id="text6213"
-       sodipodi:linespacing="125%"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180"><tspan
-         sodipodi:role="line"
-         id="tspan6215"
-         x="381.83722"
-         y="352.39032"
-         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">::RepoSigRequired(key)</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 461.25227,437.36216 L 286.30921,437.36216"
-       id="path6217"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
-       x="364.61615"
-       y="432.36218"
-       id="text6219"
-       sodipodi:linespacing="125%"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180"><tspan
-         sodipodi:role="line"
-         id="tspan6221"
-         x="364.61615"
-         y="432.36218"
-         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">InstallSignature(key)</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 290.6546,557.36218 L 465.59766,557.36218"
-       id="path6225"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
-       x="381.77734"
-       y="552.36218"
-       id="text6227"
-       sodipodi:linespacing="125%"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180"><tspan
-         sodipodi:role="line"
-         id="tspan6229"
-         x="381.77734"
-         y="552.36218"
-         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">::StatusChanged(inst)</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 291.25227,477.36216 L 466.19533,477.36216"
-       id="path6231"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
-       x="382.375"
-       y="472.36218"
-       id="text6233"
-       sodipodi:linespacing="125%"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180"><tspan
-         sodipodi:role="line"
-         id="tspan6235"
-         x="382.375"
-         y="472.36218"
-         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">::Finished(success)</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 290,132.36218 L 464.94306,132.36218"
-       id="path6239"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
-       x="381.12274"
-       y="127.36218"
-       id="text6241"
-       sodipodi:linespacing="125%"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180"><tspan
-         sodipodi:role="line"
-         id="tspan6243"
-         x="381.12274"
-         y="127.36218"
-         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">::Finished(failure)</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 290.6546,397.36218 L 465.59766,397.36218"
-       id="path6247"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
-       x="381.77734"
-       y="392.36224"
-       id="text6249"
-       sodipodi:linespacing="125%"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180"><tspan
-         sodipodi:role="line"
-         id="tspan6251"
-         x="381.77734"
-         y="392.36224"
-         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">::Finished(key-required)</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75172305;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 75,152.36218 L 249.87185,152.36218"
-       id="path6253"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
-       x="164.33984"
-       y="147.36218"
-       id="text6255"
-       sodipodi:linespacing="125%"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180"><tspan
-         sodipodi:role="line"
-         id="tspan6257"
-         x="164.33984"
-         y="147.36218"
-         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">GetTid()</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.39060569;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 244.97015,162.36906 L 119.58222,162.36906 L 109.94012,152.33406"
-       id="path6259"
-       sodipodi:nodetypes="ccc"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
-       x="-213.1825"
-       y="490"
-       id="text6265"
-       transform="matrix(0,-1,1,0,0,0)"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180"><tspan
-         sodipodi:role="line"
-         id="tspan6267"
-         x="-213.1825"
-         y="490"
-         style="font-size:20px;text-align:center;text-anchor:middle">Tran #2</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75172305;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 76.015436,417.3553 L 250.88729,417.3553"
-       id="path6271"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
-       x="165.35527"
-       y="412.35529"
-       id="text6273"
-       sodipodi:linespacing="125%"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180"><tspan
-         sodipodi:role="line"
-         id="tspan6275"
-         x="165.35527"
-         y="412.35529"
-         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">GetTid()</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.39060569;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 245.98559,427.36218 L 120.59766,427.36218 L 110.95556,417.32718"
-       id="path6277"
-       sodipodi:nodetypes="ccc"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <rect
-       style="opacity:0.76146785;fill:#8d5fd3;fill-opacity:1"
-       id="rect6279"
-       width="35"
-       height="110"
-       x="465.59766"
-       y="302.36218"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <rect
-       style="opacity:0.76146785;fill:#8d5fd3;fill-opacity:1"
-       id="rect6281"
-       width="35"
-       height="70"
-       x="465.59766"
-       y="422.36218"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
-       x="-363.1825"
-       y="490.59766"
-       id="text6283"
-       transform="matrix(0,-1,1,0,0,0)"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180"><tspan
-         sodipodi:role="line"
-         id="tspan6285"
-         x="-363.1825"
-         y="490.59766"
-         style="font-size:20px;text-align:center;text-anchor:middle">Tran #1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
-       x="-457.65515"
-       y="490.59766"
-       id="text6287"
-       transform="matrix(0,-1,1,0,0,0)"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180"><tspan
-         sodipodi:role="line"
-         id="tspan6289"
-         x="-457.65515"
-         y="490.59766"
-         style="font-size:20px;text-align:center;text-anchor:middle">#2</tspan></text>
-    <rect
-       style="opacity:0.76146785;fill:#8d5fd3;fill-opacity:1"
-       id="rect6291"
-       width="35"
-       height="100"
-       x="465.59766"
-       y="507.36218"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
-       x="-558.1825"
-       y="490.59766"
-       id="text6293"
-       transform="matrix(0,-1,1,0,0,0)"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180"><tspan
-         sodipodi:role="line"
-         id="tspan6295"
-         x="-558.1825"
-         y="490.59766"
-         style="font-size:20px;text-align:center;text-anchor:middle">Tran #3</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75172305;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 76.015436,492.3553 L 250.88729,492.3553"
-       id="path6297"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
-       x="165.35529"
-       y="487.35535"
-       id="text6299"
-       sodipodi:linespacing="125%"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180"><tspan
-         sodipodi:role="line"
-         id="tspan6301"
-         x="165.35529"
-         y="487.35535"
-         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">GetTid()</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.39060569;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 245.98559,502.36218 L 120.59766,502.36218 L 110.95556,492.32718"
-       id="path6303"
-       sodipodi:nodetypes="ccc"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 460.54072,517.36218 L 285.59766,517.36218"
-       id="path6305"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
-       x="370.9375"
-       y="512.36224"
-       id="text6307"
-       sodipodi:linespacing="125%"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180"><tspan
-         sodipodi:role="line"
-         id="tspan6309"
-         x="370.9375"
-         y="512.36224"
-         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">InstallPackage(p)</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 290.6546,597.36218 L 465.59766,597.36218"
-       id="path6311"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
-       x="381.77734"
-       y="592.36218"
-       id="text6313"
-       sodipodi:linespacing="125%"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-sig-install.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180"><tspan
-         sodipodi:role="line"
-         id="tspan6315"
-         x="381.77734"
-         y="592.36218"
-         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">::Finished(success)</tspan></text>
-    <rect
-       style="opacity:0.76146785;fill:#ff8080;fill-opacity:1"
-       id="rect6317"
-       width="35"
-       height="219.96503"
-       x="250.24495"
-       y="627.39026"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-success.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <rect
-       style="opacity:0.76146785;fill:#5fd38d;fill-opacity:1"
-       id="rect6319"
-       width="35"
-       height="219.96503"
-       x="35.244976"
-       y="627.39026"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-success.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
-       x="-738.41687"
-       y="275"
-       id="text6325"
-       transform="matrix(0,-1,1,0,0,0)"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-success.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180"><tspan
-         sodipodi:role="line"
-         id="tspan6327"
-         x="-738.41687"
-         y="275"
-         style="font-size:20px;text-align:center;text-anchor:middle">Client</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75172305;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 75.244969,647.39028 L 250.11682,647.39028"
-       id="path6329"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-success.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
-       x="167.53403"
-       y="642.39026"
-       id="text6331"
-       sodipodi:linespacing="125%"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-success.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180"><tspan
-         sodipodi:role="line"
-         id="tspan6333"
-         x="167.53403"
-         y="642.39026"
-         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">GetActions()</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 460.18803,717.39028 L 285.24497,717.39028"
-       id="path6335"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-success.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.39060569;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 245.21512,657.39718 L 119.82719,657.39718 L 110.18509,647.36216"
-       id="path6337"
-       sodipodi:nodetypes="ccc"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-success.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75172305;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 75.244969,697.39028 L 250.11682,697.39028"
-       id="path6339"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-success.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
-       x="164.58481"
-       y="692.39032"
-       id="text6341"
-       sodipodi:linespacing="125%"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-success.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180"><tspan
-         sodipodi:role="line"
-         id="tspan6343"
-         x="164.58481"
-         y="692.39032"
-         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">GetTid()</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.39060569;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 245.21512,707.39718 L 119.82719,707.39718 L 110.18509,697.36218"
-       id="path6345"
-       sodipodi:nodetypes="ccc"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-success.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
-       x="370.58481"
-       y="712.39032"
-       id="text6347"
-       sodipodi:linespacing="125%"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-success.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180"><tspan
-         sodipodi:role="line"
-         id="tspan6349"
-         x="370.58481"
-         y="712.39032"
-         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">InstallPackage(p)</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 290.30191,757.3903 L 465.24497,757.3903"
-       id="path6351"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-success.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
-       x="381.42465"
-       y="752.39032"
-       id="text6353"
-       sodipodi:linespacing="125%"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-success.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180"><tspan
-         sodipodi:role="line"
-         id="tspan6355"
-         x="381.42465"
-         y="752.39032"
-         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">::Progress(%)</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 290.53166,797.3553 L 465.47472,797.3553"
-       id="path6365"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-success.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
-       x="381.65442"
-       y="792.35529"
-       id="text6367"
-       sodipodi:linespacing="125%"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-success.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180"><tspan
-         sodipodi:role="line"
-         id="tspan6369"
-         x="381.65442"
-         y="792.35529"
-         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">::StatusChanged(inst)</tspan></text>
-    <rect
-       style="opacity:0.76146785;fill:#8d5fd3;fill-opacity:1"
-       id="rect6391"
-       width="35"
-       height="144.99316"
-       x="465.18506"
-       y="702.36212"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-success.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
-       x="-778.1825"
-       y="490"
-       id="text6395"
-       transform="matrix(0,-1,1,0,0,0)"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-success.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180"><tspan
-         sodipodi:role="line"
-         id="tspan6397"
-         x="-778.1825"
-         y="490"
-         style="font-size:20px;text-align:center;text-anchor:middle">Tran #1</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 290.53166,837.3553 L 465.47472,837.3553"
-       id="path6423"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-success.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
-       x="381.65442"
-       y="832.35529"
-       id="text6425"
-       sodipodi:linespacing="125%"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-success.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180"><tspan
-         sodipodi:role="line"
-         id="tspan6427"
-         x="381.65442"
-         y="832.35529"
-         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">::Finished(success)</tspan></text>
-    <rect
-       style="opacity:0.76146785;fill:#ff8080;fill-opacity:1"
-       id="rect6429"
-       width="35"
-       height="180.00696"
-       x="250.41777"
-       y="867.35522"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-failure.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <rect
-       style="opacity:0.76146785;fill:#5fd38d;fill-opacity:1"
-       id="rect6431"
-       width="35"
-       height="180.00696"
-       x="35.417786"
-       y="867.35522"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-failure.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
-       x="-953.41687"
-       y="275"
-       id="text6433"
-       transform="matrix(0,-1,1,0,0,0)"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-failure.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180"><tspan
-         sodipodi:role="line"
-         id="tspan6435"
-         x="-953.41687"
-         y="275"
-         style="font-size:20px;text-align:center;text-anchor:middle">Client</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75172305;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 75.417779,887.35528 L 250.28963,887.35528"
-       id="path6437"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-failure.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
-       x="167.70683"
-       y="882.35522"
-       id="text6439"
-       sodipodi:linespacing="125%"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-failure.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180"><tspan
-         sodipodi:role="line"
-         id="tspan6441"
-         x="167.70683"
-         y="882.35522"
-         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">GetActions()</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 460.36084,957.3553 L 285.41778,957.3553"
-       id="path6443"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-failure.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.39060569;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 245.38793,897.36218 L 120,897.36218 L 110.3579,887.32718"
-       id="path6445"
-       sodipodi:nodetypes="ccc"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-failure.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75172305;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 75.417779,937.3553 L 250.28963,937.3553"
-       id="path6447"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-failure.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
-       x="164.75761"
-       y="932.35529"
-       id="text6449"
-       sodipodi:linespacing="125%"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-failure.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180"><tspan
-         sodipodi:role="line"
-         id="tspan6451"
-         x="164.75761"
-         y="932.35529"
-         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">GetTid()</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.39060569;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 245.38793,947.3622 L 120,947.3622 L 110.3579,937.3272"
-       id="path6453"
-       sodipodi:nodetypes="ccc"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-failure.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
-       x="370.75763"
-       y="952.35529"
-       id="text6455"
-       sodipodi:linespacing="125%"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-failure.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180"><tspan
-         sodipodi:role="line"
-         id="tspan6457"
-         x="370.75763"
-         y="952.35529"
-         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">InstallPackage(p)</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 290.47472,997.3553 L 465.41778,997.3553"
-       id="path6459"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-failure.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
-       x="381.59747"
-       y="992.35529"
-       id="text6461"
-       sodipodi:linespacing="125%"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-failure.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180"><tspan
-         sodipodi:role="line"
-         id="tspan6463"
-         x="381.59747"
-         y="992.35529"
-         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">::ErrorCode(NoNetwork)</tspan></text>
-    <rect
-       style="opacity:0.76146785;fill:#8d5fd3;fill-opacity:1"
-       id="rect6473"
-       width="35"
-       height="105.03503"
-       x="465.35788"
-       y="942.32709"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-failure.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
-       x="-993.18243"
-       y="490.38794"
-       id="text6475"
-       transform="matrix(0,-1,1,0,0,0)"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-failure.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180"><tspan
-         sodipodi:role="line"
-         id="tspan6477"
-         x="-993.18243"
-         y="490.38794"
-         style="font-size:20px;text-align:center;text-anchor:middle">Tran #1</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 290.44487,1037.3622 L 465.38793,1037.3622"
-       id="path6479"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-failure.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180" />
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
-       x="381.56763"
-       y="1032.3621"
-       id="text6481"
-       sodipodi:linespacing="125%"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-failure.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180"><tspan
-         sodipodi:role="line"
-         id="tspan6483"
-         x="381.56763"
-         y="1032.3621"
-         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">::Finished(failed)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
-       x="-738.4881"
-       y="60.47472"
-       id="text6485"
-       transform="matrix(0,-1,1,0,0,0)"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-success.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180"><tspan
-         sodipodi:role="line"
-         id="tspan6487"
-         x="-738.4881"
-         y="60.47472"
-         style="font-size:20px;text-align:center;text-anchor:middle">Manager</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
-       x="-958.495"
-       y="60"
-       id="text6489"
-       transform="matrix(0,-1,1,0,0,0)"
-       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-failure.png"
-       inkscape:export-xdpi="180"
-       inkscape:export-ydpi="180"><tspan
-         sodipodi:role="line"
-         id="tspan6491"
-         x="-958.495"
-         y="60"
-         style="font-size:20px;text-align:center;text-anchor:middle">Manager</tspan></text>
-  </g>
-</svg>
commit f35ed72fc7f01f9bcb0c6b0cc8c8890865c7c5b6
Author: Richard Hughes <richard at hughsie.com>
Date:   Fri Jun 20 15:37:50 2008 +0100

    remove the method and signal documenation which is now inline with the code

diff --git a/docs/api/PackageKit-docs.sgml b/docs/api/PackageKit-docs.sgml
index 142dd56..70bc690 100644
--- a/docs/api/PackageKit-docs.sgml
+++ b/docs/api/PackageKit-docs.sgml
@@ -38,16 +38,21 @@
   </reference>
 
   <chapter>
-    <title>libpackagekit</title>
+    <title>libpackagekit GObjects</title>
     <xi:include href="xml/pk-connection.xml"/>
     <xi:include href="xml/pk-extra.xml"/>
     <xi:include href="xml/pk-client.xml"/>
     <xi:include href="xml/pk-package-list.xml"/>
     <xi:include href="xml/pk-control.xml"/>
     <xi:include href="xml/pk-task-list.xml"/>
+  </chapter>
+
+  <chapter>
+    <title>libpackagekit glib helpers</title>
     <xi:include href="xml/pk-debug.xml"/>
     <xi:include href="xml/pk-common.xml"/>
     <xi:include href="xml/pk-enum.xml"/>
     <xi:include href="xml/pk-package-id.xml"/>
   </chapter>
 </book>
+
diff --git a/docs/spec/Makefile.am b/docs/spec/Makefile.am
index 5c2d013..64d9f91 100644
--- a/docs/spec/Makefile.am
+++ b/docs/spec/Makefile.am
@@ -16,9 +16,7 @@ SPEC_XML_FILES =			\
 	pk-developer-faq.xml		\
 	pk-concepts.xml			\
 	pk-introduction.xml		\
-	pk-methods.xml			\
 	pk-reference.xml		\
-	pk-signals.xml			\
 	pk-reference.xml		\
 	pk-introduction.xml
 
diff --git a/docs/spec/pk-methods.xml b/docs/spec/pk-methods.xml
deleted file mode 100644
index e791c6b..0000000
--- a/docs/spec/pk-methods.xml
+++ /dev/null
@@ -1,995 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd">
-
-<chapter id="methods">
-  <title>Methods</title>
-  <para>
-    Methods used by the backends are as follows:
-  </para>
-
-  <sect1 id="methods-get-packages">
-    <title>Get Packages</title>
-    <para>
-      The arguments are:
-    </para>
-    <informaltable>
-      <tgroup cols="2">
-        <thead>
-          <row>
-            <entry>Option</entry>
-            <entry>Description</entry>
-          </row>
-        </thead>
-        <tbody>
-          <row>
-            <entry><literal>filter</literal></entry>
-            <entry>
-              A correct filter, e.g. <literal>none</literal> or
-              <literal>installed;~devel</literal>
-            </entry>
-          </row>
-        </tbody>
-      </tgroup>
-    </informaltable>
-    <para>
-      This method typically emits
-      <literal>Progress</literal>,
-      <literal>Error</literal> and
-      <literal>Package</literal>.
-    </para>
-    <para>
-      <literal>Package</literal> enumerated types should be
-      <literal>available</literal> or <literal>installed</literal>.
-    </para>
-  </sect1>
-
-  <sect1 id="methods-search-name">
-    <title>Search Name</title>
-    <para>
-      The arguments are:
-    </para>
-    <informaltable>
-      <tgroup cols="2">
-        <thead>
-          <row>
-            <entry>Option</entry>
-            <entry>Description</entry>
-          </row>
-        </thead>
-        <tbody>
-          <row>
-            <entry><literal>filter</literal></entry>
-            <entry>
-              A correct filter, e.g. <literal>none</literal> or
-              <literal>installed;~devel</literal>
-            </entry>
-          </row>
-          <row>
-            <entry><literal>search_term</literal></entry>
-            <entry>A single word search term with no wildcard chars.</entry>
-          </row>
-        </tbody>
-      </tgroup>
-    </informaltable>
-    <para>
-      Do not refresh the package cache. This should be fast.
-    </para>
-    <para>
-      Try to emit <literal>installed</literal> before
-      <literal>available</literal> packages first, as it allows the client
-      program to perform the GUI filtering and matching whilst the daemon is
-      running the transaction.
-    </para>
-    <para>
-      If the backend includes <literal>installed</literal> and
-      <literal>available</literal> versions of the same package when searching
-      then the <literal>available</literal> version will have to be filtered
-      in the backend.
-    </para>
-    <para>
-      The search query in the backend should not be case sensitive, and
-      should not be sensitive to <literal>_</literal> or <literal>-</literal>.
-    </para>
-    <para>
-      The search methods should return all results in all repositories.
-      This may mean that multiple versions of package are returned.
-      If this is not what is wanted by the client program, then the
-      <literal>newest</literal> filter should be used.
-    </para>
-    <para>
-      This method typically emits
-      <literal>Progress</literal>,
-      <literal>Error</literal> and
-      <literal>Package</literal>.
-    </para>
-    <para>
-      <literal>Package</literal> enumerated types should be
-      <literal>available</literal> or <literal>installed</literal>.
-    </para>
-  </sect1>
-
-  <sect1 id="methods-search-group">
-    <title>Search Group</title>
-    <para>
-      The arguments are:
-    </para>
-    <informaltable>
-      <tgroup cols="2">
-        <thead>
-          <row>
-            <entry>Option</entry>
-            <entry>Description</entry>
-          </row>
-        </thead>
-        <tbody>
-          <row>
-            <entry><literal>filter</literal></entry>
-            <entry>
-              A correct filter, e.g. <literal>none</literal> or
-              <literal>installed;~devel</literal>
-            </entry>
-          </row>
-          <row>
-            <entry><literal>group_type</literal></entry>
-            <entry>An enumerated group_type, or <literal>unknown</literal></entry>
-          </row>
-        </tbody>
-      </tgroup>
-    </informaltable>
-    <para>
-      Do not refresh the package cache. This should be fast.
-    </para>
-    <para>
-      This method typically emits
-      <literal>Progress</literal>,
-      <literal>Error</literal> and
-      <literal>Package</literal>.
-    </para>
-    <para>
-      <literal>Package</literal> enumerated types should be
-      <literal>available</literal> or <literal>installed</literal>.
-    </para>
-  </sect1>
-
-  <sect1 id="methods-search-details">
-    <title>Search Details</title>
-    <para>
-      The arguments are:
-    </para>
-    <informaltable>
-      <tgroup cols="2">
-        <thead>
-          <row>
-            <entry>Option</entry>
-            <entry>Description</entry>
-          </row>
-        </thead>
-        <tbody>
-          <row>
-            <entry><literal>filter</literal></entry>
-            <entry>
-              A correct filter, e.g. <literal>none</literal> or
-              <literal>installed;~devel</literal>
-            </entry>
-          </row>
-          <row>
-            <entry><literal>search_term</literal></entry>
-            <entry>A single word search term with no wildcard chars.</entry>
-          </row>
-        </tbody>
-      </tgroup>
-    </informaltable>
-    <para>
-      Do not refresh the package cache. This should be fast.
-      This is very similar to search-name.
-      This should search as much data as possible, including, if possible
-      repo names, package summaries, descriptions and URLs.
-    </para>
-    <para>
-      This method typically emits
-      <literal>Progress</literal>,
-      <literal>Error</literal> and
-      <literal>Package</literal>.
-    </para>
-    <para>
-      <literal>Package</literal> enumerated types should be
-      <literal>available</literal> or <literal>installed</literal>.
-    </para>
-  </sect1>
-
-  <sect1 id="methods-search-file">
-    <title>Search File</title>
-    <para>
-      The arguments are:
-    </para>
-    <informaltable>
-      <tgroup cols="2">
-        <thead>
-          <row>
-            <entry>Option</entry>
-            <entry>Description</entry>
-          </row>
-        </thead>
-        <tbody>
-          <row>
-            <entry><literal>filter</literal></entry>
-            <entry>
-              A correct filter, e.g. <literal>none</literal> or
-              <literal>installed;~devel</literal>
-            </entry>
-          </row>
-          <row>
-            <entry><literal>search_term</literal></entry>
-            <entry>A single word search term with no wildcard chars.</entry>
-          </row>
-        </tbody>
-      </tgroup>
-    </informaltable>
-    <para>
-      This should search for files.
-      This should allow an application to find out what package owns
-      a file on the system.
-    </para>
-    <para>
-      This method typically emits
-      <literal>Progress</literal>,
-      <literal>Error</literal> and
-      <literal>Package</literal>.
-    </para>
-    <para>
-      <literal>Package</literal> enumerated types should be
-      <literal>available</literal> or <literal>installed</literal>.
-    </para>
-  </sect1>
-
-  <sect1 id="methods-install-package">
-    <title>Install Packages</title>
-    <para>
-      The installer should always install extra packages automatically
-      as the use could call GetDepends prior to the install if a confirmation
-      is required in the UI.
-    </para>
-    <para>
-      The arguments are:
-    </para>
-    <informaltable>
-      <tgroup cols="2">
-        <thead>
-          <row>
-            <entry>Option</entry>
-            <entry>Description</entry>
-          </row>
-        </thead>
-        <tbody>
-          <row>
-            <entry><literal>package_ids</literal></entry>
-            <entry>An array of package IDs.</entry>
-          </row>
-        </tbody>
-      </tgroup>
-    </informaltable>
-    <para>
-      This method typically emits
-      <literal>Progress</literal>,
-      <literal>Status</literal> and
-      <literal>Error</literal> and
-      <literal>Package</literal>.
-    </para>
-    <para>
-      <literal>Package</literal> enumerated types should be
-      <literal>downloading</literal>,
-      <literal>updating</literal>,
-      <literal>installing</literal> or
-      <literal>removing</literal>.
-    </para>
-  </sect1>
-
-  <sect1 id="methods-install-file">
-    <title>Install Files</title>
-    <para>
-      The installer should always install extra packages automatically
-      as the use could call GetDepends prior to the install if a confirmation
-      is required in the UI.
-    </para>
-    <para>
-      The arguments are:
-    </para>
-    <informaltable>
-      <tgroup cols="2">
-        <thead>
-          <row>
-            <entry>Option</entry>
-            <entry>Description</entry>
-          </row>
-        </thead>
-        <tbody>
-          <row>
-            <entry><literal>full_paths</literal></entry>
-            <entry>An array of full path and filenames to packages.</entry>
-          </row>
-        </tbody>
-      </tgroup>
-    </informaltable>
-    <para>
-      This method typically emits
-      <literal>Progress</literal>,
-      <literal>Status</literal> and
-      <literal>Error</literal> and
-      <literal>Package</literal>.
-    </para>
-    <para>
-      <literal>Package</literal> enumerated types should be
-      <literal>downloading</literal>,
-      <literal>updating</literal>,
-      <literal>installing</literal> or
-      <literal>removing</literal>.
-    </para>
-  </sect1>
-
-  <sect1 id="methods-install-signature">
-    <title>Install Signature</title>
-    <para>
-      Sometimes we need to install new security keys to allow an install to continue.
-    </para>
-    <para>
-      The arguments are:
-    </para>
-    <informaltable>
-      <tgroup cols="2">
-        <thead>
-          <row>
-            <entry>Option</entry>
-            <entry>Description</entry>
-          </row>
-        </thead>
-        <tbody>
-          <row>
-            <entry><literal>sig_type</literal></entry>
-            <entry>A key type, e.g. <literal>gpg</literal></entry>
-          </row>
-          <row>
-            <entry><literal>key_id</literal></entry>
-            <entry>A key ID, e.g. <literal>BB7576AC</literal></entry>
-          </row>
-          <row>
-            <entry><literal>package_id</literal></entry>
-            <entry>A PackageID for the package that the user is trying to install</entry>
-          </row>
-        </tbody>
-      </tgroup>
-    </informaltable>
-    <para>
-      This method typically emits
-      <literal>Error</literal> and
-    </para>
-  </sect1>
-
-  <sect1 id="methods-remove">
-    <title>Remove Packages</title>
-    <para>
-      The arguments are:
-    </para>
-    <informaltable>
-      <tgroup cols="2">
-        <thead>
-          <row>
-            <entry>Option</entry>
-            <entry>Description</entry>
-          </row>
-        </thead>
-        <tbody>
-          <row>
-            <entry><literal>package_ids</literal></entry>
-            <entry>An array of package IDs.</entry>
-          </row>
-          <row>
-            <entry><literal>allow_deps</literal></entry>
-            <entry>
-              Either <literal>true</literal> or <literal>false</literal>.
-              If <literal>true</literal> allow other packages to be removed with the package,
-              but <literal>false</literal> should cause the script to abort if other packages
-              are dependant on the package.
-            </entry>
-          </row>
-          <row>
-            <entry><literal>auto_remove</literal></entry>
-            <entry>
-              Either <literal>true</literal> or <literal>false</literal>.
-              This option is only really interesting on embedded devices with a limited amount of
-              flash storage.
-              It suggests to the packagekit backend that dependencies installed at the same time as
-              the package should also be removed if they are not required by anything else.
-              For instance, if you install OpenOffice, it might download libneon as a dependency.
-              When <literal>auto_remove</literal> is set to true, and you remove OpenOffice then
-              libneon will also get removed automatically.
-            </entry>
-          </row>
-        </tbody>
-      </tgroup>
-    </informaltable>
-    <para>
-      This method typically emits
-      <literal>Progress</literal>,
-      <literal>Status</literal> and
-      <literal>Error</literal> and
-      <literal>Package</literal>.
-    </para>
-    <para>
-      <literal>Package</literal> enumerated types should be
-      <literal>downloading</literal>,
-      <literal>updating</literal>,
-      <literal>installing</literal> or
-      <literal>removing</literal>.
-    </para>
-  </sect1>
-
-  <sect1 id="methods-get-depends">
-    <title>Get Depends</title>
-    <para>
-      GetDepends should return packages that this package depends on.
-    </para>
-    <para>
-      The arguments are:
-    </para>
-    <informaltable>
-      <tgroup cols="2">
-        <thead>
-          <row>
-            <entry>Option</entry>
-            <entry>Description</entry>
-          </row>
-        </thead>
-        <tbody>
-          <row>
-            <entry><literal>filter</literal></entry>
-            <entry>
-              A correct filter, e.g. <literal>none</literal> or
-              <literal>installed;</literal>
-            </entry>
-          </row>
-          <row>
-            <entry><literal>package_id</literal></entry>
-            <entry>A single, valid, package ID.</entry>
-          </row>
-          <row>
-            <entry><literal>recursive</literal></entry>
-            <entry>
-              Either <literal>true</literal> or <literal>false</literal>. If yes then the requirements should be
-              returned for all packages returned.
-              This means if gnome-power-manager depends on NetworkManager
-              and NetworkManager depends on HAL, then GetDepends on
-              gnome-power-manager should return both HAL and NetworkManager.
-            </entry>
-          </row>
-        </tbody>
-      </tgroup>
-    </informaltable>
-    <para>
-      This method typically emits
-      <literal>Progress</literal>,
-      <literal>Status</literal> and
-      <literal>Error</literal> and
-      <literal>Package</literal>.
-    </para>
-    <para>
-      <literal>Package</literal> enumerated types should be
-      <literal>available</literal> or <literal>installed</literal>.
-    </para>
-  </sect1>
-
-  <sect1 id="methods-what-provides">
-    <title>What Provides</title>
-    <para>
-      WhatProvides should return packages that provide the supplied attributes.
-      This method is useful for finding out what package(s) provide a modalias
-      or GStreamer codec string.
-    </para>
-    <para>
-      The arguments are:
-    </para>
-    <informaltable>
-      <tgroup cols="2">
-        <thead>
-          <row>
-            <entry>Option</entry>
-            <entry>Description</entry>
-          </row>
-        </thead>
-        <tbody>
-          <row>
-            <entry><literal>filter</literal></entry>
-            <entry>
-              A correct filter, e.g. <literal>none</literal> or
-              <literal>installed;</literal>
-            </entry>
-          </row>
-          <row>
-            <entry><literal>type</literal></entry>
-            <entry>
-              A PkProvideType, e.g. <literal>PK_PROVIDES_ENUM_CODEC</literal>.
-            </entry>
-          </row>
-          <row>
-            <entry><literal>data</literal></entry>
-            <entry>
-              The data to send to the backend to get the packages.
-              Note: This is backend specific.
-            </entry>
-          </row>
-        </tbody>
-      </tgroup>
-    </informaltable>
-    <para>
-      This method typically emits
-      <literal>Progress</literal>,
-      <literal>Status</literal> and
-      <literal>Error</literal> and
-      <literal>Package</literal>.
-    </para>
-    <para>
-      <literal>Package</literal> enumerated types should be
-      <literal>available</literal> or <literal>installed</literal>.
-    </para>
-  </sect1>
-
-  <sect1 id="methods-resolve">
-    <title>Resolve</title>
-    <para>
-      Resolve turns a single package name into a package_id suitable for the
-      other methods.
-    </para>
-    <para>
-      The arguments are:
-    </para>
-    <informaltable>
-      <tgroup cols="2">
-        <thead>
-          <row>
-            <entry>Option</entry>
-            <entry>Description</entry>
-          </row>
-        </thead>
-        <tbody>
-          <row>
-            <entry><literal>filter</literal></entry>
-            <entry>
-              A correct filter, e.g. <literal>none</literal> or
-              <literal>installed;~devel</literal>
-            </entry>
-          </row>
-          <row>
-            <entry><literal>package</literal></entry>
-            <entry>A single package name, e.g. <literal>art-clipart</literal>.</entry>
-          </row>
-        </tbody>
-      </tgroup>
-    </informaltable>
-    <para>
-      This method typically emits
-      <literal>Error</literal> and
-      <literal>Package</literal>.
-    </para>
-    <para>
-      <literal>Package</literal> enumerated types should be
-      <literal>available</literal> or <literal>installed</literal>.
-    </para>
-  </sect1>
-
-  <sect1 id="methods-get-update-detail">
-    <title>Get Update Detail</title>
-    <para>
-      GetUpdateDetail should return details about the update.
-    </para>
-    <para>
-      The arguments are:
-    </para>
-    <informaltable>
-      <tgroup cols="2">
-        <thead>
-          <row>
-            <entry>Option</entry>
-            <entry>Description</entry>
-          </row>
-        </thead>
-        <tbody>
-          <row>
-            <entry><literal>package_id</literal></entry>
-            <entry>A single, valid, package ID.</entry>
-          </row>
-        </tbody>
-      </tgroup>
-    </informaltable>
-    <para>
-      This method typically emits
-      <literal>UpdateDetail</literal> and
-      <literal>Error</literal>
-    </para>
-  </sect1>
-
-  <sect1 id="methods-get-requires">
-    <title>Get Requires</title>
-    <para>
-      GetRequires should return packages that depend on this package.
-      This is useful to know, as if <literal>package_id</literal> is being
-      removed, we can warn the user what else would be removed.
-    </para>
-    <para>
-      The arguments are:
-    </para>
-    <informaltable>
-      <tgroup cols="2">
-        <thead>
-          <row>
-            <entry>Option</entry>
-            <entry>Description</entry>
-          </row>
-        </thead>
-        <tbody>
-          <row>
-            <entry><literal>filter</literal></entry>
-            <entry>
-              A correct filter, e.g. <literal>none</literal> or
-              <literal>installed;</literal>
-            </entry>
-          </row>
-          <row>
-            <entry><literal>package_id</literal></entry>
-            <entry>A single, valid, package ID.</entry>
-          </row>
-          <row>
-            <entry><literal>recursive</literal></entry>
-            <entry>
-              Either <literal>true</literal> or <literal>false</literal>. If yes then the requirements should be
-              returned for all packages returned.
-              This means if gnome-power-manager depends on NetworkManager
-              and NetworkManager depends on HAL, then GetRequires on
-              HAL should return both gnome-power-manager and NetworkManager.
-            </entry>
-          </row>
-        </tbody>
-      </tgroup>
-    </informaltable>
-    <para>
-      This method typically emits
-      <literal>Progress</literal>,
-      <literal>Status</literal> and
-      <literal>Error</literal> and
-      <literal>Package</literal>.
-    </para>
-    <para>
-      <literal>Package</literal> enumerated types should be
-      <literal>available</literal> or <literal>installed</literal>.
-    </para>
-  </sect1>
-
-  <sect1 id="methods-get-details">
-    <title>Get Details</title>
-    <para>
-      GetDetails should return all the details about a specific
-      <literal>package_id</literal>.
-    </para>
-    <para>
-      The arguments are:
-    </para>
-    <informaltable>
-      <tgroup cols="2">
-        <thead>
-          <row>
-            <entry>Option</entry>
-            <entry>Description</entry>
-          </row>
-        </thead>
-        <tbody>
-          <row>
-            <entry><literal>package_id</literal></entry>
-            <entry>A single, valid, package ID.</entry>
-          </row>
-        </tbody>
-      </tgroup>
-    </informaltable>
-    <para>
-      This method typically emits
-      <literal>Progress</literal>,
-      <literal>Status</literal> and
-      <literal>Error</literal> and
-      <literal>Details</literal>.
-    </para>
-  </sect1>
-
-  <sect1 id="methods-get-files">
-    <title>Get Files</title>
-    <para>
-      GetFiles should return the file list of that
-      <literal>package_id</literal>.
-    </para>
-    <para>
-      The arguments are:
-    </para>
-    <informaltable>
-      <tgroup cols="2">
-        <thead>
-          <row>
-            <entry>Option</entry>
-            <entry>Description</entry>
-          </row>
-        </thead>
-        <tbody>
-          <row>
-            <entry><literal>package_id</literal></entry>
-            <entry>A single, valid, package ID.</entry>
-          </row>
-        </tbody>
-      </tgroup>
-    </informaltable>
-    <para>
-      This method typically emits
-      <literal>Progress</literal>,
-      <literal>Status</literal> and
-      <literal>Error</literal> and
-      <literal>Files</literal>.
-    </para>
-  </sect1>
-
-  <sect1 id="methods-update">
-    <title>Update Packages</title>
-    <para>
-      The installer should always update extra packages automatically.
-    </para>
-    <para>
-      The arguments are:
-    </para>
-    <informaltable>
-      <tgroup cols="2">
-        <thead>
-          <row>
-            <entry>Option</entry>
-            <entry>Description</entry>
-          </row>
-        </thead>
-        <tbody>
-          <row>
-            <entry><literal>package_ids</literal></entry>
-            <entry>An array of package IDs.</entry>
-          </row>
-        </tbody>
-      </tgroup>
-    </informaltable>
-    <para>
-      This should search for files.
-      This should allow an application to find out what package owns
-      a file on the system.
-    </para>
-    <para>
-      This method typically emits
-      <literal>Progress</literal>,
-      <literal>Status</literal> and
-      <literal>Error</literal> and
-      <literal>Package</literal>.
-    </para>
-  </sect1>
-
-  <sect1 id="methods-update-system">
-    <title>Update System</title>
-    <para>
-      The installer should update all the updateable packages on the system,
-      including automatically installing any new packages that are needed for
-      dependancies.
-    </para>
-    <para>
-      There are no arguments.
-    </para>
-    <para>
-      This method typically emits
-      <literal>Progress</literal>,
-      <literal>Error</literal> and
-      <literal>RequireRestart</literal> and
-      <literal>Package</literal>.
-    </para>
-    <para>
-      <literal>Package</literal> enumerated types should be
-      <literal>downloading</literal>,
-      <literal>updating</literal>,
-      <literal>installing</literal> or
-      <literal>removing</literal>.
-    </para>
-  </sect1>
-
-  <sect1 id="methods-get-updates">
-    <title>Get Updates</title>
-    <para>
-      This function should return a list of packages that are installed and
-      are upgradable.
-      It should only return the newest update for each installed package.
-    </para>
-    <para>
-      The arguments are:
-    </para>
-    <informaltable>
-      <tgroup cols="2">
-        <thead>
-          <row>
-            <entry>Option</entry>
-            <entry>Description</entry>
-          </row>
-        </thead>
-        <tbody>
-          <row>
-            <entry><literal>filter</literal></entry>
-            <entry>
-              A correct filter, e.g. <literal>none</literal> or
-              <literal>basename</literal>
-            </entry>
-          </row>
-        </tbody>
-      </tgroup>
-    </informaltable>
-    <para>
-      This method typically emits
-      <literal>Progress</literal>,
-      <literal>Error</literal> and
-      <literal>Package</literal>.
-    </para>
-    <para>
-      <literal>Package</literal> enumerated types should be
-      <literal>blocked</literal>,
-      <literal>low</literal>,
-      <literal>normal</literal>,
-      <literal>important</literal> or
-      <literal>security</literal>.
-    </para>
-    <para>
-      The status <literal>blocked</literal> signifies the package cannot be
-      updated, probably due to other dependencies not being met.
-      This type allows the GUI tools to show to the user that an update
-      exists, but cannot be installed.
-      The reason for it not being installed should be put into the update
-      description when doing GetUpdateDetail.
-    </para>
-    <para>
-      A filter such as <literal>basename</literal> or <literal>gui</literal>
-      is also useful if you want to do filtering on the method to only show
-      the main packages rather than the complete list.
-      The complete list is available but specifying <literal>none</literal>
-      as the filter.
-      Using no filter which may be useful in advanced tools or when using
-      libpackagekit and searching for an update of a specific name.
-      Other filter types may be present, but can be safely ignored of the
-      backend does not support them.
-    </para>
-  </sect1>
-
-  <sect1 id="methods-refresh-cache">
-    <title>Refresh Cache</title>
-    <para>
-      There are no arguments.
-    </para>
-    <para>
-      This should fetch updated meta-data for all enabled repositories.
-      This operation should be only scheduled when the computer is idle as
-      the network connection will be very active, and will the computer will
-      have have non-trivial levels of hard disk and processor activity.
-      For these reasons, it should not be done automatically when on battery
-      power.
-    </para>
-    <para>
-      This method typically emits
-      <literal>Progress</literal>,
-      <literal>Error</literal> and
-      <literal>Package</literal>.
-    </para>
-  </sect1>
-
-  <sect1 id="methods-get-repo-list">
-    <title>Get Repo List</title>
-    <para>
-      Return the list of repositories used in the system.
-    </para>
-    <para>
-      The arguments are:
-    </para>
-    <informaltable>
-      <tgroup cols="2">
-        <thead>
-          <row>
-            <entry>Option</entry>
-            <entry>Description</entry>
-          </row>
-        </thead>
-        <tbody>
-          <row>
-            <entry><literal>filter</literal></entry>
-            <entry>
-              A correct filter, e.g. <literal>none</literal> or
-              <literal>~devel</literal>
-            </entry>
-          </row>
-        </tbody>
-      </tgroup>
-    </informaltable>
-    <para>
-      This method should emit
-      <literal>RepoDetail</literal>.
-    </para>
-  </sect1>
-
-  <sect1 id="methods-repo-enable">
-    <title>Repo Enable</title>
-    <para>
-      This enables the repository specified.
-    </para>
-    <para>
-      The arguments are:
-    </para>
-    <informaltable>
-      <tgroup cols="2">
-        <thead>
-          <row>
-            <entry>Option</entry>
-            <entry>Description</entry>
-          </row>
-        </thead>
-        <tbody>
-          <row>
-            <entry><literal>repo_id</literal></entry>
-            <entry>
-              A repository identifier, e.g.
-              <literal>fedora-development-debuginfo</literal>
-            </entry>
-          </row>
-          <row>
-            <entry><literal>enabled</literal></entry>
-            <entry>
-              <literal>true</literal> if enabled,
-              <literal>false</literal> if disabled.
-            </entry>
-          </row>
-        </tbody>
-      </tgroup>
-    </informaltable>
-  </sect1>
-
-  <sect1 id="methods-repo-set-data">
-    <title>Repo Set Data</title>
-    <para>
-      This sets a parameter for the repository specified.
-    </para>
-    <para>
-      The arguments are:
-    </para>
-    <informaltable>
-      <tgroup cols="2">
-        <thead>
-          <row>
-            <entry>Option</entry>
-            <entry>Description</entry>
-          </row>
-        </thead>
-        <tbody>
-          <row>
-            <entry><literal>repo_id</literal></entry>
-            <entry>
-              A repository identifier, e.g.
-              <literal>fedora-development-debuginfo</literal>
-            </entry>
-          </row>
-          <row>
-            <entry><literal>parameter</literal></entry>
-            <entry>
-              The backend specific value, e.g.
-              <literal>set-download-url</literal>.
-            </entry>
-          </row>
-          <row>
-            <entry><literal>value</literal></entry>
-            <entry>
-              The backend specific value, e.g.
-              <literal>http://foo.bar.org/baz</literal>.
-            </entry>
-          </row>
-        </tbody>
-      </tgroup>
-    </informaltable>
-  </sect1>
-
-</chapter>
-
diff --git a/docs/spec/pk-reference.xml b/docs/spec/pk-reference.xml
index 7a24c81..25245e4 100644
--- a/docs/spec/pk-reference.xml
+++ b/docs/spec/pk-reference.xml
@@ -31,8 +31,6 @@
   </bookinfo>
   <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="pk-introduction.xml" />
   <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="pk-concepts.xml" />
-  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="pk-methods.xml" />
-  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="pk-signals.xml" />
   <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="pk-backend-compiled.xml" />
   <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="pk-backend-spawn.xml" />
   <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="pk-backend-dbus.xml" />
diff --git a/docs/spec/pk-signals.xml b/docs/spec/pk-signals.xml
deleted file mode 100644
index 2970dda..0000000
--- a/docs/spec/pk-signals.xml
+++ /dev/null
@@ -1,523 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd">
-
-<chapter id="signals">
-  <title>Signals</title>
-
-  <para>
-    Signals used by the backends are as follows:
-  </para>
-  <sect1 id="signals-percentage">
-    <title>Progress</title>
-    <para>
-      This is optional.
-      Backends should send the percentage fields to 101 if the amount complete
-      cannot be calculated.
-    </para>
-    <informaltable>
-      <tgroup cols="2">
-        <thead>
-          <row>
-            <entry>Option</entry>
-            <entry>Description</entry>
-          </row>
-        </thead>
-        <tbody>
-          <row>
-            <entry><literal>percentage</literal></entry>
-            <entry>The percentage complete of the entire transaction</entry>
-          </row>
-          <row>
-            <entry><literal>subpercentage</literal></entry>
-            <entry>The subpercentage complete of the sub-transaction</entry>
-          </row>
-          <row>
-            <entry><literal>elapsed</literal></entry>
-            <entry>
-              The amount of time in seconds this transaction has been in the
-              running state
-            </entry>
-          </row>
-          <row>
-            <entry><literal>remaining</literal></entry>
-            <entry>
-              The amount of time in seconds this transaction will take to
-              complete. Zero is sent for unknown.
-            </entry>
-          </row>
-        </tbody>
-      </tgroup>
-    </informaltable>
-  </sect1>
-
-  <sect1 id="signals-error">
-    <title>Error</title>
-    <para>
-      Errors should only be send on fatal abortion.
-    </para>
-    <informaltable>
-      <tgroup cols="2">
-        <thead>
-          <row>
-            <entry>Option</entry>
-            <entry>Description</entry>
-          </row>
-        </thead>
-        <tbody>
-          <row>
-            <entry><literal>enum</literal></entry>
-            <entry>Enumerated type, e.g. <literal>no-network</literal>.</entry>
-          </row>
-          <row>
-            <entry><literal>description</literal></entry>
-            <entry>
-              Long description or error, e.g.
-              <literal>failed to connect to mytry.xml</literal>
-            </entry>
-          </row>
-        </tbody>
-      </tgroup>
-    </informaltable>
-  </sect1>
-
-  <sect1 id="signals-status">
-    <title>Status</title>
-    <para>
-      This is optional, but highly recommended.
-      It gives the GUI tools a chance to show a different icon to show what
-      stage the transaction is in, for instance, a downloading icon can be
-      shown whilst in the <literal>download</literal> state.
-    </para>
-    <informaltable>
-      <tgroup cols="2">
-        <thead>
-          <row>
-            <entry>Option</entry>
-            <entry>Description</entry>
-          </row>
-        </thead>
-        <tbody>
-          <row>
-            <entry><literal>status</literal></entry>
-            <entry>
-              One of "<literal>download</literal>",
-              "<literal>install</literal>",
-              "<literal>update</literal>",
-              "<literal>remove</literal>".
-            </entry>
-          </row>
-        </tbody>
-      </tgroup>
-    </informaltable>
-  </sect1>
-
-  <sect1 id="signals-requirerestart">
-    <title>RequireRestart</title>
-    <para>
-      This is optional, but highly recommended.
-    </para>
-    <para>
-      This can be sent as many times as needed by the backend script.
-      PackageKit will always choose the 'worst' method in the UI notification.
-    </para>
-    <informaltable>
-      <tgroup cols="2">
-        <thead>
-          <row>
-            <entry>Option</entry>
-            <entry>Description</entry>
-          </row>
-        </thead>
-        <tbody>
-          <row>
-            <entry><literal>type</literal></entry>
-            <entry>
-              One of "<literal>system</literal>",
-              "<literal>application</literal>",
-              "<literal>session</literal>".
-            </entry>
-          </row>
-          <row>
-            <entry><literal>detail</literal></entry>
-            <entry>Optional details about the restart</entry>
-          </row>
-        </tbody>
-      </tgroup>
-    </informaltable>
-  </sect1>
-
-  <sect1 id="signals-message">
-    <title>Message</title>
-    <para>
-      This allows the backend to queue up a message to be shown after the
-      transaction has completed.
-    </para>
-    <informaltable>
-      <tgroup cols="2">
-        <thead>
-          <row>
-            <entry>Option</entry>
-            <entry>Description</entry>
-          </row>
-        </thead>
-        <tbody>
-          <row>
-            <entry><literal>type</literal></entry>
-            <entry>
-              One of "<literal>warning</literal>",
-              "<literal>notice</literal>",
-              "<literal>daemon</literal>".
-            </entry>
-          </row>
-          <row>
-            <entry><literal>detail</literal></entry>
-            <entry>Required details about the message, non localised</entry>
-          </row>
-        </tbody>
-      </tgroup>
-    </informaltable>
-  </sect1>
-
-  <sect1 id="signals-package">
-    <title>Package</title>
-    <para>
-      If updating, as packages are updated then emit them to the screen.
-      This allows a summary to be presented after the transaction.
-    </para>
-    <para>
-      When returning results from a search always return
-      <literal>installed</literal> before <literal>available</literal> for
-      the same package name.
-    </para>
-    <informaltable>
-      <tgroup cols="2">
-        <thead>
-          <row>
-            <entry>Option</entry>
-            <entry>Description</entry>
-          </row>
-        </thead>
-        <tbody>
-          <row>
-            <entry><literal>info</literal></entry>
-            <entry>A valid <literal>info</literal> string enumerated type</entry>
-          </row>
-          <row>
-            <entry><literal>package_id</literal></entry>
-            <entry>A valid package ID string with as much data as known</entry>
-          </row>
-          <row>
-            <entry><literal>summary</literal></entry>
-            <entry>
-              The one line package summary, e.g. "Clipart for OpenOffice"
-            </entry>
-          </row>
-        </tbody>
-      </tgroup>
-    </informaltable>
-
-    <para>
-      The <literal>info</literal> enumerated type
-    </para>
-
-    <informaltable>
-      <tgroup cols="3">
-        <thead>
-          <row>
-            <entry>Situation</entry>
-            <entry>Value</entry>
-            <entry>Description</entry>
-          </row>
-        </thead>
-        <tbody>
-          <row>
-            <entry>Searching</entry>
-            <entry><literal>installed</literal></entry>
-            <entry>If installed</entry>
-          </row>
-          <row>
-            <entry></entry>
-            <entry><literal>available</literal></entry>
-            <entry>If available to install</entry>
-          </row>
-          <row>
-            <entry>Getting Updates</entry>
-            <entry><literal>low</literal></entry>
-            <entry>If update is of low severity</entry>
-          </row>
-          <row>
-            <entry></entry>
-            <entry><literal>normal</literal></entry>
-            <entry>If update is of normal severity</entry>
-          </row>
-          <row>
-            <entry></entry>
-            <entry><literal>important</literal></entry>
-            <entry>If update is very important</entry>
-          </row>
-          <row>
-            <entry></entry>
-            <entry><literal>security</literal></entry>
-            <entry>If the update is security sensitive</entry>
-          </row>
-          <row>
-            <entry>Installing/Updating/Removing</entry>
-            <entry><literal>downloading</literal></entry>
-            <entry>If we are downloading this package</entry>
-          </row>
-          <row>
-            <entry></entry>
-            <entry><literal>updating</literal></entry>
-            <entry>If we are updating this package</entry>
-          </row>
-          <row>
-            <entry></entry>
-            <entry><literal>installing</literal></entry>
-            <entry>If we are installing this package</entry>
-          </row>
-          <row>
-            <entry></entry>
-            <entry><literal>removing</literal></entry>
-            <entry>If we are removing this package</entry>
-          </row>
-          <row>
-            <entry>Otherwise</entry>
-            <entry><literal>unknown</literal></entry>
-            <entry>If we cannot use any other option</entry>
-          </row>
-        </tbody>
-      </tgroup>
-    </informaltable>
-
-  </sect1>
-
-  <sect1 id="signals-details">
-    <title>Details</title>
-    <informaltable>
-      <tgroup cols="2">
-        <thead>
-          <row>
-            <entry>Option</entry>
-            <entry>Description</entry>
-          </row>
-        </thead>
-        <tbody>
-          <row>
-            <entry><literal>package_id</literal></entry>
-            <entry>The package ID</entry>
-          </row>
-          <row>
-            <entry><literal>license</literal></entry>
-            <entry>
-              The license, e.g. "GPLv2+" or "proprietary".
-              If you need to add a EULA then do it like this:
-              "proprietary;By installing this software\nyou may kill a kitten."
-            </entry>
-          </row>
-          <row>
-            <entry><literal>group</literal></entry>
-            <entry>The enumerated package group description</entry>
-          </row>
-          <row>
-            <entry><literal>detail</literal></entry>
-            <entry>
-              The multi-line package description.
-              NOTE: Tabs may have to be stripped from the description to
-              avoid being split.
-            </entry>
-          </row>
-          <row>
-            <entry><literal>url</literal></entry>
-            <entry>The upstream project homepage</entry>
-          </row>
-          <row>
-            <entry><literal>size</literal></entry>
-            <entry>
-              The size of the package in bytes. This should be the
-              size of the entire package file, not the size of the
-              files installed on the system.
-            </entry>
-          </row>
-        </tbody>
-      </tgroup>
-    </informaltable>
-  </sect1>
-
-  <sect1 id="signals-update-detail">
-    <title>UpdateDetail</title>
-    <informaltable>
-      <tgroup cols="2">
-        <thead>
-          <row>
-            <entry>Option</entry>
-            <entry>Description</entry>
-          </row>
-        </thead>
-        <tbody>
-          <row>
-            <entry><literal>package_id</literal></entry>
-            <entry>The package ID</entry>
-          </row>
-          <row>
-            <entry><literal>updates</literal></entry>
-            <entry>
-              A list of package_id's that are to be updated, seporated by <literal>^</literal>.
-              This odd delimited was chosen as <literal>\t</literal> is already being used in the
-              spawned backends, and <literal>^</literal> is a banned character in a package_id.
-              This will change in 0.3.x where <literal>updates</literal> will be a proper string
-              array field.
-            </entry>
-          </row>
-          <row>
-            <entry><literal>obsoletes</literal></entry>
-            <entry>
-              A list of package_id's that are to be obsoleted, seporated by <literal>^</literal>
-              This will change in 0.3.x where <literal>obsoletes</literal> will be a proper string
-              array field.
-            </entry>
-          </row>
-          <row>
-            <entry><literal>vendor_url</literal></entry>
-            <entry>
-              A URL with more details on the update, e.g. a page with more
-              information on the update.
-              The format of this command should be
-              <literal>http://www.foo.org/page.html?4567;Update to SELinux</literal>
-            </entry>
-          </row>
-          <row>
-            <entry><literal>bugzilla_url</literal></entry>
-            <entry>
-              A bugzilla URL with more details on the update.
-              If no URL is available then this field should be left empty.
-            </entry>
-          </row>
-          <row>
-            <entry><literal>cve_url</literal></entry>
-            <entry>
-              A CVE URL with more details on the security advisory
-            </entry>
-          </row>
-          <row>
-            <entry><literal>restart_enum</literal></entry>
-            <entry>A valid restart type, e.g. "system"</entry>
-          </row>
-          <row>
-            <entry><literal>update_text</literal></entry>
-            <entry>
-              The update text describing the update in a non-localised way.
-              Newlines should be converted to ";" before printed.
-            </entry>
-          </row>
-        </tbody>
-      </tgroup>
-    </informaltable>
-  </sect1>
-
-  <sect1 id="signals-repo-signature-required">
-    <title>RepoSignatureRequired</title>
-    <para>
-      Some backends support repositories which use a cryptographic
-      signature, such as GPG. If a package cannot be installed
-      because it is signed with a key that has not been verified,
-      this signal is generated so the user can choose to accept or
-      decline the key.
-    </para>
-    <para>
-      This signal includes information that can be used to verify
-      that the key should be trusted, such as a URL for the company
-      or person who owns the key, the key's ID, the userid of
-      the key creator, and the date the key was generated.
-    </para>
-    <informaltable>
-      <tgroup cols="2">
-        <thead>
-          <row>
-            <entry>Option</entry>
-            <entry>Description</entry>
-          </row>
-        </thead>
-        <tbody>
-          <row>
-            <entry><literal>package_id</literal></entry>
-            <entry>A package ID for the package that is trying to be installed</entry>
-          </row>
-          <row>
-            <entry><literal>repository_name</literal></entry>
-            <entry>
-              The name of the repository associated with the provided key
-            </entry>
-          </row>
-          <row>
-            <entry><literal>key_url</literal></entry>
-            <entry>The URL provided with the key.</entry>
-          </row>
-          <row>
-            <entry><literal>key_userid</literal></entry>
-            <entry>The user id associated with the key</entry>
-          </row>
-          <row>
-            <entry><literal>key_id</literal></entry>
-            <entry>A unique identifier for the key</entry>
-          </row>
-          <row>
-            <entry><literal>key_fingerprint</literal></entry>
-            <entry>The hashed fingerprint of the key</entry>
-          </row>
-          <row>
-            <entry><literal>key_timestamp</literal></entry>
-            <entry>The date the key was created</entry>
-          </row>
-          <row>
-            <entry><literal>type</literal></entry>
-            <entry>The type of signature used. 'GPG', for example.</entry>
-          </row>
-        </tbody>
-      </tgroup>
-    </informaltable>
-  </sect1>
-
-  <sect1 id="signals-eula-required">
-    <title>EulaRequired</title>
-    <para>
-      Some backends support EULAs, which have to be agreed to before the install can proceed.
-    </para>
-    <informaltable>
-      <tgroup cols="2">
-        <thead>
-          <row>
-            <entry>Option</entry>
-            <entry>Description</entry>
-          </row>
-        </thead>
-        <tbody>
-          <row>
-            <entry><literal>eula_id</literal></entry>
-            <entry>
-              The <literal>eula_id</literal> which identifies the EULA - this is provided
-              so that if a specific EULA has previously agreed to a EULA from Acme Corp it is
-              not asked again.
-              An example <literal>eula_id</literal>'s is <literal>vmware5_single_user</literal>.
-            </entry>
-          </row>
-          <row>
-            <entry><literal>package_id</literal></entry>
-            <entry>A package ID for the package that is trying to be installed</entry>
-          </row>
-          <row>
-            <entry><literal>vendor_name</literal></entry>
-            <entry>
-              The vendor that is providing the EULA.
-            </entry>
-          </row>
-          <row>
-            <entry><literal>license_agreement</literal></entry>
-            <entry>The full text EULA.</entry>
-          </row>
-        </tbody>
-      </tgroup>
-    </informaltable>
-  </sect1>
-
-</chapter>
-
commit 7541d60c23a66a93b123281930fd6ceaf0f430ce
Author: Richard Hughes <richard at hughsie.com>
Date:   Fri Jun 20 15:19:04 2008 +0100

    trivial: add an extra file to the content files

diff --git a/docs/api/Makefile.am b/docs/api/Makefile.am
index 28ba3e4..02cf1f8 100644
--- a/docs/api/Makefile.am
+++ b/docs/api/Makefile.am
@@ -50,6 +50,7 @@ HTML_IMAGES=
 content_files =						\
 	version.xml					\
 	dbus/pk-interface.ref.xml			\
+	dbus/pk-interface-transaction.ref.xml		\
 	$(NULL)
 
 # SGML files where gtk-doc abbrevations (#GtkWidget) are expanded
commit 0591ed604ca161713ecfa8b6483a24d740051ce0
Author: Richard Hughes <richard at hughsie.com>
Date:   Fri Jun 20 15:14:58 2008 +0100

    add documentation for the signals

diff --git a/src/pk-interface-transaction.xml b/src/pk-interface-transaction.xml
index afd9cf3..dd952a3 100644
--- a/src/pk-interface-transaction.xml
+++ b/src/pk-interface-transaction.xml
@@ -1211,7 +1211,8 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            This signal xxx
+            This signal is sent when the backend decides that the transaction can no longer be
+            cancelled, or is now able to be cancelled.
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -1219,7 +1220,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              If the backend is in a cancelable state.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1231,7 +1232,7 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            This signal xxx
+            This signal is emitted when the session program that started the transaction exits.
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -1239,7 +1240,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              If the caller is active, usually FALSE.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1251,7 +1252,7 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            This signal xxx
+            This signal allows the backend to convey more details about the package.
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -1259,7 +1260,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              The package ID
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1268,7 +1269,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              The license, e.g. <literal>GPLv2+</literal> or <literal>proprietary</literal>.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1277,7 +1278,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              The enumerated package group description
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1286,7 +1287,8 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              The multi-line package description.
+              NOTE: Tabs may have to be stripped from the description to avoid being split.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1295,7 +1297,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              The upstream project homepage
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1304,7 +1306,8 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              The size of the package in bytes. This should be the size of the entire package file,
+              not the size of the files installed on the system.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1316,7 +1319,10 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            This signal xxx
+            This signal is used to report errors back to the session program.
+          </doc:para>
+          <doc:para>
+            Errors should only be send on fatal abort.
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -1324,7 +1330,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              Enumerated type, e.g. <literal>no-network</literal>.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1333,7 +1339,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              Long description or error, e.g. <literal>failed to connect to mytry.xml</literal>
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1345,7 +1351,7 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            This signal xxx
+            This signal is used to push file lists from the backend to the session.
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -1353,7 +1359,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              The Package ID that called the method.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1362,7 +1368,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              The file list, with each file seporated with <literal>;</literal>.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1374,15 +1380,15 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            This signal xxx
+            This signal is used to signal that the transaction has finished.
           </doc:para>
         </doc:description>
       </doc:doc>
-      <arg type="s" name="status" direction="out">
+      <arg type="s" name="exit" direction="out">
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              The PkExitEnum describing the exit status of the transaction.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1391,7 +1397,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              The amount of time in ms that the transaction ran for.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1403,15 +1409,20 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            This signal xxx
+            This signal is sent when the backend wants to send a message to the session.
+          </doc:para>
+          <doc:para>
+            This allows the backend to queue up a message to be shown after the transaction has
+            completed.
           </doc:para>
         </doc:description>
       </doc:doc>
-      <arg type="s" name="message" direction="out">
+      <arg type="s" name="type" direction="out">
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              One of <literal>warning</literal>, <literal>notice</literal>, or
+              <literal>daemon</literal>.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1420,7 +1431,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              Required details about the message, non-localised.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1432,7 +1443,16 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            This signal xxx
+            This signal allows the backend to communicate packages to the session.
+          </doc:para>
+          <doc:para>
+            If updating, as packages are updated then emit them to the screen.
+            This allows a summary to be presented after the transaction.
+          </doc:para>
+          <doc:para>
+            When returning results from a search always return
+            <literal>installed</literal> before <literal>available</literal> for
+            the same package name.
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -1440,7 +1460,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              A valid <literal>info</literal> string enumerated type
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1449,7 +1469,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              A valid package ID string with as much data as known
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1458,7 +1478,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              The one line package summary, e.g. Clipart for OpenOffice
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1470,7 +1490,12 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            This signal xxx
+            This signal describes the completion of the transaction.
+          </doc:para>
+          <doc:para>
+            This is optional.
+            Backends should send the percentage fields to 101 if the amount complete
+            cannot be calculated.
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -1478,7 +1503,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              The percentage complete of the whole transaction.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1487,7 +1512,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              The percentage complete of the individual task, for example, downloading.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1496,7 +1521,8 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              The amount of time in seconds this transaction has been in the
+              running state
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1505,7 +1531,8 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              The amount of time in seconds this transaction will take to
+              complete. Zero is sent for unknown.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1517,7 +1544,7 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            This signal xxx
+            This signal describes a repository on the system.
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -1525,7 +1552,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              The repository ID.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1534,7 +1561,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              A description of the repository.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1543,7 +1570,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              If the repository is enabled and in use.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1555,7 +1582,21 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            This signal xxx
+            This signal is emitted when a transaction is not possible due to a missing security
+            certificate.
+          </doc:para>
+          <doc:para>
+            Some backends support repositories which use a cryptographic
+            signature, such as GPG. If a package cannot be installed
+            because it is signed with a key that has not been verified,
+            this signal is generated so the user can choose to accept or
+            decline the key.
+          </doc:para>
+          <doc:para>
+            This signal includes information that can be used to verify
+            that the key should be trusted, such as a URL for the company
+            or person who owns the key, the key's ID, the userid of
+            the key creator, and the date the key was generated.
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -1563,7 +1604,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              A package ID for the package that is trying to be installed
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1572,7 +1613,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              The name of the repository associated with the provided key.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1581,7 +1622,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              The URL provided with the key.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1590,7 +1631,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              The user id associated with the key.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1599,7 +1640,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              A unique identifier for the key.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1608,7 +1649,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              The hashed fingerprint of the key.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1617,7 +1658,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              The date the key was created.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1626,7 +1667,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              The type of signature used. <literal>gpg</literal>, for example.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1638,7 +1679,11 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            This signal xxx
+            This signal is emitted when a transaction is not possible due to a EULA that needs to
+            be agreed to at install time.
+          </doc:para>
+          <doc:para>
+            Some backends support EULAs, which have to be agreed to before the install can proceed.
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -1646,7 +1691,10 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              The <literal>eula_id</literal> which identifies the EULA - this is provided
+              so that if a specific EULA has previously agreed to a EULA from Acme Corp it is
+              not asked again.
+              An example <literal>eula_id</literal>'s is <literal>vmware5_single_user</literal>.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1655,7 +1703,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              A package ID for the package that is trying to be installed.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1664,7 +1712,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              The vendor that is providing the EULA.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1673,7 +1721,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              The full text EULA.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1685,7 +1733,15 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            This signal xxx
+            This signal is sent when the session program should notify the user that a restart is
+            required.
+          </doc:para>
+          <doc:para>
+            This is optional, but highly recommended.
+          </doc:para>
+          <doc:para>
+            This can be sent as many times as needed by the backend script.
+            PackageKit will always choose the 'worst' method in the UI notification.
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -1693,7 +1749,8 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              One of <literal>system</literal>, <literal>application</literal> or
+              <literal>session</literal>.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1702,7 +1759,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              Optional details about the restart
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1714,7 +1771,13 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            This signal xxx
+            This signal is sent when the status of the transaction has changed.
+          </doc:para>
+          <doc:para>
+            This is optional, but highly recommended.
+            It gives the GUI tools a chance to show a different icon to show what stage the
+            transaction is in, for instance, a downloading icon can be shown whilst in the
+            <literal>download</literal> state.
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -1722,7 +1785,8 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              One of <literal>download</literal>, <literal>install</literal>,
+              <literal>update</literal> or <literal>remove</literal>.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1734,7 +1798,7 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            This signal xxx
+            This signal is sent when more details are required about a specific transaction.
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -1742,7 +1806,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              The transaction ID of the old transaction.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1751,7 +1815,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              The timespec of the old transaction.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1760,7 +1824,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              If the transaction succeeded.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1769,7 +1833,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              The role enumerated type.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1778,7 +1842,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              The duration of the transaction in seconds.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1787,7 +1851,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              Any data associated with the transaction.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1799,7 +1863,7 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            This signal xxx
+            This signal is sent when more details are required about a specific update.
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -1807,7 +1871,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              The package ID
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1816,7 +1880,11 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              A list of package_id's that are to be updated, seporated by <literal>^</literal>.
+              This odd delimited was chosen as <literal>\t</literal> is already being used in the
+              spawned backends, and <literal>^</literal> is a banned character in a package_id.
+              This will change in 0.3.x where <literal>updates</literal> will be a proper string
+              array field.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1825,7 +1893,9 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              A list of package_id's that are to be obsoleted, seporated by <literal>^</literal>
+              This will change in 0.3.x where <literal>obsoletes</literal> will be a proper string
+              array field.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1834,7 +1904,10 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              A URL with more details on the update, e.g. a page with more
+              information on the update.
+              The format of this command should be
+              <literal>http://www.foo.org/page.html?4567;Update to SELinux</literal>
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1843,7 +1916,8 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              A bugzilla URL with more details on the update.
+              If no URL is available then this field should be left empty.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1852,7 +1926,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              A CVE URL with more details on the security advisory.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1861,7 +1935,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              A valid restart type, e.g. <literal>system</literal>.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1870,7 +1944,8 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              The update text describing the update in a non-localised way.
+              Newlines should be converted to <literal>;</literal> before printed.
             </doc:para>
           </doc:summary>
         </doc:doc>
commit 2b01c36f146c1d4b50dd96b6cf2eea3baf6200fc
Author: Richard Hughes <richard at hughsie.com>
Date:   Fri Jun 20 14:27:41 2008 +0100

    flesh out some of the method descriptions

diff --git a/src/pk-interface-transaction.xml b/src/pk-interface-transaction.xml
index 4b052da..afd9cf3 100644
--- a/src/pk-interface-transaction.xml
+++ b/src/pk-interface-transaction.xml
@@ -8,7 +8,7 @@
     <doc:doc>
       <doc:description>
         <doc:para>
-          The root interface is used for interacting with the daemon.
+          The transaction interface is used for interacting with indervidual transactions.
         </doc:para>
       </doc:description>
     </doc:doc>
@@ -19,7 +19,7 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            This allows the user to accept a end user licence agreement.
+            This method allows the user to accept a end user licence agreement.
           </doc:para>
         </doc:description>
         <doc:permission>Callers need the org.freedesktop.packagekit.accept-eula</doc:permission>
@@ -40,7 +40,7 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            Cancel a transaction that is already running
+            This method cancels a transaction that is already running
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -72,7 +72,18 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            This method returns packages that this package depends on.
+          </doc:para>
+          <doc:para>
+            This method typically emits
+            <literal>Progress</literal>,
+            <literal>Status</literal> and
+            <literal>Error</literal> and
+            <literal>Package</literal>.
+          </doc:para>
+          <doc:para>
+            <literal>Package</literal> enumerated types should be
+            <literal>available</literal> or <literal>installed</literal>.
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -80,7 +91,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              A correct filter, e.g. <literal>none</literal> or <literal>installed;~devel</literal>
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -89,7 +100,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              A single Package ID.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -98,7 +109,11 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              Either <literal>true</literal> or <literal>false</literal>. If yes then the requirements should be
+              returned for all packages returned.
+              This means if gnome-power-manager depends on NetworkManager
+              and NetworkManager depends on HAL, then GetDepends on
+              gnome-power-manager should return both HAL and NetworkManager.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -111,7 +126,15 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            This method should return all the details about a specific
+            <literal>package_id</literal>.
+          </doc:para>
+          <doc:para>
+            This method typically emits
+            <literal>Progress</literal>,
+            <literal>Status</literal> and
+            <literal>Error</literal> and
+            <literal>Details</literal>.
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -119,7 +142,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              A single Package ID.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -132,7 +155,14 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            This method should return the file list of the <literal>package_id</literal>.
+          </doc:para>
+          <doc:para>
+            This method typically emits
+            <literal>Progress</literal>,
+            <literal>Status</literal> and
+            <literal>Error</literal> and
+            <literal>Files</literal>.
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -140,7 +170,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              A single Package ID.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -152,7 +182,7 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            This method allows a client to view details for old transactions.
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -160,7 +190,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              The number of past transactions, or 0 for all known transactions.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -172,7 +202,9 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            This method emits the package that was last emmitted from the daemon.
+            This allows any GUI that is monitoring transactions to accurately reflect the current
+            state of the transaction at startup.
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -180,7 +212,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              The last package_id.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -193,7 +225,17 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            This method returns all the packages without a search term.
+          </doc:para>
+          <doc:para>
+            This method typically emits
+            <literal>Progress</literal>,
+            <literal>Error</literal> and
+            <literal>Package</literal>.
+          </doc:para>
+          <doc:para>
+            <literal>Package</literal> enumerated types should be
+            <literal>available</literal> or <literal>installed</literal>.
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -201,7 +243,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              A correct filter, e.g. <literal>none</literal> or <literal>installed;~devel</literal>
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -213,7 +255,7 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            This method gets the progress completion of the daemon.
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -221,7 +263,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              The percentage complete of the whole transaction.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -230,7 +272,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              The percentage complete of the individual task, for example, downloading.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -239,7 +281,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              The amount of time elapsed during the transaction.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -248,7 +290,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              The estimated remamining time of the transaction, or 0 if not known.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -261,7 +303,10 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            This method returns the list of repositories used in the system.
+          </doc:para>
+          <doc:para>
+            This method should emit <literal>RepoDetail</literal>.
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -269,7 +314,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              A correct filter, e.g. <literal>none</literal> or <literal>installed;~devel</literal>
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -282,7 +327,20 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            This method returns packages that depend on this package.
+            This is useful to know, as if <literal>package_id</literal> is being
+            removed, we can warn the user what else would be removed.
+          </doc:para>
+          <doc:para>
+            This method typically emits
+            <literal>Progress</literal>,
+            <literal>Status</literal> and
+            <literal>Error</literal> and
+            <literal>Package</literal>.
+          </doc:para>
+          <doc:para>
+            <literal>Package</literal> enumerated types should be
+            <literal>available</literal> or <literal>installed</literal>.
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -290,7 +348,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              A correct filter, e.g. <literal>none</literal> or <literal>installed;~devel</literal>
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -299,7 +357,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              A single Package ID.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -308,7 +366,11 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              Either <literal>true</literal> or <literal>false</literal>. If yes then the requirements should be
+              returned for all packages returned.
+              This means if gnome-power-manager depends on NetworkManager
+              and NetworkManager depends on HAL, then GetRequires on
+              HAL should return both gnome-power-manager and NetworkManager.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -317,27 +379,27 @@
 
     <!--*****************************************************************************************-->
     <method name="GetRole">
-      <arg type="s" name="status" direction="out">
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            This method returns the current role of the transaction.
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="s" name="role" direction="out">
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              The PkRoleEnum in text form.
             </doc:para>
           </doc:summary>
         </doc:doc>
       </arg>
-      <doc:doc>
-        <doc:description>
-          <doc:para>
-            xxx
-          </doc:para>
-        </doc:description>
-      </doc:doc>
       <arg type="s" name="package_id" direction="out">
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              The original package_id that was used to start the transaction.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -346,22 +408,22 @@
 
     <!--*****************************************************************************************-->
     <method name="GetStatus">
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            This method returns the status of the transaction.
+          </doc:para>
+        </doc:description>
+      </doc:doc>
       <arg type="s" name="status" direction="out">
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              The PkStatusEnum in string form.
             </doc:para>
           </doc:summary>
         </doc:doc>
       </arg>
-      <doc:doc>
-        <doc:description>
-          <doc:para>
-            xxx
-          </doc:para>
-        </doc:description>
-      </doc:doc>
     </method>
 
     <!--*****************************************************************************************-->
@@ -370,7 +432,12 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            This method returns details about a specific update.
+          </doc:para>
+          <doc:para>
+            This method typically emits
+            <literal>UpdateDetail</literal> and
+            <literal>Error</literal>
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -378,7 +445,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              A single Package ID.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -391,7 +458,41 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            This method should return a list of packages that are installed and are upgradable.
+            It should only return the newest update for each installed package.
+          </doc:para>
+          <doc:para>
+            This method typically emits
+            <literal>Progress</literal>,
+            <literal>Error</literal> and
+            <literal>Package</literal>.
+          </doc:para>
+          <doc:para>
+            <literal>Package</literal> enumerated types should be
+            <literal>blocked</literal>,
+            <literal>low</literal>,
+            <literal>normal</literal>,
+            <literal>important</literal> or
+            <literal>security</literal>.
+          </doc:para>
+          <doc:para>
+            The status <literal>blocked</literal> signifies the package cannot be
+            updated, probably due to other dependencies not being met.
+            This type allows the GUI tools to show to the user that an update
+            exists, but cannot be installed.
+            The reason for it not being installed should be put into the update
+            description when doing GetUpdateDetail.
+          </doc:para>
+          <doc:para>
+            A filter such as <literal>basename</literal> or <literal>gui</literal>
+            is also useful if you want to do filtering on the method to only show
+            the main packages rather than the complete list.
+            The complete list is available but specifying <literal>none</literal>
+            as the filter.
+            Using no filter which may be useful in advanced tools or when using
+            libpackagekit and searching for an update of a specific name.
+            Other filter types may be present, but can be safely ignored of the
+            backend does not support them.
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -399,7 +500,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              A correct filter, e.g. <literal>none</literal> or <literal>installed;~devel</literal>
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -412,7 +513,24 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            This method installs local package files onto the local system.
+          </doc:para>
+          <doc:para>
+            The installer should always install extra dependant packages automatically.
+          </doc:para>
+          <doc:para>
+            This method typically emits
+            <literal>Progress</literal>,
+            <literal>Status</literal> and
+            <literal>Error</literal> and
+            <literal>Package</literal>.
+          </doc:para>
+          <doc:para>
+            <literal>Package</literal> enumerated types should be
+            <literal>downloading</literal>,
+            <literal>updating</literal>,
+            <literal>installing</literal> or
+            <literal>removing</literal>.
           </doc:para>
         </doc:description>
         <doc:permission>Callers need the org.freedesktop.packagekit.localinstall-untrusted</doc:permission>
@@ -421,7 +539,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              If the package is trusted, i.e. if it has a pre-trusted security signature.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -430,7 +548,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              An array of full path and filenames to packages.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -443,7 +561,26 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            This method installs new packages on the local system.
+          </doc:para>
+          <doc:para>
+            The installer should always install extra packages automatically
+            as the use could call GetDepends prior to the install if a confirmation
+            is required in the UI.
+          </doc:para>
+          <doc:para>
+            This method typically emits
+            <literal>Progress</literal>,
+            <literal>Status</literal> and
+            <literal>Error</literal> and
+            <literal>Package</literal>.
+          </doc:para>
+          <doc:para>
+            <literal>Package</literal> enumerated types should be
+            <literal>downloading</literal>,
+            <literal>updating</literal>,
+            <literal>installing</literal> or
+            <literal>removing</literal>.
           </doc:para>
         </doc:description>
         <doc:permission>Callers need the org.freedesktop.packagekit.install</doc:permission>
@@ -452,7 +589,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              An array of package IDs.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -465,7 +602,7 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            This method allows us to install new security keys.
           </doc:para>
         </doc:description>
         <doc:permission>Callers need the org.freedesktop.packagekit.install-signature</doc:permission>
@@ -474,7 +611,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              A key type, e.g. <literal>gpg</literal>
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -483,7 +620,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              A key ID, e.g. <literal>BB7576AC</literal>
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -492,7 +629,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              A PackageID for the package that the user is trying to install
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -504,7 +641,10 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            This method allows us to find if the original caller of the method is still connected
+            to the session bus.
+            This is usually an indication that the client can handle it's own error handling and
+            EULA callbacks rather than another program taking over.
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -512,7 +652,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              If the client is still connected.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -525,7 +665,18 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            This method should fetch updated meta-data for all enabled repositories.
+            This operation should be only scheduled when the computer is idle as
+            the network connection will be very active, and will the computer will
+            have have non-trivial levels of hard disk and processor activity.
+            For these reasons, it should not be done automatically when on battery
+            power.
+          </doc:para>
+          <doc:para>
+            This method typically emits
+            <literal>Progress</literal>,
+            <literal>Error</literal> and
+            <literal>Package</literal>.
           </doc:para>
         </doc:description>
         <doc:permission>Callers need the org.freedesktop.packagekit.refresh-cache</doc:permission>
@@ -534,7 +685,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              If the caches should be cleaned and reloaded even if there is valid, up to date data.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -547,7 +698,21 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            This method removes packages from the local system.
+          </doc:para>
+          <doc:para>
+            This method typically emits
+            <literal>Progress</literal>,
+            <literal>Status</literal> and
+            <literal>Error</literal> and
+            <literal>Package</literal>.
+          </doc:para>
+          <doc:para>
+            <literal>Package</literal> enumerated types should be
+            <literal>downloading</literal>,
+            <literal>updating</literal>,
+            <literal>installing</literal> or
+            <literal>removing</literal>.
           </doc:para>
         </doc:description>
         <doc:permission>Callers need the org.freedesktop.packagekit.remove</doc:permission>
@@ -556,7 +721,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              An array of package IDs.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -565,7 +730,10 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              Either <literal>true</literal> or <literal>false</literal>.
+              If <literal>true</literal> allow other packages to be removed with the package,
+              but <literal>false</literal> should cause the script to abort if other packages
+              are dependant on the package.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -574,7 +742,14 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              Either <literal>true</literal> or <literal>false</literal>.
+              This option is only really interesting on embedded devices with a limited amount of
+              flash storage.
+              It suggests to the packagekit backend that dependencies installed at the same time as
+              the package should also be removed if they are not required by anything else.
+              For instance, if you install OpenOffice, it might download libneon as a dependency.
+              When <literal>auto_remove</literal> is set to true, and you remove OpenOffice then
+              libneon will also get removed automatically.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -587,7 +762,7 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            This method enables the repository specified.
           </doc:para>
         </doc:description>
         <doc:permission>Callers need the org.freedesktop.packagekit.repo-change</doc:permission>
@@ -596,7 +771,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              A repository identifier, e.g. <literal>fedora-development-debuginfo</literal>
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -605,7 +780,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              <literal>true</literal> if enabled, <literal>false</literal> if disabled.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -618,7 +793,7 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            This method allows arbitary data to be passed to the repository handler.
           </doc:para>
         </doc:description>
         <doc:permission>Callers need the org.freedesktop.packagekit.repo-change</doc:permission>
@@ -627,7 +802,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              A repository identifier, e.g. <literal>fedora-development-debuginfo</literal>
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -636,7 +811,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              The backend specific value, e.g. <literal>set-download-url</literal>.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -645,7 +820,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              The backend specific value, e.g. <literal>http://foo.bar.org/baz</literal>.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -658,7 +833,17 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            This method turns a single package name into a package_id suitable for the
+            other methods.
+          </doc:para>
+          <doc:para>
+            This method typically emits
+            <literal>Error</literal> and
+            <literal>Package</literal>.
+          </doc:para>
+          <doc:para>
+            <literal>Package</literal> enumerated types should be
+            <literal>available</literal> or <literal>installed</literal>.
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -666,7 +851,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              A correct filter, e.g. <literal>none</literal> or <literal>installed;~devel</literal>
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -675,7 +860,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              A single package name, e.g. <literal>scribus-clipart</literal>.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -688,7 +873,7 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            This method rolls back the package database to a previous transaction.
           </doc:para>
         </doc:description>
         <doc:permission>Callers need the org.freedesktop.packagekit.rollback</doc:permission>
@@ -697,7 +882,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              A valid transaction ID.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -710,15 +895,30 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            This method allows deeper searching than SearchName().
           </doc:para>
-        </doc:description>
+          <doc:para>
+            Do not refresh the package cache. This should be fast.
+            This is very similar to search-name.
+            This should search as much data as possible, including, if possible
+            repo names, package summaries, descriptions and URLs.
+          </doc:para>
+          <doc:para>
+            This method typically emits
+            <literal>Progress</literal>,
+            <literal>Error</literal> and
+            <literal>Package</literal>.
+          </doc:para>
+          <doc:para>
+            <literal>Package</literal> enumerated types should be
+            <literal>available</literal> or <literal>installed</literal>.
+          </doc:para>        </doc:description>
       </doc:doc>
       <arg type="s" name="filter" direction="in">
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              A correct filter, e.g. <literal>none</literal> or <literal>installed;~devel</literal>
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -727,7 +927,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              A single word search term with no wildcard chars.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -740,15 +940,29 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            This method searches for files on the local system and files in available packages.
           </doc:para>
-        </doc:description>
+          <doc:para>
+            This should search for files.
+            This should allow an application to find out what package owns
+            a file on the system.
+          </doc:para>
+          <doc:para>
+            This method typically emits
+            <literal>Progress</literal>,
+            <literal>Error</literal> and
+            <literal>Package</literal>.
+          </doc:para>
+          <doc:para>
+            <literal>Package</literal> enumerated types should be
+            <literal>available</literal> or <literal>installed</literal>.
+          </doc:para>        </doc:description>
       </doc:doc>
       <arg type="s" name="filter" direction="in">
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              A correct filter, e.g. <literal>none</literal> or <literal>installed;~devel</literal>
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -757,7 +971,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              A single local path on the system
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -770,7 +984,20 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            This method returns packages from a given group enumerated type.
+          </doc:para>
+          <doc:para>
+            Do not refresh the package cache. This should be fast.
+          </doc:para>
+          <doc:para>
+            This method typically emits
+            <literal>Progress</literal>,
+            <literal>Error</literal> and
+            <literal>Package</literal>.
+          </doc:para>
+          <doc:para>
+            <literal>Package</literal> enumerated types should be
+            <literal>available</literal> or <literal>installed</literal>.
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -778,7 +1005,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              A correct filter, e.g. <literal>none</literal> or <literal>installed;~devel</literal>
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -787,7 +1014,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              An enumerated group_type, or <literal>unknown</literal>
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -800,7 +1027,42 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            This method searches the package database by package name.
+          </doc:para>
+          <doc:para>
+            Do not refresh the package cache. This should be fast.
+          </doc:para>
+          <doc:para>
+            Try to emit <literal>installed</literal> before
+            <literal>available</literal> packages first, as it allows the client
+            program to perform the GUI filtering and matching whilst the daemon is
+            running the transaction.
+          </doc:para>
+          <doc:para>
+            If the backend includes <literal>installed</literal> and
+            <literal>available</literal> versions of the same package when searching
+            then the <literal>available</literal> version will have to be filtered
+            in the backend.
+          </doc:para>
+          <doc:para>
+            The search query in the backend should not be case sensitive, and
+            should not be sensitive to <literal>_</literal> or <literal>-</literal>.
+          </doc:para>
+          <doc:para>
+            The search methods should return all results in all repositories.
+            This may mean that multiple versions of package are returned.
+            If this is not what is wanted by the client program, then the
+            <literal>newest</literal> filter should be used.
+          </doc:para>
+          <doc:para>
+            This method typically emits
+            <literal>Progress</literal>,
+            <literal>Error</literal> and
+            <literal>Package</literal>.
+          </doc:para>
+          <doc:para>
+            <literal>Package</literal> enumerated types should be
+            <literal>available</literal> or <literal>installed</literal>.
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -808,7 +1070,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              A correct filter, e.g. <literal>none</literal> or <literal>installed;~devel</literal>
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -817,7 +1079,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              A single word search term with no wildcard chars
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -830,7 +1092,20 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            This method updates existing packages on the local system.
+          </doc:para>
+          <doc:para>
+            The installer should always update extra packages automatically to fulfil dependencies.
+          </doc:para>
+          <doc:para>
+            This should allow an application to find out what package owns a file on the system.
+          </doc:para>
+          <doc:para>
+            This method typically emits
+            <literal>Progress</literal>,
+            <literal>Status</literal> and
+            <literal>Error</literal> and
+            <literal>Package</literal>.
           </doc:para>
         </doc:description>
         <doc:permission>Callers need the org.freedesktop.packagekit.update-package</doc:permission>
@@ -839,7 +1114,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              An array of package IDs.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -852,9 +1127,28 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            This method updates all packages on the system to thier newest versions.
+          </doc:para>
+          <doc:para>
+            The installer should update all the updateable packages on the system,
+            including automatically installing any new packages that are needed for
+            dependancies.
           </doc:para>
         </doc:description>
+          <doc:para>
+            This method typically emits
+            <literal>Progress</literal>,
+            <literal>Error</literal> and
+            <literal>RequireRestart</literal> and
+            <literal>Package</literal>.
+          </doc:para>
+          <doc:para>
+            <literal>Package</literal> enumerated types should be
+            <literal>downloading</literal>,
+            <literal>updating</literal>,
+            <literal>installing</literal> or
+            <literal>removing</literal>.
+          </doc:para>
         <doc:permission>Callers need the org.freedesktop.packagekit.update-system</doc:permission>
       </doc:doc>
     </method>
@@ -865,7 +1159,20 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            This method returns packages that provide the supplied attributes.
+            This method is useful for finding out what package(s) provide a modalias
+            or GStreamer codec string.
+          </doc:para>
+          <doc:para>
+            This method typically emits
+            <literal>Progress</literal>,
+            <literal>Status</literal> and
+            <literal>Error</literal> and
+            <literal>Package</literal>.
+          </doc:para>
+          <doc:para>
+            <literal>Package</literal> enumerated types should be
+            <literal>available</literal> or <literal>installed</literal>.
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -873,7 +1180,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              A correct filter, e.g. <literal>none</literal> or <literal>installed;~devel</literal>
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -882,7 +1189,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              A PkProvideType, e.g. <literal>PK_PROVIDES_ENUM_CODEC</literal>.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -891,7 +1198,8 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              The data to send to the backend to get the packages.
+              Note: This is backend specific.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -903,7 +1211,7 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            This signal xxx
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -923,7 +1231,7 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            This signal xxx
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -943,7 +1251,7 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            This signal xxx
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -1008,7 +1316,7 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            This signal xxx
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -1037,7 +1345,7 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            This signal xxx
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -1066,7 +1374,7 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            This signal xxx
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -1095,7 +1403,7 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            This signal xxx
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -1124,7 +1432,7 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            This signal xxx
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -1162,7 +1470,7 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            This signal xxx
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -1209,7 +1517,7 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            This signal xxx
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -1247,7 +1555,7 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            This signal xxx
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -1330,7 +1638,7 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            This signal xxx
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -1377,7 +1685,7 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            This signal xxx
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -1406,7 +1714,7 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            This signal xxx
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -1426,7 +1734,7 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            This signal xxx
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -1491,7 +1799,7 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            This signal xxx
           </doc:para>
         </doc:description>
       </doc:doc>
commit 13bae116900e5e22b926437ebb8e57a33bfe903d
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu Jun 19 21:57:43 2008 +0100

    add some more docs

diff --git a/src/pk-interface-transaction.xml b/src/pk-interface-transaction.xml
index b897798..4b052da 100644
--- a/src/pk-interface-transaction.xml
+++ b/src/pk-interface-transaction.xml
@@ -19,16 +19,16 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            This allows the user to accept a end user licence agreement.
           </doc:para>
         </doc:description>
-        <doc:permission>Callers need the org.freedesktop.PackageKit.xxxxxxxxx</doc:permission>
+        <doc:permission>Callers need the org.freedesktop.packagekit.accept-eula</doc:permission>
       </doc:doc>
       <arg type="s" name="eula_id" direction="in">
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              A valid EULA ID
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -40,7 +40,7 @@
       <doc:doc>
         <doc:description>
           <doc:para>
-            xxx
+            Cancel a transaction that is already running
           </doc:para>
         </doc:description>
       </doc:doc>
@@ -48,22 +48,22 @@
 
     <!--*****************************************************************************************-->
     <method name="GetAllowCancel">
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            Get if cancel is allowed for the transaction
+          </doc:para>
+        </doc:description>
+      </doc:doc>
       <arg type="b" name="allow_cancel" direction="out">
         <doc:doc>
           <doc:summary>
             <doc:para>
-              xxx
+              If cancel is allowed
             </doc:para>
           </doc:summary>
         </doc:doc>
       </arg>
-      <doc:doc>
-        <doc:description>
-          <doc:para>
-            xxx
-          </doc:para>
-        </doc:description>
-      </doc:doc>
     </method>
 
     <!--*****************************************************************************************-->
@@ -196,7 +196,6 @@
             xxx
           </doc:para>
         </doc:description>
-        <doc:permission>Callers need the org.freedesktop.PackageKit.xxxxxxxxx</doc:permission>
       </doc:doc>
       <arg type="s" name="filter" direction="in">
         <doc:doc>
@@ -374,7 +373,6 @@
             xxx
           </doc:para>
         </doc:description>
-        <doc:permission>Callers need the org.freedesktop.PackageKit.xxxxxxxxx</doc:permission>
       </doc:doc>
       <arg type="s" name="package_id" direction="in">
         <doc:doc>
@@ -396,7 +394,6 @@
             xxx
           </doc:para>
         </doc:description>
-        <doc:permission>Callers need the org.freedesktop.PackageKit.xxxxxxxxx</doc:permission>
       </doc:doc>
       <arg type="s" name="filter" direction="in">
         <doc:doc>
@@ -418,7 +415,7 @@
             xxx
           </doc:para>
         </doc:description>
-        <doc:permission>Callers need the org.freedesktop.PackageKit.xxxxxxxxx</doc:permission>
+        <doc:permission>Callers need the org.freedesktop.packagekit.localinstall-untrusted</doc:permission>
       </doc:doc>
       <arg type="b" name="trusted" direction="in">
         <doc:doc>
@@ -449,7 +446,7 @@
             xxx
           </doc:para>
         </doc:description>
-        <doc:permission>Callers need the org.freedesktop.PackageKit.xxxxxxxxx</doc:permission>
+        <doc:permission>Callers need the org.freedesktop.packagekit.install</doc:permission>
       </doc:doc>
       <arg type="as" name="package_ids" direction="in">
         <doc:doc>
@@ -471,7 +468,7 @@
             xxx
           </doc:para>
         </doc:description>
-        <doc:permission>Callers need the org.freedesktop.PackageKit.xxxxxxxxx</doc:permission>
+        <doc:permission>Callers need the org.freedesktop.packagekit.install-signature</doc:permission>
       </doc:doc>
       <arg type="s" name="sig_type" direction="in">
         <doc:doc>
@@ -531,7 +528,7 @@
             xxx
           </doc:para>
         </doc:description>
-        <doc:permission>Callers need the org.freedesktop.PackageKit.xxxxxxxxx</doc:permission>
+        <doc:permission>Callers need the org.freedesktop.packagekit.refresh-cache</doc:permission>
       </doc:doc>
       <arg type="b" name="force" direction="in">
         <doc:doc>
@@ -553,7 +550,7 @@
             xxx
           </doc:para>
         </doc:description>
-        <doc:permission>Callers need the org.freedesktop.PackageKit.xxxxxxxxx</doc:permission>
+        <doc:permission>Callers need the org.freedesktop.packagekit.remove</doc:permission>
       </doc:doc>
       <arg type="as" name="package_ids" direction="in">
         <doc:doc>
@@ -593,7 +590,7 @@
             xxx
           </doc:para>
         </doc:description>
-        <doc:permission>Callers need the org.freedesktop.PackageKit.xxxxxxxxx</doc:permission>
+        <doc:permission>Callers need the org.freedesktop.packagekit.repo-change</doc:permission>
       </doc:doc>
       <arg type="s" name="repo_id" direction="in">
         <doc:doc>
@@ -624,7 +621,7 @@
             xxx
           </doc:para>
         </doc:description>
-        <doc:permission>Callers need the org.freedesktop.PackageKit.xxxxxxxxx</doc:permission>
+        <doc:permission>Callers need the org.freedesktop.packagekit.repo-change</doc:permission>
       </doc:doc>
       <arg type="s" name="repo_id" direction="in">
         <doc:doc>
@@ -694,7 +691,7 @@
             xxx
           </doc:para>
         </doc:description>
-        <doc:permission>Callers need the org.freedesktop.PackageKit.xxxxxxxxx</doc:permission>
+        <doc:permission>Callers need the org.freedesktop.packagekit.rollback</doc:permission>
       </doc:doc>
       <arg type="s" name="transaction_id" direction="in">
         <doc:doc>
@@ -836,7 +833,7 @@
             xxx
           </doc:para>
         </doc:description>
-        <doc:permission>Callers need the org.freedesktop.PackageKit.xxxxxxxxx</doc:permission>
+        <doc:permission>Callers need the org.freedesktop.packagekit.update-package</doc:permission>
       </doc:doc>
       <arg type="as" name="package_ids" direction="in">
         <doc:doc>
@@ -858,7 +855,7 @@
             xxx
           </doc:para>
         </doc:description>
-        <doc:permission>Callers need the org.freedesktop.PackageKit.xxxxxxxxx</doc:permission>
+        <doc:permission>Callers need the org.freedesktop.packagekit.update-system</doc:permission>
       </doc:doc>
     </method>
 
commit 6846f28a8a9deb1187122673f389a990a6b39bb5
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu Jun 19 21:45:47 2008 +0100

    Add initial changes needed for autogenerated dbus introspection documentation

diff --git a/configure.ac b/configure.ac
index 938d5c3..836b9d3 100644
--- a/configure.ac
+++ b/configure.ac
@@ -109,6 +109,11 @@ AC_SUBST(DBUS_CFLAGS)
 AC_SUBST(DBUS_LIBS)
 
 dnl ---------------------------------------------------------------------------
+dnl - xsltproc
+dnl ---------------------------------------------------------------------------
+AC_PATH_PROG([XSLTPROC], [xsltproc])
+
+dnl ---------------------------------------------------------------------------
 dnl - Is GIO available?
 dnl ---------------------------------------------------------------------------
 PKG_CHECK_MODULES(GIO, gio-2.0 >= $GIO_REQUIRED, PK_BUILD_GIO="yes", PK_BUILD_GIO="no")
@@ -456,6 +461,7 @@ docs/html/Makefile
 docs/html/img/Makefile
 docs/spec/Makefile
 docs/api/Makefile
+docs/api/dbus/Makefile
 docs/api/version.xml
 contrib/Makefile
 contrib/udev/Makefile
diff --git a/docs/api/Makefile.am b/docs/api/Makefile.am
index 01bed51..28ba3e4 100644
--- a/docs/api/Makefile.am
+++ b/docs/api/Makefile.am
@@ -1,5 +1,7 @@
 ## Process this file with automake to produce Makefile.in
 
+SUBDIRS = dbus
+
 NULL =
 
 # We require automake 1.6 at least.
@@ -45,7 +47,10 @@ IGNORE_HFILES =						\
 HTML_IMAGES=
 
 # Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
-content_files = version.xml
+content_files =						\
+	version.xml					\
+	dbus/pk-interface.ref.xml			\
+	$(NULL)
 
 # SGML files where gtk-doc abbrevations (#GtkWidget) are expanded
 # These files must be listed here *and* in content_files
diff --git a/docs/api/PackageKit-docs.sgml b/docs/api/PackageKit-docs.sgml
index 7b4a1cc..142dd56 100644
--- a/docs/api/PackageKit-docs.sgml
+++ b/docs/api/PackageKit-docs.sgml
@@ -8,13 +8,35 @@
     <title>PackageKit Reference Manual</title>
     <releaseinfo>
       for PackageKit &version;
-      <!--
-      The latest version of this documentation can be found on-line at
-      <ulink role="online-location" url="http://[SERVER]/PackageKit/index.html">http://[SERVER]/PackageKit/</ulink>.
-      -->
     </releaseinfo>
+    <authorgroup>
+      <author>
+        <firstname>Richard</firstname>
+        <surname>Hughes</surname>
+        <affiliation>
+          <address>
+            <email>richard at hughsie.com</email>
+          </address>
+        </affiliation>
+      </author>
+    </authorgroup>
+    <copyright>
+      <year>2008</year>
+      <holder>The PackageKit Authors</holder>
+    </copyright>
   </bookinfo>
 
+  <reference id="ref-dbus">
+    <title>D-Bus API Reference</title>
+    <partintro>
+      <para>
+        This part documents the D-Bus interface used to access the PackageKit daemon.
+      </para>
+    </partintro>
+    <xi:include href="dbus/pk-interface.ref.xml"/>
+    <xi:include href="dbus/pk-interface-transaction.ref.xml"/>
+  </reference>
+
   <chapter>
     <title>libpackagekit</title>
     <xi:include href="xml/pk-connection.xml"/>
diff --git a/docs/api/dbus/.gitignore b/docs/api/dbus/.gitignore
new file mode 100644
index 0000000..8a26d41
--- /dev/null
+++ b/docs/api/dbus/.gitignore
@@ -0,0 +1,2 @@
+*.ref.xml
+
diff --git a/docs/api/dbus/Makefile.am b/docs/api/dbus/Makefile.am
new file mode 100644
index 0000000..d7a221c
--- /dev/null
+++ b/docs/api/dbus/Makefile.am
@@ -0,0 +1,21 @@
+
+if ENABLE_GTK_DOC
+
+all : pk-interface.ref.xml pk-interface-transaction.ref.xml
+
+pk-interface.ref.xml : $(top_srcdir)/src/pk-interface.xml $(top_srcdir)/docs/api/dbus/spec-to-docbook.xsl
+	echo "<?xml version=\"1.0\"?>""<!DOCTYPE refentry PUBLIC \"-//OASIS//DTD DocBook XML V4.1.2//EN\" \"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd\">" > $@
+	$(XSLTPROC) $(top_srcdir)/docs/api/dbus/spec-to-docbook.xsl $< | tail -n +2 >> $@
+
+pk-interface-transaction.ref.xml : $(top_srcdir)/src/pk-interface-transaction.xml $(top_srcdir)/docs/api/dbus/spec-to-docbook.xsl
+	echo "<?xml version=\"1.0\"?>""<!DOCTYPE refentry PUBLIC \"-//OASIS//DTD DocBook XML V4.1.2//EN\" \"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd\">" > $@
+	$(XSLTPROC) $(top_srcdir)/docs/api/dbus/spec-to-docbook.xsl $< | tail -n +2 >> $@
+
+#$(top_srcdir)/docs/api/dbus/spec-to-docbook $(top_srcdir)/src/pk-interface.xml
+
+endif
+
+EXTRA_DIST = spec-to-docbook.xsl dbus-introspect-docs.dtd
+
+clean-local :
+	rm -f *~ *.ref.xml
diff --git a/docs/api/dbus/dbus-introspect-docs.dtd b/docs/api/dbus/dbus-introspect-docs.dtd
new file mode 100644
index 0000000..5fe508e
--- /dev/null
+++ b/docs/api/dbus/dbus-introspect-docs.dtd
@@ -0,0 +1,32 @@
+<!-- DTD for D-Bus Introspection Documentation -->
+
+<!ELEMENT doc (summary?,description?,errors?,permission?,since?,deprecated,seealso?)>
+
+<!ELEMENT summary (#PCDATA|ref)*>
+<!ELEMENT description (#PCDATA|para|example)*>
+<!ELEMENT errors (error)*>
+<!ELEMENT permission (#PCDATA|ref|para)*>
+<!ELEMENT since EMPTY>
+<!ATTLIST since version CDATA #REQUIRED>
+<!ELEMENT deprecated (#PCDATA|ref)>
+<!ATTLIST deprecated version CDATA #REQUIRED>
+<!ATTLIST deprecated instead CDATA #REQUIRED>
+<!ELEMENT seealso (ref+)>
+
+<!ELEMENT error (#PCDATA|para)*>
+<!ATTLIST error name CDATA #REQUIRED>
+<!ELEMENT para (#PCDATA|example|code|list|ref)*>
+<!ELEMENT example (#PCDATA|para|code|ref)*>
+<!ATTLIST language (c|glib|python|shell) #REQUIRED>
+<!ATTLIST title CDATA #IMPLIED>
+<!ELEMENT list (listheader?, item*)>
+<!ATTLIST list type (bullet|number|table) #REQUIRED>
+<!ELEMENT item (term|definition)*>
+<!ELEMENT term (#PCDATA|ref)*>
+<!ELEMENT definition (#PCDATA|para)*>
+
+<!ELEMENT code (#PCDATA)>
+<!ATTLIST code lang CDATA #IMPLIED>
+<!ELEMENT ref CDATA>
+<!ATTLIST ref type (parameter|arg|signal|method|interface) #REQUIRED>
+<!ATTLIST ref to CDATA #REQUIRED>
diff --git a/docs/api/dbus/spec-to-docbook.xsl b/docs/api/dbus/spec-to-docbook.xsl
new file mode 100644
index 0000000..fccf887
--- /dev/null
+++ b/docs/api/dbus/spec-to-docbook.xsl
@@ -0,0 +1,436 @@
+<?xml version='1.0'?>
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+  xmlns:doc="http://www.freedesktop.org/dbus/1.0/doc.dtd"
+  exclude-result-prefixes="doc">
+<!--
+     Convert D-Bus Glib xml into DocBook refentries
+     Copyright (C) 2007 William Jon McCann
+     License: GPL
+-->
+<xsl:output method="xml" indent="yes" encoding="UTF-8"/>
+
+<xsl:template match="/">
+
+<xsl:variable name="interface" select="//interface/@name"/>
+<xsl:variable name="basename">
+  <xsl:call-template name="interface-basename">
+    <xsl:with-param name="str" select="$interface"/>
+  </xsl:call-template>
+</xsl:variable>
+
+<refentry><xsl:attribute name="id"><xsl:value-of select="$basename"/></xsl:attribute>
+  <refmeta>
+    <refentrytitle role="top_of_page"><xsl:value-of select="//interface/@name"/></refentrytitle>
+  </refmeta>
+
+  <refnamediv>
+    <refname><xsl:value-of select="//interface/@name"/></refname>
+    <refpurpose><xsl:value-of select="$basename"/> interface</refpurpose>
+  </refnamediv>
+
+  <refsynopsisdiv role="synopsis">
+    <title role="synopsis.title">Methods</title>
+    <synopsis>
+  <xsl:call-template name="methods-synopsis">
+    <xsl:with-param name="basename" select="$basename"/>
+  </xsl:call-template>
+    </synopsis>
+  </refsynopsisdiv>
+
+  <refsect1 role="signal_proto">
+    <title role="signal_proto.title">Signals</title>
+    <synopsis>
+  <xsl:call-template name="signals-synopsis">
+    <xsl:with-param name="basename" select="$basename"/>
+  </xsl:call-template>
+    </synopsis>
+  </refsect1>
+
+  <refsect1 role="impl_interfaces">
+    <title role="impl_interfaces.title">Implemented Interfaces</title>
+    <para>
+    <xsl:value-of select="$interface"/> implements
+    org.freedesktop.DBus.Introspectable,
+    org.freedesktop.DBus.Properties
+    </para>
+  </refsect1>
+
+  <refsect1 role="properties">
+    <title role="properties.title">Properties</title>
+    <synopsis>
+  <xsl:call-template name="properties-synopsis">
+    <xsl:with-param name="basename" select="$basename"/>
+  </xsl:call-template>
+    </synopsis>
+  </refsect1>
+
+  <refsect1 role="desc">
+    <title role="desc.title">Description</title>
+    <para>
+      <xsl:apply-templates select="//interface/doc:doc"/>
+    </para>
+  </refsect1>
+
+  <refsect1 role="details">
+    <title role="details.title">Details</title>
+    <xsl:call-template name="method-details">
+      <xsl:with-param name="basename" select="$basename"/>
+    </xsl:call-template>
+  </refsect1>
+
+  <refsect1 role="signals">
+    <title role="signals.title">Signal Details</title>
+    <xsl:call-template name="signal-details">
+      <xsl:with-param name="basename" select="$basename"/>
+    </xsl:call-template>
+  </refsect1>
+
+  <refsect1 role="property_details">
+    <title role="property_details.title">Property Details</title>
+    <xsl:call-template name="property-details">
+      <xsl:with-param name="basename" select="$basename"/>
+    </xsl:call-template>
+  </refsect1>
+
+</refentry>
+</xsl:template>
+
+
+<xsl:template name="property-doc">
+  <xsl:apply-templates select="doc:doc/doc:description"/>
+
+  <variablelist role="params">
+    <xsl:for-each select="arg">
+<varlistentry><term><parameter><xsl:value-of select="@name"/></parameter>:</term>
+<listitem><simpara><xsl:value-of select="doc:doc/doc:summary"/></simpara></listitem>
+</varlistentry>
+    </xsl:for-each>
+  </variablelist>
+
+  <xsl:apply-templates select="doc:doc/doc:since"/>
+  <xsl:apply-templates select="doc:doc/doc:deprecated"/>
+  <xsl:apply-templates select="doc:doc/doc:permission"/>
+  <xsl:apply-templates select="doc:doc/doc:seealso"/>
+</xsl:template>
+
+
+<xsl:template name="property-details">
+  <xsl:param name="basename"/>
+  <xsl:variable name="longest">
+    <xsl:call-template name="find-longest">
+      <xsl:with-param name="set" select="@name"/>
+    </xsl:call-template>
+  </xsl:variable>
+  <xsl:for-each select="///property">
+  <refsect2>
+    <title><anchor role="function"><xsl:attribute name="id"><xsl:value-of select="$basename"/>:<xsl:value-of select="@name"/></xsl:attribute></anchor>The "<xsl:value-of select="@name"/>" property</title>
+<indexterm><primary><xsl:value-of select="@name"/></primary><secondary><xsl:value-of select="$basename"/></secondary></indexterm>
+<programlisting>'<xsl:value-of select="@name"/>'<xsl:call-template name="pad-spaces"><xsl:with-param name="width" select="2"/></xsl:call-template>
+<xsl:call-template name="property-args"><xsl:with-param name="indent" select="string-length(@name) + 2"/></xsl:call-template></programlisting>
+  </refsect2>
+
+  <xsl:call-template name="property-doc"/>
+
+  </xsl:for-each>
+</xsl:template>
+
+<xsl:template name="signal-doc">
+  <xsl:apply-templates select="doc:doc/doc:description"/>
+
+  <variablelist role="params">
+    <xsl:for-each select="arg">
+<varlistentry><term><parameter><xsl:value-of select="@name"/></parameter>:</term>
+<listitem><simpara><xsl:value-of select="doc:doc/doc:summary"/></simpara></listitem>
+</varlistentry>
+    </xsl:for-each>
+  </variablelist>
+
+  <xsl:apply-templates select="doc:doc/doc:since"/>
+  <xsl:apply-templates select="doc:doc/doc:deprecated"/>
+  <xsl:apply-templates select="doc:doc/doc:permission"/>
+  <xsl:apply-templates select="doc:doc/doc:seealso"/>
+</xsl:template>
+
+<xsl:template name="signal-details">
+  <xsl:param name="basename"/>
+  <xsl:variable name="longest">
+    <xsl:call-template name="find-longest">
+      <xsl:with-param name="set" select="@name"/>
+    </xsl:call-template>
+  </xsl:variable>
+  <xsl:for-each select="///signal">
+  <refsect2>
+    <title><anchor role="function"><xsl:attribute name="id"><xsl:value-of select="$basename"/>::<xsl:value-of select="@name"/></xsl:attribute></anchor>The <xsl:value-of select="@name"/> signal</title>
+<indexterm><primary><xsl:value-of select="@name"/></primary><secondary><xsl:value-of select="$basename"/></secondary></indexterm>
+<programlisting><xsl:value-of select="@name"/> (<xsl:call-template name="signal-args"><xsl:with-param name="indent" select="string-length(@name) + 2"/><xsl:with-param name="prefix" select="."/></xsl:call-template>)</programlisting>
+  </refsect2>
+
+  <xsl:call-template name="signal-doc"/>
+
+  </xsl:for-each>
+</xsl:template>
+
+<xsl:template match="doc:code">
+<programlisting>
+<xsl:apply-templates />
+</programlisting>
+</xsl:template>
+
+<xsl:template match="doc:summary">
+<!-- by default don't display -->
+</xsl:template>
+
+<xsl:template match="doc:example">
+<informalexample>
+<xsl:apply-templates />
+</informalexample>
+</xsl:template>
+
+<xsl:template match="doc:para">
+<para>
+<xsl:apply-templates />
+</para>
+</xsl:template>
+
+<xsl:template match="doc:description">
+<xsl:apply-templates />
+</xsl:template>
+
+<xsl:template match="doc:since">
+<para role="since">Since <xsl:value-of select="@version"/>
+</para>
+</xsl:template>
+
+<xsl:template match="doc:deprecated">
+  <xsl:variable name="name" select="../../@name"/>
+  <xsl:variable name="parent">
+    <xsl:call-template name="interface-basename">
+      <xsl:with-param name="str" select="../../../@name"/>/>
+    </xsl:call-template>
+  </xsl:variable>
+
+  <xsl:variable name="type" select="name(../..)"/>
+
+  <para role="deprecated">
+  <warning><para><literal><xsl:value-of select="$name"/></literal> is deprecated since version <xsl:value-of select="@version"/> and should not be used in newly-written code. Use
+
+  <xsl:variable name="to">
+  <xsl:choose>
+    <xsl:when test="contains($type,'property')">
+      <xsl:value-of select="$parent"/>:<xsl:value-of select="@instead"/>
+    </xsl:when>
+    <xsl:when test="contains($type,'signal')">
+      <xsl:value-of select="$parent"/>::<xsl:value-of select="@instead"/>
+    </xsl:when>
+    <xsl:when test="contains($type,'method')">
+      <xsl:value-of select="$parent"/>.<xsl:value-of select="@instead"/>
+    </xsl:when>
+    <xsl:when test="contains($type,'interface')">
+      <xsl:value-of select="@instead"/>
+    </xsl:when>
+    <xsl:otherwise>
+      <xsl:value-of select="@instead"/>
+    </xsl:otherwise>
+  </xsl:choose>
+  </xsl:variable>
+
+  <xsl:call-template name="create-link">
+    <xsl:with-param name="type" select="$type"/>
+    <xsl:with-param name="to" select="$to"/>
+    <xsl:with-param name="val" select="@instead"/>
+  </xsl:call-template>
+instead.</para></warning>
+</para>
+</xsl:template>
+
+<xsl:template match="doc:permission">
+<para role="permission">
+<xsl:apply-templates />
+</para>
+</xsl:template>
+
+<xsl:template match="doc:seealso">
+<para>
+See also:
+<xsl:apply-templates />
+
+</para>
+</xsl:template>
+
+<xsl:template name="create-link">
+  <xsl:param name="type"/>
+  <xsl:param name="to"/>
+  <xsl:param name="val"/>
+
+  <xsl:choose>
+    <xsl:when test="contains($type,'property')">
+      <link><xsl:attribute name="linkend"><xsl:value-of select="$to"/></xsl:attribute><literal><xsl:value-of select="$val"/></literal></link>
+    </xsl:when>
+    <xsl:when test="contains($type,'signal')">
+      <link><xsl:attribute name="linkend"><xsl:value-of select="$to"/></xsl:attribute><literal><xsl:value-of select="$val"/></literal></link>
+    </xsl:when>
+    <xsl:when test="contains($type,'method')">
+      <link><xsl:attribute name="linkend"><xsl:value-of select="$to"/></xsl:attribute><function><xsl:value-of select="$val"/></function></link>
+    </xsl:when>
+    <xsl:when test="contains($type,'interface')">
+      <link><xsl:attribute name="linkend"><xsl:value-of select="$to"/></xsl:attribute><xsl:value-of select="$val"/></link>
+    </xsl:when>
+  </xsl:choose>
+</xsl:template>
+
+<xsl:template match="doc:ref">
+  <xsl:call-template name="create-link">
+    <xsl:with-param name="type" select="@type"/>
+    <xsl:with-param name="to" select="@to"/>
+    <xsl:with-param name="val" select="."/>
+  </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="method-doc">
+  <xsl:apply-templates select="doc:doc/doc:description"/>
+
+  <variablelist role="params">
+    <xsl:for-each select="arg">
+<varlistentry><term><parameter><xsl:value-of select="@name"/></parameter>:</term>
+<listitem><simpara><xsl:value-of select="doc:doc/doc:summary"/></simpara></listitem>
+</varlistentry>
+    </xsl:for-each>
+  </variablelist>
+
+  <xsl:apply-templates select="doc:doc/doc:since"/>
+  <xsl:apply-templates select="doc:doc/doc:deprecated"/>
+  <xsl:apply-templates select="doc:doc/doc:permission"/>
+  <xsl:apply-templates select="doc:doc/doc:seealso"/>
+</xsl:template>
+
+<xsl:template name="method-details">
+  <xsl:param name="basename"/>
+  <xsl:variable name="longest">
+    <xsl:call-template name="find-longest">
+      <xsl:with-param name="set" select="@name"/>
+    </xsl:call-template>
+  </xsl:variable>
+  <xsl:for-each select="///method">
+    <refsect2>
+    <title><anchor role="function"><xsl:attribute name="id"><xsl:value-of select="$basename"/>.<xsl:value-of select="@name"/></xsl:attribute></anchor><xsl:value-of select="@name"/> ()</title>
+<indexterm><primary><xsl:value-of select="@name"/></primary><secondary><xsl:value-of select="$basename"/></secondary></indexterm>
+<programlisting><xsl:value-of select="@name"/> (<xsl:call-template name="method-args"><xsl:with-param name="indent" select="string-length(@name) + 2"/><xsl:with-param name="prefix" select="."/></xsl:call-template>)</programlisting>
+    </refsect2>
+
+    <xsl:call-template name="method-doc"/>
+
+  </xsl:for-each>
+</xsl:template>
+
+
+<xsl:template name="properties-synopsis">
+  <xsl:param name="basename"/>
+  <xsl:variable name="longest">
+    <xsl:call-template name="find-longest">
+      <xsl:with-param name="set" select="///property/@name"/>
+    </xsl:call-template>
+  </xsl:variable>
+  <xsl:for-each select="///property">
+<link><xsl:attribute name="linkend"><xsl:value-of select="$basename"/>:<xsl:value-of select="@name"/></xsl:attribute>'<xsl:value-of select="@name"/>'</link><xsl:call-template name="pad-spaces"><xsl:with-param name="width" select="$longest - string-length(@name) + 1"/></xsl:call-template> <xsl:call-template name="property-args"><xsl:with-param name="indent" select="$longest + 2"/></xsl:call-template>
+</xsl:for-each>
+</xsl:template>
+
+
+<xsl:template name="signals-synopsis">
+  <xsl:param name="basename"/>
+  <xsl:variable name="longest">
+    <xsl:call-template name="find-longest">
+      <xsl:with-param name="set" select="///signal/@name"/>
+    </xsl:call-template>
+  </xsl:variable>
+  <xsl:for-each select="///signal">
+<link><xsl:attribute name="linkend"><xsl:value-of select="$basename"/>::<xsl:value-of select="@name"/></xsl:attribute><xsl:value-of select="@name"/></link><xsl:call-template name="pad-spaces"><xsl:with-param name="width" select="$longest - string-length(@name) + 1"/></xsl:call-template>(<xsl:call-template name="signal-args"><xsl:with-param name="indent" select="$longest + 2"/><xsl:with-param name="prefix" select="///signal"/></xsl:call-template>)
+</xsl:for-each>
+</xsl:template>
+
+
+<xsl:template name="methods-synopsis">
+  <xsl:param name="basename"/>
+  <xsl:variable name="longest">
+    <xsl:call-template name="find-longest">
+      <xsl:with-param name="set" select="///method/@name"/>
+    </xsl:call-template>
+  </xsl:variable>
+  <xsl:for-each select="///method">
+<link><xsl:attribute name="linkend"><xsl:value-of select="$basename"/>.<xsl:value-of select="@name"/></xsl:attribute><xsl:value-of select="@name"/></link><xsl:call-template name="pad-spaces"><xsl:with-param name="width" select="$longest - string-length(@name) + 1"/></xsl:call-template>(<xsl:call-template name="method-args"><xsl:with-param name="indent" select="$longest + 2"/><xsl:with-param name="prefix" select="///method"/></xsl:call-template>)
+</xsl:for-each>
+</xsl:template>
+
+
+<xsl:template name="method-args"><xsl:param name="indent"/><xsl:param name="prefix"/><xsl:variable name="longest"><xsl:call-template name="find-longest"><xsl:with-param name="set" select="$prefix/arg/@type"/></xsl:call-template></xsl:variable><xsl:for-each select="arg"><xsl:value-of select="@direction"/>
+<xsl:call-template name="pad-spaces"><xsl:with-param name="width" select="4 - string-length(@direction)"/></xsl:call-template>'<xsl:value-of select="@type"/>'<xsl:call-template name="pad-spaces"><xsl:with-param name="width" select="$longest - string-length(@type) + 1"/></xsl:call-template>
+<xsl:value-of select="@name"/><xsl:if test="not(position() = last())">,
+<xsl:call-template name="pad-spaces"><xsl:with-param name="width" select="$indent"/></xsl:call-template></xsl:if>
+</xsl:for-each>
+</xsl:template>
+
+
+<xsl:template name="signal-args"><xsl:param name="indent"/><xsl:param name="prefix"/><xsl:variable name="longest"><xsl:call-template name="find-longest"><xsl:with-param name="set" select="$prefix/arg/@type"/></xsl:call-template></xsl:variable><xsl:for-each select="arg">'<xsl:value-of select="@type"/>'<xsl:call-template name="pad-spaces"><xsl:with-param name="width" select="$longest - string-length(@type) + 1"/></xsl:call-template>
+<xsl:value-of select="@name"/><xsl:if test="not(position() = last())">,
+<xsl:call-template name="pad-spaces"><xsl:with-param name="width" select="$indent"/></xsl:call-template></xsl:if>
+</xsl:for-each>
+</xsl:template>
+
+
+<xsl:template name="property-args"><xsl:param name="indent"/>
+<xsl:value-of select="@access"/><xsl:call-template name="pad-spaces"><xsl:with-param name="width" select="9 - string-length(@access) + 1"/></xsl:call-template>'<xsl:value-of select="@type"/>'
+</xsl:template>
+
+
+<xsl:template name="pad-spaces">
+  <xsl:param name="width"/>
+  <xsl:variable name="spaces" xml:space="preserve">                                                                        </xsl:variable>
+  <xsl:value-of select="substring($spaces,1,$width)"/>
+</xsl:template>
+
+
+<xsl:template name="find-longest">
+  <xsl:param name="set"/>
+  <xsl:param name="index" select="1"/>
+  <xsl:param name="longest" select="0"/>
+
+  <xsl:choose>
+    <xsl:when test="$index > count($set)">
+      <!--finished looking-->
+      <xsl:value-of select="$longest"/>
+    </xsl:when>
+    <xsl:when test="string-length($set[$index])>$longest">
+      <!--found new longest-->
+      <xsl:call-template name="find-longest">
+        <xsl:with-param name="set" select="$set"/>
+        <xsl:with-param name="index" select="$index + 1"/>
+        <xsl:with-param name="longest" select="string-length($set[$index])"/>
+      </xsl:call-template>
+    </xsl:when>
+    <xsl:otherwise>
+      <!--this isn't any longer-->
+      <xsl:call-template name="find-longest">
+        <xsl:with-param name="set" select="$set"/>
+        <xsl:with-param name="index" select="$index + 1"/>
+        <xsl:with-param name="longest" select="$longest"/>
+      </xsl:call-template>
+    </xsl:otherwise>
+  </xsl:choose>
+</xsl:template>
+
+
+<xsl:template name="interface-basename">
+  <xsl:param name="str"/>
+  <xsl:choose>
+    <xsl:when test="contains($str,'.')">
+      <xsl:call-template name="interface-basename">
+	<xsl:with-param name="str" select="substring-after($str,'.')"/>
+      </xsl:call-template>
+    </xsl:when>
+    <xsl:otherwise>
+      <xsl:value-of select="$str"/>
+    </xsl:otherwise>
+  </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/src/pk-interface-transaction.xml b/src/pk-interface-transaction.xml
index 35f0892..b897798 100644
--- a/src/pk-interface-transaction.xml
+++ b/src/pk-interface-transaction.xml
@@ -1,239 +1,1575 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<node name="/">
+<!DOCTYPE node PUBLIC
+"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
+"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd" [
+  <!ENTITY ERROR_GENERAL "org.freedesktop.PackageKit.Denied">
+]>
+<node name="/" xmlns:doc="http://www.freedesktop.org/dbus/1.0/doc.dtd">
   <interface name="org.freedesktop.PackageKit.Transaction">
+    <doc:doc>
+      <doc:description>
+        <doc:para>
+          The root interface is used for interacting with the daemon.
+        </doc:para>
+      </doc:description>
+    </doc:doc>
 
+    <!--*****************************************************************************************-->
     <method name="AcceptEula">
       <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
-      <arg type="s" name="eula_id" direction="in"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+        <doc:permission>Callers need the org.freedesktop.PackageKit.xxxxxxxxx</doc:permission>
+      </doc:doc>
+      <arg type="s" name="eula_id" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </method>
+
+    <!--*****************************************************************************************-->
     <method name="Cancel">
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+      </doc:doc>
     </method>
+
+    <!--*****************************************************************************************-->
     <method name="GetAllowCancel">
-      <arg type="b" name="allow_cancel" direction="out"/>
+      <arg type="b" name="allow_cancel" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+      </doc:doc>
     </method>
+
+    <!--*****************************************************************************************-->
     <method name="GetDepends">
       <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
-      <arg type="s" name="filter" direction="in"/>
-      <arg type="s" name="package_id" direction="in"/>
-      <arg type="b" name="recursive" direction="in"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="s" name="filter" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="package_id" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="b" name="recursive" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </method>
+
+    <!--*****************************************************************************************-->
     <method name="GetDetails">
       <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
-      <arg type="s" name="package_id" direction="in"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="s" name="package_id" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </method>
+
+    <!--*****************************************************************************************-->
     <method name="GetFiles">
       <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
-      <arg type="s" name="package_id" direction="in"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="s" name="package_id" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </method>
+
+    <!--*****************************************************************************************-->
     <method name="GetOldTransactions">
-      <arg type="u" name="number" direction="in"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="u" name="number" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </method>
+
+    <!--*****************************************************************************************-->
     <method name="GetPackageLast">
-      <arg type="s" name="package" direction="out"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="s" name="package" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </method>
+
+    <!--*****************************************************************************************-->
     <method name="GetPackages">
       <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
-      <arg type="s" name="filter" direction="in"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+        <doc:permission>Callers need the org.freedesktop.PackageKit.xxxxxxxxx</doc:permission>
+      </doc:doc>
+      <arg type="s" name="filter" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </method>
+
+    <!--*****************************************************************************************-->
     <method name="GetProgress">
-      <arg type="u" name="percentage" direction="out"/>
-      <arg type="u" name="subpercentage" direction="out"/>
-      <arg type="u" name="elapsed" direction="out"/>
-      <arg type="u" name="remaining" direction="out"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="u" name="percentage" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="u" name="subpercentage" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="u" name="elapsed" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="u" name="remaining" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </method>
+
+    <!--*****************************************************************************************-->
     <method name="GetRepoList">
       <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
-      <arg type="s" name="filter" direction="in"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="s" name="filter" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </method>
+
+    <!--*****************************************************************************************-->
     <method name="GetRequires">
       <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
-      <arg type="s" name="filter" direction="in"/>
-      <arg type="s" name="package_id" direction="in"/>
-      <arg type="b" name="recursive" direction="in"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="s" name="filter" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="package_id" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="b" name="recursive" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </method>
+
+    <!--*****************************************************************************************-->
     <method name="GetRole">
-      <arg type="s" name="status" direction="out"/>
-      <arg type="s" name="package_id" direction="out"/>
+      <arg type="s" name="status" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="s" name="package_id" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </method>
+
+    <!--*****************************************************************************************-->
     <method name="GetStatus">
-      <arg type="s" name="status" direction="out"/>
+      <arg type="s" name="status" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+      </doc:doc>
     </method>
+
+    <!--*****************************************************************************************-->
     <method name="GetUpdateDetail">
       <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
-      <arg type="s" name="package_id" direction="in"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+        <doc:permission>Callers need the org.freedesktop.PackageKit.xxxxxxxxx</doc:permission>
+      </doc:doc>
+      <arg type="s" name="package_id" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </method>
+
+    <!--*****************************************************************************************-->
     <method name="GetUpdates">
       <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
-      <arg type="s" name="filter" direction="in"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+        <doc:permission>Callers need the org.freedesktop.PackageKit.xxxxxxxxx</doc:permission>
+      </doc:doc>
+      <arg type="s" name="filter" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </method>
+
+    <!--*****************************************************************************************-->
     <method name="InstallFiles">
       <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
-      <arg type="b" name="trusted" direction="in"/>
-      <arg type="as" name="full_paths" direction="in"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+        <doc:permission>Callers need the org.freedesktop.PackageKit.xxxxxxxxx</doc:permission>
+      </doc:doc>
+      <arg type="b" name="trusted" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="as" name="full_paths" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </method>
+
+    <!--*****************************************************************************************-->
     <method name="InstallPackages">
       <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
-      <arg type="as" name="package_ids" direction="in"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+        <doc:permission>Callers need the org.freedesktop.PackageKit.xxxxxxxxx</doc:permission>
+      </doc:doc>
+      <arg type="as" name="package_ids" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </method>
+
+    <!--*****************************************************************************************-->
     <method name="InstallSignature">
       <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
-      <arg type="s" name="sig_type" direction="in"/>
-      <arg type="s" name="key_id" direction="in"/>
-      <arg type="s" name="package_id" direction="in"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+        <doc:permission>Callers need the org.freedesktop.PackageKit.xxxxxxxxx</doc:permission>
+      </doc:doc>
+      <arg type="s" name="sig_type" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="key_id" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="package_id" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </method>
+
+    <!--*****************************************************************************************-->
     <method name="IsCallerActive">
-      <arg type="b" name="is_active" direction="out"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="b" name="is_active" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </method>
+
+    <!--*****************************************************************************************-->
     <method name="RefreshCache">
       <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
-      <arg type="b" name="force" direction="in"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+        <doc:permission>Callers need the org.freedesktop.PackageKit.xxxxxxxxx</doc:permission>
+      </doc:doc>
+      <arg type="b" name="force" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </method>
+
+    <!--*****************************************************************************************-->
     <method name="RemovePackages">
       <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
-      <arg type="as" name="package_ids" direction="in"/>
-      <arg type="b" name="allow_deps" direction="in"/>
-      <arg type="b" name="autoremove" direction="in"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+        <doc:permission>Callers need the org.freedesktop.PackageKit.xxxxxxxxx</doc:permission>
+      </doc:doc>
+      <arg type="as" name="package_ids" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="b" name="allow_deps" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="b" name="autoremove" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </method>
+
+    <!--*****************************************************************************************-->
     <method name="RepoEnable">
       <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
-      <arg type="s" name="repo_id" direction="in"/>
-      <arg type="b" name="enabled" direction="in"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+        <doc:permission>Callers need the org.freedesktop.PackageKit.xxxxxxxxx</doc:permission>
+      </doc:doc>
+      <arg type="s" name="repo_id" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="b" name="enabled" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </method>
+
+    <!--*****************************************************************************************-->
     <method name="RepoSetData">
       <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
-      <arg type="s" name="repo_id" direction="in"/>
-      <arg type="s" name="parameter" direction="in"/>
-      <arg type="s" name="value" direction="in"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+        <doc:permission>Callers need the org.freedesktop.PackageKit.xxxxxxxxx</doc:permission>
+      </doc:doc>
+      <arg type="s" name="repo_id" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="parameter" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="value" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </method>
+
+    <!--*****************************************************************************************-->
     <method name="Resolve">
       <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
-      <arg type="s" name="filter" direction="in"/>
-      <arg type="s" name="package" direction="in"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="s" name="filter" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="package" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </method>
+
+    <!--*****************************************************************************************-->
     <method name="Rollback">
       <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
-      <arg type="s" name="transaction_id" direction="in"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+        <doc:permission>Callers need the org.freedesktop.PackageKit.xxxxxxxxx</doc:permission>
+      </doc:doc>
+      <arg type="s" name="transaction_id" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </method>
+
+    <!--*****************************************************************************************-->
     <method name="SearchDetails">
       <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
-      <arg type="s" name="filter" direction="in"/>
-      <arg type="s" name="search" direction="in"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="s" name="filter" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="search" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </method>
+
+    <!--*****************************************************************************************-->
     <method name="SearchFile">
       <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
-      <arg type="s" name="filter" direction="in"/>
-      <arg type="s" name="search" direction="in"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="s" name="filter" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="search" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </method>
+
+    <!--*****************************************************************************************-->
     <method name="SearchGroup">
       <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
-      <arg type="s" name="filter" direction="in"/>
-      <arg type="s" name="search" direction="in"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="s" name="filter" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="search" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </method>
+
+    <!--*****************************************************************************************-->
     <method name="SearchName">
       <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
-      <arg type="s" name="filter" direction="in"/>
-      <arg type="s" name="search" direction="in"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="s" name="filter" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="search" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </method>
+
+    <!--*****************************************************************************************-->
     <method name="UpdatePackages">
       <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
-      <arg type="as" name="package_ids" direction="in"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+        <doc:permission>Callers need the org.freedesktop.PackageKit.xxxxxxxxx</doc:permission>
+      </doc:doc>
+      <arg type="as" name="package_ids" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </method>
+
+    <!--*****************************************************************************************-->
     <method name="UpdateSystem">
       <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+        <doc:permission>Callers need the org.freedesktop.PackageKit.xxxxxxxxx</doc:permission>
+      </doc:doc>
     </method>
+
+    <!--*****************************************************************************************-->
     <method name="WhatProvides">
       <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
-      <arg type="s" name="filter" direction="in"/>
-      <arg type="s" name="type" direction="in"/>
-      <arg type="s" name="search" direction="in"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="s" name="filter" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="type" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="search" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </method>
 
+    <!--*****************************************************************************************-->
     <signal name="AllowCancel">
-      <arg type="b" name="allow_cancel" direction="out"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="b" name="allow_cancel" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </signal>
+
+    <!--*****************************************************************************************-->
     <signal name="CallerActiveChanged">
-      <arg type="b" name="is_active" direction="out"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="b" name="is_active" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </signal>
+
+    <!--*****************************************************************************************-->
     <signal name="Details">
-      <arg type="s" name="package_id" direction="out"/>
-      <arg type="s" name="license" direction="out"/>
-      <arg type="s" name="group" direction="out"/>
-      <arg type="s" name="detail" direction="out"/>
-      <arg type="s" name="url" direction="out"/>
-      <arg type="t" name="size" direction="out"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="s" name="package_id" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="license" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="group" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="detail" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="url" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="t" name="size" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </signal>
+
+    <!--*****************************************************************************************-->
     <signal name="ErrorCode">
-      <arg type="s" name="code" direction="out"/>
-      <arg type="s" name="details" direction="out"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="s" name="code" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="details" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </signal>
+
+    <!--*****************************************************************************************-->
     <signal name="Files">
-      <arg type="s" name="package_id" direction="out"/>
-      <arg type="s" name="file_list" direction="out"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="s" name="package_id" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="file_list" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </signal>
+
+    <!--*****************************************************************************************-->
     <signal name="Finished">
-      <arg type="s" name="status" direction="out"/>
-      <arg type="u" name="runtime" direction="out"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="s" name="status" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="u" name="runtime" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </signal>
+
+    <!--*****************************************************************************************-->
     <signal name="Message">
-      <arg type="s" name="message" direction="out"/>
-      <arg type="s" name="details" direction="out"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="s" name="message" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="details" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </signal>
+
+    <!--*****************************************************************************************-->
     <signal name="Package">
-      <arg type="s" name="info" direction="out"/>
-      <arg type="s" name="package_id" direction="out"/>
-      <arg type="s" name="summary" direction="out"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="s" name="info" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="package_id" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="summary" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </signal>
+
+    <!--*****************************************************************************************-->
     <signal name="ProgressChanged">
-      <arg type="u" name="percentage" direction="out"/>
-      <arg type="u" name="subpercentage" direction="out"/>
-      <arg type="u" name="elapsed" direction="out"/>
-      <arg type="u" name="remaining" direction="out"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="u" name="percentage" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="u" name="subpercentage" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="u" name="elapsed" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="u" name="remaining" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </signal>
+
+    <!--*****************************************************************************************-->
     <signal name="RepoDetail">
-      <arg type="s" name="repo_id" direction="out"/>
-      <arg type="s" name="description" direction="out"/>
-      <arg type="b" name="enabled" direction="out"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="s" name="repo_id" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="description" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="b" name="enabled" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </signal>
+
+    <!--*****************************************************************************************-->
     <signal name="RepoSignatureRequired">
-      <arg type="s" name="package_id" direction="out"/>
-      <arg type="s" name="repository_name" direction="out"/>
-      <arg type="s" name="key_url" direction="out"/>
-      <arg type="s" name="key_userid" direction="out"/>
-      <arg type="s" name="key_id" direction="out"/>
-      <arg type="s" name="key_fingerprint" direction="out"/>
-      <arg type="s" name="key_timestamp" direction="out"/>
-      <arg type="s" name="type" direction="out"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="s" name="package_id" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="repository_name" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="key_url" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="key_userid" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="key_id" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="key_fingerprint" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="key_timestamp" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="type" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </signal>
+
+    <!--*****************************************************************************************-->
     <signal name="EulaRequired">
-      <arg type="s" name="eula_id" direction="out"/>
-      <arg type="s" name="package_id" direction="out"/>
-      <arg type="s" name="vendor_name" direction="out"/>
-      <arg type="s" name="license_agreement" direction="out"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="s" name="eula_id" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="package_id" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="vendor_name" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="license_agreement" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </signal>
+
+    <!--*****************************************************************************************-->
     <signal name="RequireRestart">
-      <arg type="s" name="type" direction="out"/>
-      <arg type="s" name="details" direction="out"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="s" name="type" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="details" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </signal>
+
+    <!--*****************************************************************************************-->
     <signal name="StatusChanged">
-      <arg type="s" name="status" direction="out"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="s" name="status" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </signal>
+
+    <!--*****************************************************************************************-->
     <signal name="Transaction">
-      <arg type="s" name="old_tid" direction="out"/>
-      <arg type="s" name="timespec" direction="out"/>
-      <arg type="b" name="succeeded" direction="out"/>
-      <arg type="s" name="role" direction="out"/>
-      <arg type="u" name="duration" direction="out"/>
-      <arg type="s" name="data" direction="out"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="s" name="old_tid" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="timespec" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="b" name="succeeded" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="role" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="u" name="duration" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="data" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </signal>
+
+    <!--*****************************************************************************************-->
     <signal name="UpdateDetail">
-      <arg type="s" name="package_id" direction="out"/>
-      <arg type="s" name="updates" direction="out"/>
-      <arg type="s" name="obsoletes" direction="out"/>
-      <arg type="s" name="vendor_url" direction="out"/>
-      <arg type="s" name="bugzilla_url" direction="out"/>
-      <arg type="s" name="cve_url" direction="out"/>
-      <arg type="s" name="restart" direction="out"/>
-      <arg type="s" name="update_text" direction="out"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            xxx
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="s" name="package_id" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="updates" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="obsoletes" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="vendor_url" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="bugzilla_url" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="cve_url" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="restart" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="update_text" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              xxx
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </signal>
 
   </interface>
diff --git a/src/pk-interface.xml b/src/pk-interface.xml
index 7290bbe..90c7a3c 100644
--- a/src/pk-interface.xml
+++ b/src/pk-interface.xml
@@ -1,58 +1,355 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<node name="/">
+<!DOCTYPE node PUBLIC
+"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
+"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd" [
+  <!ENTITY ERROR_GENERAL "org.freedesktop.packagekit.Denied">
+]>
+<node name="/" xmlns:doc="http://www.freedesktop.org/dbus/1.0/doc.dtd">
   <interface name="org.freedesktop.PackageKit">
+    <doc:doc>
+      <doc:description>
+        <doc:para>
+          The root interface is used for interacting with the daemon.
+        </doc:para>
+      </doc:description>
+    </doc:doc>
 
+    <!--*****************************************************************************************-->
     <method name="GetActions">
-      <arg type="s" name="actions" direction="out"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            Gets a list of all the actions that are supported by the backend.
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="s" name="actions" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              A list of actions, e.g. <literal>search-name;get-updates;update-system</literal>
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </method>
+
+    <!--*****************************************************************************************-->
     <method name="GetBackendDetail">
-      <arg type="s" name="name" direction="out"/>
-      <arg type="s" name="author" direction="out"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            Gets any details about the backend being used by PackageKit
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="s" name="name" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              The name of the backend, e.g. yum
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="author" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              The author of the backend, e.g. <literal>Richard Hughes &lt;richard at hughsie.com&gt;</literal>
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </method>
+
+    <!--*****************************************************************************************-->
     <method name="GetFilters">
-      <arg type="s" name="filters" direction="out"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            Gets the list of filters that the backend supports
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="s" name="filters" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              The list of filters as a string, e.g. <literal>installed;devel</literal>
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </method>
+
+    <!--*****************************************************************************************-->
     <method name="GetGroups">
-      <arg type="s" name="groups" direction="out"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            Gets the groups that are supported
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="s" name="groups" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              The group list, e.g. <literal>accesories;games;system</literal>
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </method>
+
+    <!--*****************************************************************************************-->
     <method name="GetTid">
-      <arg type="s" name="tid" direction="out"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            Gets a new transaction ID from the daemon
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="s" name="tid" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              The tid, e.g. <literal>45_dafeca_checkpoint32</literal>
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </method>
+
+    <!--*****************************************************************************************-->
     <method name="GetTimeSinceAction">
-      <arg type="s" name="role" direction="in"/>
-      <arg type="u" name="seconds" direction="out"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            This method allows us to query how long since an action has successfully completed.
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="s" name="role" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              The role, e.g. <literal>update-system</literal>
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="u" name="seconds" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              The amount of time in seconds
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </method>
+
+    <!--*****************************************************************************************-->
     <method name="GetTransactionList">
-      <arg type="as" name="transactions" direction="out"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            Gets the transaction list of any transactions that are in progress
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="as" name="transactions" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              A list of transaction ID's
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </method>
+
+    <!--*****************************************************************************************-->
     <method name="StateHasChanged">
-      <arg type="s" name="reason" direction="in"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            This method suggests to PackageKit that the package backend state may have changed.
+            This allows plugins to the native package manager to suggest that PackageKit drops
+            it's caches.
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="s" name="reason" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              The reason of the state change, FIXME
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </method>
+
+    <!--*****************************************************************************************-->
     <method name="SuggestDaemonQuit">
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            Suggests to the daemon that it should quit as soon as possible, for instance if a native
+            package management tool is waiting to be used.
+          </doc:para>
+        </doc:description>
+      </doc:doc>
     </method>
+
+    <!--*****************************************************************************************-->
     <method name="GetNetworkState">
-      <arg type="s" name="state" direction="out"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            Gets the network state from the daemon. This is provided as some clients may not want
+            to use NetworkManager if the system daemon is configured to use something else.
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="s" name="state" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              The network state, e.g. FIXME
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </method>
+
+    <!--*****************************************************************************************-->
     <method name="SetProxy">
       <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
-      <arg type="s" name="proxy_http" direction="in"/>
-      <arg type="s" name="proxy_ftp" direction="in"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            Sets the proxy used by the dameon.
+          </doc:para>
+        </doc:description>
+        <doc:permission>Callers need the org.freedesktop.packagekit.set-proxy</doc:permission>
+      </doc:doc>
+      <arg type="s" name="proxy_http" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              The HTTP proxy, e.g. FIXME
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="proxy_ftp" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              The FTP proxy, e.g. FIXME
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </method>
 
+
+    <!--*****************************************************************************************-->
     <signal name="TransactionListChanged">
-      <arg type="as" name="transactions" direction="out"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            The transaction list has changed, because either a transaction has finished or a new
+            transaction created.
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="as" name="transactions" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              A list of transaction ID's.
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </signal>
+
+    <!--*****************************************************************************************-->
     <signal name="Locked">
-      <arg type="b" name="is_locked" direction="out"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            This signal is emitted when the backend is locked and native tools would fail.
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="b" name="is_locked" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              If we have locked the package backend.
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </signal>
+
+    <!--*****************************************************************************************-->
     <signal name="NetworkStateChanged">
-      <arg type="s" name="state" direction="out"/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            This signal is emitted when the network state has changed
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="s" name="state" direction="out">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              The new network state
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
     </signal>
+
+    <!--*****************************************************************************************-->
     <signal name="RestartSchedule">
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            A system restart has been sceduled
+          </doc:para>
+        </doc:description>
+      </doc:doc>
     </signal>
+
+    <!--*****************************************************************************************-->
     <signal name="RepoListChanged">
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            This signal is emitted when the repository list has changed
+          </doc:para>
+        </doc:description>
+      </doc:doc>
     </signal>
+
+    <!--*****************************************************************************************-->
     <signal name="UpdatesChanged">
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            This signal is emitted when the number of updates has changed
+          </doc:para>
+        </doc:description>
+      </doc:doc>
     </signal>
 
   </interface>
commit d46e48d14b80ab93f3f357e562eb4393ddfffdc5
Merge: 364bc06... 47aa83f...
Author: Sebastian Heinlein <devel at glatzor.de>
Date:   Mon Jun 9 19:58:48 2008 +0200

    Merge branch 'master' of git+ssh://glatzor@git.packagekit.org/srv/git/PackageKit

commit 364bc06f8a5b1c9dc0c295cc160e4d4314346924
Author: Sebastian Heinlein <devel at glatzor.de>
Date:   Sun Jun 8 20:24:05 2008 +0200

    APT: handle the installed flag in the get_id_from_package method correctly
         Thanks Patrick Niklaus for pointing out.

diff --git a/backends/apt/aptDBUSBackend.py b/backends/apt/aptDBUSBackend.py
index 22eb714..da1fad2 100755
--- a/backends/apt/aptDBUSBackend.py
+++ b/backends/apt/aptDBUSBackend.py
@@ -602,7 +602,7 @@ class PackageKitAptBackend(PackageKitBaseBackend):
         installed package will be returned.
         '''
         origin = ''
-        if installed == False and pkg.isInstalled:
+        if installed == True and pkg.isInstalled:
             pkgver = pkg.installedVersion
         else:
             pkgver = pkg.candidateVersion


More information about the PackageKit-commit mailing list