diff --git a/router/java/src/net/i2p/router/client/ClientMessageEventListener.java b/router/java/src/net/i2p/router/client/ClientMessageEventListener.java
index 150773a4bdd3ef12091ee1f6020e8d1034dcf3b9..846aa2cc4c735bf411fc053a79e63793587af3f2 100644
--- a/router/java/src/net/i2p/router/client/ClientMessageEventListener.java
+++ b/router/java/src/net/i2p/router/client/ClientMessageEventListener.java
@@ -454,7 +454,27 @@ class ClientMessageEventListener implements I2CPMessageReader.I2CPMessageEventLi
         if (_log.shouldLog(Log.DEBUG))
             _log.debug("handleSendMessage called");
         long beforeDistribute = _context.clock().now();
-        MessageId id = _runner.distributeMessage(message);
+        MessageId id;
+        try {
+            // ClientMessagePool runs OCMOSJ inline
+            // don't let bugs there kill the whole session
+            id = _runner.distributeMessage(message);
+        } catch (Exception e) {
+            _log.error("Error sending message", e);
+            MessageStatusMessage status = new MessageStatusMessage();
+            status.setMessageId(_runner.getNextMessageId());
+            status.setSessionId(sid.getSessionId());
+            status.setSize(0);
+            status.setNonce(message.getNonce()); 
+            status.setStatus(MessageStatusMessage.STATUS_SEND_FAILURE_ROUTER);
+            try {
+                _runner.doSend(status);
+            } catch (I2CPMessageException ime) {
+                if (_log.shouldLog(Log.WARN))
+                    _log.warn("Error writing out the message status message", ime);
+            }
+            return;
+        }
         long timeToDistribute = _context.clock().now() - beforeDistribute;
         // TODO validate session id
         _runner.ackSendMessage(sid, id, message.getNonce());