diff -u -r sfx2-pristine/source/appl/app.hrc sfx2/source/appl/app.hrc
--- sfx2-pristine/source/appl/app.hrc	2006-05-02 17:14:14.000000000 +0100
+++ sfx2/source/appl/app.hrc	2006-08-15 17:47:34.000000000 +0100
@@ -211,6 +211,7 @@
 #define STR_HELP_BUTTON_SEARCHDIALOG			(RID_SFX_APP_START+142)
 #define STR_HELP_MENU_TEXT_SELECTION_MODE       (RID_SFX_APP_START+143)
 #define STR_HELP_MENU_TEXT_COPY                 (RID_SFX_APP_START+144)
+#define STR_QUICKSTART_PRELAUNCH_UNX			(RID_SFX_APP_START+146)
 
 #define RID_HELP_ONSTARTUP_BOX                  (RID_SFX_APP_START+144)
 #define RID_HELP_ONSTARTUP_TEXT                 (RID_SFX_APP_START+145)
diff -u -r sfx2-pristine/source/appl/app.src sfx2/source/appl/app.src
--- sfx2-pristine/source/appl/app.src	2006-08-08 22:23:35.000000000 +0100
+++ sfx2/source/appl/app.src	2006-08-15 17:48:11.000000000 +0100
@@ -1274,6 +1274,20 @@
 	Text [ en-US ] = "Load %PRODUCTNAME During System Start-Up" ;
 	Text [ x-comment ] = " " ;
 };
+String STR_QUICKSTART_PRELAUNCH_UNX
+{
+	Text[ en-US ] = "Enable systray quickstarter";
+	Text[ de ] = "Schnellstart des Systemabschnitts der Kontrollleiste aktivieren";
+	Text[ cs ] = "Umožnit rychlé spouštění z panelu";
+	Text[ es ] = "Habilitar Quickstarter en bandeja del sistema";
+	Text[ fr ] = "Activer systray quickstarter";
+	Text[ it ] = "Abilita quickstarter systray";
+	Text[ ja ] = "Systray quickstarterの有効化";
+	Text[ pt-BR ] = "Habilitar quickstarter de systray";
+	Text[ zh-CN ] = "启用系统盘快速启动程序";
+	Text[ zh-TW ] = "啟用 systray quickstarter";
+	Text [ x-comment ] = " ";
+};
 String STR_QUICKSTART_LNKNAME
 {
 	Text [ de ] = "%PRODUCTNAME %PRODUCTVERSION" ;
diff -u -r sfx2-pristine/source/appl/shutdownicon.cxx sfx2/source/appl/shutdownicon.cxx
--- sfx2-pristine/source/appl/shutdownicon.cxx	2006-08-15 17:40:38.000000000 +0100
+++ sfx2/source/appl/shutdownicon.cxx	2006-08-15 21:37:16.000000000 +0100
@@ -167,6 +167,10 @@
 void ShutdownIcon::initSystray()
 {
 #ifdef ENABLE_QUICKSTART_APPLET
+	if (m_bInitialized)
+		return;
+	m_bInitialized = true;
+
 	if (!m_pInitSystray)
 	{
 #  ifdef WIN32
@@ -201,6 +205,8 @@
 
 void ShutdownIcon::deInitSystray()
 {
+	if (!m_bInitialized)
+		return;
     if (m_pDeInitSystray)
 	m_pDeInitSystray();
 
@@ -209,6 +215,7 @@
 	if (m_pPlugin)
 		delete m_pPlugin;
 	m_pPlugin = 0;
+	m_bInitialized = false;
 }
 
 
@@ -219,7 +226,8 @@
 	m_xServiceManager( aSMgr ),
 	m_pInitSystray( 0 ),
 	m_pDeInitSystray( 0 ),
-	m_pPlugin( 0 )
+	m_pPlugin( 0 ),
+	m_bInitialized( false )
 {
 }
 
@@ -502,6 +510,40 @@
 	return pShutdownIcon;
 }
 
+// ---------------------------------------------------------------------------
+
+ShutdownIcon* ShutdownIcon::createInstance()
+{
+	if (pShutdownIcon)
+        return pShutdownIcon;
+
+	ShutdownIcon *pIcon = NULL;
+	try {
+		Reference< XMultiServiceFactory > xSMgr( comphelper::getProcessServiceFactory() );
+		pIcon = new ShutdownIcon( xSMgr );
+		pIcon->init ();
+		pShutdownIcon = pIcon;
+	} catch (...) {
+		delete pIcon;
+	}
+	
+	return pShutdownIcon;
+}
+
+void ShutdownIcon::init() throw( ::com::sun::star::uno::Exception )
+{
+	// access resource system and sfx only protected by solarmutex
+	::osl::ResettableMutexGuard	aGuard(	m_aMutex );
+	vos::OGuard aSolarGuard( Application::GetSolarMutex() );
+
+	m_pResMgr = SfxResId::GetResMgr();
+	aGuard.clear();
+	Reference < XDesktop > xDesktop( m_xServiceManager->createInstance(
+											 DEFINE_CONST_UNICODE( "com.sun.star.frame.Desktop" )),
+									 UNO_QUERY );
+	aGuard.reset();
+	m_xDesktop = xDesktop;
+}
 
 // ---------------------------------------------------------------------------
 
@@ -567,16 +609,8 @@
 				if( !bQuickstart && !GetAutostart() )
 					return;
                 aGuard.clear();
-                // access resource system and sfx only protected by solarmutex
-                vos::OGuard aSolarGuard( Application::GetSolarMutex() );
-
-				m_pResMgr = SfxResId::GetResMgr();
-				aGuard.reset();
-
-				m_xDesktop = Reference < XDesktop >( m_xServiceManager->createInstance(
-															DEFINE_CONST_UNICODE( "com.sun.star.frame.Desktop" )),
-														UNO_QUERY );
-
+				init ();
+                aGuard.reset();
 				if ( !m_xDesktop.is() )
 					return;
 
@@ -727,12 +761,18 @@
 												  osl_getThreadTextEncoding() );
 		symlink( aDesktopFileUnx, aShortcutUnx );
 #endif // UNX
+		ShutdownIcon *pIcon = ShutdownIcon::createInstance();
+		if( pIcon )
+			pIcon->initSystray();
     }
     else
     {
         OUString aShortcutUrl;
         ::osl::File::getFileURLFromSystemPath( aShortcut, aShortcutUrl );
         ::osl::File::remove( aShortcutUrl );
+		ShutdownIcon *pIcon = getInstance();
+		if( pIcon )
+			pIcon->deInitSystray();
     }
 #else
     (void)bActivate; // unused variable
