done
diff --git a/man/man3/venti-cache.3 b/man/man3/venti-cache.3
index bdd18ec..d74145a 100644
--- a/man/man3/venti-cache.3
+++ b/man/man3/venti-cache.3
@@ -24,6 +24,8 @@
 #include <venti.h>
 .ta +\w'\fLxxxx 'u
 .PP
+.ft L
+.nf
 typedef struct VtBlock
 {
 	uchar *data;
@@ -35,16 +37,13 @@
 .ta +\w'\fLVtBlock* 'u +\w'\fLxxxxxxxx'u
 .PP
 .B
-VtCache*	vtcachealloc(VtConn *z, int blocksize, ulong nblocks, int mode);
+VtCache*	vtcachealloc(VtConn *z, int blocksize, ulong nblocks);
 .PP
 .B
 void	vtcachefree(VtCache *c);
 .PP
 .B
 u32int	vtcacheblocksize(VtCache *c);
-.br
-.B
-		int (*write)(VtConn*, uchar[VtScoreSize], uint, uchar*, int));
 .PP
 .B
 u32int	vtglobaltolocal(uchar score[VtScoreSize])
@@ -72,6 +71,9 @@
 .PP
 .B
 void	vtcachesetwrite(VtCache *c,
+.br
+.B
+	   int (*write)(VtConn*, uchar[VtScoreSize], uint, uchar*, int));
 .PP
 .B
 VtBlock*	vtblockcopy(VtBlock *b);
@@ -83,6 +85,37 @@
 cache of blocks already stored on a Venti server
 and blocks that will eventually be stored on a Venti server.
 .PP
+A 
+.B VtBlock
+represents a venti data block.
+Blocks stored on a venti server,
+called
+.IR "global blocks" ,
+are named by the SHA1 hash of their contents.
+This hash is recorded as the block's
+.IR score .
+Such blocks are immutable.
+The cache also stores mutable blocks that have not yet been
+written to a venti server.  These blocks are called
+.IR "local blocks" ,
+and have special scores that are 16 zero bytes
+followed by a 4-byte big-endian
+.IR address .
+The address is an index into the internal set of cache blocks.
+.PP
+The user-visible contents of a
+.B VtBlock
+are
+.BR data ,
+a pointer to the data;
+.BR type ,
+the venti block type;
+.BR score ,
+the block's score;
+and
+.BR addr ,
+the block's cache address.
+.PP
 .I Vtcachealloc
 allocates a new cache using the client connection
 .I z
@@ -99,8 +132,22 @@
 frees a cache and all the associated blocks.
 .PP
 .I Vtcacheblocksize
+returns the cache's maximum block size.
 .PP
-XXX global vs local blocks
+.I Vtglobaltolocal
+returns the local address corresponding to the given
+local
+.IR score .
+If passed a global score,
+.I vtglobaltolocal
+returns the special constant
+.B NilBlock
+.RB ( ~0 ).
+.I Vtlocaltoglobal
+is the opposite, setting
+.I score
+to the local score for the cache address
+.IR local .
 .PP
 .I Vtcacheallocblock
 allocates a new local block with the given
@@ -124,8 +171,9 @@
 if necessary.
 If passed a local score,
 .I vtcacheglobal
-behaves as
-.IR vtcachelocal .
+invokes
+.I vtcachelocal
+appropriately.
 .PP
 The block references returned by
 .IR vtcacheallocblock ,
@@ -191,8 +239,8 @@
 .SH SOURCE
 .B \*9/src/libventi
 .SH SEE ALSO
-.IR venti (1),
 .IR venti (3),
 .IR venti-client (3),
 .IR venti-conn (3),
-.IR venti-file (3)
+.IR venti-file (3),
+.IR venti (7)
diff --git a/man/man3/venti-client.3 b/man/man3/venti-client.3
index ec18fc4..cc8d14f 100644
--- a/man/man3/venti-client.3
+++ b/man/man3/venti-client.3
@@ -8,7 +8,7 @@
 #include <libc.h>
 .br
 #include <venti.h>
