diff --git a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java
index 93870af97ff13bbcd1fd6df4f83e16db7ad6444c..d2f382e34ab26a84995e2bdbb8ac3970b289f9b6 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java
@@ -584,7 +584,7 @@ public class I2PSnarkServlet extends Default {
                             File f = new File(name);
                             f.delete();
                             _manager.addMessage(_("Torrent file deleted: {0}", f.getAbsolutePath()));
-                            List files = meta.getFiles();
+                            List<List<String>> files = meta.getFiles();
                             String dataFile = snark.getBaseName();
                             f = new File(_manager.getDataDir(), dataFile);
                             if (files == null) { // single file torrent
@@ -594,23 +594,36 @@ public class I2PSnarkServlet extends Default {
                                     _manager.addMessage(_("Data file could not be deleted: {0}", f.getAbsolutePath()));
                                 break;
                             }
-                            for (int i = 0; i < files.size(); i++) { // pass 1 delete files
+                            // step 1 delete files
+                            for (int i = 0; i < files.size(); i++) {
                                 // multifile torrents have the getFiles() return lists of lists of filenames, but
                                 // each of those lists just contain a single file afaict...
-                                File df = Storage.getFileFromNames(f, (List) files.get(i));
+                                File df = Storage.getFileFromNames(f, files.get(i));
                                 if (df.delete())
                                     _manager.addMessage(_("Data file deleted: {0}", df.getAbsolutePath()));
                                 else
                                     _manager.addMessage(_("Data file could not be deleted: {0}", df.getAbsolutePath()));
                             }
-                            for (int i = files.size() - 1; i >= 0; i--) { // pass 2 delete dirs - not foolproof,
-                                                                          // we could sort and do a strict bottom-up
-                                File df = Storage.getFileFromNames(f, (List) files.get(i));
-                                df = df.getParentFile();
-                                if (df == null || !df.exists())
-                                    continue;
-                                if(df.delete())
+                            // step 2 make Set of dirs with reverse sort
+                            Set<File> dirs = new TreeSet(Collections.reverseOrder());
+                            for (List<String> list : files) {
+                                for (int i = 1; i < list.size(); i++) {
+                                    dirs.add(Storage.getFileFromNames(f, list.subList(0, i)));
+                                }
+                            }
+                            // step 3 delete dirs bottom-up
+                            for (File df : dirs) {
+                                if (df.delete()) {
                                     _manager.addMessage(_("Data dir deleted: {0}", df.getAbsolutePath()));
+                                } else if (_log.shouldLog(Log.WARN)) {
+                                    _log.warn("Could not delete dir " + df);
+                                }
+                            }
+                            // step 4 delete base
+                            if (f.delete()) {
+                                _manager.addMessage(_("Data dir deleted: {0}", f.getAbsolutePath()));
+                            } else if (_log.shouldLog(Log.WARN)) {
+                                _log.warn("Could not delete dir " + f);
                             }
                             break;
                         }