diff --git a/asio/src/doc/reference.qbk b/asio/src/doc/reference.qbk
index 331d9a2..f86e2e0 100644
--- a/asio/src/doc/reference.qbk
+++ b/asio/src/doc/reference.qbk
@@ -26321,14 +26321,14 @@
   [
 
     [[link asio.reference.basic_streambuf.const_buffers_type [*const_buffers_type]]]
-    [The type used to represent the get area as a list of buffers. ]
+    [The type used to represent the input sequence as a list of buffers. ]
   
   ]
 
   [
 
     [[link asio.reference.basic_streambuf.mutable_buffers_type [*mutable_buffers_type]]]
-    [The type used to represent the put area as a list of buffers. ]
+    [The type used to represent the output sequence as a list of buffers. ]
   
   ]
 
@@ -26340,37 +26340,37 @@
 
   [
     [[link asio.reference.basic_streambuf.basic_streambuf [*basic_streambuf]]]
-    [Construct a buffer with a specified maximum size. ]
+    [Construct a basic_streambuf object. ]
   ]
   
   [
     [[link asio.reference.basic_streambuf.commit [*commit]]]
-    [Move the start of the put area by the specified number of characters. ]
+    [Move characters from the output sequence to the input sequence. ]
   ]
   
   [
     [[link asio.reference.basic_streambuf.consume [*consume]]]
-    [Move the start of the get area by the specified number of characters. ]
+    [Remove characters from the input sequence. ]
   ]
   
   [
     [[link asio.reference.basic_streambuf.data [*data]]]
-    [Get a list of buffers that represents the get area. ]
+    [Get a list of buffers that represents the input sequence. ]
   ]
   
   [
     [[link asio.reference.basic_streambuf.max_size [*max_size]]]
-    [Return the maximum size of the buffer. ]
+    [Get the maximum size of the basic_streambuf. ]
   ]
   
   [
     [[link asio.reference.basic_streambuf.prepare [*prepare]]]
-    [Get a list of buffers that represents the put area, with the given size. ]
+    [Get a list of buffers that represents the output sequence, with the given size. ]
   ]
   
   [
     [[link asio.reference.basic_streambuf.size [*size]]]
-    [Return the size of the get area in characters. ]
+    [Get the size of the input sequence. ]
   ]
   
 ]
@@ -26381,7 +26381,7 @@
 
   [
     [[link asio.reference.basic_streambuf.overflow [*overflow]]]
-    []
+    [Override std::streambuf behaviour. ]
   ]
   
   [
@@ -26391,21 +26391,79 @@
   
   [
     [[link asio.reference.basic_streambuf.underflow [*underflow]]]
-    []
+    [Override std::streambuf behaviour. ]
   ]
   
 ]
 
+The `basic_streambuf` class is derived from `std::streambuf` to associate the streambuf's input and output sequences with one or more character arrays. These character arrays are internal to the `basic_streambuf` object, but direct access to the array elements is provided to permit them to be used efficiently with I/O operations. Characters written to the output sequence of a `basic_streambuf` object are appended to the input sequence of the same object.
+
+The `basic_streambuf` class's public interface is intended to permit the following implementation strategies:
+
+
+* A single contiguous character array, which is reallocated as necessary to accommodate changes in the size of the character sequence. This is the implementation approach currently used in Asio.
+
+* A sequence of one or more character arrays, where each array is of the same size. Additional character array objects are appended to the sequence to accommodate changes in the size of the character sequence.
+
+* A sequence of one or more character arrays of varying sizes. Additional character array objects are appended to the sequence to accommodate changes in the size of the character sequence.
+
+The constructor for basic_streambuf accepts a `size_t` argument specifying the maximum of the sum of the sizes of the input sequence and output sequence. During the lifetime of the `basic_streambuf` object, the following invariant holds: 
+
+   size() <= max_size()
+
+
+Any member function that would, if successful, cause the invariant to be violated shall throw an exception of class `std::length_error`.
+
+The constructor for `basic_streambuf` takes an Allocator argument. A copy of this argument is used for any memory allocation performed, by the constructor and by all member functions, during the lifetime of each `basic_streambuf` object.
+
+
+[heading Examples]
+  
+Writing directly from an streambuf to a socket: 
+
+   asio::streambuf b;
+   std::ostream os(&b);
+   os << "Hello, World!\n";
+
+   // try sending some data in input sequence
+   size_t n = sock.send(b.data());
+
+   b.consume(n); // sent data is removed from input sequence
+
+
+
+
+Reading from a socket directly into a streambuf: 
+
+   asio::streambuf b;
+
+   // reserve 512 bytes in output sequence
+   asio::streambuf::const_buffers_type bufs = b.prepare(512);
+
+   size_t n = sock.receive(bufs);
+
+   // received data is "committed" from output sequence to input sequence
+   b.commit(n);
+
+   std::istream is(&b);
+   std::string s;
+   is >> s;
+
+
+
+
 
 [section:basic_streambuf basic_streambuf::basic_streambuf]
 