diff -u -r sfx2-pristine/source/appl/shutdownicon.hxx sfx2/source/appl/shutdownicon.hxx
--- sfx2-pristine/source/appl/shutdownicon.hxx	2006-08-15 17:40:36.000000000 +0100
+++ sfx2/source/appl/shutdownicon.hxx	2006-08-15 18:42:13.000000000 +0100
@@ -78,6 +78,7 @@
 		void (*m_pDeInitSystray) ();
 		::osl::Module  *m_pPlugin;
 
+		bool m_bInitialized;
 		void initSystray();
 		void deInitSystray();
 
@@ -95,6 +96,7 @@
         SFX_DECL_XSERVICEINFO
 
 		static ShutdownIcon* getInstance();
+		static ShutdownIcon* createInstance();
 
         static void terminateDesktop();
 		static void addTerminateListener();
@@ -108,6 +110,8 @@
         static bool GetAutostart();
 		static bool bModalMode;
 
+		void init() throw( ::com::sun::star::uno::Exception );
+
 		static ::com::sun::star::uno::Reference< ::com::sun::star::lang::XSingleServiceFactory >
 					GetWrapperFactory( ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > & xSMgr );
 		static ::rtl::OUString  GetImplementationName_static();
diff -u -r sfx2-pristine/source/appl/shutdowniconunx.cxx sfx2/source/appl/shutdowniconunx.cxx
--- sfx2-pristine/source/appl/shutdowniconunx.cxx	2006-08-08 22:23:35.000000000 +0100
+++ sfx2/source/appl/shutdowniconunx.cxx	2006-08-15 21:27:23.000000000 +0100
@@ -49,19 +49,19 @@
 static GtkWidget *pOpenMenuItem = NULL;
 static GtkCheckMenuItem *pAutostartMenuItem = NULL;
 
-static void open_url_cb( GtkWidget *pButton, gpointer data )
+static void open_url_cb( GtkWidget *pButton G_GNUC_UNUSED, gpointer data )
 {
 	ShutdownIcon::OpenURL( *(OUString *)data,
 						   OUString( RTL_CONSTASCII_USTRINGPARAM( "_default" ) ) );
 }
 
-static void open_file_cb( GtkWidget *pButton )
+static void open_file_cb( GtkWidget *pButton G_GNUC_UNUSED )
 {
 	if ( !ShutdownIcon::bModalMode )
 		ShutdownIcon::FileOpen();
 }
 
-static void open_template_cb( GtkWidget *pButton )
+static void open_template_cb( GtkWidget *pButton G_GNUC_UNUSED )
 {
 	if ( !ShutdownIcon::bModalMode )
 		ShutdownIcon::FromTemplate();
@@ -73,7 +73,7 @@
 		gtk_check_menu_item_get_active( pItem ) );
 }
 
-static void exit_quickstarter_cb( GtkWidget *pButton )
+static void exit_quickstarter_cb( GtkWidget *pButton G_GNUC_UNUSED )
 {
 	egg_tray_icon_cancel_message (pTrayIcon, 1 );
 	ShutdownIcon::getInstance()->terminateDesktop();
@@ -136,8 +136,8 @@
 		NULL );
 }
 
