[gnome-packagekit] Update the code to use the new GObject API provided by PackageKit



commit d97d5e16f607c1dbffab764b4b08fffad24ad970
Author: Richard Hughes <richard hughsie com>
Date:   Mon Nov 9 13:50:06 2009 +0000

    Update the code to use the new GObject API provided by PackageKit

 src/gpk-application.c    |  374 +++++++++++++++++++++++++++------------------
 src/gpk-check-update.c   |  170 +++++++++++++--------
 src/gpk-common.c         |   25 ++--
 src/gpk-dbus-task.c      |  217 +++++++++++++++------------
 src/gpk-dialog.c         |   28 ++--
 src/gpk-enum.c           |    4 +-
 src/gpk-enum.h           |    4 +-
 src/gpk-firmware.c       |   46 +++---
 src/gpk-hardware.c       |   39 +++--
 src/gpk-helper-chooser.c |   22 ++-
 src/gpk-log.c            |   91 ++++++++----
 src/gpk-modal-dialog.c   |   43 ++++--
 src/gpk-repo.c           |   51 ++++---
 src/gpk-service-pack.c   |   55 ++++---
 src/gpk-task.c           |  106 ++++++++-----
 src/gpk-update-viewer.c  |  314 ++++++++++++++++++++++++--------------
 src/gpk-watch.c          |   75 ++++++----
 17 files changed, 1021 insertions(+), 643 deletions(-)
