Repository: rusoto/rusoto (language: rust)

Issue:
Not getting e-tag back for Multipart uploads
```rust
UploadPartCopyOutput { copy_part_result: None, copy_source_version_id: None, request_charged: None, sse_customer_algorithm: None, sse_customer_key_md5: None, ssekms_key_id: None, server_side_encryption: None }
```

This means I can't complete my upload, because I don't have the `copy_part_result`. Seems like a bug somewhere! This is on latest. I'm tracing back to see if I can find a working version, but I'm not sure how much time I have to spin on this project.


Discussion / hints:
Thanks for the report! When you say "latest" do you mean the latest commit on `master` or the latest release?

Our [S3 integration test for multipart uploads](https://github.com/rusoto/rusoto/blob/master/integration_tests/tests/s3.rs#L176) work: I ran the test and ensured the multipart upload works as expected: file size and contents are correct and `aws s3api list-multipart-uploads --bucket BUCKETNAME` doesn't show any incomplete uploads. 

However, that test uses `upload_part` instead of `upload_copy_part`. Perhaps `upload_copy_part` is where the bug is.
Hi @matthewkmayer! Sorry, yes, latest release `0.35` in my `Cargo.toml`. I haven't tested `upload_part`, only `upload_copy_part` but yes - definitely can't see to get anything back, the output is always completely empty! 

Fix patch:
diff --git a/rusoto/core/src/signature.rs b/rusoto/core/src/signature.rs
index edc795f1ddc..b55389e55a9 100644
--- a/rusoto/core/src/signature.rs
+++ b/rusoto/core/src/signature.rs
@@ -249,7 +249,7 @@ impl SignedRequest {
         self.remove_header("X-Amz-Content-Sha256");
 
         self.remove_header("X-Amz-Date");
-        
+
         self.remove_header("Content-Type");
 
         if let Some(ref token) = *creds.token() {
@@ -276,7 +276,7 @@ impl SignedRequest {
         self.params.put("X-Amz-Date", current_time_fmted);
 
         self.canonical_query_string = build_canonical_query_string(&self.params);
-        
+
         debug!("canonical_uri: {:?}", self.canonical_uri);
         debug!("canonical_headers: {:?}", canonical_headers);
         debug!("signed_headers: {:?}", signed_headers);
@@ -380,7 +380,7 @@ impl SignedRequest {
                                             canonical_headers,
                                             signed_headers,
                                             &to_hexdigest(""));
-                (Some(to_hexdigest("")), None)
+                (Some(to_hexdigest("")), Some(0))
             }
             Some(SignedRequestPayload::Buffer(ref payload)) => {
                 let (digest, len) = digest_payload(&payload);
diff --git a/rusoto/services/cloudfront/src/generated.rs b/rusoto/services/cloudfront/src/generated.rs
index 3343ebe8f6f..694509a7d2f 100644
--- a/rusoto/services/cloudfront/src/generated.rs
+++ b/rusoto/services/cloudfront/src/generated.rs
@@ -1460,41 +1460,15 @@ impl CreateCloudFrontOriginAccessIdentityResultDeserializer {
         tag_name: &str,
         stack: &mut T,
     ) -> Result<CreateCloudFrontOriginAccessIdentityResult, XmlParseError> {
-        try!(start_element(tag_name, stack));
-
-        let mut obj = CreateCloudFrontOriginAccessIdentityResult::default();
-
-        loop {
-            let next_event = match stack.peek() {
-                Some(&Ok(XmlEvent::EndElement { ref name, .. })) => DeserializerNext::Close,
-                Some(&Ok(XmlEvent::StartElement { ref name, .. })) => {
-                    DeserializerNext::Element(name.local_name.to_owned())
-                }
-                _ => DeserializerNext::Skip,
-            };
-
-            match next_event {
-                DeserializerNext::Element(name) => match &name[..] {
-                    "CloudFrontOriginAccessIdentity" => {
-                        obj.cloud_front_origin_access_identity = Some(try!(
-                            CloudFrontOriginAccessIdentityDeserializer::deserialize(
-                                "CloudFrontOriginAccessIdentity",
-                                stack
-                            )
-                        ));
-                    }
-                    _ => skip_tree(stack),
-                },
-                DeserializerNext::Close => break,
-                DeserializerNext::Skip => {
-                    stack.next();
-                }
-            }
-        }
-
-        try!(end_element(tag_name, stack));
-
-        Ok(obj)
+        Ok(CreateCloudFrontOriginAccessIdentityResult {
+            cloud_front_origin_access_identity: Some(try!(
+                CloudFrontOriginAccessIdentityDeserializer::deserialize(
+                    "CloudFrontOriginAccessIdentity",
+                    stack
+                )
+            )),
+            ..CreateCloudFrontOriginAccessIdentityResult::default()
+        })
     }
 }
 /// <p>The request to create a new distribution.</p>
@@ -1522,39 +1496,13 @@ impl CreateDistributionResultDeserializer {
         tag_name: &str,
         stack: &mut T,
     ) -> Result<CreateDistributionResult, XmlParseError> {
-        try!(start_element(tag_name, stack));
-
-        let mut obj = CreateDistributionResult::default();
-
-        loop {
-            let next_event = match stack.peek() {
-                Some(&Ok(XmlEvent::EndElement { ref name, .. })) => DeserializerNext::Close,
-                Some(&Ok(XmlEvent::StartElement { ref name, .. })) => {
-                    DeserializerNext::Element(name.local_name.to_owned())
-                }
-                _ => DeserializerNext::Skip,
-            };
-
-            match next_event {
-                DeserializerNext::Element(name) => match &name[..] {
-                    "Distribution" => {
-                        obj.distribution = Some(try!(DistributionDeserializer::deserialize(
-                            "Distribution",
-                            stack
-                        )));
-                    }
-                    _ => skip_tree(stack),
-                },
-                DeserializerNext::Close => break,
-                DeserializerNext::Skip => {
-                    stack.next();
-                }
-            }
-        }
-
-        try!(end_element(tag_name, stack));
-
-        Ok(obj)
+        Ok(CreateDistributionResult {
+            distribution: Some(try!(DistributionDeserializer::deserialize(
+                "Distribution",
+                stack
+            ))),
+            ..CreateDistributionResult::default()
+        })
     }
 }
 /// <p>The request to create a new distribution with tags. </p>
@@ -1582,39 +1530,13 @@ impl CreateDistributionWithTagsResultDeserializer {
         tag_name: &str,
         stack: &mut T,
     ) -> Result<CreateDistributionWithTagsResult, XmlParseError> {
-        try!(start_element(tag_name, stack));
-
-        let mut obj = CreateDistributionWithTagsResult::default();
-
-        loop {
-            let next_event = match stack.peek() {
-                Some(&Ok(XmlEvent::EndElement { ref name, .. })) => DeserializerNext::Close,
-                Some(&Ok(XmlEvent::StartElement { ref name, .. })) => {
-                    DeserializerNext::Element(name.local_name.to_owned())
-                }
-                _ => DeserializerNext::Skip,
-            };
-
-            match next_event {
-                DeserializerNext::Element(name) => match &name[..] {
-                    "Distribution" => {
-                        obj.distribution = Some(try!(DistributionDeserializer::deserialize(
-                            "Distribution",
-                            stack
-                        )));
-                    }
-                    _ => skip_tree(stack),
-                },
-                DeserializerNext::Close => break,
-                DeserializerNext::Skip => {
-                    stack.next();
-                }
-            }
-        }
-
-        try!(end_element(tag_name, stack));
-
-        Ok(obj)
+        Ok(CreateDistributionWithTagsResult {
+            distribution: Some(try!(DistributionDeserializer::deserialize(
+                "Distribution",
+                stack
+            ))),
+            ..CreateDistributionWithTagsResult::default()
+        })
     }
 }
 /// <p>The request to create an invalidation.</p>
@@ -1642,39 +1564,13 @@ impl CreateInvalidationResultDeserializer {
         tag_name: &str,
         stack: &mut T,
     ) -> Result<CreateInvalidationResult, XmlParseError> {
-        try!(start_element(tag_name, stack));
-
-        let mut obj = CreateInvalidationResult::default();
-
-        loop {
-            let next_event = match stack.peek() {
-                Some(&Ok(XmlEvent::EndElement { ref name, .. })) => DeserializerNext::Close,
-                Some(&Ok(XmlEvent::StartElement { ref name, .. })) => {
-                    DeserializerNext::Element(name.local_name.to_owned())
-                }
-                _ => DeserializerNext::Skip,
-            };
-
-            match next_event {
-                DeserializerNext::Element(name) => match &name[..] {
-                    "Invalidation" => {
-                        obj.invalidation = Some(try!(InvalidationDeserializer::deserialize(
-                            "Invalidation",
-                            stack
-                        )));
-                    }
-                    _ => skip_tree(stack),
-                },
-                DeserializerNext::Close => break,
-                DeserializerNext::Skip => {
-                    stack.next();
-                }
-            }
-        }
-
-        try!(end_element(tag_name, stack));
-
-        Ok(obj)
+        Ok(CreateInvalidationResult {
+            invalidation: Some(try!(InvalidationDeserializer::deserialize(
+                "Invalidation",
+                stack
+            ))),
+            ..CreateInvalidationResult::default()
+        })
     }
 }
 /// <p>The request to create a new streaming distribution.</p>
