         key = tierOrAddress.cache[address] = @key address, 0, _
       key
 
+  # Write the branches to a file as a JSON string. We tuck the tier properties
+  # into an object before we serialize it, so that it is easy deserialize.
+  writeBranches: (tier, suffix, _) ->
+    filename = @filename tier.address, suffix
+    record = [ tier.penultimate, tier.next, tier.addresses ]
+    json = JSON.stringify(record) + "\n"
+    fs.writeFile filename, json, "utf8", _
+
+  # Read branches from a brach tier file and assign the tier properties to the
+  # given tier object.
+  #
   # TODO: Move link to head always, to maintain MRU.
   readBranches: (tier, _) ->
     filename = @filename tier.address
-    tier.addresses = JSON.parse fs.readFile filename, "utf8", _
-    tier.penultimate = tier.addresses.pop()
-    tier.loaded = true
-    tier
-
-  # Write the branches to a file as a JSON string. The penultimate flag is
-  # pushed onto the end of the objects array for serialization, and popped
-  # before the function returns.
-  writeBranches: (tier, suffix, _) ->
-    filename = @filename(tier.address, suffix)
-    record [ tier.penultimate, tier.next, tier.addresses ]
-    json = JSON.stringify(record) + "\n"
-    fs.writeFile filename, json, "utf8", _
-
+    json = fs.readFile filename, "utf8", _
+    [ penultimate, next, addresses ] = JSON.parse json
+    extend tier, { penultimate, next, addresses }
+
+  # TODO Consider: can't I always just rewrite and link?
   rewriteBranches: (tier, _) ->
     @writeBranches(tier, ".new", _)
 

    @head.previous  = @head
    @nextAddress    = 0

  create: (_) ->
    try
      stat = fs.stat @directory, _
      if not stat.isDirectory()

    entry.previous = @head
    entry

  # Unlnk a tier from the MRU list.
  unlink: (entry) ->
    { next, previous } = entry
    next.previous = previous
    previous.next = next
    entry

  # TODO Move down, bring read and write up.
  lock: (exclusive, address, leaf, callback) ->
    if not tier = @cache[address]
      @cache[address] = tier =
