diff --git a/apps/i2psnark/java/src/org/klomp/snark/ConnectionAcceptor.java b/apps/i2psnark/java/src/org/klomp/snark/ConnectionAcceptor.java
index 4a41d63e145c07776a00737d96be39da369787d8..8fe2f2142ce155a5fc2a4ad869833da510088683 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/ConnectionAcceptor.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/ConnectionAcceptor.java
@@ -26,6 +26,7 @@ import java.net.*;
 import net.i2p.I2PException;
 import net.i2p.client.streaming.I2PServerSocket;
 import net.i2p.client.streaming.I2PSocket;
+import net.i2p.util.I2PThread;
 
 /**
  * Accepts connections on a TCP port and routes them to sub-acceptors.
@@ -47,7 +48,7 @@ public class ConnectionAcceptor implements Runnable
     
     socketChanged = false;
     stop = false;
-    thread = new Thread(this, "I2PSnark acceptor");
+    thread = new I2PThread(this, "I2PSnark acceptor");
     thread.setDaemon(true);
     thread.start();
   }
@@ -105,7 +106,7 @@ public class ConnectionAcceptor implements Runnable
                     Snark.debug("Null socket accepted, but socket wasn't changed?", Snark.ERROR);
                 }
             } else {
-                Thread t = new Thread(new Handler(socket), "Connection-" + socket);
+                Thread t = new I2PThread(new Handler(socket), "Connection-" + socket);
                 t.start();
             }
           }
diff --git a/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java b/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java
index 339eec8dded7dbe8ffddca1a857b5319e05f1f07..e970a6954064089b59bd0aef25151f36404309b3 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java
@@ -3,9 +3,8 @@ package org.klomp.snark;
 import net.i2p.I2PAppContext;
 import net.i2p.I2PException;
 import net.i2p.util.EepGet;
-import net.i2p.data.Base64;
-import net.i2p.data.DataFormatException;
-import net.i2p.data.Destination;
+import net.i2p.client.I2PSession;
+import net.i2p.data.*;
 import net.i2p.client.streaming.I2PServerSocket;
 import net.i2p.client.streaming.I2PSocket;
 import net.i2p.client.streaming.I2PSocketManager;
@@ -149,7 +148,13 @@ public class I2PSnarkUtil {
     }
     
     String getOurIPString() {
-        return _manager.getSession().getMyDestination().toBase64();
+        I2PSession sess = _manager.getSession();
+        if (sess != null) {
+            Destination dest = sess.getMyDestination();
+            if (dest != null)
+                return dest.toBase64();
+        }
+        return "unknown";
     }
     Destination getDestination(String ip) {
         if (ip == null) return null;
diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionOut.java b/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionOut.java
index 817d98927a15062b01c468b1b21690486a933f68..b9388bda1701f89cfcf48dad90b1774e581c108f 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionOut.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionOut.java
@@ -24,6 +24,7 @@ import java.io.*;
 import java.net.*;
 import java.util.*;
 
+import net.i2p.util.I2PThread;
 import net.i2p.util.Log;
 
 class PeerConnectionOut implements Runnable
@@ -48,7 +49,7 @@ class PeerConnectionOut implements Runnable
     _id = ++__id;
 
     quit = false;
-    thread = new Thread(this, "Snark sender " + _id);
+    thread = new I2PThread(this, "Snark sender " + _id);
     thread.start();
   }
 
diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java
index 34da8c3edca927c008f42126a96d16713f88db31..84666d9f077b5061c5cecdcc141e8725f72ebd02 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java
@@ -23,6 +23,7 @@ package org.klomp.snark;
 import java.util.*;
 import java.io.IOException;
 
+import net.i2p.util.I2PThread;
 import net.i2p.util.Log;
 
 /**
@@ -249,7 +250,7 @@ public class PeerCoordinator implements PeerListener
             }
           };
         String threadName = peer.toString();
-        new Thread(r, threadName).start();
+        new I2PThread(r, threadName).start();
       }
     else
       if (Snark.debug >= Snark.INFO)
diff --git a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java
index 2661d1fa29b3a9782b531dafd282e1690c048d43..31508cc1b1b3e6cec0b8756b5e6b27384fdb9316 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java
@@ -372,7 +372,11 @@ public class SnarkManager implements Snark.CompleteListener {
             while (true) {
                 File dir = getDataDir();
                 _log.debug("Directory Monitor loop over " + dir.getAbsolutePath());
-                monitorTorrents(dir);
+                try {
+                    monitorTorrents(dir);
+                } catch (Exception e) {
+                    _log.error("Error in the DirectoryMonitor", e);
+                }
                 try { Thread.sleep(60*1000); } catch (InterruptedException ie) {}
             }
         }
diff --git a/apps/i2psnark/java/src/org/klomp/snark/SnarkShutdown.java b/apps/i2psnark/java/src/org/klomp/snark/SnarkShutdown.java
index fe5bd32ad8550671a48e11aaac997b33b7e2e2b5..0caefb42cb7a96f0e16d6c4764e56506843978fc 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/SnarkShutdown.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/SnarkShutdown.java
@@ -22,10 +22,12 @@ package org.klomp.snark;
 
 import java.io.IOException;
 
+import net.i2p.util.I2PThread;
+
 /**
  * Makes sure everything ends correctly when shutting down.
  */
