diff --git a/extensions/xep-0124.xml b/extensions/xep-0124.xml
--- a/extensions/xep-0124.xml
+++ b/extensions/xep-0124.xml
@@ -204,12 +204,86 @@
     <p>Furthermore, no aspect of this protocol limits its use to communication between a client and a server. For example, it could be used for communication between a server and a peer server if such communication can occur for the relevant application (e.g., in XMPP). However, this document focuses exclusively on use of the transport by clients that cannot maintain arbitrary persistent TCP connections with a server. We assume that servers and components are under no such restrictions and thus would use the native connection transport for the relevant application. (However, on some unreliable networks, BOSH might enable more stable communication between servers.)</p>
   </section1>
   <section1 topic="The BOSH Technique" anchor='technique'>
-    <p>Since HTTP is a synchronous request/response protocol, the traditional solution to emulating a bidirectional-stream over HTTP involved the client intermittently polling the connection manager to discover if it has any data queued for delivery to the client. This naive approach wastes a lot of network bandwidth by polling when no data is available. It also reduces the responsiveness of the application since the data spends time queued waiting until the connection manager receives the next poll (HTTP request) from the client. This results in an inevitable trade-off between responsiveness and bandwidth, since increasing the polling frequency will decrease latency but simultaneously increase bandwidth consumption (or vice versa if polling frequency is decreased).</p>
-    <p>The technique employed by BOSH achieves both low latency and low bandwidth consumption by encouraging the connection manager not to respond to a request until it actually has data to send to the client. As soon as the client receives a response from the connection manager it sends another request, thereby ensuring that the connection manager is (almost) always holding a request that it can use to "push" data to the client.</p>
-    <p>If the client needs to send some data to the connection manager then it simply sends a second request containing the data, typically over a second HTTP connection. The connection manager always responds to the request it has been holding on the first connection as soon as it receives a new request from the client -- even if it has no data to send the client. It does so to make sure the client can send more data immediately if necessary. (The client SHOULD NOT open more than two HTTP connections to the connection manager at the same time, <note>In order to reduce network congestion, <cite>RFC 2616</cite> recommends that clients SHOULD NOT keep more than two HTTP connections to the same HTTP server open at the same time. Clients running in constrained enviroments typically have no choice but to abide by that recommendation.</note> so it would otherwise have to wait until the connection manager responds to one of the requests.)</p>
-    <p>BOSH works reliably even if network conditions force every HTTP request to be made over a different TCP connection. However, if as is usually the case, the client is able to use HTTP/1.1, then (assuming reliable network conditions) all requests during a session will pass over the same two persistent TCP connections. Almost all of the time (see below) the client is able to push data on one of the connections, while the connection manager is able to push data on the other (so latency is as low as a standard TCP connection). It's interesting to note that the roles of the two connections typically switch whenever the client sends data to the connection manager.</p>
-    <p>If there is no traffic in either direction for an agreed amount of time (typically several minutes), then the connection manager responds to the client with no data, and that response immediately triggers a fresh client request. The connection manager does so to ensure that if a network connection is broken then both parties will realise within a reasonable amount of time. This exchange is similar to the "keep-alive" or "ping" that is common practice over most persistent TCP connections. Since the BOSH technique involves no polling, bandwidth consumption is not significantly greater than a standard TCP connection. <note>If there is no traffic other than the "pings" then bandwidth consumption will be double that of a TCP connection (although double nothing is still nothing). If data is sent in large packets then bandwidth consumption will be almost identical.</note></p>
-    <p>Each block of data pushed by the connection manager is a complete HTTP response. So, unlike the Comet technique, the BOSH technique works through intermediate proxies that buffer partial HTTP responses. It is also fully compliant with HTTP/1.0 -- which does not provide for chunked transfer encoding.</p>
+    <p>The technique employed by BOSH, which is sometimes called "HTTP long polling", reduces latency and bandwidth consumption over other HTTP polling techniques. When the client sends a request, the connection manager does not immediately send a response; instead it holds the request open until it has data to actually send to the client (or an agreed-to length of inactivity has elapsed). The client then immediately sends a new request to the connection manager, continuing the long polling loop.</p>
+    <p>If the connection manager does not have any data to send to the client after some agreed-to length of time<note>This time is typically on the order of tens of seconds (e.g., 60), and is determined during session creation</note>, it sends a response with an empty &lt;body/&gt;. This serves a similar purpose to whitespace keep-alives or &xep0199;; it helps keep a socket connection active which prevents some intermediaries (firewalls, proxies, etc) from silently dropping it, and helps to detect breaks in a reasonable amount of time.</p>
+    <p>Where clients and connection managers support persistent connections (i.e. "Connection: keep-alive" from HTTP/1.0, and which is the default state for HTTP/1.1), these sockets remain open for an extended length of time, awaiting the client's next request. This reduces the overhead of socket establishment, which can be very expensive if HTTP over Secure Sockets Layer (SSL) is used.</p>
+    <p>If the client has data to send while a request is still open, it establishes a second socket connection to the connection manager to send a new request. The connection manager immediately responds to the previously held request (possibly with no data) and holds open this new request. This results in the connections switching roles;  the "old" connection is responded to and left awaiting new requests, while the "new" connection is now used for the long polling loop.</p>
+    <p>The following diagram illustrates this technique (possibly after XMPP session establishment)</p>
+    <code><![CDATA[
+  |
+ +-+ <-- empty body request
+ |X|
+ |-|
+ | |
+ | |
+ | |
+ | |
+ |-| <-- empty body response
+ |*|
+ +-+
+  |
+ +-+ <-- empty body request
+ |X|
+ |-|
+ | |
+ | |
+ | |
+ | |
+ |-| <-- empty body response
+ |*|
+ +-+
+  |
+ +-+ <-- empty body request
+ |X|                                      socket opened --> === 
+ |-|                                                         |
+ | |                                    new message out --> +-+
+ |-| <-- empty body response                                |X|
+ |*|                                                        |-|
+ +-+                                                        | |
+  |                                                         | |
+  |                                                         | |
+  |                                                         | |
+  |                                 empty body response --> |-|
+  |                                                         |*|
+  |                                                         +-+
+  |                                                          |
+  |                                  empty body request --> +-+
+  |                                                         |X|
+  |                                                         |-|
+  |                                                         | |
+ +-+ <-- new message out                                    | |
+ |X|                                empty body response --> |-|
+ |-| <-- new message in                                     |*|
+ |*|                                                        +-+
+ +-+                                                         |
+  |                                                          |
+ +-+ <-- empty body request                                  |
+ |X|                                                         |
+ |-|                                                         |
+ | |                                                         |
+ | |                                    new message out --> +-+
+ |-| <-- new message in                                     |X|
+ |*|                                                        |-|
+ +-+                                                        | |
+  |                                                         | |
+  |                                                         | |
+  |                                                         | |
+  |                                 empty body response --> |-|
+  |                                                         |*|
+  |                                                         +-+
+  |                                                          |
+  |                                  empty body request --> +-+
+  |                                                         |X| 
+  |                                                         |-|
+  |                                                         | |
+  |                                                         | |
+  |                                                         | |
+  |                                                         | |
+  |                                 empty body response --> |-|
+  |                                                         |*|
+  |                                                         +-+
+  |                                                          |
+      ]]></code>
   </section1>
   <section1 topic="HTTP Overview" anchor='overview'>
     <p>All information is encoded in the body of standard HTTP POST requests and responses. Each HTTP body contains a single &lt;body/&gt; wrapper which encapsulates the XML elements being transferred (see <link url="#wrapper">&lt;body/&gt; Wrapper Element</link>).</p>
