diff --git a/README.md b/README.md
index ba92b29..878b6cf 100644
--- a/README.md
+++ b/README.md
@@ -10,8 +10,8 @@
 
 ## Launcher requirements :
 
- - [ ] Can install the bot
- - [ ] Can launch the bot
+ - [x] Can install the bot
+ - [x] Can launch the bot
  - [ ] Can propose updates 
  
 ## New commands :
diff --git a/bot.py b/bot.py
index af4cd81..dd130ad 100755
--- a/bot.py
+++ b/bot.py
@@ -6,11 +6,13 @@ from collections import deque
 
 import aiohttp
 import discord
+import git
 from discord.ext import commands
 
 import config
 from cogs.utils.config import Config
 from cogs.utils.lang import gettext
+from cogs.utils.version import Version
 
 description = """
 Je suis TuxBot, le bot qui vit de l'OpenSource ! ;)
@@ -47,6 +49,8 @@ class TuxBot(commands.AutoShardedBot):
         self.prefixes = Config('prefixes.json')
         self.blacklist = Config('blacklist.json')
 
+        self.version = Version(10, 0, 0, pre_release='a18', build=git.Repo(search_parent_directories=True).head.object.hexsha)
+
         for extension in l_extensions:
             if extension not in unload:
                 try:
@@ -95,6 +99,7 @@ class TuxBot(commands.AutoShardedBot):
             self.uptime = datetime.datetime.utcnow()
 
         print(gettext('Ready:') + f' {self.user} (ID: {self.user.id})')
+        print(self.version)
 
         presence: dict = dict(status=discord.Status.dnd)
         if self.config.activity is not None:
diff --git a/cogs/utils/version.py b/cogs/utils/version.py
new file mode 100644
index 0000000..37f922c
--- /dev/null
+++ b/cogs/utils/version.py
@@ -0,0 +1,12 @@
+class Version:
+    def __init__(self, major: int, minor: int, patch: int, **kwargs):
+        self.major: int = major
+        self.minor: int = minor
+        self.patch: int = patch
+
+        self.pre_release = kwargs.get('pre_release', '')
+        self.build = kwargs.get('build', '')
+
+    def __str__(self) -> str:
+        build = self.build[:10]
+        return f'v{self.major}.{self.minor}.{self.patch}{self.pre_release}-{build}'
diff --git a/launcher.py b/launcher.py
index 7149b90..b1278b4 100644
--- a/launcher.py
+++ b/launcher.py
@@ -3,6 +3,8 @@ import contextlib
 import logging
 import socket
 import sys
+import git
+import requests
 
 import click
 
@@ -42,7 +44,7 @@ def setup_logging():
             log.removeHandler(hdlr)
 
 
-def run_bot(unload):
+def run_bot(unload: list = []):
     loop = asyncio.get_event_loop()
     log = logging.getLogger()
 
@@ -60,15 +62,46 @@ def run_bot(unload):
     bot.run()
 
 
-@click.group(invoke_without_command=True, options_metavar='[options]')
-@click.option('-u', '--unload',
-              multiple=True, type=str,
-              help=gettext('Launch without loading the <TEXT> module'))
-@click.pass_context
-def main(ctx, unload):
-    if ctx.invoked_subcommand is None:
+@click.command()
+@click.option('-d', '--unload', multiple=True, type=str, help=gettext('Launch without loading the <TEXT> module'))
+@click.option('-u', '--update', help=gettext('Search for update'), is_flag=True)
+def main(**kwargs):
+    if kwargs.get('update'):
+        _update()
+
+    with setup_logging():
+        run_bot(kwargs.get('unload'))
+
+
+@click.option('-d', '--update', help=gettext('Search for update'), is_flag=True)
+def _update():
+    print(gettext('Checking for update...'))
+
+    local = git.Repo(search_parent_directories=True)
+    current = local.head.object.hexsha
+
+    origin = requests.get('https://git.gnous.eu/api/v1/repos/gnouseu/tuxbot-bot/branches/master')
+    last = origin.json().get('commit').get('id')
+
+    if current != last:
+        print(gettext('A new version is available !'))
+        check = input(gettext('Update ? [Y/n]')).lower().strip()
+
+        while check not in ['', 'y', 'n']:
+            check = input(gettext('Update ? [Y/n]'))
+
+            if check == 'y':
+                local.remotes.origin.pull()
+                with setup_logging():
+                    run_bot()
+            else:
+                with setup_logging():
+                    run_bot()
+    else:
+        print(gettext('Tuxbot is up to date') + '\n')
+
         with setup_logging():
-            run_bot(unload)
+            run_bot()
 
 
 if __name__ == '__main__':
diff --git a/locales/en/LC_MESSAGES/base.po b/locales/en/LC_MESSAGES/base.po
index ca46dcc..df3cf00 100644
--- a/locales/en/LC_MESSAGES/base.po
+++ b/locales/en/LC_MESSAGES/base.po
@@ -23,6 +23,10 @@ msgstr ""
 msgid "Launch without loading the <TEXT> module"
 msgstr ""
 
+#: launcher.py:73
+msgid "Search for update"
+msgstr ""
+
 #: bot.py:52
 msgid "Failed to load extension : "
 msgstr ""
diff --git a/locales/fr/LC_MESSAGES/base.mo b/locales/fr/LC_MESSAGES/base.mo
index a24b97a..c0df40f 100644
Binary files a/locales/fr/LC_MESSAGES/base.mo and b/locales/fr/LC_MESSAGES/base.mo differ
diff --git a/locales/fr/LC_MESSAGES/base.po b/locales/fr/LC_MESSAGES/base.po
index 9bbd996..4b3581f 100644
--- a/locales/fr/LC_MESSAGES/base.po
+++ b/locales/fr/LC_MESSAGES/base.po
@@ -23,6 +23,10 @@ msgstr "Impossible de lancer PostgreSQL..."
 msgid "Launch without loading the <TEXT> module"
 msgstr "Lancer sans charger le module <TEXT>"
 
+#: launcher.py:73
+msgid "Search for update"
+msgstr "Rechercher les mises à jour"
+
 #: bot.py:52
 msgid "Failed to load extension : "
 msgstr "Impossible de charger l'extension : "
diff --git a/requirements.txt b/requirements.txt
index 22eaeb7..eff90f1 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -2,4 +2,5 @@ discord.py[voice]
 jishaku
 lxml
 click
-asyncpg>=0.12.0
\ No newline at end of file
+asyncpg>=0.12.0
+gitpython
\ No newline at end of file