anchor.diff:          [make_internal_node('Grantee', Attributes, GranteeContent),
            make_external_node('Permission', Permission)],
       make_internal_node('Grant', GrantContent).
  -
  --spec make_owner(list_objects_owner()) -> internal_node().
  -make_owner(#list_objects_owner_v1{id=Id, display_name=Name}) ->
  -    Content = [make_external_node('ID', Id),
  -               make_external_node('DisplayName', Name)],
  -    make_internal_node('Owner', Content).
   
   -spec format_value(atom() | integer() | binary() | list()) -> string().
   %% @doc Format value depending on its type
  
positive.code: to_xml(?LBRESP{}=ListBucketsResp) ->
      list_buckets_response_to_xml(ListBucketsResp);
  to_xml(?LORESP{}=ListObjsResp) ->
      list_objects_response_to_xml(ListObjsResp);
  to_xml(?RCS_USER{}=User) ->
      user_record_to_xml(User);
  to_xml({users, Users}) ->
  
negative.code:     [make_external_node('ID', OwnerId),
       make_external_node('DisplayName', OwnerName)].
  
  list_objects_response_to_simple_form(Resp) ->
      KeyContents = [{'Contents', key_content_to_simple_form(Content)} ||
                        Content <- (Resp?LORESP.contents)],
      CommonPrefixes = [{'CommonPrefixes', [{'Prefix', [CommonPrefix]}]} ||
                           CommonPrefix <- Resp?LORESP.common_prefixes],
      Contents = [{'Name',       [Resp?LORESP.name]},
                  {'Prefix',     [Resp?LORESP.prefix]},
                  {'Marker',     [Resp?LORESP.marker]}] ++
                  %% use a list-comprehension trick to only include
                  %% the `NextMarker' element if it's not `undefined'
                 [{'NextMarker',  [NextMarker]} ||
                     NextMarker <- [Resp?LORESP.next_marker],
                     NextMarker =/= undefined] ++
                 [{'MaxKeys',     [Resp?LORESP.max_keys]},
                  {'Delimiter',   [Resp?LORESP.delimiter]},
                  {'IsTruncated', [Resp?LORESP.is_truncated]}] ++
          KeyContents ++ CommonPrefixes,
      [{'ListBucketResult', [{'xmlns', ?S3_XMLNS}], Contents}].
  
  key_content_to_simple_form(KeyContent) ->
      #list_objects_owner_v1{id=Id, display_name=Name} = KeyContent?LOKC.owner,
      [{'Key',          [KeyContent?LOKC.key]},
       {'LastModified', [KeyContent?LOKC.last_modified]},
       {'ETag',         [KeyContent?LOKC.etag]},
       {'Size',         [KeyContent?LOKC.size]},
       {'StorageClass', [KeyContent?LOKC.storage_class]},
       {'Owner',        [{'ID', [Id]},
                         {'DisplayName', [Name]}]}].
  
  list_buckets_response_to_xml(Resp) ->
      BucketsContent =
  