diff --git a/doc/listings/i2p.py b/doc/listings/i2p.py
new file mode 100644
index 0000000..62520ef
--- /dev/null
+++ b/doc/listings/i2p.py
@@ -0,0 +1,20 @@
+from foolscap.ipb import IConnectionHintHandler
+from foolscap.logging import log
+import re
+from twisted.internet import endpoints
+from zope.interface import implementer
+
+HINT_RE=re.compile(r"^i2p:([A-Za-z.0-9\-]+)(:(\d+){1,5})?$")
+
+@implementer(IConnectionHintHandler)
+class I2PPlugin:
+    def hint_to_endpoint(self, hint, reactor):
+        mo = HINT_RE.search(hint)
+        if not mo:
+            raise InvalidHintError("unrecognized I2P hint")
+        host, port = mo.group(1), mo.group(2)
+        desc = 'i2p:%s:%s' % (host, port) if port else 'i2p:%s' % host
+        try:
+            return endpoints.clientFromString(reactor, desc), host
+        except ValueError:
+            raise InvalidHintError("txi2p is not installed")
diff --git a/doc/listings/pb3calculator.py b/doc/listings/pb3calculator.py
index df41931..0418a9a 100644
--- a/doc/listings/pb3calculator.py
+++ b/doc/listings/pb3calculator.py
@@ -33,7 +33,7 @@ class Calculator(Referenceable):
 
 tub = Tub()
 tub.listenOn("tcp:12345")
-tub.setLocation("localhost:12345")
+tub.setLocation("i2p:6wata5vdjeo4ma5v2id2nka6jqaig2xfqrfzrlcgrekpcqwklnza.b32.i2p")
 url = tub.registerReference(Calculator(), "calculator")
 print "the object is available at:", url
 
diff --git a/doc/listings/pb3user.py b/doc/listings/pb3user.py
index 2b05323..915eed7 100644
--- a/doc/listings/pb3user.py
+++ b/doc/listings/pb3user.py
@@ -3,6 +3,7 @@
 import sys
 from twisted.internet import reactor
 from foolscap.api import Referenceable, Tub
+from i2p import I2PPlugin
 
 class Observer(Referenceable):
     def remote_event(self, msg):
@@ -27,6 +28,7 @@ def gotRemote(remote):
 
 url = sys.argv[1]
 tub = Tub()
+tub.addConnectionHintHandler('i2p', I2PPlugin())
 tub.startService()
 d = tub.getReference(url)
 d.addCallback(gotRemote)