@@ -1702,40 +1598,13 @@ impl CreateStreamingDistributionResultDeserializer {
         tag_name: &str,
         stack: &mut T,
     ) -> Result<CreateStreamingDistributionResult, XmlParseError> {
-        try!(start_element(tag_name, stack));
-
-        let mut obj = CreateStreamingDistributionResult::default();
-
-        loop {
-            let next_event = match stack.peek() {
-                Some(&Ok(XmlEvent::EndElement { ref name, .. })) => DeserializerNext::Close,
-                Some(&Ok(XmlEvent::StartElement { ref name, .. })) => {
-                    DeserializerNext::Element(name.local_name.to_owned())
-                }
-                _ => DeserializerNext::Skip,
-            };
-
-            match next_event {
-                DeserializerNext::Element(name) => match &name[..] {
-                    "StreamingDistribution" => {
-                        obj.streaming_distribution =
-                            Some(try!(StreamingDistributionDeserializer::deserialize(
-                                "StreamingDistribution",
-                                stack
-                            )));
-                    }
-                    _ => skip_tree(stack),
-                },
-                DeserializerNext::Close => break,
-                DeserializerNext::Skip => {
-                    stack.next();
-                }
-            }
-        }
-
-        try!(end_element(tag_name, stack));
-
-        Ok(obj)
+        Ok(CreateStreamingDistributionResult {
+            streaming_distribution: Some(try!(StreamingDistributionDeserializer::deserialize(
+                "StreamingDistribution",
+                stack
+            ))),
+            ..CreateStreamingDistributionResult::default()
+        })
     }
 }
 /// <p>The request to create a new streaming distribution with tags.</p>
@@ -1762,40 +1631,13 @@ impl CreateStreamingDistributionWithTagsResultDeserializer {
         tag_name: &str,
         stack: &mut T,
     ) -> Result<CreateStreamingDistributionWithTagsResult, XmlParseError> {
-        try!(start_element(tag_name, stack));
-
-        let mut obj = CreateStreamingDistributionWithTagsResult::default();
-
-        loop {
-            let next_event = match stack.peek() {
-                Some(&Ok(XmlEvent::EndElement { ref name, .. })) => DeserializerNext::Close,
-                Some(&Ok(XmlEvent::StartElement { ref name, .. })) => {
-                    DeserializerNext::Element(name.local_name.to_owned())
-                }
-                _ => DeserializerNext::Skip,
-            };
-
-            match next_event {
-                DeserializerNext::Element(name) => match &name[..] {
-                    "StreamingDistribution" => {
-                        obj.streaming_distribution =
-                            Some(try!(StreamingDistributionDeserializer::deserialize(
-                                "StreamingDistribution",
-                                stack
-                            )));
-                    }
-                    _ => skip_tree(stack),
-                },
-                DeserializerNext::Close => break,
-                DeserializerNext::Skip => {
-                    stack.next();
-                }
-            }
-        }
-
-        try!(end_element(tag_name, stack));
-
-        Ok(obj)
+        Ok(CreateStreamingDistributionWithTagsResult {
+            streaming_distribution: Some(try!(StreamingDistributionDeserializer::deserialize(
+                "StreamingDistribution",
+                stack
+            ))),
+            ..CreateStreamingDistributionWithTagsResult::default()
+        })
     }
 }
 /// <p>A complex type that controls:</p> <ul> <li> <p>Whether CloudFront replaces HTTP status codes in the 4xx and 5xx range with custom error messages before returning the response to the viewer. </p> </li> <li> <p>How long CloudFront caches HTTP status codes in the 4xx and 5xx range.</p> </li> </ul> <p>For more information about custom error pages, see <a href="http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/custom-error-pages.html">Customizing Error Responses</a> in the <i>Amazon CloudFront Developer Guide</i>.</p>
@@ -3476,41 +3318,15 @@ impl GetCloudFrontOriginAccessIdentityConfigResultDeserializer {
         tag_name: &str,
         stack: &mut T,
     ) -> Result<GetCloudFrontOriginAccessIdentityConfigResult, XmlParseError> {
-        try!(start_element(tag_name, stack));
-
-        let mut obj = GetCloudFrontOriginAccessIdentityConfigResult::default();
-
-        loop {
-            let next_event = match stack.peek() {
-                Some(&Ok(XmlEvent::EndElement { ref name, .. })) => DeserializerNext::Close,
-                Some(&Ok(XmlEvent::StartElement { ref name, .. })) => {
-                    DeserializerNext::Element(name.local_name.to_owned())
-                }
-                _ => DeserializerNext::Skip,
-            };
-
-            match next_event {
-                DeserializerNext::Element(name) => match &name[..] {
-                    "CloudFrontOriginAccessIdentityConfig" => {
-                        obj.cloud_front_origin_access_identity_config = Some(try!(
-                            CloudFrontOriginAccessIdentityConfigDeserializer::deserialize(
-                                "CloudFrontOriginAccessIdentityConfig",
-                                stack
-                            )
-                        ));
-                    }
-                    _ => skip_tree(stack),
-                },
-                DeserializerNext::Close => break,
-                DeserializerNext::Skip => {
-                    stack.next();
-                }
-            }
-        }
-
-        try!(end_element(tag_name, stack));
-
-        Ok(obj)
+        Ok(GetCloudFrontOriginAccessIdentityConfigResult {
+            cloud_front_origin_access_identity_config: Some(try!(
+                CloudFrontOriginAccessIdentityConfigDeserializer::deserialize(
+                    "CloudFrontOriginAccessIdentityConfig",
+                    stack
+                )
+            )),
+            ..GetCloudFrontOriginAccessIdentityConfigResult::default()
+        })
     }
 }
 /// <p>The request to get an origin access identity's information.</p>
@@ -3536,41 +3352,15 @@ impl GetCloudFrontOriginAccessIdentityResultDeserializer {
         tag_name: &str,
         stack: &mut T,
     ) -> Result<GetCloudFrontOriginAccessIdentityResult, XmlParseError> {
-        try!(start_element(tag_name, stack));
-
-        let mut obj = GetCloudFrontOriginAccessIdentityResult::default();
-
-        loop {
-            let next_event = match stack.peek() {
-                Some(&Ok(XmlEvent::EndElement { ref name, .. })) => DeserializerNext::Close,
-                Some(&Ok(XmlEvent::StartElement { ref name, .. })) => {
-                    DeserializerNext::Element(name.local_name.to_owned())
-                }
-                _ => DeserializerNext::Skip,
-            };
-
-            match next_event {
-                DeserializerNext::Element(name) => match &name[..] {
-                    "CloudFrontOriginAccessIdentity" => {
-                        obj.cloud_front_origin_access_identity = Some(try!(
-                            CloudFrontOriginAccessIdentityDeserializer::deserialize(
-                                "CloudFrontOriginAccessIdentity",
-                                stack
-                            )
-                        ));
-                    }
-                    _ => skip_tree(stack),
-                },
-                DeserializerNext::Close => break,
-                DeserializerNext::Skip => {
-                    stack.next();
-                }
-            }
-        }
-
-        try!(end_element(tag_name, stack));
-
-        Ok(obj)
+        Ok(GetCloudFrontOriginAccessIdentityResult {
+            cloud_front_origin_access_identity: Some(try!(
+                CloudFrontOriginAccessIdentityDeserializer::deserialize(
+                    "CloudFrontOriginAccessIdentity",
+                    stack
+                )
+            )),
+            ..GetCloudFrontOriginAccessIdentityResult::default()
+        })
     }
 }
 /// <p>The request to get a distribution configuration.</p>
