diff --git a/apps/i2psnark/java/build.xml b/apps/i2psnark/java/build.xml
index b05b7339a72cc152caacfe088b5bedbfc5ead756..f2df5bc715501b829ca33a6dfbf6a4872dad84d2 100644
--- a/apps/i2psnark/java/build.xml
+++ b/apps/i2psnark/java/build.xml
@@ -86,7 +86,7 @@
     
     <target name="warUpToDate">
         <uptodate property="war.uptodate" targetfile="../i2psnark.war" >
-            <srcfiles dir= "." includes="build/obj/web/**/*.class ../_icons/* ../web.xml" />
+            <srcfiles dir= "." includes="build/obj/org/klomp/snark/web/*.class ../_icons/* ../web.xml" />
         </uptodate>
     </target>
     
diff --git a/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java b/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java
index ad4cdae395db5c00e7fd050e0cfe7fabebd4e5a0..85a39f748d8657d2f3313af3ac8b305f914fb8a1 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java
@@ -185,10 +185,12 @@ public class TrackerClient extends I2PAppThread
     }
 
     if (trackers.isEmpty()) {
-        // FIXME really need to get this message to the gui
         stop = true;
-        _log.error("No valid trackers for infoHash: " + infoHash);
+        // FIXME translate
+        SnarkManager.instance().addMessage("No valid trackers for " + this.snark.getBaseName() + " - enable opentrackers?");
+        _log.error("No valid trackers for " + this.snark.getBaseName());
         // FIXME keep going if DHT enabled
+        this.snark.stopTorrent();
         return;
     }
 
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 77207ec08acd336a002927092dff51d4e1bf50fd..92a82de3e4e4bd6b9ec024eedcffb45f32afb7e8 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java
@@ -348,8 +348,9 @@ public class I2PSnarkServlet extends Default {
         out.write("</th>\n<th align=\"center\">");
 
         // Opera and text-mode browsers: no &thinsp; and no input type=image values submitted
+        // Using a unique name fixes Opera, except for the buttons with js confirms, see below
         String ua = req.getHeader("User-Agent");
-        boolean isDegraded = ua != null && (ua.startsWith("Lynx") ||
+        boolean isDegraded = ua != null && (ua.startsWith("Lynx") || ua.startsWith("w3m") ||
                                             ua.startsWith("ELinks") || ua.startsWith("Dillo"));
 
         boolean noThinsp = isDegraded || ua.startsWith("Opera");
@@ -960,7 +961,8 @@ public class I2PSnarkServlet extends Default {
             if (isDegraded)
                 out.write("</a>");
         } else {
-                if (isDegraded)
+                // This works in Opera but it's displayed a little differently, so use noThinsp here too so all 3 icons are consistent
+                if (noThinsp)
                     out.write("<a href=\"/i2psnark/?action=Start_" + b64 + "&amp;nonce=" + _nonce + "\"><img title=\"");
                 else
                     out.write("<input type=\"image\" name=\"action_Start_" + b64 + "\" value=\"foo\" title=\"");
@@ -972,7 +974,8 @@ public class I2PSnarkServlet extends Default {
                     out.write("</a>");
 
             if (isValid) {
-                if (isDegraded)
+                // Doesnt work with Opera so use noThinsp instead of isDegraded
+                if (noThinsp)
                     out.write("<a href=\"/i2psnark/?action=Remove_" + b64 + "&amp;nonce=" + _nonce + "\"><img title=\"");
                 else
                     out.write("<input type=\"image\" name=\"action\" value=\"Remove_" + b64 + "\" title=\"");
@@ -990,7 +993,8 @@ public class I2PSnarkServlet extends Default {
                     out.write("</a>");
             }
 
-            if (isDegraded)
+            // Doesnt work with Opera so use noThinsp instead of isDegraded
+            if (noThinsp)
                 out.write("<a href=\"/i2psnark/?action=Delete_" + b64 + "&amp;nonce=" + _nonce + "\"><img title=\"");
             else
                 out.write("<input type=\"image\" name=\"action_Delete_" + b64 + "\" value=\"foo\" title=\"");
diff --git a/history.txt b/history.txt
index 03891b8fc0b7c492cc2ab6474cbf23a1a4631cde..cb0b395fffeba2744a8d0b6c3f4bf6fbd2f8f6a2 100644
--- a/history.txt
+++ b/history.txt
@@ -1,3 +1,9 @@
+2011-02-24 zzz
+    * i2psnark:
+      - Fix delete and remove buttons for Opera and w3m
+      - Stop torrent if no valid trackers
+      - Fix war build dependencies
+
 2011-02-23 zzz
     * BuildHandler:
       - Lower participating throttler max limit
diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java
index 987fc2f75390f60b0d628d76ac2a839672062e5e..78754ef283e16db5cd2b1d1d3233ad3f5d57cdce 100644
--- a/router/java/src/net/i2p/router/RouterVersion.java
+++ b/router/java/src/net/i2p/router/RouterVersion.java
@@ -18,7 +18,7 @@ public class RouterVersion {
     /** deprecated */
     public final static String ID = "Monotone";
     public final static String VERSION = CoreVersion.VERSION;
-    public final static long BUILD = 19;
+    public final static long BUILD = 20;
 
     /** for example "-test" */
     public final static String EXTRA = "-rc";