-[indexterm2 basic_streambuf..basic_streambuf] Construct a buffer with a specified maximum size. 
+[indexterm2 basic_streambuf..basic_streambuf] Construct a basic_streambuf object. 
 
   basic_streambuf(
       std::size_t max_size = (std::numeric_limits< std::size_t >::max)(),
       const Allocator & allocator = Allocator());
 
 
+Constructs a streambuf with the specified maximum size. The initial size of the streambuf's input sequence is 0. 
+
 
 [endsect]
 
@@ -26413,12 +26471,27 @@
 
 [section:commit basic_streambuf::commit]
 
-[indexterm2 commit..basic_streambuf] Move the start of the put area by the specified number of characters. 
+[indexterm2 commit..basic_streambuf] Move characters from the output sequence to the input sequence. 
 
   void commit(
       std::size_t n);
 
 
+Appends `n` characters from the start of the output sequence to the input sequence. The beginning of the output sequence is advanced by `n` characters.
+
+Requires a preceding call `prepare(x)` where `x >= n`, and no intervening operations that modify the input or output sequence.
+
+
+[heading Exceptions]
+    
+
+[variablelist
+  
+[[std::length_error][If `n` is greater than the size of the output sequence. ]]
+
+]
+
+
 
 [endsect]
 
@@ -26426,7 +26499,7 @@
 
 [section:const_buffers_type basic_streambuf::const_buffers_type]
 
-[indexterm2 const_buffers_type..basic_streambuf] The type used to represent the get area as a list of buffers. 
+[indexterm2 const_buffers_type..basic_streambuf] The type used to represent the input sequence as a list of buffers. 
 
   typedef implementation_defined const_buffers_type;
 
@@ -26439,12 +26512,25 @@
 
 [section:consume basic_streambuf::consume]
 
-[indexterm2 consume..basic_streambuf] Move the start of the get area by the specified number of characters. 
+[indexterm2 consume..basic_streambuf] Remove characters from the input sequence. 
 
   void consume(
       std::size_t n);
 
 
+Removes `n` characters from the beginning of the input sequence.
+
+
+[heading Exceptions]
+    
+
+[variablelist
+  
+[[std::length_error][If `n > size()`. ]]
+
+]
+
+
 
 [endsect]
 
@@ -26452,31 +26538,47 @@
 
 [section:data basic_streambuf::data]
 
-[indexterm2 data..basic_streambuf] Get a list of buffers that represents the get area. 
+[indexterm2 data..basic_streambuf] Get a list of buffers that represents the input sequence. 
 
   const_buffers_type data() const;
 
 
 
+[heading Return Value]
+      
+An object of type `const_buffers_type` that satisfies ConstBufferSequence requirements, representing all character arrays in the input sequence.
+
+[heading Remarks]
+      
+The returned object is invalidated by any `basic_streambuf` member function that modifies the input sequence or output sequence. 
+
+
+
 [endsect]
 
 
 
 [section:max_size basic_streambuf::max_size]
 