@@ -3596,40 +3386,13 @@ impl GetDistributionConfigResultDeserializer {
         tag_name: &str,
         stack: &mut T,
     ) -> Result<GetDistributionConfigResult, XmlParseError> {
-        try!(start_element(tag_name, stack));
-
-        let mut obj = GetDistributionConfigResult::default();
-
-        loop {
-            let next_event = match stack.peek() {
-                Some(&Ok(XmlEvent::EndElement { ref name, .. })) => DeserializerNext::Close,
-                Some(&Ok(XmlEvent::StartElement { ref name, .. })) => {
-                    DeserializerNext::Element(name.local_name.to_owned())
-                }
-                _ => DeserializerNext::Skip,
-            };
-
-            match next_event {
-                DeserializerNext::Element(name) => match &name[..] {
-                    "DistributionConfig" => {
-                        obj.distribution_config =
-                            Some(try!(DistributionConfigDeserializer::deserialize(
-                                "DistributionConfig",
-                                stack
-                            )));
-                    }
-                    _ => skip_tree(stack),
-                },
-                DeserializerNext::Close => break,
-                DeserializerNext::Skip => {
-                    stack.next();
-                }
-            }
-        }
-
-        try!(end_element(tag_name, stack));
-
-        Ok(obj)
+        Ok(GetDistributionConfigResult {
+            distribution_config: Some(try!(DistributionConfigDeserializer::deserialize(
+                "DistributionConfig",
+                stack
+            ))),
+            ..GetDistributionConfigResult::default()
+        })
     }
 }
 /// <p>The request to get a distribution's information.</p>
@@ -3655,39 +3418,13 @@ impl GetDistributionResultDeserializer {
         tag_name: &str,
         stack: &mut T,
     ) -> Result<GetDistributionResult, XmlParseError> {
-        try!(start_element(tag_name, stack));
-
-        let mut obj = GetDistributionResult::default();
-
-        loop {
-            let next_event = match stack.peek() {
-                Some(&Ok(XmlEvent::EndElement { ref name, .. })) => DeserializerNext::Close,
-                Some(&Ok(XmlEvent::StartElement { ref name, .. })) => {
-                    DeserializerNext::Element(name.local_name.to_owned())
-                }
-                _ => DeserializerNext::Skip,
-            };
-
-            match next_event {
-                DeserializerNext::Element(name) => match &name[..] {
-                    "Distribution" => {
-                        obj.distribution = Some(try!(DistributionDeserializer::deserialize(
-                            "Distribution",
-                            stack
-                        )));
-                    }
-                    _ => skip_tree(stack),
-                },
-                DeserializerNext::Close => break,
-                DeserializerNext::Skip => {
-                    stack.next();
-                }
-            }
-        }
-
-        try!(end_element(tag_name, stack));
-
-        Ok(obj)
+        Ok(GetDistributionResult {
+            distribution: Some(try!(DistributionDeserializer::deserialize(
+                "Distribution",
+                stack
+            ))),
+            ..GetDistributionResult::default()
+        })
     }
 }
 /// <p>The request to get an invalidation's information. </p>
@@ -3713,39 +3450,13 @@ impl GetInvalidationResultDeserializer {
         tag_name: &str,
         stack: &mut T,
     ) -> Result<GetInvalidationResult, XmlParseError> {
-        try!(start_element(tag_name, stack));
-
-        let mut obj = GetInvalidationResult::default();
-
-        loop {
-            let next_event = match stack.peek() {
-                Some(&Ok(XmlEvent::EndElement { ref name, .. })) => DeserializerNext::Close,
-                Some(&Ok(XmlEvent::StartElement { ref name, .. })) => {
-                    DeserializerNext::Element(name.local_name.to_owned())
-                }
-                _ => DeserializerNext::Skip,
-            };
-
-            match next_event {
-                DeserializerNext::Element(name) => match &name[..] {
-                    "Invalidation" => {
-                        obj.invalidation = Some(try!(InvalidationDeserializer::deserialize(
-                            "Invalidation",
-                            stack
-                        )));
-                    }
-                    _ => skip_tree(stack),
-                },
-                DeserializerNext::Close => break,
-                DeserializerNext::Skip => {
-                    stack.next();
-                }
-            }
-        }
-
-        try!(end_element(tag_name, stack));
-
-        Ok(obj)
+        Ok(GetInvalidationResult {
+            invalidation: Some(try!(InvalidationDeserializer::deserialize(
+                "Invalidation",
+                stack
+            ))),
+            ..GetInvalidationResult::default()
+        })
     }
 }
 /// <p>To request to get a streaming distribution configuration.</p>
@@ -3771,40 +3482,15 @@ impl GetStreamingDistributionConfigResultDeserializer {
         tag_name: &str,
         stack: &mut T,
     ) -> Result<GetStreamingDistributionConfigResult, XmlParseError> {
-        try!(start_element(tag_name, stack));
-
-        let mut obj = GetStreamingDistributionConfigResult::default();
-
-        loop {
-            let next_event = match stack.peek() {
-                Some(&Ok(XmlEvent::EndElement { ref name, .. })) => DeserializerNext::Close,
-                Some(&Ok(XmlEvent::StartElement { ref name, .. })) => {
-                    DeserializerNext::Element(name.local_name.to_owned())
-                }
-                _ => DeserializerNext::Skip,
-            };
-
-            match next_event {
-                DeserializerNext::Element(name) => match &name[..] {
-                    "StreamingDistributionConfig" => {
-                        obj.streaming_distribution_config =
-                            Some(try!(StreamingDistributionConfigDeserializer::deserialize(
-                                "StreamingDistributionConfig",
-                                stack
-                            )));
-                    }
-                    _ => skip_tree(stack),
-                },
-                DeserializerNext::Close => break,
-                DeserializerNext::Skip => {
-                    stack.next();
-                }
-            }
-        }
-
-        try!(end_element(tag_name, stack));
-
-        Ok(obj)
+        Ok(GetStreamingDistributionConfigResult {
+            streaming_distribution_config: Some(try!(
+                StreamingDistributionConfigDeserializer::deserialize(
+                    "StreamingDistributionConfig",
+                    stack
+                )
+            )),
+            ..GetStreamingDistributionConfigResult::default()
+        })
     }
 }
 /// <p>The request to get a streaming distribution's information.</p>
@@ -3830,40 +3516,13 @@ impl GetStreamingDistributionResultDeserializer {
         tag_name: &str,
         stack: &mut T,
     ) -> Result<GetStreamingDistributionResult, XmlParseError> {
-        try!(start_element(tag_name, stack));
-
-        let mut obj = GetStreamingDistributionResult::default();
-
-        loop {
-            let next_event = match stack.peek() {
-                Some(&Ok(XmlEvent::EndElement { ref name, .. })) => DeserializerNext::Close,
-                Some(&Ok(XmlEvent::StartElement { ref name, .. })) => {
-                    DeserializerNext::Element(name.local_name.to_owned())
-                }
-                _ => DeserializerNext::Skip,
-            };
-
-            match next_event {
-                DeserializerNext::Element(name) => match &name[..] {
-                    "StreamingDistribution" => {
-                        obj.streaming_distribution =
-                            Some(try!(StreamingDistributionDeserializer::deserialize(
-                                "StreamingDistribution",
-                                stack
-                            )));
-                    }
-                    _ => skip_tree(stack),
-                },
-                DeserializerNext::Close => break,
-                DeserializerNext::Skip => {
-                    stack.next();
-                }
-            }
-        }
-
-        try!(end_element(tag_name, stack));
-
-        Ok(obj)
+        Ok(GetStreamingDistributionResult {
+            streaming_distribution: Some(try!(StreamingDistributionDeserializer::deserialize(
+                "StreamingDistribution",
+                stack
+            ))),
+            ..GetStreamingDistributionResult::default()
+        })
     }
 }
 struct HeaderListDeserializer;