-.ta +\w'\fLextern int 'u +\w'\fLxxxxxxxx'u
+.ta +\w'\fLPacket* 'u +\w'\fLxxxxxxxx'u
 .PP
 .B
 Packet*	vtrpc(VtConn *z, Packet *p)
@@ -50,7 +50,7 @@
 int	vtping(VtConn *z)
 .PP
 .B
-extern int	ventidoublechecksha1;	/* default 1 */
+extern int ventidoublechecksha1;  /* default 1 */
 .SH DESCRIPTION
 These routines execute the client side of the 
 .IR venti (7)
@@ -73,10 +73,8 @@
 .I Vthello
 executes a
 .B hello
-transaction
-(see
-.IR venti (7)), setting
-.IB z -> sid
+transaction, setting
+.IB z ->sid
 to the name used by the server.
 .I Vthello
 is typically called only indirectly, via
@@ -103,11 +101,11 @@
 and
 .I type
 from the server,
-writes the returned data
-to
+stores the returned data
+in memory at
 .IR buf ,
-and returns the number of bytes retrieved.
-If the stored block has size larger than
+and returns the number of bytes read.
+If the server's block has size larger than
 .IR n ,
 .I vtread 
 does not modify
@@ -120,7 +118,7 @@
 .I n
 bytes in 
 .I buf
-with type
+as a block of the given
 .IR type ,
 setting 
 .IR score .
@@ -177,7 +175,6 @@
 .SH SOURCE
 .B \*9/src/libventi
 .SH SEE ALSO
-.IR venti (1),
 .IR venti (3),
 .IR venti-conn (3),
 .IR venti-packet (3),
@@ -190,5 +187,4 @@
 The other routines return \-1 on error.
 .PP
 .I Vtwrite
-returns 0 on success,
-meaning it wrote the entire block.
+returns 0 on success: there are no partial writes.
diff --git a/man/man3/venti-conn.3 b/man/man3/venti-conn.3
index bc2de00..293777c 100644
--- a/man/man3/venti-conn.3
+++ b/man/man3/venti-conn.3
@@ -61,6 +61,18 @@
 .B VtConn
 structure represents a connection to a Venti server
 (when used by a client) or to a client (when used by a server).
+It contains the following user-visible fields:
+.BR debug ,
+a flag enabling debugging prints;
+.BR version ,
+the protocol version in use;
+.BR uid ,
+the (unverified) name of the client;
+.BR sid ,
+the (unverified) name of the server;
+and
+.BR addr ,
+the network address of the remote side.
 .PP
 .I Vtconn
 initializes a new connection structure using file descriptors
@@ -81,7 +93,7 @@
 as described in
 .IR venti (7).
 The negotiated version is stored in
-.IB z -> version \fR.
+.IB z ->version \fR.
 .PP
 .I Vtsend
 writes a packet
@@ -146,7 +158,7 @@
 .I Vtdebug
 prints the formatted message to standard error
 when
-.IB z -> debug
+.IB z ->debug
 is set.  Otherwise it is a no-op.
 .PP
 .I Vthangup
diff --git a/man/man3/venti-fcall.3 b/man/man3/venti-fcall.3
index e5bdfa9..2eb0cea 100644
--- a/man/man3/venti-fcall.3
+++ b/man/man3/venti-fcall.3
@@ -14,7 +14,7 @@
 vtrootpack,
 vtrootunpack,
 vtparsescore,
-vtscorefmt \- Venti external data representation
+vtscorefmt \- venti data formats
 .SH SYNOPSIS
 .PP
 .ft L
@@ -31,7 +31,6 @@
 {
 	VtEntrySize = 40,
 	VtRootSize = 300,
-	VtRootVersion = 2,
 	VtScoreSize = 20,
 };
 .PP
