diff --git a/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java b/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java
index 5397cd757bfa48982e3ef9e217c347c7fd1bc592..fb899bcbd27e6216a7a803bf133683951ef9a402 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java
@@ -585,12 +585,12 @@ public class TrackerClient implements Runnable {
                   {
                     // Probably not fatal (if it doesn't last to long...)
                     if (_log.shouldLog(Log.WARN))
-                        _log.warn
-                      ("WARNING: Could not contact tracker at '"
-                       + tr.announce + "': " + ioe);
+                        _log.warn("Could not contact tracker at '" + tr.announce + "': " + ioe);
                     tr.trackerProblems = ioe.getMessage();
                     // don't show secondary tracker problems to the user
-                    if (tr.isPrimary)
+                    // ... and only if we don't have any peers at all. Otherwise, PEX/DHT will save us.
+                    if (tr.isPrimary && coordinator.getPeers() <= 0 &&
+                        (!completed || _util.getDHT() == null || _util.getDHT().size() <= 0))
                       snark.setTrackerProblems(tr.trackerProblems);
                     String tplc = tr.trackerProblems.toLowerCase(Locale.US);
                     if (tplc.startsWith(NOT_REGISTERED) || tplc.startsWith(NOT_REGISTERED_2) ||
@@ -780,6 +780,11 @@ public class TrackerClient implements Runnable {
      }
   }
   
+  /**
+   *
+   *  Note: IOException message text gets displayed in the UI
+   *
+   */
   private TrackerInfo doRequest(TCTracker tr, String infoHash,
                                 String peerID, long uploaded,
                                 long downloaded, long left, String event)
@@ -821,24 +826,24 @@ public class TrackerClient implements Runnable {
     boolean fast = _fastUnannounce && event.equals(STOPPED_EVENT);
     byte[] fetched = _util.get(s, true, fast ? -1 : 0, small ? 128 : 1024, small ? 1024 : 32*1024);
     if (fetched == null)
-        throw new IOException("Error fetching");
+        throw new IOException("No response from " + tr.host);
     if (fetched.length == 0)
-        throw new IOException("No data");
+        throw new IOException("No data from " + tr.host);
     // The HTML check only works if we didn't exceed the maxium fetch size specified in get(),
     // otherwise we already threw an IOE.
     if (fetched[0] == '<')
-        throw new IOException(ERROR_GOT_HTML);
+        throw new IOException(ERROR_GOT_HTML + " from " + tr.host);
     
         InputStream in = new ByteArrayInputStream(fetched);
 
         TrackerInfo info = new TrackerInfo(in, snark.getID(),
                                            snark.getInfoHash(), snark.getMetaInfo(), _util);
         if (_log.shouldLog(Log.INFO))
-            _log.info("TrackerClient response: " + info);
+            _log.info("TrackerClient " + tr.host + " response: " + info);
 
         String failure = info.getFailureReason();
         if (failure != null)
-          throw new IOException(failure);
+            throw new IOException("Tracker " + tr.host + " responded with: " + failure);
 
         tr.interval = Math.max(MIN_TRACKER_ANNOUNCE_INTERVAL, info.getInterval() * 1000l);
         return info;
@@ -925,6 +930,7 @@ public class TrackerClient implements Runnable {
   private static class TCTracker
   {
       final String announce;
+      final String host;
       final boolean isPrimary;
       long interval;
       long lastRequestTime;
@@ -938,6 +944,8 @@ public class TrackerClient implements Runnable {
       public TCTracker(String a, boolean p)
       {
           announce = a;
+          String s = a.substring(7);
+          host = s.substring(0, s.indexOf("/"));
           isPrimary = p;
           interval = INITIAL_SLEEP;
       }