Blob Blame History Raw
diff --git a/configure.ac b/configure.ac
index 47b6e4e..d6364d2 100644
--- a/configure.ac
+++ b/configure.ac
@@ -130,8 +130,7 @@ GIO_REQUIRED=2.16.1
 DBUS_REQUIRED=1.1.1
 DBUS_GLIB_REQUIRED=0.74
 LIBNM_GLIB_REQUIRED=0.6.4
-POLKIT_DBUS_REQUIRED=0.8
-POLKIT_GRANT_REQUIRED=0.8
+POLKIT_GOBJECT_REQUIRED=0.91
 QTCORE_REQUIRED=4.4.0
 QTDBUS_REQUIRED=4.4.0
 QTGUI_REQUIRED=4.4.0
@@ -549,15 +548,9 @@ AC_SUBST(security_framework, "$with_security_framework")
 
 if test x$with_security_framework = xpolkit; then
 	PKG_CHECK_MODULES(POLKIT, \
-			  polkit-dbus >= $POLKIT_DBUS_REQUIRED \
-			  polkit-grant >= $POLKIT_GRANT_REQUIRED)
+			  polkit-gobject-1 >= $POLKIT_GOBJECT_REQUIRED)
 	AC_SUBST(POLKIT_CFLAGS)
 	AC_SUBST(POLKIT_LIBS)
-	AC_CHECK_PROG([POLKIT_POLICY_FILE_VALIDATE],
-		      [polkit-policy-file-validate], [polkit-policy-file-validate])
-	if test -z "$POLKIT_POLICY_FILE_VALIDATE"; then
-	   AC_MSG_ERROR([polkit-policy-file-validate not found])
-	fi
 	AC_DEFINE(USE_SECURITY_POLKIT, 1, [if we should use PolicyKit])
 elif test x$with_security_framework = xdummy; then
 	AC_DEFINE(USE_SECURITY_DUMMY, 1, [if we should use a dummy security framework])
diff --git a/lib/packagekit-glib/pk-client.c b/lib/packagekit-glib/pk-client.c
index c9200e9..1461451 100644
--- a/lib/packagekit-glib/pk-client.c
+++ b/lib/packagekit-glib/pk-client.c
@@ -42,10 +42,6 @@
 #include <glib/gprintf.h>
 #include <dbus/dbus-glib.h>
 
-#ifdef USE_SECURITY_POLKIT
-#include <polkit-dbus/polkit-dbus.h>
-#endif
-
 #include <packagekit-glib/pk-enum.h>
 #include <packagekit-glib/pk-bitfield.h>
 #include <packagekit-glib/pk-client.h>
@@ -190,131 +186,53 @@ pk_client_error_get_type (void)
  * pk_client_error_fixup:
  * @error: a %GError
  **/
-static gboolean
-pk_client_error_fixup (GError **error)
+static GError *
+pk_client_error_fixup (GError *error_local)
 {
+	GError *error;
 	const gchar *name;
-	guint code;
-	if (error != NULL && *error != NULL) {
-		/* get some proper debugging */
-		if ((*error)->domain == DBUS_GERROR &&
-		    (*error)->code == DBUS_GERROR_REMOTE_EXCEPTION) {
-			/* use one of our local codes */
-			name = dbus_g_error_get_name (*error);
-			code = PK_CLIENT_ERROR_FAILED;
-
-			/* trim common prefix */
-			if (g_str_has_prefix (name, "org.freedesktop.PackageKit.Transaction."))
-				name = &name[39];
-
-			/* try to get a better error */
-			if (g_str_has_prefix (name, "PermissionDenied") ||
-			    g_str_has_prefix (name, "RefusedByPolicy"))
-				code = PK_CLIENT_ERROR_FAILED_AUTH;
-			else if (g_str_has_prefix (name, "PackageIdInvalid") ||
-				 g_str_has_prefix (name, "SearchInvalid") ||
-				 g_str_has_prefix (name, "FilterInvalid") ||
-				 g_str_has_prefix (name, "InvalidProvide") ||
-				 g_str_has_prefix (name, "InputInvalid"))
-				code = PK_CLIENT_ERROR_INVALID_INPUT;
-			else if (g_str_has_prefix (name, "PackInvalid") ||
-				 g_str_has_prefix (name, "NoSuchFile") ||
-				 g_str_has_prefix (name, "NoSuchDirectory"))
-				code = PK_CLIENT_ERROR_INVALID_FILE;
-			else if (g_str_has_prefix (name, "NotSupported"))
-				code = PK_CLIENT_ERROR_NOT_SUPPORTED;
-
-			egg_debug ("fixing up code from %s to %i", name, code);
-			(*error)->code = code;
-		}
-		if (g_str_has_prefix ((*error)->message, "org.freedesktop.packagekit.")) {
-			egg_debug ("fixing up code for Policykit auth failure");
-			g_error_free (*error);
-			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_FAILED_AUTH, "PolicyKit authorization failure");
-		}
-		return TRUE;
-	}
-	return FALSE;
-}
-
-/**
- * pk_client_error_refused_by_policy:
- * @error: a valid #GError
- *
- * Return value: %TRUE if the error is the PolicyKit "RefusedByPolicy"
- **/
-static gboolean
-pk_client_error_refused_by_policy (GError *error)
-{
-	const gchar *error_name;
-
-	/* if not set */
-	if (error == NULL)
-		return FALSE;
-
-	/* not a dbus error */
-	if (error->code != DBUS_GERROR_REMOTE_EXCEPTION) {
-		egg_warning ("not a remote exception: %s", error->message);
-		return FALSE;
-	}
-
-	/* check for specific error */
-	error_name = dbus_g_error_get_name (error);
-	egg_debug ("ERROR: %s: %s", error_name, error->message);
-	if (egg_strequal (error_name, "org.freedesktop.PackageKit.RefusedByPolicy"))
-		return TRUE;
-	if (egg_strequal (error_name, "org.freedesktop.PackageKit.Transaction.RefusedByPolicy"))
-		return TRUE;
-	return FALSE;
-}
-
-/**
- * pk_client_error_auth_obtain:
- * @error: the GError with the failure
- *
- * This function is indented to be passed failure messages from dbus methods
- * so that extra auth can be requested.
- *
- * Return value: if we gained the privilege we asked for
- **/
-static gboolean
-pk_client_error_auth_obtain (GError *error)
-{
-	gboolean ret = FALSE;
-#ifdef USE_SECURITY_POLKIT
-	PolKitAction *action = NULL;
-	PolKitResult result;
-	gchar *action_id = NULL; /* we don't free this */
-	DBusError error2;
-	dbus_error_init (&error2);
 
-	g_return_val_if_fail (error != NULL, FALSE);
+	g_return_val_if_fail (error_local != NULL, NULL);
 
-	/* get PolKitAction */
-	ret = polkit_dbus_error_parse_from_strings ("org.freedesktop.PolicyKit.Error.NotAuthorized", error->message, &action, &result);
-	if (!ret) {
-		egg_warning ("Not a polkit auth failure: %s", error->message);
-		return FALSE;
+	/* PolicyKit failure */
+	if (g_str_has_prefix (error_local->message, "org.freedesktop.packagekit.")) {
+		egg_debug ("fixing up code for Policykit auth failure");
+		error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_FAILED_AUTH, "PolicyKit authorization failure");
+		goto out;
 	}
 
-	/* get action_id from PolKitAction */
-	ret = polkit_action_get_action_id (action, &action_id);
-	if (!ret) {
-		egg_warning ("Unable to get an action ID");
-		return FALSE;
+	/* new default error with correct domain and code */
+	error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_FAILED, "%s", error_local->message);
+
+	/* get some proper debugging */
+	if (error_local->domain == DBUS_GERROR &&
+	    error_local->code == DBUS_GERROR_REMOTE_EXCEPTION) {
+		/* use one of our local codes */
+		name = dbus_g_error_get_name (error_local);
+
+		/* trim common prefix */
+		if (g_str_has_prefix (name, "org.freedesktop.PackageKit.Transaction."))
+			name = &name[39];
+
+		/* try to get a better error */
+		if (g_str_has_prefix (name, "PermissionDenied") ||
+		    g_str_has_prefix (name, "RefusedByPolicy"))
+			error->code = PK_CLIENT_ERROR_FAILED_AUTH;
+		else if (g_str_has_prefix (name, "PackageIdInvalid") ||
+			 g_str_has_prefix (name, "SearchInvalid") ||
+			 g_str_has_prefix (name, "FilterInvalid") ||
+			 g_str_has_prefix (name, "InvalidProvide") ||
+			 g_str_has_prefix (name, "InputInvalid"))
+			error->code = PK_CLIENT_ERROR_INVALID_INPUT;
+		else if (g_str_has_prefix (name, "PackInvalid") ||
+			 g_str_has_prefix (name, "NoSuchFile") ||
+			 g_str_has_prefix (name, "NoSuchDirectory"))
+			error->code = PK_CLIENT_ERROR_INVALID_FILE;
+		else if (g_str_has_prefix (name, "NotSupported"))
+			error->code = PK_CLIENT_ERROR_NOT_SUPPORTED;
 	}
-
-	/* this blocks - use polkit_gnome_auth_obtain for non blocking version */
-	ret = polkit_auth_obtain (action_id, 0, getpid (), &error2);
-	if (dbus_error_is_set (&error2))
-		egg_warning ("Failed to obtain auth: %s", error2.message);
-	dbus_error_free (&error2);
-
-	egg_debug ("gained %s privilege = %d", action_id, ret);
-
-	polkit_action_unref (action);
-#endif
-	return ret;
+out:
+	return error;
 }
 
 /**
@@ -944,7 +862,8 @@ pk_client_allow_cancel_cb (DBusGProxy *proxy, gboolean allow_cancel, PkClient *c
 gboolean
 pk_client_get_allow_cancel (PkClient *client, gboolean *allow_cancel, GError **error)
 {
-	gboolean ret;
+	gboolean ret = FALSE;
+	GError *error_local = NULL;
 
 	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
 	g_return_val_if_fail (client->priv->tid != NULL, FALSE);
@@ -954,13 +873,21 @@ pk_client_get_allow_cancel (PkClient *client, gboolean *allow_cancel, GError **e
 	if (client->priv->proxy == NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
-		return FALSE;
+		goto out;
 	}
-	ret = dbus_g_proxy_call (client->priv->proxy, "GetAllowCancel", error,
+
+	/* do the method */
+	ret = dbus_g_proxy_call (client->priv->proxy, "GetAllowCancel", &error_local,
 				 G_TYPE_INVALID,
 				 G_TYPE_BOOLEAN, allow_cancel,
 				 G_TYPE_INVALID);
-	pk_client_error_fixup (error);
+	if (!ret) {
+		if (error != NULL)
+			*error = pk_client_error_fixup (error_local);
+		g_error_free (error_local);
+		goto out;
+	}
+out:
 	return ret;
 }
 