-[indexterm2 max_size..basic_streambuf] Return the maximum size of the buffer. 
+[indexterm2 max_size..basic_streambuf] Get the maximum size of the basic_streambuf. 
 
   std::size_t max_size() const;
 
 
 
+[heading Return Value]
+      
+The allowed maximum of the sum of the sizes of the input sequence and output sequence. 
+
+
+
 [endsect]
 
 
 
 [section:mutable_buffers_type basic_streambuf::mutable_buffers_type]
 
-[indexterm2 mutable_buffers_type..basic_streambuf] The type used to represent the put area as a list of buffers. 
+[indexterm2 mutable_buffers_type..basic_streambuf] The type used to represent the output sequence as a list of buffers. 
 
   typedef implementation_defined mutable_buffers_type;
 
@@ -26489,12 +26591,14 @@
 
 [section:overflow basic_streambuf::overflow]
 
-[indexterm2 overflow..basic_streambuf] 
+[indexterm2 overflow..basic_streambuf] Override std::streambuf behaviour. 
 
   int_type overflow(
       int_type c);
 
 
+Behaves according to the specification of `std::streambuf::overflow()`, with the specialisation that `std::length_error` is thrown if appending the character to the input sequence would require the condition `size() > max_size()` to be true. 
+
 
 [endsect]
 
@@ -26502,10 +26606,31 @@
 
 [section:prepare basic_streambuf::prepare]
 
-[indexterm2 prepare..basic_streambuf] Get a list of buffers that represents the put area, with the given size. 
+[indexterm2 prepare..basic_streambuf] Get a list of buffers that represents the output sequence, with the given size. 
 
   mutable_buffers_type prepare(
-      std::size_t size);
+      std::size_t n);
+
+
+Ensures that the output sequence can accommodate `n` characters, reallocating character array objects as necessary.
+
+
+[heading Return Value]
+      
+An object of type `mutable_buffers_type` that satisfies MutableBufferSequence requirements, representing character array objects at the start of the output sequence such that the sum of the buffer sizes is `n`.
+
+[heading Exceptions]
+    
+
+[variablelist
+  
+[[std::length_error][If `size() + n > max_size()`.]]
+
+]
+
+[heading Remarks]
+      
+The returned object is invalidated by any `basic_streambuf` member function that modifies the input sequence or output sequence. 
 
 
 
@@ -26528,23 +26653,43 @@
 
 [section:size basic_streambuf::size]
 
-[indexterm2 size..basic_streambuf] Return the size of the get area in characters. 
+[indexterm2 size..basic_streambuf] Get the size of the input sequence. 
 
   std::size_t size() const;
 
 
 
+[heading Return Value]
+      
+The size of the input sequence. The value is equal to that calculated for `s` in the following code: 
+
+   size_t s = 0;
+   const_buffers_type bufs = data();
+   const_buffers_type::const_iterator i = bufs.begin();
+   while (i != bufs.end())
+   {
+     const_buffer buf(*i++);
+     s += buffer_size(buf);
+   }
+
+
+
+
+
+
 [endsect]
 
 
 
 [section:underflow basic_streambuf::underflow]
 
-[indexterm2 underflow..basic_streambuf] 
+[indexterm2 underflow..basic_streambuf] Override std::streambuf behaviour. 
 
   int_type underflow();
 
 
+Behaves according to the specification of `std::streambuf::underflow()`. 
+
 
 [endsect]
 
@@ -56425,14 +56570,14 @@
   [
 
     [[link asio.reference.basic_streambuf.const_buffers_type [*const_buffers_type]]]
-    [The type used to represent the get area as a list of buffers. ]
+    [The type used to represent the input sequence as a list of buffers. ]
   
   ]
 
   [
 
     [[link asio.reference.basic_streambuf.mutable_buffers_type [*mutable_buffers_type]]]
-    [The type used to represent the put area as a list of buffers. ]
+    [The type used to represent the output sequence as a list of buffers. ]
   
   ]
 
