diff --git a/plugins/plugin_installer/manifest.ini b/plugins/plugin_installer/manifest.ini
index 72489705cff3fd6aa99f71e168395124d85d9975..61f33b3dcda1e1aa2cf5d2d0ddd996f089bc90eb 100644
--- a/plugins/plugin_installer/manifest.ini
+++ b/plugins/plugin_installer/manifest.ini
@@ -1,7 +1,8 @@
 [info]
 name: Plugin Installer
 short_name: plugin_installer
-version: 0.3
+version: 0.4
 description: Install and upgrade plugins from ftp
 authors: Denis Fomin <fominde@gmail.com>
+ Yann Leboulanger <asterix@lagaule.org>
 homepage: http://www.gajim.org/
diff --git a/plugins/plugin_installer/plugin_installer.py b/plugins/plugin_installer/plugin_installer.py
index ad7f26f409f56a11c52bb674e8bbcf86bbe85301..6a03d47e32bb4b1c0eebad7e2fc288747acd42dc 100644
--- a/plugins/plugin_installer/plugin_installer.py
+++ b/plugins/plugin_installer/plugin_installer.py
@@ -33,10 +33,17 @@ import sys
 from common import gajim
 from plugins import GajimPlugin
 from plugins.helpers import log_calls, log
-from dialogs import WarningDialog, HigDialog
+from dialogs import WarningDialog, HigDialog, YesNoDialog
 from plugins.gui import GajimPluginConfigDialog
 
 
+def convert_version_to_list(version_str):
+    version_list = version_str.split('.')
+    l = []
+    while len(version_list):
+        l.append(int(version_list.pop(0)))
+    return l
+
 class PluginInstaller(GajimPlugin):
 
     @log_calls('PluginInstallerPlugin')
@@ -44,6 +51,10 @@ class PluginInstaller(GajimPlugin):
         self.description = _('Install and upgrade plugins from ftp')
         self.config_dialog = PluginInstallerPluginConfigDialog(self)
         self.config_default_values = {'ftp_server': ('ftp.gajim.org', '')}
+        self.window = None
+        self.progressbar = None
+        self.available_plugins_model = None
+        self.upgrading = False # True when opened from upgrade popup dialog
 
     @log_calls('PluginInstallerPlugin')
     def activate(self):
@@ -52,6 +63,50 @@ class PluginInstaller(GajimPlugin):
         self.id_ = self.pl_menuitem.connect_after('activate', self.on_activate)
         if 'plugins' in gajim.interface.instances:
             self.on_activate(None)
+        gobject.timeout_add_seconds(30, self.check_update)
+
+    @log_calls('PluginInstallerPlugin')
+    def warn_update(self, plugins):
+        def open_update(dummy):
+            self.upgrading = True
+            self.pl_menuitem.activate()
+            nb = gajim.interface.instances['plugins'].plugins_notebook
+            gobject.idle_add(nb.set_current_page, 1)
+        if plugins:
+            plugins_str = '\n'.join(plugins)
+            YesNoDialog(_('Plugins updates'), _('Some updates are available for'
+                ' your installer plugins. Do you want to update those plugins:'
+                '\n%s') % plugins_str, on_response_yes=open_update)
+
+    @log_calls('PluginInstallerPlugin')
+    def check_update(self):
+        def _run():
+            to_update = []
+            con = ftplib.FTP(ftp.server)
+            con.login()
+            con.cwd('plugins')
+            plugins_dirs = con.nlst()
+            for dir_ in plugins_dirs:
+                try:
+                    con.retrbinary('RETR %s/manifest.ini' % dir_,
+                        ftp.handleDownload)
+                except Exception, error:
+                    if str(error).startswith('550'):
+                        continue
+                ftp.config.readfp(io.BytesIO(ftp.buffer_.getvalue()))
+                local_version = ftp.get_plugin_version(ftp.config.get('info',
+                    'name'))
+                if local_version:
+                    local = convert_version_to_list(local_version)
+                    remote = convert_version_to_list(ftp.config.get('info',
+                        'version'))
+                    if remote > local:
+                        to_update.append(ftp.config.get('info', 'name'))
+            con.quit()
+            gobject.idle_add(self.warn_update, to_update)
+        ftp = Ftp(self)
+        ftp.run = _run
+        ftp.start()
 
     @log_calls('PluginInstallerPlugin')
     def deactivate(self):
@@ -152,12 +207,13 @@ class PluginInstaller(GajimPlugin):
         else:
             self.inslall_upgrade_button.set_property('sensitive', True)
 
-    def on_notebook_switch_page(self, widget, page, page_num,):
+    def on_notebook_switch_page(self, widget, page, page_num):
         if not hasattr(self, 'ftp') and self.page_num == page_num:
             self.available_plugins_model.clear()
             self.progressbar.show()
             self.ftp = Ftp(self)
             self.ftp.remote_dirs = None
+            self.ftp.upgrading = True
             self.ftp.start()
 
     def on_inslall_upgrade_clicked(self, widget):
@@ -309,6 +365,7 @@ class PluginInstaller(GajimPlugin):
 class Ftp(threading.Thread):
     def __init__(self, plugin):
         super(Ftp, self).__init__()
+        self.plugin = plugin
         self.window = plugin.window
         self.server = plugin.config['ftp_server']
         self.progressbar = plugin.progressbar
@@ -317,6 +374,7 @@ class Ftp(threading.Thread):
         self.buffer_ = io.BytesIO()
         self.remote_dirs = None
         self.append_to_model = True
+        self.upgrading = False
 
     def model_append(self, row):
         self.model.append(row)
@@ -357,9 +415,19 @@ class Ftp(threading.Thread):
                     self.config.readfp(io.BytesIO(self.buffer_.getvalue()))
                     local_version = self.get_plugin_version(
                         self.config.get('info', 'name'))
+                    upgrade = False
+                    if self.upgrading and local_version:
+                        local = convert_version_to_list(local_version)
+                        remote = convert_version_to_list(self.config.get('info',
+                            'version'))
+                        if remote > local:
+                            upgrade = True
+                            gobject.idle_add(
+                                self.plugin.inslall_upgrade_button.set_property,
+                                'sensitive', True)
                     gobject.idle_add(self.model_append, [dir_,
                         self.config.get('info', 'name'), local_version,
-                        self.config.get('info', 'version'), False,
+                        self.config.get('info', 'version'), upgrade,
                         self.config.get('info', 'description'),
                         self.config.get('info', 'authors'),
                         self.config.get('info', 'homepage'), ])