@@ -4794,60 +4453,34 @@ impl LambdaFunctionAssociationsSerializer {
 #[derive(Default, Debug, Clone, PartialEq)]
 pub struct ListCloudFrontOriginAccessIdentitiesRequest {
     /// <p>Use this when paginating results to indicate where to begin in your list of origin access identities. The results include identities in the list that occur after the marker. To get the next page of results, set the <code>Marker</code> to the value of the <code>NextMarker</code> from the current page's response (which is also the ID of the last identity on that page).</p>
-    pub marker: Option<String>,
-    /// <p>The maximum number of origin access identities you want in the response body. </p>
-    pub max_items: Option<String>,
-}
-
-/// <p>The returned result of the corresponding request. </p>
-#[derive(Default, Debug, Clone, PartialEq)]
-pub struct ListCloudFrontOriginAccessIdentitiesResult {
-    /// <p>The <code>CloudFrontOriginAccessIdentityList</code> type. </p>
-    pub cloud_front_origin_access_identity_list: Option<CloudFrontOriginAccessIdentityList>,
-}
-
-struct ListCloudFrontOriginAccessIdentitiesResultDeserializer;
-impl ListCloudFrontOriginAccessIdentitiesResultDeserializer {
-    #[allow(unused_variables)]
-    fn deserialize<'a, T: Peek + Next>(
-        tag_name: &str,
-        stack: &mut T,
-    ) -> Result<ListCloudFrontOriginAccessIdentitiesResult, XmlParseError> {
-        try!(start_element(tag_name, stack));
-
-        let mut obj = ListCloudFrontOriginAccessIdentitiesResult::default();
-
-        loop {
-            let next_event = match stack.peek() {
-                Some(&Ok(XmlEvent::EndElement { ref name, .. })) => DeserializerNext::Close,
-                Some(&Ok(XmlEvent::StartElement { ref name, .. })) => {
-                    DeserializerNext::Element(name.local_name.to_owned())
-                }
-                _ => DeserializerNext::Skip,
-            };
-
-            match next_event {
-                DeserializerNext::Element(name) => match &name[..] {
-                    "CloudFrontOriginAccessIdentityList" => {
-                        obj.cloud_front_origin_access_identity_list = Some(try!(
-                            CloudFrontOriginAccessIdentityListDeserializer::deserialize(
-                                "CloudFrontOriginAccessIdentityList",
-                                stack
-                            )
-                        ));
-                    }
-                    _ => skip_tree(stack),
-                },
-                DeserializerNext::Close => break,
-                DeserializerNext::Skip => {
-                    stack.next();
-                }
-            }
-        }
+    pub marker: Option<String>,
+    /// <p>The maximum number of origin access identities you want in the response body. </p>
+    pub max_items: Option<String>,
+}
 
-        try!(end_element(tag_name, stack));
+/// <p>The returned result of the corresponding request. </p>
+#[derive(Default, Debug, Clone, PartialEq)]
+pub struct ListCloudFrontOriginAccessIdentitiesResult {
+    /// <p>The <code>CloudFrontOriginAccessIdentityList</code> type. </p>
+    pub cloud_front_origin_access_identity_list: Option<CloudFrontOriginAccessIdentityList>,
+}
 
-        Ok(obj)
+struct ListCloudFrontOriginAccessIdentitiesResultDeserializer;
+impl ListCloudFrontOriginAccessIdentitiesResultDeserializer {
+    #[allow(unused_variables)]
+    fn deserialize<'a, T: Peek + Next>(
+        tag_name: &str,
+        stack: &mut T,
+    ) -> Result<ListCloudFrontOriginAccessIdentitiesResult, XmlParseError> {
+        Ok(ListCloudFrontOriginAccessIdentitiesResult {
+            cloud_front_origin_access_identity_list: Some(try!(
+                CloudFrontOriginAccessIdentityListDeserializer::deserialize(
+                    "CloudFrontOriginAccessIdentityList",
+                    stack
+                )
+            )),
+            ..ListCloudFrontOriginAccessIdentitiesResult::default()
+        })
     }
 }
 /// <p>The request to list distributions that are associated with a specified AWS WAF web ACL. </p>
@@ -4875,38 +4508,13 @@ impl ListDistributionsByWebACLIdResultDeserializer {
         tag_name: &str,
         stack: &mut T,
     ) -> Result<ListDistributionsByWebACLIdResult, XmlParseError> {
-        try!(start_element(tag_name, stack));
-
-        let mut obj = ListDistributionsByWebACLIdResult::default();
-
-        loop {
-            let next_event = match stack.peek() {
-                Some(&Ok(XmlEvent::EndElement { ref name, .. })) => DeserializerNext::Close,
-                Some(&Ok(XmlEvent::StartElement { ref name, .. })) => {
-                    DeserializerNext::Element(name.local_name.to_owned())
-                }
-                _ => DeserializerNext::Skip,
-            };
-
-            match next_event {
-                DeserializerNext::Element(name) => match &name[..] {
-                    "DistributionList" => {
-                        obj.distribution_list = Some(try!(
-                            DistributionListDeserializer::deserialize("DistributionList", stack)
-                        ));
-                    }
-                    _ => skip_tree(stack),
-                },
-                DeserializerNext::Close => break,
-                DeserializerNext::Skip => {
-                    stack.next();
-                }
-            }
-        }
-
-        try!(end_element(tag_name, stack));
-
-        Ok(obj)
+        Ok(ListDistributionsByWebACLIdResult {
+            distribution_list: Some(try!(DistributionListDeserializer::deserialize(
+                "DistributionList",
+                stack
+            ))),
+            ..ListDistributionsByWebACLIdResult::default()
+        })
     }
 }
 /// <p>The request to list your distributions. </p>
@@ -4932,38 +4540,13 @@ impl ListDistributionsResultDeserializer {
         tag_name: &str,
         stack: &mut T,
     ) -> Result<ListDistributionsResult, XmlParseError> {
-        try!(start_element(tag_name, stack));
-
-        let mut obj = ListDistributionsResult::default();
-
-        loop {
-            let next_event = match stack.peek() {
-                Some(&Ok(XmlEvent::EndElement { ref name, .. })) => DeserializerNext::Close,
-                Some(&Ok(XmlEvent::StartElement { ref name, .. })) => {
-                    DeserializerNext::Element(name.local_name.to_owned())
-                }
-                _ => DeserializerNext::Skip,
-            };
-
-            match next_event {
-                DeserializerNext::Element(name) => match &name[..] {
-                    "DistributionList" => {
-                        obj.distribution_list = Some(try!(
-                            DistributionListDeserializer::deserialize("DistributionList", stack)
-                        ));
-                    }
-                    _ => skip_tree(stack),
-                },
-                DeserializerNext::Close => break,
-                DeserializerNext::Skip => {
-                    stack.next();
-                }
-            }
-        }
-
-        try!(end_element(tag_name, stack));
-
-        Ok(obj)
+        Ok(ListDistributionsResult {
+            distribution_list: Some(try!(DistributionListDeserializer::deserialize(
+                "DistributionList",
+                stack
+            ))),
+            ..ListDistributionsResult::default()
+        })
     }
 }
 /// <p>The request to list invalidations. </p>
@@ -4991,38 +4574,13 @@ impl ListInvalidationsResultDeserializer {
         tag_name: &str,
         stack: &mut T,
     ) -> Result<ListInvalidationsResult, XmlParseError> {
-        try!(start_element(tag_name, stack));
-
-        let mut obj = ListInvalidationsResult::default();
-
-        loop {
-            let next_event = match stack.peek() {
-                Some(&Ok(XmlEvent::EndElement { ref name, .. })) => DeserializerNext::Close,
-                Some(&Ok(XmlEvent::StartElement { ref name, .. })) => {
-                    DeserializerNext::Element(name.local_name.to_owned())
-                }
-                _ => DeserializerNext::Skip,
-            };
-
-            match next_event {
-                DeserializerNext::Element(name) => match &name[..] {
-                    "InvalidationList" => {
-                        obj.invalidation_list = Some(try!(
-                            InvalidationListDeserializer::deserialize("InvalidationList", stack)
-                        ));
-                    }
-                    _ => skip_tree(stack),
-                },
-                DeserializerNext::Close => break,
-                DeserializerNext::Skip => {
-                    stack.next();
-                }
-            }
-        }
-
-        try!(end_element(tag_name, stack));
-
-        Ok(obj)
+        Ok(ListInvalidationsResult {
+            invalidation_list: Some(try!(InvalidationListDeserializer::deserialize(
+                "InvalidationList",
+                stack
+            ))),
+            ..ListInvalidationsResult::default()
+        })
     }
 }
 /// <p>The request to list your streaming distributions. </p>
@@ -5048,40 +4606,15 @@ impl ListStreamingDistributionsResultDeserializer {
         tag_name: &str,
         stack: &mut T,
     ) -> Result<ListStreamingDistributionsResult, XmlParseError> {
-        try!(start_element(tag_name, stack));
-
-        let mut obj = ListStreamingDistributionsResult::default();
-
-        loop {
-            let next_event = match stack.peek() {
-                Some(&Ok(XmlEvent::EndElement { ref name, .. })) => DeserializerNext::Close,
-                Some(&Ok(XmlEvent::StartElement { ref name, .. })) => {
-                    DeserializerNext::Element(name.local_name.to_owned())
-                }
-                _ => DeserializerNext::Skip,
-            };
-
-            match next_event {
-                DeserializerNext::Element(name) => match &name[..] {
-                    "StreamingDistributionList" => {
-                        obj.streaming_distribution_list =
-                            Some(try!(StreamingDistributionListDeserializer::deserialize(
-                                "StreamingDistributionList",
-                                stack
-                            )));
-                    }
-                    _ => skip_tree(stack),
-                },
-                DeserializerNext::Close => break,
-                DeserializerNext::Skip => {
-                    stack.next();
-                }
-            }
-        }
-
-        try!(end_element(tag_name, stack));
-
-        Ok(obj)
+        Ok(ListStreamingDistributionsResult {
+            streaming_distribution_list: Some(try!(
+                StreamingDistributionListDeserializer::deserialize(
+                    "StreamingDistributionList",
+                    stack
+                )
+            )),
+            ..ListStreamingDistributionsResult::default()
+        })
     }
 }
 /// <p> The request to list tags for a CloudFront resource.</p>