-static void oustring_delete (gpointer data,
-							 GClosure	*closure)
+static void oustring_delete( gpointer data,
+							 GClosure	*closure G_GNUC_UNUSED )
 {
 	OUString *pURL = (OUString *) data;
 	delete pURL;
@@ -178,7 +178,6 @@
 using namespace ::com::sun::star::beans;
 
 static void add_ugly_db_item( GtkMenuShell *pMenuShell, const char *pAsciiURL,
-							  OUString *pOverrideLabel,
 							  USHORT nResId, GCallback pFnCallback )
 {
     SvtDynamicMenuOptions aOpt;
@@ -227,7 +226,7 @@
 				  SV_ICON_ID_DRAWING, G_CALLBACK( open_url_cb ));
 
     if ( aModuleOptions.IsDataBase() )
-		add_ugly_db_item (pMenuShell, BASE_URL, NULL,
+		add_ugly_db_item (pMenuShell, BASE_URL,
 						  SV_ICON_ID_DATABASE, G_CALLBACK( open_url_cb ));
 
 	OUString aULabel = pShutdownIcon->GetResString( STR_QUICKSTART_FROMTEMPLATE );
@@ -256,7 +255,7 @@
 	gtk_menu_shell_append( pMenuShell, pMenuItem );
 
 	aLabel = rtl::OUStringToOString (
-			pShutdownIcon->GetResString( STR_QUICKSTART_PRELAUNCH ),
+			pShutdownIcon->GetResString( STR_QUICKSTART_PRELAUNCH_UNX ),
 			RTL_TEXTENCODING_UTF8 );
 
 	pMenuItem = gtk_check_menu_item_new_with_label( aLabel );
@@ -296,17 +295,45 @@
 	gtk_widget_set_sensitive( pOpenMenuItem, !bModal);
 }
 
-static void display_menu_cb( GtkWidget *pButton, GtkWidget *pMenu )
+static void
+layout_menu( GtkMenu *menu G_GNUC_UNUSED,
+			 gint *x, gint *y, gboolean *push_in,
+			 gpointer user_data G_GNUC_UNUSED )
+{
+	GtkRequisition req;
+	GtkWidget *ebox = GTK_BIN( pTrayIcon )->child;
+
+	gtk_widget_size_request( GTK_WIDGET( menu ), &req );
+	gdk_window_get_origin( ebox->window, x, y );
+
+	(*x) += ebox->allocation.x;
+	(*y) += ebox->allocation.y;
+
+	if (*y >= gdk_screen_get_height (gtk_widget_get_screen (ebox)) / 2)
+		(*y) -= req.height;
+	else
+		(*y) += ebox->allocation.height;
+
+	*push_in = TRUE;
+}
+
+static gboolean display_menu_cb( GtkWidget *widget G_GNUC_UNUSED,
+								 GdkEventButton *event, GtkWidget *pMenu )
 {
+	if (event->button == 2)
+		return FALSE;
+
 	refresh_menu( pMenu );
 
 	gtk_menu_popup( GTK_MENU( pMenu ), NULL, NULL,
-					NULL, NULL, 0, gtk_get_current_event_time() );
+					layout_menu, NULL, 0, event->time );
+
+	return TRUE;
 }
 
 extern "C" {
 	static gboolean
-	show_at_idle (gpointer pTrayIcon)
+	show_at_idle( gpointer dummy G_GNUC_UNUSED )
 	{
 		::vos::OGuard aGuard( Application::GetSolarMutex() );
 		gtk_widget_show_all( GTK_WIDGET( pTrayIcon ) );
@@ -330,12 +357,12 @@
 
 	pTrayIcon = egg_tray_icon_new( aLabel );
 
-	GtkWidget *pButton = gtk_toggle_button_new();
+	GtkWidget *pParent = gtk_event_box_new();
 	GtkTooltips *pTooltips = gtk_tooltips_new();
-	gtk_tooltips_set_tip( GTK_TOOLTIPS( pTooltips ), pButton, aLabel, NULL );
+	gtk_tooltips_set_tip( GTK_TOOLTIPS( pTooltips ), pParent, aLabel, NULL );
 
 	GtkWidget *pIconImage = gtk_image_new();
-	gtk_container_add( GTK_CONTAINER( pButton ), pIconImage );
+	gtk_container_add( GTK_CONTAINER( pParent ), pIconImage );
 
 	pVCLResMgr = CREATEVERSIONRESMGR( vcl );
 
@@ -346,9 +373,9 @@
 	GtkWidget *pMenu = gtk_menu_new();
 	g_signal_connect (pMenu, "deactivate",
 					  G_CALLBACK (menu_deactivate_cb), NULL);
-	g_signal_connect( pButton, "clicked",
+	g_signal_connect( pParent, "button_press_event",
 					  G_CALLBACK( display_menu_cb ), pMenu );
-	gtk_container_add( GTK_CONTAINER( pTrayIcon ), pButton );
+	gtk_container_add( GTK_CONTAINER( pTrayIcon ), pParent );
 
 	// Show at idle to avoid artefacts at startup
 	g_idle_add (show_at_idle, (gpointer) pTrayIcon);
