diff --git a/lib/sessions/downloader.pm b/lib/sessions/downloader.pm
index bdc831cae9f115aada13743f93a294d1bc37b19e..0195c5e11a071bd15a8fd692e0d1bbb6918fad39 100644
--- a/lib/sessions/downloader.pm
+++ b/lib/sessions/downloader.pm
@@ -18,13 +18,16 @@ POE::Session->create(
         filename        => \&sessions::downloader::ddl::filename,
         signal_filename => \&sessions::downloader::ddl::signal_filename,
         signal_ddl      => \&sessions::downloader::ddl::signal_ddl,
+        end_task        => \&sessions::downloader::ddl::end_task,
     },
 );
 
 
 sub on_start {
-    my $kernel = $_[KERNEL];
+    my ($kernel, $heap) = @_[KERNEL, HEAP];
     $kernel->alias_set('downloader');
+    $heap->{ddl}->{tasks} = [];
+
     $log->info("session started");
 }
 
diff --git a/lib/sessions/downloader/ddl.pm b/lib/sessions/downloader/ddl.pm
index 57aa46126e813702914de634f65223e8a2c4c5ef..05bb2685b68cf1b4208339ccc93b172de10110f6 100644
--- a/lib/sessions/downloader/ddl.pm
+++ b/lib/sessions/downloader/ddl.pm
@@ -27,6 +27,14 @@ sub exec {
     return if (not $id or not $url);
     $log->debug("DDL '$id' '$url' ");
 
+    # is there already a task running ?
+    if ($heap->{ddl}->{running}) {
+        push $heap->{ddl}->{tasks}, [$id, $url];
+        return;
+    }
+
+    $heap->{ddl}->{running} = 1;
+
     # first we need to got filename
     my $child = POE::Wheel::Run->new(
         Program     => [
@@ -75,6 +83,7 @@ sub signal_filename {
         $log->error("error getting filename for $id : $status");
         $heap->{ddl}->{pb}->{$id}->{child} = undef;
 
+        $kernel->yield("end_task");
         return;
     }
 
@@ -103,7 +112,7 @@ sub signal_filename {
 
 sub signal_ddl {
     $log->debug("DDL");
-    my ($heap, $pid, $status) = @_[HEAP, ARG1, ARG2];
+    my ($kernel, $heap, $pid, $status) = @_[KERNEL, HEAP, ARG1, ARG2];
 
     my $child   = delete $heap->{ddl}->{pid}->{$pid};
     my $id      = delete $heap->{ddl}->{wid}->{$child->ID};
@@ -111,13 +120,26 @@ sub signal_ddl {
 
     if ($status ne "0") {
         $log->error("error downloading $id : $status");
-        return;
+    }
+    else {
+        eval {
+            utils::db::set_filename($id, $heap->{ddl}->{pb}->{$id}->{filename});
+        };
+        $log->error($@) if ($@);
     }
 
-    eval {
-        utils::db::set_filename($id, $heap->{ddl}->{pb}->{$id}->{filename});
-    };
-    $log->error($@) if ($@);
+    $kernel->yield("end_task");
+}
+
+sub end_task {
+    my ($kernel, $heap) = @_[KERNEL, HEAP];
+
+    $heap->{ddl}->{running} = 0;
+
+    if (@{ $heap->{ddl}->{tasks} }) {
+        my $task = shift $heap->{ddl}->{tasks};
+        $kernel->yield(ddl => $task->[0], $task->[1]);
+    }
 }
 
 1;