diff --git a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java
index d0d9a3bd8476d59c95c291ca3ddcc66016ab7683..33f74707ec0c884693ed6d56aa03a704c7e8d3b4 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java
@@ -30,7 +30,7 @@ public class SnarkManager implements Snark.CompleteListener {
     public static SnarkManager instance() { return _instance; }
     
     /** map of (canonical) filename to Snark instance (unsynchronized) */
-    private final Map _snarks;
+    private final Map<String, Snark> _snarks;
     private final Object _addSnarkLock;
     private /* FIXME final FIXME */ File _configFile;
     private Properties _config;
@@ -394,7 +394,7 @@ public class SnarkManager implements Snark.CompleteListener {
     private static final int MAX_FILES_PER_TORRENT = 512;
     
     /** set of filenames that we are dealing with */
-    public Set listTorrentFiles() { synchronized (_snarks) { return new HashSet(_snarks.keySet()); } }
+    public Set<String> listTorrentFiles() { synchronized (_snarks) { return new HashSet(_snarks.keySet()); } }
     /**
      * Grab the torrent given the (canonical) filename
      */
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 2e9d1425f39f1de2bc41df15015ee5b05e76912d..465f4f908e8a3156350901ae64be15d9418cbef1 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java
@@ -7,6 +7,7 @@ import java.io.IOException;
 import java.io.PrintWriter;
 import java.text.Collator;
 import java.util.ArrayList;
+import java.util.Comparator;
 import java.util.Enumeration;
 import java.util.Iterator;
 import java.util.List;
@@ -176,7 +177,7 @@ public class I2PSnarkServlet extends Default {
         String uri = req.getRequestURI();
         out.write(TABLE_HEADER);
         out.write(_("Status"));
-        if (_manager.util().connected() && snarks.size() > 0) {
+        if (_manager.util().connected() && !snarks.isEmpty()) {
             out.write(" (<a href=\"");
             out.write(req.getRequestURI());
             if (peerParam != null) {
@@ -210,7 +211,7 @@ public class I2PSnarkServlet extends Default {
             out.write("\">");
             out.write(_("Stop All"));
             out.write("</a>");
-        } else if (snarks.size() > 0) {
+        } else if (!snarks.isEmpty()) {
             out.write("<a href=\"" + uri + "?action=StartAll&nonce=" + _nonce +
                       "\" title=\"");
             out.write(_("Start all torrents and the I2P tunnel"));
@@ -228,7 +229,7 @@ public class I2PSnarkServlet extends Default {
             displaySnark(out, snark, uri, i, stats, showPeers, showDebug);
         }
 
-        if (snarks.size() <= 0) {
+        if (snarks.isEmpty()) {
             out.write("<tr class=\"snarkTorrentEven\">" +
                       "<td class=\"snarkTorrentEven\" align=\"center\"" +
                       " colspan=\"8\"><i>");
@@ -485,11 +486,34 @@ public class I2PSnarkServlet extends Default {
         }
     }
     
-    private List getSortedSnarks(HttpServletRequest req) {
-        Set files = _manager.listTorrentFiles();
-        TreeSet fileNames = new TreeSet(Collator.getInstance()); // sorts it alphabetically
+    /**
+     *  Sort alphabetically in current locale, ignore case, ignore leading "the "
+     *  (I guess this is worth it, a lot of torrents start with "The "
+     *  These are full path names which makes it harder
+     *  @since 0.7.14
+     */
+    private class TorrentNameComparator implements Comparator<String> {
+        private final Comparator collator = Collator.getInstance();
+        private final String skip = _manager.getDataDir().getAbsolutePath() + File.separator;
+
+        public int compare(String l, String r) {
+            if (l.startsWith(skip))
+                l = l.substring(skip.length());
+            if (r.startsWith(skip))
+                r = r.substring(skip.length());
+            if (l.toLowerCase().startsWith("the "))
+                l = l.substring(4);
+            if (r.toLowerCase().startsWith("the "))
+                r = r.substring(4);
+            return collator.compare(l, r);
+        }
+    }
+
+    private List<Snark> getSortedSnarks(HttpServletRequest req) {
+        Set<String> files = _manager.listTorrentFiles();
+        TreeSet<String> fileNames = new TreeSet(new TorrentNameComparator());
         fileNames.addAll(files);
-        ArrayList rv = new ArrayList(fileNames.size());
+        ArrayList<Snark> rv = new ArrayList(fileNames.size());
         for (Iterator iter = fileNames.iterator(); iter.hasNext(); ) {
             String name = (String)iter.next();
             Snark snark = _manager.getTorrent(name);