@@ -1033,8 +960,9 @@ pk_client_message_cb (DBusGProxy  *proxy, const gchar *message_text, const gchar
 gboolean
 pk_client_get_status (PkClient *client, PkStatusEnum *status, GError **error)
 {
-	gboolean ret;
-	gchar *status_text;
+	gboolean ret = FALSE;
+	gchar *status_text = NULL;
+	GError *error_local = NULL;
 
 	g_return_val_if_fail (status != NULL, FALSE);
 	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
@@ -1045,17 +973,23 @@ pk_client_get_status (PkClient *client, PkStatusEnum *status, GError **error)
 	if (client->priv->proxy == NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
-		return FALSE;
+		goto out;
 	}
-	ret = dbus_g_proxy_call (client->priv->proxy, "GetStatus", error,
+
+	/* do the method */
+	ret = dbus_g_proxy_call (client->priv->proxy, "GetStatus", &error_local,
 				 G_TYPE_INVALID,
 				 G_TYPE_STRING, &status_text,
 				 G_TYPE_INVALID);
-	pk_client_error_fixup (error);
-	if (ret) {
-		*status = pk_status_enum_from_text (status_text);
-		g_free (status_text);
+	if (!ret) {
+		if (error != NULL)
+			*error = pk_client_error_fixup (error_local);
+		g_error_free (error_local);
+		goto out;
 	}
+	*status = pk_status_enum_from_text (status_text);
+out:
+	g_free (status_text);
 	return ret;
 }
 
@@ -1073,7 +1007,8 @@ pk_client_get_status (PkClient *client, PkStatusEnum *status, GError **error)
 gboolean
 pk_client_get_package (PkClient *client, gchar **package, GError **error)
 {
-	gboolean ret;
+	gboolean ret = FALSE;
+	GError *error_local = NULL;
 
 	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
 	g_return_val_if_fail (package != NULL, FALSE);
@@ -1084,13 +1019,21 @@ pk_client_get_package (PkClient *client, gchar **package, GError **error)
 	if (client->priv->proxy == NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
-		return FALSE;
+		goto out;
 	}
-	ret = dbus_g_proxy_call (client->priv->proxy, "GetPackageLast", error,
+
+	/* do the method */
+	ret = dbus_g_proxy_call (client->priv->proxy, "GetPackageLast", &error_local,
 				 G_TYPE_INVALID,
 				 G_TYPE_STRING, package,
 				 G_TYPE_INVALID);
-	pk_client_error_fixup (error);
+	if (!ret) {
+		if (error != NULL)
+			*error = pk_client_error_fixup (error_local);
+		g_error_free (error_local);
+		goto out;
+	}
+out:
 	return ret;
 }
 
@@ -1114,7 +1057,8 @@ gboolean
 pk_client_get_progress (PkClient *client, guint *percentage, guint *subpercentage,
 			guint *elapsed, guint *remaining, GError **error)
 {
-	gboolean ret;
+	gboolean ret = FALSE;
+	GError *error_local = NULL;
 
 	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
 	g_return_val_if_fail (client->priv->tid != NULL, FALSE);
@@ -1124,16 +1068,24 @@ pk_client_get_progress (PkClient *client, guint *percentage, guint *subpercentag
 	if (client->priv->proxy == NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
-		return FALSE;
+		goto out;
 	}
-	ret = dbus_g_proxy_call (client->priv->proxy, "GetProgress", error,
+
+	/* do the method */
+	ret = dbus_g_proxy_call (client->priv->proxy, "GetProgress", &error_local,
 				 G_TYPE_INVALID,
 				 G_TYPE_UINT, percentage,
 				 G_TYPE_UINT, subpercentage,
 				 G_TYPE_UINT, elapsed,
 				 G_TYPE_UINT, remaining,
 				 G_TYPE_INVALID);
-	pk_client_error_fixup (error);
+	if (!ret) {
+		if (error != NULL)
+			*error = pk_client_error_fixup (error_local);
+		g_error_free (error_local);
+		goto out;
+	}
+out:
 	return ret;
 }
 
@@ -1152,9 +1104,10 @@ pk_client_get_progress (PkClient *client, guint *percentage, guint *subpercentag
 gboolean
 pk_client_get_role (PkClient *client, PkRoleEnum *role, gchar **text, GError **error)
 {
-	gboolean ret;
-	gchar *role_text;
+	gboolean ret = FALSE;
+	gchar *role_text = NULL;
 	gchar *text_temp;
+	GError *error_local = NULL;
 
 	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
 	g_return_val_if_fail (role != NULL, FALSE);
@@ -1164,7 +1117,7 @@ pk_client_get_role (PkClient *client, PkRoleEnum *role, gchar **text, GError **e
 	if (client->priv->proxy == NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
-		return FALSE;
+		goto out;
 	}
 
 	/* we can avoid a trip to the daemon */
@@ -1173,41 +1126,25 @@ pk_client_get_role (PkClient *client, PkRoleEnum *role, gchar **text, GError **e
 		return TRUE;
 	}
 
-	ret = dbus_g_proxy_call (client->priv->proxy, "GetRole", error,
+	/* do the method */
+	ret = dbus_g_proxy_call (client->priv->proxy, "GetRole", &error_local,
 				 G_TYPE_INVALID,
 				 G_TYPE_STRING, &role_text,
 				 G_TYPE_STRING, &text_temp,
 				 G_TYPE_INVALID);
-	if (ret) {
-		*role = pk_role_enum_from_text (role_text);
-		g_free (role_text);
-		if (text != NULL)
-			*text = text_temp;
-		else
-			g_free (text_temp);
-	}
-	pk_client_error_fixup (error);
-	return ret;
-}
-
-/**
- * pk_client_cancel_action:
- **/
-static gboolean
-pk_client_cancel_action (PkClient *client, GError **error)
-{
-	gboolean ret;
-
-	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
-	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
-
-	/* check to see if we have a valid proxy */
-	if (client->priv->proxy == NULL) {
-		*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
-		return FALSE;
+	if (!ret) {
+		if (error != NULL)
+			*error = pk_client_error_fixup (error_local);
+		g_error_free (error_local);
+		goto out;
 	}
-	ret = dbus_g_proxy_call (client->priv->proxy, "Cancel", error,
-				 G_TYPE_INVALID, G_TYPE_INVALID);
+	*role = pk_role_enum_from_text (role_text);
+	if (text != NULL)
+		*text = text_temp;
+	else
+		g_free (text_temp);
+out:
+	g_free (role_text);
 	return ret;
 }
 
@@ -1227,38 +1164,35 @@ pk_client_cancel_action (PkClient *client, GError **error)
 gboolean
 pk_client_cancel (PkClient *client, GError **error)
 {
-	gboolean ret;
+	gboolean ret = FALSE;
 	GError *error_local = NULL;
 
 	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
 	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
 
 	/* we don't need to cancel, so return TRUE */
-	if (client->priv->proxy == NULL)
-		return TRUE;
+	if (client->priv->proxy == NULL) {
+		ret = TRUE;
+		goto out;
+	}
 
 	/* we cannot cancel a client in ::Finished() */
 	if (client->priv->is_finishing) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_FAILED, "unable to cancel client in finished handler");
-		return FALSE;
+		goto out;
 	}
 
-	/* hopefully do the operation first time */
-	ret = pk_client_cancel_action (client, &error_local);
-
-	/* we were refused by policy */
-	if (!ret && pk_client_error_refused_by_policy (error_local)) {
-		/* try to get auth */
-		if (pk_client_error_auth_obtain (error_local)) {
-			/* clear old error */
-			g_clear_error (&error_local);
-
-			/* retry the action now we have got auth */
-			ret = pk_client_cancel_action (client, &error_local);
-		}
+	/* check to see if we have a valid proxy */
+	if (client->priv->proxy == NULL) {
+		*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
+		goto out;
 	}
 
+	/* do the method */
+	ret = dbus_g_proxy_call (client->priv->proxy, "Cancel", &error_local,
+				 G_TYPE_INVALID, G_TYPE_INVALID);
+
 	/* no error to process */
 	if (ret)
 		goto out;
@@ -1272,8 +1206,9 @@ pk_client_cancel (PkClient *client, GError **error)
 	}
 
 	/* we failed one of these, return the error to the user */
-	pk_client_error_fixup (&error_local);
-	g_propagate_error (error, error_local);
+	if (error != NULL)
+		*error = pk_client_error_fixup (error_local);
+	g_error_free (error_local);
 out:
 	return ret;
 }
@@ -1316,8 +1251,8 @@ pk_client_transaction_timeout_cb (PkClient *client)
 static gboolean
 pk_client_allocate_transaction_id (PkClient *client, GError **error)
 {
-	gboolean ret;
-	gchar *tid;
+	gboolean ret = FALSE;
+	gchar *tid = NULL;
 	GError *error_local = NULL;
 	const gchar **list;
 	guint len;
@@ -1332,7 +1267,7 @@ pk_client_allocate_transaction_id (PkClient *client, GError **error)
 		if (len > 0) {
 			if (error != NULL)
 				*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_FAILED, "will not queue as timeout 0");
-			return FALSE;
+			goto out;
 		}
 	}
 
@@ -1346,7 +1281,7 @@ pk_client_allocate_transaction_id (PkClient *client, GError **error)
 				*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_FAILED, "failed to get a TID: %s (%i)", error_local->message, error_local->code);
 		}
 		g_error_free (error_local);
-		return FALSE;
+		goto out;
 	}
 
 	/* free any old tid */
@@ -1355,19 +1290,19 @@ pk_client_allocate_transaction_id (PkClient *client, GError **error)
 
 	/* set that new ID to this GObject */
 	ret = pk_client_set_tid (client, tid, &error_local);
-	g_free (tid);
 	if (!ret) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_FAILED, "failed to set TID: %s", error_local->message);
 		g_error_free (error_local);
-		return FALSE;
+		goto out;
 	}
 
 	/* set a timeout */
 	if (client->priv->timeout > 0)
 		client->priv->timeout_id = g_timeout_add (client->priv->timeout, (GSourceFunc) pk_client_transaction_timeout_cb, client);
-
-	return TRUE;
+out:
+	g_free (tid);
+	return ret;
 }
 
 /**
@@ -1383,8 +1318,9 @@ pk_client_allocate_transaction_id (PkClient *client, GError **error)
 gboolean
 pk_client_get_updates (PkClient *client, PkBitfield filters, GError **error)
 {
-	gboolean ret;
-	gchar *filter_text;
+	gboolean ret = FALSE;
+	gchar *filter_text = NULL;
+	GError *error_local = NULL;
 
 	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
 	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
@@ -1393,13 +1329,13 @@ pk_client_get_updates (PkClient *client, PkBitfield filters, GError **error)
 	if (client->priv->tid != NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_FAILED, "TID already set to %s", client->priv->tid);
-		return FALSE;
+		goto out;
 	}
 
 	/* get and set a new ID */
 	ret = pk_client_allocate_transaction_id (client, error);
 	if (!ret)
-		return FALSE;
+		goto out;
 
 	/* save this so we can re-issue it */
 	client->priv->role = PK_ROLE_ENUM_GET_UPDATES;
@@ -1409,14 +1345,24 @@ pk_client_get_updates (PkClient *client, PkBitfield filters, GError **error)
 	if (client->priv->proxy == NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
-		return FALSE;
+		ret = FALSE;
+		goto out;
 	}
 	filter_text = pk_filter_bitfield_to_text (filters);
-	ret = dbus_g_proxy_call (client->priv->proxy, "GetUpdates", error,
+
+	/* do the method */
+	ret = dbus_g_proxy_call (client->priv->proxy, "GetUpdates", &error_local,
 				 G_TYPE_STRING, filter_text,
 				 G_TYPE_INVALID, G_TYPE_INVALID);
-	g_free (filter_text);
-	if (ret && !client->priv->is_finished) {
+	if (!ret) {
+		if (error != NULL)
+			*error = pk_client_error_fixup (error_local);
+		g_error_free (error_local);
+		goto out;
+	}
+
+	/* is not already finished */
+	if (!client->priv->is_finished) {
 		/* allow clients to respond in the status changed callback */
 		pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
 
@@ -1424,7 +1370,8 @@ pk_client_get_updates (PkClient *client, PkBitfield filters, GError **error)
 		if (client->priv->synchronous)
 			g_main_loop_run (client->priv->loop);
 	}
-	pk_client_error_fixup (error);
+out:
+	g_free (filter_text);
 	return ret;
 }
 
@@ -1440,7 +1387,8 @@ pk_client_get_updates (PkClient *client, PkBitfield filters, GError **error)
 gboolean
 pk_client_get_categories (PkClient *client, GError **error)
 {
-	gboolean ret;
+	gboolean ret = FALSE;
+	GError *error_local = NULL;
 
 	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
 	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
@@ -1449,13 +1397,13 @@ pk_client_get_categories (PkClient *client, GError **error)
 	if (client->priv->tid != NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_FAILED, "TID already set to %s", client->priv->tid);
-		return FALSE;
+		goto out;
 	}
 
 	/* get and set a new ID */
 	ret = pk_client_allocate_transaction_id (client, error);
 	if (!ret)
-		return FALSE;
+		goto out;
 
 	/* save this so we can re-issue it */
 	client->priv->role = PK_ROLE_ENUM_GET_CATEGORIES;
@@ -1468,11 +1416,22 @@ pk_client_get_categories (PkClient *client, GError **error)
 	if (client->priv->proxy == NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
-		return FALSE;
+		ret = FALSE;
+		goto out;
 	}
-	ret = dbus_g_proxy_call (client->priv->proxy, "GetCategories", error,
+
+	/* do the method */
+	ret = dbus_g_proxy_call (client->priv->proxy, "GetCategories", &error_local,
 				 G_TYPE_INVALID, G_TYPE_INVALID);
-	if (ret && !client->priv->is_finished) {
+	if (!ret) {
+		if (error != NULL)
+			*error = pk_client_error_fixup (error_local);
+		g_error_free (error_local);
+		goto out;
+	}
+
+	/* is not already finished */
+	if (!client->priv->is_finished) {
 		/* allow clients to respond in the status changed callback */
 		pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
 
@@ -1480,30 +1439,7 @@ pk_client_get_categories (PkClient *client, GError **error)
 		if (client->priv->synchronous)
 			g_main_loop_run (client->priv->loop);
 	}
-	pk_client_error_fixup (error);
-	return ret;
-}
-
-/**
- * pk_client_update_system_action:
- **/
-static gboolean
-pk_client_update_system_action (PkClient *client, GError **error)
-{
-	gboolean ret;
-
-	g_return_val_if_fail (client != NULL, FALSE);
-	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
-	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
-
-	/* check to see if we have a valid proxy */
-	if (client->priv->proxy == NULL) {
-		if (error != NULL)
-			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
-		return FALSE;
-	}
-	ret = dbus_g_proxy_call (client->priv->proxy, "UpdateSystem", error,
-				 G_TYPE_INVALID, G_TYPE_INVALID);
+out:
 	return ret;
 }
 
@@ -1524,7 +1460,7 @@ pk_client_update_system_action (PkClient *client, GError **error)
 gboolean
 pk_client_update_system (PkClient *client, GError **error)
 {
-	gboolean ret;
+	gboolean ret = FALSE;
 	GError *error_local = NULL; /* we can't use the same error as we might be NULL */
 
 	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
@@ -1534,7 +1470,7 @@ pk_client_update_system (PkClient *client, GError **error)
 	if (client->priv->tid != NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_FAILED, "TID already set to %s", client->priv->tid);
-		return FALSE;
+		goto out;
 	}
 
 	/* get and set a new ID */
@@ -1545,34 +1481,28 @@ pk_client_update_system (PkClient *client, GError **error)
 	/* save this so we can re-issue it */
 	client->priv->role = PK_ROLE_ENUM_UPDATE_SYSTEM;
 
-	/* hopefully do the operation first time */
-	ret = pk_client_update_system_action (client, &error_local);
-
-	/* we were refused by policy */
-	if (!ret && pk_client_error_refused_by_policy (error_local)) {
-		/* try to get auth */
-		if (pk_client_error_auth_obtain (error_local)) {
-			/* clear old error */
-			g_clear_error (&error_local);
-
-			/* get a new tid */
-			ret = pk_client_allocate_transaction_id (client, &error_local);
-			if (!ret)
-				goto out;
-
-			/* retry the action now we have got auth */
-			ret = pk_client_update_system_action (client, &error_local);
-		}
+	/* check to see if we have a valid proxy */
+	if (client->priv->proxy == NULL) {
+		if (error != NULL)
+			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
+		ret = FALSE;
+		goto out;
 	}
 
-out:
+	/* do the method */
+	ret = dbus_g_proxy_call (client->priv->proxy, "UpdateSystem", &error_local,
+				 G_TYPE_INVALID, G_TYPE_INVALID);
+
 	/* we failed one of these, return the error to the user */
 	if (!ret) {
-		pk_client_error_fixup (&error_local);
-		g_propagate_error (error, error_local);
+		if (error != NULL)
+			*error = pk_client_error_fixup (error_local);
+		g_error_free (error_local);
+		goto out;
 	}
 
-	if (ret && !client->priv->is_finished) {
+	/* is not already finished */
+	if (!client->priv->is_finished) {
 		/* allow clients to respond in the status changed callback */
 		pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
 
@@ -1580,7 +1510,7 @@ out:
 		if (client->priv->synchronous)
 			g_main_loop_run (client->priv->loop);
 	}
-
+out:
 	return ret;
 }
 
@@ -1599,8 +1529,9 @@ out:
 gboolean
 pk_client_search_name (PkClient *client, PkBitfield filters, const gchar *search, GError **error)
 {
-	gboolean ret;
-	gchar *filter_text;
+	gboolean ret = FALSE;
+	gchar *filter_text = NULL;
+	GError *error_local = NULL;
 
 	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
 	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
@@ -1609,13 +1540,13 @@ pk_client_search_name (PkClient *client, PkBitfield filters, const gchar *search
 	if (client->priv->tid != NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_FAILED, "TID already set to %s", client->priv->tid);
-		return FALSE;
+		goto out;
 	}
 
 	/* get and set a new ID */
 	ret = pk_client_allocate_transaction_id (client, error);
 	if (!ret)
-		return FALSE;
+		goto out;
 
 	/* save this so we can re-issue it */
 	client->priv->role = PK_ROLE_ENUM_SEARCH_NAME;
@@ -1626,15 +1557,25 @@ pk_client_search_name (PkClient *client, PkBitfield filters, const gchar *search
 	if (client->priv->proxy == NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
-		return FALSE;
+		ret = FALSE;
+		goto out;
 	}
 	filter_text = pk_filter_bitfield_to_text (filters);
-	ret = dbus_g_proxy_call (client->priv->proxy, "SearchName", error,
+
+	/* do the method */
+	ret = dbus_g_proxy_call (client->priv->proxy, "SearchName", &error_local,
 				 G_TYPE_STRING, filter_text,
 				 G_TYPE_STRING, search,
 				 G_TYPE_INVALID, G_TYPE_INVALID);
-	g_free (filter_text);
-	if (ret && !client->priv->is_finished) {
+	if (!ret) {
+		if (error != NULL)
+			*error = pk_client_error_fixup (error_local);
+		g_error_free (error_local);
+		goto out;
+	}
+
+	/* is not already finished */
+	if (!client->priv->is_finished) {
 		/* allow clients to respond in the status changed callback */
 		pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
 
@@ -1642,7 +1583,8 @@ pk_client_search_name (PkClient *client, PkBitfield filters, const gchar *search
 		if (client->priv->synchronous)
 			g_main_loop_run (client->priv->loop);
 	}
-	pk_client_error_fixup (error);
+out:
+	g_free (filter_text);
 	return ret;
 }
 
@@ -1662,8 +1604,9 @@ pk_client_search_name (PkClient *client, PkBitfield filters, const gchar *search
 gboolean
 pk_client_search_details (PkClient *client, PkBitfield filters, const gchar *search, GError **error)
 {
-	gboolean ret;
-	gchar *filter_text;
+	gboolean ret = FALSE;
+	gchar *filter_text = NULL;
+	GError *error_local = NULL;
 
 	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
 	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
@@ -1672,13 +1615,13 @@ pk_client_search_details (PkClient *client, PkBitfield filters, const gchar *sea
 	if (client->priv->tid != NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_FAILED, "TID already set to %s", client->priv->tid);
-		return FALSE;
+		goto out;
 	}
 
 	/* get and set a new ID */
 	ret = pk_client_allocate_transaction_id (client, error);
 	if (!ret)
-		return FALSE;
+		goto out;
 
 	/* save this so we can re-issue it */
 	client->priv->role = PK_ROLE_ENUM_SEARCH_DETAILS;
@@ -1689,15 +1632,25 @@ pk_client_search_details (PkClient *client, PkBitfield filters, const gchar *sea
 	if (client->priv->proxy == NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
-		return FALSE;
+		ret = FALSE;
+		goto out;
 	}
 	filter_text = pk_filter_bitfield_to_text (filters);
-	ret = dbus_g_proxy_call (client->priv->proxy, "SearchDetails", error,
+
+	/* do the method */
+	ret = dbus_g_proxy_call (client->priv->proxy, "SearchDetails", &error_local,
 				 G_TYPE_STRING, filter_text,
 				 G_TYPE_STRING, search,
 				 G_TYPE_INVALID, G_TYPE_INVALID);
-	g_free (filter_text);
-	if (ret && !client->priv->is_finished) {
+	if (!ret) {
+		if (error != NULL)
+			*error = pk_client_error_fixup (error_local);
+		g_error_free (error_local);
+		goto out;
+	}
+
+	/* is not already finished */
+	if (!client->priv->is_finished) {
 		/* allow clients to respond in the status changed callback */
 		pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
 
@@ -1705,7 +1658,8 @@ pk_client_search_details (PkClient *client, PkBitfield filters, const gchar *sea
 		if (client->priv->synchronous)
 			g_main_loop_run (client->priv->loop);
 	}
-	pk_client_error_fixup (error);
+out:
+	g_free (filter_text);
 	return ret;
 }
 
@@ -1723,8 +1677,9 @@ pk_client_search_details (PkClient *client, PkBitfield filters, const gchar *sea
 gboolean
 pk_client_search_group (PkClient *client, PkBitfield filters, const gchar *search, GError **error)
 {
-	gboolean ret;
-	gchar *filter_text;
+	gboolean ret = FALSE;
+	gchar *filter_text = NULL;
+	GError *error_local = NULL;
 
 	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
 	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
@@ -1733,13 +1688,13 @@ pk_client_search_group (PkClient *client, PkBitfield filters, const gchar *searc
 	if (client->priv->tid != NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_FAILED, "TID already set to %s", client->priv->tid);
-		return FALSE;
+		goto out;
 	}
 
 	/* get and set a new ID */
 	ret = pk_client_allocate_transaction_id (client, error);
 	if (!ret)
-		return FALSE;
+		goto out;
 
 	/* save this so we can re-issue it */
 	client->priv->role = PK_ROLE_ENUM_SEARCH_GROUP;
@@ -1750,15 +1705,25 @@ pk_client_search_group (PkClient *client, PkBitfield filters, const gchar *searc
 	if (client->priv->proxy == NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
-		return FALSE;
+		ret = FALSE;
+		goto out;
 	}
 	filter_text = pk_filter_bitfield_to_text (filters);
-	ret = dbus_g_proxy_call (client->priv->proxy, "SearchGroup", error,
+
+	/* do the method */
+	ret = dbus_g_proxy_call (client->priv->proxy, "SearchGroup", &error_local,
 				 G_TYPE_STRING, filter_text,
 				 G_TYPE_STRING, search,
 				 G_TYPE_INVALID, G_TYPE_INVALID);
-	g_free (filter_text);
-	if (ret && !client->priv->is_finished) {
+	if (!ret) {
+		if (error != NULL)
+			*error = pk_client_error_fixup (error_local);
+		g_error_free (error_local);
+		goto out;
+	}
+
+	/* is not already finished */
+	if (!client->priv->is_finished) {
 		/* allow clients to respond in the status changed callback */
 		pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
 
@@ -1766,7 +1731,8 @@ pk_client_search_group (PkClient *client, PkBitfield filters, const gchar *searc
 		if (client->priv->synchronous)
 			g_main_loop_run (client->priv->loop);
 	}
-	pk_client_error_fixup (error);
+out:
+	g_free (filter_text);
 	return ret;
 }
 
@@ -1784,8 +1750,9 @@ pk_client_search_group (PkClient *client, PkBitfield filters, const gchar *searc
 gboolean
 pk_client_search_file (PkClient *client, PkBitfield filters, const gchar *search, GError **error)
 {
-	gboolean ret;
-	gchar *filter_text;
+	gboolean ret = FALSE;
+	gchar *filter_text = NULL;
+	GError *error_local = NULL;
 
 	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
 	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
@@ -1794,13 +1761,13 @@ pk_client_search_file (PkClient *client, PkBitfield filters, const gchar *search
 	if (client->priv->tid != NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_FAILED, "TID already set to %s", client->priv->tid);
-		return FALSE;
+		goto out;
 	}
 
 	/* get and set a new ID */
 	ret = pk_client_allocate_transaction_id (client, error);
 	if (!ret)
-		return FALSE;
+		goto out;
 
 	/* save this so we can re-issue it */
 	client->priv->role = PK_ROLE_ENUM_SEARCH_FILE;
@@ -1811,15 +1778,25 @@ pk_client_search_file (PkClient *client, PkBitfield filters, const gchar *search
 	if (client->priv->proxy == NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
-		return FALSE;
+		ret = FALSE;
+		goto out;
 	}
 	filter_text = pk_filter_bitfield_to_text (filters);
-	ret = dbus_g_proxy_call (client->priv->proxy, "SearchFile", error,
+
+	/* do the method */
+	ret = dbus_g_proxy_call (client->priv->proxy, "SearchFile", &error_local,
 				 G_TYPE_STRING, filter_text,
 				 G_TYPE_STRING, search,
 				 G_TYPE_INVALID, G_TYPE_INVALID);
-	g_free (filter_text);
-	if (ret && !client->priv->is_finished) {
+	if (!ret) {
+		if (error != NULL)
+			*error = pk_client_error_fixup (error_local);
+		g_error_free (error_local);
+		goto out;
+	}
+
+	/* is not already finished */
+	if (!client->priv->is_finished) {
 		/* allow clients to respond in the status changed callback */
 		pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
 
@@ -1827,7 +1804,8 @@ pk_client_search_file (PkClient *client, PkBitfield filters, const gchar *search
 		if (client->priv->synchronous)
 			g_main_loop_run (client->priv->loop);
 	}
-	pk_client_error_fixup (error);
+out:
+	g_free (filter_text);
 	return ret;
 }
 
@@ -1846,9 +1824,10 @@ pk_client_search_file (PkClient *client, PkBitfield filters, const gchar *search
 gboolean
 pk_client_get_depends (PkClient *client, PkBitfield filters, gchar **package_ids, gboolean recursive, GError **error)
 {
-	gboolean ret;
-	gchar *filter_text;
+	gboolean ret = FALSE;
+	gchar *filter_text = NULL;
 	gchar *package_ids_temp;
+	GError *error_local = NULL;
 
 	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
 	g_return_val_if_fail (package_ids != NULL, FALSE);
@@ -1858,7 +1837,7 @@ pk_client_get_depends (PkClient *client, PkBitfield filters, gchar **package_ids
 	if (client->priv->tid != NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_FAILED, "TID already set to %s", client->priv->tid);
-		return FALSE;
+		goto out;
 	}
 
 	/* check the PackageIDs here to avoid a round trip if invalid */
@@ -1868,13 +1847,13 @@ pk_client_get_depends (PkClient *client, PkBitfield filters, gchar **package_ids
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_INVALID_INPUT, "package_ids '%s' are not valid", package_ids_temp);
 		g_free (package_ids_temp);
-		return FALSE;
+		goto out;
 	}
 
 	/* get and set a new ID */
 	ret = pk_client_allocate_transaction_id (client, error);
 	if (!ret)
-		return FALSE;
+		goto out;
 
 	/* save this so we can re-issue it */
 	client->priv->role = PK_ROLE_ENUM_GET_DEPENDS;
@@ -1886,16 +1865,26 @@ pk_client_get_depends (PkClient *client, PkBitfield filters, gchar **package_ids
 	if (client->priv->proxy == NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
-		return FALSE;
+		ret = FALSE;
+		goto out;
 	}
 	filter_text = pk_filter_bitfield_to_text (filters);
-	ret = dbus_g_proxy_call (client->priv->proxy, "GetDepends", error,
+
+	/* do the method */
+	ret = dbus_g_proxy_call (client->priv->proxy, "GetDepends", &error_local,
 				 G_TYPE_STRING, filter_text,
 				 G_TYPE_STRV, package_ids,
 				 G_TYPE_BOOLEAN, recursive,
 				 G_TYPE_INVALID, G_TYPE_INVALID);
-	g_free (filter_text);
-	if (ret && !client->priv->is_finished) {
+	if (!ret) {
+		if (error != NULL)
+			*error = pk_client_error_fixup (error_local);
+		g_error_free (error_local);
+		goto out;
+	}
+
+	/* is not already finished */
+	if (!client->priv->is_finished) {
 		/* allow clients to respond in the status changed callback */
 		pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
 
@@ -1903,7 +1892,8 @@ pk_client_get_depends (PkClient *client, PkBitfield filters, gchar **package_ids
 		if (client->priv->synchronous)
 			g_main_loop_run (client->priv->loop);
 	}
-	pk_client_error_fixup (error);
+out:
+	g_free (filter_text);
 	return ret;
 }
 
@@ -1919,8 +1909,9 @@ pk_client_get_depends (PkClient *client, PkBitfield filters, gchar **package_ids
 gboolean
 pk_client_download_packages (PkClient *client, gchar **package_ids, const gchar *directory, GError **error)
 {
-	gboolean ret;
+	gboolean ret = FALSE;
 	gchar *package_ids_temp;
+	GError *error_local = NULL;
 
 	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
 	g_return_val_if_fail (package_ids != NULL, FALSE);
@@ -1930,7 +1921,7 @@ pk_client_download_packages (PkClient *client, gchar **package_ids, const gchar
 	if (client->priv->tid != NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_FAILED, "TID already set to %s", client->priv->tid);
-		return FALSE;
+		goto out;
 	}
 
 	/* check the PackageIDs here to avoid a round trip if invalid */
@@ -1940,14 +1931,13 @@ pk_client_download_packages (PkClient *client, gchar **package_ids, const gchar
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_INVALID_INPUT, "package_ids '%s' are not valid", package_ids_temp);
 		g_free (package_ids_temp);
-		return FALSE;
+		goto out;
 	}
 
 	/* get and set a new ID */
 	ret = pk_client_allocate_transaction_id (client, error);
-	if (!ret) {
-		return FALSE;
-	}
+	if (!ret)
+		goto out;
 
 	/* save this so we can re-issue it */
 	client->priv->role = PK_ROLE_ENUM_DOWNLOAD_PACKAGES;
@@ -1958,12 +1948,23 @@ pk_client_download_packages (PkClient *client, gchar **package_ids, const gchar
 	if (client->priv->proxy == NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
-		return FALSE;
+		ret = FALSE;
+		goto out;
 	}
-	ret = dbus_g_proxy_call (client->priv->proxy, "DownloadPackages", error,
+
+	/* do the method */
+	ret = dbus_g_proxy_call (client->priv->proxy, "DownloadPackages", &error_local,
 				 G_TYPE_STRV, package_ids,
 				 G_TYPE_INVALID, G_TYPE_INVALID);
-	if (ret && !client->priv->is_finished) {
+	if (!ret) {
+		if (error != NULL)
+			*error = pk_client_error_fixup (error_local);
+		g_error_free (error_local);
+		goto out;
+	}
+
+	/* is not already finished */
+	if (!client->priv->is_finished) {
 		/* allow clients to respond in the status changed callback */
 		pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
 
@@ -1971,7 +1972,7 @@ pk_client_download_packages (PkClient *client, gchar **package_ids, const gchar
 		if (client->priv->synchronous)
 			g_main_loop_run (client->priv->loop);
 	}
-	pk_client_error_fixup (error);
+out:
 	return ret;
 }
 
@@ -1988,8 +1989,9 @@ pk_client_download_packages (PkClient *client, gchar **package_ids, const gchar
 gboolean
 pk_client_get_packages (PkClient *client, PkBitfield filters, GError **error)
 {
-	gboolean ret;
-	gchar *filter_text;
+	gboolean ret = FALSE;
+	gchar *filter_text = NULL;
+	GError *error_local = NULL;
 
 	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
 	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
@@ -1998,13 +2000,13 @@ pk_client_get_packages (PkClient *client, PkBitfield filters, GError **error)
 	if (client->priv->tid != NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_FAILED, "TID already set to %s", client->priv->tid);
-		return FALSE;
+		goto out;
 	}
 
 	/* get and set a new ID */
 	ret = pk_client_allocate_transaction_id (client, error);
 	if (!ret)
-		return FALSE;
+		goto out;
 
 	/* save this so we can re-issue it */
 	client->priv->role = PK_ROLE_ENUM_GET_PACKAGES;
@@ -2014,14 +2016,24 @@ pk_client_get_packages (PkClient *client, PkBitfield filters, GError **error)
 	if (client->priv->proxy == NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
-		return FALSE;
+		ret = FALSE;
+		goto out;
 	}
 	filter_text = pk_filter_bitfield_to_text (filters);
-	ret = dbus_g_proxy_call (client->priv->proxy, "GetPackages", error,
+
+	/* do the method */
+	ret = dbus_g_proxy_call (client->priv->proxy, "GetPackages", &error_local,
 				 G_TYPE_STRING, filter_text,
 				 G_TYPE_INVALID, G_TYPE_INVALID);
-	g_free (filter_text);
-	if (ret && !client->priv->is_finished) {
+	if (!ret) {
+		if (error != NULL)
+			*error = pk_client_error_fixup (error_local);
+		g_error_free (error_local);
+		goto out;
+	}
+
+	/* is not already finished */
+	if (!client->priv->is_finished) {
 		/* allow clients to respond in the status changed callback */
 		pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
 
@@ -2029,7 +2041,8 @@ pk_client_get_packages (PkClient *client, PkBitfield filters, GError **error)
 		if (client->priv->synchronous)
 			g_main_loop_run (client->priv->loop);
 	}
-	pk_client_error_fixup (error);
+out:
+	g_free (filter_text);
 	return ret;
 }
 
@@ -2048,7 +2061,8 @@ pk_client_get_packages (PkClient *client, PkBitfield filters, GError **error)
 gboolean
 pk_client_set_locale (PkClient *client, const gchar *code, GError **error)
 {
-	gboolean ret;
+	gboolean ret = FALSE;
+	GError *error_local = NULL;
 
 	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
 	g_return_val_if_fail (code != NULL, FALSE);
@@ -2058,12 +2072,20 @@ pk_client_set_locale (PkClient *client, const gchar *code, GError **error)
 	if (client->priv->proxy == NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
-		return FALSE;
+		goto out;
 	}
-	ret = dbus_g_proxy_call (client->priv->proxy, "SetLocale", error,
+
+	/* do the method */
+	ret = dbus_g_proxy_call (client->priv->proxy, "SetLocale", &error_local,
 				 G_TYPE_STRING, code,
 				 G_TYPE_INVALID, G_TYPE_INVALID);
-	pk_client_error_fixup (error);
+	if (!ret) {
+		if (error != NULL)
+			*error = pk_client_error_fixup (error_local);
+		g_error_free (error_local);
+		goto out;
+	}
+out:
 	return ret;
 }
 
@@ -2082,9 +2104,10 @@ pk_client_set_locale (PkClient *client, const gchar *code, GError **error)
 gboolean
 pk_client_get_requires (PkClient *client, PkBitfield filters, gchar **package_ids, gboolean recursive, GError **error)
 {
-	gboolean ret;
-	gchar *filter_text;
+	gboolean ret = FALSE;
+	gchar *filter_text = NULL;
 	gchar *package_ids_temp;
+	GError *error_local = NULL;
 
 	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
 	g_return_val_if_fail (package_ids != NULL, FALSE);
@@ -2094,7 +2117,7 @@ pk_client_get_requires (PkClient *client, PkBitfield filters, gchar **package_id
 	if (client->priv->tid != NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_FAILED, "TID already set to %s", client->priv->tid);
-		return FALSE;
+		goto out;
 	}
 
 	/* check the PackageIDs here to avoid a round trip if invalid */
@@ -2104,13 +2127,13 @@ pk_client_get_requires (PkClient *client, PkBitfield filters, gchar **package_id
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_INVALID_INPUT, "package_ids '%s' are not valid", package_ids_temp);
 		g_free (package_ids_temp);
-		return FALSE;
+		goto out;
 	}
 
 	/* get and set a new ID */
 	ret = pk_client_allocate_transaction_id (client, error);
 	if (!ret)
-		return FALSE;
+		goto out;
 
 	/* save this so we can re-issue it */
 	client->priv->role = PK_ROLE_ENUM_GET_REQUIRES;
@@ -2122,16 +2145,26 @@ pk_client_get_requires (PkClient *client, PkBitfield filters, gchar **package_id
 	if (client->priv->proxy == NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
-		return FALSE;
+		ret = FALSE;
+		goto out;
 	}
 	filter_text = pk_filter_bitfield_to_text (filters);
-	ret = dbus_g_proxy_call (client->priv->proxy, "GetRequires", error,
+
+	/* do the method */
+	ret = dbus_g_proxy_call (client->priv->proxy, "GetRequires", &error_local,
 				 G_TYPE_STRING, filter_text,
 				 G_TYPE_STRV, package_ids,
 				 G_TYPE_BOOLEAN, recursive,
 				 G_TYPE_INVALID, G_TYPE_INVALID);
-	g_free (filter_text);
-	if (ret && !client->priv->is_finished) {
+	if (!ret) {
+		if (error != NULL)
+			*error = pk_client_error_fixup (error_local);
+		g_error_free (error_local);
+		goto out;
+	}
+
+	/* is not already finished */
+	if (!client->priv->is_finished) {
 		/* allow clients to respond in the status changed callback */
 		pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
 
@@ -2139,7 +2172,8 @@ pk_client_get_requires (PkClient *client, PkBitfield filters, gchar **package_id
 		if (client->priv->synchronous)
 			g_main_loop_run (client->priv->loop);
 	}
-	pk_client_error_fixup (error);
+out:
+	g_free (filter_text);
 	return ret;
 }
 
@@ -2161,9 +2195,10 @@ gboolean
 pk_client_what_provides (PkClient *client, PkBitfield filters, PkProvidesEnum provides,
 			 const gchar *search, GError **error)
 {
-	gboolean ret;
+	gboolean ret = FALSE;
 	const gchar *provides_text;
-	gchar *filter_text;
+	gchar *filter_text = NULL;
+	GError *error_local = NULL;
 
 	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
 	g_return_val_if_fail (provides != PK_PROVIDES_ENUM_UNKNOWN, FALSE);
@@ -2174,13 +2209,13 @@ pk_client_what_provides (PkClient *client, PkBitfield filters, PkProvidesEnum pr
 	if (client->priv->tid != NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_FAILED, "TID already set to %s", client->priv->tid);
-		return FALSE;
+		goto out;
 	}
 
 	/* get and set a new ID */
 	ret = pk_client_allocate_transaction_id (client, error);
 	if (!ret)
-		return FALSE;
+		goto out;
 
 	/* save this so we can re-issue it */
 	client->priv->role = PK_ROLE_ENUM_WHAT_PROVIDES;
@@ -2194,16 +2229,26 @@ pk_client_what_provides (PkClient *client, PkBitfield filters, PkProvidesEnum pr
 	if (client->priv->proxy == NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
-		return FALSE;
+		ret = FALSE;
+		goto out;
 	}
 	filter_text = pk_filter_bitfield_to_text (filters);
-	ret = dbus_g_proxy_call (client->priv->proxy, "WhatProvides", error,
+
+	/* do the method */
+	ret = dbus_g_proxy_call (client->priv->proxy, "WhatProvides", &error_local,
 				 G_TYPE_STRING, filter_text,
 				 G_TYPE_STRING, provides_text,
 				 G_TYPE_STRING, search,
 				 G_TYPE_INVALID, G_TYPE_INVALID);
-	g_free (filter_text);
-	if (ret && !client->priv->is_finished) {
+	if (!ret) {
+		if (error != NULL)
+			*error = pk_client_error_fixup (error_local);
+		g_error_free (error_local);
+		goto out;
+	}
+
+	/* is not already finished */
+	if (!client->priv->is_finished) {
 		/* allow clients to respond in the status changed callback */
 		pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
 
@@ -2211,7 +2256,8 @@ pk_client_what_provides (PkClient *client, PkBitfield filters, PkProvidesEnum pr
 		if (client->priv->synchronous)
 			g_main_loop_run (client->priv->loop);
 	}
-	pk_client_error_fixup (error);
+out:
+	g_free (filter_text);
 	return ret;
 }
 
@@ -2229,8 +2275,9 @@ pk_client_what_provides (PkClient *client, PkBitfield filters, PkProvidesEnum pr
 gboolean
 pk_client_get_update_detail (PkClient *client, gchar **package_ids, GError **error)
 {
-	gboolean ret;
+	gboolean ret = FALSE;
 	gchar *package_ids_temp;
+	GError *error_local = NULL;
 
 	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
 	g_return_val_if_fail (package_ids != NULL, FALSE);
@@ -2240,7 +2287,7 @@ pk_client_get_update_detail (PkClient *client, gchar **package_ids, GError **err
 	if (client->priv->tid != NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_FAILED, "TID already set to %s", client->priv->tid);
-		return FALSE;
+		goto out;
 	}
 
 	/* check the PackageIDs here to avoid a round trip if invalid */
@@ -2250,13 +2297,13 @@ pk_client_get_update_detail (PkClient *client, gchar **package_ids, GError **err
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_INVALID_INPUT, "package_ids '%s' are not valid", package_ids_temp);
 		g_free (package_ids_temp);
-		return FALSE;
+		goto out;
 	}
 
 	/* get and set a new ID */
 	ret = pk_client_allocate_transaction_id (client, error);
 	if (!ret)
-		return FALSE;
+		goto out;
 
 	/* save this so we can re-issue it */
 	client->priv->role = PK_ROLE_ENUM_GET_UPDATE_DETAIL;
@@ -2270,12 +2317,23 @@ pk_client_get_update_detail (PkClient *client, gchar **package_ids, GError **err
 	if (client->priv->proxy == NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
-		return FALSE;
+		ret = FALSE;
+		goto out;
 	}
-	ret = dbus_g_proxy_call (client->priv->proxy, "GetUpdateDetail", error,
+
+	/* do the method */
+	ret = dbus_g_proxy_call (client->priv->proxy, "GetUpdateDetail", &error_local,
 				 G_TYPE_STRV, package_ids,
 				 G_TYPE_INVALID, G_TYPE_INVALID);
-	if (ret && !client->priv->is_finished) {
+	if (!ret) {
+		if (error != NULL)
+			*error = pk_client_error_fixup (error_local);
+		g_error_free (error_local);
+		goto out;
+	}
+
+	/* is not already finished */
+	if (!client->priv->is_finished) {
 		/* allow clients to respond in the status changed callback */
 		pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
 
@@ -2283,30 +2341,7 @@ pk_client_get_update_detail (PkClient *client, gchar **package_ids, GError **err
 		if (client->priv->synchronous)
 			g_main_loop_run (client->priv->loop);
 	}
-	pk_client_error_fixup (error);
-	return ret;
-}
-
-/**
- * pk_client_rollback_action:
- **/
-static gboolean
-pk_client_rollback_action (PkClient *client, const gchar *transaction_id, GError **error)
-{
-	gboolean ret;
-
-	g_return_val_if_fail (client != NULL, FALSE);
-	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
-	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
-
-	/* check to see if we have a valid proxy */
-	if (client->priv->proxy == NULL) {
-		*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
-		return FALSE;
-	}
-	ret = dbus_g_proxy_call (client->priv->proxy, "Rollback", error,
-				 G_TYPE_STRING, transaction_id,
-				 G_TYPE_INVALID, G_TYPE_INVALID);
+out:
 	return ret;
 }
 
@@ -2324,7 +2359,7 @@ pk_client_rollback_action (PkClient *client, const gchar *transaction_id, GError
 gboolean
 pk_client_rollback (PkClient *client, const gchar *transaction_id, GError **error)
 {
-	gboolean ret;
+	gboolean ret = FALSE;
 	GError *error_local = NULL;
 
 	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
@@ -2334,46 +2369,39 @@ pk_client_rollback (PkClient *client, const gchar *transaction_id, GError **erro
 	if (client->priv->tid != NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_FAILED, "TID already set to %s", client->priv->tid);
-		return FALSE;
+		goto out;
 	}
 
 	/* get and set a new ID */
 	ret = pk_client_allocate_transaction_id (client, error);
 	if (!ret)
-		return FALSE;
+		goto out;
 
 	/* save this so we can re-issue it */
 	client->priv->role = PK_ROLE_ENUM_ROLLBACK;
 	client->priv->cached_transaction_id = g_strdup (transaction_id);
 
-	/* hopefully do the operation first time */
-	ret = pk_client_rollback_action (client, transaction_id, &error_local);
-
-	/* we were refused by policy */
-	if (!ret && pk_client_error_refused_by_policy (error_local)) {
-		/* try to get auth */
-		if (pk_client_error_auth_obtain (error_local)) {
-			/* clear old error */
-			g_clear_error (&error_local);
-
-			/* get a new tid */
-			ret = pk_client_allocate_transaction_id (client, &error_local);
-			if (!ret)
-				goto out;
-
-			/* retry the action now we have got auth */
-			ret = pk_client_rollback_action (client, transaction_id, &error_local);
-		}
+	/* check to see if we have a valid proxy */
+	if (client->priv->proxy == NULL) {
+		*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
+		goto out;
 	}
 
-out:
+	/* do the method */
+	ret = dbus_g_proxy_call (client->priv->proxy, "Rollback", &error_local,
+				 G_TYPE_STRING, transaction_id,
+				 G_TYPE_INVALID, G_TYPE_INVALID);
+
 	/* we failed one of these, return the error to the user */
 	if (!ret) {
-		pk_client_error_fixup (&error_local);
-		g_propagate_error (error, error_local);
+		if (error != NULL)
+			*error = pk_client_error_fixup (error_local);
+		g_error_free (error_local);
+		goto out;
 	}
 
-	if (ret && !client->priv->is_finished) {
+	/* is not already finished */
+	if (!client->priv->is_finished) {
 		/* allow clients to respond in the status changed callback */
 		pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
 
@@ -2381,7 +2409,7 @@ out:
 		if (client->priv->synchronous)
 			g_main_loop_run (client->priv->loop);
 	}
-
+out:
 	return ret;
 }
 
@@ -2401,8 +2429,9 @@ out:
 gboolean
 pk_client_resolve (PkClient *client, PkBitfield filters, gchar **packages, GError **error)
 {
-	gboolean ret;
-	gchar *filter_text;
+	gboolean ret = FALSE;
+	gchar *filter_text = NULL;
+	GError *error_local = NULL;
 
 	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
 	g_return_val_if_fail (packages != NULL, FALSE);
@@ -2412,13 +2441,13 @@ pk_client_resolve (PkClient *client, PkBitfield filters, gchar **packages, GErro
 	if (client->priv->tid != NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_FAILED, "TID already set to %s", client->priv->tid);
-		return FALSE;
+		goto out;
 	}
 
 	/* get and set a new ID */
 	ret = pk_client_allocate_transaction_id (client, error);
 	if (!ret)
-		return FALSE;
+		goto out;
 
 	/* save this so we can re-issue it */
 	client->priv->role = PK_ROLE_ENUM_RESOLVE;
@@ -2429,15 +2458,25 @@ pk_client_resolve (PkClient *client, PkBitfield filters, gchar **packages, GErro
 	if (client->priv->proxy == NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
-		return FALSE;
+		ret = FALSE;
+		goto out;
 	}
 	filter_text = pk_filter_bitfield_to_text (filters);
-	ret = dbus_g_proxy_call (client->priv->proxy, "Resolve", error,
+
+	/* do the method */
+	ret = dbus_g_proxy_call (client->priv->proxy, "Resolve", &error_local,
 				 G_TYPE_STRING, filter_text,
 				 G_TYPE_STRV, packages,
 				 G_TYPE_INVALID, G_TYPE_INVALID);
-	g_free (filter_text);
-	if (ret && !client->priv->is_finished) {
+	if (!ret) {
+		if (error != NULL)
+			*error = pk_client_error_fixup (error_local);
+		g_error_free (error_local);
+		goto out;
+	}
+
+	/* is not already finished */
+	if (!client->priv->is_finished) {
 		/* allow clients to respond in the status changed callback */
 		pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
 
@@ -2445,7 +2484,8 @@ pk_client_resolve (PkClient *client, PkBitfield filters, gchar **packages, GErro
 		if (client->priv->synchronous)
 			g_main_loop_run (client->priv->loop);
 	}
-	pk_client_error_fixup (error);
+out:
+	g_free (filter_text);
 	return ret;
 }
 
@@ -2463,8 +2503,9 @@ pk_client_resolve (PkClient *client, PkBitfield filters, gchar **packages, GErro
 gboolean
 pk_client_get_details (PkClient *client, gchar **package_ids, GError **error)
 {
-	gboolean ret;
+	gboolean ret = FALSE;
 	gchar *package_ids_temp;
+	GError *error_local = NULL;
 
 	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
 	g_return_val_if_fail (package_ids != NULL, FALSE);
@@ -2474,7 +2515,7 @@ pk_client_get_details (PkClient *client, gchar **package_ids, GError **error)
 	if (client->priv->tid != NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_FAILED, "TID already set to %s", client->priv->tid);
-		return FALSE;
+		goto out;
 	}
 
 	/* check the PackageIDs here to avoid a round trip if invalid */
@@ -2484,13 +2525,13 @@ pk_client_get_details (PkClient *client, gchar **package_ids, GError **error)
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_INVALID_INPUT, "package_ids '%s' are not valid", package_ids_temp);
 		g_free (package_ids_temp);
-		return FALSE;
+		goto out;
 	}
 
 	/* get and set a new ID */
 	ret = pk_client_allocate_transaction_id (client, error);
 	if (!ret)
-		return FALSE;
+		goto out;
 
 	/* we use the cached objects support */
 	pk_obj_list_set_copy (client->priv->cached_data, (PkObjListCopyFunc) pk_details_obj_copy);
@@ -2504,12 +2545,23 @@ pk_client_get_details (PkClient *client, gchar **package_ids, GError **error)
 	if (client->priv->proxy == NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
-		return FALSE;
+		ret = FALSE;
+		goto out;
 	}
-	ret = dbus_g_proxy_call (client->priv->proxy, "GetDetails", error,
+
+	/* do the method */
+	ret = dbus_g_proxy_call (client->priv->proxy, "GetDetails", &error_local,
 				 G_TYPE_STRV, package_ids,
 				 G_TYPE_INVALID, G_TYPE_INVALID);
-	if (ret && !client->priv->is_finished) {
+	if (!ret) {
+		if (error != NULL)
+			*error = pk_client_error_fixup (error_local);
+		g_error_free (error_local);
+		goto out;
+	}
+
+	/* is not already finished */
+	if (!client->priv->is_finished) {
 		/* allow clients to respond in the status changed callback */
 		pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
 
@@ -2517,7 +2569,7 @@ pk_client_get_details (PkClient *client, gchar **package_ids, GError **error)
 		if (client->priv->synchronous)
 			g_main_loop_run (client->priv->loop);
 	}
-	pk_client_error_fixup (error);
+out:
 	return ret;
 }
 
@@ -2534,7 +2586,8 @@ pk_client_get_details (PkClient *client, gchar **package_ids, GError **error)
 gboolean
 pk_client_get_distro_upgrades (PkClient *client, GError **error)
 {
-	gboolean ret;
+	gboolean ret = FALSE;
+	GError *error_local = NULL;
 
 	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
 	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
@@ -2543,13 +2596,13 @@ pk_client_get_distro_upgrades (PkClient *client, GError **error)
 	if (client->priv->tid != NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_FAILED, "TID already set to %s", client->priv->tid);
-		return FALSE;
+		goto out;
 	}
 
 	/* get and set a new ID */
 	ret = pk_client_allocate_transaction_id (client, error);
 	if (!ret)
-		return FALSE;
+		goto out;
 
 	/* save this so we can re-issue it */
 	client->priv->role = PK_ROLE_ENUM_GET_DISTRO_UPGRADES;
@@ -2562,11 +2615,22 @@ pk_client_get_distro_upgrades (PkClient *client, GError **error)
 	if (client->priv->proxy == NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
-		return FALSE;
+		ret = FALSE;
+		goto out;
 	}
-	ret = dbus_g_proxy_call (client->priv->proxy, "GetDistroUpgrades", error,
+
+	/* do the method */
+	ret = dbus_g_proxy_call (client->priv->proxy, "GetDistroUpgrades", &error_local,
 				 G_TYPE_INVALID, G_TYPE_INVALID);
-	if (ret && !client->priv->is_finished) {
+	if (!ret) {
+		if (error != NULL)
+			*error = pk_client_error_fixup (error_local);
+		g_error_free (error_local);
+		goto out;
+	}
+
+	/* is not already finished */
+	if (!client->priv->is_finished) {
 		/* allow clients to respond in the status changed callback */
 		pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
 
@@ -2574,7 +2638,7 @@ pk_client_get_distro_upgrades (PkClient *client, GError **error)
 		if (client->priv->synchronous)
 			g_main_loop_run (client->priv->loop);
 	}
-	pk_client_error_fixup (error);
+out:
 	return ret;
 }
 
@@ -2591,8 +2655,9 @@ pk_client_get_distro_upgrades (PkClient *client, GError **error)
 gboolean
 pk_client_get_files (PkClient *client, gchar **package_ids, GError **error)
 {
-	gboolean ret;
+	gboolean ret = FALSE;
 	gchar *package_ids_temp;
+	GError *error_local = NULL;
 
 	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
 	g_return_val_if_fail (package_ids != NULL, FALSE);
@@ -2602,7 +2667,7 @@ pk_client_get_files (PkClient *client, gchar **package_ids, GError **error)
 	if (client->priv->tid != NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_FAILED, "TID already set to %s", client->priv->tid);
-		return FALSE;
+		goto out;
 	}
 
 	/* check the PackageIDs here to avoid a round trip if invalid */
@@ -2612,13 +2677,13 @@ pk_client_get_files (PkClient *client, gchar **package_ids, GError **error)
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_INVALID_INPUT, "package_ids '%s' are not valid", package_ids_temp);
 		g_free (package_ids_temp);
-		return FALSE;
+		goto out;
 	}
 
 	/* get and set a new ID */
 	ret = pk_client_allocate_transaction_id (client, error);
 	if (!ret)
-		return FALSE;
+		goto out;
 
 	/* save this so we can re-issue it */
 	client->priv->role = PK_ROLE_ENUM_GET_FILES;
@@ -2628,12 +2693,23 @@ pk_client_get_files (PkClient *client, gchar **package_ids, GError **error)
 	if (client->priv->proxy == NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
-		return FALSE;
+		ret = FALSE;
+		goto out;
 	}
-	ret = dbus_g_proxy_call (client->priv->proxy, "GetFiles", error,
+
+	/* do the method */
+	ret = dbus_g_proxy_call (client->priv->proxy, "GetFiles", &error_local,
 				 G_TYPE_STRV, package_ids,
 				 G_TYPE_INVALID, G_TYPE_INVALID);
-	if (ret && !client->priv->is_finished) {
+	if (!ret) {
+		if (error != NULL)
+			*error = pk_client_error_fixup (error_local);
+		g_error_free (error_local);
+		goto out;
+	}
+
+	/* is not already finished */
+	if (!client->priv->is_finished) {
 		/* allow clients to respond in the status changed callback */
 		pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
 
@@ -2641,34 +2717,7 @@ pk_client_get_files (PkClient *client, gchar **package_ids, GError **error)
 		if (client->priv->synchronous)
 			g_main_loop_run (client->priv->loop);
 	}
-	pk_client_error_fixup (error);
-	return ret;
-}
-
-/**
- * pk_client_remove_packages_action:
- **/
-static gboolean
-pk_client_remove_packages_action (PkClient *client, gchar **package_ids,
-				  gboolean allow_deps, gboolean autoremove,
-				  GError **error)
-{
-	gboolean ret;
-
-	g_return_val_if_fail (client != NULL, FALSE);
-	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
-	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
-
-	/* check to see if we have a valid proxy */
-	if (client->priv->proxy == NULL) {
-		*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
-		return FALSE;
-	}
-	ret = dbus_g_proxy_call (client->priv->proxy, "RemovePackages", error,
-				 G_TYPE_STRV, package_ids,
-				 G_TYPE_BOOLEAN, allow_deps,
-				 G_TYPE_BOOLEAN, autoremove,
-				 G_TYPE_INVALID, G_TYPE_INVALID);
+out:
 	return ret;
 }
 
@@ -2690,7 +2739,7 @@ gboolean
 pk_client_remove_packages (PkClient *client, gchar **package_ids, gboolean allow_deps,
 			  gboolean autoremove, GError **error)
 {
-	gboolean ret;
+	gboolean ret = FALSE;
 	gchar *package_ids_temp;
 	GError *error_local = NULL; /* we can't use the same error as we might be NULL */
 
@@ -2702,7 +2751,7 @@ pk_client_remove_packages (PkClient *client, gchar **package_ids, gboolean allow
 	if (client->priv->tid != NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_FAILED, "TID already set to %s", client->priv->tid);
-		return FALSE;
+		goto out;
 	}
 
 	/* check the PackageIDs here to avoid a round trip if invalid */
@@ -2712,7 +2761,7 @@ pk_client_remove_packages (PkClient *client, gchar **package_ids, gboolean allow
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_INVALID_INPUT, "package_ids '%s' are not valid", package_ids_temp);
 		g_free (package_ids_temp);
-		return FALSE;
+		goto out;
 	}
 
 	/* get and set a new ID */
@@ -2726,34 +2775,29 @@ pk_client_remove_packages (PkClient *client, gchar **package_ids, gboolean allow
 	client->priv->cached_autoremove = autoremove;
 	client->priv->cached_package_ids = g_strdupv (package_ids);
 
-	/* hopefully do the operation first time */
-	ret = pk_client_remove_packages_action (client, package_ids, allow_deps, autoremove, &error_local);
-
-	/* we were refused by policy */
-	if (!ret && pk_client_error_refused_by_policy (error_local)) {
-		/* try to get auth */
-		if (pk_client_error_auth_obtain (error_local)) {
-			/* clear old error */
-			g_clear_error (&error_local);
-
-			/* get a new tid */
-			ret = pk_client_allocate_transaction_id (client, &error_local);
-			if (!ret)
-				goto out;
-
-			/* retry the action now we have got auth */
-			ret = pk_client_remove_packages_action (client, package_ids, allow_deps, autoremove, &error_local);
-		}
+	/* check to see if we have a valid proxy */
+	if (client->priv->proxy == NULL) {
+		*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
+		goto out;
 	}
 
-out:
+	/* do the method */
+	ret = dbus_g_proxy_call (client->priv->proxy, "RemovePackages", &error_local,
+				 G_TYPE_STRV, package_ids,
+				 G_TYPE_BOOLEAN, allow_deps,
+				 G_TYPE_BOOLEAN, autoremove,
+				 G_TYPE_INVALID, G_TYPE_INVALID);
+
 	/* we failed one of these, return the error to the user */
 	if (!ret) {
-		pk_client_error_fixup (&error_local);
-		g_propagate_error (error, error_local);
+		if (error != NULL)
+			*error = pk_client_error_fixup (error_local);
+		g_error_free (error_local);
+		goto out;
 	}
 
-	if (ret && !client->priv->is_finished) {
+	/* is not already finished */
+	if (!client->priv->is_finished) {
 		/* allow clients to respond in the status changed callback */
 		pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
 
@@ -2761,30 +2805,7 @@ out:
 		if (client->priv->synchronous)
 			g_main_loop_run (client->priv->loop);
 	}
-
-	return ret;
-}
-
-/**
- * pk_client_refresh_cache_action:
- **/
-static gboolean
-pk_client_refresh_cache_action (PkClient *client, gboolean force, GError **error)
-{
-	gboolean ret;
-
-	g_return_val_if_fail (client != NULL, FALSE);
-	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
-	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
-
-	/* check to see if we have a valid proxy */
-	if (client->priv->proxy == NULL) {
-		*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
-		return FALSE;
-	}
-	ret = dbus_g_proxy_call (client->priv->proxy, "RefreshCache", error,
-				 G_TYPE_BOOLEAN, force,
-				 G_TYPE_INVALID, G_TYPE_INVALID);
+out:
 	return ret;
 }
 
@@ -2804,7 +2825,7 @@ pk_client_refresh_cache_action (PkClient *client, gboolean force, GError **error
 gboolean
 pk_client_refresh_cache (PkClient *client, gboolean force, GError **error)
 {
-	gboolean ret;
+	gboolean ret = FALSE;
 	GError *error_local = NULL; /* we can't use the same error as we might be NULL */
 
 	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
@@ -2814,7 +2835,7 @@ pk_client_refresh_cache (PkClient *client, gboolean force, GError **error)
 	if (client->priv->tid != NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_FAILED, "TID already set to %s", client->priv->tid);
-		return FALSE;
+		goto out;
 	}
 
 	/* get and set a new ID */
@@ -2826,34 +2847,27 @@ pk_client_refresh_cache (PkClient *client, gboolean force, GError **error)
 	client->priv->role = PK_ROLE_ENUM_REFRESH_CACHE;
 	client->priv->cached_force = force;
 
-	/* hopefully do the operation first time */
-	ret = pk_client_refresh_cache_action (client, force, &error_local);
-
-	/* we were refused by policy */
-	if (!ret && pk_client_error_refused_by_policy (error_local)) {
-		/* try to get auth */
-		if (pk_client_error_auth_obtain (error_local)) {
-			/* clear old error */
-			g_clear_error (&error_local);
-
-			/* get a new tid */
-			ret = pk_client_allocate_transaction_id (client, &error_local);
-			if (!ret)
-				goto out;
-
-			/* retry the action now we have got auth */
-			ret = pk_client_refresh_cache_action (client, force, &error_local);
-		}
+	/* check to see if we have a valid proxy */
+	if (client->priv->proxy == NULL) {
+		*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
+		goto out;
 	}
 
-out:
+	/* do the method */
+	ret = dbus_g_proxy_call (client->priv->proxy, "RefreshCache", &error_local,
+				 G_TYPE_BOOLEAN, force,
+				 G_TYPE_INVALID, G_TYPE_INVALID);
+
 	/* we failed one of these, return the error to the user */
 	if (!ret) {
-		pk_client_error_fixup (&error_local);
-		g_propagate_error (error, error_local);
+		if (error != NULL)
+			*error = pk_client_error_fixup (error_local);
+		g_error_free (error_local);
+		goto out;
 	}
 
-	if (ret && !client->priv->is_finished) {
+	/* is not already finished */
+	if (!client->priv->is_finished) {
 		/* allow clients to respond in the status changed callback */
 		pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
 
@@ -2861,30 +2875,7 @@ out:
 		if (client->priv->synchronous)
 			g_main_loop_run (client->priv->loop);
 	}
-
-	return ret;
-}
-
-/**
- * pk_client_install_package_action:
- **/
-static gboolean
-pk_client_install_package_action (PkClient *client, gchar **package_ids, GError **error)
-{
-	gboolean ret;
-
-	g_return_val_if_fail (client != NULL, FALSE);
-	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
-	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
-
-	/* check to see if we have a valid proxy */
-	if (client->priv->proxy == NULL) {
-		*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
-		return FALSE;
-	}
-	ret = dbus_g_proxy_call (client->priv->proxy, "InstallPackages", error,
-				 G_TYPE_STRV, package_ids,
-				 G_TYPE_INVALID, G_TYPE_INVALID);
+out:
 	return ret;
 }
 
@@ -2901,7 +2892,7 @@ pk_client_install_package_action (PkClient *client, gchar **package_ids, GError
 gboolean
 pk_client_install_packages (PkClient *client, gchar **package_ids, GError **error)
 {
-	gboolean ret;
+	gboolean ret = FALSE;
 	gchar *package_ids_temp;
 	GError *error_local = NULL; /* we can't use the same error as we might be NULL */
 
@@ -2913,7 +2904,7 @@ pk_client_install_packages (PkClient *client, gchar **package_ids, GError **erro
 	if (client->priv->tid != NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_FAILED, "TID already set to %s", client->priv->tid);
-		return FALSE;
+		goto out;
 	}
 
 	/* check the PackageIDs here to avoid a round trip if invalid */
@@ -2923,7 +2914,7 @@ pk_client_install_packages (PkClient *client, gchar **package_ids, GError **erro
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_INVALID_INPUT, "package_ids '%s' are not valid", package_ids_temp);
 		g_free (package_ids_temp);
-		return FALSE;
+		goto out;
 	}
 
 	/* get and set a new ID */
@@ -2935,34 +2926,27 @@ pk_client_install_packages (PkClient *client, gchar **package_ids, GError **erro
 	client->priv->role = PK_ROLE_ENUM_INSTALL_PACKAGES;
 	client->priv->cached_package_ids = g_strdupv (package_ids);
 
-	/* hopefully do the operation first time */
-	ret = pk_client_install_package_action (client, package_ids, &error_local);
-
-	/* we were refused by policy */
-	if (!ret && pk_client_error_refused_by_policy (error_local)) {
-		/* try to get auth */
-		if (pk_client_error_auth_obtain (error_local)) {
-			/* clear old error */
-			g_clear_error (&error_local);
-
-			/* get a new tid */
-			ret = pk_client_allocate_transaction_id (client, &error_local);
-			if (!ret)
-				goto out;
-
-			/* retry the action now we have got auth */
-			ret = pk_client_install_package_action (client, package_ids, &error_local);
-		}
+	/* check to see if we have a valid proxy */
+	if (client->priv->proxy == NULL) {
+		*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
+		goto out;
 	}
 
-out:
+	/* do the method */
+	ret = dbus_g_proxy_call (client->priv->proxy, "InstallPackages", &error_local,
+				 G_TYPE_STRV, package_ids,
+				 G_TYPE_INVALID, G_TYPE_INVALID);
+
 	/* we failed one of these, return the error to the user */
 	if (!ret) {
-		pk_client_error_fixup (&error_local);
-		g_propagate_error (error, error_local);
+		if (error != NULL)
+			*error = pk_client_error_fixup (error_local);
+		g_error_free (error_local);
+		goto out;
 	}
 
-	if (ret && !client->priv->is_finished) {
+	/* is not already finished */
+	if (!client->priv->is_finished) {
 		/* allow clients to respond in the status changed callback */
 		pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
 
@@ -2970,35 +2954,7 @@ out:
 		if (client->priv->synchronous)
 			g_main_loop_run (client->priv->loop);
 	}
-
-	return ret;
-}
-
-/**
- * pk_client_install_signature_action:
- **/
-static gboolean
-pk_client_install_signature_action (PkClient *client, PkSigTypeEnum type, const gchar *key_id,
-				    const gchar *package_id, GError **error)
-{
-	gboolean ret;
-	const gchar *type_text;
-
-	g_return_val_if_fail (client != NULL, FALSE);
-	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
-	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
-
-	/* check to see if we have a valid proxy */
-	if (client->priv->proxy == NULL) {
-		*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
-		return FALSE;
-	}
-	type_text = pk_sig_type_enum_to_text (type);
-	ret = dbus_g_proxy_call (client->priv->proxy, "InstallSignature", error,
-				 G_TYPE_STRING, type_text,
-				 G_TYPE_STRING, key_id,
-				 G_TYPE_STRING, package_id,
-				 G_TYPE_INVALID, G_TYPE_INVALID);
+out:
 	return ret;
 }
 
@@ -3016,7 +2972,8 @@ gboolean
 pk_client_install_signature (PkClient *client, PkSigTypeEnum type, const gchar *key_id,
 			     const gchar *package_id, GError **error)
 {
-	gboolean ret;
+	gboolean ret = FALSE;
+	const gchar *type_text;
 	GError *error_local = NULL; /* we can't use the same error as we might be NULL */
 
 	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
@@ -3029,7 +2986,7 @@ pk_client_install_signature (PkClient *client, PkSigTypeEnum type, const gchar *
 	if (client->priv->tid != NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_FAILED, "TID already set to %s", client->priv->tid);
-		return FALSE;
+		goto out;
 	}
 
 	/* get and set a new ID */
@@ -3042,34 +2999,30 @@ pk_client_install_signature (PkClient *client, PkSigTypeEnum type, const gchar *
 	client->priv->cached_package_id = g_strdup (package_id);
 	client->priv->cached_key_id = g_strdup (key_id);
 
-	/* hopefully do the operation first time */
-	ret = pk_client_install_signature_action (client, type, key_id, package_id, &error_local);
-
-	/* we were refused by policy */
-	if (!ret && pk_client_error_refused_by_policy (error_local)) {
-		/* try to get auth */
-		if (pk_client_error_auth_obtain (error_local)) {
-			/* clear old error */
-			g_clear_error (&error_local);
-
-			/* get a new tid */
-			ret = pk_client_allocate_transaction_id (client, &error_local);
-			if (!ret)
-				goto out;
-
-			/* retry the action now we have got auth */
-			ret = pk_client_install_signature_action (client, type, key_id, package_id, &error_local);
-		}
+	/* check to see if we have a valid proxy */
+	if (client->priv->proxy == NULL) {
+		*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
+		goto out;
 	}
+	type_text = pk_sig_type_enum_to_text (type);
+
+	/* do the method */
+	ret = dbus_g_proxy_call (client->priv->proxy, "InstallSignature", &error_local,
+				 G_TYPE_STRING, type_text,
+				 G_TYPE_STRING, key_id,
+				 G_TYPE_STRING, package_id,
+				 G_TYPE_INVALID, G_TYPE_INVALID);
 
-out:
 	/* we failed one of these, return the error to the user */
 	if (!ret) {
-		pk_client_error_fixup (&error_local);
-		g_propagate_error (error, error_local);
+		if (error != NULL)
+			*error = pk_client_error_fixup (error_local);
+		g_error_free (error_local);
+		goto out;
 	}
 
-	if (ret && !client->priv->is_finished) {
+	/* is not already finished */
+	if (!client->priv->is_finished) {
 		/* allow clients to respond in the status changed callback */
 		pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
 
@@ -3077,30 +3030,7 @@ out:
 		if (client->priv->synchronous)
 			g_main_loop_run (client->priv->loop);
 	}
-
-	return ret;
-}
-
-/**
- * pk_client_update_packages_action:
- **/
-static gboolean
-pk_client_update_packages_action (PkClient *client, gchar **package_ids, GError **error)
-{
-	gboolean ret;
-
-	g_return_val_if_fail (client != NULL, FALSE);
-	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
-	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
-
-	/* check to see if we have a valid proxy */
-	if (client->priv->proxy == NULL) {
-		*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
-		return FALSE;
-	}
-	ret = dbus_g_proxy_call (client->priv->proxy, "UpdatePackages", error,
-				 G_TYPE_STRV, package_ids,
-				 G_TYPE_INVALID, G_TYPE_INVALID);
+out:
 	return ret;
 }
 
@@ -3117,7 +3047,7 @@ pk_client_update_packages_action (PkClient *client, gchar **package_ids, GError
 gboolean
 pk_client_update_packages (PkClient *client, gchar **package_ids, GError **error)
 {
-	gboolean ret;
+	gboolean ret = FALSE;
 	gchar *package_ids_temp;
 	GError *error_local = NULL; /* we can't use the same error as we might be NULL */
 
@@ -3129,7 +3059,7 @@ pk_client_update_packages (PkClient *client, gchar **package_ids, GError **error
 	if (client->priv->tid != NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_FAILED, "TID already set to %s", client->priv->tid);
-		return FALSE;
+		goto out;
 	}
 
 	/* check the PackageIDs here to avoid a round trip if invalid */
@@ -3139,7 +3069,7 @@ pk_client_update_packages (PkClient *client, gchar **package_ids, GError **error
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_INVALID_INPUT, "package_ids '%s' are not valid", package_ids_temp);
 		g_free (package_ids_temp);
-		return FALSE;
+		goto out;
 	}
 
 	/* get and set a new ID */
@@ -3155,34 +3085,27 @@ pk_client_update_packages (PkClient *client, gchar **package_ids, GError **error
 		client->priv->cached_package_ids = g_strdupv (package_ids);
 	}
 
-	/* hopefully do the operation first time */
-	ret = pk_client_update_packages_action (client, package_ids, &error_local);
-
-	/* we were refused by policy */
-	if (!ret && pk_client_error_refused_by_policy (error_local)) {
-		/* try to get auth */
-		if (pk_client_error_auth_obtain (error_local)) {
-			/* clear old error */
-			g_clear_error (&error_local);
-
-			/* get a new tid */
-			ret = pk_client_allocate_transaction_id (client, &error_local);
-			if (!ret)
-				goto out;
-
-			/* retry the action now we have got auth */
-			ret = pk_client_update_packages_action (client, package_ids, &error_local);
-		}
+	/* check to see if we have a valid proxy */
+	if (client->priv->proxy == NULL) {
+		*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
+		goto out;
 	}
 
-out:
+	/* do the method */
+	ret = dbus_g_proxy_call (client->priv->proxy, "UpdatePackages", &error_local,
+				 G_TYPE_STRV, package_ids,
+				 G_TYPE_INVALID, G_TYPE_INVALID);
+
 	/* we failed one of these, return the error to the user */
 	if (!ret) {
-		pk_client_error_fixup (&error_local);
-		g_propagate_error (error, error_local);
+		if (error != NULL)
+			*error = pk_client_error_fixup (error_local);
+		g_error_free (error_local);
+		goto out;
 	}
 
-	if (ret && !client->priv->is_finished) {
+	/* is not already finished */
+	if (!client->priv->is_finished) {
 		/* allow clients to respond in the status changed callback */
 		pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
 
@@ -3190,31 +3113,7 @@ out:
 		if (client->priv->synchronous)
 			g_main_loop_run (client->priv->loop);
 	}
-
-	return ret;
-}
-
-/**
- * pk_client_install_files_action:
- **/
-static gboolean
-pk_client_install_files_action (PkClient *client, gboolean trusted, gchar **files, GError **error)
-{
-	gboolean ret;
-
-	g_return_val_if_fail (client != NULL, FALSE);
-	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
-	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
-
-	/* check to see if we have a valid proxy */
-	if (client->priv->proxy == NULL) {
-		*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
-		return FALSE;
-	}
-	ret = dbus_g_proxy_call (client->priv->proxy, "InstallFiles", error,
-				 G_TYPE_BOOLEAN, trusted,
-				 G_TYPE_STRV, files,
-				 G_TYPE_INVALID, G_TYPE_INVALID);
+out:
 	return ret;
 }
 
@@ -3232,9 +3131,8 @@ pk_resolve_local_path (const gchar *rel_path)
 	gchar *temp;
 
 	/* don't trust realpath one little bit */
-	if (rel_path == NULL) {
+	if (rel_path == NULL)
 		return NULL;
-	}
 
 	/* ITS4: ignore, glibc allocates us a buffer to try and fix some brain damage */
 	temp = realpath (rel_path, NULL);
@@ -3263,7 +3161,7 @@ pk_client_install_files (PkClient *client, gboolean trusted, gchar **files_rel,
 {
 	guint i;
 	guint length;
-	gboolean ret;
+	gboolean ret = FALSE;
 	gchar **files = NULL;
 	gchar *file;
 	GError *error_local = NULL; /* we can't use the same error as we might be NULL */
@@ -3276,7 +3174,7 @@ pk_client_install_files (PkClient *client, gboolean trusted, gchar **files_rel,
 	if (client->priv->tid != NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_FAILED, "TID already set to %s", client->priv->tid);
-		return FALSE;
+		goto out;
 	}
 
 	/* get and set a new ID */
@@ -3304,34 +3202,28 @@ pk_client_install_files (PkClient *client, gboolean trusted, gchar **files_rel,
 	client->priv->cached_trusted = trusted;
 	client->priv->cached_full_paths = g_strdupv (files);
 
-	/* hopefully do the operation first time */
-	ret = pk_client_install_files_action (client, trusted, files, &error_local);
-
-	/* we were refused by policy */
-	if (!ret && pk_client_error_refused_by_policy (error_local)) {
-		/* try to get auth */
-		if (pk_client_error_auth_obtain (error_local)) {
-			/* clear old error */
-			g_clear_error (&error_local);
-
-			/* get a new tid */
-			ret = pk_client_allocate_transaction_id (client, &error_local);
-			if (!ret)
-				goto out;
-
-			/* retry the action now we have got auth */
-			ret = pk_client_install_files_action (client, trusted, files, &error_local);
-		}
+	/* check to see if we have a valid proxy */
+	if (client->priv->proxy == NULL) {
+		*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
+		goto out;
 	}
 
-out:
+	/* do the method */
+	ret = dbus_g_proxy_call (client->priv->proxy, "InstallFiles", &error_local,
+				 G_TYPE_BOOLEAN, trusted,
+				 G_TYPE_STRV, files,
+				 G_TYPE_INVALID, G_TYPE_INVALID);
+
 	/* we failed one of these, return the error to the user */
 	if (!ret) {
-		pk_client_error_fixup (&error_local);
-		g_propagate_error (error, error_local);
+		if (error != NULL)
+			*error = pk_client_error_fixup (error_local);
+		g_error_free (error_local);
+		goto out;
 	}
 
-	if (ret && !client->priv->is_finished) {
+	/* is not already finished */
+	if (!client->priv->is_finished) {
 		/* allow clients to respond in the status changed callback */
 		pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
 
@@ -3339,7 +3231,7 @@ out:
 		if (client->priv->synchronous)
 			g_main_loop_run (client->priv->loop);
 	}
-
+out:
 	g_strfreev (files);
 	return ret;
 }
@@ -3356,8 +3248,9 @@ out:
 gboolean
 pk_client_get_repo_list (PkClient *client, PkBitfield filters, GError **error)
 {
-	gboolean ret;
-	gchar *filter_text;
+	gboolean ret = FALSE;
+	gchar *filter_text = NULL;
+	GError *error_local = NULL;
 
 	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
 	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
@@ -3366,13 +3259,13 @@ pk_client_get_repo_list (PkClient *client, PkBitfield filters, GError **error)
 	if (client->priv->tid != NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_FAILED, "TID already set to %s", client->priv->tid);
-		return FALSE;
+		goto out;
 	}
 
 	/* get and set a new ID */
 	ret = pk_client_allocate_transaction_id (client, error);
 	if (!ret)
-		return FALSE;
+		goto out;
 
 	/* save this so we can re-issue it */
 	client->priv->role = PK_ROLE_ENUM_GET_REPO_LIST;
@@ -3382,15 +3275,24 @@ pk_client_get_repo_list (PkClient *client, PkBitfield filters, GError **error)
 	if (client->priv->proxy == NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
-		return FALSE;
+		ret = FALSE;
+		goto out;
 	}
 	filter_text = pk_filter_bitfield_to_text (filters);
-	ret = dbus_g_proxy_call (client->priv->proxy, "GetRepoList", error,
+
+	/* do the method */
+	ret = dbus_g_proxy_call (client->priv->proxy, "GetRepoList", &error_local,
 				 G_TYPE_STRING, filter_text,
 				 G_TYPE_INVALID, G_TYPE_INVALID);
-	g_free (filter_text);
-	pk_client_error_fixup (error);
-	if (ret && !client->priv->is_finished) {
+	if (!ret) {
+		if (error != NULL)
+			*error = pk_client_error_fixup (error_local);
+		g_error_free (error_local);
+		goto out;
+	}
+
+	/* is not already finished */
+	if (!client->priv->is_finished) {
 		/* allow clients to respond in the status changed callback */
 		pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
 
@@ -3398,29 +3300,8 @@ pk_client_get_repo_list (PkClient *client, PkBitfield filters, GError **error)
 		if (client->priv->synchronous)
 			g_main_loop_run (client->priv->loop);
 	}
-	return ret;
-}
-
-/**
- * pk_client_accept_eula_action:
- **/
-static gboolean
-pk_client_accept_eula_action (PkClient *client, const gchar *eula_id, GError **error)
-{
-	gboolean ret;
-
-	g_return_val_if_fail (client != NULL, FALSE);
-	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
-	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
-
-	/* check to see if we have a valid proxy */
-	if (client->priv->proxy == NULL) {
-		*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
-		return FALSE;
-	}
-	ret = dbus_g_proxy_call (client->priv->proxy, "AcceptEula", error,
-				 G_TYPE_STRING, eula_id,
-				 G_TYPE_INVALID, G_TYPE_INVALID);
+out:
+	g_free (filter_text);
 	return ret;
 }
 
@@ -3437,7 +3318,7 @@ pk_client_accept_eula_action (PkClient *client, const gchar *eula_id, GError **e
 gboolean
 pk_client_accept_eula (PkClient *client, const gchar *eula_id, GError **error)
 {
-	gboolean ret;
+	gboolean ret = FALSE;
 	GError *error_local = NULL; /* we can't use the same error as we might be NULL */
 
 	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
@@ -3448,7 +3329,7 @@ pk_client_accept_eula (PkClient *client, const gchar *eula_id, GError **error)
 	if (client->priv->tid != NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_FAILED, "TID already set to %s", client->priv->tid);
-		return FALSE;
+		goto out;
 	}
 
 	/* get and set a new ID */
@@ -3459,34 +3340,27 @@ pk_client_accept_eula (PkClient *client, const gchar *eula_id, GError **error)
 	/* save this so we can re-issue it */
 	client->priv->role = PK_ROLE_ENUM_ACCEPT_EULA;
 
-	/* hopefully do the operation first time */
-	ret = pk_client_accept_eula_action (client, eula_id, &error_local);
-
-	/* we were refused by policy */
-	if (!ret && pk_client_error_refused_by_policy (error_local)) {
-		/* try to get auth */
-		if (pk_client_error_auth_obtain (error_local)) {
-			/* clear old error */
-			g_clear_error (&error_local);
-
-			/* get a new tid */
-			ret = pk_client_allocate_transaction_id (client, &error_local);
-			if (!ret)
-				goto out;
-
-			/* retry the action now we have got auth */
-			ret = pk_client_accept_eula_action (client, eula_id, &error_local);
-		}
+	/* check to see if we have a valid proxy */
+	if (client->priv->proxy == NULL) {
+		*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
+		goto out;
 	}
 
-out:
+	/* do the method */
+	ret = dbus_g_proxy_call (client->priv->proxy, "AcceptEula", &error_local,
+				 G_TYPE_STRING, eula_id,
+				 G_TYPE_INVALID, G_TYPE_INVALID);
+
 	/* we failed one of these, return the error to the user */
 	if (!ret) {
-		pk_client_error_fixup (&error_local);
-		g_propagate_error (error, error_local);
+		if (error != NULL)
+			*error = pk_client_error_fixup (error_local);
+		g_error_free (error_local);
+		goto out;
 	}
 
-	if (ret && !client->priv->is_finished) {
+	/* is not already finished */
+	if (!client->priv->is_finished) {
 		/* allow clients to respond in the status changed callback */
 		pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
 
@@ -3494,31 +3368,7 @@ out:
 		if (client->priv->synchronous)
 			g_main_loop_run (client->priv->loop);
 	}
-
-	return ret;
-}
-
-/**
- * pk_client_repo_enable_action:
- **/
-static gboolean
-pk_client_repo_enable_action (PkClient *client, const gchar *repo_id, gboolean enabled, GError **error)
-{
-	gboolean ret;
-
-	g_return_val_if_fail (client != NULL, FALSE);
-	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
-	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
-
-	/* check to see if we have a valid proxy */
-	if (client->priv->proxy == NULL) {
-		*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
-		return FALSE;
-	}
-	ret = dbus_g_proxy_call (client->priv->proxy, "RepoEnable", error,
-				 G_TYPE_STRING, repo_id,
-				 G_TYPE_BOOLEAN, enabled,
-				 G_TYPE_INVALID, G_TYPE_INVALID);
+out:
 	return ret;
 }
 
@@ -3536,7 +3386,7 @@ pk_client_repo_enable_action (PkClient *client, const gchar *repo_id, gboolean e
 gboolean
 pk_client_repo_enable (PkClient *client, const gchar *repo_id, gboolean enabled, GError **error)
 {
-	gboolean ret;
+	gboolean ret = FALSE;
 	GError *error_local = NULL; /* we can't use the same error as we might be NULL */
 
 	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
@@ -3547,7 +3397,7 @@ pk_client_repo_enable (PkClient *client, const gchar *repo_id, gboolean enabled,
 	if (client->priv->tid != NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_FAILED, "TID already set to %s", client->priv->tid);
-		return FALSE;
+		goto out;
 	}
 
 	/* get and set a new ID */
@@ -3558,34 +3408,28 @@ pk_client_repo_enable (PkClient *client, const gchar *repo_id, gboolean enabled,
 	/* save this so we can re-issue it */
 	client->priv->role = PK_ROLE_ENUM_REPO_ENABLE;
 
-	/* hopefully do the operation first time */
-	ret = pk_client_repo_enable_action (client, repo_id, enabled, &error_local);
-
-	/* we were refused by policy */
-	if (!ret && pk_client_error_refused_by_policy (error_local)) {
-		/* try to get auth */
-		if (pk_client_error_auth_obtain (error_local)) {
-			/* clear old error */
-			g_clear_error (&error_local);
-
-			/* get a new tid */
-			ret = pk_client_allocate_transaction_id (client, &error_local);
-			if (!ret)
-				goto out;
-
-			/* retry the action now we have got auth */
-			ret = pk_client_repo_enable_action (client, repo_id, enabled, &error_local);
-		}
+	/* check to see if we have a valid proxy */
+	if (client->priv->proxy == NULL) {
+		*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
+		goto out;
 	}
 
-out:
+	/* do the method */
+	ret = dbus_g_proxy_call (client->priv->proxy, "RepoEnable", &error_local,
+				 G_TYPE_STRING, repo_id,
+				 G_TYPE_BOOLEAN, enabled,
+				 G_TYPE_INVALID, G_TYPE_INVALID);
+
 	/* we failed one of these, return the error to the user */
 	if (!ret) {
-		pk_client_error_fixup (&error_local);
-		g_propagate_error (error, error_local);
+		if (error != NULL)
+			*error = pk_client_error_fixup (error_local);
+		g_error_free (error_local);
+		goto out;
 	}
 
-	if (ret && !client->priv->is_finished) {
+	/* is not already finished */
+	if (!client->priv->is_finished) {
 		/* allow clients to respond in the status changed callback */
 		pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
 
@@ -3593,33 +3437,7 @@ out:
 		if (client->priv->synchronous)
 			g_main_loop_run (client->priv->loop);
 	}
-
-	return ret;
-}
-
-/**
- * pk_client_repo_set_data_action:
- **/
-static gboolean
-pk_client_repo_set_data_action (PkClient *client, const gchar *repo_id,
-				const gchar *parameter, const gchar *value, GError **error)
-{
-	gboolean ret;
-
-	g_return_val_if_fail (client != NULL, FALSE);
-	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
-	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
-
-	/* check to see if we have a valid proxy */
-	if (client->priv->proxy == NULL) {
-		*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
-		return FALSE;
-	}
-	ret = dbus_g_proxy_call (client->priv->proxy, "RepoSetData", error,
-				 G_TYPE_STRING, repo_id,
-				 G_TYPE_STRING, parameter,
-				 G_TYPE_STRING, value,
-				 G_TYPE_INVALID, G_TYPE_INVALID);
+out:
 	return ret;
 }
 
@@ -3640,7 +3458,7 @@ gboolean
 pk_client_repo_set_data (PkClient *client, const gchar *repo_id, const gchar *parameter,
 			 const gchar *value, GError **error)
 {
-	gboolean ret;
+	gboolean ret = FALSE;
 	GError *error_local = NULL; /* we can't use the same error as we might be NULL */
 
 	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
@@ -3653,7 +3471,7 @@ pk_client_repo_set_data (PkClient *client, const gchar *repo_id, const gchar *pa
 	if (client->priv->tid != NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_FAILED, "TID already set to %s", client->priv->tid);
-		return FALSE;
+		goto out;
 	}
 
 	/* get and set a new ID */
@@ -3664,34 +3482,29 @@ pk_client_repo_set_data (PkClient *client, const gchar *repo_id, const gchar *pa
 	/* save this so we can re-issue it */
 	client->priv->role = PK_ROLE_ENUM_REPO_SET_DATA;
 
-	/* hopefully do the operation first time */
-	ret = pk_client_repo_set_data_action (client, repo_id, parameter, value, &error_local);
-
-	/* we were refused by policy */
-	if (!ret && pk_client_error_refused_by_policy (error_local)) {
-		/* try to get auth */
-		if (pk_client_error_auth_obtain (error_local)) {
-			/* clear old error */
-			g_clear_error (&error_local);
-
-			/* get a new tid */
-			ret = pk_client_allocate_transaction_id (client, &error_local);
-			if (!ret)
-				goto out;
-
-			/* retry the action now we have got auth */
-			ret = pk_client_repo_set_data_action (client, repo_id, parameter, value, &error_local);
-		}
+	/* check to see if we have a valid proxy */
+	if (client->priv->proxy == NULL) {
+		*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
+		goto out;
 	}
 
-out:
+	/* do the method */
+	ret = dbus_g_proxy_call (client->priv->proxy, "RepoSetData", &error_local,
+				 G_TYPE_STRING, repo_id,
+				 G_TYPE_STRING, parameter,
+				 G_TYPE_STRING, value,
+				 G_TYPE_INVALID, G_TYPE_INVALID);
+
 	/* we failed one of these, return the error to the user */
 	if (!ret) {
-		pk_client_error_fixup (&error_local);
-		g_propagate_error (error, error_local);
+		if (error != NULL)
+			*error = pk_client_error_fixup (error_local);
+		g_error_free (error_local);
+		goto out;
 	}
 
-	if (ret && !client->priv->is_finished) {
+	/* is not already finished */
+	if (!client->priv->is_finished) {
 		/* allow clients to respond in the status changed callback */
 		pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
 
@@ -3699,7 +3512,7 @@ out:
 		if (client->priv->synchronous)
 			g_main_loop_run (client->priv->loop);
 	}
-
+out:
 	return ret;
 }
 
@@ -3717,7 +3530,8 @@ out:
 gboolean
 pk_client_is_caller_active (PkClient *client, gboolean *is_active, GError **error)
 {
-	gboolean ret;
+	gboolean ret = FALSE;
+	GError *error_local = NULL;
 
 	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
 	g_return_val_if_fail (is_active != NULL, FALSE);
@@ -3727,13 +3541,22 @@ pk_client_is_caller_active (PkClient *client, gboolean *is_active, GError **erro
 	if (client->priv->proxy == NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
-		return FALSE;
+		ret = FALSE;
+		goto out;
 	}
-	ret = dbus_g_proxy_call (client->priv->proxy, "IsCallerActive", error,
+
+	/* do the method */
+	ret = dbus_g_proxy_call (client->priv->proxy, "IsCallerActive", &error_local,
 				 G_TYPE_INVALID,
 				 G_TYPE_BOOLEAN, is_active,
 				 G_TYPE_INVALID);
-	pk_client_error_fixup (error);
+	if (!ret) {
+		if (error != NULL)
+			*error = pk_client_error_fixup (error_local);
+		g_error_free (error_local);
+		goto out;
+	}
+out:
 	return ret;
 }
 
@@ -3750,7 +3573,8 @@ pk_client_is_caller_active (PkClient *client, gboolean *is_active, GError **erro
 gboolean
 pk_client_get_old_transactions (PkClient *client, guint number, GError **error)
 {
-	gboolean ret;
+	gboolean ret = FALSE;
+	GError *error_local = NULL;
 
 	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
 	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
@@ -3759,13 +3583,13 @@ pk_client_get_old_transactions (PkClient *client, guint number, GError **error)
 	if (client->priv->tid != NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_FAILED, "TID already set to %s", client->priv->tid);
-		return FALSE;
+		goto out;
 	}
 
 	/* get and set a new ID */
 	ret = pk_client_allocate_transaction_id (client, error);
 	if (!ret)
-		return FALSE;
+		goto out;
 
 	/* we use the cached objects support */
 	pk_obj_list_set_copy (client->priv->cached_data, (PkObjListCopyFunc) pk_transaction_obj_copy);
@@ -3775,13 +3599,23 @@ pk_client_get_old_transactions (PkClient *client, guint number, GError **error)
 	if (client->priv->proxy == NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
-		return FALSE;
+		ret = FALSE;
+		goto out;
 	}
-	ret = dbus_g_proxy_call (client->priv->proxy, "GetOldTransactions", error,
+
+	/* do the method */
+	ret = dbus_g_proxy_call (client->priv->proxy, "GetOldTransactions", &error_local,
 				 G_TYPE_UINT, number,
 				 G_TYPE_INVALID, G_TYPE_INVALID);
-	pk_client_error_fixup (error);
-	if (ret && !client->priv->is_finished) {
+	if (!ret) {
+		if (error != NULL)
+			*error = pk_client_error_fixup (error_local);
+		g_error_free (error_local);
+		goto out;
+	}
+
+	/* is not already finished */
+	if (!client->priv->is_finished) {
 		/* allow clients to respond in the status changed callback */
 		pk_client_change_status (client, PK_STATUS_ENUM_WAIT);
 
@@ -3789,6 +3623,7 @@ pk_client_get_old_transactions (PkClient *client, guint number, GError **error)
 		if (client->priv->synchronous)
 			g_main_loop_run (client->priv->loop);
 	}
+out:
 	return ret;
 }
 
@@ -3806,7 +3641,7 @@ pk_client_get_old_transactions (PkClient *client, guint number, GError **error)
 gboolean
 pk_client_requeue (PkClient *client, GError **error)
 {
-	gboolean ret;
+	gboolean ret = FALSE;
 	PkClientPrivate *priv = PK_CLIENT_GET_PRIVATE (client);
 
 	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
@@ -3816,14 +3651,14 @@ pk_client_requeue (PkClient *client, GError **error)
 	if (priv->role == PK_ROLE_ENUM_UNKNOWN) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_ROLE_UNKNOWN, "role unknown for reque");
-		return FALSE;
+		goto out;
 	}
 
-	/* are we still running? */
+	/* is not already finished */
 	if (!client->priv->is_finished) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_FAILED, "not finished, so cannot requeue");
-		return FALSE;
+		goto out;
 	}
 
 	/* clear enough data of the client to allow us to requeue */
@@ -3886,9 +3721,9 @@ pk_client_requeue (PkClient *client, GError **error)
 	else {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_ROLE_UNKNOWN, "role unknown for reque");
-		return FALSE;
+		goto out;
 	}
-	pk_client_error_fixup (error);
+out:
 	return ret;
 }
 
@@ -3908,6 +3743,7 @@ gboolean
 pk_client_set_tid (PkClient *client, const gchar *tid, GError **error)
 {
 	DBusGProxy *proxy = NULL;
+	gboolean ret = FALSE;
 
 	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
 	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
@@ -3915,7 +3751,7 @@ pk_client_set_tid (PkClient *client, const gchar *tid, GError **error)
 	if (client->priv->tid != NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_ALREADY_TID, "cannot set the tid on an already set client");
-		return FALSE;
+		goto out;
 	}
 
 	/* get a connection */
@@ -3924,7 +3760,7 @@ pk_client_set_tid (PkClient *client, const gchar *tid, GError **error)
 	if (proxy == NULL) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_ALREADY_TID, "Cannot connect to PackageKit tid %s", tid);
-		return FALSE;
+		goto out;
 	}
 
 	/* don't timeout, as dbus-glib sets the timeout ~25 seconds */
@@ -4016,8 +3852,9 @@ pk_client_set_tid (PkClient *client, const gchar *tid, GError **error)
 	dbus_g_proxy_connect_signal (proxy, "Destroy",
 				     G_CALLBACK (pk_client_destroy_cb), client, NULL);
 	client->priv->proxy = proxy;
-
-	return TRUE;
+	ret = TRUE;
+out:
+	return ret;
 }
 
 /**
@@ -4425,7 +4262,7 @@ pk_client_disconnect_proxy (PkClient *client)
 gboolean
 pk_client_reset (PkClient *client, GError **error)
 {
-	gboolean ret;
+	gboolean ret = FALSE;
 
 	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
 	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
@@ -4436,7 +4273,7 @@ pk_client_reset (PkClient *client, GError **error)
 	if (client->priv->is_finishing && client->priv->synchronous) {
 		if (error != NULL)
 			*error = g_error_new (PK_CLIENT_ERROR, PK_CLIENT_ERROR_FAILED, "unable to reset synchronous client in finished handler");
-		return FALSE;
+		goto out;
 	}
 
 	if (client->priv->tid != NULL && !client->priv->is_finished) {
@@ -4444,7 +4281,7 @@ pk_client_reset (PkClient *client, GError **error)
 		/* we try to cancel the running tranaction */
 		ret = pk_client_cancel (client, error);
 		if (!ret)
-			return FALSE;
+			goto out;
 	}
 
 	/* stop the timeout timer if running */
@@ -4489,7 +4326,9 @@ pk_client_reset (PkClient *client, GError **error)
 
 	/* TODO: make clean */
 	pk_obj_list_clear (client->priv->cached_data);
-	return TRUE;
+	ret = TRUE;
+out:
+	return ret;
 }
 
 /**
diff --git a/lib/packagekit-qt/src/client.cpp b/lib/packagekit-qt/src/client.cpp
index d231d0e..ffcd200 100644
--- a/lib/packagekit-qt/src/client.cpp
+++ b/lib/packagekit-qt/src/client.cpp
@@ -153,10 +153,12 @@ void Client::setLocale(const QString& locale)
 
 void Client::setProxy(const QString& http_proxy, const QString& ftp_proxy)
 {
+#if 0
 	if(!PolkitClient::instance()->getAuth(AUTH_SYSTEM_NETWORK_PROXY_CONFIGURE)) {
 		emit authError(AUTH_SYSTEM_NETWORK_PROXY_CONFIGURE);
 		return;
 	}
+#endif
 
 	d->daemon->SetProxy(http_proxy, ftp_proxy);
 }
@@ -180,10 +182,12 @@ Client::DaemonError Client::getLastError ()
 
 Transaction* Client::acceptEula(EulaInfo info)
 {
+#if 0
 	if(!PolkitClient::instance()->getAuth(AUTH_PACKAGE_EULA_ACCEPT)) {
 		emit authError(AUTH_PACKAGE_EULA_ACCEPT);
 		return NULL;
 	}
+#endif
 
 	Transaction* t = d->createNewTransaction();
 	if (!t) {
@@ -376,10 +380,12 @@ Transaction* Client::getDistroUpgrades()
 Transaction* Client::installFiles(const QStringList& files, bool trusted)
 {
 	QString polkitAction = trusted ? AUTH_PACKAGE_INSTALL : AUTH_PACKAGE_INSTALL_UNTRUSTED;
+#if 0
 	if(!PolkitClient::instance()->getAuth(polkitAction)) {
 		emit authError(polkitAction);
 		return NULL;
 	}
+#endif
 
 	Transaction* t = d->createNewTransaction();
 	if (!t) {
@@ -399,10 +405,12 @@ Transaction* Client::installFile(const QString& file, bool trusted)
 
 Transaction* Client::installPackages(const QList<Package*>& packages)
 {
+#if 0
 	if(!PolkitClient::instance()->getAuth(AUTH_PACKAGE_INSTALL)) {
 		emit authError(AUTH_PACKAGE_INSTALL);
 		return NULL;
 	}
+#endif
 
 	Transaction* t = d->createNewTransaction();
 	if (!t) {
@@ -422,10 +430,12 @@ Transaction* Client::installPackage(Package* p)
 
 Transaction* Client::installSignature(SignatureType type, const QString& key_id, Package* p)
 {
+#if 0
 	if(!PolkitClient::instance()->getAuth(AUTH_SYSTEM_TRUST_SIGNING_KEY)) {
 		emit authError(AUTH_SYSTEM_TRUST_SIGNING_KEY);
 		return NULL;
 	}
+#endif
 
 	Transaction* t = d->createNewTransaction();
 	if (!t) {
@@ -440,10 +450,12 @@ Transaction* Client::installSignature(SignatureType type, const QString& key_id,
 
 Transaction* Client::refreshCache(bool force)
 {
+#if 0
 	if(!PolkitClient::instance()->getAuth(AUTH_SYSTEM_SOURCES_REFRESH)) {
 		emit authError(AUTH_SYSTEM_SOURCES_REFRESH);
 		return NULL;
 	}
+#endif
 
 	Transaction* t = d->createNewTransaction();
 	if (!t) {
@@ -458,10 +470,12 @@ Transaction* Client::refreshCache(bool force)
 
 Transaction* Client::removePackages(const QList<Package*>& packages, bool allow_deps, bool autoremove)
 {
+#if 0
 	if(!PolkitClient::instance()->getAuth(AUTH_PACKAGE_REMOVE)) {
 		emit authError(AUTH_PACKAGE_REMOVE);
 		return NULL;
 	}
+#endif
 
 	Transaction* t = d->createNewTransaction();
 	if (!t) {
@@ -481,10 +495,12 @@ Transaction* Client::removePackage(Package* p, bool allow_deps, bool autoremove)
 
 Transaction* Client::repoEnable(const QString& repo_id, bool enable)
 {
+#if 0
 	if(!PolkitClient::instance()->getAuth(AUTH_SYSTEM_SOURCES_CONFIGURE)) {
 		emit authError(AUTH_SYSTEM_SOURCES_CONFIGURE);
 		return NULL;
 	}
+#endif
 
 	Transaction* t = d->createNewTransaction();
 	if (!t) {
@@ -499,10 +515,12 @@ Transaction* Client::repoEnable(const QString& repo_id, bool enable)
 
 Transaction* Client::repoSetData(const QString& repo_id, const QString& parameter, const QString& value)
 {
+#if 0
 	if(!PolkitClient::instance()->getAuth(AUTH_SYSTEM_SOURCES_CONFIGURE)) {
 		emit authError(AUTH_SYSTEM_SOURCES_CONFIGURE);
 		return NULL;
 	}
+#endif
 
 	Transaction* t = d->createNewTransaction();
 	if (!t) {
@@ -535,10 +553,12 @@ Transaction* Client::resolve(const QString& packageName, Filters filters)
 
 Transaction* Client::rollback(Transaction* oldtrans)
 {
+#if 0
 	if(!PolkitClient::instance()->getAuth(AUTH_SYSTEM_ROLLBACK)) {
 		emit authError(AUTH_SYSTEM_ROLLBACK);
 		return NULL;
 	}
+#endif
 
 	Transaction* t = d->createNewTransaction();
 	if (!t) {
@@ -627,10 +647,12 @@ Package* Client::searchFromDesktopFile(const QString& path)
 
 Transaction* Client::updatePackages(const QList<Package*>& packages)
 {
+#if 0
 	if(!PolkitClient::instance()->getAuth(AUTH_SYSTEM_UPDATE)) {
 		emit authError(AUTH_SYSTEM_UPDATE);
 		return NULL;
 	}
+#endif
 
 	Transaction* t = d->createNewTransaction();
 	if (!t) {
@@ -650,10 +672,12 @@ Transaction* Client::updatePackage(Package* package)
 
 Transaction* Client::updateSystem()
 {
+#if 0
 	if(!PolkitClient::instance()->getAuth(AUTH_SYSTEM_UPDATE)) {
 		emit authError(AUTH_SYSTEM_UPDATE);
 		return NULL;
 	}
+#endif
 
 	Transaction* t = d->createNewTransaction();
 	if (!t) {
diff --git a/lib/packagekit-qt/src/polkitclient.cpp b/lib/packagekit-qt/src/polkitclient.cpp
index 7998752..5623c31 100644
--- a/lib/packagekit-qt/src/polkitclient.cpp
+++ b/lib/packagekit-qt/src/polkitclient.cpp
@@ -19,10 +19,6 @@
  */
 #include "config.h"
 
-#ifdef USE_SECURITY_POLKIT
- #include <polkit-dbus/polkit-dbus.h>
-#endif
-
 #include "polkitclient.h"
 
 using namespace PackageKit;
@@ -38,6 +34,8 @@ PolkitClient* PolkitClient::instance()
 PolkitClient::PolkitClient(QObject *parent) : QObject(parent) {
 }
 
+#if 0
+
 #ifdef USE_SECURITY_POLKIT
 bool PolkitClient::getAuth(const QString &action) {
 	DBusError e;
@@ -55,10 +53,11 @@ bool PolkitClient::getAuth(const QString &action) {
 }
 #else
 bool PolkitClient::getAuth(const QString &action) {
-	qDebug() << "Not configured with PolicyKit support";
+	qDebug() << "Not configured with old PolicyKit support";
 	return false;
 }
 #endif
+#endif
 
 #include "polkitclient.moc"
 
diff --git a/lib/packagekit-qt/src/polkitclient.h b/lib/packagekit-qt/src/polkitclient.h
index 2b8bd91..4788951 100644
--- a/lib/packagekit-qt/src/polkitclient.h
+++ b/lib/packagekit-qt/src/polkitclient.h
@@ -31,7 +31,9 @@ class PolkitClient : QObject{
 
 public:
 	static PolkitClient* instance();
+#if 0
 	bool getAuth(const QString& action);
+#endif
 private:
 	static PolkitClient* m_instance;
 	PolkitClient(QObject *parent = 0);
diff --git a/lib/packagekit-qt/src/transaction.cpp b/lib/packagekit-qt/src/transaction.cpp
index 7948441..9414e84 100644
--- a/lib/packagekit-qt/src/transaction.cpp
+++ b/lib/packagekit-qt/src/transaction.cpp
@@ -102,13 +102,14 @@ bool Transaction::callerActive()
 void Transaction::cancel()
 {
 	if (!d->p->Cancel().isValid ()) {
+#if 0
 		// Cancel failed, maybe it's not our transaction and we need authorization
 		if(!PolkitClient::instance()->getAuth(AUTH_CANCEL_FOREIGN)) {
 			// FIXME : should warn somehow here
 			qDebug () << "Authorization to cancel foreign failed";
 			return;
 		}
-
+#endif
 		d->p->Cancel();
 	}
 }
diff --git a/policy/Makefile.am b/policy/Makefile.am
index 9fcdc91..9f0ab3c 100644
--- a/policy/Makefile.am
+++ b/policy/Makefile.am
@@ -1,7 +1,7 @@
 
 NULL =
 
-polkit_policydir = $(datadir)/PolicyKit/policy
+polkit_policydir = $(datadir)/polkit-1/actions
 dist_polkit_policy_DATA =					\
 	org.freedesktop.packagekit.policy			\
 	$(NULL)
@@ -10,11 +10,6 @@ dist_polkit_policy_DATA =					\
 # http://bugzilla.gnome.org/show_bug.cgi?id=462312
 @INTLTOOL_POLICY_RULE@
 
-if SECURITY_TYPE_POLKIT
-check:
-	$(POLKIT_POLICY_FILE_VALIDATE) $(top_srcdir)/policy/$(dist_polkit_policy_DATA)
-endif
-
 EXTRA_DIST = org.freedesktop.packagekit.policy.in
 DISTCLEANFILES = org.freedesktop.packagekit.policy
 
diff --git a/policy/org.freedesktop.packagekit.policy.in b/policy/org.freedesktop.packagekit.policy.in
index b12b8ab..98bf5f3 100644
--- a/policy/org.freedesktop.packagekit.policy.in
+++ b/policy/org.freedesktop.packagekit.policy.in
@@ -6,7 +6,7 @@
 
   <!--
     Policy definitions for PackageKit system actions.
-    Copyright (c) 2007-2008 Richard Hughes <richard@hughsie.com>
+    Copyright (c) 2007-2009 Richard Hughes <richard@hughsie.com>
   -->
 
   <vendor>The PackageKit Project</vendor>
@@ -18,8 +18,9 @@
     <_message>Authentication is required to cancel a task that was not started by yourself</_message>
     <icon_name>pk-package-delete</icon_name>
     <defaults>
+      <allow_any>no</allow_any>
       <allow_inactive>no</allow_inactive>
-      <allow_active>auth_admin_keep_always</allow_active>
+      <allow_active>auth_admin_keep</allow_active>
     </defaults>
   </action>
 
@@ -28,8 +29,9 @@
     <_message>Authentication is required to install a signed package</_message>
     <icon_name>pk-package-add</icon_name>
     <defaults>
+      <allow_any>no</allow_any>
       <allow_inactive>no</allow_inactive>
-      <allow_active>auth_admin_keep_always</allow_active>
+      <allow_active>yes</allow_active>
     </defaults>
   </action>
 
@@ -38,6 +40,7 @@
     <_message>Authentication is required to install an untrusted package</_message>
     <icon_name>pk-package-add</icon_name>
     <defaults>
+      <allow_any>no</allow_any>
       <allow_inactive>no</allow_inactive>
       <allow_active>auth_admin</allow_active>
     </defaults>
@@ -48,6 +51,7 @@
     <_message>Authentication is required to consider a key used for signing packages as trusted</_message>
     <icon_name>pk-package-add</icon_name>
     <defaults>
+      <allow_any>no</allow_any>
       <allow_inactive>no</allow_inactive>
       <allow_active>auth_admin</allow_active>
     </defaults>
@@ -58,6 +62,7 @@
     <_message>Authentication is required to accept a EULA</_message>
     <icon_name>pk-package-add</icon_name>
     <defaults>
+      <allow_any>no</allow_any>
       <allow_inactive>no</allow_inactive>
       <allow_active>yes</allow_active>
     </defaults>
@@ -68,8 +73,9 @@
     <_message>Authentication is required to remove packages</_message>
     <icon_name>pk-package-delete</icon_name>
     <defaults>
+      <allow_any>no</allow_any>
       <allow_inactive>no</allow_inactive>
-      <allow_active>auth_admin_keep_always</allow_active>
+      <allow_active>auth_admin_keep</allow_active>
     </defaults>
   </action>
 
@@ -78,8 +84,9 @@
     <_message>Authentication is required to update packages</_message>
     <icon_name>pk-package-update</icon_name>
     <defaults>
+      <allow_any>no</allow_any>
       <allow_inactive>no</allow_inactive>
-      <allow_active>auth_admin_keep_always</allow_active>
+      <allow_active>yes</allow_active>
     </defaults>
   </action>
 
@@ -88,8 +95,9 @@
     <_message>Authentication is required to rollback a transaction</_message>
     <icon_name>pk-rollback</icon_name>
     <defaults>
+      <allow_any>no</allow_any>
       <allow_inactive>no</allow_inactive>
-      <allow_active>auth_admin_keep_always</allow_active>
+      <allow_active>auth_admin</allow_active>
     </defaults>
   </action>
 
@@ -98,8 +106,9 @@
     <_message>Authentication is required to change software source parameters</_message>
     <icon_name>pk-package-info</icon_name>
     <defaults>
+      <allow_any>no</allow_any>
       <allow_inactive>no</allow_inactive>
-      <allow_active>auth_admin_keep_always</allow_active>
+      <allow_active>auth_admin_keep</allow_active>
     </defaults>
   </action>
 
@@ -108,6 +117,7 @@
     <_message>Authentication is required to refresh the system sources</_message>
     <icon_name>pk-refresh-cache</icon_name>
     <defaults>
+      <allow_any>no</allow_any>
       <allow_inactive>no</allow_inactive>
       <allow_active>yes</allow_active>
     </defaults>
@@ -118,6 +128,7 @@
     <_message>Authentication is required to set the network proxy used for downloading packages</_message>
     <icon_name>applications-internet</icon_name>
     <defaults>
+      <allow_any>no</allow_any>
       <allow_inactive>no</allow_inactive>
       <allow_active>yes</allow_active>
     </defaults>
diff --git a/src/Makefile.am b/src/Makefile.am
index 5969300..8f3a310 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -109,14 +109,6 @@ shared_SOURCES +=					\
 	pk-network-stack-connman.c
 endif
 
-if SECURITY_TYPE_POLKIT
-shared_SOURCES += pk-security-polkit.c
-endif
-
-if SECURITY_TYPE_DUMMY
-shared_SOURCES += pk-security-dummy.c
-endif
-
 sbin_PROGRAMS =						\
 	packagekitd					\
 	$(NULL)
@@ -170,7 +162,7 @@ org.freedesktop.PackageKit.h: org.freedesktop.PackageKit.xml
 	$(LIBTOOL) --mode=execute dbus-binding-tool	\
 		--prefix=pk_engine			\
 		--mode=glib-server			\
-		--output=org.freedesktop.PackageKit.h			\
+		--output=org.freedesktop.PackageKit.h	\
 		$(srcdir)/org.freedesktop.PackageKit.xml
 
 org.freedesktop.PackageKit.Transaction.h: org.freedesktop.PackageKit.Transaction.xml
@@ -225,8 +217,6 @@ install-data-hook:
 
 EXTRA_DIST =						\
 	pk-marshal.list					\
-	pk-security-polkit.c				\
-	pk-security-dummy.c				\
 	org.freedesktop.PackageKit.xml			\
 	org.freedesktop.PackageKit.Transaction.xml	\
 	org.freedesktop.PackageKit.Backend.xml		\
diff --git a/src/pk-engine.c b/src/pk-engine.c
index 88c3e4b..0d88e46 100644
--- a/src/pk-engine.c
+++ b/src/pk-engine.c
@@ -1,6 +1,6 @@
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
  *
- * Copyright (C) 2007-2008 Richard Hughes <richard@hughsie.com>
+ * Copyright (C) 2007-2009 Richard Hughes <richard@hughsie.com>
  *
  * Licensed under the GNU General Public License Version 2
  *
@@ -38,6 +38,9 @@
 #include <dbus/dbus-glib.h>
 #include <dbus/dbus-glib-lowlevel.h>
 #include <packagekit-glib/packagekit.h>
+#ifdef USE_SECURITY_POLKIT
+#include <polkit/polkit.h>
+#endif
 
 #include "egg-debug.h"
 #include "egg-string.h"
@@ -55,7 +58,6 @@
 #include "pk-marshal.h"
 #include "pk-notify.h"
 #include "pk-file-monitor.h"
-#include "pk-security.h"
 #include "pk-conf.h"
 
 static void     pk_engine_finalize	(GObject       *object);
@@ -95,7 +97,6 @@ struct PkEnginePrivate
 	PkBackend		*backend;
 	PkInhibit		*inhibit;
 	PkNetwork		*network;
-	PkSecurity		*security;
 	PkNotify		*notify;
 	PkConf			*conf;
 	PkFileMonitor		*file_monitor_conf;
@@ -106,6 +107,11 @@ struct PkEnginePrivate
 	gchar			*mime_types;
 	guint			 signal_state_priority_timeout;
 	guint			 signal_state_normal_timeout;
+#ifdef USE_SECURITY_POLKIT
+	PolkitAuthority		*authority;
+#endif
+	gchar			*proxy_http;
+	gchar			*proxy_ftp;
 };
 
 enum {
@@ -577,61 +583,103 @@ pk_engine_suggest_daemon_quit (PkEngine *engine, GError **error)
 	return TRUE;
 }
 
+#ifdef USE_SECURITY_POLKIT
 /**
- * pk_engine_set_proxy:
+ * pk_engine_action_obtain_authorization:
  **/
-void
-pk_engine_set_proxy (PkEngine *engine, const gchar *proxy_http, const gchar *proxy_ftp, DBusGMethodInvocation *context)
+static void
+pk_engine_action_obtain_authorization_finished_cb (GObject *source_object, GAsyncResult *res, PkEngine *engine)
 {
+	PolkitAuthorizationResult *result;
+	GError *error = NULL;
 	gboolean ret;
-	GError *error;
-	gchar *sender = NULL;
-	gchar *error_detail = NULL;
-	PkSecurityCaller *caller;
-
-	g_return_if_fail (PK_IS_ENGINE (engine));
 
-	egg_debug ("SetProxy method called: %s, %s", proxy_http, proxy_ftp);
+	/* finish the call */
+	result = polkit_authority_check_authorization_finish (engine->priv->authority, res, &error);
 
-	/* check if the action is allowed from this client - if not, set an error */
-	sender = dbus_g_method_get_sender (context);
+	/* failed */
+	if (result == NULL) {
+		egg_warning ("failed to check for auth: %s", error->message);
+		g_error_free (error);
+		goto out;
+	}
 
-	/* get caller */
-	caller = pk_security_caller_new_from_sender (engine->priv->security, sender);
-	if (caller == NULL) {
-		error = g_error_new (PK_ENGINE_ERROR, PK_ENGINE_ERROR_REFUSED_BY_POLICY,
-				     "caller %s not found", sender);
-		dbus_g_method_return_error (context, error);
+	/* did not auth */
+	if (!polkit_authorization_result_get_is_authorized (result)) {
+		egg_warning ("failed to obtain auth");
 		goto out;
 	}
 
-	/* use security model to get auth */
-	ret = pk_security_action_is_allowed (engine->priv->security, caller, FALSE, PK_ROLE_ENUM_SET_PROXY_PRIVATE, &error_detail);
+	/* try to set the new proxy */
+	ret = pk_backend_set_proxy (engine->priv->backend, engine->priv->proxy_http, engine->priv->proxy_ftp);
 	if (!ret) {
-		error = g_error_new (PK_ENGINE_ERROR, PK_ENGINE_ERROR_REFUSED_BY_POLICY, "%s", error_detail);
-		dbus_g_method_return_error (context, error);
+		egg_warning ("setting the proxy failed");
 		goto out;
 	}
+out:
+	if (result != NULL)
+		g_object_unref (result);
+	return;
+}
+#endif
+
+/**
+ * pk_engine_set_proxy:
+ **/
+void
+pk_engine_set_proxy (PkEngine *engine, const gchar *proxy_http, const gchar *proxy_ftp, DBusGMethodInvocation *context)
+{
+#ifdef USE_SECURITY_POLKIT
+	gchar *sender = NULL;
+	PolkitSubject *subject;
+#else
+	gboolean ret;
+	GError *error = NULL;
+#endif
+	g_return_if_fail (PK_IS_ENGINE (engine));
+
+	egg_debug ("SetProxy method called: %s, %s", proxy_http, proxy_ftp);
+
+	/* save these so we can set them after the auth success */
+	egg_debug ("potentially changing http proxy from %s to %s", engine->priv->proxy_http, proxy_http);
+	egg_debug ("potentially changing ftp proxy from %s to %s", engine->priv->proxy_ftp, proxy_ftp);
+	g_free (engine->priv->proxy_http);
+	g_free (engine->priv->proxy_ftp);
+	engine->priv->proxy_http = g_strdup (proxy_http);
+	engine->priv->proxy_ftp = g_strdup (proxy_ftp);
+
+#ifdef USE_SECURITY_POLKIT
+	/* check subject */
+	sender = dbus_g_method_get_sender (context);
+	subject = polkit_system_bus_name_new (sender);
+	polkit_authority_check_authorization (engine->priv->authority, subject,
+					      "org.freedesktop.packagekit.system-network-proxy-configure",
+					      NULL,
+					      POLKIT_CHECK_AUTHORIZATION_FLAGS_ALLOW_USER_INTERACTION,
+					      NULL,
+					      (GAsyncReadyCallback) pk_engine_action_obtain_authorization_finished_cb,
+					      engine);
+#else
+	egg_warning ("*** THERE IS NO SECURITY MODEL BEING USED!!! ***");
 
 	/* try to set the new proxy */
 	ret = pk_backend_set_proxy (engine->priv->backend, proxy_http, proxy_ftp);
 	if (!ret) {
 		error = g_error_new (PK_ENGINE_ERROR, PK_ENGINE_ERROR_CANNOT_SET_PROXY, "%s", "setting the proxy failed");
 		dbus_g_method_return_error (context, error);
-		goto out;
+		return;
 	}
-
+#endif
 	/* all okay */
 	dbus_g_method_return (context);
 
 	/* reset the timer */
 	pk_engine_reset_timer (engine);
 
-out:
-	if (caller != NULL)
-		pk_security_caller_unref (caller);
+#ifdef USE_SECURITY_POLKIT
+	g_object_unref (subject);
 	g_free (sender);
-	g_free (error_detail);
+#endif
 }
 
 /**
@@ -793,8 +841,6 @@ pk_engine_init (PkEngine *engine)
 	DBusGConnection *connection;
 	gboolean ret;
 	gchar *filename;
-	gchar *proxy_http;
-	gchar *proxy_ftp;
 
 	engine->priv = PK_ENGINE_GET_PRIVATE (engine);
 	engine->priv->notify_clients_of_upgrade = FALSE;
@@ -820,9 +866,6 @@ pk_engine_init (PkEngine *engine)
 	if (!ret)
 		egg_error ("could not lock backend, you need to restart the daemon");
 
-	/* we dont need this, just don't keep creating and destroying it */
-	engine->priv->security = pk_security_new ();
-
 	/* proxy the network state */
 	engine->priv->network = pk_network_new ();
 	g_signal_connect (engine->priv->network, "state-changed",
@@ -863,18 +906,21 @@ pk_engine_init (PkEngine *engine)
 			  G_CALLBACK (pk_engine_conf_file_changed_cb), engine);
 	g_free (filename);
 
+#ifdef USE_SECURITY_POLKIT
+	/* protect the session SetProxy with a PolicyKit action */
+	engine->priv->authority = polkit_authority_get ();
+#endif
+
 	/* monitor the binary file for changes */
 	engine->priv->file_monitor_binary = pk_file_monitor_new ();
 	pk_file_monitor_set_file (engine->priv->file_monitor_binary, SBINDIR "/packagekitd");
 	g_signal_connect (engine->priv->file_monitor_binary, "file-changed",
 			  G_CALLBACK (pk_engine_binary_file_changed_cb), engine);
 
-	/* set the proxy */
-	proxy_http = pk_conf_get_string (engine->priv->conf, "ProxyHTTP");
-	proxy_ftp = pk_conf_get_string (engine->priv->conf, "ProxyFTP");
-	pk_backend_set_proxy (engine->priv->backend, proxy_http, proxy_ftp);
-	g_free (proxy_http);
-	g_free (proxy_ftp);
+	/* set the default proxy */
+	engine->priv->proxy_http = pk_conf_get_string (engine->priv->conf, "ProxyHTTP");
+	engine->priv->proxy_ftp = pk_conf_get_string (engine->priv->conf, "ProxyFTP");
+	pk_backend_set_proxy (engine->priv->backend, engine->priv->proxy_http, engine->priv->proxy_ftp);
 
 	engine->priv->transaction_list = pk_transaction_list_new ();
 	g_signal_connect (engine->priv->transaction_list, "changed",
@@ -928,12 +974,16 @@ pk_engine_finalize (GObject *object)
 	g_object_unref (engine->priv->transaction_list);
 	g_object_unref (engine->priv->transaction_db);
 	g_object_unref (engine->priv->network);
-	g_object_unref (engine->priv->security);
+#ifdef USE_SECURITY_POLKIT
+	g_object_unref (engine->priv->authority);
+#endif
 	g_object_unref (engine->priv->notify);
 	g_object_unref (engine->priv->backend);
 	g_object_unref (engine->priv->cache);
 	g_object_unref (engine->priv->conf);
 	g_free (engine->priv->mime_types);
+	g_free (engine->priv->proxy_http);
+	g_free (engine->priv->proxy_ftp);
 
 	G_OBJECT_CLASS (pk_engine_parent_class)->finalize (object);
 }
diff --git a/src/pk-post-trans.c b/src/pk-post-trans.c
index 199d258..4575c53 100644
--- a/src/pk-post-trans.c
+++ b/src/pk-post-trans.c
@@ -32,11 +32,6 @@
 #include <gio/gdesktopappinfo.h>
 #include <sqlite3.h>
 
-#ifdef USE_SECURITY_POLKIT
-  #include <polkit/polkit.h>
-  #include <polkit-dbus/polkit-dbus.h>
-#endif
-
 #include "egg-debug.h"
 
 #include "pk-post-trans.h"
@@ -542,6 +537,32 @@ pk_post_trans_update_files_check_running_cb (PkBackend *backend, const gchar *pa
 	pk_package_id_free (id);
 }
 
+#ifdef USE_SECURITY_POLKIT
+/**
+ * dkp_post_trans_get_cmdline:
+ **/
+static gchar *
+dkp_post_trans_get_cmdline (guint pid)
+{
+	gboolean ret;
+	gchar *filename = NULL;
+	gchar *cmdline = NULL;
+	GError *error = NULL;
+
+	/* get command line from proc */
+	filename = g_strdup_printf ("/proc/%i/cmdline", pid);
+	ret = g_file_get_contents (filename, &cmdline, NULL, &error);
+	if (!ret) {
+		egg_debug ("failed to get cmdline: %s", error->message);
+		g_error_free (error);
+		goto out;
+	}
+out:
+	g_free (filename);
+	return cmdline;
+}
+#endif
+
 /**
  * pk_post_trans_update_process_list:
  **/
@@ -556,8 +577,7 @@ pk_post_trans_update_process_list (PkPostTrans *post)
 	gboolean ret;
 	guint uid;
 	pid_t pid;
-	gint retval;
-	gchar exec[128];
+	gchar *exec;
 
 	uid = getuid ();
 	dir = g_dir_open ("/proc", 0, NULL);
@@ -582,12 +602,12 @@ pk_post_trans_update_process_list (PkPostTrans *post)
 		/* get the exec for the pid */
 		pid = atoi (name);
 #ifdef USE_SECURITY_POLKIT
-		retval = polkit_sysdeps_get_exe_for_pid (pid, exec, 128);
+		exec = dkp_post_trans_get_cmdline (pid);
+		if (exec == NULL)
+			goto out;
 #else
-		retval = -1;
+		goto out;
 #endif
-		if (retval <= 0)
-			goto out;
 
 		/* can be /usr/libexec/notification-daemon.#prelink#.9sOhao */
 		offset = g_strrstr (exec, ".#prelink#.");
diff --git a/src/pk-security-dummy.c b/src/pk-security-dummy.c
deleted file mode 100644
index 3e3713a..0000000
--- a/src/pk-security-dummy.c
+++ /dev/null
@@ -1,155 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
- *
- * Copyright (C) 2007 Richard Hughes <richard@hughsie.com>
- *
- * Licensed under the GNU General Public License Version 2
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/time.h>
-#include <sys/types.h>
-
-#include <glib/gi18n.h>
-#include <glib.h>
-#include <packagekit-glib/packagekit.h>
-
-#include <config.h>
-
-#include "egg-debug.h"
-#include "pk-security.h"
-
-#define PK_SECURITY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), PK_TYPE_SECURITY, PkSecurityPrivate))
-
-struct PkSecurityPrivate
-{
-	gpointer		data;
-};
-
-typedef gpointer PkSecurityCaller_;
-
-G_DEFINE_TYPE (PkSecurity, pk_security, G_TYPE_OBJECT)
-
-/**
- * pk_security_caller_new_from_sender:
- **/
-PkSecurityCaller *
-pk_security_caller_new_from_sender (PkSecurity *security, const gchar *sender)
-{
-	g_return_val_if_fail (PK_IS_SECURITY (security), NULL);
-	return GUINT_TO_POINTER (1);
-}
-
-/**
- * pk_security_caller_unref:
- **/
-void
-pk_security_caller_unref (PkSecurityCaller *caller)
-{
-	return;
-}
-
-/**
- * pk_security_get_uid:
- **/
-guint
-pk_security_get_uid (PkSecurity *security, PkSecurityCaller *caller)
-{
-	g_return_val_if_fail (PK_IS_SECURITY (security), -1);
-	return -1;
-}
-
-/**
- * pk_security_get_cmdline:
- **/
-gchar *
-pk_security_get_cmdline (PkSecurity *security, PkSecurityCaller *caller)
-{
-	g_return_val_if_fail (PK_IS_SECURITY (security), NULL);
-	return NULL;
-}
-
-/**
- * pk_security_action_is_allowed:
- **/
-gboolean
-pk_security_action_is_allowed (PkSecurity *security, PkSecurityCaller *caller, gboolean trusted, PkRoleEnum role, gchar **error_detail)
-{
-	g_return_val_if_fail (PK_IS_SECURITY (security), FALSE);
-	return TRUE;
-}
-
-/**
- * pk_security_finalize:
- **/
-static void
-pk_security_finalize (GObject *object)
-{
-	PkSecurity *security;
-	g_return_if_fail (PK_IS_SECURITY (object));
-	security = PK_SECURITY (object);
-	G_OBJECT_CLASS (pk_security_parent_class)->finalize (object);
-}
-
-/**
- * pk_security_class_init:
- **/
-static void
-pk_security_class_init (PkSecurityClass *klass)
-{
-	GObjectClass *object_class = G_OBJECT_CLASS (klass);
-	object_class->finalize = pk_security_finalize;
-	g_type_class_add_private (klass, sizeof (PkSecurityPrivate));
-}
-
-/**
- * pk_security_init:
- *
- * initializes the security class. NOTE: We expect security objects
- * to *NOT* be removed or added during the session.
- * We only control the first security object if there are more than one.
- **/
-static void
-pk_security_init (PkSecurity *security)
-{
-	egg_debug ("Using dummy security framework");
-	egg_warning ("*** THERE IS NO SECURITY MODEL BEING USED!!! ***");
-}
-
-/**
- * pk_security_new:
- * Return value: A new security class instance.
- **/
-PkSecurity *
-pk_security_new (void)
-{
-	PkSecurity *security;
-	security = g_object_new (PK_TYPE_SECURITY, NULL);
-	return PK_SECURITY (security);
-}
-
-#ifdef EGG_TEST
-#include "egg-test.h"
-
-void
-pk_security_test (EggTest *test)
-{
-	return;
-}
-#endif
-
diff --git a/src/pk-security-polkit.c b/src/pk-security-polkit.c
deleted file mode 100644
index 2cac522..0000000
--- a/src/pk-security-polkit.c
+++ /dev/null
@@ -1,424 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
- *
- * Copyright (C) 2007-2008 Richard Hughes <richard@hughsie.com>
- *
- * Licensed under the GNU General Public License Version 2
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#  include <config.h>
-#endif
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/time.h>
-#include <sys/types.h>
-
-#include <glib/gi18n.h>
-#include <glib.h>
-#include <dbus/dbus-glib.h>
-
-#include <polkit/polkit.h>
-#include <polkit-dbus/polkit-dbus.h>
-#include <packagekit-glib/packagekit.h>
-
-#include "egg-debug.h"
-#include "egg-string.h"
-
-#include "pk-security.h"
-#include "pk-syslog.h"
-
-#define PK_SECURITY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), PK_TYPE_SECURITY, PkSecurityPrivate))
-
-struct PkSecurityPrivate
-{
-	PolKitContext		*pk_context;
-	DBusConnection		*connection;
-	PkSyslog		*syslog;
-};
-
-typedef PolKitCaller PkSecurityCaller_;
-
-G_DEFINE_TYPE (PkSecurity, pk_security, G_TYPE_OBJECT)
-static gpointer pk_security_object = NULL;
-
-/**
- * pk_security_caller_new_from_sender:
- **/
-PkSecurityCaller *
-pk_security_caller_new_from_sender (PkSecurity *security, const gchar *sender)
-{
-	PolKitCaller *caller;
-	DBusError dbus_error;
-
-	g_return_val_if_fail (PK_IS_SECURITY (security), NULL);
-	g_return_val_if_fail (sender != NULL, NULL);
-
-	/* get the PolKitCaller information */
-	dbus_error_init (&dbus_error);
-	caller = polkit_caller_new_from_dbus_name (security->priv->connection, sender, &dbus_error);
-	if (dbus_error_is_set (&dbus_error)) {
-		egg_debug ("failed to get caller %s: %s", dbus_error.name, dbus_error.message);
-		dbus_error_free (&dbus_error);
-	}
-
-	return (PkSecurityCaller*) caller;
-}
-
-/**
- * pk_security_caller_unref:
- **/
-void
-pk_security_caller_unref (PkSecurityCaller *caller)
-{
-	if (caller != NULL)
-		polkit_caller_unref ((PolKitCaller *) caller);
-}
-
-/**
- * pk_security_get_uid:
- **/
-guint
-pk_security_get_uid (PkSecurity *security, PkSecurityCaller *caller)
-{
-	polkit_bool_t retval;
-	guint uid;
-
-	g_return_val_if_fail (PK_IS_SECURITY (security), -1);
-	g_return_val_if_fail (caller != NULL, -1);
-
-	/* get uid */
-	retval = polkit_caller_get_uid ((PolKitCaller *) caller, &uid);
-	if (!retval) {
-		egg_warning ("failed to get UID");
-		uid = PK_SECURITY_UID_INVALID;
-	}
-
-	return uid;
-}
-
-/**
- * pk_security_get_cmdline:
- **/
-gchar *
-pk_security_get_cmdline (PkSecurity *security, PkSecurityCaller *caller)
-{
-	gboolean ret;
-	gchar *filename = NULL;
-	gchar *cmdline = NULL;
-	GError *error = NULL;
-	polkit_bool_t retval;
-	pid_t pid;
-
-	g_return_val_if_fail (PK_IS_SECURITY (security), NULL);
-	g_return_val_if_fail (caller != NULL, NULL);
-
-	/* get pid */
-	retval = polkit_caller_get_pid ((PolKitCaller *) caller, &pid);
-	if (!retval) {
-		egg_warning ("failed to get PID");
-		goto out;
-	}
-
-	/* get command line from proc */
-	filename = g_strdup_printf ("/proc/%i/cmdline", pid);
-	ret = g_file_get_contents (filename, &cmdline, NULL, &error);
-	if (!ret) {
-		egg_warning ("failed to get cmdline: %s", error->message);
-		g_error_free (error);
-	}
-out:
-	g_free (filename);
-	return cmdline;
-}
-
-/**
- * pk_security_role_to_action:
- **/
-static const gchar *
-pk_security_role_to_action (PkSecurity *security, gboolean trusted, PkRoleEnum role)
-{
-	const gchar *policy = NULL;
-
-	g_return_val_if_fail (PK_IS_SECURITY (security), NULL);
-
-	if (role == PK_ROLE_ENUM_UPDATE_PACKAGES ||
-	    role == PK_ROLE_ENUM_UPDATE_SYSTEM) {
-		policy = "org.freedesktop.packagekit.system-update";
-	} else if (role == PK_ROLE_ENUM_INSTALL_SIGNATURE) {
-		policy = "org.freedesktop.packagekit.system-trust-signing-key";
-	} else if (role == PK_ROLE_ENUM_ROLLBACK) {
-		policy = "org.freedesktop.packagekit.system-rollback";
-	} else if (role == PK_ROLE_ENUM_REPO_ENABLE ||
-		   role == PK_ROLE_ENUM_REPO_SET_DATA) {
-		policy = "org.freedesktop.packagekit.system-sources-configure";
-	} else if (role == PK_ROLE_ENUM_REFRESH_CACHE) {
-		policy = "org.freedesktop.packagekit.system-sources-refresh";
-	} else if (role == PK_ROLE_ENUM_SET_PROXY_PRIVATE) {
-		policy = "org.freedesktop.packagekit.system-network-proxy-configure";
-	} else if (role == PK_ROLE_ENUM_REMOVE_PACKAGES) {
-		policy = "org.freedesktop.packagekit.package-remove";
-	} else if (role == PK_ROLE_ENUM_INSTALL_PACKAGES) {
-		policy = "org.freedesktop.packagekit.package-install";
-	} else if (role == PK_ROLE_ENUM_INSTALL_FILES && trusted) {
-		policy = "org.freedesktop.packagekit.package-install";
-	} else if (role == PK_ROLE_ENUM_INSTALL_FILES && !trusted) {
-		policy = "org.freedesktop.packagekit.package-install-untrusted";
-	} else if (role == PK_ROLE_ENUM_ACCEPT_EULA) {
-		policy = "org.freedesktop.packagekit.package-eula-accept";
-	} else if (role == PK_ROLE_ENUM_CANCEL) {
-		policy = "org.freedesktop.packagekit.cancel-foreign";
-	}
-	return policy;
-}
-
-/**
- * pk_security_action_is_allowed:
- **/
-gboolean
-pk_security_action_is_allowed (PkSecurity *security, PkSecurityCaller *caller, gboolean trusted, PkRoleEnum role, gchar **error_detail)
-{
-	gboolean ret = FALSE;
-	PolKitResult result;
-	const gchar *policy;
-	PolKitAction *action;
-	guint uid;
-	gchar *cmdline;
-
-	g_return_val_if_fail (PK_IS_SECURITY (security), FALSE);
-	g_return_val_if_fail (caller != NULL, FALSE);
-
-	/* map the roles to policykit rules */
-	policy = pk_security_role_to_action (security, trusted, role);
-	if (policy == NULL) {
-		egg_warning ("policykit type required for '%s'", pk_role_enum_to_text (role));
-		return FALSE;
-	}
-
-	/* set action */
-	action = polkit_action_new ();
-	if (action == NULL) {
-		egg_warning ("error: polkit_action_new failed");
-		goto out;
-	}
-	polkit_action_set_action_id (action, policy);
-
-	/* set caller */
-	result = polkit_context_is_caller_authorized (security->priv->pk_context, action, (PolKitCaller *) caller, TRUE, NULL);
-	egg_debug ("PolicyKit result = '%s'", polkit_result_to_string_representation (result));
-	if (result != POLKIT_RESULT_YES) {
-		if (error_detail != NULL)
-			*error_detail = g_strdup_printf ("%s %s", policy, polkit_result_to_string_representation (result));
-		goto out;
-	}
-
-	/* yippee */
-	ret = TRUE;
-
-out:
-	/* log result */
-	uid = pk_security_get_uid (security, caller);
-	cmdline = pk_security_get_cmdline (security, caller);
-	if (ret)
-		pk_syslog_add (security->priv->syslog, PK_SYSLOG_TYPE_AUTH, "uid %i obtained %s auth (trusted:%i)", uid, policy, trusted);
-	else
-		pk_syslog_add (security->priv->syslog, PK_SYSLOG_TYPE_AUTH, "uid %i failed to obtain %s auth (trusted:%i)", uid, policy, trusted);
-	g_free (cmdline);
-
-	if (action != NULL)
-		polkit_action_unref (action);
-	return ret;
-}
-
-/**
- * pk_security_finalize:
- **/
-static void
-pk_security_finalize (GObject *object)
-{
-	PkSecurity *security;
-	g_return_if_fail (PK_IS_SECURITY (object));
-	security = PK_SECURITY (object);
-
-	/* unref PolicyKit */
-	polkit_context_unref (security->priv->pk_context);
-	g_object_unref (security->priv->syslog);
-
-	G_OBJECT_CLASS (pk_security_parent_class)->finalize (object);
-}
-
-/**
- * pk_security_class_init:
- **/
-static void
-pk_security_class_init (PkSecurityClass *klass)
-{
-	GObjectClass *object_class = G_OBJECT_CLASS (klass);
-	object_class->finalize = pk_security_finalize;
-	g_type_class_add_private (klass, sizeof (PkSecurityPrivate));
-}
-
-/**
- * pk_security_io_watch_have_data:
- **/
-static gboolean
-pk_security_io_watch_have_data (GIOChannel *channel, GIOCondition condition, gpointer user_data)
-{
-	int fd;
-	PolKitContext *pk_context = user_data;
-	fd = g_io_channel_unix_get_fd (channel);
-	polkit_context_io_func (pk_context, fd);
-	return TRUE;
-}
-
-/**
- * pk_security_io_add_watch:
- **/
-static int
-pk_security_io_add_watch (PolKitContext *pk_context, int fd)
-{
-	guint id = 0;
-	GIOChannel *channel;
-	channel = g_io_channel_unix_new (fd);
-	if (channel == NULL)
-		return id;
-	id = g_io_add_watch (channel, G_IO_IN, pk_security_io_watch_have_data, pk_context);
-	if (id == 0) {
-		g_io_channel_unref (channel);
-		return id;
-	}
-	g_io_channel_unref (channel);
-	return id;
-}
-
-/**
- * pk_security_io_remove_watch:
- **/
-static void
-pk_security_io_remove_watch (PolKitContext *pk_context, int watch_id)
-{
-	g_source_remove (watch_id);
-}
-
-/**
- * pk_security_init:
- *
- * initializes the security class. NOTE: We expect security objects
- * to *NOT* be removed or added during the session.
- * We only control the first security object if there are more than one.
- **/
-static void
-pk_security_init (PkSecurity *security)
-{
-	PolKitError *pk_error;
-	polkit_bool_t retval;
-	DBusError dbus_error;
-
-	security->priv = PK_SECURITY_GET_PRIVATE (security);
-
-	egg_debug ("Using PolicyKit security framework");
-
-	/* use syslog */
-	security->priv->syslog = pk_syslog_new ();
-
-	/* get a connection to the bus */
-	dbus_error_init (&dbus_error);
-	security->priv->connection = dbus_bus_get (DBUS_BUS_SYSTEM, &dbus_error);
-	if (security->priv->connection == NULL) {
-		if (dbus_error_is_set (&dbus_error)) {
-			egg_warning ("failed to get system connection %s: %s\n", dbus_error.name, dbus_error.message);
-			dbus_error_free (&dbus_error);
-		}
-	}
-
-	/* get PolicyKit context */
-	security->priv->pk_context = polkit_context_new ();
-
-	/* watch for changes */
-	polkit_context_set_io_watch_functions (security->priv->pk_context,
-					       pk_security_io_add_watch,
-					       pk_security_io_remove_watch);
-
-	pk_error = NULL;
-	retval = polkit_context_init (security->priv->pk_context, &pk_error);
-	if (retval == FALSE) {
-		egg_warning ("Could not init PolicyKit context: %s", polkit_error_get_error_message (pk_error));
-		polkit_error_free (pk_error);
-	}
-}
-
-/**
- * pk_security_new:
- * Return value: A new security class instance.
- **/
-PkSecurity *
-pk_security_new (void)
-{
-	if (pk_security_object != NULL) {
-		g_object_ref (pk_security_object);
-	} else {
-		pk_security_object = g_object_new (PK_TYPE_SECURITY, NULL);
-		g_object_add_weak_pointer (pk_security_object, &pk_security_object);
-	}
-	return PK_SECURITY (pk_security_object);
-}
-
-/***************************************************************************
- ***                          MAKE CHECK TESTS                           ***
- ***************************************************************************/
-#ifdef EGG_TEST
-#include "egg-test.h"
-
-void
-pk_security_test (EggTest *test)
-{
-	PkSecurity *security;
-	const gchar *action;
-
-	if (!egg_test_start (test, "PkSecurity"))
-		return;
-
-	/************************************************************/
-	egg_test_title (test, "get an instance");
-	security = pk_security_new ();
-	egg_test_assert (test, security != NULL);
-	egg_test_title_assert (test, "check connection", security->priv->connection != NULL);
-	egg_test_title_assert (test, "check PolKit context", security->priv->pk_context != NULL);
-
-	/************************************************************/
-	egg_test_title (test, "map valid role to action");
-	action = pk_security_role_to_action (security, FALSE, PK_ROLE_ENUM_UPDATE_PACKAGES);
-	if (egg_strequal (action, "org.freedesktop.packagekit.system-update"))
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "did not get correct action '%s'", action);
-
-	/************************************************************/
-	egg_test_title (test, "map invalid role to action");
-	action = pk_security_role_to_action (security, FALSE, PK_ROLE_ENUM_SEARCH_NAME);
-	if (action == NULL)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "did not get correct action '%s'", action);
-
-	g_object_unref (security);
-
-	egg_test_end (test);
-}
-#endif
-
diff --git a/src/pk-security.h b/src/pk-security.h
deleted file mode 100644
index a90d9f4..0000000
--- a/src/pk-security.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
- *
- * Copyright (C) 2007 Richard Hughes <richard@hughsie.com>
- *
- * Licensed under the GNU General Public License Version 2
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef __PK_SECURITY_H
-#define __PK_SECURITY_H
-
-#include <glib-object.h>
-#include <packagekit-glib/packagekit.h>
-
-G_BEGIN_DECLS
-
-#define PK_TYPE_SECURITY		(pk_security_get_type ())
-#define PK_SECURITY(o)			(G_TYPE_CHECK_INSTANCE_CAST ((o), PK_TYPE_SECURITY, PkSecurity))
-#define PK_SECURITY_CLASS(k)		(G_TYPE_CHECK_CLASS_CAST((k), PK_TYPE_SECURITY, PkSecurityClass))
-#define PK_IS_SECURITY(o)		(G_TYPE_CHECK_INSTANCE_TYPE ((o), PK_TYPE_SECURITY))
-#define PK_IS_SECURITY_CLASS(k)		(G_TYPE_CHECK_CLASS_TYPE ((k), PK_TYPE_SECURITY))
-#define PK_SECURITY_GET_CLASS(o)	(G_TYPE_INSTANCE_GET_CLASS ((o), PK_TYPE_SECURITY, PkSecurityClass))
-
-/* not actually roles */
-#define PK_ROLE_ENUM_SET_PROXY_PRIVATE		(PK_ROLE_ENUM_UNKNOWN + 1)
-
-/* when the UID is invalid or not known */
-#define PK_SECURITY_UID_INVALID			G_MAXUINT
-
-typedef struct PkSecurityPrivate PkSecurityPrivate;
-
-typedef struct
-{
-	GObject		      parent;
-	PkSecurityPrivate     *priv;
-} PkSecurity;
-
-typedef struct
-{
-	GObjectClass	parent_class;
-} PkSecurityClass;
-
-typedef struct PkSecurityCaller_ PkSecurityCaller;
-
-GType		 pk_security_get_type		(void);
-PkSecurity	*pk_security_new		(void);
-
-PkSecurityCaller *pk_security_caller_new_from_sender	(PkSecurity		*security,
-							 const gchar		*sender);
-void		 pk_security_caller_unref		(PkSecurityCaller	*caller);
-guint		 pk_security_get_uid			(PkSecurity		*security,
-							 PkSecurityCaller	*caller);
-gchar 		*pk_security_get_cmdline		(PkSecurity		*security,
-							 PkSecurityCaller	*caller);
-gboolean	 pk_security_action_is_allowed		(PkSecurity		*security,
-							 PkSecurityCaller	*caller,
-							 gboolean		 trusted,
-							 PkRoleEnum		 role,
-							 gchar			**error_detail)
-							 G_GNUC_WARN_UNUSED_RESULT;
-
-G_END_DECLS
-
-#endif /* __PK_SECURITY_H */
diff --git a/src/pk-self-test.c b/src/pk-self-test.c
index e8370d9..ccaf919 100644
--- a/src/pk-self-test.c
+++ b/src/pk-self-test.c
@@ -32,7 +32,6 @@ void pk_inhibit_test (EggTest *test);
 void pk_spawn_test (EggTest *test);
 void pk_transaction_list_test (EggTest *test);
 void pk_transaction_db_test (EggTest *test);
-void pk_security_test (EggTest *test);
 void pk_time_test (EggTest *test);
 void pk_backend_test (EggTest *test);
 void pk_backend_test_spawn (EggTest *test);
@@ -55,7 +54,6 @@ main (int argc, char **argv)
 
 	/* components */
 	pk_file_monitor_test (test);
-	pk_security_test (test);
 	pk_time_test (test);
 	pk_conf_test (test);
 	pk_store_test (test);
diff --git a/src/pk-transaction-list.c b/src/pk-transaction-list.c
index 95edc0d..1be4264 100644
--- a/src/pk-transaction-list.c
+++ b/src/pk-transaction-list.c
@@ -570,10 +570,6 @@ pk_transaction_list_get_state (PkTransactionList *tlist)
 	if (wrong != 0)
 		g_string_append_printf (string, "ERROR: %i have inconsistent flags\n", wrong);
 
-	/* some are not committed */
-	if (no_commit != 0)
-		g_string_append_printf (string, "WARNING: %i have not been committed\n", no_commit);
-
 	/* more than one running */
 	if (running > 1)
 		g_string_append_printf (string, "ERROR: %i are running\n", running);
@@ -649,7 +645,7 @@ pk_transaction_list_is_consistent (PkTransactionList *tlist)
 
 	/* some are not committed */
 	if (no_commit != 0)
-		egg_debug ("%i have not been committed", no_commit);
+		egg_debug ("%i have not been committed and may be pending auth", no_commit);
 
 	/* more than one running */
 	if (running > 1) {
diff --git a/src/pk-transaction.c b/src/pk-transaction.c
index 255cb7d..0897694 100644
--- a/src/pk-transaction.c
+++ b/src/pk-transaction.c
@@ -42,6 +42,9 @@
 #include <dbus/dbus-glib-lowlevel.h>
 #include <gio/gio.h>
 #include <packagekit-glib/packagekit.h>
+#ifdef USE_SECURITY_POLKIT
+#include <polkit/polkit.h>
+#endif
 
 #include "egg-debug.h"
 #include "egg-string.h"
@@ -58,7 +61,6 @@
 #include "pk-shared.h"
 #include "pk-cache.h"
 #include "pk-notify.h"
-#include "pk-security.h"
 #include "pk-post-trans.h"
 #include "pk-syslog.h"
 
@@ -68,6 +70,9 @@ static void     pk_transaction_dispose		(GObject	    *object);
 #define PK_TRANSACTION_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), PK_TYPE_TRANSACTION, PkTransactionPrivate))
 #define PK_TRANSACTION_UPDATES_CHANGED_TIMEOUT	100 /* ms */
 
+/* when the UID is invalid or not known */
+#define PK_TRANSACTION_UID_INVALID		G_MAXUINT
+
 static void pk_transaction_status_changed_cb (PkBackend *backend, PkStatusEnum status, PkTransaction *transaction);
 static void pk_transaction_progress_changed_cb (PkBackend *backend, guint percentage, guint subpercentage, guint elapsed, guint remaining, PkTransaction *transaction);
 
@@ -83,6 +88,7 @@ struct PkTransactionPrivate
 	gboolean		 running;
 	gboolean		 has_been_run;
 	gboolean		 allow_cancel;
+	gboolean		 waiting_for_auth;
 	gboolean		 emit_eula_required;
 	gboolean		 emit_signature_required;
 	gboolean		 emit_media_change_required;
@@ -94,8 +100,13 @@ struct PkTransactionPrivate
 	PkCache			*cache;
 	PkConf			*conf;
 	PkNotify		*notify;
-	PkSecurity		*security;
-	PkSecurityCaller	*caller;
+#ifdef USE_SECURITY_POLKIT
+	PolkitAuthority		*authority;
+	PolkitSubject		*subject;
+	GCancellable		*cancellable;
+#endif
+	DBusGConnection		*connection;
+	DBusGProxy		*proxy_pid;
 	PkPostTrans		*post_trans;
 	PkSyslog		*syslog;
 
@@ -410,6 +421,18 @@ pk_transaction_finished_emit (PkTransaction *transaction, PkExitEnum exit_enum,
 }
 
 /**
+ * pk_transaction_error_code_emit:
+ **/
+static void
+pk_transaction_error_code_emit (PkTransaction *transaction, PkErrorCodeEnum error_enum, const gchar *details)
+{
+	const gchar *text;
+	text = pk_error_enum_to_text (error_enum);
+	egg_debug ("emitting error-code %s, '%s'", text, details);
+	g_signal_emit (transaction, signals [PK_TRANSACTION_ERROR_CODE], 0, text, details);
+}
+
+/**
  * pk_transaction_allow_cancel_cb:
  **/
 static void
@@ -462,8 +485,6 @@ static void
 pk_transaction_error_code_cb (PkBackend *backend, PkErrorCodeEnum code,
 			      const gchar *details, PkTransaction *transaction)
 {
-	const gchar *code_text;
-
 	g_return_if_fail (PK_IS_TRANSACTION (transaction));
 	g_return_if_fail (transaction->priv->tid != NULL);
 
@@ -473,9 +494,7 @@ pk_transaction_error_code_cb (PkBackend *backend, PkErrorCodeEnum code,
 				    "- this is a backend problem and should be fixed!", pk_role_enum_to_text (transaction->priv->role));
 	}
 
-	code_text = pk_error_enum_to_text (code);
-	egg_debug ("emitting error-code %s, '%s'", code_text, details);
-	g_signal_emit (transaction, signals [PK_TRANSACTION_ERROR_CODE], 0, code_text, details);
+	pk_transaction_error_code_emit (transaction, code, details);
 }
 
 /**
@@ -727,7 +746,7 @@ pk_transaction_finished_cb (PkBackend *backend, PkExitEnum exit_enum, PkTransact
 	pk_inhibit_remove (transaction->priv->inhibit, transaction);
 
 	/* report to syslog */
-	if (transaction->priv->uid != PK_SECURITY_UID_INVALID)
+	if (transaction->priv->uid != PK_TRANSACTION_UID_INVALID)
 		pk_syslog_add (transaction->priv->syslog, PK_SYSLOG_TYPE_INFO, "%s transaction %s from uid %i finished with %s after %ims",
 			       pk_role_enum_to_text (transaction->priv->role), transaction->priv->tid,
 			       transaction->priv->uid, pk_exit_enum_to_text (exit_enum), time_ms);
@@ -1235,6 +1254,31 @@ pk_transaction_set_tid (PkTransaction *transaction, const gchar *tid)
 }
 
 /**
+ * pk_transaction_get_uid:
+ **/
+static guint
+pk_transaction_get_uid (PkTransaction *transaction, const gchar *sender)
+{
+	guint uid;
+	DBusError error;
+	DBusConnection *con;
+
+	g_return_val_if_fail (PK_IS_TRANSACTION (transaction), G_MAXUINT);
+	g_return_val_if_fail (sender != NULL, G_MAXUINT);
+
+	dbus_error_init (&error);
+	con = dbus_g_connection_get_connection (transaction->priv->connection);
+	uid = dbus_bus_get_unix_user (con, sender, &error);
+	if (dbus_error_is_set (&error)) {
+		egg_warning ("Could not get uid for connection: %s %s", error.name, error.message);
+		uid = G_MAXUINT;
+		goto out;
+	}
+out:
+	return uid;
+}
+
+/**
  * pk_transaction_set_sender:
  */
 gboolean
@@ -1249,9 +1293,10 @@ pk_transaction_set_sender (PkTransaction *transaction, const gchar *sender)
 	egg_dbus_monitor_assign (transaction->priv->monitor, EGG_DBUS_MONITOR_SYSTEM, sender);
 
 	/* we get the UID for all callers as we need to know when to cancel */
-	transaction->priv->caller = pk_security_caller_new_from_sender (transaction->priv->security, sender);
-	if (transaction->priv->caller != NULL)
-		transaction->priv->uid = pk_security_get_uid (transaction->priv->security, transaction->priv->caller);
+#ifdef USE_SECURITY_POLKIT
+	transaction->priv->subject = polkit_system_bus_name_new (sender);
+#endif
+	transaction->priv->uid = pk_transaction_get_uid (transaction, sender);
 
 	return TRUE;
 }
@@ -1270,6 +1315,77 @@ pk_transaction_release_tid (PkTransaction *transaction)
 	return ret;
 }
 
+#ifdef USE_SECURITY_POLKIT
+/**
+ * pk_transaction_get_pid:
+ **/
+static guint
+pk_transaction_get_pid (PkTransaction *transaction, PolkitSubject *subject)
+{
+	guint pid;
+	gboolean ret;
+	gchar *sender = NULL;
+	GError *error = NULL;
+
+	g_return_val_if_fail (PK_IS_TRANSACTION (transaction), G_MAXUINT);
+	g_return_val_if_fail (transaction->priv->proxy_pid != NULL, G_MAXUINT);
+	g_return_val_if_fail (subject != NULL, G_MAXUINT);
+
+	/* this comes back as 'system-bus-name::1.127' */
+	sender = polkit_subject_to_string (subject);
+
+	/* get pid from DBus (quite slow) */
+	ret = dbus_g_proxy_call (transaction->priv->proxy_pid, "GetConnectionUnixProcessID", &error,
+				 G_TYPE_STRING, sender+16,
+				 G_TYPE_INVALID,
+				 G_TYPE_UINT, &pid,
+				 G_TYPE_INVALID);
+	if (!ret) {
+		egg_error ("failed to get pid: %s", error->message);
+		g_error_free (error);
+		goto out;
+	}
+out:
+	g_free (sender);
+	return pid;
+}
+
+
+/**
+ * pk_transaction_get_cmdline:
+ **/
+static gchar *
+pk_transaction_get_cmdline (PkTransaction *transaction, PolkitSubject *subject)
+{
+	gboolean ret;
+	gchar *filename = NULL;
+	gchar *cmdline = NULL;
+	GError *error = NULL;
+	guint pid;
+
+	g_return_val_if_fail (PK_IS_TRANSACTION (transaction), NULL);
+	g_return_val_if_fail (subject != NULL, NULL);
+
+	/* get pid */
+	pid = pk_transaction_get_pid (transaction, subject);
+	if (pid == G_MAXUINT) {
+		egg_warning ("failed to get PID");
+		goto out;
+	}
+
+	/* get command line from proc */
+	filename = g_strdup_printf ("/proc/%i/cmdline", pid);
+	ret = g_file_get_contents (filename, &cmdline, NULL, &error);
+	if (!ret) {
+		egg_warning ("failed to get cmdline: %s", error->message);
+		g_error_free (error);
+	}
+out:
+	g_free (filename);
+	return cmdline;
+}
+#endif
+
 /**
  * pk_transaction_commit:
  **/
@@ -1277,7 +1393,9 @@ G_GNUC_WARN_UNUSED_RESULT static gboolean
 pk_transaction_commit (PkTransaction *transaction)
 {
 	gboolean ret;
+#ifdef USE_SECURITY_POLKIT
 	gchar *cmdline;
+#endif
 
 	g_return_val_if_fail (PK_IS_TRANSACTION (transaction), FALSE);
 	g_return_val_if_fail (transaction->priv->tid != NULL, FALSE);
@@ -1306,15 +1424,16 @@ pk_transaction_commit (PkTransaction *transaction)
 		/* save uid */
 		pk_transaction_db_set_uid (transaction->priv->transaction_db, transaction->priv->tid, transaction->priv->uid);
 
+#ifdef USE_SECURITY_POLKIT
 		/* save cmdline */
-		cmdline = pk_security_get_cmdline (transaction->priv->security, transaction->priv->caller);
+		cmdline = pk_transaction_get_cmdline (transaction, transaction->priv->subject);
 		pk_transaction_db_set_cmdline (transaction->priv->transaction_db, transaction->priv->tid, cmdline);
+		g_free (cmdline);
+#endif
 
 		/* report to syslog */
 		pk_syslog_add (transaction->priv->syslog, PK_SYSLOG_TYPE_INFO, "new %s transaction %s scheduled from uid %i",
 			       pk_role_enum_to_text (transaction->priv->role), transaction->priv->tid, transaction->priv->uid);
-
-		g_free (cmdline);
 	}
 	return TRUE;
 }
@@ -1425,35 +1544,163 @@ out:
 	return ret;
 }
 
+#ifdef USE_SECURITY_POLKIT
+/**
+ * pk_transaction_action_obtain_authorization:
+ **/
+static void
+pk_transaction_action_obtain_authorization_finished_cb (GObject *source_object, GAsyncResult *res, PkTransaction *transaction)
+{
+	PolkitAuthorizationResult *result;
+	gboolean ret;
+	GError *error = NULL;
+
+	/* finish the call */
+	result = polkit_authority_check_authorization_finish (transaction->priv->authority, res, &error);
+	transaction->priv->waiting_for_auth = FALSE;
+
+	/* failed */
+	if (result == NULL) {
+		egg_warning ("failed to check for auth: %s", error->message);
+		g_error_free (error);
+		goto out;
+	}
+
+	/* did not auth */
+	if (!polkit_authorization_result_get_is_authorized (result)) {
+
+		/* emit an ::ErrorCode() and then ::Finished() */
+		pk_transaction_error_code_emit (transaction, PK_ERROR_ENUM_NOT_AUTHORIZED, "failed to obtain auth");
+		pk_transaction_finished_emit (transaction, PK_EXIT_ENUM_FAILED, 0);
+
+		pk_syslog_add (transaction->priv->syslog, PK_SYSLOG_TYPE_AUTH, "uid %i failed to obtain auth", transaction->priv->uid);
+		goto out;
+	}
+
+	/* try to commit this */
+	ret = pk_transaction_commit (transaction);
+	if (!ret) {
+		egg_warning ("Could not commit to a transaction object");
+		pk_transaction_release_tid (transaction);
+		goto out;
+	}
+
+	/* log success too */
+	pk_syslog_add (transaction->priv->syslog, PK_SYSLOG_TYPE_AUTH, "uid %i obtained auth", transaction->priv->uid);
+out:
+	if (result != NULL)
+		g_object_unref (result);
+	return;
+}
+
 /**
- * pk_transaction_action_is_allowed:
+ * pk_transaction_role_to_action:
+ **/
+static const gchar *
+pk_transaction_role_to_action (gboolean trusted, PkRoleEnum role)
+{
+	const gchar *policy = NULL;
+
+	if (role == PK_ROLE_ENUM_UPDATE_PACKAGES ||
+	    role == PK_ROLE_ENUM_UPDATE_SYSTEM) {
+		policy = "org.freedesktop.packagekit.system-update";
+	} else if (role == PK_ROLE_ENUM_INSTALL_SIGNATURE) {
+		policy = "org.freedesktop.packagekit.system-trust-signing-key";
+	} else if (role == PK_ROLE_ENUM_ROLLBACK) {
+		policy = "org.freedesktop.packagekit.system-rollback";
+	} else if (role == PK_ROLE_ENUM_REPO_ENABLE ||
+		   role == PK_ROLE_ENUM_REPO_SET_DATA) {
+		policy = "org.freedesktop.packagekit.system-sources-configure";
+	} else if (role == PK_ROLE_ENUM_REFRESH_CACHE) {
+		policy = "org.freedesktop.packagekit.system-sources-refresh";
+	} else if (role == PK_ROLE_ENUM_REMOVE_PACKAGES) {
+		policy = "org.freedesktop.packagekit.package-remove";
+	} else if (role == PK_ROLE_ENUM_INSTALL_PACKAGES) {
+		policy = "org.freedesktop.packagekit.package-install";
+	} else if (role == PK_ROLE_ENUM_INSTALL_FILES && trusted) {
+		policy = "org.freedesktop.packagekit.package-install";
+	} else if (role == PK_ROLE_ENUM_INSTALL_FILES && !trusted) {
+		policy = "org.freedesktop.packagekit.package-install-untrusted";
+	} else if (role == PK_ROLE_ENUM_ACCEPT_EULA) {
+		policy = "org.freedesktop.packagekit.package-eula-accept";
+	} else if (role == PK_ROLE_ENUM_CANCEL) {
+		policy = "org.freedesktop.packagekit.cancel-foreign";
+	}
+	return policy;
+}
+
+/**
+ * pk_transaction_obtain_authorization:
  *
  * Only valid from an async caller, which is fine, as we won't prompt the user
  * when not async.
+ *
+ * Because checking for authentication might have to respond to user input, this
+ * is treated as async. As such, the transaction should only be added to the
+ * transaction list when authorised, and not before.
  **/
 static gboolean
-pk_transaction_action_is_allowed (PkTransaction *transaction, gboolean trusted, PkRoleEnum role, GError **error)
+pk_transaction_obtain_authorization (PkTransaction *transaction, gboolean trusted, PkRoleEnum role, GError **error)
 {
-	gboolean ret;
-	gchar *error_detail;
+	const gchar *action_id;
+	gboolean ret = FALSE;
 
 	g_return_val_if_fail (transaction->priv->sender != NULL, FALSE);
 
-	/* we should always have caller */
-	if (transaction->priv->caller == NULL) {
+	/* we should always have subject */
+	if (transaction->priv->subject == NULL) {
 		*error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_REFUSED_BY_POLICY,
-				      "caller %s not found", transaction->priv->sender);
-		return FALSE;
+				      "subject %s not found", transaction->priv->sender);
+		goto out;
 	}
 
-	/* use security model to get auth */
-	ret = pk_security_action_is_allowed (transaction->priv->security, transaction->priv->caller, trusted, role, &error_detail);
+	/* map the roles to policykit rules */
+	action_id = pk_transaction_role_to_action (trusted, role);
+	if (action_id == NULL) {
+		*error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_REFUSED_BY_POLICY, "policykit type required for '%s'", pk_role_enum_to_text (role));
+		goto out;
+	}
+
+	/* log */
+	pk_syslog_add (transaction->priv->syslog, PK_SYSLOG_TYPE_AUTH, "uid %i is trying to obtain %s auth (trusted:%i)", transaction->priv->uid, action_id, trusted);
+
+	/* check subject */
+	transaction->priv->waiting_for_auth = TRUE;
+	polkit_authority_check_authorization (transaction->priv->authority,
+					      transaction->priv->subject,
+					      action_id,
+					      NULL,
+					      POLKIT_CHECK_AUTHORIZATION_FLAGS_ALLOW_USER_INTERACTION,
+					      transaction->priv->cancellable,
+					      (GAsyncReadyCallback) pk_transaction_action_obtain_authorization_finished_cb,
+					      transaction);
+	/* assume success, as this is async */
+	ret = TRUE;
+out:
+	return ret;
+}
+
+#else
+/**
+ * pk_transaction_obtain_authorization:
+ **/
+static gboolean
+pk_transaction_obtain_authorization (PkTransaction *transaction, gboolean trusted, PkRoleEnum role, GError **error)
+{
+	gboolean ret;
+
+	egg_warning ("*** THERE IS NO SECURITY MODEL BEING USED!!! ***");
+
+	/* try to commit this */
+	ret = pk_transaction_commit (transaction);
 	if (!ret) {
-		*error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_REFUSED_BY_POLICY, "%s", error_detail);
-		g_free (error_detail);
+		egg_warning ("Could not commit to a transaction object");
+		pk_transaction_release_tid (transaction);
 	}
+
 	return ret;
 }
+#endif
 
 /**
  * pk_transaction_priv_get_role:
@@ -1554,8 +1801,8 @@ pk_transaction_accept_eula (PkTransaction *transaction, const gchar *eula_id, DB
 		return;
 	}
 
-	/* check if the action is allowed from this client - if not, set an error */
-	ret = pk_transaction_action_is_allowed (transaction, FALSE, PK_ROLE_ENUM_ACCEPT_EULA, &error);
+	/* try to get authorization */
+	ret = pk_transaction_obtain_authorization (transaction, FALSE, PK_ROLE_ENUM_ACCEPT_EULA, &error);
 	if (!ret) {
 		pk_transaction_release_tid (transaction);
 		pk_transaction_dbus_return_error (context, error);
@@ -1589,7 +1836,6 @@ pk_transaction_cancel (PkTransaction *transaction, DBusGMethodInvocation *contex
 	GError *error = NULL;
 	gchar *sender;
 	guint uid;
-	PkSecurityCaller *caller;
 
 	g_return_if_fail (PK_IS_TRANSACTION (transaction));
 	g_return_if_fail (transaction->priv->tid != NULL);
@@ -1628,7 +1874,7 @@ pk_transaction_cancel (PkTransaction *transaction, DBusGMethodInvocation *contex
 	}
 
 	/* check if we saved the uid */
-	if (transaction->priv->uid == PK_SECURITY_UID_INVALID) {
+	if (transaction->priv->uid == PK_TRANSACTION_UID_INVALID) {
 		error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_CANNOT_CANCEL,
 				     "No context from caller to get UID from");
 		pk_transaction_dbus_return_error (context, error);
@@ -1637,13 +1883,11 @@ pk_transaction_cancel (PkTransaction *transaction, DBusGMethodInvocation *contex
 
 	/* get the UID of the caller */
 	sender = dbus_g_method_get_sender (context);
-	caller = pk_security_caller_new_from_sender (transaction->priv->security, sender);
-	uid = pk_security_get_uid (transaction->priv->security, caller);
+	uid = pk_transaction_get_uid (transaction, sender);
 	g_free (sender);
-	pk_security_caller_unref (caller);
 
 	/* check we got a valid value */
-	if (uid == PK_SECURITY_UID_INVALID) {
+	if (uid == PK_TRANSACTION_UID_INVALID) {
 		error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_INVALID_STATE, "unable to get uid of caller");
 		pk_transaction_dbus_return_error (context, error);
 		return;
@@ -1652,7 +1896,7 @@ pk_transaction_cancel (PkTransaction *transaction, DBusGMethodInvocation *contex
 	/* check the caller uid with the originator uid */
 	if (transaction->priv->uid != uid) {
 		egg_debug ("uid does not match (%i vs. %i)", transaction->priv->uid, uid);
-		ret = pk_transaction_action_is_allowed (transaction, FALSE, PK_ROLE_ENUM_CANCEL, &error);
+		ret = pk_transaction_obtain_authorization (transaction, FALSE, PK_ROLE_ENUM_CANCEL, &error);
 		if (!ret) {
 			pk_transaction_dbus_return_error (context, error);
 			return;
@@ -2680,8 +2924,8 @@ pk_transaction_install_files (PkTransaction *transaction, gboolean trusted,
 		}
 	}
 
-	/* check if the action is allowed from this client - if not, set an error */
-	ret = pk_transaction_action_is_allowed (transaction, trusted, PK_ROLE_ENUM_INSTALL_FILES, &error);
+	/* try to get authorization */
+	ret = pk_transaction_obtain_authorization (transaction, trusted, PK_ROLE_ENUM_INSTALL_FILES, &error);
 	if (!ret) {
 		pk_transaction_release_tid (transaction);
 		pk_transaction_dbus_return_error (context, error);
@@ -2693,16 +2937,6 @@ pk_transaction_install_files (PkTransaction *transaction, gboolean trusted,
 	transaction->priv->cached_full_paths = g_strdupv (full_paths);
 	pk_transaction_set_role (transaction, PK_ROLE_ENUM_INSTALL_FILES);
 
-	/* try to commit this */
-	ret = pk_transaction_commit (transaction);
-	if (!ret) {
-		error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_COMMIT_FAILED,
-				     "Could not commit to a transaction object");
-		pk_transaction_release_tid (transaction);
-		pk_transaction_dbus_return_error (context, error);
-		return;
-	}
-
 	/* return from async with success */
 	pk_transaction_dbus_return (context);
 	return;
@@ -2755,23 +2989,13 @@ pk_transaction_install_packages (PkTransaction *transaction, gchar **package_ids
 		return;
 	}
 
-	/* check if the action is allowed from this client - if not, set an error */
-	ret = pk_transaction_action_is_allowed (transaction, FALSE, PK_ROLE_ENUM_INSTALL_PACKAGES, &error);
-	if (!ret) {
-		pk_transaction_release_tid (transaction);
-		pk_transaction_dbus_return_error (context, error);
-		return;
-	}
-
 	/* save so we can run later */
 	transaction->priv->cached_package_ids = g_strdupv (package_ids);
 	pk_transaction_set_role (transaction, PK_ROLE_ENUM_INSTALL_PACKAGES);
 
-	/* try to commit this */
-	ret = pk_transaction_commit (transaction);
+	/* try to get authorization */
+	ret = pk_transaction_obtain_authorization (transaction, FALSE, PK_ROLE_ENUM_INSTALL_PACKAGES, &error);
 	if (!ret) {
-		error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_COMMIT_FAILED,
-				     "Could not commit to a transaction object");
 		pk_transaction_release_tid (transaction);
 		pk_transaction_dbus_return_error (context, error);
 		return;
@@ -2834,24 +3058,14 @@ pk_transaction_install_signature (PkTransaction *transaction, const gchar *sig_t
 		return;
 	}
 
-	/* check if the action is allowed from this client - if not, set an error */
-	ret = pk_transaction_action_is_allowed (transaction, FALSE, PK_ROLE_ENUM_INSTALL_SIGNATURE, &error);
-	if (!ret) {
-		pk_transaction_release_tid (transaction);
-		pk_transaction_dbus_return_error (context, error);
-		return;
-	}
-
 	/* save so we can run later */
 	transaction->priv->cached_package_id = g_strdup (package_id);
 	transaction->priv->cached_key_id = g_strdup (key_id);
 	pk_transaction_set_role (transaction, PK_ROLE_ENUM_INSTALL_SIGNATURE);
 
-	/* try to commit this */
-	ret = pk_transaction_commit (transaction);
+	/* try to get authorization */
+	ret = pk_transaction_obtain_authorization (transaction, FALSE, PK_ROLE_ENUM_INSTALL_SIGNATURE, &error);
 	if (!ret) {
-		error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_COMMIT_FAILED,
-				     "Could not commit to a transaction object");
 		pk_transaction_release_tid (transaction);
 		pk_transaction_dbus_return_error (context, error);
 		return;
@@ -2907,14 +3121,6 @@ pk_transaction_refresh_cache (PkTransaction *transaction, gboolean force, DBusGM
 		return;
 	}
 
-	/* check if the action is allowed from this client - if not, set an error */
-	ret = pk_transaction_action_is_allowed (transaction, FALSE, PK_ROLE_ENUM_REFRESH_CACHE, &error);
-	if (!ret) {
-		pk_transaction_release_tid (transaction);
-		pk_transaction_dbus_return_error (context, error);
-		return;
-	}
-
 	/* we unref the update cache if it exists */
 	pk_cache_invalidate (transaction->priv->cache);
 
@@ -2922,11 +3128,9 @@ pk_transaction_refresh_cache (PkTransaction *transaction, gboolean force, DBusGM
 	transaction->priv->cached_force = force;
 	pk_transaction_set_role (transaction, PK_ROLE_ENUM_REFRESH_CACHE);
 
-	/* try to commit this */
-	ret = pk_transaction_commit (transaction);
+	/* try to get authorization */
+	ret = pk_transaction_obtain_authorization (transaction, FALSE, PK_ROLE_ENUM_REFRESH_CACHE, &error);
 	if (!ret) {
-		error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_COMMIT_FAILED,
-				     "Could not commit to a transaction object");
 		pk_transaction_release_tid (transaction);
 		pk_transaction_dbus_return_error (context, error);
 		return;
@@ -2984,24 +3188,14 @@ pk_transaction_remove_packages (PkTransaction *transaction, gchar **package_ids,
 		return;
 	}
 
-	/* check if the action is allowed from this client - if not, set an error */
-	ret = pk_transaction_action_is_allowed (transaction, FALSE, PK_ROLE_ENUM_REMOVE_PACKAGES, &error);
-	if (!ret) {
-		pk_transaction_release_tid (transaction);
-		pk_transaction_dbus_return_error (context, error);
-		return;
-	}
-
 	/* save so we can run later */
 	transaction->priv->cached_allow_deps = allow_deps;
 	transaction->priv->cached_package_ids = g_strdupv (package_ids);
 	pk_transaction_set_role (transaction, PK_ROLE_ENUM_REMOVE_PACKAGES);
 
-	/* try to commit this */
-	ret = pk_transaction_commit (transaction);
+	/* try to get authorization */
+	ret = pk_transaction_obtain_authorization (transaction, FALSE, PK_ROLE_ENUM_REMOVE_PACKAGES, &error);
 	if (!ret) {
-		error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_COMMIT_FAILED,
-				     "Could not commit to a transaction object");
 		pk_transaction_release_tid (transaction);
 		pk_transaction_dbus_return_error (context, error);
 		return;
@@ -3053,24 +3247,14 @@ pk_transaction_repo_enable (PkTransaction *transaction, const gchar *repo_id, gb
 		return;
 	}
 
-	/* check if the action is allowed from this client - if not, set an error */
-	ret = pk_transaction_action_is_allowed (transaction, FALSE, PK_ROLE_ENUM_REPO_ENABLE, &error);
-	if (!ret) {
-		pk_transaction_release_tid (transaction);
-		pk_transaction_dbus_return_error (context, error);
-		return;
-	}
-
 	/* save so we can run later */
 	transaction->priv->cached_repo_id = g_strdup (repo_id);
 	transaction->priv->cached_enabled = enabled;
 	pk_transaction_set_role (transaction, PK_ROLE_ENUM_REPO_ENABLE);
 
-	/* try to commit this */
-	ret = pk_transaction_commit (transaction);
+	/* try to get authorization */
+	ret = pk_transaction_obtain_authorization (transaction, FALSE, PK_ROLE_ENUM_REPO_ENABLE, &error);
 	if (!ret) {
-		error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_COMMIT_FAILED,
-				     "Could not commit to a transaction object");
 		pk_transaction_release_tid (transaction);
 		pk_transaction_dbus_return_error (context, error);
 		return;
@@ -3123,25 +3307,15 @@ pk_transaction_repo_set_data (PkTransaction *transaction, const gchar *repo_id,
 		return;
 	}
 
-	/* check if the action is allowed from this client - if not, set an error */
-	ret = pk_transaction_action_is_allowed (transaction, FALSE, PK_ROLE_ENUM_REPO_SET_DATA, &error);
-	if (!ret) {
-		pk_transaction_release_tid (transaction);
-		pk_transaction_dbus_return_error (context, error);
-		return;
-	}
-
 	/* save so we can run later */
 	transaction->priv->cached_repo_id = g_strdup (repo_id);
 	transaction->priv->cached_parameter = g_strdup (parameter);
 	transaction->priv->cached_value = g_strdup (value);
 	pk_transaction_set_role (transaction, PK_ROLE_ENUM_REPO_SET_DATA);
 
-	/* try to commit this */
-	ret = pk_transaction_commit (transaction);
+	/* try to get authorization */
+	ret = pk_transaction_obtain_authorization (transaction, FALSE, PK_ROLE_ENUM_REPO_SET_DATA, &error);
 	if (!ret) {
-		error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_COMMIT_FAILED,
-				     "Could not commit to a transaction object");
 		pk_transaction_release_tid (transaction);
 		pk_transaction_dbus_return_error (context, error);
 		return;
@@ -3270,23 +3444,13 @@ pk_transaction_rollback (PkTransaction *transaction, const gchar *transaction_id
 		return;
 	}
 
-	/* check if the action is allowed from this client - if not, set an error */
-	ret = pk_transaction_action_is_allowed (transaction, FALSE, PK_ROLE_ENUM_ROLLBACK, &error);
-	if (!ret) {
-		pk_transaction_release_tid (transaction);
-		pk_transaction_dbus_return_error (context, error);
-		return;
-	}
-
 	/* save so we can run later */
 	transaction->priv->cached_transaction_id = g_strdup (transaction_id);
 	pk_transaction_set_role (transaction, PK_ROLE_ENUM_ROLLBACK);
 
-	/* try to commit this */
-	ret = pk_transaction_commit (transaction);
+	/* try to get authorization */
+	ret = pk_transaction_obtain_authorization (transaction, FALSE, PK_ROLE_ENUM_ROLLBACK, &error);
 	if (!ret) {
-		error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_COMMIT_FAILED,
-				     "Could not commit to a transaction object");
 		pk_transaction_release_tid (transaction);
 		pk_transaction_dbus_return_error (context, error);
 		return;
@@ -3646,23 +3810,13 @@ pk_transaction_update_packages (PkTransaction *transaction, gchar **package_ids,
 		return;
 	}
 
-	/* check if the action is allowed from this client - if not, set an error */
-	ret = pk_transaction_action_is_allowed (transaction, FALSE, PK_ROLE_ENUM_UPDATE_PACKAGES, &error);
-	if (!ret) {
-		pk_transaction_release_tid (transaction);
-		pk_transaction_dbus_return_error (context, error);
-		return;
-	}
-
 	/* save so we can run later */
 	transaction->priv->cached_package_ids = g_strdupv (package_ids);
 	pk_transaction_set_role (transaction, PK_ROLE_ENUM_UPDATE_PACKAGES);
 
-	/* try to commit this */
-	ret = pk_transaction_commit (transaction);
+	/* try to get authorization */
+	ret = pk_transaction_obtain_authorization (transaction, FALSE, PK_ROLE_ENUM_UPDATE_PACKAGES, &error);
 	if (!ret) {
-		error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_COMMIT_FAILED,
-				     "Could not commit to a transaction object");
 		pk_transaction_release_tid (transaction);
 		pk_transaction_dbus_return_error (context, error);
 		return;
@@ -3703,14 +3857,6 @@ pk_transaction_update_system (PkTransaction *transaction, DBusGMethodInvocation
 		return;
 	}
 
-	/* check if the action is allowed from this client - if not, set an error */
-	ret = pk_transaction_action_is_allowed (transaction, FALSE, PK_ROLE_ENUM_UPDATE_SYSTEM, &error);
-	if (!ret) {
-		pk_transaction_release_tid (transaction);
-		pk_transaction_dbus_return_error (context, error);
-		return;
-	}
-
 	/* are we already performing an update? */
 	if (pk_transaction_list_role_present (transaction->priv->transaction_list, PK_ROLE_ENUM_UPDATE_SYSTEM)) {
 		error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_TRANSACTION_EXISTS_WITH_ROLE,
@@ -3722,11 +3868,9 @@ pk_transaction_update_system (PkTransaction *transaction, DBusGMethodInvocation
 
 	pk_transaction_set_role (transaction, PK_ROLE_ENUM_UPDATE_SYSTEM);
 
-	/* try to commit this */
-	ret = pk_transaction_commit (transaction);
+	/* try to get authorization */
+	ret = pk_transaction_obtain_authorization (transaction, FALSE, PK_ROLE_ENUM_UPDATE_SYSTEM, &error);
 	if (!ret) {
-		error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_COMMIT_FAILED,
-				     "Could not commit to a transaction object");
 		pk_transaction_release_tid (transaction);
 		pk_transaction_dbus_return_error (context, error);
 		return;
@@ -3943,10 +4087,13 @@ pk_transaction_class_init (PkTransactionClass *klass)
 static void
 pk_transaction_init (PkTransaction *transaction)
 {
+	GError *error = NULL;
+
 	transaction->priv = PK_TRANSACTION_GET_PRIVATE (transaction);
 	transaction->priv->finished = FALSE;
 	transaction->priv->running = FALSE;
 	transaction->priv->has_been_run = FALSE;
+	transaction->priv->waiting_for_auth = FALSE;
 	transaction->priv->allow_cancel = TRUE;
 	transaction->priv->emit_eula_required = FALSE;
 	transaction->priv->emit_signature_required = FALSE;
@@ -3967,8 +4114,10 @@ pk_transaction_init (PkTransaction *transaction)
 	transaction->priv->tid = NULL;
 	transaction->priv->sender = NULL;
 	transaction->priv->locale = NULL;
-	transaction->priv->caller = NULL;
-	transaction->priv->uid = PK_SECURITY_UID_INVALID;
+#ifdef USE_SECURITY_POLKIT
+	transaction->priv->subject = NULL;
+#endif
+	transaction->priv->uid = PK_TRANSACTION_UID_INVALID;
 	transaction->priv->role = PK_ROLE_ENUM_UNKNOWN;
 	transaction->priv->status = PK_STATUS_ENUM_WAIT;
 	transaction->priv->percentage = PK_BACKEND_PERCENTAGE_INVALID;
@@ -3976,7 +4125,6 @@ pk_transaction_init (PkTransaction *transaction)
 	transaction->priv->elapsed = 0;
 	transaction->priv->remaining = 0;
 	transaction->priv->backend = pk_backend_new ();
-	transaction->priv->security = pk_security_new ();
 	transaction->priv->cache = pk_cache_new ();
 	transaction->priv->conf = pk_conf_new ();
 	transaction->priv->notify = pk_notify_new ();
@@ -3984,6 +4132,10 @@ pk_transaction_init (PkTransaction *transaction)
 	transaction->priv->package_list = pk_package_list_new ();
 	transaction->priv->transaction_list = pk_transaction_list_new ();
 	transaction->priv->syslog = pk_syslog_new ();
+#ifdef USE_SECURITY_POLKIT
+	transaction->priv->authority = polkit_authority_get ();
+	transaction->priv->cancellable = g_cancellable_new ();
+#endif
 
 	transaction->priv->post_trans = pk_post_trans_new ();
 	g_signal_connect (transaction->priv->post_trans, "status-changed",
@@ -3998,6 +4150,17 @@ pk_transaction_init (PkTransaction *transaction)
 	transaction->priv->monitor = egg_dbus_monitor_new ();
 	g_signal_connect (transaction->priv->monitor, "connection-changed",
 			  G_CALLBACK (pk_transaction_caller_active_changed_cb), transaction);
+
+	/* connect to DBus so we can get the pid */
+	transaction->priv->connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, NULL);
+	transaction->priv->proxy_pid = dbus_g_proxy_new_for_name_owner (transaction->priv->connection,
+									"org.freedesktop.DBus",
+									"/org/freedesktop/DBus/Bus",
+									"org.freedesktop.DBus", &error);
+	if (transaction->priv->proxy_pid == NULL) {
+		egg_warning ("cannot connect to DBus: %s", error->message);
+		g_error_free (error);
+	}
 }
 
 /**
@@ -4015,6 +4178,16 @@ pk_transaction_dispose (GObject *object)
 	/* remove any inhibit, it's okay to call this function when it's not needed */
 	pk_inhibit_remove (transaction->priv->inhibit, transaction);
 
+	/* were we waiting for the client to authorise */
+	if (transaction->priv->waiting_for_auth) {
+#ifdef USE_SECURITY_POLKIT
+		g_cancellable_cancel (transaction->priv->cancellable);
+#endif
+		/* emit an ::ErrorCode() and then ::Finished() */
+		pk_transaction_error_code_emit (transaction, PK_ERROR_ENUM_NOT_AUTHORIZED, "client did not authorize action");
+		pk_transaction_finished_emit (transaction, PK_EXIT_ENUM_FAILED, 0);
+	}
+
 	/* send signal to clients that we are about to be destroyed */
 	egg_debug ("emitting destroy %s", transaction->priv->tid);
 	g_signal_emit (transaction, signals [PK_TRANSACTION_DESTROY], 0);
@@ -4034,6 +4207,11 @@ pk_transaction_finalize (GObject *object)
 
 	transaction = PK_TRANSACTION (object);
 
+#ifdef USE_SECURITY_POLKIT
+	if (transaction->priv->subject != NULL)
+		g_object_unref (transaction->priv->subject);
+#endif
+
 	g_free (transaction->priv->last_package_id);
 	g_free (transaction->priv->locale);
 	g_free (transaction->priv->cached_package_id);
@@ -4056,11 +4234,14 @@ pk_transaction_finalize (GObject *object)
 	g_object_unref (transaction->priv->package_list);
 	g_object_unref (transaction->priv->transaction_list);
 	g_object_unref (transaction->priv->transaction_db);
-	g_object_unref (transaction->priv->security);
+	g_object_unref (transaction->priv->proxy_pid);
 	g_object_unref (transaction->priv->notify);
 	g_object_unref (transaction->priv->syslog);
 	g_object_unref (transaction->priv->post_trans);
-	pk_security_caller_unref (transaction->priv->caller);
+#ifdef USE_SECURITY_POLKIT
+//	g_object_unref (transaction->priv->authority);
+	g_object_unref (transaction->priv->cancellable);
+#endif
 
 	G_OBJECT_CLASS (pk_transaction_parent_class)->finalize (object);
 }
@@ -4091,6 +4272,9 @@ egg_test_transaction (EggTest *test)
 	gboolean ret;
 	const gchar *temp;
 	GError *error = NULL;
+#ifdef USE_SECURITY_POLKIT
+	const gchar *action;
+#endif
 
 	if (!egg_test_start (test, "PkTransaction"))
 		return;
@@ -4101,6 +4285,26 @@ egg_test_transaction (EggTest *test)
 	egg_test_assert (test, transaction != NULL);
 
 	/************************************************************
+	 ****************         MAP ROLES        ******************
+	 ************************************************************/
+#ifdef USE_SECURITY_POLKIT
+	egg_test_title (test, "map valid role to action");
+	action = pk_transaction_role_to_action (FALSE, PK_ROLE_ENUM_UPDATE_PACKAGES);
+	if (egg_strequal (action, "org.freedesktop.packagekit.system-update"))
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "did not get correct action '%s'", action);
+
+	/************************************************************/
+	egg_test_title (test, "map invalid role to action");
+	action = pk_transaction_role_to_action (FALSE, PK_ROLE_ENUM_SEARCH_NAME);
+	if (action == NULL)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "did not get correct action '%s'", action);
+#endif
+
+	/************************************************************
 	 ****************          FILTERS         ******************
 	 ************************************************************/
 	temp = NULL;