gnome-packagekit r205 - in trunk: . data data/icons/16x16 data/icons/16x16/status data/icons/22x22 data/icons/22x22/status data/icons/24x24 data/icons/24x24/status data/icons/48x48 data/icons/48x48/status data/icons/scalable/status help/C man po src



Author: rhughes
Date: Thu May 22 17:08:24 2008
New Revision: 205
URL: http://svn.gnome.org/viewvc/gnome-packagekit?rev=205&view=rev

Log:
from git

Added:
   trunk/data/icons/16x16/status/pk-package-sources.png   (contents, props changed)
   trunk/data/icons/22x22/status/pk-package-sources.png   (contents, props changed)
   trunk/data/icons/24x24/status/pk-package-sources.png   (contents, props changed)
   trunk/data/icons/48x48/status/pk-package-sources.png   (contents, props changed)
   trunk/data/icons/scalable/status/pk-package-sources.svg
   trunk/man/gpk-install-mime-type.sgml
Modified:
   trunk/Makefile.am
   trunk/NEWS
   trunk/configure.ac
   trunk/data/gpk-application.glade
   trunk/data/gpk-client.glade
   trunk/data/gpk-update-viewer.glade
   trunk/data/icons/16x16/Makefile.am
   trunk/data/icons/22x22/Makefile.am
   trunk/data/icons/24x24/Makefile.am
   trunk/data/icons/48x48/Makefile.am
   trunk/help/C/gnome-packagekit.xml
   trunk/man/Makefile.am
   trunk/po/POTFILES.in
   trunk/src/Makefile.am
   trunk/src/gpk-application-main.c
   trunk/src/gpk-application.c
   trunk/src/gpk-application.h
   trunk/src/gpk-auto-refresh.c
   trunk/src/gpk-auto-refresh.h
   trunk/src/gpk-cell-renderer-uri.c
   trunk/src/gpk-cell-renderer-uri.h
   trunk/src/gpk-client.c
   trunk/src/gpk-common.c
   trunk/src/gpk-common.h
   trunk/src/gpk-install-local-file.c
   trunk/src/gpk-install-mime-type.c
   trunk/src/gpk-install-package-name.c
   trunk/src/gpk-install-provide-file.c
   trunk/src/gpk-log.c
   trunk/src/gpk-prefs.c
   trunk/src/gpk-repo.c
   trunk/src/gpk-smart-icon.c
   trunk/src/gpk-smart-icon.h
   trunk/src/gpk-update-icon.c
   trunk/src/gpk-update-viewer.c
   trunk/src/gpk-watch.c

Modified: trunk/Makefile.am
==============================================================================
--- trunk/Makefile.am	(original)
+++ trunk/Makefile.am	Thu May 22 17:08:24 2008
@@ -1,6 +1,7 @@
 SUBDIRS =						\
 	libselftest					\
 	libgbus						\
+	libunique					\
 	docs						\
 	man						\
 	src						\

Modified: trunk/NEWS
==============================================================================
--- trunk/NEWS	(original)
+++ trunk/NEWS	Thu May 22 17:08:24 2008
@@ -1,3 +1,108 @@
+Version 0.2.1
+~~~~~~~~~~~~~~
+Released: 2008-05-09
+
+* Caveats
+ - Some of the client tools still have bugs. Much better than the 0.2.0 release.
+
+* Translations
+ - Update Spanish translation (Daniel Mustieles)
+
+* New features:
+ - Make gpk-update-viewer use GpkClient for getting the updates and refreshing the cache - this
+   means we get the GPG and EULA callbacks for free (Richard Hughes)
+ - Don't let the progress window jump around by ensuring it's always set to at least 3 lines (Richard Hughes)
+ - Ask the user to confirm they want to install local files (Richard Hughes)
+ - gpk-install-local-file can now install more than one file at once. fixes rh#439662 (Richard Hughes)
+
+* Bugfixes:
+ - Cleanup our handling of gtk-mainloops (Richard Hughes)
+ - Make gpk-update-viewer integrate with the new GpkClient code better (Richard Hughes)
+
+Version 0.2.0
+~~~~~~~~~~~~~~
+Released: 2008-05-06
+
+* Cool new stuff
+ - Session service for trivial installation
+ - Tons of new help
+ - New faster transaction DBUS interface
+ - EULA and GPG signature callback support
+
+* Caveats
+ - This is the first (read: unstable) release of a new codebase - 0.1.11 is more stable.
+ - Most of the UI tools have trivial regressions due to the new interface work.
+ - There's a ton of new functionality that has only had light testing.
+ - Importing multiple GPG keys or EULAs in one transaction breaks horribly.
+
+* Translations
+ - Updated Brazilian Portuguese translation (Igor Pires Soares)
+ - Fixed strange english sentence (Mario Danic)
+ - Updated Spanish translation (Daniel Mustieles)
+
+* New features:
+ - Add some better icons for an available package (Mike Langlie)
+ - Convert all the tools for the big .Transaction API break (Richard Hughes)
+ - Add a context menu in gpk-update-viewer to select or unselect all the updates. Fixes rh#441010 (Richard Hughes)
+ - Show a checkbox for repo details in gpk-repo (Richard Hughes)
+ - Add a prompt when packages have to be added to an install (Richard Hughes)
+ - Check for get_depends, and skip if it can't be done (Richard Hughes)
+ - Allow gpg signatures to be imported when using GpkClient (Richard Hughes)
+ - Add a clever error modal box that can display a details expander (Richard Hughes)
+ - Add some simple man pages for the client tools (Richard Hughes)
+ - Set the tooltip for the homepage button to where we are actually going. Fixes rh#442230 (Richard Hughes)
+ - Set some text in the description about where the package has come from, else you don't know
+   where you are downloading it from. Fixes rh#442543 (Richard Hughes)
+ - Add support for accepting a EULA (Richard Hughes)
+ - Try to make the gpk-log program a bit more sane. first loose the right-hand icons, and only show
+   interesting transactions (success) and interesting actions (Richard Hughes)
+ - Pulse the icon when the update list changes to fix rh#436726 (Richard Hughes)
+ - Add a firmware checker that notices the udev integration file at startup (Richard Hughes)
+ - Try to retry a package as untrusted when it fails with a missing or broken gpg key (Richard Hughes)
+ - Add support for the arch filter in pk-application (Richard Hughes)
+ - Add a simple package chooser widget (Richard Hughes)
+ - Add gpk_client_refresh_cache() so we can do the EULA and GPG callbacks without any hassle (Richard Hughes)
+
+* Bugfixes:
+ - Improve the handling of CK errors (Matthias Clasen)
+ - Use the same window icon for gpk-log as for gpk-update-viewer. Fixes rh #439330 (Matthias Clasen)
+ - Make "never" work in gpk-prefs (Matthias Clasen)
+ - Explain that the update frequencies are only approximate (Matthias Clasen)
+ - Fix crash when cancelling auth after double-click install. Fixes rh#442150 (Matthias Clasen)
+ - Grab default to the close button where it makes sense (Matthias Clasen)
+ - Fix some unref braindamage in gpk-install-package to fix rh#441768 (Richard Hughes)
+ - Cope if there are more than one file that can provide a file (Richard Hughes)
+ - Don't show the 'additional downloads' dialog if there are no packages (Richard Hughes)
+ - When gnome-icon theme is not available, don't crash gpk-update-icon when we try to do the
+   animation. Fixes rh#441062 (Richard Hughes)
+ - Fix the update viewer to properly update the UI if things like rereshing the cache are done
+   using pkcon or the tray icon when the tool is open (Richard Hughes)
+ - Put the find and cancel buttons in a notebook so they are forced to be the same size (Richard Hughes)
+ - When we've done a search, focus back on the text widget (Richard Hughes)
+ - Add the EulaRequired connections to GpkClient (Richard Hughes)
+ - Only sort the package list after the transaction has finished. Fixes rh#441755 (Richard Hughes)
+ - Make sure we repect the users request of ignoring a specific type of notification. fix this
+   properly by adding a check when we go to compose the notification. Fixes rh#442398 (Richard Hughes)
+ - Show the full repo name in gpk-application to fix rh#442647 (Richard Hughes)
+ - Never check for updates when the update policy if 'never'. Fixes rh#442998 (Richard Hughes)
+ - Turn off BASENAME when getting updates, as users are noticing that the updates are only done on
+   the selected package, and not the whole subtype. Fixes rh#443117 (Richard Hughes)
+ - Left align the packages when downloading to fix rh#443210 (Richard Hughes)
+ - Use a custom widget handler to avoid filling the hbuttonboxes manually (Richard Hughes)
+ - Be more HIG friendly with button ordering to fix rh#441852 (Richard Hughes)
+ - Don't use g_main_loop in the gtk-tools, use gtk_main instead (Richard Hughes)
+ - Handle failed updates (when we can't get policykit auth) better - fixes rh#443551 (Richard Hughes)
+ - Allow GpkClient to emit notification windows when running without progress (Richard Hughes)
+ - Make the signature dialogue more HIG friendly (Richard Hughes)
+ - Make the unsigned package warning a little more stern (Richard Hughes)
+ - Use GpkClient rather than GpkProgress so the dialogs look the same. Fixes rh#439189 (Richard Hughes)
+ - Fix text for 'show development repos', and don't show the scrollbar unless we have to (Robin Norwood)
+ - Change 'Repository' to 'Software Source' in a few more places (Robin Norwood)
+ - Patch from Matthias to fix hanging on 'Other' group (Robin Norwood)
+ - Remove 'apply updates when on battery power' checkbox (Robin Norwood)
+ - Make gpk-client.c compile (Robin Norwood)
+ - Fix a segfault when pk_client_requeue does not set error (Robin Norwood)
+
 Version 0.1.11
 ~~~~~~~~~~~~~~
 Released: 2008-04-05

Modified: trunk/configure.ac
==============================================================================
--- trunk/configure.ac	(original)
+++ trunk/configure.ac	Thu May 22 17:08:24 2008
@@ -1,6 +1,6 @@
 AC_PREREQ(2.52)
 
-AC_INIT(gnome-packagekit, 0.2.0)
+AC_INIT(gnome-packagekit, 0.2.2)
 AC_CONFIG_SRCDIR(src)
 AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION)
 AM_CONFIG_HEADER(config.h)
@@ -45,7 +45,7 @@
 dnl ---------------------------------------------------------------------------
 dnl - Library dependencies
 dnl ---------------------------------------------------------------------------
-PACKAGEKIT_REQUIRED=0.1.11
+PACKAGEKIT_REQUIRED=0.2.0
 GLIB_REQUIRED=2.14.0
 GTK_REQUIRED=2.12.0
 DBUS_REQUIRED=1.1.2
@@ -54,6 +54,8 @@
 LIBGLADE_REQUIRED=2.5.0
 LIBNOTIFY_REQUIRED=0.4.3
 LIBSEXY_REQUIRED=0.1.10
+POLKIT_GNOME_REQUIRED=0.8
+UNIQUE_REQUIRED=0.9.4
 
 dnl ---------------------------------------------------------------------------
 dnl - Make above strings available for packaging files (e.g. rpm spec files)
@@ -66,6 +68,8 @@
 AC_SUBST(LIBGLADE_REQUIRED)
 AC_SUBST(LIBNOTIFY_REQUIRED)
 AC_SUBST(LIBSEXY_REQUIRED)
+AC_SUBST(POLKIT_GNOME_REQUIRED)
+AC_SUBST(UNIQUE_REQUIRED)
 
 dnl ---------------------------------------------------------------------------
 dnl - Check library dependencies
@@ -74,7 +78,7 @@
 AC_SUBST(PACKAGEKIT_CFLAGS)
 AC_SUBST(PACKAGEKIT_LIBS)
 
-PKG_CHECK_MODULES(POLKIT_GNOME, polkit-gnome)
+PKG_CHECK_MODULES(POLKIT_GNOME, polkit-gnome >= $POLKIT_GNOME_REQUIRED)
 AC_SUBST(POLKIT_GNOME_CFLAGS)
 AC_SUBST(POLKIT_GNOME_LIBS)
 
@@ -152,6 +156,21 @@
 AM_CONDITIONAL(HAVE_DOCBOOK2MAN, [test "$DOCBOOK2MAN" != "no"])
 
 dnl ---------------------------------------------------------------------------
