anchor.diff:      [make_external_node('ID', OwnerId),
        make_external_node('DisplayName', OwnerName)].
   
  -list_objects_response_to_xml(Resp) ->
  -    KeyContents = [key_content_to_xml(Content) ||
  -                   Content <- (Resp?LORESP.contents)],
  -    CommonPrefixes = [common_prefix_to_xml(Prefix) ||
  -                         Prefix <- Resp?LORESP.common_prefixes],
  -    Contents = [make_external_node('Name', Resp?LORESP.name),
  -                make_external_node('Prefix', Resp?LORESP.prefix),
  -                make_external_node('Marker', Resp?LORESP.marker)] ++
  +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'
  -               [make_external_node('NextMarker', NextMarker) ||
  -                NextMarker <- [Resp?LORESP.next_marker],
  -                NextMarker =/= undefined] ++
  -               [make_external_node('MaxKeys', Resp?LORESP.max_keys),
  -                make_external_node('Delimiter', Resp?LORESP.delimiter),
  -                make_external_node('IsTruncated', Resp?LORESP.is_truncated)] ++
  +               [{'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,
  -    export_xml([make_internal_node('ListBucketResult', [{'xmlns', ?S3_XMLNS}],
  -                                   Contents)]).
  +    [{'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 =
  
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('CreationDate', CreationDate)]).
  
  user_to_xml_owner(?RCS_USER{canonical_id=CanonicalId, display_name=Name}) ->
      make_internal_node('Owner', [make_external_node('ID', [CanonicalId]),
                                   make_external_node('DisplayName', [Name])]).
  
  -spec make_internal_node(atom(), term()) -> internal_node().
  make_internal_node(Name, Content) ->
  