---
diff --git a/src/gpk-application.c b/src/gpk-application.c
index 4ca4138..ce6a641 100644
--- a/src/gpk-application.c
+++ b/src/gpk-application.c
@@ -536,8 +536,8 @@ gpk_application_get_files_cb (PkClient *client, GAsyncResult *res, GpkApplicatio
 	GPtrArray *array_sort = NULL;
 	GtkWidget *dialog;
 	GtkWindow *window;
-	PkItemErrorCode *error_item = NULL;
-	PkItemFiles *item;
+	PkError *error_code = NULL;
+	PkFiles *item;
 	PkResults *results;
 
 	g_return_if_fail (GPK_IS_APPLICATION (application));
@@ -551,15 +551,15 @@ gpk_application_get_files_cb (PkClient *client, GAsyncResult *res, GpkApplicatio
 	}
 
 	/* check error code */
-	error_item = pk_results_get_error_code (results);
-	if (error_item != NULL) {
-		egg_warning ("failed to get files: %s, %s", pk_error_enum_to_text (error_item->code), error_item->details);
+	error_code = pk_results_get_error_code (results);
+	if (error_code != NULL) {
+		egg_warning ("failed to get files: %s, %s", pk_error_enum_to_text (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 
 		/* if obvious message, don't tell the user */
-		if (error_item->code != PK_ERROR_ENUM_TRANSACTION_CANCELLED) {
+		if (pk_error_get_code (error_code) != PK_ERROR_ENUM_TRANSACTION_CANCELLED) {
 			window = GTK_WINDOW (gtk_builder_get_object (application->priv->builder, "window_manager"));
-			gpk_error_dialog_modal (window, gpk_error_enum_to_localised_text (error_item->code),
-						gpk_error_enum_to_localised_message (error_item->code), error_item->details);
+			gpk_error_dialog_modal (window, gpk_error_enum_to_localised_text (pk_error_get_code (error_code)),
+						gpk_error_enum_to_localised_message (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 		}
 		goto out;
 	}
@@ -579,8 +579,13 @@ gpk_application_get_files_cb (PkClient *client, GAsyncResult *res, GpkApplicatio
 		goto out;
 	}
 
+	/* get data */
+	g_object_get (item,
+		      "files", &files,
+		      NULL);
+
 	/* convert to pointer array */
-	array_sort = pk_strv_to_ptr_array (item->files);
+	array_sort = pk_strv_to_ptr_array (files);
 	g_ptr_array_sort (array_sort, (GCompareFunc) gpk_application_strcmp_indirect);
 
 	/* title */
@@ -604,8 +609,8 @@ out:
 	g_strfreev (files);
 	g_strfreev (split);
 	g_free (package_id_selected);
-	if (error_item != NULL)
-		pk_item_error_code_unref (error_item);
+	if (error_code != NULL)
+		g_object_unref (error_code);
 	if (array != NULL)
 		g_ptr_array_unref (array);
 	if (array_sort != NULL)
@@ -890,7 +895,7 @@ gpk_application_get_requires_cb (PkClient *client, GAsyncResult *res, GpkApplica
 {
 	PkResults *results;
 	GError *error = NULL;
-	PkItemErrorCode *error_item = NULL;
+	PkError *error_code = NULL;
 	GPtrArray *array = NULL;
 	GtkWindow *window;
 	gchar *name = NULL;
@@ -910,15 +915,15 @@ gpk_application_get_requires_cb (PkClient *client, GAsyncResult *res, GpkApplica
 	}
 
 	/* check error code */
-	error_item = pk_results_get_error_code (results);
-	if (error_item != NULL) {
-		egg_warning ("failed to get requires: %s, %s", pk_error_enum_to_text (error_item->code), error_item->details);
+	error_code = pk_results_get_error_code (results);
+	if (error_code != NULL) {
+		egg_warning ("failed to get requires: %s, %s", pk_error_enum_to_text (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 
 		/* if obvious message, don't tell the user */
-		if (error_item->code != PK_ERROR_ENUM_TRANSACTION_CANCELLED) {
+		if (pk_error_get_code (error_code) != PK_ERROR_ENUM_TRANSACTION_CANCELLED) {
 			window = GTK_WINDOW (gtk_builder_get_object (application->priv->builder, "window_manager"));
-			gpk_error_dialog_modal (window, gpk_error_enum_to_localised_text (error_item->code),
-						gpk_error_enum_to_localised_message (error_item->code), error_item->details);
+			gpk_error_dialog_modal (window, gpk_error_enum_to_localised_text (pk_error_get_code (error_code)),
+						gpk_error_enum_to_localised_message (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 		}
 		goto out;
 	}
@@ -969,8 +974,8 @@ out:
 	g_free (name);
 	g_free (title);
 	g_free (message);
-	if (error_item != NULL)
-		pk_item_error_code_unref (error_item);
+	if (error_code != NULL)
+		g_object_unref (error_code);
 	if (array != NULL)
 		g_ptr_array_unref (array);
 	if (results != NULL)
@@ -1013,7 +1018,7 @@ gpk_application_get_depends_cb (PkClient *client, GAsyncResult *res, GpkApplicat
 {
 	PkResults *results;
 	GError *error = NULL;
-	PkItemErrorCode *error_item = NULL;
+	PkError *error_code = NULL;
 	GPtrArray *array = NULL;
 	GtkWindow *window;
 	gchar *name = NULL;
@@ -1033,15 +1038,15 @@ gpk_application_get_depends_cb (PkClient *client, GAsyncResult *res, GpkApplicat
 	}
 
 	/* check error code */
-	error_item = pk_results_get_error_code (results);
-	if (error_item != NULL) {
-		egg_warning ("failed to get depends: %s, %s", pk_error_enum_to_text (error_item->code), error_item->details);
+	error_code = pk_results_get_error_code (results);
+	if (error_code != NULL) {
+		egg_warning ("failed to get depends: %s, %s", pk_error_enum_to_text (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 
 		/* if obvious message, don't tell the user */
-		if (error_item->code != PK_ERROR_ENUM_TRANSACTION_CANCELLED) {
+		if (pk_error_get_code (error_code) != PK_ERROR_ENUM_TRANSACTION_CANCELLED) {
 			window = GTK_WINDOW (gtk_builder_get_object (application->priv->builder, "window_manager"));
-			gpk_error_dialog_modal (window, gpk_error_enum_to_localised_text (error_item->code),
-						gpk_error_enum_to_localised_message (error_item->code), error_item->details);
+			gpk_error_dialog_modal (window, gpk_error_enum_to_localised_text (pk_error_get_code (error_code)),
+						gpk_error_enum_to_localised_message (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 		}
 		goto out;
 	}
@@ -1087,8 +1092,8 @@ gpk_application_get_depends_cb (PkClient *client, GAsyncResult *res, GpkApplicat
 	gtk_dialog_run (GTK_DIALOG (dialog));
 	gtk_widget_destroy (GTK_WIDGET (dialog));
 out:
-	if (error_item != NULL)
-		pk_item_error_code_unref (error_item);
+	if (error_code != NULL)
+		g_object_unref (error_code);
 	if (array != NULL)
 		g_ptr_array_unref (array);
 	if (results != NULL)
@@ -1250,10 +1255,10 @@ gpk_application_text_format_display (GpkApplication *application, const gchar *a
  * gpk_application_add_item_to_results:
  **/
 static void
-gpk_application_add_item_to_results (GpkApplication *application, const PkItemPackage *item)
+gpk_application_add_item_to_results (GpkApplication *application, PkPackage *item)
 {
 	GtkTreeIter iter;
-	gchar *summary;
+	gchar *summary_markup;
 	const gchar *icon = NULL;
 	gchar *text;
 	gboolean in_queue;
@@ -1263,17 +1268,27 @@ gpk_application_add_item_to_results (GpkApplication *application, const PkItemPa
 	PkBitfield state = 0;
 	static guint package_cnt = 0;
 	gchar **split;
+	PkInfoEnum info;
+	gchar *package_id = NULL;
+	gchar *summary = NULL;
+
+	/* get data */
+	g_object_get (item,
+		      "info", &info,
+		      "package-id", &package_id,
+		      "summary", &summary,
+		      NULL);
 
 	/* format if required */
 	egg_markdown_set_output (application->priv->markdown, EGG_MARKDOWN_OUTPUT_PANGO);
-	summary = egg_markdown_parse (application->priv->markdown, item->summary);
+	summary_markup = egg_markdown_parse (application->priv->markdown, summary);
 
 	/* mark as got so we don't warn */
 	application->priv->has_package = TRUE;
 
 	/* are we in the package array? */
-	in_queue = (pk_package_sack_find_by_id (application->priv->package_sack, item->package_id) != NULL);
-	installed = (item->info == PK_INFO_ENUM_INSTALLED) || (item->info == PK_INFO_ENUM_COLLECTION_INSTALLED);
+	in_queue = (pk_package_sack_find_by_id (application->priv->package_sack, package_id) != NULL);
+	installed = (info == PK_INFO_ENUM_INSTALLED) || (info == PK_INFO_ENUM_COLLECTION_INSTALLED);
 
 	if (installed)
 		pk_bitfield_add (state, GPK_STATE_INSTALLED);
@@ -1281,11 +1296,11 @@ gpk_application_add_item_to_results (GpkApplication *application, const PkItemPa
 		pk_bitfield_add (state, GPK_STATE_IN_LIST);
 
 	/* special icon */
-	if (item->info == PK_INFO_ENUM_COLLECTION_INSTALLED || item->info == PK_INFO_ENUM_COLLECTION_AVAILABLE)
+	if (info == PK_INFO_ENUM_COLLECTION_INSTALLED || info == PK_INFO_ENUM_COLLECTION_AVAILABLE)
 		pk_bitfield_add (state, GPK_STATE_COLLECTION);
 
 	/* use the application icon if available */
-	split = pk_package_id_split (item->package_id);
+	split = pk_package_id_split (package_id);
 	icon = gpk_desktop_guess_icon_name (application->priv->desktop, split[PK_PACKAGE_ID_NAME]);
 	g_strfreev (split);
 	if (icon == NULL)
@@ -1294,7 +1309,7 @@ gpk_application_add_item_to_results (GpkApplication *application, const PkItemPa
 	checkbox = gpk_application_state_get_checkbox (state);
 
 	/* use two lines */
-	text = gpk_package_id_format_twoline (item->package_id, summary);
+	text = gpk_package_id_format_twoline (package_id, summary_markup);
 
 	/* can we modify this? */
 	enabled = gpk_application_get_checkbox_enable (application, state);
@@ -1305,8 +1320,8 @@ gpk_application_add_item_to_results (GpkApplication *application, const PkItemPa
 			    PACKAGES_COLUMN_CHECKBOX, checkbox,
 			    PACKAGES_COLUMN_CHECKBOX_VISIBLE, enabled,
 			    PACKAGES_COLUMN_TEXT, text,
-			    PACKAGES_COLUMN_SUMMARY, item->summary,
-			    PACKAGES_COLUMN_ID, item->package_id,
+			    PACKAGES_COLUMN_SUMMARY, summary,
+			    PACKAGES_COLUMN_ID, package_id,
 			    PACKAGES_COLUMN_IMAGE, icon,
 			    -1);
 
@@ -1316,6 +1331,8 @@ gpk_application_add_item_to_results (GpkApplication *application, const PkItemPa
 			gtk_main_iteration ();
 	}
 
+	g_free (package_id);
+	g_free (summary_markup);
 	g_free (summary);
 	g_free (text);
 }
@@ -1432,17 +1449,24 @@ gpk_application_run_installed (GpkApplication *application, PkResults *results)
 {
 	guint i;
 	GPtrArray *array;
-	const PkItemPackage *item;
+	PkPackage *item;
 	GPtrArray *package_ids_array;
 	gchar **package_ids = NULL;
+	PkInfoEnum info;
+	gchar *package_id = NULL;
 
 	/* get the package array and filter on INSTALLED */
 	package_ids_array = g_ptr_array_new_with_free_func (g_free);
 	array = pk_results_get_package_array (results);
 	for (i=0; i<array->len; i++) {
 		item = g_ptr_array_index (array, i);
-		if (item->info == PK_INFO_ENUM_INSTALLING)
-			g_ptr_array_add (package_ids_array, g_strdup (item->package_id));
+		g_object_get (item,
+			      "info", &info,
+			      "package-id", &package_id,
+			      NULL);
+		if (info == PK_INFO_ENUM_INSTALLING)
+			g_ptr_array_add (package_ids_array, g_strdup (package_id));
+		g_free (package_id);
 	}
 
 	/* nothing to show */
@@ -1498,9 +1522,9 @@ gpk_application_search_cb (PkClient *client, GAsyncResult *res, GpkApplication *
 {
 	PkResults *results;
 	GError *error = NULL;
-	PkItemErrorCode *error_item = NULL;
+	PkError *error_code = NULL;
 	GPtrArray *array = NULL;
-	PkItemPackage *item;
+	PkPackage *item;
 	guint i;
 	GtkWidget *widget;
 	GtkWindow *window;
@@ -1514,15 +1538,15 @@ gpk_application_search_cb (PkClient *client, GAsyncResult *res, GpkApplication *
 	}
 
 	/* check error code */
-	error_item = pk_results_get_error_code (results);
-	if (error_item != NULL) {
-		egg_warning ("failed to search: %s, %s", pk_error_enum_to_text (error_item->code), error_item->details);
+	error_code = pk_results_get_error_code (results);
+	if (error_code != NULL) {
+		egg_warning ("failed to search: %s, %s", pk_error_enum_to_text (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 
 		/* if obvious message, don't tell the user */
-		if (error_item->code != PK_ERROR_ENUM_TRANSACTION_CANCELLED) {
+		if (pk_error_get_code (error_code) != PK_ERROR_ENUM_TRANSACTION_CANCELLED) {
 			window = GTK_WINDOW (gtk_builder_get_object (application->priv->builder, "window_manager"));
-			gpk_error_dialog_modal (window, gpk_error_enum_to_localised_text (error_item->code),
-						gpk_error_enum_to_localised_message (error_item->code), error_item->details);
+			gpk_error_dialog_modal (window, gpk_error_enum_to_localised_text (pk_error_get_code (error_code)),
+						gpk_error_enum_to_localised_message (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 		}
 		goto out;
 	}
@@ -1558,8 +1582,8 @@ gpk_application_search_cb (PkClient *client, GAsyncResult *res, GpkApplication *
 	gtk_widget_set_sensitive (widget, TRUE);
 	gpk_application_set_buttons_apply_clear (application);
 out:
-	if (error_item != NULL)
-		pk_item_error_code_unref (error_item);
+	if (error_code != NULL)
+		g_object_unref (error_code);
 	if (array != NULL)
 		g_ptr_array_unref (array);
 	if (results != NULL)
@@ -1675,11 +1699,7 @@ gpk_application_populate_selected (GpkApplication *application)
 {
 	guint i;
 	guint len;
-	PkItemPackage *item;
 	PkPackage *package;
-	PkInfoEnum info;
-	const gchar *package_id;
-	gchar *summary;
 
 	/* get size */
 	len = pk_package_sack_get_size (application->priv->package_sack);
@@ -1693,15 +1713,7 @@ gpk_application_populate_selected (GpkApplication *application)
 	/* dump queue to package window */
 	for (i=0; i<len; i++) {
 		package = pk_package_sack_get_index (application->priv->package_sack, i);
-		package_id = pk_package_get_id (package);
-		g_object_get (package,
-			      "info", &info,
-			      "summary", &summary,
-			      NULL);
-		item = pk_item_package_new (info, package_id, summary);
-		gpk_application_add_item_to_results (application, item);
-		pk_item_package_unref (item);
-		g_free (summary);
+		gpk_application_add_item_to_results (application, package);
 	}
 out:
 	return TRUE;
@@ -1954,7 +1966,7 @@ gpk_application_install_packages_cb (PkTask *task, GAsyncResult *res, GpkApplica
 {
 	PkResults *results;
 	GError *error = NULL;
-	PkItemErrorCode *error_item = NULL;
+	PkError *error_code = NULL;
 	GtkWindow *window;
 
 	/* get the results */
@@ -1966,15 +1978,15 @@ gpk_application_install_packages_cb (PkTask *task, GAsyncResult *res, GpkApplica
 	}
 
 	/* check error code */
-	error_item = pk_results_get_error_code (results);
-	if (error_item != NULL) {
-		egg_warning ("failed to install packages: %s, %s", pk_error_enum_to_text (error_item->code), error_item->details);
+	error_code = pk_results_get_error_code (results);
+	if (error_code != NULL) {
+		egg_warning ("failed to install packages: %s, %s", pk_error_enum_to_text (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 
 		/* if obvious message, don't tell the user */
-		if (error_item->code != PK_ERROR_ENUM_TRANSACTION_CANCELLED) {
+		if (pk_error_get_code (error_code) != PK_ERROR_ENUM_TRANSACTION_CANCELLED) {
 			window = GTK_WINDOW (gtk_builder_get_object (application->priv->builder, "window_manager"));
-			gpk_error_dialog_modal (window, gpk_error_enum_to_localised_text (error_item->code),
-						gpk_error_enum_to_localised_message (error_item->code), error_item->details);
+			gpk_error_dialog_modal (window, gpk_error_enum_to_localised_text (pk_error_get_code (error_code)),
+						gpk_error_enum_to_localised_message (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 		}
 		goto out;
 	}
@@ -1990,8 +2002,8 @@ gpk_application_install_packages_cb (PkTask *task, GAsyncResult *res, GpkApplica
 	application->priv->action = PK_ACTION_NONE;
 	gpk_application_set_buttons_apply_clear (application);
 out:
-	if (error_item != NULL)
-		pk_item_error_code_unref (error_item);
+	if (error_code != NULL)
+		g_object_unref (error_code);
 	if (results != NULL)
 		g_object_unref (results);
 }
@@ -2004,7 +2016,7 @@ gpk_application_remove_packages_cb (PkTask *task, GAsyncResult *res, GpkApplicat
 {
 	PkResults *results;
 	GError *error = NULL;
-	PkItemErrorCode *error_item = NULL;
+	PkError *error_code = NULL;
 	GtkWindow *window;
 
 	/* get the results */
@@ -2016,15 +2028,15 @@ gpk_application_remove_packages_cb (PkTask *task, GAsyncResult *res, GpkApplicat
 	}
 
 	/* check error code */
-	error_item = pk_results_get_error_code (results);
-	if (error_item != NULL) {
-		egg_warning ("failed to remove packages: %s, %s", pk_error_enum_to_text (error_item->code), error_item->details);
+	error_code = pk_results_get_error_code (results);
+	if (error_code != NULL) {
+		egg_warning ("failed to remove packages: %s, %s", pk_error_enum_to_text (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 
 		/* if obvious message, don't tell the user */
-		if (error_item->code != PK_ERROR_ENUM_TRANSACTION_CANCELLED) {
+		if (pk_error_get_code (error_code) != PK_ERROR_ENUM_TRANSACTION_CANCELLED) {
 			window = GTK_WINDOW (gtk_builder_get_object (application->priv->builder, "window_manager"));
-			gpk_error_dialog_modal (window, gpk_error_enum_to_localised_text (error_item->code),
-						gpk_error_enum_to_localised_message (error_item->code), error_item->details);
+			gpk_error_dialog_modal (window, gpk_error_enum_to_localised_text (pk_error_get_code (error_code)),
+						gpk_error_enum_to_localised_message (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 		}
 		goto out;
 	}
@@ -2037,8 +2049,8 @@ gpk_application_remove_packages_cb (PkTask *task, GAsyncResult *res, GpkApplicat
 	application->priv->action = PK_ACTION_NONE;
 	gpk_application_set_buttons_apply_clear (application);
 out:
-	if (error_item != NULL)
-		pk_item_error_code_unref (error_item);
+	if (error_code != NULL)
+		g_object_unref (error_code);
 	if (results != NULL)
 		g_object_unref (results);
 }
@@ -2201,17 +2213,23 @@ gpk_application_get_details_cb (PkClient *client, GAsyncResult *res, GpkApplicat
 {
 	PkResults *results;
 	GError *error = NULL;
-	PkItemErrorCode *error_item = NULL;
+	PkError *error_code = NULL;
 	GPtrArray *array = NULL;
-	PkItemDetails *item;
+	PkDetails *item;
 	GtkWidget *widget;
 	gchar *text;
 	gchar *value;
 	const gchar *repo_name;
-	const gchar *group;
+	const gchar *group_text;
 	gboolean installed;
 	gchar **split = NULL;
 	GtkWindow *window;
+	gchar *package_id = NULL;
+	gchar *url = NULL;
+	PkGroupEnum group;
+	gchar *license = NULL;
+	gchar *description = NULL;
+	guint64 size;
 
 	g_return_if_fail (GPK_IS_APPLICATION (application));
 
@@ -2224,15 +2242,15 @@ gpk_application_get_details_cb (PkClient *client, GAsyncResult *res, GpkApplicat
 	}
 
 	/* check error code */
-	error_item = pk_results_get_error_code (results);
-	if (error_item != NULL) {
-		egg_warning ("failed to get cats: %s, %s", pk_error_enum_to_text (error_item->code), error_item->details);
+	error_code = pk_results_get_error_code (results);
+	if (error_code != NULL) {
+		egg_warning ("failed to get details: %s, %s", pk_error_enum_to_text (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 
 		/* if obvious message, don't tell the user */
-		if (error_item->code != PK_ERROR_ENUM_TRANSACTION_CANCELLED) {
+		if (pk_error_get_code (error_code) != PK_ERROR_ENUM_TRANSACTION_CANCELLED) {
 			window = GTK_WINDOW (gtk_builder_get_object (application->priv->builder, "window_manager"));
-			gpk_error_dialog_modal (window, gpk_error_enum_to_localised_text (error_item->code),
-						gpk_error_enum_to_localised_message (error_item->code), error_item->details);
+			gpk_error_dialog_modal (window, gpk_error_enum_to_localised_text (pk_error_get_code (error_code)),
+						gpk_error_enum_to_localised_message (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 		}
 		goto out;
 	}
@@ -2253,7 +2271,17 @@ gpk_application_get_details_cb (PkClient *client, GAsyncResult *res, GpkApplicat
 
 	gtk_list_store_clear (application->priv->details_store);
 
-	split = pk_package_id_split (item->package_id);
+	/* get data */
+	g_object_get (item,
+		      "package-id", &package_id,
+		      "url", &url,
+		      "group", &group,
+		      "license", &license,
+		      "description", &description,
+		      "size", &size,
+		      NULL);
+
+	split = pk_package_id_split (package_id);
 	installed = g_strcmp0 (split[PK_PACKAGE_ID_DATA], "installed") == 0;
 
 	/* if a collection, mark as such */
@@ -2263,36 +2291,36 @@ gpk_application_get_details_cb (PkClient *client, GAsyncResult *res, GpkApplicat
 
 	/* homepage */
 	widget = GTK_WIDGET (gtk_builder_get_object (application->priv->builder, "menuitem_homepage"));
-	if (egg_strzero (item->url) == FALSE) {
+	if (egg_strzero (url) == FALSE) {
 		gtk_widget_set_sensitive (widget, TRUE);
 
 		/* TRANSLATORS: tooltip: go to the web address */
-		text = g_strdup_printf (_("Visit %s"), item->url);
+		text = g_strdup_printf (_("Visit %s"), url);
 		gtk_widget_set_tooltip_text (widget, text);
 		g_free (text);
 
 		/* TRANSLATORS: add an entry to go to the project home page */
-		gpk_application_add_detail_item (application, _("Project"), _("Homepage"), item->url);
+		gpk_application_add_detail_item (application, _("Project"), _("Homepage"), url);
 
 		/* save the url for the button */
 		g_free (application->priv->url);
-		application->priv->url = g_strdup (item->url);
+		application->priv->url = g_strdup (url);
 
 	} else {
 		gtk_widget_set_sensitive (widget, FALSE);
 	}
 
 	/* group */
-	if (item->group != PK_GROUP_ENUM_UNKNOWN) {
-		group = gpk_group_enum_to_localised_text (item->group);
+	if (group != PK_GROUP_ENUM_UNKNOWN) {
+		group_text = gpk_group_enum_to_localised_text (group);
 		/* TRANSLATORS: the group the package belongs in */
-		gpk_application_add_detail_item (application, _("Group"), group, NULL);
+		gpk_application_add_detail_item (application, _("Group"), group_text, NULL);
 	}
 
 	/* group */
-	if (!egg_strzero (item->license)) {
+	if (!egg_strzero (license)) {
 		/* TRANSLATORS: the licence string for the package */
-		gpk_application_add_detail_item (application, _("License"), item->license, NULL);
+		gpk_application_add_detail_item (application, _("License"), license, NULL);
 	}
 
 	/* menu path */
@@ -2308,15 +2336,15 @@ gpk_application_get_details_cb (PkClient *client, GAsyncResult *res, GpkApplicat
 	g_free (value);
 
 	/* set the description */
-	text = gpk_application_text_format_display (application, item->description);
+	text = gpk_application_text_format_display (application, description);
 	widget = GTK_WIDGET (gtk_builder_get_object (application->priv->builder, "textview_description"));
 	gpk_application_set_text_buffer (widget, text);
 	g_free (text);
 
 	/* if non-zero, set the size */
-	if (item->size > 0) {
+	if (size > 0) {
 		/* set the size */
-		value = g_format_size_for_display (item->size);
+		value = g_format_size_for_display (size);
 		if (g_strcmp0 (split[PK_PACKAGE_ID_DATA], "meta") == 0)
 			/* TRANSLATORS: the size of the meta package */
 			gpk_application_add_detail_item (application, _("Size"), value, NULL);
@@ -2337,9 +2365,13 @@ gpk_application_get_details_cb (PkClient *client, GAsyncResult *res, GpkApplicat
 		gpk_application_add_detail_item (application, _("Source"), repo_name, NULL);
 	}
 out:
+	g_free (package_id);
+	g_free (url);
+	g_free (license);
+	g_free (description);
 	g_strfreev (split);
-	if (error_item != NULL)
-		pk_item_error_code_unref (error_item);
+	if (error_code != NULL)
+		g_object_unref (error_code);
 	if (array != NULL)
 		g_ptr_array_unref (array);
 	if (results != NULL)
@@ -2813,7 +2845,7 @@ gpk_application_refresh_cache_cb (PkClient *client, GAsyncResult *res, GpkApplic
 {
 	PkResults *results;
 	GError *error = NULL;
-	PkItemErrorCode *error_item = NULL;
+	PkError *error_code = NULL;
 	GtkWindow *window;
 
 	/* get the results */
@@ -2825,21 +2857,21 @@ gpk_application_refresh_cache_cb (PkClient *client, GAsyncResult *res, GpkApplic
 	}
 
 	/* check error code */
-	error_item = pk_results_get_error_code (results);
-	if (error_item != NULL) {
-		egg_warning ("failed to refresh: %s, %s", pk_error_enum_to_text (error_item->code), error_item->details);
+	error_code = pk_results_get_error_code (results);
+	if (error_code != NULL) {
+		egg_warning ("failed to refresh: %s, %s", pk_error_enum_to_text (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 
 		/* if obvious message, don't tell the user */
-		if (error_item->code != PK_ERROR_ENUM_TRANSACTION_CANCELLED) {
+		if (pk_error_get_code (error_code) != PK_ERROR_ENUM_TRANSACTION_CANCELLED) {
 			window = GTK_WINDOW (gtk_builder_get_object (application->priv->builder, "window_manager"));
-			gpk_error_dialog_modal (window, gpk_error_enum_to_localised_text (error_item->code),
-						gpk_error_enum_to_localised_message (error_item->code), error_item->details);
+			gpk_error_dialog_modal (window, gpk_error_enum_to_localised_text (pk_error_get_code (error_code)),
+						gpk_error_enum_to_localised_message (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 		}
 		goto out;
 	}
 out:
-	if (error_item != NULL)
-		pk_item_error_code_unref (error_item);
+	if (error_code != NULL)
+		g_object_unref (error_code);
 	if (results != NULL)
 		g_object_unref (results);
 }
@@ -3261,15 +3293,25 @@ gpk_application_get_categories_cb (PkClient *client, GAsyncResult *res, GpkAppli
 {
 	PkResults *results;
 	GError *error = NULL;
-	PkItemErrorCode *error_item = NULL;
+	PkError *error_code = NULL;
 	GPtrArray *array = NULL;
 	GtkTreeIter iter;
 	GtkTreeIter iter2;
 	guint i, j;
 	GtkTreeView *treeview;
-	PkItemCategory *item;
-	PkItemCategory *item2;
+	PkCategory *item;
+	PkCategory *item2;
 	GtkWindow *window;
+	gchar *package_id = NULL;
+	gchar *name = NULL;
+	gchar *summary = NULL;
+	gchar *cat_id = NULL;
+	gchar *icon = NULL;
+	gchar *parent_id_tmp = NULL;
+	gchar *name_tmp = NULL;
+	gchar *summary_tmp = NULL;
+	gchar *cat_id_tmp = NULL;
+	gchar *icon_tmp = NULL;
 
 	/* get the results */
 	results = pk_client_generic_finish (client, res, &error);
@@ -3280,15 +3322,15 @@ gpk_application_get_categories_cb (PkClient *client, GAsyncResult *res, GpkAppli
 	}
 
 	/* check error code */
-	error_item = pk_results_get_error_code (results);
-	if (error_item != NULL) {
-		egg_warning ("failed to get cats: %s, %s", pk_error_enum_to_text (error_item->code), error_item->details);
+	error_code = pk_results_get_error_code (results);
+	if (error_code != NULL) {
+		egg_warning ("failed to get cats: %s, %s", pk_error_enum_to_text (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 
 		/* if obvious message, don't tell the user */
-		if (error_item->code != PK_ERROR_ENUM_TRANSACTION_CANCELLED) {
+		if (pk_error_get_code (error_code) != PK_ERROR_ENUM_TRANSACTION_CANCELLED) {
 			window = GTK_WINDOW (gtk_builder_get_object (application->priv->builder, "window_manager"));
-			gpk_error_dialog_modal (window, gpk_error_enum_to_localised_text (error_item->code),
-						gpk_error_enum_to_localised_message (error_item->code), error_item->details);
+			gpk_error_dialog_modal (window, gpk_error_enum_to_localised_text (pk_error_get_code (error_code)),
+						gpk_error_enum_to_localised_message (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 		}
 		goto out;
 	}
@@ -3302,39 +3344,63 @@ gpk_application_get_categories_cb (PkClient *client, GAsyncResult *res, GpkAppli
 	array = pk_results_get_category_array (results);
 	for (i=0; i<array->len; i++) {
 		item = g_ptr_array_index (array, i);
+		g_object_get (item,
+			      "name", &name,
+			      "summary", &summary,
+			      "cat-id", &cat_id,
+			      "icon", &icon,
+			      NULL);
 
 		gtk_tree_store_append (application->priv->groups_store, &iter, NULL);
 		gtk_tree_store_set (application->priv->groups_store, &iter,
-				    GROUPS_COLUMN_NAME, item->name,
-				    GROUPS_COLUMN_SUMMARY, item->summary,
-				    GROUPS_COLUMN_ID, item->cat_id,
-				    GROUPS_COLUMN_ICON, item->icon,
+				    GROUPS_COLUMN_NAME, name,
+				    GROUPS_COLUMN_SUMMARY, summary,
+				    GROUPS_COLUMN_ID, cat_id,
+				    GROUPS_COLUMN_ICON, icon,
 				    GROUPS_COLUMN_ACTIVE, FALSE,
 				    -1);
 		j = 0;
 		do {
 			/* only allows groups two layers deep */
 			item2 = g_ptr_array_index (array, j);
-			if (g_strcmp0 (item2->parent_id, item->cat_id) == 0) {
+			g_object_get (item2,
+				      "parent-id", &parent_id_tmp,
+				      "cat-id", &cat_id_tmp,
+				      "name", &name_tmp,
+				      "summary", &summary_tmp,
+				      "icon", &icon_tmp,
+				      NULL);
+			if (g_strcmp0 (parent_id_tmp, cat_id) == 0) {
 				gtk_tree_store_append (application->priv->groups_store, &iter2, &iter);
 				gtk_tree_store_set (application->priv->groups_store, &iter2,
-						    GROUPS_COLUMN_NAME, item2->name,
-						    GROUPS_COLUMN_SUMMARY, item2->summary,
-						    GROUPS_COLUMN_ID, item2->cat_id,
-						    GROUPS_COLUMN_ICON, item2->icon,
+						    GROUPS_COLUMN_NAME, name_tmp,
+						    GROUPS_COLUMN_SUMMARY, summary_tmp,
+						    GROUPS_COLUMN_ID, cat_id_tmp,
+						    GROUPS_COLUMN_ICON, icon_tmp,
 						    GROUPS_COLUMN_ACTIVE, TRUE,
 						    -1);
 				g_ptr_array_remove (array, item2);
 			} else
 				j++;
+			g_free (parent_id_tmp);
+			g_free (name_tmp);
+			g_free (summary_tmp);
+			g_free (cat_id_tmp);
+			g_free (icon_tmp);
 		} while (j < array->len);
+
+		g_free (package_id);
+		g_free (name);
+		g_free (summary);
+		g_free (cat_id);
+		g_free (icon);
 	}
 
 	/* open all expanders */
 	gtk_tree_view_collapse_all (treeview);
 out:
-	if (error_item != NULL)
-		pk_item_error_code_unref (error_item);
+	if (error_code != NULL)
+		g_object_unref (error_code);
 	if (array != NULL)
 		g_ptr_array_unref (array);
 	if (results != NULL)
@@ -3572,11 +3638,13 @@ gpk_application_get_repo_list_cb (PkClient *client, GAsyncResult *res, GpkApplic
 {
 	PkResults *results;
 	GError *error = NULL;
-	PkItemErrorCode *error_item = NULL;
+	PkError *error_code = NULL;
 	GPtrArray *array = NULL;
-	PkItemRepoDetail *item;
+	PkRepoDetail *item;
 	guint i;
 	GtkWindow *window;
+	gchar *repo_id = NULL;
+	gchar *description = NULL;
 
 	/* get the results */
 	results = pk_client_generic_finish (client, res, &error);
@@ -3587,15 +3655,15 @@ gpk_application_get_repo_list_cb (PkClient *client, GAsyncResult *res, GpkApplic
 	}
 
 	/* check error code */
-	error_item = pk_results_get_error_code (results);
-	if (error_item != NULL) {
-		egg_warning ("failed to repo list: %s, %s", pk_error_enum_to_text (error_item->code), error_item->details);
+	error_code = pk_results_get_error_code (results);
+	if (error_code != NULL) {
+		egg_warning ("failed to repo list: %s, %s", pk_error_enum_to_text (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 
 		/* if obvious message, don't tell the user */
-		if (error_item->code != PK_ERROR_ENUM_TRANSACTION_CANCELLED) {
+		if (pk_error_get_code (error_code) != PK_ERROR_ENUM_TRANSACTION_CANCELLED) {
 			window = GTK_WINDOW (gtk_builder_get_object (application->priv->builder, "window_manager"));
-			gpk_error_dialog_modal (window, gpk_error_enum_to_localised_text (error_item->code),
-						gpk_error_enum_to_localised_message (error_item->code), error_item->details);
+			gpk_error_dialog_modal (window, gpk_error_enum_to_localised_text (pk_error_get_code (error_code)),
+						gpk_error_enum_to_localised_message (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 		}
 		goto out;
 	}
@@ -3604,16 +3672,22 @@ gpk_application_get_repo_list_cb (PkClient *client, GAsyncResult *res, GpkApplic
 	array = pk_results_get_repo_detail_array (results);
 	for (i=0; i<array->len; i++) {
 		item = g_ptr_array_index (array, i);
-		egg_debug ("repo = %s:%s", item->repo_id, item->description);
+		g_object_get (item,
+			      "repo-id", &repo_id,
+			      "description", &description,
+			      NULL);
+
+		egg_debug ("repo = %s:%s", repo_id, description);
 		/* no problem, just no point adding as we will fallback to the repo_id */
-		if (item->description == NULL)
-			continue;
-		g_hash_table_insert (application->priv->repos, g_strdup (item->repo_id), g_strdup (item->description));
+		if (description != NULL)
+			g_hash_table_insert (application->priv->repos, g_strdup (repo_id), g_strdup (description));
+		g_free (repo_id);
+		g_free (description);
 	}
 
 out:
-	if (error_item != NULL)
-		pk_item_error_code_unref (error_item);
+	if (error_code != NULL)
+		g_object_unref (error_code);
 	if (array != NULL)
 		g_ptr_array_unref (array);
 	if (results != NULL)
diff --git a/src/gpk-check-update.c b/src/gpk-check-update.c
index 455b81f..e9ea44b 100644
--- a/src/gpk-check-update.c
+++ b/src/gpk-check-update.c
@@ -350,11 +350,15 @@ gpk_check_update_finished_notify (GpkCheckUpdate *cupdate, PkResults *results)
 	PkRestartEnum restart;
 	guint i;
 	GPtrArray *array;
-	const PkItemPackage *item;
+	PkPackage *item;
 	GString *message_text = NULL;
 	guint skipped_number = 0;
 	const gchar *message;
 	gchar **split;
+	PkInfoEnum info;
+	gchar *package_id = NULL;
+	gchar *summary = NULL;
+
 
 	/* check we got some packages */
 	array = pk_results_get_package_array (results);
@@ -369,15 +373,22 @@ gpk_check_update_finished_notify (GpkCheckUpdate *cupdate, PkResults *results)
 	/* find any we skipped */
 	for (i=0; i<array->len; i++) {
 		item = g_ptr_array_index (array, i);
+		g_object_get (item,
+			      "info", &info,
+			      "package-id", &package_id,
+			      "summary", &summary,
+			      NULL);
 
-		split = pk_package_id_split (item->package_id);
-		egg_debug ("%s, %s, %s", pk_info_enum_to_text (item->info),
-			   split[PK_PACKAGE_ID_NAME], item->summary);
-		if (item->info == PK_INFO_ENUM_BLOCKED) {
+		split = pk_package_id_split (package_id);
+		egg_debug ("%s, %s, %s", pk_info_enum_to_text (info),
+			   split[PK_PACKAGE_ID_NAME], summary);
+		if (info == PK_INFO_ENUM_BLOCKED) {
 			skipped_number++;
 			g_string_append_printf (message_text, "<b>%s</b> - %s\n",
-						split[PK_PACKAGE_ID_NAME], item->summary);
+						split[PK_PACKAGE_ID_NAME], summary);
 		}
+		g_free (package_id);
+		g_free (summary);
 		g_strfreev (split);
 	}
 
@@ -452,7 +463,7 @@ gpk_check_update_update_system_finished_cb (PkTask *task, GAsyncResult *res, Gpk
 {
 	PkResults *results;
 	GError *error = NULL;
-	PkItemErrorCode *error_item = NULL;
+	PkError *error_code = NULL;
 
 	/* get the results */
 	results = pk_task_generic_finish (task, res, &error);
@@ -467,15 +478,15 @@ gpk_check_update_update_system_finished_cb (PkTask *task, GAsyncResult *res, Gpk
 	}
 
 	/* check error code */
-	error_item = pk_results_get_error_code (results);
-	if (error_item != NULL) {
-		egg_warning ("failed to update system: %s, %s", pk_error_enum_to_text (error_item->code), error_item->details);
+	error_code = pk_results_get_error_code (results);
+	if (error_code != NULL) {
+		egg_warning ("failed to update system: %s, %s", pk_error_enum_to_text (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 		/* ignore some errors */
-		if (error_item->code != PK_ERROR_ENUM_PROCESS_KILL &&
-		    error_item->code != PK_ERROR_ENUM_TRANSACTION_CANCELLED &&
-		    error_item->code != PK_ERROR_ENUM_CANNOT_GET_LOCK) {
-			gpk_error_dialog (gpk_error_enum_to_localised_text (error_item->code),
-					  gpk_error_enum_to_localised_message (error_item->code), error_item->details);
+		if (pk_error_get_code (error_code) != PK_ERROR_ENUM_PROCESS_KILL &&
+		    pk_error_get_code (error_code) != PK_ERROR_ENUM_TRANSACTION_CANCELLED &&
+		    pk_error_get_code (error_code) != PK_ERROR_ENUM_CANNOT_GET_LOCK) {
+			gpk_error_dialog (gpk_error_enum_to_localised_text (pk_error_get_code (error_code)),
+					  gpk_error_enum_to_localised_message (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 		}
 		goto out;
 	}
@@ -493,8 +504,8 @@ gpk_check_update_update_system_finished_cb (PkTask *task, GAsyncResult *res, Gpk
 	gpk_check_update_finished_notify (cupdate, results);
 	cupdate->priv->number_updates_critical_last_shown = 0;
 out:
-	if (error_item != NULL)
-		pk_item_error_code_unref (error_item);
+	if (error_code != NULL)
+		g_object_unref (error_code);
 	if (results != NULL)
 		g_object_unref (results);
 }
@@ -683,8 +694,10 @@ gpk_check_update_client_info_to_bitfield (GpkCheckUpdate *cupdate, GPtrArray *ar
 {
 	guint i;
 	PkBitfield infos = 0;
-	const PkItemPackage *item;
+	PkPackage *item;
 	gchar **split;
+	PkInfoEnum info;
+	gchar *package_id = NULL;
 
 	g_return_val_if_fail (GPK_IS_CHECK_UPDATE (cupdate), PK_INFO_ENUM_UNKNOWN);
 
@@ -695,14 +708,15 @@ gpk_check_update_client_info_to_bitfield (GpkCheckUpdate *cupdate, GPtrArray *ar
 	/* add each status to a array */
 	for (i=0; i<array->len; i++) {
 		item = g_ptr_array_index (array, i);
-		if (item == NULL) {
-			egg_warning ("not found item %i", i);
-			break;
-		}
-		split = pk_package_id_split (item->package_id);
-		egg_debug ("%s %s", split[PK_PACKAGE_ID_NAME], pk_info_enum_to_text (item->info));
+		g_object_get (item,
+			      "info", &info,
+			      "package-id", &package_id,
+			      NULL);
+		split = pk_package_id_split (package_id);
+		egg_debug ("%s %s", split[PK_PACKAGE_ID_NAME], pk_info_enum_to_text (info));
 		g_strfreev (split);
-		pk_bitfield_add (infos, item->info);
+		pk_bitfield_add (infos, info);
+		g_free (package_id);
 	}
 	return infos;
 }
@@ -862,7 +876,7 @@ gpk_check_update_get_updates_finished_cb (GObject *object, GAsyncResult *res, Gp
 	PkClient *client = PK_CLIENT(object);
 	PkResults *results;
 	GError *error = NULL;
-	const PkItemPackage *item;
+	PkPackage *item;
 	guint i;
 	guint more;
 	guint showing = 0;
@@ -875,7 +889,10 @@ gpk_check_update_get_updates_finished_cb (GObject *object, GAsyncResult *res, Gp
 	gchar **package_ids;
 	gchar **split;
 	GPtrArray *array = NULL;
-	PkItemErrorCode *error_item = NULL;
+	PkError *error_code = NULL;
+	PkInfoEnum info;
+	gchar *package_id = NULL;
+	gchar *summary = NULL;
 
 	/* get the results */
 	results = pk_client_generic_finish (PK_CLIENT(client), res, &error);
@@ -886,15 +903,15 @@ gpk_check_update_get_updates_finished_cb (GObject *object, GAsyncResult *res, Gp
 	}
 
 	/* check error code */
-	error_item = pk_results_get_error_code (results);
-	if (error_item != NULL) {
-		egg_warning ("failed to get updates: %s, %s", pk_error_enum_to_text (error_item->code), error_item->details);
+	error_code = pk_results_get_error_code (results);
+	if (error_code != NULL) {
+		egg_warning ("failed to get updates: %s, %s", pk_error_enum_to_text (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 		/* ignore some errors */
-		if (error_item->code != PK_ERROR_ENUM_PROCESS_KILL &&
-		    error_item->code != PK_ERROR_ENUM_TRANSACTION_CANCELLED &&
-		    error_item->code != PK_ERROR_ENUM_CANNOT_GET_LOCK) {
-			gpk_error_dialog (gpk_error_enum_to_localised_text (error_item->code),
-					  gpk_error_enum_to_localised_message (error_item->code), error_item->details);
+		if (pk_error_get_code (error_code) != PK_ERROR_ENUM_PROCESS_KILL &&
+		    pk_error_get_code (error_code) != PK_ERROR_ENUM_TRANSACTION_CANCELLED &&
+		    pk_error_get_code (error_code) != PK_ERROR_ENUM_CANNOT_GET_LOCK) {
+			gpk_error_dialog (gpk_error_enum_to_localised_text (pk_error_get_code (error_code)),
+					  gpk_error_enum_to_localised_message (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 		}
 		goto out;
 	}
@@ -920,21 +937,35 @@ gpk_check_update_get_updates_finished_cb (GObject *object, GAsyncResult *res, Gp
 	/* find the security updates first */
 	for (i=0; i<array->len; i++) {
 		item = g_ptr_array_index (array, i);
-		if (item->info == PK_INFO_ENUM_SECURITY) {
+		g_object_get (item,
+			      "info", &info,
+			      "package-id", &package_id,
+			      NULL);
+		if (info == PK_INFO_ENUM_SECURITY) {
 			/* add to array */
-			g_ptr_array_add (security_array, g_strdup (item->package_id));
+			g_ptr_array_add (security_array, g_strdup (package_id));
 		}
+		g_free (package_id);
 	}
 
 	/* get the security update text */
 	for (i=0; i<array->len; i++) {
 		item = g_ptr_array_index (array, i);
-		if (item->info != PK_INFO_ENUM_SECURITY)
+		g_object_get (item,
+			      "info", &info,
+			      NULL);
+		if (info != PK_INFO_ENUM_SECURITY)
 			continue;
 
+		/* get more data */
+		g_object_get (item,
+			      "package-id", &package_id,
+			      "summary", &summary,
+			      NULL);
+
 		/* don't use a huge notification that won't fit on the screen */
-		split = pk_package_id_split (item->package_id);
-		g_string_append_printf (status_security, "<b>%s</b> - %s\n", split[PK_PACKAGE_ID_NAME], item->summary);
+		split = pk_package_id_split (package_id);
+		g_string_append_printf (status_security, "<b>%s</b> - %s\n", split[PK_PACKAGE_ID_NAME], summary);
 		g_strfreev (split);
 		if (++showing == GPK_CHECK_UPDATE_MAX_NUMBER_SECURITY_ENTRIES) {
 			more = security_array->len - showing;
@@ -946,6 +977,8 @@ gpk_check_update_get_updates_finished_cb (GObject *object, GAsyncResult *res, Gp
 			}
 			break;
 		}
+		g_free (package_id);
+		g_free (summary);
 	}
 
 	/* work out icon (cannot be NULL) */
@@ -1044,8 +1077,8 @@ gpk_check_update_get_updates_finished_cb (GObject *object, GAsyncResult *res, Gp
 	/* shouldn't happen */
 	egg_warning ("unknown update mode");
 out:
-	if (error_item != NULL)
-		pk_item_error_code_unref (error_item);
+	if (error_code != NULL)
+		g_object_unref (error_code);
 	if (status_security != NULL)
 		g_string_free (status_security, TRUE);
 	if (status_tooltip != NULL)
@@ -1208,7 +1241,7 @@ gpk_check_update_refresh_cache_finished_cb (GObject *object, GAsyncResult *res,
 	PkClient *client = PK_CLIENT(object);
 	PkResults *results;
 	GError *error = NULL;
-	PkItemErrorCode *error_item = NULL;
+	PkError *error_code = NULL;
 
 	/* get the results */
 	results = pk_client_generic_finish (PK_CLIENT(client), res, &error);
@@ -1219,20 +1252,20 @@ gpk_check_update_refresh_cache_finished_cb (GObject *object, GAsyncResult *res,
 	}
 
 	/* check error code */
-	error_item = pk_results_get_error_code (results);
-	if (error_item != NULL) {
-		egg_warning ("failed to refresh the cache: %s, %s", pk_error_enum_to_text (error_item->code), error_item->details);
+	error_code = pk_results_get_error_code (results);
+	if (error_code != NULL) {
+		egg_warning ("failed to refresh the cache: %s, %s", pk_error_enum_to_text (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 		/* ignore some errors */
-		if (error_item->code != PK_ERROR_ENUM_PROCESS_KILL &&
-		    error_item->code != PK_ERROR_ENUM_TRANSACTION_CANCELLED) {
-			gpk_error_dialog (gpk_error_enum_to_localised_text (error_item->code),
-					  gpk_error_enum_to_localised_message (error_item->code), error_item->details);
+		if (pk_error_get_code (error_code) != PK_ERROR_ENUM_PROCESS_KILL &&
+		    pk_error_get_code (error_code) != PK_ERROR_ENUM_TRANSACTION_CANCELLED) {
+			gpk_error_dialog (gpk_error_enum_to_localised_text (pk_error_get_code (error_code)),
+					  gpk_error_enum_to_localised_message (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 		}
 		goto out;
 	}
 out:
-	if (error_item != NULL)
-		pk_item_error_code_unref (error_item);
+	if (error_code != NULL)
+		g_object_unref (error_code);
 	if (results != NULL)
 		g_object_unref (results);
 }
@@ -1274,11 +1307,13 @@ gpk_check_update_get_distro_upgrades_finished_cb (GObject *object, GAsyncResult
 	GPtrArray *array = NULL;
 	gboolean ret;
 	guint i;
-	PkItemDistroUpgrade *item;
+	PkDistroUpgrade *item;
 	const gchar *title;
 	NotifyNotification *notification;
 	GString *string = NULL;
-	PkItemErrorCode *error_item = NULL;
+	PkError *error_code = NULL;
+	gchar *name = NULL;
+	PkUpdateStateEnum state;
 
 	/* get the results */
 	results = pk_client_generic_finish (PK_CLIENT(client), res, &error);
@@ -1289,14 +1324,14 @@ gpk_check_update_get_distro_upgrades_finished_cb (GObject *object, GAsyncResult
 	}
 
 	/* check error code */
-	error_item = pk_results_get_error_code (results);
-	if (error_item != NULL) {
-		egg_warning ("failed to get upgrades: %s, %s", pk_error_enum_to_text (error_item->code), error_item->details);
+	error_code = pk_results_get_error_code (results);
+	if (error_code != NULL) {
+		egg_warning ("failed to get upgrades: %s, %s", pk_error_enum_to_text (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 		/* ignore some errors */
-		if (error_item->code != PK_ERROR_ENUM_PROCESS_KILL &&
-		    error_item->code != PK_ERROR_ENUM_TRANSACTION_CANCELLED) {
-			gpk_error_dialog (gpk_error_enum_to_localised_text (error_item->code),
-					  gpk_error_enum_to_localised_message (error_item->code), error_item->details);
+		if (pk_error_get_code (error_code) != PK_ERROR_ENUM_PROCESS_KILL &&
+		    pk_error_get_code (error_code) != PK_ERROR_ENUM_TRANSACTION_CANCELLED) {
+			gpk_error_dialog (gpk_error_enum_to_localised_text (pk_error_get_code (error_code)),
+					  gpk_error_enum_to_localised_message (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 		}
 		goto out;
 	}
@@ -1320,8 +1355,13 @@ gpk_check_update_get_distro_upgrades_finished_cb (GObject *object, GAsyncResult
 	/* find the upgrade string */
 	string = g_string_new ("");
 	for (i=0; i < array->len; i++) {
-		item = (PkItemDistroUpgrade *) g_ptr_array_index (array, i);
-		g_string_append_printf (string, "%s (%s)\n", item->name, pk_distro_upgrade_enum_to_text (item->state));
+		item = (PkDistroUpgrade *) g_ptr_array_index (array, i);
+		g_object_get (item,
+			      "name", &name,
+			      "state", &state,
+			      NULL);
+		g_string_append_printf (string, "%s (%s)\n", name, pk_distro_upgrade_enum_to_text (state));
+		g_free (name);
 	}
 	if (string->len != 0)
 		g_string_set_size (string, string->len-1);
@@ -1347,8 +1387,8 @@ gpk_check_update_get_distro_upgrades_finished_cb (GObject *object, GAsyncResult
 		g_error_free (error);
 	}
 out:
-	if (error_item != NULL)
-		pk_item_error_code_unref (error_item);
+	if (error_code != NULL)
+		g_object_unref (error_code);
 	if (array != NULL)
 		g_ptr_array_unref (array);
 	if (string != NULL)
diff --git a/src/gpk-common.c b/src/gpk-common.c
index c713c6f..8cda255 100644
--- a/src/gpk-common.c
+++ b/src/gpk-common.c
@@ -53,14 +53,14 @@ static gboolean small_form_factor_mode = FALSE;
 gchar **
 pk_package_array_to_strv (GPtrArray *array)
 {
-	const PkItemPackage *item;
+	PkPackage *item;
 	gchar **results;
 	guint i;
 
 	results = g_new0 (gchar *, array->len+1);
 	for (i=0; i<array->len; i++) {
 		item = g_ptr_array_index (array, i);
-		results[i] = g_strdup (item->package_id);
+		results[i] = g_strdup (pk_package_get_id (item));
 	}
 	return results;
 }
@@ -609,7 +609,7 @@ gpk_package_entry_completion_get_names_from_file (const gchar *filename)
 	gchar **lines = NULL;
 	guint i;
 	gchar **split;
-	PkItemPackage *item;
+	PkPackage *item;
 
 	/* get data */
 	ret = g_file_get_contents (filename, &data, NULL, &error);
@@ -619,8 +619,8 @@ gpk_package_entry_completion_get_names_from_file (const gchar *filename)
 		goto out;
 	}
 
-	/* create array of PkItemPackage's */
-	array = g_ptr_array_new_with_free_func ((GDestroyNotify) pk_item_package_unref);
+	/* create array of PkPackage's */
+	array = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
 
 	/* split */
 	lines = g_strsplit (data, "\n", -1);
@@ -628,9 +628,12 @@ gpk_package_entry_completion_get_names_from_file (const gchar *filename)
 		split = g_strsplit (lines[i], "\t", 3);
 		if (g_strv_length (split) != 3)
 			continue;
-		item = pk_item_package_new (pk_info_enum_from_text (split[PK_PACKAGE_ID_NAME]),
-					    split[PK_PACKAGE_ID_VERSION],
-					    split[PK_PACKAGE_ID_ARCH]);
+		item = pk_package_new ();
+		g_object_set (item,
+			      "info", pk_info_enum_from_text (split[0]),
+			      "package-id", split[1],
+			      "summary", split[2],
+			      NULL);
 		g_ptr_array_add (array, item);
 		g_strfreev (split);
 	}
@@ -650,7 +653,7 @@ gpk_package_entry_completion_model_new (void)
 {
 	GPtrArray *list;
 	guint i;
-	const PkItemPackage *item;
+	PkPackage *item;
 	GHashTable *hash;
 	gpointer data;
 	GtkListStore *store;
@@ -668,12 +671,12 @@ gpk_package_entry_completion_model_new (void)
 	egg_debug ("loading %i autocomplete items", list->len);
 	for (i=0; i<list->len; i++) {
 		item = g_ptr_array_index (list, i);
-		if (item == NULL || item->package_id == NULL) {
+		if (item == NULL || pk_package_get_id (item) == NULL) {
 			egg_warning ("item invalid!");
 			break;
 		}
 
-		split = pk_package_id_split (item->package_id);
+		split = pk_package_id_split (pk_package_get_id (item));
 		data = g_hash_table_lookup (hash, (gpointer) split[PK_PACKAGE_ID_NAME]);
 		if (data == NULL) {
 			/* append just the name */
diff --git a/src/gpk-dbus-task.c b/src/gpk-dbus-task.c
index 6f59a80..b3ad1e9 100644
--- a/src/gpk-dbus-task.c
+++ b/src/gpk-dbus-task.c
@@ -85,7 +85,7 @@ struct _GpkDbusTaskPrivate
 	guint			 timestamp;
 	gchar			*parent_title;
 	gchar			*parent_icon_name;
-	PkItemErrorCode		*cached_error_code;
+	PkError		*cached_error_code;
 	gint			 timeout;
 	GpkHelperRun		*helper_run;
 	GpkHelperChooser	*helper_chooser;
@@ -214,7 +214,7 @@ gpk_dbus_task_libnotify_cb (NotifyNotification *notification, gchar *action, gpo
 		return;
 	}
 	if (g_strcmp0 (action, "show-error-details") == 0) {
-		details = g_markup_escape_text (task->priv->cached_error_code->details, -1);
+		details = g_markup_escape_text (pk_error_get_details (task->priv->cached_error_code), -1);
 		/* TRANSLATORS: detailed text about the error */
 		gpk_error_dialog (_("Error details"), _("Package Manager error details"), details);
 		g_free (details);
@@ -282,7 +282,7 @@ gpk_dbus_task_error_msg (GpkDbusTask *dtask, const gchar *title, GError *error)
  * gpk_dbus_task_handle_error:
  **/
 static void
-gpk_dbus_task_handle_error (GpkDbusTask *dtask, PkItemErrorCode *error_item)
+gpk_dbus_task_handle_error (GpkDbusTask *dtask, PkError *error_code)
 {
 	gboolean ret;
 	GError *error = NULL;
@@ -292,27 +292,27 @@ gpk_dbus_task_handle_error (GpkDbusTask *dtask, PkItemErrorCode *error_item)
 	GtkWidget *widget;
 
 	/* ignore some errors */
-	if (error_item->code == PK_ERROR_ENUM_NO_LICENSE_AGREEMENT ||
-	    error_item->code == PK_ERROR_ENUM_PROCESS_KILL ||
-	    error_item->code == PK_ERROR_ENUM_TRANSACTION_CANCELLED) {
-		egg_warning ("ignoring %s", pk_error_enum_to_text (error_item->code));
+	if (pk_error_get_code (error_code) == PK_ERROR_ENUM_NO_LICENSE_AGREEMENT ||
+	    pk_error_get_code (error_code) == PK_ERROR_ENUM_PROCESS_KILL ||
+	    pk_error_get_code (error_code) == PK_ERROR_ENUM_TRANSACTION_CANCELLED) {
+		egg_warning ("ignoring %s", pk_error_enum_to_text (pk_error_get_code (error_code)));
 	}
 
-	egg_debug ("code was %s", pk_error_enum_to_text (error_item->code));
+	egg_debug ("code was %s", pk_error_enum_to_text (pk_error_get_code (error_code)));
 
 	/* use a modal dialog if showing progress, else use libnotify */
-	title = gpk_error_enum_to_localised_text (error_item->code);
-	message = gpk_error_enum_to_localised_message (error_item->code);
+	title = gpk_error_enum_to_localised_text (pk_error_get_code (error_code));
+	message = gpk_error_enum_to_localised_message (pk_error_get_code (error_code));
 	if (dtask->priv->show_progress) {
 		widget = GTK_WIDGET (gpk_modal_dialog_get_window (dtask->priv->dialog));
-		gpk_error_dialog_modal (GTK_WINDOW (widget), title, message, error_item->details);
+		gpk_error_dialog_modal (GTK_WINDOW (widget), title, message, pk_error_get_details (error_code));
 		return;
 	}
 
 	/* save this globally */
 	if (dtask->priv->cached_error_code != NULL)
-		pk_item_error_code_unref (dtask->priv->cached_error_code);
-	dtask->priv->cached_error_code = pk_item_error_code_ref (error_item);
+		g_object_unref (dtask->priv->cached_error_code);
+	dtask->priv->cached_error_code = g_object_ref (error_code);
 
 	/* do the bubble */
 	notification = notify_notification_new (title, message, "help-browser", NULL);
@@ -337,7 +337,7 @@ gpk_dbus_task_install_packages_cb (PkTask *task, GAsyncResult *res, GpkDbusTask
 	GError *error = NULL;
 	GError *error_dbus = NULL;
 	PkResults *results = NULL;
-	PkItemErrorCode *error_item = NULL;
+	PkError *error_code = NULL;
 
 	/* get the results */
 	results = pk_task_generic_finish (task, res, &error);
@@ -351,12 +351,12 @@ gpk_dbus_task_install_packages_cb (PkTask *task, GAsyncResult *res, GpkDbusTask
 	}
 
 	/* check error code */
-	error_item = pk_results_get_error_code (results);
-	if (error_item != NULL) {
-		egg_warning ("failed to install package: %s, %s", pk_error_enum_to_text (error_item->code), error_item->details);
-		error_dbus = g_error_new (GPK_DBUS_ERROR, GPK_DBUS_ERROR_INTERNAL_ERROR, "%s", error_item->details);
+	error_code = pk_results_get_error_code (results);
+	if (error_code != NULL) {
+		egg_warning ("failed to install package: %s, %s", pk_error_enum_to_text (pk_error_get_code (error_code)), pk_error_get_details (error_code));
+		error_dbus = g_error_new (GPK_DBUS_ERROR, GPK_DBUS_ERROR_INTERNAL_ERROR, "%s", pk_error_get_details (error_code));
 		dbus_g_method_return_error (dtask->priv->context, error_dbus);
-		gpk_dbus_task_handle_error (dtask, error_item);
+		gpk_dbus_task_handle_error (dtask, error_code);
 		goto out;
 	}
 
@@ -364,8 +364,8 @@ gpk_dbus_task_install_packages_cb (PkTask *task, GAsyncResult *res, GpkDbusTask
 	egg_debug ("doing async return");
 	dbus_g_method_return (dtask->priv->context, TRUE);
 out:
-	if (error_item != NULL)
-		pk_item_error_code_unref (error_item);
+	if (error_code != NULL)
+		g_object_unref (error_code);
 	if (results != NULL)
 		g_object_unref (results);
 }
@@ -470,7 +470,7 @@ gpk_dbus_task_install_files_cb (PkTask *task, GAsyncResult *res, GpkDbusTask *dt
 	PkResults *results = NULL;
 	guint length;
 	const gchar *title;
-	PkItemErrorCode *error_item = NULL;
+	PkError *error_code = NULL;
 
 	/* get the results */
 	results = pk_task_generic_finish (task, res, &error);
@@ -486,17 +486,17 @@ gpk_dbus_task_install_files_cb (PkTask *task, GAsyncResult *res, GpkDbusTask *dt
 	}
 
 	/* check error code */
-	error_item = pk_results_get_error_code (results);
-	if (error_item != NULL) {
-		egg_warning ("failed to install file: %s, %s", pk_error_enum_to_text (error_item->code), error_item->details);
-		gpk_dbus_task_handle_error (dtask, error_item);
+	error_code = pk_results_get_error_code (results);
+	if (error_code != NULL) {
+		egg_warning ("failed to install file: %s, %s", pk_error_enum_to_text (pk_error_get_code (error_code)), pk_error_get_details (error_code));
+		gpk_dbus_task_handle_error (dtask, error_code);
 		error_dbus = g_error_new (GPK_DBUS_ERROR, GPK_DBUS_ERROR_INTERNAL_ERROR, "%s", error->message);
 		dbus_g_method_return_error (dtask->priv->context, error_dbus);
 		goto out;
 	}
 out:
-	if (error_item != NULL)
-		pk_item_error_code_unref (error_item);
+	if (error_code != NULL)
+		g_object_unref (error_code);
 	if (results != NULL)
 		g_object_unref (results);
 }
@@ -679,7 +679,7 @@ gpk_dbus_task_is_installed_resolve_cb (PkClient *client, GAsyncResult *res, GpkD
 	PkResults *results = NULL;
 	GPtrArray *array = NULL;
 	gboolean ret;
-	PkItemErrorCode *error_item = NULL;
+	PkError *error_code = NULL;
 
 	/* get the results */
 	results = pk_client_generic_finish (client, res, &error);
@@ -692,10 +692,10 @@ gpk_dbus_task_is_installed_resolve_cb (PkClient *client, GAsyncResult *res, GpkD
 	}
 
 	/* check error code */
-	error_item = pk_results_get_error_code (results);
-	if (error_item != NULL) {
-		egg_warning ("failed to resolve: %s, %s", pk_error_enum_to_text (error_item->code), error_item->details);
-		error_dbus = g_error_new (GPK_DBUS_ERROR, GPK_DBUS_ERROR_INTERNAL_ERROR, "failed to resolve: %s", error_item->details);
+	error_code = pk_results_get_error_code (results);
+	if (error_code != NULL) {
+		egg_warning ("failed to resolve: %s, %s", pk_error_enum_to_text (pk_error_get_code (error_code)), pk_error_get_details (error_code));
+		error_dbus = g_error_new (GPK_DBUS_ERROR, GPK_DBUS_ERROR_INTERNAL_ERROR, "failed to resolve: %s", pk_error_get_details (error_code));
 		dbus_g_method_return_error (dtask->priv->context, error_dbus);
 		goto out;
 	}
@@ -706,8 +706,8 @@ gpk_dbus_task_is_installed_resolve_cb (PkClient *client, GAsyncResult *res, GpkD
 	egg_debug ("doing async return");
 	dbus_g_method_return (dtask->priv->context, ret);
 out:
-	if (error_item != NULL)
-		pk_item_error_code_unref (error_item);
+	if (error_code != NULL)
+		g_object_unref (error_code);
 	if (array != NULL)
 		g_ptr_array_unref (array);
 	if (results != NULL)
@@ -740,9 +740,11 @@ gpk_dbus_task_search_file_search_file_cb (PkClient *client, GAsyncResult *res, G
 	GError *error_dbus = NULL;
 	PkResults *results = NULL;
 	GPtrArray *array = NULL;
-	PkItemErrorCode *error_item = NULL;
+	PkError *error_code = NULL;
 	gchar **split = NULL;
-	const PkItemPackage *item;
+	PkPackage *item;
+	PkInfoEnum info;
+	gchar *package_id = NULL;
 
 	/* get the results */
 	results = pk_client_generic_finish (client, res, &error);
@@ -755,10 +757,10 @@ gpk_dbus_task_search_file_search_file_cb (PkClient *client, GAsyncResult *res, G
 	}
 
 	/* check error code */
-	error_item = pk_results_get_error_code (results);
-	if (error_item != NULL) {
-		egg_warning ("failed to resolve: %s, %s", pk_error_enum_to_text (error_item->code), error_item->details);
-		error_dbus = g_error_new (GPK_DBUS_ERROR, GPK_DBUS_ERROR_INTERNAL_ERROR, "failed to search file: %s", error_item->details);
+	error_code = pk_results_get_error_code (results);
+	if (error_code != NULL) {
+		egg_warning ("failed to resolve: %s, %s", pk_error_enum_to_text (pk_error_get_code (error_code)), pk_error_get_details (error_code));
+		error_dbus = g_error_new (GPK_DBUS_ERROR, GPK_DBUS_ERROR_INTERNAL_ERROR, "failed to search file: %s", pk_error_get_details (error_code));
 		dbus_g_method_return_error (dtask->priv->context, error_dbus);
 		goto out;
 	}
@@ -774,14 +776,19 @@ gpk_dbus_task_search_file_search_file_cb (PkClient *client, GAsyncResult *res, G
 
 	/* get first item */
 	item = g_ptr_array_index (array, 0);
-	split = pk_package_id_split (item->package_id);
+	g_object_get (item,
+		      "info", &info,
+		      "package-id", &package_id,
+		      NULL);
+	split = pk_package_id_split (package_id);
 
 	egg_debug ("doing async return");
-	dbus_g_method_return (dtask->priv->context, (item->info == PK_INFO_ENUM_INSTALLED), split[PK_PACKAGE_ID_NAME]);
+	dbus_g_method_return (dtask->priv->context, (info == PK_INFO_ENUM_INSTALLED), split[PK_PACKAGE_ID_NAME]);
 out:
+	g_free (package_id);
 	g_strfreev (split);
-	if (error_item != NULL)
-		pk_item_error_code_unref (error_item);
+	if (error_code != NULL)
+		g_object_unref (error_code);
 	if (array != NULL)
 		g_ptr_array_unref (array);
 	if (results != NULL)
@@ -871,14 +878,16 @@ gpk_dbus_task_install_package_names_resolve_cb (PkTask *task, GAsyncResult *res,
 	GError *error_dbus = NULL;
 	PkResults *results = NULL;
 	GPtrArray *array = NULL;
-	PkItemErrorCode *error_item = NULL;
-	const gchar *package_id = NULL;
+	PkError *error_code = NULL;
+	gchar *package_id = NULL;
 	gchar *title;
 	gchar *info_url;
-	PkItemPackage *item;
+	PkPackage *item;
 	GtkResponseType button;
 	guint i;
 	gboolean already_installed = FALSE;
+	PkInfoEnum info;
+	gchar *package_id_tmp = NULL;
 
 	/* get the results */
 	results = pk_task_generic_finish (task, res, &error);
@@ -891,10 +900,10 @@ gpk_dbus_task_install_package_names_resolve_cb (PkTask *task, GAsyncResult *res,
 	}
 
 	/* check error code */
-	error_item = pk_results_get_error_code (results);
-	if (error_item != NULL) {
-		egg_warning ("failed to resolve: %s, %s", pk_error_enum_to_text (error_item->code), error_item->details);
-		error_dbus = g_error_new (GPK_DBUS_ERROR, GPK_DBUS_ERROR_INTERNAL_ERROR, "failed to resolve: %s", error_item->details);
+	error_code = pk_results_get_error_code (results);
+	if (error_code != NULL) {
+		egg_warning ("failed to resolve: %s, %s", pk_error_enum_to_text (pk_error_get_code (error_code)), pk_error_get_details (error_code));
+		error_dbus = g_error_new (GPK_DBUS_ERROR, GPK_DBUS_ERROR_INTERNAL_ERROR, "failed to resolve: %s", pk_error_get_details (error_code));
 		dbus_g_method_return_error (dtask->priv->context, error_dbus);
 		goto out;
 	}
@@ -932,13 +941,18 @@ gpk_dbus_task_install_package_names_resolve_cb (PkTask *task, GAsyncResult *res,
 	/* see what we've got already */
 	for (i=0; i<array->len; i++) {
 		item = g_ptr_array_index (array, i);
-		if (item->info == PK_INFO_ENUM_INSTALLED) {
+		g_object_get (item,
+			      "info", &info,
+			      "package-id", &package_id_tmp,
+			      NULL);
+		if (info == PK_INFO_ENUM_INSTALLED) {
 			already_installed = TRUE;
-		} else if (item->info == PK_INFO_ENUM_AVAILABLE) {
-			egg_debug ("package '%s' resolved", item->package_id);
-			package_id = item->package_id;
+		} else if (info == PK_INFO_ENUM_AVAILABLE) {
+			egg_debug ("package '%s' resolved", package_id_tmp);
+			package_id = g_strdup (package_id_tmp);
 			//TODO: we need to list these in a gpk-dbus_task-chooser
 		}
+		g_free (package_id_tmp);
 	}
 
 	/* already installed? */
@@ -979,8 +993,9 @@ gpk_dbus_task_install_package_names_resolve_cb (PkTask *task, GAsyncResult *res,
 	/* install these packages with deps */
 	gpk_dbus_task_install_package_ids (dtask);
 out:
-	if (error_item != NULL)
-		pk_item_error_code_unref (error_item);
+	g_free (package_id);
+	if (error_code != NULL)
+		g_object_unref (error_code);
 	if (array != NULL)
 		g_ptr_array_unref (array);
 	if (results != NULL)
@@ -1087,15 +1102,17 @@ gpk_dbus_task_install_provide_files_search_file_cb (PkClient *client, GAsyncResu
 	GError *error_dbus = NULL;
 	PkResults *results = NULL;
 	GPtrArray *array = NULL;
-	PkItemErrorCode *error_item = NULL;
-	const gchar *package_id = NULL;
+	PkError *error_code = NULL;
 	gchar *info_url;
-	PkItemPackage *item;
+	PkPackage *item;
 	GtkResponseType button;
 	guint i;
 	gboolean already_installed = FALSE;
 	gchar *text;
 	gchar **split;
+	PkInfoEnum info;
+	gchar *package_id = NULL;
+	gchar *package_id_tmp = NULL;
 
 	/* get the results */
 	results = pk_client_generic_finish (client, res, &error);
@@ -1108,10 +1125,10 @@ gpk_dbus_task_install_provide_files_search_file_cb (PkClient *client, GAsyncResu
 	}
 
 	/* check error code */
-	error_item = pk_results_get_error_code (results);
-	if (error_item != NULL) {
-		egg_warning ("failed to resolve: %s, %s", pk_error_enum_to_text (error_item->code), error_item->details);
-		error_dbus = g_error_new (GPK_DBUS_ERROR, GPK_DBUS_ERROR_INTERNAL_ERROR, "failed to resolve: %s", error_item->details);
+	error_code = pk_results_get_error_code (results);
+	if (error_code != NULL) {
+		egg_warning ("failed to resolve: %s, %s", pk_error_enum_to_text (pk_error_get_code (error_code)), pk_error_get_details (error_code));
+		error_dbus = g_error_new (GPK_DBUS_ERROR, GPK_DBUS_ERROR_INTERNAL_ERROR, "failed to resolve: %s", pk_error_get_details (error_code));
 		dbus_g_method_return_error (dtask->priv->context, error_dbus);
 		goto out;
 	}
@@ -1149,13 +1166,18 @@ gpk_dbus_task_install_provide_files_search_file_cb (PkClient *client, GAsyncResu
 	/* see what we've got already */
 	for (i=0; i<array->len; i++) {
 		item = g_ptr_array_index (array, i);
-		if (item->info == PK_INFO_ENUM_INSTALLED) {
+		g_object_get (item,
+			      "info", &info,
+			      "package-id", &package_id_tmp,
+			      NULL);
+		if (info == PK_INFO_ENUM_INSTALLED) {
 			already_installed = TRUE;
-			package_id = item->package_id;
-		} else if (item->info == PK_INFO_ENUM_AVAILABLE) {
-			egg_debug ("package '%s' resolved to:", item->package_id);
-			package_id = item->package_id;
+			package_id = g_strdup (package_id_tmp);
+		} else if (info == PK_INFO_ENUM_AVAILABLE) {
+			egg_debug ("package '%s' resolved to:", package_id_tmp);
+			package_id = g_strdup (package_id_tmp);
 		}
+		g_free (package_id_tmp);
 	}
 
 	/* already installed? */
@@ -1184,8 +1206,9 @@ gpk_dbus_task_install_provide_files_search_file_cb (PkClient *client, GAsyncResu
 	/* install these packages with deps */
 	gpk_dbus_task_install_package_ids (dtask);
 out:
-	if (error_item != NULL)
-		pk_item_error_code_unref (error_item);
+	g_free (package_id);
+	if (error_code != NULL)
+		g_object_unref (error_code);
 	if (array != NULL)
 		g_ptr_array_unref (array);
 	if (results != NULL)
@@ -1383,7 +1406,7 @@ gpk_dbus_task_codec_what_provides_cb (PkClient *client, GAsyncResult *res, GpkDb
 	GError *error_dbus = NULL;
 	PkResults *results = NULL;
 	GPtrArray *array = NULL;
-	PkItemErrorCode *error_item = NULL;
+	PkError *error_code = NULL;
 	GtkResponseType button;
 	gchar *info_url;
 	const gchar *title;
@@ -1400,10 +1423,10 @@ gpk_dbus_task_codec_what_provides_cb (PkClient *client, GAsyncResult *res, GpkDb
 	}
 
 	/* check error code */
-	error_item = pk_results_get_error_code (results);
-	if (error_item != NULL) {
-		egg_warning ("failed to resolve: %s, %s", pk_error_enum_to_text (error_item->code), error_item->details);
-		error_dbus = g_error_new (GPK_DBUS_ERROR, GPK_DBUS_ERROR_INTERNAL_ERROR, "failed to resolve: %s", error_item->details);
+	error_code = pk_results_get_error_code (results);
+	if (error_code != NULL) {
+		egg_warning ("failed to resolve: %s, %s", pk_error_enum_to_text (pk_error_get_code (error_code)), pk_error_get_details (error_code));
+		error_dbus = g_error_new (GPK_DBUS_ERROR, GPK_DBUS_ERROR_INTERNAL_ERROR, "failed to resolve: %s", pk_error_get_details (error_code));
 		dbus_g_method_return_error (dtask->priv->context, error_dbus);
 		goto out;
 	}
@@ -1471,8 +1494,8 @@ skip_checks2:
 	dtask->priv->package_ids = pk_package_array_to_strv (array);
 	gpk_dbus_task_install_package_ids (dtask);
 out:
-	if (error_item != NULL)
-		pk_item_error_code_unref (error_item);
+	if (error_code != NULL)
+		g_object_unref (error_code);
 	if (array != NULL)
 		g_ptr_array_unref (array);
 	if (results != NULL)
@@ -1557,7 +1580,7 @@ gpk_dbus_task_mime_what_provides_cb (PkClient *client, GAsyncResult *res, GpkDbu
 	GError *error_dbus = NULL;
 	PkResults *results = NULL;
 	GPtrArray *array = NULL;
-	PkItemErrorCode *error_item = NULL;
+	PkError *error_code = NULL;
 	gchar *info_url;
 	GtkResponseType button;
 
@@ -1574,10 +1597,10 @@ gpk_dbus_task_mime_what_provides_cb (PkClient *client, GAsyncResult *res, GpkDbu
 	}
 
 	/* check error code */
-	error_item = pk_results_get_error_code (results);
-	if (error_item != NULL) {
-		egg_warning ("failed to resolve: %s, %s", pk_error_enum_to_text (error_item->code), error_item->details);
-		error_dbus = g_error_new (GPK_DBUS_ERROR, GPK_DBUS_ERROR_INTERNAL_ERROR, "failed to resolve: %s", error_item->details);
+	error_code = pk_results_get_error_code (results);
+	if (error_code != NULL) {
+		egg_warning ("failed to resolve: %s, %s", pk_error_enum_to_text (pk_error_get_code (error_code)), pk_error_get_details (error_code));
+		error_dbus = g_error_new (GPK_DBUS_ERROR, GPK_DBUS_ERROR_INTERNAL_ERROR, "failed to resolve: %s", pk_error_get_details (error_code));
 		dbus_g_method_return_error (dtask->priv->context, error_dbus);
 		goto out;
 	}
@@ -1618,8 +1641,8 @@ gpk_dbus_task_mime_what_provides_cb (PkClient *client, GAsyncResult *res, GpkDbu
 	egg_debug ("doing async return");
 	dbus_g_method_return (dtask->priv->context, TRUE);
 out:
-	if (error_item != NULL)
-		pk_item_error_code_unref (error_item);
+	if (error_code != NULL)
+		g_object_unref (error_code);
 	if (array != NULL)
 		g_ptr_array_unref (array);
 	if (results != NULL)
@@ -1805,7 +1828,7 @@ gpk_dbus_task_fontconfig_what_provides_cb (PkClient *client, GAsyncResult *res,
 	GError *error_dbus = NULL;
 	PkResults *results = NULL;
 	GPtrArray *array = NULL;
-	PkItemErrorCode *error_item = NULL;
+	PkError *error_code = NULL;
 	gchar *title;
 	gchar *info_url;
 	GtkResponseType button;
@@ -1823,11 +1846,11 @@ gpk_dbus_task_fontconfig_what_provides_cb (PkClient *client, GAsyncResult *res,
 	}
 
 	/* check error code */
-	error_item = pk_results_get_error_code (results);
-	if (error_item != NULL) {
+	error_code = pk_results_get_error_code (results);
+	if (error_code != NULL) {
 		/* TRANSLATORS: we failed to find the package, this shouldn't happen */
-//		gpk_dbus_task_error_msg (dtask, _("Failed to search for provides"), error_item->details);
-		error_dbus = g_error_new (GPK_DBUS_ERROR, GPK_DBUS_ERROR_INTERNAL_ERROR, "failed to search for provides: %s", error_item->details);
+//		gpk_dbus_task_error_msg (dtask, _("Failed to search for provides"), pk_error_get_details (error_code));
+		error_dbus = g_error_new (GPK_DBUS_ERROR, GPK_DBUS_ERROR_INTERNAL_ERROR, "failed to search for provides: %s", pk_error_get_details (error_code));
 		dbus_g_method_return_error (dtask->priv->context, error_dbus);
 		goto out;
 	}
@@ -1894,8 +1917,8 @@ skip_checks:
 	dtask->priv->package_ids = pk_package_array_to_strv (array);
 	gpk_dbus_task_install_package_ids (dtask);
 out:
-	if (error_item != NULL)
-		pk_item_error_code_unref (error_item);
+	if (error_code != NULL)
+		g_object_unref (error_code);
 	if (array != NULL)
 		g_ptr_array_unref (array);
 	if (results != NULL)
@@ -2184,7 +2207,7 @@ gpk_dbus_task_get_package_for_exec (GpkDbusTask *dtask, const gchar *exec)
 	gchar *package = NULL;
 	GError *error = NULL;
 	GPtrArray *array = NULL;
-	const PkItemPackage *item;
+	PkPackage *item;
 	PkResults *results = NULL;
 	gchar **values = NULL;
 
@@ -2213,7 +2236,9 @@ gpk_dbus_task_get_package_for_exec (GpkDbusTask *dtask, const gchar *exec)
 
 	/* copy name */
 	item = g_ptr_array_index (array, 0);
-	package = g_strdup (item->package_id);
+	g_object_get (item,
+		      "package-id", &package,
+		      NULL);
 	egg_debug ("got package %s", package);
 out:
 	g_strfreev (values);
@@ -2398,7 +2423,7 @@ gpk_dbus_task_finalize (GObject *object)
 	g_free (dtask->priv->parent_title);
 	g_free (dtask->priv->parent_icon_name);
 	if (dtask->priv->cached_error_code != NULL)
-		pk_item_error_code_unref (dtask->priv->cached_error_code);
+		g_object_unref (dtask->priv->cached_error_code);
 	g_strfreev (dtask->priv->files);
 	g_strfreev (dtask->priv->package_ids);
 	g_object_unref (PK_CLIENT(dtask->priv->task));
diff --git a/src/gpk-dialog.c b/src/gpk-dialog.c
index a86e8f8..ad96a16 100644
--- a/src/gpk-dialog.c
+++ b/src/gpk-dialog.c
@@ -85,12 +85,15 @@ gpk_dialog_package_array_to_list_store (GPtrArray *array)
 {
 	GtkListStore *store;
 	GtkTreeIter iter;
-	const PkItemPackage *item;
+	PkPackage *item;
 	PkDesktop *desktop;
 	const gchar *icon;
 	gchar *text;
 	guint i;
 	gchar **split;
+	PkInfoEnum info;
+	gchar *package_id = NULL;
+	gchar *summary = NULL;
 
 	desktop = pk_desktop_new ();
 	store = gtk_list_store_new (GPK_DIALOG_STORE_LAST, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
@@ -98,21 +101,28 @@ gpk_dialog_package_array_to_list_store (GPtrArray *array)
 	/* add each well */
 	for (i=0; i<array->len; i++) {
 		item = g_ptr_array_index (array, i);
-		text = gpk_package_id_format_twoline (item->package_id, item->summary);
+		g_object_get (item,
+			      "info", &info,
+			      "package-id", &package_id,
+			      "summary", &summary,
+			      NULL);
+		text = gpk_package_id_format_twoline (package_id, summary);
 
 		/* get the icon */
-		split = pk_package_id_split (item->package_id);
+		split = pk_package_id_split (package_id);
 		icon = gpk_desktop_guess_icon_name (desktop, split[0]);
 		if (icon == NULL)
-			icon = gpk_info_enum_to_icon_name (item->info);
+			icon = gpk_info_enum_to_icon_name (info);
 
 		gtk_list_store_append (store, &iter);
 		gtk_list_store_set (store, &iter,
 				    GPK_DIALOG_STORE_IMAGE, icon,
-				    GPK_DIALOG_STORE_ID, item->package_id,
+				    GPK_DIALOG_STORE_ID, package_id,
 				    GPK_DIALOG_STORE_TEXT, text,
 				    -1);
 		g_strfreev (split);
+		g_free (package_id);
+		g_free (summary);
 		g_free (text);
 	}
 
@@ -173,14 +183,6 @@ gpk_dialog_embed_package_list_widget (GtkDialog *dialog, GPtrArray *array)
 	GtkListStore *store;
 	GtkWidget *widget;
 	const guint row_height = 48;
-	PkItemPackage *item;
-	guint i;
-
-	/* debug */
-	for (i=0; i<array->len; i++) {
-		item = g_ptr_array_index (array, i);
-		egg_debug ("add %s,%s", pk_info_enum_to_text (item->info), item->package_id);
-	}
 
 	/* convert to a store */
 	store = gpk_dialog_package_array_to_list_store (array);
diff --git a/src/gpk-enum.c b/src/gpk-enum.c
index 5c9a25d..311dd3a 100644
--- a/src/gpk-enum.c
+++ b/src/gpk-enum.c
@@ -330,7 +330,7 @@ gpk_media_type_enum_to_localised_text (PkMediaTypeEnum type)
  * gpk_error_enum_to_localised_text:
  **/
 const gchar *
-gpk_error_enum_to_localised_text (PkErrorCodeEnum code)
+gpk_error_enum_to_localised_text (PkErrorEnum code)
 {
 	const gchar *text = NULL;
 	switch (code) {
@@ -521,7 +521,7 @@ gpk_error_enum_to_localised_text (PkErrorCodeEnum code)
  * gpk_error_enum_to_localised_message:
  **/
 const gchar *
-gpk_error_enum_to_localised_message (PkErrorCodeEnum code)
+gpk_error_enum_to_localised_message (PkErrorEnum code)
 {
 	const gchar *text = NULL;
 	switch (code) {
diff --git a/src/gpk-enum.h b/src/gpk-enum.h
index 0b19666..a58422f 100644
--- a/src/gpk-enum.h
+++ b/src/gpk-enum.h
@@ -83,9 +83,9 @@ const gchar	*gpk_status_enum_to_icon_name		(PkStatusEnum	 status);
 const gchar	*gpk_status_enum_to_animation		(PkStatusEnum	 status);
 const gchar	*gpk_restart_enum_to_icon_name		(PkRestartEnum	 restart);
 const gchar	*gpk_restart_enum_to_dialog_icon_name	(PkRestartEnum	 restart);
-const gchar	*gpk_error_enum_to_localised_text	(PkErrorCodeEnum code)
+const gchar	*gpk_error_enum_to_localised_text	(PkErrorEnum code)
 							 G_GNUC_CONST;
-const gchar	*gpk_error_enum_to_localised_message	(PkErrorCodeEnum code);
+const gchar	*gpk_error_enum_to_localised_message	(PkErrorEnum code);
 const gchar	*gpk_restart_enum_to_localised_text	(PkRestartEnum	 restart)
 							 G_GNUC_CONST;
 const gchar	*gpk_update_state_enum_to_localised_text (PkUpdateStateEnum state)
diff --git a/src/gpk-firmware.c b/src/gpk-firmware.c
index 4d949ef..f1e2825 100644
--- a/src/gpk-firmware.c
+++ b/src/gpk-firmware.c
@@ -356,7 +356,7 @@ gpk_firmware_install_packages_cb (GObject *object, GAsyncResult *res, GpkFirmwar
 	const GpkFirmwareRequest *req;
 	gboolean ret;
 	guint i;
-	PkItemErrorCode *error_item = NULL;
+	PkError *error_code = NULL;
 
 	/* get the results */
 	results = pk_client_generic_finish (client, res, &error);
@@ -367,16 +367,16 @@ gpk_firmware_install_packages_cb (GObject *object, GAsyncResult *res, GpkFirmwar
 	}
 
 	/* check error code */
-	error_item = pk_results_get_error_code (results);
-	if (error_item != NULL) {
-		egg_warning ("failed to install file: %s, %s", pk_error_enum_to_text (error_item->code), error_item->details);
+	error_code = pk_results_get_error_code (results);
+	if (error_code != NULL) {
+		egg_warning ("failed to install file: %s, %s", pk_error_enum_to_text (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 
 		/* ignore some errors */
-		if (error_item->code != PK_ERROR_ENUM_PROCESS_KILL &&
-		    error_item->code != PK_ERROR_ENUM_TRANSACTION_CANCELLED &&
-		    error_item->code != PK_ERROR_ENUM_NOT_AUTHORIZED) {
-			gpk_error_dialog (gpk_error_enum_to_localised_text (error_item->code),
-					  gpk_error_enum_to_localised_message (error_item->code), error_item->details);
+		if (pk_error_get_code (error_code) != PK_ERROR_ENUM_PROCESS_KILL &&
+		    pk_error_get_code (error_code) != PK_ERROR_ENUM_TRANSACTION_CANCELLED &&
+		    pk_error_get_code (error_code) != PK_ERROR_ENUM_NOT_AUTHORIZED) {
+			gpk_error_dialog (gpk_error_enum_to_localised_text (pk_error_get_code (error_code)),
+					  gpk_error_enum_to_localised_message (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 		}
 		goto out;
 	}
@@ -411,8 +411,8 @@ gpk_firmware_install_packages_cb (GObject *object, GAsyncResult *res, GpkFirmwar
 	/* clear array */
 	g_ptr_array_set_size (firmware->priv->array_requested, 0);
 out:
-	if (error_item != NULL)
-		pk_item_error_code_unref (error_item);
+	if (error_code != NULL)
+		g_object_unref (error_code);
 	if (array != NULL)
 		g_ptr_array_unref (array);
 	if (results != NULL)
@@ -490,17 +490,17 @@ out:
  * @firmware: This class instance
  * @filename: Firmware to search for
  **/
-static PkItemPackage *
+static PkPackage *
 gpk_firmware_check_available (GpkFirmware *firmware, const gchar *filename)
 {
 	guint length = 0;
 	GPtrArray *array = NULL;
 	GError *error = NULL;
-	PkItemPackage *item = NULL;
+	PkPackage *item = NULL;
 	PkBitfield filter;
 	PkResults *results;
 	gchar **values = NULL;
-	PkItemErrorCode *error_item = NULL;
+	PkError *error_code = NULL;
 
 	/* search for newest not installed package */
 	filter = pk_bitfield_from_enums (PK_FILTER_ENUM_NOT_INSTALLED, PK_FILTER_ENUM_NEWEST, -1);
@@ -513,9 +513,9 @@ gpk_firmware_check_available (GpkFirmware *firmware, const gchar *filename)
 	}
 
 	/* check error code */
-	error_item = pk_results_get_error_code (results);
-	if (error_item != NULL) {
-		egg_warning ("failed to search file: %s, %s", pk_error_enum_to_text (error_item->code), error_item->details);
+	error_code = pk_results_get_error_code (results);
+	if (error_code != NULL) {
+		egg_warning ("failed to search file: %s, %s", pk_error_enum_to_text (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 		goto out;
 	}
 
@@ -526,11 +526,11 @@ gpk_firmware_check_available (GpkFirmware *firmware, const gchar *filename)
 	else if (array->len != 1)
 		egg_warning ("not one package providing %s found (%i)", filename, length);
 	else
-		item = pk_item_package_ref (g_ptr_array_index (array, 0));
+		item = g_object_ref (g_ptr_array_index (array, 0));
 out:
 	g_strfreev (values);
-	if (error_item != NULL)
-		pk_item_error_code_unref (error_item);
+	if (error_code != NULL)
+		g_object_unref (error_code);
 	if (array != NULL)
 		g_object_unref (array);
 	if (results != NULL)
@@ -572,7 +572,7 @@ gpk_firmware_timeout_cb (gpointer data)
 	NotifyNotification *notification;
 	GPtrArray *array;
 	GError *error = NULL;
-	PkItemPackage *item = NULL;
+	PkPackage *item = NULL;
 	const GpkFirmwareRequest *req;
 	gboolean has_data = FALSE;
 
@@ -587,7 +587,7 @@ gpk_firmware_timeout_cb (gpointer data)
 		item = gpk_firmware_check_available (firmware, req->filename);
 		if (item != NULL) {
 			g_ptr_array_add (firmware->priv->packages_found, item);
-			pk_item_package_unref (item);
+			g_object_unref (item);
 		}
 	}
 
@@ -998,7 +998,7 @@ gpk_firmware_init (GpkFirmware *firmware)
 
 	firmware->priv = GPK_FIRMWARE_GET_PRIVATE (firmware);
 	firmware->priv->timeout_id = 0;
-	firmware->priv->packages_found = g_ptr_array_new_with_free_func ((GDestroyNotify) pk_item_package_unref);
+	firmware->priv->packages_found = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
 	firmware->priv->array_requested = g_ptr_array_new_with_free_func ((GDestroyNotify) gpk_firmware_request_free);
 	firmware->priv->gconf_client = gconf_client_get_default ();
 	firmware->priv->consolekit = egg_console_kit_new ();
diff --git a/src/gpk-hardware.c b/src/gpk-hardware.c
index 4947ebd..385e16a 100644
--- a/src/gpk-hardware.c
+++ b/src/gpk-hardware.c
@@ -78,7 +78,7 @@ gpk_hardware_install_packages_cb (GObject *object, GAsyncResult *res, GpkHardwar
 	PkClient *client = PK_CLIENT (object);
 	GError *error = NULL;
 	PkResults *results = NULL;
-	PkItemErrorCode *error_item = NULL;
+	PkError *error_code = NULL;
 
 	/* get the results */
 	results = pk_client_generic_finish (client, res, &error);
@@ -89,14 +89,14 @@ gpk_hardware_install_packages_cb (GObject *object, GAsyncResult *res, GpkHardwar
 	}
 
 	/* check error code */
-	error_item = pk_results_get_error_code (results);
-	if (error_item != NULL) {
-		egg_warning ("failed to install file: %s, %s", pk_error_enum_to_text (error_item->code), error_item->details);
+	error_code = pk_results_get_error_code (results);
+	if (error_code != NULL) {
+		egg_warning ("failed to install file: %s, %s", pk_error_enum_to_text (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 		goto out;
 	}
 out:
-	if (error_item != NULL)
-		pk_item_error_code_unref (error_item);
+	if (error_code != NULL)
+		g_object_unref (error_code);
 	if (results != NULL)
 		g_object_unref (results);
 }
@@ -135,8 +135,10 @@ gpk_hardware_what_provides_cb (GObject *object, GAsyncResult *res, GpkHardware *
 	NotifyNotification *notification;
 	gchar *package = NULL;
 	GPtrArray *array = NULL;
-	const PkItemPackage *item = NULL;
-	PkItemErrorCode *error_item = NULL;
+	PkPackage *item = NULL;
+	PkError *error_code = NULL;
+	gchar *package_id = NULL;
+	gchar *summary = NULL;
 
 	/* get the results */
 	results = pk_client_generic_finish (client, res, &error);
@@ -147,9 +149,9 @@ gpk_hardware_what_provides_cb (GObject *object, GAsyncResult *res, GpkHardware *
 	}
 
 	/* check error code */
-	error_item = pk_results_get_error_code (results);
-	if (error_item != NULL) {
-		egg_warning ("failed to get provides: %s, %s", pk_error_enum_to_text (error_item->code), error_item->details);
+	error_code = pk_results_get_error_code (results);
+	if (error_code != NULL) {
+		egg_warning ("failed to get provides: %s, %s", pk_error_enum_to_text (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 		goto out;
 	}
 
@@ -162,7 +164,14 @@ gpk_hardware_what_provides_cb (GObject *object, GAsyncResult *res, GpkHardware *
 
 	/* only install the first one? */
 	item = g_ptr_array_index (array, 0);
-	package = gpk_package_id_format_oneline (item->package_id, item->summary);
+
+	/* get data */
+	g_object_get (item,
+		      "package-id", &package_id,
+		      "summary", &summary,
+		      NULL);
+
+	package = gpk_package_id_format_oneline (package_id, summary);
 
 	/* save array */
 	if (hardware->priv->package_ids != NULL)
@@ -192,8 +201,10 @@ out:
 	g_free (package);
 	g_free (message);
 	g_free (body);
-	if (error_item != NULL)
-		pk_item_error_code_unref (error_item);
+	g_free (package_id);
+	g_free (summary);
+	if (error_code != NULL)
+		g_object_unref (error_code);
 	if (array != NULL)
 		g_ptr_array_unref (array);
 	if (results != NULL)
diff --git a/src/gpk-helper-chooser.c b/src/gpk-helper-chooser.c
index 655970c..338a780 100644
--- a/src/gpk-helper-chooser.c
+++ b/src/gpk-helper-chooser.c
@@ -165,9 +165,12 @@ gpk_helper_chooser_show (GpkHelperChooser *helper, GPtrArray *list)
 	gchar *text;
 	const gchar *icon_name;
 	guint i;
-	const PkItemPackage *item;
+	PkPackage *item;
 	GtkTreeIter iter;
 	gchar **split;
+	PkInfoEnum info;
+	gchar *package_id = NULL;
+	gchar *summary = NULL;
 
 	g_return_val_if_fail (GPK_IS_HELPER_CHOOSER (helper), FALSE);
 	g_return_val_if_fail (list != NULL, FALSE);
@@ -175,23 +178,30 @@ gpk_helper_chooser_show (GpkHelperChooser *helper, GPtrArray *list)
 	/* see what we've got already */
 	for (i=0; i<list->len; i++) {
 		item = g_ptr_array_index (list, i);
-		egg_debug ("package '%s' got:", item->package_id);
+		g_object_get (item,
+			      "info", &info,
+			      "package-id", &package_id,
+			      "summary", &summary,
+			      NULL);
+		egg_debug ("package '%s' got:", package_id);
 
 		/* put formatted text into treeview */
 		gtk_list_store_append (helper->priv->list_store, &iter);
-		text = gpk_package_id_format_twoline (item->package_id, item->summary);
+		text = gpk_package_id_format_twoline (package_id, summary);
 
 		/* get the icon */
-		split = pk_package_id_split (item->package_id);
+		split = pk_package_id_split (package_id);
 		icon_name = gpk_desktop_guess_icon_name (helper->priv->desktop, split[PK_PACKAGE_ID_NAME]);
 		g_strfreev (split);
 		if (icon_name == NULL)
-			icon_name = gpk_info_enum_to_icon_name (item->info);
+			icon_name = gpk_info_enum_to_icon_name (info);
 
 		gtk_list_store_set (helper->priv->list_store, &iter,
 				    GPK_CHOOSER_COLUMN_TEXT, text,
-				    GPK_CHOOSER_COLUMN_ID, item->package_id, -1);
+				    GPK_CHOOSER_COLUMN_ID, package_id, -1);
 		gtk_list_store_set (helper->priv->list_store, &iter, GPK_CHOOSER_COLUMN_ICON, icon_name, -1);
+		g_free (package_id);
+		g_free (summary);
 		g_free (text);
 	}
 
diff --git a/src/gpk-log.c b/src/gpk-log.c
index f33eb80..9a3711e 100644
--- a/src/gpk-log.c
+++ b/src/gpk-log.c
@@ -379,7 +379,7 @@ gpk_log_message_received_cb (UniqueApp *app, UniqueCommand command, UniqueMessag
  * gpk_log_filter:
  **/
 static gboolean
-gpk_log_filter (const PkItemTransaction *item)
+gpk_log_filter (PkTransactionPast *item)
 {
 	gboolean ret = FALSE;
 	guint i;
@@ -387,10 +387,22 @@ gpk_log_filter (const PkItemTransaction *item)
 	gchar **sections;
 	gchar **packages;
 	gchar **split;
+	gchar *tid;
+	gboolean succeeded;
+	gchar *cmdline;
+	gchar *data;
+
+	/* get data */
+	g_object_get (item,
+		      "tid", &tid,
+		      "succeeded", &succeeded,
+		      "cmdline", &cmdline,
+		      "data", &data,
+		      NULL);
 
 	/* only show transactions that succeeded */
-	if (!item->succeeded) {
-		egg_debug ("tid %s did not succeed, so not adding", item->tid);
+	if (!succeeded) {
+		egg_debug ("tid %s did not succeed, so not adding", tid);
 		return FALSE;
 	}
 
@@ -398,11 +410,11 @@ gpk_log_filter (const PkItemTransaction *item)
 		return TRUE;
 
 	/* matches cmdline */
-	if (item->cmdline != NULL && g_strrstr (item->cmdline, filter) != NULL)
+	if (cmdline != NULL && g_strrstr (cmdline, filter) != NULL)
 		ret = TRUE;
 
 	/* look in all the data for the filter string */
-	packages = g_strsplit (item->data, "\n", 0);
+	packages = g_strsplit (data, "\n", 0);
 	length = g_strv_length (packages);
 	for (i=0; i<length; i++) {
 		sections = g_strsplit (packages[i], "\t", 0);
@@ -428,6 +440,9 @@ gpk_log_filter (const PkItemTransaction *item)
 			break;
 	}
 
+	g_free (tid);
+	g_free (cmdline);
+	g_free (data);
 	g_strfreev (packages);
 
 	return ret;
@@ -437,7 +452,7 @@ gpk_log_filter (const PkItemTransaction *item)
  * gpk_log_add_item
  **/
 static void
-gpk_log_add_item (const PkItemTransaction *item)
+gpk_log_add_item (PkTransactionPast *item)
 {
 	GtkTreeIter iter;
 	gchar *details;
@@ -449,19 +464,39 @@ gpk_log_add_item (const PkItemTransaction *item)
 	const gchar *tool;
 	static guint count;
 	struct passwd *pw;
+	gchar *tid;
+	gchar *timespec;
+	gboolean succeeded;
+	guint duration;
+	gchar *cmdline;
+	guint uid;
+	gchar *data;
+	PkRoleEnum role;
 	GtkTreeView *treeview = GTK_TREE_VIEW (gtk_builder_get_object (builder, "treeview_simple"));
 	GtkTreeModel *model = gtk_tree_view_get_model (treeview);
 
+	/* get data */
+	g_object_get (item,
+		      "role", &role,
+		      "tid", &tid,
+		      "timespec", &timespec,
+		      "succeeded", &succeeded,
+		      "duration", &duration,
+		      "cmdline", &cmdline,
+		      "uid", &uid,
+		      "data", &data,
+		      NULL);
+
 	/* put formatted text into treeview */
-	details = gpk_log_get_details_localised (item->timespec, item->data);
-	date = gpk_log_get_localised_date (item->timespec);
+	details = gpk_log_get_details_localised (timespec, data);
+	date = gpk_log_get_localised_date (timespec);
 	date_part = g_strsplit (date, ", ", 2);
 
-	icon_name = gpk_role_enum_to_icon_name (item->role);
-	role_text = gpk_role_enum_to_localised_past (item->role);
+	icon_name = gpk_role_enum_to_icon_name (role);
+	role_text = gpk_role_enum_to_localised_past (role);
 
 	/* query real name */
-	pw = getpwuid(item->uid);
+	pw = getpwuid(uid);
 	if (pw != NULL) {
 		if (pw->pw_gecos != NULL)
 			username = pw->pw_gecos;
@@ -470,29 +505,29 @@ gpk_log_add_item (const PkItemTransaction *item)
 	}
 
 	/* get nice name for tool name */
-	if (g_strcmp0 (item->cmdline, "pkcon") == 0)
+	if (g_strcmp0 (cmdline, "pkcon") == 0)
 		/* TRANSLATORS: short name for pkcon */
 		tool = _("Command line client");
-	else if (g_strcmp0 (item->cmdline, "gpk-application") == 0)
+	else if (g_strcmp0 (cmdline, "gpk-application") == 0)
 		/* TRANSLATORS: short name for gpk-update-viewer */
 		tool = _("Add/Remove Software");
-	else if (g_strcmp0 (item->cmdline, "gpk-update-viewer") == 0)
+	else if (g_strcmp0 (cmdline, "gpk-update-viewer") == 0)
 		/* TRANSLATORS: short name for gpk-update-viewer */
 		tool = _("Update System");
-	else if (g_strcmp0 (item->cmdline, "gpk-update-icon") == 0)
+	else if (g_strcmp0 (cmdline, "gpk-update-icon") == 0)
 		/* TRANSLATORS: short name for gpk-update-icon */
 		tool = _("Update Icon");
 	else
-		tool = item->cmdline;
+		tool = cmdline;
 
-	gpk_log_model_get_iter (model, &iter, item->tid);
+	gpk_log_model_get_iter (model, &iter, tid);
 	gtk_list_store_set (list_store, &iter,
 			    GPK_LOG_COLUMN_ICON, icon_name,
-			    GPK_LOG_COLUMN_TIMESPEC, item->timespec,
+			    GPK_LOG_COLUMN_TIMESPEC, timespec,
 			    GPK_LOG_COLUMN_DATE, date_part[1],
 			    GPK_LOG_COLUMN_ROLE, role_text,
 			    GPK_LOG_COLUMN_DETAILS, details,
-			    GPK_LOG_COLUMN_ID, item->tid,
+			    GPK_LOG_COLUMN_ID, tid,
 			    GPK_LOG_COLUMN_USER, username,
 			    GPK_LOG_COLUMN_TOOL, tool,
 			    GPK_LOG_COLUMN_ACTIVE, TRUE, -1);
@@ -503,6 +538,10 @@ gpk_log_add_item (const PkItemTransaction *item)
 			gtk_main_iteration ();
 
 	g_strfreev (date_part);
+	g_free (tid);
+	g_free (timespec);
+	g_free (cmdline);
+	g_free (data);
 	g_free (details);
 	g_free (date);
 }
@@ -515,7 +554,7 @@ gpk_log_refilter (void)
 {
 	guint i;
 	gboolean ret;
-	const PkItemTransaction *item;
+	PkTransactionPast *item;
 	GtkWidget *widget;
 	const gchar *package;
 	GtkTreeView *treeview;
@@ -558,7 +597,7 @@ gpk_log_get_old_transactions_cb (GObject *object, GAsyncResult *res, gpointer us
 //	PkClient *client = PK_CLIENT (object);
 	GError *error = NULL;
 	PkResults *results = NULL;
-	PkItemErrorCode *error_item = NULL;
+	PkError *error_code = NULL;
 
 	/* get the results */
 	results = pk_client_generic_finish (client, res, &error);
@@ -569,9 +608,9 @@ gpk_log_get_old_transactions_cb (GObject *object, GAsyncResult *res, gpointer us
 	}
 
 	/* check error code */
-	error_item = pk_results_get_error_code (results);
-	if (error_item != NULL) {
-		egg_warning ("failed to get old transactions: %s, %s", pk_error_enum_to_text (error_item->code), error_item->details);
+	error_code = pk_results_get_error_code (results);
+	if (error_code != NULL) {
+		egg_warning ("failed to get old transactions: %s, %s", pk_error_enum_to_text (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 		goto out;
 	}
 
@@ -581,8 +620,8 @@ gpk_log_get_old_transactions_cb (GObject *object, GAsyncResult *res, gpointer us
 	transactions = pk_results_get_transaction_array (results);
 	gpk_log_refilter ();
 out:
-	if (error_item != NULL)
-		pk_item_error_code_unref (error_item);
+	if (error_code != NULL)
+		g_object_unref (error_code);
 	if (results != NULL)
 		g_object_unref (results);
 }
diff --git a/src/gpk-modal-dialog.c b/src/gpk-modal-dialog.c
index 89220bc..2a34afd 100644
--- a/src/gpk-modal-dialog.c
+++ b/src/gpk-modal-dialog.c
@@ -633,13 +633,16 @@ gboolean
 gpk_modal_dialog_set_package_list (GpkModalDialog *dialog, const GPtrArray *list)
 {
 	GtkTreeIter iter;
-	const PkItemPackage *item;
+	PkPackage *item;
 	PkDesktop *desktop;
 	gchar *icon;
 	gchar *text;
 	guint i;
 	GtkWidget *widget;
 	gchar **split;
+	PkInfoEnum info;
+	gchar *package_id = NULL;
+	gchar *summary = NULL;
 
 	gtk_list_store_clear (dialog->priv->store);
 
@@ -654,16 +657,24 @@ gpk_modal_dialog_set_package_list (GpkModalDialog *dialog, const GPtrArray *list
 	/* add each well */
 	for (i=0; i<list->len; i++) {
 		item = g_ptr_array_index (list, i);
+		g_object_get (item,
+			      "info", &info,
+			      NULL);
 
 		/* not installed, so ignore icon */
-		if (item->info == PK_INFO_ENUM_DOWNLOADING ||
-		    item->info == PK_INFO_ENUM_CLEANUP)
+		if (info == PK_INFO_ENUM_DOWNLOADING ||
+		    info == PK_INFO_ENUM_CLEANUP)
 			continue;
 
-		text = gpk_package_id_format_twoline (item->package_id, item->summary);
+		g_object_get (item,
+			      "package-id", &package_id,
+			      "summary", &summary,
+			      NULL);
+
+		text = gpk_package_id_format_twoline (package_id, summary);
 
 		/* get the icon */
-		split = pk_package_id_split (item->package_id);
+		split = pk_package_id_split (package_id);
 		icon = gpk_desktop_guess_icon_name (desktop, split[0]);
 		if (icon == NULL)
 			icon = g_strdup (gpk_info_enum_to_icon_name (PK_INFO_ENUM_INSTALLED));
@@ -671,10 +682,12 @@ gpk_modal_dialog_set_package_list (GpkModalDialog *dialog, const GPtrArray *list
 		gtk_list_store_append (dialog->priv->store, &iter);
 		gtk_list_store_set (dialog->priv->store, &iter,
 				    GPK_MODAL_DIALOG_STORE_IMAGE, icon,
-				    GPK_MODAL_DIALOG_STORE_ID, item->package_id,
+				    GPK_MODAL_DIALOG_STORE_ID, package_id,
 				    GPK_MODAL_DIALOG_STORE_TEXT, text,
 				    -1);
 		g_strfreev (split);
+		g_free (package_id);
+		g_free (summary);
 		g_free (icon);
 		g_free (text);
 	}
@@ -904,7 +917,7 @@ gpk_modal_dialog_test (EggTest *test)
 	GtkResponseType button;
 	GpkModalDialog *dialog = NULL;
 	GPtrArray *array;
-	PkItemPackage *item;
+	PkPackage *item;
 
 	if (!egg_test_start (test, "GpkModalDialog"))
 		return;
@@ -918,10 +931,20 @@ gpk_modal_dialog_test (EggTest *test)
 		egg_test_failed (test, NULL);
 
 	/* set some packages */
-	array = g_ptr_array_new_with_free_func ((GDestroyNotify) pk_item_package_unref);
-	item = pk_item_package_new (PK_INFO_ENUM_INSTALLED, "totem;001;i386;fedora", "Totem is a music player for GNOME");
+	array = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
+	item = pk_package_new ();
+	g_object_set (item,
+		      "info", PK_INFO_ENUM_INSTALLED,
+		      "package-id", "totem;001;i386;fedora",
+		      "summary", "Totem is a music player for GNOME",
+		      NULL);
 	g_ptr_array_add (array, item);
-	item = pk_item_package_new (PK_INFO_ENUM_AVAILABLE, "totem;001;i386;fedora", "Amarok is a music player for KDE");
+	item = pk_package_new ();
+	g_object_set (item,
+		      "info", PK_INFO_ENUM_AVAILABLE,
+		      "package-id", "totem;001;i386;fedora",
+		      "summary", "Amarok is a music player for KDE",
+		      NULL);
 	g_ptr_array_add (array, item);
 	gpk_modal_dialog_set_package_list (dialog, array);
 	g_ptr_array_unref (array);
diff --git a/src/gpk-repo.c b/src/gpk-repo.c
index d37f8f6..c5c97f7 100644
--- a/src/gpk-repo.c
+++ b/src/gpk-repo.c
@@ -226,7 +226,7 @@ gpk_repo_repo_enable_cb (GObject *object, GAsyncResult *res, gpointer user_data)
 //	PkClient *client = PK_CLIENT (object);
 	GError *error = NULL;
 	PkResults *results = NULL;
-	PkItemErrorCode *error_item = NULL;
+	PkError *error_code = NULL;
 	GtkWindow *window;
 
 	/* get the results */
@@ -238,18 +238,18 @@ gpk_repo_repo_enable_cb (GObject *object, GAsyncResult *res, gpointer user_data)
 	}
 
 	/* check error code */
-	error_item = pk_results_get_error_code (results);
-	if (error_item != NULL) {
-		egg_warning ("failed to set repo: %s, %s", pk_error_enum_to_text (error_item->code), error_item->details);
+	error_code = pk_results_get_error_code (results);
+	if (error_code != NULL) {
+		egg_warning ("failed to set repo: %s, %s", pk_error_enum_to_text (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 		window = GTK_WINDOW (gtk_builder_get_object (builder, "dialog_repo"));
 		/* TRANSLATORS: for one reason or another, we could not enable or disable a software source */
 		gpk_error_dialog_modal (window, _("Failed to change status"),
-					gpk_error_enum_to_localised_text (error_item->code), error_item->details);
+					gpk_error_enum_to_localised_text (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 		goto out;
 	}
 out:
-	if (error_item != NULL)
-		pk_item_error_code_unref (error_item);
+	if (error_code != NULL)
+		g_object_unref (error_code);
 	if (results != NULL)
 		g_object_unref (results);
 }
@@ -354,14 +354,17 @@ gpk_repo_get_repo_list_cb (GObject *object, GAsyncResult *res, gpointer user_dat
 //	PkClient *client = PK_CLIENT (object);
 	GError *error = NULL;
 	PkResults *results = NULL;
-	PkItemErrorCode *error_item = NULL;
+	PkError *error_code = NULL;
 	GtkTreeView *treeview;
 	GtkTreeModel *model;
 	GtkWindow *window;
 	GPtrArray *array = NULL;
 	guint i;
-	const PkItemRepoDetail *item;
+	PkRepoDetail *item;
 	GtkTreeIter iter;
+	gchar *repo_id;
+	gchar *description;
+	gboolean enabled;
 
 	/* get the results */
 	results = pk_client_generic_finish (client, res, &error);
@@ -372,13 +375,13 @@ gpk_repo_get_repo_list_cb (GObject *object, GAsyncResult *res, gpointer user_dat
 	}
 
 	/* check error code */
-	error_item = pk_results_get_error_code (results);
-	if (error_item != NULL) {
-		egg_warning ("failed to get repo list: %s, %s", pk_error_enum_to_text (error_item->code), error_item->details);
+	error_code = pk_results_get_error_code (results);
+	if (error_code != NULL) {
+		egg_warning ("failed to get repo list: %s, %s", pk_error_enum_to_text (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 		window = GTK_WINDOW (gtk_builder_get_object (builder, "dialog_repo"));
 		/* TRANSLATORS: for one reason or another, we could not get the list of sources */
 		gpk_error_dialog_modal (window, _("Failed to get the list of sources"),
-					gpk_error_enum_to_localised_text (error_item->code), error_item->details);
+					gpk_error_enum_to_localised_text (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 		goto out;
 	}
 
@@ -388,15 +391,23 @@ gpk_repo_get_repo_list_cb (GObject *object, GAsyncResult *res, gpointer user_dat
 	array = pk_results_get_repo_detail_array (results);
 	for (i=0; i<array->len; i++) {
 		item = g_ptr_array_index (array, i);
-		egg_debug ("repo = %s:%s:%i", item->repo_id, item->description, item->enabled);
-		gpk_repo_model_get_iter (model, &iter, item->repo_id);
+		g_object_get (item,
+			      "repo-id", &repo_id,
+			      "description", &description,
+			      "enabled", &enabled,
+			      NULL);
+		egg_debug ("repo = %s:%s:%i", repo_id, description, enabled);
+		gpk_repo_model_get_iter (model, &iter, repo_id);
 		gtk_list_store_set (list_store, &iter,
-				    REPO_COLUMN_ENABLED, item->enabled,
-				    REPO_COLUMN_TEXT, item->description,
-				    REPO_COLUMN_ID, item->repo_id,
+				    REPO_COLUMN_ENABLED, enabled,
+				    REPO_COLUMN_TEXT, description,
+				    REPO_COLUMN_ID, repo_id,
 				    REPO_COLUMN_ACTIVE, TRUE,
 				    REPO_COLUMN_SENSITIVE, TRUE,
 				    -1);
+
+		g_free (repo_id);
+		g_free (description);
 	}
 
 	/* remove the items that are not now present */
@@ -405,8 +416,8 @@ gpk_repo_get_repo_list_cb (GObject *object, GAsyncResult *res, gpointer user_dat
 	/* sort */
 	gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE(list_store), REPO_COLUMN_TEXT, GTK_SORT_ASCENDING);
 out:
-	if (error_item != NULL)
-		pk_item_error_code_unref (error_item);
+	if (error_code != NULL)
+		g_object_unref (error_code);
 	if (array != NULL)
 		g_ptr_array_unref (array);
 	if (results != NULL)
diff --git a/src/gpk-service-pack.c b/src/gpk-service-pack.c
index dfbe7ba..6c8aef0 100644
--- a/src/gpk-service-pack.c
+++ b/src/gpk-service-pack.c
@@ -182,9 +182,9 @@ gpk_pack_resolve_package_id (const gchar *package)
 	gchar *package_id = NULL;
 	gchar **packages = NULL;
 	GError *error = NULL;
-	const PkItemPackage *item;
+	PkPackage *item;
 	PkResults *results;
-	PkItemErrorCode *error_item = NULL;
+	PkError *error_code = NULL;
 
 	/* get package array */
 	packages = g_strsplit (package, ";", 0);
@@ -196,9 +196,9 @@ gpk_pack_resolve_package_id (const gchar *package)
 	}
 
 	/* check error code */
-	error_item = pk_results_get_error_code (results);
-	if (error_item != NULL) {
-		egg_warning ("failed to resolve: %s, %s", pk_error_enum_to_text (error_item->code), error_item->details);
+	error_code = pk_results_get_error_code (results);
+	if (error_code != NULL) {
+		egg_warning ("failed to resolve: %s, %s", pk_error_enum_to_text (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 		goto out;
 	}
 
@@ -215,11 +215,11 @@ gpk_pack_resolve_package_id (const gchar *package)
 
 	/* convert to a text package id */
 	item = g_ptr_array_index (array, 0);
-	package_id = g_strdup (item->package_id);
+	package_id = g_strdup (pk_package_get_id (item));
 
 out:
-	if (error_item != NULL)
-		pk_item_error_code_unref (error_item);
+	if (error_code != NULL)
+		g_object_unref (error_code);
 	if (array != NULL)
 		g_ptr_array_unref (array);
 	if (results != NULL)
@@ -287,15 +287,24 @@ static gchar *
 gpk_pack_package_array_to_string (GPtrArray *array)
 {
 	guint i;
-	const PkItemPackage *item;
+	PkPackage *item;
 	GString *string;
+	PkInfoEnum info;
+	gchar *package_id = NULL;
+	gchar *summary = NULL;
 
 	string = g_string_new ("");
 	for (i=0; i<array->len; i++) {
 		item = g_ptr_array_index (array, i);
+		g_object_get (item,
+			      "info", &info,
+			      "package-id", &package_id,
+			      "summary", &summary,
+			      NULL);
 		g_string_append_printf (string, "%s\t%s\t%s\n",
-					pk_info_enum_to_text (item->info),
-					item->package_id, item->summary);
+					pk_info_enum_to_text (info), package_id, summary);
+		g_free (package_id);
+		g_free (summary);
 	}
 
 	/* remove trailing newline */
@@ -315,7 +324,7 @@ gpk_pack_copy_package_lists (const gchar *filename, GError **error)
 	GError *error_local = NULL;
 	PkResults *results;
 	gchar *data = NULL;
-	PkItemErrorCode *error_item = NULL;
+	PkError *error_code = NULL;
 
 	/* get package array */
 	results = pk_client_get_packages (client, pk_bitfield_value (PK_FILTER_ENUM_INSTALLED), NULL, NULL, NULL, &error_local);
@@ -327,9 +336,9 @@ gpk_pack_copy_package_lists (const gchar *filename, GError **error)
 	}
 
 	/* check error code */
-	error_item = pk_results_get_error_code (results);
-	if (error_item != NULL) {
-		egg_warning ("failed to get packages: %s, %s", pk_error_enum_to_text (error_item->code), error_item->details);
+	error_code = pk_results_get_error_code (results);
+	if (error_code != NULL) {
+		egg_warning ("failed to get packages: %s, %s", pk_error_enum_to_text (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 		goto out;
 	}
 
@@ -345,8 +354,8 @@ gpk_pack_copy_package_lists (const gchar *filename, GError **error)
 		goto out;
 	}
 out:
-	if (error_item != NULL)
-		pk_item_error_code_unref (error_item);
+	if (error_code != NULL)
+		g_object_unref (error_code);
 	if (array != NULL)
 		g_ptr_array_unref (array);
 	if (results != NULL)
@@ -484,7 +493,7 @@ gpk_pack_button_create_cb (GtkWidget *widget2, gpointer data)
 	gboolean ret;
 	gboolean use_default = FALSE;
 	GtkProgressBar *progress_bar;
-	PkItemErrorCode *error_item = NULL;
+	PkError *error_code = NULL;
 
 	widget = GTK_WIDGET (gtk_builder_get_object (builder, "filechooserbutton_directory"));
 	directory = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(widget));
@@ -559,9 +568,9 @@ gpk_pack_button_create_cb (GtkWidget *widget2, gpointer data)
 		}
 
 		/* check error code */
-		error_item = pk_results_get_error_code (results);
-		if (error_item != NULL) {
-			egg_warning ("failed to refresh cache: %s, %s", pk_error_enum_to_text (error_item->code), error_item->details);
+		error_code = pk_results_get_error_code (results);
+		if (error_code != NULL) {
+			egg_warning ("failed to refresh cache: %s, %s", pk_error_enum_to_text (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 			goto out;
 		}
 
@@ -594,8 +603,8 @@ gpk_pack_button_create_cb (GtkWidget *widget2, gpointer data)
 	g_object_unref (pack);
 
 out:
-	if (error_item != NULL)
-		pk_item_error_code_unref (error_item);
+	if (error_code != NULL)
+		g_object_unref (error_code);
 	g_strfreev (packages);
 	g_strfreev (package_ids);
 	g_strfreev (exclude_ids);
diff --git a/src/gpk-task.c b/src/gpk-task.c
index 78d0b64..39184df 100644
--- a/src/gpk-task.c
+++ b/src/gpk-task.c
@@ -182,10 +182,15 @@ static void
 gpk_task_key_question (PkTask *task, guint request, PkResults *results)
 {
 	GPtrArray *array;
-	const PkItemRepoSignatureRequired *item;
-	GpkTaskPrivate *priv = GPK_TASK(task)->priv;
 	GtkWidget *widget;
-	gchar *text;
+	gchar *printable = NULL;
+	gchar *package_id = NULL;
+	gchar *repository_name = NULL;
+	gchar *key_url = NULL;
+	gchar *key_userid = NULL;
+	gchar *key_id = NULL;
+	PkRepoSignatureRequired *item;
+	GpkTaskPrivate *priv = GPK_TASK(task)->priv;
 
 	/* save the current request */
 	priv->request = request;
@@ -199,21 +204,27 @@ gpk_task_key_question (PkTask *task, guint request, PkResults *results)
 
 	/* only one item supported */
 	item = g_ptr_array_index (array, 0);
+	g_object_get (item,
+		      "package-id", &package_id,
+		      "repository-name", &repository_name,
+		      "key-url", &key_url,
+		      "key-userid", &key_userid,
+		      "key-id", &key_id,
+		      NULL);
 
 	/* show correct text */
 	widget = GTK_WIDGET (gtk_builder_get_object (priv->builder_signature, "label_name"));
-	gtk_label_set_label (GTK_LABEL (widget), item->repository_name);
+	gtk_label_set_label (GTK_LABEL (widget), repository_name);
 	widget = GTK_WIDGET (gtk_builder_get_object (priv->builder_signature, "label_url"));
-	gtk_label_set_label (GTK_LABEL (widget), item->key_url);
+	gtk_label_set_label (GTK_LABEL (widget), key_url);
 	widget = GTK_WIDGET (gtk_builder_get_object (priv->builder_signature, "label_user"));
-	gtk_label_set_label (GTK_LABEL (widget), item->key_userid);
+	gtk_label_set_label (GTK_LABEL (widget), key_userid);
 	widget = GTK_WIDGET (gtk_builder_get_object (priv->builder_signature, "label_id"));
-	gtk_label_set_label (GTK_LABEL (widget), item->key_id);
+	gtk_label_set_label (GTK_LABEL (widget), key_id);
 
-	text = pk_package_id_to_printable (item->package_id);
+	printable = pk_package_id_to_printable (package_id);
 	widget = GTK_WIDGET (gtk_builder_get_object (priv->builder_signature, "label_package"));
-	gtk_label_set_label (GTK_LABEL (widget), text);
-	g_free (text);
+	gtk_label_set_label (GTK_LABEL (widget), printable);
 
 	/* show window */
 	priv->current_window = GTK_WINDOW(gtk_builder_get_object (priv->builder_signature, "dialog_gpg"));
@@ -226,6 +237,12 @@ gpk_task_key_question (PkTask *task, guint request, PkResults *results)
 	priv->help_id = "gpg-signature";
 	gtk_widget_show (GTK_WIDGET(priv->current_window));
 out:
+	g_free (printable);
+	g_free (package_id);
+	g_free (repository_name);
+	g_free (key_url);
+	g_free (key_userid);
+	g_free (key_id);
 	g_ptr_array_unref (array);
 }
 
@@ -236,12 +253,15 @@ static void
 gpk_task_eula_question (PkTask *task, guint request, PkResults *results)
 {
 	GPtrArray *array;
-	const PkItemEulaRequired *item;
-	GpkTaskPrivate *priv = GPK_TASK(task)->priv;
 	GtkWidget *widget;
 	GtkTextBuffer *buffer;
-	gchar *text;
-	gchar **split;
+	gchar *printable = NULL;
+	gchar **split = NULL;
+	PkEulaRequired *item;
+	gchar *package_id = NULL;
+	gchar *vendor_name = NULL;
+	gchar *license_agreement = NULL;
+	GpkTaskPrivate *priv = GPK_TASK(task)->priv;
 
 	/* save the current request */
 	priv->request = request;
@@ -255,17 +275,21 @@ gpk_task_eula_question (PkTask *task, guint request, PkResults *results)
 
 	/* only one item supported */
 	item = g_ptr_array_index (array, 0);
+	g_object_get (item,
+		      "package-id", &package_id,
+		      "vendor-name", &vendor_name,
+		      "license-agreement", &license_agreement,
+		      NULL);
 
 	/* title */
 	widget = GTK_WIDGET (gtk_builder_get_object (priv->builder_eula, "label_title"));
 
-	split = pk_package_id_split (item->package_id);
-	text = g_strdup_printf ("<b><big>License required for %s by %s</big></b>", split[0], item->vendor_name);
-	gtk_label_set_label (GTK_LABEL (widget), text);
-	g_free (text);
+	split = pk_package_id_split (package_id);
+	printable = g_strdup_printf ("<b><big>License required for %s by %s</big></b>", split[0], vendor_name);
+	gtk_label_set_label (GTK_LABEL (widget), printable);
 
 	buffer = gtk_text_buffer_new (NULL);
-	gtk_text_buffer_insert_at_cursor (buffer, item->license_agreement, strlen (item->license_agreement));
+	gtk_text_buffer_insert_at_cursor (buffer, license_agreement, strlen (license_agreement));
 	widget = GTK_WIDGET (gtk_builder_get_object (priv->builder_eula, "textview_details"));
 	gtk_text_view_set_buffer (GTK_TEXT_VIEW (widget), buffer);
 
@@ -284,8 +308,12 @@ gpk_task_eula_question (PkTask *task, guint request, PkResults *results)
 	gtk_widget_show (GTK_WIDGET(priv->current_window));
 
 	g_object_unref (buffer);
-	g_strfreev (split);
 out:
+	g_free (printable);
+	g_free (package_id);
+	g_free (vendor_name);
+	g_free (license_agreement);
+	g_strfreev (split);
 	g_ptr_array_unref (array);
 }
 
@@ -296,10 +324,13 @@ static void
 gpk_task_media_change_question (PkTask *task, guint request, PkResults *results)
 {
 	GPtrArray *array;
-	const PkItemMediaChangeRequired *item;
-	GpkTaskPrivate *priv = GPK_TASK(task)->priv;
+	PkMediaChangeRequired *item;
 	const gchar *name;
 	gchar *message = NULL;
+	gchar *media_id;
+	PkMediaTypeEnum media_type;
+	gchar *media_text;
+	GpkTaskPrivate *priv = GPK_TASK(task)->priv;
 
 	/* save the current request */
 	priv->request = request;
@@ -313,10 +344,15 @@ gpk_task_media_change_question (PkTask *task, guint request, PkResults *results)
 
 	/* only one item supported */
 	item = g_ptr_array_index (array, 0);
+	g_object_get (item,
+		      "media-id", &media_id,
+		      "media-type", &media_type,
+		      "media-text", &media_text,
+		      NULL);
 
-	name = gpk_media_type_enum_to_localised_text (item->media_type);
+	name = gpk_media_type_enum_to_localised_text (media_type);
 	/* TRANSLATORS: dialog body, explains to the user that they need to insert a disk to continue. The first replacement is DVD, CD etc */
-	message = g_strdup_printf (_("Additional media is required. Please insert the %s labeled '%s' to continue."), name, item->media_text);
+	message = g_strdup_printf (_("Additional media is required. Please insert the %s labeled '%s' to continue."), name, media_text);
 
 	priv->current_window = GTK_WINDOW (gtk_message_dialog_new (priv->parent_window, GTK_DIALOG_DESTROY_WITH_PARENT,
 								   /* TRANSLATORS: this is the window title when a new cd or dvd is required */
@@ -628,9 +664,7 @@ gpk_task_test_install_packages_cb (GObject *object, GAsyncResult *res, EggTest *
 	GError *error = NULL;
 	PkResults *results;
 	GPtrArray *packages;
-	const PkItemPackage *item;
-	guint i;
-	PkItemErrorCode *error_item = NULL;
+	PkError *error_code = NULL;
 
 	/* get the results */
 	results = pk_task_generic_finish (PK_TASK(task), res, &error);
@@ -641,27 +675,21 @@ gpk_task_test_install_packages_cb (GObject *object, GAsyncResult *res, EggTest *
 	}
 
 	/* check error code */
-	error_item = pk_results_get_error_code (results);
-	if (error_item != NULL)
-		egg_test_failed (test, "failed to resolve success: %s", error_item->details);
+	error_code = pk_results_get_error_code (results);
+	if (error_code != NULL)
+		egg_test_failed (test, "failed to resolve success: %s", pk_error_get_details (error_code));
 
 	packages = pk_results_get_package_array (results);
 	if (packages == NULL)
 		egg_test_failed (test, "no packages!");
 
-	/* list, just for shits and giggles */
-	for (i=0; i<packages->len; i++) {
-		item = g_ptr_array_index (packages, i);
-		egg_debug ("%s\t%s\t%s", pk_info_enum_to_text (item->info), item->package_id, item->summary);
-	}
-
-	if (packages->len != 3)
+	if (packages->len != 4)
 		egg_test_failed (test, "invalid number of packages: %i", packages->len);
 
 	g_ptr_array_unref (packages);
 out:
-	if (error_item != NULL)
-		pk_item_error_code_unref (error_item);
+	if (error_code != NULL)
+		g_object_unref (error_code);
 	if (results != NULL)
 		g_object_unref (results);
 	egg_test_loop_quit (test);
diff --git a/src/gpk-update-viewer.c b/src/gpk-update-viewer.c
index e58826d..a0883c4 100644
--- a/src/gpk-update-viewer.c
+++ b/src/gpk-update-viewer.c
@@ -292,23 +292,37 @@ static void
 gpk_update_viewer_check_blocked_packages (GpkUpdateViewer *update_viewer, GPtrArray *array)
 {
 	guint i;
-	const PkItemPackage *item;
+	PkPackage *item;
 	GString *string;
 	gboolean exists = FALSE;
 	gchar *text;
 	GtkWindow *window;
+	PkInfoEnum info;
+	gchar *package_id = NULL;
+	gchar *summary = NULL;
 
 	string = g_string_new ("");
 
 	/* find any that are blocked */
 	for (i=0;i<array->len;i++) {
 		item = g_ptr_array_index (array, i);
-		if (item->info == PK_INFO_ENUM_BLOCKED) {
-			text = gpk_package_id_format_oneline (item->package_id, item->summary);
+
+		/* get data */
+		g_object_get (item,
+			      "info", &info,
+			      "package-id", &package_id,
+			      "summary", &summary,
+			      NULL);
+
+		if (info == PK_INFO_ENUM_BLOCKED) {
+			text = gpk_package_id_format_oneline (package_id, summary);
 			g_string_append_printf (string, "%s\n", text);
 			g_free (text);
 			exists = TRUE;
 		}
+
+		g_free (package_id);
+		g_free (summary);
 	}
 
 	/* trim off extra newlines */
@@ -363,13 +377,11 @@ gpk_update_viewer_update_packages_cb (PkTask *task, GAsyncResult *res, GpkUpdate
 	PkResults *results;
 	GError *error = NULL;
 	GPtrArray *array = NULL;
-	PkItemPackage *item;
-	guint i;
 	GtkWidget *dialog;
 	GtkWidget *widget;
 	PkRestartEnum restart;
 	gchar *text;
-	PkItemErrorCode *error_item = NULL;
+	PkError *error_code = NULL;
 	GtkWindow *window;
 	gboolean ret;
 	const gchar *message;
@@ -394,9 +406,9 @@ gpk_update_viewer_update_packages_cb (PkTask *task, GAsyncResult *res, GpkUpdate
 	}
 
 	/* check error code */
-	error_item = pk_results_get_error_code (results);
-	if (error_item != NULL) {
-		egg_warning ("failed to update packages: %s, %s", pk_error_enum_to_text (error_item->code), error_item->details);
+	error_code = pk_results_get_error_code (results);
+	if (error_code != NULL) {
+		egg_warning ("failed to update packages: %s, %s", pk_error_enum_to_text (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 
 		/* failed sound, using sounds from the naming spec */
 		ca_context_play (ca_gtk_context_get (), 0,
@@ -407,8 +419,8 @@ gpk_update_viewer_update_packages_cb (PkTask *task, GAsyncResult *res, GpkUpdate
 				 CA_PROP_EVENT_DESCRIPTION, _("Failed to update"), NULL);
 
 		window = GTK_WINDOW(gtk_builder_get_object (priv->builder, "dialog_updates"));
-		gpk_error_dialog_modal (window, gpk_error_enum_to_localised_text (error_item->code),
-					gpk_error_enum_to_localised_message (error_item->code), error_item->details);
+		gpk_error_dialog_modal (window, gpk_error_enum_to_localised_text (pk_error_get_code (error_code)),
+					gpk_error_enum_to_localised_message (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 
 		/* re-enable the package list */
 		gpk_update_viewer_undisable_packages (update_viewer);
@@ -422,13 +434,6 @@ gpk_update_viewer_update_packages_cb (PkTask *task, GAsyncResult *res, GpkUpdate
 
 	gpk_update_viewer_undisable_packages (update_viewer);
 
-	/* get blocked data */
-	array = pk_results_get_package_array (results);
-	for (i=0; i<array->len; i++) {
-		item = g_ptr_array_index (array, i);
-		egg_debug ("updated %s:%s", pk_info_enum_to_text (item->info), item->package_id);
-	}
-
 	/* TODO: use ca_gtk_context_get_for_screen to allow use of GDK_MULTIHEAD_SAFE */
 
 	/* play the sound, using sounds from the naming spec */
@@ -505,8 +510,8 @@ out:
 	/* no longer updating */
 	priv->ignore_updates_changed = FALSE;
 
-	if (error_item != NULL)
-		pk_item_error_code_unref (error_item);
+	if (error_code != NULL)
+		g_object_unref (error_code);
 	if (array != NULL)
 		g_ptr_array_unref (array);
 	if (results != NULL)
@@ -1565,7 +1570,7 @@ gpk_update_viewer_get_uris (const gchar *url_string)
  * gpk_update_viewer_populate_details:
  **/
 static void
-gpk_update_viewer_populate_details (GpkUpdateViewer *update_viewer, const PkItemUpdateDetail *item)
+gpk_update_viewer_populate_details (GpkUpdateViewer *update_viewer, PkUpdateDetail *item)
 {
 	GtkTreeView *treeview;
 	GtkTreeSelection *selection;
@@ -1576,12 +1581,38 @@ gpk_update_viewer_populate_details (GpkUpdateViewer *update_viewer, const PkItem
 	gchar *line;
 	gchar *line2;
 	const gchar *title;
+	GtkTextIter iter;
+	gboolean has_update_text = FALSE;
+	gchar *package_id;
+	gchar *updates;
+	gchar *obsoletes;
+	gchar *vendor_url;
+	gchar *bugzilla_url;
+	gchar *cve_url;
+	PkRestartEnum restart;
+	gchar *update_text;
+	gchar *changelog;
+	PkUpdateStateEnum state;
 	gchar *issued;
 	gchar *updated;
-	GtkTextIter iter;
-	gboolean update_text = FALSE;
 	GpkUpdateViewerPrivate *priv = update_viewer->priv;
 
+	/* get data */
+	g_object_get (item,
+		      "package-id", &package_id,
+		      "updates", &updates,
+		      "obsoletes", &obsoletes,
+		      "vendor-url", &vendor_url,
+		      "bugzilla-url", &bugzilla_url,
+		      "cve-url", &cve_url,
+		      "restart", &restart,
+		      "update-text", &update_text,
+		      "changelog", &changelog,
+		      "state", &state,
+		      "issued", &issued,
+		      "updated", &updated,
+		      NULL);
+
 	/* get info  */
 	treeview = GTK_TREE_VIEW(gtk_builder_get_object (priv->builder, "treeview_updates"));
 	selection = gtk_tree_view_get_selection (treeview);
@@ -1618,57 +1649,51 @@ gpk_update_viewer_populate_details (GpkUpdateViewer *update_viewer, const PkItem
 	}
 
 	/* issued and updated */
-	if (item->issued != NULL && item->updated != NULL) {
-		issued = pk_iso8601_from_date (item->issued);
-		updated = pk_iso8601_from_date (item->updated);
+	if (issued != NULL && issued[0] != '\0' && updated != NULL && updated[0] != '\0') {
 		/* TRANSLATORS: this is when the notification was issued and then updated*/
 		line = g_strdup_printf (_("This notification was issued on %s and last updated on %s."), issued, updated);
 		gtk_text_buffer_insert_with_tags_by_name (priv->text_buffer, &iter, line, -1, "para", NULL);
 		gtk_text_buffer_insert (priv->text_buffer, &iter, "\n", -1);
-		g_free (issued);
-		g_free (updated);
 		g_free (line);
-	} else if (item->issued != NULL) {
-		issued = pk_iso8601_from_date (item->issued);
+	} else if (issued != NULL && issued[0] != '\0') {
 		/* TRANSLATORS: this is when the update was issued */
 		line = g_strdup_printf (_("This notification was issued on %s."), issued);
 		gtk_text_buffer_insert_with_tags_by_name (priv->text_buffer, &iter, line, -1, "para", NULL);
 		gtk_text_buffer_insert (priv->text_buffer, &iter, "\n", -1);
-		g_free (issued);
 		g_free (line);
 	}
 
 	/* update text */
-	if (!egg_strzero (item->update_text)) {
+	if (!egg_strzero (update_text)) {
 		/* convert the bullets */
-		line = egg_markdown_parse (priv->markdown, item->update_text);
+		line = egg_markdown_parse (priv->markdown, update_text);
 		if (!egg_strzero (line)) {
 			gtk_text_buffer_insert_markup (priv->text_buffer, &iter, line);
 			gtk_text_buffer_insert (priv->text_buffer, &iter, "\n\n", -1);
-			update_text = TRUE;
+			has_update_text = TRUE;
 		}
 		g_free (line);
 	}
 
 	/* add all the links */
-	if (!egg_strzero (item->vendor_url)) {
-		array = gpk_update_viewer_get_uris (item->vendor_url);
+	if (!egg_strzero (vendor_url)) {
+		array = gpk_update_viewer_get_uris (vendor_url);
 		/* TRANSLATORS: this is a array of vendor URLs */
 		title = ngettext ("For more information about this update please visit this website:",
 				  "For more information about this update please visit these websites:", array->len);
 		gpk_update_viewer_add_description_link_item (priv->text_buffer, &iter, title, array);
 		g_ptr_array_unref (array);
 	}
-	if (!egg_strzero (item->bugzilla_url)) {
-		array = gpk_update_viewer_get_uris (item->bugzilla_url);
+	if (!egg_strzero (bugzilla_url)) {
+		array = gpk_update_viewer_get_uris (bugzilla_url);
 		/* TRANSLATORS: this is a array of bugzilla URLs */
 		title = ngettext ("For more information about bugs fixed by this update please visit this website:",
 				  "For more information about bugs fixed by this update please visit these websites:", array->len);
 		gpk_update_viewer_add_description_link_item (priv->text_buffer, &iter, title, array);
 		g_ptr_array_unref (array);
 	}
-	if (!egg_strzero (item->cve_url)) {
-		array = gpk_update_viewer_get_uris (item->cve_url);
+	if (!egg_strzero (cve_url)) {
+		array = gpk_update_viewer_get_uris (cve_url);
 		/* TRANSLATORS: this is a array of CVE (security) URLs */
 		title = ngettext ("For more information about this security update please visit this website:",
 				  "For more information about this security update please visit these websites:", array->len);
@@ -1677,30 +1702,30 @@ gpk_update_viewer_populate_details (GpkUpdateViewer *update_viewer, const PkItem
 	}
 
 	/* reboot */
-	if (item->restart == PK_RESTART_ENUM_SYSTEM) {
+	if (restart == PK_RESTART_ENUM_SYSTEM) {
 		/* TRANSLATORS: reboot required */
 		gtk_text_buffer_insert_with_tags_by_name (priv->text_buffer, &iter, _("The computer will have to be restarted after the update for the changes to take effect."), -1, "para", NULL);
 		gtk_text_buffer_insert (priv->text_buffer, &iter, "\n", -1);
-	} else if (item->restart == PK_RESTART_ENUM_SESSION) {
+	} else if (restart == PK_RESTART_ENUM_SESSION) {
 		/* TRANSLATORS: log out required */
 		gtk_text_buffer_insert_with_tags_by_name (priv->text_buffer, &iter, _("You will need to log out and back in after the update for the changes to take effect."), -1, "para", NULL);
 		gtk_text_buffer_insert (priv->text_buffer, &iter, "\n", -1);
 	}
 
 	/* state */
-	if (item->state == PK_UPDATE_STATE_ENUM_UNSTABLE) {
+	if (state == PK_UPDATE_STATE_ENUM_UNSTABLE) {
 		/* TRANSLATORS: this is the stability status of the update */
 		gtk_text_buffer_insert_with_tags_by_name (priv->text_buffer, &iter, _("The classifaction of this update is unstable which means it is not designed for production use."), -1, "para", NULL);
 		gtk_text_buffer_insert (priv->text_buffer, &iter, "\n", -1);
-	} else if (item->state == PK_UPDATE_STATE_ENUM_TESTING) {
+	} else if (state == PK_UPDATE_STATE_ENUM_TESTING) {
 		/* TRANSLATORS: this is the stability status of the update */
 		gtk_text_buffer_insert_with_tags_by_name (priv->text_buffer, &iter, _("This is a test update, and is not designed for normal use. Please report any problems or regressions you encounter."), -1, "para", NULL);
 		gtk_text_buffer_insert (priv->text_buffer, &iter, "\n", -1);
 	}
 
 	/* only show changelog if we didn't have any update text */
-	if (!update_text && !egg_strzero (item->changelog)) {
-		line = egg_markdown_parse (priv->markdown, item->changelog);
+	if (!has_update_text && !egg_strzero (changelog)) {
+		line = egg_markdown_parse (priv->markdown, changelog);
 		if (!egg_strzero (line)) {
 			/* TRANSLATORS: this is a ChangeLog */
 			line2 = g_strdup_printf ("%s\n%s\n", _("The developer logs will be shown as no description is available for this update:"), line);
@@ -1709,6 +1734,17 @@ gpk_update_viewer_populate_details (GpkUpdateViewer *update_viewer, const PkItem
 		}
 		g_free (line);
 	}
+
+	g_free (package_id);
+	g_free (updates);
+	g_free (obsoletes);
+	g_free (vendor_url);
+	g_free (bugzilla_url);
+	g_free (cve_url);
+	g_free (update_text);
+	g_free (changelog);
+	g_free (issued);
+	g_free (updated);
 }
 
 /**
@@ -1720,7 +1756,7 @@ gpk_packages_treeview_clicked_cb (GtkTreeSelection *selection, GpkUpdateViewer *
 	GtkTreeModel *model;
 	GtkTreeIter iter;
 	gchar *package_id;
-	PkItemUpdateDetail *item = NULL;
+	PkUpdateDetail *item = NULL;
 
 	/* This will only work in single or browse selection mode! */
 	if (gtk_tree_selection_get_selected (selection, &model, &iter)) {
@@ -1749,15 +1785,17 @@ gpk_update_viewer_get_details_cb (PkClient *client, GAsyncResult *res, GpkUpdate
 	PkResults *results;
 	GError *error = NULL;
 	GPtrArray *array = NULL;
-	PkItemDetails *item;
+	PkDetails *item;
 	guint i;
+	guint64 size;
+	gchar *package_id;
 	GtkWidget *widget;
 	GtkTreePath *path;
 	GtkTreeModel *model;
 	GtkTreeSelection *selection;
 	GtkTreeView *treeview;
 	GtkTreeIter iter;
-	PkItemErrorCode *error_item = NULL;
+	PkError *error_code = NULL;
 	GtkWindow *window;
 	GpkUpdateViewerPrivate *priv = update_viewer->priv;
 
@@ -1770,13 +1808,13 @@ gpk_update_viewer_get_details_cb (PkClient *client, GAsyncResult *res, GpkUpdate
 	}
 
 	/* check error code */
-	error_item = pk_results_get_error_code (results);
-	if (error_item != NULL) {
-		egg_warning ("failed to get details: %s, %s", pk_error_enum_to_text (error_item->code), error_item->details);
+	error_code = pk_results_get_error_code (results);
+	if (error_code != NULL) {
+		egg_warning ("failed to get details: %s, %s", pk_error_enum_to_text (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 
 		window = GTK_WINDOW(gtk_builder_get_object (priv->builder, "dialog_updates"));
-		gpk_error_dialog_modal (window, gpk_error_enum_to_localised_text (error_item->code),
-					gpk_error_enum_to_localised_message (error_item->code), error_item->details);
+		gpk_error_dialog_modal (window, gpk_error_enum_to_localised_text (pk_error_get_code (error_code)),
+					gpk_error_enum_to_localised_message (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 		goto out;
 	}
 
@@ -1788,23 +1826,29 @@ gpk_update_viewer_get_details_cb (PkClient *client, GAsyncResult *res, GpkUpdate
 	for (i=0; i<array->len; i++) {
 		item = g_ptr_array_index (array, i);
 
-		path = gpk_update_viewer_model_get_path (model, item->package_id);
+		/* get data */
+		g_object_get (item,
+			      "package-id", &package_id,
+			      "size", &size,
+			      NULL);
+
+		path = gpk_update_viewer_model_get_path (model, package_id);
 		if (path == NULL) {
 			egg_debug ("not found ID for details");
-			return;
-		}
-
-		gtk_tree_model_get_iter (model, &iter, path);
-		gtk_tree_path_free (path);
-		gtk_list_store_set (priv->array_store_updates, &iter,
-				    GPK_UPDATES_COLUMN_DETAILS_OBJ, (gpointer) pk_item_details_ref (item),
-				    GPK_UPDATES_COLUMN_SIZE, (gint)item->size,
-				    GPK_UPDATES_COLUMN_SIZE_DISPLAY, (gint)item->size,
-				    -1);
-		/* in cache */
-		if (item->size == 0)
+		} else {
+			gtk_tree_model_get_iter (model, &iter, path);
+			gtk_tree_path_free (path);
 			gtk_list_store_set (priv->array_store_updates, &iter,
-					    GPK_UPDATES_COLUMN_STATUS, GPK_INFO_ENUM_DOWNLOADED, -1);
+					    GPK_UPDATES_COLUMN_DETAILS_OBJ, (gpointer) g_object_ref (item),
+					    GPK_UPDATES_COLUMN_SIZE, (gint)size,
+					    GPK_UPDATES_COLUMN_SIZE_DISPLAY, (gint)size,
+					    -1);
+			/* in cache */
+			if (size == 0)
+				gtk_list_store_set (priv->array_store_updates, &iter,
+						    GPK_UPDATES_COLUMN_STATUS, GPK_INFO_ENUM_DOWNLOADED, -1);
+		}
+		g_free (package_id);
 	}
 
 	/* select the first entry in the updates array now we've got data */
@@ -1818,8 +1862,8 @@ gpk_update_viewer_get_details_cb (PkClient *client, GAsyncResult *res, GpkUpdate
 	/* set info */
 	gpk_update_viewer_reconsider_info (update_viewer);
 out:
-	if (error_item != NULL)
-		pk_item_error_code_unref (error_item);
+	if (error_code != NULL)
+		g_object_unref (error_code);
 	if (array != NULL)
 		g_ptr_array_unref (array);
 	if (results != NULL)
@@ -1835,14 +1879,16 @@ gpk_update_viewer_get_update_detail_cb (PkClient *client, GAsyncResult *res, Gpk
 	PkResults *results;
 	GError *error = NULL;
 	GPtrArray *array = NULL;
-	PkItemUpdateDetail *item;
+	PkUpdateDetail *item;
 	guint i;
 	GtkTreeView *treeview;
 	GtkTreeModel *model;
 	GtkTreeIter iter;
 	GtkTreePath *path;
-	PkItemErrorCode *error_item = NULL;
+	PkError *error_code = NULL;
 	GtkWindow *window;
+	gchar *package_id;
+	PkRestartEnum restart;
 	GpkUpdateViewerPrivate *priv = update_viewer->priv;
 
 	/* get the results */
@@ -1854,13 +1900,13 @@ gpk_update_viewer_get_update_detail_cb (PkClient *client, GAsyncResult *res, Gpk
 	}
 
 	/* check error code */
-	error_item = pk_results_get_error_code (results);
-	if (error_item != NULL) {
-		egg_warning ("failed to get update details: %s, %s", pk_error_enum_to_text (error_item->code), error_item->details);
+	error_code = pk_results_get_error_code (results);
+	if (error_code != NULL) {
+		egg_warning ("failed to get update details: %s, %s", pk_error_enum_to_text (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 
 		window = GTK_WINDOW(gtk_builder_get_object (priv->builder, "dialog_updates"));
-		gpk_error_dialog_modal (window, gpk_error_enum_to_localised_text (error_item->code),
-					gpk_error_enum_to_localised_message (error_item->code), error_item->details);
+		gpk_error_dialog_modal (window, gpk_error_enum_to_localised_text (pk_error_get_code (error_code)),
+					gpk_error_enum_to_localised_message (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 		goto out;
 	}
 
@@ -1870,21 +1916,28 @@ gpk_update_viewer_get_update_detail_cb (PkClient *client, GAsyncResult *res, Gpk
 	array = pk_results_get_update_detail_array (results);
 	for (i=0; i<array->len; i++) {
 		item = g_ptr_array_index (array, i);
-		path = gpk_update_viewer_model_get_path (model, item->package_id);
+
+		/* get data */
+		g_object_get (item,
+			      "package-id", &package_id,
+			      "restart", &restart,
+			      NULL);
+
+		path = gpk_update_viewer_model_get_path (model, package_id);
 		if (path == NULL) {
 			egg_warning ("not found ID for update detail");
-			continue;
+		} else {
+			gtk_tree_model_get_iter (model, &iter, path);
+			gtk_tree_path_free (path);
+			gtk_list_store_set (priv->array_store_updates, &iter,
+					    GPK_UPDATES_COLUMN_UPDATE_DETAIL_OBJ, (gpointer) g_object_ref (item),
+					    GPK_UPDATES_COLUMN_RESTART, restart, -1);
 		}
-
-		gtk_tree_model_get_iter (model, &iter, path);
-		gtk_tree_path_free (path);
-		gtk_list_store_set (priv->array_store_updates, &iter,
-				    GPK_UPDATES_COLUMN_UPDATE_DETAIL_OBJ, (gpointer) pk_item_update_detail_ref (item),
-				    GPK_UPDATES_COLUMN_RESTART, item->restart, -1);
+		g_free (package_id);
 	}
 out:
-	if (error_item != NULL)
-		pk_item_error_code_unref (error_item);
+	if (error_code != NULL)
+		g_object_unref (error_code);
 	if (array != NULL)
 		g_ptr_array_unref (array);
 	if (results != NULL)
@@ -2124,12 +2177,14 @@ gpk_update_viewer_packages_to_ids (GPtrArray *array)
 {
 	guint i;
 	gchar **value;
-	PkItemPackage *item;
+	PkPackage *item;
+	const gchar *package_id;
 
 	value = g_new0 (gchar *, array->len + 1);
 	for (i=0; i<array->len; i++) {
 		item = g_ptr_array_index (array, i);
-		value[i] = g_strdup (item->package_id);
+		package_id = pk_package_get_id (item);
+		value[i] = g_strdup (package_id);
 	}
 	return value;
 }
@@ -2143,7 +2198,7 @@ gpk_update_viewer_get_updates_cb (PkClient *client, GAsyncResult *res, GpkUpdate
 	PkResults *results;
 	GError *error = NULL;
 	GPtrArray *array = NULL;
-	PkItemPackage *item;
+	PkPackage *item;
 	gchar *text = NULL;
 	gboolean selected;
 	GtkTreeIter iter;
@@ -2152,8 +2207,11 @@ gpk_update_viewer_get_updates_cb (PkClient *client, GAsyncResult *res, GpkUpdate
 	GtkTreeView *treeview;
 	GtkTreeModel *model;
 	GtkWidget *widget;
-	PkItemErrorCode *error_item = NULL;
+	PkError *error_code = NULL;
 	GtkWindow *window;
+	PkInfoEnum info;
+	gchar *package_id = NULL;
+	gchar *summary = NULL;
 	GpkUpdateViewerPrivate *priv = update_viewer->priv;
 
 	/* get the results */
@@ -2165,13 +2223,13 @@ gpk_update_viewer_get_updates_cb (PkClient *client, GAsyncResult *res, GpkUpdate
 	}
 
 	/* check error code */
-	error_item = pk_results_get_error_code (results);
-	if (error_item != NULL) {
-		egg_warning ("failed to get updates: %s, %s", pk_error_enum_to_text (error_item->code), error_item->details);
+	error_code = pk_results_get_error_code (results);
+	if (error_code != NULL) {
+		egg_warning ("failed to get updates: %s, %s", pk_error_enum_to_text (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 
 		window = GTK_WINDOW(gtk_builder_get_object (priv->builder, "dialog_updates"));
-		gpk_error_dialog_modal (window, gpk_error_enum_to_localised_text (error_item->code),
-					gpk_error_enum_to_localised_message (error_item->code), error_item->details);
+		gpk_error_dialog_modal (window, gpk_error_enum_to_localised_text (pk_error_get_code (error_code)),
+					gpk_error_enum_to_localised_message (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 		goto out;
 	}
 
@@ -2180,15 +2238,22 @@ gpk_update_viewer_get_updates_cb (PkClient *client, GAsyncResult *res, GpkUpdate
 	for (i=0; i<array->len; i++) {
 		item = g_ptr_array_index (array, i);
 
+		/* get data */
+		g_object_get (item,
+			      "info", &info,
+			      "package-id", &package_id,
+			      "summary", &summary,
+			      NULL);
+
 		/* add to array store */
-		text = gpk_package_id_format_twoline (item->package_id, item->summary);
-		egg_debug ("adding: id=%s, text=%s", item->package_id, text);
-		selected = (item->info != PK_INFO_ENUM_BLOCKED);
+		text = gpk_package_id_format_twoline (package_id, summary);
+		egg_debug ("adding: id=%s, text=%s", package_id, text);
+		selected = (info != PK_INFO_ENUM_BLOCKED);
 		gtk_list_store_append (priv->array_store_updates, &iter);
 		gtk_list_store_set (priv->array_store_updates, &iter,
 				    GPK_UPDATES_COLUMN_TEXT, text,
-				    GPK_UPDATES_COLUMN_ID, item->package_id,
-				    GPK_UPDATES_COLUMN_INFO, item->info,
+				    GPK_UPDATES_COLUMN_ID, package_id,
+				    GPK_UPDATES_COLUMN_INFO, info,
 				    GPK_UPDATES_COLUMN_SELECT, selected,
 				    GPK_UPDATES_COLUMN_SENSITIVE, selected,
 				    GPK_UPDATES_COLUMN_CLICKABLE, selected,
@@ -2200,6 +2265,8 @@ gpk_update_viewer_get_updates_cb (PkClient *client, GAsyncResult *res, GpkUpdate
 				    GPK_UPDATES_COLUMN_PULSE, -1,
 				    -1);
 		g_free (text);
+		g_free (package_id);
+		g_free (summary);
 	}
 
 	/* get the download sizes */
@@ -2237,8 +2304,8 @@ gpk_update_viewer_get_updates_cb (PkClient *client, GAsyncResult *res, GpkUpdate
 	gpk_update_viewer_reconsider_info (update_viewer);
 
 out:
-	if (error_item != NULL)
-		pk_item_error_code_unref (error_item);
+	if (error_code != NULL)
+		g_object_unref (error_code);
 	if (array != NULL)
 		g_ptr_array_unref (array);
 	if (results != NULL)
@@ -2504,16 +2571,23 @@ gpk_update_viewer_search_equal_func (GtkTreeModel *model, gint column, const gch
 /**
  * gpk_update_viewer_get_distro_upgrades_best:
  **/
-static PkItemDistroUpgrade *
+static PkDistroUpgrade *
 gpk_update_viewer_get_distro_upgrades_best (GPtrArray *array)
 {
-	PkItemDistroUpgrade *item;
+	PkDistroUpgrade *item;
 	guint i;
+	PkDistroUpgradeEnum state;
 
 	/* find a stable update */
 	for (i=0; i<array->len; i++) {
 		item = g_ptr_array_index (array, i);
-		if (item->state == PK_UPDATE_STATE_ENUM_STABLE)
+
+		/* get data */
+		g_object_get (item,
+			      "state", &state,
+			      NULL);
+
+		if (state == PK_UPDATE_STATE_ENUM_STABLE)
 			goto out;
 	}
 	item = NULL;
@@ -2530,11 +2604,12 @@ gpk_update_viewer_get_distro_upgrades_cb (PkClient *client, GAsyncResult *res, G
 	PkResults *results;
 	GError *error = NULL;
 	GPtrArray *array = NULL;
-	PkItemDistroUpgrade *item;
+	PkDistroUpgrade *item;
 	gchar *text = NULL;
 	gchar *text_format = NULL;
+	gchar *summary = NULL;
 	GtkWidget *widget;
-	PkItemErrorCode *error_item = NULL;
+	PkError *error_code = NULL;
 	GtkWindow *window;
 	GpkUpdateViewerPrivate *priv = update_viewer->priv;
 
@@ -2547,13 +2622,13 @@ gpk_update_viewer_get_distro_upgrades_cb (PkClient *client, GAsyncResult *res, G
 	}
 
 	/* check error code */
-	error_item = pk_results_get_error_code (results);
-	if (error_item != NULL) {
-		egg_warning ("failed to get list of distro upgrades: %s, %s", pk_error_enum_to_text (error_item->code), error_item->details);
+	error_code = pk_results_get_error_code (results);
+	if (error_code != NULL) {
+		egg_warning ("failed to get list of distro upgrades: %s, %s", pk_error_enum_to_text (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 
 		window = GTK_WINDOW(gtk_builder_get_object (priv->builder, "dialog_updates"));
-		gpk_error_dialog_modal (window, gpk_error_enum_to_localised_text (error_item->code),
-					gpk_error_enum_to_localised_message (error_item->code), error_item->details);
+		gpk_error_dialog_modal (window, gpk_error_enum_to_localised_text (pk_error_get_code (error_code)),
+					gpk_error_enum_to_localised_message (pk_error_get_code (error_code)), pk_error_get_details (error_code));
 		goto out;
 	}
 
@@ -2563,10 +2638,16 @@ gpk_update_viewer_get_distro_upgrades_cb (PkClient *client, GAsyncResult *res, G
 	if (item == NULL)
 		goto out;
 
+
+	/* get data */
+	g_object_get (item,
+		      "summary", &summary,
+		      NULL);
+
 	/* only display last (newest) distro */
 	widget = GTK_WIDGET(gtk_builder_get_object (priv->builder, "label_upgrade"));
 	/* TRANSLATORS: new distro available, e.g. F9 to F10 */
-	text = g_strdup_printf (_("New distribution upgrade release '%s' is available"), item->summary);
+	text = g_strdup_printf (_("New distribution upgrade release '%s' is available"), summary);
 	text_format = g_strdup_printf ("<b>%s</b>", text);
 	gtk_label_set_label (GTK_LABEL(widget), text_format);
 
@@ -2576,10 +2657,11 @@ gpk_update_viewer_get_distro_upgrades_cb (PkClient *client, GAsyncResult *res, G
 	/* get model */
 	gpk_update_viewer_reconsider_info (update_viewer);
 out:
+	g_free (summary);
 	g_free (text);
 	g_free (text_format);
-	if (error_item != NULL)
-		pk_item_error_code_unref (error_item);
+	if (error_code != NULL)
+		g_object_unref (error_code);
 	if (array != NULL)
 		g_ptr_array_unref (array);
 	if (results != NULL)
diff --git a/src/gpk-watch.c b/src/gpk-watch.c
index da95639..de9b97f 100644
--- a/src/gpk-watch.c
+++ b/src/gpk-watch.c
@@ -1282,28 +1282,36 @@ out:
  * pk_watch_process_messages_cb:
  **/
 static void
-pk_watch_process_messages_cb (PkItemMessage *item, GpkWatch *watch)
+pk_watch_process_messages_cb (PkMessage *item, GpkWatch *watch)
 {
 	gboolean ret;
 	GError *error = NULL;
 	gboolean value;
 	NotifyNotification *notification;
 	GpkWatchCachedMessage *cached_message;
+	PkMessageEnum type;
+	gchar *details;
 
 	g_return_if_fail (GPK_IS_WATCH (watch));
 
+	/* get data */
+	g_object_get (item,
+		      "type", &type,
+		      "details", &details,
+		      NULL);
+
 	/* is ignored */
-	ret = gpk_watch_is_message_ignored (watch, item->type);
+	ret = gpk_watch_is_message_ignored (watch, type);
 	if (ret) {
 		egg_debug ("ignoring message");
-		return;
+		goto out;
 	}
 
 	/* add to list */
 	cached_message = g_new0 (GpkWatchCachedMessage, 1);
-	cached_message->type = item->type;
+	cached_message->type = type;
 	cached_message->tid = NULL;
-	cached_message->details = g_strdup (item->details);
+	cached_message->details = g_strdup (details);
 	g_ptr_array_add (watch->priv->cached_messages, cached_message);
 
 	/* close existing */
@@ -1320,7 +1328,7 @@ pk_watch_process_messages_cb (PkItemMessage *item, GpkWatch *watch)
 	value = gconf_client_get_bool (watch->priv->gconf_client, GPK_CONF_NOTIFY_MESSAGE, NULL);
 	if (!value) {
 		egg_debug ("not showing notification as prevented in gconf");
-		return;
+		goto out;
 	}
 
 	/* do the bubble */
@@ -1333,13 +1341,15 @@ pk_watch_process_messages_cb (PkItemMessage *item, GpkWatch *watch)
 		g_error_free (error);
 	}
 	watch->priv->notification_cached_messages = notification;
+out:
+	g_free (details);
 }
 
 /**
  * pk_watch_process_error_code:
  **/
 static void
-pk_watch_process_error_code (GpkWatch *watch, PkItemErrorCode *item)
+pk_watch_process_error_code (GpkWatch *watch, PkError *error_code)
 {
 	gboolean ret;
 	GError *error = NULL;
@@ -1348,17 +1358,19 @@ pk_watch_process_error_code (GpkWatch *watch, PkItemErrorCode *item)
 	const gchar *message;
 	gboolean value;
 	NotifyNotification *notification;
+	PkErrorEnum code;
 
 	g_return_if_fail (GPK_IS_WATCH (watch));
 
-	title = gpk_error_enum_to_localised_text (item->code);
+	code = pk_error_get_code (error_code);
+	title = gpk_error_enum_to_localised_text (code);
 
 	/* ignore some errors */
-	if (item->code == PK_ERROR_ENUM_NOT_SUPPORTED ||
-	    item->code == PK_ERROR_ENUM_NO_NETWORK ||
-	    item->code == PK_ERROR_ENUM_PROCESS_KILL ||
-	    item->code == PK_ERROR_ENUM_TRANSACTION_CANCELLED) {
-		egg_debug ("error ignored %s%s", title, item->details);
+	if (code == PK_ERROR_ENUM_NOT_SUPPORTED ||
+	    code == PK_ERROR_ENUM_NO_NETWORK ||
+	    code == PK_ERROR_ENUM_PROCESS_KILL ||
+	    code == PK_ERROR_ENUM_TRANSACTION_CANCELLED) {
+		egg_debug ("error ignored %s%s", title, pk_error_get_details (error_code));
 		goto out;
 	}
 
@@ -1370,11 +1382,11 @@ pk_watch_process_error_code (GpkWatch *watch, PkItemErrorCode *item)
 	}
 
 	/* we need to format this */
-	message = gpk_error_enum_to_localised_message (item->code);
+	message = gpk_error_enum_to_localised_message (code);
 
 	/* save this globally */
 	g_free (watch->priv->error_details);
-	watch->priv->error_details = g_markup_escape_text (item->details, -1);
+	watch->priv->error_details = g_markup_escape_text (pk_error_get_details (error_code), -1);
 
 	/* TRANSLATORS: Prefix to the title shown in the libnotify popup */
 	title_prefix = g_strdup_printf ("%s: %s", _("Package Manager"), title);
@@ -1400,20 +1412,28 @@ out:
  * pk_watch_process_require_restart_cb:
  **/
 static void
-pk_watch_process_require_restart_cb (PkItemRequireRestart *item, GpkWatch *watch)
+pk_watch_process_require_restart_cb (PkRequireRestart *item, GpkWatch *watch)
 {
 	GPtrArray *array = NULL;
 	GPtrArray *names = NULL;
 	const gchar *name;
 	gchar **split = NULL;
 	guint i;
+	PkRestartEnum restart;
+	gchar *package_id = NULL;
+
+	/* get data */
+	g_object_get (item,
+		      "restart", &restart,
+		      "package-id", &package_id,
+		      NULL);
 
 	/* if less important than what we are already showing */
-	if (item->restart <= watch->priv->restart)
+	if (restart <= watch->priv->restart)
 		goto out;
 
 	/* add name if not already in the list */
-	split = pk_package_id_split (item->package_id);
+	split = pk_package_id_split (package_id);
 	names = watch->priv->restart_package_names;
 	for (i=0; i<names->len; i++) {
 		name = g_ptr_array_index (names, i);
@@ -1426,8 +1446,9 @@ pk_watch_process_require_restart_cb (PkItemRequireRestart *item, GpkWatch *watch
 	}
 
 	/* save new restart */
-	watch->priv->restart = item->restart;
+	watch->priv->restart = restart;
 out:
+	g_free (package_id);
 	g_strfreev (split);
 	if (array != NULL)
 		g_object_unref (array);
@@ -1450,7 +1471,7 @@ gpk_watch_adopt_cb (PkClient *client, GAsyncResult *res, GpkWatch *watch)
 	PkProgress *progress = NULL;
 	PkResults *results;
 	PkRoleEnum role;
-	PkItemErrorCode *error_item = NULL;
+	PkError *error_code = NULL;
 
 	/* get the results */
 	results = pk_client_generic_finish (client, res, &error);
@@ -1481,20 +1502,20 @@ gpk_watch_adopt_cb (PkClient *client, GAsyncResult *res, GpkWatch *watch)
 	gpk_modal_dialog_set_percentage (watch->priv->dialog, 100);
 
 	/* autoclose if success */
-	error_item = pk_results_get_error_code (results);
-	if (error_item == NULL)
+	error_code = pk_results_get_error_code (results);
+	if (error_code == NULL)
 		gpk_modal_dialog_close (watch->priv->dialog);
 
 	/* process messages */
-	if (error_item == NULL) {
+	if (error_code == NULL) {
 		array = pk_results_get_message_array (results);
 		g_ptr_array_foreach (array, (GFunc) pk_watch_process_messages_cb, watch);
 		g_ptr_array_unref (array);
 	}
 
 	/* only process errors if caller is no longer on the bus */
-	if (error_item != NULL && !caller_active)
-		pk_watch_process_error_code (watch, error_item);
+	if (error_code != NULL && !caller_active)
+		pk_watch_process_error_code (watch, error_code);
 
 	/* process restarts */
 	if (role == PK_ROLE_ENUM_UPDATE_PACKAGES ||
@@ -1551,8 +1572,8 @@ gpk_watch_adopt_cb (PkClient *client, GAsyncResult *res, GpkWatch *watch)
 	}
 out:
 	g_free (transaction_id);
-	if (error_item != NULL)
-		pk_item_error_code_unref (error_item);
+	if (error_code != NULL)
+		g_object_unref (error_code);
 	if (progress != NULL)
 		g_object_unref (progress);
 	if (results != NULL)



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