+dnl - Is unique available?
+dnl ---------------------------------------------------------------------------
+if $PKG_CONFIG --atleast-version $UNIQUE_REQUIRED unique-1.0; then
+   have_unique=yes
+   PKG_CHECK_MODULES(UNIQUE, unique-1.0 >= $UNIQUE_REQUIRED)
+   AC_SUBST(UNIQUE_CFLAGS)
+   AC_SUBST(UNIQUE_LIBS)
+   AC_DEFINE(HAVE_UNIQUE, 1, [Building with unique support])
+else
+   have_unique=no
+   AC_DEFINE(HAVE_UNIQUE, 0, [Not building with unique support])
+fi
+AM_CONDITIONAL([HAVE_UNIQUE], [test $have_unique = yes])
+
+dnl ---------------------------------------------------------------------------
 dnl - Other tests
 dnl ---------------------------------------------------------------------------
 AC_ARG_ENABLE(gcov, AS_HELP_STRING([--enable-gcov],[compile with coverage profiling instrumentation (gcc only)]),
@@ -192,6 +211,7 @@
 Makefile
 libselftest/Makefile
 libgbus/Makefile
+libunique/Makefile
 src/Makefile
 help/Makefile
 man/Makefile
@@ -204,12 +224,16 @@
 data/icons/24x24/Makefile
 data/icons/48x48/Makefile
 data/icons/scalable/Makefile
+data/icons/16x16/animations/Makefile
 data/icons/16x16/categories/Makefile
 data/icons/16x16/status/Makefile
+data/icons/22x22/animations/Makefile
 data/icons/22x22/categories/Makefile
 data/icons/22x22/status/Makefile
+data/icons/24x24/animations/Makefile
 data/icons/24x24/categories/Makefile
 data/icons/24x24/status/Makefile
+data/icons/48x48/animations/Makefile
 data/icons/48x48/categories/Makefile
 data/icons/48x48/status/Makefile
 data/icons/scalable/categories/Makefile
@@ -223,6 +247,7 @@
 
         GCC coverage profiling:    ${enable_gcov}
         GCC time profiling:        ${enable_gprof}
+        unique support:            ${have_unique}
         prefix:                    ${prefix}
         datadir:                   ${datadir}
         compiler:                  ${CC}

Modified: trunk/data/gpk-application.glade
==============================================================================
--- trunk/data/gpk-application.glade	(original)
+++ trunk/data/gpk-application.glade	Thu May 22 17:08:24 2008
@@ -14,52 +14,6 @@
             <property name="visible">True</property>
             <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
             <child>
-              <widget class="GtkMenuItem" id="menuitem_system">
-                <property name="visible">True</property>
-                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                <property name="label" translatable="yes">_System</property>
-                <property name="use_underline">True</property>
-                <child>
-                  <widget class="GtkMenu" id="menu_system">
-                    <property name="visible">True</property>
-                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                    <child>
-                      <widget class="GtkImageMenuItem" id="menuitem_sources">
-                        <property name="visible">True</property>
-                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                        <property name="label" translatable="yes">Software _sources</property>
-                        <property name="use_underline">True</property>
-                        <child internal-child="image">
-                          <widget class="GtkImage" id="menu-item-image2">
-                            <property name="visible">True</property>
-                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                            <property name="stock">gtk-cdrom</property>
-                            <property name="icon_size">1</property>
-                          </widget>
-                        </child>
-                      </widget>
-                    </child>
-                    <child>
-                      <widget class="GtkSeparatorMenuItem" id="separatormenuitem1">
-                        <property name="visible">True</property>
-                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                      </widget>
-                    </child>
-                    <child>
-                      <widget class="GtkImageMenuItem" id="imagemenuitem_quit">
-                        <property name="visible">True</property>
-                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                        <property name="tooltip" translatable="yes">Close the program</property>
-                        <property name="label">gtk-quit</property>
-                        <property name="use_underline">True</property>
-                        <property name="use_stock">True</property>
-                      </widget>
-                    </child>
-                  </widget>
-                </child>
-              </widget>
-            </child>
-            <child>
               <widget class="GtkMenuItem" id="menuitem2">
                 <property name="visible">True</property>
                 <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
@@ -284,6 +238,44 @@
                       </widget>
                     </child>
                     <child>
+                      <widget class="GtkMenuItem" id="menuitem_source">
+                        <property name="visible">True</property>
+                        <property name="label" translatable="yes">_Source</property>
+                        <property name="use_underline">True</property>
+                        <child>
+                          <widget class="GtkMenu" id="menu7">
+                            <property name="visible">True</property>
+                            <child>
+                              <widget class="GtkRadioMenuItem" id="menuitem_source_yes">
+                                <property name="visible">True</property>
+                                <property name="label" translatable="yes">_Only sourcecode</property>
+                                <property name="use_underline">True</property>
+                                <property name="draw_as_radio">True</property>
+                              </widget>
+                            </child>
+                            <child>
+                              <widget class="GtkRadioMenuItem" id="menuitem_source_no">
+                                <property name="visible">True</property>
+                                <property name="label" translatable="yes">Only _non-sourcecode</property>
+                                <property name="use_underline">True</property>
+                                <property name="draw_as_radio">True</property>
+                                <property name="group">menuitem_source_yes</property>
+                              </widget>
+                            </child>
+                            <child>
+                              <widget class="GtkRadioMenuItem" id="menuitem_source_both">
+                                <property name="visible">True</property>
+                                <property name="label" translatable="yes">_No filter</property>
+                                <property name="use_underline">True</property>
+                                <property name="draw_as_radio">True</property>
+                                <property name="group">menuitem_source_yes</property>
+                              </widget>
+                            </child>
+                          </widget>
+                        </child>
+                      </widget>
+                    </child>
+                    <child>
                       <widget class="GtkCheckMenuItem" id="menuitem_basename">
                         <property name="visible">True</property>
                         <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
@@ -346,170 +338,330 @@
           </packing>
         </child>
         <child>
-          <widget class="GtkHBox" id="hbox4">
+          <widget class="GtkToolbar" id="toolbar1">
+            <property name="visible">True</property>
+            <property name="icon_size">GTK_ICON_SIZE_BUTTON</property>
+            <child>
+              <widget class="GtkToolButton" id="toolbutton_list_add">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">_Add to list</property>
+                <property name="use_underline">True</property>
+                <property name="stock_id">gtk-add</property>
+              </widget>
+              <packing>
+                <property name="expand">False</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkToolButton" id="toolbutton_list_clear">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">_Clear list</property>
+                <property name="use_underline">True</property>
+                <property name="stock_id">gtk-clear</property>
+              </widget>
+              <packing>
+                <property name="expand">False</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkToolButton" id="toolbutton_list_show">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">_Show list</property>
+                <property name="use_underline">True</property>
+                <property name="stock_id">gtk-edit</property>
+              </widget>
+              <packing>
+                <property name="expand">False</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkSeparatorToolItem" id="toolbutton2">
+                <property name="visible">True</property>
+              </widget>
+              <packing>
+                <property name="expand">False</property>
+                <property name="homogeneous">False</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkToolButton" id="toolbutton_install">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">_Install packages</property>
+                <property name="use_underline">True</property>
+                <property name="stock_id">gtk-floppy</property>
+              </widget>
+              <packing>
+                <property name="expand">False</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkToolButton" id="toolbutton_remove">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">_Remove packages</property>
+                <property name="use_underline">True</property>
+                <property name="stock_id">gtk-delete</property>
+              </widget>
+              <packing>
+                <property name="expand">False</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkSeparatorToolItem" id="toolbutton1">
+                <property name="visible">True</property>
+              </widget>
+              <packing>
+                <property name="expand">False</property>
+                <property name="homogeneous">False</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkToolButton" id="toolbutton_sources">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">_Software sources</property>
+                <property name="use_underline">True</property>
+                <property name="stock_id">gtk-cdrom</property>
+              </widget>
+              <packing>
+                <property name="expand">False</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkToolButton" id="toolbutton_refresh">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">_Refresh package lists</property>
+                <property name="use_underline">True</property>
+                <property name="stock_id">gtk-refresh</property>
+              </widget>
+              <packing>
+                <property name="expand">False</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="GtkVBox" id="vbox2">
             <property name="visible">True</property>
-            <property name="border_width">10</property>
-            <property name="spacing">6</property>
             <child>
               <widget class="GtkHBox" id="hbox1">
                 <property name="visible">True</property>
-                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
                 <child>
-                  <widget class="GtkVBox" id="vbox_groups">
+                  <widget class="GtkHBox" id="hbox7">
                     <property name="visible">True</property>
                     <property name="spacing">6</property>
                     <child>
-                      <widget class="GtkHBox" id="hbox26">
+                      <widget class="GtkVBox" id="vbox_groups">
                         <property name="visible">True</property>
-                        <property name="spacing">5</property>
-                        <child>
-                          <widget class="Custom" id="entry_text">
-                            <property name="visible">True</property>
-                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                          </widget>
-                        </child>
+                        <property name="spacing">6</property>
                         <child>
-                          <widget class="GtkNotebook" id="notebook_search_cancel">
+                          <widget class="GtkHBox" id="hbox26">
                             <property name="visible">True</property>
-                            <property name="can_focus">True</property>
-                            <property name="show_tabs">False</property>
-                            <property name="show_border">False</property>
-                            <property name="tab_border">0</property>
-                            <property name="tab_hborder">0</property>
-                            <property name="tab_vborder">0</property>
+                            <property name="spacing">5</property>
                             <child>
-                              <widget class="GtkButton" id="button_find">
+                              <widget class="Custom" id="entry_text">
+                                <property name="visible">True</property>
+                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                              </widget>
+                            </child>
+                            <child>
+                              <widget class="GtkNotebook" id="notebook_search_cancel">
                                 <property name="visible">True</property>
                                 <property name="can_focus">True</property>
-                                <property name="response_id">0</property>
+                                <property name="show_tabs">False</property>
+                                <property name="show_border">False</property>
+                                <property name="tab_border">0</property>
+                                <property name="tab_hborder">0</property>
+                                <property name="tab_vborder">0</property>
                                 <child>
-                                  <widget class="GtkAlignment" id="alignment5">
+                                  <widget class="GtkButton" id="button_find">
                                     <property name="visible">True</property>
-                                    <property name="xscale">0</property>
-                                    <property name="yscale">0</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="response_id">0</property>
                                     <child>
-                                      <widget class="GtkHBox" id="hbox6">
+                                      <widget class="GtkAlignment" id="alignment5">
                                         <property name="visible">True</property>
-                                        <property name="spacing">2</property>
+                                        <property name="xscale">0</property>
+                                        <property name="yscale">0</property>
                                         <child>
-                                          <widget class="GtkImage" id="image4">
+                                          <widget class="GtkHBox" id="hbox6">
                                             <property name="visible">True</property>
-                                            <property name="stock">gtk-find</property>
+                                            <property name="spacing">2</property>
+                                            <child>
+                                              <widget class="GtkImage" id="image4">
+                                                <property name="visible">True</property>
+                                                <property name="stock">gtk-find</property>
+                                              </widget>
+                                              <packing>
+                                                <property name="expand">False</property>
+                                                <property name="fill">False</property>
+                                              </packing>
+                                            </child>
+                                            <child>
+                                              <widget class="GtkLabel" id="label_button_find">
+                                                <property name="visible">True</property>
+                                                <property name="label">_Find</property>
+                                                <property name="use_underline">True</property>
+                                              </widget>
+                                              <packing>
+                                                <property name="expand">False</property>
+                                                <property name="fill">False</property>
+                                                <property name="position">1</property>
+                                              </packing>
+                                            </child>
                                           </widget>
-                                          <packing>
-                                            <property name="expand">False</property>
-                                            <property name="fill">False</property>
-                                          </packing>
-                                        </child>
-                                        <child>
-                                          <widget class="GtkLabel" id="label_button_find">
-                                            <property name="visible">True</property>
-                                            <property name="label">_Find</property>
-                                            <property name="use_underline">True</property>
-                                          </widget>
-                                          <packing>
-                                            <property name="expand">False</property>
-                                            <property name="fill">False</property>
-                                            <property name="position">1</property>
-                                          </packing>
                                         </child>
                                       </widget>
                                     </child>
                                   </widget>
                                 </child>
-                              </widget>
-                            </child>
-                            <child>
-                              <widget class="GtkLabel" id="label_find">
-                                <property name="visible">True</property>
-                                <property name="label">find</property>
-                              </widget>
-                              <packing>
-                                <property name="type">tab</property>
-                                <property name="tab_fill">False</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <widget class="GtkButton" id="button_cancel">
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="response_id">0</property>
                                 <child>
-                                  <widget class="GtkAlignment" id="alignment2">
+                                  <widget class="GtkLabel" id="label_find">
                                     <property name="visible">True</property>
-                                    <property name="xscale">0</property>
-                                    <property name="yscale">0</property>
+                                    <property name="label">find</property>
+                                  </widget>
+                                  <packing>
+                                    <property name="type">tab</property>
+                                    <property name="tab_fill">False</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <widget class="GtkButton" id="button_cancel">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="response_id">0</property>
                                     <child>
-                                      <widget class="GtkHBox" id="hbox3">
+                                      <widget class="GtkAlignment" id="alignment2">
                                         <property name="visible">True</property>
-                                        <property name="spacing">2</property>
+                                        <property name="xscale">0</property>
+                                        <property name="yscale">0</property>
                                         <child>
-                                          <widget class="GtkImage" id="image2">
+                                          <widget class="GtkHBox" id="hbox3">
                                             <property name="visible">True</property>
-                                            <property name="stock">gtk-dialog-error</property>
+                                            <property name="spacing">2</property>
+                                            <child>
+                                              <widget class="GtkImage" id="image2">
+                                                <property name="visible">True</property>
+                                                <property name="stock">gtk-dialog-error</property>
+                                              </widget>
+                                              <packing>
+                                                <property name="expand">False</property>
+                                                <property name="fill">False</property>
+                                              </packing>
+                                            </child>
+                                            <child>
+                                              <widget class="GtkLabel" id="label_button_cancel">
+                                                <property name="visible">True</property>
+                                                <property name="label">_Cancel</property>
+                                                <property name="use_underline">True</property>
+                                              </widget>
+                                              <packing>
+                                                <property name="expand">False</property>
+                                                <property name="fill">False</property>
+                                                <property name="position">1</property>
+                                              </packing>
+                                            </child>
                                           </widget>
-                                          <packing>
-                                            <property name="expand">False</property>
-                                            <property name="fill">False</property>
-                                          </packing>
-                                        </child>
-                                        <child>
-                                          <widget class="GtkLabel" id="label_button_cancel">
-                                            <property name="visible">True</property>
-                                            <property name="label">_Cancel</property>
-                                            <property name="use_underline">True</property>
-                                          </widget>
-                                          <packing>
-                                            <property name="expand">False</property>
-                                            <property name="fill">False</property>
-                                            <property name="position">1</property>
-                                          </packing>
                                         </child>
                                       </widget>
                                     </child>
                                   </widget>
+                                  <packing>
+                                    <property name="position">1</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <widget class="GtkLabel" id="label_cancel">
+                                    <property name="visible">True</property>
+                                    <property name="label">cancel</property>
+                                  </widget>
+                                  <packing>
+                                    <property name="type">tab</property>
+                                    <property name="position">1</property>
+                                    <property name="tab_fill">False</property>
+                                  </packing>
                                 </child>
                               </widget>
                               <packing>
                                 <property name="position">1</property>
                               </packing>
                             </child>
+                          </widget>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <widget class="GtkScrolledWindow" id="scrolledwindow_groups">
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                            <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                            <property name="shadow_type">GTK_SHADOW_IN</property>
                             <child>
-                              <widget class="GtkLabel" id="label_cancel">
+                              <widget class="GtkTreeView" id="treeview_groups">
                                 <property name="visible">True</property>
-                                <property name="label">cancel</property>
+                                <property name="can_focus">True</property>
+                                <property name="border_width">3</property>
+                                <property name="headers_visible">False</property>
+                                <property name="enable_search">False</property>
+                              </widget>
+                            </child>
+                          </widget>
+                          <packing>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <widget class="GtkHBox" id="hbox_status">
+                            <property name="spacing">6</property>
+                            <child>
+                              <widget class="Custom" id="image_status">
+                                <property name="visible">True</property>
+                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
                               </widget>
                               <packing>
-                                <property name="type">tab</property>
+                                <property name="expand">False</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <widget class="GtkLabel" id="label_status">
+                                <property name="visible">True</property>
+                                <property name="label">Querying</property>
+                                <property name="use_markup">True</property>
+                              </widget>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
                                 <property name="position">1</property>
-                                <property name="tab_fill">False</property>
                               </packing>
                             </child>
                           </widget>
                           <packing>
-                            <property name="position">1</property>
+                            <property name="expand">False</property>
+                            <property name="position">2</property>
                           </packing>
                         </child>
                       </widget>
                       <packing>
                         <property name="expand">False</property>
-                        <property name="fill">False</property>
                       </packing>
                     </child>
                     <child>
-                      <widget class="GtkScrolledWindow" id="scrolledwindow_groups">
+                      <widget class="GtkScrolledWindow" id="scrolledwindow_packages">
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
                         <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
                         <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
                         <property name="shadow_type">GTK_SHADOW_IN</property>
                         <child>
-                          <widget class="GtkTreeView" id="treeview_groups">
+                          <widget class="GtkTreeView" id="treeview_packages">
                             <property name="visible">True</property>
                             <property name="can_focus">True</property>
-                            <property name="border_width">3</property>
                             <property name="headers_visible">False</property>
-                            <property name="enable_search">False</property>
                           </widget>
                         </child>
                       </widget>
@@ -517,41 +669,6 @@
                         <property name="position">1</property>
                       </packing>
                     </child>
-                  </widget>
-                </child>
-              </widget>
-              <packing>
-                <property name="expand">False</property>
-              </packing>
-            </child>
-            <child>
-              <widget class="GtkVPaned" id="vpaned1">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                <child>
-                  <widget class="GtkScrolledWindow" id="scrolledwindow_packages">
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
-                    <property name="shadow_type">GTK_SHADOW_IN</property>
-                    <child>
-                      <widget class="GtkTreeView" id="treeview_packages">
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="headers_visible">False</property>
-                      </widget>
-                    </child>
-                  </widget>
-                  <packing>
-                    <property name="resize">True</property>
-                    <property name="shrink">False</property>
-                  </packing>
-                </child>
-                <child>
-                  <widget class="GtkVBox" id="vbox_description_pane">
-                    <property name="visible">True</property>
-                    <property name="spacing">5</property>
                     <child>
                       <widget class="GtkNotebook" id="notebook_description">
                         <property name="visible">True</property>
@@ -581,63 +698,149 @@
                               </widget>
                             </child>
                             <child>
-                              <widget class="GtkHBox" id="hbox_source">
+                              <widget class="GtkHBox" id="hbox5">
                                 <property name="visible">True</property>
                                 <property name="spacing">6</property>
                                 <child>
-                                  <widget class="GtkLabel" id="label_source_text">
+                                  <widget class="GtkImage" id="image_icon">
                                     <property name="visible">True</property>
-                                    <property name="label" translatable="yes">Software source:</property>
+                                    <property name="stock">gtk-missing-image</property>
+                                    <property name="icon_size">6</property>
                                   </widget>
                                   <packing>
                                     <property name="expand">False</property>
-                                    <property name="fill">False</property>
                                   </packing>
                                 </child>
                                 <child>
-                                  <widget class="GtkLabel" id="label_source">
+                                  <widget class="GtkVBox" id="vbox3">
                                     <property name="visible">True</property>
-                                    <property name="label">Fedora - Rawhide</property>
-                                    <property name="wrap">True</property>
+                                    <property name="spacing">6</property>
+                                    <child>
+                                      <widget class="GtkHBox" id="hbox_source">
+                                        <property name="visible">True</property>
+                                        <property name="spacing">6</property>
+                                        <child>
+                                          <widget class="GtkLabel" id="label_source_text">
+                                            <property name="visible">True</property>
+                                            <property name="label" translatable="yes">Software source:</property>
+                                          </widget>
+                                          <packing>
+                                            <property name="expand">False</property>
+                                            <property name="fill">False</property>
+                                          </packing>
+                                        </child>
+                                        <child>
+                                          <widget class="GtkLabel" id="label_source">
+                                            <property name="visible">True</property>
+                                            <property name="label">Fedora - Rawhide</property>
+                                            <property name="wrap">True</property>
+                                          </widget>
+                                          <packing>
+                                            <property name="expand">False</property>
+                                            <property name="fill">False</property>
+                                            <property name="position">1</property>
+                                          </packing>
+                                        </child>
+                                      </widget>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                      </packing>
+                                    </child>
+                                    <child>
+                                      <widget class="GtkHBox" id="hbox_filesize">
+                                        <property name="visible">True</property>
+                                        <property name="spacing">6</property>
+                                        <child>
+                                          <widget class="GtkLabel" id="label_filesize_text">
+                                            <property name="visible">True</property>
+                                            <property name="label" translatable="yes">Package size:</property>
+                                          </widget>
+                                          <packing>
+                                            <property name="expand">False</property>
+                                            <property name="fill">False</property>
+                                          </packing>
+                                        </child>
+                                        <child>
+                                          <widget class="GtkLabel" id="label_filesize">
+                                            <property name="visible">True</property>
+                                            <property name="label">124kb</property>
+                                          </widget>
+                                          <packing>
+                                            <property name="expand">False</property>
+                                            <property name="fill">False</property>
+                                            <property name="position">1</property>
+                                          </packing>
+                                        </child>
+                                      </widget>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="position">1</property>
+                                      </packing>
+                                    </child>
                                   </widget>
                                   <packing>
-                                    <property name="expand">False</property>
-                                    <property name="fill">False</property>
                                     <property name="position">1</property>
                                   </packing>
                                 </child>
                               </widget>
                               <packing>
+                                <property name="expand">False</property>
                                 <property name="position">1</property>
                               </packing>
                             </child>
                             <child>
-                              <widget class="GtkHBox" id="hbox_filesize">
+                              <widget class="GtkHButtonBox" id="hbuttonbox1">
                                 <property name="visible">True</property>
-                                <property name="spacing">6</property>
+                                <property name="layout_style">GTK_BUTTONBOX_START</property>
                                 <child>
-                                  <widget class="GtkLabel" id="label_filesize_text">
+                                  <widget class="GtkButton" id="button_homepage">
                                     <property name="visible">True</property>
-                                    <property name="label" translatable="yes">Package size:</property>
-                                  </widget>
-                                  <packing>
-                                    <property name="expand">False</property>
-                                    <property name="fill">False</property>
-                                  </packing>
-                                </child>
-                                <child>
-                                  <widget class="GtkLabel" id="label_filesize">
-                                    <property name="visible">True</property>
-                                    <property name="label">124kb</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="response_id">0</property>
+                                    <child>
+                                      <widget class="GtkAlignment" id="alignment26">
+                                        <property name="visible">True</property>
+                                        <property name="xscale">0</property>
+                                        <property name="yscale">0</property>
+                                        <child>
+                                          <widget class="GtkHBox" id="hbox30">
+                                            <property name="visible">True</property>
+                                            <property name="spacing">2</property>
+                                            <child>
+                                              <widget class="GtkImage" id="image7">
+                                                <property name="visible">True</property>
+                                                <property name="stock">gtk-home</property>
+                                              </widget>
+                                              <packing>
+                                                <property name="expand">False</property>
+                                                <property name="fill">False</property>
+                                              </packing>
+                                            </child>
+                                            <child>
+                                              <widget class="GtkLabel" id="label37">
+                                                <property name="visible">True</property>
+                                                <property name="label" translatable="yes">Homepage</property>
+                                                <property name="use_underline">True</property>
+                                              </widget>
+                                              <packing>
+                                                <property name="expand">False</property>
+                                                <property name="fill">False</property>
+                                                <property name="position">1</property>
+                                              </packing>
+                                            </child>
+                                          </widget>
+                                        </child>
+                                      </widget>
+                                    </child>
                                   </widget>
                                   <packing>
                                     <property name="expand">False</property>
                                     <property name="fill">False</property>
-                                    <property name="position">1</property>
                                   </packing>
                                 </child>
                               </widget>
                               <packing>
+                                <property name="expand">False</property>
                                 <property name="position">2</property>
                               </packing>
                             </child>
@@ -771,153 +974,21 @@
                           </packing>
                         </child>
                       </widget>
-                    </child>
-                    <child>
-                      <widget class="GtkHBox" id="hbox_package">
-                        <property name="visible">True</property>
-                        <property name="spacing">5</property>
-                        <child>
-                          <widget class="Custom" id="button_remove">
-                            <property name="visible">True</property>
-                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                          </widget>
-                          <packing>
-                            <property name="expand">False</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <widget class="Custom" id="button_install">
-                            <property name="visible">True</property>
-                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                          </widget>
-                          <packing>
-                            <property name="expand">False</property>
-                            <property name="position">1</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <widget class="GtkButton" id="button_cancel2">
-                            <property name="visible">True</property>
-                            <property name="can_focus">True</property>
-                            <property name="response_id">0</property>
-                            <child>
-                              <widget class="GtkAlignment" id="alignment3">
-                                <property name="visible">True</property>
-                                <property name="xscale">0</property>
-                                <property name="yscale">0</property>
-                                <child>
-                                  <widget class="GtkHBox" id="hbox5">
-                                    <property name="visible">True</property>
-                                    <property name="spacing">2</property>
-                                    <child>
-                                      <widget class="GtkImage" id="image3">
-                                        <property name="visible">True</property>
-                                        <property name="stock">gtk-dialog-error</property>
-                                      </widget>
-                                      <packing>
-                                        <property name="expand">False</property>
-                                        <property name="fill">False</property>
-                                      </packing>
-                                    </child>
-                                    <child>
-                                      <widget class="GtkLabel" id="label_button_cancel2">
-                                        <property name="visible">True</property>
-                                        <property name="label">_Cancel</property>
-                                        <property name="use_underline">True</property>
-                                      </widget>
-                                      <packing>
-                                        <property name="expand">False</property>
-                                        <property name="fill">False</property>
-                                        <property name="position">1</property>
-                                      </packing>
-                                    </child>
-                                  </widget>
-                                </child>
-                              </widget>
-                            </child>
-                          </widget>
-                          <packing>
-                            <property name="expand">False</property>
-                            <property name="fill">False</property>
-                            <property name="position">2</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <widget class="GtkButton" id="button_homepage">
-                            <property name="visible">True</property>
-                            <property name="can_focus">True</property>
-                            <property name="response_id">0</property>
-                            <child>
-                              <widget class="GtkAlignment" id="alignment26">
-                                <property name="visible">True</property>
-                                <property name="xscale">0</property>
-                                <property name="yscale">0</property>
-                                <child>
-                                  <widget class="GtkHBox" id="hbox30">
-                                    <property name="visible">True</property>
-                                    <property name="spacing">2</property>
-                                    <child>
-                                      <widget class="GtkImage" id="image7">
-                                        <property name="visible">True</property>
-                                        <property name="stock">gtk-home</property>
-                                      </widget>
-                                      <packing>
-                                        <property name="expand">False</property>
-                                        <property name="fill">False</property>
-                                      </packing>
-                                    </child>
-                                    <child>
-                                      <widget class="GtkLabel" id="label37">
-                                        <property name="visible">True</property>
-                                        <property name="label" translatable="yes">Homepage</property>
-                                        <property name="use_underline">True</property>
-                                      </widget>
-                                      <packing>
-                                        <property name="expand">False</property>
-                                        <property name="fill">False</property>
-                                        <property name="position">1</property>
-                                      </packing>
-                                    </child>
-                                  </widget>
-                                </child>
-                              </widget>
-                            </child>
-                          </widget>
-                          <packing>
-                            <property name="expand">False</property>
-                            <property name="fill">False</property>
-                            <property name="position">3</property>
-                          </packing>
-                        </child>
-                      </widget>
                       <packing>
                         <property name="expand">False</property>
-                        <property name="position">1</property>
+                        <property name="position">2</property>
                       </packing>
                     </child>
                   </widget>
                   <packing>
-                    <property name="resize">False</property>
-                    <property name="shrink">False</property>
+                    <property name="padding">6</property>
                   </packing>
                 </child>
               </widget>
-              <packing>
-                <property name="position">1</property>
-              </packing>
             </child>
           </widget>
           <packing>
-            <property name="position">1</property>
-          </packing>
-        </child>
-        <child>
-          <widget class="GtkStatusbar" id="statusbar_status">
-            <property name="visible">True</property>
-          </widget>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">False</property>
+            <property name="padding">6</property>
             <property name="position">2</property>
           </packing>
         </child>

Modified: trunk/data/gpk-client.glade
==============================================================================
--- trunk/data/gpk-client.glade	(original)
+++ trunk/data/gpk-client.glade	Thu May 22 17:08:24 2008
@@ -20,53 +20,110 @@
                 <property name="border_width">12</property>
                 <property name="spacing">6</property>
                 <child>
-                  <widget class="GtkLabel" id="progress_part_label">
-                    <property name="visible">True</property>
-                    <property name="xalign">0</property>
-                    <property name="yalign">0</property>
-                    <property name="label">&lt;b&gt;Downloading&lt;/b&gt;</property>
-                    <property name="use_markup">True</property>
-                  </widget>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">False</property>
-                  </packing>
-                </child>
-                <child>
-                  <widget class="GtkProgressBar" id="progressbar_percent">
-                    <property name="visible">True</property>
-                    <property name="pulse_step">0.10000000149</property>
-                  </widget>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">False</property>
-                    <property name="position">1</property>
-                  </packing>
-                </child>
-                <child>
-                  <widget class="GtkVBox" id="vbox1">
+                  <widget class="GtkTable" id="table1">
                     <property name="visible">True</property>
+                    <property name="n_rows">2</property>
+                    <property name="n_columns">2</property>
+                    <property name="column_spacing">6</property>
+                    <property name="row_spacing">6</property>
                     <child>
-                      <widget class="GtkHBox" id="hbox1">
+                      <widget class="GtkVBox" id="vbox2">
                         <property name="visible">True</property>
+                        <property name="spacing">6</property>
                         <child>
-                          <widget class="GtkLabel" id="label_package">
-                            <property name="label">&lt;b&gt;The second update&lt;/b&gt;
-(update2)</property>
+                          <widget class="GtkLabel" id="progress_part_label">
+                            <property name="visible">True</property>
+                            <property name="xalign">0</property>
+                            <property name="yalign">0</property>
+                            <property name="label">&lt;b&gt;Downloading&lt;/b&gt;</property>
                             <property name="use_markup">True</property>
-                            <property name="wrap">True</property>
+                          </widget>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <widget class="GtkProgressBar" id="progressbar_percent">
+                            <property name="visible">True</property>
+                            <property name="pulse_step">0.10000000149</property>
+                          </widget>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                      </widget>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="y_options">GTK_FILL</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="GtkVBox" id="vbox1">
+                        <property name="visible">True</property>
+                        <child>
+                          <widget class="GtkHBox" id="hbox1">
+                            <property name="visible">True</property>
+                            <child>
+                              <widget class="GtkLabel" id="label_package">
+                                <property name="label">&lt;b&gt;The second update&lt;/b&gt;
+(update2)</property>
+                                <property name="use_markup">True</property>
+                                <property name="wrap">True</property>
+                              </widget>
+                              <packing>
+                                <property name="expand">False</property>
+                              </packing>
+                            </child>
+                          </widget>
+                          <packing>
+                            <property name="expand">False</property>
+                          </packing>
+                        </child>
+                      </widget>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">1</property>
+                        <property name="bottom_attach">2</property>
+                        <property name="y_options">GTK_FILL</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="Custom" id="image_status">
+                        <property name="visible">True</property>
+                      </widget>
+                      <packing>
+                        <property name="x_options">GTK_FILL</property>
+                        <property name="y_options">GTK_FILL</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="GtkVBox" id="vbox3">
+                        <property name="visible">True</property>
+                        <child>
+                          <widget class="GtkImage" id="image_package">
+                            <property name="stock">gtk-spell-check</property>
+                            <property name="icon_size">6</property>
                           </widget>
                           <packing>
                             <property name="expand">False</property>
                           </packing>
                         </child>
                       </widget>
+                      <packing>
+                        <property name="top_attach">1</property>
+                        <property name="bottom_attach">2</property>
+                        <property name="x_options">GTK_FILL</property>
+                        <property name="y_options">GTK_FILL</property>
+                      </packing>
                     </child>
                   </widget>
                   <packing>
                     <property name="expand">False</property>
-                    <property name="fill">False</property>
-                    <property name="position">2</property>
                   </packing>
                 </child>
                 <child>
@@ -118,7 +175,7 @@
                     <property name="expand">False</property>
                     <property name="fill">False</property>
                     <property name="pack_type">GTK_PACK_END</property>
-                    <property name="position">3</property>
+                    <property name="position">1</property>
                   </packing>
                 </child>
               </widget>

Modified: trunk/data/gpk-update-viewer.glade
==============================================================================
--- trunk/data/gpk-update-viewer.glade	(original)
+++ trunk/data/gpk-update-viewer.glade	Thu May 22 17:08:24 2008
@@ -42,6 +42,41 @@
                   </packing>
                 </child>
                 <child>
+                  <widget class="GtkViewport" id="viewport_animation_preview">
+                    <property name="resize_mode">GTK_RESIZE_QUEUE</property>
+                    <child>
+                      <widget class="GtkHBox" id="hbox_animation_preview">
+                        <property name="visible">True</property>
+                        <property name="spacing">6</property>
+                        <child>
+                          <widget class="Custom" id="image_animation_preview">
+                            <property name="visible">True</property>
+                          </widget>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <widget class="GtkLabel" id="label_animation_preview">
+                            <property name="visible">True</property>
+                            <property name="label">&lt;b&gt;Another system update is in progress&lt;/b&gt;</property>
+                            <property name="use_markup">True</property>
+                          </widget>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                      </widget>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
                   <widget class="GtkScrolledWindow" id="scrolledwindow_preview">
                     <property name="visible">True</property>
                     <property name="can_focus">True</property>
@@ -57,7 +92,7 @@
                     </child>
                   </widget>
                   <packing>
-                    <property name="position">1</property>
+                    <property name="position">2</property>
                   </packing>
                 </child>
                 <child>
@@ -159,7 +194,7 @@
                   <packing>
                     <property name="expand">False</property>
                     <property name="padding">12</property>
-                    <property name="position">2</property>
+                    <property name="position">3</property>
                   </packing>
                 </child>
                 <child>
@@ -252,7 +287,7 @@
                   <packing>
                     <property name="expand">False</property>
                     <property name="fill">False</property>
-                    <property name="position">3</property>
+                    <property name="position">4</property>
                   </packing>
                 </child>
               </widget>
@@ -308,6 +343,42 @@
                   </widget>
                 </child>
                 <child>
+                  <widget class="GtkViewport" id="viewport_animation_description">
+                    <property name="visible">True</property>
+                    <property name="resize_mode">GTK_RESIZE_QUEUE</property>
+                    <child>
+                      <widget class="GtkHBox" id="hbox_animation_description">
+                        <property name="visible">True</property>
+                        <property name="spacing">6</property>
+                        <child>
+                          <widget class="Custom" id="image_animation_description">
+                            <property name="visible">True</property>
+                          </widget>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <widget class="GtkLabel" id="label_animation_description">
+                            <property name="visible">True</property>
+                            <property name="label">&lt;b&gt;Another system update is in progress&lt;/b&gt;</property>
+                            <property name="use_markup">True</property>
+                          </widget>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                      </widget>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
                   <widget class="GtkHBox" id="hbox_reboot">
                     <property name="visible">True</property>
                     <property name="spacing">12</property>
@@ -338,7 +409,7 @@
                   <packing>
                     <property name="expand">False</property>
                     <property name="fill">False</property>
-                    <property name="position">1</property>
+                    <property name="position">2</property>
                   </packing>
                 </child>
                 <child>
@@ -431,7 +502,7 @@
                   <packing>
                     <property name="expand">False</property>
                     <property name="fill">False</property>
-                    <property name="position">2</property>
+                    <property name="position">3</property>
                   </packing>
                 </child>
               </widget>

Modified: trunk/data/icons/16x16/Makefile.am
==============================================================================
--- trunk/data/icons/16x16/Makefile.am	(original)
+++ trunk/data/icons/16x16/Makefile.am	Thu May 22 17:08:24 2008
@@ -1,2 +1,2 @@
-SUBDIRS = categories status
+SUBDIRS = categories status animations
 

Added: trunk/data/icons/16x16/status/pk-package-sources.png
==============================================================================
Binary file. No diff available.

Modified: trunk/data/icons/22x22/Makefile.am
==============================================================================
--- trunk/data/icons/22x22/Makefile.am	(original)
+++ trunk/data/icons/22x22/Makefile.am	Thu May 22 17:08:24 2008
@@ -1,2 +1,2 @@
-SUBDIRS = categories status
+SUBDIRS = categories status animations
 

Added: trunk/data/icons/22x22/status/pk-package-sources.png
==============================================================================
Binary file. No diff available.

Modified: trunk/data/icons/24x24/Makefile.am
==============================================================================
--- trunk/data/icons/24x24/Makefile.am	(original)
+++ trunk/data/icons/24x24/Makefile.am	Thu May 22 17:08:24 2008
@@ -1,2 +1,2 @@
-SUBDIRS = categories status
+SUBDIRS = categories status animations
 

Added: trunk/data/icons/24x24/status/pk-package-sources.png
==============================================================================
Binary file. No diff available.

Modified: trunk/data/icons/48x48/Makefile.am
==============================================================================
--- trunk/data/icons/48x48/Makefile.am	(original)
+++ trunk/data/icons/48x48/Makefile.am	Thu May 22 17:08:24 2008
@@ -1,2 +1,2 @@
-SUBDIRS = categories status
+SUBDIRS = categories status animations
 

Added: trunk/data/icons/48x48/status/pk-package-sources.png
==============================================================================
Binary file. No diff available.

Added: trunk/data/icons/scalable/status/pk-package-sources.svg
==============================================================================
--- (empty file)
+++ trunk/data/icons/scalable/status/pk-package-sources.svg	Thu May 22 17:08:24 2008
@@ -0,0 +1,985 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/";
+   xmlns:cc="http://web.resource.org/cc/";
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#";
+   xmlns:svg="http://www.w3.org/2000/svg";
+   xmlns="http://www.w3.org/2000/svg";
+   xmlns:xlink="http://www.w3.org/1999/xlink";
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd";
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape";
+   version="1.0"
+   width="48"
+   height="48"
+   id="svg2963"
+   sodipodi:version="0.32"
+   inkscape:version="0.45.1"
+   sodipodi:docname="pk-package-sources.svg"
+   sodipodi:docbase="/Users/mlanglie/Desktop/Red Hat Work/ICONS/Package Kit installed:available icons/SVG"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <metadata
+     id="metadata56">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage"; />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview
+     inkscape:window-height="581"
+     inkscape:window-width="701"
+     inkscape:pageshadow="2"
+     inkscape:pageopacity="0.0"
+     guidetolerance="10.0"
+     gridtolerance="10.0"
+     objecttolerance="10.0"
+     borderopacity="1.0"
+     bordercolor="#666666"
+     pagecolor="#ffffff"
+     id="base"
+     inkscape:zoom="5.8041681"
+     inkscape:cx="23.299492"
+     inkscape:cy="32.019838"
+     inkscape:window-x="435"
+     inkscape:window-y="129"
+     inkscape:current-layer="svg2963" />
+  <defs
+     id="defs3">
+    <linearGradient
+       y2="21.4113"
+       x2="16.4902"
+       y1="6.3042"
+       x1="16.4902"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3261">
+      <stop
+         id="stop3263"
+         style="stop-color:#ffffb2;stop-opacity:1;"
+         offset="0.2088" />
+      <stop
+         offset="0.3972649"
+         style="stop-color:#ffffff;stop-opacity:1;"
+         id="stop3269" />
+      <stop
+         offset="0.53957814"
+         style="stop-color:#ffff97;stop-opacity:1;"
+         id="stop3267" />
+      <stop
+         id="stop3265"
+         style="stop-color:#ffffcd;stop-opacity:1;"
+         offset="0.62089998" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3817">
+      <stop
+         style="stop-color:#d68f21;stop-opacity:1;"
+         offset="0"
+         id="stop3819" />
+      <stop
+         style="stop-color:#d68f21;stop-opacity:0;"
+         offset="1"
+         id="stop3821" />
+    </linearGradient>
+    <linearGradient
+       id="SVGID_1_"
+       gradientUnits="userSpaceOnUse"
+       x1="16.4902"
+       y1="6.3042"
+       x2="16.4902"
+       y2="21.4113">
+      <stop
+         offset="0.2088"
+         style="stop-color:#FED3AA"
+         id="stop2741" />
+      <stop
+         offset="0.6209"
+         style="stop-color:#EABA6F"
+         id="stop2743" />
+    </linearGradient>
+    <radialGradient
+       cx="605.71429"
+       cy="486.64789"
+       r="117.14286"
+       fx="605.71429"
+       fy="486.64789"
+       id="radialGradient6719"
+       xlink:href="#linearGradient5060"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)" />
+    <linearGradient
+       id="linearGradient5060">
+      <stop
+         style="stop-color:#000000;stop-opacity:1"
+         offset="0"
+         id="stop5062" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0"
+         offset="1"
+         id="stop5064" />
+    </linearGradient>
+    <radialGradient
+       cx="605.71429"
+       cy="486.64789"
+       r="117.14286"
+       fx="605.71429"
+       fy="486.64789"
+       id="radialGradient6717"
+       xlink:href="#linearGradient5060"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)" />
+    <linearGradient
+       id="linearGradient5048">
+      <stop
+         style="stop-color:#000000;stop-opacity:0"
+         offset="0"
+         id="stop5050" />
+      <stop
+         style="stop-color:#000000;stop-opacity:1"
+         offset="0.5"
+         id="stop5056" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0"
+         offset="1"
+         id="stop5052" />
+    </linearGradient>
+    <linearGradient
+       x1="302.85715"
+       y1="366.64789"
+       x2="302.85715"
+       y2="609.50507"
+       id="linearGradient6715"
+       xlink:href="#linearGradient5048"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)" />
+    <linearGradient
+       id="linearGradient4995">
+      <stop
+         style="stop-color:#de9523;stop-opacity:1"
+         offset="0"
+         id="stop4997" />
+      <stop
+         style="stop-color:#a36d18;stop-opacity:1"
+         offset="1"
+         id="stop4999" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4987">
+      <stop
+         style="stop-color:#a0670c;stop-opacity:1"
+         offset="0"
+         id="stop4989" />
+      <stop
+         style="stop-color:#a0670c;stop-opacity:0"
+         offset="1"
+         id="stop4991" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4979">
+      <stop
+         style="stop-color:#fbf0e0;stop-opacity:1"
+         offset="0"
+         id="stop4981" />
+      <stop
+         style="stop-color:#f0ce99;stop-opacity:1"
+         offset="1"
+         id="stop4983" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4222">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop4224" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0.68639052"
+         offset="1"
+         id="stop4226" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4210">
+      <stop
+         style="stop-color:#eaba6f;stop-opacity:1"
+         offset="0"
+         id="stop4212" />
+      <stop
+         style="stop-color:#b97a1b;stop-opacity:1"
+         offset="1"
+         id="stop4214" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4192">
+      <stop
+         style="stop-color:#e9b96e;stop-opacity:1"
+         offset="0"
+         id="stop4194" />
+      <stop
+         style="stop-color:#f1d19e;stop-opacity:1"
+         offset="1"
+         id="stop4196" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4182">
+      <stop
+         style="stop-color:#a36d18;stop-opacity:1"
+         offset="0"
+         id="stop4184" />
+      <stop
+         style="stop-color:#d79020;stop-opacity:1"
+         offset="1"
+         id="stop4186" />
+    </linearGradient>
+    <linearGradient
+       x1="30.062469"
+       y1="13.444801"
+       x2="17.696169"
+       y2="12.333632"
+       id="linearGradient2269"
+       xlink:href="#linearGradient4979"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       x1="36.288929"
+       y1="14.661557"
+       x2="47.065834"
+       y2="15.267649"
+       id="linearGradient2274"
+       xlink:href="#linearGradient4995"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       x1="25.381256"
+       y1="24.720648"
+       x2="24.119167"
+       y2="16.17037"
+       id="linearGradient2277"
+       xlink:href="#linearGradient4192"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.986355,0,0.316638)" />
+    <linearGradient
+       x1="16.148972"
+       y1="12.636667"
+       x2="34.193642"
+       y2="12.636667"
+       id="linearGradient2280"
+       xlink:href="#linearGradient4182"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.039184,0,-4.057054e-2)" />
+    <linearGradient
+       x1="21.906841"
+       y1="9.7577486"
+       x2="22.071806"
+       y2="16.020695"
+       id="linearGradient2282"
+       xlink:href="#linearGradient4987"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       x1="18.706615"
+       y1="19.912336"
+       x2="30.014812"
+       y2="47.388485"
+       id="linearGradient2285"
+       xlink:href="#linearGradient4222"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       x1="24.990499"
+       y1="34.004856"
+       x2="24.990499"
+       y2="22.585211"
+       id="linearGradient2288"
+       xlink:href="#linearGradient4210"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4210"
+       id="linearGradient2820"
+       gradientUnits="userSpaceOnUse"
+       x1="24.990499"
+       y1="34.004856"
+       x2="24.990499"
+       y2="22.585211" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4222"
+       id="linearGradient2822"
+       gradientUnits="userSpaceOnUse"
+       x1="18.706615"
+       y1="19.912336"
+       x2="30.014812"
+       y2="47.388485" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4182"
+       id="linearGradient2824"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.039184,0,-4.057054e-2)"
+       x1="16.148972"
+       y1="12.636667"
+       x2="34.193642"
+       y2="12.636667" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4987"
+       id="linearGradient2826"
+       gradientUnits="userSpaceOnUse"
+       x1="21.906841"
+       y1="9.7577486"
+       x2="22.071806"
+       y2="16.020695" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4192"
+       id="linearGradient2828"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.986355,0,0.316638)"
+       x1="25.381256"
+       y1="24.720648"
+       x2="24.119167"
+       y2="16.17037" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4995"
+       id="linearGradient2830"
+       gradientUnits="userSpaceOnUse"
+       x1="36.288929"
+       y1="14.661557"
+       x2="47.065834"
+       y2="15.267649" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4979"
+       id="linearGradient2832"
+       gradientUnits="userSpaceOnUse"
+       x1="30.062469"
+       y1="13.444801"
+       x2="17.696169"
+       y2="12.333632" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient2278"
+       gradientUnits="userSpaceOnUse"
+       x1="16.4902"
+       y1="6.3042"
+       x2="16.4902"
+       y2="21.4113" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3261"
+       id="linearGradient3259"
+       x1="24.609137"
+       y1="7.6687818"
+       x2="24.609137"
+       y2="25.833755"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       y2="21.411301"
+       x2="16.4902"
+       y1="6.3042002"
+       x1="16.4902"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2238">
+      <stop
+         id="stop2240"
+         style="stop-color:#FED3AA"
+         offset="0.2088" />
+      <stop
+         id="stop2242"
+         style="stop-color:#EABA6F"
+         offset="0.6209" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5048"
+       id="linearGradient2305"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
+       x1="302.85715"
+       y1="366.64789"
+       x2="302.85715"
+       y2="609.50507" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5060"
+       id="radialGradient2307"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
+       cx="605.71429"
+       cy="486.64789"
+       fx="605.71429"
+       fy="486.64789"
+       r="117.14286" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5060"
+       id="radialGradient2309"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
+       cx="605.71429"
+       cy="486.64789"
+       fx="605.71429"
+       fy="486.64789"
+       r="117.14286" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient2311"
+       gradientUnits="userSpaceOnUse"
+       x1="16.4902"
+       y1="6.3042"
+       x2="16.4902"
+       y2="21.4113" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3817"
+       id="linearGradient2313"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.1214953,0,0,1.1666666,-2.9454908,-2.5177664)"
+       x1="37.279186"
+       y1="14.862945"
+       x2="23.634516"
+       y2="12.913706" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3817"
+       id="linearGradient2315"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1.1121495,0,0,1.2,49.338204,-3.0700507)"
+       x1="37.279186"
+       y1="14.862945"
+       x2="23.634516"
+       y2="12.913706" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3261"
+       id="linearGradient2317"
+       gradientUnits="userSpaceOnUse"
+       x1="24.609137"
+       y1="7.6687818"
+       x2="24.609137"
+       y2="25.833755" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient2319"
+       gradientUnits="userSpaceOnUse"
+       x1="16.4902"
+       y1="6.3042"
+       x2="16.4902"
+       y2="21.4113" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5048"
+       id="linearGradient2363"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
+       x1="302.85715"
+       y1="366.64789"
+       x2="302.85715"
+       y2="609.50507" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5060"
+       id="radialGradient2365"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
+       cx="605.71429"
+       cy="486.64789"
+       fx="605.71429"
+       fy="486.64789"
+       r="117.14286" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5060"
+       id="radialGradient2367"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
+       cx="605.71429"
+       cy="486.64789"
+       fx="605.71429"
+       fy="486.64789"
+       r="117.14286" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient2369"
+       gradientUnits="userSpaceOnUse"
+       x1="16.4902"
+       y1="6.3042"
+       x2="16.4902"
+       y2="21.4113" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3817"
+       id="linearGradient2371"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.1214953,0,0,1.1666666,-2.9454908,-2.5177664)"
+       x1="37.279186"
+       y1="14.862945"
+       x2="23.634516"
+       y2="12.913706" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3817"
+       id="linearGradient2373"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1.1121495,0,0,1.2,49.338204,-3.0700507)"
+       x1="37.279186"
+       y1="14.862945"
+       x2="23.634516"
+       y2="12.913706" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3261"
+       id="linearGradient2375"
+       gradientUnits="userSpaceOnUse"
+       x1="24.609137"
+       y1="7.6687818"
+       x2="24.609137"
+       y2="25.833755" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5048"
+       id="linearGradient2419"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
+       x1="302.85715"
+       y1="366.64789"
+       x2="302.85715"
+       y2="609.50507" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5060"
+       id="radialGradient2421"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
+       cx="605.71429"
+       cy="486.64789"
+       fx="605.71429"
+       fy="486.64789"
+       r="117.14286" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5060"
+       id="radialGradient2423"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
+       cx="605.71429"
+       cy="486.64789"
+       fx="605.71429"
+       fy="486.64789"
+       r="117.14286" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_1_"
+       id="linearGradient2425"
+       gradientUnits="userSpaceOnUse"
+       x1="16.4902"
+       y1="6.3042"
+       x2="16.4902"
+       y2="21.4113" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3817"
+       id="linearGradient2427"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.1214953,0,0,1.1666666,-2.9454908,-2.5177664)"
+       x1="37.279186"
+       y1="14.862945"
+       x2="23.634516"
+       y2="12.913706" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3817"
+       id="linearGradient2429"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1.1121495,0,0,1.2,49.338204,-3.0700507)"
+       x1="37.279186"
+       y1="14.862945"
+       x2="23.634516"
+       y2="12.913706" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3261"
+       id="linearGradient2431"
+       gradientUnits="userSpaceOnUse"
+       x1="24.609137"
+       y1="7.6687818"
+       x2="24.609137"
+       y2="25.833755" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3261"
+       id="linearGradient2307"
+       gradientUnits="userSpaceOnUse"
+       x1="24.609137"
+       y1="7.6687818"
+       x2="24.609137"
+       y2="25.833755"
+       gradientTransform="matrix(0.8930917,0,0,0.8930917,-2.3170783,10.140039)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3817"
+       id="linearGradient2310"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9932515,0,0,1.07171,41.746462,7.3982022)"
+       x1="37.279186"
+       y1="14.862945"
+       x2="23.634516"
+       y2="12.913706" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3817"
+       id="linearGradient2314"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0015981,0,0,1.0419403,-4.9476717,7.8914427)"
+       x1="37.279186"
+       y1="14.862945"
+       x2="23.634516"
+       y2="12.913706" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3261"
+       id="linearGradient3303"
+       gradientUnits="userSpaceOnUse"
+       x1="24.609137"
+       y1="7.6687818"
+       x2="24.609137"
+       y2="25.833755"
+       gradientTransform="matrix(0.8065516,0,0,0.8065516,11.755776,2.2521683)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3817"
+       id="linearGradient3306"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.897006,0,0,0.9678619,51.549583,-0.223986)"
+       x1="37.279186"
+       y1="14.862945"
+       x2="23.634516"
+       y2="12.913706" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3817"
+       id="linearGradient3309"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9045438,0,0,0.9409768,9.3800857,0.2214598)"
+       x1="37.279186"
+       y1="14.862945"
+       x2="23.634516"
+       y2="12.913706" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3261"
+       id="linearGradient3329"
+       gradientUnits="userSpaceOnUse"
+       x1="24.609137"
+       y1="7.6687818"
+       x2="24.609137"
+       y2="25.833755"
+       gradientTransform="matrix(0.6654955,0,0,0.6654955,4.6999482,-3.6774767)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3817"
+       id="linearGradient3332"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.7401305,0,0,0.7985946,37.534301,-5.7205816)"
+       x1="37.279186"
+       y1="14.862945"
+       x2="23.634516"
+       y2="12.913706" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3817"
+       id="linearGradient3335"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.7463501,0,0,0.7764114,2.7397373,-5.3530389)"
+       x1="37.279186"
+       y1="14.862945"
+       x2="23.634516"
+       y2="12.913706" />
+  </defs>
+  <g
+     id="g2379"
+     style="opacity:0.80246911;display:inline"
+     transform="matrix(1.4011748e-2,0,0,1.3887281e-2,33.051201,19.88346)">
+    <rect
+       id="rect2381"
+       style="opacity:0.40206185;color:#000000;fill:url(#linearGradient2419);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       y="-150.69685"
+       x="-1559.2523"
+       height="478.35718"
+       width="1339.6335" />
+    <path
+       id="path2383"
+       style="opacity:0.40206185;color:#000000;fill:url(#radialGradient2421);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z " />
+    <path
+       id="path2385"
+       style="opacity:0.40206185;color:#000000;fill:url(#radialGradient2423);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z " />
+  </g>
+  <g
+     id="g2387"
+     transform="matrix(0.6654955,0,0,0.6654955,9.2924417,1.053899)">
+    <linearGradient
+       id="linearGradient2389"
+       gradientUnits="userSpaceOnUse"
+       x1="16.4902"
+       y1="6.3042002"
+       x2="16.4902"
+       y2="21.411301">
+      <stop
+         offset="0.2088"
+         style="stop-color:#FED3AA"
+         id="stop2391" />
+      <stop
+         offset="0.6209"
+         style="stop-color:#EABA6F"
+         id="stop2393" />
+    </linearGradient>
+    <path
+       d="M 31.25,7.825 L 27.621,2.943 C 27.621,2.943 26.933,2.068 25.132,1.683 L 16.184,0.506 L 7.848,1.682 C 6.496,1.817 5.496,2.817 5.496,2.817 L 1.729,7.825 C 1.259,8.413 0.5,8.822 0.5,11.029 L 0.5,28.687 C 0.5,30.009 1.586,31.082 2.925,31.082 L 30.055,31.082 C 31.394,31.082 32.48,30.01 32.48,28.687 L 32.48,11.029 C 32.479,9.085 31.721,8.413 31.25,7.825 z "
+       id="path2395"
+       style="fill:url(#linearGradient2425);stroke:#9f6928;stroke-width:1" />
+    <path
+       d="M 31.477,10.981 C 31.462,9.884 31.162,9.259 30.289,8.137 L 26.934,3.755 C 26.934,3.755 26.122,2.88 24.809,2.63 L 16.184,1.505 L 7.881,2.681 C 6.871,2.755 6.059,3.755 6.059,3.755 L 2.589,8.3 C 1.717,9.422 1.54,9.681 1.54,10.981 C 1.54,10.986 1.537,10.991 1.537,10.996 L 1.537,28.726 C 1.537,29.436 2.112,30.01 2.822,30.01 L 30.056,30.01 C 30.766,30.01 31.479,29.436 31.479,28.726 L 31.477,10.981 z "
+       id="path2397"
+       style="opacity:0.47999998;fill:none;stroke:#ffffff;stroke-width:1" />
+    <path
+       d="M 2.746,10.005 C 2.746,10.005 12.308,8.005 16.121,8.005 C 19.934,8.005 30.183,10.067 30.183,10.067"
+       id="path2399"
+       style="opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round" />
+    <path
+       d="M 30.746,10.567 C 30.746,9.721 16.235,8.522 16.235,8.522 C 16.235,8.522 1.996,9.764 1.996,10.567"
+       id="path2401"
+       style="fill:#9f6928" />
+    <polygon
+       points="15.496,9.255 15.929,0.88 16.371,0.88 16.809,9.255 15.496,9.255 "
+       id="polygon2403"
+       style="fill:#9f6928" />
+    <line
+       x1="15.371"
+       y1="2.0669999"
+       x2="14.996"
+       y2="7.6919999"
+       id="line2405"
+       style="opacity:0.5;fill:none;stroke:#ffffff;stroke-width:1" />
+    <line
+       x1="17.309"
+       y1="7.5669999"
+       x2="16.934"
+       y2="1.942"
+       id="line2407"
+       style="opacity:0.5;fill:none;stroke:#ffffff;stroke-width:1" />
+    <line
+       x1="2.059"
+       y1="11.005"
+       x2="30.934"
+       y2="11.005"
+       id="line2409"
+       style="opacity:0.31000001;fill:none;stroke:#9f6928" />
+  </g>
+  <path
+     style="opacity:0.51234568;fill:url(#linearGradient3335);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     d="M 20.833992,1.8356636 L 21.106769,5.9975435 L 30.563063,7.5109554 L 27.74436,3.4436632 C 27.74436,3.4436632 27.28973,2.7815453 25.471213,2.497781 C 23.652695,2.2140165 20.924917,1.8356636 20.833992,1.8356636 z "
+     id="path2411" />
+  <path
+     style="opacity:0.44444448;fill:url(#linearGradient3332);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     d="M 19.590833,1.6735125 L 19.320328,5.9543036 L 9.9428367,7.5109554 L 12.73805,3.3274551 C 12.73805,3.3274551 13.188892,2.6464193 14.992255,2.3545474 C 16.795618,2.0626754 19.500665,1.6735125 19.590833,1.6735125 z "
+     id="path2413" />
+  <path
+     style="opacity:0.70987674;fill:url(#linearGradient3329);fill-opacity:1;fill-rule:evenodd;stroke:#9f6928;stroke-width:0.33274776;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+     d="M 20.027141,1.5435593 L 18.57137,1.7141559 L 17.843484,6.9496546 L 17.843484,13.147081 L 18.592167,12.614742 L 19.320052,13.230268 L 20.151922,12.614742 L 20.838214,13.167878 L 21.50371,12.614742 L 22.210799,13.209472 L 22.210799,6.8664676 L 21.316539,1.7141559 L 20.027141,1.5435593 z "
+     id="path2415"
+     sodipodi:nodetypes="ccccccccccccc" />
+  <g
+     id="g2323"
+     style="opacity:0.80246911;display:inline"
+     transform="matrix(1.6981629e-2,0,0,1.683078e-2,46.116261,30.806999)">
+    <rect
+       id="rect2325"
+       style="opacity:0.40206185;color:#000000;fill:url(#linearGradient2363);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       y="-150.69685"
+       x="-1559.2523"
+       height="478.35718"
+       width="1339.6335" />
+    <path
+       id="path2327"
+       style="opacity:0.40206185;color:#000000;fill:url(#radialGradient2365);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z " />
+    <path
+       id="path2329"
+       style="opacity:0.40206185;color:#000000;fill:url(#radialGradient2367);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z " />
+  </g>
+  <g
+     id="g2331"
+     transform="matrix(0.8065516,0,0,0.8065516,17.321678,7.9863899)">
+    <linearGradient
+       id="linearGradient2333"
+       gradientUnits="userSpaceOnUse"
+       x1="16.4902"
+       y1="6.3042002"
+       x2="16.4902"
+       y2="21.411301">
+      <stop
+         offset="0.2088"
+         style="stop-color:#FED3AA"
+         id="stop2335" />
+      <stop
+         offset="0.6209"
+         style="stop-color:#EABA6F"
+         id="stop2337" />
+    </linearGradient>
+    <path
+       d="M 31.25,7.825 L 27.621,2.943 C 27.621,2.943 26.933,2.068 25.132,1.683 L 16.184,0.506 L 7.848,1.682 C 6.496,1.817 5.496,2.817 5.496,2.817 L 1.729,7.825 C 1.259,8.413 0.5,8.822 0.5,11.029 L 0.5,28.687 C 0.5,30.009 1.586,31.082 2.925,31.082 L 30.055,31.082 C 31.394,31.082 32.48,30.01 32.48,28.687 L 32.48,11.029 C 32.479,9.085 31.721,8.413 31.25,7.825 z "
+       id="path2339"
+       style="fill:url(#linearGradient2369);stroke:#9f6928;stroke-width:1" />
+    <path
+       d="M 31.477,10.981 C 31.462,9.884 31.162,9.259 30.289,8.137 L 26.934,3.755 C 26.934,3.755 26.122,2.88 24.809,2.63 L 16.184,1.505 L 7.881,2.681 C 6.871,2.755 6.059,3.755 6.059,3.755 L 2.589,8.3 C 1.717,9.422 1.54,9.681 1.54,10.981 C 1.54,10.986 1.537,10.991 1.537,10.996 L 1.537,28.726 C 1.537,29.436 2.112,30.01 2.822,30.01 L 30.056,30.01 C 30.766,30.01 31.479,29.436 31.479,28.726 L 31.477,10.981 z "
+       id="path2341"
+       style="opacity:0.47999998;fill:none;stroke:#ffffff;stroke-width:1" />
+    <path
+       d="M 2.746,10.005 C 2.746,10.005 12.308,8.005 16.121,8.005 C 19.934,8.005 30.183,10.067 30.183,10.067"
+       id="path2343"
+       style="opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round" />
+    <path
+       d="M 30.746,10.567 C 30.746,9.721 16.235,8.522 16.235,8.522 C 16.235,8.522 1.996,9.764 1.996,10.567"
+       id="path2345"
+       style="fill:#9f6928" />
+    <polygon
+       points="15.496,9.255 15.929,0.88 16.371,0.88 16.809,9.255 15.496,9.255 "
+       id="polygon2347"
+       style="fill:#9f6928" />
+    <line
+       x1="15.371"
+       y1="2.0669999"
+       x2="14.996"
+       y2="7.6919999"
+       id="line2349"
+       style="opacity:0.5;fill:none;stroke:#ffffff;stroke-width:1" />
+    <line
+       x1="17.309"
+       y1="7.5669999"
+       x2="16.934"
+       y2="1.942"
+       id="line2351"
+       style="opacity:0.5;fill:none;stroke:#ffffff;stroke-width:1" />
+    <line
+       x1="2.059"
+       y1="11.005"
+       x2="30.934"
+       y2="11.005"
+       id="line2353"
+       style="opacity:0.31000001;fill:none;stroke:#9f6928" />
+  </g>
+  <path
+     style="opacity:0.51234568;fill:url(#linearGradient3309);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     d="M 31.309535,8.9338546 L 31.640129,13.977872 L 43.100746,15.812061 L 39.6846,10.88268 C 39.6846,10.88268 39.133609,10.080222 36.929645,9.736312 C 34.725681,9.3924018 31.419732,8.9338546 31.309535,8.9338546 z "
+     id="path2355" />
+  <path
+     style="opacity:0.44444448;fill:url(#linearGradient3306);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     d="M 29.80288,8.7373344 L 29.47504,13.925467 L 18.109929,15.812061 L 21.497606,10.741841 C 21.497606,10.741841 22.044006,9.9164552 24.229605,9.5627192 C 26.415202,9.208983 29.693601,8.7373344 29.80288,8.7373344 z "
+     id="path2357" />
+  <path
+     style="opacity:0.70987674;fill:url(#linearGradient3303);fill-opacity:1;fill-rule:evenodd;stroke:#9f6928;stroke-width:0.40327579;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+     d="M 30.331668,8.5798368 L 28.567336,8.7865925 L 27.68517,15.131789 L 27.68517,22.642801 L 28.592541,21.997628 L 29.474706,22.74362 L 30.482896,21.997628 L 31.314652,22.668006 L 32.121204,21.997628 L 32.978165,22.718415 L 32.978165,15.03097 L 31.894361,8.7865925 L 30.331668,8.5798368 z "
+     id="path2359"
+     sodipodi:nodetypes="ccccccccccccc" />
+  <g
+     id="g6707"
+     style="opacity:0.80246911;display:inline"
+     transform="matrix(1.8803697e-2,0,0,1.8636662e-2,35.730164,41.7587)">
+    <rect
+       id="rect6709"
+       style="opacity:0.40206185;color:#000000;fill:url(#linearGradient6715);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       y="-150.69685"
+       x="-1559.2523"
+       height="478.35718"
+       width="1339.6335" />
+    <path
+       id="path6711"
+       style="opacity:0.40206185;color:#000000;fill:url(#radialGradient6717);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z " />
+    <path
+       id="path6713"
+       style="opacity:0.40206185;color:#000000;fill:url(#radialGradient6719);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z " />
+  </g>
+  <g
+     id="closed_box_1_"
+     transform="matrix(0.8930917,0,0,0.8930917,3.8460254,16.489522)">
+    <linearGradient
+       id="linearGradient2770"
+       gradientUnits="userSpaceOnUse"
+       x1="16.4902"
+       y1="6.3042002"
+       x2="16.4902"
+       y2="21.411301">
+      <stop
+         offset="0.2088"
+         style="stop-color:#FED3AA"
+         id="stop2772" />
+      <stop
+         offset="0.6209"
+         style="stop-color:#EABA6F"
+         id="stop2774" />
+    </linearGradient>
+    <path
+       d="M 31.25,7.825 L 27.621,2.943 C 27.621,2.943 26.933,2.068 25.132,1.683 L 16.184,0.506 L 7.848,1.682 C 6.496,1.817 5.496,2.817 5.496,2.817 L 1.729,7.825 C 1.259,8.413 0.5,8.822 0.5,11.029 L 0.5,28.687 C 0.5,30.009 1.586,31.082 2.925,31.082 L 30.055,31.082 C 31.394,31.082 32.48,30.01 32.48,28.687 L 32.48,11.029 C 32.479,9.085 31.721,8.413 31.25,7.825 z "
+       id="path2745"
+       style="fill:url(#linearGradient2319);stroke:#9f6928;stroke-width:1" />
+    <path
+       d="M 31.477,10.981 C 31.462,9.884 31.162,9.259 30.289,8.137 L 26.934,3.755 C 26.934,3.755 26.122,2.88 24.809,2.63 L 16.184,1.505 L 7.881,2.681 C 6.871,2.755 6.059,3.755 6.059,3.755 L 2.589,8.3 C 1.717,9.422 1.54,9.681 1.54,10.981 C 1.54,10.986 1.537,10.991 1.537,10.996 L 1.537,28.726 C 1.537,29.436 2.112,30.01 2.822,30.01 L 30.056,30.01 C 30.766,30.01 31.479,29.436 31.479,28.726 L 31.477,10.981 z "
+       id="path2747"
+       style="opacity:0.47999998;fill:none;stroke:#ffffff;stroke-width:1" />
+    <path
+       d="M 2.746,10.005 C 2.746,10.005 12.308,8.005 16.121,8.005 C 19.934,8.005 30.183,10.067 30.183,10.067"
+       id="path2749"
+       style="opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round" />
+    <path
+       d="M 30.746,10.567 C 30.746,9.721 16.235,8.522 16.235,8.522 C 16.235,8.522 1.996,9.764 1.996,10.567"
+       id="path2751"
+       style="fill:#9f6928" />
+    <polygon
+       points="15.496,9.255 15.929,0.88 16.371,0.88 16.809,9.255 15.496,9.255 "
+       id="polygon2753"
+       style="fill:#9f6928" />
+    <line
+       x1="15.371"
+       y1="2.0669999"
+       x2="14.996"
+       y2="7.6919999"
+       id="line2755"
+       style="opacity:0.5;fill:none;stroke:#ffffff;stroke-width:1" />
+    <line
+       x1="17.309"
+       y1="7.5669999"
+       x2="16.934"
+       y2="1.942"
+       id="line2757"
+       style="opacity:0.5;fill:none;stroke:#ffffff;stroke-width:1" />
+    <line
+       x1="2.059"
+       y1="11.005"
+       x2="30.934"
+       y2="11.005"
+       id="line2759"
+       style="opacity:0.31000001;fill:none;stroke:#9f6928" />
+  </g>
+  <path
+     style="opacity:0.51234568;fill:url(#linearGradient2314);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     d="M 19.334729,17.538646 L 19.700795,23.123869 L 32.391095,25.15486 L 28.608409,19.696574 C 28.608409,19.696574 27.998298,18.808015 25.557857,18.427205 C 23.117415,18.046394 19.45675,17.538646 19.334729,17.538646 z "
+     id="path2846" />
+  <path
+     style="opacity:0.44444448;fill:url(#linearGradient2310);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     d="M 17.666416,17.32104 L 17.3034,23.065841 L 4.7188524,25.15486 L 8.4700155,19.540623 C 8.4700155,19.540623 9.0750422,18.626676 11.495147,18.234986 C 13.915252,17.843295 17.545411,17.32104 17.666416,17.32104 z "
+     id="path3825" />
+  <path
+     style="opacity:0.70987674;fill:url(#linearGradient2307);fill-opacity:1;fill-rule:evenodd;stroke:#9f6928;stroke-width:0.44654584;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+     d="M 18.25194,17.146644 L 16.298302,17.375584 L 15.321483,24.401597 L 15.321483,32.718514 L 16.326211,32.004116 L 17.30303,32.83015 L 18.419395,32.004116 L 19.340395,32.746423 L 20.233487,32.004116 L 21.182397,32.802241 L 21.182397,24.289961 L 19.982305,17.375584 L 18.25194,17.146644 z "
+     id="path2280"
+     sodipodi:nodetypes="ccccccccccccc" />
+</svg>