@@ -39,9 +38,9 @@
 .nf
 typedef struct VtEntry
 {
-	ulong gen;			/* generation number */
-	ushort psize;			/* pointer block size */
-	ushort dsize;			/* data block size */
+	ulong gen;    /* generation number */
+	ushort psize;   /* pointer block size */
+	ushort dsize;   /* data block size */
 	uchar type;
 	uchar flags;
 	uvlong size;
@@ -54,9 +53,9 @@
 {
 	char name[128];
 	char type[128];
-	uchar score[VtScoreSize];	/* to a Dir block */
-	ushort blocksize;		/* maximum block size */
-	uchar prev[VtScoreSize];	/* previous root block */
+	uchar score[VtScoreSize];  /* to a Dir block */
+	ushort blocksize;          /* maximum block size */
+	uchar prev[VtScoreSize];   /* previous root block */
 } VtRoot;
 .ta +\w'\fLPacket* 'u
 .PP
@@ -110,7 +109,7 @@
 .B VtEntry
 structure describing a Venti file
 (see
-.IR venti (1))
+.IR venti (7))
 into a 40-byte
 .RB ( VtEntrySize )
 structure at
@@ -150,7 +149,7 @@
 .IB f ->uid \fR,
 .IB f ->sid \fR,
 the buffers
-.I f ->crypto
+.IB f ->crypto
 and
 .IB f ->codec \fR,
 and the packet
@@ -159,11 +158,11 @@
 The block type enumeration defined in
 .B <venti.h>
 (presented in 
-.IR venti (1))
+.IR venti (7))
 differs from the one used on disk and in the network
 protocol.
 The disk and network representation uses different
-constants does not distinguish between
+constants and does not distinguish between
 .BI VtDataType+ n
 and
 .BI VtDirType+ n
@@ -173,7 +172,10 @@
 .B <venti.h>
 enumeration value to the disk value;
 .I vtfromdisktype
-converts a disk value to the enumeration value.
+converts a disk value to the enumeration value,
+always using the
+.B VtDataType
+pointers.
 The
 .B VtFcall
 field
diff --git a/man/man3/venti-file.3 b/man/man3/venti-file.3
index dfb7bf4..690fd45 100644
--- a/man/man3/venti-file.3
+++ b/man/man3/venti-file.3
@@ -1,29 +1,29 @@
 .TH VENTI-FILE 3
 .SH NAME
 VtFile,
-vtfileopenroot,
-vtfilecreateroot,
-vtfileopen,
-vtfilecreate,
 vtfileblock,
-vtfileread, 
-vtfilewrite,
-vtfileflush,
-vtfileincref,
-vtfileclose,
-vtfilegetentry,
-vtfilesetentry,
 vtfileblockscore,
+vtfileclose,
+vtfilecreate,
+vtfilecreateroot,
+vtfileflush,
+vtfileflushbefore,
 vtfilegetdirsize,
-vtfilesetdirsize,
-vtfileunlock,
+vtfilegetentry,
+vtfilegetsize,
+vtfileincref,
 vtfilelock,
 vtfilelock2,
-vtfileflushbefore,
-vtfiletruncate,
-vtfilegetsize,
+vtfileopen,
+vtfileopenroot,
+vtfileread, 
+vtfileremove,
+vtfilesetdirsize,
+vtfilesetentry,
 vtfilesetsize,
-vtfileremove \- Venti files
+vtfiletruncate,
+vtfileunlock,
+vtfilewrite \- Venti files
 .SH SYNOPSIS
 .ta +\w'\fLVtBlock* 'u
 .PP
@@ -85,7 +85,8 @@
 int	vtfilesetentry(VtFile *f, VtEntry *e);
 .PP
 .B
-int	vtfileblockscore(VtFile *f, u32int n, uchar score[VtScoreSize]);
+int	vtfileblockscore(VtFile *f, u32int n, 
+	    uchar score[VtScoreSize]);
 .PP
 .B
 int	vtfilelock(VtFile *f, int mode);
