diff --git a/src/common/config.py b/src/common/config.py
index 882bf8917a7f318e358950afa662cfd90f0394c4..8c3dff8eb35cf238413c458a9deaa293b90a3232 100644
--- a/src/common/config.py
+++ b/src/common/config.py
@@ -125,6 +125,7 @@ class Config:
 		'before_nickname': [ opt_str, '' ],
 		'after_nickname': [ opt_str, ':' ],
 		'send_os_info': [ opt_bool, True ],
+		'set_status_msg_from_current_music_track': [ opt_bool, False ],
 		'notify_on_new_gmail_email': [ opt_bool, True ],
 		'notify_on_new_gmail_email_extra': [ opt_bool, False ],
 		'usegpg': [ opt_bool, False, '', True ],
diff --git a/src/config.py b/src/config.py
index 1a66f034d862ac33ea7bc6f39396b820d9f8d046..df884d9aa955b24dca4c3b3135e7dccd27375b97 100644
--- a/src/config.py
+++ b/src/config.py
@@ -1,7 +1,7 @@
 ##	config.py
 ##
 ## Copyright (C) 2003-2006 Yann Le Boulanger <asterix@lagaule.org>
-## Copyright (C) 2005-2006 Nikos Kouremenos <nkour@jabber.org>
+## Copyright (C) 2005-2006 Nikos Kouremenos <kourem@gmail.com>
 ## Copyright (C) 2005 Dimitur Kirov <dkirov@gmail.com>
 ## Copyright (C) 2003-2005 Vincent Hanquez <tab@snarc.org>
 ##
@@ -181,7 +181,7 @@ class PreferencesWindow:
 			theme = config_theme.replace('_', ' ')
 			model.append([theme])
 			if gajim.config.get('roster_theme') == config_theme:
-			         theme_combobox.set_active(i)
+				theme_combobox.set_active(i)
 			i += 1
 		self.on_theme_combobox_changed(theme_combobox)
 
@@ -458,12 +458,18 @@ class PreferencesWindow:
 		# send os info
 		st = gajim.config.get('send_os_info')
 		self.xml.get_widget('send_os_info_checkbutton').set_active(st)
+
+		# set status msg from currently playing music track
+		st = gajim.config.get('set_status_msg_from_current_music_track')
+		self.xml.get_widget(
+			'set_status_msg_from_current_music_track_checkbutton').set_active(st)
 		
 		# Notify user of new gmail e-mail messages,
 		# only show checkbox if user has a gtalk account
 		frame_gmail = self.xml.get_widget('frame_gmail')
 		notify_gmail_checkbutton = self.xml.get_widget('notify_gmail_checkbutton')
-		notify_gmail_extra_checkbutton = self.xml.get_widget('notify_gmail_extra_checkbutton')
+		notify_gmail_extra_checkbutton = self.xml.get_widget(
+			'notify_gmail_extra_checkbutton')
 		frame_gmail.set_no_show_all(True)
 		
 		for account in gajim.config.get_per('accounts'):
@@ -1082,6 +1088,13 @@ class PreferencesWindow:
 			gajim.interface.instances['advanced_config'] = \
 				dialogs.AdvancedConfigurationWindow()
 
+	def set_status_msg_from_current_music_track_checkbutton_toggled(self,
+		widget):
+		self.on_checkbutton_toggled(widget,
+			'set_status_msg_from_current_music_track')
+		gajim.interface.roster.enable_syncing_status_msg_from_current_music_track(
+			widget.get_active())
+
 #---------- AccountModificationWindow class -------------#
 class AccountModificationWindow:
 	'''Class for account informations'''
@@ -2383,7 +2396,7 @@ class ManageBookmarksWindow:
 			if gajim.connections[account].connected <= 1:
 				continue
 			iter = self.treestore.append(None, [None, account,None,
-							    None, None, None, None])
+				None, None, None, None])
 
 			for bookmark in gajim.connections[account].bookmarks:
 				if bookmark['name'] == '':