Modified: trunk/help/C/gnome-packagekit.xml
==============================================================================
--- trunk/help/C/gnome-packagekit.xml	(original)
+++ trunk/help/C/gnome-packagekit.xml	Thu May 22 17:08:24 2008
@@ -340,6 +340,20 @@
   </para>
 </section>
 
+<section id="mime-types">
+  <title>File handler helper</title>
+  <para>
+    Sometimes you will not have the software on your system to open a particular
+    file. If the file type is not recognised, then applications that can open
+    this file type are shown.
+  </para>
+  <para>
+    At this time, only a limited number of packages will be shown, as they will
+    need to be rebuilt by the distro to support the extra data needed by PackageKit.
+    This will happen automatically, and soon all suitable applications will be shown.
+  </para>
+</section>
+
 <section id="update-viewer">
   <title>Update Viewer</title>
    <para>

Modified: trunk/man/Makefile.am
==============================================================================
--- trunk/man/Makefile.am	(original)
+++ trunk/man/Makefile.am	Thu May 22 17:08:24 2008
@@ -2,6 +2,7 @@
 	gpk-application.sgml				\
 	gpk-backend-status.sgml				\
 	gpk-install-local-file.sgml			\
+	gpk-install-mime-type.sgml			\
 	gpk-install-package-name.sgml			\
 	gpk-install-provide-file.sgml			\
 	gpk-prefs.sgml					\
@@ -14,6 +15,7 @@
 	gpk-application.1				\
 	gpk-backend-status.1				\
 	gpk-install-local-file.1			\
+	gpk-install-mime-type.1			\
 	gpk-install-package-name.1			\
 	gpk-install-provide-file.1			\
 	gpk-prefs.1					\
@@ -33,6 +35,8 @@
 	docbook2man $? > /dev/null
 gpk-install-provide-file.1: gpk-install-provide-file.sgml
 	docbook2man $? > /dev/null
+gpk-install-mime-type.1: gpk-install-mime-type.sgml
+	docbook2man $? > /dev/null
 gpk-prefs.1: gpk-prefs.sgml
 	docbook2man $? > /dev/null
 gpk-repo.1: gpk-repo.sgml

Added: trunk/man/gpk-install-mime-type.sgml
==============================================================================
--- (empty file)
+++ trunk/man/gpk-install-mime-type.sgml	Thu May 22 17:08:24 2008
@@ -0,0 +1,76 @@
+<!doctype refentry PUBLIC "-//OASIS//DTD DocBook V4.1//EN" [
+  <!-- Please adjust the date whenever revising the manpage. -->
+  <!ENTITY date        "<date>02 May,2008</date>">
+  <!ENTITY package     "gpk-install-mime-type">
+  <!ENTITY gnu         "<acronym>GNU</acronym>">
+  <!ENTITY gpl         "&gnu; <acronym>GPL</acronym>">
+]>
+
+<refentry>
+  <refentryinfo>
+    <address>
+      <email>richard hughsie com</email>;
+    </address>
+    <author>
+      <firstname>Richard</firstname>
+      <surname>Hughes</surname>
+    </author>
+    <copyright>
+      <year>2008</year>
+      <holder>Richard Hughes</holder>
+    </copyright>
+    &date;
+  </refentryinfo>
+  <refmeta>
+    <refentrytitle>gpk-install-mime-type</refentrytitle>
+    <manvolnum>1</manvolnum>
+  </refmeta>
+  <refnamediv>
+    <refname>&package;</refname>
+    <refpurpose>GNOME PackageKit MimeType installer</refpurpose>
+  </refnamediv>
+  <refsynopsisdiv>
+    <cmdsynopsis>
+      <command>&package;</command>
+      <arg><option>--verbose</option></arg>
+      <arg><option>mime-type</option></arg>
+    </cmdsynopsis>
+  </refsynopsisdiv>
+  <refsect1>
+    <title>DESCRIPTION</title>
+    <para>
+      This manual page documents briefly the <command>&package;</command> command.
+    </para>
+    <para>
+      <command>&package;</command> allows you to install a package that provides a MimeType.
+    </para>
+  </refsect1>
+  <refsect1>
+    <title>SEE ALSO</title>
+    <para>gpk-install-local-file (1).</para>
+    <para>gpk-install-package-name (1).</para>
+  </refsect1>
+  <refsect1>
+    <title>AUTHOR</title>
+    <para>This manual page was written by Richard Hughes <email>richard hughsie com</email>.
+    </para>
+  </refsect1>
+</refentry>
+
+<!-- Keep this comment at the end of the file
+Local variables:
+mode: sgml
+sgml-omittag:t
+sgml-shorttag:t
+sgml-minimize-attributes:nil
+sgml-always-quote-attributes:t
+sgml-indent-step:2
+sgml-indent-data:t
+sgml-parent-document:nil
+sgml-default-dtd-file:nil
+sgml-exposed-tags:nil
+sgml-local-catalogs:nil
+sgml-local-ecat-files:nil
+End:
+-->
+

Modified: trunk/po/POTFILES.in
==============================================================================
--- trunk/po/POTFILES.in	(original)
+++ trunk/po/POTFILES.in	Thu May 22 17:08:24 2008
@@ -11,7 +11,6 @@
 data/gpk-log.glade
 data/gpk-prefs.desktop.in
 data/gpk-prefs.glade
-data/gpk-progress.glade
 data/gpk-repo.desktop.in
 data/gpk-repo.glade
 data/gpk-signature.glade
@@ -31,10 +30,10 @@
 src/gpk-install-local-file.c
 src/gpk-install-package-name.c
 src/gpk-install-provide-file.c
+src/gpk-install-mime-type.c
 src/gpk-log.c
 src/gpk-notify.c
 src/gpk-prefs.c
-src/gpk-progress.c
 src/gpk-repo.c
 src/gpk-smart-icon.c
 src/gpk-statusbar.c
@@ -43,5 +42,10 @@
 src/gpk-watch.c
 src/gpk-consolekit.c
 src/gpk-client-eula.c
+src/gpk-client-depends.c
+src/gpk-client-resolve.c
+src/gpk-client-requires.c
 src/gpk-client-signature.c
 src/gpk-client-untrusted.c
+src/gpk-client-chooser.c
+

Modified: trunk/src/Makefile.am
==============================================================================
--- trunk/src/Makefile.am	(original)
+++ trunk/src/Makefile.am	Thu May 22 17:08:24 2008
@@ -22,6 +22,7 @@
 	-DVERSION="\"$(VERSION)\"" 			\
 	-DPK_DATA=\"$(pkgdatadir)\"			\
 	-I$(top_srcdir)/libgbus				\
+	-I$(top_srcdir)/libunique			\
 	-I$(top_srcdir)/libselftest			\
 	$(NULL)
 
@@ -29,6 +30,10 @@
 	$(top_builddir)/libselftest/libselftest.la	\
 	$(NULL)
 
+LIBUNIQUE_LIBS =					\
+	$(top_builddir)/libunique/libunique.la		\
+	$(NULL)
+
 bin_PROGRAMS =						\
 	gpk-application					\
 	gpk-repo					\
@@ -46,6 +51,8 @@
 shared_SOURCES =					\
 	gpk-marshal.c					\
 	gpk-marshal.h					\
+	gpk-animated-icon.c				\
+	gpk-animated-icon.h				\
 	gpk-consolekit.c				\
 	gpk-consolekit.h				\
 	gpk-client.c					\
@@ -83,6 +90,7 @@
 	$(LIBNOTIFY_LIBS)				\
 	$(PACKAGEKIT_LIBS)				\
 	$(POLKIT_GNOME_LIBS)				\
+	$(LIBUNIQUE_LIBS)				\
 	$(NULL)
 
 gpk_install_provide_file_SOURCES =			\
@@ -146,8 +154,6 @@
 	gpk-application-main.c				\
 	gpk-application.c				\
 	gpk-application.h				\
-	gpk-statusbar.c					\
-	gpk-statusbar.h					\
 	$(shared_SOURCES)				\
 	$(NULL)
 
@@ -181,14 +187,9 @@
 
 gpk_repo_SOURCES =					\
 	gpk-repo.c					\
-	gpk-common.c					\
-	gpk-common.h					\
-	gpk-gnome.c					\
-	gpk-gnome.h					\
-	gpk-error.c					\
-	gpk-error.h					\
 	gpk-statusbar.c					\
 	gpk-statusbar.h					\
+	$(shared_SOURCES)				\
 	$(NULL)
 
 gpk_repo_LDADD =					\
@@ -197,10 +198,7 @@
 
 gpk_log_SOURCES =					\
 	gpk-log.c					\
-	gpk-gnome.c					\
-	gpk-gnome.h					\
-	gpk-common.c					\
-	gpk-common.h					\
+	$(shared_SOURCES)				\
 	$(NULL)
 
 gpk_log_LDADD =						\
@@ -235,21 +233,20 @@
 		--output=gpk-interface.h		\
 		$(srcdir)/gpk-interface.xml
 
-check_PROGRAMS =						\
+check_PROGRAMS =					\
 	gpk-self-test
 
-noinst_PROGRAMS =						\
+noinst_PROGRAMS =					\
 	gpk-self-test
 
-gpk_self_test_SOURCES =						\
-	gpk-self-test.c						\
-	gpk-common.c						\
-	gpk-common.h						\
+gpk_self_test_SOURCES =					\
+	gpk-self-test.c					\
+	$(shared_SOURCES)				\
 	$(NULL)
 
-gpk_self_test_LDADD =						\
-	$(shared_LIBS)						\
-	$(SELFTEST_LIBS)					\
+gpk_self_test_LDADD =					\
+	$(shared_LIBS)					\
+	$(SELFTEST_LIBS)				\
 	$(NULL)
 
 gpk_self_test_CPPFLAGS = -DPK_BUILD_TESTS

Modified: trunk/src/gpk-application-main.c
==============================================================================
--- trunk/src/gpk-application-main.c	(original)
+++ trunk/src/gpk-application-main.c	Thu May 22 17:08:24 2008
@@ -31,8 +31,12 @@
 #include <gtk/gtk.h>
 #include <locale.h>
 