@@ -98,11 +99,11 @@
 .SH DESCRIPTION
 These routines provide a simple interface to create and
 manipulate Venti file trees (see
-.IR venti (1)).
+.IR venti (7)).
 .PP
 .I Vtfilecreateroot
 creates a new Venti file.
-.I Btype
+.I Type
 must be either
 .B VtDataType
 or
@@ -111,7 +112,7 @@
 .I Dsize
 is the block size to use for leaf (data or directory) blocks in the hash tree;
 .I psize
-is the block size to use for intermediate (pointer) blocks.
+is the block size to use for internal (pointer) blocks.
 .PP
 .I Vtfileopenroot
 opens an existing Venti file described by
@@ -124,19 +125,19 @@
 .IR f .
 .I Mode
 should be one of
-.IR VtOREAD ,
-.IR VtOWRITE ,
+.BR VtOREAD ,
+.BR VtOWRITE ,
 or
-.IR VtORDWR ,
+.BR VtORDWR ,
 indicating how the returned file is to be used.
 The
-.IR VtOWRITE
+.BR VtOWRITE
 and
-.IR VtORDWR
+.BR VtORDWR
 modes can only be used if
 .IR f
 is open with mode
-.IR VtORDWR .
+.BR VtORDWR .
 .PP
 .I Vtfilecreate
 creates a new file in the directory
@@ -239,7 +240,7 @@
 .I vtfilewrite
 should call
 .I vtfileflushbefore
-regularly to avoid filling the block cache with dirty blocks.
+regularly to avoid filling the block cache with unwritten blocks.
 .PP
 .I Vtfiletruncate
 changes the file
@@ -283,7 +284,7 @@
 returns in
 .I score
 the score of the
-.I n th
+.IR n th
 block in the file
 .IR f .
 .PP
@@ -318,7 +319,7 @@
 .SH SOURCE
 .B \*9/src/libventi/file.c
 .SH SEE ALSO
-.IR venti (1),
 .IR venti-cache (3),
 .IR venti-conn (3),
-.IR venti-client (3)
+.IR venti-client (3),
+.IR venti (7)
diff --git a/man/man3/venti-log.3 b/man/man3/venti-log.3
index bc4efe7..6b74c6c 100644
--- a/man/man3/venti-log.3
+++ b/man/man3/venti-log.3
@@ -50,17 +50,19 @@
 These routines provide an in-memory circular log
 structure used by the Venti library and the Venti server
 to record events for debugging purposes.
-The logs have textual names represented as UTF strings.
+The logs are named by UTF strings.
 .PP
 .I Vtlogopen
-returns a reference to the log named
+returns a reference to the log with the given
 .I name .
 If a log with that name does not exist and
 .I size 
-is non-zero, a new log capable of holding at
+is non-zero,
+.I vtlogopen
+creates a new log capable of holding at
 least
 .I size
-bytes is allocated and returned.
+bytes and returns it.
 .I Vtlogclose
 releases the reference returned by
 .IR vtlogopen .
@@ -126,8 +128,9 @@
 writes debugging information to the log named
 .IR VtServerLog ,
 which defaults to the string
