diff --git a/lib/sessions/downloader.pm b/lib/sessions/downloader.pm
index 1f57e9ac9e4df55a2e941aebd7ab72f1e1ff922d..62839216dbd948caf29ca0a9aaa3b74d8e038188 100644
--- a/lib/sessions/downloader.pm
+++ b/lib/sessions/downloader.pm
@@ -19,6 +19,7 @@ POE::Session->create(
         signal_filename => \&sessions::downloader::ddl::signal_filename,
         signal_ddl      => \&sessions::downloader::ddl::signal_ddl,
         signal_move     => \&sessions::downloader::ddl::signal_move,
+        signal_rm       => \&sessions::downloader::ddl::signal_rm,
         end_task        => \&sessions::downloader::ddl::end_task,
     },
 );
diff --git a/lib/sessions/downloader/ddl.pm b/lib/sessions/downloader/ddl.pm
index e8f9daeab59d73e562b36ad159538dbc3a966d6b..1a91a6435dfa93440f0d6aa29dee044b01a6ed09 100644
--- a/lib/sessions/downloader/ddl.pm
+++ b/lib/sessions/downloader/ddl.pm
@@ -83,7 +83,7 @@ sub signal_filename {
         $log->error("error getting filename for $id : $status");
         $heap->{ddl}->{pb}->{$id}->{child} = undef;
 
-        $kernel->yield("end_task");
+        $kernel->yield("end_task", $id);
         return;
     }
 
@@ -120,7 +120,7 @@ sub signal_ddl {
 
     if ($status ne "0") {
         $log->error("error downloading $id : $status");
-        $kernel->yield("end_task");
+        rm($kernel, $heap, $id, "/tmp/".$heap->{ddl}->{pb}->{$id}->{filename}.".part");
         return;
     }
 
@@ -155,23 +155,70 @@ sub signal_move {
 
     if ($status ne "0") {
         $log->error("error moving $id from tmp : $status");
+
+        # rm file
+        rm($kernel, $heap, $id, "/tmp/".$heap->{ddl}->{pb}->{$id}->{filename});
+        return;
     }
-    else {
-        # we update db
-        eval {
-            utils::db::set_filename($id, $heap->{ddl}->{pb}->{$id}->{filename});
-        };
-        $log->error($@) if ($@);
+
+    # we update db
+    eval {
+        utils::db::set_filename($id, $heap->{ddl}->{pb}->{$id}->{filename});
+        $kernel->yield("end_task", $id);
+    };
+    if ($a) {
+        $log->error($@);
+        rm(
+            $kernel,
+            $heap,
+            $id,
+            $conf->{save_folder}."/".$heap->{ddl}->{pb}->{$id}->{filename},
+        );
     }
+}
 
-    delete $heap->{ddl}->{pb}->{$id};
-    $kernel->yield("end_task");
+sub rm {
+    my ($kernel, $heap, $id, $filename) = @_;
+
+    my $child = POE::Wheel::Run->new(
+        Program => [
+            "rm",
+            $filename
+        ],
+        StdoutEvent => "devnull",
+        StderrEvent => "devnull",
+    );
+    $kernel->sig_child($child->PID, "signal_rm");
+
+    # we link playbot id to PID and url
+    $heap->{ddl}->{pb}->{$id}->{child} = $child->PID;
+
+    # we link wheel id to playbot id
+    $heap->{ddl}->{wid}->{$child->ID} = $id;
+    # we link PID to child object
+    $heap->{ddl}->{pid}->{$child->PID} = $child;
+}
+
+sub signal_rm {
+    $log->debug("DDL");
+    my ($kernel, $heap, $pid, $status) = @_[KERNEL, HEAP, ARG1, ARG2];
+
+    my $child   = delete $heap->{ddl}->{pid}->{$pid};
+    my $id      = delete $heap->{ddl}->{wid}->{$child->ID};
+    $heap->{ddl}->{pb}->{$id}->{child} = undef;
+
+    if ($status ne "0") {
+        $log->critical("cannot remove file");
+    }
+ 
+    $kernel->yield("end_task", $id);
 }
 
 sub end_task {
-    my ($kernel, $heap) = @_[KERNEL, HEAP];
+    my ($kernel, $heap, $id) = @_[KERNEL, HEAP, ARG0];
 
     $heap->{ddl}->{running} = 0;
+    delete $heap->{ddl}->{pb}->{$id};
 
     if (@{ $heap->{ddl}->{tasks} }) {
         my $task = shift $heap->{ddl}->{tasks};