+/* local .la */
+#include <libunique.h>
+
 #include <pk-debug.h>
 #include "gpk-application.h"
+#include "gpk-common.h"
 
 /**
  * gpk_application_close_cb
@@ -43,8 +47,16 @@
 static void
 gpk_application_close_cb (GpkApplication *application)
 {
-	g_object_unref (application);
-	exit (0);
+	gtk_main_quit ();
+}
+
+/**
+ * gpk_application_activated_cb
+ **/
+static void
+gpk_application_activated_cb (LibUnique *libunique, GpkApplication *application)
+{
+	gpk_application_show (application);
 }
 
 /**
@@ -57,6 +69,8 @@
 	gboolean program_version = FALSE;
 	GpkApplication *application = NULL;
 	GOptionContext *context;
+	LibUnique *libunique;
+	gboolean ret;
 
 	const GOptionEntry options[] = {
 		{ "verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose,
@@ -92,8 +106,23 @@
 	pk_debug_init (verbose);
 	gtk_init (&argc, &argv);
 
+	/* are we running privileged */
+	ret = gpk_check_privileged_user (_("Package installer"));
+	if (!ret) {
+		return 1;
+	}
+
+	/* are we already activated? */
+	libunique = libunique_new ();
+	ret = libunique_assign (libunique, "org.freedesktop.PackageKit.Application");
+	if (!ret) {
+		goto unique_out;
+	}
+
 	/* create a new application object */
 	application = gpk_application_new ();
+	g_signal_connect (libunique, "activated",
+			  G_CALLBACK (gpk_application_activated_cb), application);
 	g_signal_connect (application, "action-close",
 			  G_CALLBACK (gpk_application_close_cb), NULL);
 
@@ -101,6 +130,8 @@
 	gtk_main ();
 
 	g_object_unref (application);
-
+unique_out:
+	g_object_unref (libunique);
 	return 0;
 }
+

Modified: trunk/src/gpk-application.c
==============================================================================
--- trunk/src/gpk-application.c	(original)
+++ trunk/src/gpk-application.c	Thu May 22 17:08:24 2008
@@ -1,6 +1,6 @@
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
  *
- * Copyright (C) 2007 Richard Hughes <richard hughsie com>
+ * Copyright (C) 2007-2008 Richard Hughes <richard hughsie com>
  *
  * Licensed under the GNU General Public License Version 2
  *
@@ -47,8 +47,8 @@
 #include <gpk-gnome.h>
 #include <gpk-error.h>
 
-#include "gpk-statusbar.h"
 #include "gpk-application.h"
+#include "gpk-animated-icon.h"
 
 static void     gpk_application_class_init (GpkApplicationClass *klass);
 static void     gpk_application_init       (GpkApplication      *application);
@@ -71,6 +71,13 @@
 	PK_MODE_UNKNOWN
 } PkSearchMode;
 
+typedef enum {
+	PK_ACTION_NONE,
+	PK_ACTION_INSTALL,
+	PK_ACTION_REMOVE,
+	PK_ACTION_UNKNOWN
+} PkActionMode;
+
 struct GpkApplicationPrivate
 {
 	GladeXML		*glade_xml;
@@ -84,7 +91,6 @@
 	PkClient		*client_files;
 	GpkClient		*gclient;
 	PkConnection		*pconnection;
-	GpkStatusbar		*statusbar;
 	PkExtra			*extra;
 	gchar			*package;
 	gchar			*group;
@@ -97,9 +103,8 @@
 	gboolean		 has_package; /* if we got a package in the search */
 	PkSearchType		 search_type;
 	PkSearchMode		 search_mode;
-	PolKitGnomeAction	*install_action;
-	PolKitGnomeAction	*remove_action;
-	PolKitGnomeAction	*refresh_action;
+	PkActionMode		 action;
+	GPtrArray		*package_list;
 };
 
 enum {
@@ -110,7 +115,9 @@
 enum
 {
 	PACKAGES_COLUMN_IMAGE,
-	PACKAGES_COLUMN_INSTALLED,
+	PACKAGES_COLUMN_INSTALLED, /* state on disk */
+	PACKAGES_COLUMN_SELECTED,  /* do we want to change the state */
+	PACKAGES_COLUMN_CHECKBOX,  /* what we show in the checkbox */
 	PACKAGES_COLUMN_TEXT,
 	PACKAGES_COLUMN_ID,
 	PACKAGES_COLUMN_LAST
@@ -153,6 +160,17 @@
 }
 
 /**
+ * gpk_application_show:
+ **/
+void
+gpk_application_show (GpkApplication *application)
+{
+	GtkWidget *widget;
+	widget = glade_xml_get_widget (application->priv->glade_xml, "window_manager");
+	gtk_window_present (GTK_WINDOW (widget));
+}
+
+/**
  * gpk_application_set_find_cancel_buttons:
  **/
 static void
@@ -223,47 +241,6 @@
 }
 
 /**
- * gpk_application_install:
- **/
-static gboolean
-gpk_application_install (GpkApplication *application, const gchar *package_id)
-{
-	gboolean ret;
-	gchar **package_ids = NULL;
-	g_return_val_if_fail (PK_IS_APPLICATION (application), FALSE);
-	g_return_val_if_fail (package_id != NULL, FALSE);
-
-	pk_debug ("install %s", application->priv->package);
-	package_ids = g_strsplit (package_id, "|", 1);
-	ret = gpk_client_install_package_ids (application->priv->gclient, package_ids, NULL);
-	g_strfreev (package_ids);
-
-	/* refresh the search as the items may have changed and the filter has not changed */
-	if (ret) {
-		gpk_application_refresh_search_results (application);
-	}
-	return ret;
-}
-
-/**
- * gpk_application_install_cb:
- **/
-static void
-gpk_application_install_cb (PolKitGnomeAction *action, GpkApplication *application)
-{
-	GtkWidget *widget;
-
-	g_return_if_fail (PK_IS_APPLICATION (application));
-
-	/* hide and show the right things */
-	polkit_gnome_action_set_visible (application->priv->install_action, FALSE);
-	widget = glade_xml_get_widget (application->priv->glade_xml, "button_cancel2");
-	gtk_widget_show (widget);
-
-	gpk_application_install (application, application->priv->package);
-}
-
-/**
  * gpk_application_homepage_cb:
  **/
 static void
@@ -274,27 +251,6 @@
 }
 
 /**
- * gpk_application_remove_cb:
- **/
-static void
-gpk_application_remove_cb (PolKitGnomeAction *action, GpkApplication *application)
-{
-	gboolean ret;
-	gchar **package_ids = NULL;
-	g_return_if_fail (PK_IS_APPLICATION (application));
-
-	package_ids = g_strsplit (application->priv->package, "|", 1);
-	ret = gpk_client_remove_package_ids (application->priv->gclient, package_ids, NULL);
-	g_strfreev (package_ids);
-
-	/* refresh the search as the items may have changed and the filter has not changed */
-	if (ret) {
-		gpk_application_refresh_search_results (application);
-	}
-	return;
-}
-
-/**
  * gpk_application_set_text_buffer:
  **/
 static void
@@ -317,21 +273,43 @@
  **/
 static void
 gpk_application_details_cb (PkClient *client, const gchar *package_id,
-			       const gchar *license, PkGroupEnum group,
-			       const gchar *detail, const gchar *url,
-			       guint64 size, GpkApplication *application)
+			    const gchar *license, PkGroupEnum group,
+			    const gchar *detail, const gchar *url,
+			    guint64 size, GpkApplication *application)
 {
 	GtkWidget *widget;
 	gchar *text;
 	PkPackageId *ident;
 	const gchar *repo_name;
+	const gchar *icon;
+	gboolean valid = FALSE;
+	gboolean installed;
+	PkInfoEnum info;
 
 	g_return_if_fail (PK_IS_APPLICATION (application));
 
+	ident = pk_package_id_new_from_string (package_id);
+	installed = pk_strequal (ident->data, "installed");
+
 	pk_debug ("details = %s:%i:%s:%s", package_id, group, detail, url);
-	widget = glade_xml_get_widget (application->priv->glade_xml, "vbox_description_pane");
+	widget = glade_xml_get_widget (application->priv->glade_xml, "notebook_description");
 	gtk_widget_show (widget);
 
+	/* get the icon */
+	icon = pk_extra_get_icon_name (application->priv->extra, ident->name);
+	if (icon != NULL) {
+		/* check icon actually exists and is valid in this theme */
+		valid = gpk_check_icon_valid (icon);
+	}
+
+	/* nothing in the detail database or invalid */
+	if (valid == FALSE) {
+		info = installed ? PK_INFO_ENUM_INSTALLED : PK_INFO_ENUM_AVAILABLE;
+		icon = gpk_info_enum_to_icon_name (info);
+	}
+	widget = glade_xml_get_widget (application->priv->glade_xml, "image_icon");
+	gtk_image_set_from_icon_name (GTK_IMAGE (widget), icon, GTK_ICON_SIZE_DIALOG);
+
 	/* homepage button? */
 	widget = glade_xml_get_widget (application->priv->glade_xml, "button_homepage");
 	if (pk_strzero (url) == FALSE) {
@@ -370,8 +348,7 @@
 	}
 
 	/* set the repo text, or hide if installed */
-	ident = pk_package_id_new_from_string (package_id);
-	if (pk_strequal (ident->data, "installed")) {
+	if (installed) {
 		widget = glade_xml_get_widget (application->priv->glade_xml, "hbox_source");
 		gtk_widget_hide (widget);
 	} else {
@@ -401,7 +378,7 @@
 
 	g_return_if_fail (PK_IS_APPLICATION (application));
 
-	widget = glade_xml_get_widget (application->priv->glade_xml, "vbox_description_pane");
+	widget = glade_xml_get_widget (application->priv->glade_xml, "notebook_description");
 	gtk_widget_show (widget);
 
 	/* set the text box */
@@ -424,38 +401,79 @@
 	}
 }
 
+static gint
+pk_ptr_array_find_string (GPtrArray *array, const gchar *string)
+{
+	gint i;
+	gchar *item;
+
+	g_return_val_if_fail (array != NULL, FALSE);
+	g_return_val_if_fail (string != NULL, FALSE);
+
+	for (i=0; i<array->len; i++) {
+		item = (gchar *) g_ptr_array_index (array, i);
+		if (pk_strequal (string, item)) {
+			return i;
+		}
+	}
+	return -1;
+}
+
+static gboolean
+pk_ptr_array_remove_string (GPtrArray *array, const gchar *string)
+{
+	guint i;
+	gchar *item;
+	gboolean ret = FALSE;
+
+	g_return_val_if_fail (array != NULL, FALSE);
+	g_return_val_if_fail (string != NULL, FALSE);
+
+	for (i=0; i<array->len; i++) {
+		item = (gchar *) g_ptr_array_index (array, i);
+		if (pk_strequal (string, item)) {
+			g_free (item);
+			g_ptr_array_remove_index (array, i);
+			ret = TRUE;
+		}
+	}
+	return ret;
+}
+
 /**
- * gpk_icon_valid:
- *
- * Check icon actually exists and is valid in this theme
+ * gpk_application_get_icon:
  **/
-gboolean
-gpk_icon_valid (const gchar *icon)
+static const gchar *
+gpk_application_get_icon (gboolean in_queue, gboolean installed)
 {
-	GtkIconInfo *icon_info;
-	static GtkIconTheme *icon_theme = NULL;
-	gboolean ret = TRUE;
-
-	/* trivial case */
-	if (pk_strzero (icon)) {
-		return FALSE;
+	if (!in_queue) {
+		/* trivial case, not in list and installed */
+		if (installed) {
+			return gpk_info_enum_to_icon_name (PK_INFO_ENUM_INSTALLED);
+		}
+		/* not in list and not installed */
+		return gpk_info_enum_to_icon_name (PK_INFO_ENUM_AVAILABLE);
 	}
 
-	/* no unref required */
-	if (icon_theme == NULL) {
-		icon_theme = gtk_icon_theme_get_default ();
+	/* installed, and queued to be removed */
+	if (installed) {
+		return gpk_info_enum_to_icon_name (PK_INFO_ENUM_REMOVING);
 	}
+	/* available, and queued to be added */
+	return gpk_info_enum_to_icon_name (PK_INFO_ENUM_INSTALLING);
+}
 
-	/* default to 32x32 */
-	icon_info = gtk_icon_theme_lookup_icon (icon_theme, icon, 32, GTK_ICON_LOOKUP_USE_BUILTIN);
-	if (icon_info == NULL) {
-		pk_debug ("ignoring broken icon %s", icon);
-		ret = FALSE;
-	} else {
-		/* we only used this to see if it was valid */
-		gtk_icon_info_free (icon_info);
+/**
+ * gpk_application_get_checkbox:
+ **/
+static gboolean
+gpk_application_get_checkbox (gboolean in_queue, gboolean installed)
+{
+	/* common case */
+	if (!in_queue) {
+		return installed;
 	}
-	return ret;
+	return !installed;
 }
 
 /**
@@ -467,10 +485,13 @@
 {
 	GtkTreeIter iter;
 	PkPackageId *ident;
-	gboolean valid = FALSE;
 	const gchar *summary_new;
 	const gchar *icon = NULL;
 	gchar *text;
+	gint index;
+	gboolean in_queue;
+	gboolean installed;
+	gboolean checkbox;
 
 	g_return_if_fail (PK_IS_APPLICATION (application));
 
@@ -492,24 +513,23 @@
 		summary_new = summary;
 	}
 
-	/* get the icon */
-	icon = pk_extra_get_icon_name (application->priv->extra, ident->name);
-	if (icon != NULL) {
-		/* check icon actually exists and is valid in this theme */
-		valid = gpk_icon_valid (icon);
-	}
 
-	/* nothing in the detail database or invalid */
-	if (valid == FALSE) {
-		icon = gpk_info_enum_to_icon_name (info);
-	}
+	/* are we in the package list? */
+	index = pk_ptr_array_find_string (application->priv->package_list, package_id);
+	in_queue = (index != -1);
+	installed = (info == PK_INFO_ENUM_INSTALLED);
+
+	icon = gpk_application_get_icon (in_queue, installed);
+	checkbox = gpk_application_get_checkbox (in_queue, installed);
 
 	/* use two lines */
 	text = gpk_package_id_format_twoline (package_id, summary);
 
 	gtk_list_store_append (application->priv->packages_store, &iter);
 	gtk_list_store_set (application->priv->packages_store, &iter,
-			    PACKAGES_COLUMN_INSTALLED, (info == PK_INFO_ENUM_INSTALLED),
+			    PACKAGES_COLUMN_INSTALLED, checkbox,
+			    PACKAGES_COLUMN_SELECTED, in_queue,
+			    PACKAGES_COLUMN_CHECKBOX, installed ^ in_queue,
 			    PACKAGES_COLUMN_TEXT, text,
 			    PACKAGES_COLUMN_ID, package_id,
 			    PACKAGES_COLUMN_IMAGE, icon,
@@ -518,8 +538,9 @@
 	pk_package_id_free (ident);
 	g_free (text);
 
-	while (gtk_events_pending ())
+	while (gtk_events_pending ()) {
 		gtk_main_iteration ();
+	}
 }
 
 /**
@@ -595,7 +616,7 @@
 	}
 
 	/* hide details */
-	widget = glade_xml_get_widget (application->priv->glade_xml, "vbox_description_pane");
+	widget = glade_xml_get_widget (application->priv->glade_xml, "notebook_description");
 	gtk_widget_hide (widget);
 	return TRUE;
 }
@@ -641,6 +662,8 @@
 			gtk_list_store_append (application->priv->packages_store, &iter);
 			gtk_list_store_set (application->priv->packages_store, &iter,
 					    PACKAGES_COLUMN_INSTALLED, FALSE,
+					    PACKAGES_COLUMN_SELECTED, FALSE,
+					    PACKAGES_COLUMN_CHECKBOX, FALSE,
 					    PACKAGES_COLUMN_TEXT, _("No results were found"),
 					    PACKAGES_COLUMN_IMAGE, "search",
 					    -1);
@@ -653,33 +676,15 @@
 		gpk_application_treeview_set_sorted (application, TRUE);
 	}
 
-	/* hide widget */
-	gpk_statusbar_hide (application->priv->statusbar);
-
 	/* do we need to update the search? */
 	if (role == PK_ROLE_ENUM_INSTALL_PACKAGES ||
 	    role == PK_ROLE_ENUM_REMOVE_PACKAGES) {
-		widget = glade_xml_get_widget (application->priv->glade_xml, "button_cancel2");
-		gtk_widget_hide (widget);
 		/* refresh the search as the items may have changed and the filter has not changed */
 		gpk_application_refresh_search_results (application);
 	}
 }
 
 /**
- * gpk_application_progress_changed_cb:
- **/
-static void
-gpk_application_progress_changed_cb (PkClient *client, guint percentage, guint subpercentage,
-				    guint elapsed, guint remaining, GpkApplication *application)
-{
-	g_return_if_fail (PK_IS_APPLICATION (application));
-
-	gpk_statusbar_set_percentage (application->priv->statusbar, percentage);
-	gpk_statusbar_set_remaining (application->priv->statusbar, remaining);
-}
-
-/**
  * gpk_application_cancel_cb:
  **/
 static void
@@ -764,7 +769,7 @@
 	application->priv->has_package = FALSE;
 
 	/* hide details */
-	widget = glade_xml_get_widget (application->priv->glade_xml, "vbox_description_pane");
+	widget = glade_xml_get_widget (application->priv->glade_xml, "notebook_description");
 	gtk_widget_hide (widget);
 
 	/* switch around buttons */
@@ -906,6 +911,9 @@
 	return FALSE;
 }
 
+/**
+ * gpk_application_text_changed_cb:
+ **/
 static gboolean
 gpk_application_text_changed_cb (GtkEntry *entry, GdkEventKey *event, GpkApplication *application)
 {
@@ -938,13 +946,307 @@
 	return FALSE;
 }
 
+/**
+ * gpk_application_set_button_actions:
+ **/
+static void
+gpk_application_set_button_actions (GpkApplication *application)
+{
+	GtkWidget *widget;
+
+	g_return_if_fail (PK_IS_APPLICATION (application));
+
+	/* set label */
+	if (application->priv->action == PK_ACTION_INSTALL) {
+		widget = glade_xml_get_widget (application->priv->glade_xml, "toolbutton_list_show");
+		gtk_widget_set_sensitive (widget, TRUE);
+		widget = glade_xml_get_widget (application->priv->glade_xml, "toolbutton_list_clear");
+		gtk_widget_set_sensitive (widget, TRUE);
+		widget = glade_xml_get_widget (application->priv->glade_xml, "toolbutton_install");
+		gtk_widget_set_sensitive (widget, TRUE);
+		widget = glade_xml_get_widget (application->priv->glade_xml, "toolbutton_remove");
+		gtk_widget_set_sensitive (widget, FALSE);
+	} else if (application->priv->action == PK_ACTION_REMOVE) {
+		widget = glade_xml_get_widget (application->priv->glade_xml, "toolbutton_list_show");
+		gtk_widget_set_sensitive (widget, TRUE);
+		widget = glade_xml_get_widget (application->priv->glade_xml, "toolbutton_list_clear");
+		gtk_widget_set_sensitive (widget, TRUE);
+		widget = glade_xml_get_widget (application->priv->glade_xml, "toolbutton_install");
+		gtk_widget_set_sensitive (widget, FALSE);
+		widget = glade_xml_get_widget (application->priv->glade_xml, "toolbutton_remove");
+		gtk_widget_set_sensitive (widget, TRUE);
+	} else {
+		widget = glade_xml_get_widget (application->priv->glade_xml, "toolbutton_list_show");
+		gtk_widget_set_sensitive (widget, FALSE);
+		widget = glade_xml_get_widget (application->priv->glade_xml, "toolbutton_list_clear");
+		gtk_widget_set_sensitive (widget, FALSE);
+		widget = glade_xml_get_widget (application->priv->glade_xml, "toolbutton_install");
+		gtk_widget_set_sensitive (widget, FALSE);
+		widget = glade_xml_get_widget (application->priv->glade_xml, "toolbutton_remove");
+		gtk_widget_set_sensitive (widget, FALSE);
+	}
+}
+
+/**
+ * gpk_application_packages_add_selection:
+ **/
+static void
+gpk_application_packages_add_selection (GpkApplication *application, GtkTreeModel *model, GtkTreeIter iter)
+{
+	gboolean installed;
+	gboolean selected;
+	gboolean is_in_list = FALSE;
+	gboolean ret;
+	gboolean checkbox;
+	gchar *package_id = NULL;
+	gchar *message;
+	const gchar *icon;
+
+	gtk_tree_model_get (model, &iter,
+			    PACKAGES_COLUMN_INSTALLED, &installed,
+			    PACKAGES_COLUMN_SELECTED, &selected,
+			    PACKAGES_COLUMN_CHECKBOX, &checkbox,
+			    PACKAGES_COLUMN_ID, &package_id, -1);
+
+	if (application->priv->action == PK_ACTION_REMOVE && !checkbox) {
+		/* is it in the package list and we want to deselect it? */
+		ret = pk_ptr_array_remove_string (application->priv->package_list, package_id);
+		if (ret) {
+			pk_debug ("removed %s from package list", package_id);
+			goto set_new_value;
+		}
+		/* wrong action type */
+		message = g_strdup_printf ("%s\n%s\n%s",
+					   _("There are already packages queued to be removed."),
+					   _("Click 'Clear list' to remove the previous selection or "
+					     "'Remove packages' to complete the previous action."),
+					   _("After completing the action new packages can be selected to be installed."));
+		gpk_error_dialog (_("Already selected packages to be removed"), message, NULL);
+		g_free (message);
+		pk_warning ("ignoring action as ACTION=REMOVE and not in list");
+		goto out;
+	}
+
+	if (application->priv->action == PK_ACTION_INSTALL && checkbox) {
+		/* is it in the package list and we want to deselect it? */
+		ret = pk_ptr_array_remove_string (application->priv->package_list, package_id);
+		if (ret) {
+			pk_debug ("removed %s from package list", package_id);
+			goto set_new_value;
+		}
+		/* wrong action type */
+		message = g_strdup_printf ("%s\n%s\n%s",
+					   _("There are already packages queued to be installed."),
+					   _("Click 'Clear list' to remove the previous selection or "
+					     "'Install packages' to complete the previous action."),
+					   _("After completing the action new packages can be selected to be removed."));
+		gpk_error_dialog (_("Already selected packages to be installed"), message, NULL);
+		g_free (message);
+		pk_warning ("ignoring action as ACTION=INSTALL");
+		goto out;
+	}
+
+	/* set new action if undecided */
+	if (application->priv->action == PK_ACTION_NONE && checkbox) {
+		application->priv->action = PK_ACTION_REMOVE;
+		gpk_application_set_button_actions (application);
+	}
+	if (application->priv->action == PK_ACTION_NONE && !checkbox) {
+		application->priv->action = PK_ACTION_INSTALL;
+		gpk_application_set_button_actions (application);
+	}
+
+	if (application->priv->action == PK_ACTION_REMOVE) {
+		pk_debug ("add to remove list %s", package_id);
+		g_ptr_array_add (application->priv->package_list, g_strdup (package_id));
+		is_in_list = TRUE;
+	}
+	if (application->priv->action == PK_ACTION_INSTALL) {
+		pk_debug ("add to install list %s", package_id);
+		g_ptr_array_add (application->priv->package_list, g_strdup (package_id));
+		is_in_list = TRUE;
+	}
+
+set_new_value:
+	/* do something with the value */
+	selected ^= 1;
+
+	/* get the new icon */
+	icon = gpk_application_get_icon (selected, installed);
+
+	/* set new value */
+	gtk_list_store_set (GTK_LIST_STORE (model), &iter,
+			    PACKAGES_COLUMN_SELECTED, selected,
+			    PACKAGES_COLUMN_CHECKBOX, installed ^ selected,
+			    PACKAGES_COLUMN_IMAGE, icon,
+			    -1);
+
+	if (application->priv->package_list->len == 0) {
+		application->priv->action = PK_ACTION_NONE;
+		gpk_application_set_button_actions (application);
+	}
+out:
+	g_free (package_id);
+}
+
+/**
+ * gpk_application_packages_installed_clicked_cb:
+ **/
+static void
+gpk_application_packages_installed_clicked_cb (GtkCellRendererToggle *cell, gchar *path_str, gpointer data)
+{
+	GpkApplication *application = (GpkApplication *) data;
+	GtkTreeView *treeview;
+	GtkWidget *widget;
+	GtkTreeModel *model;
+	GtkTreeIter iter;
+	GtkTreePath *path;
+
+	g_return_if_fail (PK_IS_APPLICATION (application));
+
+	widget = glade_xml_get_widget (application->priv->glade_xml, "treeview_packages");
+	treeview = GTK_TREE_VIEW (widget);
+	model = gtk_tree_view_get_model (treeview);
+	path = gtk_tree_path_new_from_string (path_str);
+
+	/* get toggled iter */
+	gtk_tree_model_get_iter (model, &iter, path);
+	gpk_application_packages_add_selection (application, model, iter);
+	gtk_tree_path_free (path);
+}
+
+/**
+ * gpk_application_button_list_add_cb:
+ **/
+static void
+gpk_application_button_list_add_cb (GtkWidget *widget_button, GpkApplication *application)
+{
+	GtkTreeSelection *selection;
+	GtkWidget *widget;
+	GtkTreeView *treeview;
+	GtkTreeModel *model;
+	GtkTreeIter iter;
+
+	g_return_if_fail (PK_IS_APPLICATION (application));
+
+	if (application->priv->package == NULL) {
+		gpk_error_dialog (_("Cannot add package"), _("There is no package selected"), NULL);
+		return;
+	}
+
+	/* get the selection and add */
+	widget = glade_xml_get_widget (application->priv->glade_xml, "treeview_packages");
+	treeview = GTK_TREE_VIEW (widget);
+	selection = gtk_tree_view_get_selection (treeview);
+	gtk_tree_selection_get_selected (selection, &model, &iter);
+	gpk_application_packages_add_selection (application, model, iter);
+}
+
+/**
+ * gpk_application_button_list_clear_cb:
+ **/
+static void
+gpk_application_button_list_clear_cb (GtkWidget *widget_button, GpkApplication *application)
+{
+	GtkTreeView *treeview;
+	gint index;
+	gboolean valid;
+	gboolean selected;
+	gboolean installed;
+	GtkWidget *widget;
+	GtkTreeIter iter;
+	GtkTreeModel *model;
+	const gchar *icon;
+	gchar *package_id;
+
+	g_return_if_fail (PK_IS_APPLICATION (application));
+
+	/* get the first iter in the list */
+	widget = glade_xml_get_widget (application->priv->glade_xml, "treeview_packages");
+	treeview = GTK_TREE_VIEW (widget);
+	model = gtk_tree_view_get_model (treeview);
+	valid = gtk_tree_model_get_iter_first (model, &iter);
+
+	/* for all current items, reset the state if in the list */
+	while (valid) {
+		gtk_tree_model_get (model, &iter,
+				    PACKAGES_COLUMN_INSTALLED, &installed,
+				    PACKAGES_COLUMN_SELECTED, &selected,
+				    PACKAGES_COLUMN_ID, &package_id, -1);
+		if (selected) {
+			index = pk_ptr_array_find_string (application->priv->package_list, package_id);
+			if (index != -1) {
+				/* get the new icon */
+				icon = gpk_application_get_icon (FALSE, installed);
+
+				/* set new value */
+				gtk_list_store_set (GTK_LIST_STORE (model), &iter,
+						    PACKAGES_COLUMN_SELECTED, FALSE,
+						    PACKAGES_COLUMN_CHECKBOX, installed,
+						    PACKAGES_COLUMN_IMAGE, icon,
+						    -1);
+			}
+		}
+		g_free (package_id);
+		valid = gtk_tree_model_iter_next (model, &iter);
+	}
+
+	g_ptr_array_remove_range (application->priv->package_list, 0, application->priv->package_list->len);
+	application->priv->action = PK_ACTION_NONE;
+	gpk_application_set_button_actions (application);
+}
+
+/**
+ * gpk_application_button_install_remove_cb:
+ **/
 static void
-gpk_application_packages_add_columns (GtkTreeView *treeview)
+gpk_application_button_install_remove_cb (GtkWidget *widget, GpkApplication *application)
+{
+	gboolean ret = FALSE;
+	gchar **package_ids = NULL;
+
+	g_return_if_fail (PK_IS_APPLICATION (application));
+
+	package_ids = pk_ptr_array_to_argv (application->priv->package_list);
+	if (application->priv->action == PK_ACTION_INSTALL) {
+		ret = gpk_client_install_package_ids (application->priv->gclient, package_ids, NULL);
+	}
+	if (application->priv->action == PK_ACTION_REMOVE) {
+		ret = gpk_client_remove_package_ids (application->priv->gclient, package_ids, NULL);
+	}
+	g_strfreev (package_ids);
+
+	/* refresh the search as the items may have changed and the filter has not changed */
+	if (ret) {
+		/* clear if success */
+		g_ptr_array_remove_range (application->priv->package_list, 0, application->priv->package_list->len);
+		application->priv->action = PK_ACTION_NONE;
+		gpk_application_set_button_actions (application);
+		gpk_application_refresh_search_results (application);
+	}
+}
+
+static void
+gpk_application_packages_add_columns (GpkApplication *application)
 {
 	GtkCellRenderer *renderer;
 	GtkTreeViewColumn *column;
+	GtkTreeView *treeview;
+	GtkTreeModel *model;
+	GtkWidget *widget;
+
+	widget = glade_xml_get_widget (application->priv->glade_xml, "treeview_packages");
+	treeview = GTK_TREE_VIEW (widget);
+	model = gtk_tree_view_get_model (treeview);
 
 	/* column for installed toggles */
+	renderer = gtk_cell_renderer_toggle_new ();
+	g_signal_connect (renderer, "toggled", G_CALLBACK (gpk_application_packages_installed_clicked_cb), application);
+	column = gtk_tree_view_column_new_with_attributes (_("Installed"), renderer, "active", PACKAGES_COLUMN_CHECKBOX, NULL);
+	gtk_tree_view_append_column (treeview, column);
+
+
+	/* column for images */
 	column = gtk_tree_view_column_new ();
 	renderer = gtk_cell_renderer_pixbuf_new ();
 	g_object_set (renderer, "stock-size", GTK_ICON_SIZE_DIALOG, NULL);
@@ -995,7 +1297,7 @@
 	g_return_if_fail (PK_IS_APPLICATION (application));
 
 	/* hide the details */
-	widget = glade_xml_get_widget (application->priv->glade_xml, "vbox_description_pane");
+	widget = glade_xml_get_widget (application->priv->glade_xml, "notebook_description");
 	gtk_widget_hide (widget);
 
 	/* clear the search text if we clicked the group list */
@@ -1040,7 +1342,7 @@
 	}
 
 	/* show the box */
