diff --git a/PlayBot.pl b/PlayBot.pl
index e09baad01a33bff067a095c3c19e7b1b2df03307..d2c6129bac8f97a67197e7b8b8ceb9d0c999d6e4 100755
--- a/PlayBot.pl
+++ b/PlayBot.pl
@@ -14,6 +14,7 @@ use FindBin;
 use lib "$FindBin::Bin/lib/";
 use Logging;
 use sites::parser;
+use commands::parser;
 
 # nom du fichier
 my $bot = $0;
@@ -58,6 +59,8 @@ my $dbh = DBI->connect('DBI:mysql:'.$conf->{'bdd'}.';host='.$conf->{'host'}, $co
 	})
 	or die("Couldn't connect to database: ".DBI->errstr);
 
+$commands::parser::irc = $irc;
+$commands::parser::dbh = $dbh;
 
 # Evenements que le bot va gérer
 POE::Session->create(
@@ -77,7 +80,6 @@ irc_notice => \&on_notice,
 my %commandes_admin = ("cycle" => \&cycle);
 
 
-
 ### FONCTIONS
 sub flux
 {
@@ -259,6 +261,8 @@ sub on_invite
 sub on_speak
 {
 	my ($kernel, $user, $chan, $msg) = @_[KERNEL, ARG0, ARG1, ARG2];
+    my @args = ($kernel, $user, $chan, $msg);
+
 	my ($nick,$mask) = split(/!/,$user);
 	my %content;
 
@@ -315,42 +319,9 @@ sub on_speak
 		    $irc->yield(privmsg => $chan => '['.$id.'] '.$content{'title'}) ;
 	    }
     }
-	elsif ($msg =~ /^!fav( ([0-9]+))?/) {
-		my $id = ($2) ? $2 : $lastID;
-
-		my $sth = $dbh->prepare_cached('SELECT user FROM playbot_codes WHERE nick = ?');
-		$sth->execute($nick)
-			or $log->error("Couldn't finish transaction: " . $dbh->errstr);
-
-		if (!$sth->rows) {
-			$irc->yield(privmsg => $nick => "Ce nick n'est associé à aucun login arise. Va sur http://nightiies.iiens.net/links/fav pour obtenir ton code personel.");
-		}
-        else {
-    		my $sth2 = $dbh->prepare_cached('INSERT INTO playbot_fav (id, user) VALUES (?, ?)');
-		    $sth2->execute($id, $sth->fetch->[0])
-	    		or $log->error("Couldn't finish transaction: " . $dbh->errstr);
-        }
-	}
-	elsif ($msg =~ /^!later(?: ([0-9]+))?(?: in ([0-9]*)?(h|m|s)?)?/) {
-		my ($id, $time, $unit) = ($1, $2, $3);
-
-		$id = $lastID if (!$id);
-		$time = 6 if (!$time);
-		$time *= ($unit eq 's') ? 1 : ($unit eq 'm') ? 60 : 3600;
-		$kernel->delay_set('_later', $time, $nick, $id);
-	}
-    elsif ($msg =~ /^!tag( +([0-9]+))?/) {
-        my $id = ($2) ? $2 : $lastID;
-        while ($msg =~ /#([a-zA-Z0-9_-]+)/g) {
-            addTag($id, $1);
-        }
-    }
-    elsif ($msg =~ /^!help/) {
-		$irc->yield(privmsg => $chan => '!fav [<id>] : enregistre la vidéo dans les favoris');
-		$irc->yield(privmsg => $chan => '!tag [<id>] <tag1> <tag2> ... : tag la vidéo');
-		$irc->yield(privmsg => $chan => '!later [<id>] [in <x>[s|m|h]] : vidéo rappelée par query (par défaut temps de 6h)');
-		$irc->yield(privmsg => $chan => 'Sans id précisée, la dernière vidéo postée est utilisée.');
-    }
+    else {
+        commands::parser::exec(@args);
+    }	
 }
 
 
diff --git a/lib/commands/parser.pm b/lib/commands/parser.pm
new file mode 100644
index 0000000000000000000000000000000000000000..d18fa556847f0ccb02a691ce73e28509c41e253b
--- /dev/null
+++ b/lib/commands/parser.pm
@@ -0,0 +1,58 @@
+package commands::parser;
+
+require Exporter;
+our @ISA = qw(Exporter);
+our @EXPORT_OK = qw(exec irc);
+
+use lib "$FindBin::Bin/lib/commands/";
+#use fav;
+#use later;
+#use tag;
+#use help;
+
+our $irc;
+our $dbh;
+
+sub exec {
+	my ($kernel, $user, $chan, $msg) = @_;
+	my ($nick,$mask) = split(/!/,$user);
+
+    if ($msg =~ /^!fav( ([0-9]+))?/) {
+		my $id = ($2) ? $2 : $lastID;
+
+		my $sth = $dbh->prepare_cached('SELECT user FROM playbot_codes WHERE nick = ?');
+		$sth->execute($nick)
+			or $log->error("Couldn't finish transaction: " . $dbh->errstr);
+
+		if (!$sth->rows) {
+			$irc->yield(privmsg => $nick => "Ce nick n'est associé à aucun login arise. Va sur http://nightiies.iiens.net/links/fav pour obtenir ton code personel.");
+		}
+        else {
+    		my $sth2 = $dbh->prepare_cached('INSERT INTO playbot_fav (id, user) VALUES (?, ?)');
+		    $sth2->execute($id, $sth->fetch->[0])
+	    		or $log->error("Couldn't finish transaction: " . $dbh->errstr);
+        }
+	}
+	elsif ($msg =~ /^!later(?: ([0-9]+))?(?: in ([0-9]*)?(h|m|s)?)?/) {
+		my ($id, $time, $unit) = ($1, $2, $3);
+
+		$id = $lastID if (!$id);
+		$time = 6 if (!$time);
+		$time *= ($unit eq 's') ? 1 : ($unit eq 'm') ? 60 : 3600;
+		$kernel->delay_set('_later', $time, $nick, $id);
+	}
+    elsif ($msg =~ /^!tag( +([0-9]+))?/) {
+        my $id = ($2) ? $2 : $lastID;
+        while ($msg =~ /#([a-zA-Z0-9_-]+)/g) {
+            addTag($id, $1);
+        }
+    }
+    elsif ($msg =~ /^!help/) {
+		$irc->yield(privmsg => $chan => '!fav [<id>] : enregistre la vidéo dans les favoris');
+		$irc->yield(privmsg => $chan => '!tag [<id>] <tag1> <tag2> ... : tag la vidéo');
+		$irc->yield(privmsg => $chan => '!later [<id>] [in <x>[s|m|h]] : vidéo rappelée par query (par défaut temps de 6h)');
+		$irc->yield(privmsg => $chan => 'Sans id précisée, la dernière vidéo postée est utilisée.');
+    }
+}
+
+1;