@@ -5105,36 +4638,10 @@ impl ListTagsForResourceResultDeserializer {
         tag_name: &str,
         stack: &mut T,
     ) -> Result<ListTagsForResourceResult, XmlParseError> {
-        try!(start_element(tag_name, stack));
-
-        let mut obj = ListTagsForResourceResult::default();
-
-        loop {
-            let next_event = match stack.peek() {
-                Some(&Ok(XmlEvent::EndElement { ref name, .. })) => DeserializerNext::Close,
-                Some(&Ok(XmlEvent::StartElement { ref name, .. })) => {
-                    DeserializerNext::Element(name.local_name.to_owned())
-                }
-                _ => DeserializerNext::Skip,
-            };
-
-            match next_event {
-                DeserializerNext::Element(name) => match &name[..] {
-                    "Tags" => {
-                        obj.tags = try!(TagsDeserializer::deserialize("Tags", stack));
-                    }
-                    _ => skip_tree(stack),
-                },
-                DeserializerNext::Close => break,
-                DeserializerNext::Skip => {
-                    stack.next();
-                }
-            }
-        }
-
-        try!(end_element(tag_name, stack));
-
-        Ok(obj)
+        Ok(ListTagsForResourceResult {
+            tags: try!(TagsDeserializer::deserialize("Tags", stack)),
+            ..ListTagsForResourceResult::default()
+        })
     }
 }
 struct LocationListDeserializer;
@@ -7912,41 +7419,15 @@ impl UpdateCloudFrontOriginAccessIdentityResultDeserializer {
         tag_name: &str,
         stack: &mut T,
     ) -> Result<UpdateCloudFrontOriginAccessIdentityResult, XmlParseError> {
-        try!(start_element(tag_name, stack));
-
-        let mut obj = UpdateCloudFrontOriginAccessIdentityResult::default();
-
-        loop {
-            let next_event = match stack.peek() {
-                Some(&Ok(XmlEvent::EndElement { ref name, .. })) => DeserializerNext::Close,
-                Some(&Ok(XmlEvent::StartElement { ref name, .. })) => {
-                    DeserializerNext::Element(name.local_name.to_owned())
-                }
-                _ => DeserializerNext::Skip,
-            };
-
-            match next_event {
-                DeserializerNext::Element(name) => match &name[..] {
-                    "CloudFrontOriginAccessIdentity" => {
-                        obj.cloud_front_origin_access_identity = Some(try!(
-                            CloudFrontOriginAccessIdentityDeserializer::deserialize(
-                                "CloudFrontOriginAccessIdentity",
-                                stack
-                            )
-                        ));
-                    }
-                    _ => skip_tree(stack),
-                },
-                DeserializerNext::Close => break,
-                DeserializerNext::Skip => {
-                    stack.next();
-                }
-            }
-        }
-
-        try!(end_element(tag_name, stack));
-
-        Ok(obj)
+        Ok(UpdateCloudFrontOriginAccessIdentityResult {
+            cloud_front_origin_access_identity: Some(try!(
+                CloudFrontOriginAccessIdentityDeserializer::deserialize(
+                    "CloudFrontOriginAccessIdentity",
+                    stack
+                )
+            )),
+            ..UpdateCloudFrontOriginAccessIdentityResult::default()
+        })
     }
 }
 /// <p>The request to update a distribution.</p>
@@ -7976,39 +7457,13 @@ impl UpdateDistributionResultDeserializer {
         tag_name: &str,
         stack: &mut T,
     ) -> Result<UpdateDistributionResult, XmlParseError> {
-        try!(start_element(tag_name, stack));
-
-        let mut obj = UpdateDistributionResult::default();
-
-        loop {
-            let next_event = match stack.peek() {
-                Some(&Ok(XmlEvent::EndElement { ref name, .. })) => DeserializerNext::Close,
-                Some(&Ok(XmlEvent::StartElement { ref name, .. })) => {
-                    DeserializerNext::Element(name.local_name.to_owned())
-                }
-                _ => DeserializerNext::Skip,
-            };
-
-            match next_event {
-                DeserializerNext::Element(name) => match &name[..] {
-                    "Distribution" => {
-                        obj.distribution = Some(try!(DistributionDeserializer::deserialize(
-                            "Distribution",
-                            stack
-                        )));
-                    }
-                    _ => skip_tree(stack),
-                },
-                DeserializerNext::Close => break,
-                DeserializerNext::Skip => {
-                    stack.next();
-                }
-            }
-        }
-
-        try!(end_element(tag_name, stack));
-
-        Ok(obj)
+        Ok(UpdateDistributionResult {
+            distribution: Some(try!(DistributionDeserializer::deserialize(
+                "Distribution",
+                stack
+            ))),
+            ..UpdateDistributionResult::default()
+        })
     }
 }
 /// <p>The request to update a streaming distribution.</p>
@@ -8038,40 +7493,13 @@ impl UpdateStreamingDistributionResultDeserializer {
         tag_name: &str,
         stack: &mut T,
     ) -> Result<UpdateStreamingDistributionResult, XmlParseError> {
-        try!(start_element(tag_name, stack));
-
-        let mut obj = UpdateStreamingDistributionResult::default();
-
-        loop {
-            let next_event = match stack.peek() {
-                Some(&Ok(XmlEvent::EndElement { ref name, .. })) => DeserializerNext::Close,
-                Some(&Ok(XmlEvent::StartElement { ref name, .. })) => {
-                    DeserializerNext::Element(name.local_name.to_owned())
-                }
-                _ => DeserializerNext::Skip,
-            };
-
-            match next_event {
-                DeserializerNext::Element(name) => match &name[..] {
-                    "StreamingDistribution" => {
-                        obj.streaming_distribution =
-                            Some(try!(StreamingDistributionDeserializer::deserialize(
-                                "StreamingDistribution",
-                                stack
-                            )));
-                    }
-                    _ => skip_tree(stack),
-                },
-                DeserializerNext::Close => break,
-                DeserializerNext::Skip => {
-                    stack.next();
-                }
-            }
-        }
-
-        try!(end_element(tag_name, stack));
-
-        Ok(obj)
+        Ok(UpdateStreamingDistributionResult {
+            streaming_distribution: Some(try!(StreamingDistributionDeserializer::deserialize(
+                "StreamingDistribution",
+                stack
+            ))),
+            ..UpdateStreamingDistributionResult::default()
+        })
     }
 }
 /// <p>A complex type that specifies the following:</p> <ul> <li> <p>Whether you want viewers to use HTTP or HTTPS to request your objects.</p> </li> <li> <p>If you want viewers to use HTTPS, whether you're using an alternate domain name such as <code>example.com</code> or the CloudFront domain name for your distribution, such as <code>d111111abcdef8.cloudfront.net</code>.</p> </li> <li> <p>If you're using an alternate domain name, whether AWS Certificate Manager (ACM) provided the certificate, or you purchased a certificate from a third-party certificate authority and imported it into ACM or uploaded it to the IAM certificate store.</p> </li> </ul> <p>You must specify only one of the following values: </p> <ul> <li> <p> <a>ViewerCertificate$ACMCertificateArn</a> </p> </li> <li> <p> <a>ViewerCertificate$IAMCertificateId</a> </p> </li> <li> <p> <a>ViewerCertificate$CloudFrontDefaultCertificate</a> </p> </li> </ul> <p>Don't specify <code>false</code> for <code>CloudFrontDefaultCertificate</code>.</p> <p> <b>If you want viewers to use HTTP instead of HTTPS to request your objects</b>: Specify the following value:</p> <p> <code>&lt;CloudFrontDefaultCertificate&gt;true&lt;CloudFrontDefaultCertificate&gt;</code> </p> <p>In addition, specify <code>allow-all</code> for <code>ViewerProtocolPolicy</code> for all of your cache behaviors.</p> <p> <b>If you want viewers to use HTTPS to request your objects</b>: Choose the type of certificate that you want to use based on whether you're using an alternate domain name for your objects or the CloudFront domain name:</p> <ul> <li> <p> <b>If you're using an alternate domain name, such as example.com</b>: Specify one of the following values, depending on whether ACM provided your certificate or you purchased your certificate from third-party certificate authority:</p> <ul> <li> <p> <code>&lt;ACMCertificateArn&gt;<i>ARN for ACM SSL/TLS certificate</i>&lt;ACMCertificateArn&gt;</code> where <code> <i>ARN for ACM SSL/TLS certificate</i> </code> is the ARN for the ACM SSL/TLS certificate that you want to use for this distribution.</p> </li> <li> <p> <code>&lt;IAMCertificateId&gt;<i>IAM certificate ID</i>&lt;IAMCertificateId&gt;</code> where <code> <i>IAM certificate ID</i> </code> is the ID that IAM returned when you added the certificate to the IAM certificate store.</p> </li> </ul> <p>If you specify <code>ACMCertificateArn</code> or <code>IAMCertificateId</code>, you must also specify a value for <code>SSLSupportMethod</code>.</p> <p>If you choose to use an ACM certificate or a certificate in the IAM certificate store, we recommend that you use only an alternate domain name in your object URLs (<code>https://example.com/logo.jpg</code>). If you use the domain name that is associated with your CloudFront distribution (such as <code>https://d111111abcdef8.cloudfront.net/logo.jpg</code>) and the viewer supports <code>SNI</code>, then CloudFront behaves normally. However, if the browser does not support SNI, the user's experience depends on the value that you choose for <code>SSLSupportMethod</code>:</p> <ul> <li> <p> <code>vip</code>: The viewer displays a warning because there is a mismatch between the CloudFront domain name and the domain name in your SSL/TLS certificate.</p> </li> <li> <p> <code>sni-only</code>: CloudFront drops the connection with the browser without returning the object.</p> </li> </ul> </li> <li> <p> <b>If you're using the CloudFront domain name for your distribution, such as <code>d111111abcdef8.cloudfront.net</code> </b>: Specify the following value:</p> <p> <code>&lt;CloudFrontDefaultCertificate&gt;true&lt;CloudFrontDefaultCertificate&gt; </code> </p> </li> </ul> <p>If you want viewers to use HTTPS, you must also specify one of the following values in your cache behaviors:</p> <ul> <li> <p> <code> &lt;ViewerProtocolPolicy&gt;https-only&lt;ViewerProtocolPolicy&gt;</code> </p> </li> <li> <p> <code>&lt;ViewerProtocolPolicy&gt;redirect-to-https&lt;ViewerProtocolPolicy&gt;</code> </p> </li> </ul> <p>You can also optionally require that CloudFront use HTTPS to communicate with your origin by specifying one of the following values for the applicable origins:</p> <ul> <li> <p> <code>&lt;OriginProtocolPolicy&gt;https-only&lt;OriginProtocolPolicy&gt; </code> </p> </li> <li> <p> <code>&lt;OriginProtocolPolicy&gt;match-viewer&lt;OriginProtocolPolicy&gt; </code> </p> </li> </ul> <p>For more information, see <a href="http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/SecureConnections.html#CNAMEsAndHTTPS">Using Alternate Domain Names and HTTPS</a> in the <i>Amazon CloudFront Developer Guide</i>.</p>
diff --git a/rusoto/services/s3/src/generated.rs b/rusoto/services/s3/src/generated.rs
index 5b91519fdd0..519010c8e41 100644
--- a/rusoto/services/s3/src/generated.rs
+++ b/rusoto/services/s3/src/generated.rs
@@ -2511,38 +2511,13 @@ impl CopyObjectOutputDeserializer {
         tag_name: &str,
         stack: &mut T,
     ) -> Result<CopyObjectOutput, XmlParseError> {
-        try!(start_element(tag_name, stack));
-
-        let mut obj = CopyObjectOutput::default();
-
-        loop {
-            let next_event = match stack.peek() {
-                Some(&Ok(XmlEvent::EndElement { ref name, .. })) => DeserializerNext::Close,
-                Some(&Ok(XmlEvent::StartElement { ref name, .. })) => {
-                    DeserializerNext::Element(name.local_name.to_owned())
-                }
-                _ => DeserializerNext::Skip,
-            };
-
-            match next_event {
-                DeserializerNext::Element(name) => match &name[..] {
-                    "CopyObjectResult" => {
-                        obj.copy_object_result = Some(try!(
-                            CopyObjectResultDeserializer::deserialize("CopyObjectResult", stack)
-                        ));
-                    }
-                    _ => skip_tree(stack),
-                },
-                DeserializerNext::Close => break,
-                DeserializerNext::Skip => {
-                    stack.next();
-                }
-            }
-        }
-
-        try!(end_element(tag_name, stack));
-
-        Ok(obj)
+        Ok(CopyObjectOutput {
+            copy_object_result: Some(try!(CopyObjectResultDeserializer::deserialize(
+                "CopyObjectResult",
+                stack
+            ))),
+            ..CopyObjectOutput::default()
+        })
     }
 }
 #[derive(Default, Debug, Clone, PartialEq)]
@@ -4779,40 +4754,13 @@ impl GetBucketAnalyticsConfigurationOutputDeserializer {
         tag_name: &str,
         stack: &mut T,
     ) -> Result<GetBucketAnalyticsConfigurationOutput, XmlParseError> {
-        try!(start_element(tag_name, stack));
-
-        let mut obj = GetBucketAnalyticsConfigurationOutput::default();
-
-        loop {
-            let next_event = match stack.peek() {
-                Some(&Ok(XmlEvent::EndElement { ref name, .. })) => DeserializerNext::Close,
-                Some(&Ok(XmlEvent::StartElement { ref name, .. })) => {
-                    DeserializerNext::Element(name.local_name.to_owned())
-                }
-                _ => DeserializerNext::Skip,
-            };
-
-            match next_event {
-                DeserializerNext::Element(name) => match &name[..] {
-                    "AnalyticsConfiguration" => {
-                        obj.analytics_configuration =
-                            Some(try!(AnalyticsConfigurationDeserializer::deserialize(
-                                "AnalyticsConfiguration",
-                                stack
-                            )));
-                    }
-                    _ => skip_tree(stack),
-                },
-                DeserializerNext::Close => break,
-                DeserializerNext::Skip => {
-                    stack.next();
-                }
-            }
-        }
-
-        try!(end_element(tag_name, stack));
-
-        Ok(obj)
+        Ok(GetBucketAnalyticsConfigurationOutput {
+            analytics_configuration: Some(try!(AnalyticsConfigurationDeserializer::deserialize(
+                "AnalyticsConfiguration",
+                stack
+            ))),
+            ..GetBucketAnalyticsConfigurationOutput::default()
+        })
     }
 }
 #[derive(Default, Debug, Clone, PartialEq)]
@@ -4894,41 +4842,15 @@ impl GetBucketEncryptionOutputDeserializer {
         tag_name: &str,
         stack: &mut T,
     ) -> Result<GetBucketEncryptionOutput, XmlParseError> {
-        try!(start_element(tag_name, stack));
-
-        let mut obj = GetBucketEncryptionOutput::default();
-
-        loop {
-            let next_event = match stack.peek() {
-                Some(&Ok(XmlEvent::EndElement { ref name, .. })) => DeserializerNext::Close,
-                Some(&Ok(XmlEvent::StartElement { ref name, .. })) => {
-                    DeserializerNext::Element(name.local_name.to_owned())
-                }
-                _ => DeserializerNext::Skip,
-            };
-
-            match next_event {
-                DeserializerNext::Element(name) => match &name[..] {
-                    "ServerSideEncryptionConfiguration" => {
-                        obj.server_side_encryption_configuration = Some(try!(
-                            ServerSideEncryptionConfigurationDeserializer::deserialize(
-                                "ServerSideEncryptionConfiguration",
-                                stack
-                            )
-                        ));
-                    }
-                    _ => skip_tree(stack),
-                },
-                DeserializerNext::Close => break,
-                DeserializerNext::Skip => {
-                    stack.next();
-                }
-            }
-        }
-
-        try!(end_element(tag_name, stack));
-
-        Ok(obj)
+        Ok(GetBucketEncryptionOutput {
+            server_side_encryption_configuration: Some(try!(
+                ServerSideEncryptionConfigurationDeserializer::deserialize(
+                    "ServerSideEncryptionConfiguration",
+                    stack
+                )
+            )),
+            ..GetBucketEncryptionOutput::default()
+        })
     }
 }
 #[derive(Default, Debug, Clone, PartialEq)]
@@ -4950,40 +4872,13 @@ impl GetBucketInventoryConfigurationOutputDeserializer {
         tag_name: &str,
         stack: &mut T,
     ) -> Result<GetBucketInventoryConfigurationOutput, XmlParseError> {
-        try!(start_element(tag_name, stack));
-
-        let mut obj = GetBucketInventoryConfigurationOutput::default();
-
-        loop {
-            let next_event = match stack.peek() {
-                Some(&Ok(XmlEvent::EndElement { ref name, .. })) => DeserializerNext::Close,
-                Some(&Ok(XmlEvent::StartElement { ref name, .. })) => {
-                    DeserializerNext::Element(name.local_name.to_owned())
-                }
-                _ => DeserializerNext::Skip,
-            };
-
-            match next_event {
-                DeserializerNext::Element(name) => match &name[..] {
-                    "InventoryConfiguration" => {
-                        obj.inventory_configuration =
-                            Some(try!(InventoryConfigurationDeserializer::deserialize(
-                                "InventoryConfiguration",
-                                stack
-                            )));
-                    }
-                    _ => skip_tree(stack),
-                },
-                DeserializerNext::Close => break,
-                DeserializerNext::Skip => {
-                    stack.next();
-                }
-            }
-        }
-
-        try!(end_element(tag_name, stack));
-
-        Ok(obj)
+        Ok(GetBucketInventoryConfigurationOutput {
+            inventory_configuration: Some(try!(InventoryConfigurationDeserializer::deserialize(
+                "InventoryConfiguration",
+                stack
+            ))),
+            ..GetBucketInventoryConfigurationOutput::default()
+        })
     }
 }
 #[derive(Default, Debug, Clone, PartialEq)]
@@ -5199,40 +5094,13 @@ impl GetBucketMetricsConfigurationOutputDeserializer {
         tag_name: &str,
         stack: &mut T,
     ) -> Result<GetBucketMetricsConfigurationOutput, XmlParseError> {
-        try!(start_element(tag_name, stack));
-
-        let mut obj = GetBucketMetricsConfigurationOutput::default();
-
-        loop {
-            let next_event = match stack.peek() {
-                Some(&Ok(XmlEvent::EndElement { ref name, .. })) => DeserializerNext::Close,
-                Some(&Ok(XmlEvent::StartElement { ref name, .. })) => {
-                    DeserializerNext::Element(name.local_name.to_owned())
-                }
-                _ => DeserializerNext::Skip,
-            };
-
-            match next_event {
-                DeserializerNext::Element(name) => match &name[..] {
-                    "MetricsConfiguration" => {
-                        obj.metrics_configuration =
-                            Some(try!(MetricsConfigurationDeserializer::deserialize(
-                                "MetricsConfiguration",
-                                stack
-                            )));
-                    }
-                    _ => skip_tree(stack),
-                },
-                DeserializerNext::Close => break,
-                DeserializerNext::Skip => {
-                    stack.next();
-                }
-            }
-        }
-
-        try!(end_element(tag_name, stack));
-
-        Ok(obj)
+        Ok(GetBucketMetricsConfigurationOutput {
+            metrics_configuration: Some(try!(MetricsConfigurationDeserializer::deserialize(
+                "MetricsConfiguration",
+                stack
+            ))),
+            ..GetBucketMetricsConfigurationOutput::default()
+        })
     }
 }
 #[derive(Default, Debug, Clone, PartialEq)]
@@ -5272,40 +5140,15 @@ impl GetBucketReplicationOutputDeserializer {
         tag_name: &str,
         stack: &mut T,
     ) -> Result<GetBucketReplicationOutput, XmlParseError> {
-        try!(start_element(tag_name, stack));
-
-        let mut obj = GetBucketReplicationOutput::default();
-
-        loop {
-            let next_event = match stack.peek() {
-                Some(&Ok(XmlEvent::EndElement { ref name, .. })) => DeserializerNext::Close,
-                Some(&Ok(XmlEvent::StartElement { ref name, .. })) => {
-                    DeserializerNext::Element(name.local_name.to_owned())
-                }
-                _ => DeserializerNext::Skip,
-            };
-
-            match next_event {
-                DeserializerNext::Element(name) => match &name[..] {
-                    "ReplicationConfiguration" => {
-                        obj.replication_configuration =
-                            Some(try!(ReplicationConfigurationDeserializer::deserialize(
-                                "ReplicationConfiguration",
-                                stack
-                            )));
-                    }
-                    _ => skip_tree(stack),
-                },
-                DeserializerNext::Close => break,
-                DeserializerNext::Skip => {
-                    stack.next();
-                }
-            }
-        }
-
-        try!(end_element(tag_name, stack));
-
-        Ok(obj)
+        Ok(GetBucketReplicationOutput {
+            replication_configuration: Some(try!(
+                ReplicationConfigurationDeserializer::deserialize(
+                    "ReplicationConfiguration",
+                    stack
+                )
+            )),
+            ..GetBucketReplicationOutput::default()
+        })
     }
 }
 #[derive(Default, Debug, Clone, PartialEq)]
@@ -14248,40 +14091,12 @@ impl SelectObjectContentOutputDeserializer {
         tag_name: &str,
         stack: &mut T,
     ) -> Result<SelectObjectContentOutput, XmlParseError> {
-        try!(start_element(tag_name, stack));
-
-        let mut obj = SelectObjectContentOutput::default();
-
-        loop {
-            let next_event = match stack.peek() {
-                Some(&Ok(XmlEvent::EndElement { ref name, .. })) => DeserializerNext::Close,
-                Some(&Ok(XmlEvent::StartElement { ref name, .. })) => {
-                    DeserializerNext::Element(name.local_name.to_owned())
-                }
-                _ => DeserializerNext::Skip,
-            };
-
-            match next_event {
-                DeserializerNext::Element(name) => match &name[..] {
-                    "Payload" => {
-                        obj.payload = Some(try!(
-                            SelectObjectContentEventStreamDeserializer::deserialize(
-                                "Payload", stack
-                            )
-                        ));
-                    }
-                    _ => skip_tree(stack),
-                },
-                DeserializerNext::Close => break,
-                DeserializerNext::Skip => {
-                    stack.next();
-                }
-            }
-        }
-
-        try!(end_element(tag_name, stack));
-
-        Ok(obj)
+        Ok(SelectObjectContentOutput {
+            payload: Some(try!(
+                SelectObjectContentEventStreamDeserializer::deserialize("Payload", stack)
+            )),
+            ..SelectObjectContentOutput::default()
+        })
     }
 }
 /// <p>Request to filter the contents of an Amazon S3 object based on a simple Structured Query Language (SQL) statement. In the request, along with the SQL expression, you must also specify a data serialization format (JSON or CSV) of the object. Amazon S3 uses this to parse object data into records, and returns only records that match the specified SQL expression. You must also specify the data serialization format for the response. For more information, go to <a href="http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectSELECTContent.html">S3Select API Documentation</a>.</p>
@@ -16311,39 +16126,13 @@ impl UploadPartCopyOutputDeserializer {
         tag_name: &str,
         stack: &mut T,
     ) -> Result<UploadPartCopyOutput, XmlParseError> {
-        try!(start_element(tag_name, stack));
-
-        let mut obj = UploadPartCopyOutput::default();
-
-        loop {
-            let next_event = match stack.peek() {
-                Some(&Ok(XmlEvent::EndElement { ref name, .. })) => DeserializerNext::Close,
-                Some(&Ok(XmlEvent::StartElement { ref name, .. })) => {
-                    DeserializerNext::Element(name.local_name.to_owned())
-                }
-                _ => DeserializerNext::Skip,
-            };
-
-            match next_event {
-                DeserializerNext::Element(name) => match &name[..] {
-                    "CopyPartResult" => {
-                        obj.copy_part_result = Some(try!(CopyPartResultDeserializer::deserialize(
-                            "CopyPartResult",
-                            stack
-                        )));
-                    }
-                    _ => skip_tree(stack),
-                },
-                DeserializerNext::Close => break,
-                DeserializerNext::Skip => {
-                    stack.next();
-                }
-            }
-        }
-
-        try!(end_element(tag_name, stack));
-
-        Ok(obj)
+        Ok(UploadPartCopyOutput {
+            copy_part_result: Some(try!(CopyPartResultDeserializer::deserialize(
+                "CopyPartResult",
+                stack
+            ))),
+            ..UploadPartCopyOutput::default()
+        })
     }
 }
 #[derive(Default, Debug, Clone, PartialEq)]
diff --git a/service_crategen/src/commands/generate/codegen/xml_payload_parser.rs b/service_crategen/src/commands/generate/codegen/xml_payload_parser.rs
index 69825dfb96c..5a26acaf795 100644
--- a/service_crategen/src/commands/generate/codegen/xml_payload_parser.rs
+++ b/service_crategen/src/commands/generate/codegen/xml_payload_parser.rs
@@ -346,6 +346,38 @@ fn generate_primitive_deserializer(shape: &Shape) -> String {
 }
 
 fn generate_struct_deserializer(name: &str, service: &Service, shape: &Shape) -> String {
+    // Handling of payload delegate deserialization - this is needed for shapes which
+    // have a payload representing a single member. An example of this is the member
+    // CopyPartResult of the S3 UploadPartCopyOutput shape; the XML itself represents
+    // the member field, so this is just a pass through to the parser for the member.
+    if let Some(ref payload_member_name) = shape.payload {
+        let payload_member = shape.members
+            .as_ref()
+            .expect("failed to get output shape members")
+            .get(payload_member_name)
+            .expect("failed to get payload member");
+
+        let mut deserialize = format!("try!({payload_shape}Deserializer::deserialize(\"{payload_member_name}\", stack))",
+                                      payload_member_name = payload_member_name,
+                                      payload_shape = payload_member.shape);
+
+        if !shape.required(payload_member_name) {
+            deserialize = format!("Some({deserialize})", deserialize = deserialize);
+        };
+
+        return format!(
+            "
+            Ok({name} {{
+                {member}: {deserialize},
+                ..{name}::default()
+            }})
+            ",
+            name = name,
+            member = payload_member_name.to_snake_case(),
+            deserialize = deserialize
+        );
+    }
+
     let mut needs_xml_deserializer = false;
 
     // don't generate an xml deserializer if we don't need to


Test patch:
diff --git a/integration_tests/docker_test_run.py b/integration_tests/docker_test_run.py
index 39985522d3f..272615f1c0d 100755
--- a/integration_tests/docker_test_run.py
+++ b/integration_tests/docker_test_run.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python3
+#!/usr/bin/env python3
 import argparse
 import time
 import requests
diff --git a/integration_tests/tests/s3.rs b/integration_tests/tests/s3.rs
index aa417c699d7..a9519e9616a 100644
--- a/integration_tests/tests/s3.rs
+++ b/integration_tests/tests/s3.rs
@@ -25,7 +25,8 @@ use rusoto_s3::{S3, S3Client, HeadObjectRequest, CopyObjectRequest, GetObjectErr
                  PutObjectRequest, DeleteObjectRequest, PutBucketCorsRequest, CORSConfiguration,
                  CORSRule, CreateBucketRequest, DeleteBucketRequest, CreateMultipartUploadRequest,
                  UploadPartRequest, CompleteMultipartUploadRequest, CompletedMultipartUpload,
-                 CompletedPart, ListObjectsRequest, ListObjectsV2Request, StreamingBody, DeleteBucketError};
+                 CompletedPart, ListObjectsRequest, ListObjectsV2Request, StreamingBody, DeleteBucketError,
+                 UploadPartCopyRequest};
 
 type TestClient = S3Client;
 
@@ -227,6 +228,61 @@ fn test_multipart_upload(client: &TestClient, bucket: &str, filename: &str) {
     let response = client.complete_multipart_upload(complete_req).sync().expect("Couldn't complete multipart upload");
     println!("{:#?}", response);
 
+    // Add copy upload part to this test
+    // https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadUploadPartCopy.html
+    let create_multipart_req2 = CreateMultipartUploadRequest {
+        bucket: bucket.to_owned(),
+        key: filename.to_owned(),
+        ..Default::default()
+    };
+    let upload_multi_response = client.create_multipart_upload(create_multipart_req2).sync().expect("Couldn't create multipart upload2");
+    println!("{:#?}", upload_multi_response);
+    let upload_id2 = upload_multi_response.upload_id.unwrap();
+    let upload_part_copy_req = UploadPartCopyRequest {
+        key: filename.to_owned(),
+        bucket: bucket.to_owned(),
+        part_number: 1,
+        upload_id: upload_id2.clone(),
+        copy_source: format!("{}/{}", bucket, filename).to_owned(),
+        ..Default::default()
+    };
+    let copy_response = client.upload_part_copy(upload_part_copy_req).sync().expect("Should have had copy part work");
+    println!("copy response: {:#?}", copy_response);
+
+    let upload_part_copy_req2 = UploadPartCopyRequest {
+        key: filename.to_owned(),
+        bucket: bucket.to_owned(),
+        part_number: 2,
+        upload_id: upload_id2.clone(),
+        copy_source: format!("{}/{}", bucket, filename).to_owned(),
+        ..Default::default()
+    };
+    let copy_response2 = client.upload_part_copy(upload_part_copy_req2).sync().expect("Should have had copy part work");
+    println!("copy response2: {:#?}", copy_response2);
+
+    // complete the upload_part_copy upload:
+    let completed_parts_2 = vec!(
+        CompletedPart {
+            e_tag: copy_response.copy_part_result.unwrap().e_tag.clone(),
+            part_number: Some(1),
+        },
+        CompletedPart {
+            e_tag: copy_response2.copy_part_result.unwrap().e_tag.clone(),
+            part_number: Some(2),
+        }
+    );
+    let completed_upload2 = CompletedMultipartUpload { parts: Some(completed_parts_2) };
+    let complete_req2 = CompleteMultipartUploadRequest {
+        bucket: bucket.to_owned(),
+        key: filename.to_owned(),
+        upload_id: upload_id2.to_owned(),
+        multipart_upload: Some(completed_upload2),
+        ..Default::default()
+    };
+
+    let response2 = client.complete_multipart_upload(complete_req2).sync().expect("Couldn't complete multipart upload2");
+    println!("{:#?}", response2);
+
     // delete the completed file
     test_delete_object(client, bucket, filename);
 }
diff --git a/rusoto/services/s3/src/custom/custom_tests.rs b/rusoto/services/s3/src/custom/custom_tests.rs
index eb34bd87666..27f44a81a5d 100644
--- a/rusoto/services/s3/src/custom/custom_tests.rs
+++ b/rusoto/services/s3/src/custom/custom_tests.rs
@@ -7,6 +7,32 @@ use rusoto_core::Region;
 use rusoto_core::signature::SignedRequest;
 use self::rusoto_mock::*;
 
+#[test]
+fn test_multipart_upload_copy_response() {
+    let mock = MockRequestDispatcher::with_status(200).with_body(
+        r#"<?xml version="1.0" encoding="UTF-8"?>
+            <CopyPartResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
+                <LastModified>2018-11-10T02:47:18.000Z</LastModified>
+                <ETag>&quot;9a9d1bbe80188883302bff764b4cb321&quot;</ETag>
+            </CopyPartResult>"#,
+    );
+    let client = S3Client::new_with(mock, MockCredentialsProvider, Region::UsEast1);
+    let upload_part_copy_req = UploadPartCopyRequest {
+        key: "multipartfilename".to_string(),
+        bucket: "fakebucket".to_owned(),
+        part_number: 2,
+        upload_id: "fake".to_string(),
+        copy_source: "fakebuket/fake".to_string(),
+        ..Default::default()
+    };
+    let result = client
+        .upload_part_copy(upload_part_copy_req)
+        .sync()
+        .unwrap();
+    assert!(result.copy_part_result.is_some(), "Should have result in etag field");
+    assert_eq!(result.copy_part_result.unwrap().e_tag.unwrap(), "\"9a9d1bbe80188883302bff764b4cb321\"");
+}
+
 #[test]
 fn test_list_object_versions_with_multiple_versions() {
     let mock = MockRequestDispatcher::with_status(200).with_body(
@@ -23,7 +49,7 @@ fn test_list_object_versions_with_multiple_versions() {
         </ListVersionsResult>
         "#,
     );
-     let client = S3Client::new_with(mock, MockCredentialsProvider, Region::UsEast1);
+    let client = S3Client::new_with(mock, MockCredentialsProvider, Region::UsEast1);
     let result = client
         .list_object_versions(ListObjectVersionsRequest {
             bucket: "test_bucket".to_string(),
@@ -62,7 +88,7 @@ fn initiate_multipart_upload_happy_path() {
 fn complete_multipart_upload_happy_path() {
     let body = MockResponseReader::read_response("test_resources/custom", "s3_complete_multipart_upload.xml");
     let mock = MockRequestDispatcher::with_status(200).with_body(&body);
-    
+
     let client = S3Client::new_with(mock, MockCredentialsProvider, Region::UsEast1);
     let result = client.complete_multipart_upload(CompleteMultipartUploadRequest {
         bucket: "example-bucket".to_owned(),
@@ -85,7 +111,7 @@ fn complete_multipart_upload_happy_path() {
 fn list_multipart_upload_happy_path() {
     let body = MockResponseReader::read_response("test_resources/custom", "s3_list_multipart_uploads.xml");
     let mock = MockRequestDispatcher::with_status(200).with_body(&body);
-    
+
     let client = S3Client::new_with(mock, MockCredentialsProvider, Region::UsEast1);
     let result = client.list_multipart_uploads(ListMultipartUploadsRequest {
         bucket: "example-bucket".to_owned(),
@@ -341,7 +367,7 @@ fn should_serialize_complicated_request() {
 fn should_parse_location_constraint() {
     let body = MockResponseReader::read_response("test_resources/generated/valid", "s3-get-bucket-location.xml");
     let mock = MockRequestDispatcher::with_status(200).with_body(&body);
-    
+
     let client = S3Client::new_with(mock, MockCredentialsProvider, Region::UsEast1);
     let result = client.get_bucket_location(GetBucketLocationRequest {
         bucket: "example-bucket".to_owned()