-	widget = glade_xml_get_widget (application->priv->glade_xml, "vbox_description_pane");
+	widget = glade_xml_get_widget (application->priv->glade_xml, "notebook_description");
 	gtk_widget_show (widget);
 
 	/* get the notebook reference */
@@ -1195,22 +1497,23 @@
 				    PACKAGES_COLUMN_INSTALLED, &installed,
 				    PACKAGES_COLUMN_ID, &package_id, -1);
 
+		/* we can now add it */
+		widget = glade_xml_get_widget (application->priv->glade_xml, "toolbutton_list_add");
+		gtk_widget_set_sensitive (widget, TRUE);
+
 		/* make back into package ID */
 		application->priv->package = g_strdup (package_id);
 		g_free (package_id);
 		pk_debug ("selected row is: %i %s", installed, application->priv->package);
 
-		if (installed == FALSE &&
-		    pk_enums_contain (application->priv->roles, PK_ROLE_ENUM_INSTALL_PACKAGES)) {
-			polkit_gnome_action_set_visible (application->priv->install_action, TRUE);
+		/* only show add if we are in the correct mode */
+		widget = glade_xml_get_widget (application->priv->glade_xml, "toolbutton_list_add");
+		if (application->priv->action == PK_ACTION_INSTALL && installed) {
+			gtk_widget_set_sensitive (widget, FALSE);
+		} else if (application->priv->action == PK_ACTION_REMOVE && !installed) {
+			gtk_widget_set_sensitive (widget, FALSE);
 		} else {
-			polkit_gnome_action_set_visible (application->priv->install_action, FALSE);
-		}
-		if (installed &&
-		    pk_enums_contain (application->priv->roles, PK_ROLE_ENUM_REMOVE_PACKAGES)) {
-			polkit_gnome_action_set_visible (application->priv->remove_action, TRUE);
-		} else {
-			polkit_gnome_action_set_visible (application->priv->remove_action, FALSE);
+			gtk_widget_set_sensitive (widget, TRUE);
 		}
 
 		/* refresh */
@@ -1220,8 +1523,15 @@
 
 	} else {
 		pk_debug ("no row selected");
-		polkit_gnome_action_set_visible (application->priv->install_action, FALSE);
-		polkit_gnome_action_set_visible (application->priv->remove_action, FALSE);
+
+		/* we cannot now add it */
+		widget = glade_xml_get_widget (application->priv->glade_xml, "toolbutton_list_add");
+		gtk_widget_set_sensitive (widget, FALSE);
+
+		/* make back into package ID */
+		g_free (application->priv->package);
+		application->priv->package = NULL;
+
 		widget = glade_xml_get_widget (application->priv->glade_xml, "button_homepage");
 		gtk_widget_hide (widget);
 		widget = glade_xml_get_widget (application->priv->glade_xml, "hbox_filesize");
@@ -1266,20 +1576,16 @@
  **/
 static GtkWidget *
 gpk_application_create_custom_widget (GladeXML *xml, gchar *func_name, gchar *name,
-				     gchar *string1, gchar *string2,
-				     gint int1, gint int2, gpointer user_data)
+				      gchar *string1, gchar *string2,
+				      gint int1, gint int2, gpointer user_data)
 {
-	GpkApplication *application = GPK_APPLICATION (user_data);
 	if (pk_strequal (name, "entry_text")) {
 		return sexy_icon_entry_new ();
 	}
-	if (pk_strequal (name, "button_install")) {
-		return polkit_gnome_action_create_button (application->priv->install_action);
-	}
-	if (pk_strequal (name, "button_remove")) {
-	        return polkit_gnome_action_create_button (application->priv->remove_action);
+	if (pk_strequal (name, "image_status")) {
+		return gpk_animated_icon_new ();
 	}
-	pk_warning ("name unknown=%s", name);
+	pk_warning ("name unknown='%s'", name);
 	return NULL;
 }
 
@@ -1407,7 +1713,7 @@
 	}
 
 	if (pk_enums_contain (application->priv->roles, PK_ROLE_ENUM_SEARCH_FILE)) {
-		item = gtk_image_menu_item_new_with_mnemonic (_("Search by file"));
+		item = gtk_image_menu_item_new_with_mnemonic (_("Search by file name"));
 		image = gtk_image_new_from_stock (GTK_STOCK_OPEN, GTK_ICON_SIZE_MENU);
 		gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
 		g_signal_connect (G_OBJECT (item), "activate",
@@ -1581,41 +1887,10 @@
 }
 
 /**
- * gpk_application_menu_refresh_cb:
+ * gpk_application_button_sources_cb:
  **/
 static void
-gpk_application_menu_refresh_cb (GtkAction *action, GpkApplication *application)
-{
-	gboolean ret;
-	GError *error = NULL;
-
-	g_return_if_fail (PK_IS_APPLICATION (application));
-
-	/* can we cancel what we are doing? */
-	ret = pk_client_reset (application->priv->client_action, &error);
-	if (!ret) {
-		gpk_error_dialog (_("Package list could not be refreshed"),
-				  _("Failed to reset"), error->message);
-		g_error_free (error);
-		return;
-	}
-
-	/* try to refresh the cache */
-	ret = pk_client_refresh_cache (application->priv->client_action, FALSE, &error);
-	if (!ret) {
-		gpk_error_dialog (_("The cache could not be refreshed"),
-				  _("Running the transaction failed"), error->message);
-		g_error_free (error);
-		return;
-	}
-	pk_debug ("should be refreshing...");
-}
-
-/**
- * gpk_application_menu_sources_cb:
- **/
-static void
-gpk_application_menu_sources_cb (GtkAction *action, GpkApplication *application)
+gpk_application_button_sources_cb (GtkWidget *widget, GpkApplication *application)
 {
 	gboolean ret;
 
@@ -1628,14 +1903,12 @@
 }
 
 /**
- * gpk_application_menu_quit_cb:
+ * gpk_application_button_refresh_cb:
  **/
 static void
-gpk_application_menu_quit_cb (GtkAction *action, GpkApplication *application)
+gpk_application_button_refresh_cb (GtkWidget *widget, GpkApplication *application)
 {
-	g_return_if_fail (PK_IS_APPLICATION (application));
-
-	gpk_application_quit (application);
+	gpk_client_refresh_cache (application->priv->gclient, NULL);
 }
 
 /**
@@ -1809,6 +2082,40 @@
 }
 
 /**
+ * gpk_application_menu_filter_source_cb:
+ * @widget: The GtkWidget object
+ **/
+static void
+gpk_application_menu_filter_source_cb (GtkWidget *widget, GpkApplication *application)
+{
+	const gchar *name;
+
+	g_return_if_fail (PK_IS_APPLICATION (application));
+
+	name = gtk_widget_get_name (widget);
+
+	/* only care about new state */
+	if (!gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (widget))) {
+		return;
+	}
+
+	/* set new filter */
+	if (g_str_has_suffix (name, "_yes")) {
+		pk_enums_add (application->priv->filters_current, PK_FILTER_ENUM_SOURCE);
+		pk_enums_remove (application->priv->filters_current, PK_FILTER_ENUM_NOT_SOURCE);
+	} else if (g_str_has_suffix (name, "_no")) {
+		pk_enums_remove (application->priv->filters_current, PK_FILTER_ENUM_SOURCE);
+		pk_enums_add (application->priv->filters_current, PK_FILTER_ENUM_NOT_SOURCE);
+	} else {
+		pk_enums_remove (application->priv->filters_current, PK_FILTER_ENUM_SOURCE);
+		pk_enums_remove (application->priv->filters_current, PK_FILTER_ENUM_NOT_SOURCE);
+	}
+
+	/* refresh the sesource results */
+	gpk_application_perform_search (application);
+}
+
+/**
  * gpk_application_menu_filter_basename_cb:
  * @widget: The GtkWidget object
  **/
@@ -1868,8 +2175,29 @@
 static void
 gpk_application_status_changed_cb (PkClient *client, PkStatusEnum status, GpkApplication *application)
 {
+	const gchar *text;
+	GtkWidget *widget;
+
 	g_return_if_fail (PK_IS_APPLICATION (application));
-	gpk_statusbar_set_status (application->priv->statusbar, status);
+
+	widget = glade_xml_get_widget (application->priv->glade_xml, "hbox_status");
+	if (status == PK_STATUS_ENUM_FINISHED) {
+		gtk_widget_hide (widget);
+		widget = glade_xml_get_widget (application->priv->glade_xml, "image_status");
+		gpk_animated_icon_enable_animation (GPK_ANIMATED_ICON (widget), FALSE);
+		return;
+	}
+
+	/* set the text and show */
+	gtk_widget_show (widget);
+	widget = glade_xml_get_widget (application->priv->glade_xml, "label_status");
+	text = gpk_status_enum_to_localised_text (status);
+	gtk_label_set_label (GTK_LABEL (widget), text);
+
+	/* set icon */
+	widget = glade_xml_get_widget (application->priv->glade_xml, "image_status");
+	gpk_set_animated_icon_from_status (GPK_ANIMATED_ICON (widget), status, GTK_ICON_SIZE_LARGE_TOOLBAR);
+	gtk_widget_show (widget);
 }
 
 /**
@@ -1884,8 +2212,6 @@
 
 	widget = glade_xml_get_widget (application->priv->glade_xml, "button_cancel");
 	gtk_widget_set_sensitive (widget, allow_cancel);
-	widget = glade_xml_get_widget (application->priv->glade_xml, "button_cancel2");
-	gtk_widget_set_sensitive (widget, allow_cancel);
 }
 
 /**
@@ -1898,6 +2224,7 @@
 	GtkTreeModel *model;
 	GtkTreeIter iter;
 	gchar *package_id = NULL;
+	gchar **package_ids = NULL;
 	gboolean installed;
 	gboolean ret;
 
@@ -1917,7 +2244,15 @@
 			    PACKAGES_COLUMN_ID, &package_id, -1);
 	if (!installed) {
 		pk_debug ("auto installing due to double click");
-		gpk_application_install (application, package_id);
+
+		package_ids = g_strsplit (package_id, "|", 1);
+		ret = gpk_client_install_package_ids (application->priv->gclient, package_ids, NULL);
+		g_strfreev (package_ids);
+
+		/* refresh the search as the items may have changed and the filter has not changed */
+		if (ret) {
+			gpk_application_refresh_search_results (application);
+		}
 	}
 	g_free (package_id);
 }
@@ -1955,63 +2290,6 @@
 }
 
 /**
- * gpk_application_setup_policykit:
- *
- * We have to do this before the glade stuff if done as the custom handler needs the actions setup
- **/
-static void
-gpk_application_setup_policykit (GpkApplication *application)
-{
-	PolKitAction *pk_action;
-
-	g_return_if_fail (PK_IS_APPLICATION (application));
-
-	/* install */
-	pk_action = polkit_action_new ();
-	polkit_action_set_action_id (pk_action, "org.freedesktop.packagekit.install");
-	application->priv->install_action = polkit_gnome_action_new_default ("install", pk_action,
-									     _("_Install"),
-									     _("Install selected package"));
-	g_object_set (application->priv->install_action,
-		      "no-icon-name", GTK_STOCK_FLOPPY,
-		      "auth-icon-name", GTK_STOCK_FLOPPY,
-		      "yes-icon-name", GTK_STOCK_FLOPPY,
-		      "self-blocked-icon-name", GTK_STOCK_FLOPPY,
-		      NULL);
-	polkit_action_unref (pk_action);
-	g_signal_connect (application->priv->install_action, "activate",
-			  G_CALLBACK (gpk_application_install_cb), application);
-
-	/* remove */
-	pk_action = polkit_action_new ();
-	polkit_action_set_action_id (pk_action, "org.freedesktop.packagekit.remove");
-	application->priv->remove_action = polkit_gnome_action_new_default ("remove", pk_action,
-									    _("_Remove"),
-									    _("Remove selected package"));
-	g_object_set (application->priv->remove_action,
-		      "no-icon-name", GTK_STOCK_DIALOG_ERROR,
-		      "auth-icon-name", GTK_STOCK_DIALOG_ERROR,
-		      "yes-icon-name", GTK_STOCK_DIALOG_ERROR,
-		      "self-blocked-icon-name", GTK_STOCK_DIALOG_ERROR,
-		      NULL);
-	polkit_action_unref (pk_action);
-
-	/* refresh-cache */
-	pk_action = polkit_action_new ();
-	polkit_action_set_action_id (pk_action, "org.freedesktop.packagekit.refresh-cache");
-	application->priv->refresh_action = polkit_gnome_action_new_default ("refresh", pk_action,
-									     _("_Refresh application lists"),
-									     NULL);
-	g_object_set (application->priv->refresh_action,
-		      "no-icon-name", "gtk-redo-ltr",
-		      "auth-icon-name", "gtk-redo-ltr",
-		      "yes-icon-name", "gtk-redo-ltr",
-		      "self-blocked-icon-name", "gtk-redo-ltr",
-		      NULL);
-	polkit_action_unref (pk_action);
-}
-
-/**
  * gpk_application_init:
  **/
 static void
@@ -2029,7 +2307,6 @@
 	guint page;
 	guint i;
 	gboolean ret;
-	GtkWidget *item;
 	GError *error = NULL;
 
 	application->priv = GPK_APPLICATION_GET_PRIVATE (application);
@@ -2037,6 +2314,8 @@
 	application->priv->group = NULL;
 	application->priv->url = NULL;
 	application->priv->has_package = FALSE;
+	application->priv->package_list = g_ptr_array_new ();
+
 	application->priv->gconf_client = gconf_client_get_default ();
 	application->priv->repos = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
 
@@ -2048,9 +2327,6 @@
 	gtk_icon_theme_append_search_path (gtk_icon_theme_get_default (),
                                            PK_DATA G_DIR_SEPARATOR_S "icons");
 
-	/* use custom widgets */
-	glade_set_custom_handler (gpk_application_create_custom_widget, application);
-
 	application->priv->control = pk_control_new ();
 	application->priv->gclient = gpk_client_new ();
 	gpk_client_show_finished (application->priv->gclient, FALSE);
@@ -2062,8 +2338,6 @@
 			  G_CALLBACK (gpk_application_error_code_cb), application);
 	g_signal_connect (application->priv->client_search, "finished",
 			  G_CALLBACK (gpk_application_finished_cb), application);
-	g_signal_connect (application->priv->client_search, "progress-changed",
-			  G_CALLBACK (gpk_application_progress_changed_cb), application);
 	g_signal_connect (application->priv->client_search, "status-changed",
 			  G_CALLBACK (gpk_application_status_changed_cb), application);
 	g_signal_connect (application->priv->client_search, "allow-cancel",
@@ -2076,8 +2350,6 @@
 			  G_CALLBACK (gpk_application_error_code_cb), application);
 	g_signal_connect (application->priv->client_action, "finished",
 			  G_CALLBACK (gpk_application_finished_cb), application);
-	g_signal_connect (application->priv->client_action, "progress-changed",
-			  G_CALLBACK (gpk_application_progress_changed_cb), application);
 	g_signal_connect (application->priv->client_action, "status-changed",
 			  G_CALLBACK (gpk_application_status_changed_cb), application);
 	g_signal_connect (application->priv->client_action, "allow-cancel",
@@ -2092,8 +2364,6 @@
 			  G_CALLBACK (gpk_application_error_code_cb), application);
 	g_signal_connect (application->priv->client_details, "finished",
 			  G_CALLBACK (gpk_application_finished_cb), application);
-	g_signal_connect (application->priv->client_details, "progress-changed",
-			  G_CALLBACK (gpk_application_progress_changed_cb), application);
 	g_signal_connect (application->priv->client_details, "status-changed",
 			  G_CALLBACK (gpk_application_status_changed_cb), application);
 	g_signal_connect (application->priv->client_details, "allow-cancel",
@@ -2107,8 +2377,6 @@
 			  G_CALLBACK (gpk_application_error_code_cb), application);
 	g_signal_connect (application->priv->client_files, "finished",
 			  G_CALLBACK (gpk_application_finished_cb), application);
-	g_signal_connect (application->priv->client_files, "progress-changed",
-			  G_CALLBACK (gpk_application_progress_changed_cb), application);
 	g_signal_connect (application->priv->client_files, "status-changed",
 			  G_CALLBACK (gpk_application_status_changed_cb), application);
 	g_signal_connect (application->priv->client_files, "allow-cancel",
@@ -2134,8 +2402,8 @@
 	locale = setlocale (LC_ALL, NULL);
 	pk_extra_set_locale (application->priv->extra, locale);
 
-	/* we have to do this before we connect up the glade file */
-	gpk_application_setup_policykit (application);
+	/* use custom widgets */
+	glade_set_custom_handler (gpk_application_create_custom_widget, application);
 
 	application->priv->glade_xml = glade_xml_new (PK_DATA "/gpk-application.glade", NULL, NULL);
 	main_window = glade_xml_get_widget (application->priv->glade_xml, "window_manager");
@@ -2154,6 +2422,31 @@
 			  G_CALLBACK (gpk_application_homepage_cb), application);
 	gtk_widget_set_tooltip_text (widget, _("Visit homepage for selected package"));
 
+	/* add */
+	widget = glade_xml_get_widget (application->priv->glade_xml, "toolbutton_list_add");
+	g_signal_connect (widget, "clicked",
+			  G_CALLBACK (gpk_application_button_list_add_cb), application);
+	gtk_widget_set_tooltip_text (widget, _("Add current selection"));
+	gtk_widget_set_sensitive (widget, FALSE);
+
+	/* clear */
+	widget = glade_xml_get_widget (application->priv->glade_xml, "toolbutton_list_clear");
+	g_signal_connect (widget, "clicked",
+			  G_CALLBACK (gpk_application_button_list_clear_cb), application);
+	gtk_widget_set_tooltip_text (widget, _("Clear current selection"));
+
+	/* install */
+	widget = glade_xml_get_widget (application->priv->glade_xml, "toolbutton_install");
+	g_signal_connect (widget, "clicked",
+			  G_CALLBACK (gpk_application_button_install_remove_cb), application);
+	gtk_widget_set_tooltip_text (widget, _("Install current selection"));
+
+	/* remove */
+	widget = glade_xml_get_widget (application->priv->glade_xml, "toolbutton_remove");
+	g_signal_connect (widget, "clicked",
+			  G_CALLBACK (gpk_application_button_install_remove_cb), application);
+	gtk_widget_set_tooltip_text (widget, _("Remove current selection"));
+
 	widget = glade_xml_get_widget (application->priv->glade_xml, "menuitem_about");
 	g_signal_connect (widget, "activate",
 			  G_CALLBACK (gpk_application_menu_about_cb), application);
@@ -2162,25 +2455,14 @@
 	g_signal_connect (widget, "activate",
 			  G_CALLBACK (gpk_application_menu_help_cb), application);
 
-	/* connect up PolicyKit buttons */
-	g_signal_connect (application->priv->remove_action, "activate",
-			  G_CALLBACK (gpk_application_remove_cb), application);
-	g_signal_connect (application->priv->refresh_action, "activate",
-			  G_CALLBACK (gpk_application_menu_refresh_cb), application);
-
-	/* connect up a PolicyKit menuitem */
-	item = gtk_action_create_menu_item (GTK_ACTION (application->priv->refresh_action));
-	widget = glade_xml_get_widget (application->priv->glade_xml, "menu_system");
-	gtk_menu_shell_prepend (GTK_MENU_SHELL (widget), item);
-
 	/* connect up the other menuitems */
-	widget = glade_xml_get_widget (application->priv->glade_xml, "menuitem_sources");
-	g_signal_connect (widget, "activate",
-			  G_CALLBACK (gpk_application_menu_sources_cb), application);
+	widget = glade_xml_get_widget (application->priv->glade_xml, "toolbutton_sources");
+	g_signal_connect (widget, "clicked",
+			  G_CALLBACK (gpk_application_button_sources_cb), application);
 
-	widget = glade_xml_get_widget (application->priv->glade_xml, "imagemenuitem_quit");
-	g_signal_connect (widget, "activate",
-			  G_CALLBACK (gpk_application_menu_quit_cb), application);
+	widget = glade_xml_get_widget (application->priv->glade_xml, "toolbutton_refresh");
+	g_signal_connect (widget, "clicked",
+			  G_CALLBACK (gpk_application_button_refresh_cb), application);
 
 	/* installed filter */
 	widget = glade_xml_get_widget (application->priv->glade_xml, "menuitem_installed_yes");
@@ -2237,7 +2519,18 @@
 	g_signal_connect (widget, "toggled",
 			  G_CALLBACK (gpk_application_menu_filter_arch_cb), application);
 
-	widget = glade_xml_get_widget (application->priv->glade_xml, "vbox_description_pane");
+	/* source filter */
+	widget = glade_xml_get_widget (application->priv->glade_xml, "menuitem_source_yes");
+	g_signal_connect (widget, "toggled",
+			  G_CALLBACK (gpk_application_menu_filter_source_cb), application);
+	widget = glade_xml_get_widget (application->priv->glade_xml, "menuitem_source_no");
+	g_signal_connect (widget, "toggled",
+			  G_CALLBACK (gpk_application_menu_filter_source_cb), application);
+	widget = glade_xml_get_widget (application->priv->glade_xml, "menuitem_source_both");
+	g_signal_connect (widget, "toggled",
+			  G_CALLBACK (gpk_application_menu_filter_source_cb), application);
+
+	widget = glade_xml_get_widget (application->priv->glade_xml, "notebook_description");
 	gtk_widget_hide (widget);
 
 	widget = glade_xml_get_widget (application->priv->glade_xml, "hbox_filesize");
@@ -2256,6 +2549,10 @@
 	g_signal_connect (widget, "toggled",
 			  G_CALLBACK (gpk_application_menu_filter_newest_cb), application);
 
+	/* set current action */
+	application->priv->action = PK_ACTION_NONE;
+	gpk_application_set_button_actions (application);
+
 	/* Remove description/file list if needed. */
 	widget = glade_xml_get_widget (application->priv->glade_xml, "notebook_description");
 	g_signal_connect (widget, "switch-page",
@@ -2311,13 +2608,6 @@
 			  G_CALLBACK (gpk_application_cancel_cb), application);
 	gtk_widget_set_tooltip_text (widget, _("Cancel search"));
 
-	/* cancel button */
-	widget = glade_xml_get_widget (application->priv->glade_xml, "button_cancel2");
-	g_signal_connect (widget, "clicked",
-			  G_CALLBACK (gpk_application_cancel_cb), application);
-	gtk_widget_set_tooltip_text (widget, _("Cancel action"));
-	gtk_widget_hide (widget);
-
 	/* the fancy text entry widget */
 	widget = glade_xml_get_widget (application->priv->glade_xml, "entry_text");
 
@@ -2374,6 +2664,10 @@
 		widget = glade_xml_get_widget (application->priv->glade_xml, "menuitem_arch");
 		gtk_widget_hide (widget);
 	}
+	if (pk_enums_contain (application->priv->filters, PK_FILTER_ENUM_SOURCE) == FALSE) {
+		widget = glade_xml_get_widget (application->priv->glade_xml, "menuitem_source");
+		gtk_widget_hide (widget);
+	}
 
 	/* BASENAME, use by default, or hide */
 	widget = glade_xml_get_widget (application->priv->glade_xml, "menuitem_basename");
@@ -2409,7 +2703,7 @@
 	widget = glade_xml_get_widget (application->priv->glade_xml, "button_find");
 	gtk_widget_set_sensitive (widget, FALSE);
 
-	gtk_widget_set_size_request (main_window, 800, 500);
+	gtk_widget_set_size_request (main_window, 1000, 500);
 	gtk_widget_show (main_window);
 
 	widget = glade_xml_get_widget (application->priv->glade_xml, "treeview_packages");
@@ -2417,21 +2711,18 @@
 	g_signal_connect (GTK_TREE_VIEW (widget), "row-activated",
 			  G_CALLBACK (gpk_application_package_row_activated_cb), application);
 
-	/* use the in-statusbar for progress */
-	application->priv->statusbar = gpk_statusbar_new ();
-	widget = glade_xml_get_widget (application->priv->glade_xml, "statusbar_status");
-	gpk_statusbar_set_widget (application->priv->statusbar, widget);
-
 	/* create list stores */
 	application->priv->packages_store = gtk_list_store_new (PACKAGES_COLUMN_LAST,
-						       G_TYPE_STRING,
-						       G_TYPE_BOOLEAN,
-						       G_TYPE_STRING,
-						       G_TYPE_STRING);
+							        G_TYPE_STRING,
+							        G_TYPE_BOOLEAN,
+							        G_TYPE_BOOLEAN,
+							        G_TYPE_BOOLEAN,
+							        G_TYPE_STRING,
+							        G_TYPE_STRING);
 	application->priv->groups_store = gtk_list_store_new (GROUPS_COLUMN_LAST,
-						       G_TYPE_STRING,
-						       G_TYPE_STRING,
-						       G_TYPE_STRING);
+							      G_TYPE_STRING,
+							      G_TYPE_STRING,
+							      G_TYPE_STRING);
 
 	/* unsorted */
 	gpk_application_treeview_set_sorted (application, FALSE);
@@ -2446,7 +2737,7 @@
 			  G_CALLBACK (gpk_application_packages_treeview_clicked_cb), application);
 
 	/* add columns to the tree view */
-	gpk_application_packages_add_columns (GTK_TREE_VIEW (widget));
+	gpk_application_packages_add_columns (application);
 
 	/* add an "all" entry if we can GetPackages */
 	if (pk_enums_contain (application->priv->roles, PK_ROLE_ENUM_GET_PACKAGES)) {
@@ -2518,18 +2809,15 @@
 	g_object_unref (application->priv->client_details);
 	g_object_unref (application->priv->client_files);
 	g_object_unref (application->priv->pconnection);
-	g_object_unref (application->priv->statusbar);
 	g_object_unref (application->priv->extra);
 	g_object_unref (application->priv->gconf_client);
-	g_object_unref (application->priv->install_action);
-	g_object_unref (application->priv->remove_action);
-	g_object_unref (application->priv->refresh_action);
 	g_object_unref (application->priv->gclient);
 
 	g_free (application->priv->url);
 	g_free (application->priv->group);
 	g_free (application->priv->package);
 	g_hash_table_destroy (application->priv->repos);
+	g_ptr_array_free (application->priv->package_list, TRUE);
 
 	G_OBJECT_CLASS (gpk_application_parent_class)->finalize (object);
 }

Modified: trunk/src/gpk-application.h
==============================================================================
--- trunk/src/gpk-application.h	(original)
+++ trunk/src/gpk-application.h	Thu May 22 17:08:24 2008
@@ -50,6 +50,7 @@
 
 GType		 gpk_application_get_type		(void) G_GNUC_CONST;
 GpkApplication	*gpk_application_new			(void);
+void		 gpk_application_show			(GpkApplication *application);
 
 G_END_DECLS
 