-.LR libventi/server .
+.RB ` libventi/server '.
 .SH SOURCE
 .B \*9/src/libventi
 .SH SEE ALSO
-.IR venti (3)
+.IR venti (3),
+.IR venti (8)
diff --git a/man/man3/venti-mem.3 b/man/man3/venti-mem.3
index 46b2bb3..0a872a0 100644
--- a/man/man3/venti-mem.3
+++ b/man/man3/venti-mem.3
@@ -39,10 +39,9 @@
 They do not return.
 .PP
 .I Vtbrk
-returns a pointer to a new block of at least
+returns a pointer to a new, permanently allocated block of at least
 .I size
 bytes.
-The block cannot be freed.
 .PP
 .IR Vtmalloc ,
 .IR vtrealloc ,
diff --git a/man/man3/venti-packet.3 b/man/man3/venti-packet.3
index 7d5a518..1b70673 100644
--- a/man/man3/venti-packet.3
+++ b/man/man3/venti-packet.3
@@ -1,11 +1,26 @@
 .TH VENTI-PACKET 3
 .SH NAME
-Packet, packetalloc, packetfree, packetforeign, packetdup,
-packetsplit, packetconsume, packettrim, packetheader, 
-packettrailer, packetprefix, packetappend, packetconcat,
-packetpeek, packetcopy, packetfragments,
-packetsize, packetasize, packetcompact, packetcmp,
-packetstats, packetsha1 \- zero-copy network buffers
+Packet,
+packetalloc,
+packetappend,
+packetasize,
+packetcmp,
+packetconcat,
+packetconsume,
+packetcopy,
+packetdup,
+packetforeign,
+packetfragments,
+packetfree,
+packetheader,
+packetpeek,
+packetprefix,
+packetsha1,
+packetsize,
+packetsplit,
+packetstats,
+packettrailer,
+packettrim \- zero-copy network buffers
 .SH SYNOPSIS
 .ft L
 #include <u.h>
@@ -21,72 +36,73 @@
 Packet*	packetalloc(void);
 .PP
 .B
-void	packetfree(Packet *p)
-.PP
-.B
-Packet*	packetforeign(uchar *buf, int n,
-.br
-.B
-		void (*free)(void *a), void *a)
-.PP
-.B
-Packet*	packetdup(Packet *p, int offset, int n)
-.PP
-.B
-Packet*	packetsplit(Packet *p, int n)
-.PP
-.B
-int	packetconsume(Packet *p, uchar *buf, int n)
-.PP
-.B
-int	packettrim(Packet *p, int offset, int n)
-.PP
-.B
-uchar*	packetheader(Packet *p, int n)
-.PP
-.B
-uchar*	packettrailer(Packet *p, int n)
-.PP
-.B
-void	packetprefix(Packet *p, uchar *buf, int n)
-.PP
-.B
 void	packetappend(Packet *p, uchar *buf, int n)
 .PP
 .B
-void	packetconcat(Packet *p, Packet *q)
-.PP
-.B
-uchar*	packetpeek(Packet *p, uchar *buf, int offset, int n)
-.PP
-.B
-int	packetcopy(Packet *p, uchar *buf, int offset, int n)
-.PP
-.B
-int	packetfragments(Packet *p, IOchunk *io, int nio,
-.br
-.B
-		int offset)
-.PP
-.B
-uint	packetsize(Packet *p)
-.PP
-.B
 uint	packetasize(Packet *p)
 .PP
 .B
 int	packetcmp(Packet *p, Packet *q)
 .PP
 .B
-void	packetstats(void)
+void	packetconcat(Packet *p, Packet *q)
+.PP
+.B
+int	packetconsume(Packet *p, uchar *buf, int n)
+.PP
+.B
+int	packetcopy(Packet *p, uchar *buf, int offset, int n)
+.PP
+.B
+Packet*	packetdup(Packet *p, int offset, int n)
+.PP
+.B
+Packet*	packetforeign(uchar *buf, int n,
+.br
+.B
+		void (*free)(void *a), void *a)
+.PP
+.B
+int	packetfragments(Packet *p, IOchunk *io, int nio,
+.br
+.B
+		int offset)
+.PP
+.B
+void	packetfree(Packet *p)
+.PP
+.B
+uchar*	packetheader(Packet *p, int n)
+.PP
+.B
+uchar*	packetpeek(Packet *p, uchar *buf, int offset, int n)
+.PP
+.B
+void	packetprefix(Packet *p, uchar *buf, int n)
 .PP
 .B
 void	packetsha1(Packet *p, uchar sha1[20])
+.PP
+.B
+uint	packetsize(Packet *p)
+.PP
+.B
+Packet*	packetsplit(Packet *p, int n)
+.PP
+.B
+void	packetstats(void)
+.PP
+.B
+uchar*	packettrailer(Packet *p, int n)
+.PP
+.B
+int	packettrim(Packet *p, int offset, int n)
 .SH DESCRIPTION
 A
 .B Packet
-is a list of blocks of data.
-Each block is contiguous in memory, but the entire packet
+is a chain of blocks of data.
+Each block, called a fragment,
+is contiguous in memory, but the entire packet
 may not be.
 This representation helps avoid unnecessary memory copies.
 .PP
@@ -107,7 +123,7 @@
 This may be larger than the number of bytes stored
 in
 .IR p
-because individual fragments may not be filled.
+because fragments may not be filled completely.
 .PP
 .I Packetcmp
 compares the data sections of two packets as
@@ -214,7 +230,7 @@
 .IR p .
 .PP
 .I Packetsize
-returns the number of bytes of data contained in
+returns the length, in bytes, of the data contained in
 .IR p .
 .PP
 .I Packetsplit
@@ -263,4 +279,3 @@
 When these functions run out of memory, they
 print error messages and call
 .IR sysfatal .
-They do not return.
diff --git a/man/man3/venti-server.3 b/man/man3/venti-server.3
index 9dd6f34..a4a84b9 100644
--- a/man/man3/venti-server.3
+++ b/man/man3/venti-server.3
@@ -110,12 +110,13 @@
 .B write
 requests).
 .I Devnull
-is a write-only Venti server: it discards all
+is a dangerous write-only Venti server: it discards all
 blocks written to it and returns error on all reads.
 .SH SOURCE
 .B \*9/src/libventi
 .SH SEE ALSO
-.IR venti (1),
 .IR venti (3),
 .IR venti-conn (3),
-.IR venti-packet (3)
+.IR venti-packet (3),
+.IR venti (7),
+.IR venti (8)
\ No newline at end of file
diff --git a/man/man3/venti-zero.3 b/man/man3/venti-zero.3
index c163b88..270b768 100644
--- a/man/man3/venti-zero.3
+++ b/man/man3/venti-zero.3
@@ -30,14 +30,14 @@
 buffer pointed to by
 .I buf
 ignoring trailing zeros or zero scores,
-according to the block type
+according to the given
 .IR type .
 .PP
 .I Vtzeroextend
 pads
 .I buf
 with zeros or zero scores,
-according to the block type
+according to the given
 .IR type ,
 to grow it from
 .I size
@@ -52,5 +52,5 @@
 .br
 .B \*9/src/libventi/zeroscore.c
 .SH SEE ALSO
-.IR venti (1),
-.IR venti (3)
+.IR venti (3),
+.IR venti (7)
diff --git a/man/man3/venti.3 b/man/man3/venti.3
index a2581e9..632d599 100644
--- a/man/man3/venti.3
+++ b/man/man3/venti.3
@@ -1,6 +1,6 @@
 .TH VENTI 3
 .SH NAME
-xxx \- Venti storage server
+venti \- archival storage server
 .SH SYNOPSIS
 .PP
 .ft L
@@ -28,7 +28,7 @@
 and servers on top of these.
 .PP
 .IR Venti-fcall (3)
-describes the in-memory representation of Venti protocol messages
+describes the C representation of Venti protocol messages
 and data structures.
 It also describes routines that convert between the C representation
 and the network and disk representations.
@@ -37,7 +37,7 @@
 describes routines for writing clients that manipulate
 Venti file trees
 (see
-.IR venti (1)).
+.IR venti (7)).
 .PP
 .IR Venti-log (3)
 describes routines to access in-memory log buffers
@@ -51,13 +51,13 @@
 .PP
 .IR Venti-packet (3)
 describes routines for 
-efficiently manipulating chains of
+manipulating zero-copy chains of
 data buffers.
 .PP
 .IR Venti-zero (3)
 describes routines to zero truncate and zero extend blocks
 (see
-.IR venti (1)).
+.IR venti (7)).
 .SH SOURCE
 .B \*9/src/libventi
 .SH SEE ALSO