diff --git a/src/music_track_listener.py b/src/music_track_listener.py
new file mode 100644
index 0000000000000000000000000000000000000000..51446ddff2cc35f8c2911c3796654bf0911f351d
--- /dev/null
+++ b/src/music_track_listener.py
@@ -0,0 +1,71 @@
+# -*- coding: utf-8 -*-
+##	musictracklistener.py
+##
+## Copyright (C) 2006 Gustavo Carneiro <gjcarneiro@gmail.com>
+## Copyright (C) 2006 Nikos Kouremenos <kourem@gmail.com>
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published
+## by the Free Software Foundation; version 2 only.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+import gobject
+import dbus
+import dbus.glib
+
+class MusicTrackInfo(object):
+	__slots__ = ['title', 'album', 'artist', 'duration', 'track_number']
+
+
+class MusicTrackListener(gobject.GObject):
+	__gsignals__ = { 'music-track-changed': (gobject.SIGNAL_RUN_LAST, None,
+		(object,)) }
+
+	_instance = None
+	@classmethod
+	def get(cls):
+		if cls._instance is None:
+			cls._instance = cls()
+		return cls._instance
+	
+	def __init__(self):
+		super(MusicTrackListener, self).__init__()
+		bus = dbus.SessionBus()
+		bus.add_signal_receiver(self._muine_music_track_change_cb, 'SongChanged',
+			'org.gnome.Muine.Player')
+		bus.add_signal_receiver(self._rhythmbox_music_track_change_cb,
+			'playingUriChanged', 'org.gnome.Rhythmbox.Player')
+
+	def _muine_music_track_change_cb(self, arg):
+		d = dict((x.strip() for x in  s1.split(':', 1)) for s1 in arg.split('\n'))
+		info = MusicTrackInfo()
+		info.title = d['title']
+		info.album = d['album']
+		info.artist = d['artist']
+		info.duration = int(d['duration'])
+		info.track_number = int(d['track_number'])
+		self.emit('music-track-changed', info)
+
+	def _rhythmbox_music_track_change_cb(self, uri):
+		bus = dbus.SessionBus()
+		rbshellobj = bus.get_object('org.gnome.Rhythmbox', '/org/gnome/Rhythmbox/Shell')
+		rbshell = rbshell = dbus.Interface(rbshellobj, 'org.gnome.Rhythmbox.Shell')
+		props = rbshell.getSongProperties(uri)
+		info = MusicTrackInfo()
+		info.title = props['title']
+		info.album = props['album']
+		info.artist = props['artist']
+		info.duration = int(props['duration'])
+		info.track_number = int(props['track-number'])
+		self.emit('music-track-changed', info)
+
+# here we test :)
+if __name__ == '__main__':
+	def music_track_change_cb(listener, music_track_info):
+		print music_track_info.title
+	MusicTrackListener.get().connect('music-track-changed', music_track_change_cb)
+	gobject.MainLoop().run()
diff --git a/src/roster_window.py b/src/roster_window.py
index 537e0f234a2edc1266b9794f7dedc43cf2dbde01..214aa380a263309564ca9267435a71e2c918beed 100644
--- a/src/roster_window.py
+++ b/src/roster_window.py
@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*-
 ##	roster_window.py
 ##
 ## Copyright (C) 2003-2006 Yann Le Boulanger <asterix@lagaule.org>
@@ -38,6 +39,7 @@ from message_window import MessageWindowMgr
 from chat_control import ChatControl
 from groupchat_control import GroupchatControl
 from groupchat_control import PrivateChatControl
+from music_track_listener import MusicTrackListener
 
 #(icon, name, type, jid, account, editable, second pixbuf)
 (
@@ -2382,6 +2384,36 @@ _('If "%s" accepts this request you will know his or her status.') % jid)
 				self.send_status(acct, status, message)
 		self.update_status_combobox()
 
+	## enable setting status msg from currently playing music track
+	def enable_syncing_status_msg_from_current_music_track(self, enabled):
+		'''if enabled is True, we listen to events from music players about
+		currently played music track, and we update our
+		status message accordinly'''
+		if enabled:
+			if self._music_track_changed_signal is None:
+				listener = MusicTrackListener.get()
+				self._music_track_changed_signal = listener.connect(
+					'music-track-changed', self._music_track_changed)
+		else:
+			if self._music_track_changed_signal is not None:
+				listener = MusicTrackListener.get()
+				listener.disconnect(self._music_track_changed_signal)
+				self._music_track_changed_signal = None
+			self._music_track_changed(None, None)
+	
+	def _music_track_changed(self, unused_listener, music_track_info):
+		accounts = gajim.connections.keys()
+		if music_track_info is None:
+			status_message = ''
+		else:
+			status_message = _('♪ "%(title)s" by %(artist)s ♪') % \
+				{'title': music_track_info.title,
+					'artist': music_track_info.artist }
+		for acct in accounts:
+			current_show = gajim.SHOW_LIST[gajim.connections[acct].connected]
+			self.send_status(acct, current_show, status_message)
+
+
 	def update_status_combobox(self):
 		# table to change index in connection.connected to index in combobox
 		table = {'offline':9, 'connecting':9, 'online':0, 'chat':1, 'away':2,
@@ -3686,6 +3718,7 @@ _('If "%s" accepts this request you will know his or her status.') % jid)
 	def __init__(self):
 		self.xml = gtkgui_helpers.get_glade('roster_window.glade')
 		self.window = self.xml.get_widget('roster_window')
+		self._music_track_changed_signal = None
 		gajim.interface.msg_win_mgr = MessageWindowMgr()
 		self.advanced_menus = [] # We keep them to destroy them
 		if gajim.config.get('roster_window_skip_taskbar'):
@@ -3862,6 +3895,10 @@ _('If "%s" accepts this request you will know his or her status.') % jid)
 		self.tooltip = tooltips.RosterTooltip()
 		self.draw_roster()
 
+		## Music Track notifications
+		self.enable_syncing_status_msg_from_current_music_track(gajim.config.get(
+			'set_status_msg_from_current_music_track'))
+
 		if gajim.config.get('show_roster_on_startup'):
 			self.window.show_all()
 		else: