diff --git a/i2p2www/spec/proposals/140-invisible-multihoming.rst b/i2p2www/spec/proposals/140-invisible-multihoming.rst
index 544e117ef9009dc37e085307cd918799123b3985..0f64dfe95502d03b323192b0fcc7a11e1a52f37c 100644
--- a/i2p2www/spec/proposals/140-invisible-multihoming.rst
+++ b/i2p2www/spec/proposals/140-invisible-multihoming.rst
@@ -5,7 +5,7 @@ Invisible Multihoming
     :author: str4d
     :created: 2017-05-22
     :thread: http://zzz.i2p/topics/2335
-    :lastupdated: 2017-05-22
+    :lastupdated: 2017-07-04
     :status: Open
 
 .. contents::
@@ -14,8 +14,9 @@ Invisible Multihoming
 Overview
 ========
 
-This proposal outlines a design for a protocol enabling an I2P client or service
-to transparently use multiple routers to host a single [Destination]_.
+This proposal outlines a design for a protocol enabling an I2P client, service
+or external balancer process to manage multiple routers transparently hosting a
+single [Destination]_.
 
 The proposal currently does not specify a concrete implementation. It could be
 implemented as an extension to [I2CP]_, or as a new protocol.
@@ -30,10 +31,10 @@ router independently; the router that gets used by clients at any particular
 time is the last one to publish a [LeaseSet]_.
 
 This is a hack and presumably won't work for large websites at scale. Say we had
-100 multihoming routers (edges) each with 16 tunnels. That's 1600 LeaseSet
-publishes every 10 minutes, or almost 3 per second. The floodfills would get
-overwhelmed and throttles would kick in. And that's before we even mention the
-lookup traffic.
+100 multihoming routers each with 16 tunnels. That's 1600 LeaseSet publishes
+every 10 minutes, or almost 3 per second. The floodfills would get overwhelmed
+and throttles would kick in. And that's before we even mention the lookup
+traffic.
 
 [Prop123]_ solves this problem with a meta-LeaseSet, which lists the 100 real
 LeaseSet hashes. A lookup becomes a two-stage process: first looking up the
@@ -41,78 +42,138 @@ meta-LeaseSet, and then one of the named LeaseSets. This is a good solution to
 the lookup traffic issue, but on its own it creates a significant privacy leak:
 It is possible to determine which multihoming routers are online by monitoring
 the published meta-LeaseSet, because each real LeaseSet has corresponds to a
-single edge.
+single router.
 
 We need a way for an I2P client or service to spread a single Destination across
-multiple edge routers, in a way that is indistinguishable to using a single
-router (from the perspective of the LeaseSet itself).
+multiple routers, in a way that is indistinguishable to using a single router
+(from the perspective of the LeaseSet itself).
 
 
 Design
 ======
 
+Definitions
+-----------
+
+    User
+        The person or organisation wanting to multihome their Destination(s). A
+        single Destination is considered here without loss of generality (WLOG).
+
+    Client
+        The application or service running behind the Destination. It may be a
+        client-side, server-side, or peer-to-peer application; we refer to it as
+        a client in the sense that it connects to the I2P routers.
+
+        The client consists of three parts, which may all be in the same process
+        or may be split across processes or machines (in a multi-client setup):
+
+        Balancer
+            The part of the client that manages peer selection and tunnel
+            building. There is a single balancer at any one time, and it
+            communicates with all I2P routers. There may be failover balancers.
+
+        Frontend
+            The part of the client that can be operated in parallel. Each
+            frontend communicates with a single I2P router.
+
+        Backend
+            The part of the client that is shared between all frontends. It has
+            no direct communication with any I2P router.
+
+    Router
+        An I2P router run by the user that sits at the boundary between the I2P
+        network and the user's network (akin to an edge device in corporate
+        networks). It builds tunnels under the command of a balancer, and routes
+        packets for a client or frontend.
+
 High-level overview
 -------------------
 
 Imagine the following desired configuration:
 
 - A client application with one Destination.
-- Four edge routers, each managing three inbound tunnels.
+- Four routers, each managing three inbound tunnels.
 - All twelve tunnels should be published in a single LeaseSet.
 
+Single-client
+`````````````
 .. raw:: html
 
   {% highlight lang='text' %}
                 -{ [Tunnel 1]===\
-                 |-{ [Tunnel 2]====[Edge Router 1]-----
-                 |-{ [Tunnel 3]===/                    \
-                 |                                      \
-                 |-{ [Tunnel 4]===\                      \
-  [Destination]  |-{ [Tunnel 5]====[Edge Router 2]-----   \
-    \            |-{ [Tunnel 6]===/                    \   \
-     [LeaseSet]--|                                    [Client]
-                 |-{ [Tunnel 7]===\                    /   /
-                 |-{ [Tunnel 8]====[Edge Router 3]-----   /
-                 |-{ [Tunnel 9]===/                      /
-                 |                                      /
-                 |-{ [Tunnel 10]==\                    /
-                 |-{ [Tunnel 11]===[Edge Router 4]-----
+                 |-{ [Tunnel 2]====[Router 1]-----
+                 |-{ [Tunnel 3]===/               \
+                 |                                 \
+                 |-{ [Tunnel 4]===\                 \
+  [Destination]  |-{ [Tunnel 5]====[Router 2]-----   \
+    \            |-{ [Tunnel 6]===/               \   \
+     [LeaseSet]--|                               [Client]
+                 |-{ [Tunnel 7]===\               /   /
+                 |-{ [Tunnel 8]====[Router 3]-----   /
+                 |-{ [Tunnel 9]===/                 /
+                 |                                 /
+                 |-{ [Tunnel 10]==\               /
+                 |-{ [Tunnel 11]===[Router 4]-----
                   -{ [Tunnel 12]==/
 {% endhighlight %}
 
-To create and manage this configuration, the client needs the following new
-functionality beyond what is currently provided by [I2CP]_:
-
-- Tell a router to build tunnels, without creating a LeaseSet for them.
-- Get a list of the current tunnels in the inbound pool.
-
-Additionally, the following functionality would enable significant flexibility
-in how the client manages its tunnels:
+Multi-client
+````````````
+.. raw:: html
 
-- Get the contents of a router's fast tier.
-- Tell a router to build an inbound or outbound tunnel using a given list of
-  peers.
+  {% highlight lang='text' %}
+                -{ [Tunnel 1]===\
+                 |-{ [Tunnel 2]====[Router 1]---------[Frontend 1]
+                 |-{ [Tunnel 3]===/          \                    \
+                 |                            \                    \
+                 |-{ [Tunnel 4]===\            \                    \
+  [Destination]  |-{ [Tunnel 5]====[Router 2]---\-----[Frontend 2]   \
+    \            |-{ [Tunnel 6]===/          \   \                \   \
+     [LeaseSet]--|                         [Balancer]            [Backend]
+                 |-{ [Tunnel 7]===\          /   /                /   /
+                 |-{ [Tunnel 8]====[Router 3]---/-----[Frontend 3]   /
+                 |-{ [Tunnel 9]===/            /                    /
+                 |                            /                    /
+                 |-{ [Tunnel 10]==\          /                    /
+                 |-{ [Tunnel 11]===[Router 4]---------[Frontend 4]
+                  -{ [Tunnel 12]==/
+{% endhighlight %}
 
 General client process
 ``````````````````````
 - Load or generate a Destination.
 
-- Open up a session with each edge router, tied to the Destination.
+- Open up a session with each router, tied to the Destination.
 
 - Periodically (around every ten minutes, but more or less based on tunnel
   liveness):
 
-  - Obtain the fast tier from each edge.
+  - Obtain the fast tier from each router.
 
-  - Use the superset of peers to build tunnels to/from each edge.
+  - Use the superset of peers to build tunnels to/from each router.
 
-    - By default, tunnels to/from a particular edge router will use peers from
+    - By default, tunnels to/from a particular router will use peers from
       that router's fast tier, but this is not enforced by the protocol.
 
-  - Collect the set of active inbound tunnels from all active edges, and create a
+  - Collect the set of active inbound tunnels from all active routers, and create a
     LeaseSet.
 
-  - Publish the LeaseSet through one or more of the edges.
+  - Publish the LeaseSet through one or more of the routers.
+
+Differences to I2CP
+```````````````````
+To create and manage this configuration, the client needs the following new
+functionality beyond what is currently provided by [I2CP]_:
+
+- Tell a router to build tunnels, without creating a LeaseSet for them.
+- Get a list of the current tunnels in the inbound pool.
+
+Additionally, the following functionality would enable significant flexibility
+in how the client manages its tunnels:
+
+- Get the contents of a router's fast tier.
+- Tell a router to build an inbound or outbound tunnel using a given list of
+  peers.
 
 Protocol outline
 ----------------
@@ -120,7 +181,7 @@ Protocol outline
 .. raw:: html
 
   {% highlight %}
-         Client                           Edge Router
+         Client                           Router
 
                     --------------------->  Create Session
    Session Status  <---------------------
@@ -186,10 +247,10 @@ Messages
 Security implications
 =====================
 
-From the perspective of the edge routers, this design is functionally equivalent
-to the status quo. The edge router still builds all tunnels, maintains its own
-peer profiles, and enforces separation between router and client operations. In
-the default configuration is completely identical, because tunnels for that edge
+From the perspective of the routers, this design is functionally equivalent to
+the status quo. The router still builds all tunnels, maintains its own peer
+profiles, and enforces separation between router and client operations. In the
+default configuration is completely identical, because tunnels for that router
 are built from its own fast tier.
 
 From the perspective of the netDB, a single LeaseSet created via this protocol
@@ -217,13 +278,14 @@ observer to determine that the LeaseSet is multihomed:
 - In a single-homed setup, a full 16-tunnel LeaseSet would have 16 IBGWs
   randomly selected from a set of up to (say) 20 peers.
 
-- In a 4-edge multihomed setup using the default configuration, a full 16-tunnel
-  LeaseSet would have 16 IBGWs randomly-selected from a set of at most 80 peers,
-  though there are likely to be a fraction of common peers between edge nodes.
+- In a 4-router multihomed setup using the default configuration, a full
+  16-tunnel LeaseSet would have 16 IBGWs randomly-selected from a set of at most
+  80 peers, though there are likely to be a fraction of common peers between
+  routers.
 
 Thus with the default configuration, it may be possible through statistical
 analysis to figure out that a LeaseSet is being generated by this protocol. It
-might also be possible to figure out how many edge nodes there are, although the
+might also be possible to figure out how many routers there are, although the
 effect of churn on the fast tiers would reduce the effectiveness of this
 analysis.
 
@@ -236,9 +298,9 @@ Compatibility
 =============
 
 This design is completely backwards-compatible with the network, because there
-are no changes to the [LeaseSet]_ format. All edge routers would need to be
-aware of the new protocol, but this is not a concern as they would all be
-controlled by the same entity.
+are no changes to the [LeaseSet]_ format. All routers would need to be aware of
+the new protocol, but this is not a concern as they would all be controlled by
+the same entity.
 
 
 Performance and scalability notes
@@ -255,8 +317,8 @@ modifications:
   underlying transports, and is therefore around 16kB.
 
 - Implement [Prop123]_ for tiered LeaseSets. In combination with this proposal,
-  the Destinations for the sub-LeaseSets could be spread across multiple edges,
-  effectively acting like multiple IP addresses for a clearnet service.
+  the Destinations for the sub-LeaseSets could be spread across multiple
+  routers, effectively acting like multiple IP addresses for a clearnet service.
 
 
 Acknowledgements