-public class SnarkShutdown extends Thread
+public class SnarkShutdown extends I2PThread
 {
   private final Storage storage;
   private final PeerCoordinator coordinator;
diff --git a/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java b/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java
index 7cd0e7406ff1d0c60c5705fa0f23e04504718adc..ab915f6fc3482fc5ec4c98ab1c645acc7fbebadc 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java
@@ -25,6 +25,7 @@ import java.net.*;
 import java.util.*;
 
 import org.klomp.snark.bencode.*;
+import net.i2p.util.I2PThread;
 import net.i2p.util.Log;
 
 /**
@@ -33,7 +34,7 @@ import net.i2p.util.Log;
  *
  * @author Mark Wielaard (mark@klomp.org)
  */
-public class TrackerClient extends Thread
+public class TrackerClient extends I2PThread
 {
   private static final Log _log = new Log(TrackerClient.class);
   private static final String NO_EVENT = "";
@@ -84,6 +85,16 @@ public class TrackerClient extends Thread
     this.interrupt();
   }
 
+  private boolean verifyConnected() {
+    while (!stop && !I2PSnarkUtil.instance().connected()) {
+        boolean ok = I2PSnarkUtil.instance().connect();
+        if (!ok) {
+            try { Thread.sleep(30*1000); } catch (InterruptedException ie) {}
+        }
+    }
+    return !stop && I2PSnarkUtil.instance().connected();
+  }
+  
   public void run()
   {
     // XXX - Support other IPs
@@ -102,6 +113,7 @@ public class TrackerClient extends Thread
 
     try
       {
+        if (!verifyConnected()) return;
         boolean started = false;
         while (!started)
           {
@@ -164,6 +176,8 @@ public class TrackerClient extends Thread
 
             if (stop)
               break;
+       
+            if (!verifyConnected()) return;
             
             uploaded = coordinator.getUploaded();
             downloaded = coordinator.getDownloaded();
@@ -224,6 +238,7 @@ public class TrackerClient extends Thread
       {
         try
           {
+            if (!verifyConnected()) return;
             TrackerInfo info = doRequest(announce, infoHash, peerID, uploaded,
                                          downloaded, left, STOPPED_EVENT);
           }
diff --git a/history.txt b/history.txt
index 131e57a48079c755182508aecc179627c0b751f5..755fb904c3d9b807a190812ed19e8f2b32cfbfdf 100644
--- a/history.txt
+++ b/history.txt
@@ -1,4 +1,10 @@
-$Id: history.txt,v 1.358 2005/12/16 03:24:22 jrandom Exp $
+$Id: history.txt,v 1.359 2005/12/16 06:01:20 jrandom Exp $
+
+2005-12-16  jrandom
+    * Moved I2PSnark from using Threads to I2PThreads, so we handle OOMs
+      properly (thanks Complication!)
+    * More guards in I2PSnark for zany behavior (I2PSession recon w/ skew,
+      b0rking in the DirMonitor, etc)
 
 2005-12-16  jrandom
     * Try to run a torrent in readonly mode if we can't write to the file, and