diff -pruN 1.5.1-1/autogen.sh 1.8.4-1/autogen.sh
--- 1.5.1-1/autogen.sh	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/autogen.sh	2010-02-17 17:26:44.000000000 +0000
@@ -1,22 +1,3 @@
-#!/bin/bash
-# Run this to generate all the initial makefiles, etc.
-
-srcdir=`dirname $0`
-test -z "$srcdir" && srcdir=.
-
-PKG_NAME="hornsey"
-REQUIRED_AUTOMAKE_VERSION=1.10
-
-(test -f $srcdir/configure.ac \
-  && test -d $srcdir/src) || {
-    echo -n "**Error**: Directory "\`$srcdir\'" does not look like the"
-    echo " top-level mutter-moblin directory"
-    exit 1
-}
-
-which gnome-autogen.sh || {
-    echo "You need to install gnome-common from GNOME Subversion (or from"
-    echo "your distribution's package manager)."
-    exit 1
-}
-USE_GNOME2_MACROS=1 USE_COMMON_DOC_BUILD=yes . gnome-autogen.sh
+#!/bin/sh
+intltoolize --copy --force --automake 
+autoreconf -v -i && ./configure $@
diff -pruN 1.5.1-1/autotools/as-compiler-flag.m4 1.8.4-1/autotools/as-compiler-flag.m4
--- 1.5.1-1/autotools/as-compiler-flag.m4	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/autotools/as-compiler-flag.m4	2010-02-17 17:26:44.000000000 +0000
@@ -0,0 +1,62 @@
+dnl as-compiler-flag.m4 0.1.0
+
+dnl autostars m4 macro for detection of compiler flags
+
+dnl David Schleef <ds@schleef.org>
+
+dnl $Id: as-compiler-flag.m4,v 1.1 2005/12/15 23:35:19 ds Exp $
+
+dnl AS_COMPILER_FLAG(CFLAGS, ACTION-IF-ACCEPTED, [ACTION-IF-NOT-ACCEPTED])
+dnl Tries to compile with the given CFLAGS.
+dnl Runs ACTION-IF-ACCEPTED if the compiler can compile with the flags,
+dnl and ACTION-IF-NOT-ACCEPTED otherwise.
+
+AC_DEFUN([AS_COMPILER_FLAG],
+[
+  AC_MSG_CHECKING([to see if compiler understands $1])
+
+  save_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS $1"
+
+  AC_TRY_COMPILE([ ], [], [flag_ok=yes], [flag_ok=no])
+  CFLAGS="$save_CFLAGS"
+
+  if test "X$flag_ok" = Xyes ; then
+    m4_ifvaln([$2],[$2])
+    true
+  else
+    m4_ifvaln([$3],[$3])
+    true
+  fi
+  AC_MSG_RESULT([$flag_ok])
+])
+
+dnl AS_COMPILER_FLAGS(VAR, FLAGS)
+dnl Tries to compile with the given CFLAGS.
+
+AC_DEFUN([AS_COMPILER_FLAGS],
+[
+  list=$2
+  flags_supported=""
+  flags_unsupported=""
+  AC_MSG_CHECKING([for supported compiler flags])
+  for each in $list
+  do
+    save_CFLAGS="$CFLAGS"
+    CFLAGS="$CFLAGS $each"
+    AC_TRY_COMPILE([ ], [], [flag_ok=yes], [flag_ok=no])
+    CFLAGS="$save_CFLAGS"
+
+    if test "X$flag_ok" = Xyes ; then
+      flags_supported="$flags_supported $each"
+    else
+      flags_unsupported="$flags_unsupported $each"
+    fi
+  done
+  AC_MSG_RESULT([$flags_supported])
+  if test "X$flags_unsupported" != X ; then
+    AC_MSG_WARN([unsupported compiler flags: $flags_unsupported])
+  fi
+  $1="$$1 $flags_supported"
+])
+
diff -pruN 1.5.1-1/configure.ac 1.8.4-1/configure.ac
--- 1.5.1-1/configure.ac	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/configure.ac	2011-03-15 13:20:21.000000000 +0000
@@ -1,10 +1,16 @@
+m4_define([hrn_version_major], [1])
+m4_define([hrn_version_minor], [8])
+m4_define([hrn_version_micro], [4])
+
+m4_define([hrn_version],
+          [hrn_version_major.hrn_version_minor.hrn_version_micro])
+
 AC_PREREQ(2.53)
-AC_INIT(hornsey, 1.5.1, [The moblin media player])
-AM_INIT_AUTOMAKE()
+AC_INIT(hornsey, [hrn_version], [The moblin media player])
+AM_INIT_AUTOMAKE([foreign no-define -Wno-portability])
 AC_CONFIG_MACRO_DIR([autotools])
 AC_CONFIG_SRCDIR(src/hornsey.c)
 AM_CONFIG_HEADER(config.h)
-AM_MAINTAINER_MODE
 
 GETTEXT_PACKAGE=hornsey
 AC_SUBST(GETTEXT_PACKAGE)
@@ -19,20 +25,22 @@ AC_ISC_POSIX
 AC_PROG_CC
 AC_STDC_HEADERS
 
-DEPS_PACKAGES="clutter-1.0 clutter-imcontext-0.1 clutter-gtk-0.10 bickley-0.4 nbtk-1.2 bognor-regis-0.5 >= 0.5.2 unique-1.0 >= 1.0.6 libstartup-notification-1.0 >= 0.9 libnotify xtst gtk+-2.0"
+DEPS_PACKAGES="clutter-1.0 clutter-imcontext-0.1 clutter-gtk-0.10 mx-1.0 bognor-regis-0.6 >= 0.6.0 unique-1.0 >= 1.0.6 libstartup-notification-1.0 >= 0.9 libnotify xtst gtk+-2.0 tracker-client-0.8"
 AC_PATH_PROG(GLIB_GENMARSHAL, glib-genmarshal)
 
-if test "x$GCC" = "xyes"; then
-        GCC_FLAGS="-g -Wall"
-fi
-
-AC_SUBST(GCC_FLAGS)
-
 SHAVE_INIT([autotools], [enable])
 
+AC_PATH_PROG(DBUSBINDINGTOOL, dbus-binding-tool)
 DBUS_SERVICES_DIR="${datadir}/dbus-1/services"
 AC_SUBST(DBUS_SERVICES_DIR)
 
+dnl === Some compiler flags === ===============================================
+
+AS_COMPILER_FLAGS([HRN_CFLAGS], ["-Wall"])
+AC_SUBST([HRN_CFLAGS])
+
+dnl === Helix/GStreamer support ===============================================
+
 AC_ARG_ENABLE(helix, AC_HELP_STRING([--enable-helix],[Use Helix as meida frameword]), use_helix="yes", use_helix="no")
 if test "x$use_helix" = "xyes"; then
   echo "xx:$DEPS_PACKAGES"
@@ -46,13 +54,43 @@ fi
 AC_SUBST(DEPS_CFLAGS)
 AC_SUBST(DEPS_LIBS)
 
+dnl === Enable debug level ====================================================
+
+m4_define([debug_default], [yes])
+AC_ARG_ENABLE([debug],
+              [AC_HELP_STRING([--enable-debug=@<:@no/minimum/yes@:>@],
+                              [Control Hornsey debugging level @<:@default=debug_default@:>@])],
+              [],
+              [enable_debug=debug_default])
+
+AS_CASE([$enable_debug],
+
+        [yes],
+        [
+          test "$cflags_set" = set || CFLAGS="$CFLAGS -g"
+          HRN_DEBUG_CFLAGS="-DHRN_ENABLE_DEBUG"
+        ],
+
+        [minimum],
+        [HRN_DEBUG_CFLAGS="-DHRN_ENABLE_DEBUG -DG_DISABLE_CAST_CHECKS"],
 
+        [no],
+        [HRN_DEBUG_CFLAGS="-DG_DISABLE_ASSERT -DG_DISABLE_CHECKS -DG_DISABLE_CAST_CHECKS"],
+
+        [AC_MSG_ERROR([Unknown argument for --enable-debug])]
+)
+
+AC_SUBST(HRN_DEBUG_CFLAGS)
+
+dnl === Enable window mode ====================================================
 
 AC_ARG_ENABLE(windowmode, AC_HELP_STRING([--enable-windowmode],[Enable window mode to not have hornsey fullscreen]), enable_windowmode="$enableval", enable_windowmode=no)
 if test "x$enable_windowmode" = "xyes"; then
   AC_DEFINE(HAVE_WINDOWMODE,1,[Define if we want window mode])
 fi
 
+dnl === i18n =================================================================
+
 IT_PROG_INTLTOOL([0.35.0])
 AS_ALL_LINGUAS
 
@@ -64,3 +102,24 @@ src/Makefile
 data/Makefile
 po/Makefile.in
 ])
+
+echo ""
+echo "                    Hornsey $VERSION"
+echo "                 ==================="
+echo ""
+echo "                   prefix:   ${prefix}"
+echo "           Compiler flags:   ${HRN_CFLAGS}"
+echo ""
+if test "x$use_helix" = "xyes"; then
+echo "            Video backend:   Helix"
+else
+echo "            Video backend:   GStreamer"
+fi
+if test "x$enable_windowmode" = "xyes"; then
+echo "         Start fullscreen:   no"
+else
+echo "         Start fullscreen:   yes"
+fi
+echo ""
+echo "                    Debug:   ${enable_debug}"
+echo ""
diff -pruN 1.5.1-1/data/hornsey.css 1.8.4-1/data/hornsey.css
--- 1.5.1-1/data/hornsey.css	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/data/hornsey.css	2010-02-17 17:26:44.000000000 +0000
@@ -1,145 +1,74 @@
-/* generic classes, the top bits of styling here should be inherited
- * from a system wide CSS
- */
-
-NbtkButton, NbtkButton:active, NbtkButton:hover, NbtkButton:checked {
- border-image: none;
-}
-
-NbtkScrollBar {
-    background-color: #e7ebee;
-    padding: 0;
-}
-
-NbtkScrollBar > *#backward-stepper {
-    border-image: url("file://nbtk-scrollbar-backward-stepper.png") 2 4 2 2 stretch stretch;
-}
-
-NbtkScrollBar > *#backward-stepper:hover {
-    border-image: url("file://nbtk-scrollbar-backward-stepper-hover.png") 2 4 2 2 stretch stretch;
-}
-
-NbtkScrollBar > *#forward-stepper {
-    border-image: url("file://nbtk-scrollbar-forward-stepper.png") 2 4 2 2 stretch stretch;
-}
-
-NbtkScrollBar > *#forward-stepper:hover {
-    border-image: url("file://nbtk-scrollbar-forward-stepper-hover.png") 2 4 2 2 stretch stretch;
-}
-
-NbtkScrollBar *#handle {
-    border-image: url("file://nbtk-scrollbar-handle.png") 2 4 2 2 stretch stretch;
-}
-
-NbtkScrollBar *#handle:hover {
-    border-image: url("file://nbtk-scrollbar-handle-hover.png") 2 4 2 2 stretch stretch;
-}
-
-NbtkScrollBar *#handle:active {
-    border-image: url("file://nbtk-scrollbar-handle-active.png") 2 4 2 2 stretch stretch;
-}
-
-NbtkScrollView {
-    xthickness: 22;
-    ythickness: 22;
-}
-
-NbtkLabel, NbtkIMLabel
-{
-    font-family: "Droid Sans";
-    font-size: 14px;
-    font-weight: bold;
-    color: black;
-}
-
-/**  hornsey specific **/
-
-*.HrnPopup
-{
-    border-image: url("file://hrn-popup.png") 20 20 20 20 stretch;
-    padding: 22;
+HrnQueueItem {
+    padding: 5px;
 }
 
-NbtkButton {
-  border-image: none;
-}
-
-
-*.HrnPopup NbtkButton {
-    color: #666666;
-    font-family: "Droid Sans";
-    background: white;
-    padding: 4px;
-    font-size: 16px;
-}
-
-*.HrnPopup NbtkButton:hover {
-    color: black;
-    background: #bbbbbb;
-}
-
-*.HrnQueueItemLabel
+MxLabel#hrn-queue-item-primary
 {
     color: #4c4c4c;
     font-size: 12px;
 }
 
-*.HrnQueueItemMetaLabel
+MxLabel#hrn-queue-item-secondary
 {
     color: #7e7e7e;
     font-size: 11px;
 }
 
-*.HrnQueueItemMetaLabel:hover
+MxLabel#hrn-queue-item-secondary:hover
 {
     color: red;
     font-size: 12px;
 }
 
-*.HrnTileablePrimary
+MxLabel#hrn-tileable-primary
 {
     color: #3b3b3b;
     font-size: 13px;
 }
 
-*.HrnTileablePrimary:hover
+MxLabel#hrn-tileable-primary:hover
 {
     color: #7b7b7b;
     text-decoration: underline;
 }
 
-*.HrnTileableSecondary
+MxLabel#hrn-tileable-secondary
 {
     color: gray;
     font-size: 12px;
 }
 
-*.HrnTileableSecondary:hover
+MxLabel#hrn-tileable-secondary:hover
 {
     color: #7b7b7b;
     text-decoration: underline;
 }
 
-*.HrnItemTitle2
+HrnItemTitle2
 {
     color: #3b3b3b;
     font-size: 13px;
 }
 
-*.HrnItemMeta2
+HrnItemMeta2
 {
     color: gray;
     font-size: 12px;
 }
 
 
-*.HrnSidebarItem
+HrnSidebar
+{
+        background-color: #dee2e5;
+}
+
+HrnSidebarItem
 {
-  padding-bottom: 14px;
-  padding-left: 5px;
+/*  padding-bottom: 14px;
+  padding-left: 5px;*/
 }
 
-*.HrnSidebarItemTitle 
+HrnSidebarItem *#hrn-sidebar-item-title
 {
     color: #4e555d;
     font-size: 18px;
@@ -147,487 +76,281 @@ NbtkButton {
     border-image: none;
 }
 
-*.HrnSidebarSubItem
+HrnSidebarSubitem
 {
-    padding-left: 5px;
+    border-image: none;
+    padding: 4 0 4 5;
 }
 
-*.HrnSidebarSubItem NbtkLabel,
-*.HrnSidebarSubItem NbtkIMLabel
+HrnSidebarSubitem:active
+{
+    border-image:none;
+}
+
+HrnSidebarSubitem MxLabel,
+HrnSidebarSubitem MxIMLabel
 {
     color: #333;
     font-size: 14px;
-    padding-left: 5px;
+/*    padding-left: 5px;*/
 }
 
 
-*.HrnSidebarSubItem:hover
+HrnSidebarSubitem:hover
 {
-    border-image: url("file://mediatype-rollover.png") 0; 
+    border-image: url("mediatype-rollover.png") 0;
 }
 
-*.HrnSidebarSubItem:checked
+HrnSidebarSubitem:checked
 {
-    border-image: url("file://mediatype-selected.png") 0;
+    border-image: url("mediatype-selected.png") 0;
 }
 
-*.HrnClusterTitle
+HrnClusterTitle
 {
     color: #3b3b3b;
     font-size: 13px;
 }
 
-*.HrnClusterMeta
+HrnClusterMeta
 {
     color: #7e7e7e;
     font-size: 12px;
 }
 
 
-*.HrnClusterGroupedTitle
+HrnClusterGroupedTitle
 {
     color: #3b3b3b;
     font-size: 16px;
 }
 
-*.HrnClusterGroupedMeta
+HrnClusterGroupedMeta
 {
     color: #7e7e7e;
     font-size: 12px;
 }
 
 
-*.HrnItemMeta2:hover, *.HrnItemMeta:hover, *.HrnItemTitle:hover, *.HrnItemTitle2:hover
+HrnItemMeta2:hover, HrnItemMeta:hover, HrnItemTitle:hover, HrnItemTitle2:hover
 {
          color: red;
 }
 
-*.HrnItemFrame
+HrnItemFrame
 {
-    border-image: url("file://nbtk-button.png") 4 stretch;
+    border-image: url("nbtk-button.png") 4;
     padding: 0;
 }
 
-*.HrnItemFrame:hover
+HrnItemFrame:hover
 {
-    border-image: url("file://nbtk-button-hover.png") 4 stretch;
+    border-image: url("nbtk-button-hover.png") 4;
     padding: 0;
 }
 
 
-*.HrnQueueView
+HrnQueue MxScrollView
 {
-    border-image: url("file://hrn-queue-bg.png") 0 stretch;
+    border-image: url("hrn-queue-bg.png") 0 0 0 1;
 }
 
-*.HrnQueueHeader
+HrnQueueHeader
 {
-    background-image: url("file://hrn-queue-header.png");
-    padding: 8 0 8 6;
+    border-image: url("hrn-queue-header.png") 1;
+    padding: 6;
 }
 
-NbtkLabel#hrn-queue-header-label
+HrnQueueControls
+{
+    border-image: url("hrn-queue-controls-bg.png") 1;
+    padding: 10px;
+}
+
+MxLabel#hrn-queue-header-label
 {
     color: white;
     font-size: 12px;
 }
 
-NbtkLabel#hrn-queue-header-meta-label
+MxLabel#hrn-queue-header-meta-label
 {
     color: #d8d8d8;
     font-size: 11px;
 }
 
 
-*.HrnPlayPause
-{
-    background-image: url("file://hrn-queue-play.png");
-}
-
-*.HrnPlayPause:active
-{
-    background-image: url("file://hrn-queue-pause.png");
-}
-
-*.HrnPlayPause:checked
-{
-    background-image: url("file://hrn-queue-pause.png");
-}
-
-*.HrnPlayPause:hover
-{
-    background-image: url("file://hrn-queue-play-hover.png");
-}
 
 
-NbtkButton.HrnQueueExpandedUp
+MxButton#hrn-queue-expanded-up
 {
-    background-image: url("file://hrn-expander-up.png");
+    border-image: none;
+    background-image: url("hrn-expander-up.png");
     padding: 33 33 0 0;
 }
 
-NbtkButton.HrnQueueExpandedUp:hover
+MxButton#hrn-queue-expanded-up:hover
 {
-    background-image: url("file://hrn-expander-up-hover.png");
+    border-image: none;
+    background-image: url("hrn-expander-up-hover.png");
 }
 
-NbtkButton.HrnQueueExpandedDown
+MxButton#hrn-queue-expanded-down
 {
-    background-image: url("file://hrn-expander-down.png");
+    border-image: none;
+    background-image: url("hrn-expander-down.png");
     padding: 33 33 0 0;
 }
 
-NbtkButton.HrnQueueExpandedDown:hover
-{
-    background-image: url("file://hrn-expander-down-hover.png");
-}
-
-
-*.HrnSidebar,
-    *#HrnSidebar
-    {
-        background-color: #dee2e5;
-}
-
-*.HrnSidebarExpanded
-{
-    background-image: url("file://hrn-expander-right.png") 0;
-}
-
-
-*.HrnSidebarExpanded:checked
-{
-    background-image: url("file://hrn-expander-left.png") 0;
-}
-
-*.HrnSidebarExpanded:active
+MxButton#hrn-queue-expanded-down:hover
 {
-    /*background-image: url("file://hrn-expander-right-active.png") 0;*/
+    border-image: none;
+    background-image: url("hrn-expander-down-hover.png");
 }
 
-*.HrnSidebarExpanded:hover
-{
-    /*background-image: url("file://hrn-expander-right-hover.png") 0;*/
-}
 
 
-*.HrnQueueHighlight {
-    border-image: url("file://hrn-queue-highlight.png") 0;
+HrnQueueHighlight {
+    border-image: url("hrn-queue-highlight.png") 0;
 }
 
 
-NbtkLabel, NbtkIMLabel {
-    font-size: 13;
-}
-
-NbtkEntry {
+MxEntry {
     font-size: 14;
 }
 
-*#toolbar {
-    background-color: #333333;
-    padding-left: 200px;
-    padding-right: 6px;
-}
-
-*#toolbar NbtkButton {
-    color: #bbbbbb;
-    font-family: "Droid Sans";
-    border-image: url('file://hrn-button-toolbar.png') 3 1 3 1;
-    font-size: 13px;
-    padding : 0;
-}
-
-*#toolbar NbtkButton:hover {
-    color: white;
-    border-image: url('file://hrn-button-toolbar-hover.png') 3 1 3 1;
-}
-
-HrnThumbBarButton:hover {
-    color: white;
-    border-image: url('file://hrn-button-toolbar-hover.png') 3 1 3 1;
-}
-
-HrnThumbBarButton {
-    color: #bbbbbb;
-    font-family: "Droid Sans";
-    border-image: url('file://hrn-button-toolbar.png') 3 1 3 1;
-    font-size: 13px;
-}
-
-
-
-HrnThumbBarButton#neighbour
+#icon-audio
 {
-    border-image: url('file://hrn-item-frame.png') 6 7 9 9;
-    padding: 6 8 8 6;
+    background-image: url('hrn-icon-audio.png');
 }
 
-HrnThumbBarButton#neighbour:hover
+#icon-video
 {
-    border-image: url('file://hrn-item-selected-hover.png') 6 7 9 9;
-    padding: 6 8 8 6;
+    background-image: url('hrn-icon-video.png');
 }
 
-HrnThumbBarButton#current
+#icon-images
 {
-    border-image: url('file://hrn-item-selected.png') 6 7 9 9;
-    padding: 6 8 8 6;
-}
-
-
-*#toolbar NbtkButton:hover {
-    color: white;
+    background-image: url('hrn-icon-images.png');
 }
 
-*#icon-audio
+#icon-all
 {
-    background-image: url('file://hrn-icon-audio.png');
+    background-image: url('hrn-icon-all.png');
 }
 
-*#icon-video
-{
-    background-image: url('file://hrn-icon-video.png');
-}
-
-*#icon-images
-{
-    background-image: url('file://hrn-icon-images.png');
-}
-
-*#icon-all
-{
-    background-image: url('file://hrn-icon-all.png');
-}
-
-*#toolbar *#clear-query
+#clear-query
 {
     background-color: #00000000;
     border-image: none;
-    background-image: url('file://moblin-entry-clear.png');
+    background-image: url('moblin-entry-clear.png');
     padding: 0px;
 }
 
 
-*#toolbar *#clear-query:hover
+#clear-query:hover
 {
     background-color: #00000000;
     border-image: none;
-    background-image: url('file://moblin-entry-clear-hover.png');
+    background-image: url('moblin-entry-clear-hover.png');
     padding: 0px;
 }
 
-*#toolbar *#fav-toggle,
-    *.HrnSidebarSubItem:hover
-    *.HrnSidebarPin
-    {
-        background-color: #00000000;
-        border-image: none;
-        background-image: url('file://moblin-pin-unpinned.png');
-        padding: 0px;
-}
-
-
-*.HrnSidebarSubItem:hover *.HrnSidebarPin
+HrnSidebarSubitem *#hrn-sidebar-pin
 {
     background-image: none;
     border-image: none;
+    padding: 30 30 0 0;
 }
 
-*#toolbar *#fav-toggle:hover,
-    *.HrnSidebarSubItem:hover *.HrnSidebarPin:hover
-    {
-        background-image: url('file://moblin-pin-unpinned-hover.png');
-        background-color: #00000000;
-        border-image: none;
-}
-
-*#toolbar *#fav-toggle:active
+#fav-toggle
 {
-    background-image: url('file://moblin-pin-pinned-active.png');
-    background-color: #00000000;
-    border-image: none;
-}
-
-*.HrnSidebarSubItem:hover *.HrnSidebarPin:active
-{
-    background-image: url('file://moblin-pin-unpinned-active.png');
-    background-color: #00000000;
-    border-image: none;
-}
-
-*#toolbar *#fav-toggle:checked,
-    *.HrnSidebarSubItem:hover *.HrnSidebarPin:checked
-    {
-        background-image: url('file://moblin-pin-pinned.png');
         background-color: #00000000;
         border-image: none;
+        background-image: url('moblin-pin-unpinned.png');
 }
 
 
-*.HrnSidebarSubItem:checked *.HrnSidebarPin:checked
+#fav-toggle:hover
 {
-    background-image: url('file://moblin-pin-pinned.png');
-    background-color: #00000000;
-    border-image: none;
-}
-
-NbtkButton#close-button {
-    border-image: url('file://nbtk-close.png') 0;
-    padding: 51 57 0 0;
-}
-
-NbtkButton#close-button:hover {
-    border-image: url('file://nbtk-close-hover.png') 0;
-}
-
-NbtkButton#back-button {
-    border-image: url('file://hrn-theater-back.png') 0;
-    padding: 55 55 0 0;
-}
-
-NbtkButton#back-button:hover {
-    border-image: url('file://hrn-theater-back-hover.png') 0;
-}
-
-NbtkBin#filter-bin {
-    padding-right: 143px; /* 200 - 57 (button width) */
+        background-image: url('moblin-pin-unpinned-hover.png');
 }
 
-*#filter-bar {
-    font-family: "Droid Sans Bold";
-    color: #858585;
-    font-size : 15px;
-    padding: 7;
-
-    border-image: url('file://nbtk-entry.png') 5 5 6 5 stretch stretch;
-    padding: 7 10 7 10;
-
-}
-
-
-*#hrn-zoom-bar-label
+MxToolbar *#fav-toggle:active,
+HrnSidebarSubitem *#hrn-sidebar-pin:active
 {
-  color: #ccc;
-}
-
-*#toolbar NbtkScrollBar ,
-    *#toolbar-theatre NbtkScrollBar
-    {
-        border-image: url("file://hrn-zoombar-background.png") 0 40 0 40 stretch stretch;
-        background: #00000000;
-        padding: 0;
-}
-
-*#toolbar NbtkScrollBar > *#backward-stepper,
-    *#toolbar-theatre NbtkScrollBar > *#backward-stepper
-    {
-        border-image: none;
-        background-image: url("file://hrn-zoombar-backward-stepper.png");
-}
-
-*#toolbar NbtkScrollBar > *#backward-stepper:hover,
-    *#toolbar-theatre NbtkScrollBar > *#backward-stepper:hover {
-        border-image: none;
-        background-image: url("file://hrn-zoombar-backward-stepper-hover.png");
+    background-image: url('moblin-pin-pinned-active.png');
 }
 
-*#toolbar NbtkScrollBar > *#backward-stepper:active,
-    *#toolbar-theatre NbtkScrollBar > *#backward-stepper:active {
-        border-image: none;
-        background-image: url("file://hrn-zoombar-backward-stepper-active.png");
-}
-
-*#toolbar NbtkScrollBar > *#forward-stepper,
-    *#toolbar-theatre NbtkScrollBar > *#forward-stepper
-    {
-        border-image: none;
-        background-image: url("file://hrn-zoombar-forward-stepper.png");
-}
-
-*#toolbar NbtkScrollBar > *#forward-stepper:hover, 
-    *#toolbar-theatre NbtkScrollBar > *#forward-stepper:hover
-    {
-        border-image: none;
-        background-image: url("file://hrn-zoombar-forward-stepper-hover.png");
+MxToolbar *#fav-toggle:checked,
+HrnSidebarSubitem *#hrn-sidebar-pin:checked
+{
+    background-image: url('moblin-pin-pinned.png');
 }
 
-*#toolbar NbtkScrollBar > *#forward-stepper:active, 
-    *#toolbar-theatre NbtkScrollBar > *#forward-stepper:active
-    {
-        border-image: none;
-        background-image: url("file://hrn-zoombar-forward-stepper-active.png");
+/* FIXME: Unfortunately you can't haver a hover-state on
+ *        a toggled check-button :(
+ */
+HrnSidebarSubitem:hover *#hrn-sidebar-pin:hover
+{
+    background-image: url('moblin-pin-pinned-hover.png');
 }
 
-*#toolbar NbtkScrollBar *#hhandle,
-    *#toolbar-theatre NbtkScrollBar *#hhandle {
-        border-image: none;
-        background-image: url("file://hrn-zoombar-handle.png");
-}
 
-*#toolbar NbtkScrollBar *#hhandle:hover,
-    *#toolbar-theatre NbtkScrollBar *#hhandle:hover
-    {
-        border-image: none;
-        background-image: url("file://hrn-zoombar-handle-hover.png");
+MxButton#back-button {
+    border-image: url('hrn-theater-back.png') 0;
+    padding: 55 55 0 0;
 }
 
-
-
-
-*#quick-play{
-    /*border-image: url("file://hrn-quick-play.png") 0;*/
+MxButton#back-button:hover {
+    border-image: url('hrn-theater-back-hover.png') 0;
 }
 
-*#quick-play:hover {
-    /*border-image: url("file://hrn-quick-play-hover.png") 0;*/
+/* 200 pixels is the sidebar width, button width is ~55 pixels */
+MxBin#filter-bin {
+    padding: 0 145 0 200;
 }
 
 
-/**  play progress **/ 
-
-NbtkScrollBar.HrnProgressBar
+/**  play progress **/
+MxSlider
 {
-    border-image: url("file://hrn-progress-bar-through.png") 0 25 0 25 stretch;
-    background: #00000000;
-    min-size: 23px;
-    max-size: 23px;
-    padding: 0;
+  trough-height: 6;
+  handle-width: 23;
+  handle-height: 14;
+  padding: 0 8;
 }
 
-NbtkScrollBar.HrnProgressBar > *#backward-stepper,
-NbtkScrollBar.HrnProgressBar > *#forward-stepper
+MxSlider *#trough-background
 {
-    border-image: none;
-    background-image: none;
+  border-image: url("hrn-slider-trough.png") 3;
+  background-color: #b7b7b7;
 }
 
-
-NbtkScrollBar.HrnProgressBar *#hhandle
+MxSlider *#fill
 {
-    border-image: url("file://hrn-progress-bar-handle.png") 0;
+  border-image: url("hrn-slider-trough.png") 3;
+  background-color: #0799ca;
 }
 
-NbtkScrollBar.HrnProgressBar *#hhandle:hover
+MxSlider MxButton,
+MxSlider MxButton:hover,
+MxSlider MxButton:active
 {
-    border-image: url("file://hrn-progress-bar-handle.png") 0;
+  border-image: url("hrn-slider-handle.png") 0;
 }
 
-NbtkButton.HrnPopupActive {
-  font-family: "Droid Sans Bold";
-}
-
-*.HrnTheatreTitle
+HrnTheatreTitle
 {
   color: white;
   font-size: 32px;
   padding-left: 15px;
 }
 
-*.HrnTheatreArtist,
-*.HrnTheatreComposer,
-*.HrnTheatreAlbum,
-*.HrnTheatreTrack
+HrnTheatreArtist,
+HrnTheatreComposer,
+HrnTheatreAlbum,
+HrnTheatreTrack
 {
   color: white;
   font-size: 20px;
@@ -636,83 +359,77 @@ NbtkButton.HrnPopupActive {
 }
 
 
-/* tooltips */
-NbtkTooltip {
-  color: white;
-  padding: 4 10 12 10;
-  background-image: url('file://tooltip-arrow.png');
-  border-image: url('file://tooltip-background.png') 4 11 12 11;
-  font-size: 15px;
-}
-
-
-
-
-*.HrnControls
+HrnControls
 {
     background-color: #333333aa;
-    padding: 10;
+    padding: 0 8 0 0;
 }
 
-*.HrnControls NbtkLabel
+HrnControls MxButton#hrn-controls-play,
+HrnControls MxButton#hrn-controls-pause,
+HrnControls MxButton#hrn-controls-back,
+HrnControls MxButton#hrn-controls-next
 {
-    color: #fff;
-    padding-left: 8px;
+  padding: 60 60 0 0;
 }
 
-NbtkButton.HrnControlsPlay
+HrnControls MxLabel
 {
-    background-image: url("file://playlist-play.png");
-}
-
-NbtkButton.HrnControlsPlay:hover
-{
-    background-image: url("file://playlist-play-hover.png");
+    color: #fff;
 }
 
-NbtkButton.HrnControlsPause
+HrnQueueControls MxButton
 {
-    background-image: url("file://playlist-pause.png");
+    padding: 33 33 0 0;
 }
 
-NbtkButton.HrnControlsPause:hover
+MxButton#hrn-controls-play
 {
-    background-image: url("file://playlist-pause-hover.png");
+    border-image: none;
+    background-image: url("playlist-play.png");
 }
 
-*.HrnControlsLeave
+MxButton#hrn-controls-play:hover
 {
-    background-image: url("file://hrn-controls-leave.png");
+    border-image: none;
+    background-image: url("playlist-play-hover.png");
 }
 
-*.HrnControlsLeave:hover
+MxButton#hrn-controls-pause
 {
-    background-image: url("file://hrn-controls-leave-hover.png");
+    border-image: none;
+    background-image: url("playlist-pause.png");
 }
 
-*.HrnControlsLeave:active
+MxButton#hrn-controls-pause:hover
 {
-    background-image: url("file://hrn-controls-leave-active.png");
+    border-image: none;
+    background-image: url("playlist-pause-hover.png");
 }
 
-*.HrnControlsNext
+MxButton#hrn-controls-next
 {
-    background-image: url("file://playlist-forward.png");
+    border-image: none;
+    background-image: url("playlist-forward.png");
 }
 
-*.HrnControlsNext:hover
+MxButton#hrn-controls-next:hover
 {
-    background-image: url("file://playlist-forward-hover.png");
+    border-image: none;
+    background-image: url("playlist-forward-hover.png");
 }
 
-*.HrnControlsBack
+MxButton#hrn-controls-back
 {
-    background-image: url("file://playlist-rewind.png");
+    border-image: none;
+    background-image: url("playlist-rewind.png");
 }
 
-*.HrnControlsBack:hover
+/* MxButton#hrn-controls-back:active */
+MxButton#hrn-controls-back:hover
 {
-    background-image: url("file://playlist-rewind-hover.png");
+    border-image: none;
+    background-image: url("playlist-rewind-hover.png");
 }
 
 HrnView
@@ -722,12 +439,12 @@ HrnView
 
 HrnTileFrame
 {
-  border-image: url("file://media-normal-frame.png") 5 5 5 5 stretch;
+  border-image: url("media-normal-frame.png") 5 5 5 5;
 }
 
 HrnTileFrame:hover
 {
-  border-image: url("file://media-rollover-frame.png") 5 5 5 5 stretch;
+  border-image: url("media-rollover-frame.png") 5 5 5 5;
 }
 
 *#tile-overlay-label
@@ -735,18 +452,12 @@ HrnTileFrame:hover
   color: #fff;
 }
 
-HrnQueueControls
-{
-    background-image: url("file://hrn-queue-controls-bg.png");
-    padding: 10px;
-}
-
-*.HrnUpButtonThumbnail
+HrnUpTile
 {
-    background-image: url("file://hrn-generic-back.png");
+    background-image: url("hrn-generic-back.png");
 }
 
-*.HrnUpButtonThumbnail:hover
+HrnUpTile:hover
 {
-    background-image: url("file://hrn-generic-back-hover.png");
+    background-image: url("hrn-generic-back-hover.png");
 }
Binary files 1.5.1-1/data/Hover-frame-all.png and 1.8.4-1/data/Hover-frame-all.png differ
Binary files 1.5.1-1/data/Hover-frame-play-bg.png and 1.8.4-1/data/Hover-frame-play-bg.png differ
Binary files 1.5.1-1/data/hrn-bg-item-selected-hover.png and 1.8.4-1/data/hrn-bg-item-selected-hover.png differ
Binary files 1.5.1-1/data/hrn-bg-item-selected.png and 1.8.4-1/data/hrn-bg-item-selected.png differ
Binary files 1.5.1-1/data/hrn-button-toolbar-hover.png and 1.8.4-1/data/hrn-button-toolbar-hover.png differ
Binary files 1.5.1-1/data/hrn-button-toolbar.png and 1.8.4-1/data/hrn-button-toolbar.png differ
Binary files 1.5.1-1/data/hrn-cluster-image-quick-play.png and 1.8.4-1/data/hrn-cluster-image-quick-play.png differ
Binary files 1.5.1-1/data/hrn-cluster-image-zoom.png and 1.8.4-1/data/hrn-cluster-image-zoom.png differ
Binary files 1.5.1-1/data/hrn-cluster-movie-quick-play.png and 1.8.4-1/data/hrn-cluster-movie-quick-play.png differ
Binary files 1.5.1-1/data/hrn-cluster-movie-zoom.png and 1.8.4-1/data/hrn-cluster-movie-zoom.png differ
Binary files 1.5.1-1/data/hrn-cluster-music-quick-play.png and 1.8.4-1/data/hrn-cluster-music-quick-play.png differ
Binary files 1.5.1-1/data/hrn-cluster-music-zoom.png and 1.8.4-1/data/hrn-cluster-music-zoom.png differ
Binary files 1.5.1-1/data/hrn-cluster-quick-play.png and 1.8.4-1/data/hrn-cluster-quick-play.png differ
Binary files 1.5.1-1/data/hrn-cluster-selected-hover.png and 1.8.4-1/data/hrn-cluster-selected-hover.png differ
Binary files 1.5.1-1/data/hrn-cluster-selected.png and 1.8.4-1/data/hrn-cluster-selected.png differ
Binary files 1.5.1-1/data/hrn-cluster-zoom.png and 1.8.4-1/data/hrn-cluster-zoom.png differ
Binary files 1.5.1-1/data/hrn-controls-ffw-active.png and 1.8.4-1/data/hrn-controls-ffw-active.png differ
Binary files 1.5.1-1/data/hrn-controls-ffw-hover.png and 1.8.4-1/data/hrn-controls-ffw-hover.png differ
Binary files 1.5.1-1/data/hrn-controls-ffw.png and 1.8.4-1/data/hrn-controls-ffw.png differ
Binary files 1.5.1-1/data/hrn-controls-leave-active.png and 1.8.4-1/data/hrn-controls-leave-active.png differ
Binary files 1.5.1-1/data/hrn-controls-leave-hover.png and 1.8.4-1/data/hrn-controls-leave-hover.png differ
Binary files 1.5.1-1/data/hrn-controls-leave.png and 1.8.4-1/data/hrn-controls-leave.png differ
Binary files 1.5.1-1/data/hrn-controls-pause-active.png and 1.8.4-1/data/hrn-controls-pause-active.png differ
Binary files 1.5.1-1/data/hrn-controls-pause-hover.png and 1.8.4-1/data/hrn-controls-pause-hover.png differ
Binary files 1.5.1-1/data/hrn-controls-play-active.png and 1.8.4-1/data/hrn-controls-play-active.png differ
Binary files 1.5.1-1/data/hrn-controls-play-hover.png and 1.8.4-1/data/hrn-controls-play-hover.png differ
Binary files 1.5.1-1/data/hrn-expander-left.png and 1.8.4-1/data/hrn-expander-left.png differ
Binary files 1.5.1-1/data/hrn-expander-right.png and 1.8.4-1/data/hrn-expander-right.png differ
Binary files 1.5.1-1/data/hrn-item-frame-hover.png and 1.8.4-1/data/hrn-item-frame-hover.png differ
Binary files 1.5.1-1/data/hrn-item-frame.png and 1.8.4-1/data/hrn-item-frame.png differ
Binary files 1.5.1-1/data/hrn-item-frame-selected.png and 1.8.4-1/data/hrn-item-frame-selected.png differ
Binary files 1.5.1-1/data/hrn-item-image-quick-play.png and 1.8.4-1/data/hrn-item-image-quick-play.png differ
Binary files 1.5.1-1/data/hrn-item-image-zoom.png and 1.8.4-1/data/hrn-item-image-zoom.png differ
Binary files 1.5.1-1/data/hrn-item-movie-quick-play.png and 1.8.4-1/data/hrn-item-movie-quick-play.png differ
Binary files 1.5.1-1/data/hrn-item-movie-zoom.png and 1.8.4-1/data/hrn-item-movie-zoom.png differ
Binary files 1.5.1-1/data/hrn-item-music-quick-play.png and 1.8.4-1/data/hrn-item-music-quick-play.png differ
Binary files 1.5.1-1/data/hrn-item-music-zoom.png and 1.8.4-1/data/hrn-item-music-zoom.png differ
Binary files 1.5.1-1/data/hrn-item-quick-play.png and 1.8.4-1/data/hrn-item-quick-play.png differ
Binary files 1.5.1-1/data/hrn-item-selected-hover.png and 1.8.4-1/data/hrn-item-selected-hover.png differ
Binary files 1.5.1-1/data/hrn-item-selected.png and 1.8.4-1/data/hrn-item-selected.png differ
Binary files 1.5.1-1/data/hrn-item-zoom.png and 1.8.4-1/data/hrn-item-zoom.png differ
Binary files 1.5.1-1/data/hrn-lasso.png and 1.8.4-1/data/hrn-lasso.png differ
Binary files 1.5.1-1/data/hrn-popup.png and 1.8.4-1/data/hrn-popup.png differ
Binary files 1.5.1-1/data/hrn-progress-bar-handle.png and 1.8.4-1/data/hrn-progress-bar-handle.png differ
Binary files 1.5.1-1/data/hrn-progress-bar-through.png and 1.8.4-1/data/hrn-progress-bar-through.png differ
Binary files 1.5.1-1/data/hrn-queue-header.png and 1.8.4-1/data/hrn-queue-header.png differ
Binary files 1.5.1-1/data/hrn-queue-pause.png and 1.8.4-1/data/hrn-queue-pause.png differ
Binary files 1.5.1-1/data/hrn-queue-play-active.png and 1.8.4-1/data/hrn-queue-play-active.png differ
Binary files 1.5.1-1/data/hrn-queue-play-hover.png and 1.8.4-1/data/hrn-queue-play-hover.png differ
Binary files 1.5.1-1/data/hrn-queue-play.png and 1.8.4-1/data/hrn-queue-play.png differ
Binary files 1.5.1-1/data/hrn-quick-play-active.png and 1.8.4-1/data/hrn-quick-play-active.png differ
Binary files 1.5.1-1/data/hrn-quick-play-hover.png and 1.8.4-1/data/hrn-quick-play-hover.png differ
Binary files 1.5.1-1/data/hrn-quick-play.png and 1.8.4-1/data/hrn-quick-play.png differ
Binary files 1.5.1-1/data/hrn-show-hover.png and 1.8.4-1/data/hrn-show-hover.png differ
Binary files 1.5.1-1/data/hrn-sidebar-highlight.png and 1.8.4-1/data/hrn-sidebar-highlight.png differ
Binary files 1.5.1-1/data/hrn-slider-handle.png and 1.8.4-1/data/hrn-slider-handle.png differ
Binary files 1.5.1-1/data/hrn-slider-trough.png and 1.8.4-1/data/hrn-slider-trough.png differ
Binary files 1.5.1-1/data/hrn-stack-front.png and 1.8.4-1/data/hrn-stack-front.png differ
Binary files 1.5.1-1/data/hrn-topbar.png and 1.8.4-1/data/hrn-topbar.png differ
Binary files 1.5.1-1/data/hrn-topbar-theatre.png and 1.8.4-1/data/hrn-topbar-theatre.png differ
Binary files 1.5.1-1/data/hrn-zoombar-background.png and 1.8.4-1/data/hrn-zoombar-background.png differ
Binary files 1.5.1-1/data/hrn-zoombar-backward-stepper-active.png and 1.8.4-1/data/hrn-zoombar-backward-stepper-active.png differ
Binary files 1.5.1-1/data/hrn-zoombar-backward-stepper-hover.png and 1.8.4-1/data/hrn-zoombar-backward-stepper-hover.png differ
Binary files 1.5.1-1/data/hrn-zoombar-backward-stepper.png and 1.8.4-1/data/hrn-zoombar-backward-stepper.png differ
Binary files 1.5.1-1/data/hrn-zoombar-forward-stepper-active.png and 1.8.4-1/data/hrn-zoombar-forward-stepper-active.png differ
Binary files 1.5.1-1/data/hrn-zoombar-forward-stepper-hover.png and 1.8.4-1/data/hrn-zoombar-forward-stepper-hover.png differ
Binary files 1.5.1-1/data/hrn-zoombar-forward-stepper.png and 1.8.4-1/data/hrn-zoombar-forward-stepper.png differ
Binary files 1.5.1-1/data/hrn-zoombar-handle-active.png and 1.8.4-1/data/hrn-zoombar-handle-active.png differ
Binary files 1.5.1-1/data/hrn-zoombar-handle-hover.png and 1.8.4-1/data/hrn-zoombar-handle-hover.png differ
Binary files 1.5.1-1/data/hrn-zoombar-handle.png and 1.8.4-1/data/hrn-zoombar-handle.png differ
diff -pruN 1.5.1-1/data/Makefile.am 1.8.4-1/data/Makefile.am
--- 1.5.1-1/data/Makefile.am	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/data/Makefile.am	2010-02-17 17:26:44.000000000 +0000
@@ -14,79 +14,23 @@ hrn-expander-down.png \
 hrn-expander-down-hover.png \
 hrn-expander-up.png \
 hrn-expander-up-hover.png \
-hrn-expander-right.png \
-hrn-expander-left.png \
 hrn-generic-album.png \
 hrn-generic-images.png \
 hrn-generic-video.png \
 hrn-generic-back.png \
 hrn-generic-back-hover.png \
-hrn-item-frame.png \
-hrn-item-zoom.png \
-hrn-item-quick-play.png \
-hrn-cluster-image-zoom.png \
-hrn-cluster-image-quick-play.png \
-hrn-cluster-music-zoom.png \
-hrn-cluster-music-quick-play.png \
-hrn-cluster-movie-zoom.png \
-hrn-cluster-movie-quick-play.png \
-hrn-item-image-zoom.png \
-hrn-item-image-quick-play.png \
-hrn-item-music-zoom.png \
-hrn-item-music-quick-play.png \
-hrn-item-movie-zoom.png \
-hrn-item-movie-quick-play.png \
-hrn-item-selected-hover.png \
-hrn-item-selected.png \
-hrn-bg-item-selected-hover.png \
-hrn-bg-item-selected.png \
-hrn-lasso.png \
-hrn-popup.png \
 hrn-queue-controls-bg.png \
-hrn-queue-pause.png \
-hrn-queue-play-hover.png \
-hrn-queue-play.png \
 hrn-queue.png \
 hrn-queue-bg.png \
 hrn-queue-header.png \
 hrn-queue-highlight.png \
-hrn-quick-play.png \
-hrn-quick-play-hover.png \
-hrn-button-toolbar.png \
-hrn-button-toolbar-hover.png \
 hrn-spinner.png \
 hrn-theater-back.png \
 hrn-theater-back-hover.png \
-hrn-topbar.png \
-hrn-topbar-theatre.png \
-moblin-settings.png \
-moblin-settings-hover.png \
-nbtk-button-active.png \
 nbtk-button-hover.png \
-nbtk-close.png \
-nbtk-close-hover.png \
 nbtk-button.png \
-nbtk-checkbox.png \
-nbtk-scrollbar-backward-stepper-hover.png \
-nbtk-scrollbar-backward-stepper.png \
-nbtk-scrollbar-forward-stepper-hover.png \
-nbtk-scrollbar-forward-stepper.png \
-nbtk-scrollbar-handle-hover.png \
-nbtk-scrollbar-handle.png \
-hrn-progress-bar-through.png \
-hrn-progress-bar-handle.png \
-hrn-sidebar-highlight.png \
-hrn-zoombar-backward-stepper-hover.png \
-hrn-zoombar-backward-stepper-active.png \
-hrn-zoombar-backward-stepper.png \
-hrn-zoombar-forward-stepper-hover.png \
-hrn-zoombar-forward-stepper-active.png \
-hrn-zoombar-forward-stepper.png \
-hrn-zoombar-handle-hover.png \
-hrn-zoombar-handle-active.png \
-hrn-zoombar-handle.png \
-hrn-zoombar-background.png \
-nbtk-toolbar-separator.png \
+hrn-slider-trough.png \
+hrn-slider-handle.png \
 nbtk-entry.png \
 moblin-pin-pinned.png \
 moblin-pin-pinned-hover.png \
@@ -100,21 +44,8 @@ hrn-icon-audio.png \
 hrn-icon-video.png \
 hrn-icon-images.png \
 hrn-icon-all.png \
-tooltip-arrow.png \
-tooltip-background.png \
-hrn-controls-leave.png \
-hrn-controls-leave-hover.png \
-hrn-controls-leave-active.png \
-hrn-controls-ffw.png \
-hrn-controls-ffw-hover.png \
-hrn-controls-ffw-active.png \
 hrn-controls-play.png \
-hrn-controls-play-hover.png \
-hrn-controls-play-active.png \
 hrn-controls-pause.png \
-hrn-controls-pause-hover.png \
-hrn-controls-pause-active.png \
-hrn-stack-front.png		\
 playlist-forward.png		\
 playlist-forward-hover.png	\
 playlist-rewind.png		\
Binary files 1.5.1-1/data/moblin-settings-hover.png and 1.8.4-1/data/moblin-settings-hover.png differ
Binary files 1.5.1-1/data/moblin-settings.png and 1.8.4-1/data/moblin-settings.png differ
Binary files 1.5.1-1/data/nbtk-button-active.png and 1.8.4-1/data/nbtk-button-active.png differ
Binary files 1.5.1-1/data/nbtk-checkbox.png and 1.8.4-1/data/nbtk-checkbox.png differ
Binary files 1.5.1-1/data/nbtk-close-hover.png and 1.8.4-1/data/nbtk-close-hover.png differ
Binary files 1.5.1-1/data/nbtk-close.png and 1.8.4-1/data/nbtk-close.png differ
Binary files 1.5.1-1/data/nbtk-scrollbar-backward-stepper-hover.png and 1.8.4-1/data/nbtk-scrollbar-backward-stepper-hover.png differ
Binary files 1.5.1-1/data/nbtk-scrollbar-backward-stepper.png and 1.8.4-1/data/nbtk-scrollbar-backward-stepper.png differ
Binary files 1.5.1-1/data/nbtk-scrollbar-forward-stepper-hover.png and 1.8.4-1/data/nbtk-scrollbar-forward-stepper-hover.png differ
Binary files 1.5.1-1/data/nbtk-scrollbar-forward-stepper.png and 1.8.4-1/data/nbtk-scrollbar-forward-stepper.png differ
Binary files 1.5.1-1/data/nbtk-scrollbar-handle-hover.png and 1.8.4-1/data/nbtk-scrollbar-handle-hover.png differ
Binary files 1.5.1-1/data/nbtk-scrollbar-handle.png and 1.8.4-1/data/nbtk-scrollbar-handle.png differ
Binary files 1.5.1-1/data/nbtk-toolbar-separator.png and 1.8.4-1/data/nbtk-toolbar-separator.png differ
Binary files 1.5.1-1/data/tooltip-arrow.png and 1.8.4-1/data/tooltip-arrow.png differ
Binary files 1.5.1-1/data/tooltip-background.png and 1.8.4-1/data/tooltip-background.png differ
diff -pruN 1.5.1-1/debian/changelog 1.8.4-1/debian/changelog
--- 1.5.1-1/debian/changelog	2011-03-15 17:17:27.000000000 +0000
+++ 1.8.4-1/debian/changelog	2011-03-10 18:59:19.000000000 +0000
@@ -1,3 +1,16 @@
+hornsey (1.8.4-1) unstable; urgency=low
+
+  * New upstream release
+  * Add watch file
+  * Update debian/copyright to latest dep5 format
+  * Bump Standards-Version to 3.9.1: nothing needs to be changed
+  * 01_add_missing_hrn-video-tile-frame.h.patch: Add missing source files from
+    git tree
+  * 01_port_to_debian.patch: Port to libtracker 0.8 and clutter-gst-0.10
+  * 02_port_to_mx_1.0.2.patch: Port to MX 1.0.2
+
+ -- Ying-Chun Liu (PaulLiu) <paulliu@debian.org>  Fri, 11 Mar 2011 02:54:16 +0800
+
 hornsey (1.5.1-1) unstable; urgency=low
 
   * Initial release. (Closes: #565151)
diff -pruN 1.5.1-1/debian/clean 1.8.4-1/debian/clean
--- 1.5.1-1/debian/clean	2011-03-15 17:17:27.000000000 +0000
+++ 1.8.4-1/debian/clean	2011-03-03 16:35:25.000000000 +0000
@@ -17,3 +17,4 @@ src/Makefile.in
 intltool-*.in
 config.status
 config.log
+po/POTFILES
diff -pruN 1.5.1-1/debian/control 1.8.4-1/debian/control
--- 1.5.1-1/debian/control	2011-03-15 17:17:27.000000000 +0000
+++ 1.8.4-1/debian/control	2011-03-10 18:48:18.000000000 +0000
@@ -3,18 +3,20 @@ Section: gnome
 Priority: optional
 Maintainer: Ying-Chun Liu (PaulLiu) <paulliu@debian.org>
 Build-Depends: debhelper (>= 7), cdbs, autotools-dev, gettext, gnome-common,
-               intltool, libbickley-dev, libbognor-regis-dev (>= 0.4.9),
+               intltool, libbickley-dev, libbognor-regis-dev (>= 0.6),
                libclutter-1.0-dev, libclutter-gtk-0.10-dev,
                libclutter-gst-0.10-dev, libclutter-imcontext-0.1-dev,
-               libnbtk-dev (>= 1.1), libnotify-dev, xsltproc, docbook-xsl,
+               libmx-dev (>= 1.0.2), libnotify-dev, xsltproc, docbook-xsl,
                libstartup-notification0-dev (>= 0.9), libunique-dev (>= 1.0.6),
-               libxtst-dev, autoconf, automake, libtool, libdbus-glib-1-dev
-Standards-Version: 3.8.3
+               libxtst-dev, autoconf, automake, libtool, libdbus-glib-1-dev,
+               libtracker-client-0.8-dev
+Standards-Version: 3.9.1
 Homepage: http://moblin.org/
 
 Package: hornsey
 Architecture: any
-Depends: ${shlibs:Depends}, ${misc:Depends}, bickley-daemons
+Depends: ${shlibs:Depends}, ${misc:Depends}
+Recommends: tracker, bickley-daemons
 Description: Moblin media player
  Hornsey is a media browser and player for Moblin environment. It supports
  viewing images, videos and listening to audios.
diff -pruN 1.5.1-1/debian/copyright 1.8.4-1/debian/copyright
--- 1.5.1-1/debian/copyright	2011-03-15 17:17:27.000000000 +0000
+++ 1.8.4-1/debian/copyright	2011-03-10 18:55:12.000000000 +0000
@@ -1,8 +1,8 @@
-Format-Specification: http://svn.debian.org/wsvn/dep/web/deps/dep5.mdwn?op=file&rev=135
-Name: hornsey
-Maintainer: Iain Holmes <iain@linux.intel.com>
-            Thomas Wood <thomas@linux.intel.com>
-            Øyvind Kolås <pippin@linux.intel.com>
+Format: http://svn.debian.org/wsvn/dep/web/deps/dep5.mdwn?op=file&rev=166
+Upstream-Name: hornsey
+Upstream-Contact: Iain Holmes <iain@linux.intel.com>
+                  Thomas Wood <thomas@linux.intel.com>
+                  Øyvind Kolås <pippin@linux.intel.com>
 Source: http://git.moblin.org/cgit.cgi/hornsey
 
 Files: *
@@ -16,6 +16,7 @@ License:
 
 Files: po/id.po
 Copyright: 2009, Andika Triwidada <andika@gmail.com>
+License:
  This file is distributed under the same license as the PACKAGE package.
 
 Files: debian/*
@@ -26,15 +27,15 @@ License: LGPL-2.1
  This program is free software; you can redistribute it and/or modify it
  under the terms and conditions of the GNU Lesser General Public License,
  version 2.1, as published by the Free Software Foundation.
-
+ .
  This program is distributed in the hope it will be useful, but WITHOUT ANY
  WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
  more details.
-
+ .
  You should have received a copy of the GNU Lesser General Public License
  along with this program; if not, write to the Free Software Foundation,
  Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
-
+ .
  On Debian systems the full text of the GNU Lesser General Public Licnse,
  version 2.1, can be found in the /usr/share/common-licenses/LGPL-2.1 file.
diff -pruN 1.5.1-1/debian/patches/01_add_missing_hrn-video-tile-frame.h.patch 1.8.4-1/debian/patches/01_add_missing_hrn-video-tile-frame.h.patch
--- 1.5.1-1/debian/patches/01_add_missing_hrn-video-tile-frame.h.patch	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/debian/patches/01_add_missing_hrn-video-tile-frame.h.patch	2011-03-03 19:22:51.000000000 +0000
@@ -0,0 +1,310 @@
+Description: Add missing files from git repo
+ Two files are missing: src/hrn-video-tile-frame.[ch].
+ We add them back in this patch.
+Author: Ying-Chun Liu (PaulLiu) <paulliu@debian.org>
+Last-Update: 2011-03-04
+Index: hornsey-1.8.4/src/hrn-video-tile-frame.h
+===================================================================
+--- /dev/null	1970-01-01 00:00:00.000000000 +0000
++++ hornsey-1.8.4/src/hrn-video-tile-frame.h	2011-03-04 03:22:40.000000000 +0800
+@@ -0,0 +1,50 @@
++#ifndef __HRN_VIDEO_TILE_FRAME_H__
++#define __HRN_VIDEO_TILE_FRAME_H__
++
++#include "hrn-tile-frame.h"
++
++
++G_BEGIN_DECLS
++
++#define HRN_TYPE_VIDEO_TILE_FRAME                                       \
++   (hrn_video_tile_frame_get_type())
++#define HRN_VIDEO_TILE_FRAME(obj)                                       \
++   (G_TYPE_CHECK_INSTANCE_CAST ((obj),                                  \
++                                HRN_TYPE_VIDEO_TILE_FRAME,              \
++                                HrnVideoTileFrame))
++#define HRN_VIDEO_TILE_FRAME_CLASS(klass)                               \
++   (G_TYPE_CHECK_CLASS_CAST ((klass),                                   \
++                             HRN_TYPE_VIDEO_TILE_FRAME,                 \
++                             HrnVideoTileFrameClass))
++#define IS_HRN_VIDEO_TILE_FRAME(obj)                                    \
++   (G_TYPE_CHECK_INSTANCE_TYPE ((obj),                                  \
++                                HRN_TYPE_VIDEO_TILE_FRAME))
++#define IS_HRN_VIDEO_TILE_FRAME_CLASS(klass)                            \
++   (G_TYPE_CHECK_CLASS_TYPE ((klass),                                   \
++                             HRN_TYPE_VIDEO_TILE_FRAME))
++#define HRN_VIDEO_TILE_FRAME_GET_CLASS(obj)                             \
++   (G_TYPE_INSTANCE_GET_CLASS ((obj),                                   \
++                               HRN_TYPE_VIDEO_TILE_FRAME,               \
++                               HrnVideoTileFrameClass))
++
++typedef struct _HrnVideoTileFramePrivate HrnVideoTileFramePrivate;
++typedef struct _HrnVideoTileFrame      HrnVideoTileFrame;
++typedef struct _HrnVideoTileFrameClass HrnVideoTileFrameClass;
++
++struct _HrnVideoTileFrame
++{
++    HrnTileFrame parent;
++
++    HrnVideoTileFramePrivate *priv;
++};
++
++struct _HrnVideoTileFrameClass
++{
++    HrnTileFrameClass parent_class;
++};
++
++GType hrn_video_tile_frame_get_type (void) G_GNUC_CONST;
++
++G_END_DECLS
++
++#endif /* __HRN_VIDEO_TILE_FRAME_H__ */
+Index: hornsey-1.8.4/src/hrn-video-tile-frame.c
+===================================================================
+--- /dev/null	1970-01-01 00:00:00.000000000 +0000
++++ hornsey-1.8.4/src/hrn-video-tile-frame.c	2011-03-04 03:22:40.000000000 +0800
+@@ -0,0 +1,245 @@
++#include <clutter-gst/clutter-gst.h>
++#include "hrn-video-tile-frame.h"
++
++enum {
++    PROP_0,
++    PROP_URI,
++};
++
++enum {
++    LAST_SIGNAL,
++};
++
++struct _HrnVideoTileFramePrivate {
++    ClutterActor *group;
++    ClutterActor *background;
++    ClutterActor *video;
++    guint32 video_id;
++    char *uri;
++};
++
++#define GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), HRN_TYPE_VIDEO_TILE_FRAME, HrnVideoTileFramePrivate))
++G_DEFINE_TYPE (HrnVideoTileFrame, hrn_video_tile_frame, HRN_TYPE_TILE_FRAME);
++
++#define VIDEO_TIMEOUT 1
++
++static void
++hrn_video_tile_frame_finalize (GObject *object)
++{
++    G_OBJECT_CLASS (hrn_video_tile_frame_parent_class)->finalize (object);
++}
++
++static void
++hrn_video_tile_frame_dispose (GObject *object)
++{
++    G_OBJECT_CLASS (hrn_video_tile_frame_parent_class)->dispose (object);
++}
++
++static void
++hrn_video_tile_frame_set_property (GObject      *object,
++                                   guint         prop_id,
++                                   const GValue *value,
++                                   GParamSpec   *pspec)
++{
++    HrnVideoTileFrame *self = (HrnVideoTileFrame *) object;
++    HrnVideoTileFramePrivate *priv = self->priv;
++
++    switch (prop_id) {
++    case PROP_URI:
++        if (priv->uri) {
++            g_free (priv->uri);
++        }
++
++        priv->uri = g_value_dup_string (value);
++        break;
++
++    default:
++        break;
++    }
++}
++
++static void
++hrn_video_tile_frame_get_property (GObject    *object,
++                                   guint       prop_id,
++                                   GValue     *value,
++                                   GParamSpec *pspec)
++{
++}
++
++static void
++scale_background (ClutterActor          *actor,
++                  const ClutterActorBox *box,
++                  ClutterAllocationFlags flags,
++                  HrnVideoTileFrame     *frame)
++{
++    HrnVideoTileFramePrivate *priv = frame->priv;
++
++    clutter_actor_set_size (priv->background, box->x2 - box->x1,
++                            box->y2 - box->y1);
++}
++
++static void
++scale_video_player (ClutterTexture    *texture,
++                    float              width,
++                    float              height,
++                    HrnVideoTileFrame *frame)
++{
++    HrnVideoTileFramePrivate *priv = frame->priv;
++    float new_x, new_y, new_width, new_height;
++    float group_w, group_h;
++
++    clutter_actor_get_size (priv->group, &group_w, &group_h);
++
++    new_height = (height * group_w) / width;
++
++    if (new_height <= group_h) {
++        new_width = group_w;
++
++        new_x = 0;
++        new_y = (group_h - new_height) / 2;
++    } else {
++        new_width  = (width * group_h) / height;
++        new_height = group_h;
++
++        new_x = (group_w - new_width) / 2;
++        new_y = 0;
++    }
++
++    g_print ("Positioning video at %2f, %2f, %2fx%2f\n", new_x, new_y,
++             new_width, new_height);
++    clutter_actor_set_position ((ClutterActor *) texture, new_x, new_y);
++    clutter_actor_set_size ((ClutterActor *) texture, new_width, new_height);
++}
++
++static gboolean
++start_video (gpointer userdata)
++{
++    HrnVideoTileFrame *frame = (HrnVideoTileFrame *) userdata;
++    HrnVideoTileFramePrivate *priv = frame->priv;
++    ClutterColor black = { 0x00, 0x00, 0x00, 0xff };
++
++    g_print ("Starting video %s\n", priv->uri);
++    priv->video_id = 0;
++
++    priv->group = clutter_group_new ();
++    g_signal_connect (priv->group, "allocation-changed",
++                      G_CALLBACK (scale_background), frame);
++    priv->background = clutter_rectangle_new_with_color (&black);
++    clutter_container_add_actor ((ClutterContainer *) priv->group,
++                                 priv->background);
++    clutter_actor_set_position (priv->background, 0, 0);
++
++    priv->video = clutter_gst_video_texture_new ();
++    g_object_set (G_OBJECT (priv->video),
++                  "sync-size", FALSE,
++                  NULL);
++    g_signal_connect (priv->video, "size-change",
++                      G_CALLBACK (scale_video_player), frame);
++    clutter_container_add_actor ((ClutterContainer *) priv->group,
++                                 priv->video);
++
++    hrn_tile_frame_set_secondary_texture ((HrnTileFrame *) frame, priv->group);
++    clutter_media_set_audio_volume ((ClutterMedia *) priv->video, 0.0);
++    clutter_media_set_uri ((ClutterMedia *) priv->video, priv->uri);
++    clutter_media_set_playing ((ClutterMedia *) priv->video, TRUE);
++
++    return FALSE;
++}
++
++static gboolean
++hrn_video_tile_frame_enter (ClutterActor         *actor,
++                            ClutterCrossingEvent *event)
++{
++    HrnVideoTileFrame *frame = (HrnVideoTileFrame *) actor;
++    HrnVideoTileFramePrivate *priv = frame->priv;
++
++    if (priv->video_id == 0) {
++        priv->video_id = g_timeout_add_seconds (VIDEO_TIMEOUT,
++                                                start_video, frame);
++    }
++
++    CLUTTER_ACTOR_CLASS (hrn_video_tile_frame_parent_class)->enter_event
++        (actor, event);
++
++    return TRUE;
++}
++
++static gboolean
++hrn_video_tile_frame_leave (ClutterActor         *actor,
++                            ClutterCrossingEvent *event)
++{
++    HrnVideoTileFrame *frame = (HrnVideoTileFrame *) actor;
++    HrnVideoTileFramePrivate *priv = frame->priv;
++
++    if (priv->video_id > 0) {
++        g_source_remove (priv->video_id);
++        priv->video_id = 0;
++    }
++
++    if (priv->video) {
++        clutter_media_set_playing ((ClutterMedia *) priv->video, FALSE);
++        clutter_actor_destroy (priv->group);
++        hrn_tile_frame_set_secondary_texture ((HrnTileFrame *) frame, NULL);
++        priv->video = NULL;
++    }
++
++    CLUTTER_ACTOR_CLASS (hrn_video_tile_frame_parent_class)->leave_event
++        (actor, event);
++
++    return TRUE;
++}
++
++static gboolean
++hrn_video_tile_frame_press_event (ClutterActor       *actor,
++                                  ClutterButtonEvent *event)
++{
++        HrnVideoTileFrame *frame = (HrnVideoTileFrame *) actor;
++    HrnVideoTileFramePrivate *priv = frame->priv;
++
++    if (priv->video_id > 0) {
++        g_source_remove (priv->video_id);
++        priv->video_id = 0;
++    }
++
++    if (priv->video) {
++        clutter_media_set_playing ((ClutterMedia *) priv->video, FALSE);
++        clutter_actor_destroy (priv->group);
++        hrn_tile_frame_set_secondary_texture ((HrnTileFrame *) frame, NULL);
++        priv->video = NULL;
++    }
++
++    return CLUTTER_ACTOR_CLASS
++        (hrn_video_tile_frame_parent_class)->button_press_event (actor, event);
++}
++
++static void
++hrn_video_tile_frame_class_init (HrnVideoTileFrameClass *klass)
++{
++    GObjectClass *o_class = (GObjectClass *) klass;
++    ClutterActorClass *a_class = (ClutterActorClass *) klass;
++
++    o_class->dispose = hrn_video_tile_frame_dispose;
++    o_class->finalize = hrn_video_tile_frame_finalize;
++    o_class->set_property = hrn_video_tile_frame_set_property;
++    o_class->get_property = hrn_video_tile_frame_get_property;
++
++    a_class->enter_event = hrn_video_tile_frame_enter;
++    a_class->leave_event = hrn_video_tile_frame_leave;
++    a_class->button_press_event = hrn_video_tile_frame_press_event;
++
++    g_type_class_add_private (klass, sizeof (HrnVideoTileFramePrivate));
++
++    g_object_class_install_property (o_class, PROP_URI,
++                                     g_param_spec_string ("uri", "", "", "",
++                                                          G_PARAM_WRITABLE |
++                                                          G_PARAM_STATIC_STRINGS));
++}
++
++static void
++hrn_video_tile_frame_init (HrnVideoTileFrame *self)
++{
++    HrnVideoTileFramePrivate *priv = GET_PRIVATE (self);
++
++    self->priv = priv;
++}
++
diff -pruN 1.5.1-1/debian/patches/01_port_to_debian.patch 1.8.4-1/debian/patches/01_port_to_debian.patch
--- 1.5.1-1/debian/patches/01_port_to_debian.patch	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/debian/patches/01_port_to_debian.patch	2011-03-03 19:22:38.000000000 +0000
@@ -0,0 +1,52 @@
+Description: Port to the library that Debian are using
+ Debian are using tracker-client-0.8 and clutter-gst-0.10. We port hornsey
+ to these version of libraries.
+Author: Ying-Chun Liu (PaulLiu) <paulliu@debian.org>
+Last-Update: 2011-03-04
+Index: hornsey-1.8.4/configure.ac
+===================================================================
+--- hornsey-1.8.4.orig/configure.ac	2011-03-04 03:22:31.000000000 +0800
++++ hornsey-1.8.4/configure.ac	2011-03-04 03:22:36.000000000 +0800
+@@ -25,7 +25,7 @@
+ AC_PROG_CC
+ AC_STDC_HEADERS
+ 
+-DEPS_PACKAGES="clutter-1.0 clutter-imcontext-0.1 clutter-gtk-0.10 mx-1.0 bognor-regis-0.6 >= 0.6.0 unique-1.0 >= 1.0.6 libstartup-notification-1.0 >= 0.9 libnotify xtst gtk+-2.0 tracker-client-0.7"
++DEPS_PACKAGES="clutter-1.0 clutter-imcontext-0.1 clutter-gtk-0.10 mx-1.0 bognor-regis-0.6 >= 0.6.0 unique-1.0 >= 1.0.6 libstartup-notification-1.0 >= 0.9 libnotify xtst gtk+-2.0 tracker-client-0.8"
+ AC_PATH_PROG(GLIB_GENMARSHAL, glib-genmarshal)
+ 
+ SHAVE_INIT([autotools], [enable])
+@@ -47,7 +47,7 @@
+   DEPS_PACKAGES="${DEPS_PACKAGES} clutter-helix-1.0"
+   AC_DEFINE(USE_HELIX,1,[Define if we want to use Helix])
+ else
+-  DEPS_PACKAGES="${DEPS_PACKAGES} clutter-gst-1.0"
++  DEPS_PACKAGES="${DEPS_PACKAGES} clutter-gst-0.10"
+ fi
+ 
+  PKG_CHECK_MODULES(DEPS, "$DEPS_PACKAGES")
+Index: hornsey-1.8.4/src/hrn-tracker-client.c
+===================================================================
+--- hornsey-1.8.4.orig/src/hrn-tracker-client.c	2011-03-04 03:22:31.000000000 +0800
++++ hornsey-1.8.4/src/hrn-tracker-client.c	2011-03-04 03:22:36.000000000 +0800
+@@ -1,5 +1,6 @@
+ #include <string.h>
+-#include <libtracker-client/tracker.h>
++#include <libtracker-client/tracker-client.h>
++#include <dbus/dbus-glib.h>
+ 
+ #include "hrn-tracker-client.h"
+ 
+Index: hornsey-1.8.4/src/hrn-video-player.c
+===================================================================
+--- hornsey-1.8.4.orig/src/hrn-video-player.c	2011-03-04 03:22:31.000000000 +0800
++++ hornsey-1.8.4/src/hrn-video-player.c	2011-03-04 03:22:36.000000000 +0800
+@@ -333,7 +333,7 @@
+   GstElement *playbin2;
+ 
+   video_texture = CLUTTER_GST_VIDEO_TEXTURE (priv->video_player);
+-  playbin2 = clutter_gst_video_texture_get_pipeline (video_texture);
++  playbin2 = clutter_gst_video_texture_get_playbin (video_texture);
+ 
+   g_message ("set subtitle: %s", uri);
+   g_object_set (playbin2, "suburi", uri, NULL);
diff -pruN 1.5.1-1/debian/patches/02_port_to_mx_1.0.2.patch 1.8.4-1/debian/patches/02_port_to_mx_1.0.2.patch
--- 1.5.1-1/debian/patches/02_port_to_mx_1.0.2.patch	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/debian/patches/02_port_to_mx_1.0.2.patch	2011-03-03 19:22:21.000000000 +0000
@@ -0,0 +1,625 @@
+Description: Port to mx 1.0.2
+ Debian are using mx 1.0.2. We port the hornsey to use mx 1.0.2.
+Author: Ying-Chun Liu (PaulLiu) <paulliu@debian.org>
+Last-Update: 2011-03-04
+Index: hornsey-1.8.4/src/hrn-queue-item.c
+===================================================================
+--- hornsey-1.8.4.orig/src/hrn-queue-item.c	2011-03-04 03:20:20.000000000 +0800
++++ hornsey-1.8.4/src/hrn-queue-item.c	2011-03-04 03:21:09.000000000 +0800
+@@ -155,7 +155,7 @@
+ 
+     self->priv = priv;
+ 
+-    priv->primary = mx_label_new ("");
++    priv->primary = mx_label_new_with_text ("");
+     clutter_actor_set_name (priv->primary, "hrn-queue-item-primary");
+     mx_table_add_actor_with_properties (MX_TABLE (self),
+                                         priv->primary, 0, 0,
+@@ -163,10 +163,10 @@
+                                         "x-fill", FALSE,
+                                         "y-expand", FALSE,
+                                         "y-fill", FALSE,
+-                                        "x-align", 0.0,
++                                        "x-align", MX_ALIGN_START,
+                                         NULL);
+ 
+-    priv->secondary = mx_label_new ("");
++    priv->secondary = mx_label_new_with_text ("");
+     clutter_actor_set_name (priv->secondary, "hrn-queue-item-secondary");
+     mx_table_add_actor_with_properties (MX_TABLE (self),
+                                         priv->secondary, 1, 0,
+@@ -174,7 +174,7 @@
+                                         "x-fill", FALSE,
+                                         "y-expand", FALSE,
+                                         "y-fill", FALSE,
+-                                        "x-align", 0.0,
++                                        "x-align", MX_ALIGN_START,
+                                         NULL);
+ }
+ 
+Index: hornsey-1.8.4/src/hrn-queue-header.c
+===================================================================
+--- hornsey-1.8.4.orig/src/hrn-queue-header.c	2011-03-04 03:20:20.000000000 +0800
++++ hornsey-1.8.4/src/hrn-queue-header.c	2011-03-04 03:21:09.000000000 +0800
+@@ -164,7 +164,7 @@
+ {
+     HrnQueueHeaderPrivate *priv = header->priv;
+     MxSlider *slider = MX_SLIDER (object);
+-    gdouble progress = mx_slider_get_progress (slider);
++    gdouble progress = mx_slider_get_value (slider);
+ 
+     if (!priv->playback_set_progress)
+       g_signal_emit (header, signals[PROGRESS], 0, progress);
+@@ -184,7 +184,7 @@
+ 
+     table = mx_table_new ();
+     mx_table_set_row_spacing (MX_TABLE (table), 6);
+-    mx_table_set_col_spacing (MX_TABLE (table), 6);
++    mx_table_set_column_spacing (MX_TABLE (table), 6);
+ 
+     clutter_container_add_actor ((ClutterContainer *) self, table);
+ 
+@@ -196,32 +196,32 @@
+                                         0, 0,
+                                         "x-fill", FALSE,
+                                         "x-expand", FALSE,
+-                                        "x-align", 0.5,
++                                        "x-align", MX_ALIGN_MIDDLE,
+                                         "y-fill", FALSE,
+                                         "y-expand", FALSE,
+-                                        "y-align", 0.5,
++                                        "y-align", MX_ALIGN_MIDDLE,
+                                         NULL);
+ 
+     label_box = mx_box_layout_new ();
+-    mx_box_layout_set_vertical ((MxBoxLayout *) label_box, TRUE);
++    mx_box_layout_set_orientation ((MxBoxLayout *) label_box, MX_ORIENTATION_VERTICAL);
+     mx_box_layout_set_spacing ((MxBoxLayout *) label_box, 2);
+     mx_table_add_actor_with_properties (MX_TABLE (table),
+                                         label_box,
+                                         0, 1,
+                                         "x-fill", TRUE,
+                                         "x-expand", TRUE,
+-                                        "x-align", 0.0,
++                                        "x-align", MX_ALIGN_START,
+                                         "y-fill", TRUE,
+                                         "y-expand", TRUE,
+-                                        "y-align", 0.5,
++                                        "y-align", MX_ALIGN_MIDDLE,
+                                         NULL);
+ 
+-    priv->primary = mx_label_new ("");
++    priv->primary = mx_label_new_with_text ("");
+     clutter_actor_set_name (priv->primary, "hrn-queue-header-label");
+     clutter_container_add_actor ((ClutterContainer *) label_box,
+                                  priv->primary);
+ 
+-    priv->secondary = mx_label_new ("");
++    priv->secondary = mx_label_new_with_text ("");
+     clutter_actor_set_name (priv->secondary, "hrn-queue-header-meta-label");
+     clutter_container_add_actor ((ClutterContainer *) label_box,
+                                  priv->secondary);
+@@ -247,7 +247,7 @@
+                                         "x-expand", FALSE,
+                                         "y-fill", FALSE,
+                                         "y-expand", FALSE,
+-                                        "y-align", 0.5,
++                                        "y-align", MX_ALIGN_MIDDLE,
+                                         NULL);
+     g_signal_connect (priv->expand, "clicked",
+                       G_CALLBACK (expand_clicked_cb), self);
+@@ -260,7 +260,7 @@
+                                         "x-expand", TRUE,
+                                         "y-fill", FALSE,
+                                         "y-expand", FALSE,
+-                                        "col-span", 4,
++                                        "column-span", 4,
+                                         NULL);
+     priv->progress_id = g_signal_connect (priv->timebar, "notify::progress",
+                                           G_CALLBACK (progress_notify), self);
+@@ -295,7 +295,7 @@
+     HrnQueueHeaderPrivate *priv = header->priv;
+ 
+     priv->playback_set_progress = TRUE;
+-    mx_slider_set_progress (MX_SLIDER (priv->timebar), progress);
++    mx_slider_set_value (MX_SLIDER (priv->timebar), progress);
+ }
+ 
+ void
+Index: hornsey-1.8.4/src/hrn-sidebar-item.c
+===================================================================
+--- hornsey-1.8.4.orig/src/hrn-sidebar-item.c	2011-03-04 03:20:20.000000000 +0800
++++ hornsey-1.8.4/src/hrn-sidebar-item.c	2011-03-04 03:21:09.000000000 +0800
+@@ -59,7 +59,7 @@
+ select_subitem_cb (ClutterActor *actor,
+                    gpointer      data)
+ {
+-    mx_button_set_checked ((MxButton *) actor,
++    mx_button_set_toggled ((MxButton *) actor,
+                              actor == (ClutterActor *) data);
+ }
+ 
+@@ -380,17 +380,17 @@
+     title_table = mx_table_new ();
+     mx_table_add_actor_with_properties (MX_TABLE (self),
+                                           (ClutterActor *) title_table, 0, 0,
+-                                          "x-align", 0.0,
+-                                          "y-align", 0.0,
++                                          "x-align", MX_ALIGN_START,
++                                          "y-align", MX_ALIGN_START,
+                                           "y-fill", FALSE,
+                                           "y-expand", FALSE,
+                                           NULL);
+ 
+-    priv->title = mx_label_new ("");
++    priv->title = mx_label_new_with_text ("");
+     clutter_actor_set_name (priv->title, "hrn-sidebar-item-title");
+     mx_table_add_actor_with_properties (MX_TABLE (title_table),
+                                         priv->title, 0, 0,
+-                                        "x-align", 0.0,
++                                        "x-align", MX_ALIGN_START,
+                                         "x-fill", FALSE,
+                                         "x-expand", TRUE,
+                                         NULL);
+@@ -408,13 +408,13 @@
+     clutter_actor_hide (priv->spinner);
+ 
+     priv->child_box = mx_box_layout_new ();
+-    mx_box_layout_set_vertical (MX_BOX_LAYOUT (priv->child_box), TRUE);
++    mx_box_layout_set_orientation (MX_BOX_LAYOUT (priv->child_box), MX_ORIENTATION_VERTICAL);
+     mx_table_add_actor_with_properties (MX_TABLE (self),
+                                           (ClutterActor *) priv->child_box,
+                                           1, 0,
+                                           "x-expand", TRUE,
+                                           "x-fill", TRUE,
+-                                          "y-align", 0.0,
++                                          "y-align", MX_ALIGN_START,
+                                           "y-fill", FALSE,
+                                           "y-expand", FALSE,
+                                           NULL);
+@@ -464,7 +464,7 @@
+ unselect_subitems (ClutterActor *actor,
+                    gpointer      data)
+ {
+-    mx_button_set_checked ((MxButton *) actor, FALSE);
++    mx_button_set_toggled ((MxButton *) actor, FALSE);
+ }
+ 
+ void
+@@ -493,5 +493,5 @@
+         return;
+     }
+ 
+-    mx_button_set_checked ((MxButton *) children->data, TRUE);
++    mx_button_set_toggled ((MxButton *) children->data, TRUE);
+ }
+Index: hornsey-1.8.4/src/hrn-cluster.c
+===================================================================
+--- hornsey-1.8.4.orig/src/hrn-cluster.c	2011-03-04 03:20:20.000000000 +0800
++++ hornsey-1.8.4/src/hrn-cluster.c	2011-03-04 03:21:09.000000000 +0800
+@@ -1040,7 +1040,7 @@
+                       G_CALLBACK (thumbnail_clicked_cb), self);
+ #endif
+ 
+-    priv->primary = mx_label_new ("");
++    priv->primary = mx_label_new_with_text ("");
+     clutter_actor_set_name (priv->primary, "hrn-tileable-primary");
+     clutter_actor_set_reactive ((ClutterActor *) priv->primary, TRUE);
+     g_signal_connect (priv->primary, "button-release-event",
+@@ -1055,10 +1055,10 @@
+                                           "x-fill", FALSE,
+                                           "y-expand", FALSE,
+                                           "y-fill", FALSE,
+-                                          "x-align", 0.0,
++                                          "x-align", MX_ALIGN_START,
+                                           NULL);
+ 
+-    priv->secondary = mx_label_new ("");
++    priv->secondary = mx_label_new_with_text ("");
+     clutter_actor_set_name (priv->secondary, "hrn-tileable-secondary");
+     clutter_actor_set_reactive (priv->secondary, TRUE);
+     g_signal_connect (priv->secondary, "button-release-event",
+@@ -1074,7 +1074,7 @@
+                                           "x-fill", FALSE,
+                                           "y-expand", FALSE,
+                                           "y-fill", FALSE,
+-                                          "x-align", 0.0,
++                                          "x-align", MX_ALIGN_START,
+                                           NULL);
+ 
+     if (priv->expanded) {
+Index: hornsey-1.8.4/src/hrn-controls.c
+===================================================================
+--- hornsey-1.8.4.orig/src/hrn-controls.c	2011-03-04 03:20:20.000000000 +0800
++++ hornsey-1.8.4/src/hrn-controls.c	2011-03-04 03:21:09.000000000 +0800
+@@ -192,7 +192,7 @@
+     double position;
+     char *dstr;
+ 
+-    position = mx_slider_get_progress (slider);
++    position = mx_slider_get_value (slider);
+     dstr = nanosecs_to_time (priv->duration * position);
+     mx_label_set_text ((MxLabel *) priv->time, dstr);
+     g_free (dstr);
+@@ -231,8 +231,8 @@
+   mx_table_add_actor_with_properties (MX_TABLE (priv->header),
+                                       priv->playpause, 0, 0,
+                                       "row-span", 2,
+-                                      "x-align", 0.0,
+-                                      "y-align", 0.0,
++                                      "x-align", MX_ALIGN_START,
++                                      "y-align", MX_ALIGN_START,
+                                       "x-fill", FALSE,
+                                       "x-expand", FALSE,
+                                       NULL);
+@@ -245,8 +245,8 @@
+   mx_table_add_actor_with_properties (MX_TABLE (priv->header),
+                                       priv->back, 0, 1,
+                                       "row-span", 2,
+-                                      "x-align", 0.0,
+-                                      "y-align", 0.0,
++                                      "x-align", MX_ALIGN_START,
++                                      "y-align", MX_ALIGN_START,
+                                       "x-fill", FALSE,
+                                       "x-expand", FALSE,
+                                       NULL);
+@@ -258,40 +258,40 @@
+   mx_table_add_actor_with_properties (MX_TABLE (priv->header),
+                                       priv->next, 0, 2,
+                                       "row-span", 2,
+-                                      "x-align", 0.0,
+-                                      "y-align", 0.0,
++                                      "x-align", MX_ALIGN_START,
++                                      "y-align", MX_ALIGN_START,
+                                       "x-fill", FALSE,
+                                       "x-expand", FALSE,
+                                       NULL);
+ 
+-  priv->title = mx_label_new ("");
++  priv->title = mx_label_new_with_text ("");
+   mx_table_add_actor_with_properties (MX_TABLE (priv->header),
+                                       priv->title,
+                                       0, 3,
+-                                      "x-align", 0.0,
+-                                      "y-align", 0.5,
++                                      "x-align", MX_ALIGN_START,
++                                      "y-align", MX_ALIGN_MIDDLE,
+                                       "x-fill", TRUE,
+                                       "x-expand", TRUE,
+                                       "y-fill", FALSE,
+                                       NULL);
+ 
+   priv->progress_table = mx_table_new ();
+-  mx_table_set_col_spacing (MX_TABLE (priv->progress_table), 8);
++  mx_table_set_column_spacing (MX_TABLE (priv->progress_table), 8);
+   mx_table_add_actor_with_properties (MX_TABLE (priv->header),
+                                       priv->progress_table,
+                                       1, 3,
+-                                      "x-align", 0.0,
+-                                      "y-align", 0.5,
++                                      "x-align", MX_ALIGN_START,
++                                      "y-align", MX_ALIGN_MIDDLE,
+                                       "x-fill", TRUE,
+                                       "x-expand", TRUE,
+                                       "y-fill", FALSE,
+                                       NULL);
+ 
+-  priv->time = mx_label_new ("0:00.00");
++  priv->time = mx_label_new_with_text ("0:00.00");
+   mx_table_add_actor_with_properties (MX_TABLE (priv->progress_table),
+                                       priv->time, 0, 0,
+-                                      "x-align", 0.0,
+-                                      "y-align", 0.5,
++                                      "x-align", MX_ALIGN_START,
++                                      "y-align", MX_ALIGN_MIDDLE,
+                                       "x-fill", FALSE,
+                                       "x-expand", FALSE,
+                                       "y-fill", FALSE,
+@@ -301,7 +301,7 @@
+   priv->timebar = mx_slider_new ();
+   mx_table_add_actor_with_properties (MX_TABLE (priv->progress_table),
+                                       priv->timebar, 0, 1,
+-                                      "y-align", 0.5,
++                                      "y-align", MX_ALIGN_MIDDLE,
+                                       "y-fill", FALSE,
+                                       "x-expand", TRUE,
+                                       "x-fill", TRUE,
+@@ -313,11 +313,11 @@
+                       G_CALLBACK (visual_progress_notify),
+                       controls);
+ 
+-  priv->length = mx_label_new ("00:00.00");
++  priv->length = mx_label_new_with_text ("00:00.00");
+   mx_table_add_actor_with_properties (MX_TABLE (priv->progress_table),
+                                         CLUTTER_ACTOR (priv->length), 0, 2,
+-                                        "x-align", 0.0,
+-                                        "y-align", 0.5,
++                                        "x-align", MX_ALIGN_START,
++                                        "y-align", MX_ALIGN_MIDDLE,
+                                         "x-fill", FALSE,
+                                         "x-expand", FALSE,
+                                         "y-fill", FALSE,
+@@ -384,7 +384,7 @@
+     HrnControlsPrivate *priv = controls->priv;
+ 
+     priv->ignore_position_change = TRUE;
+-    mx_slider_set_progress (MX_SLIDER (priv->timebar), position);
++    mx_slider_set_value (MX_SLIDER (priv->timebar), position);
+ }
+ 
+ void
+Index: hornsey-1.8.4/src/hrn-tile-frame.c
+===================================================================
+--- hornsey-1.8.4.orig/src/hrn-tile-frame.c	2011-03-04 03:20:20.000000000 +0800
++++ hornsey-1.8.4/src/hrn-tile-frame.c	2011-03-04 03:21:09.000000000 +0800
+@@ -275,7 +275,7 @@
+     clutter_container_add_actor ((ClutterContainer *) priv->overlay_group,
+                                  priv->overlay);
+ 
+-    priv->label = (ClutterActor*) mx_label_new ("");
++    priv->label = (ClutterActor*) mx_label_new_with_text ("");
+     clutter_actor_set_name (priv->label, "tile-overlay-label");
+ 
+ #if 0
+Index: hornsey-1.8.4/src/hrn-tile.c
+===================================================================
+--- hornsey-1.8.4.orig/src/hrn-tile.c	2011-03-04 03:20:20.000000000 +0800
++++ hornsey-1.8.4/src/hrn-tile.c	2011-03-04 03:21:09.000000000 +0800
+@@ -338,7 +338,7 @@
+ 
+     clutter_actor_set_size (CLUTTER_ACTOR (self), ITEM_WIDTH, ITEM_HEIGHT);
+ 
+-    priv->primary = mx_label_new ("");
++    priv->primary = mx_label_new_with_text ("");
+     mx_stylable_set_style_class (MX_STYLABLE (priv->primary),
+                                  "HrnTileablePrimary");
+     clutter_actor_set_reactive ((ClutterActor *) priv->primary, TRUE);
+@@ -354,10 +354,10 @@
+                                           "x-fill", FALSE,
+                                           "y-expand", FALSE,
+                                           "y-fill", FALSE,
+-                                          "x-align", 0.0,
++                                          "x-align", MX_ALIGN_START,
+                                           NULL);
+ 
+-    priv->secondary = mx_label_new ("");
++    priv->secondary = mx_label_new_with_text ("");
+     mx_stylable_set_style_class (MX_STYLABLE (priv->secondary),
+                                  "HrnTileableSecondary");
+     clutter_actor_set_reactive ((ClutterActor *) priv->secondary, TRUE);
+@@ -374,7 +374,7 @@
+                                           "x-fill", FALSE,
+                                           "y-expand", FALSE,
+                                           "y-fill", FALSE,
+-                                          "x-align", 0.0,
++                                          "x-align", MX_ALIGN_START,
+                                           NULL);
+ }
+ 
+Index: hornsey-1.8.4/src/hrn-up-tile.c
+===================================================================
+--- hornsey-1.8.4.orig/src/hrn-up-tile.c	2011-03-04 03:20:20.000000000 +0800
++++ hornsey-1.8.4/src/hrn-up-tile.c	2011-03-04 03:21:09.000000000 +0800
+@@ -160,7 +160,7 @@
+ 
+     clutter_actor_set_reactive ((ClutterActor *) self, TRUE);
+ 
+-    priv->thumbnail = (ClutterActor *) mx_label_new ("");
++    priv->thumbnail = (ClutterActor *) mx_label_new_with_text ("");
+     clutter_actor_set_size (priv->thumbnail, THUMBNAIL_WIDTH,
+                             THUMBNAIL_HEIGHT);
+     mx_table_add_actor (MX_TABLE (self), priv->thumbnail, 0, 0);
+Index: hornsey-1.8.4/src/hrn-view.c
+===================================================================
+--- hornsey-1.8.4.orig/src/hrn-view.c	2011-03-04 03:20:20.000000000 +0800
++++ hornsey-1.8.4/src/hrn-view.c	2011-03-04 03:21:09.000000000 +0800
+@@ -63,7 +63,7 @@
+ static void scrollable_get_adjustments (MxScrollable  *scrollable,
+                                         MxAdjustment **hadjustment,
+                                         MxAdjustment **vadjustment);
+-static void scrollable_interface_init (MxScrollableInterface *iface);
++static void scrollable_interface_init (MxScrollableIface *iface);
+ static void container_interface_init (ClutterContainerIface *iface);
+ static void tiler_interface_init (HrnTilerInterface *iface);
+ static void viewer_interface_init (HrnViewerInterface *iface);
+@@ -643,7 +643,7 @@
+ 
+             width = clutter_actor_get_width (actor);
+             increment = MAX (1.0, width);
+-            adj = mx_adjustment_new (0, 0, width, 1.0,
++            adj = mx_adjustment_new_with_values (0, 0, width, 1.0,
+                                        increment, increment);
+             scrollable_set_adjustments (scrollable, adj, priv->vadjustment);
+             *hadjustment = adj;
+@@ -659,7 +659,7 @@
+ 
+             height = clutter_actor_get_height (actor);
+             increment = MAX (1.0, height);
+-            adj = mx_adjustment_new (0, 0, height, 1.0,
++            adj = mx_adjustment_new_with_values (0, 0, height, 1.0,
+                                        increment, increment);
+             scrollable_set_adjustments (scrollable, priv->hadjustment, adj);
+             *vadjustment = adj;
+@@ -668,7 +668,7 @@
+ }
+ 
+ static void
+-scrollable_interface_init (MxScrollableInterface *iface)
++scrollable_interface_init (MxScrollableIface *iface)
+ {
+     iface->set_adjustments = scrollable_set_adjustments;
+     iface->get_adjustments = scrollable_get_adjustments;
+Index: hornsey-1.8.4/src/hrn-sidebar-subitem.c
+===================================================================
+--- hornsey-1.8.4.orig/src/hrn-sidebar-subitem.c	2011-03-04 03:20:20.000000000 +0800
++++ hornsey-1.8.4/src/hrn-sidebar-subitem.c	2011-03-04 03:21:09.000000000 +0800
+@@ -168,7 +168,7 @@
+ pin_clicked_cb (MxWidget *button, HrnSidebarSubitem *item)
+ {
+   g_signal_emit (item, signals[PINNED], 0,
+-                 mx_button_get_checked ((MxButton *) button));
++                 mx_button_get_toggled ((MxButton *) button));
+ }
+ 
+ static void
+@@ -351,7 +351,7 @@
+                                            event->button.x,
+                                            event->button.y,
+                                            &x, &y);
+-      mx_widget_show_popup (MX_WIDGET (actor), x, y);
++      mx_menu_show_with_position (MX_MENU(mx_widget_get_menu(MX_WIDGET (actor))), x, y);
+       return TRUE;
+     }
+ 
+@@ -369,7 +369,7 @@
+   priv       = self->priv;
+ 
+   clutter_actor_set_reactive (CLUTTER_ACTOR (self), TRUE);
+-  mx_button_set_toggle_mode ((MxButton *) self, TRUE);
++  mx_button_set_is_toggle ((MxButton *) self, TRUE);
+ 
+   box = mx_box_layout_new ();
+   mx_box_layout_set_spacing (MX_BOX_LAYOUT (box), 6);
+@@ -377,8 +377,8 @@
+ 
+   priv->pin = mx_button_new ();
+   clutter_actor_set_name (priv->pin, "hrn-sidebar-pin");
+-  mx_button_set_toggle_mode (MX_BUTTON (priv->pin), TRUE);
+-  mx_button_set_checked (MX_BUTTON (priv->pin), TRUE);
++  mx_button_set_is_toggle (MX_BUTTON (priv->pin), TRUE);
++  mx_button_set_toggled (MX_BUTTON (priv->pin), TRUE);
+   g_signal_connect (priv->pin, "clicked", G_CALLBACK (pin_clicked_cb), self);
+ 
+   priv->label = hrn_im_label_new ("");
+@@ -395,13 +395,13 @@
+                                "y-fill", FALSE,
+                                NULL);
+ 
+-  popup = mx_popup_new ();
++  popup = mx_menu_new ();
+   action = mx_action_new_full ("Rename",
+                                _("Rename"),
+                                G_CALLBACK (rename_cb),
+                                self);
+-  mx_popup_add_action (MX_POPUP (popup), action);
+-  mx_widget_set_popup (MX_WIDGET (self), MX_POPUP (popup));
++  mx_menu_add_action (MX_MENU (popup), action);
++  mx_widget_set_menu (MX_WIDGET (self), MX_MENU (popup));
+ }
+ 
+ HrnSidebarSubitem *
+Index: hornsey-1.8.4/src/hrn-queue.c
+===================================================================
+--- hornsey-1.8.4.orig/src/hrn-queue.c	2011-03-04 03:20:20.000000000 +0800
++++ hornsey-1.8.4/src/hrn-queue.c	2011-03-04 03:21:09.000000000 +0800
+@@ -426,7 +426,7 @@
+                                           G_TYPE_STRING, "uri");
+ 
+     layout = (ClutterActor *) mx_box_layout_new ();
+-    mx_box_layout_set_vertical ((MxBoxLayout *) layout, TRUE);
++    mx_box_layout_set_orientation ((MxBoxLayout *) layout, MX_ORIENTATION_VERTICAL);
+     clutter_container_add_actor ((ClutterContainer *) self, layout);
+ 
+     priv->header = g_object_new (HRN_TYPE_QUEUE_HEADER, NULL);
+Index: hornsey-1.8.4/src/hrn-searchbar.c
+===================================================================
+--- hornsey-1.8.4.orig/src/hrn-searchbar.c	2011-03-04 03:20:20.000000000 +0800
++++ hornsey-1.8.4/src/hrn-searchbar.c	2011-03-04 03:21:09.000000000 +0800
+@@ -148,7 +148,7 @@
+ {
+     const char *search;
+ 
+-    if (mx_button_get_checked (togglebutton) == FALSE) {
++    if (mx_button_get_toggled (togglebutton) == FALSE) {
+         g_signal_emit (search_bar, signals[SEARCH_PINNED], 0, FALSE);
+         return;
+     }
+@@ -156,7 +156,7 @@
+     search = mx_path_bar_get_text (MX_PATH_BAR (search_bar));
+     if (search == NULL || search[0] == '\0') {
+         g_print ("Unpinning here\n");
+-        mx_button_set_checked (togglebutton, FALSE);
++        mx_button_set_toggled (togglebutton, FALSE);
+         return;
+     }
+ 
+@@ -170,10 +170,10 @@
+   HrnSearchBarPrivate *priv = HRN_SEARCH_BAR_GET_PRIVATE (searchbar);
+ 
+   if (pinned) {
+-      mx_button_set_checked (MX_BUTTON (priv->pin_button), TRUE);
++      mx_button_set_toggled (MX_BUTTON (priv->pin_button), TRUE);
+   } else {
+-      if (mx_button_get_checked (MX_BUTTON (priv->pin_button))) {
+-          mx_button_set_checked (MX_BUTTON (priv->pin_button), FALSE);
++      if (mx_button_get_toggled (MX_BUTTON (priv->pin_button))) {
++          mx_button_set_toggled (MX_BUTTON (priv->pin_button), FALSE);
+     }
+   }
+ }
+@@ -195,7 +195,7 @@
+   priv->pin_button   = (void*) mx_button_new ();
+   priv->clear_button = (void*) mx_button_new ();
+ 
+-  mx_button_set_toggle_mode (MX_BUTTON (priv->pin_button), TRUE);
++  mx_button_set_is_toggle (MX_BUTTON (priv->pin_button), TRUE);
+   clutter_actor_set_name (CLUTTER_ACTOR (priv->pin_button),
+                           "fav-toggle");
+   clutter_actor_set_name (CLUTTER_ACTOR (priv->clear_button),
+Index: hornsey-1.8.4/src/hrn-spinner.c
+===================================================================
+--- hornsey-1.8.4.orig/src/hrn-spinner.c	2011-03-04 03:20:20.000000000 +0800
++++ hornsey-1.8.4/src/hrn-spinner.c	2011-03-04 03:21:09.000000000 +0800
+@@ -21,7 +21,7 @@
+     HrnSpinner *self = (HrnSpinner *) object;
+     HrnSpinnerPrivate *priv = self->priv;
+ 
+-    cogl_material_unref (priv->material);
++    cogl_handle_unref (priv->material);
+     cogl_handle_unref (priv->texture);
+ 
+     G_OBJECT_CLASS (hrn_spinner_parent_class)->finalize (object);
+Index: hornsey-1.8.4/src/hrn-square-clone.c
+===================================================================
+--- hornsey-1.8.4.orig/src/hrn-square-clone.c	2011-03-04 03:20:20.000000000 +0800
++++ hornsey-1.8.4/src/hrn-square-clone.c	2011-03-04 03:21:09.000000000 +0800
+@@ -134,7 +134,7 @@
+         return;
+     }
+ 
+-    cogl_material_unref (priv->material);
++    cogl_handle_unref (priv->material);
+     priv->material = COGL_INVALID_HANDLE;
+ 
+     CLUTTER_ACTOR_UNSET_FLAGS (self, CLUTTER_ACTOR_REALIZED);
+@@ -280,7 +280,7 @@
+     }
+ 
+     if (priv->material) {
+-        cogl_material_unref (priv->material);
++        cogl_handle_unref (priv->material);
+         priv->material = COGL_INVALID_HANDLE;
+     }
+ 
+Index: hornsey-1.8.4/src/hrn-texture-frame.c
+===================================================================
+--- hornsey-1.8.4.orig/src/hrn-texture-frame.c	2011-03-04 03:20:20.000000000 +0800
++++ hornsey-1.8.4/src/hrn-texture-frame.c	2011-03-04 03:21:09.000000000 +0800
+@@ -153,7 +153,7 @@
+   if (priv->material == COGL_INVALID_HANDLE)
+     return;
+ 
+-  cogl_material_unref (priv->material);
++  cogl_handle_unref (priv->material);
+   priv->material = COGL_INVALID_HANDLE;
+ 
+   CLUTTER_ACTOR_UNSET_FLAGS (self, CLUTTER_ACTOR_REALIZED);
+@@ -483,7 +483,7 @@
+ 
+   if (priv->material)
+     {
+-      cogl_material_unref (priv->material);
++      cogl_handle_unref (priv->material);
+       priv->material = COGL_INVALID_HANDLE;
+     }
+ 
diff -pruN 1.5.1-1/debian/patches/series 1.8.4-1/debian/patches/series
--- 1.5.1-1/debian/patches/series	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/debian/patches/series	2011-03-03 19:23:22.000000000 +0000
@@ -0,0 +1,3 @@
+01_add_missing_hrn-video-tile-frame.h.patch
+01_port_to_debian.patch
+02_port_to_mx_1.0.2.patch
diff -pruN 1.5.1-1/debian/source/format 1.8.4-1/debian/source/format
--- 1.5.1-1/debian/source/format	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/debian/source/format	2011-03-15 13:20:21.000000000 +0000
@@ -0,0 +1 @@
+3.0 (quilt)
diff -pruN 1.5.1-1/debian/watch 1.8.4-1/debian/watch
--- 1.5.1-1/debian/watch	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/debian/watch	2011-03-10 18:30:19.000000000 +0000
@@ -0,0 +1,4 @@
+version=3
+opts=dversionmangle=s/.git.*// \
+http://git.moblin.org/cgit.cgi/hornsey/refs/tags \
+         .*snapshot/hornsey-([\d\.]*).tar.gz
diff -pruN 1.5.1-1/.gitignore 1.8.4-1/.gitignore
--- 1.5.1-1/.gitignore	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/.gitignore	2010-02-17 17:26:44.000000000 +0000
@@ -6,6 +6,7 @@
 *~
 .deps
 .libs
+INSTALL
 Makefile
 Makefile.in
 TAGS
diff -pruN 1.5.1-1/INSTALL 1.8.4-1/INSTALL
--- 1.5.1-1/INSTALL	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/INSTALL	1970-01-01 01:00:00.000000000 +0100
@@ -1,237 +0,0 @@
-Installation Instructions
-*************************
-
-Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005,
-2006, 2007 Free Software Foundation, Inc.
-
-This file is free documentation; the Free Software Foundation gives
-unlimited permission to copy, distribute and modify it.
-
-Basic Installation
-==================
-
-Briefly, the shell commands `./configure; make; make install' should
-configure, build, and install this package.  The following
-more-detailed instructions are generic; see the `README' file for
-instructions specific to this package.
-
-   The `configure' shell script attempts to guess correct values for
-various system-dependent variables used during compilation.  It uses
-those values to create a `Makefile' in each directory of the package.
-It may also create one or more `.h' files containing system-dependent
-definitions.  Finally, it creates a shell script `config.status' that
-you can run in the future to recreate the current configuration, and a
-file `config.log' containing compiler output (useful mainly for
-debugging `configure').
-
-   It can also use an optional file (typically called `config.cache'
-and enabled with `--cache-file=config.cache' or simply `-C') that saves
-the results of its tests to speed up reconfiguring.  Caching is
-disabled by default to prevent problems with accidental use of stale
-cache files.
-
-   If you need to do unusual things to compile the package, please try
-to figure out how `configure' could check whether to do them, and mail
-diffs or instructions to the address given in the `README' so they can
-be considered for the next release.  If you are using the cache, and at
-some point `config.cache' contains results you don't want to keep, you
-may remove or edit it.
-
-   The file `configure.ac' (or `configure.in') is used to create
-`configure' by a program called `autoconf'.  You need `configure.ac' if
-you want to change it or regenerate `configure' using a newer version
-of `autoconf'.
-
-The simplest way to compile this package is:
-
-  1. `cd' to the directory containing the package's source code and type
-     `./configure' to configure the package for your system.
-
-     Running `configure' might take a while.  While running, it prints
-     some messages telling which features it is checking for.
-
-  2. Type `make' to compile the package.
-
-  3. Optionally, type `make check' to run any self-tests that come with
-     the package.
-
-  4. Type `make install' to install the programs and any data files and
-     documentation.
-
-  5. You can remove the program binaries and object files from the
-     source code directory by typing `make clean'.  To also remove the
-     files that `configure' created (so you can compile the package for
-     a different kind of computer), type `make distclean'.  There is
-     also a `make maintainer-clean' target, but that is intended mainly
-     for the package's developers.  If you use it, you may have to get
-     all sorts of other programs in order to regenerate files that came
-     with the distribution.
-
-  6. Often, you can also type `make uninstall' to remove the installed
-     files again.
-
-Compilers and Options
-=====================
-
-Some systems require unusual options for compilation or linking that the
-`configure' script does not know about.  Run `./configure --help' for
-details on some of the pertinent environment variables.
-
-   You can give `configure' initial values for configuration parameters
-by setting variables in the command line or in the environment.  Here
-is an example:
-
-     ./configure CC=c99 CFLAGS=-g LIBS=-lposix
-
-   *Note Defining Variables::, for more details.
-
-Compiling For Multiple Architectures
-====================================
-
-You can compile the package for more than one kind of computer at the
-same time, by placing the object files for each architecture in their
-own directory.  To do this, you can use GNU `make'.  `cd' to the
-directory where you want the object files and executables to go and run
-the `configure' script.  `configure' automatically checks for the
-source code in the directory that `configure' is in and in `..'.
-
-   With a non-GNU `make', it is safer to compile the package for one
-architecture at a time in the source code directory.  After you have
-installed the package for one architecture, use `make distclean' before
-reconfiguring for another architecture.
-
-Installation Names
-==================
-
-By default, `make install' installs the package's commands under
-`/usr/local/bin', include files under `/usr/local/include', etc.  You
-can specify an installation prefix other than `/usr/local' by giving
-`configure' the option `--prefix=PREFIX'.
-
-   You can specify separate installation prefixes for
-architecture-specific files and architecture-independent files.  If you
-pass the option `--exec-prefix=PREFIX' to `configure', the package uses
-PREFIX as the prefix for installing programs and libraries.
-Documentation and other data files still use the regular prefix.
-
-   In addition, if you use an unusual directory layout you can give
-options like `--bindir=DIR' to specify different values for particular
-kinds of files.  Run `configure --help' for a list of the directories
-you can set and what kinds of files go in them.
-
-   If the package supports it, you can cause programs to be installed
-with an extra prefix or suffix on their names by giving `configure' the
-option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
-
-Optional Features
-=================
-
-Some packages pay attention to `--enable-FEATURE' options to
-`configure', where FEATURE indicates an optional part of the package.
-They may also pay attention to `--with-PACKAGE' options, where PACKAGE
-is something like `gnu-as' or `x' (for the X Window System).  The
-`README' should mention any `--enable-' and `--with-' options that the
-package recognizes.
-
-   For packages that use the X Window System, `configure' can usually
-find the X include and library files automatically, but if it doesn't,
-you can use the `configure' options `--x-includes=DIR' and
-`--x-libraries=DIR' to specify their locations.
-
-Specifying the System Type
-==========================
-
-There may be some features `configure' cannot figure out automatically,
-but needs to determine by the type of machine the package will run on.
-Usually, assuming the package is built to be run on the _same_
-architectures, `configure' can figure that out, but if it prints a
-message saying it cannot guess the machine type, give it the
-`--build=TYPE' option.  TYPE can either be a short name for the system
-type, such as `sun4', or a canonical name which has the form:
-
-     CPU-COMPANY-SYSTEM
-
-where SYSTEM can have one of these forms:
-
-     OS KERNEL-OS
-
-   See the file `config.sub' for the possible values of each field.  If
-`config.sub' isn't included in this package, then this package doesn't
-need to know the machine type.
-
-   If you are _building_ compiler tools for cross-compiling, you should
-use the option `--target=TYPE' to select the type of system they will
-produce code for.
-
-   If you want to _use_ a cross compiler, that generates code for a
-platform different from the build platform, you should specify the
-"host" platform (i.e., that on which the generated programs will
-eventually be run) with `--host=TYPE'.
-
-Sharing Defaults
-================
-
-If you want to set default values for `configure' scripts to share, you
-can create a site shell script called `config.site' that gives default
-values for variables like `CC', `cache_file', and `prefix'.
-`configure' looks for `PREFIX/share/config.site' if it exists, then
-`PREFIX/etc/config.site' if it exists.  Or, you can set the
-`CONFIG_SITE' environment variable to the location of the site script.
-A warning: not all `configure' scripts look for a site script.
-
-Defining Variables
-==================
-
-Variables not defined in a site shell script can be set in the
-environment passed to `configure'.  However, some packages may run
-configure again during the build, and the customized values of these
-variables may be lost.  In order to avoid this problem, you should set
-them in the `configure' command line, using `VAR=value'.  For example:
-
-     ./configure CC=/usr/local2/bin/gcc
-
-causes the specified `gcc' to be used as the C compiler (unless it is
-overridden in the site shell script).
-
-Unfortunately, this technique does not work for `CONFIG_SHELL' due to
-an Autoconf bug.  Until the bug is fixed you can use this workaround:
-
-     CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash
-
-`configure' Invocation
-======================
-
-`configure' recognizes the following options to control how it operates.
-
-`--help'
-`-h'
-     Print a summary of the options to `configure', and exit.
-
-`--version'
-`-V'
-     Print the version of Autoconf used to generate the `configure'
-     script, and exit.
-
-`--cache-file=FILE'
-     Enable the cache: use and save the results of the tests in FILE,
-     traditionally `config.cache'.  FILE defaults to `/dev/null' to
-     disable caching.
-
-`--config-cache'
-`-C'
-     Alias for `--cache-file=config.cache'.
-
-`--quiet'
-`--silent'
-`-q'
-     Do not print messages saying which checks are being made.  To
-     suppress all normal output, redirect it to `/dev/null' (any error
-     messages will still be shown).
-
-`--srcdir=DIR'
-     Look for the package's source code in directory DIR.  Usually
-     `configure' can determine that directory automatically.
-
-`configure' also accepts some other, not widely useful, options.  Run
-`configure --help' for more details.
-
diff -pruN 1.5.1-1/.pc/01_port_to_debian.patch/configure.ac 1.8.4-1/.pc/01_port_to_debian.patch/configure.ac
--- 1.5.1-1/.pc/01_port_to_debian.patch/configure.ac	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/.pc/01_port_to_debian.patch/configure.ac	2010-02-17 17:26:44.000000000 +0000
@@ -0,0 +1,125 @@
+m4_define([hrn_version_major], [1])
+m4_define([hrn_version_minor], [8])
+m4_define([hrn_version_micro], [4])
+
+m4_define([hrn_version],
+          [hrn_version_major.hrn_version_minor.hrn_version_micro])
+
+AC_PREREQ(2.53)
+AC_INIT(hornsey, [hrn_version], [The moblin media player])
+AM_INIT_AUTOMAKE([foreign no-define -Wno-portability])
+AC_CONFIG_MACRO_DIR([autotools])
+AC_CONFIG_SRCDIR(src/hornsey.c)
+AM_CONFIG_HEADER(config.h)
+
+GETTEXT_PACKAGE=hornsey
+AC_SUBST(GETTEXT_PACKAGE)
+AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", [The gettext package name])
+
+AM_GLIB_GNU_GETTEXT
+
+localedir='${prefix}/${DATADIRNAME}/locale'
+AC_SUBST(localedir)
+
+AC_ISC_POSIX
+AC_PROG_CC
+AC_STDC_HEADERS
+
+DEPS_PACKAGES="clutter-1.0 clutter-imcontext-0.1 clutter-gtk-0.10 mx-1.0 bognor-regis-0.6 >= 0.6.0 unique-1.0 >= 1.0.6 libstartup-notification-1.0 >= 0.9 libnotify xtst gtk+-2.0 tracker-client-0.7"
+AC_PATH_PROG(GLIB_GENMARSHAL, glib-genmarshal)
+
+SHAVE_INIT([autotools], [enable])
+
+AC_PATH_PROG(DBUSBINDINGTOOL, dbus-binding-tool)
+DBUS_SERVICES_DIR="${datadir}/dbus-1/services"
+AC_SUBST(DBUS_SERVICES_DIR)
+
+dnl === Some compiler flags === ===============================================
+
+AS_COMPILER_FLAGS([HRN_CFLAGS], ["-Wall"])
+AC_SUBST([HRN_CFLAGS])
+
+dnl === Helix/GStreamer support ===============================================
+
+AC_ARG_ENABLE(helix, AC_HELP_STRING([--enable-helix],[Use Helix as meida frameword]), use_helix="yes", use_helix="no")
+if test "x$use_helix" = "xyes"; then
+  echo "xx:$DEPS_PACKAGES"
+  DEPS_PACKAGES="${DEPS_PACKAGES} clutter-helix-1.0"
+  AC_DEFINE(USE_HELIX,1,[Define if we want to use Helix])
+else
+  DEPS_PACKAGES="${DEPS_PACKAGES} clutter-gst-1.0"
+fi
+
+ PKG_CHECK_MODULES(DEPS, "$DEPS_PACKAGES")
+AC_SUBST(DEPS_CFLAGS)
+AC_SUBST(DEPS_LIBS)
+
+dnl === Enable debug level ====================================================
+
+m4_define([debug_default], [yes])
+AC_ARG_ENABLE([debug],
+              [AC_HELP_STRING([--enable-debug=@<:@no/minimum/yes@:>@],
+                              [Control Hornsey debugging level @<:@default=debug_default@:>@])],
+              [],
+              [enable_debug=debug_default])
+
+AS_CASE([$enable_debug],
+
+        [yes],
+        [
+          test "$cflags_set" = set || CFLAGS="$CFLAGS -g"
+          HRN_DEBUG_CFLAGS="-DHRN_ENABLE_DEBUG"
+        ],
+
+        [minimum],
+        [HRN_DEBUG_CFLAGS="-DHRN_ENABLE_DEBUG -DG_DISABLE_CAST_CHECKS"],
+
+        [no],
+        [HRN_DEBUG_CFLAGS="-DG_DISABLE_ASSERT -DG_DISABLE_CHECKS -DG_DISABLE_CAST_CHECKS"],
+
+        [AC_MSG_ERROR([Unknown argument for --enable-debug])]
+)
+
+AC_SUBST(HRN_DEBUG_CFLAGS)
+
+dnl === Enable window mode ====================================================
+
+AC_ARG_ENABLE(windowmode, AC_HELP_STRING([--enable-windowmode],[Enable window mode to not have hornsey fullscreen]), enable_windowmode="$enableval", enable_windowmode=no)
+if test "x$enable_windowmode" = "xyes"; then
+  AC_DEFINE(HAVE_WINDOWMODE,1,[Define if we want window mode])
+fi
+
+dnl === i18n =================================================================
+
+IT_PROG_INTLTOOL([0.35.0])
+AS_ALL_LINGUAS
+
+AC_OUTPUT([
+Makefile
+autotools/Makefile
+autotools/shave
+src/Makefile
+data/Makefile
+po/Makefile.in
+])
+
+echo ""
+echo "                    Hornsey $VERSION"
+echo "                 ==================="
+echo ""
+echo "                   prefix:   ${prefix}"
+echo "           Compiler flags:   ${HRN_CFLAGS}"
+echo ""
+if test "x$use_helix" = "xyes"; then
+echo "            Video backend:   Helix"
+else
+echo "            Video backend:   GStreamer"
+fi
+if test "x$enable_windowmode" = "xyes"; then
+echo "         Start fullscreen:   no"
+else
+echo "         Start fullscreen:   yes"
+fi
+echo ""
+echo "                    Debug:   ${enable_debug}"
+echo ""
diff -pruN 1.5.1-1/.pc/01_port_to_debian.patch/src/hrn-tracker-client.c 1.8.4-1/.pc/01_port_to_debian.patch/src/hrn-tracker-client.c
--- 1.5.1-1/.pc/01_port_to_debian.patch/src/hrn-tracker-client.c	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/.pc/01_port_to_debian.patch/src/hrn-tracker-client.c	2010-02-17 17:26:44.000000000 +0000
@@ -0,0 +1,370 @@
+#include <string.h>
+#include <libtracker-client/tracker.h>
+
+#include "hrn-tracker-client.h"
+
+enum {
+    PROP_0,
+};
+
+enum {
+    READY,
+    LAST_SIGNAL,
+};
+
+struct _HrnTrackerClientPrivate {
+    DBusGConnection *connection;
+    DBusGProxy *music_proxy;
+    DBusGProxy *photo_proxy;
+    DBusGProxy *video_proxy;
+    TrackerClient *client;
+
+    HrnClusterTree *items;
+
+    gboolean ready;
+};
+
+#define GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), HRN_TYPE_TRACKER_CLIENT, HrnTrackerClientPrivate))
+G_DEFINE_TYPE (HrnTrackerClient, hrn_tracker_client, G_TYPE_OBJECT);
+static guint32 signals[LAST_SIGNAL] = {0,};
+
+#define URI 0
+#define MIMETYPE 1
+#define DATE 2
+#define TITLE 3
+#define ARTIST_NAME 4
+#define ALBUM_TITLE 5
+#define TRACK 6
+#define SEASON 7
+#define EPISODE 8
+#define TRACKER_QUERY "SELECT nie:url(?uri) nie:mimeType(?uri) nie:contentCreated(?uri) nie:title(?uri) nmm:artistName(nmm:performer(?uri)) nmm:albumTitle(nmm:musicAlbum(?uri)) nmm:trackNumber(?uri) nmm:season(?uri) nmm:episodeNumber(?uri) " \
+    "WHERE { "                                                          \
+    "  { "                                                              \
+    "    ?uri a nmm:MusicPiece. "                                       \
+    "  } "                                                              \
+    "  UNION "                                                          \
+    "  { "                                                              \
+    "    ?uri a nmm:Photo "                                             \
+    "  } "                                                              \
+    "  UNION "                                                          \
+    "  { "                                                              \
+    "    ?uri a nmm:Video "                                             \
+    "  } "                                                              \
+    "}"
+
+#define ITEM_QUERY "SELECT nie:url(?uri) nie:mimeType(?uri) nie:contentCreated(?uri) nie:title(?uri) nmm:artistName(nmm:performer(?uri)) nmm:albumTitle(nmm:musicAlbum(?uri)) nmm:trackNumber(?uri) nmm:season(?uri) nmm:episodeNumber(?uri) " \
+    "WHERE { "
+
+static void
+hrn_tracker_client_finalize (GObject *object)
+{
+    G_OBJECT_CLASS (hrn_tracker_client_parent_class)->finalize (object);
+}
+
+static void
+hrn_tracker_client_dispose (GObject *object)
+{
+    HrnTrackerClient *self = (HrnTrackerClient *) object;
+    HrnTrackerClientPrivate *priv = self->priv;
+
+    if (priv->music_proxy) {
+        g_object_unref (priv->music_proxy);
+        priv->music_proxy = NULL;
+    }
+
+    if (priv->photo_proxy) {
+        g_object_unref (priv->photo_proxy);
+        priv->photo_proxy = NULL;
+    }
+
+    if (priv->video_proxy) {
+        g_object_unref (priv->video_proxy);
+        priv->video_proxy = NULL;
+    }
+
+    if (priv->client) {
+        g_object_unref (priv->client);
+        priv->client = NULL;
+    }
+
+    G_OBJECT_CLASS (hrn_tracker_client_parent_class)->dispose (object);
+}
+
+static void
+hrn_tracker_client_set_property (GObject      *object,
+                                 guint         prop_id,
+                                 const GValue *value,
+                                 GParamSpec   *pspec)
+{
+    switch (prop_id) {
+
+    default:
+        break;
+    }
+}
+
+static void
+hrn_tracker_client_get_property (GObject    *object,
+                                 guint       prop_id,
+                                 GValue     *value,
+                                 GParamSpec *pspec)
+{
+    switch (prop_id) {
+
+    default:
+        break;
+    }
+}
+
+static void
+hrn_tracker_client_class_init (HrnTrackerClientClass *klass)
+{
+    GObjectClass *o_class = (GObjectClass *) klass;
+
+    o_class->dispose = hrn_tracker_client_dispose;
+    o_class->finalize = hrn_tracker_client_finalize;
+    o_class->set_property = hrn_tracker_client_set_property;
+    o_class->get_property = hrn_tracker_client_get_property;
+
+    g_type_class_add_private (klass, sizeof (HrnTrackerClientPrivate));
+    signals[READY] = g_signal_new ("ready",
+                                   G_TYPE_FROM_CLASS (klass),
+                                   G_SIGNAL_RUN_FIRST |
+                                   G_SIGNAL_NO_RECURSE, 0, NULL, NULL,
+                                   g_cclosure_marshal_VOID__VOID,
+                                   G_TYPE_NONE, 0);
+}
+
+static void
+add_to_tree_and_free (gpointer value,
+                      gpointer userdata)
+{
+    HrnTrackerClient *client = (HrnTrackerClient *) userdata;
+    HrnTrackerClientPrivate *priv = client->priv;
+    HrnItem *item;
+    char **results = value;
+
+    if (strncmp (results[MIMETYPE], "audio", 5) == 0) {
+        item = hrn_item_new (HRN_ITEM_TYPE_AUDIO, results[URI],
+                             results[MIMETYPE]);
+        hrn_item_set_metadata (item, HRN_ITEM_METADATA_ARTIST,
+                               results[ARTIST_NAME]);
+        hrn_item_set_metadata (item, HRN_ITEM_METADATA_ALBUM,
+                               results[ALBUM_TITLE]);
+        hrn_item_set_metadata (item, HRN_ITEM_METADATA_TRACK,
+                               results[TRACK]);
+    } else if (strncmp (results[MIMETYPE], "image", 5) == 0) {
+        item = hrn_item_new (HRN_ITEM_TYPE_IMAGE, results[URI],
+                             results[MIMETYPE]);
+    } else if (strncmp (results[MIMETYPE], "video", 5) == 0) {
+        item = hrn_item_new (HRN_ITEM_TYPE_VIDEO, results[URI],
+                             results[MIMETYPE]);
+        hrn_item_set_metadata (item, HRN_ITEM_METADATA_SEASON,
+                               results[SEASON]);
+        hrn_item_set_metadata (item, HRN_ITEM_METADATA_EPISODE,
+                               results[EPISODE]);
+    } else {
+        g_strfreev (results);
+        return;
+    }
+
+    hrn_item_set_metadata (item, HRN_ITEM_METADATA_DATE, results[DATE]);
+    hrn_item_set_metadata (item, HRN_ITEM_METADATA_TITLE, results[TITLE]);
+
+    hrn_cluster_tree_add_item (priv->items, item);
+
+    g_strfreev (results);
+}
+
+GTimer *timer = NULL;
+
+static void
+query_tracker_async_reply (GPtrArray *results,
+                           GError    *error,
+                           gpointer   userdata)
+{
+    HrnTrackerClient *client = (HrnTrackerClient *) userdata;
+    HrnTrackerClientPrivate *priv = client->priv;
+    double elapsed = g_timer_elapsed (timer, NULL);
+    int count = results->len;
+
+    if (error) {
+        g_warning ("Could not get search results: %s", error->message);
+        g_error_free (error);
+        return;
+    }
+
+    if (results == NULL) {
+        return;
+    }
+
+    g_ptr_array_foreach (results, add_to_tree_and_free, client);
+    g_ptr_array_free (results, TRUE);
+
+    g_print ("Got %d results in %.3fs, processed in %.3fs\n",
+             count, elapsed, g_timer_elapsed (timer, NULL) - elapsed);
+    g_timer_destroy (timer);
+
+    priv->ready = TRUE;
+    g_signal_emit (client, signals[READY], 0);
+}
+
+static gboolean
+get_items_idle (gpointer data)
+{
+    HrnTrackerClient *client = (HrnTrackerClient *) data;
+    HrnTrackerClientPrivate *priv = client->priv;
+
+    timer = g_timer_new ();
+    tracker_resources_sparql_query_async (priv->client,
+                                          TRACKER_QUERY,
+                                          query_tracker_async_reply, client);
+    return FALSE;
+}
+
+static void
+query_item_async_reply (GPtrArray *results,
+                        GError    *error,
+                        gpointer   userdata)
+{
+    HrnTrackerClient *client = (HrnTrackerClient *) userdata;
+
+    if (error) {
+        g_warning ("Could not get search results: %s", error->message);
+        g_error_free (error);
+        return;
+    }
+
+    if (results == NULL) {
+        return;
+    }
+
+    g_ptr_array_foreach (results, add_to_tree_and_free, client);
+    g_ptr_array_free (results, TRUE);
+}
+
+static void
+subjects_added (DBusGProxy  *proxy,
+                const char **added,
+                gpointer     userdata)
+{
+    HrnTrackerClient *client = (HrnTrackerClient *) userdata;
+    HrnTrackerClientPrivate *priv = client->priv;
+    GString *query_builder;
+    int i;
+
+    query_builder = g_string_new (ITEM_QUERY);
+    g_string_append_printf (query_builder, "{ ?uri nie:url '%s' }", added[0]);
+    for (i = 1; added[i]; i++) {
+        g_string_append_printf (query_builder, " UNION { ?uri nie:url '%s' }",
+                                added[i]);
+    }
+    g_string_append (query_builder, "}");
+
+    tracker_resources_sparql_query_async (priv->client, query_builder->str,
+                                          query_item_async_reply, client);
+    g_string_free (query_builder, TRUE);
+}
+
+static void
+subjects_removed (DBusGProxy  *proxy,
+                  const char **removed,
+                  gpointer     userdata)
+{
+    HrnTrackerClient *client = (HrnTrackerClient *) userdata;
+    HrnTrackerClientPrivate *priv = client->priv;
+    int i;
+
+    for (i = 0; removed[i]; i++) {
+        hrn_cluster_tree_remove_uri (priv->items, removed[i]);
+    }
+}
+
+static void
+hrn_tracker_client_init (HrnTrackerClient *self)
+{
+    HrnTrackerClientPrivate *priv = GET_PRIVATE (self);
+    GError *error = NULL;
+
+    self->priv = priv;
+
+    priv->client = tracker_client_new (FALSE, G_MAXINT);
+    priv->items = hrn_cluster_tree_new ();
+
+    priv->connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
+    if (priv->connection == NULL) {
+        g_warning ("Error getting bus: %s", error->message);
+        g_error_free (error);
+
+        return;
+    }
+
+    priv->music_proxy = dbus_g_proxy_new_for_name (priv->connection,
+                                                     "org.freedesktop.Tracker1",
+                                                     "/org/freedesktop/Tracker1/Resources/Classes/nmm/MusicPiece",
+                                                     "org.freedesktop.Tracker1.Resources.Class");
+    dbus_g_proxy_add_signal (priv->music_proxy, "SubjectsAdded",
+                             G_TYPE_STRV, G_TYPE_INVALID);
+    dbus_g_proxy_connect_signal (priv->music_proxy, "SubjectsAdded",
+                                 G_CALLBACK (subjects_added), self, NULL);
+    dbus_g_proxy_add_signal (priv->music_proxy, "SubjectsRemoved",
+                             G_TYPE_STRV, G_TYPE_INVALID);
+    dbus_g_proxy_connect_signal (priv->music_proxy, "SubjectsRemoved",
+                                 G_CALLBACK (subjects_removed),
+                                 self, NULL);
+
+    priv->photo_proxy = dbus_g_proxy_new_for_name (priv->connection,
+                                                   "org.freedesktop.Tracker1",
+                                                   "/org/freedesktop/Tracker1/Resources/Classes/nmm/Photo",
+                                                   "org.freedesktop.Tracker1.Resources.Class");
+    dbus_g_proxy_add_signal (priv->photo_proxy, "SubjectsAdded",
+                             G_TYPE_STRV, G_TYPE_INVALID);
+    dbus_g_proxy_connect_signal (priv->photo_proxy, "SubjectsAdded",
+                                 G_CALLBACK (subjects_added), self, NULL);
+    dbus_g_proxy_add_signal (priv->photo_proxy, "SubjectsRemoved",
+                             G_TYPE_STRV, G_TYPE_INVALID);
+    dbus_g_proxy_connect_signal (priv->photo_proxy, "SubjectsRemoved",
+                                 G_CALLBACK (subjects_removed),
+                                 self, NULL);
+
+    priv->video_proxy = dbus_g_proxy_new_for_name (priv->connection,
+                                                   "org.freedesktop.Tracker1",
+                                                   "/org/freedesktop/Tracker1/Resources/Classes/nmm/Video",
+                                                   "org.freedesktop.Tracker1.Resources.Class");
+    dbus_g_proxy_add_signal (priv->video_proxy, "SubjectsAdded",
+                             G_TYPE_STRV, G_TYPE_INVALID);
+    dbus_g_proxy_connect_signal (priv->video_proxy, "SubjectsAdded",
+                                 G_CALLBACK (subjects_added), self, NULL);
+    dbus_g_proxy_add_signal (priv->video_proxy, "SubjectsRemoved",
+                             G_TYPE_STRV, G_TYPE_INVALID);
+    dbus_g_proxy_connect_signal (priv->video_proxy, "SubjectsRemoved",
+                                 G_CALLBACK (subjects_removed),
+                                 self, NULL);
+
+    g_idle_add (get_items_idle, self);
+}
+
+HrnClusterTree *
+hrn_tracker_client_get_tree (HrnTrackerClient *client)
+{
+    HrnTrackerClientPrivate *priv = client->priv;
+
+    return priv->items;
+}
+
+HrnItem *
+hrn_tracker_client_get_item_for_uri (HrnTrackerClient *client,
+                                     const char       *uri)
+{
+    HrnTrackerClientPrivate *priv = client->priv;
+
+    return hrn_cluster_tree_get_item_for_uri (priv->items, uri);
+}
+
+gboolean
+hrn_tracker_client_is_ready (HrnTrackerClient *client)
+{
+    HrnTrackerClientPrivate *priv = client->priv;
+
+    return priv->ready;
+}
diff -pruN 1.5.1-1/.pc/01_port_to_debian.patch/src/hrn-video-player.c 1.8.4-1/.pc/01_port_to_debian.patch/src/hrn-video-player.c
--- 1.5.1-1/.pc/01_port_to_debian.patch/src/hrn-video-player.c	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/.pc/01_port_to_debian.patch/src/hrn-video-player.c	2010-02-17 17:26:44.000000000 +0000
@@ -0,0 +1,537 @@
+/*
+ * Hornsey - Moblin Media Player.
+ * Copyright © 2009 Intel Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU Lesser General Public License,
+ * version 2.1, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "config.h"
+
+#include <string.h>
+
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <gio/gio.h>
+
+#ifdef USE_HELIX
+#include <clutter-helix/clutter-helix.h>
+#else
+#include <clutter-gst/clutter-gst.h>
+#endif
+
+#include <clutter/x11/clutter-x11.h>
+
+#include <X11/extensions/XTest.h>
+#include <X11/keysym.h>
+
+#include "hrn-iface-player.h"
+#include "hrn-video-player.h"
+#include "hrn.h" /* FIXME */
+
+enum
+{
+  PROP_0,
+};
+
+struct _HrnVideoPlayerPrivate
+{
+  ClutterActor *video_player;
+  double duration;
+  guint32 progress_id;
+  guint32 fake_id;
+  int keycode;
+};
+
+static void hrn_player_init (HrnIfacePlayerClass *iface);
+#define GET_PRIVATE(obj)  (G_TYPE_INSTANCE_GET_PRIVATE ((obj), \
+                                                        HRN_TYPE_VIDEO_PLAYER, \
+                                                        HrnVideoPlayerPrivate))
+G_DEFINE_TYPE_WITH_CODE (HrnVideoPlayer, hrn_video_player, CLUTTER_TYPE_ACTOR,
+                         G_IMPLEMENT_INTERFACE (HRN_TYPE_IFACE_PLAYER,
+                                                hrn_player_init));
+
+#define MINIMUM_TIMEOUT 60
+
+static void
+hrn_video_player_finalize (GObject *object)
+{
+  G_OBJECT_CLASS (hrn_video_player_parent_class)->finalize (object);
+}
+
+static void
+hrn_video_player_dispose (GObject *object)
+{
+  HrnVideoPlayer        *player = (HrnVideoPlayer *) object;
+  HrnVideoPlayerPrivate *priv   = player->priv;
+
+  if (priv->video_player)
+    {
+      g_signal_handler_disconnect (priv->video_player, priv->progress_id);
+      priv->progress_id = 0;
+
+      clutter_media_set_playing ((ClutterMedia *) priv->video_player, FALSE);
+      clutter_actor_destroy (priv->video_player);
+      priv->video_player = NULL;
+    }
+
+  if (priv->fake_id > 0) {
+    g_source_remove (priv->fake_id);
+    priv->fake_id = 0;
+  }
+
+  G_OBJECT_CLASS (hrn_video_player_parent_class)->dispose (object);
+}
+
+static void
+hrn_video_player_set_property (GObject *object, guint prop_id,
+                               const GValue *value,
+                               GParamSpec   *pspec)
+{
+  switch (prop_id)
+    {
+      default:
+        break;
+    }
+}
+
+static void
+hrn_video_player_get_property (GObject *object, guint prop_id,
+                               GValue     *value,
+                               GParamSpec *pspec)
+{
+  switch (prop_id)
+    {
+      default:
+        break;
+    }
+}
+
+static void
+hrn_video_player_allocate (ClutterActor *actor, const ClutterActorBox *box,
+                           ClutterAllocationFlags flags)
+{
+  HrnVideoPlayer        *player = (HrnVideoPlayer *) actor;
+  HrnVideoPlayerPrivate *priv   = player->priv;
+
+  CLUTTER_ACTOR_CLASS (hrn_video_player_parent_class)->allocate
+                             (actor, box, flags);
+
+  if (priv->video_player)
+    {
+      clutter_actor_allocate_preferred_size (priv->video_player,
+                                             flags);
+    }
+}
+
+static void
+hrn_video_player_paint (ClutterActor *actor)
+{
+  HrnVideoPlayer        *player = (HrnVideoPlayer *) actor;
+  HrnVideoPlayerPrivate *priv   = player->priv;
+
+  if (priv->video_player && CLUTTER_ACTOR_IS_VISIBLE (priv->video_player))
+    {
+      clutter_actor_paint (priv->video_player);
+    }
+}
+
+static void
+hrn_video_player_pick (ClutterActor *actor, const ClutterColor *color)
+{
+  hrn_video_player_paint (actor);
+}
+
+
+static void
+hrn_video_player_map (ClutterActor *self)
+{
+  HrnVideoPlayerPrivate *priv = HRN_VIDEO_PLAYER (self)->priv;
+
+  CLUTTER_ACTOR_CLASS (hrn_video_player_parent_class)->map (self);
+
+  if (priv->video_player)
+    clutter_actor_map (CLUTTER_ACTOR (priv->video_player));
+}
+
+static void
+hrn_video_player_unmap (ClutterActor *self)
+{
+  HrnVideoPlayerPrivate *priv = HRN_VIDEO_PLAYER (self)->priv;
+
+  CLUTTER_ACTOR_CLASS (hrn_video_player_parent_class)->unmap (self);
+
+  if (priv->video_player)
+    clutter_actor_unmap (CLUTTER_ACTOR (priv->video_player));
+}
+
+
+static void
+hrn_video_player_class_init (HrnVideoPlayerClass *klass)
+{
+  GObjectClass      *o_class = (GObjectClass *) klass;
+  ClutterActorClass *a_class = (ClutterActorClass *) klass;
+
+  o_class->dispose      = hrn_video_player_dispose;
+  o_class->finalize     = hrn_video_player_finalize;
+  o_class->set_property = hrn_video_player_set_property;
+  o_class->get_property = hrn_video_player_get_property;
+
+  a_class->allocate = hrn_video_player_allocate;
+  a_class->paint    = hrn_video_player_paint;
+  a_class->pick     = hrn_video_player_pick;
+  a_class->map      = hrn_video_player_map;
+  a_class->unmap    = hrn_video_player_unmap;
+
+  g_type_class_add_private (klass, sizeof (HrnVideoPlayerPrivate));
+}
+
+static void
+video_size_change (ClutterTexture *texture,
+                   gfloat          width,
+                   gfloat          height,
+                   gpointer        userdata)
+{
+  float new_x, new_y, new_width, new_height;
+  int win_w, win_h;
+
+  gtk_window_get_size (GTK_WINDOW (window), &win_w, &win_h);
+
+  new_height = (height * (float) win_w) / width;
+
+  if (new_height <= (float) win_h)
+    {
+      new_width = (float) win_w;
+
+      new_x = 0;
+      new_y = (((float) win_h) - new_height) / 2;
+    }
+  else
+    {
+      new_width  = (width * (float) win_h) / height;
+      new_height = (float) win_h;
+
+      new_x = (((float) win_w) - new_width) / 2;
+      new_y = 0;
+    }
+
+
+  clutter_actor_set_position ((ClutterActor *) texture, new_x, new_y);
+  clutter_actor_set_size ((ClutterActor *) texture, new_width, new_height);
+}
+
+static void
+video_progress_changed (GObject        *object,
+                        GParamSpec     *pspec,
+                        HrnVideoPlayer *player)
+{
+  HrnVideoPlayerPrivate *priv = player->priv;
+  double                 position;
+
+  if (priv->duration == 0) {
+    priv->duration = clutter_media_get_duration ((ClutterMedia *) priv->video_player);
+    hrn_iface_player_emit_duration_changed ((HrnIfacePlayer *) player,
+                                            priv->duration);
+  }
+
+  position = clutter_media_get_progress ((ClutterMedia *) priv->video_player);
+  hrn_iface_player_emit_position_changed ((HrnIfacePlayer *) player,
+                                          position);
+}
+
+static void
+video_eos (ClutterMedia *media, HrnVideoPlayer *player)
+{
+  hrn_iface_player_emit_eos ((HrnIfacePlayer *) player);
+}
+
+static gboolean
+emit_fake_key_event (gpointer userdata)
+{
+  HrnVideoPlayer *player = (HrnVideoPlayer *) userdata;
+  HrnVideoPlayerPrivate *priv = player->priv;
+  Display *display = clutter_x11_get_default_display ();
+
+  XLockDisplay (display);
+  XTestFakeKeyEvent (display, priv->keycode, True, CurrentTime);
+  XTestFakeKeyEvent (display, priv->keycode, False, CurrentTime);
+  XUnlockDisplay (display);
+
+  return TRUE;
+}
+
+static void
+disable_screensaver (HrnVideoPlayer *video)
+{
+  HrnVideoPlayerPrivate *priv = video->priv;
+  Display *display = clutter_x11_get_default_display ();
+  int timeout, interval, prefer_blanking, allow_exposures;
+
+  if (priv->fake_id > 0) {
+    return;
+  }
+
+  XLockDisplay (display);
+  XGetScreenSaver (display, &timeout, &interval, &prefer_blanking,
+                   &allow_exposures);
+  XUnlockDisplay (display);
+
+  if (timeout == 0) {
+    timeout = MINIMUM_TIMEOUT;
+  }
+  priv->fake_id = g_timeout_add_seconds (timeout / 2,
+                                         emit_fake_key_event, video);
+}
+
+static void
+enable_screensaver (HrnVideoPlayer *video)
+{
+  HrnVideoPlayerPrivate *priv = video->priv;
+
+  if (priv->fake_id == 0) {
+    return;
+  }
+
+  g_source_remove (priv->fake_id);
+  priv->fake_id = 0;
+}
+
+static void
+player_set_playing (HrnIfacePlayer *player, gboolean playing)
+{
+  HrnVideoPlayer        *video = (HrnVideoPlayer *) player;
+  HrnVideoPlayerPrivate *priv  = video->priv;
+
+  if (playing) {
+    disable_screensaver (video);
+  } else {
+    enable_screensaver (video);
+  }
+
+  clutter_media_set_playing ((ClutterMedia *) priv->video_player, playing);
+}
+
+#ifndef USE_HELIX
+/* FIXME: ClutterMedia could have a set_subtitle_uri method */
+static void
+player_set_subtitle_uri (HrnIfacePlayer *player,
+                         const char     *uri)
+{
+  HrnVideoPlayer *video = (HrnVideoPlayer *) player;
+  HrnVideoPlayerPrivate *priv = video->priv;
+  ClutterGstVideoTexture *video_texture;
+  GstElement *playbin2;
+
+  video_texture = CLUTTER_GST_VIDEO_TEXTURE (priv->video_player);
+  playbin2 = clutter_gst_video_texture_get_pipeline (video_texture);
+
+  g_message ("set subtitle: %s", uri);
+  g_object_set (playbin2, "suburi", uri, NULL);
+}
+
+static void
+look_for_locale_dependant_subtitle (HrnIfacePlayer *player,
+                                    const char     *uri)
+{
+  gchar *scheme, *path, *dot;
+  const gchar * const *languages;
+  GFile *video;
+  gint i, j;
+  static gchar *subtitle_extensions[] = { ".srt" };
+
+  scheme = g_uri_parse_scheme (uri);
+  if (scheme == NULL || strcmp (scheme, "file") != 0) {
+    /* do not try to look for subtitle files if the video file is not
+     * mounted locally */
+    g_free (scheme);
+    return;
+  }
+  g_free (scheme);
+
+  video = g_file_new_for_uri (uri);
+  path = g_file_get_path (video);
+  g_object_unref (video);
+  if (path == NULL)
+    return;
+
+  dot = strrchr (path, '.');
+  if (dot == NULL) {
+    g_free (path);
+    return;
+  }
+  *dot = '\0';
+
+  languages = g_get_language_names ();
+  for (i = 0; languages[i]; i++) {
+    for (j = 0; j < G_N_ELEMENTS (subtitle_extensions); j++) {
+      gchar *subtitle_path;
+      GFile *subtitle;
+
+      subtitle_path = g_strconcat (path,
+                                   "-",
+                                   languages[i],
+                                   subtitle_extensions[j],
+                                   NULL);
+      subtitle = g_file_new_for_path (subtitle_path);
+      if (g_file_query_exists (subtitle, NULL)) {
+        gchar *uri;
+
+        uri = g_file_get_uri (subtitle);
+        player_set_subtitle_uri (player, uri);
+
+        g_object_unref (subtitle);
+        g_free (subtitle_path);
+        g_free (uri);
+        g_free (path);
+        return;
+      }
+
+      g_object_unref (subtitle);
+      g_free (subtitle_path);
+    }
+  }
+
+  g_free (path);
+}
+#endif
+
+static void
+player_set_uri (HrnIfacePlayer *player,
+                const char     *uri)
+{
+  HrnVideoPlayer        *video = (HrnVideoPlayer *) player;
+  HrnVideoPlayerPrivate *priv  = video->priv;
+
+  priv->duration = 0;
+  clutter_media_set_uri ((ClutterMedia *) priv->video_player, uri);
+#ifndef USE_HELIX
+  look_for_locale_dependant_subtitle (player, uri);
+#endif
+}
+
+static void
+player_set_item (HrnIfacePlayer *player,
+                 HrnItem        *item)
+{
+    player_set_uri (player, hrn_item_get_uri (item));
+}
+
+static void
+player_set_position (HrnIfacePlayer *player, double position)
+{
+  HrnVideoPlayer        *video = (HrnVideoPlayer *) player;
+  HrnVideoPlayerPrivate *priv  = video->priv;
+
+  clutter_media_set_progress ((ClutterMedia *) priv->video_player, position);
+}
+
+static guint64
+player_get_duration (HrnIfacePlayer *player)
+{
+    HrnVideoPlayer *video = (HrnVideoPlayer *) player;
+    HrnVideoPlayerPrivate *priv = video->priv;
+    double duration;
+
+    duration = clutter_media_get_duration ((ClutterMedia *) priv->video_player);
+
+    return (guint64) clutter_media_get_duration ((ClutterMedia *) priv->video_player);
+}
+
+static void
+hrn_player_init (HrnIfacePlayerClass *iface)
+{
+  iface->set_playing  = player_set_playing;
+  iface->set_uri      = player_set_uri;
+  iface->set_item     = player_set_item;
+  iface->set_position = player_set_position;
+  iface->get_duration = player_get_duration;
+}
+
+static void
+hrn_clutter_media_error (ClutterMedia   *media,
+                         GError         *error,
+                         HrnVideoPlayer *player)
+{
+    NotifyNotification *notification;
+
+    /* FIXME: ClutterMedia needs standard errors */
+    if ((error->domain == g_quark_from_string ("gst-stream-error-quark") &&
+         error->code == 6 /* GST_STREAM_ERROR_CODEC_NOT_FOUND */) ||
+        error->code == 0x80040011 /* Stupid Helix error codes */ ||
+        error->code == 0x80040017) {
+        gchar *basename, *unesc;
+        gchar *uri = NULL;
+        gchar *message;
+
+        g_object_get (media, "uri", &uri, NULL);
+
+        basename = g_path_get_basename (uri);
+        g_free (uri);
+
+        unesc = g_uri_unescape_string (basename, NULL);
+        g_free (basename);
+
+#ifdef USE_HELIX
+        message = g_strdup_printf (_("Sorry, we can't play %s, as we don't have the correct plugin."), unesc);
+#else
+        message = g_strdup_printf (_("Sorry, we can't play %s, as we don't have the correct plugin. You could try searching for ❝gstreamer codecs❞ on the web."), unesc);
+#endif
+        g_free (unesc);
+
+        notification = notify_notification_new (_("We can't play this"),
+                                                message,
+                                                NULL, NULL);
+        notify_notification_show (notification,   NULL);
+
+        g_object_unref (notification);
+
+        g_free (message);
+    }
+}
+
+static void
+hrn_video_player_init (HrnVideoPlayer *self)
+{
+  HrnVideoPlayerPrivate *priv = GET_PRIVATE (self);
+  Display *display;
+
+  self->priv         = priv;
+#ifdef USE_HELIX
+  priv->video_player = clutter_helix_video_texture_new ();
+#else
+  priv->video_player = clutter_gst_video_texture_new ();
+#endif
+  /* Don't let the underlying pixbuf dictate size */
+  g_object_set (G_OBJECT (priv->video_player),
+                "sync-size", FALSE,
+                NULL);
+
+  /* Handle it ourselves so can scale up for fullscreen better */
+  g_signal_connect (priv->video_player, "size-change",
+                    G_CALLBACK (video_size_change), self);
+  g_signal_connect (priv->video_player, "error",
+                    G_CALLBACK (hrn_clutter_media_error), self);
+
+  priv->progress_id = g_signal_connect (priv->video_player,
+                                        "notify::progress",
+                                        G_CALLBACK (video_progress_changed),
+                                        self);
+  g_signal_connect (priv->video_player, "eos",
+                    G_CALLBACK (video_eos), self);
+  clutter_actor_set_parent (priv->video_player, CLUTTER_ACTOR (self));
+  clutter_actor_show (priv->video_player);
+
+  display = clutter_x11_get_default_display ();
+  priv->keycode = XKeysymToKeycode (display, XK_Alt_L);
+}
+
diff -pruN 1.5.1-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-cluster.c 1.8.4-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-cluster.c
--- 1.5.1-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-cluster.c	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-cluster.c	2010-02-17 17:26:44.000000000 +0000
@@ -0,0 +1,1326 @@
+#include <mx/mx.h>
+
+#include "hrn.h"
+
+#include "hrn-cluster-node.h"
+#include "hrn-cluster.h"
+#include "hrn-cluster-thumbnail.h"
+#include "hrn-album-cluster.h"
+#include "hrn-month-cluster.h"
+#include "hrn-tiler.h"
+#include "hrn-tileable.h"
+#include "hrn-tile-frame.h"
+#include "hrn-image-tile.h"
+#include "hrn-track-tile.h"
+#include "hrn-texture-cache.h"
+#include "hrn-up-tile.h"
+
+enum {
+    PROP_0,
+    PROP_X_BASE,
+    PROP_Y_BASE,
+    PROP_PRIMARY,
+    PROP_SECONDARY,
+    PROP_NODE,
+};
+
+enum {
+    LAST_SIGNAL,
+};
+
+struct _HrnClusterPrivate {
+    HrnClusterNode *node;
+    GHashTable *child_items;
+
+    gboolean items_exist;
+    guint items_per_row;
+
+    ClutterActor *table;
+
+    HrnUpTile *up_tile;
+
+    GPtrArray *children;
+    guint visible_children;
+    gboolean expanded;
+    HrnTileable *shown_child;
+
+    guint count;
+
+    ClutterActor *frame;
+    ClutterActor *thumbnail;
+    ClutterActor *primary;
+    ClutterActor *secondary;
+
+    guint32 thumb_timeout_id;
+    int base_x, base_y;
+};
+
+#define GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), HRN_TYPE_CLUSTER, HrnClusterPrivate))
+
+static void tiler_interface_init (HrnTilerInterface *iface);
+static void tileable_interface_init (HrnTileableInterface *iface);
+G_DEFINE_TYPE_WITH_CODE (HrnCluster, hrn_cluster, CLUTTER_TYPE_GROUP,
+                         G_IMPLEMENT_INTERFACE (HRN_TYPE_TILER,
+                                                tiler_interface_init)
+                         G_IMPLEMENT_INTERFACE (HRN_TYPE_TILEABLE,
+                                                tileable_interface_init));
+
+static void child_visibility_changed_cb (HrnTileable *tileable,
+                                         gboolean     hidden,
+                                         HrnCluster  *cluster);
+
+static void
+hrn_cluster_finalize (GObject *object)
+{
+    G_OBJECT_CLASS (hrn_cluster_parent_class)->finalize (object);
+}
+
+static void
+hrn_cluster_dispose (GObject *object)
+{
+    G_OBJECT_CLASS (hrn_cluster_parent_class)->dispose (object);
+}
+
+static void
+hrn_cluster_set_property (GObject      *object,
+                          guint         prop_id,
+                          const GValue *value,
+                          GParamSpec   *pspec)
+{
+    HrnCluster *self = (HrnCluster *) object;
+    HrnClusterPrivate *priv = self->priv;
+
+    switch (prop_id) {
+    case PROP_X_BASE:
+        priv->base_x = g_value_get_uint (value);
+        break;
+
+    case PROP_Y_BASE:
+        priv->base_y = g_value_get_uint (value);
+        break;
+
+    case PROP_PRIMARY:
+        mx_label_set_text ((MxLabel *) priv->primary,
+                             g_value_get_string (value));
+        break;
+
+    case PROP_SECONDARY:
+        mx_label_set_text ((MxLabel *) priv->secondary,
+                             g_value_get_string (value));
+        break;
+
+    case PROP_NODE:
+        g_warning ("Subclasses should override Node property");
+        break;
+
+    default:
+        break;
+    }
+}
+
+static void
+hrn_cluster_get_property (GObject    *object,
+                          guint       prop_id,
+                          GValue     *value,
+                          GParamSpec *pspec)
+{
+    switch (prop_id) {
+
+    default:
+        break;
+    }
+}
+
+static void
+hrn_cluster_paint (ClutterActor *actor)
+{
+    HrnCluster *cluster = (HrnCluster *) actor;
+    HrnClusterPrivate *priv = cluster->priv;
+
+    if (priv->expanded && priv->node) {
+        GSequenceIter *iter = g_sequence_get_begin_iter (priv->node->children);
+
+        clutter_actor_paint ((ClutterActor *) priv->up_tile);
+
+        while (g_sequence_iter_is_end (iter) == FALSE) {
+            HrnClusterNode *child_node = g_sequence_get (iter);
+            ClutterActor *child;
+
+            if (child_node->hidden) {
+                iter = g_sequence_iter_next (iter);
+                continue;
+            }
+
+            child = g_hash_table_lookup (priv->child_items, child_node);
+            if (child == NULL) {
+                g_warning ("Could not find child item for %s",
+                           child_node->name);
+                iter = g_sequence_iter_next (iter);
+                continue;
+            }
+
+            clutter_actor_paint (child);
+            iter = g_sequence_iter_next (iter);
+        }
+    } else {
+        clutter_actor_paint ((ClutterActor *) priv->table);
+    }
+}
+
+static void
+hrn_cluster_pick (ClutterActor       *actor,
+                  const ClutterColor *color)
+{
+    HrnCluster *cluster = (HrnCluster *) actor;
+    HrnClusterPrivate *priv = cluster->priv;
+
+    if (priv->expanded && priv->node) {
+        GSequenceIter *iter = g_sequence_get_begin_iter (priv->node->children);
+
+        clutter_actor_paint ((ClutterActor *) priv->up_tile);
+
+        while (g_sequence_iter_is_end (iter) == FALSE) {
+            HrnClusterNode *child_node = g_sequence_get (iter);
+            ClutterActor *child;
+
+            if (child_node->hidden) {
+                iter = g_sequence_iter_next (iter);
+                continue;
+            }
+
+            child = g_hash_table_lookup (priv->child_items, child_node);
+            if (child == NULL) {
+                g_warning ("Could not find child item for %s",
+                           child_node->name);
+                iter = g_sequence_iter_next (iter);
+                continue;
+            }
+
+            clutter_actor_paint (child);
+            iter = g_sequence_iter_next (iter);
+        }
+    } else {
+        clutter_actor_paint ((ClutterActor *) priv->table);
+    }
+}
+
+static void
+hrn_cluster_class_init (HrnClusterClass *klass)
+{
+    GObjectClass *o_class = (GObjectClass *) klass;
+    ClutterActorClass *a_class = (ClutterActorClass *) klass;
+
+    o_class->dispose = hrn_cluster_dispose;
+    o_class->finalize = hrn_cluster_finalize;
+    o_class->set_property = hrn_cluster_set_property;
+    o_class->get_property = hrn_cluster_get_property;
+
+    a_class->paint = hrn_cluster_paint;
+    a_class->pick = hrn_cluster_pick;
+
+    g_type_class_add_private (klass, sizeof (HrnClusterPrivate));
+
+    g_object_class_install_property (o_class, PROP_X_BASE,
+                                     g_param_spec_uint ("x-base", "", "",
+                                                        0, G_MAXUINT, 0,
+                                                        G_PARAM_READABLE |
+                                                        G_PARAM_WRITABLE |
+                                                        G_PARAM_STATIC_STRINGS));
+    g_object_class_install_property (o_class, PROP_Y_BASE,
+                                     g_param_spec_uint ("y-base", "", "",
+                                                        0, G_MAXUINT, 0,
+                                                        G_PARAM_READABLE |
+                                                        G_PARAM_WRITABLE |
+                                                        G_PARAM_STATIC_STRINGS));
+    g_object_class_install_property (o_class, PROP_PRIMARY,
+                                     g_param_spec_string ("primary", "", "", "",
+                                                          G_PARAM_READABLE |
+                                                          G_PARAM_WRITABLE |
+                                                          G_PARAM_STATIC_STRINGS));
+    g_object_class_install_property (o_class, PROP_SECONDARY,
+                                     g_param_spec_string ("secondary", "", "", "",
+                                                          G_PARAM_READABLE |
+                                                          G_PARAM_WRITABLE |
+                                                          G_PARAM_STATIC_STRINGS));
+    g_object_class_install_property (o_class, PROP_NODE,
+                                     g_param_spec_pointer ("node", "", "",
+                                                           G_PARAM_READABLE |
+                                                           G_PARAM_WRITABLE |
+                                                           G_PARAM_STATIC_STRINGS));
+}
+
+/* Returns true if a movement from sy -> dy crosses the stage */
+static gboolean
+is_actor_on_stage (ClutterActor *actor,
+                   float         sy,
+                   float         dy)
+{
+    int sh = CLUTTER_STAGE_HEIGHT ();
+    float ah;
+
+    /* Not on stage if its not visible */
+    if (CLUTTER_ACTOR_IS_VISIBLE (actor) == FALSE) {
+        return FALSE;
+    }
+
+    ah = clutter_actor_get_height (actor);
+    if (sy + ah < 0 && dy + ah < 0) {
+        return FALSE;
+    } else if (sy > sh && dy > sh) {
+        return FALSE;
+    } else {
+        return TRUE;
+    }
+}
+
+#define X_GRID_TO_COORDS(x) (x * (ITEM_WIDTH + COL_GAP))
+#define Y_GRID_TO_COORDS(y) (y * (ITEM_HEIGHT + ROW_GAP))
+
+static void
+layout_cluster (HrnCluster *cluster)
+{
+    HrnClusterPrivate *priv = cluster->priv;
+    int item_count;
+    guint row_count;
+    float ay;
+
+    /* Plus 1 because we have the Up Tile at 0,0 */
+    item_count = (priv->base_y * priv->items_per_row) + priv->base_x + 1;
+    ay = clutter_actor_get_y ((ClutterActor *) cluster);
+
+    if (priv->node) {
+        GSequenceIter *iter = g_sequence_get_begin_iter (priv->node->children);
+
+        while (g_sequence_iter_is_end (iter) == FALSE) {
+            HrnClusterNode *child_node = g_sequence_get (iter);
+            ClutterActor *child;
+            float gx, gy, iy;
+            int x, y;
+
+            if (child_node->hidden) {
+                iter = g_sequence_iter_next (iter);
+                continue;
+            }
+
+            child = g_hash_table_lookup (priv->child_items, child_node);
+            if (child == NULL) {
+                g_warning ("No child found for %s", child_node->name);
+                iter = g_sequence_iter_next (iter);
+                continue;
+            }
+
+            x = (item_count % priv->items_per_row) - priv->base_x;
+            y = (item_count / priv->items_per_row) - priv->base_y;
+
+            gx = X_GRID_TO_COORDS (x);
+            gy = Y_GRID_TO_COORDS (y);
+
+            iy = clutter_actor_get_y (child);
+
+            hrn_tileable_set_position ((HrnTileable *) child, x, y);
+
+            if (is_actor_on_stage (child, ay + iy, ay + gy)) {
+                clutter_actor_animate (child, CLUTTER_EASE_IN_OUT_CUBIC, 500,
+                                       "x", gx,
+                                       "y", gy,
+                                       NULL);
+            } else {
+                clutter_actor_set_position (child, gx, gy);
+            }
+
+            item_count += hrn_tileable_get_count ((HrnTileable *) child);
+
+            iter = g_sequence_iter_next (iter);
+        }
+    }
+
+    /* How many rows do we cover, to set the size of the group correctly */
+    row_count = 1 + ((item_count + (priv->children->len - 1)) / priv->items_per_row) - priv->base_y;
+    clutter_actor_set_size ((ClutterActor *) cluster,
+                            priv->items_per_row * (ITEM_WIDTH + COL_GAP),
+                            row_count * (ITEM_HEIGHT + ROW_GAP));
+}
+
+static void
+tiler_show_all (HrnTiler *tiler)
+{
+    HrnCluster *cluster = (HrnCluster *) tiler;
+    HrnClusterPrivate *priv = cluster->priv;
+    GSequenceIter *iter;
+
+    if (priv->node == NULL) {
+        return;
+    }
+
+    iter = g_sequence_get_begin_iter (priv->node->children);
+    while (g_sequence_iter_is_end (iter) == FALSE) {
+        HrnClusterNode *child_node = g_sequence_get (iter);
+        ClutterActor *child = NULL;
+
+        if (priv->expanded) {
+            child = g_hash_table_lookup (priv->child_items, child_node);
+            if (child == NULL) {
+                g_warning ("%s No child found for %s",
+                           G_STRLOC, child_node->name);
+                iter = g_sequence_iter_next (iter);
+                continue;
+            }
+
+            clutter_actor_show (child);
+            clutter_actor_animate (child, CLUTTER_EASE_IN_OUT_CUBIC, 500,
+                                   "opacity", 0xff,
+                                   NULL);
+
+            if (HRN_IS_TILER (child)) {
+                hrn_tiler_show_all ((HrnTiler *) child);
+            }
+        }
+
+        if (child) {
+            g_signal_handlers_block_by_func (child,
+                                             child_visibility_changed_cb,
+                                             cluster);
+        }
+
+        hrn_cluster_node_set_hidden (child_node, FALSE);
+
+        if (child) {
+            g_signal_handlers_unblock_by_func (child,
+                                               child_visibility_changed_cb,
+                                               cluster);
+        }
+
+        iter = g_sequence_iter_next (iter);
+    }
+}
+
+static void
+tiler_show (HrnTiler    *tiler,
+            HrnTileable *tile)
+{
+}
+
+static void
+show_child (HrnCluster   *cluster,
+            ClutterActor *actor)
+{
+    HrnClusterPrivate *priv = cluster->priv;
+    HrnClusterNode *node;
+
+    clutter_actor_show (actor);
+    clutter_actor_animate (actor, CLUTTER_EASE_IN_OUT_CUBIC, 500,
+                           "opacity", 0xff,
+                           NULL);
+
+    priv->visible_children++;
+
+    node = hrn_tileable_get_node ((HrnTileable *) actor);
+
+    g_signal_handlers_block_by_func (actor, child_visibility_changed_cb,
+                                     cluster);
+    hrn_cluster_node_set_children_hidden (node, FALSE);
+    g_signal_handlers_unblock_by_func (actor, child_visibility_changed_cb,
+                                       cluster);
+}
+
+static void
+move_child (ClutterActor *actor,
+            int           x,
+            int           y)
+{
+    HrnClusterNode *node;
+
+    node = hrn_tileable_get_node ((HrnTileable *) actor);
+    g_print ("Moving child to %d, %d\n", x, y);
+
+    hrn_tileable_set_position ((HrnTileable *) actor, x, y);
+
+    /* FIXME: Check that we're on screen */
+    clutter_actor_animate (actor, CLUTTER_EASE_IN_OUT_CUBIC, 500,
+                           "x", X_GRID_TO_COORDS (x),
+                           "y", Y_GRID_TO_COORDS (y),
+                           NULL);
+}
+
+static void
+show_this_node (HrnCluster *cluster)
+{
+    HrnClusterPrivate *priv = cluster->priv;
+    GSequenceIter *iter;
+
+    if (priv->node == NULL) {
+        return;
+    }
+
+    clutter_actor_show ((ClutterActor *) priv->up_tile);
+    clutter_actor_animate ((ClutterActor *) priv->up_tile,
+                           CLUTTER_EASE_IN_OUT_CUBIC, 500,
+                           "opacity", 0xff,
+                           NULL);
+
+    iter = g_sequence_get_begin_iter (priv->node->children);
+    while (g_sequence_iter_is_end (iter) == FALSE) {
+        HrnClusterNode *child_node = g_sequence_get (iter);
+        ClutterActor *child;
+
+        g_print ("showing %s\n", child_node->name);
+        child = g_hash_table_lookup (priv->child_items, child_node);
+        if (child == NULL) {
+            g_warning ("%s No child found for %s",
+                       G_STRLOC, child_node->name);
+            iter = g_sequence_iter_next (iter);
+            continue;
+        }
+
+        if (child == (ClutterActor *) priv->shown_child
+            && HRN_IS_TILER (child)) {
+            hrn_tiler_set_expanded ((HrnTiler *) child, FALSE);
+        }
+
+        show_child (cluster, child);
+        iter = g_sequence_iter_next (iter);
+    }
+
+    priv->shown_child = NULL;
+    if (priv->expanded) {
+        layout_cluster (cluster);
+    }
+}
+
+static void
+tiler_show_node (HrnTiler       *tiler,
+                 HrnClusterNode *node)
+{
+    HrnCluster *cluster = (HrnCluster *) tiler;
+    HrnClusterPrivate *priv = cluster->priv;
+
+    /* If we have to show this node, then we close the shown child,
+       and show all our items */
+    if (priv->node == node) {
+        show_this_node (cluster);
+    } else if (HRN_IS_TILER (priv->shown_child)) {
+        hrn_tiler_show_node ((HrnTiler *) priv->shown_child, node);
+    }
+}
+
+static void
+add_item (HrnCluster     *cluster,
+          HrnClusterNode *child)
+{
+    HrnClusterPrivate *priv = cluster->priv;
+    ClutterActor *actor;
+
+    switch (child->type) {
+    case HRN_CLUSTER_NODE_TYPE_ALBUM:
+        actor = g_object_new (HRN_TYPE_ALBUM_CLUSTER, NULL);
+        hrn_tiler_add_items ((HrnTiler *) actor, child);
+        hrn_tiler_set_items_per_row ((HrnTiler *) actor,
+                                     priv->items_per_row);
+        hrn_cluster_full ((HrnCluster *) actor);
+        break;
+
+    case HRN_CLUSTER_NODE_TYPE_TRACK:
+        actor = g_object_new (HRN_TYPE_TRACK_TILE, "node", child, NULL);
+        break;
+
+    case HRN_CLUSTER_NODE_TYPE_MONTH:
+        actor = g_object_new (HRN_TYPE_MONTH_CLUSTER, NULL);
+        hrn_tiler_add_items ((HrnTiler *) actor, child);
+        hrn_tiler_set_items_per_row ((HrnTiler *) actor,
+                                     priv->items_per_row);
+        hrn_cluster_full ((HrnCluster *) actor);
+        break;
+
+    case HRN_CLUSTER_NODE_TYPE_IMAGE:
+        actor = g_object_new (HRN_TYPE_IMAGE_TILE, "node", child, NULL);
+        break;
+
+    default:
+        return;
+    }
+
+    hrn_cluster_add_actor (cluster, (HrnTileable *) actor);
+    g_hash_table_insert (priv->child_items, child, actor);
+}
+
+static void
+create_items (HrnCluster *cluster)
+{
+    HrnClusterPrivate *priv = cluster->priv;
+    HrnClusterNode *node = hrn_tileable_get_node ((HrnTileable *) cluster);
+    GSequenceIter *iter = g_sequence_get_begin_iter (node->children);
+
+    priv->up_tile = g_object_new (HRN_TYPE_UP_TILE, NULL);
+    hrn_cluster_add_actor (cluster, (HrnTileable *) priv->up_tile);
+
+    while (g_sequence_iter_is_end (iter) == FALSE) {
+        HrnClusterNode *child = g_sequence_get (iter);
+
+        add_item (cluster, child);
+
+        iter = g_sequence_iter_next (iter);
+    }
+    priv->items_exist = TRUE;
+}
+
+static void
+destroy_items (HrnCluster *cluster)
+{
+    HrnClusterPrivate *priv = cluster->priv;
+    int i;
+
+    /* set the up_tile to NULL, as it will be destroyed when all the children
+     * are destroyed */
+    priv->up_tile = NULL;
+
+    for (i = 0; i < priv->children->len; i++) {
+        ClutterActor *actor = priv->children->pdata[i];
+
+        clutter_actor_destroy (actor);
+    }
+    g_hash_table_remove_all (priv->child_items);
+    g_ptr_array_free (priv->children, TRUE);
+    priv->children = g_ptr_array_new ();
+
+    priv->items_exist = FALSE;
+}
+
+static void
+tiler_set_expanded (HrnTiler *tiler,
+                    gboolean  expanded)
+{
+    HrnCluster *cluster = HRN_CLUSTER (tiler);
+    HrnClusterPrivate *priv = cluster->priv;
+    int i, row_count, old_count;
+    float ay;
+
+    if (priv->expanded == expanded) {
+        return;
+    }
+
+    if (priv->node == NULL) {
+        return;
+    }
+
+    priv->expanded = expanded;
+
+    ay = clutter_actor_get_y ((ClutterActor *) cluster);
+
+    if (expanded) {
+        GSequenceIter *iter;
+        int item_count;
+
+        if (priv->items_exist == FALSE) {
+            create_items (cluster);
+        }
+
+        clutter_actor_animate ((ClutterActor *) priv->table,
+                               CLUTTER_EASE_IN_OUT_CUBIC, 500,
+                               "opacity", 0x00,
+                               "signal-swapped::completed",
+                               clutter_actor_hide, priv->table,
+                               NULL);
+
+        item_count = (priv->base_y * priv->items_per_row) + priv->base_x;
+        old_count = priv->count;
+        priv->count = 0;
+
+        iter = g_sequence_get_begin_iter (priv->node->children);
+        i = 1; /* 1 because the up tile is at 0,0 */
+        while (g_sequence_iter_is_end (iter) == FALSE) {
+            HrnClusterNode *child_node = g_sequence_get (iter);
+            ClutterActor *child;
+            int x, y;
+            float gx, gy, iy;
+
+            if (child_node->hidden) {
+                g_print ("%s is hidden\n", child_node->name);
+                iter = g_sequence_iter_next (iter);
+                continue;
+            } else {
+                g_print ("%s is shown\n", child_node->name);
+            }
+
+            child = g_hash_table_lookup (priv->child_items, child_node);
+            if (child == NULL) {
+                g_warning ("%s No child found for %s",
+                           G_STRLOC, child_node->name);
+                iter = g_sequence_iter_next (iter);
+                continue;
+            }
+
+            x = ((item_count + i) % priv->items_per_row) - priv->base_x;
+            y = ((item_count + i) / priv->items_per_row) - priv->base_y;
+
+            gx = (float) X_GRID_TO_COORDS (x);
+            gy = (float) Y_GRID_TO_COORDS (y);
+
+            iy = clutter_actor_get_y (child);
+
+            clutter_actor_show (child);
+            if (is_actor_on_stage (child, ay + iy, gy + ay)) {
+                g_print ("   fading in\n");
+                clutter_actor_animate (child, CLUTTER_EASE_IN_OUT_CUBIC, 500,
+                                       "x", gx,
+                                       "y", gy,
+                                       "opacity", 0xff,
+                                       NULL);
+            } else {
+                clutter_actor_set_position (child, gx, gy);
+                clutter_actor_set_opacity (child, 0xff);
+                g_print ("   appeared\n");
+            }
+
+            priv->count += hrn_tileable_get_count ((HrnTileable *) child);
+            iter = g_sequence_iter_next (iter);
+            i++;
+        }
+
+        row_count = 1 + ((item_count + (priv->children->len - 1)) / priv->items_per_row) - priv->base_y;
+
+        /* FIXME: This sets the correct width for the group,
+           but it starts at the wrong x co-ord... is this needed? */
+        clutter_actor_set_size ((ClutterActor *) cluster,
+                                priv->items_per_row * (ITEM_WIDTH + COL_GAP),
+                                row_count * (ITEM_HEIGHT + ROW_GAP));
+        clutter_actor_set_reactive ((ClutterActor *) cluster, FALSE);
+
+        hrn_tileable_item_count_changed ((HrnTileable *) cluster,
+                                         old_count, priv->count);
+    } else {
+        clutter_actor_show ((ClutterActor *) priv->table);
+        clutter_actor_animate ((ClutterActor *) priv->table,
+                               CLUTTER_EASE_IN_OUT_CUBIC, 500,
+                               "opacity", 0xff,
+                               NULL);
+
+        /* Don't need to animate the child items here sucking in as they
+           get destroyed right away */
+
+        clutter_actor_set_size ((ClutterActor *) cluster,
+                                ITEM_WIDTH, ITEM_HEIGHT);
+        clutter_actor_set_reactive ((ClutterActor *) cluster, TRUE);
+        hrn_tileable_item_count_changed ((HrnTileable *) cluster,
+                                         priv->count, 1);
+        priv->count = 1;
+
+        if (priv->items_exist == TRUE) {
+            destroy_items (cluster);
+        }
+
+        priv->shown_child = NULL;
+    }
+}
+
+static void
+tiler_set_items_per_row (HrnTiler *tiler,
+                         guint     items_per_row)
+{
+    HrnCluster *cluster = HRN_CLUSTER (tiler);
+    HrnClusterPrivate *priv = cluster->priv;
+    int i;
+
+    if (priv->items_per_row == items_per_row) {
+        return;
+    }
+
+    priv->items_per_row = items_per_row;
+
+    /* Inform each of the HrnTiler children */
+    for (i = 0; i < priv->children->len; i++) {
+        ClutterActor *actor = priv->children->pdata[i];
+
+        if (HRN_IS_TILER (actor)) {
+            hrn_tiler_set_items_per_row ((HrnTiler *) actor, items_per_row);
+        }
+    }
+
+    if (priv->expanded) {
+        layout_cluster (cluster);
+    }
+}
+
+static void
+thumbnail_secondary_cb (HrnTileFrame *frame,
+                        HrnCluster   *cluster)
+{
+    hrn_tileable_activated ((HrnTileable *) cluster,
+                            HRN_TILEABLE_ACTION_PLAY,
+                            hrn_tileable_get_node ((HrnTileable *) cluster));
+}
+
+static void
+thumbnail_primary_cb (HrnTileFrame *frame,
+                      HrnCluster   *cluster)
+{
+    hrn_tileable_activated ((HrnTileable *) cluster,
+                            HRN_TILEABLE_ACTION_EXPAND, cluster);
+}
+
+static void
+set_thumbnail (HrnCluster     *cluster,
+               HrnClusterNode *node)
+{
+    HrnClusterPrivate *priv = cluster->priv;
+    HrnClusterNode *leaf;
+    HrnTextureCache *cache = hrn_texture_cache_get_default ();
+    HrnItemType type = HRN_ITEM_TYPE_AUDIO;
+    const char *artist;
+
+    switch (node->type) {
+    case HRN_CLUSTER_NODE_TYPE_ARTIST:
+        priv->thumbnail = hrn_texture_cache_get_texture_for_artist (cache,
+                                                                    node->name);
+        break;
+
+    case HRN_CLUSTER_NODE_TYPE_ALBUM:
+        if (((AlbumCluster *) node->data)->artists) {
+            artist = ((AlbumCluster *) node->data)->artists->pdata[0];
+        } else {
+            artist = NULL;
+        }
+        priv->thumbnail = hrn_texture_cache_get_texture_for_album (cache,
+                                                                   artist,
+                                                                   node->name);
+        break;
+
+    case HRN_CLUSTER_NODE_TYPE_YEAR:
+    case HRN_CLUSTER_NODE_TYPE_MONTH:
+        leaf = hrn_cluster_node_get_first_leaf (node);
+        if (leaf == NULL || leaf->type != HRN_CLUSTER_NODE_TYPE_IMAGE) {
+            g_warning ("There is no leaf node for %s\n", node->name);
+            type = HRN_ITEM_TYPE_IMAGE;
+        } else {
+            priv->thumbnail = hrn_texture_cache_get_texture_for_item
+                (cache, ((TileCluster *) leaf->data)->item);
+        }
+        break;
+
+    default:
+        break;
+    }
+
+    if (priv->thumbnail == NULL) {
+        priv->thumbnail = hrn_texture_cache_get_default_texture (cache, type);
+    }
+
+    priv->frame = g_object_new (HRN_TYPE_TILE_FRAME,
+                                "texture", priv->thumbnail,
+                                "label", hrn_cluster_get_label (cluster),
+                                NULL);
+    clutter_actor_set_reactive (priv->frame, TRUE);
+    g_signal_connect (priv->frame, "primary-action",
+                      G_CALLBACK (thumbnail_primary_cb), cluster);
+    g_signal_connect (priv->frame, "secondary-action",
+                      G_CALLBACK (thumbnail_secondary_cb), cluster);
+
+    mx_table_add_actor ((MxTable *) priv->table, priv->frame, 0, 0);
+}
+
+static void
+child_added_cb (HrnClusterNode *node,
+                HrnClusterNode *child,
+                HrnCluster     *cluster)
+{
+    HrnClusterPrivate *priv = cluster->priv;
+
+    if (priv->expanded == FALSE) {
+        return;
+    }
+
+    /* FIXME: We could have a #insert_item function that would only shift the
+       items after the newly added item */
+    add_item (cluster, child);
+    layout_cluster (cluster);
+}
+
+static void
+child_removed_cb (HrnClusterNode *node,
+                  HrnClusterNode *child_node,
+                  HrnCluster     *cluster)
+{
+    HrnClusterPrivate *priv = cluster->priv;
+    ClutterActor *child_actor;
+
+    if (priv->expanded == FALSE) {
+        return;
+    }
+
+    if (priv->node == NULL) {
+        return;
+    }
+
+    child_actor = g_hash_table_lookup (priv->child_items, child_node);
+    if (child_actor == NULL) {
+        g_warning ("%s Could not find child item for %s",
+                   G_STRLOC, child_node->name);
+        return;
+    }
+
+    g_ptr_array_remove (priv->children, child_actor);
+    g_hash_table_remove (priv->child_items, child_node);
+
+    if (child_actor == (ClutterActor *) priv->shown_child) {
+        hrn_tiler_show_all ((HrnTiler *) cluster);
+    }
+
+    clutter_actor_destroy (child_actor);
+
+    g_print ("Laying out cluster\n");
+    layout_cluster (cluster);
+}
+
+/* If HrnCluster implemented ClutterContainer then this could be put into
+   HrnTiler */
+static void
+tiler_add_items (HrnTiler       *tiler,
+                 HrnClusterNode *node)
+{
+    HrnCluster *cluster = (HrnCluster *) tiler;
+    HrnClusterPrivate *priv = cluster->priv;
+
+    priv->node = node;
+
+    /* FIXME: Need to disconnect these signals somehow */
+    g_signal_connect (node, "child-added",
+                      G_CALLBACK (child_added_cb), tiler);
+    g_signal_connect (node, "child-removed",
+                      G_CALLBACK (child_removed_cb), tiler);
+
+    g_object_set (cluster,
+                  "node", node,
+                  NULL);
+    set_thumbnail (cluster, node);
+
+    /* children items are created when the cluster is expanded */
+}
+
+static void
+tiler_interface_init (HrnTilerInterface *iface)
+{
+    iface->show_all = tiler_show_all;
+    iface->show = tiler_show;
+    iface->show_node = tiler_show_node;
+    iface->set_expanded = tiler_set_expanded;
+    iface->set_items_per_row = tiler_set_items_per_row;
+    iface->add_items = tiler_add_items;
+}
+
+static guint
+tileable_get_count (HrnTileable *tileable)
+{
+    HrnCluster *cluster = HRN_CLUSTER (tileable);
+    HrnClusterPrivate *priv = cluster->priv;
+
+    if (priv->expanded) {
+        if (priv->shown_child) {
+            return hrn_tileable_get_count (priv->shown_child);
+        } else {
+            return priv->count + 1;
+        }
+    } else {
+        return 1;
+    }
+}
+
+static ClutterActor *
+tileable_get_thumbnail (HrnTileable *tileable)
+{
+    HrnCluster *cluster = HRN_CLUSTER (tileable);
+    HrnClusterPrivate *priv = cluster->priv;
+    GSequenceIter *iter;
+    HrnClusterNode *child_node;
+    ClutterActor *child_actor;
+
+    if (priv->node == NULL) {
+        return NULL;
+    }
+
+    iter = g_sequence_get_begin_iter (priv->node->children);
+    child_node = g_sequence_get (iter);
+    child_actor = g_hash_table_lookup (priv->child_items, child_node);
+    if (child_actor == NULL) {
+        g_warning ("Could not find child for %s", child_node->name);
+        return NULL;
+    }
+
+    return hrn_tileable_get_thumbnail ((HrnTileable *) child_actor);
+}
+
+static void
+tileable_set_position (HrnTileable *tileable,
+                       guint        x,
+                       guint        y)
+{
+    HrnCluster *cluster = HRN_CLUSTER (tileable);
+    HrnClusterPrivate *priv = cluster->priv;
+
+    priv->base_x = x;
+    priv->base_y = y;
+}
+
+static HrnClusterNode *
+tileable_get_node (HrnTileable *tileable)
+{
+    HrnCluster *cluster = HRN_CLUSTER (tileable);
+
+    return HRN_CLUSTER_GET_CLASS (tileable)->get_node (cluster);
+}
+
+static void
+tileable_interface_init (HrnTileableInterface *iface)
+{
+    iface->get_count = tileable_get_count;
+    iface->get_thumbnail = tileable_get_thumbnail;
+    iface->set_position = tileable_set_position;
+    iface->get_node = tileable_get_node;
+}
+
+static gboolean
+label_clicked_cb (ClutterActor       *actor,
+                  ClutterButtonEvent *event,
+                  HrnCluster         *cluster)
+{
+    const char *text;
+
+    if (event->button != 1) {
+        return FALSE;
+    }
+
+    text = mx_label_get_text ((MxLabel *) actor);
+    hrn_tileable_activated ((HrnTileable *) cluster,
+                            HRN_TILEABLE_ACTION_SEARCH, (gpointer) text);
+    return TRUE;
+}
+
+static gboolean
+label_enter_cb (ClutterActor         *actor,
+                ClutterCrossingEvent *event,
+                HrnCluster           *cluster)
+{
+    mx_stylable_set_style_pseudo_class (MX_STYLABLE (actor), "hover");
+    return TRUE;
+}
+
+static gboolean
+label_leave_cb (ClutterActor         *actor,
+                ClutterCrossingEvent *event,
+                HrnCluster           *cluster)
+{
+    mx_stylable_set_style_pseudo_class (MX_STYLABLE (actor), NULL);
+    return TRUE;
+}
+
+static void
+hrn_cluster_init (HrnCluster *self)
+{
+    HrnClusterPrivate *priv = GET_PRIVATE (self);
+
+    self->priv = priv;
+    priv->children = g_ptr_array_new ();
+    priv->child_items = g_hash_table_new (NULL, NULL);
+
+    priv->expanded = FALSE;
+    priv->base_x = 0;
+    priv->base_y = 0;
+    priv->items_per_row = 1; /* This should get overridden */
+    priv->count = 1;
+
+    /* The table displays the information when the cluster is collapsed */
+    priv->table = mx_table_new ();
+    clutter_actor_set_size ((ClutterActor *) priv->table, ITEM_WIDTH, ITEM_HEIGHT);
+    clutter_container_add_actor ((ClutterContainer *) self,
+                                 (ClutterActor *) priv->table);
+
+#if 0
+    priv->thumbnail = g_object_new (HRN_TYPE_CLUSTER_THUMBNAIL, NULL);
+    clutter_actor_set_size (priv->thumbnail, /*THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT*/ 104, 104);
+    clutter_actor_set_reactive (priv->thumbnail, TRUE);
+    g_signal_connect (priv->thumbnail, "button-release-event",
+                      G_CALLBACK (thumbnail_clicked_cb), self);
+#endif
+
+    priv->primary = mx_label_new ("");
+    clutter_actor_set_name (priv->primary, "hrn-tileable-primary");
+    clutter_actor_set_reactive ((ClutterActor *) priv->primary, TRUE);
+    g_signal_connect (priv->primary, "button-release-event",
+                      G_CALLBACK (label_clicked_cb), self);
+    g_signal_connect (priv->primary, "enter-event",
+                      G_CALLBACK (label_enter_cb), self);
+    g_signal_connect (priv->primary, "leave-event",
+                      G_CALLBACK (label_leave_cb), self);
+    mx_table_add_actor_with_properties (MX_TABLE (priv->table),
+                                          (ClutterActor *) priv->primary, 1, 0,
+                                          "x-expand", FALSE,
+                                          "x-fill", FALSE,
+                                          "y-expand", FALSE,
+                                          "y-fill", FALSE,
+                                          "x-align", 0.0,
+                                          NULL);
+
+    priv->secondary = mx_label_new ("");
+    clutter_actor_set_name (priv->secondary, "hrn-tileable-secondary");
+    clutter_actor_set_reactive (priv->secondary, TRUE);
+    g_signal_connect (priv->secondary, "button-release-event",
+                      G_CALLBACK (label_clicked_cb), self);
+    g_signal_connect (priv->secondary, "enter-event",
+                      G_CALLBACK (label_enter_cb), self);
+    g_signal_connect (priv->secondary, "leave-event",
+                      G_CALLBACK (label_leave_cb), self);
+    mx_table_add_actor_with_properties (MX_TABLE (priv->table),
+                                          (ClutterActor *) priv->secondary,
+                                          2, 0,
+                                          "x-expand", FALSE,
+                                          "x-fill", FALSE,
+                                          "y-expand", FALSE,
+                                          "y-fill", FALSE,
+                                          "x-align", 0.0,
+                                          NULL);
+
+    if (priv->expanded) {
+        clutter_actor_hide ((ClutterActor *) priv->table);
+        clutter_actor_set_opacity ((ClutterActor *) priv->table, 0x00);
+    }
+}
+
+/* FIXME: These functions should maybe be shared between hrn-view.c and
+   hrn-cluster.c */
+static void
+hide_child (HrnCluster   *cluster,
+            ClutterActor *actor)
+{
+    HrnClusterPrivate *priv = cluster->priv;
+    HrnClusterNode *node;
+
+    /* FIXME: Should probably check that the child is onscreen */
+    clutter_actor_animate (actor, CLUTTER_EASE_IN_OUT_CUBIC, 500,
+                           "opacity", 0x00,
+                           "signal-swapped::completed",
+                           clutter_actor_hide, actor,
+                           NULL);
+
+    priv->visible_children--;
+
+    node = hrn_tileable_get_node ((HrnTileable *) actor);
+    /* Block this as we're already hiding it */
+    g_signal_handlers_block_by_func (actor, child_visibility_changed_cb, cluster);
+    hrn_cluster_node_set_children_hidden (node, TRUE);
+    g_signal_handlers_unblock_by_func (actor, child_visibility_changed_cb, cluster);
+}
+
+static void
+child_activated_cb (HrnTileable      *tileable,
+                    HrnTileableAction action,
+                    gpointer          payload,
+                    HrnCluster       *cluster)
+{
+    HrnClusterPrivate *priv = cluster->priv;
+    HrnClusterNode *payload_node;
+    GSequenceIter *iter;
+
+    switch (action) {
+    case HRN_TILEABLE_ACTION_EXPAND:
+        payload_node = hrn_tileable_get_node ((HrnTileable *) payload);
+
+        clutter_actor_animate ((ClutterActor *) priv->up_tile,
+                               CLUTTER_EASE_IN_OUT_CUBIC, 500,
+                               "opacity", 0x00,
+                               "signal-swapped::completed",
+                               clutter_actor_hide, priv->up_tile,
+                               NULL);
+
+        iter = g_sequence_get_begin_iter (priv->node->children);
+        while (g_sequence_iter_is_end (iter) == FALSE) {
+            HrnClusterNode *child_node = g_sequence_get (iter);
+
+            if (child_node != payload_node) {
+                ClutterActor *child;
+
+                child = g_hash_table_lookup (priv->child_items, child_node);
+                if (child == NULL) {
+                    g_warning ("%s No child found for %s",
+                               G_STRLOC, child_node->name);
+                    iter = g_sequence_iter_next (iter);
+                    continue;
+                }
+                hide_child (cluster, child);
+            }
+
+            iter = g_sequence_iter_next (iter);
+        }
+
+        priv->shown_child = tileable;
+
+        priv->count = hrn_tileable_get_count (tileable);
+        move_child ((ClutterActor *) payload, 0, 0);
+        hrn_tiler_set_expanded ((HrnTiler *) payload, TRUE);
+
+        hrn_tileable_activated ((HrnTileable *) cluster,
+                                HRN_TILEABLE_ACTION_EXPANDED,
+                                hrn_tileable_get_node ((HrnTileable *) payload));
+        return;
+
+    case HRN_TILEABLE_ACTION_UP_LEVEL:
+        g_print ("Up level...\n");
+        payload_node = hrn_tileable_get_node ((HrnTileable *) payload);
+
+        hrn_tiler_set_expanded ((HrnTiler *) cluster, FALSE);
+        hrn_tileable_activated ((HrnTileable *) cluster,
+                                HRN_TILEABLE_ACTION_SHOW_ALL, cluster);
+
+        priv->shown_child = NULL;
+        return;
+
+    case HRN_TILEABLE_ACTION_SHOW_ALL:
+        g_print ("%s is showing all\n", priv->node->name);
+
+        clutter_actor_show ((ClutterActor *) priv->up_tile);
+        clutter_actor_animate ((ClutterActor *) priv->up_tile,
+                               CLUTTER_EASE_IN_OUT_CUBIC, 500,
+                               "opacity", 0xff,
+                               NULL);
+
+        payload_node = hrn_tileable_get_node ((HrnTileable *) payload);
+        iter = g_sequence_get_begin_iter (priv->node->children);
+        while (g_sequence_iter_is_end (iter) == FALSE) {
+            HrnClusterNode *child_node = g_sequence_get (iter);
+            ClutterActor *child;
+
+            g_print ("showing %s\n", child_node->name);
+            child = g_hash_table_lookup (priv->child_items, child_node);
+            if (child == NULL) {
+                g_warning ("%s No child found for %s",
+                           G_STRLOC, child_node->name);
+                iter = g_sequence_iter_next (iter);
+                continue;
+            }
+
+            if (child_node != payload_node && HRN_IS_TILER (payload)) {
+                hrn_tiler_set_expanded ((HrnTiler *) payload, FALSE);
+            }
+
+            show_child (cluster, child);
+            iter = g_sequence_iter_next (iter);
+        }
+
+        priv->shown_child = NULL;
+        if (priv->expanded) {
+            layout_cluster (cluster);
+        }
+
+        hrn_tileable_activated ((HrnTileable *) cluster,
+                                HRN_TILEABLE_ACTION_LEVEL_CHANGE, priv->node);
+        return;
+
+    default:
+        break;
+    }
+
+    hrn_tileable_activated ((HrnTileable *) cluster, action, payload);
+}
+
+static void
+child_count_changed_cb (HrnTileable *tileable,
+                        int          old_count,
+                        int          new_count,
+                        HrnCluster  *cluster)
+{
+    HrnClusterPrivate *priv = cluster->priv;
+    int old_total, row_count;
+
+    old_total = priv->count;
+    priv->count -= (old_count - new_count);
+
+    row_count = 1 + ((priv->count + (priv->children->len - 1)) / priv->items_per_row) - priv->base_y;
+    clutter_actor_set_size ((ClutterActor *) cluster,
+                            priv->items_per_row * (ITEM_WIDTH + COL_GAP),
+                            row_count * (ITEM_HEIGHT + ROW_GAP));
+
+    hrn_tileable_item_count_changed ((HrnTileable *) cluster,
+                                     old_total, priv->count);
+}
+
+static void
+child_visibility_changed_cb (HrnTileable *tileable,
+                             gboolean     hidden,
+                             HrnCluster  *cluster)
+{
+    HrnClusterPrivate *priv = cluster->priv;
+
+    if (hidden) {
+        priv->visible_children--;
+        clutter_actor_hide ((ClutterActor *) tileable);
+        clutter_actor_set_position ((ClutterActor *) tileable, 0, 0);
+    } else {
+        priv->visible_children++;
+        if (priv->expanded) {
+            clutter_actor_show ((ClutterActor *) tileable);
+            /* The position will be set correctly by the relayout */
+        }
+    }
+
+    if (priv->expanded) {
+        layout_cluster (cluster);
+    }
+}
+
+/* FIXME: HrnCluster should implement ClutterContainer,
+   well, it does by being a subclass of ClutterGroup, but it should be
+   a ClutterActor and implement it itself. */
+void
+hrn_cluster_add_actor (HrnCluster  *cluster,
+                       HrnTileable *tileable)
+{
+    HrnClusterPrivate *priv = cluster->priv;
+
+    if (!HRN_IS_TILEABLE (tileable)) {
+        g_warning ("Cannot add %s to HrnCluster as it does not implement HrnTileable", G_OBJECT_TYPE_NAME (tileable));
+        return;
+    }
+
+    clutter_container_add_actor ((ClutterContainer *) cluster,
+                                 (ClutterActor *) tileable);
+    if (priv->expanded == FALSE) {
+        clutter_actor_hide ((ClutterActor *) tileable);
+    }
+
+    g_signal_connect (tileable, "activated",
+                      G_CALLBACK (child_activated_cb), cluster);
+    g_signal_connect (tileable, "count-changed",
+                      G_CALLBACK (child_count_changed_cb), cluster);
+    g_signal_connect (tileable, "visibility-changed",
+                      G_CALLBACK (child_visibility_changed_cb), cluster);
+
+    g_ptr_array_add (priv->children, tileable);
+}
+
+void
+hrn_cluster_full (HrnCluster *cluster)
+{
+    HrnClusterPrivate *priv = cluster->priv;
+
+#if 0
+    hrn_cluster_thumbnail_set_elements ((HrnClusterThumbnail *) priv->thumbnail, priv->children);
+#endif
+
+    if (priv->expanded) {
+        layout_cluster (cluster);
+    }
+}
+
+void
+hrn_cluster_set_secondary_reactive (HrnCluster *cluster,
+                                    gboolean    reactive)
+{
+    HrnClusterPrivate *priv = cluster->priv;
+
+    clutter_actor_set_reactive ((ClutterActor *) priv->secondary, reactive);
+}
+
+const char *
+hrn_cluster_get_label (HrnCluster *cluster)
+{
+    HrnClusterClass *klass = HRN_CLUSTER_GET_CLASS (cluster);
+
+    return klass->get_label (cluster);
+}
diff -pruN 1.5.1-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-controls.c 1.8.4-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-controls.c
--- 1.5.1-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-controls.c	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-controls.c	2010-02-17 17:26:44.000000000 +0000
@@ -0,0 +1,402 @@
+/*
+ * Hornsey - Moblin Media Player.
+ * Copyright © 2009 Intel Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU Lesser General Public License,
+ * version 2.1, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+
+#define ROW_OFFSET    5
+#define ROW_HEIGHT    40
+
+#include <clutter/clutter.h>
+#include <cogl/cogl.h>
+
+#include <math.h>
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include "hrn.h"
+#include "hrn-controls.h"
+
+enum {
+    LEAVE_THEATRE,
+    REQUEST_NEXT,
+    REQUEST_PREVIOUS,
+    PLAYING_CHANGED,
+    POSITION_CHANGED,
+    LAST_SIGNAL
+};
+
+#define    QUEUE_TIP_HEIGHT    47  /* used to determine drops on tip */
+
+G_DEFINE_TYPE (HrnControls, hrn_controls, MX_TYPE_FRAME);
+
+#define HRN_CONTROLS_GET_PRIVATE(obj)                 \
+  (G_TYPE_INSTANCE_GET_PRIVATE ((obj), \
+                                HRN_TYPE_CONTROLS, \
+                                HrnControlsPrivate))
+
+static guint32 signals[LAST_SIGNAL] = {0, };
+struct _HrnControlsPrivate
+{
+    HrnTheatre *theatre;
+
+    ClutterActor *header;
+    ClutterActor *next;
+    ClutterActor *back;
+    ClutterActor *playpause;
+    ClutterActor *progress_table;
+    ClutterActor *timebar;
+    ClutterActor *time;
+    ClutterActor *length;
+
+    guint32 visual_progress_id;
+    guint32 play_pause_id;
+    gboolean playing;
+
+    ClutterActor *title;
+
+    guint64 duration;
+
+    /* FIXME: This is a hack because g_signal_handler_block
+       is apparently not working */
+    gboolean ignore_position_change;
+};
+
+static GObject * hrn_controls_constructor (GType                  type,
+                                           guint                  n_params,
+                                           GObjectConstructParam *params);
+static void hrn_controls_dispose          (GObject               *object);
+
+static void
+hrn_controls_class_init (HrnControlsClass *klass)
+{
+  GObjectClass      *gobject_class = G_OBJECT_CLASS (klass);
+
+  gobject_class->dispose      = hrn_controls_dispose;
+  gobject_class->constructor  = hrn_controls_constructor;
+
+  g_type_class_add_private (gobject_class, sizeof (HrnControlsPrivate));
+
+  signals[LEAVE_THEATRE] = g_signal_new ("leave-theatre",
+                                         G_TYPE_FROM_CLASS (gobject_class),
+                                         G_SIGNAL_RUN_FIRST |
+                                         G_SIGNAL_NO_RECURSE, 0, NULL, NULL,
+                                         g_cclosure_marshal_VOID__VOID,
+                                         G_TYPE_NONE, 0);
+  signals[REQUEST_NEXT] = g_signal_new ("request-next",
+                                        G_TYPE_FROM_CLASS (gobject_class),
+                                        G_SIGNAL_RUN_FIRST |
+                                        G_SIGNAL_NO_RECURSE, 0, NULL, NULL,
+                                        g_cclosure_marshal_VOID__VOID,
+                                        G_TYPE_NONE, 0);
+  signals[REQUEST_PREVIOUS] = g_signal_new ("request-previous",
+                                            G_TYPE_FROM_CLASS (gobject_class),
+                                            G_SIGNAL_RUN_FIRST |
+                                            G_SIGNAL_NO_RECURSE, 0, NULL, NULL,
+                                            g_cclosure_marshal_VOID__VOID,
+                                            G_TYPE_NONE, 0);
+  signals[PLAYING_CHANGED] = g_signal_new ("request-playing-changed",
+                                           G_TYPE_FROM_CLASS (gobject_class),
+                                           G_SIGNAL_RUN_FIRST |
+                                           G_SIGNAL_NO_RECURSE, 0, NULL, NULL,
+                                           g_cclosure_marshal_VOID__BOOLEAN,
+                                           G_TYPE_NONE, 1, G_TYPE_BOOLEAN);
+  signals[POSITION_CHANGED] = g_signal_new ("position-changed",
+                                            G_TYPE_FROM_CLASS (gobject_class),
+                                            G_SIGNAL_RUN_FIRST |
+                                            G_SIGNAL_NO_RECURSE, 0, NULL, NULL,
+                                            g_cclosure_marshal_VOID__DOUBLE,
+                                            G_TYPE_NONE, 1, G_TYPE_DOUBLE);
+}
+
+static void
+hrn_controls_init (HrnControls *self)
+{
+    HrnControlsPrivate *priv;
+
+    priv = self->priv = HRN_CONTROLS_GET_PRIVATE (self);
+
+    priv->ignore_position_change = FALSE;
+}
+
+static void
+playpause_clicked_cb (MxButton  *button,
+                      HrnControls *controls)
+{
+    HrnControlsPrivate *priv = controls->priv;
+
+    hrn_controls_set_playing (controls, !priv->playing);
+    g_signal_emit (controls, signals[PLAYING_CHANGED], 0, priv->playing);
+}
+
+
+static void
+next_clicked_cb (MxButton   *button,
+                 HrnControls  *controls)
+{
+    g_signal_emit (controls, signals[REQUEST_NEXT], 0);
+}
+
+static void
+back_clicked_cb (MxButton   *button,
+                 HrnControls  *controls)
+{
+    g_signal_emit (controls, signals[REQUEST_PREVIOUS], 0);
+}
+
+#define SECONDS_PER_MINUTE 60
+#define SECONDS_PER_HOUR 3600
+
+static char *
+nanosecs_to_time (guint64 duration)
+{
+    guint dsec = duration;
+    guint seconds = 0, minutes = 0, hours = 0;
+
+    if (dsec > SECONDS_PER_HOUR) {
+        hours = dsec / SECONDS_PER_HOUR;
+        dsec = dsec % SECONDS_PER_HOUR;
+    }
+
+    if (dsec > SECONDS_PER_MINUTE) {
+        minutes = dsec / SECONDS_PER_MINUTE;
+        dsec = dsec % SECONDS_PER_MINUTE;
+    }
+
+    seconds = dsec;
+
+    /* FIXME: Would be nice to use a static string to save constant
+       reallocations */
+    return g_strdup_printf ("%02d:%02d.%02d", hours, minutes, seconds);
+}
+
+static void
+visual_progress_notify (MxSlider    *slider,
+                        GParamSpec  *pspec,
+                        HrnControls *controls)
+{
+    HrnControlsPrivate *priv = controls->priv;
+    double position;
+    char *dstr;
+
+    position = mx_slider_get_progress (slider);
+    dstr = nanosecs_to_time (priv->duration * position);
+    mx_label_set_text ((MxLabel *) priv->time, dstr);
+    g_free (dstr);
+
+    if (priv->ignore_position_change == FALSE) {
+        g_signal_emit (controls, signals[POSITION_CHANGED], 0, position);
+    }
+    priv->ignore_position_change = FALSE;
+}
+
+static GObject *
+hrn_controls_constructor (GType type, guint n_params,
+                          GObjectConstructParam *params)
+{
+  HrnControlsPrivate *priv;
+  GObject            *object;
+  HrnControls        *controls;
+
+  object = G_OBJECT_CLASS (hrn_controls_parent_class)->constructor (
+    type, n_params, params);
+
+  controls = HRN_CONTROLS (object);
+  priv = controls->priv;
+
+  mx_bin_set_fill (MX_BIN (controls), TRUE, TRUE);
+
+  priv->header = mx_table_new ();
+  clutter_container_add_actor ((ClutterContainer *) controls, priv->header);
+
+  priv->playpause = mx_button_new ();
+  priv->playing = FALSE;
+  clutter_actor_set_name (priv->playpause, "hrn-controls-play");
+  priv->play_pause_id = g_signal_connect (priv->playpause, "clicked",
+                                          G_CALLBACK (playpause_clicked_cb),
+                                          controls);
+  mx_table_add_actor_with_properties (MX_TABLE (priv->header),
+                                      priv->playpause, 0, 0,
+                                      "row-span", 2,
+                                      "x-align", 0.0,
+                                      "y-align", 0.0,
+                                      "x-fill", FALSE,
+                                      "x-expand", FALSE,
+                                      NULL);
+
+
+  priv->back = mx_button_new ();
+  clutter_actor_set_name (priv->back, "hrn-controls-back");
+  g_signal_connect (priv->back, "clicked",
+                    G_CALLBACK (back_clicked_cb), controls);
+  mx_table_add_actor_with_properties (MX_TABLE (priv->header),
+                                      priv->back, 0, 1,
+                                      "row-span", 2,
+                                      "x-align", 0.0,
+                                      "y-align", 0.0,
+                                      "x-fill", FALSE,
+                                      "x-expand", FALSE,
+                                      NULL);
+
+  priv->next = mx_button_new ();
+  clutter_actor_set_name (priv->next, "hrn-controls-next");
+  g_signal_connect (priv->next, "clicked",
+                    G_CALLBACK (next_clicked_cb), controls);
+  mx_table_add_actor_with_properties (MX_TABLE (priv->header),
+                                      priv->next, 0, 2,
+                                      "row-span", 2,
+                                      "x-align", 0.0,
+                                      "y-align", 0.0,
+                                      "x-fill", FALSE,
+                                      "x-expand", FALSE,
+                                      NULL);
+
+  priv->title = mx_label_new ("");
+  mx_table_add_actor_with_properties (MX_TABLE (priv->header),
+                                      priv->title,
+                                      0, 3,
+                                      "x-align", 0.0,
+                                      "y-align", 0.5,
+                                      "x-fill", TRUE,
+                                      "x-expand", TRUE,
+                                      "y-fill", FALSE,
+                                      NULL);
+
+  priv->progress_table = mx_table_new ();
+  mx_table_set_col_spacing (MX_TABLE (priv->progress_table), 8);
+  mx_table_add_actor_with_properties (MX_TABLE (priv->header),
+                                      priv->progress_table,
+                                      1, 3,
+                                      "x-align", 0.0,
+                                      "y-align", 0.5,
+                                      "x-fill", TRUE,
+                                      "x-expand", TRUE,
+                                      "y-fill", FALSE,
+                                      NULL);
+
+  priv->time = mx_label_new ("0:00.00");
+  mx_table_add_actor_with_properties (MX_TABLE (priv->progress_table),
+                                      priv->time, 0, 0,
+                                      "x-align", 0.0,
+                                      "y-align", 0.5,
+                                      "x-fill", FALSE,
+                                      "x-expand", FALSE,
+                                      "y-fill", FALSE,
+                                      "y-expand", FALSE,
+                                      NULL);
+
+  priv->timebar = mx_slider_new ();
+  mx_table_add_actor_with_properties (MX_TABLE (priv->progress_table),
+                                      priv->timebar, 0, 1,
+                                      "y-align", 0.5,
+                                      "y-fill", FALSE,
+                                      "x-expand", TRUE,
+                                      "x-fill", TRUE,
+                                      NULL);
+
+  priv->visual_progress_id =
+    g_signal_connect (priv->timebar,
+                      "notify::progress",
+                      G_CALLBACK (visual_progress_notify),
+                      controls);
+
+  priv->length = mx_label_new ("00:00.00");
+  mx_table_add_actor_with_properties (MX_TABLE (priv->progress_table),
+                                        CLUTTER_ACTOR (priv->length), 0, 2,
+                                        "x-align", 0.0,
+                                        "y-align", 0.5,
+                                        "x-fill", FALSE,
+                                        "x-expand", FALSE,
+                                        "y-fill", FALSE,
+                                        NULL);
+
+  clutter_actor_set_reactive (CLUTTER_ACTOR (object), TRUE);
+
+  /* hrn_controls_hide_video_progress (controls); */
+
+  return object;
+}
+
+static void
+hrn_controls_dispose (GObject *object)
+{
+  G_OBJECT_CLASS (hrn_controls_parent_class)->dispose (object);
+}
+
+HrnControls *
+hrn_controls_new (void)
+{
+  HrnControls *queue = g_object_new (HRN_TYPE_CONTROLS, NULL);
+
+  return queue;
+}
+
+void
+hrn_controls_set_playing (HrnControls *controls,
+                          gboolean     playing)
+{
+    HrnControlsPrivate *priv = controls->priv;
+
+    priv->playing = playing;
+    clutter_actor_set_name (priv->playpause, playing ?
+                            "hrn-controls-pause" : "hrn-controls-play");
+}
+
+void
+hrn_controls_set_title (HrnControls *controls,
+                        const char  *title)
+{
+    HrnControlsPrivate *priv = controls->priv;
+
+    mx_label_set_text ((MxLabel *) priv->title, title);
+}
+
+void
+hrn_controls_show_progress (HrnControls *controls,
+                            gboolean     shown)
+{
+    HrnControlsPrivate *priv = controls->priv;
+
+    if (shown) {
+        clutter_actor_show (CLUTTER_ACTOR (priv->progress_table));
+    } else {
+        clutter_actor_hide (CLUTTER_ACTOR (priv->progress_table));
+    }
+}
+
+void
+hrn_controls_set_position (HrnControls *controls,
+                           double       position)
+{
+    HrnControlsPrivate *priv = controls->priv;
+
+    priv->ignore_position_change = TRUE;
+    mx_slider_set_progress (MX_SLIDER (priv->timebar), position);
+}
+
+void
+hrn_controls_set_duration (HrnControls *controls,
+                           guint64      duration)
+{
+    HrnControlsPrivate *priv = controls->priv;
+    char *dstr;
+
+    priv->duration = duration;
+    dstr = nanosecs_to_time (duration);
+
+    mx_label_set_text ((MxLabel *) priv->length, dstr);
+    g_free (dstr);
+}
diff -pruN 1.5.1-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-queue.c 1.8.4-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-queue.c
--- 1.5.1-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-queue.c	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-queue.c	2010-02-17 17:26:44.000000000 +0000
@@ -0,0 +1,510 @@
+#include <config.h>
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <gio/gio.h>
+
+#include "hrn.h"
+#include "hrn-queue-item-factory.h"
+#include "hrn-queue-item.h"
+#include "hrn-queue.h"
+#include "hrn-queue-header.h"
+
+enum {
+    PROP_0,
+    PROP_QUEUE,
+    PROP_MANAGER
+};
+
+struct _HrnQueuePrivate {
+    ClutterModel *model;
+    HrnQueueItemFactory *factory;
+    HrnQueueHeader *header;
+    /* HrnSourceManager *manager; */
+    HrnTrackerClient *tracker;
+    BrQueue *queue;
+
+    ClutterActor *scroll;
+    ClutterActor *listview;
+};
+
+#define QUEUE_HEIGHT 200.0
+
+enum {
+    MODEL_ITEM,
+    MODEL_URI,
+};
+
+#define GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), HRN_TYPE_QUEUE, HrnQueuePrivate))
+G_DEFINE_TYPE (HrnQueue, hrn_queue, MX_TYPE_FRAME);
+
+static void
+hrn_queue_finalize (GObject *object)
+{
+    G_OBJECT_CLASS (hrn_queue_parent_class)->finalize (object);
+}
+
+static void
+hrn_queue_dispose (GObject *object)
+{
+    G_OBJECT_CLASS (hrn_queue_parent_class)->dispose (object);
+}
+
+static void
+clear_header (HrnQueue *queue)
+{
+    HrnQueuePrivate *priv = queue->priv;
+
+    g_object_set (priv->header,
+                  "primary", _("Music Playqueue"),
+                  "secondary", _("Add music to start"),
+                  "thumbnail", NULL,
+                  NULL);
+}
+
+static void
+brq_uri_added (BrQueue    *brq,
+               const char *uri,
+               int         position,
+               HrnQueue   *queue)
+{
+    HrnQueuePrivate *priv = queue->priv;
+    HrnItem *item;
+
+    item = hrn_tracker_client_get_item_for_uri (priv->tracker, uri);
+
+    g_print ("Item added for %s is %p\n", uri, item);
+    clutter_model_insert (priv->model, position,
+                          MODEL_ITEM, item,
+                          MODEL_URI, uri,
+                          -1);
+    hrn_queue_header_expand (priv->header, TRUE);
+}
+
+static void
+brq_uri_removed (BrQueue    *brq,
+                 const char *uri,
+                 int         position,
+                 HrnQueue   *queue)
+{
+    HrnQueuePrivate *priv = queue->priv;
+
+    clutter_model_remove (priv->model, position);
+
+    if (clutter_model_get_n_rows (priv->model) == 0) {
+        clear_header (queue);
+    }
+}
+
+static void
+brq_position_changed (BrQueue  *brq,
+                      double    position,
+                      HrnQueue *queue)
+{
+    HrnQueuePrivate *priv = queue->priv;
+
+    hrn_queue_header_set_progress (priv->header, position);
+}
+
+static void
+set_now_playing (HrnQueue   *queue,
+                 HrnItem    *item,
+                 const char *uri)
+{
+    HrnQueuePrivate *priv = queue->priv;
+
+    if (item == NULL && uri) {
+        char *filename, *unesc;
+
+        filename = g_path_get_basename (uri);
+        unesc = g_uri_unescape_string (filename, NULL);
+        g_free (filename);
+
+        g_object_set (priv->header,
+                      "primary", unesc,
+                      "secondary", "",
+                      NULL);
+        g_free (unesc);
+    } else if (item) {
+        const char *primary, *secondary;
+
+        primary = hrn_item_get_metadata (item, HRN_ITEM_METADATA_TITLE);
+        secondary = hrn_item_get_metadata (item, HRN_ITEM_METADATA_ARTIST);
+        if (secondary == NULL || *secondary == '\0') {
+            secondary = _("Unknown Artist");
+        }
+
+        g_object_set (priv->header,
+                      "primary", primary ? primary : _("Unknown"),
+                      "secondary", secondary,
+                      NULL);
+    } else {
+        /* Erk? */
+        g_object_set (priv->header,
+                      "primary", _("Unknown"),
+                      "secondary", _("Unknown Artist"),
+                      NULL);
+    }
+}
+
+static void
+brq_index_changed (BrQueue  *brq,
+                   int       idx,
+                   HrnQueue *queue)
+{
+    HrnQueuePrivate *priv = queue->priv;
+    ClutterModelIter *iter;
+    HrnItem *item;
+    char *uri;
+
+    iter = clutter_model_get_iter_at_row (priv->model, idx);
+    if (iter == NULL) {
+        g_warning ("Error getting iter at row %d", idx);
+        return;
+    }
+
+    clutter_model_iter_get (iter,
+                            MODEL_ITEM, &item,
+                            MODEL_URI, &uri,
+                            -1);
+
+    set_now_playing (queue, item, uri);
+    if (item) {
+        g_object_unref (item);
+    }
+    g_free (uri);
+}
+
+static void
+list_uris_reply (BrQueue       *brq,
+                 const char   **uris,
+                 const GError  *error,
+                 gpointer       data)
+{
+    HrnQueue *queue = (HrnQueue *) data;
+    HrnQueuePrivate *priv = queue->priv;
+    int i;
+
+    if (error != NULL) {
+        g_warning ("Error listing queue uris: %s", error->message);
+        return;
+    }
+
+    for (i = 0; uris[i]; i++) {
+        HrnItem *item = hrn_tracker_client_get_item_for_uri (priv->tracker,
+                                                             uris[i]);
+        clutter_model_append (priv->model,
+                              MODEL_ITEM, item,
+                              MODEL_URI, uris[i],
+                              -1);
+    }
+    hrn_queue_header_expand (priv->header, TRUE);
+}
+
+static void
+get_index_reply (BrQueue      *brq,
+                 int           idx,
+                 const GError *error,
+                 gpointer      data)
+{
+    if (error != NULL) {
+        g_warning ("Error getting index: %s", error->message);
+        return;
+    }
+
+    brq_index_changed (brq, idx, data);
+}
+
+static void
+tracker_ready_cb (HrnTrackerClient *tracker,
+                  HrnQueue         *queue)
+{
+    HrnQueuePrivate *priv = queue->priv;
+
+    if (priv->queue) {
+        br_queue_list_uris (priv->queue, list_uris_reply, queue);
+        br_queue_get_index (priv->queue, get_index_reply, queue);
+    }
+}
+
+static void
+hrn_queue_set_property (GObject      *object,
+                        guint         prop_id,
+                        const GValue *value,
+                        GParamSpec   *pspec)
+{
+    HrnQueue *self = (HrnQueue *) object;
+    HrnQueuePrivate *priv = self->priv;
+
+    switch (prop_id) {
+    case PROP_QUEUE:
+        priv->queue = g_value_dup_object (value);
+        g_signal_connect (priv->queue, "uri-added",
+                          G_CALLBACK (brq_uri_added), self);
+        g_signal_connect (priv->queue, "uri-removed",
+                          G_CALLBACK (brq_uri_removed), self);
+        g_signal_connect (priv->queue, "index-changed",
+                          G_CALLBACK (brq_index_changed), self);
+        g_signal_connect (priv->queue, "position-changed",
+                          G_CALLBACK (brq_position_changed), self);
+
+        /* br_queue_get_name (priv->queue, get_name_reply, self); */
+        break;
+
+    case PROP_MANAGER:
+        priv->tracker = g_value_dup_object (value);
+
+        if (hrn_tracker_client_is_ready (priv->tracker)) {
+            tracker_ready_cb (priv->tracker, self);
+        } else {
+            g_signal_connect (priv->tracker, "ready",
+                              G_CALLBACK (tracker_ready_cb), self);
+        }
+        break;
+
+    default:
+        break;
+    }
+}
+
+static void
+hrn_queue_get_property (GObject    *object,
+                        guint       prop_id,
+                        GValue     *value,
+                        GParamSpec *pspec)
+{
+    switch (prop_id) {
+
+    default:
+        break;
+    }
+}
+
+#if 0
+static GObject *
+hrn_queue_constructor (GType                  type,
+                       guint                  n_params,
+                       GObjectConstructParam *params)
+{
+    HrnQueuePrivate *priv;
+    GObject *object;
+    HrnQueue *queue;
+
+    object = G_OBJECT_CLASS (hrn_queue_parent_class)->constructor (type,
+                                                                   n_params,
+                                                                   params);
+    queue = (HrnQueue *) object;
+    priv = queue->priv;
+
+    return object;
+}
+#endif
+
+static void
+hrn_queue_class_init (HrnQueueClass *klass)
+{
+    GObjectClass *o_class = (GObjectClass *) klass;
+
+    o_class->dispose = hrn_queue_dispose;
+    o_class->finalize = hrn_queue_finalize;
+    o_class->set_property = hrn_queue_set_property;
+    o_class->get_property = hrn_queue_get_property;
+    /* o_class->constructor = hrn_queue_constructor; */
+
+    g_type_class_add_private (klass, sizeof (HrnQueuePrivate));
+
+    g_object_class_install_property (o_class, PROP_QUEUE,
+                                     g_param_spec_object ("queue", "", "",
+                                                          BR_TYPE_QUEUE,
+                                                          G_PARAM_STATIC_STRINGS |
+                                                          G_PARAM_CONSTRUCT_ONLY |
+                                                          G_PARAM_WRITABLE));
+    g_object_class_install_property (o_class, PROP_MANAGER,
+                                     g_param_spec_object ("tracker-client",
+                                                          "", "",
+                                                          HRN_TYPE_TRACKER_CLIENT,
+                                                          G_PARAM_STATIC_STRINGS |
+                                                          G_PARAM_CONSTRUCT_ONLY |
+                                                          G_PARAM_WRITABLE));
+}
+
+
+static void
+progress_notify_cb (HrnQueueHeader *header,
+                    double          position,
+                    HrnQueue       *queue)
+{
+    HrnQueuePrivate *priv = queue->priv;
+
+    br_queue_set_position (priv->queue, position);
+}
+
+static void
+expanded_clicked_cb (HrnQueueHeader *header,
+                     gboolean        expanded,
+                     HrnQueue       *queue)
+{
+    HrnQueuePrivate *priv = queue->priv;
+
+    if (expanded) {
+        clutter_actor_animate (priv->scroll,
+                               CLUTTER_EASE_IN_OUT_CUBIC, 350,
+                               "height", QUEUE_HEIGHT,
+                               NULL);
+        clutter_actor_show ((ClutterActor *) priv->scroll);
+    } else {
+        clutter_actor_animate (priv->scroll,
+                               CLUTTER_EASE_IN_OUT_CUBIC, 350,
+                               "height", 0.0,
+                               "signal-swapped::completed",
+                               clutter_actor_hide, priv->scroll,
+                               NULL);
+    }
+}
+
+static void
+item_clicked_cb (HrnQueueItemFactory *factory,
+                 HrnQueueItem        *item,
+                 HrnQueue            *queue)
+{
+    HrnQueuePrivate *priv = queue->priv;
+    char *uri;
+    ClutterModelIter *iter;
+    int row = -1;
+
+    g_object_get (item,
+                  "uri", &uri,
+                  NULL);
+
+    if (uri == NULL) {
+        g_warning ("No uri for item");
+        return;
+    }
+
+    /* Look through the model to find the row
+       FIXME: there really should have been a better way to do this */
+    iter = clutter_model_get_first_iter (priv->model);
+    while (!clutter_model_iter_is_last (iter)) {
+        char *model_uri;
+
+        clutter_model_iter_get (iter,
+                                MODEL_URI, &model_uri,
+                                -1);
+
+        if (model_uri == NULL) {
+            g_warning ("No uri for model");
+            iter = clutter_model_iter_next (iter);
+            continue;
+        }
+
+        if (g_str_equal (model_uri, uri)) {
+            row = clutter_model_iter_get_row (iter);
+            g_free (model_uri);
+            break;
+        }
+
+        iter = clutter_model_iter_next (iter);
+    }
+
+    g_free (uri);
+
+    if (row == -1) {
+        return;
+    }
+
+    br_queue_set_index (priv->queue, row);
+}
+
+static void
+hrn_queue_init (HrnQueue *self)
+{
+    HrnQueuePrivate *priv = GET_PRIVATE (self);
+    ClutterActor *layout;
+
+    self->priv = priv;
+    mx_bin_set_fill (MX_BIN (self), TRUE, TRUE);
+    priv->model = clutter_list_model_new (2, HRN_TYPE_ITEM, "item",
+                                          G_TYPE_STRING, "uri");
+
+    layout = (ClutterActor *) mx_box_layout_new ();
+    mx_box_layout_set_vertical ((MxBoxLayout *) layout, TRUE);
+    clutter_container_add_actor ((ClutterContainer *) self, layout);
+
+    priv->header = g_object_new (HRN_TYPE_QUEUE_HEADER, NULL);
+    g_signal_connect (priv->header, "expand",
+                      G_CALLBACK (expanded_clicked_cb), self);
+    g_signal_connect (priv->header, "progress",
+                      G_CALLBACK (progress_notify_cb), self);
+    clutter_container_add_actor ((ClutterContainer *) layout,
+                                 (ClutterActor *) priv->header);
+    clear_header (self);
+
+    priv->scroll = mx_scroll_view_new ();
+    clutter_container_add_actor ((ClutterContainer *) layout,
+                                 (ClutterActor *) priv->scroll);
+    clutter_actor_set_height ((ClutterActor *) priv->scroll, QUEUE_HEIGHT);
+    priv->listview = mx_list_view_new ();
+    clutter_container_add_actor ((ClutterContainer *) priv->scroll,
+                                 (ClutterActor *) priv->listview);
+    mx_list_view_set_model (MX_LIST_VIEW (priv->listview), priv->model);
+
+    priv->factory = hrn_queue_item_factory_new ();
+    g_signal_connect (priv->factory, "item-clicked",
+                      G_CALLBACK (item_clicked_cb), self);
+    mx_list_view_set_factory (MX_LIST_VIEW (priv->listview),
+                                MX_ITEM_FACTORY (priv->factory));
+
+    mx_list_view_add_attribute (MX_LIST_VIEW (priv->listview), "item", 0);
+    mx_list_view_add_attribute (MX_LIST_VIEW (priv->listview), "uri", 1);
+}
+
+HrnQueue *
+hrn_queue_new (BrQueue          *queue,
+               HrnTrackerClient *tracker)
+{
+    HrnQueue *q;
+
+    q = g_object_new (HRN_TYPE_QUEUE,
+                      "queue", queue,
+                      "tracker-client", tracker,
+                      NULL);
+
+    return q;
+}
+
+
+void
+hrn_queue_play_uri_now (HrnQueue    *queue,
+                        const gchar *uri)
+{
+  HrnQueuePrivate *priv = queue->priv;
+  const char *uris[2] = {0, }, *mimetypes[2] = {0, };
+  GFile *file;
+  char *mimetype;
+
+  file = g_file_new_for_commandline_arg (uri);
+
+  mimetype = hrn_resolve_mimetype (uri);
+  uris[0] = g_file_get_uri (file);
+  mimetypes[0] = mimetype;
+
+  br_queue_append_uris (priv->queue, 1, uris, mimetypes);
+  br_queue_play (priv->queue);
+
+  g_free (mimetype);
+  g_object_unref (file);
+}
+
+void
+hrn_queue_play_now (HrnQueue *queue,
+                    HrnItem  *item)
+{
+  HrnQueuePrivate *priv = queue->priv;
+  const char *uris[2] = {0, }, *mimetypes[2] = {0, };
+
+  uris[0] = hrn_item_get_uri (item);
+  mimetypes[0] = hrn_item_get_mimetype (item);
+
+  br_queue_append_uris (priv->queue, 1, uris, mimetypes);
+  br_queue_set_index (priv->queue, BR_QUEUE_INDEX_END);
+  br_queue_play (priv->queue);
+}
diff -pruN 1.5.1-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-queue-header.c 1.8.4-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-queue-header.c
--- 1.5.1-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-queue-header.c	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-queue-header.c	2010-02-17 17:26:44.000000000 +0000
@@ -0,0 +1,315 @@
+#include "hrn-queue-header.h"
+
+enum {
+    PROP_0,
+    PROP_PRIMARY,
+    PROP_SECONDARY,
+    PROP_THUMBNAIL
+};
+
+enum {
+    EXPAND,
+    PROGRESS,
+    LAST_SIGNAL,
+};
+
+struct _HrnQueueHeaderPrivate {
+    ClutterActor *thumb_holder;
+    ClutterActor *thumbnail;
+    ClutterActor *primary;
+    ClutterActor *secondary;
+    ClutterActor *expand;
+    gboolean expanded;
+
+    guint32 progress_id;
+    ClutterActor *timebar;
+
+    gboolean playback_set_progress;
+};
+
+#define GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), HRN_TYPE_QUEUE_HEADER, HrnQueueHeaderPrivate))
+G_DEFINE_TYPE (HrnQueueHeader, hrn_queue_header, MX_TYPE_FRAME);
+static guint32 signals[LAST_SIGNAL] = {0,};
+
+#define QUEUE_WIDTH 170
+static void
+hrn_queue_header_finalize (GObject *object)
+{
+    G_OBJECT_CLASS (hrn_queue_header_parent_class)->finalize (object);
+}
+
+static void
+hrn_queue_header_dispose (GObject *object)
+{
+    G_OBJECT_CLASS (hrn_queue_header_parent_class)->dispose (object);
+}
+
+static void
+hrn_queue_header_set_property (GObject      *object,
+                               guint         prop_id,
+                               const GValue *value,
+                               GParamSpec   *pspec)
+{
+    HrnQueueHeader *self = (HrnQueueHeader *) object;
+    HrnQueueHeaderPrivate *priv = self->priv;
+
+    switch (prop_id) {
+    case PROP_PRIMARY:
+        mx_label_set_text ((MxLabel *) priv->primary,
+                             g_value_get_string (value));
+        break;
+
+    case PROP_SECONDARY:
+        mx_label_set_text ((MxLabel *) priv->secondary,
+                             g_value_get_string (value));
+        break;
+
+    case PROP_THUMBNAIL:
+        if (priv->thumbnail) {
+            clutter_container_remove_actor ((ClutterContainer *) priv->thumb_holder,
+                                            priv->thumbnail);
+            priv->thumbnail = NULL;
+            clutter_actor_hide (priv->thumb_holder);
+        }
+
+        priv->thumbnail = g_value_get_object (value);
+        if (priv->thumbnail) {
+            gfloat           w, h;
+            gdouble          scale;
+
+            clutter_actor_show (priv->thumb_holder);
+            clutter_actor_get_size (priv->thumbnail, &w, &h);
+            if (w == 0 && h == 0) {
+                w = h = 36;
+                clutter_actor_set_size (priv->thumbnail, 36, 36);
+            }
+            scale = 36.0 / w;
+            clutter_container_add_actor ((ClutterContainer *) priv->thumb_holder,
+                                         priv->thumbnail);
+            clutter_actor_set_scale (priv->thumbnail, scale, scale);
+            clutter_actor_set_position (priv->thumbnail,
+                                        0, 0);
+        }
+        break;
+
+    default:
+        break;
+    }
+}
+
+static void
+hrn_queue_header_get_property (GObject    *object,
+                               guint       prop_id,
+                               GValue     *value,
+                               GParamSpec *pspec)
+{
+    switch (prop_id) {
+
+    default:
+        break;
+    }
+}
+
+static void
+hrn_queue_header_class_init (HrnQueueHeaderClass *klass)
+{
+    GObjectClass *o_class = (GObjectClass *) klass;
+
+    o_class->dispose = hrn_queue_header_dispose;
+    o_class->finalize = hrn_queue_header_finalize;
+    o_class->set_property = hrn_queue_header_set_property;
+    o_class->get_property = hrn_queue_header_get_property;
+
+    g_type_class_add_private (klass, sizeof (HrnQueueHeaderPrivate));
+
+    g_object_class_install_property (o_class, PROP_PRIMARY,
+                                     g_param_spec_string ("primary", "", "", "",
+                                                          G_PARAM_WRITABLE |
+                                                          G_PARAM_STATIC_STRINGS));
+    g_object_class_install_property (o_class, PROP_SECONDARY,
+                                     g_param_spec_string ("secondary",
+                                                          "", "", "",
+                                                          G_PARAM_WRITABLE |
+                                                          G_PARAM_STATIC_STRINGS));
+    g_object_class_install_property (o_class, PROP_THUMBNAIL,
+                                     g_param_spec_object ("thumbnail", "", "",
+                                                          CLUTTER_TYPE_ACTOR,
+                                                          G_PARAM_WRITABLE |
+                                                          G_PARAM_STATIC_STRINGS));
+    signals[EXPAND] = g_signal_new ("expand",
+                                    G_TYPE_FROM_CLASS (o_class),
+                                    G_SIGNAL_RUN_FIRST |
+                                    G_SIGNAL_NO_RECURSE, 0, NULL, NULL,
+                                    g_cclosure_marshal_VOID__BOOLEAN,
+                                    G_TYPE_NONE, 1, G_TYPE_BOOLEAN);
+    signals[PROGRESS] = g_signal_new ("progress",
+                                      G_TYPE_FROM_CLASS (o_class),
+                                      G_SIGNAL_RUN_FIRST |
+                                      G_SIGNAL_NO_RECURSE, 0, NULL, NULL,
+                                      g_cclosure_marshal_VOID__DOUBLE,
+                                      G_TYPE_NONE, 1, G_TYPE_DOUBLE);
+}
+
+static void
+expand_clicked_cb (MxButton     *expand,
+                   HrnQueueHeader *header)
+{
+    hrn_queue_header_expand (header, !header->priv->expanded);
+}
+
+static void
+progress_notify (GObject        *object,
+                 GParamSpec     *pspec,
+                 HrnQueueHeader *header)
+{
+    HrnQueueHeaderPrivate *priv = header->priv;
+    MxSlider *slider = MX_SLIDER (object);
+    gdouble progress = mx_slider_get_progress (slider);
+
+    if (!priv->playback_set_progress)
+      g_signal_emit (header, signals[PROGRESS], 0, progress);
+
+    priv->playback_set_progress = FALSE;
+}
+
+static void
+hrn_queue_header_init (HrnQueueHeader *self)
+{
+    const ClutterColor separator_color = { 0x82, 0x82, 0x82, 0xff };
+    HrnQueueHeaderPrivate *priv = GET_PRIVATE (self);
+    ClutterActor *label_box, *table, *separator;
+
+    self->priv = priv;
+    mx_bin_set_fill (MX_BIN (self), TRUE, TRUE);
+
+    table = mx_table_new ();
+    mx_table_set_row_spacing (MX_TABLE (table), 6);
+    mx_table_set_col_spacing (MX_TABLE (table), 6);
+
+    clutter_container_add_actor ((ClutterContainer *) self, table);
+
+    priv->thumb_holder = clutter_group_new ();
+    clutter_actor_set_size (priv->thumb_holder, 36, 36);
+    clutter_actor_hide (priv->thumb_holder);
+    mx_table_add_actor_with_properties (MX_TABLE (table),
+                                        priv->thumb_holder,
+                                        0, 0,
+                                        "x-fill", FALSE,
+                                        "x-expand", FALSE,
+                                        "x-align", 0.5,
+                                        "y-fill", FALSE,
+                                        "y-expand", FALSE,
+                                        "y-align", 0.5,
+                                        NULL);
+
+    label_box = mx_box_layout_new ();
+    mx_box_layout_set_vertical ((MxBoxLayout *) label_box, TRUE);
+    mx_box_layout_set_spacing ((MxBoxLayout *) label_box, 2);
+    mx_table_add_actor_with_properties (MX_TABLE (table),
+                                        label_box,
+                                        0, 1,
+                                        "x-fill", TRUE,
+                                        "x-expand", TRUE,
+                                        "x-align", 0.0,
+                                        "y-fill", TRUE,
+                                        "y-expand", TRUE,
+                                        "y-align", 0.5,
+                                        NULL);
+
+    priv->primary = mx_label_new ("");
+    clutter_actor_set_name (priv->primary, "hrn-queue-header-label");
+    clutter_container_add_actor ((ClutterContainer *) label_box,
+                                 priv->primary);
+
+    priv->secondary = mx_label_new ("");
+    clutter_actor_set_name (priv->secondary, "hrn-queue-header-meta-label");
+    clutter_container_add_actor ((ClutterContainer *) label_box,
+                                 priv->secondary);
+
+    separator = clutter_rectangle_new_with_color (&separator_color);
+    clutter_actor_set_width (separator, 1);
+    mx_table_add_actor_with_properties (MX_TABLE (table),
+                                        separator,
+                                        0, 2,
+                                        "x-fill", FALSE,
+                                        "x-expand", FALSE,
+                                        "y-fill", TRUE,
+                                        "y-expand", FALSE,
+                                        NULL);
+
+    priv->expand = mx_button_new ();
+    priv->expanded = FALSE;
+    clutter_actor_set_name (priv->expand, "hrn-queue-expanded-up");
+    mx_table_add_actor_with_properties (MX_TABLE (table),
+                                        priv->expand,
+                                        0, 3,
+                                        "x-fill", FALSE,
+                                        "x-expand", FALSE,
+                                        "y-fill", FALSE,
+                                        "y-expand", FALSE,
+                                        "y-align", 0.5,
+                                        NULL);
+    g_signal_connect (priv->expand, "clicked",
+                      G_CALLBACK (expand_clicked_cb), self);
+
+    priv->timebar = mx_slider_new ();
+    mx_table_add_actor_with_properties (MX_TABLE (table),
+                                        priv->timebar,
+                                        1, 0,
+                                        "x-fill", TRUE,
+                                        "x-expand", TRUE,
+                                        "y-fill", FALSE,
+                                        "y-expand", FALSE,
+                                        "col-span", 4,
+                                        NULL);
+    priv->progress_id = g_signal_connect (priv->timebar, "notify::progress",
+                                          G_CALLBACK (progress_notify), self);
+}
+
+void
+hrn_queue_header_show_progress (HrnQueueHeader *header,
+                                gboolean        show)
+{
+    HrnQueueHeaderPrivate *priv = header->priv;
+
+    if (show) {
+        clutter_actor_show (priv->timebar);
+        clutter_actor_animate (priv->timebar,
+                               CLUTTER_EASE_IN_OUT_CUBIC, 250,
+                               "opacity", 0xff,
+                               NULL);
+    } else {
+        clutter_actor_animate (priv->timebar,
+                               CLUTTER_EASE_IN_OUT_CUBIC, 250,
+                               "opacity", 0x00,
+                               "signal-swapped::completed",
+                                 clutter_actor_hide, priv->timebar,
+                               NULL);
+    }
+}
+
+void
+hrn_queue_header_set_progress (HrnQueueHeader *header,
+                               double          progress)
+{
+    HrnQueueHeaderPrivate *priv = header->priv;
+
+    priv->playback_set_progress = TRUE;
+    mx_slider_set_progress (MX_SLIDER (priv->timebar), progress);
+}
+
+void
+hrn_queue_header_expand (HrnQueueHeader *header,
+                         gboolean        expand)
+{
+    HrnQueueHeaderPrivate *priv = header->priv;
+
+    priv->expanded = expand;
+    clutter_actor_set_name (priv->expand, expand ?
+                            "hrn-queue-expanded-down" :
+                            "hrn-queue-expanded-up");
+    /* clear the pseudo class of the button so we don't end up with :hover
+     * at the end of the animation */
+    mx_stylable_set_style_pseudo_class (MX_STYLABLE (priv->expand), NULL);
+    g_signal_emit (header, signals[EXPAND], 0, expand);
+}
diff -pruN 1.5.1-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-queue-item.c 1.8.4-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-queue-item.c
--- 1.5.1-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-queue-item.c	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-queue-item.c	2010-02-17 17:26:44.000000000 +0000
@@ -0,0 +1,180 @@
+#include <glib/gi18n.h>
+
+#include "hrn-item.h"
+#include "hrn-queue-item.h"
+
+enum {
+    PROP_0,
+    PROP_ITEM,
+    PROP_URI
+};
+
+struct _HrnQueueItemPrivate {
+    ClutterActor *primary;
+    ClutterActor *secondary;
+
+    HrnItem *item;
+    char *uri;
+};
+
+#define GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), HRN_TYPE_QUEUE_ITEM, HrnQueueItemPrivate))
+G_DEFINE_TYPE (HrnQueueItem, hrn_queue_item, MX_TYPE_TABLE);
+
+static void
+hrn_queue_item_finalize (GObject *object)
+{
+    G_OBJECT_CLASS (hrn_queue_item_parent_class)->finalize (object);
+}
+
+static void
+hrn_queue_item_dispose (GObject *object)
+{
+    G_OBJECT_CLASS (hrn_queue_item_parent_class)->dispose (object);
+}
+
+static void
+update_tile (HrnQueueItem *item)
+{
+    HrnQueueItemPrivate *priv = item->priv;
+    const char *artist = NULL, *title = NULL;
+
+    title = hrn_item_get_metadata (priv->item, HRN_ITEM_METADATA_TITLE);
+    artist = hrn_item_get_metadata (priv->item, HRN_ITEM_METADATA_ARTIST);
+
+    if (artist && *artist == '\0') {
+        artist = NULL;
+    }
+
+    if (title && *title == '\0') {
+        title = NULL;
+    }
+
+    mx_label_set_text ((MxLabel *) priv->primary,
+                         title ? title : _("Unknown Title"));
+    mx_label_set_text ((MxLabel *) priv->secondary,
+                         artist ? artist : _("Unknown Artist"));
+}
+
+static void
+hrn_queue_item_set_property (GObject      *object,
+                             guint         prop_id,
+                             const GValue *value,
+                             GParamSpec   *pspec)
+{
+    HrnQueueItem *self = (HrnQueueItem *) object;
+    HrnQueueItemPrivate *priv = self->priv;
+    GObject *obj;
+
+    switch (prop_id) {
+    case PROP_ITEM:
+        obj = g_value_get_object (value);
+        if (obj != (GObject *)priv->item) {
+            if (priv->item) {
+                g_object_unref (priv->item);
+            }
+            priv->item = g_object_ref (obj);
+
+            update_tile (self);
+        }
+        break;
+
+    case PROP_URI:
+        if (priv->uri) {
+            g_free (priv->uri);
+        }
+        priv->uri = g_value_dup_string (value);
+        if (priv->item == NULL) {
+            char *filename, *unesc;
+
+            filename = g_path_get_basename (priv->uri);
+            unesc = g_uri_unescape_string (filename, NULL);
+            g_free (filename);
+
+            mx_label_set_text ((MxLabel *) priv->primary, unesc);
+            mx_label_set_text ((MxLabel *) priv->secondary, "");
+
+            g_free (unesc);
+        }
+        break;
+
+    default:
+        break;
+    }
+}
+
+static void
+hrn_queue_item_get_property (GObject    *object,
+                             guint       prop_id,
+                             GValue     *value,
+                             GParamSpec *pspec)
+{
+    HrnQueueItem *self = (HrnQueueItem *) object;
+    HrnQueueItemPrivate *priv = self->priv;
+
+    switch (prop_id) {
+    case PROP_ITEM:
+        g_value_set_object (value, priv->item);
+        break;
+
+    case PROP_URI:
+        g_value_set_string (value, priv->uri);
+        break;
+
+    default:
+        break;
+    }
+}
+
+static void
+hrn_queue_item_class_init (HrnQueueItemClass *klass)
+{
+    GObjectClass *o_class = (GObjectClass *) klass;
+
+    o_class->dispose = hrn_queue_item_dispose;
+    o_class->finalize = hrn_queue_item_finalize;
+    o_class->set_property = hrn_queue_item_set_property;
+    o_class->get_property = hrn_queue_item_get_property;
+
+    g_type_class_add_private (klass, sizeof (HrnQueueItemPrivate));
+
+    g_object_class_install_property (o_class, PROP_ITEM,
+                                     g_param_spec_object ("item", "", "",
+                                                          HRN_TYPE_ITEM,
+                                                          G_PARAM_STATIC_STRINGS |
+                                                          G_PARAM_READWRITE));
+    g_object_class_install_property (o_class, PROP_URI,
+                                     g_param_spec_string ("uri", "", "", "",
+                                                          G_PARAM_STATIC_STRINGS |
+                                                          G_PARAM_READWRITE));
+}
+
+static void
+hrn_queue_item_init (HrnQueueItem *self)
+{
+    HrnQueueItemPrivate *priv = GET_PRIVATE (self);
+
+    self->priv = priv;
+
+    priv->primary = mx_label_new ("");
+    clutter_actor_set_name (priv->primary, "hrn-queue-item-primary");
+    mx_table_add_actor_with_properties (MX_TABLE (self),
+                                        priv->primary, 0, 0,
+                                        "x-expand", FALSE,
+                                        "x-fill", FALSE,
+                                        "y-expand", FALSE,
+                                        "y-fill", FALSE,
+                                        "x-align", 0.0,
+                                        NULL);
+
+    priv->secondary = mx_label_new ("");
+    clutter_actor_set_name (priv->secondary, "hrn-queue-item-secondary");
+    mx_table_add_actor_with_properties (MX_TABLE (self),
+                                        priv->secondary, 1, 0,
+                                        "x-expand", FALSE,
+                                        "x-fill", FALSE,
+                                        "y-expand", FALSE,
+                                        "y-fill", FALSE,
+                                        "x-align", 0.0,
+                                        NULL);
+}
+
diff -pruN 1.5.1-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-searchbar.c 1.8.4-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-searchbar.c
--- 1.5.1-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-searchbar.c	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-searchbar.c	2010-02-17 17:26:44.000000000 +0000
@@ -0,0 +1,320 @@
+/*
+ * Hornsey - Moblin Media Player.
+ * Copyright © 2009 Intel Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU Lesser General Public License,
+ * version 2.1, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <clutter/clutter.h>
+#include <math.h>
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include "hrn.h"
+#include "hrn-searchbar.h"
+
+enum {
+    SEARCH_PINNED,
+    LAST_SIGNAL
+};
+
+G_DEFINE_TYPE (HrnSearchBar, hrn_search_bar, MX_TYPE_PATH_BAR);
+
+#define HRN_SEARCH_BAR_GET_PRIVATE(obj)                 \
+  (G_TYPE_INSTANCE_GET_PRIVATE ((obj), \
+                                HRN_TYPE_SEARCH_BAR, \
+                                HrnSearchBarPrivate))
+
+struct _HrnSearchBarPrivate
+{
+  ClutterActor *pin_button;
+  guint32 pin_id;
+
+  ClutterActor *clear_button;
+  HrnPinManager *pin_manager;
+
+  char *current_pin;
+};
+
+static GObject * hrn_search_bar_constructor (GType type, guint n_params,
+                                    GObjectConstructParam *params);
+static void hrn_search_bar_dispose (GObject               *object);
+static void hrn_searchbar_allocate (ClutterActor          *self,
+                                    const ClutterActorBox *box,
+                                    ClutterAllocationFlags flags);
+static void hrn_searchbar_paint    (ClutterActor          *actor);
+static void hrn_searchbar_pick     (ClutterActor          *actor,
+                                    const ClutterColor    *color);
+
+static guint32 signals[LAST_SIGNAL] = {0, };
+
+static void
+hrn_searchbar_map (ClutterActor *self)
+{
+  HrnSearchBarPrivate *priv = HRN_SEARCH_BAR (self)->priv;
+
+  CLUTTER_ACTOR_CLASS (hrn_search_bar_parent_class)->map (self);
+
+  if (priv->pin_button)
+    clutter_actor_map (priv->pin_button);
+  if (priv->clear_button)
+    clutter_actor_map (priv->clear_button);
+}
+
+
+static void
+hrn_searchbar_unmap (ClutterActor *self)
+{
+  HrnSearchBarPrivate *priv = HRN_SEARCH_BAR (self)->priv;
+
+  CLUTTER_ACTOR_CLASS (hrn_search_bar_parent_class)->unmap (self);
+
+  if (priv->pin_button)
+    clutter_actor_unmap (priv->pin_button);
+  if (priv->clear_button)
+    clutter_actor_unmap (priv->clear_button);
+}
+
+static gboolean
+hrn_search_bar_style_changed (MxWidget *widget)
+{
+  HrnSearchBarPrivate *priv = HRN_SEARCH_BAR (widget)->priv;
+
+  g_signal_emit_by_name (priv->pin_button, "style-changed", 0);
+  g_signal_emit_by_name (priv->clear_button, "style-changed", 0);
+
+  return FALSE;
+}
+
+static void
+hrn_search_bar_class_init (HrnSearchBarClass *klass)
+{
+  GObjectClass      *gobject_class = G_OBJECT_CLASS (klass);
+  ClutterActorClass *actor_class   = CLUTTER_ACTOR_CLASS (klass);
+
+  gobject_class->dispose      = hrn_search_bar_dispose;
+  gobject_class->constructor  = hrn_search_bar_constructor;
+  actor_class->paint          = hrn_searchbar_paint;
+  actor_class->pick           = hrn_searchbar_pick;
+  actor_class->map            = hrn_searchbar_map;
+  actor_class->unmap          = hrn_searchbar_unmap;
+  actor_class->allocate       = hrn_searchbar_allocate;
+
+  g_type_class_add_private (gobject_class, sizeof (HrnSearchBarPrivate));
+  signals[SEARCH_PINNED] = g_signal_new ("search-pinned",
+                                         G_TYPE_FROM_CLASS (klass),
+                                         G_SIGNAL_RUN_FIRST |
+                                         G_SIGNAL_NO_RECURSE, 0, NULL, NULL,
+                                         g_cclosure_marshal_VOID__BOOLEAN,
+                                         G_TYPE_NONE, 1, G_TYPE_BOOLEAN);
+}
+
+static void
+hrn_search_bar_init (HrnSearchBar *self)
+{
+  HrnSearchBarPrivate *priv = HRN_SEARCH_BAR_GET_PRIVATE (self);
+
+  self->priv = priv;
+  g_signal_connect (self, "style-changed", G_CALLBACK (hrn_search_bar_style_changed), NULL);
+
+  mx_path_bar_set_editable (MX_PATH_BAR (self), TRUE);
+}
+
+static void
+cleared (MxButton *togglebutton, MxPathBar *search_bar)
+{
+  const gchar *text = mx_path_bar_get_text (search_bar);
+
+  if (!text || !(*text))
+    mx_path_bar_pop (search_bar);
+  else
+    mx_path_bar_set_text (search_bar, "");
+}
+
+static void
+pin_toggled (MxButton   *togglebutton,
+             HrnSearchBar *search_bar)
+{
+    const char *search;
+
+    if (mx_button_get_checked (togglebutton) == FALSE) {
+        g_signal_emit (search_bar, signals[SEARCH_PINNED], 0, FALSE);
+        return;
+    }
+
+    search = mx_path_bar_get_text (MX_PATH_BAR (search_bar));
+    if (search == NULL || search[0] == '\0') {
+        g_print ("Unpinning here\n");
+        mx_button_set_checked (togglebutton, FALSE);
+        return;
+    }
+
+    g_signal_emit (search_bar, signals[SEARCH_PINNED], 0, TRUE);
+}
+
+void
+hrn_search_bar_set_pinned (HrnSearchBar *searchbar,
+                           gboolean      pinned)
+{
+  HrnSearchBarPrivate *priv = HRN_SEARCH_BAR_GET_PRIVATE (searchbar);
+
+  if (pinned) {
+      mx_button_set_checked (MX_BUTTON (priv->pin_button), TRUE);
+  } else {
+      if (mx_button_get_checked (MX_BUTTON (priv->pin_button))) {
+          mx_button_set_checked (MX_BUTTON (priv->pin_button), FALSE);
+    }
+  }
+}
+
+
+static GObject *
+hrn_search_bar_constructor (GType type, guint n_params,
+                            GObjectConstructParam *params)
+{
+  GObject             *object;
+  HrnSearchBar        *search_bar;
+  HrnSearchBarPrivate *priv;
+
+  object = G_OBJECT_CLASS (hrn_search_bar_parent_class)->constructor (
+    type, n_params, params);
+
+  search_bar         = HRN_SEARCH_BAR (object);
+  priv               = HRN_SEARCH_BAR_GET_PRIVATE (object);
+  priv->pin_button   = (void*) mx_button_new ();
+  priv->clear_button = (void*) mx_button_new ();
+
+  mx_button_set_toggle_mode (MX_BUTTON (priv->pin_button), TRUE);
+  clutter_actor_set_name (CLUTTER_ACTOR (priv->pin_button),
+                          "fav-toggle");
+  clutter_actor_set_name (CLUTTER_ACTOR (priv->clear_button),
+                          "clear-query");
+
+  clutter_actor_set_parent (CLUTTER_ACTOR (priv->pin_button),
+                            CLUTTER_ACTOR (object));
+  clutter_actor_set_parent (CLUTTER_ACTOR (priv->clear_button),
+                            CLUTTER_ACTOR (object));
+
+  priv->pin_id = g_signal_connect (priv->pin_button, "clicked",
+                                   G_CALLBACK (pin_toggled), object);
+  g_signal_connect (priv->clear_button, "clicked", G_CALLBACK (cleared), object);
+
+  clutter_actor_set_size (priv->pin_button, 32, 32);
+  clutter_actor_set_size (priv->clear_button, 32, 32);
+  clutter_actor_set_anchor_point_from_gravity (priv->pin_button,
+                                               CLUTTER_GRAVITY_NORTH_EAST);
+  clutter_actor_set_anchor_point_from_gravity (priv->clear_button,
+                                               CLUTTER_GRAVITY_NORTH_EAST);
+
+  return object;
+}
+
+static void
+hrn_search_bar_dispose (GObject *object)
+{
+  /* XXX: dispose of children */
+  G_OBJECT_CLASS (hrn_search_bar_parent_class)->dispose (object);
+}
+
+
+static void
+hrn_searchbar_allocate (ClutterActor *self, const ClutterActorBox *box,
+                        ClutterAllocationFlags flags)
+{
+  HrnSearchBarPrivate *priv = HRN_SEARCH_BAR_GET_PRIVATE (self);
+
+  CLUTTER_ACTOR_CLASS (hrn_search_bar_parent_class)->allocate (self, box, flags);
+
+  clutter_actor_set_x (CLUTTER_ACTOR (priv->pin_button),
+                       clutter_actor_get_width (self));
+  clutter_actor_set_x (CLUTTER_ACTOR (priv->clear_button),
+                       clutter_actor_get_x (priv->pin_button) -
+                       20);
+  clutter_actor_allocate_preferred_size (CLUTTER_ACTOR (
+                                           priv->pin_button), flags);
+  clutter_actor_allocate_preferred_size (CLUTTER_ACTOR (
+                                           priv->clear_button), flags);
+}
+
+static void
+hrn_searchbar_paint (ClutterActor *actor)
+{
+  HrnSearchBarPrivate *priv = HRN_SEARCH_BAR_GET_PRIVATE (actor);
+
+  CLUTTER_ACTOR_CLASS (hrn_search_bar_parent_class)->paint (actor);
+  clutter_actor_paint (CLUTTER_ACTOR (priv->pin_button));
+  clutter_actor_paint (CLUTTER_ACTOR (priv->clear_button));
+}
+
+static void
+hrn_searchbar_pick (ClutterActor *actor, const ClutterColor *color)
+{
+  hrn_searchbar_paint (actor);
+}
+
+HrnSearchBar *
+hrn_searchbar_new (HrnPinManager *manager)
+{
+  HrnSearchBar *bar;
+  HrnSearchBarPrivate *priv;
+
+  bar = g_object_new (HRN_TYPE_SEARCH_BAR, NULL);
+  priv = bar->priv;
+
+  priv->pin_manager = manager;
+
+  return bar;
+}
+
+#if 0
+static void
+pin_selected_cb (HrnPinManager *pin_manager,
+                 HrnPin        *pin,
+                 HrnSearchBar  *searchbar)
+{
+  HrnSearchBarPrivate *priv = searchbar->priv;
+
+  if (priv->current_pin) {
+    g_free (priv->current_pin);
+    if (pin) {
+      priv->current_pin = g_strdup (pin->group);
+      mx_path_bar_set_text ((MxPathBar *) searchbar, pin->query);
+    } else {
+      priv->current_pin = NULL;
+      mx_path_bar_set_text ((MxPathBar *) searchbar, "");
+    }
+  }
+
+  g_signal_handler_block (priv->pin_button, priv->pin_id);
+  mx_button_set_checked (MX_BUTTON (priv->pin_button),
+                           pin ? TRUE : FALSE);
+  g_signal_handler_unblock (priv->pin_button, priv->pin_id);
+}
+#endif
+
+void
+hrn_searchbar_set_pin_manager (HrnSearchBar  *searchbar,
+                               HrnPinManager *pin_manager)
+{
+}
+
+void
+hrn_searchbar_set_pin (HrnSearchBar *searchbar,
+                       HrnPin       *pin)
+{
+  HrnSearchBarPrivate *priv = searchbar->priv;
+
+  g_free (priv->current_pin);
+  priv->current_pin = g_strdup (pin->group);
+}
diff -pruN 1.5.1-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-sidebar-item.c 1.8.4-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-sidebar-item.c
--- 1.5.1-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-sidebar-item.c	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-sidebar-item.c	2010-02-17 17:26:44.000000000 +0000
@@ -0,0 +1,497 @@
+#include <glib.h>
+#include <glib/gi18n.h>
+
+#include "hrn-item.h"
+#include "hrn-marshal.h"
+#include "hrn-sidebar-item.h"
+#include "hrn-sidebar-subitem.h"
+#include "hrn-spinner.h"
+
+enum {
+    PROP_0,
+    PROP_PIN_MANAGER,
+    PROP_NAME,
+};
+
+enum {
+    SOURCE_CHANGED,
+    LAST_SIGNAL
+};
+
+struct _HrnSidebarItemPrivate {
+    ClutterActor *group;
+    ClutterActor *title;
+    ClutterActor *spinner;
+    ClutterActor *child_box;
+
+    HrnPinManager *pin_manager;
+    gboolean initialised; /* MxListView seems to like setting properties
+                             on items frequently, so only do stuff if we've
+                             been not already been set up */
+    GList *items_pinned;
+};
+
+#define GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), HRN_TYPE_SIDEBAR_ITEM, HrnSidebarItemPrivate))
+G_DEFINE_TYPE (HrnSidebarItem, hrn_sidebar_item, MX_TYPE_TABLE);
+static guint32 signals[LAST_SIGNAL] = {0, };
+
+static void
+hrn_sidebar_item_finalize (GObject *object)
+{
+    G_OBJECT_CLASS (hrn_sidebar_item_parent_class)->finalize (object);
+}
+
+static void
+hrn_sidebar_item_dispose (GObject *object)
+{
+    HrnSidebarItem *self = (HrnSidebarItem *) object;
+    HrnSidebarItemPrivate *priv = self->priv;
+
+    if (priv->pin_manager) {
+        g_object_unref (priv->pin_manager);
+        priv->pin_manager = NULL;
+    }
+
+    G_OBJECT_CLASS (hrn_sidebar_item_parent_class)->dispose (object);
+}
+
+static void
+select_subitem_cb (ClutterActor *actor,
+                   gpointer      data)
+{
+    mx_button_set_checked ((MxButton *) actor,
+                             actor == (ClutterActor *) data);
+}
+
+static void
+select_subitem (HrnSidebarItem    *item,
+                HrnSidebarSubitem *subitem)
+{
+    HrnSidebarItemPrivate *priv = item->priv;
+
+    clutter_container_foreach (CLUTTER_CONTAINER (priv->child_box),
+                               select_subitem_cb, subitem);
+}
+
+static void
+emit_source_changed (HrnSidebarItem *item,
+                     HrnItemType     type,
+                     const char     *name)
+{
+    g_signal_emit (item, signals[SOURCE_CHANGED], 0, type, name);
+}
+
+static void
+item_pinned (HrnSidebarSubitem *subitem,
+             gboolean           pinned,
+             HrnSidebarItem    *item)
+{
+    HrnSidebarItemPrivate *priv = item->priv;
+    const char *group;
+    HrnPin *pin;
+    GList *p;
+
+    /* This shouldn't happen */
+    if (G_UNLIKELY (pinned)) {
+        return;
+    }
+
+    group = hrn_sidebar_subitem_get_qname (subitem);
+    pin = hrn_pin_manager_get_pin (priv->pin_manager, group);
+
+    if (G_UNLIKELY (pin == NULL)) {
+        return;
+    }
+
+    for (p = priv->items_pinned; p; p = p->next) {
+        if (p->data == subitem) {
+            priv->items_pinned = g_list_remove_link (priv->items_pinned, p);
+            g_list_free (p);
+            break;
+        }
+    }
+
+    hrn_pin_manager_remove (priv->pin_manager, group);
+    clutter_actor_destroy ((ClutterActor *) subitem);
+}
+
+static void
+item_renamed (HrnSidebarSubitem *subitem,
+              const char        *old_name,
+              const char        *new_name,
+              HrnSidebarItem    *item)
+{
+    HrnSidebarItemPrivate *priv = item->priv;
+    HrnPin *pin;
+    const gchar *group;
+
+    group = hrn_sidebar_subitem_get_qname (subitem);
+
+    pin = hrn_pin_manager_get_pin (priv->pin_manager, group);
+    if (pin == NULL) {
+        g_warning ("No pin for %s", group);
+        return;
+    }
+
+    hrn_pin_manager_rename_pin (priv->pin_manager, pin, new_name);
+}
+
+static HrnSidebarSubitem *
+create_subitem (HrnSidebarItem *item,
+                HrnPin         *pin)
+{
+    HrnSidebarSubitem *subitem;
+    int filter = pin->filter;
+    const char *iname;
+
+    switch (filter) {
+    case HRN_ITEM_TYPE_AUDIO:
+        iname = "icon-audio";
+        break;
+
+    case HRN_ITEM_TYPE_IMAGE:
+        iname = "icon-images";
+        break;
+
+    case HRN_ITEM_TYPE_VIDEO:
+        iname = "icon-video";
+        break;
+
+    default:
+        iname = "icon-all";
+    }
+
+    subitem = hrn_sidebar_subitem_new (pin->group,
+                                       pin->name ? pin->name : pin->group,
+                                       iname, TRUE, TRUE);
+    return subitem;
+}
+
+static void
+pinned_item_clicked (MxWidget       *button,
+                     HrnSidebarItem *item)
+{
+    HrnSidebarItemPrivate *priv = item->priv;
+    HrnPin *pin;
+    const gchar *group;
+
+    group = hrn_sidebar_subitem_get_qname ((HrnSidebarSubitem *) button);
+
+    pin = hrn_pin_manager_get_pin (priv->pin_manager, group);
+    if (pin == NULL) {
+        g_warning ("No pin for %s", group);
+        return;
+    }
+
+    select_subitem (item, HRN_SIDEBAR_SUBITEM (button));
+    hrn_pin_manager_select_pin (priv->pin_manager, pin);
+}
+
+static void
+add_pin (HrnSidebarItem *item,
+         HrnPin         *pin)
+{
+    HrnSidebarItemPrivate *priv = item->priv;
+    HrnSidebarSubitem *subitem;
+
+    subitem = create_subitem (item, pin);
+    g_signal_connect (subitem, "clicked",
+                      G_CALLBACK (pinned_item_clicked), item);
+    g_signal_connect (subitem, "pinned",
+                      G_CALLBACK (item_pinned), item);
+    g_signal_connect (subitem, "renamed",
+                      G_CALLBACK (item_renamed), item);
+
+    priv->items_pinned = g_list_prepend (priv->items_pinned, subitem);
+    clutter_container_add_actor (CLUTTER_CONTAINER (priv->child_box),
+                                 CLUTTER_ACTOR (subitem));
+    clutter_container_child_set (CLUTTER_CONTAINER (priv->child_box),
+                                 CLUTTER_ACTOR (subitem),
+                                 "expand", TRUE,
+                                 NULL);
+    mx_bin_set_alignment (MX_BIN (subitem), MX_ALIGN_START,
+                          MX_ALIGN_MIDDLE);
+}
+
+static void
+pin_added_cb (HrnPinManager  *pin_manager,
+              HrnPin         *pin,
+              HrnSidebarItem *item)
+{
+    add_pin (item, pin);
+}
+
+static void
+pin_removed_cb (HrnPinManager  *pin_manager,
+                HrnPin         *pin,
+                HrnSidebarItem *item)
+{
+    HrnSidebarItemPrivate *priv = item->priv;
+    GList *p;
+
+    for (p = priv->items_pinned; p; p = p->next) {
+        HrnSidebarSubitem *subitem = (HrnSidebarSubitem *) p->data;
+        const char *group_name;
+
+        group_name = hrn_sidebar_subitem_get_qname (subitem);
+        if (g_str_equal (group_name, pin->group)) {
+            priv->items_pinned = g_list_remove_link (priv->items_pinned, p);
+            clutter_actor_destroy ((ClutterActor *) subitem);
+            g_list_free (p);
+            break;
+        }
+    }
+}
+
+static void
+hrn_sidebar_item_set_property (GObject      *object,
+                               guint         prop_id,
+                               const GValue *value,
+                               GParamSpec   *pspec)
+{
+    HrnSidebarItem *item = (HrnSidebarItem *) object;
+    HrnSidebarItemPrivate *priv = item->priv;
+    GList *pins, *p;
+
+    switch (prop_id) {
+    case PROP_PIN_MANAGER:
+        if (priv->pin_manager) {
+            g_object_unref (priv->pin_manager);
+            priv->pin_manager= NULL;
+        }
+        priv->pin_manager = g_value_dup_object (value);
+        g_signal_connect (priv->pin_manager, "pin-added",
+                          G_CALLBACK (pin_added_cb), item);
+        g_signal_connect (priv->pin_manager, "pin-removed",
+                          G_CALLBACK (pin_removed_cb), item);
+
+        pins = hrn_pin_manager_get_pins (priv->pin_manager);
+
+        for (p = pins; p; p = p->next) {
+            HrnPin *pin = p->data;
+
+            add_pin (item, pin);
+        }
+        g_list_free (pins);
+        break;
+
+    case PROP_NAME:
+        mx_label_set_text ((MxLabel *) priv->title,
+                             g_value_get_string (value));
+        break;
+
+    default:
+        break;
+    }
+}
+
+static void
+hrn_sidebar_item_get_property (GObject    *object,
+                               guint       prop_id,
+                               GValue     *value,
+                               GParamSpec *pspec)
+{
+    switch (prop_id) {
+
+    default:
+        break;
+    }
+}
+
+static void
+hrn_sidebar_item_class_init (HrnSidebarItemClass *klass)
+{
+    GObjectClass *o_class = (GObjectClass *) klass;
+
+    o_class->dispose = hrn_sidebar_item_dispose;
+    o_class->finalize = hrn_sidebar_item_finalize;
+    o_class->set_property = hrn_sidebar_item_set_property;
+    o_class->get_property = hrn_sidebar_item_get_property;
+
+    g_type_class_add_private (klass, sizeof (HrnSidebarItemPrivate));
+
+    signals[SOURCE_CHANGED] = g_signal_new ("source-changed",
+                                            G_TYPE_FROM_CLASS (klass),
+                                            G_SIGNAL_NO_RECURSE |
+                                            G_SIGNAL_RUN_FIRST, 0, NULL, NULL,
+                                            hrn_marshal_VOID__INT_STRING,
+                                            G_TYPE_NONE, 2,
+                                            G_TYPE_INT,
+                                            G_TYPE_STRING);
+
+    g_object_class_install_property (o_class, PROP_PIN_MANAGER,
+                                     g_param_spec_object ("pin-manager", "", "",
+                                                          HRN_TYPE_PIN_MANAGER,
+                                                          G_PARAM_WRITABLE |
+                                                          G_PARAM_STATIC_STRINGS));
+    g_object_class_install_property (o_class, PROP_NAME,
+                                     g_param_spec_string ("item-name", "", "", "",
+                                                          G_PARAM_WRITABLE |
+                                                          G_PARAM_STATIC_STRINGS));
+}
+
+static void
+audio_item_clicked (MxWidget       *button,
+                    HrnSidebarItem *item)
+{
+    select_subitem (item, HRN_SIDEBAR_SUBITEM (button));
+    emit_source_changed (item, HRN_ITEM_TYPE_AUDIO, "");
+}
+
+static void
+image_item_clicked (MxWidget     *button,
+                    HrnSidebarItem *item)
+{
+    select_subitem (item, HRN_SIDEBAR_SUBITEM (button));
+    emit_source_changed (item, HRN_ITEM_TYPE_IMAGE, "");
+}
+
+static void
+video_item_clicked (MxWidget     *button,
+                    HrnSidebarItem *item)
+{
+    select_subitem (item, HRN_SIDEBAR_SUBITEM (button));
+    emit_source_changed (item, HRN_ITEM_TYPE_VIDEO, "");
+}
+
+struct _DefaultEntry {
+    char *name;
+    char *icon;
+    GCallback callback;
+};
+
+static void
+hrn_sidebar_item_init (HrnSidebarItem *self)
+{
+    HrnSidebarItemPrivate *priv = GET_PRIVATE (self);
+    ClutterActor *title_table;
+    int i;
+    struct _DefaultEntry default_entries[] = {
+        { N_("Music"), "icon-audio", G_CALLBACK (audio_item_clicked) },
+        { N_("Pictures"), "icon-images", G_CALLBACK (image_item_clicked) },
+        { N_("Videos"), "icon-video", G_CALLBACK (video_item_clicked) },
+        { NULL, NULL, NULL }
+    };
+
+    self->priv = priv;
+
+    clutter_actor_set_reactive (CLUTTER_ACTOR (self), TRUE);
+
+    title_table = mx_table_new ();
+    mx_table_add_actor_with_properties (MX_TABLE (self),
+                                          (ClutterActor *) title_table, 0, 0,
+                                          "x-align", 0.0,
+                                          "y-align", 0.0,
+                                          "y-fill", FALSE,
+                                          "y-expand", FALSE,
+                                          NULL);
+
+    priv->title = mx_label_new ("");
+    clutter_actor_set_name (priv->title, "hrn-sidebar-item-title");
+    mx_table_add_actor_with_properties (MX_TABLE (title_table),
+                                        priv->title, 0, 0,
+                                        "x-align", 0.0,
+                                        "x-fill", FALSE,
+                                        "x-expand", TRUE,
+                                        NULL);
+
+    priv->spinner = (ClutterActor *) hrn_spinner_new (PKGDATADIR "/hrn-spinner.png");
+    clutter_actor_set_size (priv->spinner, 20, 20);
+    mx_table_add_actor_with_properties (MX_TABLE (title_table),
+                                          priv->spinner,
+                                          0, 1,
+                                          "x-expand", FALSE,
+                                          "x-fill", FALSE,
+                                          "y-expand", FALSE,
+                                          "y-fill", FALSE,
+                                          NULL);
+    clutter_actor_hide (priv->spinner);
+
+    priv->child_box = mx_box_layout_new ();
+    mx_box_layout_set_vertical (MX_BOX_LAYOUT (priv->child_box), TRUE);
+    mx_table_add_actor_with_properties (MX_TABLE (self),
+                                          (ClutterActor *) priv->child_box,
+                                          1, 0,
+                                          "x-expand", TRUE,
+                                          "x-fill", TRUE,
+                                          "y-align", 0.0,
+                                          "y-fill", FALSE,
+                                          "y-expand", FALSE,
+                                          NULL);
+
+    /* These predefined audio/video/image searches should be created on demand
+     * when there is audio images or video present in the library
+     */
+    for (i = 0; default_entries[i].name; i++) {
+        HrnSidebarSubitem *subitem;
+
+        subitem = hrn_sidebar_subitem_new ("predefined",
+                                           _(default_entries[i].name),
+                                           default_entries[i].icon,
+                                           FALSE, FALSE);
+
+        clutter_container_add_actor (CLUTTER_CONTAINER (priv->child_box),
+                                     CLUTTER_ACTOR (subitem));
+        clutter_container_child_set (CLUTTER_CONTAINER (priv->child_box),
+                                     CLUTTER_ACTOR (subitem),
+                                     "expand", TRUE,
+                                     NULL);
+        mx_bin_set_alignment (MX_BIN (subitem), MX_ALIGN_START,
+                              MX_ALIGN_MIDDLE);
+        g_signal_connect (subitem, "clicked",
+                          G_CALLBACK (default_entries[i].callback), self);
+    }
+}
+
+
+HrnSidebarItem *
+hrn_sidebar_item_new (const char    *name,
+                      HrnPinManager *pin_manager)
+{
+    HrnSidebarItem *item;
+    HrnSidebarItemPrivate *priv;
+
+    item = g_object_new (HRN_TYPE_SIDEBAR_ITEM,
+                         "pin-manager", pin_manager,
+                         "item-name", name,
+                         NULL);
+    priv = item->priv;
+
+    return item;
+}
+
+static void
+unselect_subitems (ClutterActor *actor,
+                   gpointer      data)
+{
+    mx_button_set_checked ((MxButton *) actor, FALSE);
+}
+
+void
+hrn_sidebar_item_set_selected (HrnSidebarItem *item,
+                               gboolean        selected)
+{
+    HrnSidebarItemPrivate *priv = item->priv;
+
+    if (selected == FALSE) {
+        clutter_container_foreach ((ClutterContainer *) priv->child_box,
+                                   unselect_subitems, item);
+    }
+}
+
+void
+hrn_sidebar_item_select_initial (HrnSidebarItem *item)
+{
+    HrnSidebarItemPrivate *priv = item->priv;
+    GList *children;
+
+    /* FIXME: Getting a whole list of the children, just to use the first item
+       seems a bit wasteful, but our list should be short enough that its
+       not *that* much extra work */
+    children = clutter_container_get_children ((ClutterContainer *) priv->child_box);
+    if (children == NULL) {
+        return;
+    }
+
+    mx_button_set_checked ((MxButton *) children->data, TRUE);
+}
diff -pruN 1.5.1-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-sidebar-subitem.c 1.8.4-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-sidebar-subitem.c
--- 1.5.1-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-sidebar-subitem.c	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-sidebar-subitem.c	2010-02-17 17:26:44.000000000 +0000
@@ -0,0 +1,456 @@
+#include <glib.h>
+#include <glib/gi18n.h>
+
+#include "hrn.h"
+#include "hrn-marshal.h"
+#include "hrn-sidebar-subitem.h"
+#include "hrn-im-label.h"
+
+enum
+{
+  PROP_0,
+};
+
+enum
+{
+  PINNED,
+  RENAMED,
+  LAST_SIGNAL
+};
+
+struct _HrnSidebarSubitemPrivate
+{
+  char       *qname;
+  char       *title;
+  ClutterActor *label;
+  ClutterActor *icon;
+  ClutterActor *pin;
+};
+
+struct _rename_data
+{
+  HrnSidebarSubitem *item;
+
+  ClutterActor *old_focus;
+  ClutterActor *shade[4];
+  guint         activate_handler;
+  guint         grab_handler;
+};
+
+#define SIDEBAR_WIDTH    180
+
+#define GET_PRIVATE(obj)  (G_TYPE_INSTANCE_GET_PRIVATE ((obj), \
+                             HRN_TYPE_SIDEBAR_SUBITEM, \
+                             HrnSidebarSubitemPrivate))
+
+G_DEFINE_TYPE (HrnSidebarSubitem, hrn_sidebar_subitem, MX_TYPE_BUTTON);
+static guint32 signals[LAST_SIGNAL] = { 0, };
+
+static void
+hrn_sidebar_subitem_finalize (GObject *object)
+{
+  HrnSidebarSubitem        *item = (HrnSidebarSubitem *) object;
+  HrnSidebarSubitemPrivate *priv = item->priv;
+
+  if (priv->title)
+    {
+      g_free (priv->title);
+      priv->title = NULL;
+    }
+  if (priv->qname)
+    {
+      g_free (priv->qname);
+      priv->qname = NULL;
+    }
+
+  G_OBJECT_CLASS (hrn_sidebar_subitem_parent_class)->finalize (object);
+}
+
+static void
+hrn_sidebar_subitem_dispose (GObject *object)
+{
+  G_OBJECT_CLASS (hrn_sidebar_subitem_parent_class)->dispose (object);
+}
+
+static void
+hrn_sidebar_subitem_set_property (GObject *object, guint prop_id,
+                                  const GValue *value,
+                                  GParamSpec   *pspec)
+{
+  switch (prop_id)
+    {
+      default:
+        break;
+    }
+}
+
+static void
+hrn_sidebar_subitem_get_property (GObject *object, guint prop_id,
+                                  GValue     *value,
+                                  GParamSpec *pspec)
+{
+  switch (prop_id)
+    {
+      default:
+        break;
+    }
+}
+
+static gboolean
+hrn_sidebar_subitem_enter_event (ClutterActor         *actor,
+                                 ClutterCrossingEvent *event)
+{
+  ClutterActor *parent;
+
+  /* Avoid changing pseudo-class if we're entering a child */
+  parent = mx_bin_get_child (MX_BIN (actor));
+
+  if (event->related &&
+      clutter_actor_get_parent (event->related) == parent)
+    return FALSE;
+
+  return CLUTTER_ACTOR_CLASS (hrn_sidebar_subitem_parent_class)->
+    enter_event (actor, event);
+}
+
+static gboolean
+hrn_sidebar_subitem_leave_event (ClutterActor         *actor,
+                                 ClutterCrossingEvent *event)
+{
+  ClutterActor *parent;
+
+  /* Avoid changing pseudo-class if we're leaving a child but
+   * still within our actor
+   */
+  parent = mx_bin_get_child (MX_BIN (actor));
+
+  if (event->related &&
+      clutter_actor_get_parent (event->related) == parent)
+    return FALSE;
+
+  return CLUTTER_ACTOR_CLASS (hrn_sidebar_subitem_parent_class)->
+    leave_event (actor, event);
+}
+
+static void
+hrn_sidebar_subitem_class_init (HrnSidebarSubitemClass *klass)
+{
+  GObjectClass *o_class = (GObjectClass *) klass;
+  ClutterActorClass *actor_class = (ClutterActorClass *) klass;
+
+  o_class->dispose      = hrn_sidebar_subitem_dispose;
+  o_class->finalize     = hrn_sidebar_subitem_finalize;
+  o_class->set_property = hrn_sidebar_subitem_set_property;
+  o_class->get_property = hrn_sidebar_subitem_get_property;
+
+  actor_class->enter_event = hrn_sidebar_subitem_enter_event;
+  actor_class->leave_event = hrn_sidebar_subitem_leave_event;
+
+  g_type_class_add_private (klass, sizeof (HrnSidebarSubitemPrivate));
+
+  signals[PINNED] = g_signal_new ("pinned",
+                                  G_TYPE_FROM_CLASS (klass),
+                                  G_SIGNAL_RUN_FIRST |
+                                  G_SIGNAL_NO_RECURSE, 0, NULL, NULL,
+                                  g_cclosure_marshal_VOID__BOOLEAN,
+                                  G_TYPE_NONE, 1, G_TYPE_BOOLEAN);
+  signals[RENAMED] = g_signal_new ("renamed",
+                                   G_TYPE_FROM_CLASS (klass),
+                                   G_SIGNAL_RUN_FIRST |
+                                   G_SIGNAL_NO_RECURSE, 0, NULL, NULL,
+                                   hrn_marshal_VOID__STRING_STRING,
+                                   G_TYPE_NONE, 2,
+                                   G_TYPE_STRING,
+                                   G_TYPE_STRING);
+}
+
+static void
+pin_clicked_cb (MxWidget *button, HrnSidebarSubitem *item)
+{
+  g_signal_emit (item, signals[PINNED], 0,
+                 mx_button_get_checked ((MxButton *) button));
+}
+
+static void
+destroy_shade (ClutterAnimation *anim, ClutterActor     *actor)
+{
+  clutter_actor_destroy (actor);
+}
+
+static void
+rename_complete (ClutterText *label, struct _rename_data *data)
+{
+  HrnSidebarSubitemPrivate *priv  = data->item->priv;
+  ClutterStage             *stage;
+  const gchar              *new_name  = clutter_text_get_text (label);
+  char                     *old_title = NULL;
+  gint                      i;
+
+  stage = CLUTTER_STAGE (hrn_window_get_stage (window));
+
+  if (priv->title)
+    {
+      old_title   = priv->title;
+      priv->title = g_strdup (new_name);
+    }
+
+  clutter_stage_set_key_focus (stage, data->old_focus);
+
+  clutter_text_set_editable (CLUTTER_TEXT (label), FALSE);
+  clutter_text_set_single_line_mode (CLUTTER_TEXT (label), FALSE);
+  clutter_text_set_activatable (CLUTTER_TEXT (label), FALSE);
+
+  for (i = 0; i < 4; i++)
+    {
+      clutter_actor_animate (data->shade[i], CLUTTER_LINEAR, 250,
+                             "opacity", 0,
+                             "signal-after::completed", destroy_shade,
+                             data->shade[i],
+                             NULL);
+    }
+
+  g_signal_handler_disconnect (label, data->activate_handler);
+  g_signal_handler_disconnect (stage, data->grab_handler);
+
+  g_signal_emit (data->item, signals[RENAMED], 0, old_title, priv->title);
+  g_free (data);
+
+  g_free (old_title);
+}
+
+static gboolean
+hrn_actor_has_ancestor (ClutterActor *actor, ClutterActor *ancestor)
+{
+  ClutterActor *iter;
+
+  if (!actor || !ancestor)
+    return FALSE;
+  for (iter = actor;
+       iter;
+       iter = clutter_actor_get_parent (iter))
+    {
+      if (iter == ancestor)
+        return TRUE;
+    }
+  return FALSE;
+}
+
+static gboolean
+rename_capture (ClutterActor *stage, ClutterEvent        *event,
+                struct _rename_data *data)
+{
+  HrnSidebarSubitem        *item = data->item;
+  HrnSidebarSubitemPrivate *priv = item->priv;
+  ClutterActor             *text;
+
+  text = hrn_im_label_get_clutter_text ((HrnIMLabel *) priv->label);
+  switch (event->type)
+    {
+      case CLUTTER_BUTTON_RELEASE: /* clicks outside the menu makes it go away
+                                    */
+        if (!hrn_actor_has_ancestor (clutter_event_get_source (event),
+                                     (ClutterActor *) item))
+          {
+            rename_complete ((ClutterText *) text, data);
+            return TRUE;
+          }
+
+      case CLUTTER_MOTION:
+      case CLUTTER_BUTTON_PRESS:
+        if (clutter_event_get_source (event) == (void*) priv->label)
+          {
+            clutter_actor_event (text, event, FALSE);
+          }
+        return TRUE;
+
+      case CLUTTER_LEAVE:
+      case CLUTTER_ENTER:
+        return TRUE;
+
+      default:
+        if (hrn_actor_has_ancestor (clutter_event_get_source (event),
+                                    (ClutterActor *) item))
+          return FALSE;
+        break;
+    }
+
+  return TRUE;
+}
+
+static void
+rename_cb (MxAction *action, HrnSidebarSubitem *item)
+{
+  struct _rename_data      *data;
+  HrnSidebarSubitemPrivate *priv        = item->priv;
+  ClutterColor              shade_color = { 0x0, 0x0, 0x0, 0xff };
+  ClutterStage             *stage;
+  ClutterActor             *text;
+  float                    sw, sh;
+  float                    x, y;
+  float                    w, h;
+  int                      i, ww, wh;
+
+  stage = CLUTTER_STAGE (hrn_window_get_stage (window));
+
+  data       = g_new0 (struct _rename_data, 1);
+  data->item = item;
+
+  for (i = 0; i < 4; i++)
+    {
+      data->shade[i] = clutter_rectangle_new_with_color (&shade_color);
+      clutter_actor_set_opacity (data->shade[i], 0);
+      clutter_actor_animate (data->shade[i], CLUTTER_LINEAR, 250,
+                             "opacity", 92, NULL);
+    }
+
+  gtk_window_get_size (GTK_WINDOW (window), &ww, &wh);
+
+  sw = (float) ww;
+  sh = (float) wh;
+
+  clutter_actor_get_transformed_position (CLUTTER_ACTOR (item), &x, &y);
+  clutter_actor_get_transformed_size (CLUTTER_ACTOR (item), &w, &h);
+
+  clutter_actor_set_position (data->shade[0], x, y + h);
+  clutter_actor_set_size (data->shade[0], w, sh - y - h);
+  clutter_actor_set_position (data->shade[1], x, 0);
+  clutter_actor_set_size (data->shade[1], w, y);
+  clutter_actor_set_position (data->shade[2], x + w, 0);
+  clutter_actor_set_size (data->shade[2], sw - x - w, sh);
+  clutter_actor_set_position (data->shade[3], 0, 0);
+  clutter_actor_set_size (data->shade[3], x, sh);
+
+  clutter_container_add (CLUTTER_CONTAINER (stage),
+                         data->shade[0], data->shade[1],
+                         data->shade[2], data->shade[3], NULL);
+
+  data->old_focus = clutter_stage_get_key_focus (stage);
+
+  text = hrn_im_label_get_clutter_text ((HrnIMLabel *) priv->label);
+  clutter_text_set_editable (CLUTTER_TEXT (text), TRUE);
+  clutter_text_set_single_line_mode (CLUTTER_TEXT (text), TRUE);
+  clutter_text_set_activatable (CLUTTER_TEXT (text), TRUE);
+
+  clutter_stage_set_key_focus (stage, text);
+  data->activate_handler = g_signal_connect (text, "activate",
+                                             G_CALLBACK (rename_complete),
+                                             data);
+  data->grab_handler = g_signal_connect_after (stage, "captured-event",
+                                               G_CALLBACK (rename_capture),
+                                               data);
+}
+
+static gboolean
+query_release (ClutterActor *actor, ClutterEvent *event, gpointer button)
+{
+  if (event->button.button == 3)
+    {
+      gfloat x, y;
+      x = y = 0;
+      clutter_actor_transform_stage_point (actor,
+                                           event->button.x,
+                                           event->button.y,
+                                           &x, &y);
+      mx_widget_show_popup (MX_WIDGET (actor), x, y);
+      return TRUE;
+    }
+
+  return FALSE;
+}
+
+static void
+hrn_sidebar_subitem_init (HrnSidebarSubitem *self)
+{
+  HrnSidebarSubitemPrivate *priv;
+  ClutterActor *box, *popup;
+  MxAction *action;
+
+  self->priv = GET_PRIVATE (self);
+  priv       = self->priv;
+
+  clutter_actor_set_reactive (CLUTTER_ACTOR (self), TRUE);
+  mx_button_set_toggle_mode ((MxButton *) self, TRUE);
+
+  box = mx_box_layout_new ();
+  mx_box_layout_set_spacing (MX_BOX_LAYOUT (box), 6);
+  clutter_container_add_actor (CLUTTER_CONTAINER (self), box);
+
+  priv->pin = mx_button_new ();
+  clutter_actor_set_name (priv->pin, "hrn-sidebar-pin");
+  mx_button_set_toggle_mode (MX_BUTTON (priv->pin), TRUE);
+  mx_button_set_checked (MX_BUTTON (priv->pin), TRUE);
+  g_signal_connect (priv->pin, "clicked", G_CALLBACK (pin_clicked_cb), self);
+
+  priv->label = hrn_im_label_new ("");
+  priv->icon = mx_icon_new ();
+  clutter_actor_set_size (priv->icon, 24, 24);
+
+  clutter_container_add_actor (CLUTTER_CONTAINER (box), priv->icon);
+  clutter_container_add_actor (CLUTTER_CONTAINER (box), priv->label);
+  clutter_container_add_actor (CLUTTER_CONTAINER (box), priv->pin);
+
+  clutter_container_child_set (CLUTTER_CONTAINER (box),
+                               priv->label,
+                               "expand", TRUE,
+                               "y-fill", FALSE,
+                               NULL);
+
+  popup = mx_popup_new ();
+  action = mx_action_new_full ("Rename",
+                               _("Rename"),
+                               G_CALLBACK (rename_cb),
+                               self);
+  mx_popup_add_action (MX_POPUP (popup), action);
+  mx_widget_set_popup (MX_WIDGET (self), MX_POPUP (popup));
+}
+
+HrnSidebarSubitem *
+hrn_sidebar_subitem_new (const char *qname,
+                         const char *title,
+                         const char *iconname,
+                         gboolean show_pin,
+                         gboolean can_rename)
+{
+  HrnSidebarSubitem        *item;
+  HrnSidebarSubitemPrivate *priv;
+
+  item = g_object_new (HRN_TYPE_SIDEBAR_SUBITEM, NULL);
+  priv = item->priv;
+
+  if (qname)
+    priv->qname = g_strdup (qname);
+
+  priv->title = g_strdup (title);
+  hrn_im_label_set_text (HRN_IM_LABEL (priv->label), title);
+
+  clutter_actor_set_name (CLUTTER_ACTOR (priv->icon), iconname);
+
+  if (show_pin == FALSE)
+    {
+      clutter_actor_hide ((ClutterActor *) priv->pin);
+    }
+
+  if (can_rename)
+    {
+      g_signal_connect (item, "button-release-event",
+                        G_CALLBACK (query_release), NULL);
+    }
+
+  return item;
+}
+
+const char *
+hrn_sidebar_subitem_get_title (HrnSidebarSubitem *item)
+{
+  HrnSidebarSubitemPrivate *priv = item->priv;
+
+  return priv->title;
+}
+
+const char *
+hrn_sidebar_subitem_get_qname (HrnSidebarSubitem *item)
+{
+  HrnSidebarSubitemPrivate *priv = item->priv;
+
+  return priv->qname;
+}
diff -pruN 1.5.1-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-spinner.c 1.8.4-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-spinner.c
--- 1.5.1-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-spinner.c	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-spinner.c	2010-02-17 17:26:44.000000000 +0000
@@ -0,0 +1,194 @@
+#include "hrn-spinner.h"
+
+enum {
+    PROP_0,
+};
+
+struct _HrnSpinnerPrivate {
+    ClutterTimeline *timeline;
+    int frame;
+
+    CoglHandle material;
+    CoglHandle texture;
+};
+
+#define GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), HRN_TYPE_SPINNER, HrnSpinnerPrivate))
+G_DEFINE_TYPE (HrnSpinner, hrn_spinner, MX_TYPE_WIDGET);
+
+static void
+hrn_spinner_finalize (GObject *object)
+{
+    HrnSpinner *self = (HrnSpinner *) object;
+    HrnSpinnerPrivate *priv = self->priv;
+
+    cogl_material_unref (priv->material);
+    cogl_handle_unref (priv->texture);
+
+    G_OBJECT_CLASS (hrn_spinner_parent_class)->finalize (object);
+}
+
+static void
+hrn_spinner_dispose (GObject *object)
+{
+    HrnSpinner *self = (HrnSpinner *) object;
+    HrnSpinnerPrivate *priv = self->priv;
+
+    if (priv->timeline) {
+        clutter_timeline_stop (priv->timeline);
+        g_object_unref (priv->timeline);
+        priv->timeline = NULL;
+    }
+
+    G_OBJECT_CLASS (hrn_spinner_parent_class)->dispose (object);
+}
+
+static void
+hrn_spinner_set_property (GObject      *object,
+                          guint         prop_id,
+                          const GValue *value,
+                          GParamSpec   *pspec)
+{
+    switch (prop_id) {
+
+    default:
+        break;
+    }
+}
+
+static void
+hrn_spinner_get_property (GObject    *object,
+                          guint       prop_id,
+                          GValue     *value,
+                          GParamSpec *pspec)
+{
+    switch (prop_id) {
+
+    default:
+        break;
+    }
+}
+
+#define TILE_WIDTH (float) 0.125
+#define TILE_HEIGHT (float) 0.3333333 /* *Sigh* */
+
+static void
+hrn_spinner_paint (ClutterActor *actor)
+{
+    HrnSpinner *spinner = (HrnSpinner *) actor;
+    HrnSpinnerPrivate *priv = spinner->priv;
+    MxPadding padding;
+    int ox, oy;
+    float tx, ty;
+
+    CLUTTER_ACTOR_CLASS (hrn_spinner_parent_class)->paint (actor);
+
+    mx_widget_get_padding ((MxWidget *) actor, &padding);
+
+    cogl_push_matrix ();
+    cogl_translate (padding.left, padding.top, 0);
+
+    ox = priv->frame % 8;
+    oy = priv->frame / 8;
+
+    tx = (float) ox * TILE_WIDTH;
+    ty = (float) oy * TILE_HEIGHT;
+
+    cogl_set_source (priv->material);
+    cogl_rectangle_with_texture_coords (0.0, 0.0, 16.0, 16.0,
+                                        tx, ty,
+                                        tx + TILE_WIDTH, ty + TILE_HEIGHT);
+    cogl_pop_matrix ();
+}
+
+static void
+hrn_spinner_class_init (HrnSpinnerClass *klass)
+{
+    GObjectClass *o_class = (GObjectClass *) klass;
+    ClutterActorClass *a_class = (ClutterActorClass *) klass;
+
+    o_class->dispose = hrn_spinner_dispose;
+    o_class->finalize = hrn_spinner_finalize;
+    o_class->set_property = hrn_spinner_set_property;
+    o_class->get_property = hrn_spinner_get_property;
+
+    a_class->paint = hrn_spinner_paint;
+
+    g_type_class_add_private (klass, sizeof (HrnSpinnerPrivate));
+}
+
+static void
+new_frame_cb (ClutterTimeline *timeline,
+              int              msecs,
+              HrnSpinner      *self)
+{
+    HrnSpinnerPrivate *priv = self->priv;
+    int old_frame;
+
+    old_frame = priv->frame;
+
+    /* We go from 1->23 frames */
+    priv->frame = (22 * ((float) msecs / 1000.0)) + 1;
+
+    if (priv->frame != old_frame) {
+        clutter_actor_queue_redraw ((ClutterActor *) self);
+    }
+}
+
+static void
+hrn_spinner_init (HrnSpinner *self)
+{
+    HrnSpinnerPrivate *priv;
+
+    self->priv = GET_PRIVATE (self);
+    priv = self->priv;
+
+    priv->timeline = clutter_timeline_new (1000);
+    clutter_timeline_set_loop (priv->timeline, TRUE);
+    g_signal_connect (priv->timeline, "new-frame",
+                      G_CALLBACK (new_frame_cb), self);
+    priv->frame = 1;
+
+    priv->material = cogl_material_new ();
+}
+
+HrnSpinner *
+hrn_spinner_new (const char *filename)
+{
+    HrnSpinner *spinner;
+    HrnSpinnerPrivate *priv;
+    GError *error = NULL;
+
+    spinner = g_object_new (HRN_TYPE_SPINNER, NULL);
+    priv = spinner->priv;
+
+    priv->texture = cogl_texture_new_from_file (filename,
+                                                COGL_TEXTURE_NONE,
+                                                COGL_PIXEL_FORMAT_ANY, &error);
+    if (error != NULL) {
+        g_warning ("Error loading %s: %s", filename, error->message);
+        g_error_free (error);
+
+        g_object_unref (spinner);
+        return NULL;
+    }
+
+    cogl_material_set_layer (priv->material, 0, priv->texture);
+
+    return spinner;
+}
+
+void
+hrn_spinner_start (HrnSpinner *spinner)
+{
+    HrnSpinnerPrivate *priv = spinner->priv;
+
+    clutter_timeline_start (priv->timeline);
+}
+
+void
+hrn_spinner_stop (HrnSpinner *spinner)
+{
+    HrnSpinnerPrivate *priv = spinner->priv;
+
+    clutter_timeline_stop (priv->timeline);
+}
diff -pruN 1.5.1-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-square-clone.c 1.8.4-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-square-clone.c
--- 1.5.1-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-square-clone.c	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-square-clone.c	2010-02-17 17:26:44.000000000 +0000
@@ -0,0 +1,398 @@
+/*
+ * Hornsey - Moblin Media Player.
+ * Copyright © 2007, 2008, 2009 Intel Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU Lesser General Public License,
+ * version 2.1, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * SECTION:hrn-texture-frame
+ * @short_description: Stretch a texture to fit the entire allocation
+ *
+ * #HrnSquareClone
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <cogl/cogl.h>
+
+#include "hrn-square-clone.h"
+
+enum
+{
+  PROP_0,
+
+  PROP_PARENT_TEXTURE,
+};
+
+G_DEFINE_TYPE (HrnSquareClone, hrn_square_clone, CLUTTER_TYPE_ACTOR);
+
+#define HRN_SQUARE_CLONE_GET_PRIVATE(obj)    (G_TYPE_INSTANCE_GET_PRIVATE ((obj), \
+                                                                           HRN_TYPE_SQUARE_CLONE, \
+                                                                           HrnSquareClonePrivate))
+
+struct _HrnSquareClonePrivate
+{
+    ClutterTexture *parent_texture;
+    CoglHandle      material;
+};
+
+
+static void
+hrn_square_clone_get_preferred_width (ClutterActor *self, gfloat for_height,
+                                      gfloat       *min_width_p,
+                                      gfloat       *natural_width_p)
+{
+    HrnSquareClonePrivate *priv = HRN_SQUARE_CLONE (self)->priv;
+
+    if (G_UNLIKELY (priv->parent_texture == NULL)) {
+        if (min_width_p)
+            *min_width_p = 0;
+
+        if (natural_width_p)
+            *natural_width_p = 0;
+    } else {
+        ClutterActorClass *klass;
+
+        /* by directly querying the parent texture's class implementation
+         * we are going around any override mechanism the parent texture
+         * might have in place, and we ask directly for the original
+         * preferred width
+         */
+        klass = CLUTTER_ACTOR_GET_CLASS (priv->parent_texture);
+        klass->get_preferred_width (CLUTTER_ACTOR (priv->parent_texture),
+                                    for_height,
+                                    min_width_p,
+                                    natural_width_p);
+    }
+}
+
+static void
+hrn_square_clone_get_preferred_height (ClutterActor *self,
+                                       float         for_width,
+                                       float        *min_height_p,
+                                       float        *natural_height_p)
+{
+    HrnSquareClonePrivate *priv = HRN_SQUARE_CLONE (self)->priv;
+
+    if (G_UNLIKELY (priv->parent_texture == NULL)) {
+        if (min_height_p)
+            *min_height_p = 0;
+
+        if (natural_height_p)
+            *natural_height_p = 0;
+    } else {
+        ClutterActorClass *klass;
+
+        /* by directly querying the parent texture's class implementation
+         * we are going around any override mechanism the parent texture
+         * might have in place, and we ask directly for the original
+         * preferred height
+         */
+        klass = CLUTTER_ACTOR_GET_CLASS (priv->parent_texture);
+        klass->get_preferred_height (CLUTTER_ACTOR (priv->parent_texture),
+                                     for_width,
+                                     min_height_p,
+                                     natural_height_p);
+    }
+}
+
+static void
+hrn_square_clone_realize (ClutterActor *self)
+{
+    HrnSquareClonePrivate *priv = HRN_SQUARE_CLONE (self)->priv;
+
+    if (priv->material != COGL_INVALID_HANDLE) {
+        return;
+    }
+
+    priv->material = cogl_material_new ();
+
+    CLUTTER_ACTOR_SET_FLAGS (self, CLUTTER_ACTOR_REALIZED);
+}
+
+static void
+hrn_square_clone_unrealize (ClutterActor *self)
+{
+    HrnSquareClonePrivate *priv = HRN_SQUARE_CLONE (self)->priv;
+
+    if (priv->material == COGL_INVALID_HANDLE) {
+        return;
+    }
+
+    cogl_material_unref (priv->material);
+    priv->material = COGL_INVALID_HANDLE;
+
+    CLUTTER_ACTOR_UNSET_FLAGS (self, CLUTTER_ACTOR_REALIZED);
+}
+
+static void
+hrn_square_clone_paint (ClutterActor *self)
+{
+    HrnSquareClonePrivate *priv = HRN_SQUARE_CLONE (self)->priv;
+    CoglHandle             tex  = COGL_INVALID_HANDLE;
+    ClutterActorBox        box  = { 0, };
+    guint8                 opacity;
+    int  bw, bh;
+    int  aw, ah;
+    float v;
+    float tx1, tx2, ty1, ty2;
+
+    /* no need to paint stuff if we don't have a texture */
+    if (G_UNLIKELY (priv->parent_texture == NULL)) {
+        return;
+    }
+
+    /* parent texture may have been hidden, so need to make sure it gets
+     * realized
+     */
+    if (!CLUTTER_ACTOR_IS_REALIZED (priv->parent_texture)) {
+        clutter_actor_realize (CLUTTER_ACTOR (priv->parent_texture));
+    }
+
+    tex = clutter_texture_get_cogl_texture (priv->parent_texture);
+    if (tex == COGL_INVALID_HANDLE) {
+        return;
+    }
+
+    clutter_actor_get_allocation_box (self, &box);
+    /*tex = clutter_texture_get_cogl_texture (CLUTTER_TEXTURE (self));*/
+
+    bw = cogl_texture_get_width (tex); /* base texture width */
+    bh = cogl_texture_get_height (tex); /* base texture height */
+
+    aw = (box.x2 - box.x1); /* allocation width */
+    ah = (box.y2 - box.y1); /* allocation height */
+
+    /* no comment */
+    if ((float) bw / bh < (float) aw / ah) {
+        /* fit width */
+        v   = (((float) ah * bw) / ((float) aw * bh)) / 2;
+        tx1 = 0;
+        tx2 = 1;
+        ty1 = (0.5 - v);
+        ty2 = (0.5 + v);
+    } else {
+        /* fit height */
+        v   = (((float) aw * bh) / ((float) ah * bw)) / 2;
+        tx1 = (0.5 - v);
+        tx2 = (0.5 + v);
+        ty1 = 0;
+        ty2 = 1;
+    }
+
+    opacity = clutter_actor_get_paint_opacity (self);
+
+    g_assert (priv->material != COGL_INVALID_HANDLE);
+
+    /* set the source material using the parent texture's COGL handle */
+    cogl_material_set_color4ub (priv->material,
+                                opacity, opacity, opacity, opacity);
+    cogl_material_set_layer (priv->material, 0, tex);
+    cogl_set_source (priv->material);
+
+    cogl_rectangle_with_texture_coords (0, 0,
+                                        aw, ah,
+                                        tx1, ty1,
+                                        tx2, ty2);
+}
+
+static inline void
+hrn_square_clone_set_frame_internal (HrnSquareClone *frame,
+                                     float           left,
+                                     float           top,
+                                     float           right,
+                                     float           bottom)
+{
+    GObject *gobject = G_OBJECT (frame);
+    gboolean changed = FALSE;
+
+    g_object_freeze_notify (gobject);
+
+    if (changed && CLUTTER_ACTOR_IS_VISIBLE (frame)) {
+        clutter_actor_queue_redraw (CLUTTER_ACTOR (frame));
+    }
+
+    g_object_thaw_notify (gobject);
+}
+
+static void
+hrn_square_clone_set_property (GObject      *gobject,
+                               guint         prop_id,
+                               const GValue *value,
+                               GParamSpec   *pspec)
+{
+    HrnSquareClone *frame = HRN_SQUARE_CLONE (gobject);
+
+    switch (prop_id) {
+    case PROP_PARENT_TEXTURE:
+        hrn_square_clone_set_parent_texture (frame,
+                                             g_value_get_object (value));
+        break;
+
+    default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
+        break;
+    }
+}
+
+static void
+hrn_square_clone_get_property (GObject    *gobject,
+                               guint       prop_id,
+                               GValue     *value,
+                               GParamSpec *pspec)
+{
+    HrnSquareClonePrivate *priv = HRN_SQUARE_CLONE (gobject)->priv;
+
+    switch (prop_id) {
+    case PROP_PARENT_TEXTURE:
+        g_value_set_object (value, priv->parent_texture);
+        break;
+
+    default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
+        break;
+    }
+}
+
+static void
+hrn_square_clone_dispose (GObject *gobject)
+{
+    HrnSquareClonePrivate *priv = HRN_SQUARE_CLONE (gobject)->priv;
+
+    if (priv->parent_texture) {
+        g_object_unref (priv->parent_texture);
+        priv->parent_texture = NULL;
+    }
+
+    if (priv->material) {
+        cogl_material_unref (priv->material);
+        priv->material = COGL_INVALID_HANDLE;
+    }
+
+    G_OBJECT_CLASS (hrn_square_clone_parent_class)->dispose (gobject);
+}
+
+static void
+hrn_square_clone_class_init (HrnSquareCloneClass *klass)
+{
+    GObjectClass      *gobject_class = G_OBJECT_CLASS (klass);
+    ClutterActorClass *actor_class   = CLUTTER_ACTOR_CLASS (klass);
+    GParamSpec        *pspec;
+
+    g_type_class_add_private (gobject_class, sizeof (HrnSquareClonePrivate));
+
+    actor_class->get_preferred_width =
+        hrn_square_clone_get_preferred_width;
+    actor_class->get_preferred_height =
+        hrn_square_clone_get_preferred_height;
+    actor_class->realize   = hrn_square_clone_realize;
+    actor_class->unrealize = hrn_square_clone_unrealize;
+    actor_class->paint     = hrn_square_clone_paint;
+
+    gobject_class->set_property = hrn_square_clone_set_property;
+    gobject_class->get_property = hrn_square_clone_get_property;
+    gobject_class->dispose      = hrn_square_clone_dispose;
+
+    pspec = g_param_spec_object ("parent-texture",
+                                 "Parent Texture",
+                                 "The parent ClutterTexture",
+                                 CLUTTER_TYPE_TEXTURE,
+                                 G_PARAM_READWRITE |
+                                 G_PARAM_CONSTRUCT);
+    g_object_class_install_property (gobject_class, PROP_PARENT_TEXTURE, pspec);
+}
+
+static void
+hrn_square_clone_init (HrnSquareClone *self)
+{
+    HrnSquareClonePrivate *priv;
+
+    self->priv = priv = HRN_SQUARE_CLONE_GET_PRIVATE (self);
+
+    priv->material = COGL_INVALID_HANDLE;
+}
+
+/**
+ * hrn_square_clone_new:
+ * @texture: a #ClutterTexture or %NULL
+ *
+ * A #HrnSquareClone is a specialized texture that efficiently clones
+ * an area of the given @texture while keeping preserving portions of the
+ * same texture.
+ *
+ * A #HrnSquareClone can be used to make a rectangular texture fit a
+ * given size without stretching its borders.
+ *
+ * Return value: the newly created #HrnSquareClone
+ */
+ClutterActor*
+hrn_square_clone_new (ClutterTexture *texture)
+{
+    g_return_val_if_fail (CLUTTER_IS_TEXTURE (texture), NULL);
+
+    return g_object_new (HRN_TYPE_SQUARE_CLONE,
+                         "parent-texture", texture,
+                         NULL);
+}
+
+ClutterTexture *
+hrn_square_clone_get_parent_texture (HrnSquareClone *frame)
+{
+    g_return_val_if_fail (HRN_IS_SQUARE_CLONE (frame), NULL);
+
+    return frame->priv->parent_texture;
+}
+
+void
+hrn_square_clone_set_parent_texture (HrnSquareClone *frame,
+                                     ClutterTexture *texture)
+{
+    HrnSquareClonePrivate *priv;
+    gboolean               was_visible;
+
+    g_return_if_fail (HRN_IS_SQUARE_CLONE (frame));
+    g_return_if_fail (CLUTTER_IS_TEXTURE (texture));
+
+    priv = frame->priv;
+
+    was_visible = CLUTTER_ACTOR_IS_VISIBLE (frame);
+
+    if (priv->parent_texture == texture) {
+        return;
+    }
+
+    if (priv->parent_texture) {
+        g_object_unref (priv->parent_texture);
+        priv->parent_texture = NULL;
+
+        if (was_visible) {
+            clutter_actor_hide (CLUTTER_ACTOR (frame));
+        }
+    }
+
+    if (texture) {
+        priv->parent_texture = g_object_ref (texture);
+
+        if (was_visible && CLUTTER_ACTOR_IS_VISIBLE (priv->parent_texture))
+            clutter_actor_show (CLUTTER_ACTOR (frame));
+    }
+
+    clutter_actor_queue_relayout (CLUTTER_ACTOR (frame));
+
+    g_object_notify (G_OBJECT (frame), "parent-texture");
+}
diff -pruN 1.5.1-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-texture-frame.c 1.8.4-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-texture-frame.c
--- 1.5.1-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-texture-frame.c	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-texture-frame.c	2010-02-17 17:26:44.000000000 +0000
@@ -0,0 +1,743 @@
+/*
+ * Hornsey - Moblin Media Player.
+ * Copyright © 2007, 2008, 2009 Intel Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU Lesser General Public License,
+ * version 2.1, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+
+/**
+ * SECTION:hrn-texture-frame
+ * @short_description: Stretch a texture to fit the entire allocation
+ *
+ * #HrnTextureFrame
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <cogl/cogl.h>
+
+#include "hrn-texture-frame.h"
+#include "hrn.h"
+
+enum
+{
+  PROP_0,
+
+  PROP_PARENT_TEXTURE,
+
+  PROP_LEFT,
+  PROP_TOP,
+  PROP_RIGHT,
+  PROP_BOTTOM,
+
+  PROP_SCALE_INVARIANT
+};
+
+G_DEFINE_TYPE (HrnTextureFrame, hrn_texture_frame, CLUTTER_TYPE_ACTOR);
+
+#define HRN_TEXTURE_FRAME_GET_PRIVATE(obj) \
+   (G_TYPE_INSTANCE_GET_PRIVATE (( obj), HRN_TYPE_TEXTURE_FRAME, \
+                                 HrnTextureFramePrivate))
+
+struct _HrnTextureFramePrivate
+{
+  ClutterTexture *parent_texture;
+
+  gfloat     left;
+  gfloat     top;
+  gfloat     right;
+  gfloat     bottom;
+  gboolean   scale_invariant;
+  gboolean   draw_middle;
+  gboolean   can_pinch;
+  CoglHandle material;
+};
+
+static void
+hrn_texture_frame_get_preferred_width (
+  ClutterActor *self, gfloat for_height, gfloat       *min_width_p,
+  gfloat       *natural_width_p)
+{
+  HrnTextureFramePrivate *priv = HRN_TEXTURE_FRAME (self)->priv;
+
+  if (G_UNLIKELY (priv->parent_texture == NULL))
+    {
+      if (min_width_p)
+        *min_width_p = 0;
+
+      if (natural_width_p)
+        *natural_width_p = 0;
+    }
+  else
+    {
+      ClutterActorClass *klass;
+
+      /* by directly querying the parent texture's class implementation
+       * we are going around any override mechanism the parent texture
+       * might have in place, and we ask directly for the original
+       * preferred width
+       */
+      klass = CLUTTER_ACTOR_GET_CLASS (priv->parent_texture);
+      klass->get_preferred_width (CLUTTER_ACTOR (priv->parent_texture),
+                                  for_height,
+                                  min_width_p,
+                                  natural_width_p);
+    }
+}
+
+static void
+hrn_texture_frame_get_preferred_height (
+  ClutterActor *self, gfloat for_width, gfloat       *min_height_p,
+  gfloat       *natural_height_p)
+{
+  HrnTextureFramePrivate *priv = HRN_TEXTURE_FRAME (self)->priv;
+
+  if (G_UNLIKELY (priv->parent_texture == NULL))
+    {
+      if (min_height_p)
+        *min_height_p = 0;
+
+      if (natural_height_p)
+        *natural_height_p = 0;
+    }
+  else
+    {
+      ClutterActorClass *klass;
+
+      /* by directly querying the parent texture's class implementation
+       * we are going around any override mechanism the parent texture
+       * might have in place, and we ask directly for the original
+       * preferred height
+       */
+      klass = CLUTTER_ACTOR_GET_CLASS (priv->parent_texture);
+      klass->get_preferred_height (CLUTTER_ACTOR (priv->parent_texture),
+                                   for_width,
+                                   min_height_p,
+                                   natural_height_p);
+    }
+}
+
+static void
+hrn_texture_frame_realize (ClutterActor *self)
+{
+  HrnTextureFramePrivate *priv = HRN_TEXTURE_FRAME (self)->priv;
+
+  if (priv->material != COGL_INVALID_HANDLE)
+    return;
+
+  priv->material = cogl_material_new ();
+
+  CLUTTER_ACTOR_SET_FLAGS (self, CLUTTER_ACTOR_REALIZED);
+}
+
+static void
+hrn_texture_frame_unrealize (ClutterActor *self)
+{
+  HrnTextureFramePrivate *priv = HRN_TEXTURE_FRAME (self)->priv;
+
+  if (priv->material == COGL_INVALID_HANDLE)
+    return;
+
+  cogl_material_unref (priv->material);
+  priv->material = COGL_INVALID_HANDLE;
+
+  CLUTTER_ACTOR_UNSET_FLAGS (self, CLUTTER_ACTOR_REALIZED);
+}
+
+/* utility function to retrieve the absolute scale (including
+ * scale factors of all ancestors), does not take depth into
+ * account
+ */
+static gdouble
+actor_get_abs_scale (ClutterActor *actor)
+{
+  ClutterActor *iter  = actor;
+  gdouble       scale = 1.0;
+
+  while (iter)
+    {
+      gdouble tscale;
+      clutter_actor_get_scale (iter, &tscale, NULL);
+      scale *= tscale;
+      iter   = clutter_actor_get_parent (iter);
+    }
+  return scale;
+}
+
+static void
+hrn_texture_frame_paint (ClutterActor *self)
+{
+  HrnTextureFramePrivate *priv         = HRN_TEXTURE_FRAME (self)->priv;
+  CoglHandle              cogl_texture = COGL_INVALID_HANDLE;
+  ClutterActorBox         box          = { 0, };
+  gfloat                  width, height;
+  gfloat                  tex_width, tex_height;
+  gfloat                  ex, ey;
+  gfloat                  tx1, ty1, tx2, ty2;
+  guint8                  opacity;
+  gfloat                  factor = 1.0;
+
+  gdouble                 pinch = hrn_get_pinch ();
+
+  if (!priv->can_pinch)
+    pinch = 0.0;
+
+  /* no need to paint stuff if we don't have a texture */
+  if (G_UNLIKELY (priv->parent_texture == NULL))
+    return;
+
+  /* parent texture may have been hidden, so need to make sure it gets
+   * realized
+   */
+  if (!CLUTTER_ACTOR_IS_REALIZED (priv->parent_texture))
+    clutter_actor_realize (CLUTTER_ACTOR (priv->parent_texture));
+
+  cogl_texture = clutter_texture_get_cogl_texture (priv->parent_texture);
+  if (cogl_texture == COGL_INVALID_HANDLE)
+    return;
+
+  if (priv->scale_invariant)
+    {
+      factor = 1.0 / actor_get_abs_scale (self);
+    }
+
+  tex_width  = cogl_texture_get_width (cogl_texture);
+  tex_height = cogl_texture_get_height (cogl_texture);
+
+  clutter_actor_get_allocation_box (self, &box);
+  width  = box.x2 - box.x1;
+  height = box.y2 - box.y1;
+
+  tx1 = (priv->left) / tex_width;
+  tx2 = (tex_width - priv->right) / tex_width;
+  ty1 = priv->top / tex_height;
+  ty2 = (tex_height - priv->bottom) / tex_height;
+
+  ex = width - priv->right * factor;
+  if (ex < 0)
+    ex = priv->right * factor;          /* FIXME ? */
+
+  ey = height - priv->bottom * factor;
+  if (ey < 0)
+    ey = priv->bottom * factor;         /* FIXME ? */
+
+  opacity = clutter_actor_get_paint_opacity (self);
+
+  g_assert (priv->material != COGL_INVALID_HANDLE);
+
+  /* set the source material using the parent texture's COGL handle */
+  cogl_material_set_color4ub (priv->material,
+                              opacity, opacity, opacity, opacity);
+  cogl_material_set_layer (priv->material, 0, cogl_texture);
+  cogl_set_source (priv->material);
+
+  if (pinch <= 0.1)
+    {
+      GLfloat rectangles[] =
+      {
+        /* top left corner */
+        0,                   0,                                    priv->left *
+        factor,
+        priv->top * factor,
+        0.0,                 0.0,
+        tx1,                 ty1,
+
+        /* top middle */
+        priv->left * factor, 0,                                    ex,
+        priv->top * factor,
+        tx1,                 0.0,
+        tx2,                 ty1,
+
+        /* top right */
+        ex,                  0,                                    width,
+        priv->top * factor,
+        tx2,                 0.0,
+        1.0,                 ty1,
+
+        /* mid left */
+        0,                   priv->top * factor,                   priv->left *
+        factor,                ey,
+        0.0,                 ty1,
+        tx1,                 ty2,
+
+
+
+        /* mid right */
+        ex,                  priv->top * factor,                   width,
+        ey,
+        tx2,                 ty1,
+        1.0,                 ty2,
+
+        /* bottom left */
+        0,                   ey,                                   priv->left *
+        factor,                height,
+        0.0,                 ty2,
+        tx1,                 1.0,
+
+        /* bottom center */
+        priv->left * factor, ey,                                   ex,
+        height,
+        tx1,                 ty2,
+        tx2,                 1.0,
+
+        /* bottom right */
+        ex,                  ey,                                   width,
+        height,
+        tx2,                 ty2,
+        1.0,                 1.0,
+
+        /* center */
+        priv->left * factor, priv->top * factor,
+        ex,                  ey,
+        tx1,                 ty1,                                  tx2,
+        ty2,
+      };
+
+      if (priv->draw_middle)
+        cogl_rectangles_with_texture_coords (rectangles, 9);
+      else
+        cogl_rectangles_with_texture_coords (rectangles, 8);
+    }
+  else
+    {
+      /* we cheat and draw the full polygon, for the use case
+         in hornsey that seems sufficient */
+      tx1 = ty1 = 0; tx2 = ty2 = 1;
+      CoglTextureVertex polygon[4] = {
+        { pinch * 0.5,         pinch * 2.5,         0.0,            tx1,    ty1, },
+        { width - pinch * 0.5, pinch * 2.5,         0.0,            tx2,    ty1, },
+        { width,         height,            0.0,            tx2,    ty2, },
+        { 0.0,           height,            0.0,            tx1,    ty2, },
+      };
+      cogl_polygon (polygon, 4, FALSE);
+    }
+}
+
+static inline void
+hrn_texture_frame_set_frame_internal (HrnTextureFrame *frame, gfloat left,
+                                      gfloat top, gfloat right,
+                                      gfloat bottom)
+{
+  HrnTextureFramePrivate *priv    = frame->priv;
+  GObject                *gobject = G_OBJECT (frame);
+  gboolean                changed = FALSE;
+
+  g_object_freeze_notify (gobject);
+
+  if (priv->top != top)
+    {
+      priv->top = top;
+      g_object_notify (gobject, "top");
+      changed = TRUE;
+    }
+
+  if (priv->right != right)
+    {
+      priv->right = right;
+      g_object_notify (gobject, "right");
+      changed = TRUE;
+    }
+
+  if (priv->bottom != bottom)
+    {
+      priv->bottom = bottom;
+      g_object_notify (gobject, "bottom");
+      changed = TRUE;
+    }
+
+  if (priv->left != left)
+    {
+      priv->left = left;
+      g_object_notify (gobject, "left");
+      changed = TRUE;
+    }
+
+  if (changed && CLUTTER_ACTOR_IS_VISIBLE (frame))
+    clutter_actor_queue_redraw (CLUTTER_ACTOR (frame));
+
+  g_object_thaw_notify (gobject);
+}
+
+static void
+hrn_texture_frame_set_property (GObject *gobject, guint prop_id,
+                                const GValue *value,
+                                GParamSpec   *pspec)
+{
+  HrnTextureFrame        *frame = HRN_TEXTURE_FRAME (gobject);
+  HrnTextureFramePrivate *priv  = frame->priv;
+
+  switch (prop_id)
+    {
+      case PROP_PARENT_TEXTURE:
+        hrn_texture_frame_set_parent_texture (frame,
+                                              g_value_get_object (value));
+        break;
+
+      case PROP_TOP:
+        hrn_texture_frame_set_frame_internal (frame,
+                                              priv->left,
+                                              g_value_get_float (value),
+                                              priv->right,
+                                              priv->bottom);
+        break;
+
+      case PROP_RIGHT:
+        hrn_texture_frame_set_frame_internal (frame,
+                                              priv->top,
+                                              g_value_get_float (value),
+                                              priv->bottom,
+                                              priv->left);
+        break;
+
+      case PROP_BOTTOM:
+        hrn_texture_frame_set_frame_internal (frame,
+                                              priv->top,
+                                              priv->right,
+                                              g_value_get_float (value),
+                                              priv->left);
+        break;
+
+      case PROP_LEFT:
+        hrn_texture_frame_set_frame_internal (frame,
+                                              priv->top,
+                                              priv->right,
+                                              priv->bottom,
+                                              g_value_get_float (value));
+        break;
+
+      case PROP_SCALE_INVARIANT:
+        hrn_texture_frame_set_scale_invariant (frame,
+                                               g_value_get_boolean (value));
+        break;
+
+      default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
+        break;
+    }
+}
+
+static void
+hrn_texture_frame_get_property (GObject *gobject, guint prop_id,
+                                GValue     *value,
+                                GParamSpec *pspec)
+{
+  HrnTextureFramePrivate *priv = HRN_TEXTURE_FRAME (gobject)->priv;
+
+  switch (prop_id)
+    {
+      case PROP_PARENT_TEXTURE:
+        g_value_set_object (value, priv->parent_texture);
+        break;
+
+      case PROP_LEFT:
+        g_value_set_float (value, priv->left);
+        break;
+
+      case PROP_TOP:
+        g_value_set_float (value, priv->top);
+        break;
+
+      case PROP_RIGHT:
+        g_value_set_float (value, priv->right);
+        break;
+
+      case PROP_BOTTOM:
+        g_value_set_float (value, priv->bottom);
+        break;
+
+      case PROP_SCALE_INVARIANT:
+        g_value_set_boolean (value, priv->scale_invariant);
+        break;
+
+      default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
+        break;
+    }
+}
+
+static void
+hrn_texture_frame_dispose (GObject *gobject)
+{
+  HrnTextureFramePrivate *priv = HRN_TEXTURE_FRAME (gobject)->priv;
+
+  if (priv->parent_texture)
+    {
+      g_object_unref (priv->parent_texture);
+      priv->parent_texture = NULL;
+    }
+
+  if (priv->material)
+    {
+      cogl_material_unref (priv->material);
+      priv->material = COGL_INVALID_HANDLE;
+    }
+
+  G_OBJECT_CLASS (hrn_texture_frame_parent_class)->dispose (gobject);
+}
+
+static void
+hrn_texture_frame_class_init (HrnTextureFrameClass *klass)
+{
+  GObjectClass      *gobject_class = G_OBJECT_CLASS (klass);
+  ClutterActorClass *actor_class   = CLUTTER_ACTOR_CLASS (klass);
+  GParamSpec        *pspec;
+
+  g_type_class_add_private (gobject_class, sizeof (HrnTextureFramePrivate));
+
+  actor_class->get_preferred_width =
+    hrn_texture_frame_get_preferred_width;
+  actor_class->get_preferred_height =
+    hrn_texture_frame_get_preferred_height;
+  actor_class->realize   = hrn_texture_frame_realize;
+  actor_class->unrealize = hrn_texture_frame_unrealize;
+  actor_class->paint     = hrn_texture_frame_paint;
+
+  gobject_class->set_property = hrn_texture_frame_set_property;
+  gobject_class->get_property = hrn_texture_frame_get_property;
+  gobject_class->dispose      = hrn_texture_frame_dispose;
+
+  pspec = g_param_spec_object ("parent-texture",
+                               "Parent Texture",
+                               "The parent ClutterTexture",
+                               CLUTTER_TYPE_TEXTURE,
+                               G_PARAM_READWRITE |
+                               G_PARAM_CONSTRUCT);
+  g_object_class_install_property (gobject_class, PROP_PARENT_TEXTURE, pspec);
+
+  pspec = g_param_spec_float ("left",
+                              "Left",
+                              "Left offset",
+                              0, G_MAXFLOAT,
+                              0,
+                              G_PARAM_READWRITE);
+  g_object_class_install_property (gobject_class, PROP_LEFT, pspec);
+
+  pspec = g_param_spec_float ("top",
+                              "Top",
+                              "Top offset",
+                              0, G_MAXFLOAT,
+                              0,
+                              G_PARAM_READWRITE);
+  g_object_class_install_property (gobject_class, PROP_TOP, pspec);
+
+  pspec = g_param_spec_float ("bottom",
+                              "Bottom",
+                              "Bottom offset",
+                              0, G_MAXFLOAT,
+                              0,
+                              G_PARAM_READWRITE);
+  g_object_class_install_property (gobject_class, PROP_BOTTOM, pspec);
+
+  pspec = g_param_spec_float ("right",
+                              "Right",
+                              "Right offset",
+                              0, G_MAXFLOAT,
+                              0,
+                              G_PARAM_READWRITE);
+  g_object_class_install_property (gobject_class, PROP_RIGHT, pspec);
+
+  pspec = g_param_spec_boolean ("scale-invariant",
+                                "Scale Invariant",
+                                "",
+                                FALSE,
+                                G_PARAM_READWRITE);
+  g_object_class_install_property (gobject_class, PROP_SCALE_INVARIANT, pspec);
+}
+
+static void
+hrn_texture_frame_init (HrnTextureFrame *self)
+{
+  HrnTextureFramePrivate *priv;
+
+  self->priv = priv = HRN_TEXTURE_FRAME_GET_PRIVATE (self);
+
+  priv->material = COGL_INVALID_HANDLE;
+}
+
+/**
+ * hrn_texture_frame_new:
+ * @texture: a #ClutterTexture or %NULL
+ * @left: left margin preserving its content
+ * @top: top margin preserving its content
+ * @right: right margin preserving its content
+ * @bottom: bottom margin preserving its content
+ *
+ * A #HrnTextureFrame is a specialized texture that efficiently clones
+ * an area of the given @texture while keeping preserving portions of the
+ * same texture.
+ *
+ * A #HrnTextureFrame can be used to make a rectangular texture fit a
+ * given size without stretching its borders.
+ *
+ * Return value: the newly created #HrnTextureFrame
+ */
+ClutterActor*
+hrn_texture_frame_new (ClutterTexture *texture, gfloat left, gfloat top,
+                       gfloat right,
+                       gfloat bottom)
+{
+  g_return_val_if_fail (texture == NULL || CLUTTER_IS_TEXTURE (texture), NULL);
+
+  return g_object_new (HRN_TYPE_TEXTURE_FRAME,
+                       "parent-texture", texture,
+                       "left", left,
+                       "top", top,
+                       "right", right,
+                       "bottom", bottom,
+                       NULL);
+}
+
+ClutterTexture *
+hrn_texture_frame_get_parent_texture (HrnTextureFrame *frame)
+{
+  g_return_val_if_fail (HRN_IS_TEXTURE_FRAME (frame), NULL);
+
+  return frame->priv->parent_texture;
+}
+
+void
+hrn_texture_frame_set_parent_texture (HrnTextureFrame *frame,
+                                      ClutterTexture  *texture)
+{
+  HrnTextureFramePrivate *priv;
+  gboolean                was_visible;
+
+  g_return_if_fail (HRN_IS_TEXTURE_FRAME (frame));
+  g_return_if_fail (texture == NULL || CLUTTER_IS_TEXTURE (texture));
+
+  priv = frame->priv;
+
+  was_visible = CLUTTER_ACTOR_IS_VISIBLE (frame);
+
+  if (priv->parent_texture == texture)
+    return;
+
+  if (priv->parent_texture)
+    {
+      g_object_unref (priv->parent_texture);
+      priv->parent_texture = NULL;
+
+      if (was_visible)
+        clutter_actor_hide (CLUTTER_ACTOR (frame));
+    }
+
+  if (texture)
+    {
+      priv->parent_texture = g_object_ref (texture);
+
+      /*  if (was_visible && CLUTTER_ACTOR_IS_VISIBLE (priv->parent_texture))*/
+      clutter_actor_show (CLUTTER_ACTOR (frame));
+    }
+
+  clutter_actor_queue_relayout (CLUTTER_ACTOR (frame));
+
+  g_object_notify (G_OBJECT (frame), "parent-texture");
+}
+
+void
+hrn_texture_frame_set_frame (HrnTextureFrame *frame, gfloat top, gfloat right,
+                             gfloat bottom,
+                             gfloat left)
+{
+  g_return_if_fail (HRN_IS_TEXTURE_FRAME (frame));
+
+  hrn_texture_frame_set_frame_internal (frame, top, right, bottom, left);
+}
+
+void
+hrn_texture_frame_get_frame (HrnTextureFrame *frame, gfloat           *top,
+                             gfloat           *right, gfloat           *bottom,
+                             gfloat           *left)
+{
+  HrnTextureFramePrivate *priv;
+
+  g_return_if_fail (HRN_IS_TEXTURE_FRAME (frame));
+
+  priv = frame->priv;
+
+  if (top)
+    *top = priv->top;
+
+  if (right)
+    *right = priv->right;
+
+  if (bottom)
+    *bottom = priv->bottom;
+
+  if (left)
+    *left = priv->left;
+}
+
+gboolean
+hrn_texture_frame_get_scale_invariant (HrnTextureFrame *frame)
+{
+  HrnTextureFramePrivate *priv;
+
+  g_return_val_if_fail (HRN_IS_TEXTURE_FRAME (frame), FALSE);
+
+  priv = frame->priv;
+  return priv->scale_invariant;
+}
+
+void
+hrn_texture_frame_set_draw_middle (HrnTextureFrame *frame, gboolean value)
+{
+  HrnTextureFramePrivate *priv;
+
+  g_return_if_fail (HRN_IS_TEXTURE_FRAME (frame));
+
+  priv = frame->priv;
+  if (priv->draw_middle != value)
+    {
+      priv->draw_middle = value;
+      if (CLUTTER_ACTOR_IS_VISIBLE (frame))
+        clutter_actor_queue_redraw (CLUTTER_ACTOR (frame));
+    }
+}
+
+void
+hrn_texture_frame_set_scale_invariant (HrnTextureFrame *frame, gboolean value)
+{
+  HrnTextureFramePrivate *priv;
+
+  g_return_if_fail (HRN_IS_TEXTURE_FRAME (frame));
+
+  priv = frame->priv;
+  if (priv->scale_invariant != value)
+    {
+      priv->scale_invariant = value;
+      if (CLUTTER_ACTOR_IS_VISIBLE (frame))
+        clutter_actor_queue_redraw (CLUTTER_ACTOR (frame));
+    }
+}
+
+void
+hrn_texture_frame_set_can_pinch (HrnTextureFrame *frame, gboolean value)
+{
+  HrnTextureFramePrivate *priv;
+
+  g_return_if_fail (HRN_IS_TEXTURE_FRAME (frame));
+
+  priv = frame->priv;
+  if (priv->can_pinch != value)
+    {
+      priv->can_pinch = value;
+      if (CLUTTER_ACTOR_IS_VISIBLE (frame))
+        clutter_actor_queue_redraw (CLUTTER_ACTOR (frame));
+    }
+}
diff -pruN 1.5.1-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-tile.c 1.8.4-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-tile.c
--- 1.5.1-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-tile.c	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-tile.c	2010-02-17 17:26:44.000000000 +0000
@@ -0,0 +1,387 @@
+#include "hrn.h"
+#include "hrn-square-clone.h"
+#include "hrn-texture-cache.h"
+#include "hrn-tileable.h"
+#include "hrn-tile.h"
+#include "hrn-tile-frame.h"
+#include "hrn-video-tile-frame.h"
+
+enum {
+    PROP_0,
+    PROP_ITEM,
+    PROP_NODE
+};
+
+struct _HrnTilePrivate {
+    HrnItem *item;
+
+    ClutterActor *thumbnail;
+    ClutterActor *primary;
+    ClutterActor *secondary;
+};
+
+#define GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), HRN_TYPE_TILE, HrnTilePrivate))
+static void tileable_interface_init (HrnTileableInterface *iface);
+G_DEFINE_TYPE_WITH_CODE (HrnTile, hrn_tile, MX_TYPE_TABLE,
+                         G_IMPLEMENT_INTERFACE (HRN_TYPE_TILEABLE,
+                                                tileable_interface_init));
+
+static void
+hrn_tile_finalize (GObject *object)
+{
+    G_OBJECT_CLASS (hrn_tile_parent_class)->finalize (object);
+}
+
+static void
+hrn_tile_dispose (GObject *object)
+{
+    HrnTile *self = (HrnTile *) object;
+    HrnTilePrivate *priv = self->priv;
+
+    if (priv->item) {
+        g_object_unref (priv->item);
+        priv->item = NULL;
+    }
+
+    G_OBJECT_CLASS (hrn_tile_parent_class)->dispose (object);
+}
+
+static void
+frame_action_cb (HrnTileFrame *frame,
+                 HrnTile      *tile)
+{
+    HrnClusterNode *node;
+
+    node = hrn_tileable_get_node ((HrnTileable *) tile);
+    hrn_tileable_activated ((HrnTileable *) tile,
+                            HRN_TILEABLE_ACTION_PLAY, node);
+}
+
+static void
+set_thumbnail (HrnTile *tile)
+{
+    HrnTilePrivate *priv = tile->priv;
+    HrnTextureCache *cache = hrn_texture_cache_get_default ();
+    ClutterActor *thumbnail;
+
+    thumbnail = hrn_texture_cache_get_texture_for_item (cache, priv->item);
+    if (hrn_item_get_item_type (priv->item) == HRN_ITEM_TYPE_VIDEO) {
+        priv->thumbnail = g_object_new (HRN_TYPE_VIDEO_TILE_FRAME,
+                                        "texture", thumbnail,
+                                        "label", hrn_tile_get_label (tile),
+                                        "uri", hrn_item_get_uri (priv->item),
+                                        NULL);
+    } else {
+        priv->thumbnail = g_object_new (HRN_TYPE_TILE_FRAME,
+                                        "texture", thumbnail,
+                                        "label", hrn_tile_get_label (tile),
+                                        NULL);
+    }
+    g_signal_connect (priv->thumbnail, "primary-action",
+                      G_CALLBACK (frame_action_cb), tile);
+    g_signal_connect (priv->thumbnail, "secondary-action",
+                      G_CALLBACK (frame_action_cb), tile);
+    mx_table_add_actor (MX_TABLE (tile), priv->thumbnail, 0, 0);
+}
+
+static void
+update_tile (HrnTile *tile)
+{
+    HrnTilePrivate *priv = tile->priv;
+    char *primary = NULL, *secondary = NULL;
+    const char *season, *episode, *year, *title = NULL;
+
+    switch (hrn_item_get_item_type (priv->item)) {
+    case HRN_ITEM_TYPE_AUDIO:
+        title = g_strdup (hrn_item_get_metadata (priv->item,
+                                                 HRN_ITEM_METADATA_TITLE));
+        secondary = g_strdup (hrn_item_get_metadata (priv->item,
+                                                     HRN_ITEM_METADATA_ALBUM));
+        if (secondary == NULL) {
+            g_warning ("FIXME: Need to get duration");
+#if 0
+            secondary = g_strdup_printf ("%d seconds",
+                                         bkl_item_audio_get_duration
+                                         ((BklItemAudio *) priv->item));
+#endif
+        }
+        break;
+
+#if 0
+    case HRN_ITEM_TYPE_IMAGE:
+        title = g_strdup (bkl_item_image_get_title ((BklItemImage *) priv->item));
+        width = bkl_item_image_get_width ((BklItemImage *) priv->item);
+        height = bkl_item_image_get_height ((BklItemImage *) priv->item);
+        secondary = g_strdup_printf ("%ux%u", width, height);
+        break;
+#endif
+
+    case HRN_ITEM_TYPE_VIDEO:
+        title = hrn_item_get_metadata (priv->item,
+                                       HRN_ITEM_METADATA_SERIES_NAME);
+        if (title == NULL) {
+            title = hrn_item_get_metadata (priv->item,
+                                           HRN_ITEM_METADATA_TITLE);
+        }
+
+        year = hrn_item_get_metadata (priv->item, HRN_ITEM_METADATA_DATE);
+        if (year == NULL) {
+            season = hrn_item_get_metadata (priv->item,
+                                            HRN_ITEM_METADATA_SEASON);
+            episode = hrn_item_get_metadata (priv->item,
+                                             HRN_ITEM_METADATA_EPISODE);
+
+            /* FIXME: When out of string freeze again, add support for
+               "Season %u" and "Episode %u" */
+            if (season > 0 && episode > 0) {
+                secondary = g_strdup_printf ("Season %s, Episode %s", season, episode);
+            } else {
+                secondary = NULL;
+            }
+        } else {
+            secondary = g_strdup_printf ("(%s)", year);
+        }
+        break;
+
+    default:
+        break;
+    }
+
+    if (title == NULL) {
+        char *basename;
+
+        basename = g_path_get_basename (hrn_item_get_uri (priv->item));
+        primary = g_uri_unescape_string (basename, NULL);
+        g_free (basename);
+    }
+
+    mx_label_set_text (MX_LABEL (priv->primary), title ? title : primary);
+    mx_label_set_text (MX_LABEL (priv->secondary),
+                       secondary ? secondary :
+                       hrn_item_get_mimetype (priv->item));
+
+    set_thumbnail (tile);
+
+    g_free (primary);
+    g_free (secondary);
+}
+
+static void
+clear_tile (HrnTile *tile)
+{
+    HrnTilePrivate *priv = tile->priv;
+    GError *error = NULL;
+    guint32 data = 0;
+
+    mx_label_set_text (MX_LABEL (priv->primary), "");
+    mx_label_set_text (MX_LABEL (priv->secondary), "");
+
+    clutter_texture_set_from_rgb_data (CLUTTER_TEXTURE (priv->thumbnail),
+                                       (const guchar *) &data, TRUE,
+                                       1, 1, 1, 4, 0, &error);
+    if (error) {
+        g_warning ("Error clearing texture: %s", error->message);
+        g_error_free (error);
+    }
+}
+
+static void
+hrn_tile_set_property (GObject      *object,
+                       guint         prop_id,
+                       const GValue *value,
+                       GParamSpec   *pspec)
+{
+    HrnTile *self = (HrnTile *) object;
+    HrnTilePrivate *priv = self->priv;
+
+    switch (prop_id) {
+    case PROP_ITEM:
+        if (priv->item) {
+            g_object_unref (priv->item);
+        }
+
+        priv->item = g_value_dup_object (value);
+        if (priv->item) {
+            update_tile (self);
+        } else {
+            clear_tile (self);
+        }
+        break;
+
+    case PROP_NODE:
+        break;
+
+    default:
+        break;
+    }
+}
+
+static void
+hrn_tile_get_property (GObject    *object,
+                       guint       prop_id,
+                       GValue     *value,
+                       GParamSpec *pspec)
+{
+    switch (prop_id) {
+
+    default:
+        break;
+    }
+}
+
+static void
+hrn_tile_class_init (HrnTileClass *klass)
+{
+    GObjectClass *o_class = (GObjectClass *) klass;
+
+    o_class->dispose = hrn_tile_dispose;
+    o_class->finalize = hrn_tile_finalize;
+    o_class->set_property = hrn_tile_set_property;
+    o_class->get_property = hrn_tile_get_property;
+
+    g_type_class_add_private (klass, sizeof (HrnTilePrivate));
+
+    g_object_class_install_property (o_class, PROP_ITEM,
+                                     g_param_spec_object ("item", "", "",
+                                                          HRN_TYPE_ITEM,
+                                                          G_PARAM_WRITABLE |
+                                                          G_PARAM_STATIC_STRINGS));
+    g_object_class_install_property (o_class, PROP_NODE,
+                                     g_param_spec_pointer ("node", "", "",
+                                                           G_PARAM_WRITABLE |
+                                                           G_PARAM_STATIC_STRINGS));
+}
+
+static guint
+tileable_get_count (HrnTileable *tileable)
+{
+    /* There's always only 1 item for HrnTile */
+    return 1;
+}
+
+static ClutterActor *
+tileable_get_thumbnail (HrnTileable *tileable)
+{
+    HrnTile *tile = HRN_TILE (tileable);
+    HrnTilePrivate *priv = tile->priv;
+
+    return priv->thumbnail;
+}
+
+static void
+tileable_set_position (HrnTileable *tileable,
+                       guint        x,
+                       guint        y)
+{
+    /* HrnTile doesn't really care where it's positioned */
+}
+
+static HrnClusterNode *
+tileable_get_node (HrnTileable *tileable)
+{
+    HrnTile *tile = (HrnTile *) tileable;
+    HrnTileClass *t_class = HRN_TILE_GET_CLASS (tile);
+
+    return t_class->get_node (tile);
+}
+
+static void
+tileable_interface_init (HrnTileableInterface *iface)
+{
+    iface->get_count = tileable_get_count;
+    iface->get_thumbnail = tileable_get_thumbnail;
+    iface->set_position = tileable_set_position;
+    iface->get_node = tileable_get_node;
+}
+
+static gboolean
+label_clicked_cb (ClutterActor       *actor,
+                  ClutterButtonEvent *event,
+                  HrnTile            *tile)
+{
+    const char *text;
+
+    if (event->button != 1) {
+        return FALSE;
+    }
+
+    text = mx_label_get_text ((MxLabel *) actor);
+    hrn_tileable_activated ((HrnTileable *) tile,
+                            HRN_TILEABLE_ACTION_SEARCH, (char *) text);
+    return TRUE;
+}
+
+static gboolean
+label_enter_cb (ClutterActor         *actor,
+                ClutterCrossingEvent *event,
+                HrnTile              *tile)
+{
+    mx_stylable_set_style_pseudo_class (MX_STYLABLE (actor), "hover");
+    return TRUE;
+}
+
+static gboolean
+label_leave_cb (ClutterActor         *actor,
+                ClutterCrossingEvent *event,
+                HrnTile              *tile)
+{
+    mx_stylable_set_style_pseudo_class (MX_STYLABLE (actor), NULL);
+    return TRUE;
+}
+
+static void
+hrn_tile_init (HrnTile *self)
+{
+    HrnTilePrivate *priv = GET_PRIVATE (self);
+
+    self->priv = priv;
+
+    clutter_actor_set_size (CLUTTER_ACTOR (self), ITEM_WIDTH, ITEM_HEIGHT);
+
+    priv->primary = mx_label_new ("");
+    mx_stylable_set_style_class (MX_STYLABLE (priv->primary),
+                                 "HrnTileablePrimary");
+    clutter_actor_set_reactive ((ClutterActor *) priv->primary, TRUE);
+    g_signal_connect (priv->primary, "button-release-event",
+                      G_CALLBACK (label_clicked_cb), self);
+    g_signal_connect (priv->primary, "enter-event",
+                      G_CALLBACK (label_enter_cb), self);
+    g_signal_connect (priv->primary, "leave-event",
+                      G_CALLBACK (label_leave_cb), self);
+    mx_table_add_actor_with_properties (MX_TABLE (self),
+                                          (ClutterActor *) priv->primary, 1, 0,
+                                          "x-expand", FALSE,
+                                          "x-fill", FALSE,
+                                          "y-expand", FALSE,
+                                          "y-fill", FALSE,
+                                          "x-align", 0.0,
+                                          NULL);
+
+    priv->secondary = mx_label_new ("");
+    mx_stylable_set_style_class (MX_STYLABLE (priv->secondary),
+                                 "HrnTileableSecondary");
+    clutter_actor_set_reactive ((ClutterActor *) priv->secondary, TRUE);
+    g_signal_connect (priv->secondary, "button-release-event",
+                      G_CALLBACK (label_clicked_cb), self);
+    g_signal_connect (priv->secondary, "enter-event",
+                      G_CALLBACK (label_enter_cb), self);
+    g_signal_connect (priv->secondary, "leave-event",
+                      G_CALLBACK (label_leave_cb), self);
+    mx_table_add_actor_with_properties (MX_TABLE (self),
+                                          (ClutterActor *) priv->secondary,
+                                          2, 0,
+                                          "x-expand", FALSE,
+                                          "x-fill", FALSE,
+                                          "y-expand", FALSE,
+                                          "y-fill", FALSE,
+                                          "x-align", 0.0,
+                                          NULL);
+}
+
+const char *
+hrn_tile_get_label (HrnTile *tile)
+{
+    HrnTileClass *klass = HRN_TILE_GET_CLASS (tile);
+
+    return klass->get_label (tile);
+}
diff -pruN 1.5.1-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-tile-frame.c 1.8.4-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-tile-frame.c
--- 1.5.1-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-tile-frame.c	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-tile-frame.c	2010-02-17 17:26:44.000000000 +0000
@@ -0,0 +1,308 @@
+#include <config.h>
+
+#include "hrn.h"
+#include "hrn-tile-frame.h"
+#include "hrn-texture-cache.h"
+
+enum {
+    PROP_0,
+    PROP_TEXTURE,
+    PROP_LABEL
+};
+
+enum {
+    PRIMARY,
+    SECONDARY,
+    LAST_SIGNAL,
+};
+
+struct _HrnTileFramePrivate {
+    ClutterActor *group;
+    ClutterActor *texture;
+
+    ClutterActor *overlay_group;
+    ClutterActor *overlay;
+    ClutterActor *play_icon;
+    ClutterActor *label;
+
+    ClutterActor *extra_texture;
+};
+
+#define GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), HRN_TYPE_TILE_FRAME, HrnTileFramePrivate))
+G_DEFINE_TYPE (HrnTileFrame, hrn_tile_frame, MX_TYPE_FRAME);
+static guint32 signals[LAST_SIGNAL] = {0,};
+
+static void
+hrn_tile_frame_finalize (GObject *object)
+{
+    G_OBJECT_CLASS (hrn_tile_frame_parent_class)->finalize (object);
+}
+
+static void
+hrn_tile_frame_dispose (GObject *object)
+{
+    HrnTileFrame *self = (HrnTileFrame *) object;
+    HrnTileFramePrivate *priv = self->priv;
+
+    if (priv->texture) {
+        g_object_unref (priv->texture);
+        priv->texture = NULL;
+    }
+
+    G_OBJECT_CLASS (hrn_tile_frame_parent_class)->dispose (object);
+}
+
+static gboolean
+texture_released_cb (ClutterActor       *actor,
+                     ClutterButtonEvent *event,
+                     HrnTileFrame       *frame)
+{
+    if (event->button != 1) {
+        return FALSE;
+    }
+
+    g_signal_emit (frame, signals[PRIMARY], 0);
+
+    return TRUE;
+}
+
+static void
+hrn_tile_frame_set_property (GObject      *object,
+                             guint         prop_id,
+                             const GValue *value,
+                             GParamSpec   *pspec)
+{
+    HrnTileFrame *self = (HrnTileFrame *) object;
+    HrnTileFramePrivate *priv = self->priv;
+    const char *label;
+
+    switch (prop_id) {
+    case PROP_TEXTURE:
+        priv->texture = g_value_dup_object (value);
+
+        clutter_actor_set_reactive (priv->texture, TRUE);
+        g_signal_connect (priv->texture, "button-release-event",
+                          G_CALLBACK (texture_released_cb), self);
+        clutter_container_add_actor ((ClutterContainer *) priv->group,
+                                     priv->texture);
+        clutter_actor_lower (priv->texture, priv->overlay_group);
+        break;
+
+    case PROP_LABEL:
+        label = g_value_get_string (value);
+        mx_label_set_text ((MxLabel *) priv->label, label);
+        break;
+
+    default:
+        break;
+    }
+}
+
+static void
+hrn_tile_frame_get_property (GObject    *object,
+                             guint       prop_id,
+                             GValue     *value,
+                             GParamSpec *pspec)
+{
+    switch (prop_id) {
+
+    default:
+        break;
+    }
+}
+
+static void
+hrn_tile_frame_allocate (ClutterActor          *actor,
+                         const ClutterActorBox *box,
+                         ClutterAllocationFlags flags)
+{
+    HrnTileFrame *frame = (HrnTileFrame *) actor;
+    HrnTileFramePrivate *priv = frame->priv;
+    ClutterActorBox child_box;
+
+    CLUTTER_ACTOR_CLASS (hrn_tile_frame_parent_class)->allocate (actor, box,
+                                                                 flags);
+    child_box.x1 = 5;
+    child_box.y1 = 2;
+    child_box.x2 = box->x2 - box->x1 - 5;
+    child_box.y2 = box->y2 - box->y1 - 7;
+
+    if (priv->texture) {
+        if (clutter_actor_is_rotated (priv->texture)) {
+            ClutterActorBox tmp_box;
+
+            tmp_box.x1 = 5;
+            tmp_box.x2 = box->y2 - box->y1 - 5;
+            tmp_box.y1 = 2;
+            tmp_box.y2 = box->x2 - box->x1 - 8;
+
+            clutter_actor_allocate (priv->texture, &tmp_box, flags);
+        } else {
+            clutter_actor_allocate (priv->texture, &child_box, flags);
+        }
+    }
+
+    if (priv->extra_texture) {
+        clutter_actor_allocate (priv->extra_texture, &child_box, flags);
+    }
+
+    child_box.y1 = child_box.y2 - 28;
+    clutter_actor_allocate (priv->overlay_group, &child_box, flags);
+
+    child_box.x1 = 0;
+    child_box.y1 = 0;
+    child_box.x2 = box->x2 - box->x1 - 10;
+    child_box.y2 = 28;
+    clutter_actor_allocate (priv->overlay, &child_box, flags);
+
+    child_box.y1 = 3;
+    child_box.x1 = child_box.x2 - 25;
+    child_box.y2 = 25;
+    child_box.x2 = child_box.x1 + 22;
+    clutter_actor_allocate (priv->play_icon, &child_box, flags);
+}
+
+static gboolean
+hrn_tile_frame_enter (ClutterActor         *actor,
+                      ClutterCrossingEvent *event)
+{
+    HrnTileFrame *frame = (HrnTileFrame *) actor;
+    HrnTileFramePrivate *priv = frame->priv;
+
+    mx_stylable_set_style_pseudo_class (MX_STYLABLE (actor), "hover");
+    clutter_actor_animate (priv->overlay_group,
+                           CLUTTER_EASE_IN_OUT_CUBIC, 500,
+                           "opacity", 0xff,
+                           NULL);
+    return FALSE;
+}
+
+static gboolean
+hrn_tile_frame_leave (ClutterActor         *actor,
+                      ClutterCrossingEvent *event)
+{
+    HrnTileFrame *frame = (HrnTileFrame *) actor;
+    HrnTileFramePrivate *priv = frame->priv;
+
+    mx_stylable_set_style_pseudo_class (MX_STYLABLE (actor), NULL);
+    clutter_actor_animate (priv->overlay_group,
+                           CLUTTER_EASE_IN_OUT_CUBIC, 500,
+                           "opacity", 0x00,
+                           NULL);
+
+    return FALSE;
+}
+
+static void
+hrn_tile_frame_class_init (HrnTileFrameClass *klass)
+{
+    GObjectClass *o_class = (GObjectClass *) klass;
+    ClutterActorClass *a_class = (ClutterActorClass *) klass;
+
+    o_class->dispose = hrn_tile_frame_dispose;
+    o_class->finalize = hrn_tile_frame_finalize;
+    o_class->set_property = hrn_tile_frame_set_property;
+    o_class->get_property = hrn_tile_frame_get_property;
+
+    a_class->allocate = hrn_tile_frame_allocate;
+    a_class->enter_event = hrn_tile_frame_enter;
+    a_class->leave_event = hrn_tile_frame_leave;
+
+    g_type_class_add_private (klass, sizeof (HrnTileFramePrivate));
+
+    g_object_class_install_property (o_class, PROP_TEXTURE,
+                                     g_param_spec_object ("texture", "", "",
+                                                          CLUTTER_TYPE_ACTOR,
+                                                          G_PARAM_WRITABLE |
+                                                          G_PARAM_STATIC_STRINGS));
+    g_object_class_install_property (o_class, PROP_LABEL,
+                                     g_param_spec_string ("label", "", "", "",
+                                                          G_PARAM_WRITABLE |
+                                                          G_PARAM_STATIC_STRINGS));
+
+    signals[PRIMARY] = g_signal_new ("primary-action",
+                                     G_TYPE_FROM_CLASS (klass),
+                                     G_SIGNAL_RUN_FIRST |
+                                     G_SIGNAL_NO_RECURSE, 0, NULL, NULL,
+                                     g_cclosure_marshal_VOID__VOID,
+                                     G_TYPE_NONE, 0);
+    signals[SECONDARY] = g_signal_new ("secondary-action",
+                                       G_TYPE_FROM_CLASS (klass),
+                                       G_SIGNAL_RUN_FIRST |
+                                       G_SIGNAL_NO_RECURSE, 0, NULL, NULL,
+                                       g_cclosure_marshal_VOID__VOID,
+                                       G_TYPE_NONE, 0);
+}
+
+static gboolean
+overlay_released_cb (ClutterActor       *actor,
+                     ClutterButtonEvent *event,
+                     HrnTileFrame       *frame)
+{
+    if (event->button != 1) {
+        return FALSE;
+    }
+
+    g_signal_emit (frame, signals[SECONDARY], 0);
+    return TRUE;
+}
+
+static void
+hrn_tile_frame_init (HrnTileFrame *self)
+{
+    HrnTileFramePrivate *priv = GET_PRIVATE (self);
+    HrnTextureCache *cache = hrn_texture_cache_get_default ();
+    ClutterColor black = { 0x00, 0x00, 0x00, 0xaa };
+
+    self->priv = priv;
+    priv->group = clutter_group_new ();
+
+    clutter_actor_set_reactive ((ClutterActor *) self, TRUE);
+
+    clutter_container_add_actor ((ClutterContainer *) self, priv->group);
+    clutter_actor_set_size (priv->group, THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT);
+    clutter_actor_set_position (priv->group, 0, 0);
+
+    priv->overlay_group = clutter_group_new ();
+    clutter_actor_set_reactive (priv->overlay_group, TRUE);
+    clutter_actor_set_opacity (priv->overlay_group, 0x00);
+    clutter_container_add_actor ((ClutterContainer *) priv->group,
+                                 priv->overlay_group);
+    g_signal_connect (priv->overlay_group, "button-release-event",
+                      G_CALLBACK (overlay_released_cb), self);
+
+    priv->overlay = clutter_rectangle_new_with_color (&black);
+    clutter_container_add_actor ((ClutterContainer *) priv->overlay_group,
+                                 priv->overlay);
+
+    priv->label = (ClutterActor*) mx_label_new ("");
+    clutter_actor_set_name (priv->label, "tile-overlay-label");
+
+#if 0
+    height = clutter_actor_get_height (priv->label);
+    clutter_actor_set_position (priv->label, 3.0, (28.0 - height) / 2.0);
+#else
+    clutter_actor_set_position (priv->label, 3.0, 5.0);
+#endif
+    clutter_container_add_actor ((ClutterContainer *) priv->overlay_group,
+                                 priv->label);
+
+    priv->play_icon = hrn_texture_cache_get_texture
+        (cache, THEMEDIR "/Hover-frame-play.png");
+    clutter_container_add_actor ((ClutterContainer *) priv->overlay_group,
+                                 priv->play_icon);
+}
+
+void
+hrn_tile_frame_set_secondary_texture (HrnTileFrame *frame,
+                                      ClutterActor *texture)
+{
+    HrnTileFramePrivate *priv = frame->priv;
+
+    priv->extra_texture = texture;
+    if (texture) {
+        clutter_container_add_actor ((ClutterContainer *) priv->group, texture);
+        clutter_container_raise_child ((ClutterContainer *) priv->group,
+                                       texture, priv->texture);
+    }
+}
diff -pruN 1.5.1-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-up-tile.c 1.8.4-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-up-tile.c
--- 1.5.1-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-up-tile.c	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-up-tile.c	2010-02-17 17:26:44.000000000 +0000
@@ -0,0 +1,168 @@
+#include "hrn.h"
+#include "hrn-texture-cache.h"
+#include "hrn-tile-frame.h"
+#include "hrn-up-tile.h"
+#include "hrn-tileable.h"
+
+enum {
+    PROP_0,
+};
+
+enum {
+    LAST_SIGNAL,
+};
+
+struct _HrnUpTilePrivate {
+    ClutterActor *thumbnail;
+};
+
+#define GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), HRN_TYPE_UP_TILE, HrnUpTilePrivate))
+static void tileable_interface_init (HrnTileableInterface *iface);
+G_DEFINE_TYPE_WITH_CODE (HrnUpTile, hrn_up_tile, MX_TYPE_TABLE,
+                         G_IMPLEMENT_INTERFACE (HRN_TYPE_TILEABLE,
+                                                tileable_interface_init));
+
+static void
+hrn_up_tile_finalize (GObject *object)
+{
+    G_OBJECT_CLASS (hrn_up_tile_parent_class)->finalize (object);
+}
+
+static void
+hrn_up_tile_dispose (GObject *object)
+{
+    G_OBJECT_CLASS (hrn_up_tile_parent_class)->dispose (object);
+}
+
+static void
+hrn_up_tile_set_property (GObject      *object,
+                          guint         prop_id,
+                          const GValue *value,
+                          GParamSpec   *pspec)
+{
+    switch (prop_id) {
+
+    default:
+        break;
+    }
+}
+
+static void
+hrn_up_tile_get_property (GObject    *object,
+                          guint       prop_id,
+                          GValue     *value,
+                          GParamSpec *pspec)
+{
+    switch (prop_id) {
+
+    default:
+        break;
+    }
+}
+
+static gboolean
+hrn_up_tile_enter_event (ClutterActor         *actor,
+                         ClutterCrossingEvent *event)
+{
+    HrnUpTile *tile = (HrnUpTile *) actor;
+    HrnUpTilePrivate *priv = tile->priv;
+
+    mx_stylable_set_style_pseudo_class (MX_STYLABLE (priv->thumbnail),
+                                        "hover");
+    return FALSE;
+}
+
+static gboolean
+hrn_up_tile_leave_event (ClutterActor         *actor,
+                         ClutterCrossingEvent *event)
+{
+    HrnUpTile *tile = (HrnUpTile *) actor;
+    HrnUpTilePrivate *priv = tile->priv;
+
+    mx_stylable_set_style_pseudo_class (MX_STYLABLE (priv->thumbnail), NULL);
+    return FALSE;
+}
+
+static gboolean
+hrn_up_tile_release_event (ClutterActor       *actor,
+                           ClutterButtonEvent *event)
+{
+    HrnUpTile *tile = (HrnUpTile *) actor;
+
+    if (event->button != 1) {
+        return FALSE;
+    }
+
+    hrn_tileable_activated ((HrnTileable *) tile,
+                            HRN_TILEABLE_ACTION_UP_LEVEL, tile);
+
+    return TRUE;
+}
+
+static void
+hrn_up_tile_class_init (HrnUpTileClass *klass)
+{
+    GObjectClass *o_class = (GObjectClass *) klass;
+    ClutterActorClass *a_class = (ClutterActorClass *) klass;
+
+    o_class->dispose = hrn_up_tile_dispose;
+    o_class->finalize = hrn_up_tile_finalize;
+    o_class->set_property = hrn_up_tile_set_property;
+    o_class->get_property = hrn_up_tile_get_property;
+
+    a_class->enter_event = hrn_up_tile_enter_event;
+    a_class->leave_event = hrn_up_tile_leave_event;
+    a_class->button_release_event = hrn_up_tile_release_event;
+
+    g_type_class_add_private (klass, sizeof (HrnUpTilePrivate));
+}
+
+static guint
+tileable_get_count (HrnTileable *tileable)
+{
+    return 1;
+}
+
+static ClutterActor *
+tileable_get_thumbnail (HrnTileable *tileable)
+{
+    return NULL;
+}
+
+static void
+tileable_set_position (HrnTileable *tileable,
+                       guint        x,
+                       guint        y)
+{
+}
+
+static HrnClusterNode *
+tileable_get_node (HrnTileable *tileable)
+{
+    return NULL;
+}
+
+static void
+tileable_interface_init (HrnTileableInterface *iface)
+{
+    iface->get_count = tileable_get_count;
+    iface->get_thumbnail = tileable_get_thumbnail;
+    iface->set_position = tileable_set_position;
+    iface->get_node = tileable_get_node;
+}
+
+static void
+hrn_up_tile_init (HrnUpTile *self)
+{
+    HrnUpTilePrivate *priv = GET_PRIVATE (self);
+
+    self->priv = priv;
+
+    clutter_actor_set_reactive ((ClutterActor *) self, TRUE);
+
+    priv->thumbnail = (ClutterActor *) mx_label_new ("");
+    clutter_actor_set_size (priv->thumbnail, THUMBNAIL_WIDTH,
+                            THUMBNAIL_HEIGHT);
+    mx_table_add_actor (MX_TABLE (self), priv->thumbnail, 0, 0);
+}
+
diff -pruN 1.5.1-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-view.c 1.8.4-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-view.c
--- 1.5.1-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-view.c	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/.pc/02_port_to_mx_1.0.2.patch/src/hrn-view.c	2010-02-17 17:26:44.000000000 +0000
@@ -0,0 +1,1343 @@
+#include "hrn.h"
+#include "hrn-view.h"
+#include "hrn-tileable.h"
+#include "hrn-tiler.h"
+#include "hrn-viewer.h"
+#include "hrn-marshal.h"
+
+#include "hrn-artist-cluster.h"
+#include "hrn-year-cluster.h"
+#include "hrn-video-tile.h"
+
+enum {
+    PROP_0,
+    PROP_HADJUST,
+    PROP_VADJUST
+};
+
+enum {
+    ACTIVATED,
+    LAST_SIGNAL,
+};
+
+/* #define DEBUG_SIZE 1 */
+
+struct _HrnViewPrivate {
+    MxAdjustment *hadjustment;
+    MxAdjustment *vadjustment;
+
+    HrnClusterNode *root;
+    guint32 child_added_id;
+    guint32 child_removed_id;
+    GHashTable *child_items;
+
+    guint visible_children;
+    HrnTileable *shown_child;
+
+    double scale;
+
+    guint items_per_row;
+    int count;
+
+#ifdef DEBUG_SIZE
+    ClutterActor *bg;
+#endif
+};
+
+#define DEFAULT_ITEMS_PER_ROW 5
+
+#define DEFAULT_SCALE 1.0
+
+#define X_GRID_TO_COORDS(x) (x * (ITEM_WIDTH + COL_GAP))
+#define Y_GRID_TO_COORDS(y) (y * (ITEM_HEIGHT + ROW_GAP))
+
+#define LEVEL_COUNT 3
+
+static gboolean debug_visible = FALSE;
+
+#define GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), HRN_TYPE_VIEW, HrnViewPrivate))
+
+static void scrollable_set_adjustments (MxScrollable *scrollable,
+                                        MxAdjustment *hadjustment,
+                                        MxAdjustment *vadjustment);
+static void scrollable_get_adjustments (MxScrollable  *scrollable,
+                                        MxAdjustment **hadjustment,
+                                        MxAdjustment **vadjustment);
+static void scrollable_interface_init (MxScrollableInterface *iface);
+static void container_interface_init (ClutterContainerIface *iface);
+static void tiler_interface_init (HrnTilerInterface *iface);
+static void viewer_interface_init (HrnViewerInterface *iface);
+G_DEFINE_TYPE_WITH_CODE (HrnView, hrn_view, MX_TYPE_WIDGET,
+                         G_IMPLEMENT_INTERFACE (HRN_TYPE_TILER,
+                                                tiler_interface_init)
+                         G_IMPLEMENT_INTERFACE (HRN_TYPE_VIEWER,
+                                                viewer_interface_init)
+                         G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_CONTAINER,
+                                                container_interface_init)
+                         G_IMPLEMENT_INTERFACE (MX_TYPE_SCROLLABLE,
+                                                scrollable_interface_init));
+
+static guint32 signals[LAST_SIGNAL] = {0,};
+
+static void
+hrn_view_finalize (GObject *object)
+{
+    G_OBJECT_CLASS (hrn_view_parent_class)->finalize (object);
+}
+
+static void
+hrn_view_dispose (GObject *object)
+{
+    G_OBJECT_CLASS (hrn_view_parent_class)->dispose (object);
+}
+
+static void
+hrn_view_set_property (GObject      *object,
+                       guint         prop_id,
+                       const GValue *value,
+                       GParamSpec   *pspec)
+{
+    HrnView *self = (HrnView *) object;
+    HrnViewPrivate *priv = self->priv;
+
+    switch (prop_id) {
+    case PROP_HADJUST:
+        scrollable_set_adjustments (MX_SCROLLABLE (object),
+                                    g_value_get_object (value),
+                                    priv->vadjustment);
+        break;
+
+    case PROP_VADJUST:
+        scrollable_set_adjustments (MX_SCROLLABLE (object),
+                                    priv->hadjustment,
+                                    g_value_get_object (value));
+        break;
+
+    default:
+        break;
+    }
+}
+
+static void
+hrn_view_get_property (GObject    *object,
+                       guint       prop_id,
+                       GValue     *value,
+                       GParamSpec *pspec)
+{
+    MxAdjustment *adj;
+
+    switch (prop_id) {
+    case PROP_HADJUST:
+        scrollable_get_adjustments (MX_SCROLLABLE (object), &adj, NULL);
+        g_value_set_object (value, adj);
+        break;
+
+    case PROP_VADJUST:
+        scrollable_get_adjustments (MX_SCROLLABLE (object), NULL, &adj);
+        g_value_set_object (value, adj);
+        break;
+
+    default:
+        break;
+    }
+}
+
+static void
+hrn_view_paint (ClutterActor *actor)
+{
+    HrnView *view = (HrnView *) actor;
+    HrnViewPrivate *priv = view->priv;
+    GSequenceIter *iter;
+    float x, y;
+    ClutterActorBox view_box;
+
+    if (priv->hadjustment) {
+        x = mx_adjustment_get_value (priv->hadjustment);
+    } else {
+        x = 0;
+    }
+
+    if (priv->vadjustment) {
+        y = mx_adjustment_get_value (priv->vadjustment);
+    } else {
+        y = 0;
+    }
+
+    CLUTTER_ACTOR_CLASS (hrn_view_parent_class)->paint (actor);
+
+    clutter_actor_get_allocation_box (actor, &view_box);
+    view_box.x2 = (view_box.x2 - view_box.x1) + x;
+    view_box.x1 = x;
+    view_box.y2 = (view_box.y2 - view_box.y1) + y;
+    view_box.y1 = y;
+
+    if (priv->root == NULL) {
+        return;
+    }
+
+    iter = g_sequence_get_begin_iter (priv->root->children);
+    while (g_sequence_iter_is_end (iter) == FALSE) {
+        HrnClusterNode *child_node = g_sequence_get (iter);
+        ClutterActor *child;
+        ClutterActorBox child_box;
+
+        if (child_node->hidden) {
+            iter = g_sequence_iter_next (iter);
+            continue;
+        }
+
+        child = g_hash_table_lookup (priv->child_items, child_node);
+        if (child == NULL) {
+            g_warning ("No child found for %s", child_node->name);
+            iter = g_sequence_iter_next (iter);
+            continue;
+        }
+
+        clutter_actor_get_allocation_box (child, &child_box);
+
+        if ((child_box.y1 < view_box.y2)
+            && (child_box.y2 > view_box.y1)
+            && CLUTTER_ACTOR_IS_VISIBLE (child)) {
+            clutter_actor_paint (child);
+        }
+
+        iter = g_sequence_iter_next (iter);
+    }
+}
+
+static void
+hrn_view_pick (ClutterActor       *actor,
+               const ClutterColor *color)
+{
+    HrnView *view = (HrnView *) actor;
+    HrnViewPrivate *priv = view->priv;
+    GSequenceIter *iter;
+    float x, y;
+    ClutterActorBox view_box;
+
+    if (priv->hadjustment) {
+        x = mx_adjustment_get_value (priv->hadjustment);
+    } else {
+        x = 0;
+    }
+
+    if (priv->vadjustment) {
+        y = mx_adjustment_get_value (priv->vadjustment);
+    } else {
+        y = 0;
+    }
+
+    CLUTTER_ACTOR_CLASS (hrn_view_parent_class)->pick (actor, color);
+
+    clutter_actor_get_allocation_box (actor, &view_box);
+    view_box.x2 = (view_box.x2 - view_box.x1) + x;
+    view_box.x1 = x;
+    view_box.y2 = (view_box.y2 - view_box.y1) + y;
+    view_box.y1 = y;
+
+    if (priv->root == NULL) {
+        return;
+    }
+
+    iter = g_sequence_get_begin_iter (priv->root->children);
+    while (g_sequence_iter_is_end (iter) == FALSE) {
+        HrnClusterNode *child_node = g_sequence_get (iter);
+        ClutterActor *child;
+        ClutterActorBox child_box;
+
+        if (child_node->hidden) {
+            iter = g_sequence_iter_next (iter);
+            continue;
+        }
+
+        child = g_hash_table_lookup (priv->child_items, child_node);
+        if (child == NULL) {
+            g_warning ("No child found for %s", child_node->name);
+            iter = g_sequence_iter_next (iter);
+            continue;
+        }
+
+        clutter_actor_get_allocation_box (child, &child_box);
+
+        if ((child_box.y1 < view_box.y2)
+            && (child_box.y2 > view_box.y1)
+            && CLUTTER_ACTOR_IS_VISIBLE (child)) {
+            clutter_actor_paint (child);
+        }
+
+        iter = g_sequence_iter_next (iter);
+    }
+}
+
+static void
+hrn_view_apply_transform (ClutterActor *actor,
+                          CoglMatrix   *matrix)
+{
+    HrnView *view = (HrnView *) actor;
+    HrnViewPrivate *priv = view->priv;
+    double x, y;
+
+    CLUTTER_ACTOR_CLASS (hrn_view_parent_class)->apply_transform (actor, matrix);
+
+    if (priv->hadjustment) {
+        x = mx_adjustment_get_value (priv->hadjustment);
+    } else {
+        x = 0;
+    }
+
+    if (priv->vadjustment) {
+        y = mx_adjustment_get_value (priv->vadjustment);
+    } else {
+        y = 0;
+    }
+
+    cogl_matrix_translate (matrix, (int) -x, (int) -y, 0);
+}
+
+static void
+hrn_view_do_allocate (ClutterActor          *actor,
+                      const ClutterActorBox *box,
+                      ClutterAllocationFlags flags,
+                      gboolean               calculate_extents_only,
+                      float                 *actual_width,
+                      float                 *actual_height)
+{
+    HrnView *view = (HrnView *) actor;
+    HrnViewPrivate *priv = view->priv;
+    GSequenceIter *iter;
+    int row_count, i;
+    MxPadding padding;
+
+    mx_widget_get_padding (MX_WIDGET (actor), &padding);
+
+    i = 0;
+    if (priv->shown_child) {
+        ClutterActorBox child_box;
+        float nat_w, nat_h;
+
+        clutter_actor_get_preferred_width ((ClutterActor *) priv->shown_child,
+                                           0, NULL, &nat_w);
+        clutter_actor_get_preferred_height ((ClutterActor *) priv->shown_child,
+                                            0, NULL, &nat_h);
+
+        child_box.x1 = X_GRID_TO_COORDS (0) + padding.left;
+        child_box.x2 = child_box.x1 + nat_w;
+        child_box.y1 = Y_GRID_TO_COORDS (0) + padding.top;
+        child_box.y2 = child_box.y1 + nat_h;
+
+        clutter_actor_allocate ((ClutterActor *) priv->shown_child,
+                                &child_box, flags);
+
+        /* Let tileable know where we are */
+        hrn_tileable_set_position (priv->shown_child, 0, 0);
+
+        i = hrn_tileable_get_count (priv->shown_child);
+    } else {
+        if (priv->root) {
+            iter = g_sequence_get_begin_iter (priv->root->children);
+            while (g_sequence_iter_is_end (iter) == FALSE) {
+                HrnClusterNode *child_node = g_sequence_get (iter);
+                ClutterActor *child;
+                ClutterActorBox child_box;
+                float nat_w, nat_h;
+                int x, y;
+
+                if (child_node->hidden) {
+                    iter = g_sequence_iter_next (iter);
+                    continue;
+                }
+
+                child = g_hash_table_lookup (priv->child_items, child_node);
+                if (child == NULL) {
+                    g_warning ("No child found for %s", child_node->name);
+                    iter = g_sequence_iter_next (iter);
+                    continue;
+                }
+
+                x = i % priv->items_per_row;
+                y = i / priv->items_per_row;
+
+                clutter_actor_get_preferred_width (child, 0, NULL, &nat_w);
+                clutter_actor_get_preferred_height (child, 0, NULL, &nat_h);
+
+                child_box.x1 = X_GRID_TO_COORDS (x) + padding.left;
+                child_box.x2 = child_box.x1 + nat_w;
+                child_box.y1 = Y_GRID_TO_COORDS (y) + padding.top;
+                child_box.y2 = child_box.y1 + nat_h;
+
+                clutter_actor_allocate (child, &child_box, flags);
+
+                /* Let tileable know where we are */
+                hrn_tileable_set_position ((HrnTileable *) child, x, y);
+
+                iter = g_sequence_iter_next (iter);
+                i++;
+            }
+        }
+    }
+
+    row_count = i / priv->items_per_row;
+    if (i % priv->items_per_row > 0) {
+        row_count++;
+    }
+
+    if (actual_width) {
+        *actual_width = (priv->items_per_row * (ITEM_WIDTH + COL_GAP)) - COL_GAP
+          + padding.left + padding.right;
+    }
+
+    if (actual_height) {
+        *actual_height = ITEM_HEIGHT + ((row_count - 1) * (ITEM_HEIGHT + ROW_GAP))
+          + padding.top + padding.bottom;
+    }
+}
+
+static void
+hrn_view_get_preferred_width (ClutterActor *actor,
+                              float         for_height,
+                              float        *min_width_p,
+                              float        *natural_width_p)
+{
+    float actual_width, actual_height;
+    ClutterActorBox box;
+
+    box.x1 = 0;
+    box.y1 = 0;
+    box.x2 = G_MAXFLOAT;
+    box.y2 = for_height;
+
+    hrn_view_do_allocate (actor, &box, FALSE, TRUE,
+                          &actual_width, &actual_height);
+
+    if (min_width_p) {
+        *min_width_p = actual_width;
+    }
+    if (natural_width_p) {
+        *natural_width_p = actual_width;
+    }
+}
+
+static void
+hrn_view_get_preferred_height (ClutterActor *actor,
+                               float         for_width,
+                               float        *min_height_p,
+                               float        *natural_height_p)
+{
+    float actual_width, actual_height;
+    ClutterActorBox box;
+
+    box.x1 = 0;
+    box.y1 = 0;
+    box.x2 = for_width;
+    box.y2 = G_MAXFLOAT;
+
+    hrn_view_do_allocate (actor, &box, FALSE, TRUE,
+                          &actual_width, &actual_height);
+
+    if (min_height_p) {
+        *min_height_p = actual_height;
+    }
+    if (natural_height_p) {
+        *natural_height_p = actual_height;
+    }
+}
+
+static void
+hrn_view_allocate (ClutterActor          *actor,
+                   const ClutterActorBox *box,
+                   ClutterAllocationFlags flags)
+{
+    HrnView *view = (HrnView *) actor;
+    HrnViewPrivate *priv = view->priv;
+    ClutterActorBox alloc_box = *box;
+    float width;
+    int items_per_row;
+
+    CLUTTER_ACTOR_CLASS (hrn_view_parent_class)->allocate (actor, box, flags);
+
+    if (priv->vadjustment) {
+        double prev_value;
+        float height, page_inc;
+
+        hrn_view_do_allocate (actor, box, flags, TRUE, NULL, &height);
+        alloc_box.y2 = alloc_box.y1 + height;
+
+        for (page_inc = 0;
+             (page_inc + ITEM_HEIGHT + ROW_GAP) <= (box->y2 - box->y1);
+             page_inc += ITEM_HEIGHT + ROW_GAP);
+        g_object_set (priv->vadjustment,
+                      "lower", 0.0,
+                      "upper", height,
+                      "page-size", box->y2 - box->y1,
+                      "step-increment", ITEM_HEIGHT + ROW_GAP,
+                      "page-increment", page_inc,
+                      NULL);
+        if (priv->hadjustment) {
+            g_object_set (priv->hadjustment,
+                          "lower", 0.0,
+                          "upper", 0.0,
+                          NULL);
+        }
+
+        prev_value = mx_adjustment_get_value (priv->vadjustment);
+        mx_adjustment_set_value (priv->vadjustment, prev_value);
+    }
+
+    /* Calculate items per row */
+    width = alloc_box.x2 - alloc_box.x1;
+    items_per_row = (int) (width / (ITEM_WIDTH + COL_GAP));
+    if (items_per_row == 0) {
+        items_per_row = 1;
+    }
+
+    hrn_tiler_set_items_per_row ((HrnTiler *) actor, items_per_row);
+}
+
+static void
+hrn_view_class_init (HrnViewClass *klass)
+{
+    GObjectClass *o_class = (GObjectClass *) klass;
+    ClutterActorClass *a_class = (ClutterActorClass *) klass;
+
+    o_class->dispose = hrn_view_dispose;
+    o_class->finalize = hrn_view_finalize;
+    o_class->set_property = hrn_view_set_property;
+    o_class->get_property = hrn_view_get_property;
+
+    a_class->paint = hrn_view_paint;
+    a_class->pick = hrn_view_pick;
+    a_class->apply_transform = hrn_view_apply_transform;
+    a_class->get_preferred_width = hrn_view_get_preferred_width;
+    a_class->get_preferred_height = hrn_view_get_preferred_height;
+    a_class->allocate = hrn_view_allocate;
+
+    g_type_class_add_private (klass, sizeof (HrnViewPrivate));
+
+    g_object_class_override_property (o_class, PROP_HADJUST, "hadjustment");
+    g_object_class_override_property (o_class, PROP_VADJUST, "vadjustment");
+
+    signals[ACTIVATED] = g_signal_new ("activated",
+                                       G_TYPE_FROM_CLASS (klass),
+                                       G_SIGNAL_NO_RECURSE |
+                                       G_SIGNAL_RUN_LAST, 0, NULL, NULL,
+                                       hrn_marshal_VOID__INT_POINTER,
+                                       G_TYPE_NONE, 2, G_TYPE_INT,
+                                       G_TYPE_POINTER);
+}
+
+#if 0
+static void
+ensure_children_are_visible (HrnView *view)
+{
+    HrnViewPrivate *priv = view->priv;
+    float x, y;
+    ClutterActorBox view_b;
+
+    if (priv->hadjustment) {
+        x = mx_adjustment_get_value (priv->hadjustment);
+    } else {
+        x = 0;
+    }
+
+    if (priv->vadjustment) {
+        y = mx_adjustment_get_value (priv->vadjustment);
+    } else {
+        y = 0;
+    }
+
+    clutter_actor_get_allocation_box ((ClutterActor *) view, &view_b);
+    view_b.x2 = (view_b.x2 - view_b.x1) + x;
+    view_b.x1 = 0;
+    view_b.y2 = (view_b.y2 - view_b.y1) + y;
+    view_b.y1 = 0;
+
+#if 0
+    for (i = 0; i < priv->children->len; i++) {
+        ClutterActor *child = priv->children->pdata[i];
+        ClutterActorBox child_b;
+
+        /* Check if the child is "on screen" */
+        clutter_actor_get_allocation_box (child, &child_b);
+
+        if ((child_b.y1 < view_b.y2)
+            && (child_b.y2 > child_b.y1)) {
+            clutter_actor_show (child);
+        } else {
+            clutter_actor_hide (child);
+        }
+    }
+#endif
+}
+#endif
+
+/* scrollable interface */
+static void
+adj_value_notify_cb (MxAdjustment *adjustment,
+                            GParamSpec     *pspec,
+                            HrnView        *view)
+{
+    /* ensure_children_are_visible (view); */
+    /* clutter_actor_queue_redraw ((ClutterActor *) view); */
+}
+
+static void
+scrollable_set_adjustments (MxScrollable *scrollable,
+                            MxAdjustment *hadjustment,
+                            MxAdjustment *vadjustment)
+{
+    HrnView *view = (HrnView *) scrollable;
+    HrnViewPrivate *priv = view->priv;
+
+    if (hadjustment != priv->hadjustment) {
+        if (priv->hadjustment) {
+            g_signal_handlers_disconnect_by_func (priv->hadjustment,
+                                                  adj_value_notify_cb,
+                                                  scrollable);
+            g_object_unref (priv->hadjustment);
+        }
+
+        if (hadjustment) {
+            g_object_ref (hadjustment);
+            g_signal_connect (hadjustment, "notify::value",
+                              G_CALLBACK (adj_value_notify_cb), scrollable);
+        }
+
+        priv->hadjustment = hadjustment;
+    }
+
+    if (vadjustment != priv->vadjustment) {
+        if (priv->vadjustment) {
+            g_signal_handlers_disconnect_by_func (priv->vadjustment,
+                                                  adj_value_notify_cb,
+                                                  scrollable);
+            g_object_unref (priv->vadjustment);
+        }
+
+        if (vadjustment) {
+            g_object_ref (vadjustment);
+            g_signal_connect (vadjustment, "notify::value",
+                              G_CALLBACK (adj_value_notify_cb), scrollable);
+        }
+
+        priv->vadjustment = vadjustment;
+    }
+}
+
+static void
+scrollable_get_adjustments (MxScrollable  *scrollable,
+                            MxAdjustment **hadjustment,
+                            MxAdjustment **vadjustment)
+{
+    HrnView *view = (HrnView *) scrollable;
+    HrnViewPrivate *priv = view->priv;
+    ClutterActor *actor;
+
+    actor = CLUTTER_ACTOR (scrollable);
+
+    if (hadjustment) {
+        if (priv->hadjustment) {
+            *hadjustment = priv->hadjustment;
+        } else {
+            MxAdjustment *adj;
+            double width, increment;
+
+            width = clutter_actor_get_width (actor);
+            increment = MAX (1.0, width);
+            adj = mx_adjustment_new (0, 0, width, 1.0,
+                                       increment, increment);
+            scrollable_set_adjustments (scrollable, adj, priv->vadjustment);
+            *hadjustment = adj;
+        }
+    }
+
+    if (vadjustment) {
+        if (priv->vadjustment) {
+            *vadjustment = priv->vadjustment;
+        } else {
+            MxAdjustment *adj;
+            double height, increment;
+
+            height = clutter_actor_get_height (actor);
+            increment = MAX (1.0, height);
+            adj = mx_adjustment_new (0, 0, height, 1.0,
+                                       increment, increment);
+            scrollable_set_adjustments (scrollable, priv->hadjustment, adj);
+            *vadjustment = adj;
+        }
+    }
+}
+
+static void
+scrollable_interface_init (MxScrollableInterface *iface)
+{
+    iface->set_adjustments = scrollable_set_adjustments;
+    iface->get_adjustments = scrollable_get_adjustments;
+}
+
+static void
+hide_actor (ClutterAnimation *animation,
+            gpointer          data)
+{
+    clutter_actor_hide ((ClutterActor *) data);
+}
+
+static void child_visibility_changed (HrnTileable *tileable,
+                                      gboolean     hidden,
+                                      HrnView     *view);
+
+static void
+hide_child (HrnView      *view,
+            ClutterActor *actor)
+{
+    HrnViewPrivate *priv = view->priv;
+    HrnClusterNode *node;
+
+    /* FIXME: Should probably check that the child is onscreen */
+    clutter_actor_animate (actor, CLUTTER_EASE_IN_OUT_CUBIC, 500,
+                           "opacity", 0x00,
+                           "signal::completed", hide_actor, actor,
+                           NULL);
+
+    priv->visible_children--;
+
+    node = hrn_tileable_get_node ((HrnTileable *) actor);
+
+    /* Block this as we're already hiding it */
+    g_signal_handlers_block_by_func (actor, child_visibility_changed, view);
+
+    /* We want all the children to be hidden, which will mark the parents
+       as being hidden */
+    hrn_cluster_node_set_children_hidden (node, TRUE);
+
+    g_signal_handlers_unblock_by_func (actor, child_visibility_changed, view);
+}
+
+static void
+show_child (HrnView      *view,
+            ClutterActor *actor)
+{
+    HrnViewPrivate *priv = view->priv;
+    HrnClusterNode *node;
+
+    clutter_actor_show (actor);
+    clutter_actor_animate (actor, CLUTTER_EASE_IN_OUT_CUBIC, 500,
+                           "opacity", 0xff,
+                           NULL);
+
+    priv->visible_children++;
+
+    node = hrn_tileable_get_node ((HrnTileable *) actor);
+
+    g_signal_handlers_block_by_func (actor, child_visibility_changed, view);
+    hrn_cluster_node_set_children_hidden (node, FALSE);
+    g_signal_handlers_unblock_by_func (actor, child_visibility_changed, view);
+}
+
+static void
+move_child (ClutterActor *actor,
+            int           x,
+            int           y)
+{
+    hrn_tileable_set_position ((HrnTileable *) actor, x, y);
+
+    /* FIXME: Check that we're on screen */
+    clutter_actor_animate (actor, CLUTTER_EASE_IN_OUT_CUBIC, 500,
+                           "x", X_GRID_TO_COORDS (x),
+                           "y", Y_GRID_TO_COORDS (y),
+                           NULL);
+}
+
+static void
+child_activated (HrnTileable      *tileable,
+                 HrnTileableAction action,
+                 gpointer          payload,
+                 HrnView          *view)
+{
+    HrnViewPrivate *priv = view->priv;
+    HrnClusterNode *payload_node;
+    GSequenceIter *iter;
+
+    switch (action) {
+    case HRN_TILEABLE_ACTION_EXPAND:
+        payload_node = hrn_tileable_get_node ((HrnTileable *) payload);
+
+        iter = g_sequence_get_begin_iter (priv->root->children);
+        while (g_sequence_iter_is_end (iter) == FALSE) {
+            HrnClusterNode *child_node = g_sequence_get (iter);
+
+            if (child_node != payload_node) {
+                ClutterActor *child;
+
+                child = g_hash_table_lookup (priv->child_items, child_node);
+                hide_child (view, child);
+            }
+
+            iter = g_sequence_iter_next (iter);
+        }
+
+        priv->shown_child = (HrnTileable *) payload;
+
+        priv->count = hrn_tileable_get_count (tileable);
+        move_child ((ClutterActor *) payload, 0, 0);
+        hrn_tiler_set_expanded ((HrnTiler *) payload, TRUE);
+
+        g_signal_emit (view, signals[ACTIVATED], 0,
+                       HRN_TILEABLE_ACTION_EXPANDED,
+                       hrn_tileable_get_node ((HrnTileable *) payload));
+        return;
+
+    case HRN_TILEABLE_ACTION_UP_LEVEL:
+        return;
+
+    case HRN_TILEABLE_ACTION_SHOW_ALL:
+        g_print ("View showing all\n");
+        payload_node = hrn_tileable_get_node ((HrnTileable *) payload);
+
+        iter = g_sequence_get_begin_iter (priv->root->children);
+        while (g_sequence_iter_is_end (iter) == FALSE) {
+            HrnClusterNode *child_node = g_sequence_get (iter);
+            ClutterActor *child;
+
+            child = g_hash_table_lookup (priv->child_items, child_node);
+            if (child == NULL) {
+                g_warning ("%s No child found for %s",
+                           G_STRLOC, child_node->name);
+                iter = g_sequence_iter_next (iter);
+                continue;
+            }
+
+            if (child_node != payload_node) {
+                hrn_tiler_set_expanded ((HrnTiler *) payload, FALSE);
+            }
+
+            show_child (view, child);
+            iter = g_sequence_iter_next (iter);
+        }
+
+        priv->shown_child = NULL;
+
+        g_signal_emit (view, signals[ACTIVATED], 0,
+                       HRN_TILEABLE_ACTION_LEVEL_CHANGE, priv->root);
+        return;
+
+    default:
+        break;
+    }
+
+    g_signal_emit (view, signals[ACTIVATED], 0, action, payload);
+}
+
+static void
+child_count_changed (HrnTileable *tileable,
+                     int          old_count,
+                     int          new_count,
+                     HrnView     *view)
+{
+    HrnViewPrivate *priv = view->priv;
+
+    priv->count -= (old_count - new_count);
+    clutter_actor_queue_relayout ((ClutterActor *) view);
+}
+
+#if 0
+static guint
+layout_view (HrnView *view)
+{
+#if 0
+    HrnViewPrivate *priv = view->priv;
+    guint count;
+    int i;
+
+    count = 0;
+    for (i = 0; i < priv->children->len; i++) {
+        ClutterActor *actor = priv->children->pdata[i];
+        HrnClusterNode *node;
+        int x, y;
+
+        node = hrn_tileable_get_node ((HrnTileable *) actor);
+        /* Only need to include the child in the layout calculations
+           if it is visible */
+        if (CLUTTER_ACTOR_IS_VISIBLE (actor) &&
+            (priv->shown_child == NULL ||
+             priv->shown_child == (HrnTileable *) actor)) {
+
+            x = count % priv->items_per_row;
+            y = count / priv->items_per_row;
+
+            hrn_tileable_set_position ((HrnTileable *) actor, x, y);
+            clutter_actor_set_position (actor, X_GRID_TO_COORDS (x),
+                                        Y_GRID_TO_COORDS (y));
+
+            count += hrn_tileable_get_count ((HrnTileable *) actor);
+        }
+    }
+
+    return count;
+#endif
+    return 1;
+}
+#endif
+
+static void
+child_visibility_changed (HrnTileable *tileable,
+                          gboolean     hidden,
+                          HrnView     *view)
+{
+    HrnViewPrivate *priv = view->priv;
+    HrnClusterNode *node = hrn_tileable_get_node (tileable);
+
+    if (debug_visible) {
+        g_print ("[view] %s %s\n", node->name, hidden ? "hidden" : "shown");
+    }
+
+    if (hidden) {
+        priv->visible_children--;
+        clutter_actor_hide ((ClutterActor *) tileable);
+    } else {
+        priv->visible_children++;
+
+        clutter_actor_show ((ClutterActor *) tileable);
+        clutter_actor_animate ((ClutterActor *) tileable,
+                               CLUTTER_EASE_IN_OUT_CUBIC, 500,
+                               "opacity", 0xff,
+                               NULL);
+    }
+
+    clutter_actor_queue_relayout ((ClutterActor *) view);
+}
+
+static void
+hrn_view_real_add (ClutterContainer *container,
+                   ClutterActor     *actor)
+{
+    HrnView *view = (HrnView *) container;
+    HrnViewPrivate *priv = view->priv;
+
+    if (!HRN_IS_TILEABLE (actor)) {
+        g_warning ("Cannot add %s to HrnView as it is not implement HrnTileable ",
+                   G_OBJECT_TYPE_NAME (actor));
+        return;
+    }
+
+    clutter_actor_set_parent (actor, (ClutterActor *) container);
+
+    if (HRN_IS_TILER (actor)) {
+        hrn_tiler_set_items_per_row ((HrnTiler *) actor, priv->items_per_row);
+    }
+
+#if 0
+    x = priv->count % priv->items_per_row;
+    y = priv->count / priv->items_per_row;
+
+    hrn_tileable_set_position ((HrnTileable *) actor, x, y);
+    clutter_actor_set_position (actor, X_GRID_TO_COORDS (x),
+                                Y_GRID_TO_COORDS (y));
+
+    g_ptr_array_add (priv->children, actor);
+    priv->count += hrn_tileable_get_count ((HrnTileable *) actor);
+    g_signal_connect (actor, "activated",
+                      G_CALLBACK (child_activated), view);
+    g_signal_connect (actor, "count-changed",
+                      G_CALLBACK (child_count_changed), view);
+    g_signal_connect (actor, "visibility-changed",
+                      G_CALLBACK (child_visibility_changed), view);
+
+    node = hrn_tileable_get_node ((HrnTileable *) actor);
+    if (node->hidden) {
+        clutter_actor_hide (actor);
+    } else {
+        priv->visible_children++;
+    }
+#endif
+    clutter_actor_queue_relayout ((ClutterActor *) container);
+}
+
+static void
+hrn_view_real_remove (ClutterContainer *container,
+                      ClutterActor     *actor)
+{
+    g_warning ("FIXME: hrn_view_real_remove");
+}
+
+static void
+hrn_view_real_foreach (ClutterContainer *container,
+                       ClutterCallback   callback,
+                       gpointer          userdata)
+{
+#if 0
+    HrnView *view = (HrnView *) container;
+    HrnViewPrivate *priv = view->priv;
+
+    g_ptr_array_foreach (priv->children, (GFunc) callback, userdata);
+#endif
+}
+
+static void
+hrn_view_real_raise (ClutterContainer *container,
+                     ClutterActor     *actor,
+                     ClutterActor     *sibling)
+{
+}
+
+static void
+hrn_view_real_lower (ClutterContainer *container,
+                     ClutterActor     *actor,
+                     ClutterActor     *sibling)
+{
+}
+
+static void
+hrn_view_real_sort_depth_order (ClutterContainer *container)
+{
+}
+
+static void
+container_interface_init (ClutterContainerIface *iface)
+{
+    iface->add = hrn_view_real_add;
+    iface->remove = hrn_view_real_remove;
+    iface->foreach = hrn_view_real_foreach;
+    iface->raise = hrn_view_real_raise;
+    iface->lower = hrn_view_real_lower;
+    iface->sort_depth_order = hrn_view_real_sort_depth_order;
+}
+
+static void
+tiler_show_all (HrnTiler *tiler)
+{
+    HrnView *view = (HrnView *) tiler;
+    HrnViewPrivate *priv = view->priv;
+    GSequenceIter *iter;
+
+    if (priv->root == NULL) {
+        return;
+    }
+
+    iter = g_sequence_get_begin_iter (priv->root->children);
+    while (g_sequence_iter_is_end (iter) == FALSE) {
+        HrnClusterNode *child_node = g_sequence_get (iter);
+        ClutterActor *child;
+
+        hrn_cluster_node_set_children_hidden (child_node, FALSE);
+
+        child = g_hash_table_lookup (priv->child_items, child_node);
+        if (child == NULL) {
+            g_warning ("No item for %s", child_node->name);
+            iter = g_sequence_iter_next (iter);
+            continue;
+        }
+
+        if (HRN_IS_TILER (child)) {
+            hrn_tiler_set_expanded ((HrnTiler *) child, FALSE);
+            /* hrn_tiler_show_all ((HrnTiler *) child); */
+        }
+
+        iter = g_sequence_iter_next (iter);
+    }
+
+    clutter_actor_queue_relayout ((ClutterActor *) view);
+}
+
+static void
+tiler_show (HrnTiler    *tiler,
+            HrnTileable *tileable)
+{
+}
+
+static void
+tiler_show_node (HrnTiler       *tiler,
+                 HrnClusterNode *node)
+{
+    HrnView *view = (HrnView *) tiler;
+    HrnViewPrivate *priv = view->priv;
+
+    if (priv->root == node) {
+        hrn_view_reset (view);
+    } else if (priv->shown_child && HRN_IS_TILER (priv->shown_child)) {
+        hrn_tiler_show_node ((HrnTiler *) priv->shown_child, node);
+    }
+}
+
+static void
+tiler_set_expanded (HrnTiler *tiler,
+                    gboolean  expanded)
+{
+}
+
+static void
+tiler_set_items_per_row (HrnTiler *tiler,
+                         guint     items_per_row)
+{
+    HrnView *view = HRN_VIEW (tiler);
+    HrnViewPrivate *priv = view->priv;
+
+    if (priv->items_per_row == items_per_row) {
+        return;
+    }
+
+    priv->items_per_row = items_per_row;
+
+    if (priv->root) {
+        GSequenceIter *iter = g_sequence_get_begin_iter (priv->root->children);
+
+        while (g_sequence_iter_is_end (iter) == FALSE) {
+            HrnClusterNode *child_node = g_sequence_get (iter);
+            ClutterActor *child;
+
+            child = g_hash_table_lookup (priv->child_items, child_node);
+            if (child == NULL) {
+                g_warning ("No child found for %s", child_node->name);
+                iter = g_sequence_iter_next (iter);
+                continue;
+            }
+
+            if (HRN_IS_TILER (child)) {
+                hrn_tiler_set_items_per_row ((HrnTiler *) child,
+                                             priv->items_per_row);
+            }
+
+            iter = g_sequence_iter_next (iter);
+        }
+    }
+}
+
+static void
+add_child (HrnTiler       *tiler,
+           HrnClusterNode *node)
+{
+    HrnView *view = (HrnView *) tiler;
+    HrnViewPrivate *priv = view->priv;
+    ClutterActor *actor;
+
+    switch (node->type) {
+    case HRN_CLUSTER_NODE_TYPE_ARTIST:
+        actor = g_object_new (HRN_TYPE_ARTIST_CLUSTER, NULL);
+        hrn_tiler_add_items ((HrnTiler *) actor, node);
+        hrn_cluster_full ((HrnCluster *) actor);
+
+        break;
+
+    case HRN_CLUSTER_NODE_TYPE_YEAR:
+        actor = g_object_new (HRN_TYPE_YEAR_CLUSTER, NULL);
+        hrn_tiler_add_items ((HrnTiler *) actor, node);
+        hrn_cluster_full ((HrnCluster *) actor);
+        break;
+
+    case HRN_CLUSTER_NODE_TYPE_VIDEO:
+        actor = g_object_new (HRN_TYPE_VIDEO_TILE, "node", node, NULL);
+        break;
+
+    default:
+        return;
+    }
+
+    g_signal_connect (actor, "activated",
+                      G_CALLBACK (child_activated), view);
+    g_signal_connect (actor, "count-changed",
+                      G_CALLBACK (child_count_changed), view);
+    g_signal_connect (actor, "visibility-changed",
+                      G_CALLBACK (child_visibility_changed), view);
+
+    if (priv->shown_child) {
+        hrn_cluster_node_set_children_hidden (node, TRUE);
+        clutter_actor_hide (actor);
+    }
+
+    clutter_container_add_actor ((ClutterContainer *) tiler, actor);
+    g_hash_table_insert (priv->child_items, node, actor);
+    clutter_actor_queue_redraw ((ClutterActor *) view);
+}
+
+static void
+child_added_cb (HrnClusterNode *parent,
+                HrnClusterNode *child,
+                HrnTiler       *tiler)
+{
+    add_child (tiler, child);
+}
+
+static void
+child_removed_cb (HrnClusterNode *parent,
+                  HrnClusterNode *child,
+                  HrnTiler       *tiler)
+{
+    HrnView *view = (HrnView *) tiler;
+    HrnViewPrivate *priv = view->priv;
+    ClutterActor *actor;
+
+    actor = g_hash_table_lookup (priv->child_items, child);
+    if (actor == NULL) {
+        g_warning ("No item found for %s", child->name);
+        return;
+    }
+
+    g_hash_table_remove (priv->child_items, child);
+    clutter_actor_unparent (actor);
+
+    if (priv->shown_child == (HrnTileable *) actor) {
+        hrn_tiler_show_all ((HrnTiler *) view);
+        priv->shown_child = NULL;
+    }
+
+    clutter_actor_queue_redraw ((ClutterActor *) view);
+}
+
+static void
+tiler_add_items (HrnTiler       *tiler,
+                 HrnClusterNode *root)
+{
+    HrnView *view = (HrnView *) tiler;
+    HrnViewPrivate *priv = view->priv;
+    GSequenceIter *iter = g_sequence_get_begin_iter (root->children);
+
+    if (priv->child_added_id > 0) {
+        g_signal_handler_disconnect (priv->root, priv->child_added_id);
+        priv->child_added_id = 0;
+    }
+
+    if (priv->child_removed_id > 0) {
+        g_signal_handler_disconnect (priv->root, priv->child_removed_id);
+        priv->child_removed_id = 0;
+    }
+
+    priv->root = root;
+    priv->child_added_id = g_signal_connect (root, "child-added",
+                                             G_CALLBACK (child_added_cb),
+                                             tiler);
+    priv->child_removed_id = g_signal_connect (root, "child-removed",
+                                               G_CALLBACK (child_removed_cb),
+                                               tiler);
+
+    while (g_sequence_iter_is_end (iter) == FALSE) {
+        HrnClusterNode *child = g_sequence_get (iter);
+
+        add_child (tiler, child);
+
+        iter = g_sequence_iter_next (iter);
+    }
+}
+
+static void
+tiler_interface_init (HrnTilerInterface *iface)
+{
+    iface->show_all = tiler_show_all;
+    iface->show = tiler_show;
+    iface->show_node = tiler_show_node;
+    iface->set_expanded = tiler_set_expanded;
+    iface->set_items_per_row = tiler_set_items_per_row;
+    iface->add_items = tiler_add_items;
+}
+
+static guint
+viewer_get_level_count (HrnViewer *viewer)
+{
+    return LEVEL_COUNT;
+}
+
+static void
+viewer_interface_init (HrnViewerInterface *iface)
+{
+    iface->get_level_count = viewer_get_level_count;
+}
+
+static void
+hrn_view_init (HrnView *self)
+{
+    HrnViewPrivate *priv = GET_PRIVATE (self);
+
+    self->priv = priv;
+
+    priv->count = 0;
+    priv->items_per_row = DEFAULT_ITEMS_PER_ROW;
+    priv->scale = DEFAULT_SCALE;
+
+    priv->child_items = g_hash_table_new (NULL, NULL);
+}
+
+void
+hrn_view_clear (HrnView *view)
+{
+    HrnViewPrivate *priv = view->priv;
+    GSequenceIter *iter;
+
+    if (priv->root == NULL) {
+        return;
+    }
+
+    priv->shown_child = NULL;
+    iter = g_sequence_get_begin_iter (priv->root->children);
+    while (g_sequence_iter_is_end (iter) == FALSE) {
+        HrnClusterNode *child_node = g_sequence_get (iter);
+        ClutterActor *actor;
+
+        actor = g_hash_table_lookup (priv->child_items, child_node);
+        if (actor == NULL) {
+            g_warning ("No item found for %s", child_node->name);
+            iter = g_sequence_iter_next (iter);
+            continue;
+        }
+
+        clutter_actor_unparent (actor);
+        iter = g_sequence_iter_next (iter);
+    }
+    g_hash_table_remove_all (priv->child_items);
+    priv->count = 0;
+
+    clutter_actor_queue_redraw ((ClutterActor *) view);
+}
+
+/* FIXME: This is a crap name.
+   It "resets" the view to the initial, fully unexpanded toplevel
+*/
+void
+hrn_view_reset (HrnView *view)
+{
+    HrnViewPrivate *priv = view->priv;
+    GSequenceIter *iter;
+
+    if (priv->root == NULL) {
+        return;
+    }
+
+    g_print ("resetting view\n");
+    priv->shown_child = NULL;
+
+    iter = g_sequence_get_begin_iter (priv->root->children);
+    while (g_sequence_iter_is_end (iter) == FALSE) {
+        HrnClusterNode *child_node = g_sequence_get (iter);
+        ClutterActor *child;
+
+        hrn_cluster_node_set_children_hidden (child_node, FALSE);
+
+        child = g_hash_table_lookup (priv->child_items, child_node);
+        if (child == NULL) {
+            g_warning ("No item for %s", child_node->name);
+            iter = g_sequence_iter_next (iter);
+            continue;
+        }
+
+#if 0
+        clutter_actor_show (child);
+        clutter_actor_set_opacity (child, 0xff);
+#endif
+        if (HRN_IS_TILER (child)) {
+            hrn_tiler_set_expanded ((HrnTiler *) child, FALSE);
+            hrn_tiler_show_all ((HrnTiler *) child);
+        }
+
+        iter = g_sequence_iter_next (iter);
+    }
+
+    clutter_actor_queue_relayout ((ClutterActor *) view);
+}
+
+void
+hrn_view_close_shown_item (HrnView *view)
+{
+    HrnViewPrivate *priv = view->priv;
+
+    if (priv->shown_child && HRN_IS_TILER (priv->shown_child)) {
+        hrn_tiler_set_expanded ((HrnTiler *) priv->shown_child, FALSE);
+        priv->shown_child = NULL;
+    }
+}
diff -pruN 1.5.1-1/.pc/applied-patches 1.8.4-1/.pc/applied-patches
--- 1.5.1-1/.pc/applied-patches	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/.pc/applied-patches	2011-03-15 13:20:21.000000000 +0000
@@ -0,0 +1,3 @@
+01_add_missing_hrn-video-tile-frame.h.patch
+01_port_to_debian.patch
+02_port_to_mx_1.0.2.patch
diff -pruN 1.5.1-1/.pc/.version 1.8.4-1/.pc/.version
--- 1.5.1-1/.pc/.version	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/.pc/.version	2011-03-15 13:20:21.000000000 +0000
@@ -0,0 +1 @@
+2
diff -pruN 1.5.1-1/po/ar.po 1.8.4-1/po/ar.po
--- 1.5.1-1/po/ar.po	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/po/ar.po	2010-02-17 17:26:44.000000000 +0000
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: hornsey\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-10-16 11:25+0000\n"
-"PO-Revision-Date: 2009-11-11 00:41+0200\n"
+"POT-Creation-Date: 2009-11-19 18:12+0000\n"
+"PO-Revision-Date: 2009-11-23 19:02+0200\n"
 "Last-Translator: Yousef Abu Al Naser <yousef@itsoftex.com>\n"
 "Language-Team: ITSOFTEX <info@itsoftex.com>\n"
 "MIME-Version: 1.0\n"
@@ -18,7 +18,7 @@ msgstr ""
 "X-Poedit-Language: Arabic\n"
 
 #: ../data/hornsey.desktop.in.h:1
-#: ../src/hornsey.c:671
+#: ../src/hornsey.c:761
 msgid "Media Player"
 msgstr "مشغل الوسائط"
 
@@ -26,20 +26,25 @@ msgstr "مشغل الوسائط"
 msgid "Watch & listen"
 msgstr "شاهد واستمع"
 
-#: ../src/hornsey.c:509
+#: ../src/hornsey.c:597
 msgid "Run in a window"
 msgstr "شغل في نافذة"
 
-#: ../src/hornsey.c:511
+#: ../src/hornsey.c:599
 msgid "Size of the window"
 msgstr "حجم النافذة"
 
-#: ../src/hornsey.c:513
+#: ../src/hornsey.c:601
 msgid "[FILE...]"
 msgstr "[ملف...]"
 
 #: ../src/hrn-album-cluster.c:75
-#: ../src/hrn-queue.c:960
+#: ../src/hrn-cluster-tree.c:280
+#: ../src/hrn-cluster-tree.c:577
+#: ../src/hrn-cluster-tree.c:578
+#: ../src/hrn-cluster-tree.c:584
+#: ../src/hrn-cluster-tree.c:590
+#: ../src/hrn-queue.c:965
 msgid "Unknown"
 msgstr "غير معروف"
 
@@ -63,6 +68,63 @@ msgstr[5] "%d البوم"
 msgid "Queue Albums"
 msgstr "ادخل الالبومات الى قائمة الانتظار"
 
+#: ../src/hrn-cluster-tree.c:29
+msgid "Unknown Artist"
+msgstr "فنان غير معروف"
+
+#: ../src/hrn-cluster-tree.c:39
+#, c-format
+msgid " and %d more"
+msgstr "وايضا %d"
+
+#: ../src/hrn-cluster-tree.c:550
+msgid "January"
+msgstr "كانون ثاني"
+
+#: ../src/hrn-cluster-tree.c:550
+msgid "Feburary"
+msgstr "شباط"
+
+#: ../src/hrn-cluster-tree.c:550
+msgid "March"
+msgstr "آذار"
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "April"
+msgstr "نيسان"
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "May"
+msgstr "أيار"
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "June"
+msgstr "حزيران"
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "July"
+msgstr "تموز"
+
+#: ../src/hrn-cluster-tree.c:552
+msgid "August"
+msgstr "آب"
+
+#: ../src/hrn-cluster-tree.c:552
+msgid "September"
+msgstr "ايلول"
+
+#: ../src/hrn-cluster-tree.c:552
+msgid "October"
+msgstr "تشرين اول"
+
+#: ../src/hrn-cluster-tree.c:553
+msgid "November"
+msgstr "تشرين ثاني"
+
+#: ../src/hrn-cluster-tree.c:553
+msgid "December"
+msgstr "كانون اول"
+
 #: ../src/hrn-image-tile.c:104
 msgid "Display Picture"
 msgstr "صورة العرض"
@@ -83,29 +145,41 @@ msgstr[5] "%d صورة"
 msgid "Start Slideshow"
 msgstr "ابدأ عرض الشرائح"
 
-#: ../src/hrn-queue.c:252
+#: ../src/hrn-queue.c:254
 msgid "Empty"
 msgstr "فارغ"
 
-#: ../src/hrn-queue.c:253
+#: ../src/hrn-queue.c:255
 msgid "Shuffle"
 msgstr "تبديل"
 
+#: ../src/hrn-queue.c:1246
+msgid "Playqueue"
+msgstr "قائمة التشغيل"
+
+#: ../src/hrn-queue.c:1254
+msgid "Music Playqueue"
+msgstr "قائمة تشغيل الموسيقى"
+
+#: ../src/hrn-queue.c:1256
+msgid "Add music to start"
+msgstr "اضافة موسيقى للبداية"
+
 #: ../src/hrn-sidebar.c:182
 msgid "Your local media"
 msgstr "ملفات الوسائط المحلية"
 
-#: ../src/hrn-sidebar-item.c:432
-msgid "Audio"
-msgstr "صوتيّ"
-
-#: ../src/hrn-sidebar-item.c:433
-msgid "Video"
-msgstr "فيديو"
-
-#: ../src/hrn-sidebar-item.c:434
-msgid "Image"
-msgstr "صورة"
+#: ../src/hrn-sidebar-item.c:455
+msgid "Music"
+msgstr "موسيقى"
+
+#: ../src/hrn-sidebar-item.c:456
+msgid "Pictures"
+msgstr "صور"
+
+#: ../src/hrn-sidebar-item.c:457
+msgid "Videos"
+msgstr "فيديوهات"
 
 #: ../src/hrn-sidebar-subitem.c:288
 msgid "Rename"
@@ -115,12 +189,17 @@ msgstr "اعادة التسمية"
 msgid "Play Song"
 msgstr "شغل اغنية"
 
-#: ../src/hrn-video-player.c:389
+#: ../src/hrn-video-player.c:395
+#, c-format
+msgid "Sorry, we can't play %s, as we don't have the correct plugin."
+msgstr "آسف، لا يمكننا تشغيل %s لاننا لا نملك التكوينات الصحيحة."
+
+#: ../src/hrn-video-player.c:397
 #, c-format
 msgid "Sorry, we can't play %s, as we don't have the correct plugin. You could try searching for ❝gstreamer codecs❞ on the web."
 msgstr "آسف، لا يمكننا تشغيل %s لاننا لا نملك المكونات الاضافية الصحيحة. يمكنك البحث في الويب عن gstreamer codecs"
 
-#: ../src/hrn-video-player.c:392
+#: ../src/hrn-video-player.c:401
 msgid "We can't play this"
 msgstr "لا يمكننا تشغيل هذا"
 
@@ -128,3 +207,8 @@ msgstr "لا يمكننا تشغيل ه
 msgid "Play Video"
 msgstr "شغل فيديو"
 
+#~ msgid "Audio"
+#~ msgstr "صوتيّ"
+#~ msgid "Image"
+#~ msgstr "صورة"
+
diff -pruN 1.5.1-1/po/ast.po 1.8.4-1/po/ast.po
--- 1.5.1-1/po/ast.po	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/po/ast.po	2010-02-17 17:26:44.000000000 +0000
@@ -0,0 +1,222 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: hornsey.master.ast\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-11-05 13:19+0000\n"
+"PO-Revision-Date: \n"
+"Last-Translator: astur <malditoastur@gmail.com>\n"
+"Language-Team: asturian <alministradores@softastur.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n!=1;\n"
+"X-Poedit-Language: asturian\n"
+"X-Poedit-SourceCharset: utf-8\n"
+
+#: ../data/hornsey.desktop.in.h:1
+#: ../src/hornsey.c:704
+msgid "Media Player"
+msgstr "Reproductor multimedia"
+
+#: ../data/hornsey.desktop.in.h:2
+msgid "Watch & listen"
+msgstr "Ver y oyir"
+
+#: ../src/hornsey.c:542
+msgid "Run in a window"
+msgstr "Abrir nuna ventana"
+
+#: ../src/hornsey.c:544
+msgid "Size of the window"
+msgstr "Tamañu de la ventana"
+
+#: ../src/hornsey.c:546
+msgid "[FILE...]"
+msgstr "[FILE...]"
+
+#: ../src/hrn-album-cluster.c:75
+#: ../src/hrn-cluster-tree.c:280
+#: ../src/hrn-cluster-tree.c:577
+#: ../src/hrn-cluster-tree.c:578
+#: ../src/hrn-cluster-tree.c:584
+#: ../src/hrn-cluster-tree.c:590
+#: ../src/hrn-queue.c:965
+msgid "Unknown"
+msgstr "Desconocíu"
+
+#: ../src/hrn-album-cluster.c:112
+msgid "Queue Album"
+msgstr "Llista d'álbum"
+
+#: ../src/hrn-artist-cluster.c:72
+#: ../src/hrn-year-cluster.c:67
+#, c-format
+msgid "%d album"
+msgid_plural "%d albums"
+msgstr[0] "%d álbum"
+msgstr[1] "%d álbumes"
+
+#: ../src/hrn-artist-cluster.c:139
+msgid "Queue Albums"
+msgstr "Llista d'álbumes"
+
+#: ../src/hrn-audio-viewer.c:150
+#: ../src/hrn-cluster-tree.c:29
+msgid "Unknown Artist"
+msgstr "Artista desconocíu"
+
+#: ../src/hrn-cluster-tree.c:39
+#, c-format
+msgid " and %d more"
+msgstr " y %d más"
+
+#: ../src/hrn-cluster-tree.c:550
+msgid "January"
+msgstr "Xineru"
+
+#: ../src/hrn-cluster-tree.c:550
+msgid "Feburary"
+msgstr "Febreru"
+
+#: ../src/hrn-cluster-tree.c:550
+msgid "March"
+msgstr "Marzu"
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "April"
+msgstr "Abril"
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "May"
+msgstr "Mayu"
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "June"
+msgstr "Xunu"
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "July"
+msgstr "Xunetu"
+
+#: ../src/hrn-cluster-tree.c:552
+msgid "August"
+msgstr "Agostu"
+
+#: ../src/hrn-cluster-tree.c:552
+msgid "September"
+msgstr "Setiembre"
+
+#: ../src/hrn-cluster-tree.c:552
+msgid "October"
+msgstr "Ochobre"
+
+#: ../src/hrn-cluster-tree.c:553
+msgid "November"
+msgstr "Payares"
+
+#: ../src/hrn-cluster-tree.c:553
+msgid "December"
+msgstr "Avientu"
+
+#: ../src/hrn-image-tile.c:104
+msgid "Display Picture"
+msgstr "Amosar imaxe"
+
+#: ../src/hrn-item.c:71
+msgid "Delete"
+msgstr "Desaniciar"
+
+#: ../src/hrn-month-cluster.c:68
+#, c-format
+msgid "%d photo"
+msgid_plural "%d photos"
+msgstr[0] "%d semeya"
+msgstr[1] "%d semeyes"
+
+#: ../src/hrn-month-cluster.c:140
+#: ../src/hrn-year-cluster.c:139
+msgid "Start Slideshow"
+msgstr "Aniciar presentación"
+
+#: ../src/hrn-queue.c:254
+msgid "Empty"
+msgstr "Vaciar"
+
+#: ../src/hrn-queue.c:255
+msgid "Shuffle"
+msgstr "Al debalu"
+
+#: ../src/hrn-queue.c:1220
+msgid "Playqueue"
+msgstr "Llista de reproducción"
+
+#: ../src/hrn-queue.c:1228
+msgid "Music Playqueue"
+msgstr "Llista de reproducción"
+
+#: ../src/hrn-queue.c:1230
+msgid "Add music to start"
+msgstr "Amestar música p'aniciar"
+
+#: ../src/hrn-sidebar.c:182
+msgid "Your local media"
+msgstr "Medios llocales"
+
+#: ../src/hrn-sidebar-item.c:455
+msgid "Music"
+msgstr "Música"
+
+#: ../src/hrn-sidebar-item.c:456
+msgid "Pictures"
+msgstr "Imáxenes"
+
+#: ../src/hrn-sidebar-item.c:457
+msgid "Videos"
+msgstr "Vídeos"
+
+#: ../src/hrn-sidebar-subitem.c:288
+msgid "Rename"
+msgstr "Renomar"
+
+#: ../src/hrn-track-tile.c:105
+msgid "Play Song"
+msgstr "Reproducir canción"
+
+#: ../src/hrn-video-player.c:392
+#, c-format
+msgid "Sorry, we can't play %s, as we don't have the correct plugin. You could try searching for ❝gstreamer codecs❞ on the web."
+msgstr "Sentímoslo, nun podemos reproducir %s, porque nun hai el plugin correutu. Puedes intentar guetar ❝gstreamer codecs❞ na web."
+
+#: ../src/hrn-video-player.c:395
+msgid "We can't play this"
+msgstr "Nun podemos reproducilo"
+
+#: ../src/hrn-video-tile.c:103
+msgid "Play Video"
+msgstr "Reproducir vídeu"
+
+#~ msgid "Audio"
+#~ msgstr "Sonido"
+#~ msgid "Image"
+#~ msgstr "Imagen"
+#~ msgid "All"
+#~ msgstr "Todo"
+#~ msgid "Images"
+#~ msgstr "Imágenes"
+#~ msgid "Overview"
+#~ msgstr "Vista general"
+#~ msgid "Collections"
+#~ msgstr "Colecciones"
+#~ msgid "Small Items"
+#~ msgstr "En pequeño"
+#~ msgid "Large Items"
+#~ msgstr "En grande"
+#~ msgid "Theatre"
+#~ msgstr "En cine"
+#~ msgid "Show"
+#~ msgstr "Mostrar"
+#~ msgid "Medium Items"
+#~ msgstr "Artículos medianos"
+#~ msgid "Close"
+#~ msgstr "Cerrar"
+
diff -pruN 1.5.1-1/po/cs.po 1.8.4-1/po/cs.po
--- 1.5.1-1/po/cs.po	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/po/cs.po	2010-02-17 17:26:44.000000000 +0000
@@ -0,0 +1,207 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-02-11 23:21+0000\n"
+"PO-Revision-Date: 2010-02-17 15:46+0100\n"
+"Last-Translator: Petr Novák <peta.en@gmail.com>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+"X-Poedit-Language: Czech\n"
+"X-Poedit-Country: CZECH REPUBLIC\n"
+"X-Poedit-SourceCharset: utf-8\n"
+
+#: ../data/hornsey.desktop.in.h:1
+#: ../src/hornsey.c:710
+msgid "Media Player"
+msgstr "Přehrávač multimédií"
+
+#: ../data/hornsey.desktop.in.h:2
+msgid "Watch & listen"
+msgstr "Sledovat a poslouchat"
+
+#: ../src/hornsey.c:549
+msgid "Run in a window"
+msgstr "Spustit v okně"
+
+#: ../src/hornsey.c:551
+msgid "Size of the window"
+msgstr "Velikost okna"
+
+#: ../src/hornsey.c:553
+msgid "[FILE...]"
+msgstr "[SOUBOR...]"
+
+#: ../src/hrn-album-cluster.c:75
+#: ../src/hrn-cluster-tree.c:268
+#: ../src/hrn-cluster-tree.c:573
+#: ../src/hrn-cluster-tree.c:574
+#: ../src/hrn-cluster-tree.c:580
+#: ../src/hrn-cluster-tree.c:586
+#: ../src/hrn-queue.c:137
+#: ../src/hrn-queue.c:143
+msgid "Unknown"
+msgstr "Neznámý"
+
+#: ../src/hrn-album-cluster.c:112
+msgid "Queue Album"
+msgstr "Fronta alba"
+
+#: ../src/hrn-artist-cluster.c:72
+#: ../src/hrn-year-cluster.c:67
+#, c-format
+msgid "%d album"
+msgid_plural "%d albums"
+msgstr[0] "%d album"
+msgstr[1] "%d alba"
+msgstr[2] "%d alb"
+
+#: ../src/hrn-artist-cluster.c:139
+msgid "Queue Albums"
+msgstr "Fronta alb"
+
+#: ../src/hrn-cluster-tree.c:25
+#: ../src/hrn-queue.c:133
+#: ../src/hrn-queue.c:144
+#: ../src/hrn-queue-item.c:55
+msgid "Unknown Artist"
+msgstr "Neznámý umělec"
+
+#: ../src/hrn-cluster-tree.c:35
+#, c-format
+msgid " and %d more"
+msgstr " a %d dalších"
+
+#: ../src/hrn-cluster-tree.c:546
+msgid "January"
+msgstr "Leden"
+
+#: ../src/hrn-cluster-tree.c:546
+msgid "Feburary"
+msgstr "Únor"
+
+#: ../src/hrn-cluster-tree.c:546
+msgid "March"
+msgstr "Březen"
+
+#: ../src/hrn-cluster-tree.c:547
+msgid "April"
+msgstr "Duben"
+
+#: ../src/hrn-cluster-tree.c:547
+msgid "May"
+msgstr "Květen"
+
+#: ../src/hrn-cluster-tree.c:547
+msgid "June"
+msgstr "Červen"
+
+#: ../src/hrn-cluster-tree.c:547
+msgid "July"
+msgstr "Červenec"
+
+#: ../src/hrn-cluster-tree.c:548
+msgid "August"
+msgstr "Srpen"
+
+#: ../src/hrn-cluster-tree.c:548
+msgid "September"
+msgstr "Září"
+
+#: ../src/hrn-cluster-tree.c:548
+msgid "October"
+msgstr "Říjen"
+
+#: ../src/hrn-cluster-tree.c:549
+msgid "November"
+msgstr "Listopad"
+
+#: ../src/hrn-cluster-tree.c:549
+msgid "December"
+msgstr "Prosinec"
+
+#: ../src/hrn-image-tile.c:104
+msgid "Display Picture"
+msgstr "Zobrazit obrázek"
+
+#: ../src/hrn-month-cluster.c:68
+#, c-format
+msgid "%d photo"
+msgid_plural "%d photos"
+msgstr[0] "%d fotka"
+msgstr[1] "%d fotky"
+msgstr[2] "%d fotek"
+
+#: ../src/hrn-month-cluster.c:140
+#: ../src/hrn-year-cluster.c:139
+msgid "Start Slideshow"
+msgstr "Spustit promítání"
+
+#: ../src/hrn-queue.c:58
+msgid "Music Playqueue"
+msgstr "Hudební playlist"
+
+#: ../src/hrn-queue.c:59
+msgid "Add music to start"
+msgstr "Přidat hudbu k přehrávání"
+
+#: ../src/hrn-queue-item.c:53
+msgid "Unknown Title"
+msgstr "Neznámý titul"
+
+#: ../src/hrn-sidebar.c:132
+#: ../src/hrn-sidebar.c:193
+msgid "Your local media"
+msgstr "Vaše místní multimédia"
+
+#: ../src/hrn-sidebar-item.c:370
+msgid "Music"
+msgstr "Hudba"
+
+#: ../src/hrn-sidebar-item.c:371
+msgid "Pictures"
+msgstr "Obrázky"
+
+#: ../src/hrn-sidebar-item.c:372
+msgid "Videos"
+msgstr "Videa"
+
+#: ../src/hrn-sidebar-subitem.c:399
+msgid "Rename"
+msgstr "Přejmenovat"
+
+#: ../src/hrn-track-tile.c:105
+msgid "Play Song"
+msgstr "Přehrát písničku"
+
+#: ../src/hrn-video-player.c:485
+#, c-format
+msgid "Sorry, we can't play %s, as we don't have the correct plugin."
+msgstr "Litujeme, ale %s nemůžeme přehrát, protože nemáme správný zásuvný modul."
+
+#: ../src/hrn-video-player.c:487
+#, c-format
+msgid "Sorry, we can't play %s, as we don't have the correct plugin. You could try searching for ❝gstreamer codecs❞ on the web."
+msgstr "Litujeme, ale %s nemůžeme přehrát, protože nemáme správný zásuvný modul. Můžete zkusit na internetu vyhledat ❝gstreamer codecs❝."
+
+#: ../src/hrn-video-player.c:491
+msgid "We can't play this"
+msgstr "Tohle nemůžeme přehrát"
+
+#: ../src/hrn-video-tile.c:103
+msgid "Play Video"
+msgstr "Přehrát video"
+
+#~ msgid "Empty"
+#~ msgstr "Prázdný"
+
+#~ msgid "Shuffle"
+#~ msgstr "Promíchat"
diff -pruN 1.5.1-1/po/da.po 1.8.4-1/po/da.po
--- 1.5.1-1/po/da.po	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/po/da.po	2010-02-17 17:26:44.000000000 +0000
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: hornsey\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-10-16 11:25+0000\n"
-"PO-Revision-Date: 2009-11-06 18:21+0100\n"
+"POT-Creation-Date: 2009-11-19 18:12+0000\n"
+"PO-Revision-Date: 2009-11-25 09:14+0100\n"
 "Last-Translator: Kris Thomsne <lakristho@gmail.com>\n"
 "Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
 "MIME-Version: 1.0\n"
@@ -16,7 +16,7 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 
-#: ../data/hornsey.desktop.in.h:1 ../src/hornsey.c:671
+#: ../data/hornsey.desktop.in.h:1 ../src/hornsey.c:761
 msgid "Media Player"
 msgstr "Medieafspiller"
 
@@ -24,19 +24,22 @@ msgstr "Medieafspiller"
 msgid "Watch & listen"
 msgstr "Se & hør"
 
-#: ../src/hornsey.c:509
+#: ../src/hornsey.c:597
 msgid "Run in a window"
 msgstr "Kør i et vindue"
 
-#: ../src/hornsey.c:511
+#: ../src/hornsey.c:599
 msgid "Size of the window"
 msgstr "Størrelse på vinduet"
 
-#: ../src/hornsey.c:513
+#: ../src/hornsey.c:601
 msgid "[FILE...]"
 msgstr "[FIL...]"
 
-#: ../src/hrn-album-cluster.c:75 ../src/hrn-queue.c:960
+#: ../src/hrn-album-cluster.c:75 ../src/hrn-cluster-tree.c:280
+#: ../src/hrn-cluster-tree.c:577 ../src/hrn-cluster-tree.c:578
+#: ../src/hrn-cluster-tree.c:584 ../src/hrn-cluster-tree.c:590
+#: ../src/hrn-queue.c:965
 msgid "Unknown"
 msgstr "Ukendt"
 
@@ -55,6 +58,63 @@ msgstr[1] "%d albums"
 msgid "Queue Albums"
 msgstr "Sæt albums i kø"
 
+#: ../src/hrn-cluster-tree.c:29
+msgid "Unknown Artist"
+msgstr "Ukendt kunstner"
+
+#: ../src/hrn-cluster-tree.c:39
+#, c-format
+msgid " and %d more"
+msgstr " og %d flere"
+
+#: ../src/hrn-cluster-tree.c:550
+msgid "January"
+msgstr "Januar"
+
+#: ../src/hrn-cluster-tree.c:550
+msgid "Feburary"
+msgstr "Februar"
+
+#: ../src/hrn-cluster-tree.c:550
+msgid "March"
+msgstr "Marts"
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "April"
+msgstr "April"
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "May"
+msgstr "Maj"
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "June"
+msgstr "Juni"
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "July"
+msgstr "Juli"
+
+#: ../src/hrn-cluster-tree.c:552
+msgid "August"
+msgstr "August"
+
+#: ../src/hrn-cluster-tree.c:552
+msgid "September"
+msgstr "September"
+
+#: ../src/hrn-cluster-tree.c:552
+msgid "October"
+msgstr "Oktober"
+
+#: ../src/hrn-cluster-tree.c:553
+msgid "November"
+msgstr "November"
+
+#: ../src/hrn-cluster-tree.c:553
+msgid "December"
+msgstr "December"
+
 #: ../src/hrn-image-tile.c:104
 msgid "Display Picture"
 msgstr "Vis billede"
@@ -70,29 +130,41 @@ msgstr[1] "%d fotos"
 msgid "Start Slideshow"
 msgstr "Start diasshow"
 
-#: ../src/hrn-queue.c:252
+#: ../src/hrn-queue.c:254
 msgid "Empty"
 msgstr "Tom"
 
-#: ../src/hrn-queue.c:253
+#: ../src/hrn-queue.c:255
 msgid "Shuffle"
 msgstr "Bland"
 
+#: ../src/hrn-queue.c:1246
+msgid "Playqueue"
+msgstr "Afspilningskø"
+
+#: ../src/hrn-queue.c:1254
+msgid "Music Playqueue"
+msgstr "Musik afspilningskø"
+
+#: ../src/hrn-queue.c:1256
+msgid "Add music to start"
+msgstr "Tilføj musik til start"
+
 #: ../src/hrn-sidebar.c:182
 msgid "Your local media"
 msgstr "Dit lokale medie"
 
-#: ../src/hrn-sidebar-item.c:432
-msgid "Audio"
-msgstr "Lyd"
-
-#: ../src/hrn-sidebar-item.c:433
-msgid "Video"
-msgstr "Video"
-
-#: ../src/hrn-sidebar-item.c:434
-msgid "Image"
-msgstr "Billede"
+#: ../src/hrn-sidebar-item.c:455
+msgid "Music"
+msgstr "Musik"
+
+#: ../src/hrn-sidebar-item.c:456
+msgid "Pictures"
+msgstr "Billeder"
+
+#: ../src/hrn-sidebar-item.c:457
+msgid "Videos"
+msgstr "Videoer"
 
 #: ../src/hrn-sidebar-subitem.c:288
 msgid "Rename"
@@ -102,19 +174,31 @@ msgstr "Omdøb"
 msgid "Play Song"
 msgstr "Afspil sang"
 
-#: ../src/hrn-video-player.c:389
+#: ../src/hrn-video-player.c:395
+#, c-format
+msgid "Sorry, we can't play %s, as we don't have the correct plugin."
+msgstr "Beklager, vi kan ikke afspille %s, eftersom vi ikke har det rigtig udvidelsesmodul."
+
+#: ../src/hrn-video-player.c:397
 #, c-format
 msgid ""
 "Sorry, we can't play %s, as we don't have the correct plugin. You could try "
 "searching for ❝gstreamer codecs❞ on the web."
 msgstr ""
-"Beklager, vi kan ikke afspille %s, eftersom vi ikke har det rigtig udvidelsesmodul. "
-"Du kan prøve at søge efter ❝gstreamer codecs❞ på internettet."
+"Beklager, vi kan ikke afspille %s, eftersom vi ikke har det rigtig "
+"udvidelsesmodul. Du kan prøve at søge efter ❝gstreamer codecs❞ på "
+"internettet."
 
-#: ../src/hrn-video-player.c:392
+#: ../src/hrn-video-player.c:401
 msgid "We can't play this"
 msgstr "Vi kan ikke afspille dette"
 
 #: ../src/hrn-video-tile.c:103
 msgid "Play Video"
 msgstr "Afspil video"
+
+#~ msgid "Audio"
+#~ msgstr "Lyd"
+
+#~ msgid "Image"
+#~ msgstr "Billede"
diff -pruN 1.5.1-1/po/de.po 1.8.4-1/po/de.po
--- 1.5.1-1/po/de.po	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/po/de.po	2010-02-17 17:26:44.000000000 +0000
@@ -1,19 +1,20 @@
+# 
 msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-11-05 13:19+0000\n"
+"POT-Creation-Date: 2009-11-19 18:12+0000\n"
 "PO-Revision-Date: \n"
 "Last-Translator: Clara <steiner-jay.clarax@intel.com>\n"
 "Language-Team: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n!=1;\n"
 "X-Poedit-Language: German\n"
 "X-Poedit-SourceCharset: utf-8\n"
-"Plural-Forms: nplurals=2; plural=n!=1;\n"
 
-#: ../data/hornsey.desktop.in.h:1 ../src/hornsey.c:704
+#: ../data/hornsey.desktop.in.h:1 ../src/hornsey.c:761
 msgid "Media Player"
 msgstr "Media-Player"
 
@@ -21,15 +22,15 @@ msgstr "Media-Player"
 msgid "Watch & listen"
 msgstr "Anschauen & Anhören"
 
-#: ../src/hornsey.c:542
+#: ../src/hornsey.c:597
 msgid "Run in a window"
 msgstr "In einem Fenster ausführen"
 
-#: ../src/hornsey.c:544
+#: ../src/hornsey.c:599
 msgid "Size of the window"
 msgstr "Fenstergröße"
 
-#: ../src/hornsey.c:546
+#: ../src/hornsey.c:601
 msgid "[FILE...]"
 msgstr "[DATEI...]"
 
@@ -57,71 +58,14 @@ msgid "Queue Albums"
 msgstr "Alben einreihen"
 
 # This can only refer to the "artist" of a song/music, not a picture or movie.
-#: ../src/hrn-audio-viewer.c:150 ../src/hrn-cluster-tree.c:29
+#: ../src/hrn-cluster-tree.c:29
 msgid "Unknown Artist"
 msgstr "Unbekannter Interpret"
 
-#: ../src/hrn-cluster-tree.c:39
-#, c-format
-msgid " and %d more"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:550
-msgid "January"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:550
-msgid "Feburary"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:550
-msgid "March"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:551
-msgid "April"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:551
-msgid "May"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:551
-msgid "June"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:551
-msgid "July"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:552
-msgid "August"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:552
-msgid "September"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:552
-msgid "October"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:553
-msgid "November"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:553
-msgid "December"
-msgstr ""
-
 #: ../src/hrn-image-tile.c:104
 msgid "Display Picture"
 msgstr "Bild anzeigen"
 
-#: ../src/hrn-item.c:71
-msgid "Delete"
-msgstr "Löschen"
-
 #: ../src/hrn-month-cluster.c:68
 #, c-format
 msgid "%d photo"
@@ -141,37 +85,14 @@ msgstr "Leeren"
 msgid "Shuffle"
 msgstr "Mischen"
 
-#: ../src/hrn-queue.c:1220
+#: ../src/hrn-queue.c:1246
 msgid "Playqueue"
 msgstr "Playliste"
 
-#: ../src/hrn-queue.c:1228
-#, fuzzy
-msgid "Music Playqueue"
-msgstr "Playliste"
-
-#: ../src/hrn-queue.c:1230
-msgid "Add music to start"
-msgstr ""
-
 #: ../src/hrn-sidebar.c:182
 msgid "Your local media"
 msgstr "Lokale Dateien"
 
-#: ../src/hrn-sidebar-item.c:455
-msgid "Music"
-msgstr ""
-
-#: ../src/hrn-sidebar-item.c:456
-#, fuzzy
-msgid "Pictures"
-msgstr "Bild anzeigen"
-
-#: ../src/hrn-sidebar-item.c:457
-#, fuzzy
-msgid "Videos"
-msgstr "Video"
-
 #: ../src/hrn-sidebar-subitem.c:288
 msgid "Rename"
 msgstr "Umbenennen"
@@ -180,16 +101,12 @@ msgstr "Umbenennen"
 msgid "Play Song"
 msgstr "Song abspielen"
 
-#: ../src/hrn-video-player.c:392
+#: ../src/hrn-video-player.c:397
 #, c-format
-msgid ""
-"Sorry, we can't play %s, as we don't have the correct plugin. You could try "
-"searching for ❝gstreamer codecs❞ on the web."
-msgstr ""
-"Leider können wir %s nicht abspielen, da wir nicht das passende Plugin "
-"haben. Du könntest versuchen, im Internet nach ❝gstreamer codecs❞ zu suchen."
+msgid "Sorry, we can't play %s, as we don't have the correct plugin. You could try searching for ❝gstreamer codecs❞ on the web."
+msgstr "Leider können wir %s nicht abspielen, da wir nicht das passende Plugin haben. Du könntest versuchen, im Internet nach ❝gstreamer codecs❞ zu suchen."
 
-#: ../src/hrn-video-player.c:395
+#: ../src/hrn-video-player.c:401
 msgid "We can't play this"
 msgstr "Das können wir nicht abspielen"
 
@@ -197,6 +114,87 @@ msgstr "Das können wir nicht abspielen"
 msgid "Play Video"
 msgstr "Video abspielen"
 
+#: ../src/hrn-cluster-tree.c:552
+msgid "August"
+msgstr "August"
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "July"
+msgstr "Juli"
+
+#: ../src/hrn-cluster-tree.c:39
+#, c-format
+msgid " and %d more"
+msgstr "und %d mehr"
+
+#: ../src/hrn-cluster-tree.c:550
+msgid "Feburary"
+msgstr "Februar"
+
+#: ../src/hrn-cluster-tree.c:550
+msgid "January"
+msgstr "Januar"
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "April"
+msgstr "April"
+
+#: ../src/hrn-cluster-tree.c:550
+msgid "March"
+msgstr "März"
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "June"
+msgstr "Juni"
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "May"
+msgstr "Mai"
+
+#: ../src/hrn-cluster-tree.c:552
+msgid "September"
+msgstr "September"
+
+#: ../src/hrn-cluster-tree.c:553
+msgid "November"
+msgstr "November"
+
+#: ../src/hrn-cluster-tree.c:553
+msgid "December"
+msgstr "Dezember"
+
+#: ../src/hrn-sidebar-item.c:455
+msgid "Music"
+msgstr "Musik"
+
+#: ../src/hrn-queue.c:1256
+msgid "Add music to start"
+msgstr "Zum Beginnen Musik hinzufügen"
+
+#: ../src/hrn-queue.c:1254
+msgid "Music Playqueue"
+msgstr "Musik-Playliste"
+
+#: ../src/hrn-sidebar-item.c:457
+msgid "Videos"
+msgstr "Videos"
+
+#: ../src/hrn-sidebar-item.c:456
+msgid "Pictures"
+msgstr "Bilder"
+
+#: ../src/hrn-video-player.c:395
+#, c-format
+msgid "Sorry, we can't play %s, as we don't have the correct plugin."
+msgstr "Leider können wir %s nicht abspielen, da wir nicht das passende Plugin haben. "
+
+#: ../src/hrn-cluster-tree.c:552
+msgid "October"
+msgstr "Oktober"
+
+#~ msgid "Delete"
+#~ msgstr "Löschen"
+
 #~ msgid "Audio"
 #~ msgstr "Audio"
 
diff -pruN 1.5.1-1/po/en_GB.po 1.8.4-1/po/en_GB.po
--- 1.5.1-1/po/en_GB.po	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/po/en_GB.po	2010-02-17 17:26:44.000000000 +0000
@@ -0,0 +1,203 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Moblin Media Player\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-11-19 18:12+0000\n"
+"PO-Revision-Date: 2009-11-23 10:43-0800\n"
+"Last-Translator: Margie Foster <margie@linux.intel.com>\n"
+"Language-Team: British English <margie@linux.intel.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n!=1;\n"
+"X-Poedit-Language: English\n"
+"X-Poedit-Country: UNITED KINGDOM\n"
+"X-Poedit-SourceCharset: utf-8\n"
+
+#: ../data/hornsey.desktop.in.h:1
+#: ../src/hornsey.c:761
+msgid "Media Player"
+msgstr "Media Player"
+
+#: ../data/hornsey.desktop.in.h:2
+msgid "Watch & listen"
+msgstr "Watch & listen"
+
+#: ../src/hornsey.c:597
+msgid "Run in a window"
+msgstr "Run in a window"
+
+#: ../src/hornsey.c:599
+msgid "Size of the window"
+msgstr "Size of the window"
+
+#: ../src/hornsey.c:601
+msgid "[FILE...]"
+msgstr "[FILE...]"
+
+#: ../src/hrn-album-cluster.c:75
+#: ../src/hrn-cluster-tree.c:280
+#: ../src/hrn-cluster-tree.c:577
+#: ../src/hrn-cluster-tree.c:578
+#: ../src/hrn-cluster-tree.c:584
+#: ../src/hrn-cluster-tree.c:590
+#: ../src/hrn-queue.c:965
+msgid "Unknown"
+msgstr "Unknown"
+
+#: ../src/hrn-album-cluster.c:112
+msgid "Queue Album"
+msgstr "Queue Album"
+
+#: ../src/hrn-artist-cluster.c:72
+#: ../src/hrn-year-cluster.c:67
+#, c-format
+msgid "%d album"
+msgid_plural "%d albums"
+msgstr[0] "%d album"
+msgstr[1] "%d albums"
+
+#: ../src/hrn-artist-cluster.c:139
+msgid "Queue Albums"
+msgstr "Queue Albums"
+
+#: ../src/hrn-cluster-tree.c:29
+msgid "Unknown Artist"
+msgstr "Unknown Artist"
+
+#: ../src/hrn-cluster-tree.c:39
+#, c-format
+msgid " and %d more"
+msgstr " and %d more"
+
+#: ../src/hrn-cluster-tree.c:550
+msgid "January"
+msgstr "January"
+
+#: ../src/hrn-cluster-tree.c:550
+msgid "Feburary"
+msgstr "Feburary"
+
+#: ../src/hrn-cluster-tree.c:550
+msgid "March"
+msgstr "March"
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "April"
+msgstr "April"
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "May"
+msgstr "May"
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "June"
+msgstr "June"
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "July"
+msgstr "July"
+
+#: ../src/hrn-cluster-tree.c:552
+msgid "August"
+msgstr "August"
+
+#: ../src/hrn-cluster-tree.c:552
+msgid "September"
+msgstr "September"
+
+#: ../src/hrn-cluster-tree.c:552
+msgid "October"
+msgstr "October"
+
+#: ../src/hrn-cluster-tree.c:553
+msgid "November"
+msgstr "November"
+
+#: ../src/hrn-cluster-tree.c:553
+msgid "December"
+msgstr "December"
+
+#: ../src/hrn-image-tile.c:104
+msgid "Display Picture"
+msgstr "Display Picture"
+
+#: ../src/hrn-month-cluster.c:68
+#, c-format
+msgid "%d photo"
+msgid_plural "%d photos"
+msgstr[0] "%d photo"
+msgstr[1] "%d photos"
+
+#: ../src/hrn-month-cluster.c:140
+#: ../src/hrn-year-cluster.c:139
+msgid "Start Slideshow"
+msgstr "Start Slideshow"
+
+#: ../src/hrn-queue.c:254
+msgid "Empty"
+msgstr "Empty"
+
+#: ../src/hrn-queue.c:255
+msgid "Shuffle"
+msgstr "Shuffle"
+
+#: ../src/hrn-queue.c:1246
+msgid "Playqueue"
+msgstr "Playqueue"
+
+#: ../src/hrn-queue.c:1254
+msgid "Music Playqueue"
+msgstr "Music Playqueue"
+
+#: ../src/hrn-queue.c:1256
+msgid "Add music to start"
+msgstr "Add music to start"
+
+#: ../src/hrn-sidebar.c:182
+msgid "Your local media"
+msgstr "Your local media"
+
+#: ../src/hrn-sidebar-item.c:455
+msgid "Music"
+msgstr "Music"
+
+#: ../src/hrn-sidebar-item.c:456
+msgid "Pictures"
+msgstr "Pictures"
+
+#: ../src/hrn-sidebar-item.c:457
+msgid "Videos"
+msgstr "Videos"
+
+#: ../src/hrn-sidebar-subitem.c:288
+msgid "Rename"
+msgstr "Rename"
+
+#: ../src/hrn-track-tile.c:105
+msgid "Play Song"
+msgstr "Play Song"
+
+#: ../src/hrn-video-player.c:395
+#, c-format
+msgid "Sorry, we can't play %s, as we don't have the correct plugin."
+msgstr "Sorry, we can't play %s, as we don't have the correct plugin."
+
+#: ../src/hrn-video-player.c:397
+#, c-format
+msgid "Sorry, we can't play %s, as we don't have the correct plugin. You could try searching for ❝gstreamer codecs❞ on the web."
+msgstr "Sorry, we can't play %s, as we don't have the correct plugin. You could try searching for ❝gstreamer codecs❞ on the web."
+
+#: ../src/hrn-video-player.c:401
+msgid "We can't play this"
+msgstr "We can't play this"
+
+#: ../src/hrn-video-tile.c:103
+msgid "Play Video"
+msgstr "Play Video"
+
diff -pruN 1.5.1-1/po/es.po 1.8.4-1/po/es.po
--- 1.5.1-1/po/es.po	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/po/es.po	2010-02-17 17:26:44.000000000 +0000
@@ -1,8 +1,9 @@
+# 
 msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-11-05 13:19+0000\n"
+"POT-Creation-Date: 2009-11-19 18:12+0000\n"
 "PO-Revision-Date: \n"
 "Last-Translator: Gonzalo Velasquez <gonzalox.e.velasquez@intel.com>\n"
 "Language-Team: \n"
@@ -13,7 +14,7 @@ msgstr ""
 "X-Poedit-Language: Spanish\n"
 "X-Poedit-SourceCharset: utf-8\n"
 
-#: ../data/hornsey.desktop.in.h:1 ../src/hornsey.c:704
+#: ../data/hornsey.desktop.in.h:1 ../src/hornsey.c:761
 msgid "Media Player"
 msgstr "Reproductor multimedia"
 
@@ -21,15 +22,15 @@ msgstr "Reproductor multimedia"
 msgid "Watch & listen"
 msgstr "Ver y oír"
 
-#: ../src/hornsey.c:542
+#: ../src/hornsey.c:597
 msgid "Run in a window"
 msgstr "Abrir en una ventana"
 
-#: ../src/hornsey.c:544
+#: ../src/hornsey.c:599
 msgid "Size of the window"
 msgstr "Tamaño de la ventana"
 
-#: ../src/hornsey.c:546
+#: ../src/hornsey.c:601
 msgid "[FILE...]"
 msgstr "[FILE...]"
 
@@ -55,145 +56,142 @@ msgstr[1] "%d álbumes"
 msgid "Queue Albums"
 msgstr "Lista de álbumes"
 
-#: ../src/hrn-audio-viewer.c:150 ../src/hrn-cluster-tree.c:29
+#: ../src/hrn-cluster-tree.c:29
 msgid "Unknown Artist"
 msgstr "Artista desconocido"
 
+#: ../src/hrn-image-tile.c:104
+msgid "Display Picture"
+msgstr "Mostrar imagen"
+
+#: ../src/hrn-month-cluster.c:68
+#, c-format
+msgid "%d photo"
+msgid_plural "%d photos"
+msgstr[0] "%d foto"
+msgstr[1] "%d fotos"
+
+#: ../src/hrn-month-cluster.c:140 ../src/hrn-year-cluster.c:139
+msgid "Start Slideshow"
+msgstr "Iniciar presentación"
+
+#: ../src/hrn-queue.c:254
+msgid "Empty"
+msgstr "Vaciar"
+
+#: ../src/hrn-queue.c:255
+msgid "Shuffle"
+msgstr "Aleatorio"
+
+#: ../src/hrn-sidebar.c:182
+msgid "Your local media"
+msgstr "Medios locales"
+
+#: ../src/hrn-sidebar-subitem.c:288
+msgid "Rename"
+msgstr "Renombrar"
+
+#: ../src/hrn-track-tile.c:105
+msgid "Play Song"
+msgstr "Reproducir canción"
+
+#: ../src/hrn-video-player.c:397
+#, c-format
+msgid "Sorry, we can't play %s, as we don't have the correct plugin. You could try searching for ❝gstreamer codecs❞ on the web."
+msgstr "Lo sentimos, no podemos reproducir %s, pues no tenemos el plugin correcto. Puedes intentar buscar ❝gstreamer codecs❞ en la web."
+
+#: ../src/hrn-video-player.c:401
+msgid "We can't play this"
+msgstr "No podemos reproducirlo"
+
+#: ../src/hrn-video-tile.c:103
+msgid "Play Video"
+msgstr "Reproducir vídeo"
+
+#: ../src/hrn-cluster-tree.c:552
+msgid "August"
+msgstr "Agosto"
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "July"
+msgstr "Julio"
+
 #: ../src/hrn-cluster-tree.c:39
 #, c-format
 msgid " and %d more"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:550
-msgid "January"
-msgstr ""
+msgstr "y %d más"
 
 #: ../src/hrn-cluster-tree.c:550
 msgid "Feburary"
-msgstr ""
+msgstr "Febrero"
 
 #: ../src/hrn-cluster-tree.c:550
-msgid "March"
-msgstr ""
+msgid "January"
+msgstr "Enero"
 
 #: ../src/hrn-cluster-tree.c:551
 msgid "April"
-msgstr ""
+msgstr "Abril"
 
-#: ../src/hrn-cluster-tree.c:551
-msgid "May"
-msgstr ""
+#: ../src/hrn-cluster-tree.c:550
+msgid "March"
+msgstr "Marzo"
 
 #: ../src/hrn-cluster-tree.c:551
 msgid "June"
-msgstr ""
+msgstr "Junio"
 
 #: ../src/hrn-cluster-tree.c:551
-msgid "July"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:552
-msgid "August"
-msgstr ""
+msgid "May"
+msgstr "Mayo"
 
 #: ../src/hrn-cluster-tree.c:552
 msgid "September"
-msgstr ""
+msgstr "Septiembre"
 
 #: ../src/hrn-cluster-tree.c:552
 msgid "October"
-msgstr ""
+msgstr "Octubre"
 
 #: ../src/hrn-cluster-tree.c:553
 msgid "November"
-msgstr ""
+msgstr "Noviembre"
 
 #: ../src/hrn-cluster-tree.c:553
 msgid "December"
-msgstr ""
-
-#: ../src/hrn-image-tile.c:104
-msgid "Display Picture"
-msgstr "Mostrar imagen"
-
-#: ../src/hrn-item.c:71
-msgid "Delete"
-msgstr "Borrar"
-
-#: ../src/hrn-month-cluster.c:68
-#, c-format
-msgid "%d photo"
-msgid_plural "%d photos"
-msgstr[0] "%d foto"
-msgstr[1] "%d fotos"
-
-#: ../src/hrn-month-cluster.c:140 ../src/hrn-year-cluster.c:139
-msgid "Start Slideshow"
-msgstr "Iniciar presentación"
-
-#: ../src/hrn-queue.c:254
-msgid "Empty"
-msgstr "Vaciar"
-
-#: ../src/hrn-queue.c:255
-msgid "Shuffle"
-msgstr "Aleatorio"
+msgstr "Diciembre"
 
-#: ../src/hrn-queue.c:1220
-msgid "Playqueue"
-msgstr "Lista de reproducción"
-
-#: ../src/hrn-queue.c:1228
-#, fuzzy
+#: ../src/hrn-queue.c:1254
 msgid "Music Playqueue"
 msgstr "Lista de reproducción"
 
-#: ../src/hrn-queue.c:1230
-msgid "Add music to start"
-msgstr ""
-
-#: ../src/hrn-sidebar.c:182
-msgid "Your local media"
-msgstr "Medios locales"
-
 #: ../src/hrn-sidebar-item.c:455
 msgid "Music"
-msgstr ""
+msgstr "Música"
+
+#: ../src/hrn-queue.c:1256
+msgid "Add music to start"
+msgstr "Agregar música para empezar"
 
 #: ../src/hrn-sidebar-item.c:456
-#, fuzzy
 msgid "Pictures"
-msgstr "Mostrar imagen"
+msgstr "Imágenes"
 
 #: ../src/hrn-sidebar-item.c:457
-#, fuzzy
 msgid "Videos"
-msgstr "Vídeo"
+msgstr "Vídeos"
 
-#: ../src/hrn-sidebar-subitem.c:288
-msgid "Rename"
-msgstr "Renombrar"
-
-#: ../src/hrn-track-tile.c:105
-msgid "Play Song"
-msgstr "Reproducir canción"
-
-#: ../src/hrn-video-player.c:392
+#: ../src/hrn-video-player.c:395
 #, c-format
-msgid ""
-"Sorry, we can't play %s, as we don't have the correct plugin. You could try "
-"searching for ❝gstreamer codecs❞ on the web."
-msgstr ""
-"Lo sentimos, no podemos reproducir %s, pues no tenemos el plugin correcto. "
-"Puedes intentar buscar ❝gstreamer codecs❞ en la web."
+msgid "Sorry, we can't play %s, as we don't have the correct plugin."
+msgstr "Lo sentimos, no podemos reproducir %s, pues no tenemos el plugin correcto."
 
-#: ../src/hrn-video-player.c:395
-msgid "We can't play this"
-msgstr "No podemos reproducirlo"
+#: ../src/hrn-queue.c:1246
+msgid "Playqueue"
+msgstr "Lista"
 
-#: ../src/hrn-video-tile.c:103
-msgid "Play Video"
-msgstr "Reproducir vídeo"
+#~ msgid "Delete"
+#~ msgstr "Borrar"
 
 #~ msgid "Audio"
 #~ msgstr "Sonido"
diff -pruN 1.5.1-1/po/fi.po 1.8.4-1/po/fi.po
--- 1.5.1-1/po/fi.po	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/po/fi.po	2010-02-17 17:26:44.000000000 +0000
@@ -1,8 +1,9 @@
+# 
 msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-11-05 13:19+0000\n"
+"POT-Creation-Date: 2009-11-19 18:12+0000\n"
 "PO-Revision-Date: \n"
 "Last-Translator: Paula <pkwanzek@hotmail.com>\n"
 "Language-Team: \n"
@@ -13,7 +14,7 @@ msgstr ""
 "X-Poedit-Language: Finnish\n"
 "X-Poedit-SourceCharset: utf-8\n"
 
-#: ../data/hornsey.desktop.in.h:1 ../src/hornsey.c:704
+#: ../data/hornsey.desktop.in.h:1 ../src/hornsey.c:761
 msgid "Media Player"
 msgstr "Mediasoitin"
 
@@ -21,15 +22,15 @@ msgstr "Mediasoitin"
 msgid "Watch & listen"
 msgstr "Katsele & kuuntele"
 
-#: ../src/hornsey.c:542
+#: ../src/hornsey.c:597
 msgid "Run in a window"
 msgstr "Suorita ikkunassa"
 
-#: ../src/hornsey.c:544
+#: ../src/hornsey.c:599
 msgid "Size of the window"
 msgstr "Ikkunan koko"
 
-#: ../src/hornsey.c:546
+#: ../src/hornsey.c:601
 msgid "[FILE...]"
 msgstr "[TIEDOSTO...]"
 
@@ -55,71 +56,14 @@ msgstr[1] "%d albumit"
 msgid "Queue Albums"
 msgstr "Jonota levyt"
 
-#: ../src/hrn-audio-viewer.c:150 ../src/hrn-cluster-tree.c:29
+#: ../src/hrn-cluster-tree.c:29
 msgid "Unknown Artist"
 msgstr "Tuntematon artisti"
 
-#: ../src/hrn-cluster-tree.c:39
-#, c-format
-msgid " and %d more"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:550
-msgid "January"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:550
-msgid "Feburary"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:550
-msgid "March"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:551
-msgid "April"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:551
-msgid "May"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:551
-msgid "June"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:551
-msgid "July"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:552
-msgid "August"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:552
-msgid "September"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:552
-msgid "October"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:553
-msgid "November"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:553
-msgid "December"
-msgstr ""
-
 #: ../src/hrn-image-tile.c:104
 msgid "Display Picture"
 msgstr "Näytä kuva"
 
-#: ../src/hrn-item.c:71
-msgid "Delete"
-msgstr "Poista"
-
 #: ../src/hrn-month-cluster.c:68
 #, c-format
 msgid "%d photo"
@@ -139,37 +83,14 @@ msgstr "Tyhjennä"
 msgid "Shuffle"
 msgstr "Sekoita"
 
-#: ../src/hrn-queue.c:1220
+#: ../src/hrn-queue.c:1246
 msgid "Playqueue"
 msgstr "Soittojono"
 
-#: ../src/hrn-queue.c:1228
-#, fuzzy
-msgid "Music Playqueue"
-msgstr "Soittojono"
-
-#: ../src/hrn-queue.c:1230
-msgid "Add music to start"
-msgstr ""
-
 #: ../src/hrn-sidebar.c:182
 msgid "Your local media"
 msgstr "Paikallinen media"
 
-#: ../src/hrn-sidebar-item.c:455
-msgid "Music"
-msgstr ""
-
-#: ../src/hrn-sidebar-item.c:456
-#, fuzzy
-msgid "Pictures"
-msgstr "Näytä kuva"
-
-#: ../src/hrn-sidebar-item.c:457
-#, fuzzy
-msgid "Videos"
-msgstr "Video"
-
 #: ../src/hrn-sidebar-subitem.c:288
 msgid "Rename"
 msgstr "Nimeä uudelleen"
@@ -178,16 +99,12 @@ msgstr "Nimeä uudelleen"
 msgid "Play Song"
 msgstr "Soita kappale"
 
-#: ../src/hrn-video-player.c:392
+#: ../src/hrn-video-player.c:397
 #, c-format
-msgid ""
-"Sorry, we can't play %s, as we don't have the correct plugin. You could try "
-"searching for ❝gstreamer codecs❞ on the web."
-msgstr ""
-"Kohdetta '%s' ei voi soittaa, koska tarvittava liitännäinen puuttuu. Voisit "
-"yritää etsiä verkossa ❝gstreamer codecs❞."
+msgid "Sorry, we can't play %s, as we don't have the correct plugin. You could try searching for ❝gstreamer codecs❞ on the web."
+msgstr "Kohdetta '%s' ei voi soittaa, koska tarvittava liitännäinen puuttuu. Voisit yritää etsiä verkossa ❝gstreamer codecs❞."
 
-#: ../src/hrn-video-player.c:395
+#: ../src/hrn-video-player.c:401
 msgid "We can't play this"
 msgstr "Tätä ei voi soittaa"
 
@@ -195,6 +112,87 @@ msgstr "Tätä ei voi soittaa"
 msgid "Play Video"
 msgstr "Esitä video"
 
+#: ../src/hrn-cluster-tree.c:552
+msgid "August"
+msgstr "Elokuu"
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "July"
+msgstr "Heinäkuu"
+
+#: ../src/hrn-cluster-tree.c:39
+#, c-format
+msgid " and %d more"
+msgstr "ja %d lisää"
+
+#: ../src/hrn-cluster-tree.c:550
+msgid "Feburary"
+msgstr "Helmikuu"
+
+#: ../src/hrn-cluster-tree.c:550
+msgid "January"
+msgstr "Tammikuu"
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "April"
+msgstr "Huhtikuu"
+
+#: ../src/hrn-cluster-tree.c:550
+msgid "March"
+msgstr "Maaliskuu"
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "June"
+msgstr "Kesäkuu"
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "May"
+msgstr "Toukokuu"
+
+#: ../src/hrn-cluster-tree.c:552
+msgid "September"
+msgstr "Syyskuu"
+
+#: ../src/hrn-cluster-tree.c:552
+msgid "October"
+msgstr "Lokakuu"
+
+#: ../src/hrn-cluster-tree.c:553
+msgid "November"
+msgstr "Marraskuu"
+
+#: ../src/hrn-cluster-tree.c:553
+msgid "December"
+msgstr "Joulukuu"
+
+#: ../src/hrn-sidebar-item.c:455
+msgid "Music"
+msgstr "Musiikki"
+
+#: ../src/hrn-queue.c:1256
+msgid "Add music to start"
+msgstr "Lisää musiikkia aloittaaksesi"
+
+#: ../src/hrn-queue.c:1254
+msgid "Music Playqueue"
+msgstr "Soittojono"
+
+#: ../src/hrn-sidebar-item.c:457
+msgid "Videos"
+msgstr "Videot"
+
+#: ../src/hrn-sidebar-item.c:456
+msgid "Pictures"
+msgstr "Kuvat"
+
+#: ../src/hrn-video-player.c:395
+#, c-format
+msgid "Sorry, we can't play %s, as we don't have the correct plugin."
+msgstr "Kohdetta '%s' ei voi soittaa, koska tarvittava liitännäinen puuttuu. "
+
+#~ msgid "Delete"
+#~ msgstr "Poista"
+
 #~ msgid "Audio"
 #~ msgstr "Ääni"
 
diff -pruN 1.5.1-1/po/fr.po 1.8.4-1/po/fr.po
--- 1.5.1-1/po/fr.po	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/po/fr.po	2010-02-17 17:26:44.000000000 +0000
@@ -1,19 +1,20 @@
+# 
 msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-11-05 13:19+0000\n"
+"POT-Creation-Date: 2009-11-19 18:12+0000\n"
 "PO-Revision-Date: \n"
 "Last-Translator: Loïc Dufresne de Virel <loic.dufresne.de.virel@intel.com>\n"
 "Language-Team: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n!=1;\n"
 "X-Poedit-Language: French\n"
 "X-Poedit-SourceCharset: utf-8\n"
-"Plural-Forms: nplurals=2; plural=n!=1;\n"
 
-#: ../data/hornsey.desktop.in.h:1 ../src/hornsey.c:704
+#: ../data/hornsey.desktop.in.h:1 ../src/hornsey.c:761
 msgid "Media Player"
 msgstr "Lecteur multimédia"
 
@@ -21,15 +22,15 @@ msgstr "Lecteur multimédia"
 msgid "Watch & listen"
 msgstr "Voir & écouter"
 
-#: ../src/hornsey.c:542
+#: ../src/hornsey.c:597
 msgid "Run in a window"
 msgstr "Exécuter dans une fenêtre"
 
-#: ../src/hornsey.c:544
+#: ../src/hornsey.c:599
 msgid "Size of the window"
 msgstr "Taille de la fenêtre"
 
-#: ../src/hornsey.c:546
+#: ../src/hornsey.c:601
 msgid "[FILE...]"
 msgstr "[FICHIER...]"
 
@@ -56,71 +57,14 @@ msgstr[1] "%d albums"
 msgid "Queue Albums"
 msgstr "Ajouter les albums à la liste"
 
-#: ../src/hrn-audio-viewer.c:150 ../src/hrn-cluster-tree.c:29
+#: ../src/hrn-cluster-tree.c:29
 msgid "Unknown Artist"
 msgstr "Artiste inconnu"
 
-#: ../src/hrn-cluster-tree.c:39
-#, c-format
-msgid " and %d more"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:550
-msgid "January"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:550
-msgid "Feburary"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:550
-msgid "March"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:551
-msgid "April"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:551
-msgid "May"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:551
-msgid "June"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:551
-msgid "July"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:552
-msgid "August"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:552
-msgid "September"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:552
-msgid "October"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:553
-msgid "November"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:553
-msgid "December"
-msgstr ""
-
 #: ../src/hrn-image-tile.c:104
 msgid "Display Picture"
 msgstr "Afficher la photo"
 
-#: ../src/hrn-item.c:71
-msgid "Delete"
-msgstr "Supprimer"
-
 # Same word used for French.
 #: ../src/hrn-month-cluster.c:68
 #, c-format
@@ -141,37 +85,14 @@ msgstr "Vider"
 msgid "Shuffle"
 msgstr "Mixer"
 
-#: ../src/hrn-queue.c:1220
+#: ../src/hrn-queue.c:1246
 msgid "Playqueue"
 msgstr "File de lecture"
 
-#: ../src/hrn-queue.c:1228
-#, fuzzy
-msgid "Music Playqueue"
-msgstr "File de lecture"
-
-#: ../src/hrn-queue.c:1230
-msgid "Add music to start"
-msgstr ""
-
 #: ../src/hrn-sidebar.c:182
 msgid "Your local media"
 msgstr "Vos media locaux"
 
-#: ../src/hrn-sidebar-item.c:455
-msgid "Music"
-msgstr ""
-
-#: ../src/hrn-sidebar-item.c:456
-#, fuzzy
-msgid "Pictures"
-msgstr "Afficher la photo"
-
-#: ../src/hrn-sidebar-item.c:457
-#, fuzzy
-msgid "Videos"
-msgstr "Vidéo"
-
 #: ../src/hrn-sidebar-subitem.c:288
 msgid "Rename"
 msgstr "Renommer"
@@ -180,17 +101,14 @@ msgstr "Renommer"
 msgid "Play Song"
 msgstr "Jouer la chanson"
 
-#: ../src/hrn-video-player.c:392
+#: ../src/hrn-video-player.c:397
 #, c-format
-msgid ""
-"Sorry, we can't play %s, as we don't have the correct plugin. You could try "
-"searching for ❝gstreamer codecs❞ on the web."
-msgstr ""
-"Désolé, nous ne pouvons pas jouer %s, car nous n'avons pas le plug-in "
-"nécessaire. Vous pouvez chercher les ❝codecs gstreamer❞ sur internet."
+msgid "Sorry, we can't play %s, as we don't have the correct plugin. You could try searching for ❝gstreamer codecs❞ on the web."
+msgstr "Désolé, nous ne pouvons pas jouer %s, car nous n'avons pas le plug-in nécessaire. Vous pouvez chercher les ❝codecs gstreamer❞ sur internet."
 
-# Is there anything coming after "this"? This will change the French translation.
-#: ../src/hrn-video-player.c:395
+# Is there anything coming after "this"? This will change the French
+# translation.
+#: ../src/hrn-video-player.c:401
 msgid "We can't play this"
 msgstr "Impossible de jouer ça"
 
@@ -198,6 +116,87 @@ msgstr "Impossible de jouer ça"
 msgid "Play Video"
 msgstr "Jouer la vidéo"
 
+#: ../src/hrn-cluster-tree.c:552
+msgid "August"
+msgstr "août"
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "July"
+msgstr "juillet"
+
+#: ../src/hrn-cluster-tree.c:39
+#, c-format
+msgid " and %d more"
+msgstr "et %d de plus"
+
+#: ../src/hrn-cluster-tree.c:550
+msgid "Feburary"
+msgstr "février"
+
+#: ../src/hrn-cluster-tree.c:550
+msgid "January"
+msgstr "janvier"
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "April"
+msgstr "avril"
+
+#: ../src/hrn-cluster-tree.c:550
+msgid "March"
+msgstr "mars"
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "June"
+msgstr "juin"
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "May"
+msgstr "mai"
+
+#: ../src/hrn-cluster-tree.c:552
+msgid "September"
+msgstr "septembre"
+
+#: ../src/hrn-cluster-tree.c:552
+msgid "October"
+msgstr "octobre"
+
+#: ../src/hrn-cluster-tree.c:553
+msgid "November"
+msgstr "novembre"
+
+#: ../src/hrn-cluster-tree.c:553
+msgid "December"
+msgstr "décembre"
+
+#: ../src/hrn-sidebar-item.c:455
+msgid "Music"
+msgstr "Musique"
+
+#: ../src/hrn-queue.c:1256
+msgid "Add music to start"
+msgstr "Ajouter de la musique à jouer"
+
+#: ../src/hrn-queue.c:1254
+msgid "Music Playqueue"
+msgstr "File de lecture (Musique)"
+
+#: ../src/hrn-sidebar-item.c:457
+msgid "Videos"
+msgstr "Vidéos"
+
+#: ../src/hrn-sidebar-item.c:456
+msgid "Pictures"
+msgstr "Photos"
+
+#: ../src/hrn-video-player.c:395
+#, c-format
+msgid "Sorry, we can't play %s, as we don't have the correct plugin."
+msgstr "Désolé, nous ne pouvons pas jouer %s, car nous n'avons pas le plug-in nécessaire."
+
+#~ msgid "Delete"
+#~ msgstr "Supprimer"
+
 #~ msgid "Audio"
 #~ msgstr "Audio"
 
diff -pruN 1.5.1-1/po/gl.po 1.8.4-1/po/gl.po
--- 1.5.1-1/po/gl.po	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/po/gl.po	2010-02-17 17:26:44.000000000 +0000
@@ -1,12 +1,12 @@
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
-#
+# 
 # Xosé <xosecalvo@edu.xunta.es>, 2009.
 msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-11-05 13:19+0000\n"
+"POT-Creation-Date: 2010-02-11 23:21+0000\n"
 "PO-Revision-Date: 2009-09-16 17:03+0200\n"
 "Last-Translator: Xosé <xosecalvo@edu.xunta.es>\n"
 "Language-Team: Galego <proxecto@trasno.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Lokalize 1.0\n"
 
-#: ../data/hornsey.desktop.in.h:1 ../src/hornsey.c:704
+#: ../data/hornsey.desktop.in.h:1 ../src/hornsey.c:710
 msgid "Media Player"
 msgstr "Reprodutor multimedia"
 
@@ -24,22 +24,22 @@ msgstr "Reprodutor multimedia"
 msgid "Watch & listen"
 msgstr "Ver e escoitar"
 
-#: ../src/hornsey.c:542
+#: ../src/hornsey.c:549
 msgid "Run in a window"
 msgstr "Executar nunha xanela"
 
-#: ../src/hornsey.c:544
+#: ../src/hornsey.c:551
 msgid "Size of the window"
 msgstr "Tamaño da xanela"
 
-#: ../src/hornsey.c:546
+#: ../src/hornsey.c:553
 msgid "[FILE...]"
 msgstr "[FICHEIRO...]"
 
-#: ../src/hrn-album-cluster.c:75 ../src/hrn-cluster-tree.c:280
-#: ../src/hrn-cluster-tree.c:577 ../src/hrn-cluster-tree.c:578
-#: ../src/hrn-cluster-tree.c:584 ../src/hrn-cluster-tree.c:590
-#: ../src/hrn-queue.c:965
+#: ../src/hrn-album-cluster.c:75 ../src/hrn-cluster-tree.c:268
+#: ../src/hrn-cluster-tree.c:573 ../src/hrn-cluster-tree.c:574
+#: ../src/hrn-cluster-tree.c:580 ../src/hrn-cluster-tree.c:586
+#: ../src/hrn-queue.c:137 ../src/hrn-queue.c:143
 msgid "Unknown"
 msgstr "Descoñecido"
 
@@ -58,72 +58,68 @@ msgstr[1] ""
 msgid "Queue Albums"
 msgstr "Pór os álbums na fila"
 
-#: ../src/hrn-audio-viewer.c:150 ../src/hrn-cluster-tree.c:29
-#, fuzzy
+#: ../src/hrn-cluster-tree.c:25 ../src/hrn-queue.c:133 ../src/hrn-queue.c:144
+#: ../src/hrn-queue-item.c:55
 msgid "Unknown Artist"
-msgstr "Descoñecido"
+msgstr "Artista descoñecido"
 
-#: ../src/hrn-cluster-tree.c:39
+#: ../src/hrn-cluster-tree.c:35
 #, c-format
 msgid " and %d more"
-msgstr ""
+msgstr "e outros %d"
 
-#: ../src/hrn-cluster-tree.c:550
+#: ../src/hrn-cluster-tree.c:546
 msgid "January"
-msgstr ""
+msgstr "Xaneiro"
 
-#: ../src/hrn-cluster-tree.c:550
+#: ../src/hrn-cluster-tree.c:546
 msgid "Feburary"
-msgstr ""
+msgstr "Febreiro"
 
-#: ../src/hrn-cluster-tree.c:550
+#: ../src/hrn-cluster-tree.c:546
 msgid "March"
-msgstr ""
+msgstr "Marzo"
 
-#: ../src/hrn-cluster-tree.c:551
+#: ../src/hrn-cluster-tree.c:547
 msgid "April"
-msgstr ""
+msgstr "Abril"
 
-#: ../src/hrn-cluster-tree.c:551
+#: ../src/hrn-cluster-tree.c:547
 msgid "May"
-msgstr ""
+msgstr "Maio"
 
-#: ../src/hrn-cluster-tree.c:551
+#: ../src/hrn-cluster-tree.c:547
 msgid "June"
-msgstr ""
+msgstr "Xuño"
 
-#: ../src/hrn-cluster-tree.c:551
+#: ../src/hrn-cluster-tree.c:547
 msgid "July"
-msgstr ""
+msgstr "Xullo"
 
-#: ../src/hrn-cluster-tree.c:552
+#: ../src/hrn-cluster-tree.c:548
 msgid "August"
-msgstr ""
+msgstr "Agosto"
 
-#: ../src/hrn-cluster-tree.c:552
+#: ../src/hrn-cluster-tree.c:548
 msgid "September"
-msgstr ""
+msgstr "Setembro"
 
-#: ../src/hrn-cluster-tree.c:552
+#: ../src/hrn-cluster-tree.c:548
 msgid "October"
-msgstr ""
+msgstr "Outubro"
 
-#: ../src/hrn-cluster-tree.c:553
+#: ../src/hrn-cluster-tree.c:549
 msgid "November"
-msgstr ""
+msgstr "Novembro"
 
-#: ../src/hrn-cluster-tree.c:553
+#: ../src/hrn-cluster-tree.c:549
 msgid "December"
-msgstr ""
+msgstr "Decembro"
 
 #: ../src/hrn-image-tile.c:104
 msgid "Display Picture"
 msgstr "Mostrar a imaxe"
 
-#: ../src/hrn-item.c:71
-msgid "Delete"
-msgstr "Eliminar"
-
 #: ../src/hrn-month-cluster.c:68
 #, c-format
 msgid "%d photo"
@@ -135,46 +131,31 @@ msgstr[1] ""
 msgid "Start Slideshow"
 msgstr "Iniciar a presentación"
 
-#: ../src/hrn-queue.c:254
-msgid "Empty"
-msgstr "Baleiro "
-
-#: ../src/hrn-queue.c:255
-msgid "Shuffle"
-msgstr "Barallar"
-
-#: ../src/hrn-queue.c:1220
-msgid "Playqueue"
-msgstr "Lista de reprodución"
-
-#: ../src/hrn-queue.c:1228
-#, fuzzy
+#: ../src/hrn-queue.c:58
 msgid "Music Playqueue"
-msgstr "Lista de reprodución"
+msgstr "Lista de reprodución de música"
 
-#: ../src/hrn-queue.c:1230
+#: ../src/hrn-queue.c:59
 msgid "Add music to start"
-msgstr ""
+msgstr "Engada música para comezar"
 
-#: ../src/hrn-sidebar.c:182
+#: ../src/hrn-sidebar.c:132 ../src/hrn-sidebar.c:193
 msgid "Your local media"
 msgstr "Os recursos locais"
 
-#: ../src/hrn-sidebar-item.c:455
+#: ../src/hrn-sidebar-item.c:370
 msgid "Music"
-msgstr ""
+msgstr "Música"
 
-#: ../src/hrn-sidebar-item.c:456
-#, fuzzy
+#: ../src/hrn-sidebar-item.c:371
 msgid "Pictures"
-msgstr "Mostrar a imaxe"
+msgstr "Imáxes"
 
-#: ../src/hrn-sidebar-item.c:457
-#, fuzzy
+#: ../src/hrn-sidebar-item.c:372
 msgid "Videos"
-msgstr "Vídeo"
+msgstr "Vídeos"
 
-#: ../src/hrn-sidebar-subitem.c:288
+#: ../src/hrn-sidebar-subitem.c:399
 msgid "Rename"
 msgstr "Mudar o nome"
 
@@ -182,16 +163,17 @@ msgstr "Mudar o nome"
 msgid "Play Song"
 msgstr "Reproducir a canción"
 
-#: ../src/hrn-video-player.c:392
+#: ../src/hrn-video-player.c:485
 #, c-format
-msgid ""
-"Sorry, we can't play %s, as we don't have the correct plugin. You could try "
-"searching for ❝gstreamer codecs❞ on the web."
-msgstr ""
-"Desculpe, non podemos reproducir %s porque non temos o engadido correcto. "
-"Pode tentar procurando por \"gstreamer codecs\" na web."
+msgid "Sorry, we can't play %s, as we don't have the correct plugin."
+msgstr "Desculpe, non podemos reproducir %s porque non temos o engadido correcto."
 
-#: ../src/hrn-video-player.c:395
+#: ../src/hrn-video-player.c:487
+#, c-format
+msgid "Sorry, we can't play %s, as we don't have the correct plugin. You could try searching for ❝gstreamer codecs❞ on the web."
+msgstr "Desculpe, non podemos reproducir %s porque non temos o engadido correcto. Pode tentar procurando por \"gstreamer codecs\" na web."
+
+#: ../src/hrn-video-player.c:491
 msgid "We can't play this"
 msgstr "Isto non se pode reproducir"
 
@@ -199,6 +181,22 @@ msgstr "Isto non se pode reproducir"
 msgid "Play Video"
 msgstr "Reproducir o vídeo"
 
+#: ../src/hrn-queue-item.c:53
+msgid "Unknown Title"
+msgstr "Título descoñecido"
+
+#~ msgid "Empty"
+#~ msgstr "Baleiro "
+
+#~ msgid "Shuffle"
+#~ msgstr "Barallar"
+
+#~ msgid "Playqueue"
+#~ msgstr "Lista de reprodución"
+
+#~ msgid "Delete"
+#~ msgstr "Eliminar"
+
 #~ msgid "Audio"
 #~ msgstr "Son"
 
diff -pruN 1.5.1-1/po/hu.po 1.8.4-1/po/hu.po
--- 1.5.1-1/po/hu.po	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/po/hu.po	2010-02-17 17:26:44.000000000 +0000
@@ -7,18 +7,20 @@ msgid ""
 msgstr ""
 "Project-Id-Version: hornsey\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-11-05 13:19+0000\n"
-"PO-Revision-Date: 2009-07-31 22:43+0100\n"
-"Last-Translator: Kökéndy Ákos <kokendy.akos@gmail.com>\n"
-"Language-Team: HUNGARIAN <moblinhungary@googlegroups.com>\n"
+"POT-Creation-Date: 2009-12-08 17:35+0000\n"
+"PO-Revision-Date: 2009-12-24 14:41+0100\n"
+"Last-Translator: Gönczi Norbert <gonczinorbert@gmail.com>\n"
+"Language-Team: HUNGARIAN\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "X-Poedit-Language: Hungarian\n"
 "X-Poedit-Country: HUNGARY\n"
+"X-Poedit-SourceCharset: utf-8\n"
 
-#: ../data/hornsey.desktop.in.h:1 ../src/hornsey.c:704
+#: ../data/hornsey.desktop.in.h:1
+#: ../src/hornsey.c:761
 msgid "Media Player"
 msgstr "Médialejátszó"
 
@@ -26,116 +28,116 @@ msgstr "Médialejátszó"
 msgid "Watch & listen"
 msgstr "Nézd és hallgasd"
 
-#: ../src/hornsey.c:542
+#: ../src/hornsey.c:597
 msgid "Run in a window"
-msgstr ""
+msgstr "Futtatás ablakban"
 
-#: ../src/hornsey.c:544
+#: ../src/hornsey.c:599
 msgid "Size of the window"
-msgstr ""
+msgstr "Ablakméret"
 
-#: ../src/hornsey.c:546
+#: ../src/hornsey.c:601
 msgid "[FILE...]"
-msgstr ""
+msgstr "[FÁJL…]"
 
-#: ../src/hrn-album-cluster.c:75 ../src/hrn-cluster-tree.c:280
-#: ../src/hrn-cluster-tree.c:577 ../src/hrn-cluster-tree.c:578
-#: ../src/hrn-cluster-tree.c:584 ../src/hrn-cluster-tree.c:590
+#: ../src/hrn-album-cluster.c:75
+#: ../src/hrn-cluster-tree.c:280
+#: ../src/hrn-cluster-tree.c:577
+#: ../src/hrn-cluster-tree.c:578
+#: ../src/hrn-cluster-tree.c:584
+#: ../src/hrn-cluster-tree.c:590
 #: ../src/hrn-queue.c:965
-#, fuzzy
 msgid "Unknown"
-msgstr "Ismeretlen előadó"
+msgstr "Ismeretlen"
 
 #: ../src/hrn-album-cluster.c:112
 msgid "Queue Album"
-msgstr ""
+msgstr "Album lejátszása"
 
-#: ../src/hrn-artist-cluster.c:72 ../src/hrn-year-cluster.c:67
+#: ../src/hrn-artist-cluster.c:72
+#: ../src/hrn-year-cluster.c:67
 #, c-format
 msgid "%d album"
 msgid_plural "%d albums"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d album"
+msgstr[1] "%d album"
 
 #: ../src/hrn-artist-cluster.c:139
 msgid "Queue Albums"
-msgstr ""
+msgstr "Albumok lejátszása"
 
-#: ../src/hrn-audio-viewer.c:150 ../src/hrn-cluster-tree.c:29
+#: ../src/hrn-cluster-tree.c:29
 msgid "Unknown Artist"
 msgstr "Ismeretlen előadó"
 
 #: ../src/hrn-cluster-tree.c:39
 #, c-format
 msgid " and %d more"
-msgstr ""
+msgstr "és további %d"
 
 #: ../src/hrn-cluster-tree.c:550
 msgid "January"
-msgstr ""
+msgstr "Január"
 
 #: ../src/hrn-cluster-tree.c:550
 msgid "Feburary"
-msgstr ""
+msgstr "Február"
 
 #: ../src/hrn-cluster-tree.c:550
 msgid "March"
-msgstr ""
+msgstr "Március"
 
 #: ../src/hrn-cluster-tree.c:551
 msgid "April"
-msgstr ""
+msgstr "Április"
 
 #: ../src/hrn-cluster-tree.c:551
 msgid "May"
-msgstr ""
+msgstr "Május"
 
 #: ../src/hrn-cluster-tree.c:551
 msgid "June"
-msgstr ""
+msgstr "Június"
 
 #: ../src/hrn-cluster-tree.c:551
 msgid "July"
-msgstr ""
+msgstr "Július"
 
 #: ../src/hrn-cluster-tree.c:552
 msgid "August"
-msgstr ""
+msgstr "Augusztus"
 
 #: ../src/hrn-cluster-tree.c:552
 msgid "September"
-msgstr ""
+msgstr "Szeptember"
 
 #: ../src/hrn-cluster-tree.c:552
 msgid "October"
-msgstr ""
+msgstr "Október"
 
 #: ../src/hrn-cluster-tree.c:553
 msgid "November"
-msgstr ""
+msgstr "November"
 
 #: ../src/hrn-cluster-tree.c:553
 msgid "December"
-msgstr ""
+msgstr "December"
 
 #: ../src/hrn-image-tile.c:104
 msgid "Display Picture"
-msgstr ""
-
-#: ../src/hrn-item.c:71
-msgid "Delete"
-msgstr "Törlés"
+msgstr "Kép megjelenítése"
 
 #: ../src/hrn-month-cluster.c:68
 #, c-format
 msgid "%d photo"
 msgid_plural "%d photos"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d fénykép"
+msgstr[1] "%d fénykép"
 
-#: ../src/hrn-month-cluster.c:140 ../src/hrn-year-cluster.c:139
+#: ../src/hrn-month-cluster.c:140
+#: ../src/hrn-year-cluster.c:139
 msgid "Start Slideshow"
-msgstr ""
+msgstr "Diavetítés indítása"
 
 #: ../src/hrn-queue.c:254
 msgid "Empty"
@@ -145,17 +147,13 @@ msgstr "Üres"
 msgid "Shuffle"
 msgstr "Véletlen sorrendű lejátszás"
 
-#: ../src/hrn-queue.c:1220
-msgid "Playqueue"
-msgstr ""
-
-#: ../src/hrn-queue.c:1228
+#: ../src/hrn-queue.c:1247
 msgid "Music Playqueue"
-msgstr ""
+msgstr "Zene lejátszási lista"
 
-#: ../src/hrn-queue.c:1230
+#: ../src/hrn-queue.c:1249
 msgid "Add music to start"
-msgstr ""
+msgstr "Zene hozzáadása az induláshoz"
 
 #: ../src/hrn-sidebar.c:182
 msgid "Your local media"
@@ -163,16 +161,15 @@ msgstr "Helyi média"
 
 #: ../src/hrn-sidebar-item.c:455
 msgid "Music"
-msgstr ""
+msgstr "Zene"
 
 #: ../src/hrn-sidebar-item.c:456
 msgid "Pictures"
-msgstr ""
+msgstr "Képek"
 
 #: ../src/hrn-sidebar-item.c:457
-#, fuzzy
 msgid "Videos"
-msgstr "Videó"
+msgstr "Videók"
 
 #: ../src/hrn-sidebar-subitem.c:288
 msgid "Rename"
@@ -180,56 +177,50 @@ msgstr "Átnevezés"
 
 #: ../src/hrn-track-tile.c:105
 msgid "Play Song"
-msgstr ""
+msgstr "Zene lejátszása"
 
-#: ../src/hrn-video-player.c:392
+#: ../src/hrn-video-player.c:395
 #, c-format
-msgid ""
-"Sorry, we can't play %s, as we don't have the correct plugin. You could try "
-"searching for ❝gstreamer codecs❞ on the web."
-msgstr ""
-"Elnézést, de a(z) %s médiát nem tudjuk lejátszani, mert nincs hozzá "
-"megfelelő beépülő modul. Megpróbálhatsz ❝gstreamer kodeket❞keresni a weben."
+msgid "Sorry, we can't play %s, as we don't have the correct plugin."
+msgstr "Elnézést, de a(z) %s médiát nem tudjuk lejátszani, mert nincs hozzá megfelelő beépülő modul."
 
-#: ../src/hrn-video-player.c:395
+#: ../src/hrn-video-player.c:397
+#, c-format
+msgid "Sorry, we can't play %s, as we don't have the correct plugin. You could try searching for ❝gstreamer codecs❞ on the web."
+msgstr "Elnézést, de a(z) %s médiát nem tudjuk lejátszani, mert nincs hozzá megfelelő beépülő modul. Megpróbálhatsz ❝gstreamer codecs❞ keresni a weben."
+
+#: ../src/hrn-video-player.c:401
 msgid "We can't play this"
 msgstr "Ezt nem tudjuk lejátszani"
 
 #: ../src/hrn-video-tile.c:103
-#, fuzzy
 msgid "Play Video"
-msgstr "Videó"
+msgstr "Videó lejátszása"
 
+#~ msgid "Delete"
+#~ msgstr "Törlés"
+#~ msgid "Playqueue"
+#~ msgstr "Lejátszási lista"
 #~ msgid "Audio"
-#~ msgstr "Hang"
-
-#, fuzzy
+#~ msgstr "Zene"
 #~ msgid "Image"
-#~ msgstr "Képek"
-
+#~ msgstr "Kép"
 #~ msgid "All"
 #~ msgstr "Mind"
-
 #~ msgid "Overview"
 #~ msgstr "Áttekintés"
-
 #~ msgid "Collections"
 #~ msgstr "Gyűjtemények"
-
 #~ msgid "Small Items"
 #~ msgstr "Kis elemek"
-
 #~ msgid "Large Items"
 #~ msgstr "Nagy elemek"
-
 #~ msgid "Theatre"
 #~ msgstr "Színház"
-
 #~ msgid "Show"
 #~ msgstr "Show"
-
 #~ msgid "Medium Items"
 #~ msgstr "Közepes elemek"
-
 #~ msgid "Close"
 #~ msgstr "Bezárás"
+
diff -pruN 1.5.1-1/po/id.po 1.8.4-1/po/id.po
--- 1.5.1-1/po/id.po	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/po/id.po	2010-02-17 17:26:44.000000000 +0000
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: hornsey master\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-11-05 13:19+0000\n"
+"POT-Creation-Date: 2009-11-19 18:12+0000\n"
 "PO-Revision-Date: 2009-10-02 12:46+0700\n"
 "Last-Translator: Andika Triwidada <andika@gmail.com>\n"
 "Language-Team: Indonesian <id@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
-#: ../data/hornsey.desktop.in.h:1 ../src/hornsey.c:704
+#: ../data/hornsey.desktop.in.h:1 ../src/hornsey.c:761
 msgid "Media Player"
 msgstr "Pemutar Media"
 
@@ -23,15 +23,15 @@ msgstr "Pemutar Media"
 msgid "Watch & listen"
 msgstr "Lihat & dengar"
 
-#: ../src/hornsey.c:542
+#: ../src/hornsey.c:597
 msgid "Run in a window"
 msgstr "Jalankan di sebuah jendela"
 
-#: ../src/hornsey.c:544
+#: ../src/hornsey.c:599
 msgid "Size of the window"
 msgstr "Ukuran jendela"
 
-#: ../src/hornsey.c:546
+#: ../src/hornsey.c:601
 msgid "[FILE...]"
 msgstr "[FILE...]"
 
@@ -56,71 +56,14 @@ msgstr[0] "%d album"
 msgid "Queue Albums"
 msgstr "Antrikan Album"
 
-#: ../src/hrn-audio-viewer.c:150 ../src/hrn-cluster-tree.c:29
+#: ../src/hrn-cluster-tree.c:29
 msgid "Unknown Artist"
 msgstr "Artis Tak Dikenal"
 
-#: ../src/hrn-cluster-tree.c:39
-#, c-format
-msgid " and %d more"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:550
-msgid "January"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:550
-msgid "Feburary"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:550
-msgid "March"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:551
-msgid "April"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:551
-msgid "May"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:551
-msgid "June"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:551
-msgid "July"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:552
-msgid "August"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:552
-msgid "September"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:552
-msgid "October"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:553
-msgid "November"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:553
-msgid "December"
-msgstr ""
-
 #: ../src/hrn-image-tile.c:104
 msgid "Display Picture"
 msgstr "Tampilkan Gambar"
 
-#: ../src/hrn-item.c:71
-msgid "Delete"
-msgstr "Hapus"
-
 #: ../src/hrn-month-cluster.c:68
 #, c-format
 msgid "%d photo"
@@ -139,37 +82,14 @@ msgstr "Kosong"
 msgid "Shuffle"
 msgstr "Acak"
 
-#: ../src/hrn-queue.c:1220
+#: ../src/hrn-queue.c:1246
 msgid "Playqueue"
 msgstr "Antrian main"
 
-#: ../src/hrn-queue.c:1228
-#, fuzzy
-msgid "Music Playqueue"
-msgstr "Antrian main"
-
-#: ../src/hrn-queue.c:1230
-msgid "Add music to start"
-msgstr ""
-
 #: ../src/hrn-sidebar.c:182
 msgid "Your local media"
 msgstr "Media lokal anda"
 
-#: ../src/hrn-sidebar-item.c:455
-msgid "Music"
-msgstr ""
-
-#: ../src/hrn-sidebar-item.c:456
-#, fuzzy
-msgid "Pictures"
-msgstr "Tampilkan Gambar"
-
-#: ../src/hrn-sidebar-item.c:457
-#, fuzzy
-msgid "Videos"
-msgstr "Video"
-
 #: ../src/hrn-sidebar-subitem.c:288
 msgid "Rename"
 msgstr "Ganti nama"
@@ -178,16 +98,12 @@ msgstr "Ganti nama"
 msgid "Play Song"
 msgstr "Mainkan Lagu"
 
-#: ../src/hrn-video-player.c:392
+#: ../src/hrn-video-player.c:397
 #, c-format
-msgid ""
-"Sorry, we can't play %s, as we don't have the correct plugin. You could try "
-"searching for ❝gstreamer codecs❞ on the web."
-msgstr ""
-"Maaf, kami tak bisa mainkan %s, karena kami tak punya plugin yang cocok. "
-"Anda dapat mencoba mencari \"gstreamer codecs\" di web."
+msgid "Sorry, we can't play %s, as we don't have the correct plugin. You could try searching for ❝gstreamer codecs❞ on the web."
+msgstr "Maaf, kami tak bisa mainkan %s, karena kami tak punya plugin yang cocok. Anda dapat mencoba mencari \"gstreamer codecs\" di web."
 
-#: ../src/hrn-video-player.c:395
+#: ../src/hrn-video-player.c:401
 msgid "We can't play this"
 msgstr "Kami tak bisa mainkain ini"
 
@@ -195,6 +111,87 @@ msgstr "Kami tak bisa mainkain ini"
 msgid "Play Video"
 msgstr "Mainkan Video"
 
+#: ../src/hrn-cluster-tree.c:552
+msgid "August"
+msgstr "Agustus"
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "July"
+msgstr "Juli"
+
+#: ../src/hrn-cluster-tree.c:39
+#, c-format
+msgid " and %d more"
+msgstr "dan %d lagi"
+
+#: ../src/hrn-cluster-tree.c:550
+msgid "Feburary"
+msgstr "Pebruari"
+
+#: ../src/hrn-cluster-tree.c:550
+msgid "January"
+msgstr "Januari"
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "April"
+msgstr "April"
+
+#: ../src/hrn-cluster-tree.c:550
+msgid "March"
+msgstr "Maret"
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "June"
+msgstr "Juni"
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "May"
+msgstr "Mei"
+
+#: ../src/hrn-cluster-tree.c:552
+msgid "September"
+msgstr "September"
+
+#: ../src/hrn-cluster-tree.c:552
+msgid "October"
+msgstr "Oktober"
+
+#: ../src/hrn-cluster-tree.c:553
+msgid "November"
+msgstr "Nopember"
+
+#: ../src/hrn-cluster-tree.c:553
+msgid "December"
+msgstr "Desember"
+
+#: ../src/hrn-sidebar-item.c:455
+msgid "Music"
+msgstr "Musik"
+
+#: ../src/hrn-queue.c:1256
+msgid "Add music to start"
+msgstr "Tambahkan musik untuk mulai"
+
+#: ../src/hrn-queue.c:1254
+msgid "Music Playqueue"
+msgstr "Antrian Main Musik"
+
+#: ../src/hrn-sidebar-item.c:457
+msgid "Videos"
+msgstr "Video"
+
+#: ../src/hrn-sidebar-item.c:456
+msgid "Pictures"
+msgstr "Gambar"
+
+#: ../src/hrn-video-player.c:395
+#, c-format
+msgid "Sorry, we can't play %s, as we don't have the correct plugin."
+msgstr "Maaf, kami tak bisa mainkan %s, karena kami tak punya plugin yang benar."
+
+#~ msgid "Delete"
+#~ msgstr "Hapus"
+
 #~ msgid "Audio"
 #~ msgstr "Audio"
 
diff -pruN 1.5.1-1/po/it.po 1.8.4-1/po/it.po
--- 1.5.1-1/po/it.po	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/po/it.po	2010-02-17 17:26:44.000000000 +0000
@@ -6,8 +6,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: hornsey\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-11-05 13:19+0000\n"
-"PO-Revision-Date: 2009-10-09 21:30+0200\n"
+"POT-Creation-Date: 2009-11-19 18:12+0000\n"
+"PO-Revision-Date: 2009-11-25 21:57+0100\n"
 "Last-Translator: Milo Casagrande <milo@ubuntu.com>\n"
 "Language-Team: Italian <tp@lists.linux.it>\n"
 "MIME-Version: 1.0\n"
@@ -15,7 +15,7 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: ../data/hornsey.desktop.in.h:1 ../src/hornsey.c:704
+#: ../data/hornsey.desktop.in.h:1 ../src/hornsey.c:761
 msgid "Media Player"
 msgstr "Riproduttore multimediale"
 
@@ -23,15 +23,15 @@ msgstr "Riproduttore multimediale"
 msgid "Watch & listen"
 msgstr "Guarda e ascolta"
 
-#: ../src/hornsey.c:542
+#: ../src/hornsey.c:597
 msgid "Run in a window"
 msgstr "Esegui in una finestra"
 
-#: ../src/hornsey.c:544
+#: ../src/hornsey.c:599
 msgid "Size of the window"
 msgstr "Dimensione della finestra"
 
-#: ../src/hornsey.c:546
+#: ../src/hornsey.c:601
 msgid "[FILE...]"
 msgstr "[FILE...]"
 
@@ -57,71 +57,67 @@ msgstr[1] "%d album"
 msgid "Queue Albums"
 msgstr "Accoda album"
 
-#: ../src/hrn-audio-viewer.c:150 ../src/hrn-cluster-tree.c:29
+#: ../src/hrn-cluster-tree.c:29
 msgid "Unknown Artist"
 msgstr "Artista sconosciuto"
 
 #: ../src/hrn-cluster-tree.c:39
 #, c-format
 msgid " and %d more"
-msgstr ""
+msgstr " e altri %d"
 
 #: ../src/hrn-cluster-tree.c:550
 msgid "January"
-msgstr ""
+msgstr "gennaio"
 
 #: ../src/hrn-cluster-tree.c:550
 msgid "Feburary"
-msgstr ""
+msgstr "febbraio"
 
 #: ../src/hrn-cluster-tree.c:550
 msgid "March"
-msgstr ""
+msgstr "marzo"
 
 #: ../src/hrn-cluster-tree.c:551
 msgid "April"
-msgstr ""
+msgstr "aprile"
 
 #: ../src/hrn-cluster-tree.c:551
 msgid "May"
-msgstr ""
+msgstr "maggio"
 
 #: ../src/hrn-cluster-tree.c:551
 msgid "June"
-msgstr ""
+msgstr "giugno"
 
 #: ../src/hrn-cluster-tree.c:551
 msgid "July"
-msgstr ""
+msgstr "luglio"
 
 #: ../src/hrn-cluster-tree.c:552
 msgid "August"
-msgstr ""
+msgstr "agosto"
 
 #: ../src/hrn-cluster-tree.c:552
 msgid "September"
-msgstr ""
+msgstr "settembre"
 
 #: ../src/hrn-cluster-tree.c:552
 msgid "October"
-msgstr ""
+msgstr "ottobre"
 
 #: ../src/hrn-cluster-tree.c:553
 msgid "November"
-msgstr ""
+msgstr "novembre"
 
 #: ../src/hrn-cluster-tree.c:553
 msgid "December"
-msgstr ""
+msgstr "dicembre"
 
 #: ../src/hrn-image-tile.c:104
 msgid "Display Picture"
 msgstr "Visualizza immagine"
 
-#: ../src/hrn-item.c:71
-msgid "Delete"
-msgstr "Elimina"
-
 #: ../src/hrn-month-cluster.c:68
 #, c-format
 msgid "%d photo"
@@ -141,18 +137,17 @@ msgstr "Vuota"
 msgid "Shuffle"
 msgstr "Mischia"
 
-#: ../src/hrn-queue.c:1220
+#: ../src/hrn-queue.c:1246
 msgid "Playqueue"
 msgstr "Riproduzione"
 
-#: ../src/hrn-queue.c:1228
-#, fuzzy
+#: ../src/hrn-queue.c:1254
 msgid "Music Playqueue"
-msgstr "Riproduzione"
+msgstr "Riproduzione musicale"
 
-#: ../src/hrn-queue.c:1230
+#: ../src/hrn-queue.c:1256
 msgid "Add music to start"
-msgstr ""
+msgstr "Aggiungere musica per iniziare"
 
 #: ../src/hrn-sidebar.c:182
 msgid "Your local media"
@@ -160,15 +155,13 @@ msgstr "File locali"
 
 #: ../src/hrn-sidebar-item.c:455
 msgid "Music"
-msgstr ""
+msgstr "Musica"
 
 #: ../src/hrn-sidebar-item.c:456
-#, fuzzy
 msgid "Pictures"
-msgstr "Visualizza immagine"
+msgstr "Immagini"
 
 #: ../src/hrn-sidebar-item.c:457
-#, fuzzy
 msgid "Videos"
 msgstr "Video"
 
@@ -180,7 +173,12 @@ msgstr "Rinomina"
 msgid "Play Song"
 msgstr "Riproduci brano"
 
-#: ../src/hrn-video-player.c:392
+#: ../src/hrn-video-player.c:395
+#, c-format
+msgid "Sorry, we can't play %s, as we don't have the correct plugin."
+msgstr "Impossibile riprodurre %s poiché non è disponibile il plugin corretto."
+
+#: ../src/hrn-video-player.c:397
 #, c-format
 msgid ""
 "Sorry, we can't play %s, as we don't have the correct plugin. You could try "
@@ -189,7 +187,7 @@ msgstr ""
 "Impossibile riprodurre %s poiché non è disponibile il plugin corretto. È "
 "possibile eseguire una ricerca per «gstreamer codecs» sul web."
 
-#: ../src/hrn-video-player.c:395
+#: ../src/hrn-video-player.c:401
 msgid "We can't play this"
 msgstr "Impossibile riprodurre questo"
 
@@ -197,6 +195,9 @@ msgstr "Impossibile riprodurre questo"
 msgid "Play Video"
 msgstr "Riproduci video"
 
+#~ msgid "Delete"
+#~ msgstr "Elimina"
+
 #~ msgid "Audio"
 #~ msgstr "Audio"
 
diff -pruN 1.5.1-1/po/ja.po 1.8.4-1/po/ja.po
--- 1.5.1-1/po/ja.po	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/po/ja.po	2010-02-17 17:26:44.000000000 +0000
@@ -1,9 +1,9 @@
-#
+# 
 msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-11-05 13:19+0000\n"
+"POT-Creation-Date: 2009-11-19 18:12+0000\n"
 "PO-Revision-Date: \n"
 "Last-Translator: GLSJPN_Yukari <yukarix.yamashita@intel.com>\n"
 "Language-Team: \n"
@@ -14,7 +14,7 @@ msgstr ""
 "X-Poedit-Language: Japanese\n"
 "X-Poedit-SourceCharset: utf-8\n"
 
-#: ../data/hornsey.desktop.in.h:1 ../src/hornsey.c:704
+#: ../data/hornsey.desktop.in.h:1 ../src/hornsey.c:761
 msgid "Media Player"
 msgstr "メディアプレイヤー"
 
@@ -22,15 +22,15 @@ msgstr "メディアプレイヤー"
 msgid "Watch & listen"
 msgstr "観る & 聴く"
 
-#: ../src/hornsey.c:542
+#: ../src/hornsey.c:597
 msgid "Run in a window"
 msgstr "ウィンドウ内で実行"
 
-#: ../src/hornsey.c:544
+#: ../src/hornsey.c:599
 msgid "Size of the window"
 msgstr "ウィンドウのサイズ"
 
-#: ../src/hornsey.c:546
+#: ../src/hornsey.c:601
 msgid "[FILE...]"
 msgstr "[ファイル...]"
 
@@ -58,71 +58,14 @@ msgstr[1] "アルバム： %d"
 msgid "Queue Albums"
 msgstr "キューに入れる"
 
-#: ../src/hrn-audio-viewer.c:150 ../src/hrn-cluster-tree.c:29
+#: ../src/hrn-cluster-tree.c:29
 msgid "Unknown Artist"
 msgstr "不明なアーチスト"
 
-#: ../src/hrn-cluster-tree.c:39
-#, c-format
-msgid " and %d more"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:550
-msgid "January"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:550
-msgid "Feburary"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:550
-msgid "March"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:551
-msgid "April"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:551
-msgid "May"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:551
-msgid "June"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:551
-msgid "July"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:552
-msgid "August"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:552
-msgid "September"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:552
-msgid "October"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:553
-msgid "November"
-msgstr ""
-
-#: ../src/hrn-cluster-tree.c:553
-msgid "December"
-msgstr ""
-
 #: ../src/hrn-image-tile.c:104
 msgid "Display Picture"
 msgstr "画像の表示"
 
-#: ../src/hrn-item.c:71
-msgid "Delete"
-msgstr "削除"
-
 #: ../src/hrn-month-cluster.c:68
 #, c-format
 msgid "%d photo"
@@ -143,37 +86,14 @@ msgstr "何もありません"
 msgid "Shuffle"
 msgstr "シャッフル"
 
-#: ../src/hrn-queue.c:1220
+#: ../src/hrn-queue.c:1246
 msgid "Playqueue"
 msgstr "Playqueue"
 
-#: ../src/hrn-queue.c:1228
-#, fuzzy
-msgid "Music Playqueue"
-msgstr "Playqueue"
-
-#: ../src/hrn-queue.c:1230
-msgid "Add music to start"
-msgstr ""
-
 #: ../src/hrn-sidebar.c:182
 msgid "Your local media"
 msgstr "ローカルメディア"
 
-#: ../src/hrn-sidebar-item.c:455
-msgid "Music"
-msgstr ""
-
-#: ../src/hrn-sidebar-item.c:456
-#, fuzzy
-msgid "Pictures"
-msgstr "画像の表示"
-
-#: ../src/hrn-sidebar-item.c:457
-#, fuzzy
-msgid "Videos"
-msgstr "ビデオ"
-
 #: ../src/hrn-sidebar-subitem.c:288
 msgid "Rename"
 msgstr "名前の変更"
@@ -182,16 +102,12 @@ msgstr "名前の変更"
 msgid "Play Song"
 msgstr "曲の再生"
 
-#: ../src/hrn-video-player.c:392
+#: ../src/hrn-video-player.c:397
 #, c-format
-msgid ""
-"Sorry, we can't play %s, as we don't have the correct plugin. You could try "
-"searching for ❝gstreamer codecs❞ on the web."
-msgstr ""
-"適切なプラグインがないので、%s を再生できません。Web 上で ❝gstreamer codecs❞ "
-"を検索してください。"
+msgid "Sorry, we can't play %s, as we don't have the correct plugin. You could try searching for ❝gstreamer codecs❞ on the web."
+msgstr "適切なプラグインがないので、%s を再生できません。Web 上で ❝gstreamer codecs❞ を検索してください。"
 
-#: ../src/hrn-video-player.c:395
+#: ../src/hrn-video-player.c:401
 msgid "We can't play this"
 msgstr "再生できません"
 
@@ -199,6 +115,87 @@ msgstr "再生できません"
 msgid "Play Video"
 msgstr "ビデオの再生"
 
+#: ../src/hrn-cluster-tree.c:552
+msgid "August"
+msgstr "8 月"
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "July"
+msgstr "7 月"
+
+#: ../src/hrn-cluster-tree.c:39
+#, c-format
+msgid " and %d more"
+msgstr "および %d 以上"
+
+#: ../src/hrn-cluster-tree.c:550
+msgid "Feburary"
+msgstr "2 月"
+
+#: ../src/hrn-cluster-tree.c:550
+msgid "January"
+msgstr "1 月"
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "April"
+msgstr "4 月"
+
+#: ../src/hrn-cluster-tree.c:550
+msgid "March"
+msgstr "3 月"
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "June"
+msgstr "6 月"
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "May"
+msgstr "5 月"
+
+#: ../src/hrn-cluster-tree.c:552
+msgid "September"
+msgstr "9 月"
+
+#: ../src/hrn-cluster-tree.c:552
+msgid "October"
+msgstr "10 月"
+
+#: ../src/hrn-cluster-tree.c:553
+msgid "November"
+msgstr "11 月"
+
+#: ../src/hrn-cluster-tree.c:553
+msgid "December"
+msgstr "12 月"
+
+#: ../src/hrn-sidebar-item.c:455
+msgid "Music"
+msgstr "楽曲"
+
+#: ../src/hrn-queue.c:1256
+msgid "Add music to start"
+msgstr "開始する楽曲を追加"
+
+#: ../src/hrn-queue.c:1254
+msgid "Music Playqueue"
+msgstr "楽曲プレイキュー"
+
+#: ../src/hrn-sidebar-item.c:457
+msgid "Videos"
+msgstr "ビデオ"
+
+#: ../src/hrn-sidebar-item.c:456
+msgid "Pictures"
+msgstr "写真"
+
+#: ../src/hrn-video-player.c:395
+#, c-format
+msgid "Sorry, we can't play %s, as we don't have the correct plugin."
+msgstr "適切なプラグインがないので、%s を再生できません。"
+
+#~ msgid "Delete"
+#~ msgstr "削除"
+
 #~ msgid "Audio"
 #~ msgstr "オーディオ"
 
diff -pruN 1.5.1-1/po/ko.po 1.8.4-1/po/ko.po
--- 1.5.1-1/po/ko.po	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/po/ko.po	2010-02-17 17:26:44.000000000 +0000
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-11-05 13:19+0000\n"
+"POT-Creation-Date: 2009-11-19 18:12+0000\n"
 "PO-Revision-Date: \n"
 "Last-Translator: GLSKOR_SunKim <sunx.kim@intel.com>\n"
 "Language-Team: \n"
@@ -13,7 +13,8 @@ msgstr ""
 "X-Poedit-Language: Korean\n"
 "X-Poedit-SourceCharset: utf-8\n"
 
-#: ../data/hornsey.desktop.in.h:1 ../src/hornsey.c:704
+#: ../data/hornsey.desktop.in.h:1
+#: ../src/hornsey.c:761
 msgid "Media Player"
 msgstr "미디어 플레이어"
 
@@ -21,21 +22,24 @@ msgstr "미디어 플레이어"
 msgid "Watch & listen"
 msgstr "보기 및 듣기"
 
-#: ../src/hornsey.c:542
+#: ../src/hornsey.c:597
 msgid "Run in a window"
 msgstr "창에서 실행함"
 
-#: ../src/hornsey.c:544
+#: ../src/hornsey.c:599
 msgid "Size of the window"
 msgstr "창의 크기"
 
-#: ../src/hornsey.c:546
+#: ../src/hornsey.c:601
 msgid "[FILE...]"
 msgstr "[파일...]"
 
-#: ../src/hrn-album-cluster.c:75 ../src/hrn-cluster-tree.c:280
-#: ../src/hrn-cluster-tree.c:577 ../src/hrn-cluster-tree.c:578
-#: ../src/hrn-cluster-tree.c:584 ../src/hrn-cluster-tree.c:590
+#: ../src/hrn-album-cluster.c:75
+#: ../src/hrn-cluster-tree.c:280
+#: ../src/hrn-cluster-tree.c:577
+#: ../src/hrn-cluster-tree.c:578
+#: ../src/hrn-cluster-tree.c:584
+#: ../src/hrn-cluster-tree.c:590
 #: ../src/hrn-queue.c:965
 msgid "Unknown"
 msgstr "무명 아티스트"
@@ -44,7 +48,8 @@ msgstr "무명 아티스트"
 msgid "Queue Album"
 msgstr "앨범 대기열 "
 
-#: ../src/hrn-artist-cluster.c:72 ../src/hrn-year-cluster.c:67
+#: ../src/hrn-artist-cluster.c:72
+#: ../src/hrn-year-cluster.c:67
 #, c-format
 msgid "%d album"
 msgid_plural "%d albums"
@@ -55,71 +60,67 @@ msgstr[1] "%d 앨범들"
 msgid "Queue Albums"
 msgstr "앨범 대기열 "
 
-#: ../src/hrn-audio-viewer.c:150 ../src/hrn-cluster-tree.c:29
+#: ../src/hrn-cluster-tree.c:29
 msgid "Unknown Artist"
 msgstr "무명의 아티스트"
 
 #: ../src/hrn-cluster-tree.c:39
 #, c-format
 msgid " and %d more"
-msgstr ""
+msgstr "및 %d 추가"
 
 #: ../src/hrn-cluster-tree.c:550
 msgid "January"
-msgstr ""
+msgstr "1월"
 
 #: ../src/hrn-cluster-tree.c:550
 msgid "Feburary"
-msgstr ""
+msgstr "2월"
 
 #: ../src/hrn-cluster-tree.c:550
 msgid "March"
-msgstr ""
+msgstr "3월"
 
 #: ../src/hrn-cluster-tree.c:551
 msgid "April"
-msgstr ""
+msgstr "4월"
 
 #: ../src/hrn-cluster-tree.c:551
 msgid "May"
-msgstr ""
+msgstr "5월"
 
 #: ../src/hrn-cluster-tree.c:551
 msgid "June"
-msgstr ""
+msgstr "6월"
 
 #: ../src/hrn-cluster-tree.c:551
 msgid "July"
-msgstr ""
+msgstr "7월"
 
 #: ../src/hrn-cluster-tree.c:552
 msgid "August"
-msgstr ""
+msgstr "8월"
 
 #: ../src/hrn-cluster-tree.c:552
 msgid "September"
-msgstr ""
+msgstr "9월"
 
 #: ../src/hrn-cluster-tree.c:552
 msgid "October"
-msgstr ""
+msgstr "10월"
 
 #: ../src/hrn-cluster-tree.c:553
 msgid "November"
-msgstr ""
+msgstr "11월"
 
 #: ../src/hrn-cluster-tree.c:553
 msgid "December"
-msgstr ""
+msgstr "12월"
 
 #: ../src/hrn-image-tile.c:104
 msgid "Display Picture"
 msgstr "사진 디스플레이"
 
-#: ../src/hrn-item.c:71
-msgid "Delete"
-msgstr "삭제"
-
 #: ../src/hrn-month-cluster.c:68
 #, c-format
 msgid "%d photo"
@@ -127,7 +128,8 @@ msgid_plural "%d photos"
 msgstr[0] "%d 사진"
 msgstr[1] "%d 사진들"
 
-#: ../src/hrn-month-cluster.c:140 ../src/hrn-year-cluster.c:139
+#: ../src/hrn-month-cluster.c:140
+#: ../src/hrn-year-cluster.c:139
 msgid "Start Slideshow"
 msgstr "슬라이드쇼 시작"
 
@@ -139,18 +141,17 @@ msgstr "비어 있음"
 msgid "Shuffle"
 msgstr "순서 섞기"
 
-#: ../src/hrn-queue.c:1220
+#: ../src/hrn-queue.c:1246
 msgid "Playqueue"
 msgstr "재생줄"
 
-#: ../src/hrn-queue.c:1228
-#, fuzzy
+#: ../src/hrn-queue.c:1254
 msgid "Music Playqueue"
-msgstr "재생줄"
+msgstr "음악 재생줄"
 
-#: ../src/hrn-queue.c:1230
+#: ../src/hrn-queue.c:1256
 msgid "Add music to start"
-msgstr ""
+msgstr "음악 시작 추가"
 
 #: ../src/hrn-sidebar.c:182
 msgid "Your local media"
@@ -158,15 +159,13 @@ msgstr "로컬 미디어"
 
 #: ../src/hrn-sidebar-item.c:455
 msgid "Music"
-msgstr ""
+msgstr "음악"
 
 #: ../src/hrn-sidebar-item.c:456
-#, fuzzy
 msgid "Pictures"
-msgstr "사진 디스플레이"
+msgstr "사진 "
 
 #: ../src/hrn-sidebar-item.c:457
-#, fuzzy
 msgid "Videos"
 msgstr "비디오"
 
@@ -178,16 +177,17 @@ msgstr "이름 다시 만들기"
 msgid "Play Song"
 msgstr "노래 재생"
 
-#: ../src/hrn-video-player.c:392
+#: ../src/hrn-video-player.c:395
 #, c-format
-msgid ""
-"Sorry, we can't play %s, as we don't have the correct plugin. You could try "
-"searching for ❝gstreamer codecs❞ on the web."
-msgstr ""
-"죄송합니다. 적절한 플러그인이 없어서 %s(을)를 재생할 수 없습니다. 웹사이트에"
-"서 \"gstreamer codecs\"를 찾아보십시오."
+msgid "Sorry, we can't play %s, as we don't have the correct plugin."
+msgstr "죄송합니다. 적절한 플러그인이 없어서 %s(을)를 재생할 수 없습니다. "
 
-#: ../src/hrn-video-player.c:395
+#: ../src/hrn-video-player.c:397
+#, c-format
+msgid "Sorry, we can't play %s, as we don't have the correct plugin. You could try searching for ❝gstreamer codecs❞ on the web."
+msgstr "죄송합니다. 적절한 플러그인이 없어서 %s(을)를 재생할 수 없습니다. 웹사이트에서 \"gstreamer codecs\"를 찾아보십시오."
+
+#: ../src/hrn-video-player.c:401
 msgid "We can't play this"
 msgstr "재생할 수 없습니다."
 
@@ -195,38 +195,30 @@ msgstr "재생할 수 없습니다."
 msgid "Play Video"
 msgstr "비디오 재생"
 
+#~ msgid "Delete"
+#~ msgstr "삭제"
 #~ msgid "Audio"
 #~ msgstr "오디오"
-
 #~ msgid "Image"
 #~ msgstr "이미지"
-
 #~ msgid "All"
 #~ msgstr "모두"
-
 #~ msgid "Images"
 #~ msgstr "이미지"
-
 #~ msgid "Overview"
 #~ msgstr "개요"
-
 #~ msgid "Collections"
 #~ msgstr "컬렉션"
-
 #~ msgid "Small Items"
 #~ msgstr "소형 아이템"
-
 #~ msgid "Large Items"
 #~ msgstr "대형 아이템"
-
 #~ msgid "Theatre"
 #~ msgstr "영화관"
-
 #~ msgid "Show"
 #~ msgstr "보기"
-
 #~ msgid "Medium Items"
 #~ msgstr "중형 아이템"
-
 #~ msgid "Close"
 #~ msgstr "닫기"
+
diff -pruN 1.5.1-1/po/pl.po 1.8.4-1/po/pl.po
--- 1.5.1-1/po/pl.po	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/po/pl.po	2010-02-17 17:26:44.000000000 +0000
@@ -7,19 +7,19 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Moblin\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-11-05 13:19+0000\n"
+"POT-Creation-Date: 2009-11-19 18:12+0000\n"
 "PO-Revision-Date: \n"
-"Last-Translator: Michał Sawicz <michal@sawicz.net>\n"
+"Last-Translator: Andrzej Zaborowski <andrew.zaborowski@intel.com>\n"
 "Language-Team: Moblin\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
-"|| n%100>=20) ? 1 : 2);\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
 "X-Poedit-Language: Polish\n"
 "X-Poedit-SourceCharset: utf-8\n"
 
-#: ../data/hornsey.desktop.in.h:1 ../src/hornsey.c:704
+#: ../data/hornsey.desktop.in.h:1
+#: ../src/hornsey.c:761
 msgid "Media Player"
 msgstr "Odtwarzacz"
 
@@ -27,21 +27,24 @@ msgstr "Odtwarzacz"
 msgid "Watch & listen"
 msgstr "Oglądaj, słuchaj"
 
-#: ../src/hornsey.c:542
+#: ../src/hornsey.c:597
 msgid "Run in a window"
 msgstr "Uruchom w okienku"
 
-#: ../src/hornsey.c:544
+#: ../src/hornsey.c:599
 msgid "Size of the window"
 msgstr "Rozmiar okienka"
 
-#: ../src/hornsey.c:546
+#: ../src/hornsey.c:601
 msgid "[FILE...]"
 msgstr "[PLIK...]"
 
-#: ../src/hrn-album-cluster.c:75 ../src/hrn-cluster-tree.c:280
-#: ../src/hrn-cluster-tree.c:577 ../src/hrn-cluster-tree.c:578
-#: ../src/hrn-cluster-tree.c:584 ../src/hrn-cluster-tree.c:590
+#: ../src/hrn-album-cluster.c:75
+#: ../src/hrn-cluster-tree.c:280
+#: ../src/hrn-cluster-tree.c:577
+#: ../src/hrn-cluster-tree.c:578
+#: ../src/hrn-cluster-tree.c:584
+#: ../src/hrn-cluster-tree.c:590
 #: ../src/hrn-queue.c:965
 msgid "Unknown"
 msgstr "Nieznany"
@@ -50,7 +53,8 @@ msgstr "Nieznany"
 msgid "Queue Album"
 msgstr "Dodaj album do kolejki"
 
-#: ../src/hrn-artist-cluster.c:72 ../src/hrn-year-cluster.c:67
+#: ../src/hrn-artist-cluster.c:72
+#: ../src/hrn-year-cluster.c:67
 #, c-format
 msgid "%d album"
 msgid_plural "%d albums"
@@ -62,71 +66,67 @@ msgstr[2] "%d albumów"
 msgid "Queue Albums"
 msgstr "Dodaj albumy do kolejki"
 
-#: ../src/hrn-audio-viewer.c:150 ../src/hrn-cluster-tree.c:29
+#: ../src/hrn-cluster-tree.c:29
 msgid "Unknown Artist"
 msgstr "Nieznany artysta"
 
 #: ../src/hrn-cluster-tree.c:39
 #, c-format
 msgid " and %d more"
-msgstr ""
+msgstr " i %d innych"
 
 #: ../src/hrn-cluster-tree.c:550
 msgid "January"
-msgstr ""
+msgstr "Styczeń"
 
 #: ../src/hrn-cluster-tree.c:550
 msgid "Feburary"
-msgstr ""
+msgstr "Luty"
 
 #: ../src/hrn-cluster-tree.c:550
 msgid "March"
-msgstr ""
+msgstr "Marzec"
 
 #: ../src/hrn-cluster-tree.c:551
 msgid "April"
-msgstr ""
+msgstr "Kwiecień"
 
 #: ../src/hrn-cluster-tree.c:551
 msgid "May"
-msgstr ""
+msgstr "Maj"
 
 #: ../src/hrn-cluster-tree.c:551
 msgid "June"
-msgstr ""
+msgstr "Czerwiec"
 
 #: ../src/hrn-cluster-tree.c:551
 msgid "July"
-msgstr ""
+msgstr "Lipiec"
 
 #: ../src/hrn-cluster-tree.c:552
 msgid "August"
-msgstr ""
+msgstr "Sierpień"
 
 #: ../src/hrn-cluster-tree.c:552
 msgid "September"
-msgstr ""
+msgstr "Wrzesień"
 
 #: ../src/hrn-cluster-tree.c:552
 msgid "October"
-msgstr ""
+msgstr "Październik"
 
 #: ../src/hrn-cluster-tree.c:553
 msgid "November"
-msgstr ""
+msgstr "Listopad"
 
 #: ../src/hrn-cluster-tree.c:553
 msgid "December"
-msgstr ""
+msgstr "Grudzień"
 
 #: ../src/hrn-image-tile.c:104
 msgid "Display Picture"
 msgstr "Wyświetl obrazek"
 
-#: ../src/hrn-item.c:71
-msgid "Delete"
-msgstr "Usuń"
-
 #: ../src/hrn-month-cluster.c:68
 #, c-format
 msgid "%d photo"
@@ -135,7 +135,8 @@ msgstr[0] "%d zdjęcie"
 msgstr[1] "%d zdjęcia"
 msgstr[2] "%d zdjęć"
 
-#: ../src/hrn-month-cluster.c:140 ../src/hrn-year-cluster.c:139
+#: ../src/hrn-month-cluster.c:140
+#: ../src/hrn-year-cluster.c:139
 msgid "Start Slideshow"
 msgstr "Uruchom pokaz slajdów"
 
@@ -147,18 +148,19 @@ msgstr "Pusty"
 msgid "Shuffle"
 msgstr "Przemieszane"
 
-#: ../src/hrn-queue.c:1220
+#: ../src/hrn-queue.c:1246
 msgid "Playqueue"
 msgstr "Playlista"
 
-#: ../src/hrn-queue.c:1228
-#, fuzzy
+#: ../src/hrn-queue.c:1254
 msgid "Music Playqueue"
 msgstr "Playlista"
 
-#: ../src/hrn-queue.c:1230
+# FIXME: What's the context here?
+# Code is currently #if 0'ed out in hornsey
+#: ../src/hrn-queue.c:1256
 msgid "Add music to start"
-msgstr ""
+msgstr "Dodaj muzykę"
 
 #: ../src/hrn-sidebar.c:182
 msgid "Your local media"
@@ -166,15 +168,13 @@ msgstr "Twoje media"
 
 #: ../src/hrn-sidebar-item.c:455
 msgid "Music"
-msgstr ""
+msgstr "Muzyka"
 
 #: ../src/hrn-sidebar-item.c:456
-#, fuzzy
 msgid "Pictures"
-msgstr "Wyświetl obrazek"
+msgstr "Zdjęcia"
 
 #: ../src/hrn-sidebar-item.c:457
-#, fuzzy
 msgid "Videos"
 msgstr "Wideo"
 
@@ -187,16 +187,18 @@ msgid "Play Song"
 msgstr "Odtwórz utwór"
 
 # Note: rather colloquial wording
-#: ../src/hrn-video-player.c:392
+#: ../src/hrn-video-player.c:395
 #, c-format
-msgid ""
-"Sorry, we can't play %s, as we don't have the correct plugin. You could try "
-"searching for ❝gstreamer codecs❞ on the web."
-msgstr ""
-"Niestety nie możemy puścić %s bo nie mamy odpowiedniej wtyczki. Możesz "
-"spróbować wyszukać ❝gstreamer codecs❞ na www."
+msgid "Sorry, we can't play %s, as we don't have the correct plugin."
+msgstr "Niestety nie możemy puścić %s bo nie mamy odpowiedniej wtyczki."
 
-#: ../src/hrn-video-player.c:395
+# Note: rather colloquial wording
+#: ../src/hrn-video-player.c:397
+#, c-format
+msgid "Sorry, we can't play %s, as we don't have the correct plugin. You could try searching for ❝gstreamer codecs❞ on the web."
+msgstr "Niestety nie możemy puścić %s bo nie mamy odpowiedniej wtyczki. Możesz spróbować wyszukać ❝gstreamer codecs❞ na www."
+
+#: ../src/hrn-video-player.c:401
 msgid "We can't play this"
 msgstr "Nie można odtworzyć"
 
@@ -204,39 +206,18 @@ msgstr "Nie można odtworzyć"
 msgid "Play Video"
 msgstr "Odtwórz wideo"
 
+#~ msgid "Delete"
+#~ msgstr "Usuń"
 #~ msgid "Audio"
 #~ msgstr "Dźwięk"
-
 #~ msgid "Image"
 #~ msgstr "Zdjęcie"
-
 #~ msgid "All"
 #~ msgstr "Wszystko"
-
 #~ msgid "Images"
 #~ msgstr "Zdjęcia"
-
 #~ msgid "Overview"
 #~ msgstr "Widok ogólny"
-
 #~ msgid "Collections"
 #~ msgstr "Kolekcje"
 
-# <See rationale in Hornsey.Moblin2-UI.es.po>
-#~ msgid "Small Items"
-#~ msgstr "Małe"
-
-#~ msgid "Large Items"
-#~ msgstr "Duże"
-
-#~ msgid "Theatre"
-#~ msgstr "Kino"
-
-#~ msgid "Show"
-#~ msgstr "Pokaż"
-
-#~ msgid "Medium Items"
-#~ msgstr "Średnie"
-
-#~ msgid "Close"
-#~ msgstr "Zamknij"
diff -pruN 1.5.1-1/po/POTFILES.in 1.8.4-1/po/POTFILES.in
--- 1.5.1-1/po/POTFILES.in	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/po/POTFILES.in	2010-02-17 17:26:44.000000000 +0000
@@ -15,15 +15,12 @@ src/hrn-image-player.c
 src/hrn-image-tile.c
 src/hrn-month-cluster.c
 src/hrn-pin-manager.c
-src/hrn-popup.c
 src/hrn-queue.c
+src/hrn-queue-item.c
 src/hrn-searchbar.c
 src/hrn-sidebar.c
 src/hrn-sidebar-item.c
-src/hrn-sidebar-item-factory.c
 src/hrn-sidebar-subitem.c
-src/hrn-source.c
-src/hrn-source-manager.c
 src/hrn-spinner.c
 src/hrn-square-clone.c
 src/hrn-state-manager.c
diff -pruN 1.5.1-1/po/pt_BR.po 1.8.4-1/po/pt_BR.po
--- 1.5.1-1/po/pt_BR.po	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/po/pt_BR.po	2010-02-17 17:26:44.000000000 +0000
@@ -1,11 +1,11 @@
 # LSPTB_Gabor <gaborx.k.becht@intel.com>, 2009.
 # Og Maciel <ogmaciel@gnome.org>, 2009.
-#
+# 
 msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-10-16 11:25+0000\n"
+"POT-Creation-Date: 2009-11-19 18:12+0000\n"
 "PO-Revision-Date: 2009-11-09 14:26-0500\n"
 "Last-Translator: Og Maciel <ogmaciel@gnome.org>\n"
 "Language-Team: Moblin <l10n@moblin.org>\n"
@@ -16,12 +16,30 @@ msgstr ""
 "X-Poedit-Language: Portuguese\n"
 "X-Poedit-SourceCharset: utf-8\n"
 
-#: ../src/hornsey.c:513
+#: ../data/hornsey.desktop.in.h:1 ../src/hornsey.c:761
+msgid "Media Player"
+msgstr "Reprodutor de mídia"
+
+#: ../data/hornsey.desktop.in.h:2
+msgid "Watch & listen"
+msgstr "Observe e ouça"
+
+#: ../src/hornsey.c:597
+msgid "Run in a window"
+msgstr "Executar em uma janela"
+
+#: ../src/hornsey.c:599
+msgid "Size of the window"
+msgstr "Tamanho da janela"
+
+#: ../src/hornsey.c:601
 msgid "[FILE...]"
 msgstr "[ARQUIVO...]"
 
-#: ../src/hrn-album-cluster.c:75
-#: ../src/hrn-queue.c:960
+#: ../src/hrn-album-cluster.c:75 ../src/hrn-cluster-tree.c:280
+#: ../src/hrn-cluster-tree.c:577 ../src/hrn-cluster-tree.c:578
+#: ../src/hrn-cluster-tree.c:584 ../src/hrn-cluster-tree.c:590
+#: ../src/hrn-queue.c:965
 msgid "Unknown"
 msgstr "Desconhecido"
 
@@ -29,8 +47,7 @@ msgstr "Desconhecido"
 msgid "Queue Album"
 msgstr "Enfileirar álbum"
 
-#: ../src/hrn-artist-cluster.c:72
-#: ../src/hrn-year-cluster.c:67
+#: ../src/hrn-artist-cluster.c:72 ../src/hrn-year-cluster.c:67
 #, c-format
 msgid "%d album"
 msgid_plural "%d albums"
@@ -41,6 +58,10 @@ msgstr[1] "%d álbuns"
 msgid "Queue Albums"
 msgstr "Enfileirar álbuns"
 
+#: ../src/hrn-cluster-tree.c:29
+msgid "Unknown Artist"
+msgstr "Artista desconhecido"
+
 #: ../src/hrn-image-tile.c:104
 msgid "Display Picture"
 msgstr "Mostrar imagem"
@@ -52,26 +73,22 @@ msgid_plural "%d photos"
 msgstr[0] "%d foto"
 msgstr[1] "%d fotos"
 
-#: ../src/hrn-queue.c:252
+#: ../src/hrn-month-cluster.c:140 ../src/hrn-year-cluster.c:139
+msgid "Start Slideshow"
+msgstr "Iniciar apresentação de slides"
+
+#: ../src/hrn-queue.c:254
 msgid "Empty"
 msgstr "Vazio"
 
+#: ../src/hrn-queue.c:255
+msgid "Shuffle"
+msgstr "Embaralhar"
+
 #: ../src/hrn-sidebar.c:182
 msgid "Your local media"
 msgstr "Sua mídia local"
 
-#: ../src/hrn-sidebar-item.c:432
-msgid "Audio"
-msgstr "Áudio"
-
-#: ../src/hrn-sidebar-item.c:433
-msgid "Video"
-msgstr "Vídeo"
-
-#: ../src/hrn-sidebar-item.c:434
-msgid "Image"
-msgstr "Imagem"
-
 #: ../src/hrn-sidebar-subitem.c:288
 msgid "Rename"
 msgstr "Renomear"
@@ -80,12 +97,12 @@ msgstr "Renomear"
 msgid "Play Song"
 msgstr "Reproduzir música"
 
-#: ../src/hrn-video-player.c:389
+#: ../src/hrn-video-player.c:397
 #, c-format
 msgid "Sorry, we can't play %s, as we don't have the correct plugin. You could try searching for ❝gstreamer codecs❞ on the web."
 msgstr "Desculpe, não podemos reproduzir %s porque não temos o plug-in correto. Tente procurar por \"gstreamer codecs\" na web."
 
-#: ../src/hrn-video-player.c:392
+#: ../src/hrn-video-player.c:401
 msgid "We can't play this"
 msgstr "Não é possível reproduzir isso"
 
@@ -93,54 +110,123 @@ msgstr "Não é possível reproduzir iss
 msgid "Play Video"
 msgstr "Reproduzir vídeo"
 
-#: ../data/hornsey.desktop.in.h:1
-#: ../src/hornsey.c:671
-msgid "Media Player"
-msgstr "Reprodutor de mídia"
+#: ../src/hrn-cluster-tree.c:552
+msgid "August"
+msgstr "agôsto"
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "July"
+msgstr "julho"
 
-#: ../src/hornsey.c:509
-msgid "Run in a window"
-msgstr "Executar em uma janela"
+#: ../src/hrn-cluster-tree.c:39
+#, c-format
+msgid " and %d more"
+msgstr "e mais %d"
 
-#: ../data/hornsey.desktop.in.h:2
-msgid "Watch & listen"
-msgstr "Observe e ouça"
+#: ../src/hrn-cluster-tree.c:550
+msgid "Feburary"
+msgstr "fevereiro"
+
+#: ../src/hrn-cluster-tree.c:550
+msgid "January"
+msgstr "janeiro"
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "April"
+msgstr "abril"
+
+#: ../src/hrn-cluster-tree.c:550
+msgid "March"
+msgstr "março"
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "June"
+msgstr "junho"
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "May"
+msgstr "maio"
+
+#: ../src/hrn-cluster-tree.c:552
+msgid "September"
+msgstr "setembro"
+
+#: ../src/hrn-cluster-tree.c:552
+msgid "October"
+msgstr "outubro"
+
+#: ../src/hrn-cluster-tree.c:553
+msgid "November"
+msgstr "novembro"
+
+#: ../src/hrn-cluster-tree.c:553
+msgid "December"
+msgstr "dezembro"
+
+#: ../src/hrn-queue.c:1246
+msgid "Playqueue"
+msgstr "Fila para tocar"
+
+#: ../src/hrn-sidebar-item.c:455
+msgid "Music"
+msgstr "Música"
+
+#: ../src/hrn-queue.c:1256
+msgid "Add music to start"
+msgstr "Adicionar música para iniciar"
+
+#: ../src/hrn-queue.c:1254
+msgid "Music Playqueue"
+msgstr "Músicas para tocar"
+
+#: ../src/hrn-sidebar-item.c:457
+msgid "Videos"
+msgstr "Vídeos"
+
+#: ../src/hrn-sidebar-item.c:456
+msgid "Pictures"
+msgstr "Imagens"
 
-#: ../src/hornsey.c:511
-msgid "Size of the window"
-msgstr "Tamanho da janela"
+#: ../src/hrn-video-player.c:395
+#, c-format
+msgid "Sorry, we can't play %s, as we don't have the correct plugin."
+msgstr "Desculpe, não podemos reproduzir %s porque não temos o plug-in correto."
 
-#: ../src/hrn-month-cluster.c:140
-#: ../src/hrn-year-cluster.c:139
-msgid "Start Slideshow"
-msgstr "Iniciar apresentação de slides"
+#~ msgid "Audio"
+#~ msgstr "Áudio"
 
-#: ../src/hrn-queue.c:253
-msgid "Shuffle"
-msgstr "Embaralhar"
+#~ msgid "Image"
+#~ msgstr "Imagem"
 
-#~ msgid "Unknown Artist"
-#~ msgstr "Artista desconhecido"
 #~ msgid "Delete"
 #~ msgstr "Excluir"
+
 #~ msgid "All"
 #~ msgstr "Todos"
+
 #~ msgid "Images"
 #~ msgstr "Imagens"
+
 #~ msgid "Overview"
 #~ msgstr "Visão geral"
+
 #~ msgid "Collections"
 #~ msgstr "Coleções"
+
 #~ msgid "Small Items"
 #~ msgstr "Itens pequenos"
+
 #~ msgid "Large Items"
 #~ msgstr "Itens grandes"
+
 #~ msgid "Theatre"
 #~ msgstr "Cinema"
+
 #~ msgid "Show"
 #~ msgstr "Mostrar"
+
 #~ msgid "Medium Items"
 #~ msgstr "Itens médios"
+
 #~ msgid "Close"
 #~ msgstr "Fechar"
-
diff -pruN 1.5.1-1/po/sv.po 1.8.4-1/po/sv.po
--- 1.5.1-1/po/sv.po	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/po/sv.po	2010-02-17 17:26:44.000000000 +0000
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-11-05 13:19+0000\n"
+"POT-Creation-Date: 2009-11-19 18:12+0000\n"
 "PO-Revision-Date: \n"
 "Last-Translator: GLSSVE_GMartinson <gmartinson@gmail.com>\n"
 "Language-Team: \n"
@@ -13,7 +13,8 @@ msgstr ""
 "X-Poedit-Language: Swedish\n"
 "X-Poedit-SourceCharset: utf-8\n"
 
-#: ../data/hornsey.desktop.in.h:1 ../src/hornsey.c:704
+#: ../data/hornsey.desktop.in.h:1
+#: ../src/hornsey.c:761
 msgid "Media Player"
 msgstr "Mediaspelare"
 
@@ -21,21 +22,24 @@ msgstr "Mediaspelare"
 msgid "Watch & listen"
 msgstr "Se & hör"
 
-#: ../src/hornsey.c:542
+#: ../src/hornsey.c:597
 msgid "Run in a window"
 msgstr "Kör i fönster"
 
-#: ../src/hornsey.c:544
+#: ../src/hornsey.c:599
 msgid "Size of the window"
 msgstr "Fönsterstorlek"
 
-#: ../src/hornsey.c:546
+#: ../src/hornsey.c:601
 msgid "[FILE...]"
 msgstr "[FIL...]"
 
-#: ../src/hrn-album-cluster.c:75 ../src/hrn-cluster-tree.c:280
-#: ../src/hrn-cluster-tree.c:577 ../src/hrn-cluster-tree.c:578
-#: ../src/hrn-cluster-tree.c:584 ../src/hrn-cluster-tree.c:590
+#: ../src/hrn-album-cluster.c:75
+#: ../src/hrn-cluster-tree.c:280
+#: ../src/hrn-cluster-tree.c:577
+#: ../src/hrn-cluster-tree.c:578
+#: ../src/hrn-cluster-tree.c:584
+#: ../src/hrn-cluster-tree.c:590
 #: ../src/hrn-queue.c:965
 msgid "Unknown"
 msgstr "Okänd "
@@ -44,7 +48,8 @@ msgstr "Okänd "
 msgid "Queue Album"
 msgstr "Lägg till i kön för album"
 
-#: ../src/hrn-artist-cluster.c:72 ../src/hrn-year-cluster.c:67
+#: ../src/hrn-artist-cluster.c:72
+#: ../src/hrn-year-cluster.c:67
 #, c-format
 msgid "%d album"
 msgid_plural "%d albums"
@@ -55,71 +60,67 @@ msgstr[1] "%d album"
 msgid "Queue Albums"
 msgstr "Lägg till i kön för album"
 
-#: ../src/hrn-audio-viewer.c:150 ../src/hrn-cluster-tree.c:29
+#: ../src/hrn-cluster-tree.c:29
 msgid "Unknown Artist"
 msgstr "Okänd artist"
 
 #: ../src/hrn-cluster-tree.c:39
 #, c-format
 msgid " and %d more"
-msgstr ""
+msgstr "och %d mer"
 
 #: ../src/hrn-cluster-tree.c:550
 msgid "January"
-msgstr ""
+msgstr "Januari"
 
 #: ../src/hrn-cluster-tree.c:550
 msgid "Feburary"
-msgstr ""
+msgstr "Februari"
 
 #: ../src/hrn-cluster-tree.c:550
 msgid "March"
-msgstr ""
+msgstr "Mars"
 
 #: ../src/hrn-cluster-tree.c:551
 msgid "April"
-msgstr ""
+msgstr "April"
 
 #: ../src/hrn-cluster-tree.c:551
 msgid "May"
-msgstr ""
+msgstr "Maj"
 
 #: ../src/hrn-cluster-tree.c:551
 msgid "June"
-msgstr ""
+msgstr "Juni"
 
 #: ../src/hrn-cluster-tree.c:551
 msgid "July"
-msgstr ""
+msgstr "Juli"
 
 #: ../src/hrn-cluster-tree.c:552
 msgid "August"
-msgstr ""
+msgstr "Augusti"
 
 #: ../src/hrn-cluster-tree.c:552
 msgid "September"
-msgstr ""
+msgstr "September"
 
 #: ../src/hrn-cluster-tree.c:552
 msgid "October"
-msgstr ""
+msgstr "Oktober"
 
 #: ../src/hrn-cluster-tree.c:553
 msgid "November"
-msgstr ""
+msgstr "November"
 
 #: ../src/hrn-cluster-tree.c:553
 msgid "December"
-msgstr ""
+msgstr "December"
 
 #: ../src/hrn-image-tile.c:104
 msgid "Display Picture"
 msgstr "Visa bild"
 
-#: ../src/hrn-item.c:71
-msgid "Delete"
-msgstr "Ta bort"
-
 #: ../src/hrn-month-cluster.c:68
 #, c-format
 msgid "%d photo"
@@ -127,7 +128,8 @@ msgid_plural "%d photos"
 msgstr[0] "%d fotografi"
 msgstr[1] "%d fotografier"
 
-#: ../src/hrn-month-cluster.c:140 ../src/hrn-year-cluster.c:139
+#: ../src/hrn-month-cluster.c:140
+#: ../src/hrn-year-cluster.c:139
 msgid "Start Slideshow"
 msgstr "Börja slideshow"
 
@@ -139,18 +141,17 @@ msgstr "Tom"
 msgid "Shuffle"
 msgstr "Blanda"
 
-#: ../src/hrn-queue.c:1220
+#: ../src/hrn-queue.c:1246
 msgid "Playqueue"
 msgstr "Spelkö"
 
-#: ../src/hrn-queue.c:1228
-#, fuzzy
+#: ../src/hrn-queue.c:1254
 msgid "Music Playqueue"
 msgstr "Spelkö"
 
-#: ../src/hrn-queue.c:1230
+#: ../src/hrn-queue.c:1256
 msgid "Add music to start"
-msgstr ""
+msgstr "Lägg till musik i början"
 
 #: ../src/hrn-sidebar.c:182
 msgid "Your local media"
@@ -158,15 +159,13 @@ msgstr "Ditt mediaval"
 
 #: ../src/hrn-sidebar-item.c:455
 msgid "Music"
-msgstr ""
+msgstr "Musik"
 
 #: ../src/hrn-sidebar-item.c:456
-#, fuzzy
 msgid "Pictures"
-msgstr "Visa bild"
+msgstr "Bilder"
 
 #: ../src/hrn-sidebar-item.c:457
-#, fuzzy
 msgid "Videos"
 msgstr "Video"
 
@@ -178,16 +177,17 @@ msgstr "Byta namn"
 msgid "Play Song"
 msgstr "Spela sång"
 
-#: ../src/hrn-video-player.c:392
+#: ../src/hrn-video-player.c:395
 #, c-format
-msgid ""
-"Sorry, we can't play %s, as we don't have the correct plugin. You could try "
-"searching for ❝gstreamer codecs❞ on the web."
-msgstr ""
-"Kan ej spela %s då vi inte har tillgång till rätt pluginmodul. Du kan "
-"försöka söka efter ❝gstreamer codecs❞ på internet."
+msgid "Sorry, we can't play %s, as we don't have the correct plugin."
+msgstr "Kan ej spela %s då vi inte har tillgång till rätt pluginmodul. "
 
-#: ../src/hrn-video-player.c:395
+#: ../src/hrn-video-player.c:397
+#, c-format
+msgid "Sorry, we can't play %s, as we don't have the correct plugin. You could try searching for ❝gstreamer codecs❞ on the web."
+msgstr "Kan ej spela %s då vi inte har tillgång till rätt pluginmodul. Du kan försöka söka efter ❝gstreamer codecs❞ på internet."
+
+#: ../src/hrn-video-player.c:401
 msgid "We can't play this"
 msgstr "Kan ej spela detta"
 
@@ -195,38 +195,30 @@ msgstr "Kan ej spela detta"
 msgid "Play Video"
 msgstr "Visa video"
 
+#~ msgid "Delete"
+#~ msgstr "Ta bort"
 #~ msgid "Audio"
 #~ msgstr "Ljud"
-
 #~ msgid "Image"
 #~ msgstr "Bild"
-
 #~ msgid "All"
 #~ msgstr "Alla"
-
 #~ msgid "Images"
 #~ msgstr "Bilder"
-
 #~ msgid "Overview"
 #~ msgstr "Översikt"
-
 #~ msgid "Collections"
 #~ msgstr "Samlingar"
-
 #~ msgid "Small Items"
 #~ msgstr "Små objekt"
-
 #~ msgid "Large Items"
 #~ msgstr "Stora objekt"
-
 #~ msgid "Theatre"
 #~ msgstr "Bio"
-
 #~ msgid "Show"
 #~ msgstr "Visa"
-
 #~ msgid "Medium Items"
 #~ msgstr "Mellanstora objekt"
-
 #~ msgid "Close"
 #~ msgstr "Stäng"
+
diff -pruN 1.5.1-1/po/th.po 1.8.4-1/po/th.po
--- 1.5.1-1/po/th.po	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/po/th.po	2010-02-17 17:26:44.000000000 +0000
@@ -0,0 +1,199 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: hornsey\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-12-08 17:35+0000\n"
+"PO-Revision-Date: 2010-01-19 21:55+0700\n"
+"Last-Translator: Anuchit Chalothorn <anoochit@gmail.com>\n"
+"Language-Team: Thai <thai-l10n@googlegroups.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Poedit-Language: Thai\n"
+"X-Poedit-Country: THAILAND\n"
+"X-Poedit-SourceCharset: utf-8\n"
+
+#: ../data/hornsey.desktop.in.h:1
+#: ../src/hornsey.c:761
+msgid "Media Player"
+msgstr ""
+
+#: ../data/hornsey.desktop.in.h:2
+msgid "Watch & listen"
+msgstr ""
+
+#: ../src/hornsey.c:597
+msgid "Run in a window"
+msgstr ""
+
+#: ../src/hornsey.c:599
+msgid "Size of the window"
+msgstr ""
+
+#: ../src/hornsey.c:601
+msgid "[FILE...]"
+msgstr ""
+
+#: ../src/hrn-album-cluster.c:75
+#: ../src/hrn-cluster-tree.c:280
+#: ../src/hrn-cluster-tree.c:577
+#: ../src/hrn-cluster-tree.c:578
+#: ../src/hrn-cluster-tree.c:584
+#: ../src/hrn-cluster-tree.c:590
+#: ../src/hrn-queue.c:965
+msgid "Unknown"
+msgstr ""
+
+#: ../src/hrn-album-cluster.c:112
+msgid "Queue Album"
+msgstr ""
+
+#: ../src/hrn-artist-cluster.c:72
+#: ../src/hrn-year-cluster.c:67
+#, c-format
+msgid "%d album"
+msgid_plural "%d albums"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../src/hrn-artist-cluster.c:139
+msgid "Queue Albums"
+msgstr ""
+
+#: ../src/hrn-cluster-tree.c:29
+msgid "Unknown Artist"
+msgstr ""
+
+#: ../src/hrn-cluster-tree.c:39
+#, c-format
+msgid " and %d more"
+msgstr ""
+
+#: ../src/hrn-cluster-tree.c:550
+msgid "January"
+msgstr ""
+
+#: ../src/hrn-cluster-tree.c:550
+msgid "Feburary"
+msgstr ""
+
+#: ../src/hrn-cluster-tree.c:550
+msgid "March"
+msgstr ""
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "April"
+msgstr ""
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "May"
+msgstr ""
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "June"
+msgstr ""
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "July"
+msgstr ""
+
+#: ../src/hrn-cluster-tree.c:552
+msgid "August"
+msgstr ""
+
+#: ../src/hrn-cluster-tree.c:552
+msgid "September"
+msgstr ""
+
+#: ../src/hrn-cluster-tree.c:552
+msgid "October"
+msgstr ""
+
+#: ../src/hrn-cluster-tree.c:553
+msgid "November"
+msgstr ""
+
+#: ../src/hrn-cluster-tree.c:553
+msgid "December"
+msgstr ""
+
+#: ../src/hrn-image-tile.c:104
+msgid "Display Picture"
+msgstr ""
+
+#: ../src/hrn-month-cluster.c:68
+#, c-format
+msgid "%d photo"
+msgid_plural "%d photos"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../src/hrn-month-cluster.c:140
+#: ../src/hrn-year-cluster.c:139
+msgid "Start Slideshow"
+msgstr ""
+
+#: ../src/hrn-queue.c:254
+msgid "Empty"
+msgstr ""
+
+#: ../src/hrn-queue.c:255
+msgid "Shuffle"
+msgstr ""
+
+#: ../src/hrn-queue.c:1247
+msgid "Music Playqueue"
+msgstr ""
+
+#: ../src/hrn-queue.c:1249
+msgid "Add music to start"
+msgstr ""
+
+#: ../src/hrn-sidebar.c:182
+msgid "Your local media"
+msgstr ""
+
+#: ../src/hrn-sidebar-item.c:455
+msgid "Music"
+msgstr ""
+
+#: ../src/hrn-sidebar-item.c:456
+msgid "Pictures"
+msgstr ""
+
+#: ../src/hrn-sidebar-item.c:457
+msgid "Videos"
+msgstr ""
+
+#: ../src/hrn-sidebar-subitem.c:288
+msgid "Rename"
+msgstr ""
+
+#: ../src/hrn-track-tile.c:105
+msgid "Play Song"
+msgstr ""
+
+#: ../src/hrn-video-player.c:395
+#, c-format
+msgid "Sorry, we can't play %s, as we don't have the correct plugin."
+msgstr ""
+
+#: ../src/hrn-video-player.c:397
+#, c-format
+msgid "Sorry, we can't play %s, as we don't have the correct plugin. You could try searching for ❝gstreamer codecs❞ on the web."
+msgstr ""
+
+#: ../src/hrn-video-player.c:401
+msgid "We can't play this"
+msgstr ""
+
+#: ../src/hrn-video-tile.c:103
+msgid "Play Video"
+msgstr ""
+
diff -pruN 1.5.1-1/po/tr.po 1.8.4-1/po/tr.po
--- 1.5.1-1/po/tr.po	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/po/tr.po	2010-02-17 17:26:44.000000000 +0000
@@ -2,21 +2,21 @@
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-#
-#, fuzzy
+# 
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-11-05 13:19+0000\n"
-"PO-Revision-Date: 2009-08-06 11:23+0000\n"
-"Last-Translator: Ceyhun Alyeşil <ceyhunalyesil@gmail.com>\n"
+"POT-Creation-Date: 2010-02-11 23:21+0000\n"
+"PO-Revision-Date: 2010-02-09 03:28+0200\n"
+"Last-Translator: U. Sertac BIRCAN  <usbircan@gmail.com>\n"
 "Language-Team: TURKISH <LL@li.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n!=1;\n"
 
-#: ../data/hornsey.desktop.in.h:1 ../src/hornsey.c:704
+#: ../data/hornsey.desktop.in.h:1 ../src/hornsey.c:710
 msgid "Media Player"
 msgstr "Medya Oynatıcı"
 
@@ -24,185 +24,182 @@ msgstr "Medya Oynatıcı"
 msgid "Watch & listen"
 msgstr "İzle & Dinle"
 
-#: ../src/hornsey.c:542
+#: ../src/hornsey.c:549
 msgid "Run in a window"
-msgstr ""
+msgstr "Pencerede çalıştır"
 
-#: ../src/hornsey.c:544
+#: ../src/hornsey.c:551
 msgid "Size of the window"
-msgstr ""
+msgstr "Pencerenin boyutu"
 
-#: ../src/hornsey.c:546
+#: ../src/hornsey.c:553
 msgid "[FILE...]"
-msgstr ""
+msgstr "[DOSYA...]"
 
-#: ../src/hrn-album-cluster.c:75 ../src/hrn-cluster-tree.c:280
-#: ../src/hrn-cluster-tree.c:577 ../src/hrn-cluster-tree.c:578
-#: ../src/hrn-cluster-tree.c:584 ../src/hrn-cluster-tree.c:590
-#: ../src/hrn-queue.c:965
-#, fuzzy
+#: ../src/hrn-album-cluster.c:75 ../src/hrn-cluster-tree.c:268
+#: ../src/hrn-cluster-tree.c:573 ../src/hrn-cluster-tree.c:574
+#: ../src/hrn-cluster-tree.c:580 ../src/hrn-cluster-tree.c:586
+#: ../src/hrn-queue.c:137 ../src/hrn-queue.c:143
 msgid "Unknown"
-msgstr "Bilinmeyen Sanatçı"
+msgstr "Bilinmeyen"
 
 #: ../src/hrn-album-cluster.c:112
 msgid "Queue Album"
-msgstr ""
+msgstr "Albüm sırası"
 
 #: ../src/hrn-artist-cluster.c:72 ../src/hrn-year-cluster.c:67
 #, c-format
 msgid "%d album"
 msgid_plural "%d albums"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d albüm"
+msgstr[1] "%d albüm"
 
 #: ../src/hrn-artist-cluster.c:139
 msgid "Queue Albums"
-msgstr ""
+msgstr "Albümlerin sırası"
 
-#: ../src/hrn-audio-viewer.c:150 ../src/hrn-cluster-tree.c:29
+#: ../src/hrn-cluster-tree.c:25 ../src/hrn-queue.c:133 ../src/hrn-queue.c:144
+#: ../src/hrn-queue-item.c:55
 msgid "Unknown Artist"
 msgstr "Bilinmeyen Sanatçı"
 
-#: ../src/hrn-cluster-tree.c:39
+#: ../src/hrn-cluster-tree.c:35
 #, c-format
 msgid " and %d more"
-msgstr ""
+msgstr "ve %d daha fazla"
 
-#: ../src/hrn-cluster-tree.c:550
+#: ../src/hrn-cluster-tree.c:546
 msgid "January"
-msgstr ""
+msgstr "Ocak"
 
-#: ../src/hrn-cluster-tree.c:550
+#: ../src/hrn-cluster-tree.c:546
 msgid "Feburary"
-msgstr ""
+msgstr "Şubat"
 
-#: ../src/hrn-cluster-tree.c:550
+#: ../src/hrn-cluster-tree.c:546
 msgid "March"
-msgstr ""
+msgstr "Mart"
 
-#: ../src/hrn-cluster-tree.c:551
+#: ../src/hrn-cluster-tree.c:547
 msgid "April"
-msgstr ""
+msgstr "Nisan"
 
-#: ../src/hrn-cluster-tree.c:551
+#: ../src/hrn-cluster-tree.c:547
 msgid "May"
-msgstr ""
+msgstr "Mayıs"
 
-#: ../src/hrn-cluster-tree.c:551
+#: ../src/hrn-cluster-tree.c:547
 msgid "June"
-msgstr ""
+msgstr "Haziran"
 
-#: ../src/hrn-cluster-tree.c:551
+#: ../src/hrn-cluster-tree.c:547
 msgid "July"
-msgstr ""
+msgstr "Temmuz"
 
-#: ../src/hrn-cluster-tree.c:552
+#: ../src/hrn-cluster-tree.c:548
 msgid "August"
-msgstr ""
+msgstr "Ağustos"
 
-#: ../src/hrn-cluster-tree.c:552
+#: ../src/hrn-cluster-tree.c:548
 msgid "September"
-msgstr ""
+msgstr "Eylül"
 
-#: ../src/hrn-cluster-tree.c:552
+#: ../src/hrn-cluster-tree.c:548
 msgid "October"
-msgstr ""
+msgstr "Ekim"
 
-#: ../src/hrn-cluster-tree.c:553
+#: ../src/hrn-cluster-tree.c:549
 msgid "November"
-msgstr ""
+msgstr "Kasım"
 
-#: ../src/hrn-cluster-tree.c:553
+#: ../src/hrn-cluster-tree.c:549
 msgid "December"
-msgstr ""
+msgstr "Aralık"
 
 #: ../src/hrn-image-tile.c:104
 msgid "Display Picture"
-msgstr ""
-
-#: ../src/hrn-item.c:71
-msgid "Delete"
-msgstr "Sil"
+msgstr "Resmi Görüntüle"
 
 #: ../src/hrn-month-cluster.c:68
 #, c-format
 msgid "%d photo"
 msgid_plural "%d photos"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d foto"
+msgstr[1] "%d foto"
 
 #: ../src/hrn-month-cluster.c:140 ../src/hrn-year-cluster.c:139
 msgid "Start Slideshow"
-msgstr ""
-
-#: ../src/hrn-queue.c:254
-msgid "Empty"
-msgstr "Boş"
-
-#: ../src/hrn-queue.c:255
-msgid "Shuffle"
-msgstr "Karıştır"
-
-#: ../src/hrn-queue.c:1220
-msgid "Playqueue"
-msgstr "Oynatım sırası"
+msgstr "Slideshow başlatın"
 
-#: ../src/hrn-queue.c:1228
-#, fuzzy
+#: ../src/hrn-queue.c:58
 msgid "Music Playqueue"
-msgstr "Oynatım sırası"
+msgstr "Müzik Oynatım sırası"
 
-#: ../src/hrn-queue.c:1230
+#: ../src/hrn-queue.c:59
 msgid "Add music to start"
-msgstr ""
+msgstr "Başlamak için müzik ekleyin"
 
-#: ../src/hrn-sidebar.c:182
+#: ../src/hrn-sidebar.c:132 ../src/hrn-sidebar.c:193
 msgid "Your local media"
 msgstr "Yerel medyanız"
 
-#: ../src/hrn-sidebar-item.c:455
+#: ../src/hrn-sidebar-item.c:370
 msgid "Music"
-msgstr ""
+msgstr "Müzik"
 
-#: ../src/hrn-sidebar-item.c:456
+#: ../src/hrn-sidebar-item.c:371
 msgid "Pictures"
-msgstr ""
+msgstr "Resimler"
 
-#: ../src/hrn-sidebar-item.c:457
-#, fuzzy
+#: ../src/hrn-sidebar-item.c:372
 msgid "Videos"
-msgstr "Video"
+msgstr "Videolar"
 
-#: ../src/hrn-sidebar-subitem.c:288
+#: ../src/hrn-sidebar-subitem.c:399
 msgid "Rename"
 msgstr "Yeniden Adlandır"
 
 #: ../src/hrn-track-tile.c:105
 msgid "Play Song"
-msgstr ""
+msgstr "Şarkı Çal"
 
-#: ../src/hrn-video-player.c:392
+#: ../src/hrn-video-player.c:485
 #, c-format
-msgid ""
-"Sorry, we can't play %s, as we don't have the correct plugin. You could try "
-"searching for ❝gstreamer codecs❞ on the web."
-msgstr ""
-"Üzgünüz, %s dosyasını oynatamıyoruz çünkü gerekli olan eklenti yok.İnternet "
-"üzerinde ❝gstreamer codecs❝ kelimesini aratabilirsiniz."
+msgid "Sorry, we can't play %s, as we don't have the correct plugin."
+msgstr "Üzgünüz, %s dosyasını oynatamıyoruz çünkü gerekli olan eklenti yok."
 
-#: ../src/hrn-video-player.c:395
+#: ../src/hrn-video-player.c:487
+#, c-format
+msgid "Sorry, we can't play %s, as we don't have the correct plugin. You could try searching for ❝gstreamer codecs❞ on the web."
+msgstr "Üzgünüz, %s dosyasını oynatamıyoruz çünkü gerekli olan eklenti yok.İnternet üzerinde ❝gstreamer codecs❝ kelimesini aratabilirsiniz."
+
+#: ../src/hrn-video-player.c:491
 msgid "We can't play this"
 msgstr "Bunu oynatamıyoruz"
 
 #: ../src/hrn-video-tile.c:103
-#, fuzzy
 msgid "Play Video"
-msgstr "Video"
+msgstr "Video Oynat"
+
+#: ../src/hrn-queue-item.c:53
+msgid "Unknown Title"
+msgstr "Bilinmeyen Başlık"
+
+#~ msgid "Empty"
+#~ msgstr "Boş"
+
+#~ msgid "Shuffle"
+#~ msgstr "Karıştır"
+
+#~ msgid "Delete"
+#~ msgstr "Sil"
+
+#~ msgid "Playqueue"
+#~ msgstr "Oynatım sırası"
 
 #~ msgid "Audio"
 #~ msgstr "Ses"
 
-#, fuzzy
 #~ msgid "Image"
 #~ msgstr "Resimler"
 
diff -pruN 1.5.1-1/po/zh_CN.po 1.8.4-1/po/zh_CN.po
--- 1.5.1-1/po/zh_CN.po	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/po/zh_CN.po	2010-02-17 17:26:44.000000000 +0000
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: hornsey\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-10-16 11:25+0000\n"
-"PO-Revision-Date: 2009-10-09 11:45-0800\n"
+"POT-Creation-Date: 2009-11-19 18:12+0000\n"
+"PO-Revision-Date: 2009-11-12 18:17-0800\n"
 "Last-Translator: Yun Nie <yun.nie@ptiglobal.net>\n"
 "Language-Team: zh_CN\n"
 "MIME-Version: 1.0\n"
@@ -17,7 +17,7 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n!=1;\n"
 "X-Poedit-SourceCharset: utf-8\n"
 
-#: ../data/hornsey.desktop.in.h:1 ../src/hornsey.c:671
+#: ../data/hornsey.desktop.in.h:1 ../src/hornsey.c:761
 msgid "Media Player"
 msgstr "媒体播放器"
 
@@ -25,19 +25,22 @@ msgstr "媒体播放器"
 msgid "Watch & listen"
 msgstr "播放"
 
-#: ../src/hornsey.c:509
+#: ../src/hornsey.c:597
 msgid "Run in a window"
 msgstr "以窗口模式运行"
 
-#: ../src/hornsey.c:511
+#: ../src/hornsey.c:599
 msgid "Size of the window"
 msgstr "窗口大小"
 
-#: ../src/hornsey.c:513
+#: ../src/hornsey.c:601
 msgid "[FILE...]"
 msgstr "[文件...]"
 
-#: ../src/hrn-album-cluster.c:75 ../src/hrn-queue.c:960
+#: ../src/hrn-album-cluster.c:75 ../src/hrn-cluster-tree.c:280
+#: ../src/hrn-cluster-tree.c:577 ../src/hrn-cluster-tree.c:578
+#: ../src/hrn-cluster-tree.c:584 ../src/hrn-cluster-tree.c:590
+#: ../src/hrn-queue.c:965
 msgid "Unknown"
 msgstr "未知"
 
@@ -49,13 +52,17 @@ msgstr "\t队列专辑"
 #, c-format
 msgid "%d album"
 msgid_plural "%d albums"
-msgstr[0] "%d 相册"
+msgstr[0] "%d 专辑"
 msgstr[1] "%d 相册"
 
 #: ../src/hrn-artist-cluster.c:139
 msgid "Queue Albums"
 msgstr "\t队列专辑"
 
+#: ../src/hrn-cluster-tree.c:29
+msgid "Unknown Artist"
+msgstr "未知的作者"
+
 #: ../src/hrn-image-tile.c:104
 msgid "Display Picture"
 msgstr "显示图片"
@@ -71,7 +78,11 @@ msgstr[1] "%d 照片"
 msgid "Start Slideshow"
 msgstr "开始幻灯片"
 
-#: ../src/hrn-queue.c:253
+#: ../src/hrn-queue.c:254
+msgid "Empty"
+msgstr "清空"
+
+#: ../src/hrn-queue.c:255
 msgid "Shuffle"
 msgstr "随机播放"
 
@@ -79,18 +90,6 @@ msgstr "随机播放"
 msgid "Your local media"
 msgstr "您的本地媒体文件"
 
-#: ../src/hrn-sidebar-item.c:432
-msgid "Audio"
-msgstr "音频"
-
-#: ../src/hrn-sidebar-item.c:433
-msgid "Video"
-msgstr "视频"
-
-#: ../src/hrn-sidebar-item.c:434
-msgid "Image"
-msgstr "图片"
-
 #: ../src/hrn-sidebar-subitem.c:288
 msgid "Rename"
 msgstr "重命名"
@@ -99,27 +98,108 @@ msgstr "重命名"
 msgid "Play Song"
 msgstr "播放歌曲"
 
-#: ../src/hrn-video-player.c:389
+#: ../src/hrn-video-player.c:397
 #, c-format
 msgid "Sorry, we can't play %s, as we don't have the correct plugin. You could try searching for ❝gstreamer codecs❞ on the web."
 msgstr ""
-"抱歉,因为缺少合适的插件,我们不能播放 %s. 也许您可以试着以\n"
-"'gstreamer codecs'为关键词在网络上搜索一下"
+"抱歉，因为缺少合适的插件，我们无法播放%s。也许您可以试着以\n"
+"'gstreamer codecs'为关键词在网络上搜索一下。"
 
-#: ../src/hrn-video-player.c:392
+#: ../src/hrn-video-player.c:401
 msgid "We can't play this"
-msgstr "目前我们不能播放这个文件"
+msgstr "我们无法播放这个文件"
 
 #: ../src/hrn-video-tile.c:103
 msgid "Play Video"
 msgstr "播放视频"
 
-#: ../src/hrn-queue.c:252
-msgid "Empty"
-msgstr "清空"
+#: ../src/hrn-cluster-tree.c:552
+msgid "August"
+msgstr "八月"
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "July"
+msgstr "七月"
+
+#: ../src/hrn-cluster-tree.c:39
+#, c-format
+msgid " and %d more"
+msgstr "和更多 %d"
+
+#: ../src/hrn-cluster-tree.c:550
+msgid "Feburary"
+msgstr "二月"
+
+#: ../src/hrn-cluster-tree.c:550
+msgid "January"
+msgstr "一月"
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "April"
+msgstr "四月"
+
+#: ../src/hrn-cluster-tree.c:550
+msgid "March"
+msgstr "三月"
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "June"
+msgstr "六月"
+
+#: ../src/hrn-cluster-tree.c:551
+msgid "May"
+msgstr "五月"
+
+#: ../src/hrn-cluster-tree.c:552
+msgid "September"
+msgstr "九月"
+
+#: ../src/hrn-cluster-tree.c:552
+msgid "October"
+msgstr "十月"
+
+#: ../src/hrn-cluster-tree.c:553
+msgid "December"
+msgstr "十二月"
+
+#: ../src/hrn-queue.c:1246
+msgid "Playqueue"
+msgstr "播放列表"
+
+#: ../src/hrn-queue.c:1256
+msgid "Add music to start"
+msgstr "开始添加音乐播出"
+
+#: ../src/hrn-queue.c:1254
+msgid "Music Playqueue"
+msgstr "音乐播放列表"
+
+#: ../src/hrn-sidebar-item.c:457
+msgid "Videos"
+msgstr "视频"
+
+#: ../src/hrn-sidebar-item.c:456
+msgid "Pictures"
+msgstr "图片"
 
-#~ msgid "Unknown Artist"
-#~ msgstr "未知的作者"
+#: ../src/hrn-video-player.c:395
+#, c-format
+msgid "Sorry, we can't play %s, as we don't have the correct plugin."
+msgstr "抱歉，因为缺少合适的插件，我们无法播放%s。"
+
+#: ../src/hrn-cluster-tree.c:553
+msgid "November"
+msgstr "十一月"
+
+#: ../src/hrn-sidebar-item.c:455
+msgid "Music"
+msgstr "音乐"
+
+#~ msgid "Audio"
+#~ msgstr "音频"
+
+#~ msgid "Image"
+#~ msgstr "图片"
 
 #~ msgid "Delete"
 #~ msgstr "删除"
diff -pruN 1.5.1-1/po/zh_TW.po 1.8.4-1/po/zh_TW.po
--- 1.5.1-1/po/zh_TW.po	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/po/zh_TW.po	2010-02-17 17:26:44.000000000 +0000
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-11-05 13:19+0000\n"
+"POT-Creation-Date: 2009-11-19 18:12+0000\n"
 "PO-Revision-Date: \n"
 "Last-Translator: Cheng-Chia Tseng <pswo10680@gmail.com>\n"
 "Language-Team: \n"
@@ -13,7 +13,8 @@ msgstr ""
 "X-Poedit-Language: Chinese\n"
 "X-Poedit-SourceCharset: utf-8\n"
 
-#: ../data/hornsey.desktop.in.h:1 ../src/hornsey.c:704
+#: ../data/hornsey.desktop.in.h:1
+#: ../src/hornsey.c:761
 msgid "Media Player"
 msgstr "媒體播放器"
 
@@ -21,21 +22,24 @@ msgstr "媒體播放器"
 msgid "Watch & listen"
 msgstr "觀賞與聆聽"
 
-#: ../src/hornsey.c:542
+#: ../src/hornsey.c:597
 msgid "Run in a window"
 msgstr "在視窗內執行"
 
-#: ../src/hornsey.c:544
+#: ../src/hornsey.c:599
 msgid "Size of the window"
 msgstr "視窗的大小"
 
-#: ../src/hornsey.c:546
+#: ../src/hornsey.c:601
 msgid "[FILE...]"
 msgstr "[檔案...]"
 
-#: ../src/hrn-album-cluster.c:75 ../src/hrn-cluster-tree.c:280
-#: ../src/hrn-cluster-tree.c:577 ../src/hrn-cluster-tree.c:578
-#: ../src/hrn-cluster-tree.c:584 ../src/hrn-cluster-tree.c:590
+#: ../src/hrn-album-cluster.c:75
+#: ../src/hrn-cluster-tree.c:280
+#: ../src/hrn-cluster-tree.c:577
+#: ../src/hrn-cluster-tree.c:578
+#: ../src/hrn-cluster-tree.c:584
+#: ../src/hrn-cluster-tree.c:590
 #: ../src/hrn-queue.c:965
 msgid "Unknown"
 msgstr "未知"
@@ -44,7 +48,8 @@ msgstr "未知"
 msgid "Queue Album"
 msgstr "佇列專輯"
 
-#: ../src/hrn-artist-cluster.c:72 ../src/hrn-year-cluster.c:67
+#: ../src/hrn-artist-cluster.c:72
+#: ../src/hrn-year-cluster.c:67
 #, c-format
 msgid "%d album"
 msgid_plural "%d albums"
@@ -55,71 +60,67 @@ msgstr[1] "%d 個專輯"
 msgid "Queue Albums"
 msgstr "佇列專輯"
 
-#: ../src/hrn-audio-viewer.c:150 ../src/hrn-cluster-tree.c:29
+#: ../src/hrn-cluster-tree.c:29
 msgid "Unknown Artist"
 msgstr "未知的藝人"
 
 #: ../src/hrn-cluster-tree.c:39
 #, c-format
 msgid " and %d more"
-msgstr ""
+msgstr "還有 %d 個"
 
 #: ../src/hrn-cluster-tree.c:550
 msgid "January"
-msgstr ""
+msgstr "一月"
 
 #: ../src/hrn-cluster-tree.c:550
 msgid "Feburary"
-msgstr ""
+msgstr "二月"
 
 #: ../src/hrn-cluster-tree.c:550
 msgid "March"
-msgstr ""
+msgstr "三月"
 
 #: ../src/hrn-cluster-tree.c:551
 msgid "April"
-msgstr ""
+msgstr "四月"
 
 #: ../src/hrn-cluster-tree.c:551
 msgid "May"
-msgstr ""
+msgstr "五月"
 
 #: ../src/hrn-cluster-tree.c:551
 msgid "June"
-msgstr ""
+msgstr "六月"
 
 #: ../src/hrn-cluster-tree.c:551
 msgid "July"
-msgstr ""
+msgstr "七月"
 
 #: ../src/hrn-cluster-tree.c:552
 msgid "August"
-msgstr ""
+msgstr "八月"
 
 #: ../src/hrn-cluster-tree.c:552
 msgid "September"
-msgstr ""
+msgstr "九月"
 
 #: ../src/hrn-cluster-tree.c:552
 msgid "October"
-msgstr ""
+msgstr "十月"
 
 #: ../src/hrn-cluster-tree.c:553
 msgid "November"
-msgstr ""
+msgstr "十一月"
 
 #: ../src/hrn-cluster-tree.c:553
 msgid "December"
-msgstr ""
+msgstr "十二月"
 
 #: ../src/hrn-image-tile.c:104
 msgid "Display Picture"
 msgstr "顯示圖片"
 
-#: ../src/hrn-item.c:71
-msgid "Delete"
-msgstr "刪除"
-
 #: ../src/hrn-month-cluster.c:68
 #, c-format
 msgid "%d photo"
@@ -127,7 +128,8 @@ msgid_plural "%d photos"
 msgstr[0] "%d 張圖片"
 msgstr[1] "%d 張圖片"
 
-#: ../src/hrn-month-cluster.c:140 ../src/hrn-year-cluster.c:139
+#: ../src/hrn-month-cluster.c:140
+#: ../src/hrn-year-cluster.c:139
 msgid "Start Slideshow"
 msgstr "播放幻燈片"
 
@@ -139,18 +141,17 @@ msgstr "清空"
 msgid "Shuffle"
 msgstr "隨機播放"
 
-#: ../src/hrn-queue.c:1220
+#: ../src/hrn-queue.c:1246
 msgid "Playqueue"
 msgstr "播放佇列"
 
-#: ../src/hrn-queue.c:1228
-#, fuzzy
+#: ../src/hrn-queue.c:1254
 msgid "Music Playqueue"
-msgstr "播放佇列"
+msgstr "音樂播放佇列"
 
-#: ../src/hrn-queue.c:1230
+#: ../src/hrn-queue.c:1256
 msgid "Add music to start"
-msgstr ""
+msgstr "加入音樂以開始"
 
 #: ../src/hrn-sidebar.c:182
 msgid "Your local media"
@@ -158,15 +159,13 @@ msgstr "你的本機媒體"
 
 #: ../src/hrn-sidebar-item.c:455
 msgid "Music"
-msgstr ""
+msgstr "音樂"
 
 #: ../src/hrn-sidebar-item.c:456
-#, fuzzy
 msgid "Pictures"
-msgstr "顯示圖片"
+msgstr "圖片"
 
 #: ../src/hrn-sidebar-item.c:457
-#, fuzzy
 msgid "Videos"
 msgstr "視訊"
 
@@ -178,16 +177,17 @@ msgstr "重新命名"
 msgid "Play Song"
 msgstr "播放歌曲"
 
-#: ../src/hrn-video-player.c:392
+#: ../src/hrn-video-player.c:395
 #, c-format
-msgid ""
-"Sorry, we can't play %s, as we don't have the correct plugin. You could try "
-"searching for ❝gstreamer codecs❞ on the web."
-msgstr ""
-"抱歉，由於我們沒有正確的外掛程式，所以我們無法播放 %s。你可以嘗試在網路上搜"
-"尋 ❝gstreamer codecs❞。"
+msgid "Sorry, we can't play %s, as we don't have the correct plugin."
+msgstr "抱歉，我們無法播放 %s，因為我們沒有正確的外掛程式。"
 
-#: ../src/hrn-video-player.c:395
+#: ../src/hrn-video-player.c:397
+#, c-format
+msgid "Sorry, we can't play %s, as we don't have the correct plugin. You could try searching for ❝gstreamer codecs❞ on the web."
+msgstr "抱歉，由於我們沒有正確的外掛程式，所以我們無法播放 %s。你可以嘗試在網路上搜尋 ❝gstreamer codecs❞。"
+
+#: ../src/hrn-video-player.c:401
 msgid "We can't play this"
 msgstr "我們無法播放它"
 
@@ -195,38 +195,30 @@ msgstr "我們無法播放它"
 msgid "Play Video"
 msgstr "播放視訊"
 
+#~ msgid "Delete"
+#~ msgstr "刪除"
 #~ msgid "Audio"
 #~ msgstr "音訊"
-
 #~ msgid "Image"
 #~ msgstr "圖片"
-
 #~ msgid "All"
 #~ msgstr "全部"
-
 #~ msgid "Images"
 #~ msgstr "圖片"
-
 #~ msgid "Overview"
 #~ msgstr "概覽"
-
 #~ msgid "Collections"
 #~ msgstr "收藏"
-
 #~ msgid "Small Items"
 #~ msgstr "小圖示"
-
 #~ msgid "Large Items"
 #~ msgstr "大圖示"
-
 #~ msgid "Theatre"
 #~ msgstr "電影院"
-
 #~ msgid "Show"
 #~ msgstr "顯示"
-
 #~ msgid "Medium Items"
 #~ msgstr "小項目"
-
 #~ msgid "Close"
 #~ msgstr "關閉"
+
diff -pruN 1.5.1-1/README 1.8.4-1/README
--- 1.5.1-1/README	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/README	2010-02-17 17:26:44.000000000 +0000
@@ -1,5 +1,5 @@
 Hornsey - Moblin Media Player
-=============================
+============================
 
 Hornsey is a Image, Audio and Video media browser and player. It depends on
 clutter, clutter-gst, bickley, nbtk, bognor-regis, libunique,
diff -pruN 1.5.1-1/src/.gitignore 1.8.4-1/src/.gitignore
--- 1.5.1-1/src/.gitignore	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/.gitignore	2010-02-17 17:26:44.000000000 +0000
@@ -1,3 +1,4 @@
 hornsey
 hrn-marshal.c
 hrn-marshal.h
+tumbler-service-dbus-glue.h
diff -pruN 1.5.1-1/src/hornsey.c 1.8.4-1/src/hornsey.c
--- 1.5.1-1/src/hornsey.c	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hornsey.c	2010-02-17 17:26:44.000000000 +0000
@@ -31,10 +31,6 @@
 #include <dbus/dbus-glib.h>
 #include <dbus/dbus-glib-bindings.h>
 
-#include <bickley/bkl-utils.h>
-#include <bickley/bkl-source-client.h>
-#include <bickley/bkl-source-manager-client.h>
-
 #include <bognor/br-iface-player.h>
 #include <bognor/br-queue.h>
 
@@ -49,13 +45,14 @@
 #include <clutter-gtk/clutter-gtk.h>
 
 #include "hrn.h"
+#include "hrn-debug.h"
 #include "hrn-content-area.h"
-#include "hrn-source-manager.h"
 #include "hrn-state-manager.h"
 #include "hrn-pin-manager.h"
 #include "hrn-ui-controls.h"
 #include "hrn-window.h"
 #include "hrn-theatre-ui.h"
+#include "hrn-tracker-client.h"
 
 #include "math.h"
 
@@ -78,38 +75,13 @@ HrnQueue *master_queue; /* FIXME: Need q
 ClutterActor *master_controls;
 HrnPinManager *pin_manager;
 
-HrnSourceManager *source_manager;
 BrQueue *local_queue = NULL;
 
+HrnTrackerClient *tracker_client;
 HrnStateManager *state_manager;
 
 static gchar *load_path = NULL;
-
-static void
-set_source (HrnSource *source)
-{
-    const char *source_path;
-
-    if (source) {
-        hrn_content_area_set_source ((HrnContentArea *) hrn_content_area,
-                                     source);
-        return;
-    }
-
-    source_path = hrn_state_manager_get_source (state_manager);
-    if (source_path == NULL || *source_path == '\0') {
-        source = hrn_source_manager_get_local_source (source_manager);
-    } else {
-        source = hrn_source_manager_get_source_for_path (source_manager,
-                                                         source_path);
-        if (source == NULL) {
-            source = hrn_source_manager_get_local_source (source_manager);
-        }
-    }
-
-    hrn_content_area_set_source ((HrnContentArea *) hrn_content_area,
-                                 source);
-}
+static gboolean theatre_shown = FALSE;
 
 static UniqueResponse
 hrn_message_received_cb (UniqueApp *app, gint command,
@@ -127,12 +99,9 @@ hrn_message_received_cb (UniqueApp *app,
       case UNIQUE_OPEN:
         uri = unique_message_data_get_text (message_data);
         if (uri && *uri != '\0') {
-            BklItem *item;
-            HrnSource *source;
+            HrnItem *item;
 
-            item = hrn_source_manager_get_item_for_uri (source_manager, uri,
-                                                        &source);
-            set_source (source);
+            item = hrn_tracker_client_get_item_for_uri (tracker_client, uri);
 
             hrn_play_uri_now (uri);
         }
@@ -169,6 +138,8 @@ theatre_hidden_cb (HrnTheatreUi *ui,
 static void
 show_theatre (void)
 {
+    theatre_shown = TRUE;
+
     clutter_actor_show ((ClutterActor *) hrn_theatre_ui);
     clutter_actor_raise_top ((ClutterActor *) hrn_theatre_ui);
 
@@ -196,6 +167,8 @@ static void
 leave_theatre_cb (HrnTheatreUi *ui,
                   gpointer      userdata)
 {
+    theatre_shown = FALSE;
+
     hrn_theatre_ui_hide ((HrnTheatreUi *) hrn_theatre_ui,
                          theatre_hidden_cb, NULL);
 
@@ -228,17 +201,6 @@ query_changed_cb (HrnContentArea *area,
 }
 
 static void
-source_changed_cb (HrnContentArea *area,
-                   HrnSource      *source,
-                   gpointer        userdata)
-{
-    const char *source_path;
-
-    source_path = hrn_source_get_object_path (source);
-    hrn_state_manager_set_source (state_manager, source_path);
-}
-
-static void
 filter_changed_cb (HrnContentArea *area,
                    int             filter,
                    gpointer        userdata)
@@ -270,7 +232,7 @@ hrn_build_ui (void)
   hrn_content_area = g_object_new (HRN_TYPE_CONTENT_AREA,
                                    "pin-manager", pin_manager,
                                    "local-queue", local_queue,
-                                   "source-manager", source_manager,
+                                   "tracker-client", tracker_client,
                                    "theatre-ui", hrn_theatre_ui,
                                    NULL);
   clutter_actor_set_size (hrn_content_area, width, height);
@@ -280,8 +242,6 @@ hrn_build_ui (void)
 
   g_signal_connect (hrn_content_area, "filter-changed",
                     G_CALLBACK (filter_changed_cb), NULL);
-  g_signal_connect (hrn_content_area, "source-changed",
-                    G_CALLBACK (source_changed_cb), NULL);
   g_signal_connect (hrn_content_area, "query-changed",
                     G_CALLBACK (query_changed_cb), NULL);
   g_signal_connect (hrn_content_area, "activate-theatre",
@@ -293,25 +253,23 @@ hrn_build_ui (void)
 void
 hrn_play_uri_now (const char *uri)
 {
-    BklItem *item;
-    HrnSource *source;
+    HrnItem *item;
 
-    item = hrn_source_manager_get_item_for_uri (source_manager, uri,
-                                                &source);
+    item = hrn_tracker_client_get_item_for_uri (tracker_client, uri);
     if (item) {
-        if (g_str_has_prefix (bkl_item_get_mimetype (item), "audio/")) {
+        if (g_str_has_prefix (hrn_item_get_mimetype (item), "audio/")) {
             hrn_queue_play_now (master_queue, item);
         } else {
             HrnClusterTree *tree;
             HrnClusterNode *node;
 
-            tree = hrn_source_get_cluster_tree (source);
+            tree = hrn_tracker_client_get_tree (tracker_client);
             node = g_hash_table_lookup (tree->uri_to_item,
-                                        bkl_item_get_uri (item));
+                                        hrn_item_get_uri (item));
             hrn_theatre_ui_show_node ((HrnTheatreUi *) hrn_theatre_ui, node);
             show_theatre ();
 
-            if (g_str_has_prefix (bkl_item_get_mimetype (item), "video/")) {
+            if (g_str_has_prefix (hrn_item_get_mimetype (item), "video/")) {
                 hrn_theatre_ui_set_playing ((HrnTheatreUi *) hrn_theatre_ui,
                                             TRUE);
             }
@@ -366,11 +324,9 @@ make_uri (const char *filename)
 }
 
 static void
-source_manager_ready_cb (HrnSourceManager *manager,
+tracker_client_ready_cb (HrnTrackerClient *client,
                          gpointer          userdata)
 {
-    HrnSource *source;
-
     hrn_state_manager_ready (state_manager);
 
     if (hrn_state_manager_get_force_visual_mode (state_manager)) {
@@ -379,18 +335,20 @@ source_manager_ready_cb (HrnSourceManage
 
     if (load_path) {
         char *uri = make_uri (load_path);
-        BklItem *item;
-
-        item = hrn_source_manager_get_item_for_uri (source_manager, uri,
-                                                    &source);
+#if 0
+        HrnItem *item;
 
-        set_source (source);
+        item = hrn_tracker_client_get_item_for_uri (tracker_client, uri);
+#endif
 
         hrn_play_uri_now (uri);
         g_free (uri);
     } else if (!hrn_state_manager_get_force_visual_mode (state_manager)) {
         /* FIXME: Should this not be done by hrn_content_area_restore_state? */
-        set_source (NULL);
+        /* set_source (NULL); */
+
+        hrn_content_area_set_tree ((HrnContentArea *) hrn_content_area,
+                                   hrn_tracker_client_get_tree (tracker_client));
 
 #if 0
         /* Restore state */
@@ -512,6 +470,56 @@ window_focus_out (GtkWidget     *widget,
     return FALSE;
 }
 
+static void
+window_action_cb (HrnWindow       *window,
+                  HrnWindowAction  action,
+                  gpointer         userdata)
+{
+    if (theatre_shown) {
+        switch (action) {
+        case HRN_WINDOW_ACTION_PLAY:
+            hrn_theatre_ui_set_playing ((HrnTheatreUi *) hrn_theatre_ui, TRUE);
+            break;
+
+        case HRN_WINDOW_ACTION_PAUSE:
+            hrn_theatre_ui_set_playing ((HrnTheatreUi *) hrn_theatre_ui, FALSE);
+            break;
+
+        case HRN_WINDOW_ACTION_NEXT:
+            hrn_theatre_ui_next ((HrnTheatreUi *) hrn_theatre_ui);
+            break;
+
+        case HRN_WINDOW_ACTION_PREVIOUS:
+            hrn_theatre_ui_previous ((HrnTheatreUi *) hrn_theatre_ui);
+            break;
+
+        default:
+            break;
+        }
+    } else {
+        switch (action) {
+        case HRN_WINDOW_ACTION_PLAY:
+            br_queue_play (local_queue);
+            break;
+
+        case HRN_WINDOW_ACTION_PAUSE:
+            br_queue_stop (local_queue);
+            break;
+
+        case HRN_WINDOW_ACTION_NEXT:
+            br_queue_next (local_queue);
+            break;
+
+        case HRN_WINDOW_ACTION_PREVIOUS:
+            /* Bognor doesn't support Previous yet */
+            break;
+
+        default:
+            break;
+        }
+    }
+}
+
 gint
 main (gint argc, gchar **argv)
 {
@@ -554,8 +562,7 @@ main (gint argc, gchar **argv)
   g_thread_init (NULL);
 
   if (gtk_clutter_init_with_args (&argc, &argv, "Hornsey media player",
-                                  hrn_options, NULL, &error) <= 0)
-  {
+                                  hrn_options, NULL, &error) <= 0) {
       g_print ("Error: %s\n", error->message);
       g_error_free (error);
       return 1;
@@ -568,13 +575,16 @@ main (gint argc, gchar **argv)
   clutter_gst_init (&argc, &argv);
 #endif
 
-  bkl_init ();
   notify_init ("Hornsey Media Player");
 
   clutter_set_font_flags (CLUTTER_FONT_HINTING);
 
   g_set_application_name ("Hornsey Media Player");
 
+#ifdef HRN_ENABLE_DEBUG
+  hrn_debug_init ();
+#endif
+
 #ifdef HRN_SN_SUPPORT
   xdisplay = clutter_x11_get_default_display ();
 
@@ -615,12 +625,11 @@ main (gint argc, gchar **argv)
 
   local_queue = br_queue_new_local ();
 
-  /* Setup the Bickley Source manager */
-  source_manager = g_object_new (HRN_TYPE_SOURCE_MANAGER, NULL);
-  g_signal_connect (source_manager, "ready",
-                    G_CALLBACK (source_manager_ready_cb), NULL);
+  tracker_client = g_object_new (HRN_TYPE_TRACKER_CLIENT, NULL);
+  g_signal_connect (tracker_client, "ready",
+                    G_CALLBACK (tracker_client_ready_cb), NULL);
 
-  nbtk_style_load_from_file (nbtk_style_get_default (),
+  mx_style_load_from_file (mx_style_get_default (),
                              PKGDATADIR "hornsey.css", NULL);
 
   if (window_mode == TRUE) {
@@ -657,6 +666,8 @@ main (gint argc, gchar **argv)
                     G_CALLBACK (window_focus_out), NULL);
   g_signal_connect (window, "destroy",
                     G_CALLBACK (gtk_main_quit), NULL);
+  g_signal_connect (window, "action",
+                    G_CALLBACK (window_action_cb), NULL);
 
   if (!stage_fullscreen)
     {
@@ -723,8 +734,6 @@ main (gint argc, gchar **argv)
     g_free (state_path);
   }
 
-  bkl_shutdown ();
-
   return 0;
 }
 
@@ -824,12 +833,12 @@ hrn_guess_mimetype (const char *uri)
 char *
 hrn_resolve_mimetype (const char *uri)
 {
-  BklItem *item;
+  HrnItem *item;
   char *mimetype;
 
-  item = hrn_source_manager_get_item_for_uri (source_manager, uri, NULL);
+  item = hrn_tracker_client_get_item_for_uri (tracker_client, uri);
   if (item) {
-    mimetype = g_strdup (bkl_item_get_mimetype (item));
+    mimetype = g_strdup (hrn_item_get_mimetype (item));
   } else {
     mimetype = g_strdup (hrn_guess_mimetype (uri));
   }
@@ -848,7 +857,7 @@ hrn_add_recent_uri (const char *uri,
     data.description = NULL;
     data.mime_type = g_strdup (mimetype);
     data.app_name = "Hornsey";
-    data.app_exec= "hornset %u";
+    data.app_exec= "hornsey %u";
     data.groups = NULL;
     data.is_private = FALSE;
 
diff -pruN 1.5.1-1/src/hrn-audio-viewer.h 1.8.4-1/src/hrn-audio-viewer.h
--- 1.5.1-1/src/hrn-audio-viewer.h	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-audio-viewer.h	2010-02-17 17:26:44.000000000 +0000
@@ -1,7 +1,7 @@
 #ifndef __HRN_AUDIO_VIEWER_H__
 #define __HRN_AUDIO_VIEWER_H__
 
-#include <nbtk/nbtk.h>
+#include <mx/mx.h>
 
 G_BEGIN_DECLS
 
@@ -32,14 +32,14 @@ typedef struct _HrnAudioViewerClass HrnA
 
 struct _HrnAudioViewer
 {
-    NbtkTable parent;
+    MxTable parent;
 
     HrnAudioViewerPrivate *priv;
 };
 
 struct _HrnAudioViewerClass
 {
-    NbtkTableClass parent_class;
+    MxTableClass parent_class;
 };
 
 GType hrn_audio_viewer_get_type (void) G_GNUC_CONST;
diff -pruN 1.5.1-1/src/hrn-button.c 1.8.4-1/src/hrn-button.c
--- 1.5.1-1/src/hrn-button.c	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-button.c	2010-02-17 17:26:44.000000000 +0000
@@ -24,7 +24,7 @@
 #include "hrn.h"
 #include "hrn-button.h"
 
-G_DEFINE_TYPE (HrnButton, hrn_button, NBTK_TYPE_BUTTON);
+G_DEFINE_TYPE (HrnButton, hrn_button, MX_TYPE_BUTTON);
 
 #define HRN_BUTTON_GET_PRIVATE(obj)                 \
   (G_TYPE_INSTANCE_GET_PRIVATE ((obj), \
@@ -68,8 +68,8 @@ hrn_button_init (HrnButton *self)
 {
 }
 
-NbtkWidget *
+MxWidget *
 hrn_button_new (void)
 {
-  return NBTK_WIDGET (g_object_new (HRN_TYPE_BUTTON, NULL));
+  return MX_WIDGET (g_object_new (HRN_TYPE_BUTTON, NULL));
 }
diff -pruN 1.5.1-1/src/hrn-button.h 1.8.4-1/src/hrn-button.h
--- 1.5.1-1/src/hrn-button.h	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-button.h	2010-02-17 17:26:44.000000000 +0000
@@ -20,7 +20,7 @@
 #define _HRN_BUTTON_H
 
 #include <clutter/clutter.h>
-#include <nbtk/nbtk.h>
+#include <mx/mx.h>
 
 G_BEGIN_DECLS
 
@@ -47,19 +47,19 @@ typedef struct _HrnButtonPrivate HrnButt
 
 struct _HrnButton
 {
-  NbtkButton        parent_instance;
+  MxButton        parent_instance;
   HrnButtonPrivate *priv;
 };
 
 struct _HrnButtonClass
 {
   /*< private >*/
-  NbtkButtonClass parent_class;
+  MxButtonClass parent_class;
 };
 
 GType       hrn_button_get_type (void) G_GNUC_CONST;
 
-NbtkWidget *hrn_button_new (void);
+MxWidget *hrn_button_new (void);
 
 G_END_DECLS
 
diff -pruN 1.5.1-1/src/hrn-cluster.c 1.8.4-1/src/hrn-cluster.c
--- 1.5.1-1/src/hrn-cluster.c	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-cluster.c	2011-03-15 13:20:21.000000000 +0000
@@ -1,4 +1,4 @@
-#include <nbtk/nbtk.h>
+#include <mx/mx.h>
 
 #include "hrn.h"
 
@@ -35,7 +35,7 @@ struct _HrnClusterPrivate {
     gboolean items_exist;
     guint items_per_row;
 
-    NbtkWidget *table;
+    ClutterActor *table;
 
     HrnUpTile *up_tile;
 
@@ -48,8 +48,8 @@ struct _HrnClusterPrivate {
 
     ClutterActor *frame;
     ClutterActor *thumbnail;
-    NbtkWidget *primary;
-    NbtkWidget *secondary;
+    ClutterActor *primary;
+    ClutterActor *secondary;
 
     guint32 thumb_timeout_id;
     int base_x, base_y;
@@ -100,12 +100,12 @@ hrn_cluster_set_property (GObject      *
         break;
 
     case PROP_PRIMARY:
-        nbtk_label_set_text ((NbtkLabel *) priv->primary,
+        mx_label_set_text ((MxLabel *) priv->primary,
                              g_value_get_string (value));
         break;
 
     case PROP_SECONDARY:
-        nbtk_label_set_text ((NbtkLabel *) priv->secondary,
+        mx_label_set_text ((MxLabel *) priv->secondary,
                              g_value_get_string (value));
         break;
 
@@ -401,6 +401,109 @@ tiler_show (HrnTiler    *tiler,
 }
 
 static void
+show_child (HrnCluster   *cluster,
+            ClutterActor *actor)
+{
+    HrnClusterPrivate *priv = cluster->priv;
+    HrnClusterNode *node;
+
+    clutter_actor_show (actor);
+    clutter_actor_animate (actor, CLUTTER_EASE_IN_OUT_CUBIC, 500,
+                           "opacity", 0xff,
+                           NULL);
+
+    priv->visible_children++;
+
+    node = hrn_tileable_get_node ((HrnTileable *) actor);
+
+    g_signal_handlers_block_by_func (actor, child_visibility_changed_cb,
+                                     cluster);
+    hrn_cluster_node_set_children_hidden (node, FALSE);
+    g_signal_handlers_unblock_by_func (actor, child_visibility_changed_cb,
+                                       cluster);
+}
+
+static void
+move_child (ClutterActor *actor,
+            int           x,
+            int           y)
+{
+    HrnClusterNode *node;
+
+    node = hrn_tileable_get_node ((HrnTileable *) actor);
+    g_print ("Moving child to %d, %d\n", x, y);
+
+    hrn_tileable_set_position ((HrnTileable *) actor, x, y);
+
+    /* FIXME: Check that we're on screen */
+    clutter_actor_animate (actor, CLUTTER_EASE_IN_OUT_CUBIC, 500,
+                           "x", X_GRID_TO_COORDS (x),
+                           "y", Y_GRID_TO_COORDS (y),
+                           NULL);
+}
+
+static void
+show_this_node (HrnCluster *cluster)
+{
+    HrnClusterPrivate *priv = cluster->priv;
+    GSequenceIter *iter;
+
+    if (priv->node == NULL) {
+        return;
+    }
+
+    clutter_actor_show ((ClutterActor *) priv->up_tile);
+    clutter_actor_animate ((ClutterActor *) priv->up_tile,
+                           CLUTTER_EASE_IN_OUT_CUBIC, 500,
+                           "opacity", 0xff,
+                           NULL);
+
+    iter = g_sequence_get_begin_iter (priv->node->children);
+    while (g_sequence_iter_is_end (iter) == FALSE) {
+        HrnClusterNode *child_node = g_sequence_get (iter);
+        ClutterActor *child;
+
+        g_print ("showing %s\n", child_node->name);
+        child = g_hash_table_lookup (priv->child_items, child_node);
+        if (child == NULL) {
+            g_warning ("%s No child found for %s",
+                       G_STRLOC, child_node->name);
+            iter = g_sequence_iter_next (iter);
+            continue;
+        }
+
+        if (child == (ClutterActor *) priv->shown_child
+            && HRN_IS_TILER (child)) {
+            hrn_tiler_set_expanded ((HrnTiler *) child, FALSE);
+        }
+
+        show_child (cluster, child);
+        iter = g_sequence_iter_next (iter);
+    }
+
+    priv->shown_child = NULL;
+    if (priv->expanded) {
+        layout_cluster (cluster);
+    }
+}
+
+static void
+tiler_show_node (HrnTiler       *tiler,
+                 HrnClusterNode *node)
+{
+    HrnCluster *cluster = (HrnCluster *) tiler;
+    HrnClusterPrivate *priv = cluster->priv;
+
+    /* If we have to show this node, then we close the shown child,
+       and show all our items */
+    if (priv->node == node) {
+        show_this_node (cluster);
+    } else if (HRN_IS_TILER (priv->shown_child)) {
+        hrn_tiler_show_node ((HrnTiler *) priv->shown_child, node);
+    }
+}
+
+static void
 add_item (HrnCluster     *cluster,
           HrnClusterNode *child)
 {
@@ -531,8 +634,11 @@ tiler_set_expanded (HrnTiler *tiler,
             float gx, gy, iy;
 
             if (child_node->hidden) {
+                g_print ("%s is hidden\n", child_node->name);
                 iter = g_sequence_iter_next (iter);
                 continue;
+            } else {
+                g_print ("%s is shown\n", child_node->name);
             }
 
             child = g_hash_table_lookup (priv->child_items, child_node);
@@ -553,6 +659,7 @@ tiler_set_expanded (HrnTiler *tiler,
 
             clutter_actor_show (child);
             if (is_actor_on_stage (child, ay + iy, gy + ay)) {
+                g_print ("   fading in\n");
                 clutter_actor_animate (child, CLUTTER_EASE_IN_OUT_CUBIC, 500,
                                        "x", gx,
                                        "y", gy,
@@ -561,6 +668,7 @@ tiler_set_expanded (HrnTiler *tiler,
             } else {
                 clutter_actor_set_position (child, gx, gy);
                 clutter_actor_set_opacity (child, 0xff);
+                g_print ("   appeared\n");
             }
 
             priv->count += hrn_tileable_get_count ((HrnTileable *) child);
@@ -654,41 +762,37 @@ set_thumbnail (HrnCluster     *cluster,
                HrnClusterNode *node)
 {
     HrnClusterPrivate *priv = cluster->priv;
+    HrnClusterNode *leaf;
     HrnTextureCache *cache = hrn_texture_cache_get_default ();
-    const char *uri = NULL;
-    BklItemType type = BKL_ITEM_TYPE_AUDIO;
-    YearCluster *year;
-    MonthCluster *month;
-    gboolean rotate = FALSE;
+    HrnItemType type = HRN_ITEM_TYPE_AUDIO;
+    const char *artist;
 
     switch (node->type) {
     case HRN_CLUSTER_NODE_TYPE_ARTIST:
-        uri = ((ArtistCluster *) node->data)->thumbnail_uri;
-        type = BKL_ITEM_TYPE_AUDIO;
+        priv->thumbnail = hrn_texture_cache_get_texture_for_artist (cache,
+                                                                    node->name);
         break;
 
     case HRN_CLUSTER_NODE_TYPE_ALBUM:
-        uri = ((AlbumCluster *) node->data)->thumbnail_uri;
-        type = BKL_ITEM_TYPE_AUDIO;
-        break;
-
-    case HRN_CLUSTER_NODE_TYPE_YEAR:
-        year = (YearCluster *) node->data;
-        uri = year->thumbnail_uri;
-        type = BKL_ITEM_TYPE_IMAGE;
-
-        if (year->orient && g_str_equal (year->orient, "right - top")) {
-            rotate = TRUE;
+        if (((AlbumCluster *) node->data)->artists) {
+            artist = ((AlbumCluster *) node->data)->artists->pdata[0];
+        } else {
+            artist = NULL;
         }
+        priv->thumbnail = hrn_texture_cache_get_texture_for_album (cache,
+                                                                   artist,
+                                                                   node->name);
         break;
 
+    case HRN_CLUSTER_NODE_TYPE_YEAR:
     case HRN_CLUSTER_NODE_TYPE_MONTH:
-        month = (MonthCluster *) node->data;
-        uri = month->thumbnail_uri;
-        type = BKL_ITEM_TYPE_IMAGE;
-
-        if (month->orient && g_str_equal (month->orient, "right - top")) {
-            rotate = TRUE;
+        leaf = hrn_cluster_node_get_first_leaf (node);
+        if (leaf == NULL || leaf->type != HRN_CLUSTER_NODE_TYPE_IMAGE) {
+            g_warning ("There is no leaf node for %s\n", node->name);
+            type = HRN_ITEM_TYPE_IMAGE;
+        } else {
+            priv->thumbnail = hrn_texture_cache_get_texture_for_item
+                (cache, ((TileCluster *) leaf->data)->item);
         }
         break;
 
@@ -696,20 +800,7 @@ set_thumbnail (HrnCluster     *cluster,
         break;
     }
 
-    if (uri) {
-        priv->thumbnail = hrn_texture_cache_get_texture (cache, uri);
-        if (rotate) {
-            clutter_actor_set_anchor_point_from_gravity
-                (priv->thumbnail, CLUTTER_GRAVITY_CENTER);
-
-            clutter_actor_set_rotation (priv->thumbnail,
-                                        CLUTTER_Z_AXIS, 90,
-                                        0, 0, 0);
-
-            clutter_actor_set_anchor_point_from_gravity
-                (priv->thumbnail, CLUTTER_GRAVITY_SOUTH_WEST);
-        }
-    } else {
+    if (priv->thumbnail == NULL) {
         priv->thumbnail = hrn_texture_cache_get_default_texture (cache, type);
     }
 
@@ -723,7 +814,7 @@ set_thumbnail (HrnCluster     *cluster,
     g_signal_connect (priv->frame, "secondary-action",
                       G_CALLBACK (thumbnail_secondary_cb), cluster);
 
-    nbtk_table_add_actor ((NbtkTable *) priv->table, priv->frame, 0, 0);
+    mx_table_add_actor ((MxTable *) priv->table, priv->frame, 0, 0);
 }
 
 static void
@@ -809,6 +900,7 @@ tiler_interface_init (HrnTilerInterface 
 {
     iface->show_all = tiler_show_all;
     iface->show = tiler_show;
+    iface->show_node = tiler_show_node;
     iface->set_expanded = tiler_set_expanded;
     iface->set_items_per_row = tiler_set_items_per_row;
     iface->add_items = tiler_add_items;
@@ -895,7 +987,7 @@ label_clicked_cb (ClutterActor       *ac
         return FALSE;
     }
 
-    text = nbtk_label_get_text ((NbtkLabel *) actor);
+    text = mx_label_get_text ((MxLabel *) actor);
     hrn_tileable_activated ((HrnTileable *) cluster,
                             HRN_TILEABLE_ACTION_SEARCH, (gpointer) text);
     return TRUE;
@@ -906,7 +998,7 @@ label_enter_cb (ClutterActor         *ac
                 ClutterCrossingEvent *event,
                 HrnCluster           *cluster)
 {
-    nbtk_widget_set_style_pseudo_class ((NbtkWidget *) actor, "hover");
+    mx_stylable_set_style_pseudo_class (MX_STYLABLE (actor), "hover");
     return TRUE;
 }
 
@@ -915,7 +1007,7 @@ label_leave_cb (ClutterActor         *ac
                 ClutterCrossingEvent *event,
                 HrnCluster           *cluster)
 {
-    nbtk_widget_set_style_pseudo_class ((NbtkWidget *) actor, NULL);
+    mx_stylable_set_style_pseudo_class (MX_STYLABLE (actor), NULL);
     return TRUE;
 }
 
@@ -935,7 +1027,7 @@ hrn_cluster_init (HrnCluster *self)
     priv->count = 1;
 
     /* The table displays the information when the cluster is collapsed */
-    priv->table = nbtk_table_new ();
+    priv->table = mx_table_new ();
     clutter_actor_set_size ((ClutterActor *) priv->table, ITEM_WIDTH, ITEM_HEIGHT);
     clutter_container_add_actor ((ClutterContainer *) self,
                                  (ClutterActor *) priv->table);
@@ -948,8 +1040,8 @@ hrn_cluster_init (HrnCluster *self)
                       G_CALLBACK (thumbnail_clicked_cb), self);
 #endif
 
-    priv->primary = nbtk_label_new ("");
-    nbtk_widget_set_style_class_name (priv->primary, "HrnTileablePrimary");
+    priv->primary = mx_label_new_with_text ("");
+    clutter_actor_set_name (priv->primary, "hrn-tileable-primary");
     clutter_actor_set_reactive ((ClutterActor *) priv->primary, TRUE);
     g_signal_connect (priv->primary, "button-release-event",
                       G_CALLBACK (label_clicked_cb), self);
@@ -957,32 +1049,32 @@ hrn_cluster_init (HrnCluster *self)
                       G_CALLBACK (label_enter_cb), self);
     g_signal_connect (priv->primary, "leave-event",
                       G_CALLBACK (label_leave_cb), self);
-    nbtk_table_add_actor_with_properties (NBTK_TABLE (priv->table),
+    mx_table_add_actor_with_properties (MX_TABLE (priv->table),
                                           (ClutterActor *) priv->primary, 1, 0,
                                           "x-expand", FALSE,
                                           "x-fill", FALSE,
                                           "y-expand", FALSE,
                                           "y-fill", FALSE,
-                                          "x-align", 0.0,
+                                          "x-align", MX_ALIGN_START,
                                           NULL);
 
-    priv->secondary = nbtk_label_new ("");
-    nbtk_widget_set_style_class_name (priv->secondary, "HrnTileableSecondary");
-    clutter_actor_set_reactive ((ClutterActor *) priv->secondary, TRUE);
+    priv->secondary = mx_label_new_with_text ("");
+    clutter_actor_set_name (priv->secondary, "hrn-tileable-secondary");
+    clutter_actor_set_reactive (priv->secondary, TRUE);
     g_signal_connect (priv->secondary, "button-release-event",
                       G_CALLBACK (label_clicked_cb), self);
     g_signal_connect (priv->secondary, "enter-event",
                       G_CALLBACK (label_enter_cb), self);
     g_signal_connect (priv->secondary, "leave-event",
                       G_CALLBACK (label_leave_cb), self);
-    nbtk_table_add_actor_with_properties (NBTK_TABLE (priv->table),
+    mx_table_add_actor_with_properties (MX_TABLE (priv->table),
                                           (ClutterActor *) priv->secondary,
                                           2, 0,
                                           "x-expand", FALSE,
                                           "x-fill", FALSE,
                                           "y-expand", FALSE,
                                           "y-fill", FALSE,
-                                          "x-align", 0.0,
+                                          "x-align", MX_ALIGN_START,
                                           NULL);
 
     if (priv->expanded) {
@@ -1017,48 +1109,6 @@ hide_child (HrnCluster   *cluster,
 }
 
 static void
-show_child (HrnCluster   *cluster,
-            ClutterActor *actor)
-{
-    HrnClusterPrivate *priv = cluster->priv;
-    HrnClusterNode *node;
-
-    clutter_actor_show (actor);
-    clutter_actor_animate (actor, CLUTTER_EASE_IN_OUT_CUBIC, 500,
-                           "opacity", 0xff,
-                           NULL);
-
-    priv->visible_children++;
-
-    node = hrn_tileable_get_node ((HrnTileable *) actor);
-
-    g_signal_handlers_block_by_func (actor, child_visibility_changed_cb,
-                                     cluster);
-    hrn_cluster_node_set_children_hidden (node, FALSE);
-    g_signal_handlers_unblock_by_func (actor, child_visibility_changed_cb,
-                                       cluster);
-}
-
-static void
-move_child (ClutterActor *actor,
-            int           x,
-            int           y)
-{
-    HrnClusterNode *node;
-
-    node = hrn_tileable_get_node ((HrnTileable *) actor);
-    g_print ("Moving child to %d, %d\n", x, y);
-
-    hrn_tileable_set_position ((HrnTileable *) actor, x, y);
-
-    /* FIXME: Check that we're on screen */
-    clutter_actor_animate (actor, CLUTTER_EASE_IN_OUT_CUBIC, 500,
-                           "x", X_GRID_TO_COORDS (x),
-                           "y", Y_GRID_TO_COORDS (y),
-                           NULL);
-}
-
-static void
 child_activated_cb (HrnTileable      *tileable,
                     HrnTileableAction action,
                     gpointer          payload,
diff -pruN 1.5.1-1/src/hrn-cluster-node.c 1.8.4-1/src/hrn-cluster-node.c
--- 1.5.1-1/src/hrn-cluster-node.c	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-cluster-node.c	2010-02-17 17:26:44.000000000 +0000
@@ -1,3 +1,23 @@
+/*
+ * Hornsey - Moblin Media Player.
+ * Copyright © 2009, 2010 Intel Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU Lesser General Public License,
+ * version 2.1, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <string.h>
+
 #include "hrn-cluster-node.h"
 
 enum {
@@ -51,9 +71,9 @@ free_album_cluster (AlbumCluster *cluste
 }
 
 static void
-free_track_cluster (TrackCluster *cluster)
+free_tile_cluster (TileCluster *cluster)
 {
-    g_slice_free (TrackCluster, cluster);
+    g_slice_free (TileCluster, cluster);
 }
 
 static void
@@ -73,18 +93,6 @@ free_month_cluster (MonthCluster *cluste
 }
 
 static void
-free_picture_cluster (PictureCluster *cluster)
-{
-    g_slice_free (PictureCluster, cluster);
-}
-
-static void
-free_video_cluster (VideoCluster *cluster)
-{
-    g_slice_free (VideoCluster, cluster);
-}
-
-static void
 hrn_cluster_node_finalize (GObject *object)
 {
     HrnClusterNode *self = (HrnClusterNode *) object;
@@ -125,7 +133,9 @@ hrn_cluster_node_finalize (GObject *obje
         break;
 
     case HRN_CLUSTER_NODE_TYPE_TRACK:
-        free_track_cluster ((TrackCluster *) self->data);
+    case HRN_CLUSTER_NODE_TYPE_IMAGE:
+    case HRN_CLUSTER_NODE_TYPE_VIDEO:
+        free_tile_cluster ((TileCluster *) self->data);
         break;
 
     case HRN_CLUSTER_NODE_TYPE_YEAR:
@@ -136,14 +146,6 @@ hrn_cluster_node_finalize (GObject *obje
         free_month_cluster ((MonthCluster *) self->data);
         break;
 
-    case HRN_CLUSTER_NODE_TYPE_IMAGE:
-        free_picture_cluster ((PictureCluster *) self->data);
-        break;
-
-    case HRN_CLUSTER_NODE_TYPE_VIDEO:
-        free_video_cluster ((VideoCluster *) self->data);
-        break;
-
     default:
         break;
     }
@@ -268,7 +270,7 @@ hrn_cluster_node_add_child (HrnClusterNo
     child->iter = g_sequence_insert_sorted (parent->children, child,
                                             parent->sorter, NULL);
     if (child->parent != NULL) {
-        g_warning ("Child %s is already owned\n", child->name);
+        g_warning ("Child %s is already owned", child->name);
     }
 
     child->parent = parent;
@@ -298,6 +300,7 @@ hrn_cluster_node_remove_child (HrnCluste
         parent->visible_children--;
     }
     g_sequence_remove (child->iter);
+    child->parent = NULL;
 
     g_signal_emit (parent, signals[CHILD_REMOVED], 0, child);
 }
@@ -356,7 +359,8 @@ hrn_cluster_node_set_children_hidden (Hr
 HrnClusterNode *
 hrn_cluster_node_get_first_leaf (HrnClusterNode *parent)
 {
-    if (parent == NULL || parent->children == NULL) {
+    if (parent == NULL || parent->children == NULL ||
+        g_sequence_get_length (parent->children) == 0) {
         return parent;
     } else {
         GSequenceIter *iter;
@@ -439,3 +443,89 @@ hrn_cluster_node_get_previous_leaf (HrnC
         return hrn_cluster_node_get_last_leaf (child);
     }
 }
+
+/* Matches all words */
+static gboolean
+filter_node_name (const char *name,
+                  char      **search_terms)
+{
+    int i;
+    char *up_name;
+
+    up_name = g_ascii_strup (name, -1);
+
+    for (i = 0; search_terms[i]; i++) {
+        if (strstr (up_name, search_terms[i]) == NULL) {
+            g_free (up_name);
+            return FALSE;
+        }
+    }
+
+    g_free (up_name);
+
+    return TRUE;
+}
+
+gboolean
+hrn_cluster_node_filter (HrnClusterNode *node,
+                         char          **search_terms)
+{
+    GSequenceIter *iter;
+    gboolean child_matched = FALSE;
+
+    g_return_val_if_fail (node != NULL, FALSE);
+
+    if (node->name == NULL) {
+        return FALSE;
+    }
+
+    if (filter_node_name (node->name, search_terms)) {
+        /* Yes, this node matches, so all children match */
+        hrn_cluster_node_set_children_hidden (node, FALSE);
+        return TRUE;
+    }
+
+    /* No, the node did not match, but maybe some of the children will */
+
+    if (node->children == NULL ||
+        g_sequence_get_length (node->children) == 0) {
+        /* We have no children, so this must be a leaf node
+           and it doesn't match */
+        hrn_cluster_node_set_hidden (node, TRUE);
+        return FALSE;
+    }
+
+    iter = g_sequence_get_begin_iter (node->children);
+
+    /* Look for children which did match */
+    while (g_sequence_iter_is_end (iter) == FALSE) {
+        HrnClusterNode *child_node = g_sequence_get (iter);
+
+        child_matched |= hrn_cluster_node_filter (child_node, search_terms);
+        iter = g_sequence_iter_next (iter);
+    }
+
+    if (child_matched) {
+        /* This node has a matched child, so it also matches */
+        hrn_cluster_node_set_hidden (node, FALSE);
+        return TRUE;
+    } else {
+        /* This node has no matched children, so it doesn't match */
+        hrn_cluster_node_set_hidden (node, TRUE);
+        return FALSE;
+    }
+}
+
+void
+hrn_cluster_node_filter_string (HrnClusterNode *node,
+                                const char     *text)
+{
+    char **search_terms, *search_text;
+
+    search_text = g_ascii_strup (text, -1);
+    search_terms = g_strsplit_set (search_text, " ", 0);
+    g_free (search_text);
+
+    hrn_cluster_node_filter (node, search_terms);
+    g_strfreev (search_terms);
+}
diff -pruN 1.5.1-1/src/hrn-cluster-node.h 1.8.4-1/src/hrn-cluster-node.h
--- 1.5.1-1/src/hrn-cluster-node.h	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-cluster-node.h	2010-02-17 17:26:44.000000000 +0000
@@ -2,7 +2,8 @@
 #define __HRN_CLUSTER_NODE_H__
 
 #include <glib-object.h>
-#include <bickley/bkl-item.h>
+
+#include "hrn-item.h"
 
 G_BEGIN_DECLS
 
@@ -58,9 +59,9 @@ typedef struct _AlbumCluster {
     int year;
 } AlbumCluster;
 
-typedef struct _TrackCluster {
-    BklItem *item;
-} TrackCluster;
+typedef struct _TileCluster {
+    HrnItem *item;
+} TileCluster;
 
 typedef struct _ImageCluster {
     GHashTable *year_to_cluster;
@@ -79,14 +80,6 @@ typedef struct _MonthCluster {
     int month;
 } MonthCluster;
 
-typedef struct _PictureCluster {
-    BklItem *item;
-} PictureCluster;
-
-typedef struct _VideoCluster {
-    BklItem *item;
-} VideoCluster;
-
 typedef struct _HrnClusterNodePrivate HrnClusterNodePrivate;
 typedef struct _HrnClusterNode      HrnClusterNode;
 typedef struct _HrnClusterNodeClass HrnClusterNodeClass;
@@ -138,7 +131,10 @@ HrnClusterNode *hrn_cluster_node_get_pre
 
 void hrn_cluster_node_set_children_hidden (HrnClusterNode *node,
                                            gboolean        hidden);
-
+gboolean hrn_cluster_node_filter (HrnClusterNode *node,
+                                  char          **search_terms);
+void hrn_cluster_node_filter_string (HrnClusterNode *node,
+                                     const char     *text);
 
 G_END_DECLS
 
diff -pruN 1.5.1-1/src/hrn-cluster-thumbnail.c 1.8.4-1/src/hrn-cluster-thumbnail.c
--- 1.5.1-1/src/hrn-cluster-thumbnail.c	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-cluster-thumbnail.c	2010-02-17 17:26:44.000000000 +0000
@@ -211,7 +211,7 @@ hrn_cluster_thumbnail_set_elements (HrnC
 void
 hrn_cluster_thumbnail_set_thumbnail (HrnClusterThumbnail *self,
                                      const char          *uri,
-                                     BklItemType          type)
+                                     HrnItemType          type)
 {
     HrnClusterThumbnailPrivate *priv = self->priv;
     HrnTextureCache *cache = hrn_texture_cache_get_default ();
diff -pruN 1.5.1-1/src/hrn-cluster-thumbnail.h 1.8.4-1/src/hrn-cluster-thumbnail.h
--- 1.5.1-1/src/hrn-cluster-thumbnail.h	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-cluster-thumbnail.h	2010-02-17 17:26:44.000000000 +0000
@@ -2,7 +2,6 @@
 #define __HRN_CLUSTER_THUMBNAIL_H__
 
 #include <clutter/clutter.h>
-#include <bickley/bkl-item.h>
 
 G_BEGIN_DECLS
 
@@ -48,7 +47,7 @@ void hrn_cluster_thumbnail_set_elements 
                                          GPtrArray           *elements);
 void hrn_cluster_thumbnail_set_thumbnail (HrnClusterThumbnail *self,
                                           const char          *uri,
-                                          BklItemType          type);
+                                          HrnItemType          type);
 
 G_END_DECLS
 
diff -pruN 1.5.1-1/src/hrn-cluster-tree.c 1.8.4-1/src/hrn-cluster-tree.c
--- 1.5.1-1/src/hrn-cluster-tree.c	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-cluster-tree.c	2010-02-17 17:26:44.000000000 +0000
@@ -4,16 +4,12 @@
 #include <glib.h>
 #include <glib/gi18n.h>
 
-#include <bickley/bkl-item.h>
-#include <bickley/bkl-item-audio.h>
-#include <bickley/bkl-item-image.h>
-#include <bickley/bkl-item-video.h>
-
+#include "hrn-item.h"
 #include "hrn-cluster-node.h"
 #include "hrn-cluster-tree.h"
 
 typedef struct _ClusterItem {
-    BklItem *item;
+    HrnItem *item;
     HrnClusterNode *node;
 } ClusterItem;
 
@@ -52,17 +48,24 @@ sort_tracks (gconstpointer a,
              gpointer      userdata)
 {
     HrnClusterNode *node_a, *node_b;
-    TrackCluster *item_a, *item_b;
-    guint track_a, track_b;
+    TileCluster *item_a, *item_b;
+    const char *tmp;
+    guint track_a = 0, track_b = 0;
 
     node_a = (HrnClusterNode *) a;
     node_b = (HrnClusterNode *) b;
 
-    item_a = (TrackCluster *) node_a->data;
-    item_b = (TrackCluster *) node_b->data;
+    item_a = (TileCluster *) node_a->data;
+    item_b = (TileCluster *) node_b->data;
 
-    track_a = bkl_item_audio_get_track ((BklItemAudio *) item_a->item);
-    track_b = bkl_item_audio_get_track ((BklItemAudio *) item_b->item);
+    tmp = hrn_item_get_metadata (item_a->item, HRN_ITEM_METADATA_TRACK);
+    if (tmp) {
+        track_a = atoi (tmp);
+    }
+    tmp = hrn_item_get_metadata (item_b->item, HRN_ITEM_METADATA_TRACK);
+    if (tmp) {
+        track_b = atoi (tmp);
+    }
 
     if (track_a == 0 && track_b > 0) {
         return -1;
@@ -73,8 +76,8 @@ sort_tracks (gconstpointer a,
     } else {
         const char *name_a, *name_b;
 
-        name_a = bkl_item_audio_get_title ((BklItemAudio *) item_a->item);
-        name_b = bkl_item_audio_get_title ((BklItemAudio *) item_b->item);
+        name_a = hrn_item_get_metadata (item_a->item, HRN_ITEM_METADATA_TITLE);
+        name_b = hrn_item_get_metadata (item_b->item, HRN_ITEM_METADATA_TITLE);
 
         if (name_a == NULL) {
             return -1;
@@ -101,38 +104,22 @@ make_album_name (const char *name)
 
 /* merge @src into @dest without duplicating */
 static void
-merge_artists (GPtrArray *dest,
-               GPtrArray *src)
+merge_artists (GPtrArray  *dest,
+               const char *artist)
 {
     int i;
 
-    if (src == NULL) {
+    if (artist == NULL || *artist == '\0') {
         return;
     }
 
-    /* FIXME: This could be speeded up for large cases by using a hashtable.
-       --- a) Add all entries in @src into hashtable
-           b) Remove all entries in @dest from hashtable
-           c) Add the entries left in hashtable to dest
-
-           Thing is, large numbers of items in @dest and @src
-           are not very common, so it might not be worth the extra overhead
-    */
-    for (i = 0; i < src->len; i++) {
-        int j;
-
-        for (j = 0; j < dest->len; j++) {
-            if (g_ascii_strcasecmp (src->pdata[i], dest->pdata[j]) == 0) {
-                /* Found match, skip */
-                goto next_src;
-            }
+    for (i = 0; i < dest->len; i++) {
+        if (g_ascii_strcasecmp (dest->pdata[i], artist) == 0) {
+            return;
         }
-
-        g_ptr_array_add (dest, g_strdup (src->pdata[i]));
-
-      next_src:
-        ; /* No-op */
     }
+
+    g_ptr_array_add (dest, g_strdup (artist));
 }
 
 static int
@@ -244,13 +231,13 @@ remove_album_from_artist (HrnClusterNode
 
 static void
 add_audio_item (HrnClusterTree *tree,
-                BklItemAudio   *audio)
+                HrnItem        *item)
 {
     HrnClusterNode *root = tree->audio;
     AudioCluster *cluster = root->data;
     ArtistCluster *artist_cluster;
     AlbumCluster *album_cluster;
-    TrackCluster *track_cluster;
+    TileCluster *tile_cluster;
     HrnClusterNode *track;
     HrnClusterNode *artist;
     HrnClusterNode *album;
@@ -262,21 +249,22 @@ add_audio_item (HrnClusterTree *tree,
     /* No sorter for the item as it has no children */
     track = hrn_cluster_node_new (HRN_CLUSTER_NODE_TYPE_TRACK, NULL);
 
-    track->name = g_strdup (bkl_item_audio_get_title (audio));
-    track_cluster = g_slice_new (TrackCluster);
-    track_cluster->item = (BklItem *) audio;
-    track->data = (gpointer) track_cluster;
+    track->name = g_strdup (hrn_item_get_metadata (item,
+                                                   HRN_ITEM_METADATA_TITLE));
+    tile_cluster = g_slice_new (TileCluster);
+    tile_cluster->item = item;
+    track->data = (gpointer) tile_cluster;
 
     g_hash_table_insert (tree->uri_to_item,
-                         (char *) bkl_item_get_uri ((BklItem *) audio), track);
+                         (char *) hrn_item_get_uri (item), track);
     ci = g_slice_new (ClusterItem);
-    ci->item = (BklItem *) audio;
+    ci->item = item;
     ci->node = track;
     g_ptr_array_add (tree->items, ci);
 
     /* Each item can only be in one album */
-    album_name = bkl_item_audio_get_album (audio);
-    if (album_name == NULL) {
+    album_name = hrn_item_get_metadata (item, HRN_ITEM_METADATA_ALBUM);
+    if (album_name == NULL || *album_name == '\0') {
         album_name = _("Unknown");
         canonical_album = g_strdup ("Unknown");
     } else {
@@ -301,6 +289,7 @@ add_audio_item (HrnClusterTree *tree,
         album_cluster = (AlbumCluster *) album->data;
     }
 
+#if 0
     if (album_cluster->thumbnail_uri == NULL) {
         const char *thumb;
 
@@ -309,12 +298,16 @@ add_audio_item (HrnClusterTree *tree,
             album_cluster->thumbnail_uri = g_strdup (thumb);
         }
     }
+#endif
 
     /* Update the year if we need to */
     if (album_cluster->year == 0) {
-        const char *year = bkl_item_audio_get_year (audio);
+        const char *year = hrn_item_get_metadata (item,
+                                                  HRN_ITEM_METADATA_DATE);
 
         if (year) {
+            /* year is in yyyy-mm-dd format, so this will give us the
+               yyyy portion */
             album_cluster->year = atoi (year);
         }
     }
@@ -324,7 +317,8 @@ add_audio_item (HrnClusterTree *tree,
 
     /* Now work out what artist this album belongs to */
     artist_count = album_cluster->artists->len;
-    merge_artists (album_cluster->artists, bkl_item_audio_get_artists (audio));
+    merge_artists (album_cluster->artists,
+                   hrn_item_get_metadata (item, HRN_ITEM_METADATA_ARTIST));
 
     if (album_cluster->artists->len != artist_count) {
         char *canonical;
@@ -375,6 +369,7 @@ add_audio_item (HrnClusterTree *tree,
     if (artist) { /* Should never be NULL, but just to check */
         artist_cluster = (ArtistCluster *) artist->data;
 
+#if 0
         /* FIXME: Should allow max 5 thumbnails */
         if (artist_cluster->thumbnail_uri == NULL) {
             const char *thumb;
@@ -384,6 +379,7 @@ add_audio_item (HrnClusterTree *tree,
                 artist_cluster->thumbnail_uri = g_strdup (thumb);
             }
         }
+#endif
     }
 }
 
@@ -411,7 +407,7 @@ dump_tracks (HrnClusterNode *node)
 
     while (g_sequence_iter_is_end (iter) == FALSE) {
         HrnClusterNode *child = g_sequence_get (iter);
-        TrackCluster *track = (TrackCluster *) child->data;
+        TileCluster *track = (TileCluster *) child->data;
 
         g_print ("      (%d) %s\n",
                  bkl_item_audio_get_track ((BklItemAudio *) track->item),
@@ -555,7 +551,7 @@ static char *months[12] = {
 
 static void
 add_image_item (HrnClusterTree *tree,
-                BklItemImage   *image)
+                HrnItem        *item)
 {
     HrnClusterNode *root = tree->image;
     ImageCluster *cluster = root->data;
@@ -564,13 +560,13 @@ add_image_item (HrnClusterTree *tree,
     HrnClusterNode *picture_node;
     YearCluster *year_cluster;
     MonthCluster *month_cluster;
-    PictureCluster *picture_cluster;
+    TileCluster *tile_cluster;
     ClusterItem *ci;
     const char *date_taken;
     int m, y;
     char *month, *year, *canonical, *title;
 
-    date_taken = bkl_item_image_get_time_original (image);
+    date_taken = hrn_item_get_metadata (item, HRN_ITEM_METADATA_DATE);
     if (date_taken == NULL || *date_taken == '\0') {
         m = 13;
         y = 0;
@@ -580,7 +576,7 @@ add_image_item (HrnClusterTree *tree,
         m = atoi (date_taken + 5);
         y = atoi (date_taken);
 
-        if (m == 0) {
+        if ((m < 1) || (m > 12)) {
             month = g_strdup (_("Unknown"));
         } else {
             month = g_strdup (_(months[m - 1]));
@@ -614,6 +610,7 @@ add_image_item (HrnClusterTree *tree,
         g_free (year);
     }
 
+#if 0
     if (year_cluster->thumbnail_uri == NULL) {
         const char *thumb;
 
@@ -623,6 +620,7 @@ add_image_item (HrnClusterTree *tree,
             year_cluster->orient = g_strdup (bkl_item_image_get_orientation (image));
         }
     }
+#endif
 
     month_node = g_hash_table_lookup (cluster->month_to_cluster, canonical);
     if (month_node == NULL) {
@@ -645,6 +643,7 @@ add_image_item (HrnClusterTree *tree,
         g_free (month);
     }
 
+#if 0
     if (month_cluster->thumbnail_uri == NULL) {
         const char *thumb;
 
@@ -654,11 +653,12 @@ add_image_item (HrnClusterTree *tree,
             month_cluster->orient = g_strdup (bkl_item_image_get_orientation (image));
         }
     }
+#endif
 
     picture_node = hrn_cluster_node_new (HRN_CLUSTER_NODE_TYPE_IMAGE, NULL);
-    title = (char *) bkl_item_image_get_title (image);
+    title = (char *) hrn_item_get_metadata (item, HRN_ITEM_METADATA_TITLE);
     if (title == NULL) {
-        const char *uri = bkl_item_get_uri ((BklItem *) image);
+        const char *uri = hrn_item_get_uri (item);
 
         /* FIXME: Remove extension */
         title = g_path_get_basename (uri);
@@ -669,45 +669,45 @@ add_image_item (HrnClusterTree *tree,
     picture_node->name = title;
     picture_node->canonical_name = g_strdup (title);
 
-    picture_cluster = g_slice_new (PictureCluster);
-    picture_cluster->item = (BklItem *) image;
-    picture_node->data = (gpointer) picture_cluster;
+    tile_cluster = g_slice_new (TileCluster);
+    tile_cluster->item = item;
+    picture_node->data = (gpointer) tile_cluster;
 
     hrn_cluster_node_add_child (month_node, picture_node);
 
     g_hash_table_insert (tree->uri_to_item,
-                         (char *) bkl_item_get_uri ((BklItem *) image),
+                         (char *) hrn_item_get_uri (item),
                          picture_node);
 
     ci = g_slice_new (ClusterItem);
-    ci->item = (BklItem *) image;
+    ci->item = item;
     ci->node = picture_node;
     g_ptr_array_add (tree->items, ci);
 }
 
 static void
 add_video_item (HrnClusterTree *tree,
-                BklItemVideo   *video)
+                HrnItem        *item)
 {
     HrnClusterNode *root = tree->video;
     HrnClusterNode *video_node;
-    VideoCluster *video_cluster;
+    TileCluster *tile_cluster;
     ClusterItem *ci;
 
     video_node = hrn_cluster_node_new (HRN_CLUSTER_NODE_TYPE_VIDEO, NULL);
-    video_node->name = g_path_get_basename (bkl_item_get_uri ((BklItem *) video));
+    video_node->name = g_path_get_basename (hrn_item_get_uri (item));
     video_node->canonical_name = g_strdup (video_node->name);
 
-    video_cluster = g_slice_new (VideoCluster);
-    video_cluster->item = (BklItem *) video;
-    video_node->data = (gpointer) video_cluster;
+    tile_cluster = g_slice_new (TileCluster);
+    tile_cluster->item = item;
+    video_node->data = (gpointer) tile_cluster;
 
     g_hash_table_insert (tree->uri_to_item,
-                         (char *) bkl_item_get_uri ((BklItem *) video),
+                         (char *) hrn_item_get_uri (item),
                          video_node);
 
     ci = g_slice_new (ClusterItem);
-    ci->item = (BklItem *) video;
+    ci->item = item;
     ci->node = video_node;
     g_ptr_array_add (tree->items, ci);
 
@@ -776,19 +776,19 @@ hrn_cluster_tree_new (void)
 
 void
 hrn_cluster_tree_add_item (HrnClusterTree *tree,
-                           BklItem        *item)
+                           HrnItem        *item)
 {
-    switch (bkl_item_get_item_type (item)) {
-    case BKL_ITEM_TYPE_AUDIO:
-        add_audio_item (tree, (BklItemAudio *) item);
+    switch (hrn_item_get_item_type (item)) {
+    case HRN_ITEM_TYPE_AUDIO:
+        add_audio_item (tree, item);
         break;
 
-    case BKL_ITEM_TYPE_IMAGE:
-        add_image_item (tree, (BklItemImage *) item);
+    case HRN_ITEM_TYPE_IMAGE:
+        add_image_item (tree, item);
         break;
 
-    case BKL_ITEM_TYPE_VIDEO:
-        add_video_item (tree, (BklItemVideo *) item);
+    case HRN_ITEM_TYPE_VIDEO:
+        add_video_item (tree, item);
         break;
 
     default:
@@ -819,7 +819,7 @@ hrn_cluster_tree_dump_items (HrnClusterT
     for (i = 0; i < tree->items->len; i++) {
         ClusterItem *ci = tree->items->pdata[i];
 
-        g_print ("%s\n", bkl_item_get_uri (ci->item));
+        g_print ("%s\n", hrn_item_get_uri (ci->item));
         hrn_cluster_tree_dump_node (ci->node, 3);
     }
 }
@@ -832,7 +832,7 @@ hrn_cluster_tree_filter_items (HrnCluste
 
     for (i = 0; i < tree->items->len; i++) {
         ClusterItem *ci = tree->items->pdata[i];
-        const char *uri = bkl_item_get_uri (ci->item);
+        const char *uri = hrn_item_get_uri (ci->item);
 
         /* If filter is NULL then we want to show all results */
         if (filter == NULL || g_hash_table_lookup (filter, uri)) {
@@ -843,72 +843,20 @@ hrn_cluster_tree_filter_items (HrnCluste
     }
 }
 
-static gboolean
-filter_node_name (const char *name,
-                  char      **search_terms)
-{
-    int i;
-    char *up_name;
-
-    up_name = g_ascii_strup (name, -1);
-
-    for (i = 0; search_terms[i]; i++) {
-        if (strstr (up_name, search_terms[i]) == FALSE) {
-            g_free (up_name);
-            return FALSE;
-        }
-    }
-
-    g_free (up_name);
-
-    return TRUE;
-}
-
-static void
-filter_node (HrnClusterNode *node,
-             char          **search_terms)
-{
-    if (node->type == HRN_CLUSTER_NODE_TYPE_TRACK ||
-        node->type == HRN_CLUSTER_NODE_TYPE_IMAGE) {
-        return;
-    }
-
-    if (node->children) {
-        GSequenceIter *iter = g_sequence_get_begin_iter (node->children);
-
-        while (g_sequence_iter_is_end (iter) == FALSE) {
-            HrnClusterNode *child_node = g_sequence_get (iter);
-
-            filter_node (child_node, search_terms);
-            iter = g_sequence_iter_next (iter);
-        }
-    }
-
-    if (node->type == HRN_CLUSTER_NODE_TYPE_AUDIO_ROOT ||
-        node->type == HRN_CLUSTER_NODE_TYPE_IMAGE_ROOT) {
-        return;
-    }
-
-    if (filter_node_name (node->name, search_terms)) {
-        hrn_cluster_node_set_children_hidden (node, FALSE);
-    }
-}
-
 void
 hrn_cluster_tree_filter_nodes (HrnClusterTree *tree,
                                const char     *text)
 {
     char **search_terms, *search_text;
 
-    search_text  = g_ascii_strup (text, -1);
+    search_text = g_ascii_strup (text, -1);
     /* FIXME: Should we just remove all punctuation? */
     search_terms = g_strsplit_set (search_text, " :➜", 0);
     g_free (search_text);
 
-    filter_node (tree->audio, search_terms);
-    filter_node (tree->image, search_terms);
-    /* Don't need to filter video because there are no nodes
-       and all video items will be filtered by filter_items */
+    hrn_cluster_node_filter (tree->audio, search_terms);
+    hrn_cluster_node_filter (tree->image, search_terms);
+    hrn_cluster_node_filter (tree->video, search_terms);
 
     g_strfreev (search_terms);
 }
@@ -957,7 +905,7 @@ remove_child_from_parent (HrnClusterNode
 
 void
 hrn_cluster_tree_remove_item (HrnClusterTree *tree,
-                              BklItem        *item)
+                              HrnItem        *item)
 {
     HrnClusterNode *node = NULL;
     int i, idx = -1;
@@ -975,17 +923,68 @@ hrn_cluster_tree_remove_item (HrnCluster
     }
 
     if (node == NULL) {
-        g_warning ("%s is not contained in the tree", bkl_item_get_uri (item));
+        g_warning ("%s is not contained in the tree", hrn_item_get_uri (item));
+        return;
+    }
+
+    if (idx > -1) {
+        g_ptr_array_remove_index_fast (tree->items, idx);
+    }
+
+    g_hash_table_remove (tree->uri_to_item, hrn_item_get_uri (item));
+
+    if (node->parent) {
+        remove_child_from_parent (node, node->parent);
+    }
+}
+
+void
+hrn_cluster_tree_remove_uri (HrnClusterTree *tree,
+                             const char     *uri)
+{
+    HrnClusterNode *node;
+    int i, idx = -1;
+
+    g_return_if_fail (tree != NULL);
+
+    node = g_hash_table_lookup (tree->uri_to_item, uri);
+    if (node == NULL) {
+        g_warning ("%s is not contained in the tree", uri);
         return;
     }
 
+    /* Find the ClusterItem */
+    for (i = 0; i < tree->items->len; i++) {
+        ClusterItem *ci = tree->items->pdata[i];
+
+        if (ci->node == node) {
+            g_slice_free (ClusterItem, ci);
+            idx = i;
+            break;
+        }
+    }
+
     if (idx > -1) {
         g_ptr_array_remove_index_fast (tree->items, idx);
     }
 
-    g_hash_table_remove (tree->uri_to_item, bkl_item_get_uri (item));
+    g_hash_table_remove (tree->uri_to_item, uri);
 
     if (node->parent) {
         remove_child_from_parent (node, node->parent);
     }
 }
+
+HrnItem *
+hrn_cluster_tree_get_item_for_uri (HrnClusterTree *tree,
+                                   const char     *uri)
+{
+    HrnClusterNode *node = g_hash_table_lookup (tree->uri_to_item, uri);
+
+    if (node) {
+        TileCluster *tile_cluster = (TileCluster *) node->data;
+        return tile_cluster->item;
+    }
+
+    return NULL;
+}
diff -pruN 1.5.1-1/src/hrn-cluster-tree.h 1.8.4-1/src/hrn-cluster-tree.h
--- 1.5.1-1/src/hrn-cluster-tree.h	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-cluster-tree.h	2010-02-17 17:26:44.000000000 +0000
@@ -2,9 +2,9 @@
 #define __HRN_CLUSTERIZER_H__
 
 #include <glib.h>
-#include <bickley/bkl.h>
 
 #include "hrn-cluster-node.h"
+#include "hrn-item.h"
 
 typedef struct _HrnClusterTree {
     HrnClusterNode *audio;
@@ -17,10 +17,16 @@ typedef struct _HrnClusterTree {
 HrnClusterTree *hrn_cluster_tree_new (void);
 void hrn_cluster_tree_free (HrnClusterTree *tree);
 void hrn_cluster_tree_add_item (HrnClusterTree *tree,
-                                BklItem        *item);
+                                HrnItem        *item);
 void hrn_cluster_tree_remove_item (HrnClusterTree *tree,
-                                   BklItem        *item);
+                                   HrnItem        *item);
+void hrn_cluster_tree_remove_uri (HrnClusterTree *tree,
+                                  const char     *uri);
 void hrn_cluster_tree_filter_items (HrnClusterTree *tree,
                                     GHashTable     *filter);
+void hrn_cluster_tree_filter_nodes (HrnClusterTree *tree,
+                                    const char     *text);
+HrnItem *hrn_cluster_tree_get_item_for_uri (HrnClusterTree *tree,
+                                            const char     *uri);
 
 #endif
diff -pruN 1.5.1-1/src/hrn-content-area.c 1.8.4-1/src/hrn-content-area.c
--- 1.5.1-1/src/hrn-content-area.c	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-content-area.c	2010-02-17 17:26:44.000000000 +0000
@@ -1,6 +1,24 @@
+/*
+ * Hornsey - Moblin Media Player.
+ * Copyright © 2009, 2010 Intel Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU Lesser General Public License,
+ * version 2.1, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
 #include <bognor/br-queue.h>
 
-#include <nbtk/nbtk.h>
+#include <mx/mx.h>
 
 #include "hrn.h"
 #include "hrn-view.h"
@@ -8,14 +26,13 @@
 #include "hrn-ui-controls.h"
 #include "hrn-pin-manager.h"
 #include "hrn-content-area.h"
-#include "hrn-source-manager.h"
 #include "hrn-theatre-ui.h"
 
 enum {
     PROP_0,
     PROP_PIN_MANAGER,
     PROP_QUEUE,
-    PROP_SOURCE_MANAGER,
+    PROP_TRACKER,
     PROP_THEATRE_UI,
 };
 
@@ -35,14 +52,20 @@ struct _HrnContentAreaPrivate {
     HrnPinManager *pin_manager;
     BrQueue *local_queue;
     HrnUiControls *controls;
+    guint32 query_id;
 
-    HrnSource *current_source;
-
-    HrnSourceManager *source_manager;
+    HrnTrackerClient *tracker;
 
     guint32 search_id;
 
-    BklItemType filter;
+    HrnItemType filter;
+    HrnClusterTree *tree;
+
+    guint32 level_change_id;
+    guint32 changing_id;
+    int level;
+    int destination_level;
+    HrnClusterNode *current_node;
 };
 
 /* FIXME: These definitions should be stored somewhere global */
@@ -61,52 +84,74 @@ hrn_content_area_finalize (GObject *obje
 static void
 hrn_content_area_dispose (GObject *object)
 {
-    G_OBJECT_CLASS (hrn_content_area_parent_class)->dispose (object);
-}
+    HrnContentArea *area = (HrnContentArea *) object;
+    HrnContentAreaPrivate *priv = area->priv;
 
-static void
-source_manager_ready (HrnSourceManager *manager,
-                      HrnContentArea   *area)
-{
+    if (priv->tracker) {
+        g_object_unref (priv->tracker);
+        priv->tracker = NULL;
+    }
+
+    G_OBJECT_CLASS (hrn_content_area_parent_class)->dispose (object);
 }
 
 static void
-source_added_cb (HrnSourceManager *manager,
-                 HrnSource        *source,
-                 HrnContentArea   *area)
+reload_view (HrnContentArea *area)
 {
     HrnContentAreaPrivate *priv = area->priv;
-    const char *source_path;
-    HrnSidebar *sidebar;
-    gboolean is_local;
+    HrnToolbar *toolbar = hrn_ui_controls_get_toolbar (priv->controls);
+    MxPathBar *path_bar = hrn_toolbar_get_path_bar (toolbar);
+    HrnClusterNode *node;
 
-    source_path = hrn_source_get_object_path (source);
-    is_local = g_str_equal (source_path, BKL_LOCAL_SOURCE_PATH);
-    sidebar = hrn_ui_controls_get_sidebar (priv->controls);
-    hrn_sidebar_add_source (sidebar, source, is_local);
+    switch (priv->filter) {
+    case HRN_ITEM_TYPE_AUDIO:
+        node = priv->tree->audio;
+        break;
+
+    case HRN_ITEM_TYPE_IMAGE:
+        node = priv->tree->image;
+        break;
+
+    case HRN_ITEM_TYPE_VIDEO:
+        node = priv->tree->video;
+        break;
+
+    default:
+        node = priv->tree->audio;
+        break;
+    }
+
+    hrn_view_clear (priv->view);
+
+    priv->current_node = node;
+
+    /* Changing the pathbar causes the query to be cleared */
+    g_signal_handler_block (priv->controls, priv->query_id);
+    mx_path_bar_clear (path_bar);
+    priv->level = mx_path_bar_push (path_bar, " ");
+    g_signal_handler_unblock (priv->controls, priv->query_id);
+
+    hrn_tiler_add_items (HRN_TILER (priv->view), node);
 }
 
 static void
-source_removed_cb (HrnSourceManager *manager,
-                   HrnSource        *source,
-                   HrnContentArea   *area)
+pin_selected_cb (HrnPinManager *pin_manager,
+                 HrnPin        *pin,
+                 HrnContentArea *area)
 {
     HrnContentAreaPrivate *priv = area->priv;
-    HrnSidebar *sidebar;
-
-    if (priv->current_source == source) {
-        HrnToolbar *tb;
+    HrnToolbar *toolbar;
 
-        tb = hrn_ui_controls_get_toolbar (priv->controls);
-        hrn_toolbar_set_pinned (tb, FALSE);
+    if (pin) {
+        priv->filter = pin->filter;
+        reload_view (area);
+        hrn_cluster_node_filter_string (priv->current_node, pin->query);
+        g_print ("Pin selected: %s\n", pin->group);
 
-        priv->filter = BKL_ITEM_TYPE_AUDIO;
-        hrn_content_area_set_source
-            (area, hrn_source_manager_get_local_source (priv->source_manager));
+        toolbar = hrn_ui_controls_get_toolbar (priv->controls);
+        hrn_toolbar_set_query (toolbar, pin->query);
+        hrn_toolbar_set_pinned (toolbar, TRUE);
     }
-
-    sidebar = hrn_ui_controls_get_sidebar (priv->controls);
-    hrn_sidebar_remove_source (sidebar, source);
 }
 
 static void
@@ -121,20 +166,16 @@ hrn_content_area_set_property (GObject  
     switch (prop_id) {
     case PROP_PIN_MANAGER:
         priv->pin_manager = g_value_dup_object (value);
+        g_signal_connect (priv->pin_manager, "pin-selected",
+                          G_CALLBACK (pin_selected_cb), self);
         break;
 
     case PROP_QUEUE:
         priv->local_queue = g_value_dup_object (value);
         break;
 
-    case PROP_SOURCE_MANAGER:
-        priv->source_manager = g_value_dup_object (value);
-        g_signal_connect (priv->source_manager, "ready",
-                          G_CALLBACK (source_manager_ready), self);
-        g_signal_connect (priv->source_manager, "source-added",
-                          G_CALLBACK (source_added_cb), self);
-        g_signal_connect (priv->source_manager, "source-removed",
-                          G_CALLBACK (source_removed_cb), self);
+    case PROP_TRACKER:
+        priv->tracker = g_value_dup_object (value);
         break;
 
     case PROP_THEATRE_UI:
@@ -190,46 +231,6 @@ quit_requested_cb (HrnUiControls  *contr
 }
 
 static void
-reload_view (HrnContentArea *area)
-{
-    HrnContentAreaPrivate *priv = area->priv;
-    HrnClusterTree *tree;
-    HrnClusterNode *node;
-
-    tree = hrn_source_get_cluster_tree (priv->current_source);
-
-    switch (priv->filter) {
-    case BKL_ITEM_TYPE_AUDIO:
-        node = tree->audio;
-        break;
-
-    case BKL_ITEM_TYPE_IMAGE:
-        node = tree->image;
-        break;
-
-    case BKL_ITEM_TYPE_VIDEO:
-        node = tree->video;
-        break;
-
-    default:
-        node = tree->audio;
-        break;
-    }
-
-    hrn_view_clear (priv->view);
-    hrn_tiler_add_items (HRN_TILER (priv->view), node);
-}
-
-static void
-source_changed_cb (HrnUiControls  *controls,
-                   HrnSource      *source,
-                   HrnContentArea *area)
-{
-    hrn_content_area_set_source (area, source);
-    g_signal_emit (area, signals[SOURCE_CHANGED], 0, source);
-}
-
-static void
 filter_changed_cb (HrnUiControls  *controls,
                    int             filter,
                    HrnContentArea *area)
@@ -254,12 +255,15 @@ deferred_search (gpointer data)
 
     search = hrn_toolbar_get_query (toolbar);
     if (search == NULL || *search == '\0') {
-        hrn_view_reset (priv->view);
+        hrn_cluster_node_set_children_hidden (priv->current_node, FALSE);
+        return FALSE;
     }
 
-    hrn_view_close_shown_item (priv->view);
+    /* hrn_view_close_shown_item (priv->view); */
+
+    g_print ("Search: %s\n", search);
+    hrn_cluster_node_filter_string (priv->current_node, search);
 
-    hrn_source_filter (priv->current_source, search);
     g_signal_emit (area, signals[QUERY_CHANGED], 0, search);
 
     return FALSE;
@@ -272,6 +276,8 @@ query_changed_cb (HrnUiControls  *contro
 {
     HrnContentAreaPrivate *priv = area->priv;
 
+    hrn_pin_manager_select_pin (priv->pin_manager, NULL);
+
     if (priv->search_id) {
         g_source_remove (priv->search_id);
         priv->search_id = 0;
@@ -298,8 +304,7 @@ pinned_cb (HrnUiControls  *controls,
 
         search = hrn_toolbar_get_query (toolbar);
         hrn_view_close_shown_item (priv->view);
-        hrn_pin_manager_add (priv->pin_manager, search, search,
-                             hrn_source_get_object_path (priv->current_source),
+        hrn_pin_manager_add (priv->pin_manager, search, search, "",
                              priv->filter, 0);
     } else {
         const char *pin;
@@ -334,11 +339,15 @@ play_track (HrnContentArea *area,
             HrnClusterNode *node)
 {
     HrnContentAreaPrivate *priv = area->priv;
-    TrackCluster *track = (TrackCluster *) node->data;
-    BklItem *item = track->item;
-
-    br_queue_play_uri (priv->local_queue,
-                       bkl_item_get_uri (item), bkl_item_get_mimetype (item));
+    TileCluster *tile = (TileCluster *) node->data;
+    HrnItem *item = tile->item;
+    const char *uris[2] = {0, }, *mimetypes[2] = {0, };
+
+    uris[0] = hrn_item_get_uri (item);
+    mimetypes[0] = hrn_item_get_mimetype (item);
+    br_queue_append_uris (priv->local_queue, 1, uris, mimetypes);
+    br_queue_set_index (priv->local_queue, BR_QUEUE_INDEX_END);
+    br_queue_play (priv->local_queue);
 }
 
 static void
@@ -347,28 +356,38 @@ play_node (HrnContentArea *area,
 {
     HrnContentAreaPrivate *priv = area->priv;
     GList *flat_tree = NULL, *f;
+    const char **uris, **mimetypes;
+    int len, i;
 
     hrn_cluster_node_flatten_reversed (node, &flat_tree);
+    /* FIXME: WTF! Need reverse_and_length function */
     flat_tree = g_list_reverse (flat_tree);
-    for (f = flat_tree; f; f = f->next) {
+    len = g_list_length (flat_tree);
+
+    uris = (const char **)(g_new0 (char *, len + 1));
+    mimetypes = (const char **)(g_new0 (char *, len + 1));
+
+    for (f = flat_tree, i = 0; f; f = f->next, i++) {
         HrnClusterNode *child = f->data;
-        TrackCluster *track = child->data;
-        BklItem *item = track->item;
+        TileCluster *tile = child->data;
+        HrnItem *item = tile->item;
 
         if (child->hidden) {
             continue;
         }
 
-        /* FIXME: Being able to pass a list to BR would help with the
-           DBus traffic level. */
-        br_queue_add_uri (priv->local_queue,
-                          bkl_item_get_uri (item),
-                          bkl_item_get_mimetype (item));
+        uris[i] = hrn_item_get_uri (item);
+        mimetypes[i] = hrn_item_get_mimetype (item);
     }
     g_list_free (flat_tree);
 
+    br_queue_append_uris (priv->local_queue, len, uris, mimetypes);
+
     /* Start playing if its not already playing */
     br_queue_play (priv->local_queue);
+
+    g_free (uris);
+    g_free (mimetypes);
 }
 
 static void
@@ -415,7 +434,7 @@ action_play (HrnContentArea *area,
         break;
     }
 }
-
+/*
 static char *
 get_node_string (HrnClusterNode *node)
 {
@@ -437,16 +456,17 @@ get_node_string (HrnClusterNode *node)
 
     return g_strdup_printf ("%s ➜ %s", node->parent->name, node->name);
 }
-
+*/
 static void
 action_expanded (HrnContentArea *area,
                  HrnClusterNode *node)
 {
     HrnContentAreaPrivate *priv = area->priv;
     HrnToolbar *toolbar;
-    char *text_str;
+    MxPathBar *bar;
 
     toolbar = hrn_ui_controls_get_toolbar (priv->controls);
+    bar = hrn_toolbar_get_path_bar (toolbar);
 
     switch (node->type) {
     case HRN_CLUSTER_NODE_TYPE_AUDIO_ROOT:
@@ -457,14 +477,9 @@ action_expanded (HrnContentArea *area,
 
     case HRN_CLUSTER_NODE_TYPE_YEAR:
     case HRN_CLUSTER_NODE_TYPE_ARTIST:
-        hrn_toolbar_set_query (toolbar, node->name);
-        break;
-
     case HRN_CLUSTER_NODE_TYPE_ALBUM:
     case HRN_CLUSTER_NODE_TYPE_MONTH:
-        text_str = get_node_string (node);
-        hrn_toolbar_set_query (toolbar, text_str);
-        g_free (text_str);
+        mx_path_bar_push (bar, node->name);
         break;
 
     case HRN_CLUSTER_NODE_TYPE_TRACK:
@@ -486,7 +501,9 @@ view_activated_cb (HrnView          *vie
 {
     HrnContentAreaPrivate *priv = area->priv;
     HrnToolbar *toolbar;
-    char *text_str;
+    MxPathBar *bar;
+    HrnPin *selected_pin;
+    const char *name;
 
     switch (action) {
     case HRN_TILEABLE_ACTION_PLAY:
@@ -494,6 +511,10 @@ view_activated_cb (HrnView          *vie
         break;
 
     case HRN_TILEABLE_ACTION_EXPANDED:
+        priv->level++;
+        g_print ("Depth %d -> %d\n", priv->level - 1, priv->level);
+
+        priv->current_node = (HrnClusterNode *) payload;
         action_expanded (area, (HrnClusterNode *) payload);
         break;
 
@@ -508,16 +529,34 @@ view_activated_cb (HrnView          *vie
         toolbar = hrn_ui_controls_get_toolbar (priv->controls);
         hrn_toolbar_set_query (toolbar, (char *) payload);
 
+#if 0
         hrn_source_filter (priv->current_source, (char *) payload);
         g_signal_emit (area, signals[QUERY_CHANGED], 0, (char *) payload);
+#endif
         break;
 
     case HRN_TILEABLE_ACTION_LEVEL_CHANGE:
+        /* If the level changed, it's generally because we've gone
+         * up a level. If we've done anything else, the state is
+         * usually cleared anyway, so rely on that...
+         */
         toolbar = hrn_ui_controls_get_toolbar (priv->controls);
+        bar = hrn_toolbar_get_path_bar (toolbar);
 
-        text_str = get_node_string ((HrnClusterNode *) payload);
-        hrn_toolbar_set_query (toolbar, text_str);
-        g_free (text_str);
+        g_signal_handler_block (toolbar, priv->level_change_id);
+        mx_path_bar_pop (bar);
+        g_signal_handler_unblock (toolbar, priv->level_change_id);
+
+        priv->current_node = (HrnClusterNode *) payload;
+        priv->level--;
+        g_print ("Depth %d -> %d\n", priv->level + 1, priv->level);
+
+        name = hrn_pin_manager_get_selected_pin (priv->pin_manager);
+        selected_pin = hrn_pin_manager_get_pin (priv->pin_manager, name);
+        if (selected_pin) {
+            hrn_cluster_node_filter_string (priv->current_node,
+                                            selected_pin->query);
+        }
         break;
 
     default:
@@ -525,6 +564,71 @@ view_activated_cb (HrnView          *vie
     }
 }
 
+static gboolean
+change_level_cb (gpointer data)
+{
+    HrnContentArea *area = (HrnContentArea *) data;
+    HrnContentAreaPrivate *priv = area->priv;
+    HrnClusterNode *node = priv->current_node;
+    HrnPin *selected_pin;
+    const char *name;
+    int d;
+
+    priv->changing_id = 0;
+
+    if (priv->destination_level < 0) {
+        return FALSE;
+    }
+
+    d = priv->level - priv->destination_level;
+    if (d == 0) {
+        return FALSE;
+    }
+
+    while (node && d > 0) {
+        node = node->parent;
+        d--;
+    }
+
+    g_print ("Moving from %d -> %d\n", priv->level, priv->destination_level);
+    if (node == NULL) {
+        g_warning ("Moving from %s level %d to %d (%d) has no node",
+                   priv->current_node ? priv->current_node->name : "<no node>",
+                   priv->level, priv->destination_level, d);
+        return FALSE;
+    }
+
+    g_print ("Moving to %s\n", node->name);
+    hrn_tiler_show_node (HRN_TILER (priv->view), node);
+    priv->level = priv->destination_level;
+
+    priv->destination_level = -1;
+    priv->current_node = node;
+
+    name = hrn_pin_manager_get_selected_pin (priv->pin_manager);
+    selected_pin = hrn_pin_manager_get_pin (priv->pin_manager, name);
+    if (selected_pin) {
+        hrn_cluster_node_filter_string (priv->current_node,
+                                        selected_pin->query);
+    }
+
+    return FALSE;
+}
+
+static void
+level_changed_cb (HrnToolbar     *toolbar,
+                  int             destination_level,
+                  HrnContentArea *area)
+{
+    HrnContentAreaPrivate *priv = area->priv;
+
+    g_print ("Request level %d -> %d\n", priv->level, destination_level);
+    priv->destination_level = destination_level;
+    if (priv->changing_id == 0) {
+        priv->changing_id = g_idle_add (change_level_cb, area);
+    }
+}
+
 static GObject *
 hrn_content_area_constructor (GType                  type,
                               guint                  n_params,
@@ -540,7 +644,7 @@ hrn_content_area_constructor (GType     
     area = HRN_CONTENT_AREA (object);
     priv = area->priv;
 
-    priv->scroll = (ClutterActor *) nbtk_scroll_view_new ();
+    priv->scroll = (ClutterActor *) mx_scroll_view_new ();
     clutter_actor_set_position (priv->scroll, SIDEBAR_WIDTH, TOOLBAR_HEIGHT);
     clutter_container_add_actor ((ClutterContainer *) area, priv->scroll);
 
@@ -553,19 +657,20 @@ hrn_content_area_constructor (GType     
     priv->controls = g_object_new (HRN_TYPE_UI_CONTROLS,
                                    "pin-manager", priv->pin_manager,
                                    "local-queue", priv->local_queue,
-                                   "source-manager", priv->source_manager,
+                                   "tracker-client", priv->tracker,
                                    NULL);
 
     g_signal_connect (priv->controls, "quit-requested",
                       G_CALLBACK (quit_requested_cb), area);
-    g_signal_connect (priv->controls, "source-changed",
-                      G_CALLBACK (source_changed_cb), area);
-    g_signal_connect (priv->controls, "query-changed",
-                      G_CALLBACK (query_changed_cb), area);
+    priv->query_id = g_signal_connect (priv->controls, "query-changed",
+                                       G_CALLBACK (query_changed_cb), area);
     g_signal_connect (priv->controls, "filter-changed",
                       G_CALLBACK (filter_changed_cb), area);
     g_signal_connect (priv->controls, "pinned",
                       G_CALLBACK (pinned_cb), area);
+    priv->level_change_id = g_signal_connect (hrn_ui_controls_get_toolbar (priv->controls),
+                                              "change-level",
+                                              G_CALLBACK (level_changed_cb), area);
 
     clutter_container_add_actor ((ClutterContainer *) area,
                                  (ClutterActor *) priv->controls);
@@ -601,9 +706,10 @@ hrn_content_area_class_init (HrnContentA
                                                           G_PARAM_WRITABLE |
                                                           G_PARAM_CONSTRUCT_ONLY |
                                                           G_PARAM_STATIC_STRINGS));
-    g_object_class_install_property (o_class, PROP_SOURCE_MANAGER,
-                                     g_param_spec_object ("source-manager", "", "",
-                                                          HRN_TYPE_SOURCE_MANAGER,
+    g_object_class_install_property (o_class, PROP_TRACKER,
+                                     g_param_spec_object ("tracker-client",
+                                                          "", "",
+                                                          HRN_TYPE_TRACKER_CLIENT,
                                                           G_PARAM_WRITABLE |
                                                           G_PARAM_CONSTRUCT_ONLY |
                                                           G_PARAM_STATIC_STRINGS));
@@ -614,12 +720,6 @@ hrn_content_area_class_init (HrnContentA
                                                           G_PARAM_CONSTRUCT_ONLY |
                                                           G_PARAM_STATIC_STRINGS));
 
-    signals[SOURCE_CHANGED] = g_signal_new ("source-changed",
-                                            G_TYPE_FROM_CLASS (klass),
-                                            G_SIGNAL_RUN_FIRST |
-                                            G_SIGNAL_NO_RECURSE, 0, NULL, NULL,
-                                            g_cclosure_marshal_VOID__OBJECT,
-                                            G_TYPE_NONE, 1, HRN_TYPE_SOURCE);
     signals[QUERY_CHANGED] = g_signal_new ("query-changed",
                                            G_TYPE_FROM_CLASS (klass),
                                            G_SIGNAL_RUN_FIRST |
@@ -648,7 +748,7 @@ hrn_content_area_init (HrnContentArea *s
     self->priv = GET_PRIVATE (self);
     priv = self->priv;
 
-    priv->filter = BKL_ITEM_TYPE_AUDIO;
+    priv->filter = HRN_ITEM_TYPE_AUDIO;
 }
 
 void
@@ -687,6 +787,7 @@ void
 hrn_content_area_restore_state (HrnContentArea  *area,
                                 HrnStateManager *state_manager)
 {
+#if 0
     HrnContentAreaPrivate *priv = area->priv;
     HrnToolbar *tb;
 
@@ -697,6 +798,7 @@ hrn_content_area_restore_state (HrnConte
 
     hrn_source_filter (priv->current_source,
                        hrn_state_manager_get_query (state_manager));
+#endif
 }
 
 void
@@ -708,13 +810,6 @@ hrn_content_area_set_enabled (HrnContent
     hrn_ui_controls_set_enabled (priv->controls, enabled);
 }
 
-void
-hrn_content_area_set_zoom (HrnContentArea *area,
-                           HrnZoomLevel    zoom_level)
-{
-    g_warning ("FIXME: hrn_content_area_set_zoom");
-}
-
 /* This function is a hack because the items "quicksearch" doesn't emit
    signals, but just tries to set the query directly */
 void
@@ -727,15 +822,11 @@ hrn_content_area_set_query (HrnContentAr
 }
 
 void
-hrn_content_area_set_source (HrnContentArea *area,
-                             HrnSource      *source)
+hrn_content_area_set_tree (HrnContentArea *area,
+                           HrnClusterTree *tree)
 {
     HrnContentAreaPrivate *priv = area->priv;
 
-    if (priv->current_source == source) {
-        return;
-    }
-    priv->current_source = source;
-
+    priv->tree = tree;
     reload_view (area);
 }
diff -pruN 1.5.1-1/src/hrn-content-area.h 1.8.4-1/src/hrn-content-area.h
--- 1.5.1-1/src/hrn-content-area.h	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-content-area.h	2010-02-17 17:26:44.000000000 +0000
@@ -58,8 +58,8 @@ void hrn_content_area_set_zoom (HrnConte
                                 HrnZoomLevel    zoom_level);
 void hrn_content_area_set_query (HrnContentArea *area,
                                  const char     *query);
-void hrn_content_area_set_source (HrnContentArea *area,
-                                  HrnSource      *source);
+void hrn_content_area_set_tree (HrnContentArea *area,
+                                HrnClusterTree *tree);
 
 G_END_DECLS
 
diff -pruN 1.5.1-1/src/hrn-controls.c 1.8.4-1/src/hrn-controls.c
--- 1.5.1-1/src/hrn-controls.c	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-controls.c	2011-03-15 13:20:21.000000000 +0000
@@ -41,7 +41,7 @@ enum {
 
 #define    QUEUE_TIP_HEIGHT    47  /* used to determine drops on tip */
 
-G_DEFINE_TYPE (HrnControls, hrn_controls, NBTK_TYPE_BIN);
+G_DEFINE_TYPE (HrnControls, hrn_controls, MX_TYPE_FRAME);
 
 #define HRN_CONTROLS_GET_PRIVATE(obj)                 \
   (G_TYPE_INSTANCE_GET_PRIVATE ((obj), \
@@ -53,22 +53,20 @@ struct _HrnControlsPrivate
 {
     HrnTheatre *theatre;
 
-    NbtkWidget *header;
-    NbtkWidget *next;
-    NbtkWidget *back;
-    NbtkWidget *playpause;
-    NbtkWidget *leave;
-    NbtkWidget *progress_table;
-    NbtkWidget *timebar;
-    NbtkWidget *time;
-    NbtkWidget *length;
-    NbtkAdjustment *progress;
+    ClutterActor *header;
+    ClutterActor *next;
+    ClutterActor *back;
+    ClutterActor *playpause;
+    ClutterActor *progress_table;
+    ClutterActor *timebar;
+    ClutterActor *time;
+    ClutterActor *length;
 
     guint32 visual_progress_id;
     guint32 play_pause_id;
     gboolean playing;
 
-    NbtkWidget *title;
+    ClutterActor *title;
 
     guint64 duration;
 
@@ -81,21 +79,15 @@ static GObject * hrn_controls_constructo
                                            guint                  n_params,
                                            GObjectConstructParam *params);
 static void hrn_controls_dispose          (GObject               *object);
-static void hrn_controls_allocate         (ClutterActor          *self,
-                                           const ClutterActorBox *box,
-                                           ClutterAllocationFlags flags);
 
 static void
 hrn_controls_class_init (HrnControlsClass *klass)
 {
   GObjectClass      *gobject_class = G_OBJECT_CLASS (klass);
-  ClutterActorClass *actor_class   = CLUTTER_ACTOR_CLASS (klass);
 
   gobject_class->dispose      = hrn_controls_dispose;
   gobject_class->constructor  = hrn_controls_constructor;
 
-  actor_class->allocate       = hrn_controls_allocate;
-
   g_type_class_add_private (gobject_class, sizeof (HrnControlsPrivate));
 
   signals[LEAVE_THEATRE] = g_signal_new ("leave-theatre",
@@ -141,7 +133,7 @@ hrn_controls_init (HrnControls *self)
 }
 
 static void
-playpause_clicked_cb (NbtkButton  *button,
+playpause_clicked_cb (MxButton  *button,
                       HrnControls *controls)
 {
     HrnControlsPrivate *priv = controls->priv;
@@ -152,14 +144,14 @@ playpause_clicked_cb (NbtkButton  *butto
 
 
 static void
-next_clicked_cb (NbtkButton   *button,
+next_clicked_cb (MxButton   *button,
                  HrnControls  *controls)
 {
     g_signal_emit (controls, signals[REQUEST_NEXT], 0);
 }
 
 static void
-back_clicked_cb (NbtkButton   *button,
+back_clicked_cb (MxButton   *button,
                  HrnControls  *controls)
 {
     g_signal_emit (controls, signals[REQUEST_PREVIOUS], 0);
@@ -192,16 +184,17 @@ nanosecs_to_time (guint64 duration)
 }
 
 static void
-visual_progress_notify (NbtkAdjustment *adjustment,
-                        GParamSpec     *pspec,
-                        HrnControls    *controls)
+visual_progress_notify (MxSlider    *slider,
+                        GParamSpec  *pspec,
+                        HrnControls *controls)
 {
     HrnControlsPrivate *priv = controls->priv;
-    double position = nbtk_adjustment_get_value (adjustment);
+    double position;
     char *dstr;
 
+    position = mx_slider_get_value (slider);
     dstr = nanosecs_to_time (priv->duration * position);
-    nbtk_label_set_text ((NbtkLabel *) priv->time, dstr);
+    mx_label_set_text ((MxLabel *) priv->time, dstr);
     g_free (dstr);
 
     if (priv->ignore_position_change == FALSE) {
@@ -224,111 +217,107 @@ hrn_controls_constructor (GType type, gu
   controls = HRN_CONTROLS (object);
   priv = controls->priv;
 
-  priv->header = nbtk_table_new ();
-  nbtk_widget_set_style_class_name (priv->header, "HrnControls");
-  clutter_container_add_actor ((ClutterContainer *) controls,
-                               (ClutterActor *) priv->header);
+  mx_bin_set_fill (MX_BIN (controls), TRUE, TRUE);
+
+  priv->header = mx_table_new ();
+  clutter_container_add_actor ((ClutterContainer *) controls, priv->header);
 
-  priv->playpause = nbtk_button_new ();
+  priv->playpause = mx_button_new ();
   priv->playing = FALSE;
-  nbtk_widget_set_style_class_name (priv->playpause, "HrnControlsPlay");
-  clutter_actor_set_size (CLUTTER_ACTOR (priv->playpause), 60, 60);
+  clutter_actor_set_name (priv->playpause, "hrn-controls-play");
   priv->play_pause_id = g_signal_connect (priv->playpause, "clicked",
                                           G_CALLBACK (playpause_clicked_cb),
                                           controls);
-  nbtk_table_add_actor_with_properties (NBTK_TABLE (priv->header),
-                                        CLUTTER_ACTOR (priv->playpause), 0, 0,
-                                        "row-span", 2,
-                                        "x-align", 0.0,
-                                        "y-align", 0.0,
-                                        "x-fill", FALSE,
-                                        "x-expand", FALSE,
-                                        NULL);
+  mx_table_add_actor_with_properties (MX_TABLE (priv->header),
+                                      priv->playpause, 0, 0,
+                                      "row-span", 2,
+                                      "x-align", MX_ALIGN_START,
+                                      "y-align", MX_ALIGN_START,
+                                      "x-fill", FALSE,
+                                      "x-expand", FALSE,
+                                      NULL);
 
 
-  priv->back = nbtk_button_new ();
-  clutter_actor_set_size (CLUTTER_ACTOR (priv->back), 60, 60);
-  nbtk_widget_set_style_class_name (priv->back, "HrnControlsBack");
+  priv->back = mx_button_new ();
+  clutter_actor_set_name (priv->back, "hrn-controls-back");
   g_signal_connect (priv->back, "clicked",
                     G_CALLBACK (back_clicked_cb), controls);
-  nbtk_table_add_actor_with_properties (NBTK_TABLE (priv->header),
-                                        CLUTTER_ACTOR (priv->back), 0, 1,
-                                        "row-span", 2,
-                                        "x-align", 0.0,
-                                        "y-align", 0.0,
-                                        "x-fill", FALSE,
-                                        "x-expand", FALSE,
-                                        NULL);
+  mx_table_add_actor_with_properties (MX_TABLE (priv->header),
+                                      priv->back, 0, 1,
+                                      "row-span", 2,
+                                      "x-align", MX_ALIGN_START,
+                                      "y-align", MX_ALIGN_START,
+                                      "x-fill", FALSE,
+                                      "x-expand", FALSE,
+                                      NULL);
 
-  priv->next = nbtk_button_new ();
-  clutter_actor_set_size (CLUTTER_ACTOR (priv->next), 60, 60);
-  nbtk_widget_set_style_class_name (priv->next, "HrnControlsNext");
+  priv->next = mx_button_new ();
+  clutter_actor_set_name (priv->next, "hrn-controls-next");
   g_signal_connect (priv->next, "clicked",
                     G_CALLBACK (next_clicked_cb), controls);
-  nbtk_table_add_actor_with_properties (NBTK_TABLE (priv->header),
-                                        CLUTTER_ACTOR (priv->next), 0, 2,
-                                        "row-span", 2,
-                                        "x-align", 0.0,
-                                        "y-align", 0.0,
-                                        "x-fill", FALSE,
-                                        "x-expand", FALSE,
-                                        NULL);
-
-  priv->title = nbtk_label_new ("");
-  nbtk_table_add_actor_with_properties (NBTK_TABLE (priv->header),
-                                        CLUTTER_ACTOR (priv->title),
-                                        0, 3,
-                                        "x-align", 0.0,
-                                        "y-align", 0.5,
-                                        "x-fill", TRUE,
-                                        "x-expand", TRUE,
-                                        "y-fill", FALSE,
-                                        NULL);
-
-  priv->progress_table = nbtk_table_new ();
-  nbtk_table_add_actor_with_properties (NBTK_TABLE (priv->header),
-                                        CLUTTER_ACTOR (priv->progress_table),
-                                        1, 3,
-                                        "x-align", 0.0,
-                                        "y-align", 0.5,
-                                        "x-fill", TRUE,
-                                        "x-expand", TRUE,
-                                        "y-fill", FALSE,
-                                        NULL);
+  mx_table_add_actor_with_properties (MX_TABLE (priv->header),
+                                      priv->next, 0, 2,
+                                      "row-span", 2,
+                                      "x-align", MX_ALIGN_START,
+                                      "y-align", MX_ALIGN_START,
+                                      "x-fill", FALSE,
+                                      "x-expand", FALSE,
+                                      NULL);
+
+  priv->title = mx_label_new_with_text ("");
+  mx_table_add_actor_with_properties (MX_TABLE (priv->header),
+                                      priv->title,
+                                      0, 3,
+                                      "x-align", MX_ALIGN_START,
+                                      "y-align", MX_ALIGN_MIDDLE,
+                                      "x-fill", TRUE,
+                                      "x-expand", TRUE,
+                                      "y-fill", FALSE,
+                                      NULL);
+
+  priv->progress_table = mx_table_new ();
+  mx_table_set_column_spacing (MX_TABLE (priv->progress_table), 8);
+  mx_table_add_actor_with_properties (MX_TABLE (priv->header),
+                                      priv->progress_table,
+                                      1, 3,
+                                      "x-align", MX_ALIGN_START,
+                                      "y-align", MX_ALIGN_MIDDLE,
+                                      "x-fill", TRUE,
+                                      "x-expand", TRUE,
+                                      "y-fill", FALSE,
+                                      NULL);
+
+  priv->time = mx_label_new_with_text ("0:00.00");
+  mx_table_add_actor_with_properties (MX_TABLE (priv->progress_table),
+                                      priv->time, 0, 0,
+                                      "x-align", MX_ALIGN_START,
+                                      "y-align", MX_ALIGN_MIDDLE,
+                                      "x-fill", FALSE,
+                                      "x-expand", FALSE,
+                                      "y-fill", FALSE,
+                                      "y-expand", FALSE,
+                                      NULL);
+
+  priv->timebar = mx_slider_new ();
+  mx_table_add_actor_with_properties (MX_TABLE (priv->progress_table),
+                                      priv->timebar, 0, 1,
+                                      "y-align", MX_ALIGN_MIDDLE,
+                                      "y-fill", FALSE,
+                                      "x-expand", TRUE,
+                                      "x-fill", TRUE,
+                                      NULL);
+
+  priv->visual_progress_id =
+    g_signal_connect (priv->timebar,
+                      "notify::progress",
+                      G_CALLBACK (visual_progress_notify),
+                      controls);
 
-  priv->time = nbtk_label_new ("0:00");
-  nbtk_table_add_actor_with_properties (NBTK_TABLE (priv->progress_table),
-                                        CLUTTER_ACTOR (priv->time), 0, 0,
-                                        "x-align", 0.0,
-                                        "y-align", 0.5,
-                                        "x-fill", FALSE,
-                                        "x-expand", FALSE,
-                                        "y-fill", FALSE,
-                                        "y-expand", FALSE,
-                                        NULL);
-
-  priv->progress = nbtk_adjustment_new (0.0, 0.0, 1.0, 0, 0, 0);
-  priv->visual_progress_id = g_signal_connect
-      (priv->progress, "notify::value",
-       G_CALLBACK (visual_progress_notify), controls);
-
-  priv->timebar = NBTK_WIDGET (nbtk_scroll_bar_new (priv->progress));
-  clutter_actor_set_height ((ClutterActor *) priv->timebar, 14);
-  nbtk_widget_set_style_class_name (priv->timebar, "HrnProgressBar");
-  nbtk_table_add_actor_with_properties (NBTK_TABLE (priv->progress_table),
-                                        CLUTTER_ACTOR (priv->timebar), 0, 1,
-                                        "x-align", 0.0,
-                                        "y-align", 0.5,
-                                        "y-fill", FALSE,
-                                        "x-expand", TRUE,
-                                        "x-fill", TRUE,
-                                        NULL);
-
-  priv->length = nbtk_label_new ("1:00");
-  nbtk_table_add_actor_with_properties (NBTK_TABLE (priv->progress_table),
+  priv->length = mx_label_new_with_text ("00:00.00");
+  mx_table_add_actor_with_properties (MX_TABLE (priv->progress_table),
                                         CLUTTER_ACTOR (priv->length), 0, 2,
-                                        "x-align", 0.0,
-                                        "y-align", 0.5,
+                                        "x-align", MX_ALIGN_START,
+                                        "y-align", MX_ALIGN_MIDDLE,
                                         "x-fill", FALSE,
                                         "x-expand", FALSE,
                                         "y-fill", FALSE,
@@ -342,30 +331,6 @@ hrn_controls_constructor (GType type, gu
 }
 
 static void
-hrn_controls_allocate (ClutterActor          *self,
-                       const ClutterActorBox *box,
-                       ClutterAllocationFlags flags)
-{
-  HrnControlsPrivate   *priv = HRN_CONTROLS_GET_PRIVATE (self);
-  ClutterActorClass *parent_class;
-  ClutterActorBox    actor_box;
-  NbtkPadding padding;
-
-  parent_class = CLUTTER_ACTOR_CLASS (hrn_controls_parent_class);
-
-  parent_class->allocate (self, box, flags);
-
-  nbtk_widget_get_padding ((NbtkWidget *) self, &padding);
-
-  actor_box.x1 = padding.left;
-  actor_box.x2 = (box->x2 - box->x1) - (padding.left + padding.right);
-  actor_box.y1 = padding.top;
-  actor_box.y2 = (box->y2 - box->y1) - (padding.top + padding.bottom);
-
-  clutter_actor_allocate (CLUTTER_ACTOR (priv->header), &actor_box, flags);
-}
-
-static void
 hrn_controls_dispose (GObject *object)
 {
   G_OBJECT_CLASS (hrn_controls_parent_class)->dispose (object);
@@ -386,10 +351,8 @@ hrn_controls_set_playing (HrnControls *c
     HrnControlsPrivate *priv = controls->priv;
 
     priv->playing = playing;
-    if (playing)
-        nbtk_widget_set_style_class_name (priv->playpause, "HrnControlsPause");
-    else
-        nbtk_widget_set_style_class_name (priv->playpause, "HrnControlsPlay");
+    clutter_actor_set_name (priv->playpause, playing ?
+                            "hrn-controls-pause" : "hrn-controls-play");
 }
 
 void
@@ -398,7 +361,7 @@ hrn_controls_set_title (HrnControls *con
 {
     HrnControlsPrivate *priv = controls->priv;
 
-    nbtk_label_set_text ((NbtkLabel *) priv->title, title);
+    mx_label_set_text ((MxLabel *) priv->title, title);
 }
 
 void
@@ -421,7 +384,7 @@ hrn_controls_set_position (HrnControls *
     HrnControlsPrivate *priv = controls->priv;
 
     priv->ignore_position_change = TRUE;
-    nbtk_adjustment_set_value (priv->progress, position);
+    mx_slider_set_value (MX_SLIDER (priv->timebar), position);
 }
 
 void
@@ -434,6 +397,6 @@ hrn_controls_set_duration (HrnControls *
     priv->duration = duration;
     dstr = nanosecs_to_time (duration);
 
-    nbtk_label_set_text ((NbtkLabel *) priv->length, dstr);
+    mx_label_set_text ((MxLabel *) priv->length, dstr);
     g_free (dstr);
 }
diff -pruN 1.5.1-1/src/hrn-controls.h 1.8.4-1/src/hrn-controls.h
--- 1.5.1-1/src/hrn-controls.h	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-controls.h	2010-02-17 17:26:44.000000000 +0000
@@ -20,7 +20,6 @@
 #define _HRN_CONTROLS_H
 
 #include <clutter/clutter.h>
-#include <bickley/bkl-item.h>
 #include <bognor/br-queue.h>
 
 G_BEGIN_DECLS
@@ -48,14 +47,14 @@ typedef struct _HrnControlsPrivate HrnCo
 
 struct _HrnControls
 {
-  NbtkBin       parent_instance;
+  MxFrame             parent_instance;
   HrnControlsPrivate *priv;
 };
 
 struct _HrnControlsClass
 {
   /*< private >*/
-  NbtkBinClass parent_class;
+  MxFrameClass parent_class;
 };
 
 GType     hrn_controls_get_type (void) G_GNUC_CONST;
diff -pruN 1.5.1-1/src/hrn-debug.c 1.8.4-1/src/hrn-debug.c
--- 1.5.1-1/src/hrn-debug.c	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/src/hrn-debug.c	2010-02-17 17:26:44.000000000 +0000
@@ -0,0 +1,65 @@
+/*
+ * Hornsey - Moblin Media Player.
+ * Copyright © 2009 Intel Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU Lesser General Public License,
+ * version 2.1, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "hrn-debug.h"
+
+#ifdef HRN_ENABLE_DEBUG
+
+guint hrn_debug_flags = 0;  /* global hornsey debug flag */
+
+static GTimer *debug_timer;
+
+static const GDebugKey debug_keys[] = {
+  { "thumbnail",  HRN_DEBUG_THUMBNAIL }
+};
+
+gulong
+hrn_get_timestamp (void)
+{
+  gdouble seconds;
+
+  seconds = g_timer_elapsed (debug_timer, NULL);
+
+  return (gulong)(seconds / 1.0e-6);
+}
+
+gboolean hrn_debug_init (void)
+{
+  const char *env_string;
+
+  env_string = g_getenv ("HORNSEY_DEBUG");
+
+  debug_timer = g_timer_new ();
+  g_timer_start (debug_timer);
+
+  if (env_string == NULL)
+    return TRUE;
+
+  hrn_debug_flags = g_parse_debug_string (env_string,
+		  debug_keys, G_N_ELEMENTS (debug_keys));
+
+  return TRUE;
+}
+
+#endif /* HRN_ENABLE_DEBUG */
+
diff -pruN 1.5.1-1/src/hrn-debug.h 1.8.4-1/src/hrn-debug.h
--- 1.5.1-1/src/hrn-debug.h	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/src/hrn-debug.h	2010-02-17 17:26:44.000000000 +0000
@@ -0,0 +1,99 @@
+/*
+ * Hornsey - Moblin Media Player.
+ * Copyright © 2009 Intel Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU Lesser General Public License,
+ * version 2.1, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#ifndef __HRN_DEBUG_H__
+#define __HRN_DEBUG_H__
+
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+#ifdef HRN_ENABLE_DEBUG
+
+typedef enum {
+  HRN_DEBUG_THUMBNAIL           = 1 << 0,
+} HrnDebugFlag;
+
+#ifdef __GNUC__
+
+#define HRN_NOTE(type,x,a...)                         \
+  G_STMT_START {                                              \
+      if (hrn_debug_flags & HRN_DEBUG_##type) \
+        { g_message ("[" #type "] " G_STRLOC ": " x, ##a); }  \
+  } G_STMT_END
+
+#define HRN_TIMESTAMP(type,x,a...)                    \
+  G_STMT_START {                                              \
+      if (hrn_debug_flags & HRN_DEBUG_##type) \
+        { g_message ("[" #type "]" " %li:"  G_STRLOC ": "     \
+                     x, hrn_get_timestamp(), ##a); } \
+  } G_STMT_END
+
+#else /* !__GNUC__ */
+
+/* Try the C99 version; unfortunately, this does not allow us to pass
+ * empty arguments to the macro, which means we have to
+ * do an intemediate printf.
+ */
+#define HRN_NOTE(type,...)                            \
+  G_STMT_START {                                              \
+      if (hrn_debug_flags & HRN_DEBUG_##type) \
+        {                                                     \
+          gchar * _fmt = g_strdup_printf (__VA_ARGS__);       \
+          g_message ("[" #type "] " G_STRLOC ": %s",_fmt);    \
+          g_free (_fmt);                                      \
+        }                                                     \
+  } G_STMT_END
+
+#define HRN_TIMESTAMP(type,...)                       \
+G_STMT_START {                                                \
+    if (hrn_debug_flags & HRN_DEBUG_##type)   \
+      {                                                       \
+        gchar * _fmt = g_strdup_printf (__VA_ARGS__);         \
+        g_message ("[" #type "]" " %li:"  G_STRLOC ": %s",    \
+                   hrn_get_timestamp(), _fmt);       \
+        g_free (_fmt);                                        \
+      }                                                       \
+} G_STMT_END
+
+#endif /* __GNUC__ */
+
+#define HRN_MARK()      HRN_NOTE(MISC, "== mark ==")
+
+/* We do not even define those (private) symbols when debug is disabled.
+ * This is to ensure the debug code is not shiped with the library when
+ * disabled */
+
+extern guint hrn_debug_flags;
+
+gulong    hrn_get_timestamp    (void);
+gboolean  hrn_debug_init       (void);
+
+#else /* !HRN_ENABLE_DEBUG */
+
+#define HRN_NOTE(type,...)         G_STMT_START { } G_STMT_END
+#define HRN_MARK()                 G_STMT_START { } G_STMT_END
+#define HRN_GLERR()                G_STMT_START { } G_STMT_END
+#define HRN_TIMESTAMP(type,...)    G_STMT_START { } G_STMT_END
+
+#endif /* HORNSEY_ENABLE_DEBUG */
+
+G_END_DECLS
+
+#endif /* __HRN_DEBUG_H__ */
diff -pruN 1.5.1-1/src/hrn-drag-n-drop.c 1.8.4-1/src/hrn-drag-n-drop.c
--- 1.5.1-1/src/hrn-drag-n-drop.c	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-drag-n-drop.c	2010-02-17 17:26:44.000000000 +0000
@@ -113,12 +113,12 @@ drag_capture (ClutterActor *stage, Clutt
               ClutterActor *iter = drag->drag_data->actor;
               while (iter)
                 {
-                  if (NBTK_IS_VIEWPORT (iter))
+                  if (MX_IS_VIEWPORT (iter))
                     {
                       float x_offset;
                       float y_offset;
 
-                      nbtk_viewport_get_origin (NBTK_VIEWPORT (iter),
+                      mx_viewport_get_origin (MX_VIEWPORT (iter),
                                                 &x_offset, &y_offset,
                                                 NULL);
 
diff -pruN 1.5.1-1/src/hrn.h 1.8.4-1/src/hrn.h
--- 1.5.1-1/src/hrn.h	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn.h	2010-02-17 17:26:44.000000000 +0000
@@ -25,25 +25,14 @@
 #include <string.h>
 #include <stdlib.h>
 
-#include <bickley/bkl-item.h>
-#include <bickley/bkl-item-image.h>
-#include <bickley/bkl-item-video.h>
-#include <bickley/bkl-item-audio.h>
-#include <bickley/bkl-db.h>
-#include <bickley/bkl-utils.h>
-#include <bickley/bkl-source-client.h>
-#include <bickley/bkl-source-manager-client.h>
-
-#include <nbtk/nbtk.h>
+#include <mx/mx.h>
 #include <gtk/gtk.h>
 #include <libnotify/notify.h>
 
 #include "hrn-button.h"
-#include "hrn-source.h"
 #include "hrn-queue.h"
 #include "hrn-theatre.h"
 #include "hrn-drag-n-drop.h"
-#include "hrn-popup.h"
 #include "hrn-controls.h"
 #include "hrn-window.h"
 
@@ -102,11 +91,7 @@
 #define SIDEBAR_OUT_DURATION CONTROLS_OUT_DURATION
 
 extern HrnWindow *window;
-
 extern ClutterActor *hrn_content_area;
-
-extern BklSourceManagerClient *manager;
-
 extern HrnQueue *master_queue;
 
 void hrn_play_uri_now          (const gchar *uri);
diff -pruN 1.5.1-1/src/hrn-iface-player.c 1.8.4-1/src/hrn-iface-player.c
--- 1.5.1-1/src/hrn-iface-player.c	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-iface-player.c	2010-02-17 17:26:44.000000000 +0000
@@ -80,7 +80,7 @@ hrn_iface_player_set_uri (HrnIfacePlayer
 
 void
 hrn_iface_player_set_item (HrnIfacePlayer *player,
-                           BklItem        *item)
+                           HrnItem        *item)
 {
     HRN_IFACE_PLAYER_GET_CLASS (player)->set_item (player, item);
 }
diff -pruN 1.5.1-1/src/hrn-iface-player.h 1.8.4-1/src/hrn-iface-player.h
--- 1.5.1-1/src/hrn-iface-player.h	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-iface-player.h	2010-02-17 17:26:44.000000000 +0000
@@ -2,7 +2,7 @@
 #define __HRN_IFACE_PLAYER_H__
 
 #include <glib-object.h>
-#include <bickley/bkl-item.h>
+#include "hrn-item.h"
 
 G_BEGIN_DECLS
 
@@ -26,7 +26,7 @@ struct _HrnIfacePlayerClass
   void (*set_uri)      (HrnIfacePlayer *player,
                         const char     *uri);
     void (*set_item) (HrnIfacePlayer *player,
-                      BklItem        *item);
+                      HrnItem        *item);
   void (*set_position) (HrnIfacePlayer *player,
                         double          position);
   guint64 (*get_duration) (HrnIfacePlayer *player);
@@ -39,7 +39,7 @@ void  hrn_iface_player_emit_eos         
 void  hrn_iface_player_set_uri               (HrnIfacePlayer *player,
                                               const char     *uri);
 void hrn_iface_player_set_item (HrnIfacePlayer *player,
-                                BklItem        *item);
+                                HrnItem        *item);
 void  hrn_iface_player_set_playing           (HrnIfacePlayer *player,
                                               gboolean        playing);
 void  hrn_iface_player_set_position          (HrnIfacePlayer *player,
diff -pruN 1.5.1-1/src/hrn-image-player.c 1.8.4-1/src/hrn-image-player.c
--- 1.5.1-1/src/hrn-image-player.c	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-image-player.c	2010-02-17 17:26:44.000000000 +0000
@@ -1,5 +1,3 @@
-#include <bickley/bkl.h>
-
 #include "hrn.h"
 #include "hrn-iface-player.h"
 #include "hrn-image-player.h"
@@ -83,6 +81,7 @@ hrn_image_player_allocate (ClutterActor 
   clutter_actor_allocate_preferred_size (priv->image_player, flags);
 }
 
+#if 0
 static void
 hrn_image_player_paint (ClutterActor *actor)
 {
@@ -123,6 +122,7 @@ hrn_image_player_unmap (ClutterActor *se
         clutter_actor_unmap (CLUTTER_ACTOR (priv->image_player));
     }
 }
+#endif
 
 
 static void
@@ -183,12 +183,11 @@ player_set_playing (HrnIfacePlayer *play
 
 static void
 player_set (HrnIfacePlayer *player,
-            BklItem        *item,
+            HrnItem        *item,
             const char     *uri)
 {
   HrnImagePlayer        *image = (HrnImagePlayer *) player;
   HrnImagePlayerPrivate *priv  = image->priv;
-  const gchar           *orient;
   gfloat                 w, h;
   gdouble                xs, ys, scale;
   gint                   x, y, sw, sh;
@@ -265,6 +264,7 @@ player_set (HrnIfacePlayer *player,
 
   clutter_actor_get_size (priv->image_player, &w, &h);
   if (item) {
+#if 0
       orient = bkl_item_image_get_orientation (BKL_ITEM_IMAGE (item));
 
       if (orient) {
@@ -288,6 +288,7 @@ player_set (HrnIfacePlayer *player,
               h = tmp;
           }
       }
+#endif
   }
 
   gtk_window_get_size (GTK_WINDOW (window), &sw, &sh);
@@ -318,9 +319,9 @@ player_set_uri (HrnIfacePlayer *player,
 
 static void
 player_set_item (HrnIfacePlayer *player,
-                 BklItem        *item)
+                 HrnItem        *item)
 {
-    player_set (player, item, bkl_item_get_uri (item));
+    player_set (player, item, hrn_item_get_uri (item));
 }
 
 static void
@@ -349,8 +350,6 @@ static void
 hrn_image_player_init (HrnImagePlayer *self)
 {
   HrnImagePlayerPrivate *priv = GET_PRIVATE (self);
-  ClutterActor *magic_rect;
-  ClutterColor red = {0xff, 0x00, 0x00, 0xff};
 
   self->priv = priv;
 
diff -pruN 1.5.1-1/src/hrn-image-tile.c 1.8.4-1/src/hrn-image-tile.c
--- 1.5.1-1/src/hrn-image-tile.c	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-image-tile.c	2010-02-17 17:26:44.000000000 +0000
@@ -55,7 +55,7 @@ hrn_image_tile_set_property (GObject    
 {
     HrnImageTile *self = (HrnImageTile *) object;
     HrnImageTilePrivate *priv = self->priv;
-    PictureCluster *picture_cluster;
+    TileCluster *picture_cluster;
 
     switch (prop_id) {
     case PROP_NODE:
@@ -65,7 +65,7 @@ hrn_image_tile_set_property (GObject    
              G_CALLBACK (node_visibility_changed), self);
         clutter_actor_set_name ((ClutterActor *) self, priv->node->name);
 
-        picture_cluster = (PictureCluster *) priv->node->data;
+        picture_cluster = (TileCluster *) priv->node->data;
         g_object_set (self,
                       "item", picture_cluster->item,
                       NULL);
diff -pruN 1.5.1-1/src/hrn-im-label.c 1.8.4-1/src/hrn-im-label.c
--- 1.5.1-1/src/hrn-im-label.c	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/src/hrn-im-label.c	2010-02-17 17:26:44.000000000 +0000
@@ -0,0 +1,456 @@
+/*
+ * hrn-label.c: Plain label actor
+ *
+ * Copyright 2008,2009 Intel Corporation
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU Lesser General Public License,
+ * version 2.1, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Written by: Thomas Wood <thomas@linux.intel.com>
+ *
+ */
+
+/**
+ * SECTION:hrn-label
+ * @short_description: Widget for displaying text
+ *
+ * #HrnIMLabel is a simple widget for displaying text. It derives from
+ * #HrnWidget to add extra style and placement functionality over
+ * #ClutterText. The internal #ClutterText is publicly accessibly to allow
+ * applications to set further properties. 
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+#include <glib.h>
+
+#include <clutter/clutter.h>
+#include <clutter-imcontext/clutter-imtext.h>
+
+#include "hrn.h"
+#include "hrn-im-label.h"
+
+enum
+{
+  PROP_0,
+
+  PROP_LABEL
+};
+
+#define HRN_IM_LABEL_GET_PRIVATE(obj)     (G_TYPE_INSTANCE_GET_PRIVATE ((obj), HRN_TYPE_IM_LABEL, HrnIMLabelPrivate))
+
+struct _HrnIMLabelPrivate
+{
+  ClutterActor *label;
+};
+
+G_DEFINE_TYPE (HrnIMLabel, hrn_im_label, MX_TYPE_WIDGET);
+
+static void
+hrn_im_label_set_property (GObject      *gobject,
+                           guint         prop_id,
+                           const GValue *value,
+                           GParamSpec   *pspec)
+{
+  HrnIMLabel *label = HRN_IM_LABEL (gobject);
+
+  switch (prop_id)
+    {
+    case PROP_LABEL:
+      hrn_im_label_set_text (label, g_value_get_string (value));
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
+      break;
+    }
+}
+
+static void
+hrn_im_label_get_property (GObject    *gobject,
+                           guint       prop_id,
+                           GValue     *value,
+                           GParamSpec *pspec)
+{
+  HrnIMLabelPrivate *priv = HRN_IM_LABEL (gobject)->priv;
+
+  switch (prop_id)
+    {
+    case PROP_LABEL:
+      g_value_set_string (value, clutter_text_get_text (CLUTTER_TEXT (priv->label)));
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
+      break;
+    }
+}
+
+static void
+hrn_im_label_style_changed (MxWidget *self)
+{
+  HrnIMLabelPrivate *priv = HRN_IM_LABEL (self)->priv;
+  ClutterColor *color = NULL;
+  gchar *font_name;
+  gchar *font_string;
+  gint font_size;
+
+  mx_stylable_get (MX_STYLABLE (self),
+                   "color", &color,
+                   "font-family", &font_name,
+                   "font-size", &font_size,
+                   NULL);
+
+  if (color)
+    {
+      clutter_text_set_color (CLUTTER_TEXT (priv->label), color);
+      clutter_color_free (color);
+    }
+
+  if (font_name || font_size)
+    {
+      if (font_name && font_size)
+        {
+          font_string = g_strdup_printf ("%s %dpx", font_name, font_size);
+          g_free (font_name);
+        }
+      else
+        {
+          if (font_size)
+            font_string = g_strdup_printf ("%dpx", font_size);
+          else
+            font_string = font_name;
+        }
+
+      clutter_text_set_font_name (CLUTTER_TEXT (priv->label), font_string);
+      g_free (font_string);
+    }
+
+}
+
+static void
+hrn_im_label_get_preferred_width (ClutterActor *actor,
+                                  float         for_height,
+                                  float        *min_width_p,
+                                  float        *natural_width_p)
+{
+  HrnIMLabelPrivate *priv = HRN_IM_LABEL (actor)->priv;
+  MxPadding padding = { 0, };
+
+  mx_widget_get_padding (MX_WIDGET (actor), &padding);
+
+  clutter_actor_get_preferred_width (priv->label, for_height,
+                                     min_width_p,
+                                     natural_width_p);
+
+  if (min_width_p)
+    *min_width_p += padding.left + padding.right;
+
+  if (natural_width_p)
+    *natural_width_p += padding.left + padding.right;
+}
+
+static void
+hrn_im_label_get_preferred_height (ClutterActor *actor,
+                                   float         for_width,
+                                   float        *min_height_p,
+                                   float        *natural_height_p)
+{
+  HrnIMLabelPrivate *priv = HRN_IM_LABEL (actor)->priv;
+  MxPadding padding = { 0, };
+
+  mx_widget_get_padding (MX_WIDGET (actor), &padding);
+
+  clutter_actor_get_preferred_height (priv->label, for_width,
+                                      min_height_p,
+                                      natural_height_p);
+
+  if (min_height_p)
+    *min_height_p += padding.top + padding.bottom;
+
+  if (natural_height_p)
+    *natural_height_p += padding.top + padding.bottom;
+}
+
+static void
+hrn_im_label_allocate (ClutterActor          *actor,
+                     const ClutterActorBox *box,
+                     ClutterAllocationFlags flags)
+{
+  HrnIMLabelPrivate *priv = HRN_IM_LABEL (actor)->priv;
+  ClutterActorClass *parent_class;
+  ClutterActorBox child_box;
+  MxPadding padding = { 0, };
+
+  mx_widget_get_padding (MX_WIDGET (actor), &padding);
+
+  parent_class = CLUTTER_ACTOR_CLASS (hrn_im_label_parent_class);
+  parent_class->allocate (actor, box, flags);
+
+  child_box.x1 = padding.left;
+  child_box.y1 = padding.top;
+  child_box.x2 = box->x2 - box->x1 - padding.right;
+  child_box.y2 = box->y2 - box->y1 - padding.bottom;
+
+  clutter_actor_allocate (priv->label, &child_box, flags);
+}
+
+static void
+hrn_im_label_paint (ClutterActor *actor)
+{
+  HrnIMLabelPrivate *priv = HRN_IM_LABEL (actor)->priv;
+  ClutterActorClass *parent_class;
+
+  parent_class = CLUTTER_ACTOR_CLASS (hrn_im_label_parent_class);
+  parent_class->paint (actor);
+
+  clutter_actor_paint (priv->label);
+}
+
+static void
+hrn_im_label_map (ClutterActor *actor)
+{
+  HrnIMLabelPrivate *priv = HRN_IM_LABEL (actor)->priv;
+
+  CLUTTER_ACTOR_CLASS (hrn_im_label_parent_class)->map (actor);
+
+  clutter_actor_map (priv->label);
+}
+
+static void
+hrn_im_label_unmap (ClutterActor *actor)
+{
+  HrnIMLabelPrivate *priv = HRN_IM_LABEL (actor)->priv;
+
+  CLUTTER_ACTOR_CLASS (hrn_im_label_parent_class)->unmap (actor);
+
+  clutter_actor_unmap (priv->label);
+}
+
+static void
+clipboard_callback (MxClipboard *clipboard,
+                    const char   *text,
+                    gpointer      data)
+{
+    HrnIMLabel *label = (HrnIMLabel *) data;
+    HrnIMLabelPrivate *priv = label->priv;
+    ClutterText *ctext = (ClutterText *) priv->label;
+    int cursor_pos;
+
+    if (!text) {
+        return;
+    }
+
+    /* delete the current selection before pasting */
+    clutter_text_delete_selection (ctext);
+
+    /* "paste" the clipboard text into the entry */
+    cursor_pos = clutter_text_get_cursor_position (ctext);
+    clutter_text_insert_text (ctext, text, cursor_pos);
+}
+
+static gboolean
+hrn_im_label_key_press_event (ClutterActor    *actor,
+                               ClutterKeyEvent *event)
+{
+    HrnIMLabel *label = (HrnIMLabel *) actor;
+    HrnIMLabelPrivate *priv = label->priv;
+
+    /* This is expected to handle events that were emitted for the inner
+       ClutterText. They only reach this function if the ClutterText
+       didn't handle them */
+
+    /* paste */
+    if ((event->modifier_state & CLUTTER_CONTROL_MASK)
+        && event->keyval == CLUTTER_v) {
+        MxClipboard *clipboard;
+
+        clipboard = mx_clipboard_get_default ();
+
+        mx_clipboard_get_text (clipboard, clipboard_callback, actor);
+        return TRUE;
+    }
+
+    /* Copy */
+    if ((event->modifier_state & CLUTTER_CONTROL_MASK)
+        && event->keyval == CLUTTER_c) {
+        MxClipboard *clipboard;
+        char *text;
+
+        clipboard = mx_clipboard_get_default ();
+
+        text = clutter_text_get_selection ((ClutterText *) priv->label);
+        if (text && *text != '\0') {
+            mx_clipboard_set_text (clipboard, text);
+        }
+
+        return TRUE;
+    }
+
+    /* cut */
+    if ((event->modifier_state & CLUTTER_CONTROL_MASK)
+        && event->keyval == CLUTTER_x) {
+        MxClipboard *clipboard;
+        char *text;
+
+        clipboard = mx_clipboard_get_default ();
+
+        text = clutter_text_get_selection ((ClutterText *) priv->label);
+
+        if (text && *text != '\0') {
+            mx_clipboard_set_text (clipboard, text);
+
+            /* Now delete the text */
+            clutter_text_delete_selection ((ClutterText *) priv->label);
+        }
+
+        return TRUE;
+    }
+
+    return FALSE;
+}
+
+static void
+hrn_im_label_key_focus_in (ClutterActor *actor)
+{
+    HrnIMLabel *label = (HrnIMLabel *) actor;
+    HrnIMLabelPrivate *priv = label->priv;
+
+    /* We never want key focus. The ClutterText should be given first
+       pass for all key events */
+    clutter_actor_grab_key_focus (priv->label);
+}
+
+static void
+hrn_im_label_class_init (HrnIMLabelClass *klass)
+{
+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+  ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass);
+  GParamSpec *pspec;
+
+  g_type_class_add_private (klass, sizeof (HrnIMLabelPrivate));
+
+  gobject_class->set_property = hrn_im_label_set_property;
+  gobject_class->get_property = hrn_im_label_get_property;
+
+  actor_class->paint = hrn_im_label_paint;
+  actor_class->allocate = hrn_im_label_allocate;
+  actor_class->get_preferred_width = hrn_im_label_get_preferred_width;
+  actor_class->get_preferred_height = hrn_im_label_get_preferred_height;
+  actor_class->map = hrn_im_label_map;
+  actor_class->unmap = hrn_im_label_unmap;
+  actor_class->key_press_event = hrn_im_label_key_press_event;
+  actor_class->key_focus_in = hrn_im_label_key_focus_in;
+
+  pspec = g_param_spec_string ("text",
+                               "Text",
+                               "Text of the label",
+                               NULL, G_PARAM_READWRITE);
+  g_object_class_install_property (gobject_class, PROP_LABEL, pspec);
+
+}
+
+static void
+hrn_im_label_init (HrnIMLabel *label)
+{
+  HrnIMLabelPrivate *priv;
+
+  label->priv = priv = HRN_IM_LABEL_GET_PRIVATE (label);
+
+  label->priv->label = g_object_new (CLUTTER_TYPE_IMTEXT,
+                                     "ellipsize", PANGO_ELLIPSIZE_END,
+                                     "use-markup", TRUE,
+                                     NULL);
+
+  clutter_actor_set_parent (priv->label, CLUTTER_ACTOR (label));
+
+  g_signal_connect (label, "style-changed",
+                    G_CALLBACK (hrn_im_label_style_changed), NULL);
+}
+
+/**
+ * hrn_im_label_new:
+ * @text: text to set the label to
+ *
+ * Create a new #HrnIMLabel with the specified label
+ *
+ * Returns: a new #HrnIMLabel
+ */
+ClutterActor *
+hrn_im_label_new (const gchar *text)
+{
+  return g_object_new (HRN_TYPE_IM_LABEL,
+                       "text", (text != NULL && *text != '\0') ? text : "",
+                       NULL);
+}
+
+/**
+ * hrn_im_label_get_text:
+ * @label: a #HrnIMLabel
+ *
+ * Get the text displayed on the label
+ *
+ * Returns: the text for the label. This must not be freed by the application
+ */
+G_CONST_RETURN gchar *
+hrn_im_label_get_text (HrnIMLabel *label)
+{
+  g_return_val_if_fail (HRN_IS_IM_LABEL (label), NULL);
+
+  return clutter_text_get_text (CLUTTER_TEXT (label->priv->label));
+}
+
+/**
+ * hrn_im_label_set_text:
+ * @label: a #HrnIMLabel
+ * @text: text to set the label to
+ *
+ * Sets the text displayed on the label
+ */
+void
+hrn_im_label_set_text (HrnIMLabel *label,
+                       const gchar *text)
+{
+  HrnIMLabelPrivate *priv;
+
+  g_return_if_fail (HRN_IS_IM_LABEL (label));
+  g_return_if_fail (text != NULL);
+
+  priv = label->priv;
+
+  clutter_text_set_text (CLUTTER_TEXT (priv->label), text);
+
+  g_object_notify (G_OBJECT (label), "text");
+}
+
+/**
+ * hrn_im_label_get_clutter_text:
+ * @label: a #HrnIMLabel
+ *
+ * Retrieve the internal #ClutterText so that extra parameters can be set
+ *
+ * Returns: the #ClutterText used by #HrnIMLabel. The label is owned by the
+ * #HrnIMLabel and should not be unref'ed by the application.
+ */
+ClutterActor*
+hrn_im_label_get_clutter_text (HrnIMLabel *label)
+{
+  g_return_val_if_fail (HRN_IM_LABEL (label), NULL);
+
+  return label->priv->label;
+}
diff -pruN 1.5.1-1/src/hrn-im-label.h 1.8.4-1/src/hrn-im-label.h
--- 1.5.1-1/src/hrn-im-label.h	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/src/hrn-im-label.h	2010-02-17 17:26:44.000000000 +0000
@@ -0,0 +1,72 @@
+/*
+ * hrn-label.h: Plain label actor
+ *
+ * Copyright 2008, 2009 Intel Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU Lesser General Public License,
+ * version 2.1, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
+ * Boston, MA 02111-1307, USA.
+ *
+ * Written by: Thomas Wood <thomas@linux.intel.com>
+ *
+ */
+
+
+#ifndef __HRN_IM_LABEL_H__
+#define __HRN_IM_LABEL_H__
+
+G_BEGIN_DECLS
+
+#include <hrn.h>
+
+#define HRN_TYPE_IM_LABEL             (hrn_im_label_get_type ())
+#define HRN_IM_LABEL(obj)              (G_TYPE_CHECK_INSTANCE_CAST ((obj), HRN_TYPE_IM_LABEL, HrnIMLabel))
+#define HRN_IS_IM_LABEL(obj)             (G_TYPE_CHECK_INSTANCE_TYPE ((obj), HRN_TYPE_IM_LABEL))
+#define HRN_IM_IM_LABEL_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), HRN_TYPE_IM_LABEL, HrnIMLabelClass))
+#define HRN_IS_IM_LABEL_CLASS(klass)     (G_TYPE_CHECK_CLASS_TYPE ((klass), HRN_TYPE_IM_LABEL))
+#define HRN_IM_IM_LABEL_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), HRN_TYPE_IM_LABEL, HrnIMLabelClass))
+
+typedef struct _HrnIMLabel              HrnIMLabel;
+typedef struct _HrnIMLabelPrivate       HrnIMLabelPrivate;
+typedef struct _HrnIMLabelClass         HrnIMLabelClass;
+
+/**
+ * HrnIMLabel:
+ *
+ * The contents of this structure is private and should only be accessed using
+ * the provided API.
+ */
+struct _HrnIMLabel
+{
+  /*< private >*/
+  MxWidget parent_instance;
+
+  HrnIMLabelPrivate *priv;
+};
+
+struct _HrnIMLabelClass
+{
+  MxWidgetClass parent_class;
+};
+
+GType hrn_im_label_get_type (void) G_GNUC_CONST;
+
+ClutterActor *        hrn_im_label_new              (const gchar *text);
+G_CONST_RETURN gchar *hrn_im_label_get_text         (HrnIMLabel *label);
+void                  hrn_im_label_set_text         (HrnIMLabel *label,
+                                                      const gchar *text);
+ClutterActor *        hrn_im_label_get_clutter_text (HrnIMLabel *label);
+
+G_END_DECLS
+
+#endif /* __HRN_IM_LABEL_H__ */
diff -pruN 1.5.1-1/src/hrn-item.c 1.8.4-1/src/hrn-item.c
--- 1.5.1-1/src/hrn-item.c	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/src/hrn-item.c	2010-02-17 17:26:44.000000000 +0000
@@ -0,0 +1,152 @@
+#include "hrn-item.h"
+
+enum {
+    PROP_0,
+};
+
+enum {
+    LAST_SIGNAL,
+};
+
+struct _HrnItemPrivate {
+    HrnItemType type;
+
+    char *uri;
+    char *mimetype;
+    GHashTable *metadata;
+};
+
+#define GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), HRN_TYPE_ITEM, HrnItemPrivate))
+G_DEFINE_TYPE (HrnItem, hrn_item, G_TYPE_OBJECT);
+#if 0
+static guint32 signals[LAST_SIGNAL] = {0,};
+#endif
+
+static void
+hrn_item_finalize (GObject *object)
+{
+    G_OBJECT_CLASS (hrn_item_parent_class)->finalize (object);
+}
+
+static void
+hrn_item_dispose (GObject *object)
+{
+    G_OBJECT_CLASS (hrn_item_parent_class)->dispose (object);
+}
+
+static void
+hrn_item_set_property (GObject      *object,
+                       guint         prop_id,
+                       const GValue *value,
+                       GParamSpec   *pspec)
+{
+    switch (prop_id) {
+
+    default:
+        break;
+    }
+}
+
+static void
+hrn_item_get_property (GObject    *object,
+                       guint       prop_id,
+                       GValue     *value,
+                       GParamSpec *pspec)
+{
+    switch (prop_id) {
+
+    default:
+        break;
+    }
+}
+
+static void
+hrn_item_class_init (HrnItemClass *klass)
+{
+    GObjectClass *o_class = (GObjectClass *) klass;
+
+    o_class->dispose = hrn_item_dispose;
+    o_class->finalize = hrn_item_finalize;
+    o_class->set_property = hrn_item_set_property;
+    o_class->get_property = hrn_item_get_property;
+
+    g_type_class_add_private (klass, sizeof (HrnItemPrivate));
+}
+
+static void
+hrn_item_init (HrnItem *self)
+{
+    HrnItemPrivate *priv = GET_PRIVATE (self);
+
+    self->priv = priv;
+    priv->metadata = g_hash_table_new_full (g_str_hash, g_str_equal,
+                                            g_free, g_free);
+}
+
+HrnItem *
+hrn_item_new (HrnItemType type,
+              const char *uri,
+              const char *mimetype)
+{
+    HrnItem *item;
+    HrnItemPrivate *priv;
+
+    item = g_object_new (HRN_TYPE_ITEM, NULL);
+    priv = item->priv;
+
+    priv->type = type;
+    priv->uri = g_strdup (uri);
+    priv->mimetype = g_strdup (mimetype);
+
+    return item;
+}
+
+HrnItemType
+hrn_item_get_item_type (HrnItem *item)
+{
+    HrnItemPrivate *priv = item->priv;
+
+    return priv->type;
+}
+
+const char *
+hrn_item_get_uri (HrnItem *item)
+{
+    HrnItemPrivate *priv = item->priv;
+
+    return priv->uri;
+}
+
+const char *
+hrn_item_get_mimetype (HrnItem *item)
+{
+    HrnItemPrivate *priv = item->priv;
+
+    return priv->mimetype;
+}
+
+const char *
+hrn_item_get_metadata (HrnItem    *item,
+                       const char *key)
+{
+    HrnItemPrivate *priv = item->priv;
+
+    return g_hash_table_lookup (priv->metadata, key);
+}
+
+void
+hrn_item_set_metadata (HrnItem    *item,
+                       const char *key,
+                       const char *value)
+{
+    HrnItemPrivate *priv = item->priv;
+
+    /* Don't store empty values */
+    if (value == NULL || *value == '\0') {
+        return;
+    }
+
+    g_hash_table_insert (priv->metadata,
+                         g_strdup (key),
+                         g_strdup (value));
+}
diff -pruN 1.5.1-1/src/hrn-item.h 1.8.4-1/src/hrn-item.h
--- 1.5.1-1/src/hrn-item.h	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-item.h	2010-02-17 17:26:44.000000000 +0000
@@ -1,6 +1,6 @@
 /*
  * Hornsey - Moblin Media Player.
- * Copyright © 2009 Intel Corporation.
+ * Copyright © 2009 - 2010 Intel Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms and conditions of the GNU Lesser General Public License,
@@ -16,103 +16,79 @@
  * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA
  */
 
-#ifndef _HRN_ITEM_H
-#define _HRN_ITEM_H
+#ifndef __HRN_ITEM_H__
+#define __HRN_ITEM_H__
 
-#include <clutter/clutter.h>
+#include <glib-object.h>
 
-G_BEGIN_DECLS
-
-#define HRN_TYPE_ITEM    hrn_item_get_type ()
-
-#define HRN_ITEM(obj) \
-  (G_TYPE_CHECK_INSTANCE_CAST ((obj), HRN_TYPE_ITEM, HrnItem))
 
-#define HRN_ITEM_CLASS(klass) \
-  (G_TYPE_CHECK_CLASS_CAST ((klass), HRN_TYPE_ITEM, HrnItemClass))
-
-#define HRN_IS_ITEM(obj) \
-  (G_TYPE_CHECK_INSTANCE_TYPE ((obj), HRN_TYPE_ITEM))
-
-#define HRN_IS_ITEM_CLASS(klass) \
-  (G_TYPE_CHECK_CLASS_TYPE ((klass), HRN_TYPE_ITEM))
+G_BEGIN_DECLS
 
-#define HRN_ITEM_GET_CLASS(obj) \
-  (G_TYPE_INSTANCE_GET_CLASS ((obj), HRN_TYPE_ITEM, HrnItemClass))
+#define HRN_TYPE_ITEM                                                   \
+   (hrn_item_get_type())
+#define HRN_ITEM(obj)                                                   \
+   (G_TYPE_CHECK_INSTANCE_CAST ((obj),                                  \
+                                HRN_TYPE_ITEM,                          \
+                                HrnItem))
+#define HRN_ITEM_CLASS(klass)                                           \
+   (G_TYPE_CHECK_CLASS_CAST ((klass),                                   \
+                             HRN_TYPE_ITEM,                             \
+                             HrnItemClass))
+#define IS_HRN_ITEM(obj)                                                \
+   (G_TYPE_CHECK_INSTANCE_TYPE ((obj),                                  \
+                                HRN_TYPE_ITEM))
+#define IS_HRN_ITEM_CLASS(klass)                                        \
+   (G_TYPE_CHECK_CLASS_TYPE ((klass),                                   \
+                             HRN_TYPE_ITEM))
+#define HRN_ITEM_GET_CLASS(obj)                                         \
+   (G_TYPE_INSTANCE_GET_CLASS ((obj),                                   \
+                               HRN_TYPE_ITEM,                           \
+                               HrnItemClass))
 
-typedef struct _HrnItem HrnItem;
-typedef struct _HrnItemClass HrnItemClass;
 typedef struct _HrnItemPrivate HrnItemPrivate;
+typedef struct _HrnItem      HrnItem;
+typedef struct _HrnItemClass HrnItemClass;
+typedef enum _HrnItemType {
+    HRN_ITEM_TYPE_AUDIO,
+    HRN_ITEM_TYPE_IMAGE,
+    HRN_ITEM_TYPE_VIDEO
+} HrnItemType;
+
+#define HRN_ITEM_METADATA_TRACK "track"
+#define HRN_ITEM_METADATA_TITLE "title"
+#define HRN_ITEM_METADATA_ALBUM "album"
+#define HRN_ITEM_METADATA_DATE "date"
+#define HRN_ITEM_METADATA_ARTIST "artist"
+#define HRN_ITEM_METADATA_EPISODE "episode"
+#define HRN_ITEM_METADATA_SEASON "season"
+#define HRN_ITEM_METADATA_SERIES_NAME "showname"
 
 struct _HrnItem
 {
-  HrnSwitcher parent_instance;
-  BklItem    *item;
-
-  NbtkWidget *title;
-  NbtkWidget *meta;
+    GObject parent;
 
-  NbtkWidget *title2;
-  NbtkWidget *meta2;
-#if 0
-  gchar *title;          /* The title of the item (falls back to basename) */
-  gchar *meta1;          /* primary meta data for item (author/origin) */
-#endif
-  HrnItemPrivate *priv;
-  gint            no;
+    HrnItemPrivate *priv;
 };
 
 struct _HrnItemClass
 {
-  /*< private >*/
-  HrnSwitcherClass parent_class;
+    GObjectClass parent_class;
 };
 
-gboolean hrn_item_can_drop (ClutterActor *actor,
-                            ClutterActor *dropped_on,
-                            gint          x,
-                            gint          y,
-                            gpointer      userdata);
-
-gboolean hrn_item_drop     (ClutterActor *actor,
-                            ClutterActor *dropped_on,
-                            gint          x,
-                            gint          y,
-                            gpointer      userdata);
-
 GType hrn_item_get_type (void) G_GNUC_CONST;
+HrnItem *hrn_item_new (HrnItemType type,
+                       const char *uri,
+                       const char *mimetype);
+HrnItemType hrn_item_get_item_type (HrnItem *item);
+const char *hrn_item_get_uri (HrnItem *item);
+const char *hrn_item_get_mimetype (HrnItem *item);
+const char *hrn_item_get_metadata (HrnItem    *item,
+                                   const char *key);
+void hrn_item_set_metadata (HrnItem    *item,
+                            const char *key,
+                            const char *value);
 
 
-
-
-
-gboolean hrn_item_get_selected (HrnItem *item);
-void     hrn_item_set_selected (HrnItem *item,
-                                gboolean selected);
-
-
-
-
-
-
-/* should be in utils instead */
-
-/* returns allocated strings with what hornsey considers
- * the title of the item and the string that contains hornseys
- * view of the metadata line.
- */
-gchar *       hrn_item_get_title (BklItem *item);
-gchar *       hrn_item_get_meta (BklItem *item);
-gchar *       bkl_item_uri_to_title (BklItem *item);
-gchar *       hrn_item_uri_parent_to_meta (BklItem *item);
-
-ClutterActor *hrn_play_button_new (HrnSwitcher  *switcher,
-                                   ClutterActor *group,
-                                   BklItem      *item);
-HrnView *     hrn_item_get_view (ClutterActor *actor);
-
-/* this causes item mode to be activated */
-
 G_END_DECLS
 
-#endif
+#endif /* __HRN_ITEM_H__ */
diff -pruN 1.5.1-1/src/hrn-marshal.list 1.8.4-1/src/hrn-marshal.list
--- 1.5.1-1/src/hrn-marshal.list	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-marshal.list	2010-02-17 17:26:44.000000000 +0000
@@ -1,6 +1,8 @@
 VOID:STRING,STRING
-VOID:OBJECT,INT,STRING
+VOID:INT,STRING
 VOID:INT,INT,BOOLEAN
 VOID:POINTER,INT,POINTER
 VOID:INT,INT
 VOID:INT,POINTER
+VOID:UINT,POINTER
+VOID:UINT,POINTER,INT,STRING
diff -pruN 1.5.1-1/src/hrn-pin-manager.c 1.8.4-1/src/hrn-pin-manager.c
--- 1.5.1-1/src/hrn-pin-manager.c	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-pin-manager.c	2010-02-17 17:26:44.000000000 +0000
@@ -276,6 +276,10 @@ hrn_pin_manager_get_pin (HrnPinManager *
 {
     HrnPinManagerPrivate *priv = manager->priv;
 
+    if (name == NULL) {
+        return NULL;
+    }
+
     return g_hash_table_lookup (priv->pins, name);
 }
 
@@ -341,6 +345,8 @@ hrn_pin_manager_add (HrnPinManager *mana
     pin->filter = filter;
     pin->zoom_level = zoom_level;
 
+    g_print ("Pin added\n   %s\n   %s\n   %s\n",
+             pin->group, pin->name, pin->query);
     g_hash_table_insert (priv->pins, pin->group, pin);
     priv->pin_count++;
 
diff -pruN 1.5.1-1/src/hrn-popup.c 1.8.4-1/src/hrn-popup.c
--- 1.5.1-1/src/hrn-popup.c	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-popup.c	1970-01-01 01:00:00.000000000 +0100
@@ -1,302 +0,0 @@
-/*
- * Hornsey - Moblin Media Player.
- * Copyright © 2009 Intel Corporation.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU Lesser General Public License,
- * version 2.1, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#include <glib.h>
-#include <glib/gi18n.h>
-
-#include "hrn.h"
-
-static ClutterActor *popup        = NULL;
-static guint         popuphandler = 0;
-
-gboolean
-hrn_actor_has_ancestor (ClutterActor *actor, ClutterActor *ancestor)
-{
-  ClutterActor *iter;
-
-  if (!actor || !ancestor)
-    return FALSE;
-  for (iter = actor;
-       iter;
-       iter = clutter_actor_get_parent (iter))
-    {
-      if (iter == ancestor)
-        return TRUE;
-    }
-  return FALSE;
-}
-
-static void
-destroy_when_done (ClutterAnimation *anim, ClutterActor     *actor)
-{
-  clutter_actor_destroy (actor);
-}
-
-void
-hrn_popup_close (void)
-{
-  if (!popup)
-    return;
-  if (popuphandler)
-    {
-      g_signal_handler_disconnect (hrn_window_get_stage (window), popuphandler);
-      popuphandler = 0;
-    }
-  clutter_actor_animate (popup, CLUTTER_LINEAR, 150, "scale-x", 0.001,
-                         "scale-y", 0.001,
-                         "signal::completed", destroy_when_done, popup,
-                         NULL);
-  popup = NULL;
-}
-
-gboolean
-popup_capture (ClutterActor *stage, ClutterEvent *event, gpointer popup)
-{
-  switch (event->type)
-    {
-      case CLUTTER_LEAVE: /* to allow dehovering what we right-clicked */
-        return FALSE;
-
-      case CLUTTER_BUTTON_RELEASE: /* clicks outside the menu makes it go away
-                                    */
-        if (!hrn_actor_has_ancestor (clutter_event_get_source (event), popup))
-          {
-            hrn_popup_close ();
-            return TRUE;
-          }
-
-      case CLUTTER_BUTTON_PRESS:
-      case CLUTTER_MOTION:
-      case CLUTTER_ENTER:
-        if (hrn_actor_has_ancestor (clutter_event_get_source (event), popup))
-          return FALSE;
-        break;
-
-      default:
-        break;
-    }
-  return TRUE;
-}
-
-void
-hrn_popup_actor (gint x, gint y, ClutterActor *actor)
-{
-  gfloat        w2, h2;
-  gint          w, h;
-  ClutterActor *stage = hrn_window_get_stage (window);
-
-  /* install a capture that only allows events destined to
-   * children of the popped up actor to come through
-   */
-  clutter_group_add (stage, actor);
-  clutter_actor_get_size (actor, &w2, &h2);
-  w = w2;
-  h = h2;
-  clutter_actor_set_position (actor, x, y);
-
-  clutter_actor_set_scale (actor, 0.01, 0.01);
-
-
-  /* Avoid placing the popup off stage
-   * if gravity could be specified in floating point values, this could be
-   * handled more elegantly
-   */
-  if (x + w / 2 > clutter_actor_get_width (stage))
-    {
-      if (y + h / 2 > clutter_actor_get_height (stage))
-        {
-          clutter_actor_set_anchor_point_from_gravity (
-            actor, CLUTTER_GRAVITY_SOUTH_EAST);
-        }
-      else if (y - h / 2 < 0)
-        {
-          clutter_actor_set_anchor_point_from_gravity (
-            actor, CLUTTER_GRAVITY_NORTH_EAST);
-        }
-      else
-        {
-          clutter_actor_set_anchor_point_from_gravity (actor,
-                                                       CLUTTER_GRAVITY_EAST);
-        }
-    }
-  else if (x - w / 2 < 0)
-    {
-      if (y + h / 2 > clutter_actor_get_height (stage))
-        {
-          clutter_actor_set_anchor_point_from_gravity (
-            actor, CLUTTER_GRAVITY_SOUTH_WEST);
-        }
-      else if (y - h / 2 < 0)
-        {
-          clutter_actor_set_anchor_point_from_gravity (
-            actor, CLUTTER_GRAVITY_NORTH_WEST);
-        }
-      else
-        {
-          clutter_actor_set_anchor_point_from_gravity (actor,
-                                                       CLUTTER_GRAVITY_WEST);
-        }
-    }
-  else
-    {
-      if (y + h / 2 > clutter_actor_get_height (stage))
-        {
-          clutter_actor_set_anchor_point_from_gravity (actor,
-                                                       CLUTTER_GRAVITY_SOUTH);
-        }
-      else if (y - h / 2 < 0)
-        {
-          clutter_actor_set_anchor_point_from_gravity (actor,
-                                                       CLUTTER_GRAVITY_NORTH);
-        }
-      else
-        {
-          clutter_actor_set_anchor_point_from_gravity (actor,
-                                                       CLUTTER_GRAVITY_CENTER);
-        }
-    }
-
-  clutter_actor_animate (actor, CLUTTER_LINEAR, 150, "scale-x", 1.0, "scale-y",
-                         1.0,
-                         NULL);
-  popup = actor;
-
-  popuphandler =
-    g_signal_connect_after (stage, "captured-event", G_CALLBACK (
-                              popup_capture), actor);
-}
-
-
-void
-hrn_popup_actor_fixed (gint x, gint y, ClutterActor *actor)
-{
-  gfloat        w2, h2;
-  gint          w, h;
-  ClutterActor *stage = hrn_window_get_stage (window);
-
-  /* install a capture that only allows events destined to
-   * children of the popped up actor to come through
-   */
-  clutter_group_add (stage, actor);
-  clutter_actor_get_size (actor, &w2, &h2);
-  w = w2;
-  h = h2;
-  clutter_actor_set_position (actor, x, y);
-  popup = actor;
-
-  popuphandler =
-    g_signal_connect_after (stage, "captured-event", G_CALLBACK (
-                              popup_capture), actor);
-}
-
-
-ClutterActor *
-hrn_popup_actions (gpointer *actions, gpointer userdata)
-{
-  gint          i;
-  gint          max_width = 0;
-  ClutterActor *group     = CLUTTER_ACTOR (g_object_new (NBTK_TYPE_GRID,
-                                                         "width", 0.0,
-                                                         NULL));
-
-  nbtk_widget_set_style_class_name (NBTK_WIDGET (group), "HrnPopup");
-
-  for (i = 0; actions[i]; i += 2)
-    {
-      gfloat        w, h;
-      ClutterActor *label;
-
-      label = CLUTTER_ACTOR (nbtk_button_new_with_label (gettext (actions[i])));
-      clutter_container_add_actor (CLUTTER_CONTAINER (group), label);
-      nbtk_bin_set_alignment (NBTK_BIN (label), NBTK_ALIGN_START, NBTK_ALIGN_START);
-
-      if (actions[i + 1])
-        {
-          g_signal_connect_swapped (label, "clicked",
-                                    G_CALLBACK (actions[i + 1]), userdata);
-        }
-      else
-        {
-          g_signal_connect (label, "clicked", G_CALLBACK (
-                              hrn_popup_close), userdata);
-        }
-      clutter_actor_get_size (label, &w, &h);
-      if (w + 20 > max_width)
-        max_width = w + 20;
-    }
-
-  clutter_actor_set_width (group, max_width + 44);
-  {
-    GList *i, *children =
-      clutter_container_get_children (CLUTTER_CONTAINER (group));
-    for (i = children; i; i = i->next)
-      clutter_actor_set_width (i->data, max_width);
-    g_list_free (children);
-  }
-  clutter_actor_set_reactive (group, TRUE);
-  return group;
-}
-
-ClutterActor *
-hrn_popup_actions_bolded (gpointer *actions, gpointer userdata, gint boldno)
-{
-  gint          i;
-  gint          max_width = 0;
-  ClutterActor *group     = CLUTTER_ACTOR (g_object_new (NBTK_TYPE_GRID,
-                                                         "width", 0.0,
-                                                         NULL));
-
-  nbtk_widget_set_style_class_name (NBTK_WIDGET (group), "HrnPopup");
-
-  for (i = 0; actions[i]; i += 2)
-    {
-      gfloat        w, h;
-      ClutterActor *label;
-
-      label = CLUTTER_ACTOR (nbtk_button_new_with_label (gettext (actions[i])));
-      clutter_container_add_actor (CLUTTER_CONTAINER (group), label);
-      nbtk_bin_set_alignment (NBTK_BIN (label), NBTK_ALIGN_START, NBTK_ALIGN_START);
-      if (i / 2 == boldno)
-        nbtk_widget_set_style_class_name (NBTK_WIDGET (label), "HrnPopupActive");
-
-      if (actions[i + 1])
-        {
-          g_signal_connect_swapped (label, "clicked",
-                                    G_CALLBACK (actions[i + 1]), userdata);
-        }
-      else
-        {
-          g_signal_connect (label, "clicked", G_CALLBACK (
-                              hrn_popup_close), userdata);
-        }
-      clutter_actor_get_size (label, &w, &h);
-      if (w + 20 > max_width)
-        max_width = w + 20;
-    }
-
-  clutter_actor_set_width (group, max_width + 44);
-  {
-    GList *i, *children =
-      clutter_container_get_children (CLUTTER_CONTAINER (group));
-    for (i = children; i; i = i->next)
-      clutter_actor_set_width (i->data, max_width);
-    g_list_free (children);
-  }
-  clutter_actor_set_reactive (group, TRUE);
-  return group;
-}
diff -pruN 1.5.1-1/src/hrn-popup.h 1.8.4-1/src/hrn-popup.h
--- 1.5.1-1/src/hrn-popup.h	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-popup.h	1970-01-01 01:00:00.000000000 +0100
@@ -1,37 +0,0 @@
-/*
- * Hornsey - Moblin Media Player.
- * Copyright © 2009 Intel Corporation.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU Lesser General Public License,
- * version 2.1, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#ifndef HRN_POPUP_H
-#define HRN_POPUP_H
-
-void          hrn_popup_actor          (gint          x,
-                                        gint          y,
-                                        ClutterActor *actor);
-void          hrn_popup_actor_fixed    (gint          x,
-                                        gint          y,
-                                        ClutterActor *actor);
-void          hrn_popup_close          (void);
-ClutterActor *hrn_popup_actions        (gpointer     *actions,
-                                        gpointer      userdata);
-ClutterActor *hrn_popup_actions_bolded (gpointer     *actions,
-                                        gpointer      userdata,
-                                        gint          boldno);
-gboolean      hrn_actor_has_ancestor   (ClutterActor *actor,
-                                        ClutterActor *ancestor);
-
-#endif
diff -pruN 1.5.1-1/src/hrn-queue.c 1.8.4-1/src/hrn-queue.c
--- 1.5.1-1/src/hrn-queue.c	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-queue.c	2011-03-15 13:20:21.000000000 +0000
@@ -1,455 +1,64 @@
-/*
- * Hornsey - Moblin Media Player.
- * Copyright © 2009 Intel Corporation.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU Lesser General Public License,
- * version 2.1, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-
-#define ROW_OFFSET    5
-#define ROW_HEIGHT    40
-
-#include <math.h>
-#include <string.h>
-#include <stdlib.h>
-#include <ctype.h>
-
+#include <config.h>
 #include <glib.h>
 #include <glib/gi18n.h>
 #include <gio/gio.h>
 
-#include <clutter/clutter.h>
-#include <cogl/cogl.h>
-
-#include <nbtk/nbtk.h>
-
-#include <bognor/br-queue.h>
-
-#include "hrn.h" /* FIXME */
-#include "hrn-drag-n-drop.h"
+#include "hrn.h"
+#include "hrn-queue-item-factory.h"
+#include "hrn-queue-item.h"
 #include "hrn-queue.h"
-#include "hrn-source-manager.h"
-#include "hrn-texture-cache.h"
 #include "hrn-queue-header.h"
-#include "hrn-popup.h"
-
-#define    QUEUE_TIP_HEIGHT    47  /* used to determine drops on tip */
-
-
-G_DEFINE_TYPE (HrnQueue, hrn_queue, NBTK_TYPE_BIN);
-
-#define HRN_QUEUE_GET_PRIVATE(obj)                 \
-  (G_TYPE_INSTANCE_GET_PRIVATE ((obj), \
-                                HRN_TYPE_QUEUE, \
-                                HrnQueuePrivate))
-
-struct _HrnQueuePrivate
-{
-    BrQueue *br_queue;
-    HrnSourceManager *manager;
-
-    ClutterActor *top_group;
-    NbtkWidget     *toptable;
-    NbtkWidget     *header;
-    NbtkWidget     *table;
-    NbtkWidget     *view;
-    NbtkWidget     *scrollview;
-    ClutterGroup   *children;
-    NbtkWidget     *playpause;
-    NbtkWidget *highlight;
 
-    guint   reposition_id;
-
-    BklItem    *active_audio;
-
-    /* FIXME: Queue needs to be a GQueue */
-    GList *queue;
+enum {
+    PROP_0,
+    PROP_QUEUE,
+    PROP_MANAGER
 };
 
-typedef struct QueueItem
-{
-  HrnQueue     *queue;
-  BklItem      *item;
-  ClutterActor *actor;
-}
-QueueItem;
-
-static GObject * hrn_queue_constructor (GType                  type,
-                                        guint                  n_params,
-                                        GObjectConstructParam *params);
-static void hrn_queue_dispose          (GObject               *object);
-static void hrn_queue_allocate         (ClutterActor          *self,
-                                        const ClutterActorBox *box,
-                                        ClutterAllocationFlags flags);
-static void hrn_queue_reposition       (HrnQueue              *queue);
-static void add_item                   (HrnQueue              *queue,
-                                        QueueItem             *queue_item);
-
-static void
-hrn_queue_class_init (HrnQueueClass *klass)
-{
-  GObjectClass      *gobject_class = G_OBJECT_CLASS (klass);
-  ClutterActorClass *actor_class   = CLUTTER_ACTOR_CLASS (klass);
-
-  gobject_class->dispose      = hrn_queue_dispose;
-  gobject_class->constructor  = hrn_queue_constructor;
-
-  actor_class->allocate       = hrn_queue_allocate;
-
-  g_type_class_add_private (gobject_class, sizeof (HrnQueuePrivate));
-}
-
-static void
-hrn_queue_init (HrnQueue *self)
-{
-  self->priv = HRN_QUEUE_GET_PRIVATE (self);
-}
-
-static void
-expanded_clicked_cb (HrnQueueHeader *header,
-                     gboolean        expanded,
-                     HrnQueue       *queue)
-{
-  HrnQueuePrivate *priv = queue->priv;
-
-  if (expanded) {
-      clutter_actor_animate ((ClutterActor *) queue,
-                             CLUTTER_EASE_IN_OUT_CUBIC, 350,
-                             "y", -200.0,
-                             "height", 362.0,
-                             NULL);
-      clutter_actor_show (CLUTTER_ACTOR (priv->scrollview));
-  } else {
-      clutter_actor_animate ((ClutterActor *) queue,
-                             CLUTTER_EASE_IN_OUT_CUBIC, 350,
-                             "y", 0.0,
-                             "height", 74.0,
-                             "signal-swapped::completed",
-                             clutter_actor_hide, priv->scrollview,
-                             NULL);
-    }
-}
-
-#if 0
-static gboolean
-playpause_clicked_cb (NbtkButton *button, HrnQueue     *queue)
-{
-  hrn_queue_set_playing (queue, nbtk_button_get_checked (button));
-  return TRUE;
-}
-#endif
+struct _HrnQueuePrivate {
+    ClutterModel *model;
+    HrnQueueItemFactory *factory;
+    HrnQueueHeader *header;
+    /* HrnSourceManager *manager; */
+    HrnTrackerClient *tracker;
+    BrQueue *queue;
 
-static gboolean
-active_audio_drop (ClutterActor *actor,
-                   ClutterActor *dropped_on,
-                   gint          x,
-                   gint          y,
-                   gpointer      queue)
-{
-  BklItem *active_audio = hrn_queue_get_active_audio (queue);
-
-  if (active_audio)
-    {
-      if (!dropped_on)
-        {
-          hrn_queue_set_active_audio (queue, NULL, "");
-          return TRUE;
-        }
-      else
-        return hrn_item_drop (actor, dropped_on, x, y, active_audio);
-    }
-  return FALSE;
-}
-
-
-static gboolean
-hrn_item_can_drop_active_audio (ClutterActor *actor,
-                                ClutterActor *dropped_on,
-                                gint          x,
-                                gint          y,
-                                gpointer      queue)
-{
-  HrnQueuePrivate *priv = HRN_QUEUE_GET_PRIVATE (queue);
-
-  if (!priv->active_audio)
-    return FALSE;
-  return hrn_item_can_drop (actor, dropped_on, x, y, queue);
-}
-
-static void
-empty_queue (HrnQueue *queue)
-{
-  HrnQueuePrivate *priv = HRN_QUEUE_GET_PRIVATE (queue);
-
-  br_queue_clear (priv->br_queue);
-  hrn_popup_close ();
-}
-
-static gint shuffle_sort (gconstpointer a,
-                          gconstpointer b)
-{
-  return g_random_int_range (0, 52)<26;
-}
-
-static void
-randomize_queue (HrnQueue *queue)
-{
-  gint i;
-  gint l = hrn_queue_get_length (queue);
-
-  GList *iter, *list = NULL;
-
-  /* create a copy of all the items in the queue */
-  for (i = 0; i < l; i++)
-    {
-      BklItem *item = hrn_queue_get (queue, i);
-      list = g_list_prepend (list, item);
-      g_object_ref (item);
-    }
-
-  empty_queue (queue);
-
-  /* we shuffle the list by sorting it*/
-  for (i = 0; i < 3; i++)
-     list = g_list_sort (list, shuffle_sort);
-
-  /* reinsert the queue items by appending all */
-  for (iter = list; iter; iter = iter->next)
-    {
-      hrn_queue_append (queue, iter->data);
-      g_object_unref (iter->data);
-    }
-
-  g_list_free (list);
-
-  hrn_popup_close ();
-}
+    ClutterActor *scroll;
+    ClutterActor *listview;
+};
 
-#define QUEUE_WIDTH         190
-#define QUEUE_WIDTH2        200 /* including padding */
-#define QUEUE_ITEM_WIDTH    QUEUE_WIDTH - 40 /* minus interior padding to avoid
-                                                horizontal scroll */
-
-#define QUEUE_HEADER_HEIGHT 74
-
-static gboolean
-queue_release (ClutterActor *actor,
-               ClutterEvent *event,
-               gpointer      userdata)
-{
-  if (event->button.button == 3)
-    {
-      gpointer actions[] = {
-        N_("Empty"),   empty_queue,
-        N_("Shuffle"), randomize_queue,
-        NULL
-      };
-      hrn_popup_actor (event->button.x, event->button.y,
-                       hrn_popup_actions (actions, actor));
-      return TRUE;
-    }
-  return FALSE;
-}
+#define QUEUE_HEIGHT 200.0
 
-static void
-progress_notify (HrnQueueHeader *header,
-                 double          position,
-                 HrnQueue       *queue)
-{
-  HrnQueuePrivate *priv = HRN_QUEUE_GET_PRIVATE (queue);
+enum {
+    MODEL_ITEM,
+    MODEL_URI,
+};
 
-  br_queue_set_position (priv->br_queue, position);
-}
+#define GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), HRN_TYPE_QUEUE, HrnQueuePrivate))
+G_DEFINE_TYPE (HrnQueue, hrn_queue, MX_TYPE_FRAME);
 
-/* only paint the children that are actually visible */
 static void
-hrn_queue_list_paint (ClutterActor *actor,
-                      gpointer      userdata)
-{
-  GList         *child_item, *children;
-  gint           sh;
-
-  NbtkScrollBar *scrollbar =
-    NBTK_SCROLL_BAR (nbtk_scroll_view_get_vscroll_bar (NBTK_SCROLL_VIEW (
-                clutter_actor_get_parent (clutter_actor_get_parent (actor)))));
-  gfloat scroll = nbtk_adjustment_get_value (
-    nbtk_scroll_bar_get_adjustment (scrollbar));
-
-
-  sh = clutter_actor_get_height (clutter_stage_get_default ());
-
-  children = clutter_container_get_children (CLUTTER_CONTAINER (actor));
-
-  for (child_item = children;
-       child_item != NULL;
-       child_item = child_item->next)
-    {
-      ClutterActor *child = child_item->data;
-
-      g_assert (child != NULL);
-
-      if (CLUTTER_ACTOR_IS_VISIBLE (child))
-        {
-          gint y;
-          y = clutter_actor_get_y (child);
-          if (y - scroll > -64 &&
-              y - scroll < 300)
-            clutter_actor_paint (child);
-        }
-    }
-  g_list_free (children);
-
-  g_signal_stop_emission_by_name (actor, "paint");
-}
-
-static GObject *
-hrn_queue_constructor (GType                  type,
-                       guint                  n_params,
-                       GObjectConstructParam *params)
+hrn_queue_finalize (GObject *object)
 {
-  HrnQueuePrivate *priv;
-  GObject         *object;
-  HrnQueue        *queue;
-  NbtkAdjustment  *vadj;
-
-  object = G_OBJECT_CLASS (hrn_queue_parent_class)->constructor (type,
-                                                                 n_params,
-                                                                 params);
-
-  clutter_actor_set_reactive (CLUTTER_ACTOR (object), TRUE);
-  g_object_set_data (object, "HRN_DROP_MASK",
-                     GINT_TO_POINTER (HRN_DROP_MASK_QUEUE));
-  g_signal_connect (object, "button-release-event",
-                    G_CALLBACK (queue_release), NULL);
-
-  queue = HRN_QUEUE (object);
-  priv  = HRN_QUEUE_GET_PRIVATE (queue);
-
-  priv->top_group = clutter_group_new ();
-  clutter_container_add_actor ((ClutterContainer *) queue, priv->top_group);
-
-#if 0
-  priv->playpause = nbtk_button_new ();
-  nbtk_button_set_toggle_mode (NBTK_BUTTON (priv->playpause), TRUE);
-  nbtk_widget_set_style_class_name (priv->playpause, "HrnPlayPause");
-  clutter_actor_set_size (CLUTTER_ACTOR (priv->playpause), 37, 45);
-  priv->play_pause_id = g_signal_connect (priv->playpause, "clicked",
-                                          G_CALLBACK (playpause_clicked_cb),
-                                          queue);
-  nbtk_table_add_actor_with_properties (NBTK_TABLE (priv->header),
-                                        CLUTTER_ACTOR (priv->playpause), 0, 2,
-                                        "row-span", 2,
-                                        "col-span", 1,
-                                        "x-align", 0.0,
-                                        "y-align", 0.0,
-                                        "y-fill", FALSE,
-                                        "y-expand", FALSE,
-                                        "x-fill", FALSE,
-                                        "x-expand", FALSE,
-                                        NULL);
-#endif
-
-  priv->header = g_object_new (HRN_TYPE_QUEUE_HEADER, NULL);
-  g_signal_connect (priv->header, "expand",
-                    G_CALLBACK (expanded_clicked_cb), queue);
-  g_signal_connect (priv->header, "progress",
-                    G_CALLBACK (progress_notify), queue);
-  clutter_container_add_actor ((ClutterContainer *) priv->top_group,
-                               (ClutterActor *) priv->header);
-
-  priv->scrollview = nbtk_scroll_view_new ();
-  nbtk_widget_set_style_class_name (priv->scrollview, "HrnQueueView");
-  clutter_container_add_actor ((ClutterContainer *) priv->top_group,
-                               (ClutterActor *) priv->scrollview);
-  /* FIXME: Add padding */
-  clutter_actor_set_position ((ClutterActor *) priv->scrollview,
-                              0, QUEUE_HEADER_HEIGHT);
-
-  priv->view = (NbtkWidget *) nbtk_viewport_new ();
-  clutter_container_add (CLUTTER_CONTAINER (priv->scrollview),
-                         CLUTTER_ACTOR (priv->view), NULL);
-  nbtk_scrollable_get_adjustments (NBTK_SCROLLABLE (priv->view), NULL, &vadj);
-  g_object_set (vadj,
-                "step-increment", (double) ROW_HEIGHT,
-                "page-increment", (double) ROW_HEIGHT,
-                NULL);
-
-  priv->children = CLUTTER_GROUP (clutter_group_new ());
-  g_signal_connect (priv->children, "paint",
-                    G_CALLBACK (hrn_queue_list_paint), NULL);
-  clutter_container_add (CLUTTER_CONTAINER (priv->view),
-                         CLUTTER_ACTOR (priv->children), NULL);
-
-  priv->highlight = nbtk_label_new ("");
-  clutter_actor_set_size (CLUTTER_ACTOR (priv->highlight),
-                          QUEUE_ITEM_WIDTH, 45);
-  clutter_actor_set_anchor_point_from_gravity (CLUTTER_ACTOR (priv->highlight),
-                                               CLUTTER_GRAVITY_WEST);
-  nbtk_widget_set_style_class_name (priv->highlight, "HrnQueueHighlight");
-  clutter_container_add (CLUTTER_CONTAINER (priv->children),
-                         CLUTTER_ACTOR (priv->highlight), NULL);
-  clutter_actor_hide (CLUTTER_ACTOR (priv->highlight));
-
-  /* hack to sync up size */
-  {
-    clutter_actor_set_size (CLUTTER_ACTOR (priv->header),
-                            QUEUE_WIDTH2, QUEUE_HEADER_HEIGHT);
-    clutter_actor_set_size (CLUTTER_ACTOR (object),
-                            QUEUE_WIDTH2, 260);
-    clutter_actor_set_size (CLUTTER_ACTOR (priv->scrollview),
-                            QUEUE_WIDTH2, 200);
-  }
-
-  hrn_queue_hide_audio_progress (queue);
-
-  return object;
+    G_OBJECT_CLASS (hrn_queue_parent_class)->finalize (object);
 }
 
 static void
-hrn_queue_allocate (ClutterActor *self, const ClutterActorBox *box,
-                    ClutterAllocationFlags flags)
+hrn_queue_dispose (GObject *object)
 {
-  HrnQueuePrivate   *priv = HRN_QUEUE_GET_PRIVATE (self);
-  ClutterActorClass *parent_class;
-  ClutterActorBox    actor_box;
-
-  parent_class = CLUTTER_ACTOR_CLASS (hrn_queue_parent_class);
-  parent_class->allocate (self, box, flags);
-
-  actor_box    = *box;
-  actor_box.y2 = box->y2 - box->y1;
-  actor_box.y1 = 0;
-  clutter_actor_allocate (CLUTTER_ACTOR (priv->top_group), &actor_box, flags);
-
-#if 0
-  actor_box.y1 = 60;
-  clutter_actor_allocate (CLUTTER_ACTOR (priv->scrollview), &actor_box, flags);
-#endif
+    G_OBJECT_CLASS (hrn_queue_parent_class)->dispose (object);
 }
 
 static void
-hrn_queue_dispose (GObject *object)
+clear_header (HrnQueue *queue)
 {
-  HrnQueuePrivate   *priv = HRN_QUEUE_GET_PRIVATE (object);
-
-  if (priv->reposition_id)
-    {
-      g_source_remove (priv->reposition_id);
-      priv->reposition_id = 0;
-    }
+    HrnQueuePrivate *priv = queue->priv;
 
-  G_OBJECT_CLASS (hrn_queue_parent_class)->dispose (object);
+    g_object_set (priv->header,
+                  "primary", _("Music Playqueue"),
+                  "secondary", _("Add music to start"),
+                  "thumbnail", NULL,
+                  NULL);
 }
 
 static void
@@ -458,22 +67,17 @@ brq_uri_added (BrQueue    *brq,
                int         position,
                HrnQueue   *queue)
 {
-    HrnQueuePrivate *priv = HRN_QUEUE_GET_PRIVATE (queue);
-    BklItem         *item;
-
-    item = hrn_source_manager_get_item_for_uri (priv->manager, uri, NULL);
-    if (item) {
-        QueueItem *queue_item = g_new0 (QueueItem, 1);
-
-        queue_item->item  = g_object_ref (item);
-        queue_item->queue = queue;
-
-        priv->queue = g_list_insert (priv->queue, queue_item, position);
+    HrnQueuePrivate *priv = queue->priv;
+    HrnItem *item;
 
-        add_item (queue, queue_item);
+    item = hrn_tracker_client_get_item_for_uri (priv->tracker, uri);
 
-        hrn_queue_header_expand ((HrnQueueHeader *) priv->header, TRUE);
-    }
+    g_print ("Item added for %s is %p\n", uri, item);
+    clutter_model_insert (priv->model, position,
+                          MODEL_ITEM, item,
+                          MODEL_URI, uri,
+                          -1);
+    hrn_queue_header_expand (priv->header, TRUE);
 }
 
 static void
@@ -482,25 +86,13 @@ brq_uri_removed (BrQueue    *brq,
                  int         position,
                  HrnQueue   *queue)
 {
-    HrnQueuePrivate *priv = HRN_QUEUE_GET_PRIVATE (queue);
-    GList           *queue_list;
-    QueueItem       *queue_item;
-
-    queue_list = g_list_nth (priv->queue, position);
-    if (queue_list == NULL) {
-        return;
-    }
-
-    queue_item = queue_list->data;
-
-    priv->queue = g_list_remove_link (priv->queue, queue_list);
-    g_list_free (queue_list);
+    HrnQueuePrivate *priv = queue->priv;
 
-    g_object_unref (queue_item->item);
-    clutter_actor_destroy (queue_item->actor);
-    g_free (queue_item);
+    clutter_model_remove (priv->model, position);
 
-    hrn_queue_reposition (queue);
+    if (clutter_model_get_n_rows (priv->model) == 0) {
+        clear_header (queue);
+    }
 }
 
 static void
@@ -508,797 +100,395 @@ brq_position_changed (BrQueue  *brq,
                       double    position,
                       HrnQueue *queue)
 {
-  HrnQueuePrivate *priv = HRN_QUEUE_GET_PRIVATE (queue);
+    HrnQueuePrivate *priv = queue->priv;
 
-  hrn_queue_header_set_progress ((HrnQueueHeader *) priv->header, position);
+    hrn_queue_header_set_progress (priv->header, position);
 }
 
 static void
-brq_now_playing_changed (BrQueue     *brq,
-                         const char  *uri,
-                         HrnQueue *queue)
+set_now_playing (HrnQueue   *queue,
+                 HrnItem    *item,
+                 const char *uri)
 {
-  HrnQueuePrivate *priv = queue->priv;
-  BklItem *item;
+    HrnQueuePrivate *priv = queue->priv;
 
-  /* Reset the position of the appropriate slider to 0 */
-  brq_position_changed (brq, 0.0, queue);
+    if (item == NULL && uri) {
+        char *filename, *unesc;
 
-  if (uri == NULL || *uri == '\0') /* finished playback of this media type */
-    {
-        hrn_queue_header_show_progress ((HrnQueueHeader *) priv->header, FALSE);
-        hrn_queue_set_active_audio (queue, NULL, "");
-        return;
-    }
+        filename = g_path_get_basename (uri);
+        unesc = g_uri_unescape_string (filename, NULL);
+        g_free (filename);
 
-  item = hrn_source_manager_get_item_for_uri (priv->manager, uri, NULL);
-  hrn_queue_set_active_audio (queue, item, uri);
-  hrn_queue_header_show_progress ((HrnQueueHeader *) priv->header, TRUE);
+        g_object_set (priv->header,
+                      "primary", unesc,
+                      "secondary", "",
+                      NULL);
+        g_free (unesc);
+    } else if (item) {
+        const char *primary, *secondary;
+
+        primary = hrn_item_get_metadata (item, HRN_ITEM_METADATA_TITLE);
+        secondary = hrn_item_get_metadata (item, HRN_ITEM_METADATA_ARTIST);
+        if (secondary == NULL || *secondary == '\0') {
+            secondary = _("Unknown Artist");
+        }
+
+        g_object_set (priv->header,
+                      "primary", primary ? primary : _("Unknown"),
+                      "secondary", secondary,
+                      NULL);
+    } else {
+        /* Erk? */
+        g_object_set (priv->header,
+                      "primary", _("Unknown"),
+                      "secondary", _("Unknown Artist"),
+                      NULL);
+    }
 }
 
 static void
-set_name_reply (BrQueue *brq,
-                char    *name,
-                GError  *error,
-                gpointer data)
+brq_index_changed (BrQueue  *brq,
+                   int       idx,
+                   HrnQueue *queue)
 {
-}
+    HrnQueuePrivate *priv = queue->priv;
+    ClutterModelIter *iter;
+    HrnItem *item;
+    char *uri;
 
-static void
-list_uris_reply (BrQueue *brq,
-                 char   **uris,
-                 GError  *error,
-                 gpointer data)
-{
-  HrnQueue        *queue = (HrnQueue *) data;
-  HrnQueuePrivate *priv  = queue->priv;
-  int              i;
-
-  if (error != NULL)
-    {
-      g_warning ("Error listing queue uris: %s", error->message);
-      return;
+    iter = clutter_model_get_iter_at_row (priv->model, idx);
+    if (iter == NULL) {
+        g_warning ("Error getting iter at row %d", idx);
+        return;
     }
 
-  for (i = 0; uris[i]; i++)
-    {
-      BklItem *item = hrn_source_manager_get_item_for_uri (priv->manager,
-                                                           uris[i], NULL);
-      if (item)
-        {
-          QueueItem *queue_item = g_new0 (QueueItem, 1);
-
-          queue_item->item  = g_object_ref (item);
-          queue_item->queue = queue;
-
-          priv->queue = g_list_append (priv->queue, queue_item);
+    clutter_model_iter_get (iter,
+                            MODEL_ITEM, &item,
+                            MODEL_URI, &uri,
+                            -1);
 
-          add_item (queue, queue_item);
-
-          hrn_queue_header_expand ((HrnQueueHeader *) priv->header, TRUE);
-        }
+    set_now_playing (queue, item, uri);
+    if (item) {
+        g_object_unref (item);
     }
+    g_free (uri);
 }
 
 static void
-get_now_playing_reply (BrQueue *brq,
-                       char    *audio_uri,
-                       GError  *error,
-                       gpointer data)
+list_uris_reply (BrQueue       *brq,
+                 const char   **uris,
+                 const GError  *error,
+                 gpointer       data)
 {
     HrnQueue *queue = (HrnQueue *) data;
+    HrnQueuePrivate *priv = queue->priv;
+    int i;
 
     if (error != NULL) {
-        g_warning ("Error getting now playing: %s", error->message);
+        g_warning ("Error listing queue uris: %s", error->message);
         return;
     }
 
-    brq_now_playing_changed (brq, audio_uri, queue);
+    for (i = 0; uris[i]; i++) {
+        HrnItem *item = hrn_tracker_client_get_item_for_uri (priv->tracker,
+                                                             uris[i]);
+        clutter_model_append (priv->model,
+                              MODEL_ITEM, item,
+                              MODEL_URI, uris[i],
+                              -1);
+    }
+    hrn_queue_header_expand (priv->header, TRUE);
 }
 
 static void
-source_ready_cb (HrnSourceManager *manager,
-                 HrnQueue         *queue)
+get_index_reply (BrQueue      *brq,
+                 int           idx,
+                 const GError *error,
+                 gpointer      data)
 {
-    HrnQueuePrivate *priv = HRN_QUEUE_GET_PRIVATE (queue);
-
-    br_queue_list_uris (priv->br_queue, list_uris_reply, queue);
-    br_queue_get_now_playing (priv->br_queue, get_now_playing_reply, queue);
-}
-
-HrnQueue *
-hrn_queue_new (BrQueue          *br_queue,
-               HrnSourceManager *manager)
-{
-  HrnQueue        *queue = g_object_new (HRN_TYPE_QUEUE, NULL);
-  HrnQueuePrivate *priv  = HRN_QUEUE_GET_PRIVATE (queue);
-
-  priv->br_queue = g_object_ref (br_queue);
-  g_signal_connect (priv->br_queue, "uri-added",
-                    G_CALLBACK (brq_uri_added), queue);
-  g_signal_connect (priv->br_queue, "uri-removed",
-                    G_CALLBACK (brq_uri_removed), queue);
-  g_signal_connect (priv->br_queue, "now-playing-changed",
-                    G_CALLBACK (brq_now_playing_changed), queue);
-  g_signal_connect (priv->br_queue, "position-changed",
-                    G_CALLBACK (brq_position_changed), queue);
-
-  /* Set the name of the queue from Bognor */
-  br_queue_get_name (br_queue, set_name_reply, queue);
-
-  priv->manager = manager;
-
-  if (hrn_source_manager_is_ready (manager)) {
-      source_ready_cb (manager, queue);
-  } else {
-      g_signal_connect (manager, "ready",
-                        G_CALLBACK (source_ready_cb), queue);
-  }
-
-  return queue;
-}
-
-void
-hrn_queue_set_name (HrnQueue *queue, const gchar *name)
-{
-}
+    if (error != NULL) {
+        g_warning ("Error getting index: %s", error->message);
+        return;
+    }
 
-const gchar *
-hrn_queue_get_name (HrnQueue *queue)
-{
-  g_warning ("FIXME: hrn_queue_get_name");
-  return "FIXME:hrn_queue_get_name";
+    brq_index_changed (brq, idx, data);
 }
 
-gboolean
-hrn_item_can_drop (ClutterActor *actor, ClutterActor *dropped_on, gint x,
-                   gint y,
-                   gpointer item)
+static void
+tracker_ready_cb (HrnTrackerClient *tracker,
+                  HrnQueue         *queue)
 {
-  ClutterActor    *queue = dropped_on;
-  gint             no    = 0;
-  HrnQueuePrivate *priv;
-
-  while (queue && !HRN_IS_QUEUE (queue))
-    queue = clutter_actor_get_parent (queue);
-
-  if (!queue || !item)
-    return FALSE;
-
-  priv = HRN_QUEUE_GET_PRIVATE (queue);
-
-  {
-    gfloat         xu, yu;
-    gdouble        foo;
-    NbtkScrollBar *scrollbar = NBTK_SCROLL_BAR (
-      nbtk_scroll_view_get_vscroll_bar (NBTK_SCROLL_VIEW (priv->scrollview)));
-    foo = nbtk_adjustment_get_value (nbtk_scroll_bar_get_adjustment (scrollbar));
-
-    clutter_actor_transform_stage_point (CLUTTER_ACTOR (queue),
-                                         x, y, &xu, &yu);
-
-    no = ((floor (yu) + (gint) foo) - ROW_OFFSET) / ROW_HEIGHT - 1;
-
-    if (no == -1)
-      return TRUE;
-
-    if (no > g_list_length (priv->queue) - (G_IS_OBJECT (item) ? 0 : 1))
-      no = g_list_length (priv->queue) - (G_IS_OBJECT (item) ? 0 : 1);
-
-    clutter_actor_set_y (CLUTTER_ACTOR (priv->highlight), no * ROW_HEIGHT);
-
-    clutter_actor_show (CLUTTER_ACTOR (priv->highlight));
-    clutter_actor_set_opacity (CLUTTER_ACTOR (priv->highlight), 0xff);
-
-    clutter_actor_animate (CLUTTER_ACTOR (
-                             priv->highlight), CLUTTER_EASE_IN_OUT_CUBIC, 2000,
-                           "opacity", 0,
-                           "signal-swapped::completed",
-                           clutter_actor_hide, priv->highlight,
-                           NULL);
-  }
+    HrnQueuePrivate *priv = queue->priv;
 
-  return TRUE;
+    if (priv->queue) {
+        br_queue_list_uris (priv->queue, list_uris_reply, queue);
+        br_queue_get_index (priv->queue, get_index_reply, queue);
+    }
 }
 
-
-gboolean
-hrn_item_drop (ClutterActor *actor, ClutterActor *dropped_on, gint x, gint y,
-               gpointer item)
+static void
+hrn_queue_set_property (GObject      *object,
+                        guint         prop_id,
+                        const GValue *value,
+                        GParamSpec   *pspec)
 {
-  ClutterActor    *queue = dropped_on;
-  gint             no    = 0;
-  HrnQueuePrivate *priv;
-
-  while (queue && !HRN_IS_QUEUE (queue))
-    queue = clutter_actor_get_parent (queue);
-
-  if (!queue || !item)
-    return FALSE;
+    HrnQueue *self = (HrnQueue *) object;
+    HrnQueuePrivate *priv = self->priv;
 
-  priv = HRN_QUEUE_GET_PRIVATE (queue);
+    switch (prop_id) {
+    case PROP_QUEUE:
+        priv->queue = g_value_dup_object (value);
+        g_signal_connect (priv->queue, "uri-added",
+                          G_CALLBACK (brq_uri_added), self);
+        g_signal_connect (priv->queue, "uri-removed",
+                          G_CALLBACK (brq_uri_removed), self);
+        g_signal_connect (priv->queue, "index-changed",
+                          G_CALLBACK (brq_index_changed), self);
+        g_signal_connect (priv->queue, "position-changed",
+                          G_CALLBACK (brq_position_changed), self);
 
-  {
-    gfloat         xu, yu;
-    gdouble        foo;
-    NbtkScrollBar *scrollbar = NBTK_SCROLL_BAR (
-      nbtk_scroll_view_get_vscroll_bar (NBTK_SCROLL_VIEW (priv->scrollview)));
-    foo = nbtk_adjustment_get_value (nbtk_scroll_bar_get_adjustment (scrollbar));
+        /* br_queue_get_name (priv->queue, get_name_reply, self); */
+        break;
 
-    clutter_actor_transform_stage_point (CLUTTER_ACTOR (queue),
-                                         x, y, &xu, &yu);
+    case PROP_MANAGER:
+        priv->tracker = g_value_dup_object (value);
 
-    no = ((floor (yu) + (gint) foo) - ROW_OFFSET) / ROW_HEIGHT - 1;
-    if (yu < QUEUE_TIP_HEIGHT)
-      no = -1;
-  }
-
-  g_assert (HRN_IS_QUEUE (queue));
-
-  g_warning ("FIXME: hrn_item_drop");
-#if 0
-  if (hrn_view_has_selected () &&
-      hrn_view_is_selected (bkl_item_get_uri (item)))
-    {
-      GList *s, *selected = hrn_view_get_selected (HRN_VIEW (hrn_view));
-
-      for (s = selected; s; s = s->next)
-        {
-          hrn_queue_insert (HRN_QUEUE (queue), no, s->data);
-          no++;
+        if (hrn_tracker_client_is_ready (priv->tracker)) {
+            tracker_ready_cb (priv->tracker, self);
+        } else {
+            g_signal_connect (priv->tracker, "ready",
+                              G_CALLBACK (tracker_ready_cb), self);
         }
-      g_list_free (selected);
-      /* there is a selection */
-    }
-  else
-    {
-      hrn_queue_insert (HRN_QUEUE (queue), no, item);
-    }
-#endif
-  return TRUE;
-}
-
-
-gboolean
-hrn_cluster_dropped (ClutterActor *actor, ClutterActor *dropped_on, gint x,
-                     gint y,
-                     gpointer item)
-{
-  ClutterActor    *queue = dropped_on;
-  gint             no    = 0;
-  HrnQueuePrivate *priv;
+        break;
 
-  while (queue && !HRN_IS_QUEUE (queue))
-    queue = clutter_actor_get_parent (queue);
-  if (!queue)
-    {
-      return FALSE;
+    default:
+        break;
     }
-
-  priv = HRN_QUEUE_GET_PRIVATE (queue);
-
-  {
-    gfloat         xu, yu;
-    gdouble        foo;
-    NbtkScrollBar *scrollbar = NBTK_SCROLL_BAR (
-      nbtk_scroll_view_get_vscroll_bar (NBTK_SCROLL_VIEW (priv->scrollview)));
-    foo = nbtk_adjustment_get_value (nbtk_scroll_bar_get_adjustment (scrollbar));
-
-    clutter_actor_transform_stage_point (CLUTTER_ACTOR (queue),
-                                         xu, yu, &xu, &yu);
-
-    no = ((floor (yu) + (gint) foo) - ROW_OFFSET) / ROW_HEIGHT - 1;
-    if (yu < QUEUE_TIP_HEIGHT)
-      no = -1;
-  }
-
-  g_assert (HRN_IS_QUEUE (queue));
-#if 0
-  {
-    GList *iter;
-    for (iter = HRN_CLUSTER (item)->results; iter; iter = iter->next)
-      hrn_queue_insert (HRN_QUEUE (queue), no++, iter->data);
-  }
-#endif
-  return TRUE;
 }
 
-static gboolean
-hrn_item_queue_start_drag (ClutterActor *actor, gint x, gint y,
-                           QueueItem    *queue_item)
-{
-  clutter_actor_hide (actor);
-  hrn_queue_reposition (queue_item->queue);
-  return TRUE;
-}
-
-static gboolean
-from_queue_drop (ClutterActor *actor, ClutterActor *dropped_on, gint x, gint y,
-                 QueueItem    *queue_item)
+static void
+hrn_queue_get_property (GObject    *object,
+                        guint       prop_id,
+                        GValue     *value,
+                        GParamSpec *pspec)
 {
-  gint             no   = 0;
-  HrnQueuePrivate *priv = HRN_QUEUE_GET_PRIVATE (queue_item->queue);
-
-  if (dropped_on == NULL)
-    {
-      GList *iter;
-      for (iter = priv->queue; iter; iter = iter->next)
-        {
-          if (iter->data == queue_item)
-            break;
-          no++;
-        }
-      hrn_queue_remove (queue_item->queue, no);
-      return TRUE;
-    }
-
-  {
-    gfloat         xu, yu;
-    gdouble        foo;
-    NbtkScrollBar *scrollbar = NBTK_SCROLL_BAR (
-      nbtk_scroll_view_get_vscroll_bar (NBTK_SCROLL_VIEW (priv->scrollview)));
-    foo = nbtk_adjustment_get_value (nbtk_scroll_bar_get_adjustment (scrollbar));
-
-    clutter_actor_transform_stage_point (CLUTTER_ACTOR (queue_item->queue),
-                                         x, y, &xu, &yu);
-
-    no = 0;
-    {
-      GList *iter;
-      for (iter = priv->queue; iter; iter = iter->next)
-        {
-          if (iter->data == queue_item)
-            break;
-          no++;
-        }
-    }
-
-    {
-      HrnQueue        *queue = HRN_QUEUE (dropped_on);
-      HrnQueuePrivate *qp    = HRN_QUEUE_GET_PRIVATE (queue);
-      BklItem         *item  = queue_item->item;
-
-      g_object_ref (item);
-      hrn_queue_remove (queue_item->queue, no);
-
-      no = ((floor (yu) + (gint) foo) - ROW_OFFSET) / ROW_HEIGHT - 1;
-      if (yu < QUEUE_TIP_HEIGHT)
-        no = -1;
-
-      if (no == -1)
-        {
-          br_queue_stop (qp->br_queue);
-          br_queue_play_uri (qp->br_queue, bkl_item_get_uri (item),
-                             bkl_item_get_mimetype (item));
-        }
-      else
-        {
-          hrn_queue_insert (queue, no, item);
-        }
+    switch (prop_id) {
 
-      g_object_unref (item);
+    default:
+        break;
     }
-  }
-  return TRUE;
 }
 
-
-static gboolean
-hrn_queue_reposition_idle (gpointer queue)
+#if 0
+static GObject *
+hrn_queue_constructor (GType                  type,
+                       guint                  n_params,
+                       GObjectConstructParam *params)
 {
-  HrnQueuePrivate *priv = HRN_QUEUE_GET_PRIVATE (queue);
-  GList           *iter;
-  gint             no = 0;
-
-  priv->reposition_id = 0;
-
-  for (iter = priv->queue; iter; iter = iter->next)
-    {
-      QueueItem *item = iter->data;
-      if (CLUTTER_ACTOR_IS_VISIBLE (item->actor))
-        {
-          gfloat x = 7;
-          gfloat y = no * ROW_HEIGHT + ROW_OFFSET;
-          if (clutter_actor_get_x (item->actor) == 0 &&
-              clutter_actor_get_y (item->actor) == 0)
-
-            {
-              clutter_actor_set_position (CLUTTER_ACTOR (item->actor), x, y);
-            }
-          else
-            {
-              clutter_actor_animate (CLUTTER_ACTOR (item->actor),
-                                     CLUTTER_LINEAR, 400,
-                                     "x", x, "y", y,
-                                     NULL);
-            }
-          clutter_actor_animate (CLUTTER_ACTOR (item->actor),
-                                 CLUTTER_LINEAR, 400,
-                                 "opacity", 0xff,
-                                 NULL);
-          no++;
-        }
-    }
-  return FALSE;
-}
+    HrnQueuePrivate *priv;
+    GObject *object;
+    HrnQueue *queue;
+
+    object = G_OBJECT_CLASS (hrn_queue_parent_class)->constructor (type,
+                                                                   n_params,
+                                                                   params);
+    queue = (HrnQueue *) object;
+    priv = queue->priv;
 
+    return object;
+}
+#endif
 
 static void
-hrn_queue_reposition (HrnQueue *queue)
+hrn_queue_class_init (HrnQueueClass *klass)
 {
-  HrnQueuePrivate *priv = HRN_QUEUE_GET_PRIVATE (queue);
-
-  if (priv->reposition_id != 0)
-    return;
+    GObjectClass *o_class = (GObjectClass *) klass;
 
-  priv->reposition_id = g_idle_add_full (G_PRIORITY_HIGH_IDLE,
-                                      hrn_queue_reposition_idle, queue, NULL);
+    o_class->dispose = hrn_queue_dispose;
+    o_class->finalize = hrn_queue_finalize;
+    o_class->set_property = hrn_queue_set_property;
+    o_class->get_property = hrn_queue_get_property;
+    /* o_class->constructor = hrn_queue_constructor; */
+
+    g_type_class_add_private (klass, sizeof (HrnQueuePrivate));
+
+    g_object_class_install_property (o_class, PROP_QUEUE,
+                                     g_param_spec_object ("queue", "", "",
+                                                          BR_TYPE_QUEUE,
+                                                          G_PARAM_STATIC_STRINGS |
+                                                          G_PARAM_CONSTRUCT_ONLY |
+                                                          G_PARAM_WRITABLE));
+    g_object_class_install_property (o_class, PROP_MANAGER,
+                                     g_param_spec_object ("tracker-client",
+                                                          "", "",
+                                                          HRN_TYPE_TRACKER_CLIENT,
+                                                          G_PARAM_STATIC_STRINGS |
+                                                          G_PARAM_CONSTRUCT_ONLY |
+                                                          G_PARAM_WRITABLE));
 }
 
-static char *
-get_title (BklItem *item)
-{
-    const char *title;
-
-    title = bkl_item_audio_get_title ((BklItemAudio *) item);
-    if (title == NULL || *title == '\0') {
-        const char *uri = bkl_item_get_uri (item);
-        char *basename, *unesc;
-
-        basename = g_path_get_basename (uri);
-        unesc = g_uri_unescape_string (basename, NULL);
-        g_free (basename);
 
-        return unesc;
-    } else {
-        return g_strdup (title);
-    }
-}
-
-static char *
-get_artist (BklItem *item)
+static void
+progress_notify_cb (HrnQueueHeader *header,
+                    double          position,
+                    HrnQueue       *queue)
 {
-    GPtrArray *artists;
+    HrnQueuePrivate *priv = queue->priv;
 
-    artists = bkl_item_audio_get_artists ((BklItemAudio *) item);
-    if (artists == NULL) {
-        return g_strdup (_("Unknown"));
-    } else {
-        return g_strdup (artists->pdata[0]);
-    }
+    br_queue_set_position (priv->queue, position);
 }
 
-static ClutterActor *
-get_thumbnail (BklItem *item)
+static void
+expanded_clicked_cb (HrnQueueHeader *header,
+                     gboolean        expanded,
+                     HrnQueue       *queue)
 {
-    HrnTextureCache *cache = hrn_texture_cache_get_default ();
-    const char *uri;
+    HrnQueuePrivate *priv = queue->priv;
 
-    uri = bkl_item_extended_get_thumbnail ((BklItemExtended *) item);
-    if (uri == NULL) {
-        return hrn_texture_cache_get_default_texture (cache,
-                                                      BKL_ITEM_TYPE_AUDIO);
+    if (expanded) {
+        clutter_actor_animate (priv->scroll,
+                               CLUTTER_EASE_IN_OUT_CUBIC, 350,
+                               "height", QUEUE_HEIGHT,
+                               NULL);
+        clutter_actor_show ((ClutterActor *) priv->scroll);
     } else {
-        return hrn_texture_cache_get_texture (cache, uri);
+        clutter_actor_animate (priv->scroll,
+                               CLUTTER_EASE_IN_OUT_CUBIC, 350,
+                               "height", 0.0,
+                               "signal-swapped::completed",
+                               clutter_actor_hide, priv->scroll,
+                               NULL);
     }
 }
 
-static gboolean
-item_clicked (ClutterActor       *item,
-              ClutterButtonEvent *event,
-              QueueItem          *queue_item)
+static void
+item_clicked_cb (HrnQueueItemFactory *factory,
+                 HrnQueueItem        *item,
+                 HrnQueue            *queue)
 {
-    HrnQueue *queue = queue_item->queue;
     HrnQueuePrivate *priv = queue->priv;
     char *uri;
-    int position;
+    ClutterModelIter *iter;
+    int row = -1;
 
-    if (event->click_count != 2) {
-        return FALSE;
-    }
-
-    position = g_list_index (priv->queue, queue_item);
-    br_queue_play_index (priv->br_queue, position);
+    g_object_get (item,
+                  "uri", &uri,
+                  NULL);
 
-    return TRUE;
-}
-
-static void
-add_item (HrnQueue  *queue,
-          QueueItem *queue_item)
-{
-  HrnQueuePrivate *priv          = HRN_QUEUE_GET_PRIVATE (queue);
-  BklItem         *item          = queue_item->item;
-  ClutterColor     backing_color = { 0xdd, 0xdd, 0xdd, 0x00 };
-  ClutterActor    *backing       = clutter_rectangle_new ();
-  ClutterActor    *group         = clutter_group_new ();
-  ClutterActor *actor;
-  char            *title;
-  char            *artist;
-  NbtkWidget      *text;
-  NbtkWidget      *meta_text;
-  gfloat           w, h;
-  gdouble          scale;
-
-  title = get_title (item);
-  text = nbtk_label_new (title);
-  nbtk_widget_set_style_class_name (text, "HrnQueueItemLabel");
-  g_free (title);
-
-  artist = get_artist (item);
-  meta_text = nbtk_label_new (artist);
-  nbtk_widget_set_style_class_name (meta_text, "HrnQueueItemMetaLabel");
-  g_free (artist);
-
-  actor = get_thumbnail (item);
-  clutter_actor_get_size (actor, &w, &h);
-  if (w == 0 && h == 0)
-    {
-      w = h = 36;
-      clutter_actor_set_size (actor, 36, 36);
+    if (uri == NULL) {
+        g_warning ("No uri for item");
+        return;
     }
 
-  clutter_rectangle_set_color (CLUTTER_RECTANGLE (backing), &backing_color);
-  clutter_actor_set_opacity (backing, 0xbb);
-
-  clutter_actor_set_size (group, QUEUE_ITEM_WIDTH, 36);
-  scale = 36.0 / w;
-  clutter_actor_set_size (backing, QUEUE_ITEM_WIDTH, 36);
-  clutter_actor_set_scale (actor, scale, scale);
-
-  clutter_group_add (CLUTTER_GROUP (group), backing);
-  clutter_group_add (CLUTTER_GROUP (group), actor);
-  clutter_group_add (CLUTTER_GROUP (group), text);
-
-  clutter_actor_set_width (CLUTTER_ACTOR (text), QUEUE_ITEM_WIDTH - 42);
-  clutter_actor_set_position (CLUTTER_ACTOR (text), 42, 2);
-
-  clutter_group_add (CLUTTER_GROUP (group), meta_text);
-  clutter_actor_set_width (CLUTTER_ACTOR (meta_text), QUEUE_ITEM_WIDTH - 42);
-  clutter_actor_set_position (CLUTTER_ACTOR (meta_text), 42, 2 +
-                              clutter_actor_get_height (CLUTTER_ACTOR (text)));
-  clutter_actor_set_position (actor, 2, (36 - h * scale) / 2);
-
-  clutter_container_add_actor (CLUTTER_CONTAINER (priv->children),
-                               (ClutterActor *) group);
-
-  clutter_actor_set_opacity (group, 0);
-
-  clutter_actor_set_reactive (group, TRUE);
-  g_signal_connect (group, "button-release-event",
-                    G_CALLBACK (item_clicked), queue_item);
-
-  hrn_actor_make_draggable (
-    CLUTTER_ACTOR (group),
-    group,
-    HRN_DROP_MASK_QUEUE,
-    G_CALLBACK (hrn_item_queue_start_drag),
-    G_CALLBACK (hrn_item_can_drop),
-    G_CALLBACK (from_queue_drop),
-    queue_item);
-
-  g_object_ref (item);
-  queue_item->actor = group;
-
-  clutter_actor_queue_relayout (CLUTTER_ACTOR (queue));
-  hrn_queue_reposition (queue);
-}
-
-
-void
-hrn_queue_insert (HrnQueue *queue, gint pos, BklItem     *item)
-{
-  HrnQueuePrivate *priv = HRN_QUEUE_GET_PRIVATE (queue);
-
-  br_queue_insert_uri (priv->br_queue, bkl_item_get_uri (item),
-                       bkl_item_get_mimetype (item), pos);
-}
-
-
-void
-hrn_queue_append (HrnQueue *queue, BklItem  *item)
-{
-  HrnQueuePrivate *priv = HRN_QUEUE_GET_PRIVATE (queue);
-
-  br_queue_add_uri (priv->br_queue, bkl_item_get_uri (item),
-                    bkl_item_get_mimetype (item));
-}
-
-void
-hrn_queue_prepend_list (HrnQueue *queue, GList       *items)
-{
-  HrnQueuePrivate *priv = HRN_QUEUE_GET_PRIVATE (queue);
-  GList           *iter;
-
-  for (iter = g_list_last (items); iter; iter = iter->prev)
-    {
-      BklItem *item = iter->data;
+    /* Look through the model to find the row
+       FIXME: there really should have been a better way to do this */
+    iter = clutter_model_get_first_iter (priv->model);
+    while (!clutter_model_iter_is_last (iter)) {
+        char *model_uri;
+
+        clutter_model_iter_get (iter,
+                                MODEL_URI, &model_uri,
+                                -1);
+
+        if (model_uri == NULL) {
+            g_warning ("No uri for model");
+            iter = clutter_model_iter_next (iter);
+            continue;
+        }
+
+        if (g_str_equal (model_uri, uri)) {
+            row = clutter_model_iter_get_row (iter);
+            g_free (model_uri);
+            break;
+        }
 
-      br_queue_insert_uri (priv->br_queue, bkl_item_get_uri (item),
-                           bkl_item_get_mimetype (item), 0);
+        iter = clutter_model_iter_next (iter);
     }
 
-  hrn_queue_header_expand ((HrnQueueHeader *) priv->header, TRUE);
-}
+    g_free (uri);
 
-gint
-hrn_queue_get_length (HrnQueue *queue)
-{
-  HrnQueuePrivate *priv = HRN_QUEUE_GET_PRIVATE (queue);
-
-  return g_list_length (priv->queue);
-}
-
-
-
-void
-hrn_queue_remove (HrnQueue *queue, gint pos)
-{
-  HrnQueuePrivate *priv = HRN_QUEUE_GET_PRIVATE (queue);
-
-  br_queue_remove (priv->br_queue, pos);
-}
-
-BklItem *
-hrn_queue_get (HrnQueue *queue, gint pos)
-{
-  HrnQueuePrivate *priv = HRN_QUEUE_GET_PRIVATE (queue);
-  QueueItem       *item;
-
-  item = g_list_nth_data (priv->queue, pos);
-  if (item)
-    {
-      return item->item;
-    }
-  else
-    {
-      return NULL;
+    if (row == -1) {
+        return;
     }
-}
-
-BklItem     *
-hrn_queue_proceed (HrnQueue *queue, gint item_type_mask)
-{
-  gint len = hrn_queue_get_length (queue);
 
-  if (len)
-    {
-      gint i;
-      for (i = 0; i < len; i++)
-        {
-          BklItem *ret = hrn_queue_get (queue, i);
-          if (bkl_item_get_item_type (ret) & item_type_mask)
-            {
-              hrn_queue_remove (queue, i);
-              return ret;
-            }
-        }
-    }
-  return NULL;
+    br_queue_set_index (priv->queue, row);
 }
 
-gboolean
-hrn_queue_get_playing (HrnQueue *queue)
+static void
+hrn_queue_init (HrnQueue *self)
 {
-  HrnQueuePrivate *priv = HRN_QUEUE_GET_PRIVATE (queue);
-
-  return nbtk_button_get_checked (NBTK_BUTTON (priv->playpause));
-}
+    HrnQueuePrivate *priv = GET_PRIVATE (self);
+    ClutterActor *layout;
 
-void
-hrn_queue_set_playing (HrnQueue *queue, gboolean playing)
-{
-  HrnQueuePrivate *priv = HRN_QUEUE_GET_PRIVATE (queue);
+    self->priv = priv;
+    mx_bin_set_fill (MX_BIN (self), TRUE, TRUE);
+    priv->model = clutter_list_model_new (2, HRN_TYPE_ITEM, "item",
+                                          G_TYPE_STRING, "uri");
+
+    layout = (ClutterActor *) mx_box_layout_new ();
+    mx_box_layout_set_orientation ((MxBoxLayout *) layout, MX_ORIENTATION_VERTICAL);
+    clutter_container_add_actor ((ClutterContainer *) self, layout);
+
+    priv->header = g_object_new (HRN_TYPE_QUEUE_HEADER, NULL);
+    g_signal_connect (priv->header, "expand",
+                      G_CALLBACK (expanded_clicked_cb), self);
+    g_signal_connect (priv->header, "progress",
+                      G_CALLBACK (progress_notify_cb), self);
+    clutter_container_add_actor ((ClutterContainer *) layout,
+                                 (ClutterActor *) priv->header);
+    clear_header (self);
+
+    priv->scroll = mx_scroll_view_new ();
+    clutter_container_add_actor ((ClutterContainer *) layout,
+                                 (ClutterActor *) priv->scroll);
+    clutter_actor_set_height ((ClutterActor *) priv->scroll, QUEUE_HEIGHT);
+    priv->listview = mx_list_view_new ();
+    clutter_container_add_actor ((ClutterContainer *) priv->scroll,
+                                 (ClutterActor *) priv->listview);
+    mx_list_view_set_model (MX_LIST_VIEW (priv->listview), priv->model);
+
+    priv->factory = hrn_queue_item_factory_new ();
+    g_signal_connect (priv->factory, "item-clicked",
+                      G_CALLBACK (item_clicked_cb), self);
+    mx_list_view_set_factory (MX_LIST_VIEW (priv->listview),
+                                MX_ITEM_FACTORY (priv->factory));
 
-  if (playing)
-    {
-      br_queue_play (priv->br_queue);
-    }
-  else
-    {
-      br_queue_stop (priv->br_queue);
-    }
+    mx_list_view_add_attribute (MX_LIST_VIEW (priv->listview), "item", 0);
+    mx_list_view_add_attribute (MX_LIST_VIEW (priv->listview), "uri", 1);
 }
 
-void
-hrn_queue_set_active_audio (HrnQueue *queue,
-                            BklItem     *item,
-                            const gchar *uri)
+HrnQueue *
+hrn_queue_new (BrQueue          *queue,
+               HrnTrackerClient *tracker)
 {
-    HrnQueuePrivate *priv = HRN_QUEUE_GET_PRIVATE (queue);
+    HrnQueue *q;
 
-    if (priv->active_audio) {
-        g_object_unref (priv->active_audio);
-    }
-
-    priv->active_audio = NULL;
-
-    if (item) {
-        char *title, *artist;
-        ClutterActor *thumbnail;
-
-        priv->active_audio = g_object_ref (item);
-        title = get_title (item);
-        artist = get_artist (item);
-        thumbnail = get_thumbnail (item);
-
-        g_object_set (priv->header,
-                      "primary", title,
-                      "secondary", artist,
-                      "thumbnail", thumbnail,
+    q = g_object_new (HRN_TYPE_QUEUE,
+                      "queue", queue,
+                      "tracker-client", tracker,
                       NULL);
-        g_free (title);
-        g_free (artist);
-    } else {
-        if (uri && uri[0] != '\0') {
-            char *basename, *unesc;
-            basename = g_path_get_basename (uri);
-            unesc = g_uri_unescape_string (basename, NULL);
-
-            g_object_set (priv->header,
-                          "primary", unesc,
-                          "secondary", "",
-                          NULL);
-            g_free (basename);
-            g_free (unesc);
-        } else {
-            g_object_set (priv->header,
-                          "primary", _("Playqueue"),
-                          "secondary", "",
-                          "thumbnail", NULL,
-                          NULL);
-/* FIXME: add that later, when string freeze is over */
-#if 0
-            g_object_set (priv->header,
-                          "primary",
-                          _("Music Playqueue"),     /* 10 ems ('M's) */
-                          "secondary",
-                          _("Add music to start"),  /* 11 ems ('M's) */
-                          "thumbnail", NULL,
-                          NULL);
-#endif
-        }
-    }
-}
-
-BklItem     *
-hrn_queue_get_active_audio (HrnQueue *queue)
-{
-  HrnQueuePrivate *priv = HRN_QUEUE_GET_PRIVATE (queue);
-
-  return priv->active_audio;
-}
-
-void
-hrn_queue_hide_audio_progress (HrnQueue *queue)
-{
-}
 
-void
-hrn_queue_show_audio_progress (HrnQueue *queue)
-{
+    return q;
 }
 
-void
-hrn_queue_audio_finished (HrnQueue *queue)
-{
-  hrn_queue_set_active_audio (queue, NULL, "");
-  hrn_queue_hide_audio_progress (queue);
-}
 
 void
 hrn_queue_play_uri_now (HrnQueue    *queue,
                         const gchar *uri)
 {
+  HrnQueuePrivate *priv = queue->priv;
+  const char *uris[2] = {0, }, *mimetypes[2] = {0, };
   GFile *file;
-  HrnQueuePrivate *priv = HRN_QUEUE_GET_PRIVATE (queue);
-  char *mimetype = NULL;
+  char *mimetype;
 
   file = g_file_new_for_commandline_arg (uri);
 
-  /* FIXME: Do we even need to pass a mimetype to BR now? */
   mimetype = hrn_resolve_mimetype (uri);
-  br_queue_play_uri (priv->br_queue, g_file_get_uri (file), mimetype);
+  uris[0] = g_file_get_uri (file);
+  mimetypes[0] = mimetype;
+
+  br_queue_append_uris (priv->queue, 1, uris, mimetypes);
+  br_queue_play (priv->queue);
 
   g_free (mimetype);
   g_object_unref (file);
@@ -1306,10 +496,15 @@ hrn_queue_play_uri_now (HrnQueue    *que
 
 void
 hrn_queue_play_now (HrnQueue *queue,
-                    BklItem  *item)
+                    HrnItem  *item)
 {
-  HrnQueuePrivate *priv = HRN_QUEUE_GET_PRIVATE (queue);
+  HrnQueuePrivate *priv = queue->priv;
+  const char *uris[2] = {0, }, *mimetypes[2] = {0, };
+
+  uris[0] = hrn_item_get_uri (item);
+  mimetypes[0] = hrn_item_get_mimetype (item);
 
-  br_queue_play_uri (priv->br_queue, bkl_item_get_uri (item),
-                     bkl_item_get_mimetype (item));
+  br_queue_append_uris (priv->queue, 1, uris, mimetypes);
+  br_queue_set_index (priv->queue, BR_QUEUE_INDEX_END);
+  br_queue_play (priv->queue);
 }
diff -pruN 1.5.1-1/src/hrn-queue-controls.c 1.8.4-1/src/hrn-queue-controls.c
--- 1.5.1-1/src/hrn-queue-controls.c	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-queue-controls.c	2010-02-17 17:26:44.000000000 +0000
@@ -12,18 +12,16 @@ enum {
 };
 
 struct _HrnQueueControlsPrivate {
-    NbtkWidget *playpause;
+    ClutterActor *playpause;
     gboolean playing;
     guint32 play_pause_id;
-    NbtkWidget *next;
+    ClutterActor *next;
 
-#if 0
-    NbtkWidget *back;
-#endif
+    ClutterActor *back;
 };
 
 #define GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), HRN_TYPE_QUEUE_CONTROLS, HrnQueueControlsPrivate))
-G_DEFINE_TYPE (HrnQueueControls, hrn_queue_controls, NBTK_TYPE_BIN);
+G_DEFINE_TYPE (HrnQueueControls, hrn_queue_controls, MX_TYPE_FRAME);
 static guint32 signals[LAST_SIGNAL] = {0,};
 
 static void
@@ -97,90 +95,78 @@ hrn_queue_controls_class_init (HrnQueueC
 }
 
 static void
-playpause_clicked_cb (NbtkButton       *button,
+playpause_clicked_cb (MxButton       *button,
                       HrnQueueControls *controls)
 {
     HrnQueueControlsPrivate *priv = controls->priv;
 
     priv->playing = !priv->playing;
-    if (priv->playing)
-        nbtk_widget_set_style_class_name (priv->playpause, "HrnControlsPause");
-    else
-        nbtk_widget_set_style_class_name (priv->playpause, "HrnControlsPlay");
+    clutter_actor_set_name (priv->playpause, priv->playing ?
+                            "hrn-controls-pause" : "hrn-controls-play");
     g_signal_emit (controls, signals[PLAYING_CHANGED], 0, priv->playing);
 }
 
 static void
-next_clicked_cb (NbtkButton        *button,
+next_clicked_cb (MxButton        *button,
                  HrnQueueControls  *controls)
 {
     g_signal_emit (controls, signals[REQUEST_NEXT], 0);
 }
 
-#if 0
 static void
-back_clicked_cb (NbtkButton        *button,
+back_clicked_cb (MxButton        *button,
                  HrnQueueControls  *controls)
 {
     g_signal_emit (controls, signals[REQUEST_PREVIOUS], 0);
 }
-#endif
 
 static void
 hrn_queue_controls_init (HrnQueueControls *self)
 {
     HrnQueueControlsPrivate *priv = GET_PRIVATE (self);
-    NbtkWidget *table;
+    ClutterActor *box;
 
     self->priv = priv;
+    mx_bin_set_fill (MX_BIN (self), TRUE, TRUE);
 
-    table = nbtk_table_new ();
-    clutter_container_add_actor ((ClutterContainer *) self,
-                                 (ClutterActor *) table);
+    box = mx_box_layout_new ();
+    clutter_container_add_actor ((ClutterContainer *) self, box);
 
-    priv->playpause = nbtk_button_new ();
+    priv->playpause = mx_button_new ();
     priv->playing = FALSE;
-    nbtk_widget_set_style_class_name (priv->playpause, "HrnControlsPlay");
-    clutter_actor_set_size (CLUTTER_ACTOR (priv->playpause), 60, 33);
+    clutter_actor_set_name (priv->playpause, "hrn-controls-play");
     priv->play_pause_id = g_signal_connect (priv->playpause, "clicked",
                                             G_CALLBACK (playpause_clicked_cb),
                                             self);
-    nbtk_table_add_actor_with_properties (NBTK_TABLE (table),
-                                          CLUTTER_ACTOR (priv->playpause),
-                                          0, 0,
-                                          "x-align", 0.0,
-                                          "y-align", 0.0,
-                                          "x-fill", FALSE,
-                                          "x-expand", FALSE,
-                                          NULL);
-
-#if 0
-    priv->back = nbtk_button_new ();
-    clutter_actor_set_size (CLUTTER_ACTOR (priv->back), 60, 24);
-    nbtk_widget_set_style_class_name (priv->back, "HrnControlsBack");
+    clutter_container_add_actor (CLUTTER_CONTAINER (box), priv->playpause);
+
+    priv->back = mx_button_new ();
+    clutter_actor_set_name (priv->back, "hrn-controls-back");
     g_signal_connect (priv->back, "clicked",
                       G_CALLBACK (back_clicked_cb), self);
-    nbtk_table_add_actor_with_properties (NBTK_TABLE (table),
-                                          CLUTTER_ACTOR (priv->back), 0, 1,
-                                          "x-align", 0.0,
-                                          "y-align", 0.0,
-                                          "x-fill", FALSE,
-                                          "x-expand", FALSE,
-                                          NULL);
-#endif
-
-    priv->next = nbtk_button_new ();
-    clutter_actor_set_size (CLUTTER_ACTOR (priv->next), 60, 33);
-    nbtk_widget_set_style_class_name (priv->next, "HrnControlsNext");
+    clutter_container_add_actor (CLUTTER_CONTAINER (box), priv->back);
+
+    priv->next = mx_button_new ();
+    clutter_actor_set_name (priv->next, "hrn-controls-next");
     g_signal_connect (priv->next, "clicked",
                       G_CALLBACK (next_clicked_cb), self);
-    nbtk_table_add_actor_with_properties (NBTK_TABLE (table),
-                                          CLUTTER_ACTOR (priv->next), 0, 2,
-                                          "x-align", 0.0,
-                                          "y-align", 0.0,
-                                          "x-fill", FALSE,
-                                          "x-expand", FALSE,
-                                          NULL);
+    clutter_container_add_actor (CLUTTER_CONTAINER (box), priv->next);
+
+    clutter_container_child_set (CLUTTER_CONTAINER (box),
+                                 priv->playpause,
+                                 "expand", TRUE,
+                                 "x-fill", FALSE,
+                                 NULL);
+    clutter_container_child_set (CLUTTER_CONTAINER (box),
+                                 priv->back,
+                                 "expand", TRUE,
+                                 "x-fill", FALSE,
+                                 NULL);
+    clutter_container_child_set (CLUTTER_CONTAINER (box),
+                                 priv->next,
+                                 "expand", TRUE,
+                                 "x-fill", FALSE,
+                                 NULL);
 }
 
 void
@@ -191,9 +177,7 @@ hrn_queue_controls_set_playing (HrnQueue
 
     g_signal_handler_block (priv->playpause, priv->play_pause_id);
     priv->playing = playing;
-    if (playing)
-        nbtk_widget_set_style_class_name (priv->playpause, "HrnControlsPause");
-    else
-        nbtk_widget_set_style_class_name (priv->playpause, "HrnControlsPlay");
+    clutter_actor_set_name (priv->playpause, playing ?
+                            "hrn-controls-pause" : "hrn-controls-play");
     g_signal_handler_unblock (priv->playpause, priv->play_pause_id);
 }
diff -pruN 1.5.1-1/src/hrn-queue-controls.h 1.8.4-1/src/hrn-queue-controls.h
--- 1.5.1-1/src/hrn-queue-controls.h	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-queue-controls.h	2010-02-17 17:26:44.000000000 +0000
@@ -1,7 +1,7 @@
 #ifndef __HRN_QUEUE_CONTROLS_H__
 #define __HRN_QUEUE_CONTROLS_H__
 
-#include <nbtk/nbtk.h>
+#include <mx/mx.h>
 
 
 G_BEGIN_DECLS
@@ -33,14 +33,14 @@ typedef struct _HrnQueueControlsClass Hr
 
 struct _HrnQueueControls
 {
-    NbtkBin parent;
+    MxFrame parent;
 
     HrnQueueControlsPrivate *priv;
 };
 
 struct _HrnQueueControlsClass
 {
-    NbtkBinClass parent_class;
+    MxFrameClass parent_class;
 };
 
 GType hrn_queue_controls_get_type (void) G_GNUC_CONST;
diff -pruN 1.5.1-1/src/hrn-queue-group.c 1.8.4-1/src/hrn-queue-group.c
--- 1.5.1-1/src/hrn-queue-group.c	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-queue-group.c	1970-01-01 01:00:00.000000000 +0100
@@ -1,114 +0,0 @@
-/*
- * Hornsey - Moblin Media Player.
- * Copyright © 2009 Intel Corporation.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU Lesser General Public License,
- * version 2.1, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <glib.h>
-#include <glib-object.h>
-#include <gdk-pixbuf/gdk-pixbuf.h>
-#include <string.h>
-
-#include "hrn-queue-group.h"
-
-#include "hrn.h"
-G_DEFINE_TYPE (HrnQueueGroup, hrn_queue_group, CLUTTER_TYPE_GROUP)
-
-#define QUEUE_GROUP_PRIVATE(o) \
-  (G_TYPE_INSTANCE_GET_PRIVATE ((o), HRN_TYPE_QUEUE_GROUP, HrnQueueGroupPrivate))
-
-
-enum
-{
-  PROP_0,
-};
-
-enum
-{
-  LOADED,
-  ERROR_LOADING,
-
-  LAST_SIGNAL
-};
-
-static void
-hrn_queue_group_finalize (GObject *object)
-{
-  G_OBJECT_CLASS (hrn_queue_group_parent_class)->finalize (object);
-}
-
-static void
-hrn_queue_group_paint (ClutterActor *actor)
-{
-  GList         *child_item, *children;
-
-  gint           sh;
-
-  NbtkScrollBar *scrollbar =
-    NBTK_SCROLL_BAR (nbtk_scroll_view_get_vscroll_bar (NBTK_SCROLL_VIEW (
-                clutter_actor_get_parent (clutter_actor_get_parent (actor)))));
-  gfloat scroll = nbtk_adjustment_get_value (
-    nbtk_scroll_bar_get_adjustment (scrollbar));
-
-
-  sh = clutter_actor_get_height (hrn_window_get_stage (window));
-
-  children = clutter_container_get_children (CLUTTER_CONTAINER (actor));
-
-  for (child_item = children;
-       child_item != NULL;
-       child_item = child_item->next)
-    {
-      ClutterActor *child = child_item->data;
-
-      g_assert (child != NULL);
-
-      if (CLUTTER_ACTOR_IS_VISIBLE (child))
-        {
-          gint y;
-          y = clutter_actor_get_y (child);
-          if (y - scroll > -64 &&
-              y - scroll < 300)
-            clutter_actor_paint (child);
-        }
-    }
-  g_list_free (children);
-}
-
-
-static void
-hrn_queue_group_class_init (HrnQueueGroupClass *klass)
-{
-  GObjectClass      *object_class = G_OBJECT_CLASS (klass);
-  ClutterActorClass *actor_class  = CLUTTER_ACTOR_CLASS (klass);
-
-  object_class->finalize = hrn_queue_group_finalize;
-  actor_class->paint     = hrn_queue_group_paint;
-}
-
-static void
-hrn_queue_group_init (HrnQueueGroup *self)
-{
-}
-
-ClutterActor *
-hrn_queue_group_new (void)
-{
-  return g_object_new (HRN_TYPE_QUEUE_GROUP, NULL);
-}
diff -pruN 1.5.1-1/src/hrn-queue.h 1.8.4-1/src/hrn-queue.h
--- 1.5.1-1/src/hrn-queue.h	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-queue.h	2010-02-17 17:26:44.000000000 +0000
@@ -1,117 +1,64 @@
-/*
- * Hornsey - Moblin Media Player.
- * Copyright © 2009 Intel Corporation.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU Lesser General Public License,
- * version 2.1, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA
- */
+#ifndef __HRN_QUEUE_H__
+#define __HRN_QUEUE_H__
 
-#ifndef _HRN_QUEUE_H
-#define _HRN_QUEUE_H
+#include <mx/mx.h>
 
-#include <clutter/clutter.h>
-#include <bickley/bkl-item.h>
 #include <bognor/br-queue.h>
 
-#include "hrn-source-manager.h"
+#include "hrn-tracker-client.h"
 
 G_BEGIN_DECLS
 
-#define HRN_TYPE_QUEUE    hrn_queue_get_type ()
+#define HRN_TYPE_QUEUE                                                  \
+   (hrn_queue_get_type())
+#define HRN_QUEUE(obj)                                                  \
+   (G_TYPE_CHECK_INSTANCE_CAST ((obj),                                  \
+                                HRN_TYPE_QUEUE,                         \
+                                HrnQueue))
+#define HRN_QUEUE_CLASS(klass)                                          \
+   (G_TYPE_CHECK_CLASS_CAST ((klass),                                   \
+                             HRN_TYPE_QUEUE,                            \
+                             HrnQueueClass))
+#define IS_HRN_QUEUE(obj)                                               \
+   (G_TYPE_CHECK_INSTANCE_TYPE ((obj),                                  \
+                                HRN_TYPE_QUEUE))
+#define IS_HRN_QUEUE_CLASS(klass)                                       \
+   (G_TYPE_CHECK_CLASS_TYPE ((klass),                                   \
+                             HRN_TYPE_QUEUE))
+#define HRN_QUEUE_GET_CLASS(obj)                                        \
+   (G_TYPE_INSTANCE_GET_CLASS ((obj),                                   \
+                               HRN_TYPE_QUEUE,                          \
+                               HrnQueueClass))
 
-#define HRN_QUEUE(obj) \
-  (G_TYPE_CHECK_INSTANCE_CAST ((obj), HRN_TYPE_QUEUE, HrnQueue))
-
-#define HRN_QUEUE_CLASS(klass) \
-  (G_TYPE_CHECK_CLASS_CAST ((klass), HRN_TYPE_QUEUE, HrnQueueClass))
-
-#define HRN_IS_QUEUE(obj) \
-  (G_TYPE_CHECK_INSTANCE_TYPE ((obj), HRN_TYPE_QUEUE))
-
-#define HRN_IS_QUEUE_CLASS(klass) \
-  (G_TYPE_CHECK_CLASS_TYPE ((klass), HRN_TYPE_QUEUE))
-
-#define HRN_QUEUE_GET_CLASS(obj) \
-  (G_TYPE_INSTANCE_GET_CLASS ((obj), HRN_TYPE_QUEUE, HrnQueueClass))
-
-typedef struct _HrnQueue HrnQueue;
-typedef struct _HrnQueueClass HrnQueueClass;
 typedef struct _HrnQueuePrivate HrnQueuePrivate;
+typedef struct _HrnQueue      HrnQueue;
+typedef struct _HrnQueueClass HrnQueueClass;
 
 struct _HrnQueue
 {
-  NbtkBin       parent_instance;
-  HrnQueuePrivate *priv;
+    MxFrame parent;
+
+    HrnQueuePrivate *priv;
 };
 
 struct _HrnQueueClass
 {
-  /*< private >*/
-  NbtkBinClass parent_class;
+    MxFrameClass parent_class;
 };
 
-GType     hrn_queue_get_type (void) G_GNUC_CONST;
-
-HrnQueue *hrn_queue_new (BrQueue          *br_queue,
-                         HrnSourceManager *manager);
-
-/* In a hornsey queue the 0th element is the currently playing
- * element
- */
-
-/* A queue can have a random emitter enabled on the bottom, the
- * random emitter generates a playqueue on the go*/
-
-void         hrn_queue_set_name            (HrnQueue    *queue,
-                                            const gchar *name);
-const gchar *hrn_queue_get_name            (HrnQueue *queue);
-void         hrn_queue_append              (HrnQueue *queue,
-                                            BklItem  *item);
-void         hrn_queue_prepend_list        (HrnQueue *queue,
-                                            GList    *items);
-gint         hrn_queue_get_length          (HrnQueue *queue);
-void         hrn_queue_insert              (HrnQueue *queue,
-                                            gint      pos,
-                                            BklItem  *item);
-void         hrn_queue_remove              (HrnQueue *queue,
-                                            gint      pos);
-BklItem *    hrn_queue_get                 (HrnQueue *queue,
-                                            gint      pos);
-void         hrn_queue_set_active_audio    (HrnQueue *queue,
-                                            BklItem  *item,
-                                            const gchar *uri);
-BklItem *    hrn_queue_get_active_audio    (HrnQueue *queue);
-BklItem *    hrn_queue_proceed             (HrnQueue *queue,
-                                            gint      item_type_mask);
-gboolean     hrn_queue_get_playing         (HrnQueue *queue);
-
-void         hrn_queue_set_playing         (HrnQueue *queue,
-                                            gboolean  playing);
-void         hrn_queue_audio_finished      (HrnQueue *queue);
-void         hrn_queue_hide_audio_progress (HrnQueue *queue);
-void         hrn_queue_show_audio_progress (HrnQueue *queue);
-void         hrn_queue_audio_peek          (HrnQueue *queue);
-gboolean     hrn_cluster_dropped           (ClutterActor *actor,
-                                            ClutterActor *dropped_on,
-                                            gint          x,
-                                            gint          y,
-                                            gpointer      userdata);
-void         hrn_queue_play_now            (HrnQueue *queue,
-                                            BklItem  *item);
-void         hrn_queue_play_uri_now        (HrnQueue    *queue,
-                                            const gchar *uri);
+GType hrn_queue_get_type (void) G_GNUC_CONST;
+HrnQueue *hrn_queue_new (BrQueue          *queue,
+                         HrnTrackerClient *tracker);
+
+void
+hrn_queue_play_uri_now (HrnQueue    *queue,
+                        const gchar *uri);
+
+void
+hrn_queue_play_now (HrnQueue *queue,
+                    HrnItem  *item);
 
 
 G_END_DECLS
 
-#endif
+#endif /* __HRN_QUEUE_H__ */
diff -pruN 1.5.1-1/src/hrn-queue-header.c 1.8.4-1/src/hrn-queue-header.c
--- 1.5.1-1/src/hrn-queue-header.c	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-queue-header.c	2011-03-15 13:20:21.000000000 +0000
@@ -14,23 +14,21 @@ enum {
 };
 
 struct _HrnQueueHeaderPrivate {
-    NbtkWidget *layout;
     ClutterActor *thumb_holder;
     ClutterActor *thumbnail;
-    NbtkWidget *primary;
-    NbtkWidget *secondary;
-    NbtkWidget *expand;
+    ClutterActor *primary;
+    ClutterActor *secondary;
+    ClutterActor *expand;
     gboolean expanded;
 
-    NbtkAdjustment *progress;
     guint32 progress_id;
-    NbtkWidget *timebar;
+    ClutterActor *timebar;
 
     gboolean playback_set_progress;
 };
 
 #define GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), HRN_TYPE_QUEUE_HEADER, HrnQueueHeaderPrivate))
-G_DEFINE_TYPE (HrnQueueHeader, hrn_queue_header, NBTK_TYPE_BIN);
+G_DEFINE_TYPE (HrnQueueHeader, hrn_queue_header, MX_TYPE_FRAME);
 static guint32 signals[LAST_SIGNAL] = {0,};
 
 #define QUEUE_WIDTH 170
@@ -57,12 +55,12 @@ hrn_queue_header_set_property (GObject  
 
     switch (prop_id) {
     case PROP_PRIMARY:
-        nbtk_label_set_text ((NbtkLabel *) priv->primary,
+        mx_label_set_text ((MxLabel *) priv->primary,
                              g_value_get_string (value));
         break;
 
     case PROP_SECONDARY:
-        nbtk_label_set_text ((NbtkLabel *) priv->secondary,
+        mx_label_set_text ((MxLabel *) priv->secondary,
                              g_value_get_string (value));
         break;
 
@@ -71,6 +69,7 @@ hrn_queue_header_set_property (GObject  
             clutter_container_remove_actor ((ClutterContainer *) priv->thumb_holder,
                                             priv->thumbnail);
             priv->thumbnail = NULL;
+            clutter_actor_hide (priv->thumb_holder);
         }
 
         priv->thumbnail = g_value_get_object (value);
@@ -78,6 +77,7 @@ hrn_queue_header_set_property (GObject  
             gfloat           w, h;
             gdouble          scale;
 
+            clutter_actor_show (priv->thumb_holder);
             clutter_actor_get_size (priv->thumbnail, &w, &h);
             if (w == 0 && h == 0) {
                 w = h = 36;
@@ -111,38 +111,14 @@ hrn_queue_header_get_property (GObject  
 }
 
 static void
-hrn_queue_header_allocate (ClutterActor          *actor,
-                           const ClutterActorBox *box,
-                           ClutterAllocationFlags flags)
-{
-    HrnQueueHeader *header = (HrnQueueHeader *) actor;
-    HrnQueueHeaderPrivate *priv = header->priv;
-    NbtkPadding padding = { 0, };
-    ClutterActorBox child_box;
-
-    CLUTTER_ACTOR_CLASS (hrn_queue_header_parent_class)->allocate (actor, box,
-                                                                   flags);
-
-    nbtk_widget_get_padding ((NbtkWidget *) actor, &padding);
-    child_box.x1 = box->x1 + padding.left;
-    child_box.x2 = (box->x2 - box->x1) - (padding.left + padding.right);
-    child_box.y1 = box->y1 + padding.top;
-    child_box.y2 = (box->y2 - box->y1) - (padding.top + padding.bottom);
-
-    clutter_actor_allocate ((ClutterActor *) priv->layout, &child_box, flags);
-}
-
-static void
 hrn_queue_header_class_init (HrnQueueHeaderClass *klass)
 {
     GObjectClass *o_class = (GObjectClass *) klass;
-    ClutterActorClass *a_class = (ClutterActorClass *) klass;
 
     o_class->dispose = hrn_queue_header_dispose;
     o_class->finalize = hrn_queue_header_finalize;
     o_class->set_property = hrn_queue_header_set_property;
     o_class->get_property = hrn_queue_header_get_property;
-    a_class->allocate = hrn_queue_header_allocate;
 
     g_type_class_add_private (klass, sizeof (HrnQueueHeaderPrivate));
 
@@ -175,7 +151,7 @@ hrn_queue_header_class_init (HrnQueueHea
 }
 
 static void
-expand_clicked_cb (NbtkButton     *expand,
+expand_clicked_cb (MxButton     *expand,
                    HrnQueueHeader *header)
 {
     hrn_queue_header_expand (header, !header->priv->expanded);
@@ -186,11 +162,12 @@ progress_notify (GObject        *object,
                  GParamSpec     *pspec,
                  HrnQueueHeader *header)
 {
-    HrnQueueHeaderPrivate *priv = GET_PRIVATE (header);
-    double value = nbtk_adjustment_get_value ((NbtkAdjustment *) object);
+    HrnQueueHeaderPrivate *priv = header->priv;
+    MxSlider *slider = MX_SLIDER (object);
+    gdouble progress = mx_slider_get_value (slider);
 
     if (!priv->playback_set_progress)
-      g_signal_emit (header, signals[PROGRESS], 0, value);
+      g_signal_emit (header, signals[PROGRESS], 0, progress);
 
     priv->playback_set_progress = FALSE;
 }
@@ -198,65 +175,95 @@ progress_notify (GObject        *object,
 static void
 hrn_queue_header_init (HrnQueueHeader *self)
 {
+    const ClutterColor separator_color = { 0x82, 0x82, 0x82, 0xff };
     HrnQueueHeaderPrivate *priv = GET_PRIVATE (self);
-    NbtkWidget *hbox, *label_box;
+    ClutterActor *label_box, *table, *separator;
 
     self->priv = priv;
+    mx_bin_set_fill (MX_BIN (self), TRUE, TRUE);
 
-    nbtk_widget_set_style_class_name ((NbtkWidget *) self, "HrnQueueHeader");
+    table = mx_table_new ();
+    mx_table_set_row_spacing (MX_TABLE (table), 6);
+    mx_table_set_column_spacing (MX_TABLE (table), 6);
 
-    priv->layout = nbtk_box_layout_new ();
-    nbtk_box_layout_set_vertical ((NbtkBoxLayout *) priv->layout, TRUE);
-    nbtk_box_layout_set_spacing ((NbtkBoxLayout *) priv->layout, 10);
-    clutter_container_add_actor ((ClutterContainer *) self,
-                                 (ClutterActor *) priv->layout);
-
-    hbox = nbtk_box_layout_new ();
-    nbtk_box_layout_set_spacing ((NbtkBoxLayout *) hbox, 5);
-    clutter_container_add_actor ((ClutterContainer *) priv->layout,
-                                 (ClutterActor *) hbox);
+    clutter_container_add_actor ((ClutterContainer *) self, table);
 
     priv->thumb_holder = clutter_group_new ();
     clutter_actor_set_size (priv->thumb_holder, 36, 36);
-    clutter_container_add_actor ((ClutterContainer *) hbox, priv->thumb_holder);
+    clutter_actor_hide (priv->thumb_holder);
+    mx_table_add_actor_with_properties (MX_TABLE (table),
+                                        priv->thumb_holder,
+                                        0, 0,
+                                        "x-fill", FALSE,
+                                        "x-expand", FALSE,
+                                        "x-align", MX_ALIGN_MIDDLE,
+                                        "y-fill", FALSE,
+                                        "y-expand", FALSE,
+                                        "y-align", MX_ALIGN_MIDDLE,
+                                        NULL);
+
+    label_box = mx_box_layout_new ();
+    mx_box_layout_set_orientation ((MxBoxLayout *) label_box, MX_ORIENTATION_VERTICAL);
+    mx_box_layout_set_spacing ((MxBoxLayout *) label_box, 2);
+    mx_table_add_actor_with_properties (MX_TABLE (table),
+                                        label_box,
+                                        0, 1,
+                                        "x-fill", TRUE,
+                                        "x-expand", TRUE,
+                                        "x-align", MX_ALIGN_START,
+                                        "y-fill", TRUE,
+                                        "y-expand", TRUE,
+                                        "y-align", MX_ALIGN_MIDDLE,
+                                        NULL);
 
-    label_box = nbtk_box_layout_new ();
-    nbtk_box_layout_set_vertical ((NbtkBoxLayout *) label_box, TRUE);
-    nbtk_box_layout_set_spacing ((NbtkBoxLayout *) label_box, 2);
-    clutter_container_add_actor ((ClutterContainer *) hbox,
-                                 (ClutterActor *) label_box);
-
-    priv->primary = nbtk_label_new ("");
-    clutter_actor_set_width ((ClutterActor *) priv->primary, 110);
-    clutter_actor_set_name (CLUTTER_ACTOR (priv->primary),
-                            "hrn-queue-header-label");
+    priv->primary = mx_label_new_with_text ("");
+    clutter_actor_set_name (priv->primary, "hrn-queue-header-label");
     clutter_container_add_actor ((ClutterContainer *) label_box,
-                                 (ClutterActor *) priv->primary);
+                                 priv->primary);
 
-    priv->secondary = nbtk_label_new ("");
-    clutter_actor_set_width ((ClutterActor *) priv->secondary, 110);
-    clutter_actor_set_name (CLUTTER_ACTOR (priv->secondary),
-                            "hrn-queue-header-meta-label");
+    priv->secondary = mx_label_new_with_text ("");
+    clutter_actor_set_name (priv->secondary, "hrn-queue-header-meta-label");
     clutter_container_add_actor ((ClutterContainer *) label_box,
-                                 (ClutterActor *) priv->secondary);
+                                 priv->secondary);
 
-    priv->expand = nbtk_button_new ();
+    separator = clutter_rectangle_new_with_color (&separator_color);
+    clutter_actor_set_width (separator, 1);
+    mx_table_add_actor_with_properties (MX_TABLE (table),
+                                        separator,
+                                        0, 2,
+                                        "x-fill", FALSE,
+                                        "x-expand", FALSE,
+                                        "y-fill", TRUE,
+                                        "y-expand", FALSE,
+                                        NULL);
+
+    priv->expand = mx_button_new ();
     priv->expanded = FALSE;
-    nbtk_widget_set_style_class_name (priv->expand, "HrnQueueExpandedUp");
-    clutter_container_add_actor ((ClutterContainer *) hbox,
-                                 (ClutterActor *) priv->expand);
+    clutter_actor_set_name (priv->expand, "hrn-queue-expanded-up");
+    mx_table_add_actor_with_properties (MX_TABLE (table),
+                                        priv->expand,
+                                        0, 3,
+                                        "x-fill", FALSE,
+                                        "x-expand", FALSE,
+                                        "y-fill", FALSE,
+                                        "y-expand", FALSE,
+                                        "y-align", MX_ALIGN_MIDDLE,
+                                        NULL);
     g_signal_connect (priv->expand, "clicked",
                       G_CALLBACK (expand_clicked_cb), self);
 
-    priv->progress = nbtk_adjustment_new (0.0, 0.0, 1.0, 0.0, 0.0, 0.0);
-    priv->progress_id = g_signal_connect (priv->progress, "notify::value",
+    priv->timebar = mx_slider_new ();
+    mx_table_add_actor_with_properties (MX_TABLE (table),
+                                        priv->timebar,
+                                        1, 0,
+                                        "x-fill", TRUE,
+                                        "x-expand", TRUE,
+                                        "y-fill", FALSE,
+                                        "y-expand", FALSE,
+                                        "column-span", 4,
+                                        NULL);
+    priv->progress_id = g_signal_connect (priv->timebar, "notify::progress",
                                           G_CALLBACK (progress_notify), self);
-
-    priv->timebar = nbtk_scroll_bar_new (priv->progress);
-    nbtk_widget_set_style_class_name (priv->timebar, "HrnProgressBar");
-    clutter_container_add_actor ((ClutterContainer *) priv->layout,
-                                 (ClutterActor *) priv->timebar);
-    clutter_actor_set_size (CLUTTER_ACTOR (priv->timebar), 220, 14);
 }
 
 void
@@ -266,16 +273,17 @@ hrn_queue_header_show_progress (HrnQueue
     HrnQueueHeaderPrivate *priv = header->priv;
 
     if (show) {
-        clutter_actor_show ((ClutterActor *) priv->timebar);
-        clutter_actor_animate ((ClutterActor *) priv->timebar,
+        clutter_actor_show (priv->timebar);
+        clutter_actor_animate (priv->timebar,
                                CLUTTER_EASE_IN_OUT_CUBIC, 250,
                                "opacity", 0xff,
                                NULL);
     } else {
-        clutter_actor_animate ((ClutterActor *) priv->timebar,
+        clutter_actor_animate (priv->timebar,
                                CLUTTER_EASE_IN_OUT_CUBIC, 250,
                                "opacity", 0x00,
-                               "signal-swapped::completed", clutter_actor_hide, priv->timebar,
+                               "signal-swapped::completed",
+                                 clutter_actor_hide, priv->timebar,
                                NULL);
     }
 }
@@ -287,7 +295,7 @@ hrn_queue_header_set_progress (HrnQueueH
     HrnQueueHeaderPrivate *priv = header->priv;
 
     priv->playback_set_progress = TRUE;
-    nbtk_adjustment_set_value (priv->progress, progress);
+    mx_slider_set_value (MX_SLIDER (priv->timebar), progress);
 }
 
 void
@@ -297,12 +305,11 @@ hrn_queue_header_expand (HrnQueueHeader 
     HrnQueueHeaderPrivate *priv = header->priv;
 
     priv->expanded = expand;
-    if (expand)
-        nbtk_widget_set_style_class_name (priv->expand, "HrnQueueExpandedDown");
-    else
-        nbtk_widget_set_style_class_name (priv->expand, "HrnQueueExpandedUp");
+    clutter_actor_set_name (priv->expand, expand ?
+                            "hrn-queue-expanded-down" :
+                            "hrn-queue-expanded-up");
     /* clear the pseudo class of the button so we don't end up with :hover
      * at the end of the animation */
-    nbtk_widget_set_style_pseudo_class (priv->expand, NULL);
+    mx_stylable_set_style_pseudo_class (MX_STYLABLE (priv->expand), NULL);
     g_signal_emit (header, signals[EXPAND], 0, expand);
 }
diff -pruN 1.5.1-1/src/hrn-queue-header.h 1.8.4-1/src/hrn-queue-header.h
--- 1.5.1-1/src/hrn-queue-header.h	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-queue-header.h	2010-02-17 17:26:44.000000000 +0000
@@ -1,7 +1,7 @@
 #ifndef __HRN_QUEUE_HEADER_H__
 #define __HRN_QUEUE_HEADER_H__
 
-#include <nbtk/nbtk.h>
+#include <mx/mx.h>
 
 
 G_BEGIN_DECLS
@@ -33,14 +33,14 @@ typedef struct _HrnQueueHeaderClass HrnQ
 
 struct _HrnQueueHeader
 {
-    NbtkBin parent;
+    MxFrame parent;
 
     HrnQueueHeaderPrivate *priv;
 };
 
 struct _HrnQueueHeaderClass
 {
-    NbtkBinClass parent_class;
+    MxFrameClass parent_class;
 };
 
 GType hrn_queue_header_get_type (void) G_GNUC_CONST;
diff -pruN 1.5.1-1/src/hrn-queue-item.c 1.8.4-1/src/hrn-queue-item.c
--- 1.5.1-1/src/hrn-queue-item.c	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/src/hrn-queue-item.c	2011-03-15 13:20:21.000000000 +0000
@@ -0,0 +1,180 @@
+#include <glib/gi18n.h>
+
+#include "hrn-item.h"
+#include "hrn-queue-item.h"
+
+enum {
+    PROP_0,
+    PROP_ITEM,
+    PROP_URI
+};
+
+struct _HrnQueueItemPrivate {
+    ClutterActor *primary;
+    ClutterActor *secondary;
+
+    HrnItem *item;
+    char *uri;
+};
+
+#define GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), HRN_TYPE_QUEUE_ITEM, HrnQueueItemPrivate))
+G_DEFINE_TYPE (HrnQueueItem, hrn_queue_item, MX_TYPE_TABLE);
+
+static void
+hrn_queue_item_finalize (GObject *object)
+{
+    G_OBJECT_CLASS (hrn_queue_item_parent_class)->finalize (object);
+}
+
+static void
+hrn_queue_item_dispose (GObject *object)
+{
+    G_OBJECT_CLASS (hrn_queue_item_parent_class)->dispose (object);
+}
+
+static void
+update_tile (HrnQueueItem *item)
+{
+    HrnQueueItemPrivate *priv = item->priv;
+    const char *artist = NULL, *title = NULL;
+
+    title = hrn_item_get_metadata (priv->item, HRN_ITEM_METADATA_TITLE);
+    artist = hrn_item_get_metadata (priv->item, HRN_ITEM_METADATA_ARTIST);
+
+    if (artist && *artist == '\0') {
+        artist = NULL;
+    }
+
+    if (title && *title == '\0') {
+        title = NULL;
+    }
+
+    mx_label_set_text ((MxLabel *) priv->primary,
+                         title ? title : _("Unknown Title"));
+    mx_label_set_text ((MxLabel *) priv->secondary,
+                         artist ? artist : _("Unknown Artist"));
+}
+
+static void
+hrn_queue_item_set_property (GObject      *object,
+                             guint         prop_id,
+                             const GValue *value,
+                             GParamSpec   *pspec)
+{
+    HrnQueueItem *self = (HrnQueueItem *) object;
+    HrnQueueItemPrivate *priv = self->priv;
+    GObject *obj;
+
+    switch (prop_id) {
+    case PROP_ITEM:
+        obj = g_value_get_object (value);
+        if (obj != (GObject *)priv->item) {
+            if (priv->item) {
+                g_object_unref (priv->item);
+            }
+            priv->item = g_object_ref (obj);
+
+            update_tile (self);
+        }
+        break;
+
+    case PROP_URI:
+        if (priv->uri) {
+            g_free (priv->uri);
+        }
+        priv->uri = g_value_dup_string (value);
+        if (priv->item == NULL) {
+            char *filename, *unesc;
+
+            filename = g_path_get_basename (priv->uri);
+            unesc = g_uri_unescape_string (filename, NULL);
+            g_free (filename);
+
+            mx_label_set_text ((MxLabel *) priv->primary, unesc);
+            mx_label_set_text ((MxLabel *) priv->secondary, "");
+
+            g_free (unesc);
+        }
+        break;
+
+    default:
+        break;
+    }
+}
+
+static void
+hrn_queue_item_get_property (GObject    *object,
+                             guint       prop_id,
+                             GValue     *value,
+                             GParamSpec *pspec)
+{
+    HrnQueueItem *self = (HrnQueueItem *) object;
+    HrnQueueItemPrivate *priv = self->priv;
+
+    switch (prop_id) {
+    case PROP_ITEM:
+        g_value_set_object (value, priv->item);
+        break;
+
+    case PROP_URI:
+        g_value_set_string (value, priv->uri);
+        break;
+
+    default:
+        break;
+    }
+}
+
+static void
+hrn_queue_item_class_init (HrnQueueItemClass *klass)
+{
+    GObjectClass *o_class = (GObjectClass *) klass;
+
+    o_class->dispose = hrn_queue_item_dispose;
+    o_class->finalize = hrn_queue_item_finalize;
+    o_class->set_property = hrn_queue_item_set_property;
+    o_class->get_property = hrn_queue_item_get_property;
+
+    g_type_class_add_private (klass, sizeof (HrnQueueItemPrivate));
+
+    g_object_class_install_property (o_class, PROP_ITEM,
+                                     g_param_spec_object ("item", "", "",
+                                                          HRN_TYPE_ITEM,
+                                                          G_PARAM_STATIC_STRINGS |
+                                                          G_PARAM_READWRITE));
+    g_object_class_install_property (o_class, PROP_URI,
+                                     g_param_spec_string ("uri", "", "", "",
+                                                          G_PARAM_STATIC_STRINGS |
+                                                          G_PARAM_READWRITE));
+}
+
+static void
+hrn_queue_item_init (HrnQueueItem *self)
+{
+    HrnQueueItemPrivate *priv = GET_PRIVATE (self);
+
+    self->priv = priv;
+
+    priv->primary = mx_label_new_with_text ("");
+    clutter_actor_set_name (priv->primary, "hrn-queue-item-primary");
+    mx_table_add_actor_with_properties (MX_TABLE (self),
+                                        priv->primary, 0, 0,
+                                        "x-expand", FALSE,
+                                        "x-fill", FALSE,
+                                        "y-expand", FALSE,
+                                        "y-fill", FALSE,
+                                        "x-align", MX_ALIGN_START,
+                                        NULL);
+
+    priv->secondary = mx_label_new_with_text ("");
+    clutter_actor_set_name (priv->secondary, "hrn-queue-item-secondary");
+    mx_table_add_actor_with_properties (MX_TABLE (self),
+                                        priv->secondary, 1, 0,
+                                        "x-expand", FALSE,
+                                        "x-fill", FALSE,
+                                        "y-expand", FALSE,
+                                        "y-fill", FALSE,
+                                        "x-align", MX_ALIGN_START,
+                                        NULL);
+}
+
diff -pruN 1.5.1-1/src/hrn-queue-item-factory.c 1.8.4-1/src/hrn-queue-item-factory.c
--- 1.5.1-1/src/hrn-queue-item-factory.c	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/src/hrn-queue-item-factory.c	2010-02-17 17:26:44.000000000 +0000
@@ -0,0 +1,131 @@
+#include <mx/mx.h>
+
+#include "hrn-queue-item.h"
+#include "hrn-queue-item-factory.h"
+
+struct _HrnQueueItemFactoryPrivate {
+    int dummy;
+};
+
+enum {
+    ITEM_CLICKED,
+    LAST_SIGNAL
+};
+
+#define GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), HRN_TYPE_QUEUE_ITEM_FACTORY, HrnQueueItemFactoryPrivate))
+static guint32 signals[LAST_SIGNAL] = {0, };
+
+static void item_factory_init (MxItemFactoryIface *iface);
+G_DEFINE_TYPE_WITH_CODE (HrnQueueItemFactory, hrn_queue_item_factory, G_TYPE_OBJECT,
+                         G_IMPLEMENT_INTERFACE (MX_TYPE_ITEM_FACTORY,
+                                                item_factory_init));
+
+static void
+hrn_queue_item_factory_finalize (GObject *object)
+{
+    G_OBJECT_CLASS (hrn_queue_item_factory_parent_class)->finalize (object);
+}
+
+static void
+hrn_queue_item_factory_dispose (GObject *object)
+{
+    G_OBJECT_CLASS (hrn_queue_item_factory_parent_class)->dispose (object);
+}
+
+static void
+hrn_queue_item_factory_set_property (GObject      *object,
+                                     guint         prop_id,
+                                     const GValue *value,
+                                     GParamSpec   *pspec)
+{
+    switch (prop_id) {
+
+    default:
+        break;
+    }
+}
+
+static void
+hrn_queue_item_factory_get_property (GObject    *object,
+                                     guint       prop_id,
+                                     GValue     *value,
+                                     GParamSpec *pspec)
+{
+    switch (prop_id) {
+
+    default:
+        break;
+    }
+}
+
+static void
+hrn_queue_item_factory_class_init (HrnQueueItemFactoryClass *klass)
+{
+    GObjectClass *o_class = (GObjectClass *) klass;
+
+    o_class->dispose = hrn_queue_item_factory_dispose;
+    o_class->finalize = hrn_queue_item_factory_finalize;
+    o_class->set_property = hrn_queue_item_factory_set_property;
+    o_class->get_property = hrn_queue_item_factory_get_property;
+
+    g_type_class_add_private (klass, sizeof (HrnQueueItemFactoryPrivate));
+
+    signals[ITEM_CLICKED] = g_signal_new ("item-clicked",
+                                          G_TYPE_FROM_CLASS (klass),
+                                          G_SIGNAL_RUN_LAST |
+                                          G_SIGNAL_NO_RECURSE, 0, NULL, NULL,
+                                          g_cclosure_marshal_VOID__OBJECT,
+                                          G_TYPE_NONE, 1,
+                                          HRN_TYPE_QUEUE_ITEM);
+}
+
+static gboolean
+item_clicked_cb (ClutterActor        *actor,
+                 ClutterButtonEvent  *event,
+                 HrnQueueItemFactory *factory)
+{
+    if (event->button != 1) {
+        return FALSE;
+    }
+
+    if (event->click_count == 2) {
+        g_signal_emit (factory, signals[ITEM_CLICKED], 0, actor);
+        return TRUE;
+    }
+
+    return FALSE;
+}
+
+static ClutterActor *
+create_item (MxItemFactory *factory)
+{
+    HrnQueueItem *item;
+
+    item = g_object_new (HRN_TYPE_QUEUE_ITEM, NULL);
+    clutter_actor_set_reactive ((ClutterActor *) item, TRUE);
+    g_signal_connect (item, "button-release-event",
+                      G_CALLBACK (item_clicked_cb), factory);
+
+    return (ClutterActor *) item;
+}
+
+static void
+item_factory_init (MxItemFactoryIface *iface)
+{
+    iface->create = create_item;
+}
+
+static void
+hrn_queue_item_factory_init (HrnQueueItemFactory *self)
+{
+    self->priv = GET_PRIVATE (self);
+}
+
+HrnQueueItemFactory *
+hrn_queue_item_factory_new (void)
+{
+    HrnQueueItemFactory *factory;
+
+    factory = g_object_new (HRN_TYPE_QUEUE_ITEM_FACTORY, NULL);
+    return factory;
+}
diff -pruN 1.5.1-1/src/hrn-queue-item-factory.h 1.8.4-1/src/hrn-queue-item-factory.h
--- 1.5.1-1/src/hrn-queue-item-factory.h	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/src/hrn-queue-item-factory.h	2010-02-17 17:26:44.000000000 +0000
@@ -0,0 +1,50 @@
+#ifndef __HRN_QUEUE_ITEM_FACTORY_H__
+#define __HRN_QUEUE_ITEM_FACTORY_H__
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define HRN_TYPE_QUEUE_ITEM_FACTORY                                     \
+   (hrn_queue_item_factory_get_type())
+#define HRN_QUEUE_ITEM_FACTORY(obj)                                     \
+   (G_TYPE_CHECK_INSTANCE_CAST ((obj),                                  \
+                                HRN_TYPE_QUEUE_ITEM_FACTORY,            \
+                                HrnQueueItemFactory))
+#define HRN_QUEUE_ITEM_FACTORY_CLASS(klass)                             \
+   (G_TYPE_CHECK_CLASS_CAST ((klass),                                   \
+                             HRN_TYPE_QUEUE_ITEM_FACTORY,               \
+                             HrnQueueItemFactoryClass))
+#define IS_HRN_QUEUE_ITEM_FACTORY(obj)                                  \
+   (G_TYPE_CHECK_INSTANCE_TYPE ((obj),                                  \
+                                HRN_TYPE_QUEUE_ITEM_FACTORY))
+#define IS_HRN_QUEUE_ITEM_FACTORY_CLASS(klass)                          \
+   (G_TYPE_CHECK_CLASS_TYPE ((klass),                                   \
+                             HRN_TYPE_QUEUE_ITEM_FACTORY))
+#define HRN_QUEUE_ITEM_FACTORY_GET_CLASS(obj)                           \
+   (G_TYPE_INSTANCE_GET_CLASS ((obj),                                   \
+                               HRN_TYPE_QUEUE_ITEM_FACTORY,             \
+                               HrnQueueItemFactoryClass))
+
+typedef struct _HrnQueueItemFactoryPrivate HrnQueueItemFactoryPrivate;
+typedef struct _HrnQueueItemFactory      HrnQueueItemFactory;
+typedef struct _HrnQueueItemFactoryClass HrnQueueItemFactoryClass;
+
+struct _HrnQueueItemFactory
+{
+    GObject parent;
+
+    HrnQueueItemFactoryPrivate *priv;
+};
+
+struct _HrnQueueItemFactoryClass
+{
+    GObjectClass parent_class;
+};
+
+GType hrn_queue_item_factory_get_type (void) G_GNUC_CONST;
+HrnQueueItemFactory *hrn_queue_item_factory_new (void);
+
+G_END_DECLS
+
+#endif /* __HRN_QUEUE_ITEM_FACTORY_H__ */
diff -pruN 1.5.1-1/src/hrn-queue-item.h 1.8.4-1/src/hrn-queue-item.h
--- 1.5.1-1/src/hrn-queue-item.h	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/src/hrn-queue-item.h	2010-02-17 17:26:44.000000000 +0000
@@ -0,0 +1,49 @@
+#ifndef __HRN_QUEUE_ITEM_H__
+#define __HRN_QUEUE_ITEM_H__
+
+#include <mx/mx.h>
+
+G_BEGIN_DECLS
+
+#define HRN_TYPE_QUEUE_ITEM                                             \
+   (hrn_queue_item_get_type())
+#define HRN_QUEUE_ITEM(obj)                                             \
+   (G_TYPE_CHECK_INSTANCE_CAST ((obj),                                  \
+                                HRN_TYPE_QUEUE_ITEM,                    \
+                                HrnQueueItem))
+#define HRN_QUEUE_ITEM_CLASS(klass)                                     \
+   (G_TYPE_CHECK_CLASS_CAST ((klass),                                   \
+                             HRN_TYPE_QUEUE_ITEM,                       \
+                             HrnQueueItemClass))
+#define IS_HRN_QUEUE_ITEM(obj)                                          \
+   (G_TYPE_CHECK_INSTANCE_TYPE ((obj),                                  \
+                                HRN_TYPE_QUEUE_ITEM))
+#define IS_HRN_QUEUE_ITEM_CLASS(klass)                                  \
+   (G_TYPE_CHECK_CLASS_TYPE ((klass),                                   \
+                             HRN_TYPE_QUEUE_ITEM))
+#define HRN_QUEUE_ITEM_GET_CLASS(obj)                                   \
+   (G_TYPE_INSTANCE_GET_CLASS ((obj),                                   \
+                               HRN_TYPE_QUEUE_ITEM,                     \
+                               HrnQueueItemClass))
+
+typedef struct _HrnQueueItemPrivate HrnQueueItemPrivate;
+typedef struct _HrnQueueItem      HrnQueueItem;
+typedef struct _HrnQueueItemClass HrnQueueItemClass;
+
+struct _HrnQueueItem
+{
+    MxTable parent;
+
+    HrnQueueItemPrivate *priv;
+};
+
+struct _HrnQueueItemClass
+{
+    MxTableClass parent_class;
+};
+
+GType hrn_queue_item_get_type (void) G_GNUC_CONST;
+
+G_END_DECLS
+
+#endif /* __HRN_QUEUE_ITEM_H__ */
diff -pruN 1.5.1-1/src/hrn-searchbar.c 1.8.4-1/src/hrn-searchbar.c
--- 1.5.1-1/src/hrn-searchbar.c	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-searchbar.c	2011-03-15 13:20:21.000000000 +0000
@@ -29,7 +29,7 @@ enum {
     LAST_SIGNAL
 };
 
-G_DEFINE_TYPE (HrnSearchBar, hrn_search_bar, NBTK_TYPE_ENTRY);
+G_DEFINE_TYPE (HrnSearchBar, hrn_search_bar, MX_TYPE_PATH_BAR);
 
 #define HRN_SEARCH_BAR_GET_PRIVATE(obj)                 \
   (G_TYPE_INSTANCE_GET_PRIVATE ((obj), \
@@ -87,7 +87,7 @@ hrn_searchbar_unmap (ClutterActor *self)
 }
 
 static gboolean
-hrn_search_bar_style_changed (NbtkWidget *widget)
+hrn_search_bar_style_changed (MxWidget *widget)
 {
   HrnSearchBarPrivate *priv = HRN_SEARCH_BAR (widget)->priv;
 
@@ -126,31 +126,37 @@ hrn_search_bar_init (HrnSearchBar *self)
   HrnSearchBarPrivate *priv = HRN_SEARCH_BAR_GET_PRIVATE (self);
 
   self->priv = priv;
-  memset (priv, 0, sizeof (priv));
   g_signal_connect (self, "style-changed", G_CALLBACK (hrn_search_bar_style_changed), NULL);
+
+  mx_path_bar_set_editable (MX_PATH_BAR (self), TRUE);
 }
 
 static void
-cleared (NbtkButton *togglebutton, HrnSearchBar *search_bar)
+cleared (MxButton *togglebutton, MxPathBar *search_bar)
 {
-  nbtk_entry_set_text (NBTK_ENTRY (search_bar), "");
+  const gchar *text = mx_path_bar_get_text (search_bar);
+
+  if (!text || !(*text))
+    mx_path_bar_pop (search_bar);
+  else
+    mx_path_bar_set_text (search_bar, "");
 }
 
 static void
-pin_toggled (NbtkButton   *togglebutton,
+pin_toggled (MxButton   *togglebutton,
              HrnSearchBar *search_bar)
 {
     const char *search;
 
-    if (nbtk_button_get_checked (togglebutton) == FALSE) {
+    if (mx_button_get_toggled (togglebutton) == FALSE) {
         g_signal_emit (search_bar, signals[SEARCH_PINNED], 0, FALSE);
         return;
     }
 
-    search = nbtk_entry_get_text (NBTK_ENTRY (search_bar));
+    search = mx_path_bar_get_text (MX_PATH_BAR (search_bar));
     if (search == NULL || search[0] == '\0') {
         g_print ("Unpinning here\n");
-        nbtk_button_set_checked (togglebutton, FALSE);
+        mx_button_set_toggled (togglebutton, FALSE);
         return;
     }
 
@@ -164,10 +170,10 @@ hrn_search_bar_set_pinned (HrnSearchBar 
   HrnSearchBarPrivate *priv = HRN_SEARCH_BAR_GET_PRIVATE (searchbar);
 
   if (pinned) {
-      nbtk_button_set_checked (NBTK_BUTTON (priv->pin_button), TRUE);
+      mx_button_set_toggled (MX_BUTTON (priv->pin_button), TRUE);
   } else {
-      if (nbtk_button_get_checked (NBTK_BUTTON (priv->pin_button))) {
-          nbtk_button_set_checked (NBTK_BUTTON (priv->pin_button), FALSE);
+      if (mx_button_get_toggled (MX_BUTTON (priv->pin_button))) {
+          mx_button_set_toggled (MX_BUTTON (priv->pin_button), FALSE);
     }
   }
 }
@@ -186,10 +192,10 @@ hrn_search_bar_constructor (GType type, 
 
   search_bar         = HRN_SEARCH_BAR (object);
   priv               = HRN_SEARCH_BAR_GET_PRIVATE (object);
-  priv->pin_button   = (void*) nbtk_button_new ();
-  priv->clear_button = (void*) nbtk_button_new ();
+  priv->pin_button   = (void*) mx_button_new ();
+  priv->clear_button = (void*) mx_button_new ();
 
-  nbtk_button_set_toggle_mode (NBTK_BUTTON (priv->pin_button), TRUE);
+  mx_button_set_is_toggle (MX_BUTTON (priv->pin_button), TRUE);
   clutter_actor_set_name (CLUTTER_ACTOR (priv->pin_button),
                           "fav-toggle");
   clutter_actor_set_name (CLUTTER_ACTOR (priv->clear_button),
@@ -271,6 +277,7 @@ hrn_searchbar_new (HrnPinManager *manage
   return bar;
 }
 
+#if 0
 static void
 pin_selected_cb (HrnPinManager *pin_manager,
                  HrnPin        *pin,
@@ -278,31 +285,28 @@ pin_selected_cb (HrnPinManager *pin_mana
 {
   HrnSearchBarPrivate *priv = searchbar->priv;
 
-  g_free (priv->current_pin);
-
-  if (pin) {
-    priv->current_pin = g_strdup (pin->group);
-    nbtk_entry_set_text ((NbtkEntry *) searchbar, pin->query);
-  } else {
-    priv->current_pin = NULL;
-    nbtk_entry_set_text ((NbtkEntry *) searchbar, "");
+  if (priv->current_pin) {
+    g_free (priv->current_pin);
+    if (pin) {
+      priv->current_pin = g_strdup (pin->group);
+      mx_path_bar_set_text ((MxPathBar *) searchbar, pin->query);
+    } else {
+      priv->current_pin = NULL;
+      mx_path_bar_set_text ((MxPathBar *) searchbar, "");
+    }
   }
 
   g_signal_handler_block (priv->pin_button, priv->pin_id);
-  nbtk_button_set_checked (NBTK_BUTTON (priv->pin_button),
+  mx_button_set_checked (MX_BUTTON (priv->pin_button),
                            pin ? TRUE : FALSE);
   g_signal_handler_unblock (priv->pin_button, priv->pin_id);
 }
+#endif
 
 void
 hrn_searchbar_set_pin_manager (HrnSearchBar  *searchbar,
                                HrnPinManager *pin_manager)
 {
-  HrnSearchBarPrivate *priv = searchbar->priv;
-
-  priv->pin_manager = pin_manager;
-  g_signal_connect (pin_manager, "pin-selected",
-                    G_CALLBACK (pin_selected_cb), searchbar);
 }
 
 void
diff -pruN 1.5.1-1/src/hrn-searchbar.h 1.8.4-1/src/hrn-searchbar.h
--- 1.5.1-1/src/hrn-searchbar.h	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-searchbar.h	2010-02-17 17:26:44.000000000 +0000
@@ -47,14 +47,14 @@ typedef struct _HrnSearchBarPrivate HrnS
 
 struct _HrnSearchBar
 {
-  NbtkEntry            parent_instance;
+  MxPathBar            parent_instance;
   HrnSearchBarPrivate *priv;
 };
 
 struct _HrnSearchBarClass
 {
   /*< private >*/
-  NbtkEntryClass parent_class;
+  MxPathBarClass parent_class;
 };
 
 GType hrn_search_bar_get_type   (void) G_GNUC_CONST;
diff -pruN 1.5.1-1/src/hrn-sidebar.c 1.8.4-1/src/hrn-sidebar.c
--- 1.5.1-1/src/hrn-sidebar.c	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-sidebar.c	2010-02-17 17:26:44.000000000 +0000
@@ -27,13 +27,12 @@
 #include <clutter/clutter.h>
 #include <cogl/cogl.h>
 
-#include <nbtk/nbtk.h>
+#include <mx/mx.h>
 
 #include "hrn.h" /* FIXME */
 #include "hrn-marshal.h"
 #include "hrn-sidebar.h"
 #include "hrn-sidebar-item.h"
-#include "hrn-sidebar-item-factory.h"
 #include "hrn-sidebar-subitem.h"
 
 enum {
@@ -46,57 +45,23 @@ enum {
   LAST_SIGNAL
 };
 
-G_DEFINE_TYPE (HrnSidebar, hrn_sidebar, NBTK_TYPE_BIN);
+G_DEFINE_TYPE (HrnSidebar, hrn_sidebar, MX_TYPE_FRAME);
 
 #define HRN_SIDEBAR_GET_PRIVATE(obj) \
   (G_TYPE_INSTANCE_GET_PRIVATE ((obj), HRN_TYPE_SIDEBAR, HrnSidebarPrivate))
 
 struct _HrnSidebarPrivate
 {
-  NbtkWidget *scroll;
-  NbtkWidget *listview;
-
-  ClutterModel *sources;
-
-  HrnSidebarItemFactory *factory;
-  HrnPinManager *pin_manager;
+    HrnSidebarItem *item;
+    HrnPinManager *pin_manager;
 };
 
 static guint32 signals[LAST_SIGNAL] = {0, };
 
-static GObject *
-hrn_sidebar_constructor (GType type, guint n_params,
-                         GObjectConstructParam *params);
-static void
-hrn_sidebar_dispose (GObject *object);
-static void
-hrn_sidebar_allocate (ClutterActor *self, const ClutterActorBox *box,
-                      ClutterAllocationFlags flags);
-static void
-hrn_sidebar_paint (ClutterActor *actor);
-static void
-hrn_sidebar_pick (ClutterActor *actor, const ClutterColor   *color);
-
-static void
-hrn_sidebar_map (ClutterActor *self)
-{
-  HrnSidebarPrivate *priv = HRN_SIDEBAR (self)->priv;
-
-  CLUTTER_ACTOR_CLASS (hrn_sidebar_parent_class)->map (self);
-
-  if (priv->scroll)
-    clutter_actor_map (CLUTTER_ACTOR (priv->scroll));
-}
-
 static void
-hrn_sidebar_unmap (ClutterActor *self)
+hrn_sidebar_dispose (GObject *object)
 {
-  HrnSidebarPrivate *priv = HRN_SIDEBAR (self)->priv;
-
-  CLUTTER_ACTOR_CLASS (hrn_sidebar_parent_class)->unmap (self);
-
-  if (priv->scroll)
-    clutter_actor_unmap (CLUTTER_ACTOR (priv->scroll));
+  G_OBJECT_CLASS (hrn_sidebar_parent_class)->dispose (object);
 }
 
 static void
@@ -127,23 +92,66 @@ hrn_sidebar_get_property (GObject *objec
 }
 
 static void
+source_changed_cb (HrnSidebarItem *item,
+                   HrnItemType     type,
+                   const char     *name,
+                   HrnSidebar     *sidebar)
+{
+    HrnSidebarPrivate *priv = sidebar->priv;
+    HrnPin *pin = NULL;
+
+    if (name != NULL || *name != '\0') {
+        pin = hrn_pin_manager_get_pin (priv->pin_manager, name);
+    }
+
+    g_signal_emit (sidebar, signals[SOURCE_CHANGED], 0, type, pin);
+}
+
+static GObject *
+hrn_sidebar_constructor (GType type, guint n_params,
+                         GObjectConstructParam *params)
+{
+    HrnSidebarPrivate *priv;
+    GObject           *object;
+    HrnSidebar        *sidebar;
+
+    object = G_OBJECT_CLASS (hrn_sidebar_parent_class)->constructor (type,
+                                                                     n_params,
+                                                                     params);
+
+    sidebar = HRN_SIDEBAR (object);
+    priv    = HRN_SIDEBAR_GET_PRIVATE (sidebar);
+
+    mx_bin_set_alignment (MX_BIN (object), MX_ALIGN_START,
+                          MX_ALIGN_START);
+    clutter_actor_set_name (CLUTTER_ACTOR (sidebar), "HrnSidebar");
+    clutter_actor_set_reactive ((ClutterActor *) sidebar, TRUE);
+
+    priv->item = hrn_sidebar_item_new (_("Your local media"),
+                                       priv->pin_manager);
+    clutter_container_add_actor (CLUTTER_CONTAINER (object),
+                                 CLUTTER_ACTOR (priv->item));
+    g_signal_connect (priv->item, "source-changed",
+                      G_CALLBACK (source_changed_cb), sidebar);
+
+    g_object_set_data (object, "HRN_DROP_MASK",
+                       GINT_TO_POINTER (HRN_DROP_MASK_SIDEBAR));
+
+    clutter_actor_set_reactive (CLUTTER_ACTOR (object), TRUE);
+
+    return object;
+}
+
+static void
 hrn_sidebar_class_init (HrnSidebarClass *klass)
 {
   GObjectClass      *gobject_class = G_OBJECT_CLASS (klass);
-  ClutterActorClass *actor_class   = CLUTTER_ACTOR_CLASS (klass);
-
 
   gobject_class->dispose     = hrn_sidebar_dispose;
   gobject_class->constructor = hrn_sidebar_constructor;
   gobject_class->set_property = hrn_sidebar_set_property;
   gobject_class->get_property = hrn_sidebar_get_property;
 
-  actor_class->allocate      = hrn_sidebar_allocate;
-  actor_class->paint         = hrn_sidebar_paint;
-  actor_class->pick          = hrn_sidebar_pick;
-  actor_class->map           = hrn_sidebar_map;
-  actor_class->unmap         = hrn_sidebar_unmap;
-
   g_type_class_add_private (gobject_class, sizeof (HrnSidebarPrivate));
 
   g_object_class_install_property (gobject_class, PROP_PIN_MANAGER,
@@ -156,8 +164,8 @@ hrn_sidebar_class_init (HrnSidebarClass 
                                           G_TYPE_FROM_CLASS (klass),
                                           G_SIGNAL_RUN_FIRST |
                                           G_SIGNAL_NO_RECURSE, 0, NULL, NULL,
-                                          hrn_marshal_VOID__POINTER_INT_POINTER,
-                                          G_TYPE_NONE, 3, G_TYPE_POINTER,
+                                          hrn_marshal_VOID__INT_POINTER,
+                                          G_TYPE_NONE, 2,
                                           G_TYPE_INT, G_TYPE_POINTER);
 }
 
@@ -170,6 +178,7 @@ hrn_sidebar_init (HrnSidebar *self)
 #define SIDEBAR_WIDTH           170
 #define SIDEBAR_WIDTH_PADDED    200
 
+#if 0
 void
 hrn_sidebar_add_source (HrnSidebar *sidebar,
                         HrnSource  *source,
@@ -212,128 +221,8 @@ hrn_sidebar_remove_source (HrnSidebar *s
     iter = clutter_model_iter_next (iter);
   }
 }
-
-static GObject *
-hrn_sidebar_constructor (GType type, guint n_params,
-                         GObjectConstructParam *params)
-{
-  HrnSidebarPrivate *priv;
-  GObject           *object;
-  HrnSidebar        *sidebar;
-
-  object = G_OBJECT_CLASS (hrn_sidebar_parent_class)->constructor (type,
-                                                                   n_params,
-                                                                   params);
-
-  sidebar = HRN_SIDEBAR (object);
-  priv    = HRN_SIDEBAR_GET_PRIVATE (sidebar);
-
-  nbtk_widget_set_style_class_name (NBTK_WIDGET (sidebar), "HrnSidebar");
-  clutter_actor_set_name (CLUTTER_ACTOR (sidebar), "HrnSidebar");
-  clutter_actor_set_reactive ((ClutterActor *) sidebar, TRUE);
-
-  priv->scroll = (NbtkWidget*) nbtk_scroll_view_new ();
-  clutter_actor_set_parent (CLUTTER_ACTOR (priv->scroll),
-                            CLUTTER_ACTOR (sidebar));
-  clutter_actor_set_width (CLUTTER_ACTOR (priv->scroll), SIDEBAR_WIDTH);
-
-  priv->sources = clutter_list_model_new (2, HRN_TYPE_SOURCE, "source",
-                                          G_TYPE_STRING, "name");
-
-  priv->listview = nbtk_list_view_new ();
-  clutter_actor_set_width (CLUTTER_ACTOR (priv->listview), SIDEBAR_WIDTH);
-  clutter_container_add_actor (CLUTTER_CONTAINER (priv->scroll),
-                               CLUTTER_ACTOR (priv->listview));
-
-  nbtk_list_view_set_model (NBTK_LIST_VIEW (priv->listview), priv->sources);
-
-  priv->factory = hrn_sidebar_item_factory_new (sidebar, priv->pin_manager);
-  nbtk_list_view_set_factory (NBTK_LIST_VIEW (priv->listview),
-                              NBTK_ITEM_FACTORY (priv->factory));
-
-  nbtk_list_view_add_attribute (NBTK_LIST_VIEW (priv->listview),
-                                "source", 0);
-  nbtk_list_view_add_attribute (NBTK_LIST_VIEW (priv->listview),
-                                "name", 1);
-
-  g_object_set_data (object, "HRN_DROP_MASK",
-                     GINT_TO_POINTER (HRN_DROP_MASK_SIDEBAR));
-  g_object_set_data (G_OBJECT (priv->listview), "HRN_DROP_MASK",
-                     GINT_TO_POINTER (HRN_DROP_MASK_SIDEBAR));
-
-#if 0
-  /* hack to sync up size */
-  {
-    gfloat width  = SIDEBAR_WIDTH_PADDED;
-    int  height;
-
-    gtk_window_get_size (GTK_WINDOW (window), NULL, &height);
-    height -= 61;
-
-    clutter_actor_set_size (CLUTTER_ACTOR (priv->listview), width - 40, height);
-    clutter_actor_set_size (CLUTTER_ACTOR (priv->scroll), width, height);
-    clutter_actor_set_size (CLUTTER_ACTOR (sidebar), width, height);
-  }
 #endif
 
-  clutter_actor_set_reactive (CLUTTER_ACTOR (object), TRUE);
-
-  return object;
-}
-
-
-static void
-hrn_sidebar_allocate (ClutterActor          *self,
-                      const ClutterActorBox *box,
-                      ClutterAllocationFlags flags)
-{
-  HrnSidebarPrivate *priv = HRN_SIDEBAR_GET_PRIVATE (self);
-  ClutterActorClass *parent_class;
-  ClutterActorBox child_box;
-
-  parent_class = CLUTTER_ACTOR_CLASS (hrn_sidebar_parent_class);
-  parent_class->allocate (self, box, flags);
-
-  child_box.x1 = 0;
-  child_box.x2 = box->x2 - box->x1;
-  child_box.y1 = 0;
-  child_box.y2 = (box->y2 - box->y1) - 170;
-
-  clutter_actor_allocate (CLUTTER_ACTOR (priv->scroll), &child_box, flags);
-}
-
-static void
-hrn_sidebar_dispose (GObject *object)
-{
-  G_OBJECT_CLASS (hrn_sidebar_parent_class)->dispose (object);
-}
-
-static void
-hrn_sidebar_paint (ClutterActor *actor)
-{
-  HrnSidebar        *sidebar = HRN_SIDEBAR (actor);
-  HrnSidebarPrivate *priv    = HRN_SIDEBAR_GET_PRIVATE (sidebar);
-
-  CLUTTER_ACTOR_CLASS (hrn_sidebar_parent_class)->paint (actor);
-
-  clutter_actor_paint (CLUTTER_ACTOR (priv->scroll));
-}
-
-static void
-hrn_sidebar_pick (ClutterActor *actor, const ClutterColor   *color)
-{
-  gfloat             width;
-  gfloat             height;
-  HrnSidebarPrivate *priv = HRN_SIDEBAR_GET_PRIVATE (actor);
-
-  clutter_actor_get_size (CLUTTER_ACTOR (actor), &width, &height);
-
-  cogl_set_source_color ((void*) color);
-  cogl_rectangle (0, 0, width, height);
-
-  clutter_actor_paint (CLUTTER_ACTOR (priv->scroll));
-}
-
 HrnSidebar *
 hrn_sidebar_new (HrnPinManager *pin_manager)
 {
@@ -343,16 +232,3 @@ hrn_sidebar_new (HrnPinManager *pin_mana
 
   return sidebar;
 }
-
-void
-hrn_sidebar_change_source (HrnSidebar *sidebar,
-                           HrnSource  *source,
-                           int         filter,
-                           const char *query_name)
-{
-  HrnSidebarPrivate *priv = sidebar->priv;
-  HrnPin *pin;
-
-  pin = hrn_pin_manager_get_pin (priv->pin_manager, query_name);
-  g_signal_emit (sidebar, signals[SOURCE_CHANGED], 0, source, filter, pin);
-}
diff -pruN 1.5.1-1/src/hrn-sidebar.h 1.8.4-1/src/hrn-sidebar.h
--- 1.5.1-1/src/hrn-sidebar.h	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-sidebar.h	2010-02-17 17:26:44.000000000 +0000
@@ -22,7 +22,6 @@
 #include <clutter/clutter.h>
 
 #include "hrn-pin-manager.h"
-#include "hrn-source.h"
 
 G_BEGIN_DECLS
 
@@ -49,29 +48,19 @@ typedef struct _HrnSidebarPrivate HrnSid
 
 struct _HrnSidebar
 {
-  NbtkBin            parent_instance;
+  MxFrame           parent_instance;
   HrnSidebarPrivate *priv;
 };
 
 struct _HrnSidebarClass
 {
   /*< private >*/
-  NbtkBinClass parent_class;
+  MxFrameClass parent_class;
 };
 
 GType       hrn_sidebar_get_type (void) G_GNUC_CONST;
 
 HrnSidebar *hrn_sidebar_new            (HrnPinManager *pin_manager);
-void        hrn_sidebar_add_source (HrnSidebar *sidebar,
-                                    HrnSource  *source,
-                                    gboolean    local_source);
-void hrn_sidebar_remove_source (HrnSidebar *sidebar,
-                                HrnSource  *source);
-
-void hrn_sidebar_change_source (HrnSidebar *sidebar,
-                                HrnSource  *source,
-                                int         filter,
-                                const char *query_name);
 
 G_END_DECLS
 
diff -pruN 1.5.1-1/src/hrn-sidebar-item.c 1.8.4-1/src/hrn-sidebar-item.c
--- 1.5.1-1/src/hrn-sidebar-item.c	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-sidebar-item.c	2011-03-15 13:20:21.000000000 +0000
@@ -1,6 +1,7 @@
 #include <glib.h>
 #include <glib/gi18n.h>
 
+#include "hrn-item.h"
 #include "hrn-marshal.h"
 #include "hrn-sidebar-item.h"
 #include "hrn-sidebar-subitem.h"
@@ -9,7 +10,6 @@
 enum {
     PROP_0,
     PROP_PIN_MANAGER,
-    PROP_SOURCE,
     PROP_NAME,
 };
 
@@ -20,21 +20,19 @@ enum {
 
 struct _HrnSidebarItemPrivate {
     ClutterActor *group;
-    NbtkWidget *title;
+    ClutterActor *title;
     ClutterActor *spinner;
-    NbtkWidget *child_grid;
+    ClutterActor *child_box;
 
-    HrnSource *source;
     HrnPinManager *pin_manager;
-    gboolean initialised; /* NbtkListView seems to like setting properties
+    gboolean initialised; /* MxListView seems to like setting properties
                              on items frequently, so only do stuff if we've
                              been not already been set up */
     GList *items_pinned;
 };
 
-#define SIDEBAR_WIDTH 170
 #define GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), HRN_TYPE_SIDEBAR_ITEM, HrnSidebarItemPrivate))
-G_DEFINE_TYPE (HrnSidebarItem, hrn_sidebar_item, NBTK_TYPE_TABLE);
+G_DEFINE_TYPE (HrnSidebarItem, hrn_sidebar_item, MX_TYPE_TABLE);
 static guint32 signals[LAST_SIGNAL] = {0, };
 
 static void
@@ -49,11 +47,6 @@ hrn_sidebar_item_dispose (GObject *objec
     HrnSidebarItem *self = (HrnSidebarItem *) object;
     HrnSidebarItemPrivate *priv = self->priv;
 
-    if (priv->source) {
-        g_object_unref (priv->source);
-        priv->source = NULL;
-    }
-
     if (priv->pin_manager) {
         g_object_unref (priv->pin_manager);
         priv->pin_manager = NULL;
@@ -63,21 +56,10 @@ hrn_sidebar_item_dispose (GObject *objec
 }
 
 static void
-emit_source_changed (HrnSidebarItem *item,
-                     int             filter,
-                     const char     *query_name)
-{
-    HrnSidebarItemPrivate *priv = item->priv;
-
-    g_signal_emit (item, signals[SOURCE_CHANGED], 0,
-                   priv->source, filter, query_name);
-}
-
-static void
 select_subitem_cb (ClutterActor *actor,
                    gpointer      data)
 {
-    nbtk_button_set_checked ((NbtkButton *) actor,
+    mx_button_set_toggled ((MxButton *) actor,
                              actor == (ClutterActor *) data);
 }
 
@@ -87,25 +69,16 @@ select_subitem (HrnSidebarItem    *item,
 {
     HrnSidebarItemPrivate *priv = item->priv;
 
-    clutter_container_foreach (CLUTTER_CONTAINER (priv->child_grid),
+    clutter_container_foreach (CLUTTER_CONTAINER (priv->child_box),
                                select_subitem_cb, subitem);
 }
 
 static void
-change_source_query (HrnSidebarSubitem *subitem,
-                     HrnSidebarItem    *item)
+emit_source_changed (HrnSidebarItem *item,
+                     HrnItemType     type,
+                     const char     *name)
 {
-    HrnSidebarItemPrivate *priv = item->priv;
-    const char *group;
-    HrnPin *pin;
-
-    select_subitem (item, subitem);
-
-    group = hrn_sidebar_subitem_get_qname (subitem);
-    pin = hrn_pin_manager_get_pin (priv->pin_manager, group);
-    if (pin) {
-        emit_source_changed (item, pin->filter, group);
-    }
+    g_signal_emit (item, signals[SOURCE_CHANGED], 0, type, name);
 }
 
 static void
@@ -172,15 +145,15 @@ create_subitem (HrnSidebarItem *item,
     const char *iname;
 
     switch (filter) {
-    case BKL_ITEM_TYPE_AUDIO:
+    case HRN_ITEM_TYPE_AUDIO:
         iname = "icon-audio";
         break;
 
-    case BKL_ITEM_TYPE_IMAGE:
+    case HRN_ITEM_TYPE_IMAGE:
         iname = "icon-images";
         break;
 
-    case BKL_ITEM_TYPE_VIDEO:
+    case HRN_ITEM_TYPE_VIDEO:
         iname = "icon-video";
         break;
 
@@ -195,78 +168,57 @@ create_subitem (HrnSidebarItem *item,
 }
 
 static void
-setup_source (HrnSidebarItem *item)
+pinned_item_clicked (MxWidget       *button,
+                     HrnSidebarItem *item)
 {
     HrnSidebarItemPrivate *priv = item->priv;
-    const char *source_path;
-    GList *pins, *p;
+    HrnPin *pin;
+    const gchar *group;
 
-    if (priv->initialised == TRUE) {
+    group = hrn_sidebar_subitem_get_qname ((HrnSidebarSubitem *) button);
+
+    pin = hrn_pin_manager_get_pin (priv->pin_manager, group);
+    if (pin == NULL) {
+        g_warning ("No pin for %s", group);
         return;
     }
 
-    priv->initialised = TRUE;
-
-    source_path = hrn_source_get_object_path (priv->source);
-    pins = hrn_pin_manager_get_pins (priv->pin_manager);
-
-    for (p = pins; p; p = p->next) {
-        HrnPin *pin = p->data;
-        HrnSidebarSubitem *subitem;
-
-        if (g_str_equal (pin->source, source_path) == FALSE) {
-            continue;
-        }
-
-        subitem = create_subitem (item, pin);
-        g_signal_connect (subitem, "clicked",
-                          G_CALLBACK (change_source_query), item);
-
-        g_signal_connect (subitem, "pinned",
-                          G_CALLBACK (item_pinned), item);
-        g_signal_connect (subitem, "renamed",
-                          G_CALLBACK (item_renamed), item);
-
-        priv->items_pinned = g_list_prepend (priv->items_pinned, subitem);
-        clutter_container_add_actor (CLUTTER_CONTAINER (priv->child_grid),
-                                     CLUTTER_ACTOR (subitem));
-        nbtk_bin_set_alignment (NBTK_BIN (subitem),
-                                NBTK_ALIGN_START,
-                                NBTK_ALIGN_START);
-    }
-    g_list_free (pins);
+    select_subitem (item, HRN_SIDEBAR_SUBITEM (button));
+    hrn_pin_manager_select_pin (priv->pin_manager, pin);
 }
 
 static void
-pin_added_cb (HrnPinManager  *pin_manager,
-              HrnPin         *pin,
-              HrnSidebarItem *item)
+add_pin (HrnSidebarItem *item,
+         HrnPin         *pin)
 {
     HrnSidebarItemPrivate *priv = item->priv;
     HrnSidebarSubitem *subitem;
-    const char *source_path;
-
-    source_path = hrn_source_get_object_path (priv->source);
-
-    if (g_str_equal (pin->source, source_path) == FALSE) {
-        return;
-    }
 
     subitem = create_subitem (item, pin);
     g_signal_connect (subitem, "clicked",
-                      G_CALLBACK (change_source_query), item);
-
+                      G_CALLBACK (pinned_item_clicked), item);
     g_signal_connect (subitem, "pinned",
                       G_CALLBACK (item_pinned), item);
     g_signal_connect (subitem, "renamed",
                       G_CALLBACK (item_renamed), item);
 
     priv->items_pinned = g_list_prepend (priv->items_pinned, subitem);
-    clutter_container_add_actor (CLUTTER_CONTAINER (priv->child_grid),
+    clutter_container_add_actor (CLUTTER_CONTAINER (priv->child_box),
                                  CLUTTER_ACTOR (subitem));
-    nbtk_bin_set_alignment (NBTK_BIN (subitem),
-                            NBTK_ALIGN_START,
-                            NBTK_ALIGN_START);
+    clutter_container_child_set (CLUTTER_CONTAINER (priv->child_box),
+                                 CLUTTER_ACTOR (subitem),
+                                 "expand", TRUE,
+                                 NULL);
+    mx_bin_set_alignment (MX_BIN (subitem), MX_ALIGN_START,
+                          MX_ALIGN_MIDDLE);
+}
+
+static void
+pin_added_cb (HrnPinManager  *pin_manager,
+              HrnPin         *pin,
+              HrnSidebarItem *item)
+{
+    add_pin (item, pin);
 }
 
 static void
@@ -292,26 +244,6 @@ pin_removed_cb (HrnPinManager  *pin_mana
 }
 
 static void
-index_started_cb (HrnSource      *source,
-                  HrnSidebarItem *item)
-{
-    HrnSidebarItemPrivate *priv = item->priv;
-
-    clutter_actor_show (priv->spinner);
-    hrn_spinner_start ((HrnSpinner *) priv->spinner);
-}
-
-static void
-index_finished_cb (HrnSource      *source,
-                   HrnSidebarItem *item)
-{
-    HrnSidebarItemPrivate *priv = item->priv;
-
-    hrn_spinner_stop ((HrnSpinner *) priv->spinner);
-    clutter_actor_hide (priv->spinner);
-}
-
-static void
 hrn_sidebar_item_set_property (GObject      *object,
                                guint         prop_id,
                                const GValue *value,
@@ -319,7 +251,7 @@ hrn_sidebar_item_set_property (GObject  
 {
     HrnSidebarItem *item = (HrnSidebarItem *) object;
     HrnSidebarItemPrivate *priv = item->priv;
-    HrnSource *source;
+    GList *pins, *p;
 
     switch (prop_id) {
     case PROP_PIN_MANAGER:
@@ -333,30 +265,18 @@ hrn_sidebar_item_set_property (GObject  
         g_signal_connect (priv->pin_manager, "pin-removed",
                           G_CALLBACK (pin_removed_cb), item);
 
-        if (priv->pin_manager && priv->source) {
-            setup_source (item);
-        }
-        break;
+        pins = hrn_pin_manager_get_pins (priv->pin_manager);
 
-    case PROP_SOURCE:
-        source = g_value_get_object (value);
-        if (priv->source && priv->source != source) {
-            g_object_unref (priv->source);
-            priv->source = NULL;
-        }
-        priv->source = g_object_ref (source);
-        g_signal_connect (priv->source, "index-started",
-                          G_CALLBACK (index_started_cb), item);
-        g_signal_connect (priv->source, "index-finished",
-                          G_CALLBACK (index_finished_cb), item);
+        for (p = pins; p; p = p->next) {
+            HrnPin *pin = p->data;
 
-        if (priv->source && priv->pin_manager) {
-            setup_source (item);
+            add_pin (item, pin);
         }
+        g_list_free (pins);
         break;
 
     case PROP_NAME:
-        nbtk_label_set_text ((NbtkLabel *) priv->title,
+        mx_label_set_text ((MxLabel *) priv->title,
                              g_value_get_string (value));
         break;
 
@@ -394,49 +314,44 @@ hrn_sidebar_item_class_init (HrnSidebarI
                                             G_TYPE_FROM_CLASS (klass),
                                             G_SIGNAL_NO_RECURSE |
                                             G_SIGNAL_RUN_FIRST, 0, NULL, NULL,
-                                            hrn_marshal_VOID__OBJECT_INT_STRING,
-                                            G_TYPE_NONE, 3,
-                                            HRN_TYPE_SOURCE, G_TYPE_INT,
+                                            hrn_marshal_VOID__INT_STRING,
+                                            G_TYPE_NONE, 2,
+                                            G_TYPE_INT,
                                             G_TYPE_STRING);
 
-    g_object_class_install_property (o_class, PROP_SOURCE,
-                                     g_param_spec_object ("source", "", "",
-                                                          HRN_TYPE_SOURCE,
-                                                          G_PARAM_WRITABLE |
-                                                          G_PARAM_STATIC_STRINGS));
     g_object_class_install_property (o_class, PROP_PIN_MANAGER,
                                      g_param_spec_object ("pin-manager", "", "",
                                                           HRN_TYPE_PIN_MANAGER,
                                                           G_PARAM_WRITABLE |
                                                           G_PARAM_STATIC_STRINGS));
     g_object_class_install_property (o_class, PROP_NAME,
-                                     g_param_spec_string ("name", "", "", "",
+                                     g_param_spec_string ("item-name", "", "", "",
                                                           G_PARAM_WRITABLE |
                                                           G_PARAM_STATIC_STRINGS));
 }
 
 static void
-audio_item_clicked (NbtkWidget     *button,
+audio_item_clicked (MxWidget       *button,
                     HrnSidebarItem *item)
 {
     select_subitem (item, HRN_SIDEBAR_SUBITEM (button));
-    emit_source_changed (item, BKL_ITEM_TYPE_AUDIO, "");
+    emit_source_changed (item, HRN_ITEM_TYPE_AUDIO, "");
 }
 
 static void
-image_item_clicked (NbtkWidget     *button,
+image_item_clicked (MxWidget     *button,
                     HrnSidebarItem *item)
 {
     select_subitem (item, HRN_SIDEBAR_SUBITEM (button));
-    emit_source_changed (item, BKL_ITEM_TYPE_IMAGE, "");
+    emit_source_changed (item, HRN_ITEM_TYPE_IMAGE, "");
 }
 
 static void
-video_item_clicked (NbtkWidget     *button,
+video_item_clicked (MxWidget     *button,
                     HrnSidebarItem *item)
 {
     select_subitem (item, HRN_SIDEBAR_SUBITEM (button));
-    emit_source_changed (item, BKL_ITEM_TYPE_VIDEO, "");
+    emit_source_changed (item, HRN_ITEM_TYPE_VIDEO, "");
 }
 
 struct _DefaultEntry {
@@ -449,7 +364,7 @@ static void
 hrn_sidebar_item_init (HrnSidebarItem *self)
 {
     HrnSidebarItemPrivate *priv = GET_PRIVATE (self);
-    NbtkWidget *title_table;
+    ClutterActor *title_table;
     int i;
     struct _DefaultEntry default_entries[] = {
         { N_("Music"), "icon-audio", G_CALLBACK (audio_item_clicked) },
@@ -460,28 +375,29 @@ hrn_sidebar_item_init (HrnSidebarItem *s
 
     self->priv = priv;
 
-    nbtk_widget_set_style_class_name (NBTK_WIDGET (self), "HrnSidebarItem");
     clutter_actor_set_reactive (CLUTTER_ACTOR (self), TRUE);
 
-    title_table = nbtk_table_new ();
-    nbtk_table_add_actor_with_properties (NBTK_TABLE (self),
+    title_table = mx_table_new ();
+    mx_table_add_actor_with_properties (MX_TABLE (self),
                                           (ClutterActor *) title_table, 0, 0,
-                                          "x-align", 0.0,
-                                          "y-align", 0.0,
+                                          "x-align", MX_ALIGN_START,
+                                          "y-align", MX_ALIGN_START,
                                           "y-fill", FALSE,
                                           "y-expand", FALSE,
                                           NULL);
 
-    priv->title = nbtk_label_new ("");
-    nbtk_widget_set_style_class_name (NBTK_WIDGET (priv->title),
-                                      "HrnSidebarItemTitle");
-    clutter_actor_set_width (CLUTTER_ACTOR (priv->title), SIDEBAR_WIDTH - 20);
-    nbtk_table_add_actor (NBTK_TABLE (title_table),
-                          (ClutterActor *) priv->title, 0, 0);
+    priv->title = mx_label_new_with_text ("");
+    clutter_actor_set_name (priv->title, "hrn-sidebar-item-title");
+    mx_table_add_actor_with_properties (MX_TABLE (title_table),
+                                        priv->title, 0, 0,
+                                        "x-align", MX_ALIGN_START,
+                                        "x-fill", FALSE,
+                                        "x-expand", TRUE,
+                                        NULL);
 
     priv->spinner = (ClutterActor *) hrn_spinner_new (PKGDATADIR "/hrn-spinner.png");
     clutter_actor_set_size (priv->spinner, 20, 20);
-    nbtk_table_add_actor_with_properties (NBTK_TABLE (title_table),
+    mx_table_add_actor_with_properties (MX_TABLE (title_table),
                                           priv->spinner,
                                           0, 1,
                                           "x-expand", FALSE,
@@ -491,15 +407,14 @@ hrn_sidebar_item_init (HrnSidebarItem *s
                                           NULL);
     clutter_actor_hide (priv->spinner);
 
-    priv->child_grid = nbtk_grid_new ();
-    nbtk_grid_set_max_stride (NBTK_GRID (priv->child_grid), 1);
-    clutter_actor_set_width (CLUTTER_ACTOR (priv->child_grid),
-                             SIDEBAR_WIDTH - 60);
-    nbtk_table_add_actor_with_properties (NBTK_TABLE (self),
-                                          (ClutterActor *) priv->child_grid,
+    priv->child_box = mx_box_layout_new ();
+    mx_box_layout_set_orientation (MX_BOX_LAYOUT (priv->child_box), MX_ORIENTATION_VERTICAL);
+    mx_table_add_actor_with_properties (MX_TABLE (self),
+                                          (ClutterActor *) priv->child_box,
                                           1, 0,
-                                          "x-align", 0.0,
-                                          "y-align", 0.0,
+                                          "x-expand", TRUE,
+                                          "x-fill", TRUE,
+                                          "y-align", MX_ALIGN_START,
                                           "y-fill", FALSE,
                                           "y-expand", FALSE,
                                           NULL);
@@ -515,10 +430,14 @@ hrn_sidebar_item_init (HrnSidebarItem *s
                                            default_entries[i].icon,
                                            FALSE, FALSE);
 
-        clutter_container_add_actor (CLUTTER_CONTAINER (priv->child_grid),
+        clutter_container_add_actor (CLUTTER_CONTAINER (priv->child_box),
                                      CLUTTER_ACTOR (subitem));
-        nbtk_bin_set_alignment (NBTK_BIN (subitem), NBTK_ALIGN_START,
-                                NBTK_ALIGN_START);
+        clutter_container_child_set (CLUTTER_CONTAINER (priv->child_box),
+                                     CLUTTER_ACTOR (subitem),
+                                     "expand", TRUE,
+                                     NULL);
+        mx_bin_set_alignment (MX_BIN (subitem), MX_ALIGN_START,
+                              MX_ALIGN_MIDDLE);
         g_signal_connect (subitem, "clicked",
                           G_CALLBACK (default_entries[i].callback), self);
     }
@@ -527,7 +446,6 @@ hrn_sidebar_item_init (HrnSidebarItem *s
 
 HrnSidebarItem *
 hrn_sidebar_item_new (const char    *name,
-                      HrnSource     *source,
                       HrnPinManager *pin_manager)
 {
     HrnSidebarItem *item;
@@ -535,8 +453,7 @@ hrn_sidebar_item_new (const char    *nam
 
     item = g_object_new (HRN_TYPE_SIDEBAR_ITEM,
                          "pin-manager", pin_manager,
-                         "source", source,
-                         "name", name,
+                         "item-name", name,
                          NULL);
     priv = item->priv;
 
@@ -547,7 +464,7 @@ static void
 unselect_subitems (ClutterActor *actor,
                    gpointer      data)
 {
-    nbtk_button_set_checked ((NbtkButton *) actor, FALSE);
+    mx_button_set_toggled ((MxButton *) actor, FALSE);
 }
 
 void
@@ -557,7 +474,7 @@ hrn_sidebar_item_set_selected (HrnSideba
     HrnSidebarItemPrivate *priv = item->priv;
 
     if (selected == FALSE) {
-        clutter_container_foreach ((ClutterContainer *) priv->child_grid,
+        clutter_container_foreach ((ClutterContainer *) priv->child_box,
                                    unselect_subitems, item);
     }
 }
@@ -571,10 +488,10 @@ hrn_sidebar_item_select_initial (HrnSide
     /* FIXME: Getting a whole list of the children, just to use the first item
        seems a bit wasteful, but our list should be short enough that its
        not *that* much extra work */
-    children = clutter_container_get_children ((ClutterContainer *) priv->child_grid);
+    children = clutter_container_get_children ((ClutterContainer *) priv->child_box);
     if (children == NULL) {
         return;
     }
 
-    nbtk_button_set_checked ((NbtkButton *) children->data, TRUE);
+    mx_button_set_toggled ((MxButton *) children->data, TRUE);
 }
diff -pruN 1.5.1-1/src/hrn-sidebar-item-factory.c 1.8.4-1/src/hrn-sidebar-item-factory.c
--- 1.5.1-1/src/hrn-sidebar-item-factory.c	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-sidebar-item-factory.c	2010-02-17 17:26:44.000000000 +0000
@@ -1,4 +1,4 @@
-#include <nbtk/nbtk.h>
+#include <mx/mx.h>
 
 #include "hrn-sidebar.h"
 #include "hrn-sidebar-item.h"
@@ -13,9 +13,9 @@ struct _HrnSidebarItemFactoryPrivate {
 
 #define GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), HRN_TYPE_SIDEBAR_ITEM_FACTORY, HrnSidebarItemFactoryPrivate))
 
-static void item_factory_init (NbtkItemFactoryIface *iface);
+static void item_factory_init (MxItemFactoryIface *iface);
 G_DEFINE_TYPE_WITH_CODE (HrnSidebarItemFactory, hrn_sidebar_item_factory, G_TYPE_OBJECT,
-                         G_IMPLEMENT_INTERFACE (NBTK_TYPE_ITEM_FACTORY,
+                         G_IMPLEMENT_INTERFACE (MX_TYPE_ITEM_FACTORY,
                                                 item_factory_init));
 
 static void
@@ -98,7 +98,7 @@ item_destroyed (gpointer data,
 }
 
 static ClutterActor *
-create_item (NbtkItemFactory *factory)
+create_item (MxItemFactory *factory)
 {
     HrnSidebarItemFactory *item_factory = (HrnSidebarItemFactory *) factory;
     HrnSidebarItemFactoryPrivate *priv = item_factory->priv;
@@ -123,7 +123,7 @@ create_item (NbtkItemFactory *factory)
 }
 
 static void
-item_factory_init (NbtkItemFactoryIface *iface)
+item_factory_init (MxItemFactoryIface *iface)
 {
     iface->create = create_item;
 }
diff -pruN 1.5.1-1/src/hrn-sidebar-item.h 1.8.4-1/src/hrn-sidebar-item.h
--- 1.5.1-1/src/hrn-sidebar-item.h	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-sidebar-item.h	2010-02-17 17:26:44.000000000 +0000
@@ -1,10 +1,9 @@
 #ifndef __HRN_SIDEBAR_ITEM_H__
 #define __HRN_SIDEBAR_ITEM_H__
 
-#include <nbtk/nbtk.h>
+#include <mx/mx.h>
 
 #include "hrn-pin-manager.h"
-#include "hrn-source.h"
 
 G_BEGIN_DECLS
 
@@ -35,19 +34,18 @@ typedef struct _HrnSidebarItemClass HrnS
 
 struct _HrnSidebarItem
 {
-    NbtkTable parent;
+    MxTable parent;
 
     HrnSidebarItemPrivate *priv;
 };
 
 struct _HrnSidebarItemClass
 {
-    NbtkTableClass parent_class;
+    MxTableClass parent_class;
 };
 
 GType hrn_sidebar_item_get_type (void) G_GNUC_CONST;
 HrnSidebarItem *hrn_sidebar_item_new (const char    *name,
-                                      HrnSource     *source,
                                       HrnPinManager *pin_manager);
 void hrn_sidebar_item_set_selected (HrnSidebarItem *item,
                                    gboolean        selected);
diff -pruN 1.5.1-1/src/hrn-sidebar-subitem.c 1.8.4-1/src/hrn-sidebar-subitem.c
--- 1.5.1-1/src/hrn-sidebar-subitem.c	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-sidebar-subitem.c	2011-03-15 13:20:21.000000000 +0000
@@ -4,7 +4,7 @@
 #include "hrn.h"
 #include "hrn-marshal.h"
 #include "hrn-sidebar-subitem.h"
-#include "nbtk-im-label.h"
+#include "hrn-im-label.h"
 
 enum
 {
@@ -22,9 +22,9 @@ struct _HrnSidebarSubitemPrivate
 {
   char       *qname;
   char       *title;
-  NbtkWidget *label;
-  NbtkWidget *icon;
-  NbtkWidget *pin;
+  ClutterActor *label;
+  ClutterActor *icon;
+  ClutterActor *pin;
 };
 
 struct _rename_data
@@ -43,7 +43,7 @@ struct _rename_data
                              HRN_TYPE_SIDEBAR_SUBITEM, \
                              HrnSidebarSubitemPrivate))
 
-G_DEFINE_TYPE (HrnSidebarSubitem, hrn_sidebar_subitem, NBTK_TYPE_BUTTON);
+G_DEFINE_TYPE (HrnSidebarSubitem, hrn_sidebar_subitem, MX_TYPE_BUTTON);
 static guint32 signals[LAST_SIGNAL] = { 0, };
 
 static void
@@ -96,16 +96,56 @@ hrn_sidebar_subitem_get_property (GObjec
     }
 }
 
+static gboolean
+hrn_sidebar_subitem_enter_event (ClutterActor         *actor,
+                                 ClutterCrossingEvent *event)
+{
+  ClutterActor *parent;
+
+  /* Avoid changing pseudo-class if we're entering a child */
+  parent = mx_bin_get_child (MX_BIN (actor));
+
+  if (event->related &&
+      clutter_actor_get_parent (event->related) == parent)
+    return FALSE;
+
+  return CLUTTER_ACTOR_CLASS (hrn_sidebar_subitem_parent_class)->
+    enter_event (actor, event);
+}
+
+static gboolean
+hrn_sidebar_subitem_leave_event (ClutterActor         *actor,
+                                 ClutterCrossingEvent *event)
+{
+  ClutterActor *parent;
+
+  /* Avoid changing pseudo-class if we're leaving a child but
+   * still within our actor
+   */
+  parent = mx_bin_get_child (MX_BIN (actor));
+
+  if (event->related &&
+      clutter_actor_get_parent (event->related) == parent)
+    return FALSE;
+
+  return CLUTTER_ACTOR_CLASS (hrn_sidebar_subitem_parent_class)->
+    leave_event (actor, event);
+}
+
 static void
 hrn_sidebar_subitem_class_init (HrnSidebarSubitemClass *klass)
 {
   GObjectClass *o_class = (GObjectClass *) klass;
+  ClutterActorClass *actor_class = (ClutterActorClass *) klass;
 
   o_class->dispose      = hrn_sidebar_subitem_dispose;
   o_class->finalize     = hrn_sidebar_subitem_finalize;
   o_class->set_property = hrn_sidebar_subitem_set_property;
   o_class->get_property = hrn_sidebar_subitem_get_property;
 
+  actor_class->enter_event = hrn_sidebar_subitem_enter_event;
+  actor_class->leave_event = hrn_sidebar_subitem_leave_event;
+
   g_type_class_add_private (klass, sizeof (HrnSidebarSubitemPrivate));
 
   signals[PINNED] = g_signal_new ("pinned",
@@ -125,10 +165,10 @@ hrn_sidebar_subitem_class_init (HrnSideb
 }
 
 static void
-pin_clicked_cb (NbtkWidget *button, HrnSidebarSubitem *item)
+pin_clicked_cb (MxWidget *button, HrnSidebarSubitem *item)
 {
   g_signal_emit (item, signals[PINNED], 0,
-                 nbtk_button_get_checked ((NbtkButton *) button));
+                 mx_button_get_toggled ((MxButton *) button));
 }
 
 static void
@@ -164,7 +204,7 @@ rename_complete (ClutterText *label, str
     {
       clutter_actor_animate (data->shade[i], CLUTTER_LINEAR, 250,
                              "opacity", 0,
-                             "signal::completed", destroy_shade,
+                             "signal-after::completed", destroy_shade,
                              data->shade[i],
                              NULL);
     }
@@ -179,6 +219,23 @@ rename_complete (ClutterText *label, str
 }
 
 static gboolean
+hrn_actor_has_ancestor (ClutterActor *actor, ClutterActor *ancestor)
+{
+  ClutterActor *iter;
+
+  if (!actor || !ancestor)
+    return FALSE;
+  for (iter = actor;
+       iter;
+       iter = clutter_actor_get_parent (iter))
+    {
+      if (iter == ancestor)
+        return TRUE;
+    }
+  return FALSE;
+}
+
+static gboolean
 rename_capture (ClutterActor *stage, ClutterEvent        *event,
                 struct _rename_data *data)
 {
@@ -186,7 +243,7 @@ rename_capture (ClutterActor *stage, Clu
   HrnSidebarSubitemPrivate *priv = item->priv;
   ClutterActor             *text;
 
-  text = nbtk_im_label_get_clutter_text ((NbtkIMLabel *) priv->label);
+  text = hrn_im_label_get_clutter_text ((HrnIMLabel *) priv->label);
   switch (event->type)
     {
       case CLUTTER_BUTTON_RELEASE: /* clicks outside the menu makes it go away
@@ -221,10 +278,9 @@ rename_capture (ClutterActor *stage, Clu
 }
 
 static void
-rename_cb (gpointer button)
+rename_cb (MxAction *action, HrnSidebarSubitem *item)
 {
   struct _rename_data      *data;
-  HrnSidebarSubitem        *item        = (HrnSidebarSubitem *) button;
   HrnSidebarSubitemPrivate *priv        = item->priv;
   ClutterColor              shade_color = { 0x0, 0x0, 0x0, 0xff };
   ClutterStage             *stage;
@@ -252,8 +308,8 @@ rename_cb (gpointer button)
   sw = (float) ww;
   sh = (float) wh;
 
-  clutter_actor_get_transformed_position (button, &x, &y);
-  clutter_actor_get_transformed_size (button, &w, &h);
+  clutter_actor_get_transformed_position (CLUTTER_ACTOR (item), &x, &y);
+  clutter_actor_get_transformed_size (CLUTTER_ACTOR (item), &w, &h);
 
   clutter_actor_set_position (data->shade[0], x, y + h);
   clutter_actor_set_size (data->shade[0], w, sh - y - h);
@@ -270,7 +326,7 @@ rename_cb (gpointer button)
 
   data->old_focus = clutter_stage_get_key_focus (stage);
 
-  text = nbtk_im_label_get_clutter_text ((NbtkIMLabel *) priv->label);
+  text = hrn_im_label_get_clutter_text ((HrnIMLabel *) priv->label);
   clutter_text_set_editable (CLUTTER_TEXT (text), TRUE);
   clutter_text_set_single_line_mode (CLUTTER_TEXT (text), TRUE);
   clutter_text_set_activatable (CLUTTER_TEXT (text), TRUE);
@@ -282,18 +338,20 @@ rename_cb (gpointer button)
   data->grab_handler = g_signal_connect_after (stage, "captured-event",
                                                G_CALLBACK (rename_capture),
                                                data);
-  hrn_popup_close ();
 }
 
-static gpointer actions[] = { N_ ("Rename"), rename_cb, NULL };
-
 static gboolean
 query_release (ClutterActor *actor, ClutterEvent *event, gpointer button)
 {
   if (event->button.button == 3)
     {
-      hrn_popup_actor (event->button.x, event->button.y,
-                       hrn_popup_actions ((void *) actions, actor));
+      gfloat x, y;
+      x = y = 0;
+      clutter_actor_transform_stage_point (actor,
+                                           event->button.x,
+                                           event->button.y,
+                                           &x, &y);
+      mx_menu_show_with_position (MX_MENU(mx_widget_get_menu(MX_WIDGET (actor))), x, y);
       return TRUE;
     }
 
@@ -304,47 +362,52 @@ static void
 hrn_sidebar_subitem_init (HrnSidebarSubitem *self)
 {
   HrnSidebarSubitemPrivate *priv;
-  NbtkWidget               *box;
+  ClutterActor *box, *popup;
+  MxAction *action;
 
   self->priv = GET_PRIVATE (self);
   priv       = self->priv;
 
-  nbtk_widget_set_style_class_name ((NbtkWidget *) self, "HrnSidebarSubItem");
   clutter_actor_set_reactive (CLUTTER_ACTOR (self), TRUE);
-  nbtk_button_set_toggle_mode ((NbtkButton *) self, TRUE);
+  mx_button_set_is_toggle ((MxButton *) self, TRUE);
 
-  box = nbtk_grid_new ();
-  clutter_actor_set_width (CLUTTER_ACTOR (box), SIDEBAR_WIDTH);
-  clutter_container_add_actor (CLUTTER_CONTAINER (self),
-                               CLUTTER_ACTOR (box));
-  nbtk_grid_set_homogenous_rows (NBTK_GRID (box), TRUE);
-  nbtk_grid_set_valign (NBTK_GRID (box), 0.5);
-
-  priv->pin = nbtk_button_new ();
-  clutter_actor_set_size (CLUTTER_ACTOR (priv->pin), 32, 32);
-  nbtk_widget_set_style_class_name (priv->pin, "HrnSidebarPin");
-  nbtk_button_set_toggle_mode (NBTK_BUTTON (priv->pin), TRUE);
-  nbtk_button_set_checked (NBTK_BUTTON (priv->pin), TRUE);
+  box = mx_box_layout_new ();
+  mx_box_layout_set_spacing (MX_BOX_LAYOUT (box), 6);
+  clutter_container_add_actor (CLUTTER_CONTAINER (self), box);
+
+  priv->pin = mx_button_new ();
+  clutter_actor_set_name (priv->pin, "hrn-sidebar-pin");
+  mx_button_set_is_toggle (MX_BUTTON (priv->pin), TRUE);
+  mx_button_set_toggled (MX_BUTTON (priv->pin), TRUE);
   g_signal_connect (priv->pin, "clicked", G_CALLBACK (pin_clicked_cb), self);
 
-  priv->label = nbtk_im_label_new ("");
-  clutter_actor_set_width (CLUTTER_ACTOR (priv->label), SIDEBAR_WIDTH - 80);
-
-  priv->icon = nbtk_label_new ("");
-  clutter_actor_set_size (CLUTTER_ACTOR (priv->icon), 32, 32);
-  nbtk_widget_set_style_class_name (priv->icon, "HrnSidebarIcon");
-
-  clutter_container_add_actor (CLUTTER_CONTAINER (box),
-                               CLUTTER_ACTOR (priv->icon));
-  clutter_container_add_actor (CLUTTER_CONTAINER (box),
-                               CLUTTER_ACTOR (priv->label));
-  clutter_container_add_actor (CLUTTER_CONTAINER (box),
-                               CLUTTER_ACTOR (priv->pin));
+  priv->label = hrn_im_label_new ("");
+  priv->icon = mx_icon_new ();
+  clutter_actor_set_size (priv->icon, 24, 24);
+
+  clutter_container_add_actor (CLUTTER_CONTAINER (box), priv->icon);
+  clutter_container_add_actor (CLUTTER_CONTAINER (box), priv->label);
+  clutter_container_add_actor (CLUTTER_CONTAINER (box), priv->pin);
+
+  clutter_container_child_set (CLUTTER_CONTAINER (box),
+                               priv->label,
+                               "expand", TRUE,
+                               "y-fill", FALSE,
+                               NULL);
+
+  popup = mx_menu_new ();
+  action = mx_action_new_full ("Rename",
+                               _("Rename"),
+                               G_CALLBACK (rename_cb),
+                               self);
+  mx_menu_add_action (MX_MENU (popup), action);
+  mx_widget_set_menu (MX_WIDGET (self), MX_MENU (popup));
 }
 
 HrnSidebarSubitem *
 hrn_sidebar_subitem_new (const char *qname,
-                         const char *title, const char *iconname,
+                         const char *title,
+                         const char *iconname,
                          gboolean show_pin,
                          gboolean can_rename)
 {
@@ -358,7 +421,7 @@ hrn_sidebar_subitem_new (const char *qna
     priv->qname = g_strdup (qname);
 
   priv->title = g_strdup (title);
-  nbtk_im_label_set_text (NBTK_IM_LABEL (priv->label), title);
+  hrn_im_label_set_text (HRN_IM_LABEL (priv->label), title);
 
   clutter_actor_set_name (CLUTTER_ACTOR (priv->icon), iconname);
 
diff -pruN 1.5.1-1/src/hrn-sidebar-subitem.h 1.8.4-1/src/hrn-sidebar-subitem.h
--- 1.5.1-1/src/hrn-sidebar-subitem.h	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-sidebar-subitem.h	2010-02-17 17:26:44.000000000 +0000
@@ -1,7 +1,7 @@
 #ifndef __HRN_SIDEBAR_SUBITEM_H__
 #define __HRN_SIDEBAR_SUBITEM_H__
 
-#include <nbtk/nbtk.h>
+#include <mx/mx.h>
 
 G_BEGIN_DECLS
 
@@ -32,14 +32,14 @@ typedef struct _HrnSidebarSubitemClass H
 
 struct _HrnSidebarSubitem
 {
-  NbtkButton parent;
+  MxButton parent;
 
   HrnSidebarSubitemPrivate *priv;
 };
 
 struct _HrnSidebarSubitemClass
 {
-  NbtkButtonClass parent_class;
+  MxButtonClass parent_class;
 };
 
 GType              hrn_sidebar_subitem_get_type (void) G_GNUC_CONST;
diff -pruN 1.5.1-1/src/hrn-source.c 1.8.4-1/src/hrn-source.c
--- 1.5.1-1/src/hrn-source.c	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-source.c	2010-02-17 17:26:44.000000000 +0000
@@ -197,17 +197,21 @@ static void
 insert_item (HrnSource *source,
              BklItem   *item)
 {
+#if 0
   HrnSourcePrivate *priv = source->priv;
 
   hrn_cluster_tree_add_item (priv->tree, item);
   g_hash_table_insert (priv->uri_to_item,
                        (char *) bkl_item_get_uri (item), item);
+#endif
 }
 
 static void
-uri_added_cb (BklSourceClient *client, const char      *uri,
+uri_added_cb (BklSourceClient *client,
+              const char      *uri,
               HrnSource       *source)
 {
+#if 0
   HrnSourcePrivate *priv = source->priv;
   BklItem          *item;
   GError           *error = NULL;
@@ -226,6 +230,7 @@ uri_added_cb (BklSourceClient *client, c
      as the signals are really emitted
      on the tree */
   g_signal_emit (source, signals[ITEM_ADDED], 0, item);
+#endif
 }
 
 static void
@@ -233,6 +238,7 @@ uri_removed_cb (BklSourceClient *client,
                 const char      *uri,
                 HrnSource       *source)
 {
+#if 0
   HrnSourcePrivate *priv = source->priv;
   BklItem          *item;
 
@@ -247,6 +253,7 @@ uri_removed_cb (BklSourceClient *client,
      as the hash table will unref the item */
   g_signal_emit (source, signals[ITEM_REMOVED], 0, item);
   g_hash_table_remove (priv->uri_to_item, uri);
+#endif
 }
 
 static int
@@ -263,6 +270,7 @@ index_changed_cb (BklSourceClient *clien
                   const char     **removed,
                   HrnSource       *source)
 {
+#if 0
     GSequenceIter *iter;
     int i;
 
@@ -287,6 +295,7 @@ index_changed_cb (BklSourceClient *clien
     }
 
     /* FIXME: Should update the search here */
+#endif
 }
 
 static void
@@ -352,11 +361,13 @@ hrn_source_new (BklSourceClient *client)
 
   priv->tree = hrn_cluster_tree_new ();
   for (i = 0; i < items->len; i++) {
+#if 0
       BklItem *item = items->pdata[i];
 
       g_hash_table_insert (priv->uri_to_item,
                            (char *) bkl_item_get_uri (item), item);
       hrn_cluster_tree_add_item (priv->tree, item);
+#endif
   }
 
   /* hrn_cluster_tree_dump_items (priv->tree); */
@@ -652,6 +663,7 @@ hrn_source_filter (HrnSource   *source,
   GPtrArray *possible_results;
   int i;
 
+  g_debug ("Filter: %s", text);
   if (text == NULL || *text == '\0') {
       hrn_cluster_tree_filter_items (priv->tree, NULL);
       return;
diff -pruN 1.5.1-1/src/hrn-source-manager.c 1.8.4-1/src/hrn-source-manager.c
--- 1.5.1-1/src/hrn-source-manager.c	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-source-manager.c	2010-02-17 17:26:44.000000000 +0000
@@ -236,12 +236,6 @@ hrn_source_manager_init (HrnSourceManage
     self->priv = priv;
 
     priv->manager = g_object_new (BKL_TYPE_SOURCE_MANAGER_CLIENT, NULL);
-    g_signal_connect (priv->manager, "ready",
-                      G_CALLBACK (bkl_manager_ready_cb), self);
-    g_signal_connect (priv->manager, "source-added",
-                      G_CALLBACK (source_added_cb), self);
-    g_signal_connect (priv->manager, "source-removed",
-                      G_CALLBACK (source_removed_cb), self);
 }
 
 HrnSource *
@@ -264,6 +258,7 @@ HrnSource *
 hrn_source_manager_get_source_for_path (HrnSourceManager *manager,
                                         const char       *path)
 {
+#if 0
     HrnSourceManagerPrivate *priv = manager->priv;
     GList *s;
 
@@ -274,7 +269,7 @@ hrn_source_manager_get_source_for_path (
             return source;
         }
     }
-
+#endif
     return NULL;
 }
 
@@ -283,6 +278,7 @@ hrn_source_manager_get_item_for_uri (Hrn
                                      const char       *uri,
                                      HrnSource       **ret_source)
 {
+#if 0
     HrnSourceManagerPrivate *priv = manager->priv;
     BklItem *item = NULL;
     GList   *s;
@@ -312,18 +308,20 @@ hrn_source_manager_get_item_for_uri (Hrn
     if (ret_source) {
         *ret_source = NULL;
     }
+#endif
     return NULL;
 }
 
 gboolean
 hrn_source_manager_is_ready (HrnSourceManager *manager)
 {
+#if 0
     HrnSourceManagerPrivate *priv = manager->priv;
 
     if (priv->source_replies == priv->source_count &&
         priv->local_source != NULL) {
         return TRUE;
     }
-
+#endif
     return FALSE;
 }
diff -pruN 1.5.1-1/src/hrn-spinner.c 1.8.4-1/src/hrn-spinner.c
--- 1.5.1-1/src/hrn-spinner.c	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-spinner.c	2011-03-15 13:20:21.000000000 +0000
@@ -13,7 +13,7 @@ struct _HrnSpinnerPrivate {
 };
 
 #define GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), HRN_TYPE_SPINNER, HrnSpinnerPrivate))
-G_DEFINE_TYPE (HrnSpinner, hrn_spinner, NBTK_TYPE_WIDGET);
+G_DEFINE_TYPE (HrnSpinner, hrn_spinner, MX_TYPE_WIDGET);
 
 static void
 hrn_spinner_finalize (GObject *object)
@@ -21,8 +21,8 @@ hrn_spinner_finalize (GObject *object)
     HrnSpinner *self = (HrnSpinner *) object;
     HrnSpinnerPrivate *priv = self->priv;
 
-    cogl_material_unref (priv->material);
-    cogl_texture_unref (priv->texture);
+    cogl_handle_unref (priv->material);
+    cogl_handle_unref (priv->texture);
 
     G_OBJECT_CLASS (hrn_spinner_parent_class)->finalize (object);
 }
@@ -76,13 +76,13 @@ hrn_spinner_paint (ClutterActor *actor)
 {
     HrnSpinner *spinner = (HrnSpinner *) actor;
     HrnSpinnerPrivate *priv = spinner->priv;
-    NbtkPadding padding;
+    MxPadding padding;
     int ox, oy;
     float tx, ty;
 
     CLUTTER_ACTOR_CLASS (hrn_spinner_parent_class)->paint (actor);
 
-    nbtk_widget_get_padding ((NbtkWidget *) actor, &padding);
+    mx_widget_get_padding ((MxWidget *) actor, &padding);
 
     cogl_push_matrix ();
     cogl_translate (padding.left, padding.top, 0);
diff -pruN 1.5.1-1/src/hrn-spinner.h 1.8.4-1/src/hrn-spinner.h
--- 1.5.1-1/src/hrn-spinner.h	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-spinner.h	2010-02-17 17:26:44.000000000 +0000
@@ -1,7 +1,7 @@
 #ifndef __HRN_SPINNER_H__
 #define __HRN_SPINNER_H__
 
-#include <nbtk/nbtk.h>
+#include <mx/mx.h>
 
 
 G_BEGIN_DECLS
@@ -33,14 +33,14 @@ typedef struct _HrnSpinnerClass HrnSpinn
 
 struct _HrnSpinner
 {
-    NbtkWidget parent;
+    MxWidget parent;
 
     HrnSpinnerPrivate *priv;
 };
 
 struct _HrnSpinnerClass
 {
-    NbtkWidgetClass parent_class;
+    MxWidgetClass parent_class;
 };
 
 GType hrn_spinner_get_type (void) G_GNUC_CONST;
diff -pruN 1.5.1-1/src/hrn-square-clone.c 1.8.4-1/src/hrn-square-clone.c
--- 1.5.1-1/src/hrn-square-clone.c	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-square-clone.c	2011-03-15 13:20:21.000000000 +0000
@@ -134,7 +134,7 @@ hrn_square_clone_unrealize (ClutterActor
         return;
     }
 
-    cogl_material_unref (priv->material);
+    cogl_handle_unref (priv->material);
     priv->material = COGL_INVALID_HANDLE;
 
     CLUTTER_ACTOR_UNSET_FLAGS (self, CLUTTER_ACTOR_REALIZED);
@@ -280,7 +280,7 @@ hrn_square_clone_dispose (GObject *gobje
     }
 
     if (priv->material) {
-        cogl_material_unref (priv->material);
+        cogl_handle_unref (priv->material);
         priv->material = COGL_INVALID_HANDLE;
     }
 
diff -pruN 1.5.1-1/src/hrn-state-manager.c 1.8.4-1/src/hrn-state-manager.c
--- 1.5.1-1/src/hrn-state-manager.c	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-state-manager.c	2010-02-17 17:26:44.000000000 +0000
@@ -1,6 +1,7 @@
 #include <glib.h>
 #include <bognor/br-iface-player.h>
 
+#include "hrn-item.h"
 #include "hrn-state-manager.h"
 #include "hrn.h"
 
@@ -142,7 +143,7 @@ load_old_state (HrnStateManager *self)
          * stack view so we make it the default */
         priv->query = NULL;
         priv->zoom = 1.0;
-        priv->filter = BKL_ITEM_TYPE_AUDIO;
+        priv->filter = HRN_ITEM_TYPE_AUDIO;
         priv->source = NULL;
 
         return;
@@ -175,7 +176,7 @@ load_old_state (HrnStateManager *self)
         g_error_free (error);
         error = NULL;
 
-        priv->filter = BKL_ITEM_TYPE_AUDIO;
+        priv->filter = HRN_ITEM_TYPE_AUDIO;
     }
 
     priv->source = g_key_file_get_string (keyfile, "last-state", "source",
diff -pruN 1.5.1-1/src/hrn-texture-cache.c 1.8.4-1/src/hrn-texture-cache.c
--- 1.5.1-1/src/hrn-texture-cache.c	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-texture-cache.c	2010-02-17 17:26:44.000000000 +0000
@@ -1,6 +1,7 @@
 #include "hrn.h"
 #include "hrn-texture-cache.h"
 #include "hrn-square-clone.h"
+#include "hrn-thumbnailer.h"
 
 enum {
     PROP_0,
@@ -8,6 +9,7 @@ enum {
 
 struct _HrnTextureCachePrivate {
     GHashTable *cache;
+    HrnThumbnailer *thumbnailer;
 };
 
 typedef struct _HrnCacheEntry {
@@ -64,10 +66,12 @@ static void
 hrn_texture_cache_init (HrnTextureCache *self)
 {
     HrnTextureCachePrivate *priv = GET_PRIVATE (self);
+
     self->priv = priv;
 
     priv->cache = g_hash_table_new_full (g_str_hash, g_str_equal,
                                          g_free, free_cache_entry);
+    priv->thumbnailer = g_object_new (HRN_TYPE_THUMBNAILER, NULL);
 }
 
 HrnTextureCache *
@@ -161,24 +165,24 @@ create_default (const char *path)
 
 ClutterActor *
 hrn_texture_cache_get_default_texture (HrnTextureCache *cache,
-                                       BklItemType      type)
+                                       HrnItemType      type)
 {
     switch (type) {
-    case BKL_ITEM_TYPE_AUDIO:
+    case HRN_ITEM_TYPE_AUDIO:
         if (G_UNLIKELY (default_audio == NULL)) {
             default_audio = create_default (THEMEDIR "/hrn-generic-album.png");
         }
 
         return clutter_clone_new (default_audio);
 
-    case BKL_ITEM_TYPE_IMAGE:
+    case HRN_ITEM_TYPE_IMAGE:
         if (G_UNLIKELY (default_image == NULL)) {
-            default_image = create_default (THEMEDIR "/hrn-generic-image.png");
+            default_image = create_default (THEMEDIR "/hrn-generic-images.png");
         }
 
         return clutter_clone_new (default_image);
 
-    case BKL_ITEM_TYPE_VIDEO:
+    case HRN_ITEM_TYPE_VIDEO:
         if (G_UNLIKELY (default_video == NULL)) {
             default_video = create_default (THEMEDIR "/hrn-generic-video.png");
         }
@@ -191,3 +195,352 @@ hrn_texture_cache_get_default_texture (H
 
     return NULL;
 }
+
+static gboolean
+strip_find_next_block (const char    *original,
+                       const gunichar open_char,
+                       const gunichar close_char,
+                       int           *open_pos,
+                       int           *close_pos)
+{
+    const char *p1, *p2;
+
+    if (open_pos) {
+        *open_pos = -1;
+    }
+
+    if (close_pos) {
+        *close_pos = -1;
+    }
+
+    p1 = g_utf8_strchr (original, -1, open_char);
+    if (p1) {
+        if (open_pos) {
+            *open_pos = p1 - original;
+        }
+
+        p2 = g_utf8_strchr (g_utf8_next_char (p1), -1, close_char);
+        if (p2) {
+            if (close_pos) {
+                *close_pos = p2 - original;
+            }
+
+            return TRUE;
+        }
+    }
+
+    return FALSE;
+}
+
+char *
+albumart_strip_invalid_entities (const char *original)
+{
+    GString *str_no_blocks;
+    char **strv;
+    char *str;
+    gboolean blocks_done = FALSE;
+    const char *p;
+    const char *invalid_chars = "()[]<>{}_!@#$^&*+=|\\/\"'?~";
+    const char *invalid_chars_delimiter = "*";
+    const char *convert_chars = "\t";
+    const char *convert_chars_delimiter = " ";
+    const gunichar blocks[5][2] = {
+        { '(', ')' },
+        { '{', '}' },
+        { '[', ']' },
+        { '<', '>' },
+        {  0,   0  }
+    };
+
+    str_no_blocks = g_string_new ("");
+
+    p = original;
+
+    while (!blocks_done) {
+        gint pos1, pos2, i;
+
+        pos1 = -1;
+        pos2 = -1;
+
+        for (i = 0; blocks[i][0] != 0; i++) {
+            gint start, end;
+
+            /* Go through blocks, find the earliest block we can */
+            if (strip_find_next_block (p, blocks[i][0], blocks[i][1], &start, &end)) {
+                if (pos1 == -1 || start < pos1) {
+                    pos1 = start;
+                    pos2 = end;
+                }
+            }
+        }
+
+        /* If either are -1 we didn't find any */
+        if (pos1 == -1) {
+            /* This means no blocks were found */
+            g_string_append (str_no_blocks, p);
+            blocks_done = TRUE;
+        } else {
+            /* Append the test BEFORE the block */
+            if (pos1 > 0) {
+                g_string_append_len (str_no_blocks, p, pos1);
+            }
+
+            p = g_utf8_next_char (p + pos2);
+
+            /* Do same again for position AFTER block */
+            if (*p == '\0') {
+                blocks_done = TRUE;
+            }
+        }
+    }
+
+    str = g_string_free (str_no_blocks, FALSE);
+
+    /* Now strip invalid chars */
+    g_strdelimit (str, invalid_chars, *invalid_chars_delimiter);
+    strv = g_strsplit (str, invalid_chars_delimiter, -1);
+    g_free (str);
+    str = g_strjoinv (NULL, strv);
+    g_strfreev (strv);
+
+    /* Now convert chars */
+    g_strdelimit (str, convert_chars, *convert_chars_delimiter);
+    strv = g_strsplit (str, convert_chars_delimiter, -1);
+    g_free (str);
+    str = g_strjoinv (convert_chars_delimiter, strv);
+    g_strfreev (strv);
+
+    /* Now remove double spaces */
+    strv = g_strsplit (str, "  ", -1);
+    g_free (str);
+    str = g_strjoinv (" ", strv);
+    g_strfreev (strv);
+
+    /* Now strip leading/trailing white space */
+    g_strstrip (str);
+
+    return str;
+}
+
+static char *
+checksum_string (const char *string)
+{
+    GChecksum *checksum;
+    char *sum;
+
+    checksum = g_checksum_new (G_CHECKSUM_MD5);
+    g_checksum_update (checksum, (const guchar *) string, -1);
+    sum = g_strdup (g_checksum_get_string (checksum));
+    g_checksum_free (checksum);
+
+    return sum;
+}
+
+static char *
+generate_thumbnail_uri (const char *uri)
+{
+    GChecksum *checksum;
+    char *retval;
+
+    checksum = g_checksum_new (G_CHECKSUM_MD5);
+    g_checksum_update (checksum, (const guchar *) uri, -1);
+    retval = g_strdup_printf ("file://%s/.thumbnails/large/%s.png",
+                              g_get_home_dir (),
+                              g_checksum_get_string (checksum));
+    g_checksum_free (checksum);
+
+    return retval;
+}
+
+static ClutterActor *
+request_thumbnail_for_uri (HrnTextureCache *cache,
+                           const char      *uri,
+                           const char      *mimetype)
+{
+    HrnTextureCachePrivate *priv = cache->priv;
+    HrnCacheEntry *entry;
+    ClutterActor *texture, *clone;
+    char *thumbnail_uri;
+
+    thumbnail_uri = generate_thumbnail_uri (uri);
+    if (g_file_test (thumbnail_uri + 7, G_FILE_TEST_EXISTS)) {
+        texture = hrn_texture_cache_get_texture (cache, thumbnail_uri);
+
+        g_free (thumbnail_uri);
+        return texture;
+    }
+
+    entry = g_hash_table_lookup (priv->cache, thumbnail_uri);
+    if (entry) {
+        clone = hrn_square_clone_new ((ClutterTexture *) entry->original);
+        entry->clone_count++;
+
+        g_object_weak_ref (G_OBJECT (clone), on_clone_finalized, entry);
+
+        g_free (thumbnail_uri);
+        return clone;
+    }
+
+    texture = clutter_texture_new ();
+    clutter_texture_set_filter_quality ((ClutterTexture *) texture,
+                                        CLUTTER_TEXTURE_QUALITY_MEDIUM);
+    clutter_texture_set_load_async ((ClutterTexture *) texture, TRUE);
+
+    hrn_thumbnailer_request (priv->thumbnailer, uri, mimetype, texture);
+
+    entry = g_slice_new (HrnCacheEntry);
+    entry->original = texture;
+    entry->clone_count = 0;
+    g_object_ref_sink (texture);
+
+    g_hash_table_insert (priv->cache, thumbnail_uri, entry);
+
+    clone = hrn_square_clone_new ((ClutterTexture *) entry->original);
+    entry->clone_count++;
+
+    g_object_weak_ref (G_OBJECT (clone), on_clone_finalized, entry);
+
+    return clone;
+}
+
+ClutterActor *
+hrn_texture_cache_get_texture_for_album (HrnTextureCache *cache,
+                                         const char      *artist,
+                                         const char      *album)
+{
+    ClutterActor *texture;
+    char *b, *c, *artist_esc, *album_esc, *art_d, *alb_d;
+    char *dir, *filename;
+
+    artist_esc = artist ? albumart_strip_invalid_entities (artist) : g_strdup (" ");
+    album_esc = album ? albumart_strip_invalid_entities (album) : g_strdup (" ");
+
+    art_d = g_utf8_strdown (artist_esc, -1);
+    alb_d = g_utf8_strdown (album_esc, -1);
+    g_free (artist_esc);
+    g_free (album_esc);
+
+    dir = g_build_filename (g_get_user_cache_dir (), "media-art", NULL);
+    if (!g_file_test (dir, G_FILE_TEST_EXISTS)) {
+        g_mkdir_with_parents (dir, 0770);
+
+        /* if the directory didn't exist, then the art won't either */
+        g_free (dir);
+        return hrn_texture_cache_get_default_texture (cache,
+                                                      HRN_ITEM_TYPE_AUDIO);
+    }
+
+    b = checksum_string (art_d);
+    c = checksum_string (alb_d);
+    g_free (art_d);
+    g_free (alb_d);
+
+    filename = g_strdup_printf ("file://%s/album-%s-%s.jpeg", dir, b, c);
+    g_free (dir);
+    g_free (b);
+    g_free (c);
+
+    if (g_file_test (filename + 7, G_FILE_TEST_EXISTS) == FALSE) {
+        g_free (filename);
+        return hrn_texture_cache_get_default_texture (cache,
+                                                      HRN_ITEM_TYPE_AUDIO);
+    }
+
+    texture = request_thumbnail_for_uri (cache, filename, "image/jpeg");
+
+    return texture;
+}
+
+ClutterActor *
+hrn_texture_cache_get_texture_for_item (HrnTextureCache *cache,
+                                        HrnItem         *item)
+{
+    ClutterActor *texture;
+    const char *album, *artist;
+
+    switch (hrn_item_get_item_type (item)) {
+    case HRN_ITEM_TYPE_AUDIO:
+        album = hrn_item_get_metadata (item, HRN_ITEM_METADATA_ALBUM);
+        artist = hrn_item_get_metadata (item, HRN_ITEM_METADATA_ARTIST);
+
+        texture = hrn_texture_cache_get_texture_for_album (cache, artist,
+                                                           album);
+        return texture;
+
+    case HRN_ITEM_TYPE_IMAGE:
+    case HRN_ITEM_TYPE_VIDEO:
+        texture = request_thumbnail_for_uri (cache, hrn_item_get_uri (item),
+                                             hrn_item_get_mimetype (item));
+        return texture;
+
+    default:
+        return NULL;
+    }
+
+    return NULL;
+}
+
+ClutterActor *
+hrn_texture_cache_get_texture_for_artist (HrnTextureCache *cache,
+                                          const char      *artist)
+{
+    ClutterActor *texture;
+    const char *dname;
+    char *b, *artist_esc, *art_d;
+    char *dir, *filename = NULL;
+    GError *error = NULL;
+    GDir *d;
+
+    artist_esc = artist ? albumart_strip_invalid_entities (artist) : g_strdup (" ");
+
+    art_d = g_utf8_strdown (artist_esc, -1);
+    g_free (artist_esc);
+
+    dir = g_build_filename (g_get_user_cache_dir (), "media-art", NULL);
+    if (!g_file_test (dir, G_FILE_TEST_EXISTS)) {
+        g_mkdir_with_parents (dir, 0770);
+
+        /* if the directory didn't exist, then the art won't either */
+        g_free (dir);
+        return hrn_texture_cache_get_default_texture (cache,
+                                                      HRN_ITEM_TYPE_AUDIO);
+    }
+
+    d = g_dir_open (dir, 0, &error);
+    if (d == NULL) {
+        g_warning ("Error scanning dir for %s: %s\n", artist, error->message);
+        g_error_free (error);
+        g_free (dir);
+
+        return hrn_texture_cache_get_default_texture (cache,
+                                                      HRN_ITEM_TYPE_AUDIO);
+    }
+
+    b = checksum_string (art_d);
+    g_free (art_d);
+
+    /* FIXME: There's got to be a better way to do this than scan the dir
+       every time - maybe modify the MediaArtSpec, use artist- prefix and
+       encode artist without the album name. Ask another daemon to get it? */
+    while ((dname = g_dir_read_name (d))) {
+        if (strncmp (dname, "album-", 6) == 0) {
+            if (strncmp (dname + 6, b, 32) == 0) {
+                filename = g_strdup_printf ("file://%s/%s", dir, dname);
+                break;
+            }
+        }
+    }
+
+    g_dir_close (d);
+    g_free (dir);
+    g_free (b);
+
+    if (filename == NULL) {
+        return hrn_texture_cache_get_default_texture (cache,
+                                                      HRN_ITEM_TYPE_AUDIO);
+    }
+
+    texture = request_thumbnail_for_uri (cache, filename, "image/jpeg");
+
+    return texture;
+}
diff -pruN 1.5.1-1/src/hrn-texture-cache.h 1.8.4-1/src/hrn-texture-cache.h
--- 1.5.1-1/src/hrn-texture-cache.h	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-texture-cache.h	2010-02-17 17:26:44.000000000 +0000
@@ -2,7 +2,6 @@
 #define __HRN_TEXTURE_CACHE_H__
 
 #include <glib-object.h>
-#include <bickley/bkl-item.h>
 #include <clutter/clutter.h>
 
 G_BEGIN_DECLS
@@ -49,7 +48,14 @@ HrnTextureCache *hrn_texture_cache_get_d
 ClutterActor *hrn_texture_cache_get_texture (HrnTextureCache *cache,
                                              const char      *uri);
 ClutterActor *hrn_texture_cache_get_default_texture (HrnTextureCache *cache,
-                                                     BklItemType      type);
+                                                     HrnItemType      type);
+ClutterActor *hrn_texture_cache_get_texture_for_album (HrnTextureCache *cache,
+                                                       const char      *artist,
+                                                       const char      *album);
+ClutterActor *hrn_texture_cache_get_texture_for_item (HrnTextureCache *cache,
+                                                      HrnItem         *item);
+ClutterActor *hrn_texture_cache_get_texture_for_artist (HrnTextureCache *cache,
+                                                        const char      *artist);
 
 G_END_DECLS
 
diff -pruN 1.5.1-1/src/hrn-texture-frame.c 1.8.4-1/src/hrn-texture-frame.c
--- 1.5.1-1/src/hrn-texture-frame.c	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-texture-frame.c	2011-03-15 13:20:21.000000000 +0000
@@ -153,7 +153,7 @@ hrn_texture_frame_unrealize (ClutterActo
   if (priv->material == COGL_INVALID_HANDLE)
     return;
 
-  cogl_material_unref (priv->material);
+  cogl_handle_unref (priv->material);
   priv->material = COGL_INVALID_HANDLE;
 
   CLUTTER_ACTOR_UNSET_FLAGS (self, CLUTTER_ACTOR_REALIZED);
@@ -483,7 +483,7 @@ hrn_texture_frame_dispose (GObject *gobj
 
   if (priv->material)
     {
-      cogl_material_unref (priv->material);
+      cogl_handle_unref (priv->material);
       priv->material = COGL_INVALID_HANDLE;
     }
 
diff -pruN 1.5.1-1/src/hrn-theatre.c 1.8.4-1/src/hrn-theatre.c
--- 1.5.1-1/src/hrn-theatre.c	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-theatre.c	2010-02-17 17:26:44.000000000 +0000
@@ -6,6 +6,7 @@
 #include <clutter-gst/clutter-gst.h>
 #endif
 #include "hrn.h"
+#include "hrn-item.h"
 #include "hrn-state-manager.h"
 #include "hrn-theatre.h"
 #include "hrn-iface-player.h"
@@ -29,7 +30,7 @@ struct _HrnTheatrePrivate
   ClutterActor *backdrop;
 
   ClutterActor *player;
-  BklItemType   player_type;
+  HrnItemType   player_type;
 
   guint32 progress_id;
 
@@ -223,7 +224,7 @@ make_video_player (HrnTheatre *theatre)
     HrnTheatrePrivate *priv = theatre->priv;
 
     priv->player      = g_object_new (HRN_TYPE_VIDEO_PLAYER, NULL);
-    priv->player_type = BKL_ITEM_TYPE_VIDEO;
+    priv->player_type = HRN_ITEM_TYPE_VIDEO;
     priv->progress_id = g_signal_connect (priv->player, "position-changed",
                                           G_CALLBACK (player_position_changed),
                                           theatre);
@@ -242,7 +243,7 @@ make_image_player (HrnTheatre *theatre)
     HrnTheatrePrivate *priv = theatre->priv;
 
     priv->player = g_object_new (HRN_TYPE_IMAGE_PLAYER, NULL);
-    priv->player_type = BKL_ITEM_TYPE_IMAGE;
+    priv->player_type = HRN_ITEM_TYPE_IMAGE;
     priv->progress_id = 0;
     g_signal_connect (priv->player, "eos",
                       G_CALLBACK (player_eos), theatre);
@@ -261,19 +262,19 @@ hrn_theatre_new (HrnStateManager *state)
 
 static void
 theatre_show (HrnTheatre *theatre,
-              BklItem    *item,
+              HrnItem    *item,
               const char *uri,
-              BklItemType type)
+              HrnItemType type)
 {
     HrnTheatrePrivate *priv = theatre->priv;
 
     switch (type) {
-    case BKL_ITEM_TYPE_AUDIO:
+    case HRN_ITEM_TYPE_AUDIO:
         g_warning ("HrnTheatre does not play audio file %s", uri);
         return;
 
-    case BKL_ITEM_TYPE_IMAGE:
-        if (priv->player == NULL || priv->player_type != BKL_ITEM_TYPE_IMAGE) {
+    case HRN_ITEM_TYPE_IMAGE:
+        if (priv->player == NULL || priv->player_type != HRN_ITEM_TYPE_IMAGE) {
             if (priv->player) {
                 clutter_actor_destroy (priv->player);
             }
@@ -282,8 +283,8 @@ theatre_show (HrnTheatre *theatre,
 
         break;
 
-    case BKL_ITEM_TYPE_VIDEO:
-        if (priv->player == NULL || priv->player_type != BKL_ITEM_TYPE_VIDEO) {
+    case HRN_ITEM_TYPE_VIDEO:
+        if (priv->player == NULL || priv->player_type != HRN_ITEM_TYPE_VIDEO) {
             if (priv->player) {
                 clutter_actor_destroy (priv->player);
             }
@@ -305,12 +306,12 @@ theatre_show (HrnTheatre *theatre,
 
 void
 hrn_theatre_show_item (HrnTheatre *theatre,
-                       BklItem    *item)
+                       HrnItem    *item)
 {
-    theatre_show (theatre, item, bkl_item_get_uri (item),
-                  bkl_item_get_item_type (item));
+    theatre_show (theatre, item, hrn_item_get_uri (item),
+                  hrn_item_get_item_type (item));
 
-    hrn_add_recent_uri (bkl_item_get_uri (item), bkl_item_get_mimetype (item));
+    hrn_add_recent_uri (hrn_item_get_uri (item), hrn_item_get_mimetype (item));
 }
 
 void
@@ -319,7 +320,7 @@ hrn_theatre_show_uri (HrnTheatre *theatr
                       const char *mimetype)
 {
     HrnTheatrePrivate *priv = theatre->priv;
-    BklItemType type;
+    HrnItemType        type;
 
     if (uri == NULL) {
         if (priv->player) {
@@ -331,11 +332,11 @@ hrn_theatre_show_uri (HrnTheatre *theatr
     }
 
     if (g_str_has_prefix (mimetype, "audio/")) {
-        type = BKL_ITEM_TYPE_AUDIO;
+        type = HRN_ITEM_TYPE_AUDIO;
     } else if (g_str_has_prefix (mimetype, "image/")) {
-        type = BKL_ITEM_TYPE_IMAGE;
+        type = HRN_ITEM_TYPE_IMAGE;
     } else if (g_str_has_prefix (mimetype, "video/")) {
-        type = BKL_ITEM_TYPE_VIDEO;
+        type = HRN_ITEM_TYPE_VIDEO;
     } else {
         return;
     }
diff -pruN 1.5.1-1/src/hrn-theatre.h 1.8.4-1/src/hrn-theatre.h
--- 1.5.1-1/src/hrn-theatre.h	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-theatre.h	2010-02-17 17:26:44.000000000 +0000
@@ -51,7 +51,7 @@ void        hrn_theatre_hide       (HrnT
 void hrn_theatre_set_image_slideshow (HrnTheatre *theatre,
                                       gboolean    enabled);
 void hrn_theatre_show_item (HrnTheatre *theatre,
-                            BklItem    *item);
+                            HrnItem    *item);
 void hrn_theatre_show_uri (HrnTheatre *theatre,
                            const char *uri,
                            const char *mimetype);
diff -pruN 1.5.1-1/src/hrn-theatre-ui.c 1.8.4-1/src/hrn-theatre-ui.c
--- 1.5.1-1/src/hrn-theatre-ui.c	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-theatre-ui.c	2010-02-17 17:26:44.000000000 +0000
@@ -23,14 +23,14 @@ struct _HrnTheatreUiPrivate {
 
     gboolean playing;
     gboolean playing_when_focused;
-    gboolean audio_was_playing;
+    BrQueueState audio_state;
 
     HrnTheatre *theatre;
     HrnControls *controls;
     guint32 play_change_id;
     guint32 position_change_id;
 
-    NbtkWidget *leave_button;
+    ClutterActor *leave_button;
 
     guint32 controls_hide_handler_id;
     gboolean in_controls;
@@ -92,7 +92,7 @@ hrn_theatre_ui_allocate (ClutterActor   
 {
     HrnTheatreUi *ui = (HrnTheatreUi *) actor;
     HrnTheatreUiPrivate *priv = ui->priv;
-    float width, height;
+    gfloat width, height, cheight;
 
     CLUTTER_ACTOR_CLASS (hrn_theatre_ui_parent_class)->allocate
         (actor, box, flags);
@@ -100,9 +100,11 @@ hrn_theatre_ui_allocate (ClutterActor   
     width = box->x2 - box->x1;
     height = box->y2 - box->y1;
 
+    clutter_actor_get_preferred_height (CLUTTER_ACTOR (priv->controls),
+                                        -1, NULL, &cheight);
     clutter_actor_set_position ((ClutterActor *) priv->controls,
-                                0, height - 60);
-    clutter_actor_set_size ((ClutterActor *) priv->controls, width, 60);
+                                0, height - cheight);
+    clutter_actor_set_width ((ClutterActor *) priv->controls, width);
     clutter_actor_set_size ((ClutterActor *) priv->theatre, width, height);
 }
 
@@ -212,9 +214,8 @@ leave_theatre (HrnTheatreUi *ui)
 {
     HrnTheatreUiPrivate *priv = ui->priv;
 
-    if (priv->audio_was_playing) {
+    if (priv->audio_state == BR_QUEUE_STATE_PLAYING) {
         br_queue_play (priv->local_queue);
-        priv->audio_was_playing = FALSE;
     }
 
     clutter_stage_show_cursor (CLUTTER_STAGE (hrn_window_get_stage (window)));
@@ -250,23 +251,23 @@ get_uri_basename (const char *uri)
 }
 
 static char *
-get_title (BklItem *item)
+get_title (HrnItem *item)
 {
-    BklItemType type;
+    HrnItemType type;
     const char *title;
 
-    type = bkl_item_get_item_type (item);
-    if (type == BKL_ITEM_TYPE_IMAGE) {
-        title = bkl_item_image_get_title ((BklItemImage *) item);
+    type = hrn_item_get_item_type (item);
+    if (type == HRN_ITEM_TYPE_IMAGE) {
+        title = hrn_item_get_metadata (item, HRN_ITEM_METADATA_TITLE);
         if (title == NULL) {
-            const char *uri = bkl_item_get_uri (item);
+            const char *uri = hrn_item_get_uri (item);
 
             return get_uri_basename (uri);
         }
 
         return g_strdup (title);
-    } else if (type == BKL_ITEM_TYPE_VIDEO) {
-        const char *uri = bkl_item_get_uri (item);
+    } else if (type == HRN_ITEM_TYPE_VIDEO) {
+        const char *uri = hrn_item_get_uri (item);
 
         return get_uri_basename (uri);
     }
@@ -275,20 +276,18 @@ get_title (BklItem *item)
 }
 
 static void
-get_playing_cb (BrQueue      *queue,
-                gboolean      playing,
-                GError       *error,
-                HrnTheatreUi *ui)
+get_state_cb (BrQueue      *queue,
+              BrQueueState  state,
+              GError       *error,
+              HrnTheatreUi *ui)
 {
     HrnTheatreUiPrivate *priv = ui->priv;
 
     if (error != NULL) {
         g_warning ("Error getting playing state: %s", error->message);
     } else {
-        priv->audio_was_playing = playing;
+        priv->audio_state = state;
     }
-
-    br_queue_stop (queue);
 }
 
 static void
@@ -297,24 +296,24 @@ show_leaf_node (HrnTheatreUi   *ui,
 {
     HrnTheatreUiPrivate *priv = ui->priv;
     char *title;
-    BklItem *item;
+    HrnItem *item;
 
     priv->current_node = leaf;
     /* FIXME: Should add a weak ref to this */
 
     if (leaf->type == HRN_CLUSTER_NODE_TYPE_IMAGE) {
-        PictureCluster *picture = (PictureCluster *) leaf->data;
+        TileCluster *tile = (TileCluster *) leaf->data;
 
-        item = picture->item;
+        item = tile->item;
         hrn_controls_show_progress (priv->controls, FALSE);
     } else if (leaf->type == HRN_CLUSTER_NODE_TYPE_VIDEO) {
-        VideoCluster *video = (VideoCluster *) leaf->data;
+        TileCluster *tile = (TileCluster *) leaf->data;
 
-        item = video->item;
+        item = tile->item;
         hrn_controls_show_progress (priv->controls, TRUE);
 
-        br_queue_get_playing (priv->local_queue,
-                              (BrQueueGetPlayingCallback) get_playing_cb, ui);
+        br_queue_get_state (priv->local_queue,
+                            (BrQueueGetStateCallback) get_state_cb, ui);
         br_queue_stop (priv->local_queue);
     } else {
         return;
@@ -334,8 +333,7 @@ show_leaf_node (HrnTheatreUi   *ui,
 }
 
 static void
-request_next_cb (HrnControls  *controls,
-                 HrnTheatreUi *ui)
+request_next (HrnTheatreUi *ui)
 {
     HrnTheatreUiPrivate *priv = ui->priv;
     HrnClusterNode *leaf;
@@ -367,8 +365,14 @@ request_next_cb (HrnControls  *controls,
 }
 
 static void
-request_previous_cb (HrnControls  *controls,
-                     HrnTheatreUi *ui)
+request_next_cb (HrnControls  *controls,
+                 HrnTheatreUi *ui)
+{
+    request_next (ui);
+}
+
+static void
+request_previous (HrnTheatreUi *ui)
 {
     HrnTheatreUiPrivate *priv = ui->priv;
     HrnClusterNode *leaf;
@@ -400,6 +404,13 @@ request_previous_cb (HrnControls  *contr
 }
 
 static void
+request_previous_cb (HrnControls  *controls,
+                     HrnTheatreUi *ui)
+{
+    request_previous (ui);
+}
+
+static void
 request_playing_change_cb (HrnControls  *controls,
                            gboolean      playing,
                            HrnTheatreUi *ui)
@@ -512,7 +523,7 @@ theatre_duration_changed_cb (HrnTheatre 
 }
 
 static void
-leave_clicked_cb (NbtkButton   *button,
+leave_clicked_cb (MxButton   *button,
                   HrnTheatreUi *ui)
 {
     leave_theatre (ui);
@@ -548,13 +559,10 @@ hrn_theatre_ui_constructor (GType       
     g_signal_connect (priv->theatre, "key-press-event",
                       G_CALLBACK (theatre_key_press_cb), ui);
 
-    priv->leave_button = nbtk_button_new ();
+    priv->leave_button = mx_button_new ();
     clutter_actor_set_name ((ClutterActor *) priv->leave_button,
                             "back-button");
     clutter_actor_set_position (CLUTTER_ACTOR (priv->leave_button), 8, 8);
-    g_object_set (G_OBJECT (priv->leave_button),
-                  "transition-duration", 100,
-                  NULL);
 
     clutter_container_add_actor (CLUTTER_CONTAINER (ui),
                                  CLUTTER_ACTOR (priv->leave_button));
@@ -831,3 +839,15 @@ hrn_theatre_ui_set_focused (HrnTheatreUi
         hrn_theatre_ui_set_playing (ui, FALSE);
     }
 }
+
+void
+hrn_theatre_ui_next (HrnTheatreUi *ui)
+{
+    request_next (ui);
+}
+
+void
+hrn_theatre_ui_previous (HrnTheatreUi *ui)
+{
+    request_previous (ui);
+}
diff -pruN 1.5.1-1/src/hrn-theatre-ui.h 1.8.4-1/src/hrn-theatre-ui.h
--- 1.5.1-1/src/hrn-theatre-ui.h	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-theatre-ui.h	2010-02-17 17:26:44.000000000 +0000
@@ -63,6 +63,9 @@ void hrn_theatre_ui_show_uri (HrnTheatre
                               const char   *mimetype);
 void hrn_theatre_ui_set_focused (HrnTheatreUi *ui,
                                  gboolean      focused);
+void hrn_theatre_ui_next (HrnTheatreUi *ui);
+void hrn_theatre_ui_previous (HrnTheatreUi *ui);
+
 
 G_END_DECLS
 
diff -pruN 1.5.1-1/src/hrn-thumbnailer.c 1.8.4-1/src/hrn-thumbnailer.c
--- 1.5.1-1/src/hrn-thumbnailer.c	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/src/hrn-thumbnailer.c	2010-02-17 17:26:44.000000000 +0000
@@ -0,0 +1,318 @@
+#include <dbus/dbus-glib.h>
+
+#include "hrn-marshal.h"
+#include "hrn-debug.h"
+#include "hrn-thumbnailer.h"
+#include "tumbler-service-dbus-glue.h"
+
+enum {
+    PROP_0,
+};
+
+enum {
+    LAST_SIGNAL,
+};
+
+struct _HrnThumbnailerPrivate {
+    DBusGProxy *thumbnailer;
+
+    guint32 request_id;
+    GPtrArray *requests;
+    GHashTable *requested;
+};
+
+typedef struct _TBRequest {
+    ClutterActor *texture;
+    char *uri;
+    char *mimetype;
+} TBRequest;
+
+#define THUMBNAILER_SERVICE "org.freedesktop.thumbnails.Thumbnailer1"
+#define THUMBNAILER_PATH "/org/freedesktop/thumbnails/Thumbnailer1"
+#define THUMBNAILER_INTERFACE "org.freedesktop.thumbnails.Thumbnailer1"
+
+#define GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), HRN_TYPE_THUMBNAILER, HrnThumbnailerPrivate))
+G_DEFINE_TYPE (HrnThumbnailer, hrn_thumbnailer, G_TYPE_OBJECT);
+#if 0
+static guint32 signals[LAST_SIGNAL] = {0,};
+#endif
+
+static void
+hrn_thumbnailer_finalize (GObject *object)
+{
+    G_OBJECT_CLASS (hrn_thumbnailer_parent_class)->finalize (object);
+}
+
+static void
+hrn_thumbnailer_dispose (GObject *object)
+{
+    G_OBJECT_CLASS (hrn_thumbnailer_parent_class)->dispose (object);
+}
+
+static void
+hrn_thumbnailer_set_property (GObject      *object,
+                              guint         prop_id,
+                              const GValue *value,
+                              GParamSpec   *pspec)
+{
+    switch (prop_id) {
+
+    default:
+        break;
+    }
+}
+
+static void
+hrn_thumbnailer_get_property (GObject    *object,
+                              guint       prop_id,
+                              GValue     *value,
+                              GParamSpec *pspec)
+{
+    switch (prop_id) {
+
+    default:
+        break;
+    }
+}
+
+static void
+hrn_thumbnailer_class_init (HrnThumbnailerClass *klass)
+{
+    GObjectClass *o_class = (GObjectClass *) klass;
+
+    o_class->dispose = hrn_thumbnailer_dispose;
+    o_class->finalize = hrn_thumbnailer_finalize;
+    o_class->set_property = hrn_thumbnailer_set_property;
+    o_class->get_property = hrn_thumbnailer_get_property;
+
+    g_type_class_add_private (klass, sizeof (HrnThumbnailerPrivate));
+}
+
+static char *
+generate_thumbnail_path (const char *uri)
+{
+    GChecksum *checksum;
+    char *retval;
+
+    checksum = g_checksum_new (G_CHECKSUM_MD5);
+    g_checksum_update (checksum, (const guchar *) uri, -1);
+    retval = g_strdup_printf ("%s/.thumbnails/large/%s.png",
+                              g_get_home_dir (),
+                              g_checksum_get_string (checksum));
+    g_checksum_free (checksum);
+
+    return retval;
+}
+
+static void
+thumbnail_error_cb (DBusGProxy     *proxy,
+                    guint           handle,
+                    const char    **uris,
+                    int             code,
+                    const char     *error,
+                    HrnThumbnailer *thumbnailer)
+{
+    HrnThumbnailerPrivate *priv = thumbnailer->priv;
+    GError *err = NULL;
+    int i;
+
+    if (uris == NULL) {
+        return;
+    }
+
+    for (i = 0; uris[i]; i++) {
+        TBRequest *request;
+
+        request = g_hash_table_lookup (priv->requested, uris[i]);
+        if (request == NULL) {
+            g_warning ("No thumbnail requested for %s", uris[i]);
+            continue;
+        }
+
+        HRN_NOTE (THUMBNAIL, "Could not generate thumbnail for %s", uris[i]);
+
+        /* FIXME: This is wasteful of texture memory */
+        if (g_str_has_prefix (request->mimetype, "audio/")) {
+            clutter_texture_set_from_file ((ClutterTexture *) request->texture,
+                                           THEMEDIR "/hrn-generic-album.png",
+                                           &err);
+        } else if (g_str_has_prefix (request->mimetype, "image/")) {
+            clutter_texture_set_from_file ((ClutterTexture *) request->texture,
+                                           THEMEDIR "/hrn-generic-images.png",
+                                           &err);
+        } else if (g_str_has_prefix (request->mimetype, "video/")) {
+            clutter_texture_set_from_file ((ClutterTexture *) request->texture,
+                                           THEMEDIR "/hrn-generic-video.png",
+                                           &err);
+        }
+
+        if (err != NULL) {
+            g_warning ("Error setting fallback for %s: %s",
+                       request->uri, err->message);
+            g_error_free (err);
+            err = NULL;
+        }
+
+        g_hash_table_remove (priv->requested, uris[i]);
+        g_object_unref (request->texture);
+        g_free (request->uri);
+        g_free (request->mimetype);
+        g_slice_free (TBRequest, request);
+    }
+}
+
+static void
+thumbnail_ready_cb (DBusGProxy     *proxy,
+                    guint           handle,
+                    const char    **uris,
+                    HrnThumbnailer *thumbnailer)
+{
+    HrnThumbnailerPrivate *priv = thumbnailer->priv;
+    int i;
+
+    if (uris == NULL) {
+        return;
+    }
+
+    for (i = 0; uris[i]; i++) {
+        TBRequest *request;
+        char *thumbnail_path;
+        GError *error = NULL;
+
+        request = g_hash_table_lookup (priv->requested, uris[i]);
+        if (request == NULL) {
+            g_warning ("No thumbnail requested for %s", uris[i]);
+            continue;
+        }
+
+        thumbnail_path = generate_thumbnail_path (uris[i]);
+
+        HRN_NOTE (THUMBNAIL, "Thumbnail for %s is %s", uris[i], thumbnail_path);
+        clutter_texture_set_from_file ((ClutterTexture *) request->texture,
+                                       thumbnail_path, &error);
+        if (error) {
+            g_warning ("Error loading thumbnail %s: %s", thumbnail_path,
+                       error->message);
+            g_error_free (error);
+        }
+        g_free (thumbnail_path);
+
+        g_hash_table_remove (priv->requested, uris[i]);
+        g_object_unref (request->texture);
+        g_free (request->uri);
+        g_free (request->mimetype);
+        g_slice_free (TBRequest, request);
+    }
+}
+
+static void
+hrn_thumbnailer_init (HrnThumbnailer *self)
+{
+    HrnThumbnailerPrivate *priv = GET_PRIVATE (self);
+    DBusGConnection *connection;
+    GError *error = NULL;
+
+    self->priv = priv;
+
+    connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
+    if (connection == NULL) {
+        g_warning ("Error getting bus: %s", error->message);
+        g_error_free (error);
+
+        priv->thumbnailer = NULL;
+        return;
+    }
+
+    dbus_g_object_register_marshaller (hrn_marshal_VOID__UINT_POINTER,
+                                       G_TYPE_NONE, G_TYPE_UINT,
+                                       G_TYPE_STRV, G_TYPE_INVALID);
+    dbus_g_object_register_marshaller (hrn_marshal_VOID__UINT_POINTER_INT_STRING,
+                                       G_TYPE_NONE, G_TYPE_UINT,
+                                       G_TYPE_STRV, G_TYPE_INT,
+                                       G_TYPE_STRING, G_TYPE_INVALID);
+
+    priv->thumbnailer = dbus_g_proxy_new_for_name (connection,
+                                                   THUMBNAILER_SERVICE,
+                                                   THUMBNAILER_PATH,
+                                                   THUMBNAILER_INTERFACE);
+    dbus_g_proxy_add_signal (priv->thumbnailer, "Ready",
+                             G_TYPE_UINT, G_TYPE_STRV, G_TYPE_INVALID);
+    dbus_g_proxy_connect_signal (priv->thumbnailer, "Ready",
+                                 G_CALLBACK (thumbnail_ready_cb), self, NULL);
+    dbus_g_proxy_add_signal (priv->thumbnailer, "Error",
+                             G_TYPE_UINT, G_TYPE_STRV, G_TYPE_INT,
+                             G_TYPE_STRING, G_TYPE_INVALID);
+    dbus_g_proxy_connect_signal (priv->thumbnailer, "Error",
+                                 G_CALLBACK (thumbnail_error_cb), self, NULL);
+
+    priv->requests = g_ptr_array_new ();
+    priv->requested = g_hash_table_new (g_str_hash, g_str_equal);
+}
+
+static void
+queue_reply (DBusGProxy *proxy,
+             guint       OUT_handle,
+             GError     *error,
+             gpointer    userdata)
+{
+#if 0
+    HrnThumbnailer *thumbnailer = (HrnThumbnailer *) userdata;
+#endif
+
+    if (error) {
+        g_warning ("Error queuing thumbnails: %s", error->message);
+    }
+}
+
+static gboolean
+process_request_queue (gpointer userdata)
+{
+    HrnThumbnailer *thumbnailer = (HrnThumbnailer *) userdata;
+    HrnThumbnailerPrivate *priv = thumbnailer->priv;
+    char **uris, **mimetypes;
+    int i;
+
+    uris = g_new0 (char *, priv->requests->len + 1);
+    mimetypes = g_new0 (char *, priv->requests->len + 1);
+    for (i = 0; i < priv->requests->len; i++) {
+        TBRequest *request = priv->requests->pdata[i];
+        uris[i] = request->uri;
+        mimetypes[i] = request->mimetype;
+
+        HRN_NOTE (THUMBNAIL, "Requesting: %s", request->uri);
+        g_hash_table_insert (priv->requested, request->uri, request);
+    }
+    g_ptr_array_free (priv->requests, TRUE);
+    priv->requests = g_ptr_array_new ();
+
+    /* Submit requests to thumbnailer */
+    org_freedesktop_thumbnails_Thumbnailer1_queue_async (priv->thumbnailer,
+                                                         (const char **) uris,
+                                                         (const char **) mimetypes,
+                                                         "large", "foreground",
+                                                         0, queue_reply,
+                                                         thumbnailer);
+    priv->request_id = 0;
+    return FALSE;
+}
+
+void
+hrn_thumbnailer_request (HrnThumbnailer *thumbnailer,
+                         const char     *uri,
+                         const char     *mimetype,
+                         ClutterActor   *texture)
+{
+    HrnThumbnailerPrivate *priv = thumbnailer->priv;
+    TBRequest *request;
+
+    request = g_slice_new (TBRequest);
+    request->uri = g_strdup (uri);
+    request->mimetype = g_strdup (mimetype);
+    request->texture = g_object_ref (texture);
+
+    g_ptr_array_add (priv->requests, request);
+    if (priv->request_id == 0) {
+        priv->request_id = g_timeout_add (500, process_request_queue,
+                                          thumbnailer);
+    }
+}
diff -pruN 1.5.1-1/src/hrn-thumbnailer.h 1.8.4-1/src/hrn-thumbnailer.h
--- 1.5.1-1/src/hrn-thumbnailer.h	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/src/hrn-thumbnailer.h	2010-02-17 17:26:44.000000000 +0000
@@ -0,0 +1,54 @@
+#ifndef __HRN_THUMBNAILER_H__
+#define __HRN_THUMBNAILER_H__
+
+#include <glib-object.h>
+#include <clutter/clutter.h>
+
+G_BEGIN_DECLS
+
+#define HRN_TYPE_THUMBNAILER                                            \
+   (hrn_thumbnailer_get_type())
+#define HRN_THUMBNAILER(obj)                                            \
+   (G_TYPE_CHECK_INSTANCE_CAST ((obj),                                  \
+                                HRN_TYPE_THUMBNAILER,                   \
+                                HrnThumbnailer))
+#define HRN_THUMBNAILER_CLASS(klass)                                    \
+   (G_TYPE_CHECK_CLASS_CAST ((klass),                                   \
+                             HRN_TYPE_THUMBNAILER,                      \
+                             HrnThumbnailerClass))
+#define IS_HRN_THUMBNAILER(obj)                                         \
+   (G_TYPE_CHECK_INSTANCE_TYPE ((obj),                                  \
+                                HRN_TYPE_THUMBNAILER))
+#define IS_HRN_THUMBNAILER_CLASS(klass)                                 \
+   (G_TYPE_CHECK_CLASS_TYPE ((klass),                                   \
+                             HRN_TYPE_THUMBNAILER))
+#define HRN_THUMBNAILER_GET_CLASS(obj)                                  \
+   (G_TYPE_INSTANCE_GET_CLASS ((obj),                                   \
+                               HRN_TYPE_THUMBNAILER,                    \
+                               HrnThumbnailerClass))
+
+typedef struct _HrnThumbnailerPrivate HrnThumbnailerPrivate;
+typedef struct _HrnThumbnailer      HrnThumbnailer;
+typedef struct _HrnThumbnailerClass HrnThumbnailerClass;
+
+struct _HrnThumbnailer
+{
+    GObject parent;
+
+    HrnThumbnailerPrivate *priv;
+};
+
+struct _HrnThumbnailerClass
+{
+    GObjectClass parent_class;
+};
+
+GType hrn_thumbnailer_get_type (void) G_GNUC_CONST;
+void hrn_thumbnailer_request (HrnThumbnailer *thumbnailer,
+                              const char     *uri,
+                              const char     *mimetype,
+                              ClutterActor   *texture);
+
+G_END_DECLS
+
+#endif /* __HRN_THUMBNAILER_H__ */
diff -pruN 1.5.1-1/src/hrn-tile.c 1.8.4-1/src/hrn-tile.c
--- 1.5.1-1/src/hrn-tile.c	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-tile.c	2011-03-15 13:20:21.000000000 +0000
@@ -1,14 +1,10 @@
-#include <bickley/bkl-item.h>
-#include <bickley/bkl-item-audio.h>
-#include <bickley/bkl-item-image.h>
-#include <bickley/bkl-item-video.h>
-
 #include "hrn.h"
 #include "hrn-square-clone.h"
 #include "hrn-texture-cache.h"
 #include "hrn-tileable.h"
 #include "hrn-tile.h"
 #include "hrn-tile-frame.h"
+#include "hrn-video-tile-frame.h"
 
 enum {
     PROP_0,
@@ -17,16 +13,16 @@ enum {
 };
 
 struct _HrnTilePrivate {
-    BklItem *item;
+    HrnItem *item;
 
     ClutterActor *thumbnail;
-    NbtkWidget *primary;
-    NbtkWidget *secondary;
+    ClutterActor *primary;
+    ClutterActor *secondary;
 };
 
 #define GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), HRN_TYPE_TILE, HrnTilePrivate))
 static void tileable_interface_init (HrnTileableInterface *iface);
-G_DEFINE_TYPE_WITH_CODE (HrnTile, hrn_tile, NBTK_TYPE_TABLE,
+G_DEFINE_TYPE_WITH_CODE (HrnTile, hrn_tile, MX_TYPE_TABLE,
                          G_IMPLEMENT_INTERFACE (HRN_TYPE_TILEABLE,
                                                 tileable_interface_init));
 
@@ -67,98 +63,83 @@ set_thumbnail (HrnTile *tile)
     HrnTilePrivate *priv = tile->priv;
     HrnTextureCache *cache = hrn_texture_cache_get_default ();
     ClutterActor *thumbnail;
-    const char *uri = NULL;
-
-    uri = bkl_item_extended_get_thumbnail ((BklItemExtended *) priv->item);
-
-    if (priv->thumbnail) {
-        clutter_actor_destroy (priv->thumbnail);
-    }
-
-    if (uri) {
-        thumbnail = hrn_texture_cache_get_texture (cache, uri);
 
-        if (bkl_item_get_item_type (priv->item) == BKL_ITEM_TYPE_IMAGE) {
-            BklItemImage *im = (BklItemImage *) priv->item;
-            const char *orient;
-
-            orient = bkl_item_image_get_orientation (im);
-            if (orient) {
-                if (g_str_equal (orient, "right - top")) {
-                    clutter_actor_set_anchor_point_from_gravity
-                        (thumbnail, CLUTTER_GRAVITY_CENTER);
-
-                    clutter_actor_set_rotation (thumbnail,
-                                                CLUTTER_Z_AXIS, 90,
-                                                0, 0, 0);
-
-                    clutter_actor_set_anchor_point_from_gravity
-                        (thumbnail, CLUTTER_GRAVITY_SOUTH_WEST);
-                }
-            }
-        }
+    thumbnail = hrn_texture_cache_get_texture_for_item (cache, priv->item);
+    if (hrn_item_get_item_type (priv->item) == HRN_ITEM_TYPE_VIDEO) {
+        priv->thumbnail = g_object_new (HRN_TYPE_VIDEO_TILE_FRAME,
+                                        "texture", thumbnail,
+                                        "label", hrn_tile_get_label (tile),
+                                        "uri", hrn_item_get_uri (priv->item),
+                                        NULL);
     } else {
-        thumbnail = hrn_texture_cache_get_default_texture
-            (cache, bkl_item_get_item_type (priv->item));
+        priv->thumbnail = g_object_new (HRN_TYPE_TILE_FRAME,
+                                        "texture", thumbnail,
+                                        "label", hrn_tile_get_label (tile),
+                                        NULL);
     }
-
-    priv->thumbnail = g_object_new (HRN_TYPE_TILE_FRAME,
-                                    "texture", thumbnail,
-                                    "label", hrn_tile_get_label (tile),
-                                    NULL);
     g_signal_connect (priv->thumbnail, "primary-action",
                       G_CALLBACK (frame_action_cb), tile);
     g_signal_connect (priv->thumbnail, "secondary-action",
                       G_CALLBACK (frame_action_cb), tile);
-    nbtk_table_add_actor (NBTK_TABLE (tile), priv->thumbnail, 0, 0);
+    mx_table_add_actor (MX_TABLE (tile), priv->thumbnail, 0, 0);
 }
 
 static void
 update_tile (HrnTile *tile)
 {
     HrnTilePrivate *priv = tile->priv;
-    char *title = NULL, *secondary = NULL;
-    guint width, height, season, episode, year;
+    char *primary = NULL, *secondary = NULL;
+    const char *season, *episode, *year, *title = NULL;
 
-    switch (bkl_item_get_item_type (priv->item)) {
-    case BKL_ITEM_TYPE_AUDIO:
-        title = g_strdup (bkl_item_audio_get_title ((BklItemAudio *) priv->item));
-        secondary = g_strdup (bkl_item_audio_get_album ((BklItemAudio *) priv->item));
+    switch (hrn_item_get_item_type (priv->item)) {
+    case HRN_ITEM_TYPE_AUDIO:
+        title = g_strdup (hrn_item_get_metadata (priv->item,
+                                                 HRN_ITEM_METADATA_TITLE));
+        secondary = g_strdup (hrn_item_get_metadata (priv->item,
+                                                     HRN_ITEM_METADATA_ALBUM));
         if (secondary == NULL) {
+            g_warning ("FIXME: Need to get duration");
+#if 0
             secondary = g_strdup_printf ("%d seconds",
                                          bkl_item_audio_get_duration
                                          ((BklItemAudio *) priv->item));
+#endif
         }
         break;
 
-    case BKL_ITEM_TYPE_IMAGE:
+#if 0
+    case HRN_ITEM_TYPE_IMAGE:
         title = g_strdup (bkl_item_image_get_title ((BklItemImage *) priv->item));
         width = bkl_item_image_get_width ((BklItemImage *) priv->item);
         height = bkl_item_image_get_height ((BklItemImage *) priv->item);
         secondary = g_strdup_printf ("%ux%u", width, height);
         break;
+#endif
 
-    case BKL_ITEM_TYPE_VIDEO:
-        if (bkl_item_video_get_series_name ((BklItemVideo *) priv->item)) {
-            title = g_strdup (bkl_item_video_get_series_name ((BklItemVideo *) priv->item));
-        } else {
-            title = g_strdup (bkl_item_video_get_title ((BklItemVideo *) priv->item));
+    case HRN_ITEM_TYPE_VIDEO:
+        title = hrn_item_get_metadata (priv->item,
+                                       HRN_ITEM_METADATA_SERIES_NAME);
+        if (title == NULL) {
+            title = hrn_item_get_metadata (priv->item,
+                                           HRN_ITEM_METADATA_TITLE);
         }
 
-        year = bkl_item_video_get_year ((BklItemVideo *) priv->item);
-        if (year < 1900) {
-            season = bkl_item_video_get_season ((BklItemVideo *) priv->item);
-            episode = bkl_item_video_get_episode ((BklItemVideo *) priv->item);
+        year = hrn_item_get_metadata (priv->item, HRN_ITEM_METADATA_DATE);
+        if (year == NULL) {
+            season = hrn_item_get_metadata (priv->item,
+                                            HRN_ITEM_METADATA_SEASON);
+            episode = hrn_item_get_metadata (priv->item,
+                                             HRN_ITEM_METADATA_EPISODE);
 
             /* FIXME: When out of string freeze again, add support for
                "Season %u" and "Episode %u" */
             if (season > 0 && episode > 0) {
-                secondary = g_strdup_printf ("Season %u, Episode %u", season, episode);
+                secondary = g_strdup_printf ("Season %s, Episode %s", season, episode);
             } else {
-                secondary = g_strdup ("");
+                secondary = NULL;
             }
         } else {
-            secondary = g_strdup_printf ("(%u)", year);
+            secondary = g_strdup_printf ("(%s)", year);
         }
         break;
 
@@ -169,19 +150,19 @@ update_tile (HrnTile *tile)
     if (title == NULL) {
         char *basename;
 
-        basename = g_path_get_basename (bkl_item_get_uri (priv->item));
-        title = g_uri_unescape_string (basename, NULL);
+        basename = g_path_get_basename (hrn_item_get_uri (priv->item));
+        primary = g_uri_unescape_string (basename, NULL);
         g_free (basename);
     }
 
-    nbtk_label_set_text (NBTK_LABEL (priv->primary), title);
-    nbtk_label_set_text (NBTK_LABEL (priv->secondary),
-                         secondary ? secondary :
-                         bkl_item_get_mimetype (priv->item));
+    mx_label_set_text (MX_LABEL (priv->primary), title ? title : primary);
+    mx_label_set_text (MX_LABEL (priv->secondary),
+                       secondary ? secondary :
+                       hrn_item_get_mimetype (priv->item));
 
     set_thumbnail (tile);
 
-    g_free (title);
+    g_free (primary);
     g_free (secondary);
 }
 
@@ -192,8 +173,8 @@ clear_tile (HrnTile *tile)
     GError *error = NULL;
     guint32 data = 0;
 
-    nbtk_label_set_text (NBTK_LABEL (priv->primary), "");
-    nbtk_label_set_text (NBTK_LABEL (priv->secondary), "");
+    mx_label_set_text (MX_LABEL (priv->primary), "");
+    mx_label_set_text (MX_LABEL (priv->secondary), "");
 
     clutter_texture_set_from_rgb_data (CLUTTER_TEXTURE (priv->thumbnail),
                                        (const guchar *) &data, TRUE,
@@ -262,7 +243,7 @@ hrn_tile_class_init (HrnTileClass *klass
 
     g_object_class_install_property (o_class, PROP_ITEM,
                                      g_param_spec_object ("item", "", "",
-                                                          BKL_TYPE_ITEM,
+                                                          HRN_TYPE_ITEM,
                                                           G_PARAM_WRITABLE |
                                                           G_PARAM_STATIC_STRINGS));
     g_object_class_install_property (o_class, PROP_NODE,
@@ -324,7 +305,7 @@ label_clicked_cb (ClutterActor       *ac
         return FALSE;
     }
 
-    text = nbtk_label_get_text ((NbtkLabel *) actor);
+    text = mx_label_get_text ((MxLabel *) actor);
     hrn_tileable_activated ((HrnTileable *) tile,
                             HRN_TILEABLE_ACTION_SEARCH, (char *) text);
     return TRUE;
@@ -335,7 +316,7 @@ label_enter_cb (ClutterActor         *ac
                 ClutterCrossingEvent *event,
                 HrnTile              *tile)
 {
-    nbtk_widget_set_style_pseudo_class ((NbtkWidget *) actor, "hover");
+    mx_stylable_set_style_pseudo_class (MX_STYLABLE (actor), "hover");
     return TRUE;
 }
 
@@ -344,7 +325,7 @@ label_leave_cb (ClutterActor         *ac
                 ClutterCrossingEvent *event,
                 HrnTile              *tile)
 {
-    nbtk_widget_set_style_pseudo_class ((NbtkWidget *) actor, NULL);
+    mx_stylable_set_style_pseudo_class (MX_STYLABLE (actor), NULL);
     return TRUE;
 }
 
@@ -357,8 +338,9 @@ hrn_tile_init (HrnTile *self)
 
     clutter_actor_set_size (CLUTTER_ACTOR (self), ITEM_WIDTH, ITEM_HEIGHT);
 
-    priv->primary = nbtk_label_new ("");
-    nbtk_widget_set_style_class_name (priv->primary, "HrnTileablePrimary");
+    priv->primary = mx_label_new_with_text ("");
+    mx_stylable_set_style_class (MX_STYLABLE (priv->primary),
+                                 "HrnTileablePrimary");
     clutter_actor_set_reactive ((ClutterActor *) priv->primary, TRUE);
     g_signal_connect (priv->primary, "button-release-event",
                       G_CALLBACK (label_clicked_cb), self);
@@ -366,17 +348,18 @@ hrn_tile_init (HrnTile *self)
                       G_CALLBACK (label_enter_cb), self);
     g_signal_connect (priv->primary, "leave-event",
                       G_CALLBACK (label_leave_cb), self);
-    nbtk_table_add_actor_with_properties (NBTK_TABLE (self),
+    mx_table_add_actor_with_properties (MX_TABLE (self),
                                           (ClutterActor *) priv->primary, 1, 0,
                                           "x-expand", FALSE,
                                           "x-fill", FALSE,
                                           "y-expand", FALSE,
                                           "y-fill", FALSE,
-                                          "x-align", 0.0,
+                                          "x-align", MX_ALIGN_START,
                                           NULL);
 
-    priv->secondary = nbtk_label_new ("");
-    nbtk_widget_set_style_class_name (priv->secondary, "HrnTileableSecondary");
+    priv->secondary = mx_label_new_with_text ("");
+    mx_stylable_set_style_class (MX_STYLABLE (priv->secondary),
+                                 "HrnTileableSecondary");
     clutter_actor_set_reactive ((ClutterActor *) priv->secondary, TRUE);
     g_signal_connect (priv->secondary, "button-release-event",
                       G_CALLBACK (label_clicked_cb), self);
@@ -384,14 +367,14 @@ hrn_tile_init (HrnTile *self)
                       G_CALLBACK (label_enter_cb), self);
     g_signal_connect (priv->secondary, "leave-event",
                       G_CALLBACK (label_leave_cb), self);
-    nbtk_table_add_actor_with_properties (NBTK_TABLE (self),
+    mx_table_add_actor_with_properties (MX_TABLE (self),
                                           (ClutterActor *) priv->secondary,
                                           2, 0,
                                           "x-expand", FALSE,
                                           "x-fill", FALSE,
                                           "y-expand", FALSE,
                                           "y-fill", FALSE,
-                                          "x-align", 0.0,
+                                          "x-align", MX_ALIGN_START,
                                           NULL);
 }
 
diff -pruN 1.5.1-1/src/hrn-tile-frame.c 1.8.4-1/src/hrn-tile-frame.c
--- 1.5.1-1/src/hrn-tile-frame.c	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-tile-frame.c	2011-03-15 13:20:21.000000000 +0000
@@ -24,10 +24,12 @@ struct _HrnTileFramePrivate {
     ClutterActor *overlay;
     ClutterActor *play_icon;
     ClutterActor *label;
+
+    ClutterActor *extra_texture;
 };
 
 #define GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), HRN_TYPE_TILE_FRAME, HrnTileFramePrivate))
-G_DEFINE_TYPE (HrnTileFrame, hrn_tile_frame, NBTK_TYPE_BIN);
+G_DEFINE_TYPE (HrnTileFrame, hrn_tile_frame, MX_TYPE_FRAME);
 static guint32 signals[LAST_SIGNAL] = {0,};
 
 static void
@@ -88,7 +90,7 @@ hrn_tile_frame_set_property (GObject    
 
     case PROP_LABEL:
         label = g_value_get_string (value);
-        nbtk_label_set_text ((NbtkLabel *) priv->label, label);
+        mx_label_set_text ((MxLabel *) priv->label, label);
         break;
 
     default:
@@ -140,6 +142,10 @@ hrn_tile_frame_allocate (ClutterActor   
         }
     }
 
+    if (priv->extra_texture) {
+        clutter_actor_allocate (priv->extra_texture, &child_box, flags);
+    }
+
     child_box.y1 = child_box.y2 - 28;
     clutter_actor_allocate (priv->overlay_group, &child_box, flags);
 
@@ -163,7 +169,7 @@ hrn_tile_frame_enter (ClutterActor      
     HrnTileFrame *frame = (HrnTileFrame *) actor;
     HrnTileFramePrivate *priv = frame->priv;
 
-    nbtk_widget_set_style_pseudo_class ((NbtkWidget *) actor, "hover");
+    mx_stylable_set_style_pseudo_class (MX_STYLABLE (actor), "hover");
     clutter_actor_animate (priv->overlay_group,
                            CLUTTER_EASE_IN_OUT_CUBIC, 500,
                            "opacity", 0xff,
@@ -178,7 +184,7 @@ hrn_tile_frame_leave (ClutterActor      
     HrnTileFrame *frame = (HrnTileFrame *) actor;
     HrnTileFramePrivate *priv = frame->priv;
 
-    nbtk_widget_set_style_pseudo_class ((NbtkWidget *) actor, NULL);
+    mx_stylable_set_style_pseudo_class (MX_STYLABLE (actor), NULL);
     clutter_actor_animate (priv->overlay_group,
                            CLUTTER_EASE_IN_OUT_CUBIC, 500,
                            "opacity", 0x00,
@@ -269,7 +275,7 @@ hrn_tile_frame_init (HrnTileFrame *self)
     clutter_container_add_actor ((ClutterContainer *) priv->overlay_group,
                                  priv->overlay);
 
-    priv->label = (ClutterActor*) nbtk_label_new ("");
+    priv->label = (ClutterActor*) mx_label_new_with_text ("");
     clutter_actor_set_name (priv->label, "tile-overlay-label");
 
 #if 0
@@ -287,3 +293,16 @@ hrn_tile_frame_init (HrnTileFrame *self)
                                  priv->play_icon);
 }
 
+void
+hrn_tile_frame_set_secondary_texture (HrnTileFrame *frame,
+                                      ClutterActor *texture)
+{
+    HrnTileFramePrivate *priv = frame->priv;
+
+    priv->extra_texture = texture;
+    if (texture) {
+        clutter_container_add_actor ((ClutterContainer *) priv->group, texture);
+        clutter_container_raise_child ((ClutterContainer *) priv->group,
+                                       texture, priv->texture);
+    }
+}
diff -pruN 1.5.1-1/src/hrn-tile-frame.h 1.8.4-1/src/hrn-tile-frame.h
--- 1.5.1-1/src/hrn-tile-frame.h	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-tile-frame.h	2010-02-17 17:26:44.000000000 +0000
@@ -1,7 +1,7 @@
 #ifndef __HRN_TILE_FRAME_H__
 #define __HRN_TILE_FRAME_H__
 
-#include <nbtk/nbtk.h>
+#include <mx/mx.h>
 
 
 G_BEGIN_DECLS
@@ -33,17 +33,19 @@ typedef struct _HrnTileFrameClass HrnTil
 
 struct _HrnTileFrame
 {
-    NbtkBin parent;
+    MxFrame parent;
 
     HrnTileFramePrivate *priv;
 };
 
 struct _HrnTileFrameClass
 {
-    NbtkBinClass parent_class;
+    MxFrameClass parent_class;
 };
 
 GType hrn_tile_frame_get_type (void) G_GNUC_CONST;
+void hrn_tile_frame_set_secondary_texture (HrnTileFrame *frame,
+                                           ClutterActor *texture);
 
 G_END_DECLS
 
diff -pruN 1.5.1-1/src/hrn-tile.h 1.8.4-1/src/hrn-tile.h
--- 1.5.1-1/src/hrn-tile.h	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-tile.h	2010-02-17 17:26:44.000000000 +0000
@@ -1,7 +1,7 @@
 #ifndef __HRN_TILE_H__
 #define __HRN_TILE_H__
 
-#include <nbtk/nbtk.h>
+#include <mx/mx.h>
 
 
 G_BEGIN_DECLS
@@ -33,14 +33,14 @@ typedef struct _HrnTileClass HrnTileClas
 
 struct _HrnTile
 {
-    NbtkTable parent;
+    MxTable parent;
 
     HrnTilePrivate *priv;
 };
 
 struct _HrnTileClass
 {
-    NbtkTableClass parent_class;
+    MxTableClass parent_class;
 
     HrnClusterNode *(*get_node) (HrnTile *tile);
     const char *(*get_label) (HrnTile *tile);
diff -pruN 1.5.1-1/src/hrn-tiler.c 1.8.4-1/src/hrn-tiler.c
--- 1.5.1-1/src/hrn-tiler.c	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-tiler.c	2010-02-17 17:26:44.000000000 +0000
@@ -49,6 +49,13 @@ hrn_tiler_show (HrnTiler    *tiler,
 }
 
 void
+hrn_tiler_show_node (HrnTiler       *tiler,
+                     HrnClusterNode *node)
+{
+    HRN_TILER_GET_CLASS (tiler)->show_node (tiler, node);
+}
+
+void
 hrn_tiler_set_expanded (HrnTiler *tiler,
                         gboolean  expanded)
 {
diff -pruN 1.5.1-1/src/hrn-tiler.h 1.8.4-1/src/hrn-tiler.h
--- 1.5.1-1/src/hrn-tiler.h	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-tiler.h	2010-02-17 17:26:44.000000000 +0000
@@ -22,6 +22,8 @@ struct _HrnTilerInterface {
     void (* show_all) (HrnTiler *tiler);
     void (* show) (HrnTiler    *tiler,
                    HrnTileable *tile);
+    void (* show_node) (HrnTiler       *tiler,
+                        HrnClusterNode *node);
     void (*set_expanded) (HrnTiler *tiler,
                           gboolean  expanded);
     void (*set_items_per_row) (HrnTiler *tiler,
@@ -35,6 +37,8 @@ GType hrn_tiler_get_type (void);
 void hrn_tiler_show_all (HrnTiler *tiler);
 void hrn_tiler_show (HrnTiler    *tiler,
                      HrnTileable *tile);
+void hrn_tiler_show_node (HrnTiler       *tiler,
+                          HrnClusterNode *node);
 void hrn_tiler_set_expanded (HrnTiler *tiler,
                              gboolean  expanded);
 void hrn_tiler_set_items_per_row (HrnTiler *tiler,
diff -pruN 1.5.1-1/src/hrn-toolbar.c 1.8.4-1/src/hrn-toolbar.c
--- 1.5.1-1/src/hrn-toolbar.c	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-toolbar.c	2010-02-17 17:26:44.000000000 +0000
@@ -12,29 +12,27 @@ enum {
   QUERY_CHANGED,
   PINNED,
   QUIT_REQUESTED,
+  CHANGE_LEVEL,
   LAST_SIGNAL
 };
 
 struct _HrnToolbarPrivate
 {
-    NbtkWidget *view_table;
-
-    NbtkWidget *close_button;
-
-    /* Things in view_group */
-    NbtkWidget *filter_bar;
+    ClutterActor *filter_bar;
     guint32 pinned_id;
 
     guint32 search_handler;
     guint32 text_changed_id;
 
+    gint last_level;
+
     HrnPinManager *pin_manager;
 };
 
 #define GET_PRIVATE(obj)    (G_TYPE_INSTANCE_GET_PRIVATE ((obj), \
                                                           HRN_TYPE_TOOLBAR, \
                                                           HrnToolbarPrivate))
-G_DEFINE_TYPE (HrnToolbar, hrn_toolbar, NBTK_TYPE_TABLE);
+G_DEFINE_TYPE (HrnToolbar, hrn_toolbar, MX_TYPE_TOOLBAR);
 static guint32 signals[LAST_SIGNAL] = {0, };
 
 static void
@@ -81,68 +79,15 @@ hrn_toolbar_get_property (GObject *objec
 }
 
 static void
-hrn_toolbar_allocate (ClutterActor *self, const ClutterActorBox *box,
-                      ClutterAllocationFlags flags)
-{
-  HrnToolbar        *toolbar = (HrnToolbar *) self;
-  HrnToolbarPrivate *priv    = toolbar->priv;
-  float              x, y;
-
-  CLUTTER_ACTOR_CLASS (hrn_toolbar_parent_class)->allocate (self, box, flags);
-
-  clutter_actor_get_transformed_position ((ClutterActor *) priv->filter_bar,
-                                          &x, &y);
-}
-
-static void
-hrn_toolbar_map (ClutterActor *self)
-{
-  CLUTTER_ACTOR_CLASS (hrn_toolbar_parent_class)->map (self);
-}
-
-static void
-hrn_toolbar_unmap (ClutterActor *self)
-{
-  CLUTTER_ACTOR_CLASS (hrn_toolbar_parent_class)->unmap (self);
-}
-
-static void
-hrn_toolbar_paint (ClutterActor *actor)
-{
-  CLUTTER_ACTOR_CLASS (hrn_toolbar_parent_class)->paint (actor);
-}
-
-static void
-hrn_toolbar_pick (ClutterActor *actor, const ClutterColor *color)
-{
-  HrnToolbar        *toolbar = (HrnToolbar *) actor;
-  HrnToolbarPrivate *priv    = toolbar->priv;
-
-  if (CLUTTER_ACTOR_IS_VISIBLE (priv->view_table))
-    {
-      clutter_actor_paint ((ClutterActor *) priv->view_table);
-    }
-
-  clutter_actor_paint ((ClutterActor *) priv->close_button);
-}
-
-static void
 hrn_toolbar_class_init (HrnToolbarClass *klass)
 {
   GObjectClass      *o_class = (GObjectClass *) klass;
-  ClutterActorClass *a_class = (ClutterActorClass *) klass;
 
   o_class->dispose      = hrn_toolbar_dispose;
   o_class->finalize     = hrn_toolbar_finalize;
   o_class->set_property = hrn_toolbar_set_property;
   o_class->get_property = hrn_toolbar_get_property;
 
-  a_class->map      = hrn_toolbar_map;
-  a_class->unmap    = hrn_toolbar_unmap;
-  a_class->allocate = hrn_toolbar_allocate;
-  a_class->paint    = hrn_toolbar_paint;
-  a_class->pick     = hrn_toolbar_pick;
-
   g_type_class_add_private (klass, sizeof (HrnToolbarPrivate));
 
   signals[QUERY_CHANGED] = g_signal_new ("query-changed",
@@ -164,6 +109,12 @@ hrn_toolbar_class_init (HrnToolbarClass 
                                   G_SIGNAL_NO_RECURSE, 0, NULL, NULL,
                                   g_cclosure_marshal_VOID__BOOLEAN,
                                   G_TYPE_NONE, 1, G_TYPE_BOOLEAN);
+  signals[CHANGE_LEVEL] = g_signal_new ("change-level",
+                                        G_TYPE_FROM_CLASS (klass),
+                                        G_SIGNAL_RUN_FIRST |
+                                        G_SIGNAL_NO_RECURSE, 0, NULL, NULL,
+                                        g_cclosure_marshal_VOID__INT,
+                                        G_TYPE_NONE, 1, G_TYPE_INT);
 }
 
 static gboolean
@@ -181,8 +132,7 @@ search_updated (ClutterActor *entry,
 }
 
 static void
-hrn_toolbar_quit_clicked_cb (ClutterActor *actor,
-                             HrnToolbar   *toolbar)
+hrn_toolbar_quit_clicked_cb (HrnToolbar *toolbar)
 {
   g_signal_emit (toolbar, signals[QUIT_REQUESTED], 0);
 }
@@ -192,9 +142,7 @@ search_pinned_cb (HrnSearchBar *search_b
                   gboolean      pinned,
                   HrnToolbar   *toolbar)
 {
-    g_signal_emit (toolbar, signals[PINNED], 0, pinned);
-#if 0
-#endif
+  g_signal_emit (toolbar, signals[PINNED], 0, pinned);
 }
 
 static gboolean
@@ -205,7 +153,7 @@ entry_keypress_cb (ClutterActor *actor,
     HrnToolbarPrivate *priv = toolbar->priv;
 
     if (clutter_event_get_key_symbol (event) == CLUTTER_Escape) {
-        nbtk_entry_set_text (NBTK_ENTRY (priv->filter_bar), "");
+        mx_path_bar_set_text (MX_PATH_BAR (priv->filter_bar), "");
         return TRUE;
     }
 
@@ -213,33 +161,45 @@ entry_keypress_cb (ClutterActor *actor,
 }
 
 static void
+level_changed_cb (MxPathBar  *path_bar,
+                  GParamSpec *pspec,
+                  HrnToolbar *self)
+{
+    HrnToolbarPrivate *priv = self->priv;
+    int current_level = mx_path_bar_get_level (path_bar);
+
+    /* We only want to change level when going down */
+    if (current_level < priv->last_level) {
+        g_signal_emit (self, signals[CHANGE_LEVEL], 0, current_level);
+    }
+
+    priv->last_level = current_level;
+}
+
+static void
 hrn_toolbar_init (HrnToolbar *self)
 {
   HrnToolbarPrivate *priv;
-  NbtkWidget        *filter_bin;
+  ClutterActor      *filter_bin;
   ClutterActor      *text;
+  MxEntry           *entry;
 
   self->priv = GET_PRIVATE (self);
   priv       = self->priv;
 
   clutter_actor_set_name ((ClutterActor *) self, "toolbar");
-
-  /* FIXME: This is a mess. The toolbar have been redesigned between 2.0 and
-   * 2.1, this has to be rewritten anyway for 2.2, just hack it for now */
-  priv->view_table = nbtk_table_new ();
-  nbtk_table_add_actor_with_properties (NBTK_TABLE (self),
-                                        (ClutterActor *) priv->view_table,
-                                        0, 0,
-                                        "x-align", 0.0,
-                                        "y-align", 0.0,
-                                        NULL);
+  mx_bin_set_alignment (MX_BIN (self), MX_ALIGN_MIDDLE, MX_ALIGN_MIDDLE);
+  mx_bin_set_fill (MX_BIN (self), TRUE, FALSE);
 
   priv->filter_bar = g_object_new (HRN_TYPE_SEARCH_BAR, NULL);
   clutter_actor_set_name ((ClutterActor *) priv->filter_bar, "filter-bar");
   priv->pinned_id = g_signal_connect (priv->filter_bar, "search-pinned",
                                       G_CALLBACK (search_pinned_cb), self);
+  g_signal_connect (priv->filter_bar, "notify::level",
+                    G_CALLBACK (level_changed_cb), self);
 
-  text = nbtk_entry_get_clutter_text (NBTK_ENTRY (priv->filter_bar));
+  entry = mx_path_bar_get_entry (MX_PATH_BAR (priv->filter_bar));
+  text = mx_entry_get_clutter_text (entry);
   g_signal_connect (text, "key-press-event",
                     G_CALLBACK (entry_keypress_cb), self);
   priv->text_changed_id = g_signal_connect (text, "text-changed",
@@ -247,48 +207,18 @@ hrn_toolbar_init (HrnToolbar *self)
   clutter_stage_set_key_focus (CLUTTER_STAGE (hrn_window_get_stage (window)),
                                CLUTTER_ACTOR (text));
 
-  filter_bin = nbtk_bin_new ();
+  filter_bin = mx_frame_new ();
   clutter_actor_set_name (CLUTTER_ACTOR (filter_bin), "filter-bin");
-  nbtk_bin_set_child (NBTK_BIN (filter_bin), CLUTTER_ACTOR (priv->filter_bar));
-  nbtk_bin_set_fill (NBTK_BIN (filter_bin), TRUE, FALSE);
-  nbtk_table_add_actor_with_properties (NBTK_TABLE (priv->view_table),
-                                        (ClutterActor *) filter_bin,
-                                        0, 0,
-                                        "y-fill", TRUE,
-                                        "y-expand", TRUE,
-                                        NULL);
-
-  priv->close_button = nbtk_button_new ();
-  clutter_actor_set_name ((ClutterActor *) priv->close_button,
-                          "close-button");
-  clutter_actor_set_size ((ClutterActor *) priv->close_button, 57, 51);
-  g_object_set (G_OBJECT(priv->close_button), "transition-duration", 100, NULL);
-
-  g_signal_connect (priv->close_button, "clicked",
-                    G_CALLBACK (hrn_toolbar_quit_clicked_cb), self);
-  nbtk_table_add_actor_with_properties (NBTK_TABLE (self),
-                                        (ClutterActor *) priv->close_button,
-                                        0, 3,
-                                        "x-expand", FALSE,
-                                        "y-expand", FALSE,
-                                        "x-fill", FALSE,
-                                        "y-fill", FALSE,
-                                        NULL);
-}
+  mx_bin_set_child (MX_BIN (filter_bin), CLUTTER_ACTOR (priv->filter_bar));
+  mx_bin_set_fill (MX_BIN (filter_bin), TRUE, FALSE);
 
-static void
-pin_selected_cb (HrnPinManager *pin_manager,
-                 HrnPin        *pin,
-                 HrnToolbar    *toolbar)
-{
-  if (pin) {
-    hrn_toolbar_set_filter_mode (toolbar, pin->filter);
-  } else {
-    hrn_toolbar_set_filter_mode (toolbar, 7);
-  }
+  clutter_container_add_actor (CLUTTER_CONTAINER (self), filter_bin);
+
+  g_signal_connect (self, "close-button-clicked",
+                    G_CALLBACK (hrn_toolbar_quit_clicked_cb), NULL);
 }
 
-NbtkWidget *
+MxWidget *
 hrn_toolbar_new (HrnPinManager *pin_manager)
 {
   HrnToolbar *toolbar;
@@ -298,13 +228,8 @@ hrn_toolbar_new (HrnPinManager *pin_mana
   priv = toolbar->priv;
 
   priv->pin_manager = pin_manager;
-  g_signal_connect (pin_manager, "pin-selected",
-                    G_CALLBACK (pin_selected_cb), toolbar);
-
-  hrn_searchbar_set_pin_manager ((HrnSearchBar *) priv->filter_bar,
-                                 pin_manager);
 
-  return (NbtkWidget *) toolbar;
+  return (MxWidget *) toolbar;
 }
 
 void
@@ -322,10 +247,13 @@ hrn_toolbar_focused (HrnToolbar *toolbar
 {
   HrnToolbarPrivate *priv = toolbar->priv;
   ClutterActor      *stage, *text;
+  MxEntry           *entry;
 
   stage = hrn_window_get_stage (window);
 
-  text = nbtk_entry_get_clutter_text ((NbtkEntry *) priv->filter_bar);
+  entry = mx_path_bar_get_entry (MX_PATH_BAR (priv->filter_bar));
+  text = mx_entry_get_clutter_text (entry);
+
   clutter_stage_set_key_focus ((ClutterStage *) stage, text);
 }
 
@@ -347,15 +275,14 @@ hrn_toolbar_set_query (HrnToolbar *toolb
 {
     HrnToolbarPrivate *priv = toolbar->priv;
     ClutterActor *text;
+    MxEntry *entry;
 
-    text = nbtk_entry_get_clutter_text (NBTK_ENTRY (priv->filter_bar));
+    entry = mx_path_bar_get_entry (MX_PATH_BAR (priv->filter_bar));
+    text = mx_entry_get_clutter_text (entry);
 
     /* We don't want the toolbar being updated manually to trigger a search */
     g_signal_handler_block (text, priv->text_changed_id);
-
-    hrn_pin_manager_select_pin (priv->pin_manager, NULL);
-
-    nbtk_entry_set_text (NBTK_ENTRY (priv->filter_bar), query);
+    mx_path_bar_set_text (MX_PATH_BAR (priv->filter_bar), query);
     g_signal_handler_unblock (text, priv->text_changed_id);
 }
 
@@ -363,10 +290,8 @@ const char *
 hrn_toolbar_get_query (HrnToolbar *toolbar)
 {
   HrnToolbarPrivate *priv = toolbar->priv;
-  ClutterActor *text;
 
-  text = nbtk_entry_get_clutter_text (NBTK_ENTRY (priv->filter_bar));
-  return clutter_text_get_text ((ClutterText *) text);
+  return mx_path_bar_get_text (MX_PATH_BAR (priv->filter_bar));
 }
 
 void
@@ -382,3 +307,9 @@ hrn_toolbar_get_zoom (HrnToolbar *toolba
     g_warning ("FIXME: hrn_toolbar_get_zoom");
     return 1.0;
 }
+
+MxPathBar *
+hrn_toolbar_get_path_bar (HrnToolbar *toolbar)
+{
+    return (MxPathBar *)toolbar->priv->filter_bar;
+}
diff -pruN 1.5.1-1/src/hrn-toolbar.h 1.8.4-1/src/hrn-toolbar.h
--- 1.5.1-1/src/hrn-toolbar.h	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-toolbar.h	2010-02-17 17:26:44.000000000 +0000
@@ -1,8 +1,7 @@
 #ifndef __HRN_TOOLBAR_H__
 #define __HRN_TOOLBAR_H__
 
-#include <nbtk/nbtk.h>
-#include <bickley/bkl-item.h>
+#include <mx/mx.h>
 #include "hrn-pin-manager.h"
 
 G_BEGIN_DECLS
@@ -34,29 +33,32 @@ typedef struct _HrnToolbarClass HrnToolb
 
 struct _HrnToolbar
 {
-  NbtkTable parent;
+  MxToolbar parent;
 
   HrnToolbarPrivate *priv;
 };
 
 struct _HrnToolbarClass
 {
-  NbtkTableClass parent_class;
+  MxToolbarClass parent_class;
 };
 
 GType       hrn_toolbar_get_type (void) G_GNUC_CONST;
 
-NbtkWidget *hrn_toolbar_new             (HrnPinManager *pin_manager);
+MxWidget *hrn_toolbar_new             (HrnPinManager *pin_manager);
 void        hrn_toolbar_focused         (HrnToolbar *toolbar);
 void        hrn_toolbar_set_pinned      (HrnToolbar *toolbar,
                                          gboolean    pinned);
 void        hrn_toolbar_set_filter_mode (HrnToolbar *toolbar,
                                          int         mode);
 guint       hrn_toolbar_get_filter_mode (HrnToolbar *toolbar);
+
 void        hrn_toolbar_set_query       (HrnToolbar *toolbar,
                                          const char *query);
 const char *hrn_toolbar_get_query (HrnToolbar *toolbar);
 
+MxPathBar  *hrn_toolbar_get_path_bar  (HrnToolbar *toolbar);
+
 void hrn_toolbar_set_zoom (HrnToolbar *toolbar,
                            double      zoom);
 double hrn_toolbar_get_zoom (HrnToolbar *toolbar);
diff -pruN 1.5.1-1/src/hrn-tracker-client.c 1.8.4-1/src/hrn-tracker-client.c
--- 1.5.1-1/src/hrn-tracker-client.c	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/src/hrn-tracker-client.c	2011-03-15 13:20:21.000000000 +0000
@@ -0,0 +1,371 @@
+#include <string.h>
+#include <libtracker-client/tracker-client.h>
+#include <dbus/dbus-glib.h>
+
+#include "hrn-tracker-client.h"
+
+enum {
+    PROP_0,
+};
+
+enum {
+    READY,
+    LAST_SIGNAL,
+};
+
+struct _HrnTrackerClientPrivate {
+    DBusGConnection *connection;
+    DBusGProxy *music_proxy;
+    DBusGProxy *photo_proxy;
+    DBusGProxy *video_proxy;
+    TrackerClient *client;
+
+    HrnClusterTree *items;
+
+    gboolean ready;
+};
+
+#define GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), HRN_TYPE_TRACKER_CLIENT, HrnTrackerClientPrivate))
+G_DEFINE_TYPE (HrnTrackerClient, hrn_tracker_client, G_TYPE_OBJECT);
+static guint32 signals[LAST_SIGNAL] = {0,};
+
+#define URI 0
+#define MIMETYPE 1
+#define DATE 2
+#define TITLE 3
+#define ARTIST_NAME 4
+#define ALBUM_TITLE 5
+#define TRACK 6
+#define SEASON 7
+#define EPISODE 8
+#define TRACKER_QUERY "SELECT nie:url(?uri) nie:mimeType(?uri) nie:contentCreated(?uri) nie:title(?uri) nmm:artistName(nmm:performer(?uri)) nmm:albumTitle(nmm:musicAlbum(?uri)) nmm:trackNumber(?uri) nmm:season(?uri) nmm:episodeNumber(?uri) " \
+    "WHERE { "                                                          \
+    "  { "                                                              \
+    "    ?uri a nmm:MusicPiece. "                                       \
+    "  } "                                                              \
+    "  UNION "                                                          \
+    "  { "                                                              \
+    "    ?uri a nmm:Photo "                                             \
+    "  } "                                                              \
+    "  UNION "                                                          \
+    "  { "                                                              \
+    "    ?uri a nmm:Video "                                             \
+    "  } "                                                              \
+    "}"
+
+#define ITEM_QUERY "SELECT nie:url(?uri) nie:mimeType(?uri) nie:contentCreated(?uri) nie:title(?uri) nmm:artistName(nmm:performer(?uri)) nmm:albumTitle(nmm:musicAlbum(?uri)) nmm:trackNumber(?uri) nmm:season(?uri) nmm:episodeNumber(?uri) " \
+    "WHERE { "
+
+static void
+hrn_tracker_client_finalize (GObject *object)
+{
+    G_OBJECT_CLASS (hrn_tracker_client_parent_class)->finalize (object);
+}
+
+static void
+hrn_tracker_client_dispose (GObject *object)
+{
+    HrnTrackerClient *self = (HrnTrackerClient *) object;
+    HrnTrackerClientPrivate *priv = self->priv;
+
+    if (priv->music_proxy) {
+        g_object_unref (priv->music_proxy);
+        priv->music_proxy = NULL;
+    }
+
+    if (priv->photo_proxy) {
+        g_object_unref (priv->photo_proxy);
+        priv->photo_proxy = NULL;
+    }
+
+    if (priv->video_proxy) {
+        g_object_unref (priv->video_proxy);
+        priv->video_proxy = NULL;
+    }
+
+    if (priv->client) {
+        g_object_unref (priv->client);
+        priv->client = NULL;
+    }
+
+    G_OBJECT_CLASS (hrn_tracker_client_parent_class)->dispose (object);
+}
+
+static void
+hrn_tracker_client_set_property (GObject      *object,
+                                 guint         prop_id,
+                                 const GValue *value,
+                                 GParamSpec   *pspec)
+{
+    switch (prop_id) {
+
+    default:
+        break;
+    }
+}
+
+static void
+hrn_tracker_client_get_property (GObject    *object,
+                                 guint       prop_id,
+                                 GValue     *value,
+                                 GParamSpec *pspec)
+{
+    switch (prop_id) {
+
+    default:
+        break;
+    }
+}
+
+static void
+hrn_tracker_client_class_init (HrnTrackerClientClass *klass)
+{
+    GObjectClass *o_class = (GObjectClass *) klass;
+
+    o_class->dispose = hrn_tracker_client_dispose;
+    o_class->finalize = hrn_tracker_client_finalize;
+    o_class->set_property = hrn_tracker_client_set_property;
+    o_class->get_property = hrn_tracker_client_get_property;
+
+    g_type_class_add_private (klass, sizeof (HrnTrackerClientPrivate));
+    signals[READY] = g_signal_new ("ready",
+                                   G_TYPE_FROM_CLASS (klass),
+                                   G_SIGNAL_RUN_FIRST |
+                                   G_SIGNAL_NO_RECURSE, 0, NULL, NULL,
+                                   g_cclosure_marshal_VOID__VOID,
+                                   G_TYPE_NONE, 0);
+}
+
+static void
+add_to_tree_and_free (gpointer value,
+                      gpointer userdata)
+{
+    HrnTrackerClient *client = (HrnTrackerClient *) userdata;
+    HrnTrackerClientPrivate *priv = client->priv;
+    HrnItem *item;
+    char **results = value;
+
+    if (strncmp (results[MIMETYPE], "audio", 5) == 0) {
+        item = hrn_item_new (HRN_ITEM_TYPE_AUDIO, results[URI],
+                             results[MIMETYPE]);
+        hrn_item_set_metadata (item, HRN_ITEM_METADATA_ARTIST,
+                               results[ARTIST_NAME]);
+        hrn_item_set_metadata (item, HRN_ITEM_METADATA_ALBUM,
+                               results[ALBUM_TITLE]);
+        hrn_item_set_metadata (item, HRN_ITEM_METADATA_TRACK,
+                               results[TRACK]);
+    } else if (strncmp (results[MIMETYPE], "image", 5) == 0) {
+        item = hrn_item_new (HRN_ITEM_TYPE_IMAGE, results[URI],
+                             results[MIMETYPE]);
+    } else if (strncmp (results[MIMETYPE], "video", 5) == 0) {
+        item = hrn_item_new (HRN_ITEM_TYPE_VIDEO, results[URI],
+                             results[MIMETYPE]);
+        hrn_item_set_metadata (item, HRN_ITEM_METADATA_SEASON,
+                               results[SEASON]);
+        hrn_item_set_metadata (item, HRN_ITEM_METADATA_EPISODE,
+                               results[EPISODE]);
+    } else {
+        g_strfreev (results);
+        return;
+    }
+
+    hrn_item_set_metadata (item, HRN_ITEM_METADATA_DATE, results[DATE]);
+    hrn_item_set_metadata (item, HRN_ITEM_METADATA_TITLE, results[TITLE]);
+
+    hrn_cluster_tree_add_item (priv->items, item);
+
+    g_strfreev (results);
+}
+
+GTimer *timer = NULL;
+
+static void
+query_tracker_async_reply (GPtrArray *results,
+                           GError    *error,
+                           gpointer   userdata)
+{
+    HrnTrackerClient *client = (HrnTrackerClient *) userdata;
+    HrnTrackerClientPrivate *priv = client->priv;
+    double elapsed = g_timer_elapsed (timer, NULL);
+    int count = results->len;
+
+    if (error) {
+        g_warning ("Could not get search results: %s", error->message);
+        g_error_free (error);
+        return;
+    }
+
+    if (results == NULL) {
+        return;
+    }
+
+    g_ptr_array_foreach (results, add_to_tree_and_free, client);
+    g_ptr_array_free (results, TRUE);
+
+    g_print ("Got %d results in %.3fs, processed in %.3fs\n",
+             count, elapsed, g_timer_elapsed (timer, NULL) - elapsed);
+    g_timer_destroy (timer);
+
+    priv->ready = TRUE;
+    g_signal_emit (client, signals[READY], 0);
+}
+
+static gboolean
+get_items_idle (gpointer data)
+{
+    HrnTrackerClient *client = (HrnTrackerClient *) data;
+    HrnTrackerClientPrivate *priv = client->priv;
+
+    timer = g_timer_new ();
+    tracker_resources_sparql_query_async (priv->client,
+                                          TRACKER_QUERY,
+                                          query_tracker_async_reply, client);
+    return FALSE;
+}
+
+static void
+query_item_async_reply (GPtrArray *results,
+                        GError    *error,
+                        gpointer   userdata)
+{
+    HrnTrackerClient *client = (HrnTrackerClient *) userdata;
+
+    if (error) {
+        g_warning ("Could not get search results: %s", error->message);
+        g_error_free (error);
+        return;
+    }
+
+    if (results == NULL) {
+        return;
+    }
+
+    g_ptr_array_foreach (results, add_to_tree_and_free, client);
+    g_ptr_array_free (results, TRUE);
+}
+
+static void
+subjects_added (DBusGProxy  *proxy,
+                const char **added,
+                gpointer     userdata)
+{
+    HrnTrackerClient *client = (HrnTrackerClient *) userdata;
+    HrnTrackerClientPrivate *priv = client->priv;
+    GString *query_builder;
+    int i;
+
+    query_builder = g_string_new (ITEM_QUERY);
+    g_string_append_printf (query_builder, "{ ?uri nie:url '%s' }", added[0]);
+    for (i = 1; added[i]; i++) {
+        g_string_append_printf (query_builder, " UNION { ?uri nie:url '%s' }",
+                                added[i]);
+    }
+    g_string_append (query_builder, "}");
+
+    tracker_resources_sparql_query_async (priv->client, query_builder->str,
+                                          query_item_async_reply, client);
+    g_string_free (query_builder, TRUE);
+}
+
+static void
+subjects_removed (DBusGProxy  *proxy,
+                  const char **removed,
+                  gpointer     userdata)
+{
+    HrnTrackerClient *client = (HrnTrackerClient *) userdata;
+    HrnTrackerClientPrivate *priv = client->priv;
+    int i;
+
+    for (i = 0; removed[i]; i++) {
+        hrn_cluster_tree_remove_uri (priv->items, removed[i]);
+    }
+}
+
+static void
+hrn_tracker_client_init (HrnTrackerClient *self)
+{
+    HrnTrackerClientPrivate *priv = GET_PRIVATE (self);
+    GError *error = NULL;
+
+    self->priv = priv;
+
+    priv->client = tracker_client_new (FALSE, G_MAXINT);
+    priv->items = hrn_cluster_tree_new ();
+
+    priv->connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
+    if (priv->connection == NULL) {
+        g_warning ("Error getting bus: %s", error->message);
+        g_error_free (error);
+
+        return;
+    }
+
+    priv->music_proxy = dbus_g_proxy_new_for_name (priv->connection,
+                                                     "org.freedesktop.Tracker1",
+                                                     "/org/freedesktop/Tracker1/Resources/Classes/nmm/MusicPiece",
+                                                     "org.freedesktop.Tracker1.Resources.Class");
+    dbus_g_proxy_add_signal (priv->music_proxy, "SubjectsAdded",
+                             G_TYPE_STRV, G_TYPE_INVALID);
+    dbus_g_proxy_connect_signal (priv->music_proxy, "SubjectsAdded",
+                                 G_CALLBACK (subjects_added), self, NULL);
+    dbus_g_proxy_add_signal (priv->music_proxy, "SubjectsRemoved",
+                             G_TYPE_STRV, G_TYPE_INVALID);
+    dbus_g_proxy_connect_signal (priv->music_proxy, "SubjectsRemoved",
+                                 G_CALLBACK (subjects_removed),
+                                 self, NULL);
+
+    priv->photo_proxy = dbus_g_proxy_new_for_name (priv->connection,
+                                                   "org.freedesktop.Tracker1",
+                                                   "/org/freedesktop/Tracker1/Resources/Classes/nmm/Photo",
+                                                   "org.freedesktop.Tracker1.Resources.Class");
+    dbus_g_proxy_add_signal (priv->photo_proxy, "SubjectsAdded",
+                             G_TYPE_STRV, G_TYPE_INVALID);
+    dbus_g_proxy_connect_signal (priv->photo_proxy, "SubjectsAdded",
+                                 G_CALLBACK (subjects_added), self, NULL);
+    dbus_g_proxy_add_signal (priv->photo_proxy, "SubjectsRemoved",
+                             G_TYPE_STRV, G_TYPE_INVALID);
+    dbus_g_proxy_connect_signal (priv->photo_proxy, "SubjectsRemoved",
+                                 G_CALLBACK (subjects_removed),
+                                 self, NULL);
+
+    priv->video_proxy = dbus_g_proxy_new_for_name (priv->connection,
+                                                   "org.freedesktop.Tracker1",
+                                                   "/org/freedesktop/Tracker1/Resources/Classes/nmm/Video",
+                                                   "org.freedesktop.Tracker1.Resources.Class");
+    dbus_g_proxy_add_signal (priv->video_proxy, "SubjectsAdded",
+                             G_TYPE_STRV, G_TYPE_INVALID);
+    dbus_g_proxy_connect_signal (priv->video_proxy, "SubjectsAdded",
+                                 G_CALLBACK (subjects_added), self, NULL);
+    dbus_g_proxy_add_signal (priv->video_proxy, "SubjectsRemoved",
+                             G_TYPE_STRV, G_TYPE_INVALID);
+    dbus_g_proxy_connect_signal (priv->video_proxy, "SubjectsRemoved",
+                                 G_CALLBACK (subjects_removed),
+                                 self, NULL);
+
+    g_idle_add (get_items_idle, self);
+}
+
+HrnClusterTree *
+hrn_tracker_client_get_tree (HrnTrackerClient *client)
+{
+    HrnTrackerClientPrivate *priv = client->priv;
+
+    return priv->items;
+}
+
+HrnItem *
+hrn_tracker_client_get_item_for_uri (HrnTrackerClient *client,
+                                     const char       *uri)
+{
+    HrnTrackerClientPrivate *priv = client->priv;
+
+    return hrn_cluster_tree_get_item_for_uri (priv->items, uri);
+}
+
+gboolean
+hrn_tracker_client_is_ready (HrnTrackerClient *client)
+{
+    HrnTrackerClientPrivate *priv = client->priv;
+
+    return priv->ready;
+}
diff -pruN 1.5.1-1/src/hrn-tracker-client.h 1.8.4-1/src/hrn-tracker-client.h
--- 1.5.1-1/src/hrn-tracker-client.h	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/src/hrn-tracker-client.h	2010-02-17 17:26:44.000000000 +0000
@@ -0,0 +1,56 @@
+#ifndef __HRN_TRACKER_CLIENT_H__
+#define __HRN_TRACKER_CLIENT_H__
+
+#include <glib-object.h>
+
+#include "hrn-item.h"
+#include "hrn-cluster-tree.h"
+
+G_BEGIN_DECLS
+
+#define HRN_TYPE_TRACKER_CLIENT                                         \
+   (hrn_tracker_client_get_type())
+#define HRN_TRACKER_CLIENT(obj)                                         \
+   (G_TYPE_CHECK_INSTANCE_CAST ((obj),                                  \
+                                HRN_TYPE_TRACKER_CLIENT,                \
+                                HrnTrackerClient))
+#define HRN_TRACKER_CLIENT_CLASS(klass)                                 \
+   (G_TYPE_CHECK_CLASS_CAST ((klass),                                   \
+                             HRN_TYPE_TRACKER_CLIENT,                   \
+                             HrnTrackerClientClass))
+#define IS_HRN_TRACKER_CLIENT(obj)                                      \
+   (G_TYPE_CHECK_INSTANCE_TYPE ((obj),                                  \
+                                HRN_TYPE_TRACKER_CLIENT))
+#define IS_HRN_TRACKER_CLIENT_CLASS(klass)                              \
+   (G_TYPE_CHECK_CLASS_TYPE ((klass),                                   \
+                             HRN_TYPE_TRACKER_CLIENT))
+#define HRN_TRACKER_CLIENT_GET_CLASS(obj)                               \
+   (G_TYPE_INSTANCE_GET_CLASS ((obj),                                   \
+                               HRN_TYPE_TRACKER_CLIENT,                 \
+                               HrnTrackerClientClass))
+
+typedef struct _HrnTrackerClientPrivate HrnTrackerClientPrivate;
+typedef struct _HrnTrackerClient      HrnTrackerClient;
+typedef struct _HrnTrackerClientClass HrnTrackerClientClass;
+
+struct _HrnTrackerClient
+{
+    GObject parent;
+
+    HrnTrackerClientPrivate *priv;
+};
+
+struct _HrnTrackerClientClass
+{
+    GObjectClass parent_class;
+};
+
+GType hrn_tracker_client_get_type (void) G_GNUC_CONST;
+HrnItem *hrn_tracker_client_get_item_for_uri (HrnTrackerClient *client,
+                                              const char       *uri);
+gboolean hrn_tracker_client_is_ready (HrnTrackerClient *client);
+HrnClusterTree *hrn_tracker_client_get_tree (HrnTrackerClient *client);
+
+G_END_DECLS
+
+#endif /* __HRN_TRACKER_CLIENT_H__ */
diff -pruN 1.5.1-1/src/hrn-track-tile.c 1.8.4-1/src/hrn-track-tile.c
--- 1.5.1-1/src/hrn-track-tile.c	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-track-tile.c	2010-02-17 17:26:44.000000000 +0000
@@ -55,7 +55,7 @@ hrn_track_tile_set_property (GObject    
 {
     HrnTrackTile *self = (HrnTrackTile *) object;
     HrnTrackTilePrivate *priv = self->priv;
-    TrackCluster *track;
+    TileCluster *track;
 
     switch (prop_id) {
     case PROP_NODE:
@@ -65,7 +65,7 @@ hrn_track_tile_set_property (GObject    
              G_CALLBACK (node_visibility_changed), self);
         clutter_actor_set_name ((ClutterActor *) self, priv->node->name);
 
-        track = (TrackCluster *) priv->node->data;
+        track = (TileCluster *) priv->node->data;
 
         g_object_set (self,
                       "item", track->item,
diff -pruN 1.5.1-1/src/hrn-ui-controls.c 1.8.4-1/src/hrn-ui-controls.c
--- 1.5.1-1/src/hrn-ui-controls.c	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-ui-controls.c	2010-02-17 17:26:44.000000000 +0000
@@ -1,12 +1,11 @@
 #include <bognor/br-queue.h>
-#include <nbtk/nbtk.h>
+#include <mx/mx.h>
 
 #include "hrn.h"
 #include "hrn-toolbar.h"
 #include "hrn-sidebar.h"
 #include "hrn-pin-manager.h"
 #include "hrn-ui-controls.h"
-#include "hrn-source-manager.h"
 #include "hrn-queue.h"
 #include "hrn-queue-controls.h"
 #include "hrn-marshal.h"
@@ -15,7 +14,7 @@ enum {
     PROP_0,
     PROP_PIN_MANAGER,
     PROP_QUEUE,
-    PROP_SOURCE_MANAGER,
+    PROP_TRACKER,
 };
 
 enum {
@@ -29,23 +28,22 @@ enum {
 
 struct _HrnUiControlsPrivate {
     HrnPinManager *pin_manager;
-    HrnSourceManager *source_manager;
+    HrnTrackerClient *tracker;
 
-    NbtkWidget *toolbar;
+    ClutterActor *toolbar;
     HrnZoomLevel current_zoom;
 
-    HrnSidebar *sidebar;
+    ClutterActor *sidebar;
 
     ClutterActor *lowlight;
 
     BrQueue *local_queue;
-    ClutterActor *queues;
     HrnQueue *queue;
     HrnQueueControls *queue_controls;
 };
 
 #define GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), HRN_TYPE_UI_CONTROLS, HrnUiControlsPrivate))
-G_DEFINE_TYPE (HrnUiControls, hrn_ui_controls, CLUTTER_TYPE_GROUP);
+G_DEFINE_TYPE (HrnUiControls, hrn_ui_controls, MX_TYPE_WIDGET);
 
 static guint32 signals[LAST_SIGNAL] = {0, };
 
@@ -71,24 +69,50 @@ hrn_ui_controls_dispose (GObject *object
         priv->local_queue = NULL;
     }
 
+    if (priv->sidebar) {
+        clutter_actor_unparent (priv->sidebar);
+        priv->sidebar = NULL;
+    }
+
+    if (priv->toolbar) {
+        clutter_actor_unparent (priv->toolbar);
+        priv->toolbar = NULL;
+    }
+
+    if (priv->queue) {
+        clutter_actor_unparent (CLUTTER_ACTOR (priv->queue));
+        priv->queue = NULL;
+    }
+
+    if (priv->queue_controls) {
+        clutter_actor_unparent (CLUTTER_ACTOR (priv->queue_controls));
+        priv->queue_controls = NULL;
+    }
+
+    if (priv->lowlight) {
+        clutter_actor_unparent (priv->lowlight);
+        priv->lowlight = NULL;
+    }
+
     G_OBJECT_CLASS (hrn_ui_controls_parent_class)->dispose (object);
 }
 
 static void
-playing_changed_cb (BrQueue       *queue,
-                    gboolean       playing,
-                    HrnUiControls *controls)
+state_changed_cb (BrQueue       *queue,
+                  BrQueueState   state,
+                  HrnUiControls *controls)
 {
     HrnUiControlsPrivate *priv = controls->priv;
 
-    hrn_queue_controls_set_playing (priv->queue_controls, playing);
+    hrn_queue_controls_set_playing (priv->queue_controls,
+                                    state == BR_QUEUE_STATE_PLAYING);
 }
 
 static void
-get_playing_reply (BrQueue *queue,
-                   gboolean playing,
-                   GError  *error,
-                   gpointer data)
+get_state_reply (BrQueue      *queue,
+                 BrQueueState  state,
+                 const GError *error,
+                 gpointer      data)
 {
     HrnUiControls *controls = (HrnUiControls *) data;
 
@@ -97,16 +121,16 @@ get_playing_reply (BrQueue *queue,
         return;
     }
 
-    playing_changed_cb (queue, playing, controls);
+    state_changed_cb (queue, state, controls);
 }
 
 static void
-source_ready_cb (HrnSourceManager *manager,
-                 HrnUiControls    *controls)
+tracker_client_ready_cb (HrnTrackerClient *tracker,
+                         HrnUiControls    *controls)
 {
     HrnUiControlsPrivate *priv = controls->priv;
 
-    br_queue_get_playing (priv->local_queue, get_playing_reply, controls);
+    br_queue_get_state (priv->local_queue, get_state_reply, controls);
 }
 
 static void
@@ -125,17 +149,17 @@ hrn_ui_controls_set_property (GObject   
 
     case PROP_QUEUE:
         priv->local_queue = g_value_dup_object (value);
-        g_signal_connect (priv->local_queue, "playing-changed",
-                          G_CALLBACK (playing_changed_cb), self);
+        g_signal_connect (priv->local_queue, "state-changed",
+                          G_CALLBACK (state_changed_cb), self);
         break;
 
-    case PROP_SOURCE_MANAGER:
-        priv->source_manager = g_value_dup_object (value);
-        if (hrn_source_manager_is_ready (priv->source_manager)) {
-            source_ready_cb (priv->source_manager, self);
+    case PROP_TRACKER:
+        priv->tracker = g_value_dup_object (value);
+        if (hrn_tracker_client_is_ready (priv->tracker)) {
+            tracker_client_ready_cb (priv->tracker, self);
         } else {
-            g_signal_connect (priv->source_manager, "ready",
-                              G_CALLBACK (source_ready_cb), self);
+            g_signal_connect (priv->tracker, "ready",
+                              G_CALLBACK (tracker_client_ready_cb), self);
         }
 
         break;
@@ -174,15 +198,7 @@ query_changed_cb (HrnToolbar    *toolbar
 }
 
 static void
-set_source (HrnUiControls *controls,
-            HrnSource     *source)
-{
-    g_signal_emit (controls, signals[SOURCE_CHANGED], 0, source);
-}
-
-static void
 sidebar_source_changed_cb (HrnSidebar    *sidebar,
-                           HrnSource     *source,
                            int            filter,
                            HrnPin        *pin,
                            HrnUiControls *controls)
@@ -190,7 +206,6 @@ sidebar_source_changed_cb (HrnSidebar   
     HrnUiControlsPrivate *priv = controls->priv;
 
     g_signal_emit (controls, signals[FILTER_CHANGED], 0, filter);
-    set_source (controls, source);
 
     if (pin == NULL) {
         hrn_toolbar_set_query ((HrnToolbar *) priv->toolbar, "");
@@ -226,6 +241,15 @@ request_next_cb (HrnQueueControls *contr
 }
 
 static void
+request_previous_cb (HrnQueueControls *controls,
+                     HrnUiControls    *ui)
+{
+    HrnUiControlsPrivate *priv = ui->priv;
+
+    br_queue_previous (priv->local_queue);
+}
+
+static void
 pinned_cb (HrnToolbar    *toolbar,
            gboolean       pinned,
            HrnUiControls *ui)
@@ -249,9 +273,9 @@ hrn_ui_controls_constructor (GType      
     controls = HRN_UI_CONTROLS (object);
     priv = controls->priv;
 
-    priv->toolbar = hrn_toolbar_new (priv->pin_manager);
-    clutter_container_add_actor ((ClutterContainer *) controls,
-                                 (ClutterActor *) priv->toolbar);
+    priv->toolbar = (ClutterActor *)hrn_toolbar_new (priv->pin_manager);
+    clutter_actor_set_parent (priv->toolbar, CLUTTER_ACTOR (controls));
+
     priv->current_zoom = hrn_toolbar_get_zoom ((HrnToolbar *) priv->toolbar);
     g_signal_connect (priv->toolbar, "query-changed",
                       G_CALLBACK (query_changed_cb), controls);
@@ -260,35 +284,31 @@ hrn_ui_controls_constructor (GType      
     g_signal_connect (priv->toolbar, "pinned",
                       G_CALLBACK (pinned_cb), controls);
 
-    priv->sidebar = hrn_sidebar_new (priv->pin_manager);
-    clutter_container_add_actor ((ClutterContainer *) controls,
-                                 (ClutterActor *) priv->sidebar);
+    priv->sidebar = (ClutterActor *)hrn_sidebar_new (priv->pin_manager);
+    clutter_actor_set_parent (priv->sidebar, CLUTTER_ACTOR (controls));
     g_signal_connect (priv->sidebar, "source-changed",
                       G_CALLBACK (sidebar_source_changed_cb), controls);
 
     priv->lowlight = clutter_rectangle_new_with_color (&black);
-    clutter_container_add_actor ((ClutterContainer *) controls, priv->lowlight);
+    clutter_actor_set_parent (priv->lowlight, CLUTTER_ACTOR (controls));
     clutter_actor_hide (priv->lowlight);
     clutter_actor_set_opacity (priv->lowlight, 0x00);
 
-    /* Should be a custom actor */
-    priv->queues = clutter_group_new ();
-    clutter_container_add_actor ((ClutterContainer *) controls, priv->queues);
-
+    /* FIXME: Should be a custom actor */
     master_queue = priv->queue = hrn_queue_new (priv->local_queue,
-                                                priv->source_manager);
-    clutter_container_add_actor ((ClutterContainer *) priv->queues,
-                                 (ClutterActor *) priv->queue);
+                                                priv->tracker);
+    clutter_actor_set_parent ((ClutterActor *) priv->queue,
+                              (ClutterActor *) controls);
 
     priv->queue_controls = g_object_new (HRN_TYPE_QUEUE_CONTROLS, NULL);
+    clutter_actor_set_parent (CLUTTER_ACTOR (priv->queue_controls),
+                              CLUTTER_ACTOR (controls));
     g_signal_connect (priv->queue_controls, "request-playing-changed",
                       G_CALLBACK (request_play_changed_cb), controls);
     g_signal_connect (priv->queue_controls, "request-next",
                       G_CALLBACK (request_next_cb), controls);
-    clutter_container_add_actor ((ClutterContainer *) priv->queues,
-                                 (ClutterActor *) priv->queue_controls);
-    clutter_actor_set_position ((ClutterActor *) priv->queue_controls, 0, 74);
-    clutter_actor_set_size ((ClutterActor *) priv->queue_controls, 200, 52);
+    g_signal_connect (priv->queue_controls, "request-previous",
+                      G_CALLBACK (request_previous_cb), controls);
 
     return object;
 }
@@ -300,23 +320,94 @@ hrn_ui_controls_allocate (ClutterActor  
 {
     HrnUiControls *controls = (HrnUiControls *) self;
     HrnUiControlsPrivate *priv = controls->priv;
-    float width, height;
+    gfloat width, height, qheight;
+    ClutterActorBox child_box;
+
+    CLUTTER_ACTOR_CLASS (hrn_ui_controls_parent_class)->allocate
+        (self, box, flags);
+
+    /* FIXME: Support padding, for completeness sake */
 
     width = box->x2 - box->x1;
     height = box->y2 - box->y1;
 
-    clutter_actor_set_y (CLUTTER_ACTOR (priv->sidebar), TOOLBAR_HEIGHT);
-    clutter_actor_set_position (CLUTTER_ACTOR (priv->queues),
-                                0, height - 126);
-
-    clutter_actor_set_size (CLUTTER_ACTOR (priv->toolbar), width,
-                            TOOLBAR_HEIGHT);
-    clutter_actor_set_size (CLUTTER_ACTOR (priv->sidebar), 200, height);
+    child_box.x1 = 0;
+    child_box.y1 = 0;
+    child_box.x2 = width;
+    child_box.y2 = height;
+    clutter_actor_allocate (priv->lowlight, &child_box, flags);
 
-    clutter_actor_set_size (priv->lowlight, width, height);
+    child_box.y2 = TOOLBAR_HEIGHT;
+    clutter_actor_allocate (priv->toolbar, &child_box, flags);
 
-    CLUTTER_ACTOR_CLASS (hrn_ui_controls_parent_class)->allocate
-        (self, box, flags);
+    child_box.y1 = child_box.y2;
+    child_box.y2 = height;
+    child_box.x2 = 200;
+    clutter_actor_allocate (priv->sidebar, &child_box, flags);
+
+    clutter_actor_get_preferred_height (CLUTTER_ACTOR (priv->queue_controls),
+                                        -1, NULL, &qheight);
+    child_box.y1 = height - qheight;
+    child_box.x1 = 8;
+    child_box.x2 = 200 - 8;
+    clutter_actor_allocate (CLUTTER_ACTOR (priv->queue_controls),
+                            &child_box, flags);
+
+    clutter_actor_get_preferred_height (CLUTTER_ACTOR (priv->queue),
+                                        -1, NULL, &qheight);
+    child_box.y2 = child_box.y1;
+    child_box.y1 -= qheight;
+    clutter_actor_allocate (CLUTTER_ACTOR (priv->queue), &child_box, flags);
+}
+
+static void
+hrn_ui_controls_map (ClutterActor *self)
+{
+  HrnUiControlsPrivate *priv = HRN_UI_CONTROLS (self)->priv;
+
+  CLUTTER_ACTOR_CLASS (hrn_ui_controls_parent_class)->map (self);
+
+  clutter_actor_map (priv->sidebar);
+  clutter_actor_map (priv->toolbar);
+  clutter_actor_map (CLUTTER_ACTOR (priv->queue));
+  clutter_actor_map (CLUTTER_ACTOR (priv->queue_controls));
+  clutter_actor_map (priv->lowlight);
+}
+
+static void
+hrn_ui_controls_unmap (ClutterActor *self)
+{
+  HrnUiControlsPrivate *priv = HRN_UI_CONTROLS (self)->priv;
+
+  CLUTTER_ACTOR_CLASS (hrn_ui_controls_parent_class)->unmap (self);
+
+  clutter_actor_unmap (priv->sidebar);
+  clutter_actor_unmap (priv->toolbar);
+  clutter_actor_unmap (CLUTTER_ACTOR (priv->queue));
+  clutter_actor_unmap (CLUTTER_ACTOR (priv->queue_controls));
+  clutter_actor_unmap (priv->lowlight);
+}
+
+static void
+hrn_ui_controls_paint (ClutterActor *self)
+{
+  HrnUiControlsPrivate *priv = HRN_UI_CONTROLS (self)->priv;
+
+  CLUTTER_ACTOR_CLASS (hrn_ui_controls_parent_class)->paint (self);
+
+  clutter_actor_paint (priv->sidebar);
+  clutter_actor_paint (priv->toolbar);
+  clutter_actor_paint (CLUTTER_ACTOR (priv->queue));
+  clutter_actor_paint (CLUTTER_ACTOR (priv->queue_controls));
+  clutter_actor_paint (priv->lowlight);
+}
+
+static void
+hrn_ui_controls_pick (ClutterActor *self, const ClutterColor *color)
+{
+  CLUTTER_ACTOR_CLASS (hrn_ui_controls_parent_class)->pick (self, color);
+
+  hrn_ui_controls_paint (self);
 }
 
 static void
@@ -332,6 +423,10 @@ hrn_ui_controls_class_init (HrnUiControl
     o_class->constructor = hrn_ui_controls_constructor;
 
     a_class->allocate = hrn_ui_controls_allocate;
+    a_class->map = hrn_ui_controls_map;
+    a_class->unmap = hrn_ui_controls_unmap;
+    a_class->paint = hrn_ui_controls_paint;
+    a_class->pick = hrn_ui_controls_pick;
 
     g_type_class_add_private (klass, sizeof (HrnUiControlsPrivate));
 
@@ -347,9 +442,10 @@ hrn_ui_controls_class_init (HrnUiControl
                                                           G_PARAM_WRITABLE |
                                                           G_PARAM_CONSTRUCT_ONLY |
                                                           G_PARAM_STATIC_STRINGS));
-    g_object_class_install_property (o_class, PROP_SOURCE_MANAGER,
-                                     g_param_spec_object ("source-manager", "", "",
-                                                          HRN_TYPE_SOURCE_MANAGER,
+    g_object_class_install_property (o_class, PROP_TRACKER,
+                                     g_param_spec_object ("tracker-client",
+                                                          "", "",
+                                                          HRN_TYPE_TRACKER_CLIENT,
                                                           G_PARAM_WRITABLE |
                                                           G_PARAM_CONSTRUCT_ONLY |
                                                           G_PARAM_STATIC_STRINGS));
@@ -408,7 +504,7 @@ hrn_ui_controls_get_sidebar (HrnUiContro
 {
     HrnUiControlsPrivate *priv = controls->priv;
 
-    return priv->sidebar;
+    return (HrnSidebar *)priv->sidebar;
 }
 
 HrnZoomLevel
diff -pruN 1.5.1-1/src/hrn-ui-controls.h 1.8.4-1/src/hrn-ui-controls.h
--- 1.5.1-1/src/hrn-ui-controls.h	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-ui-controls.h	2010-02-17 17:26:44.000000000 +0000
@@ -35,14 +35,14 @@ typedef struct _HrnUiControlsClass HrnUi
 
 struct _HrnUiControls
 {
-    ClutterGroup parent;
+    MxWidget parent;
 
     HrnUiControlsPrivate *priv;
 };
 
 struct _HrnUiControlsClass
 {
-    ClutterGroupClass parent_class;
+    MxWidgetClass parent_class;
 };
 
 GType hrn_ui_controls_get_type (void) G_GNUC_CONST;
diff -pruN 1.5.1-1/src/hrn-up-tile.c 1.8.4-1/src/hrn-up-tile.c
--- 1.5.1-1/src/hrn-up-tile.c	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-up-tile.c	2011-03-15 13:20:21.000000000 +0000
@@ -18,7 +18,7 @@ struct _HrnUpTilePrivate {
 
 #define GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), HRN_TYPE_UP_TILE, HrnUpTilePrivate))
 static void tileable_interface_init (HrnTileableInterface *iface);
-G_DEFINE_TYPE_WITH_CODE (HrnUpTile, hrn_up_tile, NBTK_TYPE_TABLE,
+G_DEFINE_TYPE_WITH_CODE (HrnUpTile, hrn_up_tile, MX_TYPE_TABLE,
                          G_IMPLEMENT_INTERFACE (HRN_TYPE_TILEABLE,
                                                 tileable_interface_init));
 
@@ -67,7 +67,7 @@ hrn_up_tile_enter_event (ClutterActor   
     HrnUpTile *tile = (HrnUpTile *) actor;
     HrnUpTilePrivate *priv = tile->priv;
 
-    nbtk_widget_set_style_pseudo_class ((NbtkWidget *) priv->thumbnail,
+    mx_stylable_set_style_pseudo_class (MX_STYLABLE (priv->thumbnail),
                                         "hover");
     return FALSE;
 }
@@ -79,7 +79,7 @@ hrn_up_tile_leave_event (ClutterActor   
     HrnUpTile *tile = (HrnUpTile *) actor;
     HrnUpTilePrivate *priv = tile->priv;
 
-    nbtk_widget_set_style_pseudo_class ((NbtkWidget *) priv->thumbnail, NULL);
+    mx_stylable_set_style_pseudo_class (MX_STYLABLE (priv->thumbnail), NULL);
     return FALSE;
 }
 
@@ -160,11 +160,9 @@ hrn_up_tile_init (HrnUpTile *self)
 
     clutter_actor_set_reactive ((ClutterActor *) self, TRUE);
 
-    priv->thumbnail = (ClutterActor *) nbtk_label_new ("");
-    nbtk_widget_set_style_class_name ((NbtkWidget *) priv->thumbnail,
-                                      "HrnUpButtonThumbnail");
+    priv->thumbnail = (ClutterActor *) mx_label_new_with_text ("");
     clutter_actor_set_size (priv->thumbnail, THUMBNAIL_WIDTH,
                             THUMBNAIL_HEIGHT);
-    nbtk_table_add_actor (NBTK_TABLE (self), priv->thumbnail, 0, 0);
+    mx_table_add_actor (MX_TABLE (self), priv->thumbnail, 0, 0);
 }
 
diff -pruN 1.5.1-1/src/hrn-up-tile.h 1.8.4-1/src/hrn-up-tile.h
--- 1.5.1-1/src/hrn-up-tile.h	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-up-tile.h	2010-02-17 17:26:44.000000000 +0000
@@ -1,7 +1,7 @@
 #ifndef __HRN_UP_TILE_H__
 #define __HRN_UP_TILE_H__
 
-#include <nbtk/nbtk.h>
+#include <mx/mx.h>
 
 
 G_BEGIN_DECLS
@@ -33,14 +33,14 @@ typedef struct _HrnUpTileClass HrnUpTile
 
 struct _HrnUpTile
 {
-    NbtkTable parent;
+    MxTable parent;
 
     HrnUpTilePrivate *priv;
 };
 
 struct _HrnUpTileClass
 {
-    NbtkTableClass parent_class;
+    MxTableClass parent_class;
 };
 
 GType hrn_up_tile_get_type (void) G_GNUC_CONST;
diff -pruN 1.5.1-1/src/hrn-video-player.c 1.8.4-1/src/hrn-video-player.c
--- 1.5.1-1/src/hrn-video-player.c	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-video-player.c	2011-03-15 13:20:21.000000000 +0000
@@ -18,8 +18,11 @@
 
 #include "config.h"
 
+#include <string.h>
+
 #include <glib.h>
 #include <glib/gi18n.h>
+#include <gio/gio.h>
 
 #ifdef USE_HELIX
 #include <clutter-helix/clutter-helix.h>
@@ -318,6 +321,90 @@ player_set_playing (HrnIfacePlayer *play
   clutter_media_set_playing ((ClutterMedia *) priv->video_player, playing);
 }
 
+#ifndef USE_HELIX
+/* FIXME: ClutterMedia could have a set_subtitle_uri method */
+static void
+player_set_subtitle_uri (HrnIfacePlayer *player,
+                         const char     *uri)
+{
+  HrnVideoPlayer *video = (HrnVideoPlayer *) player;
+  HrnVideoPlayerPrivate *priv = video->priv;
+  ClutterGstVideoTexture *video_texture;
+  GstElement *playbin2;
+
+  video_texture = CLUTTER_GST_VIDEO_TEXTURE (priv->video_player);
+  playbin2 = clutter_gst_video_texture_get_playbin (video_texture);
+
+  g_message ("set subtitle: %s", uri);
+  g_object_set (playbin2, "suburi", uri, NULL);
+}
+
+static void
+look_for_locale_dependant_subtitle (HrnIfacePlayer *player,
+                                    const char     *uri)
+{
+  gchar *scheme, *path, *dot;
+  const gchar * const *languages;
+  GFile *video;
+  gint i, j;
+  static gchar *subtitle_extensions[] = { ".srt" };
+
+  scheme = g_uri_parse_scheme (uri);
+  if (scheme == NULL || strcmp (scheme, "file") != 0) {
+    /* do not try to look for subtitle files if the video file is not
+     * mounted locally */
+    g_free (scheme);
+    return;
+  }
+  g_free (scheme);
+
+  video = g_file_new_for_uri (uri);
+  path = g_file_get_path (video);
+  g_object_unref (video);
+  if (path == NULL)
+    return;
+
+  dot = strrchr (path, '.');
+  if (dot == NULL) {
+    g_free (path);
+    return;
+  }
+  *dot = '\0';
+
+  languages = g_get_language_names ();
+  for (i = 0; languages[i]; i++) {
+    for (j = 0; j < G_N_ELEMENTS (subtitle_extensions); j++) {
+      gchar *subtitle_path;
+      GFile *subtitle;
+
+      subtitle_path = g_strconcat (path,
+                                   "-",
+                                   languages[i],
+                                   subtitle_extensions[j],
+                                   NULL);
+      subtitle = g_file_new_for_path (subtitle_path);
+      if (g_file_query_exists (subtitle, NULL)) {
+        gchar *uri;
+
+        uri = g_file_get_uri (subtitle);
+        player_set_subtitle_uri (player, uri);
+
+        g_object_unref (subtitle);
+        g_free (subtitle_path);
+        g_free (uri);
+        g_free (path);
+        return;
+      }
+
+      g_object_unref (subtitle);
+      g_free (subtitle_path);
+    }
+  }
+
+  g_free (path);
+}
+#endif
+
 static void
 player_set_uri (HrnIfacePlayer *player,
                 const char     *uri)
@@ -327,13 +414,16 @@ player_set_uri (HrnIfacePlayer *player,
 
   priv->duration = 0;
   clutter_media_set_uri ((ClutterMedia *) priv->video_player, uri);
+#ifndef USE_HELIX
+  look_for_locale_dependant_subtitle (player, uri);
+#endif
 }
 
 static void
 player_set_item (HrnIfacePlayer *player,
-                 BklItem        *item)
+                 HrnItem        *item)
 {
-    player_set_uri (player, bkl_item_get_uri (item));
+    player_set_uri (player, hrn_item_get_uri (item));
 }
 
 static void
diff -pruN 1.5.1-1/src/hrn-video-tile.c 1.8.4-1/src/hrn-video-tile.c
--- 1.5.1-1/src/hrn-video-tile.c	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-video-tile.c	2010-02-17 17:26:44.000000000 +0000
@@ -13,6 +13,9 @@ enum {
 struct _HrnVideoTilePrivate {
     HrnClusterNode *node;
     guint32 visibility_id;
+
+    ClutterActor *video;
+    guint32 video_id;
 };
 
 #define GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), HRN_TYPE_VIDEO_TILE, HrnVideoTilePrivate))
@@ -55,7 +58,7 @@ hrn_video_tile_set_property (GObject    
 {
     HrnVideoTile *self = (HrnVideoTile *) object;
     HrnVideoTilePrivate *priv = self->priv;
-    VideoCluster *video_cluster;
+    TileCluster *video_cluster;
 
     switch (prop_id) {
     case PROP_NODE:
@@ -65,7 +68,7 @@ hrn_video_tile_set_property (GObject    
              G_CALLBACK (node_visibility_changed), self);
         clutter_actor_set_name ((ClutterActor *) self, priv->node->name);
 
-        video_cluster = (VideoCluster *) priv->node->data;
+        video_cluster = (TileCluster *) priv->node->data;
         g_object_set (self,
                       "item", video_cluster->item,
                       NULL);
diff -pruN 1.5.1-1/src/hrn-video-tile-frame.c 1.8.4-1/src/hrn-video-tile-frame.c
--- 1.5.1-1/src/hrn-video-tile-frame.c	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/src/hrn-video-tile-frame.c	2011-03-15 13:20:21.000000000 +0000
@@ -0,0 +1,245 @@
+#include <clutter-gst/clutter-gst.h>
+#include "hrn-video-tile-frame.h"
+
+enum {
+    PROP_0,
+    PROP_URI,
+};
+
+enum {
+    LAST_SIGNAL,
+};
+
+struct _HrnVideoTileFramePrivate {
+    ClutterActor *group;
+    ClutterActor *background;
+    ClutterActor *video;
+    guint32 video_id;
+    char *uri;
+};
+
+#define GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), HRN_TYPE_VIDEO_TILE_FRAME, HrnVideoTileFramePrivate))
+G_DEFINE_TYPE (HrnVideoTileFrame, hrn_video_tile_frame, HRN_TYPE_TILE_FRAME);
+
+#define VIDEO_TIMEOUT 1
+
+static void
+hrn_video_tile_frame_finalize (GObject *object)
+{
+    G_OBJECT_CLASS (hrn_video_tile_frame_parent_class)->finalize (object);
+}
+
+static void
+hrn_video_tile_frame_dispose (GObject *object)
+{
+    G_OBJECT_CLASS (hrn_video_tile_frame_parent_class)->dispose (object);
+}
+
+static void
+hrn_video_tile_frame_set_property (GObject      *object,
+                                   guint         prop_id,
+                                   const GValue *value,
+                                   GParamSpec   *pspec)
+{
+    HrnVideoTileFrame *self = (HrnVideoTileFrame *) object;
+    HrnVideoTileFramePrivate *priv = self->priv;
+
+    switch (prop_id) {
+    case PROP_URI:
+        if (priv->uri) {
+            g_free (priv->uri);
+        }
+
+        priv->uri = g_value_dup_string (value);
+        break;
+
+    default:
+        break;
+    }
+}
+
+static void
+hrn_video_tile_frame_get_property (GObject    *object,
+                                   guint       prop_id,
+                                   GValue     *value,
+                                   GParamSpec *pspec)
+{
+}
+
+static void
+scale_background (ClutterActor          *actor,
+                  const ClutterActorBox *box,
+                  ClutterAllocationFlags flags,
+                  HrnVideoTileFrame     *frame)
+{
+    HrnVideoTileFramePrivate *priv = frame->priv;
+
+    clutter_actor_set_size (priv->background, box->x2 - box->x1,
+                            box->y2 - box->y1);
+}
+
+static void
+scale_video_player (ClutterTexture    *texture,
+                    float              width,
+                    float              height,
+                    HrnVideoTileFrame *frame)
+{
+    HrnVideoTileFramePrivate *priv = frame->priv;
+    float new_x, new_y, new_width, new_height;
+    float group_w, group_h;
+
+    clutter_actor_get_size (priv->group, &group_w, &group_h);
+
+    new_height = (height * group_w) / width;
+
+    if (new_height <= group_h) {
+        new_width = group_w;
+
+        new_x = 0;
+        new_y = (group_h - new_height) / 2;
+    } else {
+        new_width  = (width * group_h) / height;
+        new_height = group_h;
+
+        new_x = (group_w - new_width) / 2;
+        new_y = 0;
+    }
+
+    g_print ("Positioning video at %2f, %2f, %2fx%2f\n", new_x, new_y,
+             new_width, new_height);
+    clutter_actor_set_position ((ClutterActor *) texture, new_x, new_y);
+    clutter_actor_set_size ((ClutterActor *) texture, new_width, new_height);
+}
+
+static gboolean
+start_video (gpointer userdata)
+{
+    HrnVideoTileFrame *frame = (HrnVideoTileFrame *) userdata;
+    HrnVideoTileFramePrivate *priv = frame->priv;
+    ClutterColor black = { 0x00, 0x00, 0x00, 0xff };
+
+    g_print ("Starting video %s\n", priv->uri);
+    priv->video_id = 0;
+
+    priv->group = clutter_group_new ();
+    g_signal_connect (priv->group, "allocation-changed",
+                      G_CALLBACK (scale_background), frame);
+    priv->background = clutter_rectangle_new_with_color (&black);
+    clutter_container_add_actor ((ClutterContainer *) priv->group,
+                                 priv->background);
+    clutter_actor_set_position (priv->background, 0, 0);
+
+    priv->video = clutter_gst_video_texture_new ();
+    g_object_set (G_OBJECT (priv->video),
+                  "sync-size", FALSE,
+                  NULL);
+    g_signal_connect (priv->video, "size-change",
+                      G_CALLBACK (scale_video_player), frame);
+    clutter_container_add_actor ((ClutterContainer *) priv->group,
+                                 priv->video);
+
+    hrn_tile_frame_set_secondary_texture ((HrnTileFrame *) frame, priv->group);
+    clutter_media_set_audio_volume ((ClutterMedia *) priv->video, 0.0);
+    clutter_media_set_uri ((ClutterMedia *) priv->video, priv->uri);
+    clutter_media_set_playing ((ClutterMedia *) priv->video, TRUE);
+
+    return FALSE;
+}
+
+static gboolean
+hrn_video_tile_frame_enter (ClutterActor         *actor,
+                            ClutterCrossingEvent *event)
+{
+    HrnVideoTileFrame *frame = (HrnVideoTileFrame *) actor;
+    HrnVideoTileFramePrivate *priv = frame->priv;
+
+    if (priv->video_id == 0) {
+        priv->video_id = g_timeout_add_seconds (VIDEO_TIMEOUT,
+                                                start_video, frame);
+    }
+
+    CLUTTER_ACTOR_CLASS (hrn_video_tile_frame_parent_class)->enter_event
+        (actor, event);
+
+    return TRUE;
+}
+
+static gboolean
+hrn_video_tile_frame_leave (ClutterActor         *actor,
+                            ClutterCrossingEvent *event)
+{
+    HrnVideoTileFrame *frame = (HrnVideoTileFrame *) actor;
+    HrnVideoTileFramePrivate *priv = frame->priv;
+
+    if (priv->video_id > 0) {
+        g_source_remove (priv->video_id);
+        priv->video_id = 0;
+    }
+
+    if (priv->video) {
+        clutter_media_set_playing ((ClutterMedia *) priv->video, FALSE);
+        clutter_actor_destroy (priv->group);
+        hrn_tile_frame_set_secondary_texture ((HrnTileFrame *) frame, NULL);
+        priv->video = NULL;
+    }
+
+    CLUTTER_ACTOR_CLASS (hrn_video_tile_frame_parent_class)->leave_event
+        (actor, event);
+
+    return TRUE;
+}
+
+static gboolean
+hrn_video_tile_frame_press_event (ClutterActor       *actor,
+                                  ClutterButtonEvent *event)
+{
+        HrnVideoTileFrame *frame = (HrnVideoTileFrame *) actor;
+    HrnVideoTileFramePrivate *priv = frame->priv;
+
+    if (priv->video_id > 0) {
+        g_source_remove (priv->video_id);
+        priv->video_id = 0;
+    }
+
+    if (priv->video) {
+        clutter_media_set_playing ((ClutterMedia *) priv->video, FALSE);
+        clutter_actor_destroy (priv->group);
+        hrn_tile_frame_set_secondary_texture ((HrnTileFrame *) frame, NULL);
+        priv->video = NULL;
+    }
+
+    return CLUTTER_ACTOR_CLASS
+        (hrn_video_tile_frame_parent_class)->button_press_event (actor, event);
+}
+
+static void
+hrn_video_tile_frame_class_init (HrnVideoTileFrameClass *klass)
+{
+    GObjectClass *o_class = (GObjectClass *) klass;
+    ClutterActorClass *a_class = (ClutterActorClass *) klass;
+
+    o_class->dispose = hrn_video_tile_frame_dispose;
+    o_class->finalize = hrn_video_tile_frame_finalize;
+    o_class->set_property = hrn_video_tile_frame_set_property;
+    o_class->get_property = hrn_video_tile_frame_get_property;
+
+    a_class->enter_event = hrn_video_tile_frame_enter;
+    a_class->leave_event = hrn_video_tile_frame_leave;
+    a_class->button_press_event = hrn_video_tile_frame_press_event;
+
+    g_type_class_add_private (klass, sizeof (HrnVideoTileFramePrivate));
+
+    g_object_class_install_property (o_class, PROP_URI,
+                                     g_param_spec_string ("uri", "", "", "",
+                                                          G_PARAM_WRITABLE |
+                                                          G_PARAM_STATIC_STRINGS));
+}
+
+static void
+hrn_video_tile_frame_init (HrnVideoTileFrame *self)
+{
+    HrnVideoTileFramePrivate *priv = GET_PRIVATE (self);
+
+    self->priv = priv;
+}
+
diff -pruN 1.5.1-1/src/hrn-video-tile-frame.h 1.8.4-1/src/hrn-video-tile-frame.h
--- 1.5.1-1/src/hrn-video-tile-frame.h	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/src/hrn-video-tile-frame.h	2011-03-15 13:20:21.000000000 +0000
@@ -0,0 +1,50 @@
+#ifndef __HRN_VIDEO_TILE_FRAME_H__
+#define __HRN_VIDEO_TILE_FRAME_H__
+
+#include "hrn-tile-frame.h"
+
+
+G_BEGIN_DECLS
+
+#define HRN_TYPE_VIDEO_TILE_FRAME                                       \
+   (hrn_video_tile_frame_get_type())
+#define HRN_VIDEO_TILE_FRAME(obj)                                       \
+   (G_TYPE_CHECK_INSTANCE_CAST ((obj),                                  \
+                                HRN_TYPE_VIDEO_TILE_FRAME,              \
+                                HrnVideoTileFrame))
+#define HRN_VIDEO_TILE_FRAME_CLASS(klass)                               \
+   (G_TYPE_CHECK_CLASS_CAST ((klass),                                   \
+                             HRN_TYPE_VIDEO_TILE_FRAME,                 \
+                             HrnVideoTileFrameClass))
+#define IS_HRN_VIDEO_TILE_FRAME(obj)                                    \
+   (G_TYPE_CHECK_INSTANCE_TYPE ((obj),                                  \
+                                HRN_TYPE_VIDEO_TILE_FRAME))
+#define IS_HRN_VIDEO_TILE_FRAME_CLASS(klass)                            \
+   (G_TYPE_CHECK_CLASS_TYPE ((klass),                                   \
+                             HRN_TYPE_VIDEO_TILE_FRAME))
+#define HRN_VIDEO_TILE_FRAME_GET_CLASS(obj)                             \
+   (G_TYPE_INSTANCE_GET_CLASS ((obj),                                   \
+                               HRN_TYPE_VIDEO_TILE_FRAME,               \
+                               HrnVideoTileFrameClass))
+
+typedef struct _HrnVideoTileFramePrivate HrnVideoTileFramePrivate;
+typedef struct _HrnVideoTileFrame      HrnVideoTileFrame;
+typedef struct _HrnVideoTileFrameClass HrnVideoTileFrameClass;
+
+struct _HrnVideoTileFrame
+{
+    HrnTileFrame parent;
+
+    HrnVideoTileFramePrivate *priv;
+};
+
+struct _HrnVideoTileFrameClass
+{
+    HrnTileFrameClass parent_class;
+};
+
+GType hrn_video_tile_frame_get_type (void) G_GNUC_CONST;
+
+G_END_DECLS
+
+#endif /* __HRN_VIDEO_TILE_FRAME_H__ */
diff -pruN 1.5.1-1/src/hrn-view.c 1.8.4-1/src/hrn-view.c
--- 1.5.1-1/src/hrn-view.c	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-view.c	2011-03-15 13:20:21.000000000 +0000
@@ -23,8 +23,8 @@ enum {
 /* #define DEBUG_SIZE 1 */
 
 struct _HrnViewPrivate {
-    NbtkAdjustment *hadjustment;
-    NbtkAdjustment *vadjustment;
+    MxAdjustment *hadjustment;
+    MxAdjustment *vadjustment;
 
     HrnClusterNode *root;
     guint32 child_added_id;
@@ -57,24 +57,24 @@ static gboolean debug_visible = FALSE;
 
 #define GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), HRN_TYPE_VIEW, HrnViewPrivate))
 
-static void scrollable_set_adjustments (NbtkScrollable *scrollable,
-                                        NbtkAdjustment *hadjustment,
-                                        NbtkAdjustment *vadjustment);
-static void scrollable_get_adjustments (NbtkScrollable  *scrollable,
-                                        NbtkAdjustment **hadjustment,
-                                        NbtkAdjustment **vadjustment);
-static void scrollable_interface_init (NbtkScrollableInterface *iface);
+static void scrollable_set_adjustments (MxScrollable *scrollable,
+                                        MxAdjustment *hadjustment,
+                                        MxAdjustment *vadjustment);
+static void scrollable_get_adjustments (MxScrollable  *scrollable,
+                                        MxAdjustment **hadjustment,
+                                        MxAdjustment **vadjustment);
+static void scrollable_interface_init (MxScrollableIface *iface);
 static void container_interface_init (ClutterContainerIface *iface);
 static void tiler_interface_init (HrnTilerInterface *iface);
 static void viewer_interface_init (HrnViewerInterface *iface);
-G_DEFINE_TYPE_WITH_CODE (HrnView, hrn_view, NBTK_TYPE_WIDGET,
+G_DEFINE_TYPE_WITH_CODE (HrnView, hrn_view, MX_TYPE_WIDGET,
                          G_IMPLEMENT_INTERFACE (HRN_TYPE_TILER,
                                                 tiler_interface_init)
                          G_IMPLEMENT_INTERFACE (HRN_TYPE_VIEWER,
                                                 viewer_interface_init)
                          G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_CONTAINER,
                                                 container_interface_init)
-                         G_IMPLEMENT_INTERFACE (NBTK_TYPE_SCROLLABLE,
+                         G_IMPLEMENT_INTERFACE (MX_TYPE_SCROLLABLE,
                                                 scrollable_interface_init));
 
 static guint32 signals[LAST_SIGNAL] = {0,};
@@ -102,13 +102,13 @@ hrn_view_set_property (GObject      *obj
 
     switch (prop_id) {
     case PROP_HADJUST:
-        scrollable_set_adjustments (NBTK_SCROLLABLE (object),
+        scrollable_set_adjustments (MX_SCROLLABLE (object),
                                     g_value_get_object (value),
                                     priv->vadjustment);
         break;
 
     case PROP_VADJUST:
-        scrollable_set_adjustments (NBTK_SCROLLABLE (object),
+        scrollable_set_adjustments (MX_SCROLLABLE (object),
                                     priv->hadjustment,
                                     g_value_get_object (value));
         break;
@@ -124,16 +124,16 @@ hrn_view_get_property (GObject    *objec
                        GValue     *value,
                        GParamSpec *pspec)
 {
-    NbtkAdjustment *adj;
+    MxAdjustment *adj;
 
     switch (prop_id) {
     case PROP_HADJUST:
-        scrollable_get_adjustments (NBTK_SCROLLABLE (object), &adj, NULL);
+        scrollable_get_adjustments (MX_SCROLLABLE (object), &adj, NULL);
         g_value_set_object (value, adj);
         break;
 
     case PROP_VADJUST:
-        scrollable_get_adjustments (NBTK_SCROLLABLE (object), NULL, &adj);
+        scrollable_get_adjustments (MX_SCROLLABLE (object), NULL, &adj);
         g_value_set_object (value, adj);
         break;
 
@@ -152,13 +152,13 @@ hrn_view_paint (ClutterActor *actor)
     ClutterActorBox view_box;
 
     if (priv->hadjustment) {
-        x = nbtk_adjustment_get_value (priv->hadjustment);
+        x = mx_adjustment_get_value (priv->hadjustment);
     } else {
         x = 0;
     }
 
     if (priv->vadjustment) {
-        y = nbtk_adjustment_get_value (priv->vadjustment);
+        y = mx_adjustment_get_value (priv->vadjustment);
     } else {
         y = 0;
     }
@@ -216,13 +216,13 @@ hrn_view_pick (ClutterActor       *actor
     ClutterActorBox view_box;
 
     if (priv->hadjustment) {
-        x = nbtk_adjustment_get_value (priv->hadjustment);
+        x = mx_adjustment_get_value (priv->hadjustment);
     } else {
         x = 0;
     }
 
     if (priv->vadjustment) {
-        y = nbtk_adjustment_get_value (priv->vadjustment);
+        y = mx_adjustment_get_value (priv->vadjustment);
     } else {
         y = 0;
     }
@@ -280,13 +280,13 @@ hrn_view_apply_transform (ClutterActor *
     CLUTTER_ACTOR_CLASS (hrn_view_parent_class)->apply_transform (actor, matrix);
 
     if (priv->hadjustment) {
-        x = nbtk_adjustment_get_value (priv->hadjustment);
+        x = mx_adjustment_get_value (priv->hadjustment);
     } else {
         x = 0;
     }
 
     if (priv->vadjustment) {
-        y = nbtk_adjustment_get_value (priv->vadjustment);
+        y = mx_adjustment_get_value (priv->vadjustment);
     } else {
         y = 0;
     }
@@ -306,9 +306,9 @@ hrn_view_do_allocate (ClutterActor      
     HrnViewPrivate *priv = view->priv;
     GSequenceIter *iter;
     int row_count, i;
-    NbtkPadding padding;
+    MxPadding padding;
 
-    nbtk_widget_get_padding (NBTK_WIDGET (actor), &padding);
+    mx_widget_get_padding (MX_WIDGET (actor), &padding);
 
     i = 0;
     if (priv->shown_child) {
@@ -457,17 +457,20 @@ hrn_view_allocate (ClutterActor         
 
     if (priv->vadjustment) {
         double prev_value;
-        float height;
+        float height, page_inc;
 
         hrn_view_do_allocate (actor, box, flags, TRUE, NULL, &height);
         alloc_box.y2 = alloc_box.y1 + height;
 
+        for (page_inc = 0;
+             (page_inc + ITEM_HEIGHT + ROW_GAP) <= (box->y2 - box->y1);
+             page_inc += ITEM_HEIGHT + ROW_GAP);
         g_object_set (priv->vadjustment,
                       "lower", 0.0,
                       "upper", height,
                       "page-size", box->y2 - box->y1,
                       "step-increment", ITEM_HEIGHT + ROW_GAP,
-                      "page-increment", box->y2 - box->y1,
+                      "page-increment", page_inc,
                       NULL);
         if (priv->hadjustment) {
             g_object_set (priv->hadjustment,
@@ -476,8 +479,8 @@ hrn_view_allocate (ClutterActor         
                           NULL);
         }
 
-        prev_value = nbtk_adjustment_get_value (priv->vadjustment);
-        nbtk_adjustment_set_value (priv->vadjustment, prev_value);
+        prev_value = mx_adjustment_get_value (priv->vadjustment);
+        mx_adjustment_set_value (priv->vadjustment, prev_value);
     }
 
     /* Calculate items per row */
@@ -531,13 +534,13 @@ ensure_children_are_visible (HrnView *vi
     ClutterActorBox view_b;
 
     if (priv->hadjustment) {
-        x = nbtk_adjustment_get_value (priv->hadjustment);
+        x = mx_adjustment_get_value (priv->hadjustment);
     } else {
         x = 0;
     }
 
     if (priv->vadjustment) {
-        y = nbtk_adjustment_get_value (priv->vadjustment);
+        y = mx_adjustment_get_value (priv->vadjustment);
     } else {
         y = 0;
     }
@@ -569,7 +572,7 @@ ensure_children_are_visible (HrnView *vi
 
 /* scrollable interface */
 static void
-adj_value_notify_cb (NbtkAdjustment *adjustment,
+adj_value_notify_cb (MxAdjustment *adjustment,
                             GParamSpec     *pspec,
                             HrnView        *view)
 {
@@ -578,9 +581,9 @@ adj_value_notify_cb (NbtkAdjustment *adj
 }
 
 static void
-scrollable_set_adjustments (NbtkScrollable *scrollable,
-                            NbtkAdjustment *hadjustment,
-                            NbtkAdjustment *vadjustment)
+scrollable_set_adjustments (MxScrollable *scrollable,
+                            MxAdjustment *hadjustment,
+                            MxAdjustment *vadjustment)
 {
     HrnView *view = (HrnView *) scrollable;
     HrnViewPrivate *priv = view->priv;
@@ -621,9 +624,9 @@ scrollable_set_adjustments (NbtkScrollab
 }
 
 static void
-scrollable_get_adjustments (NbtkScrollable  *scrollable,
-                            NbtkAdjustment **hadjustment,
-                            NbtkAdjustment **vadjustment)
+scrollable_get_adjustments (MxScrollable  *scrollable,
+                            MxAdjustment **hadjustment,
+                            MxAdjustment **vadjustment)
 {
     HrnView *view = (HrnView *) scrollable;
     HrnViewPrivate *priv = view->priv;
@@ -635,12 +638,12 @@ scrollable_get_adjustments (NbtkScrollab
         if (priv->hadjustment) {
             *hadjustment = priv->hadjustment;
         } else {
-            NbtkAdjustment *adj;
+            MxAdjustment *adj;
             double width, increment;
 
             width = clutter_actor_get_width (actor);
             increment = MAX (1.0, width);
-            adj = nbtk_adjustment_new (0, 0, width, 1.0,
+            adj = mx_adjustment_new_with_values (0, 0, width, 1.0,
                                        increment, increment);
             scrollable_set_adjustments (scrollable, adj, priv->vadjustment);
             *hadjustment = adj;
@@ -651,12 +654,12 @@ scrollable_get_adjustments (NbtkScrollab
         if (priv->vadjustment) {
             *vadjustment = priv->vadjustment;
         } else {
-            NbtkAdjustment *adj;
+            MxAdjustment *adj;
             double height, increment;
 
             height = clutter_actor_get_height (actor);
             increment = MAX (1.0, height);
-            adj = nbtk_adjustment_new (0, 0, height, 1.0,
+            adj = mx_adjustment_new_with_values (0, 0, height, 1.0,
                                        increment, increment);
             scrollable_set_adjustments (scrollable, priv->hadjustment, adj);
             *vadjustment = adj;
@@ -665,7 +668,7 @@ scrollable_get_adjustments (NbtkScrollab
 }
 
 static void
-scrollable_interface_init (NbtkScrollableInterface *iface)
+scrollable_interface_init (MxScrollableIface *iface)
 {
     iface->set_adjustments = scrollable_set_adjustments;
     iface->get_adjustments = scrollable_get_adjustments;
@@ -789,8 +792,6 @@ child_activated (HrnTileable      *tilea
     case HRN_TILEABLE_ACTION_SHOW_ALL:
         g_print ("View showing all\n");
         payload_node = hrn_tileable_get_node ((HrnTileable *) payload);
-        /* hrn_view_reset (view); */
-        /* hrn_tiler_show_all ((HrnTiler *) view); */
 
         iter = g_sequence_get_begin_iter (priv->root->children);
         while (g_sequence_iter_is_end (iter) == FALSE) {
@@ -1044,6 +1045,20 @@ tiler_show (HrnTiler    *tiler,
 }
 
 static void
+tiler_show_node (HrnTiler       *tiler,
+                 HrnClusterNode *node)
+{
+    HrnView *view = (HrnView *) tiler;
+    HrnViewPrivate *priv = view->priv;
+
+    if (priv->root == node) {
+        hrn_view_reset (view);
+    } else if (priv->shown_child && HRN_IS_TILER (priv->shown_child)) {
+        hrn_tiler_show_node ((HrnTiler *) priv->shown_child, node);
+    }
+}
+
+static void
 tiler_set_expanded (HrnTiler *tiler,
                     gboolean  expanded)
 {
@@ -1207,6 +1222,7 @@ tiler_interface_init (HrnTilerInterface 
 {
     iface->show_all = tiler_show_all;
     iface->show = tiler_show;
+    iface->show_node = tiler_show_node;
     iface->set_expanded = tiler_set_expanded;
     iface->set_items_per_row = tiler_set_items_per_row;
     iface->add_items = tiler_add_items;
@@ -1283,6 +1299,7 @@ hrn_view_reset (HrnView *view)
         return;
     }
 
+    g_print ("resetting view\n");
     priv->shown_child = NULL;
 
     iter = g_sequence_get_begin_iter (priv->root->children);
@@ -1290,7 +1307,7 @@ hrn_view_reset (HrnView *view)
         HrnClusterNode *child_node = g_sequence_get (iter);
         ClutterActor *child;
 
-        hrn_cluster_node_set_hidden (child_node, FALSE);
+        hrn_cluster_node_set_children_hidden (child_node, FALSE);
 
         child = g_hash_table_lookup (priv->child_items, child_node);
         if (child == NULL) {
@@ -1299,6 +1316,10 @@ hrn_view_reset (HrnView *view)
             continue;
         }
 
+#if 0
+        clutter_actor_show (child);
+        clutter_actor_set_opacity (child, 0xff);
+#endif
         if (HRN_IS_TILER (child)) {
             hrn_tiler_set_expanded ((HrnTiler *) child, FALSE);
             hrn_tiler_show_all ((HrnTiler *) child);
diff -pruN 1.5.1-1/src/hrn-view.h 1.8.4-1/src/hrn-view.h
--- 1.5.1-1/src/hrn-view.h	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-view.h	2010-02-17 17:26:44.000000000 +0000
@@ -1,7 +1,7 @@
 #ifndef __HRN_VIEW_H__
 #define __HRN_VIEW_H__
 
-#include <nbtk/nbtk.h>
+#include <mx/mx.h>
 
 
 G_BEGIN_DECLS
@@ -33,14 +33,14 @@ typedef struct _HrnViewClass HrnViewClas
 
 struct _HrnView
 {
-    NbtkWidget parent;
+    MxWidget parent;
 
     HrnViewPrivate *priv;
 };
 
 struct _HrnViewClass
 {
-    NbtkWidgetClass parent_class;
+    MxWidgetClass parent_class;
 };
 
 GType hrn_view_get_type (void) G_GNUC_CONST;
diff -pruN 1.5.1-1/src/hrn-window.c 1.8.4-1/src/hrn-window.c
--- 1.5.1-1/src/hrn-window.c	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-window.c	2010-02-17 17:26:44.000000000 +0000
@@ -2,22 +2,60 @@
 #include <gtk/gtk.h>
 #include <clutter-gtk/clutter-gtk.h>
 
+#include <dbus/dbus-glib.h>
+#include <dbus/dbus-glib-bindings.h>
+
 #include "hrn-window.h"
 #include "hrn-state-manager.h"
+#include "hrn-marshal.h"
 #include "hrn.h"
 
 enum {
     PROP_0,
 };
 
+enum {
+    ACTION,
+    LAST_SIGNAL
+};
+
 struct _HrnWindowPrivate {
     GtkClutterEmbed *embed;
     ClutterActor *internal;
     HrnStateManager *state_manager;
+
+    DBusGProxy *mmkeys;
 };
 
 #define GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), HRN_TYPE_WINDOW, HrnWindowPrivate))
 G_DEFINE_TYPE (HrnWindow, hrn_window, GTK_TYPE_WINDOW);
+static guint32 signals[LAST_SIGNAL] = {0, };
+
+static void
+grab_keys (HrnWindow *window)
+{
+    HrnWindowPrivate *priv = window->priv;
+
+    if (priv->mmkeys) {
+        dbus_g_proxy_call (priv->mmkeys, "GrabMediaPlayerKeys", NULL,
+                           G_TYPE_STRING, "Hornsey",
+                           G_TYPE_UINT, 0,
+                           G_TYPE_INVALID, G_TYPE_INVALID);
+    }
+}
+
+static void
+release_keys (HrnWindow *window)
+{
+    HrnWindowPrivate *priv = window->priv;
+
+    if (priv->mmkeys) {
+        g_print ("Releasing keys\n");
+        dbus_g_proxy_call (priv->mmkeys, "ReleaseMediaPlayerKeys", NULL,
+                           G_TYPE_STRING, "Hornsey",
+                           G_TYPE_INVALID, G_TYPE_INVALID);
+    }
+}
 
 static void
 hrn_window_finalize (GObject *object)
@@ -28,6 +66,15 @@ hrn_window_finalize (GObject *object)
 static void
 hrn_window_dispose (GObject *object)
 {
+    HrnWindow *window = (HrnWindow *) object;
+    HrnWindowPrivate *priv = window->priv;
+
+    if (priv->mmkeys) {
+        release_keys (window);
+        g_object_unref (priv->mmkeys);
+        priv->mmkeys = NULL;
+    }
+
     G_OBJECT_CLASS (hrn_window_parent_class)->dispose (object);
 }
 
@@ -72,6 +119,14 @@ hrn_window_key_press_event (GtkWidget   
     return gtk_window_propagate_key_event (window, event);
 }
 
+static gboolean
+hrn_window_focus_in_event (GtkWidget     *widget,
+                           GdkEventFocus *event)
+{
+    grab_keys (HRN_WINDOW (widget));
+    return FALSE;
+}
+
 static void
 hrn_window_class_init (HrnWindowClass *klass)
 {
@@ -84,8 +139,16 @@ hrn_window_class_init (HrnWindowClass *k
     o_class->get_property = hrn_window_get_property;
 
     w_class->key_press_event = hrn_window_key_press_event;
+    w_class->focus_in_event = hrn_window_focus_in_event;
 
     g_type_class_add_private (klass, sizeof (HrnWindowPrivate));
+
+    signals[ACTION] = g_signal_new ("action",
+                                    G_TYPE_FROM_CLASS (klass),
+                                    G_SIGNAL_RUN_FIRST |
+                                    G_SIGNAL_NO_RECURSE, 0, NULL, NULL,
+                                    g_cclosure_marshal_VOID__INT,
+                                    G_TYPE_NONE, 1, G_TYPE_INT);
 }
 
 static void
@@ -112,17 +175,51 @@ on_stage_resize (GObject *object,
 }
 
 static void
+mmkeys_press_cb (DBusGProxy *proxy,
+                 const char *application,
+                 const char *key,
+                 HrnWindow  *window)
+{
+    if (g_str_equal (application, "Hornsey")) {
+        if (g_str_equal (key, "Play")) {
+            g_signal_emit (window, signals[ACTION], 0,
+                           HRN_WINDOW_ACTION_PLAY);
+        } else if (g_str_equal (key, "Previous")) {
+            g_signal_emit (window, signals[ACTION], 0,
+                           HRN_WINDOW_ACTION_PREVIOUS);
+        } else if (g_str_equal (key, "Next")) {
+            g_signal_emit (window, signals[ACTION], 0,
+                           HRN_WINDOW_ACTION_NEXT);
+        } else if (g_str_equal (key, "Stop")) {
+            g_signal_emit (window, signals[ACTION], 0,
+                           HRN_WINDOW_ACTION_PAUSE);
+        }
+    }
+}
+
+static void
+mmkeys_destroyed_cb (DBusGProxy *proxy,
+                     HrnWindow  *window)
+{
+    HrnWindowPrivate *priv = window->priv;
+
+    priv->mmkeys = NULL;
+}
+
+static void
 hrn_window_init (HrnWindow *self)
 {
     HrnWindowPrivate *priv;
     ClutterActor *stage;
+    DBusGConnection *conn;
     GError *error = NULL;
 
     priv = GET_PRIVATE (self);
     self->priv = priv;
 
-    gtk_window_set_icon_from_file ((GtkWindow *) self,
-                                   THEMEDIR "/hornsey.png", &error);
+    gtk_window_set_icon_name ((GtkWindow *) self,
+                              "hornsey");
+
     if (error) {
         g_warning ("Error setting window icon: %s", error->message);
         g_error_free (error);
@@ -136,6 +233,37 @@ hrn_window_init (HrnWindow *self)
     g_signal_connect (G_OBJECT (stage),
                       "notify::allocation", G_CALLBACK (on_stage_resize),
                       NULL);
+
+    conn = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
+    if (error != NULL) {
+        g_warning ("Error getting bus: %s", error->message);
+        g_error_free (error);
+        return;
+    }
+
+    priv->mmkeys = dbus_g_proxy_new_for_name_owner (conn,
+                                                    "org.gnome.SettingsDaemon",
+                                                    "/org/gnome/SettingsDaemon/MediaKeys",
+                                                    "org.gnome.SettingsDaemon.MediaKeys",
+                                                    &error);
+    dbus_g_connection_unref (conn);
+    if (error != NULL) {
+        g_warning ("Could not setup multimedia-keys: %s", error->message);
+        g_error_free (error);
+        return;
+    }
+    g_signal_connect (priv->mmkeys, "destroy",
+                      G_CALLBACK (mmkeys_destroyed_cb), self);
+
+    dbus_g_object_register_marshaller (hrn_marshal_VOID__STRING_STRING,
+                                       G_TYPE_NONE, G_TYPE_STRING,
+                                       G_TYPE_STRING, G_TYPE_INVALID);
+    dbus_g_proxy_add_signal (priv->mmkeys, "MediaPlayerKeyPressed",
+                             G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID);
+    dbus_g_proxy_connect_signal (priv->mmkeys, "MediaPlayerKeyPressed",
+                                 G_CALLBACK (mmkeys_press_cb), self, NULL);
+
+    grab_keys (self);
 }
 
 HrnWindow *
@@ -209,7 +337,12 @@ hrn_window_set_internal_actor (HrnWindow
 void
 hrn_window_present (HrnWindow *window)
 {
-  gdk_window_focus (gtk_widget_get_window (GTK_WIDGET (window)), 
+  gdk_window_focus (gtk_widget_get_window (GTK_WIDGET (window)),
                     gtk_get_current_event_time ());
 }
 
+void
+hrn_window_release_keys (HrnWindow *window)
+{
+    release_keys (window);
+}
diff -pruN 1.5.1-1/src/hrn-window.h 1.8.4-1/src/hrn-window.h
--- 1.5.1-1/src/hrn-window.h	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/hrn-window.h	2010-02-17 17:26:44.000000000 +0000
@@ -27,6 +27,13 @@ G_BEGIN_DECLS
                                HRN_TYPE_WINDOW,                         \
                                HrnWindowClass))
 
+typedef enum _HrnWindowAction {
+    HRN_WINDOW_ACTION_PLAY,
+    HRN_WINDOW_ACTION_PAUSE,
+    HRN_WINDOW_ACTION_NEXT,
+    HRN_WINDOW_ACTION_PREVIOUS
+} HrnWindowAction;
+
 typedef struct _HrnWindowPrivate HrnWindowPrivate;
 typedef struct _HrnWindow      HrnWindow;
 typedef struct _HrnWindowClass HrnWindowClass;
@@ -51,6 +58,7 @@ ClutterActor *hrn_window_get_stage (HrnW
 void hrn_window_set_internal_actor (HrnWindow    *self,
                                     ClutterActor *actor);
 void hrn_window_present (HrnWindow *window);
+void hrn_window_release_keys (HrnWindow *window);
 
 
 
diff -pruN 1.5.1-1/src/Makefile.am 1.8.4-1/src/Makefile.am
--- 1.5.1-1/src/Makefile.am	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/Makefile.am	2010-02-17 17:26:44.000000000 +0000
@@ -2,7 +2,9 @@ QUIET_GEN = $(Q:@=@echo '  GEN   '$@;)
 
 bin_PROGRAMS=hornsey
 
-AM_CFLAGS = $(DEPS_CFLAGS) $(GCC_FLAGS) \
+AM_CFLAGS = $(DEPS_CFLAGS) \
+	    $(HRN_CFLAGS) \
+	    $(HRN_DEBUG_CFLAGS) \
 	    -D_GNU_SOURCE \
 	    -DPKGDATADIR=\"$(pkgdatadir)/\" \
 	    -DTHEMEDIR=\"$(pkgdatadir)/\" \
@@ -10,9 +12,10 @@ AM_CFLAGS = $(DEPS_CFLAGS) $(GCC_FLAGS) 
 
 hornsey_built_sources = hrn-marshal.c \
 	hrn-marshal.h
+tumbler_built_sources = tumbler-service-dbus-glue.h
 
-BUILT_SOURCES = $(hornsey_built_sources)
-CLEANFILES    = $(hornsey_built_sources)
+BUILT_SOURCES = $(hornsey_built_sources) $(tumbler_built_sources)
+CLEANFILES    = $(hornsey_built_sources) $(tumbler_built_sources)
 
 hornsey_LDADD  = $(DEPS_LIBS)
 hornsey_SOURCES = 		\
@@ -20,6 +23,8 @@ hornsey_SOURCES = 		\
   hornsey.c  \
   hrn-content-area.c \
   hrn-content-area.h \
+  hrn-debug.c \
+  hrn-debug.h \
   hrn-drag-n-drop.c  \
   hrn-drag-n-drop.h  \
   hrn.h  \
@@ -31,10 +36,12 @@ hornsey_SOURCES = 		\
   hrn-button.h  \
   hrn-pin-manager.c \
   hrn-pin-manager.h \
-  hrn-popup.c  \
-  hrn-popup.h  \
   hrn-queue.c  \
   hrn-queue.h  \
+  hrn-queue-item-factory.c \
+  hrn-queue-item-factory.h \
+  hrn-queue-item.c \
+  hrn-queue-item.h \
   hrn-queue-header.c \
   hrn-queue-header.h \
   hrn-queue-controls.c \
@@ -45,14 +52,8 @@ hornsey_SOURCES = 		\
   hrn-sidebar.h  \
   hrn-sidebar-item.c \
   hrn-sidebar-item.h \
-  hrn-sidebar-item-factory.c \
-  hrn-sidebar-item-factory.h \
   hrn-sidebar-subitem.c \
   hrn-sidebar-subitem.h \
-  hrn-source.c \
-  hrn-source.h \
-  hrn-source-manager.c \
-  hrn-source-manager.h \
   hrn-spinner.c \
   hrn-spinner.h \
   hrn-state-manager.c \
@@ -71,8 +72,8 @@ hornsey_SOURCES = 		\
   hrn-ui-controls.h \
   hrn-window.c \
   hrn-window.h \
-  nbtk-im-label.h \
-  nbtk-im-label.c \
+  hrn-im-label.h \
+  hrn-im-label.c \
   hrn-cluster-node.c \
   hrn-cluster-node.h \
   hrn-cluster-tree.c \
@@ -113,7 +114,15 @@ hornsey_SOURCES = 		\
   hrn-tile-frame.h \
   hrn-up-tile.c \
   hrn-up-tile.h \
-  hrn-type.h
+  hrn-type.h \
+  hrn-item.c \
+  hrn-item.h \
+  hrn-tracker-client.c \
+  hrn-tracker-client.h \
+  hrn-thumbnailer.c \
+  hrn-thumbnailer.h \
+  hrn-video-tile-frame.c \
+  hrn-video-tile-frame.h
 
 hrn-marshal.h: hrn-marshal.list
 	$(QUIET_GEN)$(GLIB_GENMARSHAL) $< --header --prefix=hrn_marshal > $@
@@ -121,6 +130,8 @@ hrn-marshal.c: hrn-marshal.list
 	$(QUIET_GEN)echo "#include \"hrn-marshal.h\"" > $@ \
 	&& $(GLIB_GENMARSHAL) $< --body --prefix=hrn_marshal >> $@
 
+tumbler-service-dbus-glue.h: tumbler-service-dbus.xml
+	$(QUIET_GEN)$(DBUSBINDINGTOOL) --mode=glib-client --output=$@ --prefix=$(subst -,_,$*) $^
 test: hornsey
 	./hornsey
 
@@ -131,4 +142,4 @@ gdb2: all
 valgrind: all
 		valgrind --leak-check=full ./hornsey -w
 
-EXTRA_DIST = hrn-marshal.list
+EXTRA_DIST = hrn-marshal.list tumbler-service-dbus.xml
diff -pruN 1.5.1-1/src/nbtk-im-label.c 1.8.4-1/src/nbtk-im-label.c
--- 1.5.1-1/src/nbtk-im-label.c	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/nbtk-im-label.c	1970-01-01 01:00:00.000000000 +0100
@@ -1,456 +0,0 @@
-/*
- * nbtk-label.c: Plain label actor
- *
- * Copyright 2008,2009 Intel Corporation
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU Lesser General Public License,
- * version 2.1, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- * FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
- * more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Written by: Thomas Wood <thomas@linux.intel.com>
- *
- */
-
-/**
- * SECTION:nbtk-label
- * @short_description: Widget for displaying text
- *
- * #NbtkIMLabel is a simple widget for displaying text. It derives from
- * #NbtkWidget to add extra style and placement functionality over
- * #ClutterText. The internal #ClutterText is publicly accessibly to allow
- * applications to set further properties. 
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-
-#include <glib.h>
-
-#include <clutter/clutter.h>
-#include <clutter-imcontext/clutter-imtext.h>
-
-#include <nbtk/nbtk.h>
-#include "nbtk-im-label.h"
-
-enum
-{
-  PROP_0,
-
-  PROP_LABEL
-};
-
-#define NBTK_IM_LABEL_GET_PRIVATE(obj)     (G_TYPE_INSTANCE_GET_PRIVATE ((obj), NBTK_TYPE_IM_LABEL, NbtkIMLabelPrivate))
-
-struct _NbtkIMLabelPrivate
-{
-  ClutterActor *label;
-};
-
-G_DEFINE_TYPE (NbtkIMLabel, nbtk_im_label, NBTK_TYPE_WIDGET);
-
-static void
-nbtk_im_label_set_property (GObject      *gobject,
-                           guint         prop_id,
-                           const GValue *value,
-                           GParamSpec   *pspec)
-{
-  NbtkIMLabel *label = NBTK_IM_LABEL (gobject);
-
-  switch (prop_id)
-    {
-    case PROP_LABEL:
-      nbtk_im_label_set_text (label, g_value_get_string (value));
-      break;
-
-    default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
-      break;
-    }
-}
-
-static void
-nbtk_im_label_get_property (GObject    *gobject,
-                           guint       prop_id,
-                           GValue     *value,
-                           GParamSpec *pspec)
-{
-  NbtkIMLabelPrivate *priv = NBTK_IM_LABEL (gobject)->priv;
-
-  switch (prop_id)
-    {
-    case PROP_LABEL:
-      g_value_set_string (value, clutter_text_get_text (CLUTTER_TEXT (priv->label)));
-      break;
-
-    default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
-      break;
-    }
-}
-
-static void
-nbtk_im_label_style_changed (NbtkWidget *self)
-{
-  NbtkIMLabelPrivate *priv = NBTK_IM_LABEL (self)->priv;
-  ClutterColor *color = NULL;
-  gchar *font_name;
-  gchar *font_string;
-  gint font_size;
-
-  nbtk_stylable_get (NBTK_STYLABLE (self),
-                     "color", &color,
-                     "font-family", &font_name,
-                     "font-size", &font_size,
-                     NULL);
-
-  if (color)
-    {
-      clutter_text_set_color (CLUTTER_TEXT (priv->label), color);
-      clutter_color_free (color);
-    }
-
-  if (font_name || font_size)
-    {
-      if (font_name && font_size)
-        {
-          font_string = g_strdup_printf ("%s %dpx", font_name, font_size);
-          g_free (font_name);
-        }
-      else
-        {
-          if (font_size)
-            font_string = g_strdup_printf ("%dpx", font_size);
-          else
-            font_string = font_name;
-        }
-
-      clutter_text_set_font_name (CLUTTER_TEXT (priv->label), font_string);
-      g_free (font_string);
-    }
-
-}
-
-static void
-nbtk_im_label_get_preferred_width (ClutterActor *actor,
-                                gfloat        for_height,
-                                gfloat       *min_width_p,
-                                gfloat       *natural_width_p)
-{
-  NbtkIMLabelPrivate *priv = NBTK_IM_LABEL (actor)->priv;
-  NbtkPadding padding = { 0, };
-
-  nbtk_widget_get_padding (NBTK_WIDGET (actor), &padding);
-
-  clutter_actor_get_preferred_width (priv->label, for_height,
-                                     min_width_p,
-                                     natural_width_p);
-
-  if (min_width_p)
-    *min_width_p += padding.left + padding.right;
-
-  if (natural_width_p)
-    *natural_width_p += padding.left + padding.right;
-}
-
-static void
-nbtk_im_label_get_preferred_height (ClutterActor *actor,
-                                 gfloat        for_width,
-                                 gfloat       *min_height_p,
-                                 gfloat       *natural_height_p)
-{
-  NbtkIMLabelPrivate *priv = NBTK_IM_LABEL (actor)->priv;
-  NbtkPadding padding = { 0, };
-
-  nbtk_widget_get_padding (NBTK_WIDGET (actor), &padding);
-
-  clutter_actor_get_preferred_height (priv->label, for_width,
-                                      min_height_p,
-                                      natural_height_p);
-
-  if (min_height_p)
-    *min_height_p += padding.top + padding.bottom;
-
-  if (natural_height_p)
-    *natural_height_p += padding.top + padding.bottom;
-}
-
-static void
-nbtk_im_label_allocate (ClutterActor          *actor,
-                     const ClutterActorBox *box,
-                     ClutterAllocationFlags flags)
-{
-  NbtkIMLabelPrivate *priv = NBTK_IM_LABEL (actor)->priv;
-  ClutterActorClass *parent_class;
-  ClutterActorBox child_box;
-  NbtkPadding padding = { 0, };
-
-  nbtk_widget_get_padding (NBTK_WIDGET (actor), &padding);
-
-  parent_class = CLUTTER_ACTOR_CLASS (nbtk_im_label_parent_class);
-  parent_class->allocate (actor, box, flags);
-
-  child_box.x1 = padding.left;
-  child_box.y1 = padding.top;
-  child_box.x2 = box->x2 - box->x1 - padding.right;
-  child_box.y2 = box->y2 - box->y1 - padding.bottom;
-
-  clutter_actor_allocate (priv->label, &child_box, flags);
-}
-
-static void
-nbtk_im_label_paint (ClutterActor *actor)
-{
-  NbtkIMLabelPrivate *priv = NBTK_IM_LABEL (actor)->priv;
-  ClutterActorClass *parent_class;
-
-  parent_class = CLUTTER_ACTOR_CLASS (nbtk_im_label_parent_class);
-  parent_class->paint (actor);
-
-  clutter_actor_paint (priv->label);
-}
-
-static void
-nbtk_im_label_map (ClutterActor *actor)
-{
-  NbtkIMLabelPrivate *priv = NBTK_IM_LABEL (actor)->priv;
-
-  CLUTTER_ACTOR_CLASS (nbtk_im_label_parent_class)->map (actor);
-
-  clutter_actor_map (priv->label);
-}
-
-static void
-nbtk_im_label_unmap (ClutterActor *actor)
-{
-  NbtkIMLabelPrivate *priv = NBTK_IM_LABEL (actor)->priv;
-
-  CLUTTER_ACTOR_CLASS (nbtk_im_label_parent_class)->unmap (actor);
-
-  clutter_actor_unmap (priv->label);
-}
-
-static void
-clipboard_callback (NbtkClipboard *clipboard,
-                    const char    *text,
-                    gpointer       data)
-{
-    NbtkIMLabel *label = (NbtkIMLabel *) data;
-    NbtkIMLabelPrivate *priv = label->priv;
-    ClutterText *ctext = (ClutterText *) priv->label;
-    int cursor_pos;
-
-    if (!text) {
-        return;
-    }
-
-    /* delete the current selection before pasting */
-    clutter_text_delete_selection (ctext);
-
-    /* "paste" the clipboard text into the entry */
-    cursor_pos = clutter_text_get_cursor_position (ctext);
-    clutter_text_insert_text (ctext, text, cursor_pos);
-}
-
-static gboolean
-nbtk_im_label_key_press_event (ClutterActor    *actor,
-                               ClutterKeyEvent *event)
-{
-    NbtkIMLabel *label = (NbtkIMLabel *) actor;
-    NbtkIMLabelPrivate *priv = label->priv;
-
-    /* This is expected to handle events that were emitted for the inner
-       ClutterText. They only reach this function if the ClutterText
-       didn't handle them */
-
-    /* paste */
-    if ((event->modifier_state & CLUTTER_CONTROL_MASK)
-        && event->keyval == CLUTTER_v) {
-        NbtkClipboard *clipboard;
-
-        clipboard = nbtk_clipboard_get_default ();
-
-        nbtk_clipboard_get_text (clipboard, clipboard_callback, actor);
-        return TRUE;
-    }
-
-    /* Copy */
-    if ((event->modifier_state & CLUTTER_CONTROL_MASK)
-        && event->keyval == CLUTTER_c) {
-        NbtkClipboard *clipboard;
-        char *text;
-
-        clipboard = nbtk_clipboard_get_default ();
-
-        text = clutter_text_get_selection ((ClutterText *) priv->label);
-        if (text && *text != '\0') {
-            nbtk_clipboard_set_text (clipboard, text);
-        }
-
-        return TRUE;
-    }
-
-    /* cut */
-    if ((event->modifier_state & CLUTTER_CONTROL_MASK)
-        && event->keyval == CLUTTER_x) {
-        NbtkClipboard *clipboard;
-        char *text;
-
-        clipboard = nbtk_clipboard_get_default ();
-
-        text = clutter_text_get_selection ((ClutterText *) priv->label);
-
-        if (text && *text != '\0') {
-            nbtk_clipboard_set_text (clipboard, text);
-
-            /* Now delete the text */
-            clutter_text_delete_selection ((ClutterText *) priv->label);
-        }
-
-        return TRUE;
-    }
-
-    return FALSE;
-}
-
-static void
-nbtk_im_label_key_focus_in (ClutterActor *actor)
-{
-    NbtkIMLabel *label = (NbtkIMLabel *) actor;
-    NbtkIMLabelPrivate *priv = label->priv;
-
-    /* We never want key focus. The ClutterText should be given first
-       pass for all key events */
-    clutter_actor_grab_key_focus (priv->label);
-}
-
-static void
-nbtk_im_label_class_init (NbtkIMLabelClass *klass)
-{
-  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-  ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass);
-  GParamSpec *pspec;
-
-  g_type_class_add_private (klass, sizeof (NbtkIMLabelPrivate));
-
-  gobject_class->set_property = nbtk_im_label_set_property;
-  gobject_class->get_property = nbtk_im_label_get_property;
-
-  actor_class->paint = nbtk_im_label_paint;
-  actor_class->allocate = nbtk_im_label_allocate;
-  actor_class->get_preferred_width = nbtk_im_label_get_preferred_width;
-  actor_class->get_preferred_height = nbtk_im_label_get_preferred_height;
-  actor_class->map = nbtk_im_label_map;
-  actor_class->unmap = nbtk_im_label_unmap;
-  actor_class->key_press_event = nbtk_im_label_key_press_event;
-  actor_class->key_focus_in = nbtk_im_label_key_focus_in;
-
-  pspec = g_param_spec_string ("text",
-                               "Text",
-                               "Text of the label",
-                               NULL, G_PARAM_READWRITE);
-  g_object_class_install_property (gobject_class, PROP_LABEL, pspec);
-
-}
-
-static void
-nbtk_im_label_init (NbtkIMLabel *label)
-{
-  NbtkIMLabelPrivate *priv;
-
-  label->priv = priv = NBTK_IM_LABEL_GET_PRIVATE (label);
-
-  label->priv->label = g_object_new (CLUTTER_TYPE_IMTEXT,
-                                     "ellipsize", PANGO_ELLIPSIZE_END,
-                                     "use-markup", TRUE,
-                                     NULL);
-
-  clutter_actor_set_parent (priv->label, CLUTTER_ACTOR (label));
-
-  g_signal_connect (label, "style-changed",
-                    G_CALLBACK (nbtk_im_label_style_changed), NULL);
-}
-
-/**
- * nbtk_im_label_new:
- * @text: text to set the label to
- *
- * Create a new #NbtkIMLabel with the specified label
- *
- * Returns: a new #NbtkIMLabel
- */
-NbtkWidget *
-nbtk_im_label_new (const gchar *text)
-{
-  return g_object_new (NBTK_TYPE_IM_LABEL,
-                       "text", (text != NULL && *text != '\0') ? text : "",
-                       NULL);
-}
-
-/**
- * nbtk_im_label_get_text:
- * @label: a #NbtkIMLabel
- *
- * Get the text displayed on the label
- *
- * Returns: the text for the label. This must not be freed by the application
- */
-G_CONST_RETURN gchar *
-nbtk_im_label_get_text (NbtkIMLabel *label)
-{
-  g_return_val_if_fail (NBTK_IS_IM_LABEL (label), NULL);
-
-  return clutter_text_get_text (CLUTTER_TEXT (label->priv->label));
-}
-
-/**
- * nbtk_im_label_set_text:
- * @label: a #NbtkIMLabel
- * @text: text to set the label to
- *
- * Sets the text displayed on the label
- */
-void
-nbtk_im_label_set_text (NbtkIMLabel *label,
-                     const gchar *text)
-{
-  NbtkIMLabelPrivate *priv;
-
-  g_return_if_fail (NBTK_IS_IM_LABEL (label));
-  g_return_if_fail (text != NULL);
-
-  priv = label->priv;
-
-  clutter_text_set_text (CLUTTER_TEXT (priv->label), text);
-
-  g_object_notify (G_OBJECT (label), "text");
-}
-
-/**
- * nbtk_im_label_get_clutter_text:
- * @label: a #NbtkIMLabel
- *
- * Retrieve the internal #ClutterText so that extra parameters can be set
- *
- * Returns: the #ClutterText used by #NbtkIMLabel. The label is owned by the
- * #NbtkIMLabel and should not be unref'ed by the application.
- */
-ClutterActor*
-nbtk_im_label_get_clutter_text (NbtkIMLabel *label)
-{
-  g_return_val_if_fail (NBTK_IM_LABEL (label), NULL);
-
-  return label->priv->label;
-}
diff -pruN 1.5.1-1/src/nbtk-im-label.h 1.8.4-1/src/nbtk-im-label.h
--- 1.5.1-1/src/nbtk-im-label.h	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/nbtk-im-label.h	1970-01-01 01:00:00.000000000 +0100
@@ -1,72 +0,0 @@
-/*
- * nbtk-label.h: Plain label actor
- *
- * Copyright 2008, 2009 Intel Corporation.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU Lesser General Public License,
- * version 2.1, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- * FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
- * more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
- * Boston, MA 02111-1307, USA.
- *
- * Written by: Thomas Wood <thomas@linux.intel.com>
- *
- */
-
-
-#ifndef __NBTK_IM_LABEL_H__
-#define __NBTK_IM_LABEL_H__
-
-G_BEGIN_DECLS
-
-#include <nbtk/nbtk.h>
-
-#define NBTK_TYPE_IM_LABEL             (nbtk_im_label_get_type ())
-#define NBTK_IM_LABEL(obj)              (G_TYPE_CHECK_INSTANCE_CAST ((obj), NBTK_TYPE_IM_LABEL, NbtkIMLabel))
-#define NBTK_IS_IM_LABEL(obj)             (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NBTK_TYPE_IM_LABEL))
-#define NBTK_IM_IM_LABEL_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), NBTK_TYPE_IM_LABEL, NbtkIMLabelClass))
-#define NBTK_IS_IM_LABEL_CLASS(klass)     (G_TYPE_CHECK_CLASS_TYPE ((klass), NBTK_TYPE_IM_LABEL))
-#define NBTK_IM_IM_LABEL_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), NBTK_TYPE_IM_LABEL, NbtkIMLabelClass))
-
-typedef struct _NbtkIMLabel              NbtkIMLabel;
-typedef struct _NbtkIMLabelPrivate       NbtkIMLabelPrivate;
-typedef struct _NbtkIMLabelClass         NbtkIMLabelClass;
-
-/**
- * NbtkIMLabel:
- *
- * The contents of this structure is private and should only be accessed using
- * the provided API.
- */
-struct _NbtkIMLabel
-{
-  /*< private >*/
-  NbtkWidget parent_instance;
-
-  NbtkIMLabelPrivate *priv;
-};
-
-struct _NbtkIMLabelClass
-{
-  NbtkWidgetClass parent_class;
-};
-
-GType nbtk_im_label_get_type (void) G_GNUC_CONST;
-
-NbtkWidget *          nbtk_im_label_new              (const gchar *text);
-G_CONST_RETURN gchar *nbtk_im_label_get_text         (NbtkIMLabel *label);
-void                  nbtk_im_label_set_text         (NbtkIMLabel *label,
-                                                      const gchar *text);
-ClutterActor *        nbtk_im_label_get_clutter_text (NbtkIMLabel *label);
-
-G_END_DECLS
-
-#endif /* __NBTK_IM_LABEL_H__ */
diff -pruN 1.5.1-1/src/nbtk-marshal.c 1.8.4-1/src/nbtk-marshal.c
--- 1.5.1-1/src/nbtk-marshal.c	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/nbtk-marshal.c	2010-02-17 17:26:44.000000000 +0000
@@ -16,7 +16,7 @@
  * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA
  */
 
-#include "nbtk-marshal.h"
+#include "mx-marshal.h"
 
 #include        <glib-object.h>
 
@@ -66,19 +66,19 @@
 #endif /* !G_ENABLE_DEBUG */
 
 
-/* VOID:OBJECT (./nbtk-marshal.list:1) */
+/* VOID:OBJECT (./mx-marshal.list:1) */
 
-/* VOID:VOID (./nbtk-marshal.list:2) */
+/* VOID:VOID (./mx-marshal.list:2) */
 
-/* VOID:PARAM (./nbtk-marshal.list:3) */
+/* VOID:PARAM (./mx-marshal.list:3) */
 
-/* VOID:POINTER (./nbtk-marshal.list:4) */
+/* VOID:POINTER (./mx-marshal.list:4) */
 
-/* VOID:UINT (./nbtk-marshal.list:5) */
+/* VOID:UINT (./mx-marshal.list:5) */
 
-/* VOID:UINT,UINT (./nbtk-marshal.list:6) */
+/* VOID:UINT,UINT (./mx-marshal.list:6) */
 void
-_nbtk_marshal_VOID__UINT_UINT (GClosure                  *closure,
+_mx_marshal_VOID__UINT_UINT (GClosure                  *closure,
                                GValue       *return_value G_GNUC_UNUSED,
                                guint                      n_param_values,
                                const GValue              *param_values,
@@ -114,9 +114,9 @@ _nbtk_marshal_VOID__UINT_UINT (GClosure 
             data2);
 }
 
-/* VOID:OBJECT,OBJECT (./nbtk-marshal.list:7) */
+/* VOID:OBJECT,OBJECT (./mx-marshal.list:7) */
 void
-_nbtk_marshal_VOID__OBJECT_OBJECT (
+_mx_marshal_VOID__OBJECT_OBJECT (
   GClosure *closure, GValue       *return_value G_GNUC_UNUSED,
   guint n_param_values, const GValue *param_values,
   gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data)
@@ -151,9 +151,9 @@ _nbtk_marshal_VOID__OBJECT_OBJECT (
             data2);
 }
 
-/* VOID:STRING,OBJECT (./nbtk-marshal.list:8) */
+/* VOID:STRING,OBJECT (./mx-marshal.list:8) */
 void
-_nbtk_marshal_VOID__STRING_OBJECT (
+_mx_marshal_VOID__STRING_OBJECT (
   GClosure *closure, GValue       *return_value G_GNUC_UNUSED,
   guint n_param_values, const GValue *param_values,
   gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data)
diff -pruN 1.5.1-1/src/nbtk-marshal.h 1.8.4-1/src/nbtk-marshal.h
--- 1.5.1-1/src/nbtk-marshal.h	2009-11-12 18:40:24.000000000 +0000
+++ 1.8.4-1/src/nbtk-marshal.h	2010-02-17 17:26:44.000000000 +0000
@@ -17,46 +17,46 @@
  */
 
 
-#ifndef ___nbtk_marshal_MARSHAL_H__
-#define ___nbtk_marshal_MARSHAL_H__
+#ifndef ___mx_marshal_MARSHAL_H__
+#define ___mx_marshal_MARSHAL_H__
 
 #include        <glib-object.h>
 
 G_BEGIN_DECLS
 
-/* VOID:OBJECT (./nbtk-marshal.list:1) */
-#define _nbtk_marshal_VOID__OBJECT     g_cclosure_marshal_VOID__OBJECT
+/* VOID:OBJECT (./mx-marshal.list:1) */
+#define _mx_marshal_VOID__OBJECT     g_cclosure_marshal_VOID__OBJECT
 
-/* VOID:VOID (./nbtk-marshal.list:2) */
-#define _nbtk_marshal_VOID__VOID       g_cclosure_marshal_VOID__VOID
+/* VOID:VOID (./mx-marshal.list:2) */
+#define _mx_marshal_VOID__VOID       g_cclosure_marshal_VOID__VOID
 
-/* VOID:PARAM (./nbtk-marshal.list:3) */
-#define _nbtk_marshal_VOID__PARAM      g_cclosure_marshal_VOID__PARAM
+/* VOID:PARAM (./mx-marshal.list:3) */
+#define _mx_marshal_VOID__PARAM      g_cclosure_marshal_VOID__PARAM
 
-/* VOID:POINTER (./nbtk-marshal.list:4) */
-#define _nbtk_marshal_VOID__POINTER    g_cclosure_marshal_VOID__POINTER
+/* VOID:POINTER (./mx-marshal.list:4) */
+#define _mx_marshal_VOID__POINTER    g_cclosure_marshal_VOID__POINTER
 
-/* VOID:UINT (./nbtk-marshal.list:5) */
-#define _nbtk_marshal_VOID__UINT       g_cclosure_marshal_VOID__UINT
+/* VOID:UINT (./mx-marshal.list:5) */
+#define _mx_marshal_VOID__UINT       g_cclosure_marshal_VOID__UINT
 
-/* VOID:UINT,UINT (./nbtk-marshal.list:6) */
-extern void _nbtk_marshal_VOID__UINT_UINT (GClosure     *closure,
+/* VOID:UINT,UINT (./mx-marshal.list:6) */
+extern void _mx_marshal_VOID__UINT_UINT (GClosure     *closure,
                                            GValue       *return_value,
                                            guint         n_param_values,
                                            const GValue *param_values,
                                            gpointer      invocation_hint,
                                            gpointer      marshal_data);
 
-/* VOID:OBJECT,OBJECT (./nbtk-marshal.list:7) */
-extern void _nbtk_marshal_VOID__OBJECT_OBJECT (GClosure     *closure,
+/* VOID:OBJECT,OBJECT (./mx-marshal.list:7) */
+extern void _mx_marshal_VOID__OBJECT_OBJECT (GClosure     *closure,
                                                GValue       *return_value,
                                                guint         n_param_values,
                                                const GValue *param_values,
                                                gpointer      invocation_hint,
                                                gpointer      marshal_data);
 
-/* VOID:STRING,OBJECT (./nbtk-marshal.list:8) */
-extern void _nbtk_marshal_VOID__STRING_OBJECT (GClosure     *closure,
+/* VOID:STRING,OBJECT (./mx-marshal.list:8) */
+extern void _mx_marshal_VOID__STRING_OBJECT (GClosure     *closure,
                                                GValue       *return_value,
                                                guint         n_param_values,
                                                const GValue *param_values,
@@ -65,5 +65,5 @@ extern void _nbtk_marshal_VOID__STRING_O
 
 G_END_DECLS
 
-#endif /* ___nbtk_marshal_MARSHAL_H__ */
+#endif /* ___mx_marshal_MARSHAL_H__ */
 
diff -pruN 1.5.1-1/src/tumbler-service-dbus.xml 1.8.4-1/src/tumbler-service-dbus.xml
--- 1.5.1-1/src/tumbler-service-dbus.xml	1970-01-01 01:00:00.000000000 +0100
+++ 1.8.4-1/src/tumbler-service-dbus.xml	2010-02-17 17:26:44.000000000 +0000
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<node name="/org/freedesktop/thumbnails/Thumbnailer1">
+  <interface name="org.freedesktop.thumbnails.Thumbnailer1">
+    <method name="Queue">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/>
+      <arg type="as" name="uris" direction="in" />
+      <arg type="as" name="mime_types" direction="in" />
+      <arg type="s" name="flavor" direction="in" />
+      <arg type="s" name="scheduler" direction="in" />
+      <arg type="u" name="handle_to_unqueue" direction="in" />
+      <arg type="u" name="handle" direction="out" />
+    </method>
+
+    <method name="Dequeue">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/>
+      <arg type="u" name="handle" direction="in" />
+    </method>
+
+    <method name="GetSupported">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value="true" />
+      <arg type="as" name="uri_schemes" direction="out" />
+      <arg type="as" name="mime_types" direction="out" />
+    </method>
+
+    <method name="GetSchedulers">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value="true" />
+      <arg type="as" name="schedulers" direction="out" />
+    </method>
+
+    <method name="GetFlavors">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value="true" />
+      <arg type="as" name="flavors" direction="out" />
+    </method>
+
+    <signal name="Started">
+      <arg type="u" name="handle" />
+    </signal>
+
+    <signal name="Finished">
+      <arg type="u" name="handle" />
+    </signal>
+
+    <signal name="Ready">
+      <arg type="u" name="handle" />
+      <arg type="as" name="uris" />
+    </signal>
+
+    <signal name="Error">
+      <arg type="u" name="handle" />
+      <arg type="as" name="failed_uris" />
+      <arg type="i" name="error_code" />
+      <arg type="s" name="message" />
+    </signal>
+  </interface>
+</node>