@@ -56444,37 +56589,37 @@
 
   [
     [[link asio.reference.basic_streambuf.basic_streambuf [*basic_streambuf]]]
-    [Construct a buffer with a specified maximum size. ]
+    [Construct a basic_streambuf object. ]
   ]
   
   [
     [[link asio.reference.basic_streambuf.commit [*commit]]]
-    [Move the start of the put area by the specified number of characters. ]
+    [Move characters from the output sequence to the input sequence. ]
   ]
   
   [
     [[link asio.reference.basic_streambuf.consume [*consume]]]
-    [Move the start of the get area by the specified number of characters. ]
+    [Remove characters from the input sequence. ]
   ]
   
   [
     [[link asio.reference.basic_streambuf.data [*data]]]
-    [Get a list of buffers that represents the get area. ]
+    [Get a list of buffers that represents the input sequence. ]
   ]
   
   [
     [[link asio.reference.basic_streambuf.max_size [*max_size]]]
-    [Return the maximum size of the buffer. ]
+    [Get the maximum size of the basic_streambuf. ]
   ]
   
   [
     [[link asio.reference.basic_streambuf.prepare [*prepare]]]
-    [Get a list of buffers that represents the put area, with the given size. ]
+    [Get a list of buffers that represents the output sequence, with the given size. ]
   ]
   
   [
     [[link asio.reference.basic_streambuf.size [*size]]]
-    [Return the size of the get area in characters. ]
+    [Get the size of the input sequence. ]
   ]
   
 ]
@@ -56485,7 +56630,7 @@
 
   [
     [[link asio.reference.basic_streambuf.overflow [*overflow]]]
-    []
+    [Override std::streambuf behaviour. ]
   ]
   
   [
@@ -56495,11 +56640,67 @@
   
   [
     [[link asio.reference.basic_streambuf.underflow [*underflow]]]
-    []
+    [Override std::streambuf behaviour. ]
   ]
   
 ]
 
+The `basic_streambuf` class is derived from `std::streambuf` to associate the streambuf's input and output sequences with one or more character arrays. These character arrays are internal to the `basic_streambuf` object, but direct access to the array elements is provided to permit them to be used efficiently with I/O operations. Characters written to the output sequence of a `basic_streambuf` object are appended to the input sequence of the same object.
+
+The `basic_streambuf` class's public interface is intended to permit the following implementation strategies:
+
+
+* A single contiguous character array, which is reallocated as necessary to accommodate changes in the size of the character sequence. This is the implementation approach currently used in Asio.
+
+* A sequence of one or more character arrays, where each array is of the same size. Additional character array objects are appended to the sequence to accommodate changes in the size of the character sequence.
+
+* A sequence of one or more character arrays of varying sizes. Additional character array objects are appended to the sequence to accommodate changes in the size of the character sequence.
+
+The constructor for basic_streambuf accepts a `size_t` argument specifying the maximum of the sum of the sizes of the input sequence and output sequence. During the lifetime of the `basic_streambuf` object, the following invariant holds: 
+
+   size() <= max_size()
+
+
+Any member function that would, if successful, cause the invariant to be violated shall throw an exception of class `std::length_error`.
+
+The constructor for `basic_streambuf` takes an Allocator argument. A copy of this argument is used for any memory allocation performed, by the constructor and by all member functions, during the lifetime of each `basic_streambuf` object.
+
+
+[heading Examples]
+  
+Writing directly from an streambuf to a socket: 
+
+   asio::streambuf b;
+   std::ostream os(&b);
+   os << "Hello, World!\n";
+
+   // try sending some data in input sequence
+   size_t n = sock.send(b.data());
+
+   b.consume(n); // sent data is removed from input sequence
+
+
+
+
+Reading from a socket directly into a streambuf: 
+
+   asio::streambuf b;
+
+   // reserve 512 bytes in output sequence
+   asio::streambuf::const_buffers_type bufs = b.prepare(512);
+
+   size_t n = sock.receive(bufs);
+
+   // received data is "committed" from output sequence to input sequence
+   b.commit(n);
+
+   std::istream is(&b);
+   std::string s;
+   is >> s;
+
+
+
+
 
 
 [endsect]