Modified: trunk/src/gpk-auto-refresh.c
==============================================================================
--- trunk/src/gpk-auto-refresh.c	(original)
+++ trunk/src/gpk-auto-refresh.c	Thu May 22 17:08:24 2008
@@ -120,7 +120,7 @@
 static gboolean
 gpk_auto_refresh_signal_refresh_cache (GpkAutoRefresh *arefresh)
 {
-	g_return_val_if_fail (PK_IS_AUTO_REFRESH (arefresh), FALSE);
+	g_return_val_if_fail (GPK_IS_AUTO_REFRESH (arefresh), FALSE);
 
 	pk_debug ("emitting refresh-cache");
 	g_signal_emit (arefresh, signals [REFRESH_CACHE], 0);
@@ -133,7 +133,7 @@
 static gboolean
 gpk_auto_refresh_signal_get_updates (GpkAutoRefresh *arefresh)
 {
-	g_return_val_if_fail (PK_IS_AUTO_REFRESH (arefresh), FALSE);
+	g_return_val_if_fail (GPK_IS_AUTO_REFRESH (arefresh), FALSE);
 
 	pk_debug ("emitting get-updates");
 	g_signal_emit (arefresh, signals [GET_UPDATES], 0);
@@ -178,7 +178,7 @@
 	const gchar *freq_text;
 	PkFreqEnum freq;
 
-	g_return_val_if_fail (PK_IS_AUTO_REFRESH (arefresh), 0);
+	g_return_val_if_fail (GPK_IS_AUTO_REFRESH (arefresh), 0);
 
 	/* get from gconf */
 	freq_text = gconf_client_get_string (arefresh->priv->gconf_client, key, NULL);
@@ -202,7 +202,7 @@
 	guint thresh;
 	gboolean ret;
 
-	g_return_val_if_fail (PK_IS_AUTO_REFRESH (arefresh), FALSE);
+	g_return_val_if_fail (GPK_IS_AUTO_REFRESH (arefresh), FALSE);
 
 	/* not on battery */
 	if (arefresh->priv->on_battery) {
@@ -251,7 +251,7 @@
 	guint thresh;
 	gboolean ret;
 
-	g_return_val_if_fail (PK_IS_AUTO_REFRESH (arefresh), FALSE);
+	g_return_val_if_fail (GPK_IS_AUTO_REFRESH (arefresh), FALSE);
 
 	/* get this each time, as it may have changed behind out back */
 	thresh = gpk_auto_refresh_convert_frequency_text (arefresh, GPK_CONF_FREQUENCY_GET_UPDATES);
@@ -286,7 +286,7 @@
 {
 	guint thresh;
 
-	g_return_val_if_fail (PK_IS_AUTO_REFRESH (arefresh), FALSE);
+	g_return_val_if_fail (GPK_IS_AUTO_REFRESH (arefresh), FALSE);
 
 	/* we shouldn't do this early in the session startup */
 	if (arefresh->priv->session_delay == FALSE) {
@@ -327,7 +327,7 @@
 static void
 gpk_auto_refresh_idle_cb (DBusGProxy *proxy, gboolean is_idle, GpkAutoRefresh *arefresh)
 {
-	g_return_if_fail (PK_IS_AUTO_REFRESH (arefresh));
+	g_return_if_fail (GPK_IS_AUTO_REFRESH (arefresh));
 
 	pk_debug ("setting is_idle %i", is_idle);
 	arefresh->priv->session_idle = is_idle;
@@ -340,7 +340,7 @@
 static void
 gpk_auto_refresh_on_battery_cb (DBusGProxy *proxy, gboolean on_battery, GpkAutoRefresh *arefresh)
 {
-	g_return_if_fail (PK_IS_AUTO_REFRESH (arefresh));
+	g_return_if_fail (GPK_IS_AUTO_REFRESH (arefresh));
 
 	pk_debug ("setting on_battery %i", on_battery);
 	arefresh->priv->on_battery = on_battery;
@@ -353,7 +353,7 @@
 gboolean
 gpk_auto_refresh_get_on_battery (GpkAutoRefresh *arefresh)
 {
-	g_return_val_if_fail (PK_IS_AUTO_REFRESH (arefresh), FALSE);
+	g_return_val_if_fail (GPK_IS_AUTO_REFRESH (arefresh), FALSE);
 	return arefresh->priv->on_battery;
 }
 
@@ -363,7 +363,7 @@
 static void
 gpk_auto_refresh_network_status_changed_cb (PkControl *control, PkNetworkEnum state, GpkAutoRefresh *arefresh)
 {
-	g_return_if_fail (PK_IS_AUTO_REFRESH (arefresh));
+	g_return_if_fail (GPK_IS_AUTO_REFRESH (arefresh));
 
 	arefresh->priv->network_active = pk_enums_contain (state, PK_NETWORK_ENUM_ONLINE);
 	pk_debug ("setting online %i", arefresh->priv->network_active);
@@ -378,7 +378,7 @@
 {
 	GpkAutoRefresh *arefresh = GPK_AUTO_REFRESH (user_data);
 
-	g_return_val_if_fail (PK_IS_AUTO_REFRESH (arefresh), FALSE);
+	g_return_val_if_fail (GPK_IS_AUTO_REFRESH (arefresh), FALSE);
 
 	/* triggered once an hour */
 	gpk_auto_refresh_change_state (arefresh);
@@ -395,7 +395,7 @@
 {
 	GpkAutoRefresh *arefresh = GPK_AUTO_REFRESH (user_data);
 
-	g_return_val_if_fail (PK_IS_AUTO_REFRESH (arefresh), FALSE);
+	g_return_val_if_fail (GPK_IS_AUTO_REFRESH (arefresh), FALSE);
 
 	/* we have waited enough */
 	if (arefresh->priv->session_delay == FALSE) {
@@ -420,7 +420,7 @@
 	gboolean on_battery;
 	gboolean ret;
 
-	g_return_if_fail (PK_IS_AUTO_REFRESH (arefresh));
+	g_return_if_fail (GPK_IS_AUTO_REFRESH (arefresh));
 
 	pk_debug ("gnome-power-manager connection-changed: %i", connected);
 
@@ -471,7 +471,7 @@
 {
 	GError *error = NULL;
 
-	g_return_if_fail (PK_IS_AUTO_REFRESH (arefresh));
+	g_return_if_fail (GPK_IS_AUTO_REFRESH (arefresh));
 
 	pk_debug ("gnome-screensaver connection-changed: %i", connected);
 
@@ -571,7 +571,7 @@
 {
 	GpkAutoRefresh *arefresh;
 
-	g_return_if_fail (PK_IS_AUTO_REFRESH (object));
+	g_return_if_fail (GPK_IS_AUTO_REFRESH (object));
 
 	arefresh = GPK_AUTO_REFRESH (object);
 	g_return_if_fail (arefresh->priv != NULL);

Modified: trunk/src/gpk-auto-refresh.h
==============================================================================
--- trunk/src/gpk-auto-refresh.h	(original)
+++ trunk/src/gpk-auto-refresh.h	Thu May 22 17:08:24 2008
@@ -29,8 +29,8 @@
 #define GPK_TYPE_AUTO_REFRESH		(gpk_auto_refresh_get_type ())
 #define GPK_AUTO_REFRESH(o)		(G_TYPE_CHECK_INSTANCE_CAST ((o), GPK_TYPE_AUTO_REFRESH, GpkAutoRefresh))
 #define GPK_AUTO_REFRESH_CLASS(k)	(G_TYPE_CHECK_CLASS_CAST((k), GPK_TYPE_AUTO_REFRESH, GpkAutoRefreshClass))
-#define PK_IS_AUTO_REFRESH(o)	 	(G_TYPE_CHECK_INSTANCE_TYPE ((o), GPK_TYPE_AUTO_REFRESH))
-#define PK_IS_AUTO_REFRESH_CLASS(k)	(G_TYPE_CHECK_CLASS_TYPE ((k), GPK_TYPE_AUTO_REFRESH))
+#define GPK_IS_AUTO_REFRESH(o)	 	(G_TYPE_CHECK_INSTANCE_TYPE ((o), GPK_TYPE_AUTO_REFRESH))
+#define GPK_IS_AUTO_REFRESH_CLASS(k)	(G_TYPE_CHECK_CLASS_TYPE ((k), GPK_TYPE_AUTO_REFRESH))
 #define GPK_AUTO_REFRESH_GET_CLASS(o)	(G_TYPE_INSTANCE_GET_CLASS ((o), GPK_TYPE_AUTO_REFRESH, GpkAutoRefreshClass))
 #define GPK_AUTO_REFRESH_ERROR		(gpk_auto_refresh_error_quark ())
 #define GPK_AUTO_REFRESH_TYPE_ERROR	(gpk_auto_refresh_error_get_type ())

Modified: trunk/src/gpk-cell-renderer-uri.c
==============================================================================
--- trunk/src/gpk-cell-renderer-uri.c	(original)
+++ trunk/src/gpk-cell-renderer-uri.c	Thu May 22 17:08:24 2008
@@ -45,6 +45,29 @@
 static guint signals[LAST_SIGNAL] = { 0 };
 
 static gboolean
+gpk_cell_renderer_uri_is_clicked (GpkCellRendererUri *cru)
+{
+	gpointer value;
+	g_return_val_if_fail (cru != NULL, FALSE);
+	if (cru->uri == NULL) {
+		return FALSE;
+	}
+	value = g_hash_table_lookup (cru->clicked, cru->uri);
+	return (value != NULL);
+}
+
+static void
+gpk_cell_renderer_uri_set_clicked (GpkCellRendererUri *cru, gboolean clicked)
+{
+	g_return_if_fail (cru != NULL);
+	if (clicked) {
+		g_hash_table_insert (cru->clicked, g_strdup (cru->uri), GINT_TO_POINTER (1));
+	} else {
+		g_hash_table_remove (cru->clicked, cru->uri);
+	}
+}
+
+static gboolean
 gpk_cell_renderer_uri_activate (GtkCellRenderer *cell, GdkEvent *event,
 			        GtkWidget *widget, const gchar *path,
 			        GdkRectangle *background_area,
@@ -57,7 +80,8 @@
 		return TRUE;
 	}
 
-	cru->clicked = TRUE;
+	gpk_cell_renderer_uri_set_clicked (cru, TRUE);
+
 	pk_debug ("emit: %s", cru->uri);
 	g_signal_emit (cell, signals [CLICKED], 0, cru->uri);
 	return TRUE;
@@ -67,6 +91,7 @@
 gpk_cell_renderer_uri_get_property (GObject *object, guint param_id,
 				    GValue *value, GParamSpec *pspec)
 {
+	gboolean ret;
 	GpkCellRendererUri *cru = GPK_CELL_RENDERER_URI (object);
 
 	switch (param_id) {
@@ -74,7 +99,8 @@
 		g_value_set_string (value, cru->uri);
 		break;
 	case PROP_CLICKED:
-		g_value_set_boolean (value, cru->clicked);
+		ret = gpk_cell_renderer_uri_is_clicked (cru);
+		g_value_set_boolean (value, ret);
 		break;
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
@@ -86,6 +112,7 @@
 gpk_cell_renderer_uri_set_property (GObject *object, guint param_id,
 				    const GValue *value, GParamSpec *pspec)
 {
+	gboolean ret;
 	GpkCellRendererUri *cru = GPK_CELL_RENDERER_URI (object);
 
 	switch (param_id) {
@@ -96,7 +123,8 @@
 		cru->uri = g_strdup (g_value_get_string (value));
 		break;
 	case PROP_CLICKED:
-		cru->clicked = g_value_get_boolean (value);
+		ret = g_value_get_boolean (value);
+		gpk_cell_renderer_uri_set_clicked (cru, ret);
 		break;
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
@@ -113,6 +141,7 @@
 			     GdkRectangle *expose_area,
 			     GtkCellRendererState flags)
 {
+	gboolean ret;
 	GdkCursor *cursor;
 	GpkCellRendererUri *cru = GPK_CELL_RENDERER_URI (cell);
 
@@ -124,12 +153,13 @@
 	}
 	gdk_window_set_cursor (widget->window, cursor);
 	gdk_cursor_destroy (cursor);
+	ret = gpk_cell_renderer_uri_is_clicked (cru);
 
 	/* set colour */
 	if (cru->uri == NULL) {
 		g_object_set (G_OBJECT (cell), "foreground", "#000000", NULL);
 		g_object_set (G_OBJECT (cru), "underline", PANGO_UNDERLINE_NONE, NULL);
-	} else if (cru->clicked) {
+	} else if (ret) {
 		g_object_set (G_OBJECT (cell), "foreground", "#840084", NULL);
 		g_object_set (G_OBJECT (cru), "underline", PANGO_UNDERLINE_SINGLE, NULL);
 	} else {
@@ -146,11 +176,25 @@
 	GTK_CELL_RENDERER_CLASS (parent_class)->render (cell, window, widget, background_area, cell_area, expose_area, flags);
 }
 
+/**
+ * gpk_cell_renderer_finalize:
+ * @object: The object to finalize
+ **/
+static void
+gpk_cell_renderer_finalize (GObject *object)
+{
+	GpkCellRendererUri *cru;
+	cru = GPK_CELL_RENDERER_URI (object);
+	g_hash_table_unref (cru->clicked);
+	G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
 static void
 gpk_cell_renderer_uri_class_init (GpkCellRendererUriClass *class)
 {
 	GtkCellRendererClass *cell_renderer_class;
 	GObjectClass *object_class = G_OBJECT_CLASS (class);
+	object_class->finalize = gpk_cell_renderer_finalize;
 
 	parent_class = g_type_class_peek_parent (class);
 
@@ -182,7 +226,7 @@
 gpk_cell_renderer_uri_init (GpkCellRendererUri *cru)
 {
 	cru->uri = NULL;
-	cru->clicked = FALSE;
+	cru->clicked = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
 }
 
 /**

Modified: trunk/src/gpk-cell-renderer-uri.h
==============================================================================
--- trunk/src/gpk-cell-renderer-uri.h	(original)
+++ trunk/src/gpk-cell-renderer-uri.h	Thu May 22 17:08:24 2008
@@ -28,8 +28,8 @@
 #define GPK_TYPE_CELL_RENDERER_URI		(gpk_cell_renderer_uri_get_type())
 #define GPK_CELL_RENDERER_URI(obj)		(G_TYPE_CHECK_INSTANCE_CAST((obj), GPK_TYPE_CELL_RENDERER_URI, GpkCellRendererUri))
 #define GPK_CELL_RENDERER_URI_CLASS(cls)	(G_TYPE_CHECK_CLASS_CAST((cls), GPK_TYPE_CELL_RENDERER_URI, GpkCellRendererUriClass))
-#define PK_IS_CELL_RENDERER_URI(obj)		(G_TYPE_CHECK_INSTANCE_TYPE((obj), GPK_TYPE_CELL_RENDERER_URI))
-#define PK_IS_CELL_RENDERER_URI_CLASS(cls)	(G_TYPE_CHECK_CLASS_TYPE((cls), GPK_TYPE_CELL_RENDERER_URI))
+#define GPK_IS_CELL_RENDERER_URI(obj)		(G_TYPE_CHECK_INSTANCE_TYPE((obj), GPK_TYPE_CELL_RENDERER_URI))
+#define GPK_IS_CELL_RENDERER_URI_CLASS(cls)	(G_TYPE_CHECK_CLASS_TYPE((cls), GPK_TYPE_CELL_RENDERER_URI))
 #define GPK_CELL_RENDERER_URI_GET_CLASS(obj)	(G_TYPE_INSTANCE_GET_CLASS((obj), GPK_TYPE_CELL_RENDERER_URI, GpkCellRendererUriClass))
 
 G_BEGIN_DECLS
@@ -41,7 +41,7 @@
 {
 	GtkCellRendererText	 parent;
 	gchar			*uri;
-	gboolean		 clicked;
+	GHashTable		*clicked;
 };
 
 struct _GpkCellRendererUriClass

Modified: trunk/src/gpk-client.c
==============================================================================
--- trunk/src/gpk-client.c	(original)
+++ trunk/src/gpk-client.c	Thu May 22 17:08:24 2008
@@ -54,6 +54,7 @@
 #include <gpk-error.h>
 #include "gpk-smart-icon.h"
 #include "gpk-consolekit.h"
+#include "gpk-animated-icon.h"
 
 static void     gpk_client_class_init	(GpkClientClass *klass);
 static void     gpk_client_init		(GpkClient      *gclient);
@@ -61,7 +62,7 @@
 
 #define GPK_CLIENT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GPK_TYPE_CLIENT, GpkClientPrivate))
 #define PK_STOCK_WINDOW_ICON		"system-software-installer"
-
+#define GPK_CLIENT_FINISHED_AUTOCLOSE_DELAY	10 /* seconds */
 /**
  * GpkClientPrivate:
  *
@@ -79,10 +80,11 @@
 	guint			 finished_timer_id;
 	PkControl		*control;
 	PkRoleEnum		 roles;
-	gboolean		 do_key_auth;
+	gboolean		 using_secondary_client;
 	gboolean		 retry_untrusted_value;
 	gboolean		 show_finished;
 	gboolean		 show_progress;
+	gboolean 		 finished_okay;
 };
 
 typedef enum {
@@ -214,7 +216,16 @@
 static gboolean
 gpk_install_finished_timeout (gpointer data)
 {
+	GtkWidget *widget;
 	GpkClient *gclient = (GpkClient *) data;
+
+	/* hide window manually to get it out of the way */
+	widget = glade_xml_get_widget (gclient->priv->glade_xml, "window_updates");
+	gtk_widget_hide (widget);
+
+	/* the timer will be done */
+	gclient->priv->finished_timer_id = 0;
+
 	gtk_main_quit ();
 	g_signal_emit (gclient, signals [GPK_CLIENT_QUIT], 0);
 	return FALSE;
@@ -336,19 +347,19 @@
 
 	g_return_if_fail (GPK_IS_CLIENT (gclient));
 
-	pk_client_get_role (client, &role, NULL, NULL);
+	/* save this */
+	gclient->priv->finished_okay = (exit == PK_EXIT_ENUM_SUCCESS);
 
+	pk_client_get_role (client, &role, NULL, NULL);
 	/* do nothing */
 	if (role == PK_ROLE_ENUM_GET_UPDATES) {
-		gtk_main_quit ();
-		return;
+		goto out;
 	}
 
 	/* do we show a libnotify window instead? */
 	if (!gclient->priv->show_progress) {
 		gpk_client_finished_no_progress (client, exit, runtime, gclient);
-		gtk_main_quit ();
-		return;
+		goto out;
 	}
 
 	if (exit == PK_EXIT_ENUM_SUCCESS &&
@@ -357,7 +368,8 @@
 
 		widget = glade_xml_get_widget (gclient->priv->glade_xml, "button_close2");
 		gtk_widget_grab_default (widget);
-		gclient->priv->finished_timer_id = g_timeout_add_seconds (30, gpk_install_finished_timeout, gclient);
+		gclient->priv->finished_timer_id = g_timeout_add_seconds (GPK_CLIENT_FINISHED_AUTOCLOSE_DELAY,
+									  gpk_install_finished_timeout, gclient);
 	} else {
 		widget = glade_xml_get_widget (gclient->priv->glade_xml, "window_updates");
 		gtk_widget_hide (widget);
@@ -370,7 +382,12 @@
 	/* set to 100% */
 	widget = glade_xml_get_widget (gclient->priv->glade_xml, "progressbar_percent");
 	gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (widget), 1.0f);
-	gtk_main_quit ();
+out:
+	/* only quit if there is not another transaction scheduled to be finished */
+	if (!gclient->priv->using_secondary_client) {
+		pk_debug ("quitting");
+		gtk_main_quit ();
+	}
 }
 
 /**
@@ -421,6 +438,12 @@
 
 	g_return_if_fail (GPK_IS_CLIENT (gclient));
 
+	/* set icon */
+	widget = glade_xml_get_widget (gclient->priv->glade_xml, "image_status");
+	gpk_set_animated_icon_from_status (GPK_ANIMATED_ICON (widget), status, GTK_ICON_SIZE_DIALOG);
+	gtk_widget_show (widget);
+
+	/* set label */
 	widget = glade_xml_get_widget (gclient->priv->glade_xml, "progress_part_label");
 	text = g_strdup_printf ("<b>%s</b>", gpk_status_enum_to_localised_text (status));
 	gtk_label_set_markup (GTK_LABEL (widget), text);
@@ -447,7 +470,7 @@
 	/* have we handled? */
 	if (code == PK_ERROR_ENUM_GPG_FAILURE ||
 	    code == PK_ERROR_ENUM_NO_LICENSE_AGREEMENT) {
-		if (gclient->priv->do_key_auth) {
+		if (gclient->priv->using_secondary_client) {
 			pk_debug ("ignoring error as handled");
 			return;
 		}
@@ -656,6 +679,7 @@
 static gboolean
 gpk_client_setup_window (GpkClient *gclient, const gchar *title)
 {
+	GtkRequisition requisition;
 	GtkWidget *widget;
 
 	g_return_val_if_fail (GPK_IS_CLIENT (gclient), FALSE);
@@ -668,6 +692,12 @@
 	widget = glade_xml_get_widget (gclient->priv->glade_xml, "progress_part_label");
 	gtk_label_set_label (GTK_LABEL (widget), "");
 	widget = glade_xml_get_widget (gclient->priv->glade_xml, "label_package");
+	gtk_label_set_label (GTK_LABEL (widget), "The Linux kernel (the core of the Linux operating system)\n\n\n");
+	gtk_widget_show (widget);
+
+	/* set the correct height of the label to stop the window jumping around */
+	gtk_widget_size_request (widget, &requisition);
+	gtk_widget_set_size_request (widget, requisition.width * 1.1f, requisition.height);
 	gtk_label_set_label (GTK_LABEL (widget), "");
 
 	return TRUE;
@@ -687,11 +717,44 @@
 gboolean
 gpk_client_install_local_files (GpkClient *gclient, gchar **files_rel, GError **error)
 {
+	GtkWidget *dialog;
+	GtkResponseType button;
+	const gchar *title;
+	gchar *message;
+	guint length;
 	gboolean ret;
 
 	g_return_val_if_fail (GPK_IS_CLIENT (gclient), FALSE);
 	g_return_val_if_fail (files_rel != NULL, FALSE);
 
+	length = g_strv_length (files_rel);
+	title = ngettext (_("Do you want to install this file?"),
+			  _("Do you want to install these files?"), length);
+	message = g_strjoinv ("\n", files_rel);
+
+	/* show UI */
+	dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_DESTROY_WITH_PARENT,
+					 GTK_MESSAGE_QUESTION, GTK_BUTTONS_OK_CANCEL,
+					 "%s", title);
+	gtk_message_dialog_format_secondary_markup (GTK_MESSAGE_DIALOG (dialog), "%s", message);
+
+	button = gtk_dialog_run (GTK_DIALOG (dialog));
+	gtk_widget_destroy (GTK_WIDGET (dialog));
+	g_free (message);
+
+	/* did we click no or exit the window? */
+	if (button != GTK_RESPONSE_OK) {
+		title = ngettext (_("The file was not installed"),
+				  _("The files were not installed"), length);
+		dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_DESTROY_WITH_PARENT,
+						 GTK_MESSAGE_INFO, GTK_BUTTONS_OK,
+						 "%s", title);
+		gtk_dialog_run (GTK_DIALOG (dialog));
+		gtk_widget_destroy (GTK_WIDGET (dialog));
+		ret = FALSE;
+		goto out;
+	}
+
 	gclient->priv->retry_untrusted_value = FALSE;
 	ret = gpk_client_install_local_files_internal (gclient, TRUE, files_rel, error);
 	if (!ret) {
@@ -717,6 +780,9 @@
 		gtk_main ();
 	}
 
+	/* retval depends on SUCCESS */
+	ret = gclient->priv->finished_okay;
+
 	/* we're done */
 	gpk_client_done (gclient);
 out:
@@ -793,6 +859,9 @@
 	/* wait for completion */
 	gtk_main ();
 
+	/* retval depends on SUCCESS */
+	ret = gclient->priv->finished_okay;
+
 	/* we're done */
 	gpk_client_done (gclient);
 out:
@@ -820,6 +889,9 @@
 	/* set title */
 	gpk_client_setup_window (gclient, _("Install packages"));
 
+	/* setup the UI */
+	gpk_client_set_page (gclient, GPK_CLIENT_PAGE_PROGRESS);
+
 	/* are we dumb and can't check for depends? */
 	if (!pk_enums_contain (gclient->priv->roles, PK_ROLE_ENUM_GET_DEPENDS)) {
 		pk_warning ("skipping depends check");
@@ -866,6 +938,9 @@
 	/* wait for completion */
 	gtk_main ();
 
+	/* retval depends on SUCCESS */
+	ret = gclient->priv->finished_okay;
+
 	/* we're done */
 	gpk_client_done (gclient);
 out:
@@ -906,6 +981,7 @@
 		gpk_client_error_set (error, GPK_CLIENT_ERROR_FAILED, error_local->message);
 		goto out;
 	}
+
 out:
 	if (error_local != NULL) {
 		g_error_free (error_local);
@@ -1073,7 +1149,7 @@
 gboolean
 gpk_client_update_system (GpkClient *gclient, GError **error)
 {
-	gboolean ret;
+	gboolean ret = TRUE;
 	GError *error_local = NULL;
 	gchar *text = NULL;
 	gchar *message = NULL;
@@ -1085,8 +1161,7 @@
 	if (!ret) {
 		gpk_client_error_msg (gclient, _("Failed to reset client"), _("Failed to reset resolve"));
 		gpk_client_error_set (error, GPK_CLIENT_ERROR_FAILED, error_local->message);
-		g_error_free (error_local);
-		return FALSE;
+		goto out;
 	}
 
 	/* set title */
@@ -1129,10 +1204,16 @@
 	/* wait for completion */
 	gtk_main ();
 
+	/* retval depends on SUCCESS */
+	ret = gclient->priv->finished_okay;
+
 out:
+	if (error_local != NULL) {
+		g_error_free (error_local);
+	}
 	g_free (message);
 	g_free (text);
-	return FALSE;
+	return ret;
 }
 
 /**
@@ -1153,8 +1234,7 @@
 	if (!ret) {
 		gpk_client_error_msg (gclient, _("Failed to reset client"), _("Failed to reset resolve"));
 		gpk_client_error_set (error, GPK_CLIENT_ERROR_FAILED, error_local->message);
-		g_error_free (error_local);
-		return FALSE;
+		goto out;
 	}
 
 	/* set title */
@@ -1183,7 +1263,13 @@
 	/* wait for completion */
 	gtk_main ();
 
+	/* retval depends on SUCCESS */
+	ret = gclient->priv->finished_okay;
+
 out:
+	if (error_local != NULL) {
+		g_error_free (error_local);
+	}
 	g_free (message);
 	g_free (text);
 	return ret;
@@ -1247,7 +1333,7 @@
 gboolean
 gpk_client_update_packages (GpkClient *gclient, gchar **package_ids, GError **error)
 {
-	gboolean ret;
+	gboolean ret = TRUE;
 	GError *error_local = NULL;
 	gchar *text = NULL;
 	gchar *message = NULL;
@@ -1259,8 +1345,7 @@
 	if (!ret) {
 		gpk_client_error_msg (gclient, _("Failed to reset client"), _("Failed to reset resolve"));
 		gpk_client_error_set (error, GPK_CLIENT_ERROR_FAILED, error_local->message);
-		g_error_free (error_local);
-		return FALSE;
+		goto out;
 	}
 
 	/* set title */
@@ -1289,10 +1374,16 @@
 	/* wait for completion */
 	gtk_main ();
 
+	/* retval depends on SUCCESS */
+	ret = gclient->priv->finished_okay;
+
 out:
+	if (error_local != NULL) {
+		g_error_free (error_local);
+	}
 	g_free (message);
 	g_free (text);
-	return FALSE;
+	return ret;
 }
 
 /**
@@ -1327,7 +1418,7 @@
 	/* this is asynchronous, else we get into livelock */
 	ret = pk_client_install_signature (gclient->priv->client_secondary, PK_SIGTYPE_ENUM_GPG,
 					   key_id, package_id, &error);
-	gclient->priv->do_key_auth = ret;
+	gclient->priv->using_secondary_client = ret;
 	if (!ret) {
 		gpk_error_dialog (_("Failed to install signature"), _("The method failed"), error->message);
 		g_error_free (error);
@@ -1367,7 +1458,7 @@
 		gpk_error_dialog (_("Failed to accept EULA"), _("The method failed"), error->message);
 		g_error_free (error);
 	}
-	gclient->priv->do_key_auth = ret;
+	gclient->priv->using_secondary_client = ret;
 }
 
 /**
@@ -1381,13 +1472,17 @@
 
 	g_return_val_if_fail (GPK_IS_CLIENT (gclient), FALSE);
 
+	/* go back to the UI */
+	gpk_client_set_page (gclient, GPK_CLIENT_PAGE_PROGRESS);
+	gclient->priv->using_secondary_client = FALSE;
+
 	pk_debug ("trying to requeue install");
 	ret = pk_client_requeue (gclient->priv->client_action, &error);
 	if (!ret) {
 		gpk_error_dialog (_("Failed to install"), _("The install task could not be requeued"), error->message);
 		g_error_free (error);
 	}
-	gtk_main ();
+
 	return FALSE;
 }
 
@@ -1545,6 +1640,21 @@
 }
 
 /**
+ * gpk_client_create_custom_widget:
+ **/
+static GtkWidget *
+gpk_client_create_custom_widget (GladeXML *xml, gchar *func_name, gchar *name,
+				 gchar *string1, gchar *string2,
+				 gint int1, gint int2, gpointer user_data)
+{
+	if (pk_strequal (name, "image_status")) {
+		return gpk_animated_icon_new ();
+	}
+	pk_warning ("name unknown=%s", name);
+	return NULL;
+}
+
+/**
  * gpk_client_class_init:
  * @klass: The #GpkClientClass
  **/
@@ -1576,7 +1686,8 @@
 
 	gclient->priv->glade_xml = NULL;
 	gclient->priv->pulse_timer_id = 0;
-	gclient->priv->do_key_auth = FALSE;
+	gclient->priv->using_secondary_client = FALSE;
+	gclient->priv->finished_okay = TRUE;
 	gclient->priv->show_finished = TRUE;
 	gclient->priv->show_progress = TRUE;
 	gclient->priv->finished_timer_id = 0;
@@ -1585,6 +1696,9 @@
 	gtk_icon_theme_append_search_path (gtk_icon_theme_get_default (),
 					   PK_DATA G_DIR_SEPARATOR_S "icons");
 
+	/* use custom widgets */
+	glade_set_custom_handler (gpk_client_create_custom_widget, gclient);
+
 	/* use gconf for session settings */
 	gclient->priv->gconf_client = gconf_client_get_default ();
 

Modified: trunk/src/gpk-common.c
==============================================================================
--- trunk/src/gpk-common.c	(original)
+++ trunk/src/gpk-common.c	Thu May 22 17:08:24 2008
@@ -26,6 +26,7 @@
 #include <math.h>
 #include <string.h>
 #include <unistd.h>
+#include <sys/types.h>
 #include <gtk/gtk.h>
 #include <dbus/dbus-glib.h>
 
@@ -35,7 +36,9 @@
 #include <pk-package-id.h>
 #include <pk-enum.h>
 #include <pk-common.h>
+
 #include "gpk-common.h"
+#include "gpk-error.h"
 
 /* icon names */
 static PkEnumMatch enum_info_icon_name[] = {
@@ -1270,6 +1273,107 @@
 }
 
 /**
+ * gpk_check_privileged_user
+ **/
+gboolean
+gpk_check_privileged_user (const gchar *application_name)
+{
+	guint uid;
+	gchar *message;
+	gchar *title;
+
+	uid = getuid ();
+	if (uid == 0) {
+		if (application_name == NULL) {
+			title = g_strdup (_("This application is running as a privileged user"));
+		} else {
+			title = g_strdup_printf (_("%s is running as a privileged user"), application_name);
+		}
+		message = g_strjoin ("\n",
+				     _("Running graphical applications as a privileged user should be avoided for security reasons."),
+				     _("PackageKit applications are security sensitive and therefore this application will now close."), NULL);
+		gpk_error_dialog (title, message, "");
+		g_free (title);
+		g_free (message);
+		pk_warning ("uid=%i so closing", uid);
+		return FALSE;
+	}
+	return TRUE;
+}
+
+/**
+ * gpk_check_icon_valid:
+ *
+ * Check icon actually exists and is valid in this theme
+ **/
+gboolean
+gpk_check_icon_valid (const gchar *icon)
+{
+	GtkIconInfo *icon_info;
+	static GtkIconTheme *icon_theme = NULL;
+	gboolean ret = TRUE;
+
+	/* trivial case */
+	if (pk_strzero (icon)) {
+		return FALSE;
+	}
+
+	/* no unref required */
+	if (icon_theme == NULL) {
+		icon_theme = gtk_icon_theme_get_default ();
+	}
+
+	/* default to 32x32 */
+	icon_info = gtk_icon_theme_lookup_icon (icon_theme, icon, 32, GTK_ICON_LOOKUP_USE_BUILTIN);
+	if (icon_info == NULL) {
+		pk_debug ("ignoring broken icon %s", icon);
+		ret = FALSE;
+	} else {
+		/* we only used this to see if it was valid */
+		gtk_icon_info_free (icon_info);
+	}
+	return ret;
+}
+
+/**
+ * gpk_set_animated_icon_from_status:
+ **/
+gboolean
+gpk_set_animated_icon_from_status (GpkAnimatedIcon *icon, PkStatusEnum status, GtkIconSize size)
+{
+	const gchar *name;
+
+	/* choose icon */
+	if (status == PK_STATUS_ENUM_REFRESH_CACHE ||
+	    status == PK_STATUS_ENUM_DOWNLOAD_REPOSITORY ||
+	    status == PK_STATUS_ENUM_DOWNLOAD_PACKAGELIST ||
+	    status == PK_STATUS_ENUM_DOWNLOAD_FILELIST ||
+	    status == PK_STATUS_ENUM_DOWNLOAD_CHANGELOG ||
+	    status == PK_STATUS_ENUM_DOWNLOAD_GROUP ||
+	    status == PK_STATUS_ENUM_DOWNLOAD_UPDATEINFO) {
+		name = "pk-action-refresh-cache";
+		gpk_animated_icon_set_frame_delay (icon, 150);
+		gpk_animated_icon_set_filename_tile (icon, size, name);
+		gpk_animated_icon_enable_animation (icon, TRUE);
+	} else if (status == PK_STATUS_ENUM_QUERY ||
+		   status == PK_STATUS_ENUM_INFO) {
+		name = "process-working";
+		gpk_animated_icon_set_frame_delay (icon, 50);
+		gpk_animated_icon_set_filename_tile (icon, size, name);
+		gpk_animated_icon_enable_animation (icon, TRUE);
+	} else {
+		name = gpk_status_enum_to_icon_name (status);
+		gtk_image_set_from_icon_name (GTK_IMAGE (icon), name, size);
+	}
+
+	/* stop spinning */
+	if (status == PK_STATUS_ENUM_FINISHED) {
+		gpk_animated_icon_enable_animation (icon, FALSE);
+	}
+	return TRUE;
+}
+
+/**
  * gpk_time_to_localised_string:
  * @time_secs: The time value to convert in seconds
  *

Modified: trunk/src/gpk-common.h
==============================================================================
--- trunk/src/gpk-common.h	(original)
+++ trunk/src/gpk-common.h	Thu May 22 17:08:24 2008
@@ -24,6 +24,7 @@
 
 #include <glib-object.h>
 #include <pk-enum.h>
+#include "gpk-animated-icon.h"
 
 G_BEGIN_DECLS
 
@@ -93,6 +94,11 @@
 							 G_GNUC_CONST;
 gchar		*gpk_time_to_localised_string		(guint		 time_secs);
 gchar		**gpk_convert_argv_to_strv		(gchar		*argv[]);
+gboolean	 gpk_check_privileged_user		(const gchar	*application_name);
+gboolean	 gpk_check_icon_valid			(const gchar	*icon);
+gboolean	 gpk_set_animated_icon_from_status	(GpkAnimatedIcon *icon,
+							 PkStatusEnum	 status,
+							 GtkIconSize	 size);
 
 G_END_DECLS
 

Modified: trunk/src/gpk-install-local-file.c
==============================================================================
--- trunk/src/gpk-install-local-file.c	(original)
+++ trunk/src/gpk-install-local-file.c	Thu May 22 17:08:24 2008
@@ -71,6 +71,12 @@
 	pk_debug_init (verbose);
 	gtk_init (&argc, &argv);
 
+	/* are we running privileged */
+	ret = gpk_check_privileged_user (_("Local file installer"));
+	if (!ret) {
+		return 1;
+	}
+
 	if (argc < 2) {
 		gpk_error_dialog (_("Failed to install local file"),
 				  _("You need to specify a file to install"), NULL);

Modified: trunk/src/gpk-install-mime-type.c
==============================================================================
--- trunk/src/gpk-install-mime-type.c	(original)
+++ trunk/src/gpk-install-mime-type.c	Thu May 22 17:08:24 2008
@@ -70,6 +70,12 @@
 	pk_debug_init (verbose);
 	gtk_init (&argc, &argv);
 
+	/* are we running privileged */
+	ret = gpk_check_privileged_user (_("Mime type installer"));
+	if (!ret) {
+		return 1;
+	}
+
 	if (argc < 2) {
 		gpk_error_dialog (_("Failed to install file handler"),
 				  _("You need to specify a mime-type to install"), NULL);

Modified: trunk/src/gpk-install-package-name.c
==============================================================================
--- trunk/src/gpk-install-package-name.c	(original)
+++ trunk/src/gpk-install-package-name.c	Thu May 22 17:08:24 2008
@@ -71,6 +71,12 @@
 	pk_debug_init (verbose);
 	gtk_init (&argc, &argv);
 
+	/* are we running privileged */
+	ret = gpk_check_privileged_user (_("Package name installer"));
+	if (!ret) {
+		return 1;
+	}
+
 	if (argc < 2) {
 		gpk_error_dialog (_("Failed to install package from name"),
 				  _("You need to specify a package to install"), NULL);

Modified: trunk/src/gpk-install-provide-file.c
==============================================================================
--- trunk/src/gpk-install-provide-file.c	(original)
+++ trunk/src/gpk-install-provide-file.c	Thu May 22 17:08:24 2008
@@ -70,6 +70,12 @@
 	pk_debug_init (verbose);
 	gtk_init (&argc, &argv);
 
+	/* are we running privileged */
+	ret = gpk_check_privileged_user (_("Provide file installer"));
+	if (!ret) {
+		return 1;
+	}
+
 	if (argc < 2) {
 		gpk_error_dialog (_("Failed to install a package to provide a file"),
 				  _("You need to specify a filename to install"), NULL);

Modified: trunk/src/gpk-log.c
==============================================================================
--- trunk/src/gpk-log.c	(original)
+++ trunk/src/gpk-log.c	Thu May 22 17:08:24 2008
@@ -33,6 +33,9 @@
 
 #include <polkit-gnome/polkit-gnome.h>
 
+/* local .la */
+#include <libunique.h>
+
 #include <pk-debug.h>
 #include <pk-client.h>
 #include <pk-control.h>
@@ -306,6 +309,17 @@
 }
 
 /**
+ * gpk_log_activated_cb
+ **/
+static void
+gpk_log_activated_cb (LibUnique *libunique, gpointer data)
+{
+	GtkWidget *widget;
+	widget = glade_xml_get_widget (glade_xml, "window_simple");
+	gtk_window_present (GTK_WINDOW (widget));
+}
+
+/**
  * main:
  **/
 int
@@ -318,6 +332,8 @@
 	GtkTreeSelection *selection;
 	PkRoleEnum roles;
 	PkControl *control;
+	LibUnique *libunique;
+	gboolean ret;
 
 	const GOptionEntry options[] = {
 		{ "verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose,
@@ -353,6 +369,21 @@
 	pk_debug_init (verbose);
 	gtk_init (&argc, &argv);
 
+	/* are we running privileged */
+	ret = gpk_check_privileged_user (_("Log viewer"));
+	if (!ret) {
+		return 1;
+	}
+
+	/* are we already activated? */
+	libunique = libunique_new ();
+	ret = libunique_assign (libunique, "org.freedesktop.PackageKit.LogViewer");
+	if (!ret) {
+		goto unique_out;
+	}
+	g_signal_connect (libunique, "activated",
+			  G_CALLBACK (gpk_log_activated_cb), NULL);
+
 	/* add application specific icons to search path */
 	gtk_icon_theme_append_search_path (gtk_icon_theme_get_default (),
                                            PK_DATA G_DIR_SEPARATOR_S "icons");
@@ -427,6 +458,7 @@
 	g_object_unref (list_store);
 	g_object_unref (client);
 	g_free (transaction_id);
-
+unique_out:
+	g_object_unref (libunique);
 	return 0;
 }

Modified: trunk/src/gpk-prefs.c
==============================================================================
--- trunk/src/gpk-prefs.c	(original)
+++ trunk/src/gpk-prefs.c	Thu May 22 17:08:24 2008
@@ -32,6 +32,9 @@
 #include <dbus/dbus-glib.h>
 #include <gconf/gconf-client.h>
 
+/* local .la */
+#include <libunique.h>
+
 #include <pk-debug.h>
 #include <pk-control.h>
 #include <pk-client.h>
@@ -249,6 +252,17 @@
 }
 
 /**
+ * gpk_prefs_activated_cb
+ **/
+static void
+gpk_prefs_activated_cb (LibUnique *libunique, gpointer data)
+{
+	GtkWidget *widget;
+	widget = glade_xml_get_widget (glade_xml, "window_prefs");
+	gtk_window_present (GTK_WINDOW (widget));
+}
+
+/**
  * main:
  **/
 int
@@ -262,6 +276,8 @@
 	PkRoleEnum roles;
 	PkClient *client;
 	PkControl *control;
+	LibUnique *libunique;
+	gboolean ret;
 
 	const GOptionEntry options[] = {
 		{ "verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose,
@@ -297,6 +313,15 @@
 	pk_debug_init (verbose);
 	gtk_init (&argc, &argv);
 
+	/* are we already activated? */
+	libunique = libunique_new ();
+	ret = libunique_assign (libunique, "org.freedesktop.PackageKit.Prefs");
+	if (!ret) {
+		goto unique_out;
+	}
+	g_signal_connect (libunique, "activated",
+			  G_CALLBACK (gpk_prefs_activated_cb), NULL);
+
 	client = pk_client_new ();
 
 	/* get actions */
@@ -337,6 +362,8 @@
 
 	g_object_unref (glade_xml);
 	g_object_unref (client);
+unique_out:
+	g_object_unref (libunique);
 
 	return 0;
 }

Modified: trunk/src/gpk-repo.c
==============================================================================
--- trunk/src/gpk-repo.c	(original)
+++ trunk/src/gpk-repo.c	Thu May 22 17:08:24 2008
@@ -32,6 +32,9 @@
 #include <dbus/dbus-glib.h>
 #include <gconf/gconf-client.h>
 
+/* local .la */
+#include <libunique.h>
+
 #include <pk-debug.h>
 #include <pk-client.h>
 #include <pk-control.h>
@@ -119,11 +122,11 @@
 }
 
 /**
- * pk_repo_detail_cb:
+ * gpk_repo_detail_cb:
  **/
 static void
-pk_repo_detail_cb (PkClient *client, const gchar *repo_id,
-		   const gchar *description, gboolean enabled, gpointer data)
+gpk_repo_detail_cb (PkClient *client, const gchar *repo_id,
+		    const gchar *description, gboolean enabled, gpointer data)
 {
 	GtkTreeIter iter;
 
@@ -188,37 +191,37 @@
 }
 
 /**
- * pk_repo_finished_cb:
+ * gpk_repo_finished_cb:
  **/
 static void
-pk_repo_finished_cb (PkClient *client, PkExitEnum exit, guint runtime, gpointer data)
+gpk_repo_finished_cb (PkClient *client, PkExitEnum exit, guint runtime, gpointer data)
 {
 	/* nothing? */
 }
 
 /**
- * pk_repo_status_changed_cb:
+ * gpk_repo_status_changed_cb:
  **/
 static void
-pk_repo_status_changed_cb (PkClient *client, PkStatusEnum status, gpointer data)
+gpk_repo_status_changed_cb (PkClient *client, PkStatusEnum status, gpointer data)
 {
 	gpk_statusbar_set_status (statusbar, status);
 }
 
 /**
- * pk_repo_error_code_cb:
+ * gpk_repo_error_code_cb:
  **/
 static void
-pk_repo_error_code_cb (PkClient *client, PkErrorCodeEnum code, const gchar *details, gpointer data)
+gpk_repo_error_code_cb (PkClient *client, PkErrorCodeEnum code, const gchar *details, gpointer data)
 {
 	gpk_error_dialog (_("Failed to change status"), gpk_error_enum_to_localised_text (code), details);
 }
 
 /**
- * pk_repo_repo_list_refresh:
+ * gpk_repo_repo_list_refresh:
  **/
 static void
-pk_repo_repo_list_refresh (void)
+gpk_repo_repo_list_refresh (void)
 {
 	gboolean ret;
 	GError *error = NULL;
@@ -246,24 +249,35 @@
 }
 
 /**
- * pk_repo_repo_list_changed_cb:
+ * gpk_repo_repo_list_changed_cb:
  **/
 static void
-pk_repo_repo_list_changed_cb (PkControl *control, gpointer data)
+gpk_repo_repo_list_changed_cb (PkControl *control, gpointer data)
 {
-	pk_repo_repo_list_refresh ();
+	gpk_repo_repo_list_refresh ();
 }
 
 /**
- * pk_repo_checkbutton_details:
+ * gpk_repo_checkbutton_details:
  **/
 static void
-pk_repo_checkbutton_details (GtkWidget *widget, gpointer data)
+gpk_repo_checkbutton_details (GtkWidget *widget, gpointer data)
 {
 	show_details = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
 	pk_debug ("Changing %s to %i", GPK_CONF_REPO_SHOW_DETAILS, show_details);
 	gconf_client_set_bool (gconf_client, GPK_CONF_REPO_SHOW_DETAILS, show_details, NULL);
-	pk_repo_repo_list_refresh ();
+	gpk_repo_repo_list_refresh ();
+}
+
+/**
+ * gpk_repo_activated_cb
+ **/
+static void
+gpk_repo_activated_cb (LibUnique *libunique, gpointer data)
+{
+	GtkWidget *widget;
+	widget = glade_xml_get_widget (glade_xml, "window_repo");
+	gtk_window_present (GTK_WINDOW (widget));
 }
 
 /**
@@ -278,6 +292,8 @@
 	GtkWidget *widget;
 	GtkTreeSelection *selection;
 	PkControl *control;
+	LibUnique *libunique;
+	gboolean ret;
 
 	const GOptionEntry options[] = {
 		{ "verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose,
@@ -306,21 +322,36 @@
 	pk_debug_init (verbose);
 	gtk_init (&argc, &argv);
 
+	/* are we running privileged */
+	ret = gpk_check_privileged_user (_("Software source viewer"));
+	if (!ret) {
+		return 1;
+	}
+
+	/* are we already activated? */
+	libunique = libunique_new ();
+	ret = libunique_assign (libunique, "org.freedesktop.PackageKit.Repo");
+	if (!ret) {
+		goto unique_out;
+	}
+	g_signal_connect (libunique, "activated",
+			  G_CALLBACK (gpk_repo_activated_cb), NULL);
+
 	gconf_client = gconf_client_get_default ();
 
 	client = pk_client_new ();
 	g_signal_connect (client, "repo-detail",
-			  G_CALLBACK (pk_repo_detail_cb), NULL);
+			  G_CALLBACK (gpk_repo_detail_cb), NULL);
 	g_signal_connect (client, "status-changed",
-			  G_CALLBACK (pk_repo_status_changed_cb), NULL);
+			  G_CALLBACK (gpk_repo_status_changed_cb), NULL);
 	g_signal_connect (client, "finished",
-			  G_CALLBACK (pk_repo_finished_cb), NULL);
+			  G_CALLBACK (gpk_repo_finished_cb), NULL);
 	g_signal_connect (client, "error-code",
-			  G_CALLBACK (pk_repo_error_code_cb), NULL);
+			  G_CALLBACK (gpk_repo_error_code_cb), NULL);
 
 	control = pk_control_new ();
 	g_signal_connect (control, "repo-list-changed",
-			  G_CALLBACK (pk_repo_repo_list_changed_cb), NULL);
+			  G_CALLBACK (gpk_repo_repo_list_changed_cb), NULL);
 	roles = pk_control_get_actions (control);
 
 	glade_xml = glade_xml_new (PK_DATA "/gpk-repo.glade", NULL, NULL);
@@ -340,7 +371,7 @@
 	show_details = gconf_client_get_bool (gconf_client, GPK_CONF_REPO_SHOW_DETAILS, NULL);
 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), show_details);
 	g_signal_connect (widget, "clicked",
-			  G_CALLBACK (pk_repo_checkbutton_details), NULL);
+			  G_CALLBACK (gpk_repo_checkbutton_details), NULL);
 
 	gtk_widget_set_size_request (main_window, 500, 300);
 
@@ -375,9 +406,9 @@
 
 	if (pk_enums_contain (roles, PK_ROLE_ENUM_GET_REPO_LIST)) {
 		/* get the update list */
-		pk_repo_repo_list_refresh ();
+		gpk_repo_repo_list_refresh ();
 	} else {
-		pk_repo_detail_cb (client, "default",
+		gpk_repo_detail_cb (client, "default",
 				   _("Getting software source list not supported by backend"), FALSE, NULL);
 		widget = glade_xml_get_widget (glade_xml, "treeview_repo");
 		gtk_widget_set_sensitive (widget, FALSE);
@@ -394,6 +425,8 @@
 	g_object_unref (client);
 	g_object_unref (control);
 	g_object_unref (statusbar);
+unique_out:
+	g_object_unref (libunique);
 
 	return 0;
 }

Modified: trunk/src/gpk-smart-icon.c
==============================================================================
--- trunk/src/gpk-smart-icon.c	(original)
+++ trunk/src/gpk-smart-icon.c	Thu May 22 17:08:24 2008
@@ -50,8 +50,8 @@
 static void     gpk_smart_icon_init		(GpkSmartIcon      *sicon);
 static void     gpk_smart_icon_finalize		(GObject       *object);
 
-#define PK_SMART_ICON_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), PK_TYPE_SMART_ICON, GpkSmartIconPrivate))
-#define PK_SMART_ICON_PERSIST_TIMEOUT	100
+#define GPK_SMART_ICON_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GPK_TYPE_SMART_ICON, GpkSmartIconPrivate))
+#define GPK_SMART_ICON_PERSIST_TIMEOUT	100
 
 struct GpkSmartIconPrivate
 {
@@ -141,7 +141,7 @@
 	GdkPixbuf *pixbuf;
 	GdkRectangle area;
 
-	g_return_val_if_fail (PK_IS_SMART_ICON (sicon), FALSE);
+	g_return_val_if_fail (GPK_IS_SMART_ICON (sicon), FALSE);
 
 	/* have we hidden the icon already? */
 	if (sicon->priv->current == NULL || sicon->priv->new == NULL) {
@@ -185,7 +185,7 @@
 gboolean
 gpk_smart_icon_pulse (GpkSmartIcon *sicon)
 {
-	g_return_val_if_fail (PK_IS_SMART_ICON (sicon), FALSE);
+	g_return_val_if_fail (GPK_IS_SMART_ICON (sicon), FALSE);
 
 	sicon->priv->icon_opacity = 0.9;
 	sicon->priv->going_down = TRUE;
@@ -236,7 +236,7 @@
 gboolean
 gpk_smart_icon_set_icon_name (GpkSmartIcon *sicon, const gchar *icon_name)
 {
-	g_return_val_if_fail (PK_IS_SMART_ICON (sicon), FALSE);
+	g_return_val_if_fail (GPK_IS_SMART_ICON (sicon), FALSE);
 
 	/* if we have a request pending, then cancel it in preference to this one */
 	if (sicon->priv->event_source != 0) {
@@ -249,7 +249,7 @@
 	sicon->priv->new = g_strdup (icon_name);
 
 	/* wait a little while to see if it's worth displaying the icon */
-	sicon->priv->event_source = g_timeout_add (PK_SMART_ICON_PERSIST_TIMEOUT, gpk_smart_icon_set_icon_name_cb, sicon);
+	sicon->priv->event_source = g_timeout_add (GPK_SMART_ICON_PERSIST_TIMEOUT, gpk_smart_icon_set_icon_name_cb, sicon);
 	return TRUE;
 }
 
@@ -259,7 +259,7 @@
 gboolean
 gpk_smart_icon_sync (GpkSmartIcon *sicon)
 {
-	g_return_val_if_fail (PK_IS_SMART_ICON (sicon), FALSE);
+	g_return_val_if_fail (GPK_IS_SMART_ICON (sicon), FALSE);
 
 	/* if we have a request pending, then cancel it in preference to this one */
 	if (sicon->priv->event_source != 0) {
@@ -283,7 +283,7 @@
 GtkStatusIcon *
 gpk_smart_icon_get_status_icon (GpkSmartIcon *sicon)
 {
-	g_return_val_if_fail (PK_IS_SMART_ICON (sicon), NULL);
+	g_return_val_if_fail (GPK_IS_SMART_ICON (sicon), NULL);
 	return sicon->priv->status_icon;
 }
 
@@ -293,7 +293,7 @@
 gboolean
 gpk_smart_icon_set_tooltip (GpkSmartIcon *sicon, const gchar *tooltip)
 {
-	g_return_val_if_fail (PK_IS_SMART_ICON (sicon), FALSE);
+	g_return_val_if_fail (GPK_IS_SMART_ICON (sicon), FALSE);
 	gtk_status_icon_set_tooltip (GTK_STATUS_ICON (sicon->priv->status_icon), tooltip);
 	return TRUE;
 }
@@ -307,7 +307,7 @@
 {
 	guint timeout_val = 0;
 
-	g_return_val_if_fail (PK_IS_SMART_ICON (sicon), FALSE);
+	g_return_val_if_fail (GPK_IS_SMART_ICON (sicon), FALSE);
 
 	pk_debug ("Doing notification: %s, %s, %s", title, message, icon);
 
@@ -339,7 +339,7 @@
 {
 	GpkNotifyButton button;
 
-	g_return_if_fail (PK_IS_SMART_ICON (sicon));
+	g_return_if_fail (GPK_IS_SMART_ICON (sicon));
 
 	/* get the value */
 	button = pk_enum_find_value (enum_button_ids, action);
@@ -358,7 +358,7 @@
 	const gchar *text = NULL;
 	const gchar *id = NULL;
 
-	g_return_val_if_fail (PK_IS_SMART_ICON (sicon), FALSE);
+	g_return_val_if_fail (GPK_IS_SMART_ICON (sicon), FALSE);
 
 	/* get the id */
 	id = pk_enum_find_string (enum_button_ids, button);
@@ -405,7 +405,7 @@
 	GError *error = NULL;
 	gboolean value;
 
-	g_return_val_if_fail (PK_IS_SMART_ICON (sicon), FALSE);
+	g_return_val_if_fail (GPK_IS_SMART_ICON (sicon), FALSE);
 	g_return_val_if_fail (sicon->priv->dialog != NULL, FALSE);
 
 	/* check the gconf key isn't set to ignore */
@@ -435,7 +435,7 @@
 gboolean
 gpk_smart_icon_notify_close (GpkSmartIcon *sicon)
 {
-	g_return_val_if_fail (PK_IS_SMART_ICON (sicon), FALSE);
+	g_return_val_if_fail (GPK_IS_SMART_ICON (sicon), FALSE);
 	notify_notification_close (sicon->priv->dialog, NULL);
 	return TRUE;
 }
@@ -447,7 +447,7 @@
 static void
 gpk_smart_icon_init (GpkSmartIcon *sicon)
 {
-	sicon->priv = PK_SMART_ICON_GET_PRIVATE (sicon);
+	sicon->priv = GPK_SMART_ICON_GET_PRIVATE (sicon);
 	sicon->priv->status_icon = gtk_status_icon_new ();
 	sicon->priv->new = NULL;
 	sicon->priv->current = NULL;
@@ -473,9 +473,9 @@
 {
 	GpkSmartIcon *sicon;
 
-	g_return_if_fail (PK_IS_SMART_ICON (object));
+	g_return_if_fail (GPK_IS_SMART_ICON (object));
 
-	sicon = PK_SMART_ICON (object);
+	sicon = GPK_SMART_ICON (object);
 	g_return_if_fail (sicon->priv != NULL);
 
 	/* remove any timers that may be firing */
@@ -511,7 +511,7 @@
 gpk_smart_icon_new (void)
 {
 	GpkSmartIcon *sicon;
-	sicon = g_object_new (PK_TYPE_SMART_ICON, NULL);
-	return PK_SMART_ICON (sicon);
+	sicon = g_object_new (GPK_TYPE_SMART_ICON, NULL);
+	return GPK_SMART_ICON (sicon);
 }
 

Modified: trunk/src/gpk-smart-icon.h
==============================================================================
--- trunk/src/gpk-smart-icon.h	(original)
+++ trunk/src/gpk-smart-icon.h	Thu May 22 17:08:24 2008
@@ -19,21 +19,21 @@
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
-#ifndef __PK_SMART_ICON_H
-#define __PK_SMART_ICON_H
+#ifndef __GPK_SMART_ICON_H
+#define __GPK_SMART_ICON_H
 
 #include <glib-object.h>
 
 G_BEGIN_DECLS
 
-#define PK_TYPE_SMART_ICON		(gpk_smart_icon_get_type ())
-#define PK_SMART_ICON(o)		(G_TYPE_CHECK_INSTANCE_CAST ((o), PK_TYPE_SMART_ICON, GpkSmartIcon))
-#define PK_SMART_ICON_CLASS(k)		(G_TYPE_CHECK_CLASS_CAST((k), PK_TYPE_SMART_ICON, GpkSmartIconClass))
-#define PK_IS_SMART_ICON(o)	 	(G_TYPE_CHECK_INSTANCE_TYPE ((o), PK_TYPE_SMART_ICON))
-#define PK_IS_SMART_ICON_CLASS(k)	(G_TYPE_CHECK_CLASS_TYPE ((k), PK_TYPE_SMART_ICON))
-#define PK_SMART_ICON_GET_CLASS(o)	(G_TYPE_INSTANCE_GET_CLASS ((o), PK_TYPE_SMART_ICON, GpkSmartIconClass))
-#define PK_SMART_ICON_ERROR		(gpk_smart_icon_error_quark ())
-#define PK_SMART_ICON_TYPE_ERROR	(gpk_smart_icon_error_get_type ())
+#define GPK_TYPE_SMART_ICON		(gpk_smart_icon_get_type ())
+#define GPK_SMART_ICON(o)		(G_TYPE_CHECK_INSTANCE_CAST ((o), GPK_TYPE_SMART_ICON, GpkSmartIcon))
+#define GPK_SMART_ICON_CLASS(k)		(G_TYPE_CHECK_CLASS_CAST((k), GPK_TYPE_SMART_ICON, GpkSmartIconClass))
+#define GPK_IS_SMART_ICON(o)	 	(G_TYPE_CHECK_INSTANCE_TYPE ((o), GPK_TYPE_SMART_ICON))
+#define GPK_IS_SMART_ICON_CLASS(k)	(G_TYPE_CHECK_CLASS_TYPE ((k), GPK_TYPE_SMART_ICON))
+#define GPK_SMART_ICON_GET_CLASS(o)	(G_TYPE_INSTANCE_GET_CLASS ((o), GPK_TYPE_SMART_ICON, GpkSmartIconClass))
+#define GPK_SMART_ICON_ERROR		(gpk_smart_icon_error_quark ())
+#define GPK_SMART_ICON_TYPE_ERROR	(gpk_smart_icon_error_get_type ())
 
 typedef struct GpkSmartIconPrivate GpkSmartIconPrivate;
 
@@ -97,4 +97,4 @@
 
 G_END_DECLS
 
-#endif /* __PK_SMART_ICON_H */
+#endif /* __GPK_SMART_ICON_H */

Modified: trunk/src/gpk-update-icon.c
==============================================================================
--- trunk/src/gpk-update-icon.c	(original)
+++ trunk/src/gpk-update-icon.c	Thu May 22 17:08:24 2008
@@ -41,6 +41,7 @@
 #include "gpk-firmware.h"
 #include "gpk-dbus.h"
 #include "gpk-interface.h"
+#include "gpk-common.h"
 
 /**
  * gpk_object_register:
@@ -154,6 +155,12 @@
 	pk_debug_init (verbose);
 	gtk_init (&argc, &argv);
 
+	/* are we running privileged */
+	ret = gpk_check_privileged_user (_("Update applet"));
+	if (!ret) {
+		return 1;
+	}
+
 	/* add application specific icons to search path */
 	gtk_icon_theme_append_search_path (gtk_icon_theme_get_default (),
                                            PK_DATA G_DIR_SEPARATOR_S "icons");

Modified: trunk/src/gpk-update-viewer.c
==============================================================================
--- trunk/src/gpk-update-viewer.c	(original)
+++ trunk/src/gpk-update-viewer.c	Thu May 22 17:08:24 2008
@@ -34,6 +34,9 @@
 
 #include <polkit-gnome/polkit-gnome.h>
 
+/* local .la */
+#include <libunique.h>
+
 #include <pk-debug.h>
 #include <pk-client.h>
 #include <pk-control.h>
@@ -49,6 +52,7 @@
 #include "gpk-statusbar.h"
 #include "gpk-consolekit.h"
 #include "gpk-cell-renderer-uri.h"
+#include "gpk-animated-icon.h"
 #include "gpk-client.h"
 
 static GladeXML *glade_xml = NULL;
@@ -71,10 +75,7 @@
 /* for the preview throbber */
 static void pk_update_viewer_add_preview_item (const gchar *icon, const gchar *message, gboolean clear);
 static void pk_update_viewer_description_animation_stop (void);
-static int animation_timeout = 0;
-static int frame_counter = 0;
-static int n_frames = 0;
-static GdkPixbuf **frames = NULL;
+static void pk_update_viewer_get_new_update_list (void);
 
 enum {
 	PREVIEW_COLUMN_ICON,
@@ -165,6 +166,7 @@
 pk_update_viewer_update_system_cb (PolKitGnomeAction *action, gpointer data)
 {
 	GtkWidget *widget;
+	gboolean ret;
 
 	pk_debug ("Doing the system update");
 
@@ -172,8 +174,16 @@
 	gtk_widget_hide (widget);
 
 	pk_update_viewer_set_page (PAGE_LAST);
-	gpk_client_update_system (gclient, NULL);
-	pk_update_viewer_set_page (PAGE_CONFIRM);
+	gpk_client_show_progress (gclient, TRUE);
+	ret = gpk_client_update_system (gclient, NULL);
+
+	/* did we succeed updating the system */
+	if (!ret) {
+		/* show the preview page */
+		pk_update_viewer_set_page (PAGE_PREVIEW);
+	} else {
+		pk_update_viewer_set_page (PAGE_CONFIRM);
+	}
 }
 
 /**
@@ -240,6 +250,7 @@
 	/* set correct view */
 	pk_update_viewer_set_page (PAGE_LAST);
 	package_ids = pk_package_ids_from_array (array);
+	gpk_client_show_progress (gclient, TRUE);
 	gpk_client_update_packages (gclient, package_ids, NULL);
 	g_strfreev (package_ids);
 	pk_update_viewer_set_page (PAGE_CONFIRM);
@@ -249,112 +260,30 @@
 }
 
 /**
- * pk_update_viewer_animation_load_frames:
- **/
-static gboolean
-pk_update_viewer_animation_load_frames (void)
-{
-	GtkWidget *widget;
-	GdkPixbuf *pixbuf;
-	gint w, h;
-	gint rows, cols;
-	gint r, c, i;
-
-	if (frames == NULL) {
-		/* get the process-working animation from the icon theme
-		 * and split it into frames.
-		 * FIXME reset frames on theme changes
-		 */
-		widget = glade_xml_get_widget (glade_xml, "window_updates");
-		gtk_icon_size_lookup (GTK_ICON_SIZE_DIALOG, &w, &h);
-		pixbuf = gtk_icon_theme_load_icon (gtk_icon_theme_get_default (),
-						   "process-working",
-						   w, 0, NULL);
-		/* can't load from gnome-icon-theme */
-		if (pixbuf == NULL) {
-			return FALSE;
-		}
-		cols = gdk_pixbuf_get_width (pixbuf) / w;
-		rows = gdk_pixbuf_get_height (pixbuf) / h;
-
-		n_frames = rows * cols;
-		frames = g_new (GdkPixbuf*, n_frames);
-
-		for (i = 0, r = 0; r < rows; r++)
-			for (c = 0; c < cols; c++, i++) {
-			frames[i] = gdk_pixbuf_new_subpixbuf (pixbuf, c * w, r * h, w, h);
-		}
-
-		g_object_unref (pixbuf);
-	}
-	return TRUE;
-}
-
-/**
- * pk_update_viewer_animation_update:
- **/
-static gboolean
-pk_update_viewer_animation_update (gpointer data)
-{
-	GtkTreeModel *model = data;
-	GtkTreeIter iter;
-	gint column;
-
-	column = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (model), "progress-column"));
-
-	/* have we loaded a file */
-	if (frames == NULL) {
-		pk_warning ("no frames to process");
-		return FALSE;
-	}
-
-	gtk_tree_model_get_iter_first (model, &iter);
-	gtk_list_store_set (GTK_LIST_STORE (model), &iter,
-			    column, frames[frame_counter],
-			    -1);
-
-	frame_counter = (frame_counter + 1) % n_frames;
-
-	return TRUE;
-}
-
-/**
  * pk_update_viewer_preview_animation_start:
  **/
 static void
-pk_update_viewer_preview_animation_start (void)
+pk_update_viewer_preview_animation_start (const gchar *text)
 {
 	GtkWidget *widget;
-	GtkCellRenderer *renderer;
-	GtkTreeViewColumn *column;
-	GtkTreeModel *model;
-	GList *list;
-
-	/* don't double queue */
-	if (animation_timeout != 0) {
-		pk_debug ("don't double start");
-		return;
-	}
+	gchar *text_bold;
 
-	pk_update_viewer_animation_load_frames ();
-
-	widget = glade_xml_get_widget (glade_xml, "treeview_preview");
-	column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), 0);
-	list = gtk_tree_view_column_get_cell_renderers (column);
-	renderer = list->data;
-	g_list_free (list);
-	gtk_tree_view_column_clear_attributes (column, renderer);
-	gtk_tree_view_column_set_attributes (column, renderer,
-					     "pixbuf", PREVIEW_COLUMN_PROGRESS, NULL);
+	widget = glade_xml_get_widget (glade_xml, "image_animation_preview");
+	gpk_animated_icon_set_frame_delay (GPK_ANIMATED_ICON (widget), 50);
+	gpk_animated_icon_set_filename_tile (GPK_ANIMATED_ICON (widget), GTK_ICON_SIZE_DIALOG, "process-working");
+	gpk_animated_icon_enable_animation (GPK_ANIMATED_ICON (widget), TRUE);
+	gtk_widget_show (widget);
 
-	model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
-	frame_counter = 0;
+	text_bold = g_strdup_printf ("<b>%s</b>", text);
+	widget = glade_xml_get_widget (glade_xml, "label_animation_preview");
+	gtk_label_set_label (GTK_LABEL (widget), text_bold);
+	g_free (text_bold);
 
-	g_object_set_data (G_OBJECT (model), "progress-column",
-			   GINT_TO_POINTER (PREVIEW_COLUMN_PROGRESS));
+	widget = glade_xml_get_widget (glade_xml, "viewport_animation_preview");
+	gtk_widget_show (widget);
 
-	animation_timeout = g_timeout_add (50, pk_update_viewer_animation_update, model);
-	pk_update_viewer_animation_update (model);
+	widget = glade_xml_get_widget (glade_xml, "scrolledwindow_preview");
+	gtk_widget_hide (widget);
 }
 
 /**
@@ -364,24 +293,18 @@
 pk_update_viewer_preview_animation_stop (void)
 {
 	GtkWidget *widget;
-	GtkCellRenderer *renderer;
-	GtkTreeViewColumn *column;
-	GList *list;
 
-	if (animation_timeout == 0)
-		return;
+	widget = glade_xml_get_widget (glade_xml, "image_animation_preview");
+	gpk_animated_icon_enable_animation (GPK_ANIMATED_ICON (widget), FALSE);
 
-	g_source_remove (animation_timeout);
-	animation_timeout = 0;
+	widget = glade_xml_get_widget (glade_xml, "label_animation_preview");
+	gtk_label_set_label (GTK_LABEL (widget), "");
 
-	widget = glade_xml_get_widget (glade_xml, "treeview_preview");
-	column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), 0);
-	list = gtk_tree_view_column_get_cell_renderers (column);
-	renderer = list->data;
-	g_list_free (list);
-	gtk_tree_view_column_clear_attributes (column, renderer);
-	gtk_tree_view_column_set_attributes (column, renderer,
-					     "icon-name", PREVIEW_COLUMN_ICON, NULL);
+	widget = glade_xml_get_widget (glade_xml, "viewport_animation_preview");
+	gtk_widget_hide (widget);
+
+	widget = glade_xml_get_widget (glade_xml, "scrolledwindow_preview");
+	gtk_widget_show (widget);
 }
 
 /**
@@ -391,46 +314,24 @@
 pk_update_viewer_description_animation_start (void)
 {
 	GtkWidget *widget;
-	GtkTreeViewColumn *column;
-	GList *list, *l;
-	GtkCellRenderer *renderer;
-	GtkTreeIter iter;
-	gchar *text;
+	gchar *text_bold;
 
-	/* don't double queue */
-	if (animation_timeout != 0) {
-		pk_debug ("don't double start");
-		return;
-	}
-
-	gtk_list_store_clear (list_store_description);
-
-	pk_update_viewer_animation_load_frames ();
+	widget = glade_xml_get_widget (glade_xml, "image_animation_description");
+	gpk_animated_icon_set_frame_delay (GPK_ANIMATED_ICON (widget), 50);
+	gpk_animated_icon_set_filename_tile (GPK_ANIMATED_ICON (widget), GTK_ICON_SIZE_DIALOG, "process-working");
+	gpk_animated_icon_enable_animation (GPK_ANIMATED_ICON (widget), TRUE);
+	gtk_widget_show (widget);
 
-	widget = glade_xml_get_widget (glade_xml, "treeview_description");
-	column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), 0);
-	list = gtk_tree_view_column_get_cell_renderers (column);
-	for (l = list; l; l = l->next) {
-		renderer = l->data;
-		if (GTK_IS_CELL_RENDERER_PIXBUF (renderer)) {
-			g_object_set (renderer, "visible", TRUE, NULL);
-		}
-	}
-	g_list_free (list);
+	text_bold = g_strdup_printf ("<b>%s</b>", _("Getting Description..."));
+	widget = glade_xml_get_widget (glade_xml, "label_animation_description");
+	gtk_label_set_label (GTK_LABEL (widget), text_bold);
+	g_free (text_bold);
 
-	text = g_strdup_printf ("<b>%s</b>", _("Getting Description..."));
-	gtk_list_store_append (list_store_description, &iter);
-	gtk_list_store_set (list_store_description, &iter,
-			    DESC_COLUMN_TITLE, text,
-			    -1);
-	g_free (text);
-
-	frame_counter = 0;
+	widget = glade_xml_get_widget (glade_xml, "viewport_animation_description");
+	gtk_widget_show (widget);
 
-	g_object_set_data (G_OBJECT (list_store_description), "progress-column",
-		           GINT_TO_POINTER (DESC_COLUMN_PROGRESS));
-	animation_timeout = g_timeout_add (50, pk_update_viewer_animation_update, list_store_description);
-	pk_update_viewer_animation_update (list_store_description);
+	widget = glade_xml_get_widget (glade_xml, "scrolledwindow_description");
+	gtk_widget_hide (widget);
 }
 
 /**
@@ -440,26 +341,18 @@
 pk_update_viewer_description_animation_stop (void)
 {
 	GtkWidget *widget;
-	GtkTreeViewColumn *column;
-	GList *list, *l;
-	GtkCellRenderer *renderer;
 
-	if (animation_timeout == 0)
-		return;
+	widget = glade_xml_get_widget (glade_xml, "image_animation_description");
+	gpk_animated_icon_enable_animation (GPK_ANIMATED_ICON (widget), FALSE);
 
-	g_source_remove (animation_timeout);
-	animation_timeout = 0;
+	widget = glade_xml_get_widget (glade_xml, "label_animation_description");
+	gtk_label_set_label (GTK_LABEL (widget), "");
 
-	widget = glade_xml_get_widget (glade_xml, "treeview_description");
-	column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), 0);
-	list = gtk_tree_view_column_get_cell_renderers (column);
-	for (l = list; l; l = l->next) {
-		renderer = list->data;
-		if (GTK_IS_CELL_RENDERER_PIXBUF (renderer)) {
-			g_object_set (renderer, "visible", FALSE, NULL);
-		}
-	}
-	g_list_free (list);
+	widget = glade_xml_get_widget (glade_xml, "viewport_animation_description");
+	gtk_widget_hide (widget);
+
+	widget = glade_xml_get_widget (glade_xml, "scrolledwindow_description");
+	gtk_widget_show (widget);
 }
 
 /**
@@ -471,19 +364,17 @@
 	gboolean ret;
 	GError *error = NULL;
 
-	/* we can't click this if we havn't finished */
-	ret = pk_client_reset (client_action, &error);
-	if (!ret) {
-		pk_warning ("failed to reset client: %s", error->message);
-		g_error_free (error);
-		return;
-	}
-	ret = pk_client_refresh_cache (client_action, TRUE, &error);
+	/* refresh the cache */
+	gpk_client_show_progress (gclient, TRUE);
+	polkit_gnome_action_set_sensitive (refresh_action, FALSE);
+	ret = gpk_client_refresh_cache (gclient, &error);
+	polkit_gnome_action_set_sensitive (refresh_action, TRUE);
 	if (ret == FALSE) {
-		gpk_error_dialog (_("Failed to refresh"), _("Method refused"), error->message);
+		pk_warning ("failed: %s", error->message);
 		g_error_free (error);
-		return;
 	}
+	/* get new list */
+	pk_update_viewer_get_new_update_list ();
 }
 
 /**
@@ -497,7 +388,7 @@
 	/* FIXME: do this in process */
 	if (!g_spawn_command_line_async ("gpk-log", &error)) {
 		gpk_error_dialog (_("Failed to launch"), _("The file was not found"), error->message);
-		g_error_free (error);			
+		g_error_free (error);
 	}
 }
 
@@ -553,12 +444,12 @@
  * pk_update_viewer_populate_preview:
  **/
 static void
-pk_update_viewer_populate_preview (void)
+pk_update_viewer_populate_preview (PkPackageList *list)
 {
 	GtkWidget *widget;
 	guint length;
 
-	length = pk_client_package_buffer_get_size (client_query);
+	length = pk_package_list_get_size (list);
 	if (length == 0) {
 		pk_update_viewer_add_preview_item ("dialog-information", _("There are no updates available!"), TRUE);
 		widget = glade_xml_get_widget (glade_xml, "button_close3");
@@ -577,7 +468,7 @@
 		gchar *text;
 
 		for (i=0;i<length;i++) {
-			item = pk_client_package_buffer_get_item (client_query, i);
+			item = pk_package_list_get_item (list, i);
 			if (item->info == PK_INFO_ENUM_LOW) {
 				num_low++;
 			} else if (item->info == PK_INFO_ENUM_IMPORTANT) {
@@ -648,27 +539,60 @@
 static void
 pk_update_viewer_get_new_update_list (void)
 {
-	gboolean ret;
 	GError *error = NULL;
+	PkPackageList *list;
+	PkPackageItem *item;
+	GtkWidget *widget;
+	guint length;
+	guint i;
+	gchar *text;
+	const gchar *icon_name;
+	GtkTreeIter iter;
 
 	/* clear existing list */
 	gtk_list_store_clear (list_store_details);
 
-	/* get the new update list */
-	ret = pk_client_reset (client_query, &error);
-	if (!ret) {
-		pk_warning ("failed to reset client: %s", error->message);
+	gpk_client_show_progress (gclient, FALSE);
+	list = gpk_client_get_updates (gclient, &error);
+	if (list == NULL) {
+		pk_warning ("failed: %s", error->message);
 		g_error_free (error);
-		return;
+		goto out;
 	}
-	ret = pk_client_get_updates (client_query, PK_FILTER_ENUM_NONE, &error);
-	if (!ret) {
-		pk_warning ("failed to get updates: %s", error->message);
-		g_error_free (error);
-		return;
+
+	/* do we have updates? */
+	length = pk_package_list_get_size (list);
+	if (length == 0) {
+		are_updates_available = FALSE;
+	} else {
+		are_updates_available = TRUE;
 	}
 
-	pk_update_viewer_populate_preview ();
+	for (i=0; i<length; i++) {
+		item = pk_package_list_get_item (list, i);
+		text = gpk_package_id_format_twoline (item->package_id, item->summary);
+		icon_name = gpk_info_enum_to_icon_name (item->info);
+		gtk_list_store_append (list_store_details, &iter);
+		gtk_list_store_set (list_store_details, &iter,
+				    PACKAGES_COLUMN_TEXT, text,
+				    PACKAGES_COLUMN_ID, item->package_id,
+				    PACKAGES_COLUMN_ICON, icon_name,
+				    PACKAGES_COLUMN_INFO, item->info,
+				    PACKAGES_COLUMN_SELECT, TRUE,
+				    -1);
+		g_free (text);
+	}
+
+
+	/* make the buttons non-clickable until we get completion */
+	polkit_gnome_action_set_sensitive (update_system_action, are_updates_available);
+	polkit_gnome_action_set_sensitive (update_packages_action, are_updates_available);
+	widget = glade_xml_get_widget (glade_xml, "button_review");
+	gtk_widget_set_sensitive (widget, are_updates_available);
+
+	pk_update_viewer_populate_preview (list);
+out:
+	g_object_unref (list);
 }
 
 /**
@@ -691,29 +615,11 @@
 pk_update_viewer_package_cb (PkClient *client, PkInfoEnum info, const gchar *package_id,
 			     const gchar *summary, gpointer data)
 {
-	GtkTreeIter iter;
-	gchar *text;
 	PkRoleEnum role;
-	const gchar *icon_name;
 
 	pk_client_get_role (client, &role, NULL, NULL);
 	pk_debug ("role = %s, package = %s:%s:%s", pk_role_enum_to_text (role),
 		  pk_info_enum_to_text (info), package_id, summary);
-
-	if (role == PK_ROLE_ENUM_GET_UPDATES) {
-		text = gpk_package_id_format_twoline (package_id, summary);
-		icon_name = gpk_info_enum_to_icon_name (info);
-		gtk_list_store_append (list_store_details, &iter);
-		gtk_list_store_set (list_store_details, &iter,
-				    PACKAGES_COLUMN_TEXT, text,
-				    PACKAGES_COLUMN_ID, package_id,
-				    PACKAGES_COLUMN_ICON, icon_name,
-				    PACKAGES_COLUMN_INFO, info,
-				    PACKAGES_COLUMN_SELECT, TRUE,
-				    -1);
-		g_free (text);
-		return;
-	}
 }
 
 /**
@@ -824,7 +730,7 @@
 
 	package_pretty = gpk_package_id_name_version (package_id);
 	/* translators: this is the package version */
-	pk_update_viewer_add_description_item (_("Version"), package_pretty, NULL);
+	pk_update_viewer_add_description_item (_("Installed"), package_pretty, NULL);
 	g_free (package_pretty);
 
 	if (!pk_strzero (updates)) {
@@ -1164,7 +1070,7 @@
 	gpk_restart_system ();
 }
 
-static void pk_update_viewer_populate_preview (void);
+static void pk_update_viewer_populate_preview (PkPackageList *list);
 
 /**
  * pk_update_viewer_check_blocked_packages:
@@ -1235,7 +1141,6 @@
 	GtkWidget *widget;
 	PkRoleEnum role;
 	PkRestartEnum restart;
-	guint length;
 
 	pk_client_get_role (client, &role, NULL, NULL);
 
@@ -1245,30 +1150,13 @@
 		return;
 	}
 
-	/* update sensitivities */
-	if (role == PK_ROLE_ENUM_GET_UPDATES) {
-	pk_warning ("are_updates_available=%i", are_updates_available);
-		length = pk_client_package_buffer_get_size (client_query);
-		if (length == 0) {
-			are_updates_available = FALSE;
-		} else {
-			are_updates_available = TRUE;
-		}
-
-		/* make the buttons non-clickable until we get completion */
-		polkit_gnome_action_set_sensitive (refresh_action, are_updates_available);
-		polkit_gnome_action_set_sensitive (update_system_action, are_updates_available);
-		polkit_gnome_action_set_sensitive (update_packages_action, are_updates_available);
-		widget = glade_xml_get_widget (glade_xml, "button_review");
-		gtk_widget_set_sensitive (widget, are_updates_available);
-	}
-
 	/* stop the throbber */
 	pk_update_viewer_preview_animation_stop ();
 
 	/* check if we need to display infomation about blocked packages */
 	if (role == PK_ROLE_ENUM_UPDATE_SYSTEM ||
 	    role == PK_ROLE_ENUM_UPDATE_PACKAGES) {
+		//TODO: this has to be moved to GpkClient
 		pk_update_viewer_check_blocked_packages (client);
 	}
 
@@ -1299,7 +1187,7 @@
 		}
 	}
 
-	pk_update_viewer_populate_preview ();
+//	pk_update_viewer_populate_preview (list);
 }
 
 static void
@@ -1334,18 +1222,14 @@
 {
 	GtkWidget *widget;
 
-	/* put a message in the listbox */
-	pk_update_viewer_add_preview_item ("dialog-information", text, TRUE);
-
 	/* hide apply, review and refresh */
 	polkit_gnome_action_set_sensitive (update_system_action, FALSE);
 	polkit_gnome_action_set_sensitive (update_packages_action, FALSE);
-	polkit_gnome_action_set_sensitive (refresh_action, FALSE);
 	widget = glade_xml_get_widget (glade_xml, "button_review");
 	gtk_widget_set_sensitive (widget, FALSE);
 
 	/* start the spinning preview */
-	pk_update_viewer_preview_animation_start ();
+	pk_update_viewer_preview_animation_start (text);
 }
 
 /**
@@ -1373,7 +1257,6 @@
 		/* show apply, review and refresh */
 		polkit_gnome_action_set_sensitive (update_system_action, are_updates_available);
 		polkit_gnome_action_set_sensitive (update_packages_action, are_updates_available);
-		polkit_gnome_action_set_sensitive (refresh_action, are_updates_available);
 		widget = glade_xml_get_widget (glade_xml, "button_review");
 		gtk_widget_set_sensitive (widget, are_updates_available);
 	}
@@ -1588,8 +1471,8 @@
 	if (role == PK_ROLE_ENUM_UPDATE_SYSTEM ||
 	    role == PK_ROLE_ENUM_UPDATE_PACKAGES ||
 	    role == PK_ROLE_ENUM_REFRESH_CACHE) {
-		pk_warning ("getting new");
-		pk_update_viewer_get_new_update_list ();
+		pk_debug ("getting new");
+		//pk_update_viewer_get_new_update_list ();
 	}
 }
 
@@ -1613,6 +1496,12 @@
 	if (pk_strequal (name, "button_update_packages")) {
 		return polkit_gnome_action_create_button (update_packages_action);
 	}
+	if (pk_strequal (name, "image_animation_preview")) {
+		return gpk_animated_icon_new ();
+	}
+	if (pk_strequal (name, "image_animation_description")) {
+		return gpk_animated_icon_new ();
+	}
 	pk_warning ("name unknown=%s", name);
 	return NULL;
 }
@@ -1681,6 +1570,17 @@
 }
 
 /**
+ * gpk_update_viewer_activated_cb
+ **/
+static void
+gpk_update_viewer_activated_cb (LibUnique *libunique, gpointer data)
+{
+	GtkWidget *widget;
+	widget = glade_xml_get_widget (glade_xml, "window_updates");
+	gtk_window_present (GTK_WINDOW (widget));
+}
+
+/**
  * main:
  **/
 int
@@ -1696,6 +1596,7 @@
 	gboolean ret;
 	GtkSizeGroup *size_group;
 	GError *error = NULL;
+	LibUnique *libunique;
 
 	const GOptionEntry options[] = {
 		{ "verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose,
@@ -1735,12 +1636,18 @@
 	gtk_icon_theme_append_search_path (gtk_icon_theme_get_default (),
 					   PK_DATA G_DIR_SEPARATOR_S "icons");
 
+	/* are we already activated? */
+	libunique = libunique_new ();
+	ret = libunique_assign (libunique, "org.freedesktop.PackageKit.UpdateViewer");
+	if (!ret) {
+		goto unique_out;
+	}
+	g_signal_connect (libunique, "activated",
+			  G_CALLBACK (gpk_update_viewer_activated_cb), NULL);
+
 	/* we have to do this before we connect up the glade file */
 	gpk_update_viewer_setup_policykit ();
 
-	/* use custom widgets */
-	glade_set_custom_handler (gpk_update_viewer_create_custom_widget, NULL);
-
 	control = pk_control_new ();
 	g_signal_connect (control, "repo-list-changed",
 			  G_CALLBACK (pk_update_viewer_repo_list_changed_cb), NULL);
@@ -1784,6 +1691,9 @@
 	gclient = gpk_client_new ();
 	gpk_client_show_finished (gclient, FALSE);
 
+	/* use custom widgets */
+	glade_set_custom_handler (gpk_update_viewer_create_custom_widget, NULL);
+
 	glade_xml = glade_xml_new (PK_DATA "/gpk-update-viewer.glade", NULL, NULL);
 	main_window = glade_xml_get_widget (glade_xml, "window_updates");
 
@@ -1903,7 +1813,6 @@
 	gtk_tree_view_columns_autosize (GTK_TREE_VIEW (widget));
 
 	/* make the buttons non-clickable until we get completion */
-	polkit_gnome_action_set_sensitive (refresh_action, FALSE);
 	polkit_gnome_action_set_sensitive (update_system_action, FALSE);
 	polkit_gnome_action_set_sensitive (update_packages_action, FALSE);
 	widget = glade_xml_get_widget (glade_xml, "button_review");
@@ -1945,6 +1854,8 @@
 	g_object_unref (client_query);
 	g_object_unref (client_action);
 	g_free (cached_package_id);
+unique_out:
+	g_object_unref (libunique);
 
 	return 0;
 }

Modified: trunk/src/gpk-watch.c
==============================================================================
--- trunk/src/gpk-watch.c	(original)
+++ trunk/src/gpk-watch.c	Thu May 22 17:08:24 2008
@@ -61,6 +61,9 @@
 
 #define GPK_WATCH_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GPK_TYPE_WATCH, GpkWatchPrivate))
 #define GPK_WATCH_MAXIMUM_TOOLTIP_LINES		10
+#define GPK_WATCH_GCONF_PROXY_HTTP 		"/system/http_proxy"
+#define GPK_WATCH_GCONF_PROXY_FTP 		"/system/proxy"
+#define GPK_WATCH_SET_PROXY_RATE_LIMIT		200 /* ms */
 
 struct GpkWatchPrivate
 {
@@ -73,6 +76,7 @@
 	GConfClient		*gconf_client;
 	gboolean		 show_refresh_in_menu;
 	PolKitGnomeAction	*restart_action;
+	guint			 set_proxy_timeout;
 };
 
 G_DEFINE_TYPE (GpkWatch, gpk_watch, G_TYPE_OBJECT)
@@ -849,6 +853,184 @@
 }
 
 /**
+ * gpk_watch_get_proxy_ftp:
+ * Return value: server.lan:8080
+ **/
+static gchar *
+gpk_watch_get_proxy_ftp (GpkWatch *watch)
+{
+	gchar *mode = NULL;
+	gchar *connection = NULL;
+	gchar *host = NULL;
+	gint port;
+
+	g_return_val_if_fail (GPK_IS_WATCH (watch), NULL);
+
+	/* common case, a direct connection */
+	mode = gconf_client_get_string (watch->priv->gconf_client, "/system/proxy/mode", NULL);
+	if (pk_strequal (mode, "none")) {
+		pk_debug ("not using session proxy");
+		goto out;
+	}
+
+	host = gconf_client_get_string (watch->priv->gconf_client, "/system/proxy/ftp_host", NULL);
+	if (pk_strzero (host)) {
+		pk_debug ("no hostname for ftp proxy");
+		goto out;
+	}
+	port = gconf_client_get_int (watch->priv->gconf_client, "/system/proxy/ftp_port", NULL);
+
+	/* ftp has no username or password */
+	if (port == 0) {
+		connection = g_strdup (host);
+	} else {
+		connection = g_strdup_printf ("%s:%i", host, port);
+	}
+out:
+	g_free (mode);
+	g_free (host);
+	return connection;
+}
+
+/**
+ * gpk_watch_get_proxy_ftp:
+ * Return value: username:password server lan:8080
+ **/
+gchar *
+gpk_watch_get_proxy_http (GpkWatch *watch)
+{
+	gchar *mode = NULL;
+	gchar *host = NULL;
+	gchar *auth = NULL;
+	gchar *connection = NULL;
+	gchar *proxy_http = NULL;
+	gint port;
+	gboolean ret;
+
+	g_return_val_if_fail (GPK_IS_WATCH (watch), NULL);
+
+	/* common case, a direct connection */
+	mode = gconf_client_get_string (watch->priv->gconf_client, "/system/proxy/mode", NULL);
+	if (pk_strequal (mode, "none")) {
+		pk_debug ("not using session proxy");
+		goto out;
+	}
+
+	/* do we use this? */
+	ret = gconf_client_get_bool (watch->priv->gconf_client, "/system/http_proxy/use_http_proxy", NULL);
+	if (!ret) {
+		pk_debug ("not using http proxy");
+		goto out;
+	}
+
+	/* http has 4 parameters */
+	host = gconf_client_get_string (watch->priv->gconf_client, "/system/http_proxy/host", NULL);
+	if (pk_strzero (host)) {
+		pk_debug ("no hostname for http proxy");
+		goto out;
+	}
+
+	/* user and password are both optional */
+	ret = gconf_client_get_bool (watch->priv->gconf_client, "/system/http_proxy/use_authentication", NULL);
+	if (ret) {
+		gchar *user = NULL;
+		gchar *password = NULL;
+
+		user = gconf_client_get_string (watch->priv->gconf_client, "/system/http_proxy/authentication_user", NULL);
+		password = gconf_client_get_string (watch->priv->gconf_client, "/system/http_proxy/authentication_password", NULL);
+
+		if (user != NULL && password != NULL) {
+			auth = g_strdup_printf ("%s:%s", user, password);
+		} else if (user != NULL) {
+			auth = g_strdup (user);
+		} else if (password != NULL) {
+			auth = g_strdup_printf (":%s", user);
+		}
+
+		g_free (user);
+		g_free (password);
+	}
+
+	/* port is optional too */
+	port = gconf_client_get_int (watch->priv->gconf_client, "/system/http_proxy/port", NULL);
+	if (port == 0) {
+		connection = g_strdup (host);
+	} else {
+		connection = g_strdup_printf ("%s:%i", host, port);
+	}
+
+	/* the whole auth section is optional */
+	if (pk_strzero (auth)) {
+		proxy_http = g_strdup (connection);
+	} else {
+		proxy_http = g_strdup_printf ("%s %s", auth, connection);
+	}
+out:
+	g_free (mode);
+	g_free (connection);
+	g_free (auth);
+	g_free (host);
+	return proxy_http;
+}
+
+/**
+ * gpk_watch_set_proxies_ratelimit:
+ **/
+static gboolean
+gpk_watch_set_proxies_ratelimit (GpkWatch *watch)
+{
+	gchar *proxy_http;
+	gchar *proxy_ftp;
+	gboolean ret;
+
+	g_return_val_if_fail (GPK_IS_WATCH (watch), FALSE);
+
+	proxy_http = gpk_watch_get_proxy_http (watch);
+	proxy_ftp = gpk_watch_get_proxy_ftp (watch);
+
+	pk_debug ("set proxy_http=%s, proxy_ftp=%s", proxy_http, proxy_ftp);
+	ret = pk_control_set_proxy (watch->priv->control, proxy_http, proxy_ftp);
+	if (!ret) {
+		pk_warning ("setting proxy failed");
+	}
+
+	g_free (proxy_http);
+	g_free (proxy_ftp);
+
+	/* we can run again */
+	watch->priv->set_proxy_timeout = 0;
+	return FALSE;
+}
+
+/**
+ * gpk_watch_set_proxies:
+ **/
+static gboolean
+gpk_watch_set_proxies (GpkWatch *watch)
+{
+	if (watch->priv->set_proxy_timeout != 0) {
+		pk_debug ("already scheduled");
+		return FALSE;
+	}
+	watch->priv->set_proxy_timeout = g_timeout_add (GPK_WATCH_SET_PROXY_RATE_LIMIT,
+							(GSourceFunc) gpk_watch_set_proxies_ratelimit, watch);
+	return TRUE;
+}
+
+/**
+ * gpk_watch_gconf_key_changed_cb:
+ *
+ * We might have to do things when the gconf keys change; do them here.
+ **/
+static void
+gpk_watch_gconf_key_changed_cb (GConfClient *client, guint cnxn_id, GConfEntry *entry, GpkWatch *watch)
+{
+	pk_debug ("keys have changed");
+	/* set the proxy */
+	gpk_watch_set_proxies (watch);
+}
+
+/**
  * gpk_watch_init:
  * @watch: This class instance
  **/
@@ -865,6 +1047,7 @@
 	watch->priv->gconf_client = gconf_client_get_default ();
 	watch->priv->sicon = gpk_smart_icon_new ();
 	watch->priv->sicon_restart = gpk_smart_icon_new ();
+	watch->priv->set_proxy_timeout = 0;
 
 	/* we need to get ::locked */
 	watch->priv->control = pk_control_new ();
@@ -922,6 +1105,19 @@
 	g_signal_connect (restart_action, "activate",
 			  G_CALLBACK (gpk_watch_restart_cb), NULL);
 	watch->priv->restart_action = restart_action;
+
+	/* watch proxy keys */
+	gconf_client_add_dir (watch->priv->gconf_client, GPK_WATCH_GCONF_PROXY_HTTP,
+			      GCONF_CLIENT_PRELOAD_NONE, NULL);
+	gconf_client_add_dir (watch->priv->gconf_client, GPK_WATCH_GCONF_PROXY_FTP,
+			      GCONF_CLIENT_PRELOAD_NONE, NULL);
+	gconf_client_notify_add (watch->priv->gconf_client, GPK_WATCH_GCONF_PROXY_HTTP,
+				 (GConfClientNotifyFunc) gpk_watch_gconf_key_changed_cb, watch, NULL, NULL);
+	gconf_client_notify_add (watch->priv->gconf_client, GPK_WATCH_GCONF_PROXY_FTP,
+				 (GConfClientNotifyFunc) gpk_watch_gconf_key_changed_cb, watch, NULL, NULL);
+
+	/* set the proxy */
+	gpk_watch_set_proxies (watch);
 }
 
 /**
@@ -938,6 +1134,12 @@
 	watch = GPK_WATCH (object);
 
 	g_return_if_fail (watch->priv != NULL);
+
+	/* we might we waiting for a proxy update */
+	if (watch->priv->set_proxy_timeout != 0) {
+		g_source_remove (watch->priv->set_proxy_timeout);
+	}
+
 	g_object_unref (watch->priv->sicon);
 	g_object_unref (watch->priv->inhibit);
 	g_object_unref (watch->priv->tlist);



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