Repository: rusoto/rusoto (language: rust)

Issue:
Generated Cargo.toml files should link to their API docs
Right now all our generated service crates link back to the `rusoto_core` API docs. Let's change that so each crate points to its API docs.

Example:
https://github.com/rusoto/rusoto/blob/master/rusoto/services/ec2/Cargo.toml#L4 should point to https://rusoto.github.io/rusoto/rusoto_ec2/ .


Discussion / hints:

Fix patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5cbac80a637..20c8581fa5b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,11 @@
 (Please put an entry here in each PR)
 
 - Use ```$AWS_PROFILE``` to obtain default profile name 
+- Implement `Default` for `Region`
+- Derive Clone for remaining types (affects CloudFront, Route 53 and S3)
+- Link to service-specific documentation in generated Cargo manifests
+- Change credential expiration for non-temporary crendentials to be optional and add support for ```AWS_CREDENTIAL_EXPIRATION``` to EnvironmentProvider
+- Improve ContainerProvider to mimik the behavior of the other SDKs by also considering ```AWS_CONTAINER_AUTHORIZATION_TOKEN``` and ```AWS_CONTAINER_CREDENTIALS_FULL_URI```
 
 ## [0.31.0] - 2018-01-21
 
diff --git a/README.md b/README.md
index 5e1f571320d..410154ba868 100644
--- a/README.md
+++ b/README.md
@@ -53,11 +53,9 @@ rusoto_sqs = "0.31.0"
 rusoto_s3 = "0.31.0"
 ```
 
-## Migrating from Rusoto 0.24.0 to 0.25.0 or later
+## Migration notes
 
-As of Rusoto 0.25.0, the `rusoto` crate is deprecated.  This decision was made because the single crate implementing all AWS services was too large to compile, especially on TravisCI and Appveyor.  The new main crate is `rusoto_core` and all services now have their own crate.
-
-See the [Rusoto 0.25.0 release notes](https://github.com/rusoto/rusoto/releases/tag/rusoto-v0.25.0) for more information including how to migrate from Rusoto 0.24.0 to Rusoto 0.25.0.
+Breaking changes and migration details are documented at [https://rusoto.org/migrations.html](https://rusoto.org/migrations.html).
 
 ## Usage
 
diff --git a/clippy.toml b/clippy.toml
index 360f572b9d5..763512561be 100644
--- a/clippy.toml
+++ b/clippy.toml
@@ -9,5 +9,7 @@ doc-valid-idents = [
     "IoT",
     "MapReduce",
     "OpsWorks",
-    "WorkSpaces"
+    "WorkSpaces",
+    "OpenID",
+    "OAuth"
 ]
diff --git a/mock/src/lib.rs b/mock/src/lib.rs
index 29c184eab91..b41643dfc0a 100644
--- a/mock/src/lib.rs
+++ b/mock/src/lib.rs
@@ -12,13 +12,10 @@ use std::collections::HashMap;
 use rusoto_core::{DispatchSignedRequest, HttpResponse, HttpDispatchError, SignedRequest};
 use rusoto_core::credential::{ProvideAwsCredentials, CredentialsError, AwsCredentials};
 use rusoto_core::request::Headers;
-use chrono::{Duration, Utc};
 use futures::future::{FutureResult, ok};
 use futures::stream::once;
 use hyper::StatusCode;
 
-const ONE_DAY: i64 = 86400;
-
 pub struct MockCredentialsProvider;
 
 impl ProvideAwsCredentials for MockCredentialsProvider {
@@ -28,7 +25,7 @@ impl ProvideAwsCredentials for MockCredentialsProvider {
         ok(AwsCredentials::new("mock_key",
                                "mock_secret",
                                None,
-                               Utc::now() + Duration::seconds(ONE_DAY)))
+                               None))
     }
 }
 
diff --git a/rusoto/core/README.md b/rusoto/core/README.md
index 98cfb5464f5..7a117989773 100644
--- a/rusoto/core/README.md
+++ b/rusoto/core/README.md
@@ -49,11 +49,9 @@ rusoto_sqs = "0.31.0"
 rusoto_s3 = "0.31.0"
 ```
 
-## Migrating from Rusoto 0.24.0 to 0.25.0 or later
+## Migration notes
 
-As of Rusoto 0.25.0, the `rusoto` crate is deprecated.  This decision was made because the single crate implementing all AWS services was too large to compile, especially on TravisCI and Appveyor.  The new main crate is `rusoto_core` and all services now have their own crate.
-
-See the [Rusoto 0.25.0 release notes](https://github.com/rusoto/rusoto/releases/tag/rusoto-v0.25.0) for more information including how to migrate from Rusoto 0.24.0 to Rusoto 0.25.0.
+Breaking changes and migration details are documented at [https://rusoto.org/migrations.html](https://rusoto.org/migrations.html).
 
 ## Usage
 
diff --git a/rusoto/core/src/lib.rs b/rusoto/core/src/lib.rs
index ded4bff6cd6..baa56db6100 100644
--- a/rusoto/core/src/lib.rs
+++ b/rusoto/core/src/lib.rs
@@ -52,7 +52,7 @@ pub use credential::{AwsCredentials, ChainProvider, ContainerProvider, Credentia
                      AutoRefreshingProviderSync, AutoRefreshingProvider,
                      BaseAutoRefreshingProvider};
 
-pub use region::{ParseRegionError, Region, default_region};
+pub use region::{ParseRegionError, Region};
 pub use request::{DispatchSignedRequest, HttpResponse, HttpDispatchError, TlsError, default_tls_client};
 pub use signature::SignedRequest;
 pub use future::RusotoFuture;
diff --git a/rusoto/core/src/region.rs b/rusoto/core/src/region.rs
index cdd8374837c..87f343d5c8e 100644
--- a/rusoto/core/src/region.rs
+++ b/rusoto/core/src/region.rs
@@ -13,6 +13,11 @@ use serde::ser::SerializeTuple;
 
 /// An AWS region.
 ///
+/// # Default
+///
+/// `Region` implements the `Default` trait. Calling `Region::default()` will attempt to read the
+/// `AWS_DEFAULT_REGION` environment variable. If it is not set or malformed, it will fall back to `Region::UsEast1`.
+///
 /// # AWS-compatible services
 ///
 /// `Region::Custom` can be used to connect to AWS-compatible services such as DynamoDB Local or Ceph.
@@ -249,18 +254,13 @@ impl Display for ParseRegionError {
     }
 }
 
-/// Get the region from `AWS_DEFAULT_REGION` environment variable.
-/// Uses us-east-1 if not set or value is malformed.
-pub fn default_region() -> Region {
-    match std::env::var("AWS_DEFAULT_REGION") {
-        Ok(v) => {
-            let slice : &str = &v;
-            match Region::from_str(slice) {
-                Ok(region) => region,
-                Err(_) => Region::UsEast1,
-            }
-        },
-        Err(_) => Region::UsEast1,
+impl Default for Region {
+    fn default() -> Region {
+        match std::env::var("AWS_DEFAULT_REGION") {
+            Ok(ref v) =>
+                Region::from_str(v).unwrap_or(Region::UsEast1),
+            Err(_) => Region::UsEast1,
+        }
     }
 }
 
diff --git a/rusoto/credential/src/claims.rs b/rusoto/credential/src/claims.rs
index e7407551e10..05bedfd78dd 100644
--- a/rusoto/credential/src/claims.rs
+++ b/rusoto/credential/src/claims.rs
@@ -1,6 +1,6 @@
 //! Credential Claims module.
 //!
-//! Contains constants used as keys into the [AwsCredentials](../struct.AwsCredentials.html) claims map
+//! Contains constants used as keys into the [`AwsCredentials`](../struct.AwsCredentials.html) claims map
 //! returned by the STS client's federated assume role APIs.
 
 /// Key used in the claims map for the `Subject` claim.
@@ -9,7 +9,7 @@
 /// For SAML this is the `NameID` element in the `Subject` element of the SAML assertion.
 /// For OpenID Connect this field contains the value returned by the identity provider
 /// as the token's `sub` claim.
-pub const SUBJECT: &'static str = "sub";
+pub const SUBJECT: &str = "sub";
 
 /// Key used in the claims map for the `Audience` claim.
 ///
@@ -18,7 +18,7 @@ pub const SUBJECT: &'static str = "sub";
 /// For OpenID Connect this field contains the value of the `aud` claim.
 /// For SAML this is the value of the `Recipient` attribute of the `SubjectConfirmationData`
 /// element of the SAML assertion.
-pub const AUDIENCE: &'static str = "aud";
+pub const AUDIENCE: &str = "aud";
 
 /// Key used in the claims map for the `Issuer` claim.
 ///
@@ -26,4 +26,4 @@ pub const AUDIENCE: &'static str = "aud";
 /// For OAuth 2.0 access tokens, this contains the value of the `ProviderId` parameter
 /// that was passed in the `AssumeRoleWithWebIdentity` request.
 /// For SAML this is the value of the Issuer element of the SAML assertion.
-pub const ISSUER: &'static str = "iss";
+pub const ISSUER: &str = "iss";
diff --git a/rusoto/credential/src/container.rs b/rusoto/credential/src/container.rs
index 8e4aeae4c19..909b021f5ac 100644
--- a/rusoto/credential/src/container.rs
+++ b/rusoto/credential/src/container.rs
@@ -1,19 +1,36 @@
 //! The Credentials provider to read from a task's IAM Role.
 
-use std::env::var as env_var;
-
+use std::error::Error;
 use futures::{Async, Future, Poll};
 use futures::future::err;
-use hyper::{Client, Uri};
+use hyper::{Client, Uri, Request, Method};
+use hyper::header::Authorization;
 use hyper::client::HttpConnector;
 use tokio_core::reactor::Handle;
 
 use {AwsCredentials, CredentialsError, ProvideAwsCredentials,
-     make_request, parse_credentials_from_aws_service};
+     make_request, parse_credentials_from_aws_service, non_empty_env_var};
 
-const AWS_CREDENTIALS_PROVIDER_IP: &'static str = "169.254.170.2";
+// The following constants are documented in AWS' ECS developers guide,
+// see https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html.
+const AWS_CREDENTIALS_PROVIDER_IP: &str = "169.254.170.2";
+const AWS_CONTAINER_CREDENTIALS_RELATIVE_URI: &str = "AWS_CONTAINER_CREDENTIALS_RELATIVE_URI";
+// I have not yet found any official documentation from AWS concerning the following two
+// environment variables, but they are used by the Java, Go, JavaScript and the Python SDKs.
+const AWS_CONTAINER_CREDENTIALS_FULL_URI: &str = "AWS_CONTAINER_CREDENTIALS_FULL_URI";
+const AWS_CONTAINER_AUTHORIZATION_TOKEN: &str = "AWS_CONTAINER_AUTHORIZATION_TOKEN";
 
 /// Provides AWS credentials from a task's IAM role.
+///
+/// As described in Amazon's
+/// [ECS developers guide](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html),
+/// Containers started as part of Tasks using IAM Roles for Tasks will be provided with a relative
+/// URL stored in the environment variable ```AWS_CONTAINER_CREDENTIALS_RELATIVE_URI```, which will
+/// be used to obtain the AWS credentials. If that environment variable is not set, rusoto will use
+/// the URL set in environment variable ```AWS_CONTAINER_CREDENTIALS_FULL_URI``` to obtain AWS
+/// credentials and will (optionally) also set the ```Authorization``` header to the value of
+/// environment variable ```AWS_CONTAINER_AUTHORIZATION_TOKEN```.
+///
 #[derive(Clone, Debug)]
 pub struct ContainerProvider {
     client: Client<HttpConnector>
@@ -57,20 +74,148 @@ impl ProvideAwsCredentials for ContainerProvider {
 
 /// Grabs the Credentials from the AWS Container Credentials Provider. (169.254.170.2).
 fn credentials_from_container(client: &Client<HttpConnector>) -> Result<Box<Future<Item=String, Error=CredentialsError>>, CredentialsError> {
-    let aws_container_credentials_relative_uri =
-        match env_var("AWS_CONTAINER_CREDENTIALS_RELATIVE_URI") {
-            Ok(v) => v,
-            Err(_) => {
-                return Err(CredentialsError::new(
-                    "No AWS_CONTAINER_CREDENTIALS_RELATIVE_URI in environment",
-                ))
-            }
-        };
-    let address: String = format!(
-        "http://{}{}",
-        AWS_CREDENTIALS_PROVIDER_IP,
-        aws_container_credentials_relative_uri
+    Ok(make_request(client, request_from_env_vars()?))
+}
+
+fn request_from_env_vars() -> Result<Request, CredentialsError> {
+    let relative_uri = non_empty_env_var(AWS_CONTAINER_CREDENTIALS_RELATIVE_URI).map(
+        |path| format!("http://{}{}", AWS_CREDENTIALS_PROVIDER_IP, path)
     );
-    let uri = try!(address.parse::<Uri>());
-    Ok(make_request(client, uri))
+    match relative_uri {
+        Some(ref uri) => new_request(uri, AWS_CONTAINER_CREDENTIALS_RELATIVE_URI),
+        None => match non_empty_env_var(AWS_CONTAINER_CREDENTIALS_FULL_URI) {
+            Some(ref uri) => {
+                let mut request = new_request(uri, AWS_CONTAINER_CREDENTIALS_FULL_URI)?;
+                let token = non_empty_env_var(AWS_CONTAINER_AUTHORIZATION_TOKEN);
+                token.map(|t| request.headers_mut().set(Authorization(t)));
+                Ok(request)
+            },
+            None => Err(CredentialsError::new(
+                format!("Neither environment variable '{}' nor '{}' is set", AWS_CONTAINER_CREDENTIALS_FULL_URI, AWS_CONTAINER_CREDENTIALS_RELATIVE_URI),
+            ))
+        }
+    }
+}
+
+fn new_request(uri: &str, env_var_name: &str) -> Result<Request, CredentialsError> {
+    uri.parse::<Uri>().map(
+            |uri| Request::new(Method::Get, uri)
+        ).or_else(|error| Err(
+             CredentialsError::new(
+                 format!("Error while parsing URI '{}' derived from environment variable '{}': {}",
+                         uri, env_var_name, error.description())
+             )
+        )
+    )
+}
+
+#[cfg(test)]
+mod tests {
+    use std::env;
+    use std::sync::{Mutex, MutexGuard};
+    use hyper::header::Authorization;
+    use hyper::header::Bearer;
+    use super::*;
+
+    // cargo runs tests in parallel, which leads to race conditions when changing
+    // environment variables. Therefore we use a global mutex for all tests which
+    // rely on environment variables.
+    lazy_static! {
+        static ref ENV_MUTEX: Mutex<()> = Mutex::new(());
+    }
+
+    // As failed (panic) tests will poisen the global mutex, we use a helper which
+    // recovers from poisoned mutex.
+    fn lock<'a, T>(mutex: &'a Mutex<T>) -> MutexGuard<'a, T> {
+        match mutex.lock() {
+            Ok(guard) => guard,
+            Err(poisoned) => poisoned.into_inner(),
+        }
+    }
+
+    #[test]
+    fn request_from_relative_uri() {
+        let path = "/xxx";
+        let _guard = lock(&ENV_MUTEX);
+        env::set_var(AWS_CONTAINER_CREDENTIALS_RELATIVE_URI, path);
+        env::set_var(AWS_CONTAINER_CREDENTIALS_FULL_URI, "dummy");
+        env::set_var(AWS_CONTAINER_AUTHORIZATION_TOKEN, "dummy");
+        let result = request_from_env_vars();
+        env::remove_var(AWS_CONTAINER_CREDENTIALS_RELATIVE_URI);
+        env::remove_var(AWS_CONTAINER_CREDENTIALS_FULL_URI);
+        env::remove_var(AWS_CONTAINER_AUTHORIZATION_TOKEN);
+        assert!(result.is_ok());
+        let request = result.ok().unwrap();
+        assert_eq!(request.uri().path(), path);
+        assert_eq!(request.headers().has::<Authorization<Bearer>>(), false);
+    }
+
+    #[test]
+    fn error_from_missing_env_vars() {
+        let _guard = lock(&ENV_MUTEX);
+        env::remove_var(AWS_CONTAINER_CREDENTIALS_RELATIVE_URI);
+        env::remove_var(AWS_CONTAINER_CREDENTIALS_FULL_URI);
+        let result = request_from_env_vars();
+        assert!(result.is_err());
+    }
+
+    #[test]
+    fn error_from_empty_env_vars() {
+        let _guard = lock(&ENV_MUTEX);
+        env::set_var(AWS_CONTAINER_CREDENTIALS_RELATIVE_URI, "");
+        env::set_var(AWS_CONTAINER_CREDENTIALS_FULL_URI, "");
+        env::set_var(AWS_CONTAINER_AUTHORIZATION_TOKEN, "");
+        let result = request_from_env_vars();
+        env::remove_var(AWS_CONTAINER_CREDENTIALS_RELATIVE_URI);
+        env::remove_var(AWS_CONTAINER_CREDENTIALS_FULL_URI);
+        env::remove_var(AWS_CONTAINER_AUTHORIZATION_TOKEN);
+        assert!(result.is_err());
+    }
+
+    #[test]
+    fn request_from_full_uri_with_token() {
+        let url = "http://localhost/xxx";
+        let _guard = lock(&ENV_MUTEX);
+        env::remove_var(AWS_CONTAINER_CREDENTIALS_RELATIVE_URI);
+        env::set_var(AWS_CONTAINER_CREDENTIALS_FULL_URI, url);
+        env::set_var(AWS_CONTAINER_AUTHORIZATION_TOKEN, "dummy");
+        let result = request_from_env_vars();
+        env::remove_var(AWS_CONTAINER_CREDENTIALS_FULL_URI);
+        env::remove_var(AWS_CONTAINER_AUTHORIZATION_TOKEN);
+        assert!(result.is_ok());
+        let request = result.ok().unwrap();
+        assert_eq!(request.uri().to_string(), url);
+        assert_eq!(request.headers().has::<Authorization<Bearer>>(), true);
+    }
+
+    #[test]
+    fn request_from_full_uri_without_token() {
+        let url = "http://localhost/xxx";
+        let _guard = lock(&ENV_MUTEX);
+        env::remove_var(AWS_CONTAINER_CREDENTIALS_RELATIVE_URI);
+        env::set_var(AWS_CONTAINER_CREDENTIALS_FULL_URI, url);
+        env::remove_var(AWS_CONTAINER_AUTHORIZATION_TOKEN);
+        let result = request_from_env_vars();
+        env::remove_var(AWS_CONTAINER_CREDENTIALS_FULL_URI);
+        assert!(result.is_ok());
+        let request = result.ok().unwrap();
+        assert_eq!(request.uri().to_string(), url);
+        assert_eq!(request.headers().has::<Authorization<Bearer>>(), false);
+    }
+
+    #[test]
+    fn request_from_full_uri_with_empty_token() {
+        let url = "http://localhost/xxx";
+        let _guard = lock(&ENV_MUTEX);
+        env::remove_var(AWS_CONTAINER_CREDENTIALS_RELATIVE_URI);
+        env::set_var(AWS_CONTAINER_CREDENTIALS_FULL_URI, url);
+        env::set_var(AWS_CONTAINER_AUTHORIZATION_TOKEN, "");
+        let result = request_from_env_vars();
+        env::remove_var(AWS_CONTAINER_CREDENTIALS_FULL_URI);
+        env::remove_var(AWS_CONTAINER_AUTHORIZATION_TOKEN);
+        assert!(result.is_ok());
+        let request = result.ok().unwrap();
+        assert_eq!(request.uri().to_string(), url);
+        assert_eq!(request.headers().has::<Authorization<Bearer>>(), false);
+    }
 }
diff --git a/rusoto/credential/src/environment.rs b/rusoto/credential/src/environment.rs
index ceff4263808..092a6989a61 100644
--- a/rusoto/credential/src/environment.rs
+++ b/rusoto/credential/src/environment.rs
@@ -1,11 +1,21 @@
 //! The Credentials Provider to read from Environment Variables.
 
-use std::env::var as env_var;
+use std::str::FromStr;
+use chrono::{Utc, DateTime};
 
 use futures::{Future, Poll};
 use futures::future::{FutureResult, result};
 
-use {AwsCredentials, CredentialsError, ProvideAwsCredentials, in_ten_minutes};
+use {AwsCredentials, CredentialsError, ProvideAwsCredentials, non_empty_env_var};
+
+const AWS_ACCESS_KEY_ID: &str = "AWS_ACCESS_KEY_ID";
+const AWS_SECRET_ACCESS_KEY: &str = "AWS_SECRET_ACCESS_KEY";
+const AWS_SESSION_TOKEN: &str = "AWS_SESSION_TOKEN";
+const AWS_CREDENTIAL_EXPIRATION: &str = "AWS_CREDENTIAL_EXPIRATION";
+
+const E_NO_ACCESS_KEY_ID: &str = "No (or empty) AWS_ACCESS_KEY_ID in environment";
+const E_NO_SECRET_ACCESS_KEY: &str = "No (or empty) AWS_SECRET_ACCESS_KEY in environment";
+const E_INVALID_EXPIRATION: &str = "Invalid AWS_CREDENTIAL_EXPIRATION in environment";
 
 /// Provides AWS credentials from environment variables.
 #[derive(Debug)]
@@ -36,35 +46,173 @@ impl ProvideAwsCredentials for EnvironmentProvider {
 
 /// Grabs the Credentials from the environment. These credentials are good for 10 minutes.
 fn credentials_from_environment() -> Result<AwsCredentials, CredentialsError> {
-    let env_key = match env_var("AWS_ACCESS_KEY_ID") {
-        Ok(val) => val,
-        Err(_) => return Err(CredentialsError::new("No AWS_ACCESS_KEY_ID in environment")),
+    let env_key = match non_empty_env_var(AWS_ACCESS_KEY_ID) {
+        Some(val) => val,
+        None => return Err(CredentialsError::new(E_NO_ACCESS_KEY_ID)),
     };
-    let env_secret = match env_var("AWS_SECRET_ACCESS_KEY") {
-        Ok(val) => val,
-        Err(_) => {
-            return Err(CredentialsError::new(
-                "No AWS_SECRET_ACCESS_KEY in environment",
-            ))
+    let env_secret = match non_empty_env_var(AWS_SECRET_ACCESS_KEY) {
+        Some(val) => val,
+        None => {
+            return Err(CredentialsError::new(E_NO_SECRET_ACCESS_KEY))
         }
     };
-
-    if env_key.is_empty() || env_secret.is_empty() {
-        return Err(CredentialsError::new(
-            "Couldn't find either AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY or both in environment.",
-        ));
-    }
-
     // Present when using temporary credentials, e.g. on Lambda with IAM roles
-    let token = match env_var("AWS_SESSION_TOKEN") {
-        Ok(val) => if val.is_empty() { None } else { Some(val) },
-        Err(_) => None,
+    let token = non_empty_env_var(AWS_SESSION_TOKEN);
+    // Mimik botocore's behavior, see https://github.com/boto/botocore/pull/1187.
+    let expires_at = match non_empty_env_var(AWS_CREDENTIAL_EXPIRATION) {
+        Some(val) => match DateTime::<Utc>::from_str(&val) {
+            Ok(e) => Some(e),
+            Err(e) => return Err(CredentialsError::new(format!("{} '{}': {}", E_INVALID_EXPIRATION, val, e)))
+        },
+        _ => None,
     };
-
     Ok(AwsCredentials::new(
         env_key,
         env_secret,
         token,
-        in_ten_minutes(),
+        expires_at,
     ))
 }
+
+#[cfg(test)]
+mod tests {
+    use std::env;
+    use std::sync::{Mutex, MutexGuard};
+    use chrono::Utc;
+    use super::*;
+
+    // cargo runs tests in parallel, which leads to race conditions when changing
+    // environment variables. Therefore we use a global mutex for all tests which
+    // rely on environment variables.
+    lazy_static! {
+        static ref ENV_MUTEX: Mutex<()> = Mutex::new(());
+    }
+
+    // As failed (panic) tests will poisen the global mutex, we use a helper which
+    // recovers from poisoned mutex.
+    fn lock<'a, T>(mutex: &'a Mutex<T>) -> MutexGuard<'a,T> {
+        match mutex.lock() {
+            Ok(guard) => guard,
+            Err(poisoned) => poisoned.into_inner(),
+        }
+    }
+
+    #[test]
+    fn get_temporary_credentials_from_env() {
+        let _guard = lock(&ENV_MUTEX);
+        env::set_var(AWS_ACCESS_KEY_ID, "id");
+        env::set_var(AWS_SECRET_ACCESS_KEY, "secret");
+        env::set_var(AWS_SESSION_TOKEN, "token");
+        let result = EnvironmentProvider.credentials().wait();
+        env::remove_var(AWS_ACCESS_KEY_ID);
+        env::remove_var(AWS_SECRET_ACCESS_KEY);
+        env::remove_var(AWS_SESSION_TOKEN);
+        assert!(result.is_ok());
+        let creds = result.ok().unwrap();
+        assert_eq!(creds.aws_access_key_id(), "id");
+        assert_eq!(creds.aws_secret_access_key(), "secret");
+        assert_eq!(creds.token(), &Some("token".to_string()));
+    }
+
+    #[test]
+    fn get_non_temporary_credentials_from_env() {
+        let _guard = lock(&ENV_MUTEX);
+        env::set_var(AWS_ACCESS_KEY_ID, "id");
+        env::set_var(AWS_SECRET_ACCESS_KEY, "secret");
+        env::remove_var(AWS_SESSION_TOKEN);
+        let result = EnvironmentProvider.credentials().wait();
+        env::remove_var(AWS_ACCESS_KEY_ID);
+        env::remove_var(AWS_SECRET_ACCESS_KEY);
+        assert!(result.is_ok());
+        let creds = result.ok().unwrap();
+        assert_eq!(creds.aws_access_key_id(), "id");
+        assert_eq!(creds.aws_secret_access_key(), "secret");
+        assert_eq!(creds.token(), &None);
+    }
+
+    #[test]
+    fn environment_provider_missing_key_id() {
+        let _guard = lock(&ENV_MUTEX);
+        env::remove_var(AWS_ACCESS_KEY_ID);
+        env::set_var(AWS_SECRET_ACCESS_KEY, "secret");
+        env::remove_var(AWS_SESSION_TOKEN);
+        let result = EnvironmentProvider.credentials().wait();
+        env::remove_var(AWS_SECRET_ACCESS_KEY);
+        assert!(result.is_err());
+        assert_eq!(
+            result.err(),
+            Some(CredentialsError::new(E_NO_ACCESS_KEY_ID))
+        );
+    }
+
+    #[test]
+    fn environment_provider_missing_secret() {
+        let _guard = lock(&ENV_MUTEX);
+        env::remove_var(AWS_SECRET_ACCESS_KEY);
+        env::set_var(AWS_ACCESS_KEY_ID, "id");
+        env::remove_var(AWS_SESSION_TOKEN);
+        let result = EnvironmentProvider.credentials().wait();
+        env::remove_var(AWS_ACCESS_KEY_ID);
+        assert!(result.is_err());
+        assert_eq!(
+            result.err(),
+            Some(CredentialsError::new(E_NO_SECRET_ACCESS_KEY))
+        );
+    }
+
+    #[test]
+    fn environment_provider_missing_credentials() {
+        let _guard = lock(&ENV_MUTEX);
+        env::remove_var(AWS_SECRET_ACCESS_KEY);
+        env::remove_var(AWS_ACCESS_KEY_ID);
+        env::remove_var(AWS_SESSION_TOKEN);
+        let result = EnvironmentProvider.credentials().wait();
+        assert!(result.is_err());
+        assert_eq!(
+            result.err(),
+            Some(CredentialsError::new(E_NO_ACCESS_KEY_ID))
+        );
+    }
+
+    #[test]
+    fn environment_provider_bad_expiration() {
+        let _guard = lock(&ENV_MUTEX);
+        env::set_var(AWS_ACCESS_KEY_ID, "id");
+        env::set_var(AWS_SECRET_ACCESS_KEY, "secret");
+        env::set_var(AWS_SESSION_TOKEN, "token");
+        env::set_var(AWS_CREDENTIAL_EXPIRATION, "lore ipsum");
+        let result = EnvironmentProvider.credentials().wait();
+        env::remove_var(AWS_ACCESS_KEY_ID);
+        env::remove_var(AWS_SECRET_ACCESS_KEY);
+        env::remove_var(AWS_SESSION_TOKEN);
+        env::remove_var(AWS_CREDENTIAL_EXPIRATION);
+        assert!(result.is_err());
+        assert!(match &result.err() {
+            &Some(CredentialsError{ref message}) => message.starts_with(E_INVALID_EXPIRATION),
+            _ => false,
+        });
+    }
+
+    #[test]
+    fn get_temporary_credentials_with_expiration_from_env() {
+        let _guard = lock(&ENV_MUTEX);
+        let now = Utc::now();
+        let now_str = now.to_rfc3339();
+        env::set_var(AWS_ACCESS_KEY_ID, "id");
+        env::set_var(AWS_SECRET_ACCESS_KEY, "secret");
+        env::set_var(AWS_SESSION_TOKEN, "token");
+        env::set_var(AWS_CREDENTIAL_EXPIRATION, now_str);
+        let result = EnvironmentProvider.credentials().wait();
+        env::remove_var(AWS_ACCESS_KEY_ID);
+        env::remove_var(AWS_SECRET_ACCESS_KEY);
+        env::remove_var(AWS_SESSION_TOKEN);
+        env::remove_var(AWS_CREDENTIAL_EXPIRATION);
+        assert!(result.is_ok());
+        let creds = result.ok().unwrap();
+        assert_eq!(creds.aws_access_key_id(), "id");
+        assert_eq!(creds.aws_secret_access_key(), "secret");
+        assert_eq!(creds.token(), &Some("token".to_string()));
+        assert_eq!(creds.expires_at(), &Some(now));
+    }
+
+}
\ No newline at end of file
diff --git a/rusoto/credential/src/instance_metadata.rs b/rusoto/credential/src/instance_metadata.rs
index 2d5c781fc8b..e0ab089e735 100644
--- a/rusoto/credential/src/instance_metadata.rs
+++ b/rusoto/credential/src/instance_metadata.rs
@@ -2,15 +2,15 @@
 
 use futures::{Future, Poll};
 use futures::future::{FutureResult, result};
-use hyper::{Client, Uri};
+use hyper::{Client, Uri, Request, Method};
 use hyper::client::HttpConnector;
 use tokio_core::reactor::Handle;
 
 use {AwsCredentials, CredentialsError, ProvideAwsCredentials,
      make_request, parse_credentials_from_aws_service};
 
-const AWS_CREDENTIALS_PROVIDER_IP: &'static str = "169.254.169.254";
-const AWS_CREDENTIALS_PROVIDER_PATH: &'static str = "latest/meta-data/iam/security-credentials";
+const AWS_CREDENTIALS_PROVIDER_IP: &str = "169.254.169.254";
+const AWS_CREDENTIALS_PROVIDER_PATH: &str = "latest/meta-data/iam/security-credentials";
 
 /// Provides AWS credentials from a resource's IAM role.
 #[derive(Clone, Debug)]
@@ -87,8 +87,8 @@ fn get_role_name(client: &Client<HttpConnector>) -> Result<Box<Future<Item=Strin
         AWS_CREDENTIALS_PROVIDER_IP,
         AWS_CREDENTIALS_PROVIDER_PATH
     );
-    let uri = try!(role_name_address.parse::<Uri>());
-    Ok(make_request(client, uri))
+    let uri = role_name_address.parse::<Uri>()?;
+    Ok(make_request(client, Request::new(Method::Get, uri)))
 }
 
 /// Gets the credentials for an EC2 Instances IAM Role.
@@ -103,6 +103,6 @@ fn get_credentials_from_role(
         role_name
     );
 
-    let uri = try!(credentials_provider_url.parse::<Uri>());
-    Ok(make_request(client, uri))
+    let uri = credentials_provider_url.parse::<Uri>()?;
+    Ok(make_request(client, Request::new(Method::Get, uri)))
 }
diff --git a/rusoto/credential/src/lib.rs b/rusoto/credential/src/lib.rs
index 758130ab16f..377f19c2647 100644
--- a/rusoto/credential/src/lib.rs
+++ b/rusoto/credential/src/lib.rs
@@ -27,6 +27,7 @@ mod instance_metadata;
 mod profile;
 pub mod claims;
 
+use std::env::var as env_var;
 use std::fmt;
 use std::error::Error;
 use std::io::Error as IoError;
@@ -39,8 +40,9 @@ use std::collections::BTreeMap;
 use chrono::{Duration, Utc, DateTime, ParseError};
 use futures::{Async, Future, Poll, Stream};
 use futures::future::{Either, Shared, SharedItem, err};
-use hyper::{Client, Error as HyperError, Uri};
+use hyper::{Client, Error as HyperError};
 use hyper::client::Connect;
+use hyper::Request;
 use hyper::error::UriError;
 use serde_json::{from_str as json_from_str, Value};
 use tokio_core::reactor::Handle;
@@ -52,7 +54,7 @@ pub struct AwsCredentials {
     key: String,
     secret: String,
     token: Option<String>,
-    expires_at: DateTime<Utc>,
+    expires_at: Option<DateTime<Utc>>,
     claims: BTreeMap<String, String>,
 }
 
@@ -63,7 +65,7 @@ impl AwsCredentials {
         key: K,
         secret: S,
         token: Option<String>,
-        expires_at: DateTime<Utc>,
+        expires_at: Option<DateTime<Utc>>,
     ) -> AwsCredentials
     where
         K: Into<String>,
@@ -89,7 +91,7 @@ impl AwsCredentials {
     }
 
     /// Get a reference to the expiry time.
-    pub fn expires_at(&self) -> &DateTime<Utc> {
+    pub fn expires_at(&self) -> &Option<DateTime<Utc>> {
         &self.expires_at
     }
 
@@ -100,9 +102,13 @@ impl AwsCredentials {
 
     /// Determine whether or not the credentials are expired.
     fn credentials_are_expired(&self) -> bool {
-        // This is a rough hack to hopefully avoid someone requesting creds then sitting on them
-        // before issuing the request:
-        self.expires_at < Utc::now() + Duration::seconds(20)
+        match self.expires_at {
+            Some(ref e) =>
+                // This is a rough hack to hopefully avoid someone requesting creds then sitting on them
+                // before issuing the request:
+               *e < Utc::now() + Duration::seconds(20),
+            None => false,
+        }
     }
 
     /// Get the token claims
@@ -416,9 +422,13 @@ impl ChainProvider {
     }
 }
 
-/// Gets the DateTime that is 10 minutes from the current Time.
-fn in_ten_minutes() -> DateTime<Utc> {
-    Utc::now() + Duration::seconds(600)
+/// This is a helper function as Option<T>::filter is not yet stable (see issue #45860).
+/// <https://github.com/rust-lang/rfcs/issues/2036> also affects the implementation of this.
+fn non_empty_env_var(name: &str) -> Option<String> {
+    match env_var(name) {
+        Ok(value) => if value.is_empty() { None } else { Some(value) },
+        Err(_) => None
+    }
 }
 
 /// Reduces Boilerplate on getting json values. Wraps `serde_json::Value.get(key)`.
@@ -457,7 +467,7 @@ fn parse_credentials_from_aws_service(response: &str) -> Result<AwsCredentials,
     let token = try!(extract_string_value_from_json(&json_object, "Token"));
     let expiration = try!(extract_string_value_from_json(&json_object, "Expiration"));
 
-    let expiration = try!(expiration.parse());
+    let expiration = Some(try!(expiration.parse()));
 
     Ok(AwsCredentials::new(
         access_key_id,
@@ -470,9 +480,9 @@ fn parse_credentials_from_aws_service(response: &str) -> Result<AwsCredentials,
 /// Makes an Async Request with a timeout. Defaults to 30 seconds.
 fn make_request<C: Connect>(
     client: &Client<C>,
-    uri: Uri
+    request: Request
 ) -> Box<Future<Item=String, Error=CredentialsError>> {
-    let get = client.get(uri).and_then(|res| {
+    let get = client.request(request).and_then(|res| {
         if !res.status().is_success() {
             Either::A(err(HyperError::Io(IoError::new(
                 InvalidData,
diff --git a/rusoto/credential/src/profile.rs b/rusoto/credential/src/profile.rs
index f2058bd82a4..7f698501e5d 100644
--- a/rusoto/credential/src/profile.rs
+++ b/rusoto/credential/src/profile.rs
@@ -1,7 +1,7 @@
 //! The Credentials Provider for Credentials stored in a profile inside of a Credentials file.
 
 use std::collections::HashMap;
-use std::env::{home_dir, var as env_var};
+use std::env::{home_dir};
 use std::fs;
 use std::fs::File;
 use std::io::{BufRead, BufReader};
@@ -11,7 +11,7 @@ use futures::{Future, Poll};
 use futures::future::{FutureResult, result};
 use regex::Regex;
 
-use {AwsCredentials, CredentialsError, ProvideAwsCredentials, in_ten_minutes};
+use {AwsCredentials, CredentialsError, ProvideAwsCredentials, non_empty_env_var};
 
 const AWS_PROFILE: &str = "AWS_PROFILE";
 const AWS_SHARED_CREDENTIALS_FILE: &str = "AWS_SHARED_CREDENTIALS_FILE";
@@ -57,19 +57,11 @@ impl ProfileProvider {
         ProfileProvider::with_configuration(file_path, ProfileProvider::default_profile_name())
     }
 
-    /// This is a helper function as Option<T>::filter is not yet stable (see issue #45860).
-    fn non_empty_env_var(name: &str) -> Option<String> {
-        match env_var(name) {
-            Ok(value) => if value.is_empty() { None } else { Some(value) },
-            Err(_) => None
-        }
-    }
-
     /// Default credentials file location:
     /// 1. if set and not empty, use value from environment variable ```AWS_SHARED_CREDENTIALS_FILE```
     /// 2. otherwise return `~/.aws/credentials` (Linux/Mac) resp. `%USERPROFILE%\.aws\credentials` (Windows)
     fn default_profile_location() -> Result<PathBuf, CredentialsError> {
-        let env = ProfileProvider::non_empty_env_var(AWS_SHARED_CREDENTIALS_FILE);
+        let env = non_empty_env_var(AWS_SHARED_CREDENTIALS_FILE);
         match env {
             Some(path) => Ok(PathBuf::from(path)),
             None => ProfileProvider::hardcoded_profile_location(),
@@ -94,7 +86,7 @@ impl ProfileProvider {
     /// 2. otherwise return ```"default"```
     /// see https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/credentials.html.
     fn default_profile_name() -> String {
-         ProfileProvider::non_empty_env_var(AWS_PROFILE).unwrap_or(DEFAULT.to_owned())
+        non_empty_env_var(AWS_PROFILE).unwrap_or_else(|| DEFAULT.to_owned())
     }
 
     /// Get a reference to the credentials file path.
@@ -151,7 +143,7 @@ impl ProvideAwsCredentials for ProfileProvider {
     }
 }
 
-/// Parses a Credentials file into a Map of <ProfileName, AwsCredentials>
+/// Parses a Credentials file into a Map of <`ProfileName`, `AwsCredentials`>
 fn parse_credentials_file(
     file_path: &Path,
 ) -> Result<HashMap<String, AwsCredentials>, CredentialsError> {
@@ -205,7 +197,7 @@ fn parse_credentials_file(
                     access_key.unwrap(),
                     secret_key.unwrap(),
                     token,
-                    in_ten_minutes(),
+                    None,
                 );
                 profiles.insert(profile_name.unwrap(), creds);
             }
@@ -256,7 +248,7 @@ fn parse_credentials_file(
             access_key.unwrap(),
             secret_key.unwrap(),
             token,
-            in_ten_minutes(),
+            None,
         );
         profiles.insert(profile_name.unwrap(), creds);
     }
diff --git a/rusoto/credential/src/static_provider.rs b/rusoto/credential/src/static_provider.rs
index 81550ab42db..ac58d727fae 100644
--- a/rusoto/credential/src/static_provider.rs
+++ b/rusoto/credential/src/static_provider.rs
@@ -13,10 +13,10 @@ pub struct StaticProvider {
     aws_access_key_id: String,
     /// The AWS Secret Access Key to use for authenticating to AWS.
     aws_secret_access_key: String,
-    /// The optional token to use for authenticating to aWS.
+    /// The optional token to use for authenticating to AWS.
     token: Option<String>,
-    /// The time in seconds each issued token should be valid ofr.
-    valid_for: i64,
+    /// The time in seconds each issued token should be valid for.
+    valid_for: Option<i64>,
 }
 
 impl StaticProvider {
@@ -32,18 +32,17 @@ impl StaticProvider {
             aws_access_key_id: access_key,
             aws_secret_access_key: secret_access_key,
             token: token,
-            valid_for: valid_for.unwrap_or(600),
+            valid_for: valid_for,
         }
     }
 
-    /// Creates a new minimal Static Provider. This will set the token as optional none,
-    /// and the wait for time as 10 minutes. Which are the defaults elsewhere.
+    /// Creates a new minimal Static Provider. This will set the token as optional none.
     pub fn new_minimal(access_key: String, secret_access_key: String) -> StaticProvider {
         StaticProvider {
             aws_access_key_id: access_key,
             aws_secret_access_key: secret_access_key,
             token: None,
-            valid_for: 600,
+            valid_for: None,
         }
     }
 
@@ -68,7 +67,7 @@ impl StaticProvider {
     }
 
     /// Returns the length in seconds this Static Provider will be valid for.
-    pub fn is_valid_for(&self) -> &i64 {
+    pub fn is_valid_for(&self) -> &Option<i64> {
         &self.valid_for
     }
 }
@@ -81,7 +80,7 @@ impl ProvideAwsCredentials for StaticProvider {
             self.aws_access_key_id.clone(),
             self.aws_secret_access_key.clone(),
             self.token.clone(),
-            Utc::now() + Duration::seconds(self.valid_for),
+            self.valid_for.map(|v| Utc::now() + Duration::seconds(v)),
         ))
     }
 }
@@ -123,7 +122,7 @@ mod tests {
         ).credentials().wait();
         assert!(result.is_ok());
         let finalized = result.unwrap();
-        let expires_at = finalized.expires_at().clone();
+        let expires_at = finalized.expires_at().unwrap().clone();
 
         // Give a wide range of time, just incase there's somehow an immense amount of lag.
         assert!(start_time + Duration::minutes(100) < expires_at);
diff --git a/rusoto/services/acm/Cargo.toml b/rusoto/services/acm/Cargo.toml
index 36d646d0ef1..ad86b6790a2 100644
--- a/rusoto/services/acm/Cargo.toml
+++ b/rusoto/services/acm/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWS Certificate Manager @ 2015-12-08"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_acm/index.html"
 keywords = ["AWS", "Amazon", "acm"]
 license = "MIT"
 name = "rusoto_acm"
diff --git a/rusoto/services/apigateway/Cargo.toml b/rusoto/services/apigateway/Cargo.toml
index 1326f3f53df..c6d1f8cfbff 100644
--- a/rusoto/services/apigateway/Cargo.toml
+++ b/rusoto/services/apigateway/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon API Gateway @ 2015-07-09"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_apigateway/index.html"
 keywords = ["AWS", "Amazon", "apigateway"]
 license = "MIT"
 name = "rusoto_apigateway"
diff --git a/rusoto/services/application-autoscaling/Cargo.toml b/rusoto/services/application-autoscaling/Cargo.toml
index 568dc458268..ca34296ad04 100644
--- a/rusoto/services/application-autoscaling/Cargo.toml
+++ b/rusoto/services/application-autoscaling/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Application Auto Scaling @ 2016-02-06"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_application_autoscaling/index.html"
 keywords = ["AWS", "Amazon", "application-autoscal"]
 license = "MIT"
 name = "rusoto_application_autoscaling"
diff --git a/rusoto/services/appstream/Cargo.toml b/rusoto/services/appstream/Cargo.toml
index 8b360260715..fbd086a4a29 100644
--- a/rusoto/services/appstream/Cargo.toml
+++ b/rusoto/services/appstream/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon AppStream @ 2016-12-01"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_appstream/index.html"
 keywords = ["AWS", "Amazon", "appstream"]
 license = "MIT"
 name = "rusoto_appstream"
diff --git a/rusoto/services/athena/Cargo.toml b/rusoto/services/athena/Cargo.toml
index 28983b5732e..ff3d769457f 100644
--- a/rusoto/services/athena/Cargo.toml
+++ b/rusoto/services/athena/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon Athena @ 2017-05-18"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_athena/index.html"
 keywords = ["AWS", "Amazon", "athena"]
 license = "MIT"
 name = "rusoto_athena"
diff --git a/rusoto/services/autoscaling/Cargo.toml b/rusoto/services/autoscaling/Cargo.toml
index b4f6f11e559..f08dcfe0276 100644
--- a/rusoto/services/autoscaling/Cargo.toml
+++ b/rusoto/services/autoscaling/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Auto Scaling @ 2011-01-01"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_autoscaling/index.html"
 keywords = ["AWS", "Amazon", "autoscaling"]
 license = "MIT"
 name = "rusoto_autoscaling"
diff --git a/rusoto/services/batch/Cargo.toml b/rusoto/services/batch/Cargo.toml
index d6ff6c84d2d..e10618f9f95 100644
--- a/rusoto/services/batch/Cargo.toml
+++ b/rusoto/services/batch/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWS Batch @ 2016-08-10"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_batch/index.html"
 keywords = ["AWS", "Amazon", "batch"]
 license = "MIT"
 name = "rusoto_batch"
diff --git a/rusoto/services/budgets/Cargo.toml b/rusoto/services/budgets/Cargo.toml
index 00b61f6a5d7..c25f7bfefdf 100644
--- a/rusoto/services/budgets/Cargo.toml
+++ b/rusoto/services/budgets/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWS Budgets @ 2016-10-20"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_budgets/index.html"
 keywords = ["AWS", "Amazon", "budgets"]
 license = "MIT"
 name = "rusoto_budgets"
diff --git a/rusoto/services/clouddirectory/Cargo.toml b/rusoto/services/clouddirectory/Cargo.toml
index 6ac50640f87..e6d043f7520 100644
--- a/rusoto/services/clouddirectory/Cargo.toml
+++ b/rusoto/services/clouddirectory/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon CloudDirectory @ 2016-05-10"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_clouddirectory/index.html"
 keywords = ["AWS", "Amazon", "clouddirectory"]
 license = "MIT"
 name = "rusoto_clouddirectory"
diff --git a/rusoto/services/cloudformation/Cargo.toml b/rusoto/services/cloudformation/Cargo.toml
index 663e1bda5ca..631d202f075 100644
--- a/rusoto/services/cloudformation/Cargo.toml
+++ b/rusoto/services/cloudformation/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWS CloudFormation @ 2010-05-15"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_cloudformation/index.html"
 keywords = ["AWS", "Amazon", "cloudformation"]
 license = "MIT"
 name = "rusoto_cloudformation"
diff --git a/rusoto/services/cloudfront/Cargo.toml b/rusoto/services/cloudfront/Cargo.toml
index d314d27c4df..fd9233e1ddf 100644
--- a/rusoto/services/cloudfront/Cargo.toml
+++ b/rusoto/services/cloudfront/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon CloudFront @ 2017-03-25"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_cloudfront/index.html"
 keywords = ["AWS", "Amazon", "cloudfront"]
 license = "MIT"
 name = "rusoto_cloudfront"
diff --git a/rusoto/services/cloudfront/src/generated.rs b/rusoto/services/cloudfront/src/generated.rs
index c5950f225dc..8a0284d15fb 100644
--- a/rusoto/services/cloudfront/src/generated.rs
+++ b/rusoto/services/cloudfront/src/generated.rs
@@ -45,7 +45,7 @@ enum DeserializerNext {
     Element(String),
 }
 /// <p>A complex type that lists the AWS accounts, if any, that you included in the <code>TrustedSigners</code> complex type for this distribution. These are the accounts that you want to allow to create signed URLs for private content.</p> <p>The <code>Signer</code> complex type lists the AWS account number of the trusted signer or <code>self</code> if the signer is the AWS account that created the distribution. The <code>Signer</code> element also includes the IDs of any active CloudFront key pairs that are associated with the trusted signer's AWS account. If no <code>KeyPairId</code> element appears for a <code>Signer</code>, that signer can't create signed URLs. </p> <p>For more information, see <a href="http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/PrivateContent.html">Serving Private Content through CloudFront</a> in the <i>Amazon CloudFront Developer Guide</i>.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ActiveTrustedSigners {
     /// <p>Enabled is <code>true</code> if any of the AWS accounts listed in the <code>TrustedSigners</code> complex type for this RTMP distribution have active CloudFront key pairs. If not, <code>Enabled</code> is <code>false</code>.</p> <p>For more information, see <a>ActiveTrustedSigners</a>.</p>
     pub enabled: bool,
@@ -162,7 +162,7 @@ impl AliasListSerializer {
 }
 
 /// <p>A complex type that contains information about CNAMEs (alternate domain names), if any, for this distribution. </p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct Aliases {
     /// <p>A complex type that contains the CNAME aliases, if any, that you want to associate with this distribution.</p>
     pub items: Option<Vec<String>>,
@@ -239,7 +239,7 @@ impl AliasesSerializer {
 }
 
 /// <p>A complex type that controls which HTTP methods CloudFront processes and forwards to your Amazon S3 bucket or your custom origin. There are three choices:</p> <ul> <li> <p>CloudFront forwards only <code>GET</code> and <code>HEAD</code> requests.</p> </li> <li> <p>CloudFront forwards only <code>GET</code>, <code>HEAD</code>, and <code>OPTIONS</code> requests.</p> </li> <li> <p>CloudFront forwards <code>GET, HEAD, OPTIONS, PUT, PATCH, POST</code>, and <code>DELETE</code> requests.</p> </li> </ul> <p>If you pick the third choice, you may need to restrict access to your Amazon S3 bucket or to your custom origin so users can't perform operations that you don't want them to. For example, you might not want users to have permissions to delete objects from your origin.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct AllowedMethods {
     pub cached_methods: Option<CachedMethods>,
     /// <p>A complex type that contains the HTTP methods that you want CloudFront to process and forward to your origin.</p>
@@ -423,7 +423,7 @@ impl BooleanSerializer {
 }
 
 /// <p>A complex type that describes how CloudFront processes requests.</p> <p>You must create at least as many cache behaviors (including the default cache behavior) as you have origins if you want CloudFront to distribute objects from all of the origins. Each cache behavior specifies the one origin from which you want CloudFront to get objects. If you have two origins and only the default cache behavior, the default cache behavior will cause CloudFront to get objects from one of the origins, but the other origin is never used.</p> <p>For the current limit on the number of cache behaviors that you can add to a distribution, see <a href="http://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html#limits_cloudfront">Amazon CloudFront Limits</a> in the <i>AWS General Reference</i>.</p> <p>If you don't want to specify any cache behaviors, include only an empty <code>CacheBehaviors</code> element. Don't include an empty <code>CacheBehavior</code> element, or CloudFront returns a <code>MalformedXML</code> error.</p> <p>To delete all cache behaviors in an existing distribution, update the distribution configuration and include only an empty <code>CacheBehaviors</code> element.</p> <p>To add, change, or remove one or more cache behaviors, update the distribution configuration and specify all of the cache behaviors that you want to include in the updated distribution.</p> <p>For more information about cache behaviors, see <a href="http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/distribution-web-values-specify.html#DownloadDistValuesCacheBehavior">Cache Behaviors</a> in the <i>Amazon CloudFront Developer Guide</i>.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CacheBehavior {
     pub allowed_methods: Option<AllowedMethods>,
     /// <p>Whether you want CloudFront to automatically compress certain files for this cache behavior. If so, specify true; if not, specify false. For more information, see <a href="http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/ServingCompressedFiles.html">Serving Compressed Files</a> in the <i>Amazon CloudFront Developer Guide</i>.</p>
@@ -700,7 +700,7 @@ impl CacheBehaviorListSerializer {
 }
 
 /// <p>A complex type that contains zero or more <code>CacheBehavior</code> elements. </p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CacheBehaviors {
     /// <p>Optional: A complex type that contains cache behaviors for this distribution. If <code>Quantity</code> is <code>0</code>, you can omit <code>Items</code>.</p>
     pub items: Option<Vec<CacheBehavior>>,
@@ -780,7 +780,7 @@ impl CacheBehaviorsSerializer {
 }
 
 /// <p>A complex type that controls whether CloudFront caches the response to requests using the specified HTTP methods. There are two choices:</p> <ul> <li> <p>CloudFront caches responses to <code>GET</code> and <code>HEAD</code> requests.</p> </li> <li> <p>CloudFront caches responses to <code>GET</code>, <code>HEAD</code>, and <code>OPTIONS</code> requests.</p> </li> </ul> <p>If you pick the second choice for your Amazon S3 Origin, you may need to forward Access-Control-Request-Method, Access-Control-Request-Headers, and Origin headers for the responses to be cached correctly. </p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CachedMethods {
     /// <p>A complex type that contains the HTTP methods that you want CloudFront to cache responses to.</p>
     pub items: Vec<String>,
@@ -855,7 +855,7 @@ impl CachedMethodsSerializer {
 }
 
 /// <p>CloudFront origin access identity.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CloudFrontOriginAccessIdentity {
     /// <p>The current configuration information for the identity. </p>
     pub cloud_front_origin_access_identity_config: Option<CloudFrontOriginAccessIdentityConfig>,
@@ -917,7 +917,7 @@ impl CloudFrontOriginAccessIdentityDeserializer {
     }
 }
 /// <p>Origin access identity configuration. Send a <code>GET</code> request to the <code>/<i>CloudFront API version</i>/CloudFront/identity ID/config</code> resource. </p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CloudFrontOriginAccessIdentityConfig {
     /// <p>A unique number that ensures the request can't be replayed.</p> <p>If the <code>CallerReference</code> is new (no matter the content of the <code>CloudFrontOriginAccessIdentityConfig</code> object), a new origin access identity is created.</p> <p>If the <code>CallerReference</code> is a value already sent in a previous identity request, and the content of the <code>CloudFrontOriginAccessIdentityConfig</code> is identical to the original request (ignoring white space), the response includes the same information returned to the original request. </p> <p>If the <code>CallerReference</code> is a value you already sent in a previous request to create an identity, but the content of the <code>CloudFrontOriginAccessIdentityConfig</code> is different from the original request, CloudFront returns a <code>CloudFrontOriginAccessIdentityAlreadyExists</code> error. </p>
     pub caller_reference: String,
@@ -998,7 +998,7 @@ impl CloudFrontOriginAccessIdentityConfigSerializer {
 }
 
 /// <p>Lists the origin access identities for CloudFront.Send a <code>GET</code> request to the <code>/<i>CloudFront API version</i>/origin-access-identity/cloudfront</code> resource. The response includes a <code>CloudFrontOriginAccessIdentityList</code> element with zero or more <code>CloudFrontOriginAccessIdentitySummary</code> child elements. By default, your entire list of origin access identities is returned in one single page. If the list is long, you can paginate it using the <code>MaxItems</code> and <code>Marker</code> parameters.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CloudFrontOriginAccessIdentityList {
     /// <p>A flag that indicates whether more origin access identities remain to be listed. If your results were truncated, you can make a follow-up pagination request using the <code>Marker</code> request parameter to retrieve more items in the list.</p>
     pub is_truncated: bool,
@@ -1075,7 +1075,7 @@ impl CloudFrontOriginAccessIdentityListDeserializer {
     }
 }
 /// <p>Summary of the information about a CloudFront origin access identity.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CloudFrontOriginAccessIdentitySummary {
     /// <p>The comment for this origin access identity, as originally specified when created.</p>
     pub comment: String,
@@ -1238,7 +1238,7 @@ impl CookieNameListSerializer {
 }
 
 /// <p>A complex type that specifies whether you want CloudFront to forward cookies to the origin and, if so, which ones. For more information about forwarding cookies to the origin, see <a href="http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Cookies.html">How CloudFront Forwards, Caches, and Logs Cookies</a> in the <i>Amazon CloudFront Developer Guide</i>.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CookieNames {
     /// <p>A complex type that contains one <code>Name</code> element for each cookie that you want CloudFront to forward to the origin for this cache behavior.</p>
     pub items: Option<Vec<String>>,
@@ -1318,7 +1318,7 @@ impl CookieNamesSerializer {
 }
 
 /// <p>A complex type that specifies whether you want CloudFront to forward cookies to the origin and, if so, which ones. For more information about forwarding cookies to the origin, see <a href="http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Cookies.html">How CloudFront Forwards, Caches, and Logs Cookies</a> in the <i>Amazon CloudFront Developer Guide</i>.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CookiePreference {
     /// <p>Specifies which cookies to forward to the origin for this cache behavior: all, none, or the list of cookies specified in the <code>WhitelistedNames</code> complex type.</p> <p>Amazon S3 doesn't process cookies. When the cache behavior is forwarding requests to an Amazon S3 origin, specify none for the <code>Forward</code> element. </p>
     pub forward: String,
@@ -1399,14 +1399,14 @@ impl CookiePreferenceSerializer {
 }
 
 /// <p>The request to create a new origin access identity.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CreateCloudFrontOriginAccessIdentityRequest {
     /// <p>The current configuration information for the identity.</p>
     pub cloud_front_origin_access_identity_config: CloudFrontOriginAccessIdentityConfig,
 }
 
 /// <p>The returned result of the corresponding request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CreateCloudFrontOriginAccessIdentityResult {
     /// <p>The origin access identity's information.</p>
     pub cloud_front_origin_access_identity: Option<CloudFrontOriginAccessIdentity>,
@@ -1461,14 +1461,14 @@ impl CreateCloudFrontOriginAccessIdentityResultDeserializer {
     }
 }
 /// <p>The request to create a new distribution.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CreateDistributionRequest {
     /// <p>The distribution's configuration information.</p>
     pub distribution_config: DistributionConfig,
 }
 
 /// <p>The returned result of the corresponding request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CreateDistributionResult {
     /// <p>The distribution's information.</p>
     pub distribution: Option<Distribution>,
@@ -1521,14 +1521,14 @@ impl CreateDistributionResultDeserializer {
     }
 }
 /// <p>The request to create a new distribution with tags. </p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CreateDistributionWithTagsRequest {
     /// <p>The distribution's configuration information. </p>
     pub distribution_config_with_tags: DistributionConfigWithTags,
 }
 
 /// <p>The returned result of the corresponding request. </p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CreateDistributionWithTagsResult {
     /// <p>The distribution's information. </p>
     pub distribution: Option<Distribution>,
@@ -1581,7 +1581,7 @@ impl CreateDistributionWithTagsResultDeserializer {
     }
 }
 /// <p>The request to create an invalidation.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CreateInvalidationRequest {
     /// <p>The distribution's id.</p>
     pub distribution_id: String,
@@ -1590,7 +1590,7 @@ pub struct CreateInvalidationRequest {
 }
 
 /// <p>The returned result of the corresponding request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CreateInvalidationResult {
     /// <p>The invalidation's information.</p>
     pub invalidation: Option<Invalidation>,
@@ -1641,14 +1641,14 @@ impl CreateInvalidationResultDeserializer {
     }
 }
 /// <p>The request to create a new streaming distribution.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CreateStreamingDistributionRequest {
     /// <p>The streaming distribution's configuration information.</p>
     pub streaming_distribution_config: StreamingDistributionConfig,
 }
 
 /// <p>The returned result of the corresponding request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CreateStreamingDistributionResult {
     /// <p>The current version of the streaming distribution created.</p>
     pub e_tag: Option<String>,
@@ -1702,14 +1702,14 @@ impl CreateStreamingDistributionResultDeserializer {
     }
 }
 /// <p>The request to create a new streaming distribution with tags.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CreateStreamingDistributionWithTagsRequest {
     /// <p> The streaming distribution's configuration information. </p>
     pub streaming_distribution_config_with_tags: StreamingDistributionConfigWithTags,
 }
 
 /// <p>The returned result of the corresponding request. </p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CreateStreamingDistributionWithTagsResult {
     pub e_tag: Option<String>,
     /// <p>The fully qualified URI of the new streaming distribution resource just created. For example:<code> https://cloudfront.amazonaws.com/2010-11-01/streaming-distribution/EGTXBD79H29TRA8</code>.</p>
@@ -1762,7 +1762,7 @@ impl CreateStreamingDistributionWithTagsResultDeserializer {
     }
 }
 /// <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>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CustomErrorResponse {
     /// <p>The minimum amount of time, in seconds, that you want CloudFront to cache the HTTP status code specified in <code>ErrorCode</code>. When this time period has elapsed, CloudFront queries your origin to see whether the problem that caused the error has been resolved and the requested object is now available.</p> <p>If you don't want to specify a value, include an empty element, <code>&lt;ErrorCachingMinTTL&gt;</code>, in the XML document.</p> <p>For more information, 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>
     pub error_caching_min_ttl: Option<i64>,
@@ -1941,7 +1941,7 @@ impl CustomErrorResponseListSerializer {
 }
 
 /// <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>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CustomErrorResponses {
     /// <p>A complex type that contains a <code>CustomErrorResponse</code> element for each HTTP status code for which you want to specify a custom error page and/or a caching duration. </p>
     pub items: Option<Vec<CustomErrorResponse>>,
@@ -2021,7 +2021,7 @@ impl CustomErrorResponsesSerializer {
 }
 
 /// <p>A complex type that contains the list of Custom Headers for each origin. </p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CustomHeaders {
     /// <p> <b>Optional</b>: A list that contains one <code>OriginCustomHeader</code> element for each custom header that you want CloudFront to forward to the origin. If Quantity is <code>0</code>, omit <code>Items</code>.</p>
     pub items: Option<Vec<OriginCustomHeader>>,
@@ -2101,7 +2101,7 @@ impl CustomHeadersSerializer {
 }
 
 /// <p>A customer origin.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CustomOriginConfig {
     /// <p>The HTTP port the custom origin listens on.</p>
     pub http_port: i64,
@@ -2241,7 +2241,7 @@ impl CustomOriginConfigSerializer {
 }
 
 /// <p>A complex type that describes the default cache behavior if you don't specify a <code>CacheBehavior</code> element or if files don't match any of the values of <code>PathPattern</code> in <code>CacheBehavior</code> elements. You must create exactly one default cache behavior.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct DefaultCacheBehavior {
     pub allowed_methods: Option<AllowedMethods>,
     /// <p>Whether you want CloudFront to automatically compress certain files for this cache behavior. If so, specify <code>true</code>; if not, specify <code>false</code>. For more information, see <a href="http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/ServingCompressedFiles.html">Serving Compressed Files</a> in the <i>Amazon CloudFront Developer Guide</i>.</p>
@@ -2441,7 +2441,7 @@ impl DefaultCacheBehaviorSerializer {
 }
 
 /// <p>Deletes a origin access identity.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct DeleteCloudFrontOriginAccessIdentityRequest {
     /// <p>The origin access identity's ID.</p>
     pub id: String,
@@ -2450,7 +2450,7 @@ pub struct DeleteCloudFrontOriginAccessIdentityRequest {
 }
 
 /// <p>This action deletes a web distribution. To delete a web distribution using the CloudFront API, perform the following steps.</p> <p> <b>To delete a web distribution using the CloudFront API:</b> </p> <ol> <li> <p>Disable the web distribution </p> </li> <li> <p>Submit a <code>GET Distribution Config</code> request to get the current configuration and the <code>Etag</code> header for the distribution.</p> </li> <li> <p>Update the XML document that was returned in the response to your <code>GET Distribution Config</code> request to change the value of <code>Enabled</code> to <code>false</code>.</p> </li> <li> <p>Submit a <code>PUT Distribution Config</code> request to update the configuration for your distribution. In the request body, include the XML document that you updated in Step 3. Set the value of the HTTP <code>If-Match</code> header to the value of the <code>ETag</code> header that CloudFront returned when you submitted the <code>GET Distribution Config</code> request in Step 2.</p> </li> <li> <p>Review the response to the <code>PUT Distribution Config</code> request to confirm that the distribution was successfully disabled.</p> </li> <li> <p>Submit a <code>GET Distribution</code> request to confirm that your changes have propagated. When propagation is complete, the value of <code>Status</code> is <code>Deployed</code>.</p> </li> <li> <p>Submit a <code>DELETE Distribution</code> request. Set the value of the HTTP <code>If-Match</code> header to the value of the <code>ETag</code> header that CloudFront returned when you submitted the <code>GET Distribution Config</code> request in Step 6.</p> </li> <li> <p>Review the response to your <code>DELETE Distribution</code> request to confirm that the distribution was successfully deleted.</p> </li> </ol> <p>For information about deleting a distribution using the CloudFront console, see <a href="http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/HowToDeleteDistribution.html">Deleting a Distribution</a> in the <i>Amazon CloudFront Developer Guide</i>.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct DeleteDistributionRequest {
     /// <p>The distribution ID. </p>
     pub id: String,
@@ -2458,13 +2458,13 @@ pub struct DeleteDistributionRequest {
     pub if_match: Option<String>,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct DeleteServiceLinkedRoleRequest {
     pub role_name: String,
 }
 
 /// <p>The request to delete a streaming distribution.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct DeleteStreamingDistributionRequest {
     /// <p>The distribution ID. </p>
     pub id: String,
@@ -2473,7 +2473,7 @@ pub struct DeleteStreamingDistributionRequest {
 }
 
 /// <p>The distribution's information.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct Distribution {
     /// <p>The ARN (Amazon Resource Name) for the distribution. For example: <code>arn:aws:cloudfront::123456789012:distribution/EDFDVBD632BHDS5</code>, where <code>123456789012</code> is your AWS account ID.</p>
     pub arn: String,
@@ -2570,7 +2570,7 @@ impl DistributionDeserializer {
     }
 }
 /// <p>A distribution configuration.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct DistributionConfig {
     /// <p>A complex type that contains information about CNAMEs (alternate domain names), if any, for this distribution.</p>
     pub aliases: Option<Aliases>,
@@ -2822,7 +2822,7 @@ impl DistributionConfigSerializer {
 }
 
 /// <p>A distribution Configuration and a list of tags to be associated with the distribution.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct DistributionConfigWithTags {
     /// <p>A distribution configuration.</p>
     pub distribution_config: DistributionConfig,
@@ -2853,7 +2853,7 @@ impl DistributionConfigWithTagsSerializer {
 }
 
 /// <p>A distribution list.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct DistributionList {
     /// <p>A flag that indicates whether more distributions remain to be listed. If your results were truncated, you can make a follow-up pagination request using the <code>Marker</code> request parameter to retrieve more distributions in the list.</p>
     pub is_truncated: bool,
@@ -2929,7 +2929,7 @@ impl DistributionListDeserializer {
     }
 }
 /// <p>A summary of the information about a CloudFront distribution.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct DistributionSummary {
     /// <p>The ARN (Amazon Resource Name) for the distribution. For example: <code>arn:aws:cloudfront::123456789012:distribution/EDFDVBD632BHDS5</code>, where <code>123456789012</code> is your AWS account ID.</p>
     pub arn: String,
@@ -3157,7 +3157,7 @@ impl EventTypeSerializer {
 }
 
 /// <p>A complex type that specifies how CloudFront handles query strings and cookies.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ForwardedValues {
     /// <p>A complex type that specifies whether you want CloudFront to forward cookies to the origin and, if so, which ones. For more information about forwarding cookies to the origin, see <a href="http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Cookies.html">How CloudFront Forwards, Caches, and Logs Cookies</a> in the <i>Amazon CloudFront Developer Guide</i>.</p>
     pub cookies: CookiePreference,
@@ -3255,7 +3255,7 @@ impl ForwardedValuesSerializer {
 }
 
 /// <p>A complex type that controls the countries in which your content is distributed. CloudFront determines the location of your users using <code>MaxMind</code> GeoIP databases. </p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GeoRestriction {
     /// <p> A complex type that contains a <code>Location</code> element for each country in which you want CloudFront either to distribute your content (<code>whitelist</code>) or not distribute your content (<code>blacklist</code>).</p> <p>The <code>Location</code> element is a two-letter, uppercase country code for a country that you want to include in your <code>blacklist</code> or <code>whitelist</code>. Include one <code>Location</code> element for each country.</p> <p>CloudFront and <code>MaxMind</code> both use <code>ISO 3166</code> country codes. For the current list of countries and the corresponding codes, see <code>ISO 3166-1-alpha-2</code> code on the <i>International Organization for Standardization</i> website. You can also refer to the country list on the CloudFront console, which includes both country names and codes.</p>
     pub items: Option<Vec<String>>,
@@ -3382,14 +3382,14 @@ impl GeoRestrictionTypeSerializer {
 }
 
 /// <p>The origin access identity's configuration information. For more information, see <a>CloudFrontOriginAccessIdentityConfigComplexType</a>.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetCloudFrontOriginAccessIdentityConfigRequest {
     /// <p>The identity's ID. </p>
     pub id: String,
 }
 
 /// <p>The returned result of the corresponding request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetCloudFrontOriginAccessIdentityConfigResult {
     /// <p>The origin access identity's configuration information. </p>
     pub cloud_front_origin_access_identity_config: Option<CloudFrontOriginAccessIdentityConfig>,
@@ -3442,14 +3442,14 @@ impl GetCloudFrontOriginAccessIdentityConfigResultDeserializer {
     }
 }
 /// <p>The request to get an origin access identity's information.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetCloudFrontOriginAccessIdentityRequest {
     /// <p>The identity's ID.</p>
     pub id: String,
 }
 
 /// <p>The returned result of the corresponding request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetCloudFrontOriginAccessIdentityResult {
     /// <p>The origin access identity's information.</p>
     pub cloud_front_origin_access_identity: Option<CloudFrontOriginAccessIdentity>,
@@ -3502,14 +3502,14 @@ impl GetCloudFrontOriginAccessIdentityResultDeserializer {
     }
 }
 /// <p>The request to get a distribution configuration.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetDistributionConfigRequest {
     /// <p>The distribution's ID.</p>
     pub id: String,
 }
 
 /// <p>The returned result of the corresponding request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetDistributionConfigResult {
     /// <p>The distribution's configuration information.</p>
     pub distribution_config: Option<DistributionConfig>,
@@ -3561,14 +3561,14 @@ impl GetDistributionConfigResultDeserializer {
     }
 }
 /// <p>The request to get a distribution's information.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetDistributionRequest {
     /// <p>The distribution's ID.</p>
     pub id: String,
 }
 
 /// <p>The returned result of the corresponding request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetDistributionResult {
     /// <p>The distribution's information.</p>
     pub distribution: Option<Distribution>,
@@ -3619,7 +3619,7 @@ impl GetDistributionResultDeserializer {
     }
 }
 /// <p>The request to get an invalidation's information. </p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetInvalidationRequest {
     /// <p>The distribution's ID.</p>
     pub distribution_id: String,
@@ -3628,7 +3628,7 @@ pub struct GetInvalidationRequest {
 }
 
 /// <p>The returned result of the corresponding request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetInvalidationResult {
     /// <p>The invalidation's information. For more information, see <a href="http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/InvalidationDatatype.html">Invalidation Complex Type</a>. </p>
     pub invalidation: Option<Invalidation>,
@@ -3677,14 +3677,14 @@ impl GetInvalidationResultDeserializer {
     }
 }
 /// <p>To request to get a streaming distribution configuration.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetStreamingDistributionConfigRequest {
     /// <p>The streaming distribution's ID.</p>
     pub id: String,
 }
 
 /// <p>The returned result of the corresponding request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetStreamingDistributionConfigResult {
     /// <p>The current version of the configuration. For example: <code>E2QWRUHAPOMQZL</code>. </p>
     pub e_tag: Option<String>,
@@ -3736,14 +3736,14 @@ impl GetStreamingDistributionConfigResultDeserializer {
     }
 }
 /// <p>The request to get a streaming distribution's information.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetStreamingDistributionRequest {
     /// <p>The streaming distribution's ID.</p>
     pub id: String,
 }
 
 /// <p>The returned result of the corresponding request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetStreamingDistributionResult {
     /// <p>The current version of the streaming distribution's information. For example: <code>E2QWRUHAPOMQZL</code>.</p>
     pub e_tag: Option<String>,
@@ -3856,7 +3856,7 @@ impl HeaderListSerializer {
 }
 
 /// <p>A complex type that specifies the request headers, if any, that you want CloudFront to base caching on for this cache behavior. </p> <p>For the headers that you specify, CloudFront caches separate versions of a specified object based on the header values in viewer requests. For example, suppose viewer requests for <code>logo.jpg</code> contain a custom <code>product</code> header that has a value of either <code>acme</code> or <code>apex</code>, and you configure CloudFront to cache your content based on values in the <code>product</code> header. CloudFront forwards the <code>product</code> header to the origin and caches the response from the origin once for each header value. For more information about caching based on header values, see <a href="http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/header-caching.html">How CloudFront Forwards and Caches Headers</a> in the <i>Amazon CloudFront Developer Guide</i>.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct Headers {
     /// <p>A list that contains one <code>Name</code> element for each header that you want CloudFront to use for caching in this cache behavior. If <code>Quantity</code> is <code>0</code>, omit <code>Items</code>.</p>
     pub items: Option<Vec<String>>,
@@ -4003,7 +4003,7 @@ impl IntegerSerializer {
 }
 
 /// <p>An invalidation. </p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct Invalidation {
     /// <p>The date and time the invalidation request was first made. </p>
     pub create_time: String,
@@ -4068,7 +4068,7 @@ impl InvalidationDeserializer {
     }
 }
 /// <p>An invalidation batch.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct InvalidationBatch {
     /// <p>A value that you specify to uniquely identify an invalidation request. CloudFront uses the value to prevent you from accidentally resubmitting an identical request. Whenever you create a new invalidation request, you must specify a new value for <code>CallerReference</code> and change other values in the request as applicable. One way to ensure that the value of <code>CallerReference</code> is unique is to use a <code>timestamp</code>, for example, <code>20120301090000</code>.</p> <p>If you make a second invalidation request with the same value for <code>CallerReference</code>, and if the rest of the request is the same, CloudFront doesn't create a new invalidation request. Instead, CloudFront returns information about the invalidation request that you previously created with the same <code>CallerReference</code>.</p> <p>If <code>CallerReference</code> is a value you already sent in a previous invalidation batch request but the content of any <code>Path</code> is different from the original request, CloudFront returns an <code>InvalidationBatchAlreadyExists</code> error.</p>
     pub caller_reference: String,
@@ -4144,7 +4144,7 @@ impl InvalidationBatchSerializer {
 }
 
 /// <p>The <code>InvalidationList</code> complex type describes the list of invalidation objects. For more information about invalidation, see <a href="http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Invalidation.html">Invalidating Objects (Web Distributions Only)</a> in the <i>Amazon CloudFront Developer Guide</i>.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct InvalidationList {
     /// <p>A flag that indicates whether more invalidation batch requests remain to be listed. If your results were truncated, you can make a follow-up pagination request using the <code>Marker</code> request parameter to retrieve more invalidation batches in the list.</p>
     pub is_truncated: bool,
@@ -4220,7 +4220,7 @@ impl InvalidationListDeserializer {
     }
 }
 /// <p>A summary of an invalidation request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct InvalidationSummary {
     pub create_time: String,
     /// <p>The unique ID for an invalidation request.</p>
@@ -4394,7 +4394,7 @@ impl KeyPairIdListDeserializer {
     }
 }
 /// <p>A complex type that lists the active CloudFront key pairs, if any, that are associated with <code>AwsAccountNumber</code>. </p> <p>For more information, see <a>ActiveTrustedSigners</a>.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct KeyPairIds {
     /// <p>A complex type that lists the active CloudFront key pairs, if any, that are associated with <code>AwsAccountNumber</code>.</p> <p>For more information, see <a>ActiveTrustedSigners</a>.</p>
     pub items: Option<Vec<String>>,
@@ -4446,7 +4446,7 @@ impl KeyPairIdsDeserializer {
     }
 }
 /// <p>A complex type that contains a Lambda function association.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct LambdaFunctionAssociation {
     /// <p><p>Specifies the event type that triggers a Lambda function invocation. You can specify the following values:</p> <ul> <li> <p> <code>viewer-request</code>: The function executes when CloudFront receives a request from a viewer and before it checks to see whether the requested object is in the edge cache. </p> </li> <li> <p> <code>origin-request</code>: The function executes only when CloudFront forwards a request to your origin. When the requested object is in the edge cache, the function doesn&#39;t execute.</p> </li> <li> <p> <code>origin-response</code>: The function executes after CloudFront receives a response from the origin and before it caches the object in the response. When the requested object is in the edge cache, the function doesn&#39;t execute.</p> <p>If the origin returns an HTTP status code other than HTTP 200 (OK), the function doesn&#39;t execute.</p> </li> <li> <p> <code>viewer-response</code>: The function executes before CloudFront returns the requested object to the viewer. The function executes regardless of whether the object was already in the edge cache.</p> <p>If the origin returns an HTTP status code other than HTTP 200 (OK), the function doesn&#39;t execute.</p> </li> </ul></p>
     pub event_type: Option<String>,
@@ -4602,7 +4602,7 @@ impl LambdaFunctionAssociationListSerializer {
 }
 
 /// <p>A complex type that specifies a list of Lambda functions associations for a cache behavior.</p> <p>If you want to invoke one or more Lambda functions triggered by requests that match the <code>PathPattern</code> of the cache behavior, specify the applicable values for <code>Quantity</code> and <code>Items</code>. Note that there can be up to 4 <code>LambdaFunctionAssociation</code> items in this list (one for each possible value of <code>EventType</code>) and each <code>EventType</code> can be associated with the Lambda function only once.</p> <p>If you don't want to invoke any Lambda functions for the requests that match <code>PathPattern</code>, specify <code>0</code> for <code>Quantity</code> and omit <code>Items</code>. </p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct LambdaFunctionAssociations {
     /// <p> <b>Optional</b>: A complex type that contains <code>LambdaFunctionAssociation</code> items for this cache behavior. If <code>Quantity</code> is <code>0</code>, you can omit <code>Items</code>.</p>
     pub items: Option<Vec<LambdaFunctionAssociation>>,
@@ -4681,7 +4681,7 @@ impl LambdaFunctionAssociationsSerializer {
 }
 
 /// <p>The request to list origin access identities. </p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 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>,
@@ -4690,7 +4690,7 @@ pub struct ListCloudFrontOriginAccessIdentitiesRequest {
 }
 
 /// <p>The returned result of the corresponding request. </p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListCloudFrontOriginAccessIdentitiesResult {
     /// <p>The <code>CloudFrontOriginAccessIdentityList</code> type. </p>
     pub cloud_front_origin_access_identity_list: Option<CloudFrontOriginAccessIdentityList>,
@@ -4741,7 +4741,7 @@ impl ListCloudFrontOriginAccessIdentitiesResultDeserializer {
     }
 }
 /// <p>The request to list distributions that are associated with a specified AWS WAF web ACL. </p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListDistributionsByWebACLIdRequest {
     /// <p>Use <code>Marker</code> and <code>MaxItems</code> to control pagination of results. If you have more than <code>MaxItems</code> distributions that satisfy the request, the response includes a <code>NextMarker</code> element. To get the next page of results, submit another request. For the value of <code>Marker</code>, specify the value of <code>NextMarker</code> from the last response. (For the first request, omit <code>Marker</code>.) </p>
     pub marker: Option<String>,
@@ -4752,7 +4752,7 @@ pub struct ListDistributionsByWebACLIdRequest {
 }
 
 /// <p>The response to a request to list the distributions that are associated with a specified AWS WAF web ACL. </p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListDistributionsByWebACLIdResult {
     /// <p>The <code>DistributionList</code> type. </p>
     pub distribution_list: Option<DistributionList>,
@@ -4800,7 +4800,7 @@ impl ListDistributionsByWebACLIdResultDeserializer {
     }
 }
 /// <p>The request to list your distributions. </p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListDistributionsRequest {
     /// <p>Use this when paginating results to indicate where to begin in your list of distributions. The results include distributions 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 distribution on that page).</p>
     pub marker: Option<String>,
@@ -4809,7 +4809,7 @@ pub struct ListDistributionsRequest {
 }
 
 /// <p>The returned result of the corresponding request. </p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListDistributionsResult {
     /// <p>The <code>DistributionList</code> type. </p>
     pub distribution_list: Option<DistributionList>,
@@ -4857,7 +4857,7 @@ impl ListDistributionsResultDeserializer {
     }
 }
 /// <p>The request to list invalidations. </p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListInvalidationsRequest {
     /// <p>The distribution's ID.</p>
     pub distribution_id: String,
@@ -4868,7 +4868,7 @@ pub struct ListInvalidationsRequest {
 }
 
 /// <p>The returned result of the corresponding request. </p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListInvalidationsResult {
     /// <p>Information about invalidation batches. </p>
     pub invalidation_list: Option<InvalidationList>,
@@ -4916,7 +4916,7 @@ impl ListInvalidationsResultDeserializer {
     }
 }
 /// <p>The request to list your streaming distributions. </p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListStreamingDistributionsRequest {
     /// <p>The value that you provided for the <code>Marker</code> request parameter.</p>
     pub marker: Option<String>,
@@ -4925,7 +4925,7 @@ pub struct ListStreamingDistributionsRequest {
 }
 
 /// <p>The returned result of the corresponding request. </p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListStreamingDistributionsResult {
     /// <p>The <code>StreamingDistributionList</code> type. </p>
     pub streaming_distribution_list: Option<StreamingDistributionList>,
@@ -4975,14 +4975,14 @@ impl ListStreamingDistributionsResultDeserializer {
     }
 }
 /// <p> The request to list tags for a CloudFront resource.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListTagsForResourceRequest {
     /// <p> An ARN of a CloudFront resource.</p>
     pub resource: String,
 }
 
 /// <p> The returned result of the corresponding request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListTagsForResourceResult {
     /// <p> A complex type that contains zero or more <code>Tag</code> elements.</p>
     pub tags: Tags,
@@ -5089,7 +5089,7 @@ impl LocationListSerializer {
 }
 
 /// <p>A complex type that controls whether access logs are written for the distribution.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct LoggingConfig {
     /// <p>The Amazon S3 bucket to store the access logs in, for example, <code>myawslogbucket.s3.amazonaws.com</code>.</p>
     pub bucket: String,
@@ -5358,7 +5358,7 @@ impl MinimumProtocolVersionSerializer {
 }
 
 /// <p>A complex type that describes the Amazon S3 bucket or the HTTP server (for example, a web server) from which CloudFront gets your files. You must create at least one origin.</p> <p>For the current limit on the number of origins that you can create for a distribution, see <a href="http://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html#limits_cloudfront">Amazon CloudFront Limits</a> in the <i>AWS General Reference</i>.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct Origin {
     /// <p>A complex type that contains names and values for the custom headers that you want.</p>
     pub custom_headers: Option<CustomHeaders>,
@@ -5486,7 +5486,7 @@ impl OriginSerializer {
 }
 
 /// <p>A complex type that contains <code>HeaderName</code> and <code>HeaderValue</code> elements, if any, for this distribution. </p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct OriginCustomHeader {
     /// <p>The name of a header that you want CloudFront to forward to your origin. For more information, see <a href="http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/forward-custom-headers.html">Forwarding Custom Headers to Your Origin (Web Distributions Only)</a> in the <i>Amazon Amazon CloudFront Developer Guide</i>.</p>
     pub header_name: String,
@@ -5728,7 +5728,7 @@ impl OriginProtocolPolicySerializer {
 }
 
 /// <p>A complex type that contains information about the SSL/TLS protocols that CloudFront can use when establishing an HTTPS connection with your origin. </p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct OriginSslProtocols {
     /// <p>A list that contains allowed SSL/TLS protocols for this distribution.</p>
     pub items: Vec<String>,
@@ -5803,7 +5803,7 @@ impl OriginSslProtocolsSerializer {
 }
 
 /// <p>A complex type that contains information about origins for this distribution. </p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct Origins {
     /// <p>A complex type that contains origins for this distribution.</p>
     pub items: Option<Vec<Origin>>,
@@ -5941,7 +5941,7 @@ impl PathListSerializer {
 }
 
 /// <p>A complex type that contains information about the objects that you want to invalidate. For more information, see <a href="http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Invalidation.html#invalidation-specifying-objects">Specifying the Objects to Invalidate</a> in the <i>Amazon CloudFront Developer Guide</i>. </p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct Paths {
     /// <p>A complex type that contains a list of the paths that you want to invalidate.</p>
     pub items: Option<Vec<String>>,
@@ -6052,7 +6052,7 @@ impl PriceClassSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct QueryStringCacheKeys {
     /// <p>(Optional) A list that contains the query string parameters that you want CloudFront to use as a basis for caching for this cache behavior. If <code>Quantity</code> is 0, you can omit <code>Items</code>. </p>
     pub items: Option<Vec<String>>,
@@ -6213,7 +6213,7 @@ impl ResourceARNSerializer {
 }
 
 /// <p>A complex type that identifies ways in which you want to restrict distribution of your content.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct Restrictions {
     pub geo_restriction: GeoRestriction,
 }
@@ -6279,7 +6279,7 @@ impl RestrictionsSerializer {
 }
 
 /// <p>A complex type that contains information about the Amazon S3 bucket from which you want CloudFront to get your media files for distribution.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct S3Origin {
     /// <p>The DNS name of the Amazon S3 origin. </p>
     pub domain_name: String,
@@ -6363,7 +6363,7 @@ impl S3OriginSerializer {
 }
 
 /// <p>A complex type that contains information about the Amazon S3 origin. If the origin is a custom origin, use the <code>CustomOriginConfig</code> element instead.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct S3OriginConfig {
     /// <p>The CloudFront origin access identity to associate with the origin. Use an origin access identity to configure the origin so that viewers can <i>only</i> access objects in an Amazon S3 bucket through CloudFront. The format of the value is:</p> <p>origin-access-identity/cloudfront/<i>ID-of-origin-access-identity</i> </p> <p>where <code> <i>ID-of-origin-access-identity</i> </code> is the value that CloudFront returned in the <code>ID</code> element when you created the origin access identity.</p> <p>If you want viewers to be able to access objects using either the CloudFront URL or the Amazon S3 URL, specify an empty <code>OriginAccessIdentity</code> element.</p> <p>To delete the origin access identity from an existing distribution, update the distribution configuration and include an empty <code>OriginAccessIdentity</code> element.</p> <p>To replace the origin access identity, update the distribution configuration and specify the new origin access identity.</p> <p>For more information about the origin access identity, see <a href="http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/PrivateContent.html">Serving Private Content through CloudFront</a> in the <i>Amazon CloudFront Developer Guide</i>.</p>
     pub origin_access_identity: String,
@@ -6470,7 +6470,7 @@ impl SSLSupportMethodSerializer {
 }
 
 /// <p>A complex type that lists the AWS accounts that were included in the <code>TrustedSigners</code> complex type, as well as their active CloudFront key pair IDs, if any. </p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct Signer {
     /// <p><p>An AWS account that is included in the <code>TrustedSigners</code> complex type for this RTMP distribution. Valid values include:</p> <ul> <li> <p> <code>self</code>, which is the AWS account used to create the distribution.</p> </li> <li> <p>An AWS account number.</p> </li> </ul></p>
     pub aws_account_number: Option<String>,
@@ -6666,7 +6666,7 @@ impl SslProtocolsListSerializer {
 }
 
 /// <p>A streaming distribution. </p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct StreamingDistribution {
     pub arn: String,
     /// <p>A complex type that lists the AWS accounts, if any, that you included in the <code>TrustedSigners</code> complex type for this distribution. These are the accounts that you want to allow to create signed URLs for private content.</p> <p>The <code>Signer</code> complex type lists the AWS account number of the trusted signer or <code>self</code> if the signer is the AWS account that created the distribution. The <code>Signer</code> element also includes the IDs of any active CloudFront key pairs that are associated with the trusted signer's AWS account. If no <code>KeyPairId</code> element appears for a <code>Signer</code>, that signer can't create signed URLs.</p> <p>For more information, see <a href="http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/PrivateContent.html">Serving Private Content through CloudFront</a> in the <i>Amazon CloudFront Developer Guide</i>. </p>
@@ -6753,7 +6753,7 @@ impl StreamingDistributionDeserializer {
     }
 }
 /// <p>The RTMP distribution's configuration information.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct StreamingDistributionConfig {
     /// <p>A complex type that contains information about CNAMEs (alternate domain names), if any, for this streaming distribution. </p>
     pub aliases: Option<Aliases>,
@@ -6896,7 +6896,7 @@ impl StreamingDistributionConfigSerializer {
 }
 
 /// <p>A streaming distribution Configuration and a list of tags to be associated with the streaming distribution.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct StreamingDistributionConfigWithTags {
     /// <p>A streaming distribution Configuration.</p>
     pub streaming_distribution_config: StreamingDistributionConfig,
@@ -6927,7 +6927,7 @@ impl StreamingDistributionConfigWithTagsSerializer {
 }
 
 /// <p>A streaming distribution list. </p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct StreamingDistributionList {
     /// <p>A flag that indicates whether more streaming distributions remain to be listed. If your results were truncated, you can make a follow-up pagination request using the <code>Marker</code> request parameter to retrieve more distributions in the list. </p>
     pub is_truncated: bool,
@@ -7005,7 +7005,7 @@ impl StreamingDistributionListDeserializer {
     }
 }
 /// <p> A summary of the information for an Amazon CloudFront streaming distribution.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct StreamingDistributionSummary {
     /// <p> The ARN (Amazon Resource Name) for the streaming distribution. For example: <code>arn:aws:cloudfront::123456789012:streaming-distribution/EDFDVBD632BHDS5</code>, where <code>123456789012</code> is your AWS account ID.</p>
     pub arn: String,
@@ -7153,7 +7153,7 @@ impl StreamingDistributionSummaryListDeserializer {
     }
 }
 /// <p>A complex type that controls whether access logs are written for this streaming distribution.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct StreamingLoggingConfig {
     /// <p>The Amazon S3 bucket to store the access logs in, for example, <code>myawslogbucket.s3.amazonaws.com</code>.</p>
     pub bucket: String,
@@ -7279,7 +7279,7 @@ impl StringSerializer {
 }
 
 /// <p> A complex type that contains <code>Tag</code> key and <code>Tag</code> value.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct Tag {
     /// <p> A string that contains <code>Tag</code> key.</p> <p>The string length should be between 1 and 128 characters. Valid characters include <code>a-z</code>, <code>A-Z</code>, <code>0-9</code>, space, and the special characters <code>_ - . : / = + @</code>.</p>
     pub key: String,
@@ -7416,7 +7416,7 @@ impl TagKeyListSerializer {
 }
 
 /// <p> A complex type that contains zero or more <code>Tag</code> elements.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct TagKeys {
     /// <p> A complex type that contains <code>Tag</code> key elements.</p>
     pub items: Option<Vec<String>>,
@@ -7503,7 +7503,7 @@ impl TagListSerializer {
 }
 
 /// <p> The request to add tags to a CloudFront resource.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct TagResourceRequest {
     /// <p> An ARN of a CloudFront resource.</p>
     pub resource: String,
@@ -7547,7 +7547,7 @@ impl TagValueSerializer {
 }
 
 /// <p> A complex type that contains zero or more <code>Tag</code> elements.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct Tags {
     /// <p> A complex type that contains <code>Tag</code> elements.</p>
     pub items: Option<Vec<Tag>>,
@@ -7627,7 +7627,7 @@ impl TimestampDeserializer {
     }
 }
 /// <p>A complex type that specifies the AWS accounts, if any, that you want to allow to create signed URLs for private content.</p> <p>If you want to require signed URLs in requests for objects in the target origin that match the <code>PathPattern</code> for this cache behavior, specify <code>true</code> for <code>Enabled</code>, and specify the applicable values for <code>Quantity</code> and <code>Items</code>. For more information, see <a href="http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/PrivateContent.html">Serving Private Content through CloudFront</a> in the <i>Amazon Amazon CloudFront Developer Guide</i>.</p> <p>If you don't want to require signed URLs in requests for objects that match <code>PathPattern</code>, specify <code>false</code> for <code>Enabled</code> and <code>0</code> for <code>Quantity</code>. Omit <code>Items</code>.</p> <p>To add, change, or remove one or more trusted signers, change <code>Enabled</code> to <code>true</code> (if it's currently <code>false</code>), change <code>Quantity</code> as applicable, and specify all of the trusted signers that you want to include in the updated distribution.</p> <p>For more information about updating the distribution configuration, see <a>DistributionConfig</a> .</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct TrustedSigners {
     /// <p>Specifies whether you want to require viewers to use signed URLs to access the files specified by <code>PathPattern</code> and <code>TargetOriginId</code>.</p>
     pub enabled: bool,
@@ -7718,7 +7718,7 @@ impl TrustedSignersSerializer {
 }
 
 /// <p> The request to remove tags from a CloudFront resource.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct UntagResourceRequest {
     /// <p> An ARN of a CloudFront resource.</p>
     pub resource: String,
@@ -7727,7 +7727,7 @@ pub struct UntagResourceRequest {
 }
 
 /// <p>The request to update an origin access identity.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct UpdateCloudFrontOriginAccessIdentityRequest {
     /// <p>The identity's configuration information.</p>
     pub cloud_front_origin_access_identity_config: CloudFrontOriginAccessIdentityConfig,
@@ -7738,7 +7738,7 @@ pub struct UpdateCloudFrontOriginAccessIdentityRequest {
 }
 
 /// <p>The returned result of the corresponding request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct UpdateCloudFrontOriginAccessIdentityResult {
     /// <p>The origin access identity's information.</p>
     pub cloud_front_origin_access_identity: Option<CloudFrontOriginAccessIdentity>,
@@ -7791,7 +7791,7 @@ impl UpdateCloudFrontOriginAccessIdentityResultDeserializer {
     }
 }
 /// <p>The request to update a distribution.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct UpdateDistributionRequest {
     /// <p>The distribution's configuration information.</p>
     pub distribution_config: DistributionConfig,
@@ -7802,7 +7802,7 @@ pub struct UpdateDistributionRequest {
 }
 
 /// <p>The returned result of the corresponding request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct UpdateDistributionResult {
     /// <p>The distribution's information.</p>
     pub distribution: Option<Distribution>,
@@ -7853,7 +7853,7 @@ impl UpdateDistributionResultDeserializer {
     }
 }
 /// <p>The request to update a streaming distribution.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct UpdateStreamingDistributionRequest {
     /// <p>The streaming distribution's id.</p>
     pub id: String,
@@ -7864,7 +7864,7 @@ pub struct UpdateStreamingDistributionRequest {
 }
 
 /// <p>The returned result of the corresponding request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct UpdateStreamingDistributionResult {
     /// <p>The current version of the configuration. For example: <code>E2QWRUHAPOMQZL</code>.</p>
     pub e_tag: Option<String>,
@@ -7916,7 +7916,7 @@ impl UpdateStreamingDistributionResultDeserializer {
     }
 }
 /// <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>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ViewerCertificate {
     /// <p>For information about how and when to use <code>ACMCertificateArn</code>, see <a>ViewerCertificate</a>.</p>
     pub acm_certificate_arn: Option<String>,
diff --git a/rusoto/services/cloudhsm/Cargo.toml b/rusoto/services/cloudhsm/Cargo.toml
index 83914ebb928..eefab65ef50 100644
--- a/rusoto/services/cloudhsm/Cargo.toml
+++ b/rusoto/services/cloudhsm/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon CloudHSM @ 2014-05-30"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_cloudhsm/index.html"
 keywords = ["AWS", "Amazon", "cloudhsm"]
 license = "MIT"
 name = "rusoto_cloudhsm"
diff --git a/rusoto/services/cloudhsmv2/Cargo.toml b/rusoto/services/cloudhsmv2/Cargo.toml
index e1f8825119b..5058ad81682 100644
--- a/rusoto/services/cloudhsmv2/Cargo.toml
+++ b/rusoto/services/cloudhsmv2/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWS CloudHSM V2 @ 2017-04-28"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_cloudhsmv2/index.html"
 keywords = ["AWS", "Amazon", "cloudhsmv2"]
 license = "MIT"
 name = "rusoto_cloudhsmv2"
diff --git a/rusoto/services/cloudsearch/Cargo.toml b/rusoto/services/cloudsearch/Cargo.toml
index d4909918193..820f98fe581 100644
--- a/rusoto/services/cloudsearch/Cargo.toml
+++ b/rusoto/services/cloudsearch/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon CloudSearch @ 2013-01-01"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_cloudsearch/index.html"
 keywords = ["AWS", "Amazon", "cloudsearch"]
 license = "MIT"
 name = "rusoto_cloudsearch"
diff --git a/rusoto/services/cloudsearchdomain/Cargo.toml b/rusoto/services/cloudsearchdomain/Cargo.toml
index e823e265665..a5cfd5893f5 100644
--- a/rusoto/services/cloudsearchdomain/Cargo.toml
+++ b/rusoto/services/cloudsearchdomain/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon CloudSearch Domain @ 2013-01-01"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_cloudsearchdomain/index.html"
 keywords = ["AWS", "Amazon", "cloudsearchdomain"]
 license = "MIT"
 name = "rusoto_cloudsearchdomain"
diff --git a/rusoto/services/cloudtrail/Cargo.toml b/rusoto/services/cloudtrail/Cargo.toml
index a96e8a1dfe6..a13fa3ff1ec 100644
--- a/rusoto/services/cloudtrail/Cargo.toml
+++ b/rusoto/services/cloudtrail/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWS CloudTrail @ 2013-11-01"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_cloudtrail/index.html"
 keywords = ["AWS", "Amazon", "cloudtrail"]
 license = "MIT"
 name = "rusoto_cloudtrail"
diff --git a/rusoto/services/cloudwatch/Cargo.toml b/rusoto/services/cloudwatch/Cargo.toml
index e1fc7c71afa..7a474f35737 100644
--- a/rusoto/services/cloudwatch/Cargo.toml
+++ b/rusoto/services/cloudwatch/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon CloudWatch @ 2010-08-01"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_cloudwatch/index.html"
 keywords = ["AWS", "Amazon", "cloudwatch"]
 license = "MIT"
 name = "rusoto_cloudwatch"
diff --git a/rusoto/services/codebuild/Cargo.toml b/rusoto/services/codebuild/Cargo.toml
index d1311ddc885..3f880ab46c8 100644
--- a/rusoto/services/codebuild/Cargo.toml
+++ b/rusoto/services/codebuild/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWS CodeBuild @ 2016-10-06"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_codebuild/index.html"
 keywords = ["AWS", "Amazon", "codebuild"]
 license = "MIT"
 name = "rusoto_codebuild"
diff --git a/rusoto/services/codecommit/Cargo.toml b/rusoto/services/codecommit/Cargo.toml
index fb9f33c2db8..485aa4a4376 100644
--- a/rusoto/services/codecommit/Cargo.toml
+++ b/rusoto/services/codecommit/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWS CodeCommit @ 2015-04-13"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_codecommit/index.html"
 keywords = ["AWS", "Amazon", "codecommit"]
 license = "MIT"
 name = "rusoto_codecommit"
diff --git a/rusoto/services/codedeploy/Cargo.toml b/rusoto/services/codedeploy/Cargo.toml
index a95300ea014..ef268bfa431 100644
--- a/rusoto/services/codedeploy/Cargo.toml
+++ b/rusoto/services/codedeploy/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWS CodeDeploy @ 2014-10-06"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_codedeploy/index.html"
 keywords = ["AWS", "Amazon", "codedeploy"]
 license = "MIT"
 name = "rusoto_codedeploy"
diff --git a/rusoto/services/codepipeline/Cargo.toml b/rusoto/services/codepipeline/Cargo.toml
index 9847deef3bb..ac8d7dc01a1 100644
--- a/rusoto/services/codepipeline/Cargo.toml
+++ b/rusoto/services/codepipeline/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWS CodePipeline @ 2015-07-09"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_codepipeline/index.html"
 keywords = ["AWS", "Amazon", "codepipeline"]
 license = "MIT"
 name = "rusoto_codepipeline"
diff --git a/rusoto/services/codestar/Cargo.toml b/rusoto/services/codestar/Cargo.toml
index c49681b6887..494fa956024 100644
--- a/rusoto/services/codestar/Cargo.toml
+++ b/rusoto/services/codestar/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWS CodeStar @ 2017-04-19"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_codestar/index.html"
 keywords = ["AWS", "Amazon", "codestar"]
 license = "MIT"
 name = "rusoto_codestar"
diff --git a/rusoto/services/cognito-identity/Cargo.toml b/rusoto/services/cognito-identity/Cargo.toml
index 55cd2d46c6f..da8cdfabdaf 100644
--- a/rusoto/services/cognito-identity/Cargo.toml
+++ b/rusoto/services/cognito-identity/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon Cognito Identity @ 2014-06-30"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_cognito_identity/index.html"
 keywords = ["AWS", "Amazon", "cognito-identity"]
 license = "MIT"
 name = "rusoto_cognito_identity"
diff --git a/rusoto/services/cognito-idp/Cargo.toml b/rusoto/services/cognito-idp/Cargo.toml
index 0af8d14bbe8..c3926b01a8b 100644
--- a/rusoto/services/cognito-idp/Cargo.toml
+++ b/rusoto/services/cognito-idp/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon Cognito Identity Provider @ 2016-04-18"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_cognito_idp/index.html"
 keywords = ["AWS", "Amazon", "cognito-idp"]
 license = "MIT"
 name = "rusoto_cognito_idp"
diff --git a/rusoto/services/cognito-sync/Cargo.toml b/rusoto/services/cognito-sync/Cargo.toml
index a6cda9ddf5e..8f305d02bbf 100644
--- a/rusoto/services/cognito-sync/Cargo.toml
+++ b/rusoto/services/cognito-sync/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon Cognito Sync @ 2014-06-30"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_cognito_sync/index.html"
 keywords = ["AWS", "Amazon", "cognito-sync"]
 license = "MIT"
 name = "rusoto_cognito_sync"
diff --git a/rusoto/services/config/Cargo.toml b/rusoto/services/config/Cargo.toml
index 07f85237888..cff215784e3 100644
--- a/rusoto/services/config/Cargo.toml
+++ b/rusoto/services/config/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWS Config @ 2014-11-12"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_config/index.html"
 keywords = ["AWS", "Amazon", "config"]
 license = "MIT"
 name = "rusoto_config"
diff --git a/rusoto/services/cur/Cargo.toml b/rusoto/services/cur/Cargo.toml
index 57a63cec6f6..b3f246b3bb5 100644
--- a/rusoto/services/cur/Cargo.toml
+++ b/rusoto/services/cur/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWS Cost and Usage Report Service @ 2017-01-06"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_cur/index.html"
 keywords = ["AWS", "Amazon", "cur"]
 license = "MIT"
 name = "rusoto_cur"
diff --git a/rusoto/services/datapipeline/Cargo.toml b/rusoto/services/datapipeline/Cargo.toml
index e0254ea3444..5b6185e64c2 100644
--- a/rusoto/services/datapipeline/Cargo.toml
+++ b/rusoto/services/datapipeline/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWS Data Pipeline @ 2012-10-29"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_datapipeline/index.html"
 keywords = ["AWS", "Amazon", "datapipeline"]
 license = "MIT"
 name = "rusoto_datapipeline"
diff --git a/rusoto/services/dax/Cargo.toml b/rusoto/services/dax/Cargo.toml
index 08c6a062e94..7a10a4d45b7 100644
--- a/rusoto/services/dax/Cargo.toml
+++ b/rusoto/services/dax/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon DynamoDB Accelerator (DAX) @ 2017-04-19"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_dax/index.html"
 keywords = ["AWS", "Amazon", "dax"]
 license = "MIT"
 name = "rusoto_dax"
diff --git a/rusoto/services/devicefarm/Cargo.toml b/rusoto/services/devicefarm/Cargo.toml
index f878e269639..f47c995f8a7 100644
--- a/rusoto/services/devicefarm/Cargo.toml
+++ b/rusoto/services/devicefarm/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWS Device Farm @ 2015-06-23"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_devicefarm/index.html"
 keywords = ["AWS", "Amazon", "devicefarm"]
 license = "MIT"
 name = "rusoto_devicefarm"
diff --git a/rusoto/services/directconnect/Cargo.toml b/rusoto/services/directconnect/Cargo.toml
index e522c481dce..183e35d9ed4 100644
--- a/rusoto/services/directconnect/Cargo.toml
+++ b/rusoto/services/directconnect/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWS Direct Connect @ 2012-10-25"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_directconnect/index.html"
 keywords = ["AWS", "Amazon", "directconnect"]
 license = "MIT"
 name = "rusoto_directconnect"
diff --git a/rusoto/services/discovery/Cargo.toml b/rusoto/services/discovery/Cargo.toml
index c81156e26c1..19d5ba9799b 100644
--- a/rusoto/services/discovery/Cargo.toml
+++ b/rusoto/services/discovery/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWS Application Discovery Service @ 2015-11-01"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_discovery/index.html"
 keywords = ["AWS", "Amazon", "discovery"]
 license = "MIT"
 name = "rusoto_discovery"
diff --git a/rusoto/services/dms/Cargo.toml b/rusoto/services/dms/Cargo.toml
index 811c8e6c913..0543aed9b1c 100644
--- a/rusoto/services/dms/Cargo.toml
+++ b/rusoto/services/dms/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWS Database Migration Service @ 2016-01-01"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_dms/index.html"
 keywords = ["AWS", "Amazon", "dms"]
 license = "MIT"
 name = "rusoto_dms"
diff --git a/rusoto/services/ds/Cargo.toml b/rusoto/services/ds/Cargo.toml
index 95d7f9f362c..3d9353a347e 100644
--- a/rusoto/services/ds/Cargo.toml
+++ b/rusoto/services/ds/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWS Directory Service @ 2015-04-16"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_ds/index.html"
 keywords = ["AWS", "Amazon", "ds"]
 license = "MIT"
 name = "rusoto_ds"
diff --git a/rusoto/services/dynamodb/Cargo.toml b/rusoto/services/dynamodb/Cargo.toml
index 11a44bc5376..0e5aeb86c83 100644
--- a/rusoto/services/dynamodb/Cargo.toml
+++ b/rusoto/services/dynamodb/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon DynamoDB @ 2012-08-10"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_dynamodb/index.html"
 keywords = ["AWS", "Amazon", "dynamodb"]
 license = "MIT"
 name = "rusoto_dynamodb"
diff --git a/rusoto/services/dynamodbstreams/Cargo.toml b/rusoto/services/dynamodbstreams/Cargo.toml
index 475c9ef1122..9c849c07412 100644
--- a/rusoto/services/dynamodbstreams/Cargo.toml
+++ b/rusoto/services/dynamodbstreams/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon DynamoDB Streams @ 2012-08-10"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_dynamodbstreams/index.html"
 keywords = ["AWS", "Amazon", "dynamodbstreams"]
 license = "MIT"
 name = "rusoto_dynamodbstreams"
diff --git a/rusoto/services/ec2/Cargo.toml b/rusoto/services/ec2/Cargo.toml
index 52975d72c23..8b0b7c88580 100644
--- a/rusoto/services/ec2/Cargo.toml
+++ b/rusoto/services/ec2/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon Elastic Compute Cloud @ 2016-11-15"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_ec2/index.html"
 keywords = ["AWS", "Amazon", "ec2"]
 license = "MIT"
 name = "rusoto_ec2"
diff --git a/rusoto/services/ecr/Cargo.toml b/rusoto/services/ecr/Cargo.toml
index 42ba94ae2fe..b76ceede9ef 100644
--- a/rusoto/services/ecr/Cargo.toml
+++ b/rusoto/services/ecr/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon EC2 Container Registry @ 2015-09-21"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_ecr/index.html"
 keywords = ["AWS", "Amazon", "ecr"]
 license = "MIT"
 name = "rusoto_ecr"
diff --git a/rusoto/services/ecs/Cargo.toml b/rusoto/services/ecs/Cargo.toml
index 6c34f4bb00b..3bc625cea1b 100644
--- a/rusoto/services/ecs/Cargo.toml
+++ b/rusoto/services/ecs/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon EC2 Container Service @ 2014-11-13"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_ecs/index.html"
 keywords = ["AWS", "Amazon", "ecs"]
 license = "MIT"
 name = "rusoto_ecs"
diff --git a/rusoto/services/efs/Cargo.toml b/rusoto/services/efs/Cargo.toml
index 9ffb07ea4c7..6ab7e19964d 100644
--- a/rusoto/services/efs/Cargo.toml
+++ b/rusoto/services/efs/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon Elastic File System @ 2015-02-01"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_efs/index.html"
 keywords = ["AWS", "Amazon", "efs"]
 license = "MIT"
 name = "rusoto_efs"
diff --git a/rusoto/services/elasticache/Cargo.toml b/rusoto/services/elasticache/Cargo.toml
index 6ece753e180..d0f4d69a6ce 100644
--- a/rusoto/services/elasticache/Cargo.toml
+++ b/rusoto/services/elasticache/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon ElastiCache @ 2015-02-02"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_elasticache/index.html"
 keywords = ["AWS", "Amazon", "elasticache"]
 license = "MIT"
 name = "rusoto_elasticache"
diff --git a/rusoto/services/elasticbeanstalk/Cargo.toml b/rusoto/services/elasticbeanstalk/Cargo.toml
index 620e1de0c08..79fa866f6f6 100644
--- a/rusoto/services/elasticbeanstalk/Cargo.toml
+++ b/rusoto/services/elasticbeanstalk/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWS Elastic Beanstalk @ 2010-12-01"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_elasticbeanstalk/index.html"
 keywords = ["AWS", "Amazon", "elasticbeanstalk"]
 license = "MIT"
 name = "rusoto_elasticbeanstalk"
diff --git a/rusoto/services/elastictranscoder/Cargo.toml b/rusoto/services/elastictranscoder/Cargo.toml
index 0ffde5b1a62..05a4f0cfb89 100644
--- a/rusoto/services/elastictranscoder/Cargo.toml
+++ b/rusoto/services/elastictranscoder/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon Elastic Transcoder @ 2012-09-25"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_elastictranscoder/index.html"
 keywords = ["AWS", "Amazon", "elastictranscoder"]
 license = "MIT"
 name = "rusoto_elastictranscoder"
diff --git a/rusoto/services/elb/Cargo.toml b/rusoto/services/elb/Cargo.toml
index 61ae05547af..02fe5c1934e 100644
--- a/rusoto/services/elb/Cargo.toml
+++ b/rusoto/services/elb/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Elastic Load Balancing @ 2012-06-01"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_elb/index.html"
 keywords = ["AWS", "Amazon", "elb"]
 license = "MIT"
 name = "rusoto_elb"
diff --git a/rusoto/services/elbv2/Cargo.toml b/rusoto/services/elbv2/Cargo.toml
index 3eec08104cd..5acd4a8f3e2 100644
--- a/rusoto/services/elbv2/Cargo.toml
+++ b/rusoto/services/elbv2/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Elastic Load Balancing @ 2015-12-01"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_elbv2/index.html"
 keywords = ["AWS", "Amazon", "elbv2"]
 license = "MIT"
 name = "rusoto_elbv2"
diff --git a/rusoto/services/emr/Cargo.toml b/rusoto/services/emr/Cargo.toml
index 21429ca912b..58f1f700f22 100644
--- a/rusoto/services/emr/Cargo.toml
+++ b/rusoto/services/emr/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon Elastic MapReduce @ 2009-03-31"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_emr/index.html"
 keywords = ["AWS", "Amazon", "emr"]
 license = "MIT"
 name = "rusoto_emr"
diff --git a/rusoto/services/events/Cargo.toml b/rusoto/services/events/Cargo.toml
index 9361091fe7b..2cea070f51b 100644
--- a/rusoto/services/events/Cargo.toml
+++ b/rusoto/services/events/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon CloudWatch Events @ 2015-10-07"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_events/index.html"
 keywords = ["AWS", "Amazon", "events"]
 license = "MIT"
 name = "rusoto_events"
diff --git a/rusoto/services/firehose/Cargo.toml b/rusoto/services/firehose/Cargo.toml
index e58b49b6006..d2da0250903 100644
--- a/rusoto/services/firehose/Cargo.toml
+++ b/rusoto/services/firehose/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon Kinesis Firehose @ 2015-08-04"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_firehose/index.html"
 keywords = ["AWS", "Amazon", "firehose"]
 license = "MIT"
 name = "rusoto_firehose"
diff --git a/rusoto/services/gamelift/Cargo.toml b/rusoto/services/gamelift/Cargo.toml
index 2b4c66e854f..6e45b745402 100644
--- a/rusoto/services/gamelift/Cargo.toml
+++ b/rusoto/services/gamelift/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon GameLift @ 2015-10-01"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_gamelift/index.html"
 keywords = ["AWS", "Amazon", "gamelift"]
 license = "MIT"
 name = "rusoto_gamelift"
diff --git a/rusoto/services/glacier/Cargo.toml b/rusoto/services/glacier/Cargo.toml
index f4b01609c63..c8225760848 100644
--- a/rusoto/services/glacier/Cargo.toml
+++ b/rusoto/services/glacier/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon Glacier @ 2012-06-01"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_glacier/index.html"
 keywords = ["AWS", "Amazon", "glacier"]
 license = "MIT"
 name = "rusoto_glacier"
diff --git a/rusoto/services/glue/Cargo.toml b/rusoto/services/glue/Cargo.toml
index 231c399ab47..39b4dda200c 100644
--- a/rusoto/services/glue/Cargo.toml
+++ b/rusoto/services/glue/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWS Glue @ 2017-03-31"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_glue/index.html"
 keywords = ["AWS", "Amazon", "glue"]
 license = "MIT"
 name = "rusoto_glue"
diff --git a/rusoto/services/greengrass/Cargo.toml b/rusoto/services/greengrass/Cargo.toml
index d3e82bbf697..06b3c41146a 100644
--- a/rusoto/services/greengrass/Cargo.toml
+++ b/rusoto/services/greengrass/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWS Greengrass @ 2017-06-07"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_greengrass/index.html"
 keywords = ["AWS", "Amazon", "greengrass"]
 license = "MIT"
 name = "rusoto_greengrass"
diff --git a/rusoto/services/health/Cargo.toml b/rusoto/services/health/Cargo.toml
index baf99a4364a..10ae6475c1f 100644
--- a/rusoto/services/health/Cargo.toml
+++ b/rusoto/services/health/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWS Health APIs and Notifications @ 2016-08-04"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_health/index.html"
 keywords = ["AWS", "Amazon", "health"]
 license = "MIT"
 name = "rusoto_health"
diff --git a/rusoto/services/iam/Cargo.toml b/rusoto/services/iam/Cargo.toml
index cfec01f00e1..0cd0df5ad20 100644
--- a/rusoto/services/iam/Cargo.toml
+++ b/rusoto/services/iam/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWS Identity and Access Management @ 2010-05-08"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_iam/index.html"
 keywords = ["AWS", "Amazon", "iam"]
 license = "MIT"
 name = "rusoto_iam"
diff --git a/rusoto/services/importexport/Cargo.toml b/rusoto/services/importexport/Cargo.toml
index 350fd21e751..da529846e21 100644
--- a/rusoto/services/importexport/Cargo.toml
+++ b/rusoto/services/importexport/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWS Import/Export @ 2010-06-01"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_importexport/index.html"
 keywords = ["AWS", "Amazon", "importexport"]
 license = "MIT"
 name = "rusoto_importexport"
diff --git a/rusoto/services/inspector/Cargo.toml b/rusoto/services/inspector/Cargo.toml
index 633c6029117..d2e980bdc35 100644
--- a/rusoto/services/inspector/Cargo.toml
+++ b/rusoto/services/inspector/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon Inspector @ 2016-02-16"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_inspector/index.html"
 keywords = ["AWS", "Amazon", "inspector"]
 license = "MIT"
 name = "rusoto_inspector"
diff --git a/rusoto/services/iot/Cargo.toml b/rusoto/services/iot/Cargo.toml
index 9fddd62d2c0..9af2b005e00 100644
--- a/rusoto/services/iot/Cargo.toml
+++ b/rusoto/services/iot/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWS IoT @ 2015-05-28"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_iot/index.html"
 keywords = ["AWS", "Amazon", "iot"]
 license = "MIT"
 name = "rusoto_iot"
diff --git a/rusoto/services/kinesis/Cargo.toml b/rusoto/services/kinesis/Cargo.toml
index 761fe40e365..3ad54a58dea 100644
--- a/rusoto/services/kinesis/Cargo.toml
+++ b/rusoto/services/kinesis/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon Kinesis @ 2013-12-02"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_kinesis/index.html"
 keywords = ["AWS", "Amazon", "kinesis"]
 license = "MIT"
 name = "rusoto_kinesis"
diff --git a/rusoto/services/kinesisanalytics/Cargo.toml b/rusoto/services/kinesisanalytics/Cargo.toml
index 2679780fbe2..3bffdac2573 100644
--- a/rusoto/services/kinesisanalytics/Cargo.toml
+++ b/rusoto/services/kinesisanalytics/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon Kinesis Analytics @ 2015-08-14"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_kinesisanalytics/index.html"
 keywords = ["AWS", "Amazon", "kinesisanalytics"]
 license = "MIT"
 name = "rusoto_kinesisanalytics"
diff --git a/rusoto/services/kms/Cargo.toml b/rusoto/services/kms/Cargo.toml
index 901784a9816..204c18d1d8e 100644
--- a/rusoto/services/kms/Cargo.toml
+++ b/rusoto/services/kms/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWS Key Management Service @ 2014-11-01"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_kms/index.html"
 keywords = ["AWS", "Amazon", "kms"]
 license = "MIT"
 name = "rusoto_kms"
diff --git a/rusoto/services/lambda/Cargo.toml b/rusoto/services/lambda/Cargo.toml
index 47e5c5359f9..9a9e659ff0c 100644
--- a/rusoto/services/lambda/Cargo.toml
+++ b/rusoto/services/lambda/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWS Lambda @ 2015-03-31"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_lambda/index.html"
 keywords = ["AWS", "Amazon", "lambda"]
 license = "MIT"
 name = "rusoto_lambda"
diff --git a/rusoto/services/lex-models/Cargo.toml b/rusoto/services/lex-models/Cargo.toml
index a4de7bf6ac3..8c0d0216de0 100644
--- a/rusoto/services/lex-models/Cargo.toml
+++ b/rusoto/services/lex-models/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon Lex Model Building Service @ 2017-04-19"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_lex_models/index.html"
 keywords = ["AWS", "Amazon", "lex-models"]
 license = "MIT"
 name = "rusoto_lex_models"
diff --git a/rusoto/services/lex-runtime/Cargo.toml b/rusoto/services/lex-runtime/Cargo.toml
index c8651374ef7..71a81a38296 100644
--- a/rusoto/services/lex-runtime/Cargo.toml
+++ b/rusoto/services/lex-runtime/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon Lex Runtime Service @ 2016-11-28"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_lex_runtime/index.html"
 keywords = ["AWS", "Amazon", "lex-runtime"]
 license = "MIT"
 name = "rusoto_lex_runtime"
diff --git a/rusoto/services/lightsail/Cargo.toml b/rusoto/services/lightsail/Cargo.toml
index 2fa163e9f45..57314f9f0ea 100644
--- a/rusoto/services/lightsail/Cargo.toml
+++ b/rusoto/services/lightsail/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon Lightsail @ 2016-11-28"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_lightsail/index.html"
 keywords = ["AWS", "Amazon", "lightsail"]
 license = "MIT"
 name = "rusoto_lightsail"
diff --git a/rusoto/services/logs/Cargo.toml b/rusoto/services/logs/Cargo.toml
index 5bbf284850e..7d742ed667b 100644
--- a/rusoto/services/logs/Cargo.toml
+++ b/rusoto/services/logs/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon CloudWatch Logs @ 2014-03-28"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_logs/index.html"
 keywords = ["AWS", "Amazon", "logs"]
 license = "MIT"
 name = "rusoto_logs"
diff --git a/rusoto/services/machinelearning/Cargo.toml b/rusoto/services/machinelearning/Cargo.toml
index 76a4b0ddadf..83402a6203f 100644
--- a/rusoto/services/machinelearning/Cargo.toml
+++ b/rusoto/services/machinelearning/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon Machine Learning @ 2014-12-12"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_machinelearning/index.html"
 keywords = ["AWS", "Amazon", "machinelearning"]
 license = "MIT"
 name = "rusoto_machinelearning"
diff --git a/rusoto/services/marketplace-entitlement/Cargo.toml b/rusoto/services/marketplace-entitlement/Cargo.toml
index 041cd199161..69bbeb02436 100644
--- a/rusoto/services/marketplace-entitlement/Cargo.toml
+++ b/rusoto/services/marketplace-entitlement/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWS Marketplace Entitlement Service @ 2017-01-11"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_marketplace_entitlement/index.html"
 keywords = ["AWS", "Amazon", "marketplace-entitlem"]
 license = "MIT"
 name = "rusoto_marketplace_entitlement"
diff --git a/rusoto/services/marketplacecommerceanalytics/Cargo.toml b/rusoto/services/marketplacecommerceanalytics/Cargo.toml
index e012f858123..9d7c7abc207 100644
--- a/rusoto/services/marketplacecommerceanalytics/Cargo.toml
+++ b/rusoto/services/marketplacecommerceanalytics/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWS Marketplace Commerce Analytics @ 2015-07-01"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_marketplacecommerceanalytics/index.html"
 keywords = ["AWS", "Amazon", "marketplacecommercea"]
 license = "MIT"
 name = "rusoto_marketplacecommerceanalytics"
diff --git a/rusoto/services/meteringmarketplace/Cargo.toml b/rusoto/services/meteringmarketplace/Cargo.toml
index df163bfd682..92ca7819d02 100644
--- a/rusoto/services/meteringmarketplace/Cargo.toml
+++ b/rusoto/services/meteringmarketplace/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWSMarketplace Metering @ 2016-01-14"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_meteringmarketplace/index.html"
 keywords = ["AWS", "Amazon", "meteringmarketplace"]
 license = "MIT"
 name = "rusoto_meteringmarketplace"
diff --git a/rusoto/services/mgh/Cargo.toml b/rusoto/services/mgh/Cargo.toml
index 7dfac2deb84..bf3f7143323 100644
--- a/rusoto/services/mgh/Cargo.toml
+++ b/rusoto/services/mgh/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWS Migration Hub @ 2017-05-31"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_mgh/index.html"
 keywords = ["AWS", "Amazon", "mgh"]
 license = "MIT"
 name = "rusoto_mgh"
diff --git a/rusoto/services/mturk/Cargo.toml b/rusoto/services/mturk/Cargo.toml
index 2c29ed1c70d..4dce65637a2 100644
--- a/rusoto/services/mturk/Cargo.toml
+++ b/rusoto/services/mturk/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon Mechanical Turk @ 2017-01-17"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_mturk/index.html"
 keywords = ["AWS", "Amazon", "mturk"]
 license = "MIT"
 name = "rusoto_mturk"
diff --git a/rusoto/services/opsworks/Cargo.toml b/rusoto/services/opsworks/Cargo.toml
index 2d5387a1d94..995df78cb24 100644
--- a/rusoto/services/opsworks/Cargo.toml
+++ b/rusoto/services/opsworks/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWS OpsWorks @ 2013-02-18"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_opsworks/index.html"
 keywords = ["AWS", "Amazon", "opsworks"]
 license = "MIT"
 name = "rusoto_opsworks"
diff --git a/rusoto/services/opsworkscm/Cargo.toml b/rusoto/services/opsworkscm/Cargo.toml
index 5062377ccc3..0e2aa809ac1 100644
--- a/rusoto/services/opsworkscm/Cargo.toml
+++ b/rusoto/services/opsworkscm/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWS OpsWorks for Chef Automate @ 2016-11-01"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_opsworkscm/index.html"
 keywords = ["AWS", "Amazon", "opsworkscm"]
 license = "MIT"
 name = "rusoto_opsworkscm"
diff --git a/rusoto/services/organizations/Cargo.toml b/rusoto/services/organizations/Cargo.toml
index 1eb9d7af26a..6f8fe631f32 100644
--- a/rusoto/services/organizations/Cargo.toml
+++ b/rusoto/services/organizations/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWS Organizations @ 2016-11-28"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_organizations/index.html"
 keywords = ["AWS", "Amazon", "organizations"]
 license = "MIT"
 name = "rusoto_organizations"
diff --git a/rusoto/services/polly/Cargo.toml b/rusoto/services/polly/Cargo.toml
index 091d3d91aee..bc8115bf27b 100644
--- a/rusoto/services/polly/Cargo.toml
+++ b/rusoto/services/polly/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon Polly @ 2016-06-10"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_polly/index.html"
 keywords = ["AWS", "Amazon", "polly"]
 license = "MIT"
 name = "rusoto_polly"
diff --git a/rusoto/services/rds/Cargo.toml b/rusoto/services/rds/Cargo.toml
index be064d16cc9..05a4b08b31d 100644
--- a/rusoto/services/rds/Cargo.toml
+++ b/rusoto/services/rds/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon Relational Database Service @ 2014-10-31"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_rds/index.html"
 keywords = ["AWS", "Amazon", "rds"]
 license = "MIT"
 name = "rusoto_rds"
diff --git a/rusoto/services/redshift/Cargo.toml b/rusoto/services/redshift/Cargo.toml
index 0fe61d4af3b..99f44502974 100644
--- a/rusoto/services/redshift/Cargo.toml
+++ b/rusoto/services/redshift/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon Redshift @ 2012-12-01"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_redshift/index.html"
 keywords = ["AWS", "Amazon", "redshift"]
 license = "MIT"
 name = "rusoto_redshift"
diff --git a/rusoto/services/rekognition/Cargo.toml b/rusoto/services/rekognition/Cargo.toml
index e4683555c40..f46b4a451f2 100644
--- a/rusoto/services/rekognition/Cargo.toml
+++ b/rusoto/services/rekognition/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon Rekognition @ 2016-06-27"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_rekognition/index.html"
 keywords = ["AWS", "Amazon", "rekognition"]
 license = "MIT"
 name = "rusoto_rekognition"
diff --git a/rusoto/services/resourcegroupstaggingapi/Cargo.toml b/rusoto/services/resourcegroupstaggingapi/Cargo.toml
index 8e14e0ec3e3..70ae91ababd 100644
--- a/rusoto/services/resourcegroupstaggingapi/Cargo.toml
+++ b/rusoto/services/resourcegroupstaggingapi/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWS Resource Groups Tagging API @ 2017-01-26"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_resourcegroupstaggingapi/index.html"
 keywords = ["AWS", "Amazon", "resourcegroupstaggin"]
 license = "MIT"
 name = "rusoto_resourcegroupstaggingapi"
diff --git a/rusoto/services/route53/Cargo.toml b/rusoto/services/route53/Cargo.toml
index 5dae0bf0ccd..61a0a46ec10 100644
--- a/rusoto/services/route53/Cargo.toml
+++ b/rusoto/services/route53/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon Route 53 @ 2013-04-01"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_route53/index.html"
 keywords = ["AWS", "Amazon", "route53"]
 license = "MIT"
 name = "rusoto_route53"
diff --git a/rusoto/services/route53/src/generated.rs b/rusoto/services/route53/src/generated.rs
index 4957c286517..be0610896cd 100644
--- a/rusoto/services/route53/src/generated.rs
+++ b/rusoto/services/route53/src/generated.rs
@@ -45,7 +45,7 @@ enum DeserializerNext {
     Element(String),
 }
 /// <p>A complex type that contains the type of limit that you specified in the request and the current value for that limit.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct AccountLimit {
     /// <p><p>The limit that you requested. Valid values include the following:</p> <ul> <li> <p> <b>MAX<em>HEALTH</em>CHECKS<em>BY</em>OWNER</b>: The maximum number of health checks that you can create using the current account.</p> </li> <li> <p> <b>MAX<em>HOSTED</em>ZONES<em>BY</em>OWNER</b>: The maximum number of hosted zones that you can create using the current account.</p> </li> <li> <p> <b>MAX<em>REUSABLE</em>DELEGATION<em>SETS</em>BY<em>OWNER</b>: The maximum number of reusable delegation sets that you can create using the current account.</p> </li> <li> <p> <b>MAX</em>TRAFFIC<em>POLICIES</em>BY<em>OWNER</b>: The maximum number of traffic policies that you can create using the current account.</p> </li> <li> <p> <b>MAX</em>TRAFFIC<em>POLICY</em>INSTANCES<em>BY</em>OWNER</b>: The maximum number of traffic policy instances that you can create using the current account. (Traffic policy instances are referred to as traffic flow policy records in the Amazon Route 53 console.)</p> </li> </ul></p>
     pub type_: String,
@@ -131,7 +131,7 @@ impl AccountLimitTypeSerializer {
 }
 
 /// <p>A complex type that identifies the CloudWatch alarm that you want Amazon Route 53 health checkers to use to determine whether this health check is healthy.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct AlarmIdentifier {
     /// <p>The name of the CloudWatch alarm that you want Amazon Route 53 health checkers to use to determine whether this health check is healthy.</p>
     pub name: String,
@@ -282,7 +282,7 @@ impl AliasHealthEnabledSerializer {
 }
 
 /// <p><p> <i>Alias resource record sets only:</i> Information about the CloudFront distribution, Elastic Beanstalk environment, ELB load balancer, Amazon S3 bucket, or Amazon Route 53 resource record set that you&#39;re redirecting queries to. An Elastic Beanstalk environment must have a regionalized subdomain.</p> <p>When creating resource record sets for a private hosted zone, note the following:</p> <ul> <li> <p>Resource record sets can&#39;t be created for CloudFront distributions in a private hosted zone.</p> </li> <li> <p>Creating geolocation alias resource record sets or latency alias resource record sets in a private hosted zone is unsupported.</p> </li> <li> <p>For information about creating failover resource record sets in a private hosted zone, see <a href="http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover-private-hosted-zones.html">Configuring Failover in a Private Hosted Zone</a>.</p> </li> </ul></p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct AliasTarget {
     /// <p><p> <i>Alias resource record sets only:</i> The value that you specify depends on where you want to route queries:</p> <dl> <dt>CloudFront distribution</dt> <dd> <p>Specify the domain name that CloudFront assigned when you created your distribution.</p> <p>Your CloudFront distribution must include an alternate domain name that matches the name of the resource record set. For example, if the name of the resource record set is <i>acme.example.com</i>, your CloudFront distribution must include <i>acme.example.com</i> as one of the alternate domain names. For more information, see <a href="http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/CNAMEs.html">Using Alternate Domain Names (CNAMEs)</a> in the <i>Amazon CloudFront Developer Guide</i>.</p> </dd> <dt>Elastic Beanstalk environment</dt> <dd> <p>Specify the <code>CNAME</code> attribute for the environment. (The environment must have a regionalized domain name.) You can use the following methods to get the value of the CNAME attribute:</p> <ul> <li> <p> <i>AWS Management Console</i>: For information about how to get the value by using the console, see <a href="http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customdomains.html">Using Custom Domains with AWS Elastic Beanstalk</a> in the <i>AWS Elastic Beanstalk Developer Guide</i>.</p> </li> <li> <p> <i>Elastic Beanstalk API</i>: Use the <code>DescribeEnvironments</code> action to get the value of the <code>CNAME</code> attribute. For more information, see <a href="http://docs.aws.amazon.com/elasticbeanstalk/latest/api/API_DescribeEnvironments.html">DescribeEnvironments</a> in the <i>AWS Elastic Beanstalk API Reference</i>.</p> </li> <li> <p> <i>AWS CLI</i>: Use the <code>describe-environments</code> command to get the value of the <code>CNAME</code> attribute. For more information, see <a href="http://docs.aws.amazon.com/cli/latest/reference/elasticbeanstalk/describe-environments.html">describe-environments</a> in the <i>AWS Command Line Interface Reference</i>.</p> </li> </ul> </dd> <dt>ELB load balancer</dt> <dd> <p>Specify the DNS name that is associated with the load balancer. Get the DNS name by using the AWS Management Console, the ELB API, or the AWS CLI. </p> <ul> <li> <p> <b>AWS Management Console</b>: Go to the EC2 page, choose <b>Load Balancers</b> in the navigation pane, choose the load balancer, choose the <b>Description</b> tab, and get the value of the <b>DNS name</b> field. (If you&#39;re routing traffic to a Classic Load Balancer, get the value that begins with <b>dualstack</b>.) </p> </li> <li> <p> <b>Elastic Load Balancing API</b>: Use <code>DescribeLoadBalancers</code> to get the value of <code>DNSName</code>. For more information, see the applicable guide:</p> <ul> <li> <p>Classic Load Balancers: <a href="http://docs.aws.amazon.com/elasticloadbalancing/2012-06-01/APIReference/API_DescribeLoadBalancers.html">DescribeLoadBalancers</a> </p> </li> <li> <p>Application and Network Load Balancers: <a href="http://docs.aws.amazon.com/elasticloadbalancing/latest/APIReference/API_DescribeLoadBalancers.html">DescribeLoadBalancers</a> </p> </li> </ul> </li> <li> <p> <b>AWS CLI</b>: Use <code>describe-load-balancers</code> to get the value of <code>DNSName</code>. For more information, see the applicable guide:</p> <ul> <li> <p>Classic Load Balancers: <a href="http://docs.aws.amazon.com/cli/latest/reference/elb/describe-load-balancers.html">describe-load-balancers</a> </p> </li> <li> <p>Application and Network Load Balancers: <a href="http://docs.aws.amazon.com/cli/latest/reference/elbv2/describe-load-balancers.html">describe-load-balancers</a> </p> </li> </ul> </li> </ul> </dd> <dt>Amazon S3 bucket that is configured as a static website</dt> <dd> <p>Specify the domain name of the Amazon S3 website endpoint in which you created the bucket, for example, <code>s3-website-us-east-2.amazonaws.com</code>. For more information about valid values, see the table <a href="http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region">Amazon Simple Storage Service (S3) Website Endpoints</a> in the <i>Amazon Web Services General Reference</i>. For more information about using S3 buckets for websites, see <a href="http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/getting-started.html">Getting Started with Amazon Route 53</a> in the <i>Amazon Route 53 Developer Guide.</i> </p> </dd> <dt>Another Amazon Route 53 resource record set</dt> <dd> <p>Specify the value of the <code>Name</code> element for a resource record set in the current hosted zone.</p> </dd> </dl></p>
     pub dns_name: String,
@@ -398,7 +398,7 @@ impl AssociateVPCCommentSerializer {
 }
 
 /// <p>A complex type that contains information about the request to associate a VPC with a private hosted zone.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct AssociateVPCWithHostedZoneRequest {
     /// <p> <i>Optional:</i> A comment about the association request.</p>
     pub comment: Option<String>,
@@ -429,7 +429,7 @@ impl AssociateVPCWithHostedZoneRequestSerializer {
     }
 }
 /// <p>A complex type that contains the response information for the <code>AssociateVPCWithHostedZone</code> request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct AssociateVPCWithHostedZoneResponse {
     /// <p>A complex type that describes the changes made to your hosted zone.</p>
     pub change_info: ChangeInfo,
@@ -476,7 +476,7 @@ impl AssociateVPCWithHostedZoneResponseDeserializer {
     }
 }
 /// <p>The information for each resource record set that you want to change.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct Change {
     /// <p><p>The action to perform:</p> <ul> <li> <p> <code>CREATE</code>: Creates a resource record set that has the specified values.</p> </li> <li> <p> <code>DELETE</code>: Deletes a existing resource record set.</p> <important> <p>To delete the resource record set that is associated with a traffic policy instance, use <code> <a>DeleteTrafficPolicyInstance</a> </code>. Amazon Route 53 will delete the resource record set automatically. If you delete the resource record set by using <code>ChangeResourceRecordSets</code>, Amazon Route 53 doesn&#39;t automatically delete the traffic policy instance, and you&#39;ll continue to be charged for it even though it&#39;s no longer in use. </p> </important> </li> <li> <p> <code>UPSERT</code>: If a resource record set doesn&#39;t already exist, Amazon Route 53 creates it. If a resource record set does exist, Amazon Route 53 updates it with the values in the request.</p> </li> </ul></p>
     pub action: String,
@@ -532,7 +532,7 @@ impl ChangeActionSerializer {
 }
 
 /// <p>The information for a change request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ChangeBatch {
     /// <p>Information about the changes to make to the record sets.</p>
     pub changes: Vec<Change>,
@@ -566,7 +566,7 @@ impl ChangeBatchSerializer {
 }
 
 /// <p>A complex type that describes change information about changes made to your hosted zone.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ChangeInfo {
     /// <p>A complex type that describes change information about changes made to your hosted zone.</p> <p>This element contains an ID that you use when performing a <a>GetChange</a> action to get detailed information about the change.</p>
     pub comment: Option<String>,
@@ -631,7 +631,7 @@ impl ChangeInfoDeserializer {
     }
 }
 /// <p>A complex type that contains change information for the resource record set.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ChangeResourceRecordSetsRequest {
     /// <p>A complex type that contains an optional comment and the <code>Changes</code> element.</p>
     pub change_batch: ChangeBatch,
@@ -657,7 +657,7 @@ impl ChangeResourceRecordSetsRequestSerializer {
     }
 }
 /// <p>A complex type containing the response for the request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ChangeResourceRecordSetsResponse {
     /// <p>A complex type that contains information about changes made to your hosted zone.</p> <p>This element contains an ID that you use when performing a <a>GetChange</a> action to get detailed information about the change.</p>
     pub change_info: ChangeInfo,
@@ -718,7 +718,7 @@ impl ChangeStatusDeserializer {
     }
 }
 /// <p>A complex type that contains information about the tags that you want to add, edit, or delete.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ChangeTagsForResourceRequest {
     /// <p>A complex type that contains a list of the tags that you want to add to the specified health check or hosted zone and/or the tags that you want to edit <code>Value</code> for.</p> <p>You can add a maximum of 10 tags to a health check or a hosted zone.</p>
     pub add_tags: Option<Vec<Tag>>,
@@ -753,7 +753,7 @@ impl ChangeTagsForResourceRequestSerializer {
     }
 }
 /// <p>Empty response for the request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ChangeTagsForResourceResponse;
 
 struct ChangeTagsForResourceResponseDeserializer;
@@ -901,7 +901,7 @@ impl ChildHealthCheckListSerializer {
 }
 
 /// <p>A complex type that contains information about the CloudWatch alarm that Amazon Route 53 is monitoring for this health check.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CloudWatchAlarmConfiguration {
     /// <p>For the metric that the CloudWatch alarm is associated with, the arithmetic operation that is used for the comparison.</p>
     pub comparison_operator: String,
@@ -1080,7 +1080,7 @@ impl ComparisonOperatorDeserializer {
     }
 }
 /// <p>A complex type that contains the health check request information.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CreateHealthCheckRequest {
     /// <p><p>A unique string that identifies the request and that allows you to retry a failed <code>CreateHealthCheck</code> request without the risk of creating two identical health checks:</p> <ul> <li> <p>If you send a <code>CreateHealthCheck</code> request with the same <code>CallerReference</code> and settings as a previous request, and if the health check doesn&#39;t exist, Amazon Route 53 creates the health check. If the health check does exist, Amazon Route 53 returns the settings for the existing health check.</p> </li> <li> <p>If you send a <code>CreateHealthCheck</code> request with the same <code>CallerReference</code> as a deleted health check, regardless of the settings, Amazon Route 53 returns a <code>HealthCheckAlreadyExists</code> error.</p> </li> <li> <p>If you send a <code>CreateHealthCheck</code> request with the same <code>CallerReference</code> as an existing health check but with different settings, Amazon Route 53 returns a <code>HealthCheckAlreadyExists</code> error.</p> </li> <li> <p>If you send a <code>CreateHealthCheck</code> request with a unique <code>CallerReference</code> but settings identical to an existing health check, Amazon Route 53 creates the health check.</p> </li> </ul></p>
     pub caller_reference: String,
@@ -1115,7 +1115,7 @@ impl CreateHealthCheckRequestSerializer {
     }
 }
 /// <p>A complex type containing the response information for the new health check.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CreateHealthCheckResponse {
     /// <p>A complex type that contains identifying information about the health check.</p>
     pub health_check: HealthCheck,
@@ -1164,7 +1164,7 @@ impl CreateHealthCheckResponseDeserializer {
     }
 }
 /// <p>A complex type that contains information about the request to create a hosted zone.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CreateHostedZoneRequest {
     /// <p>A unique string that identifies the request and that allows failed <code>CreateHostedZone</code> requests to be retried without the risk of executing the operation twice. You must use a unique <code>CallerReference</code> string every time you submit a <code>CreateHostedZone</code> request. <code>CallerReference</code> can be any unique string, for example, a date/time stamp.</p>
     pub caller_reference: String,
@@ -1206,7 +1206,7 @@ impl CreateHostedZoneRequestSerializer {
     }
 }
 /// <p>A complex type containing the response information for the hosted zone.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CreateHostedZoneResponse {
     /// <p>A complex type that contains information about the <code>CreateHostedZone</code> request.</p>
     pub change_info: ChangeInfo,
@@ -1273,7 +1273,7 @@ impl CreateHostedZoneResponseDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CreateQueryLoggingConfigRequest {
     /// <p>The Amazon Resource Name (ARN) for the log group that you want to Amazon Route 53 to send query logs to. This is the format of the ARN:</p> <p>arn:aws:logs:<i>region</i>:<i>account-id</i>:log-group:<i>log_group_name</i> </p> <p>To get the ARN for a log group, you can use the CloudWatch console, the <a href="http://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_DescribeLogGroups.html">DescribeLogGroups</a> API action, the <a href="http://docs.aws.amazon.com/cli/latest/reference/logs/describe-log-groups.html">describe-log-groups</a> command, or the applicable command in one of the AWS SDKs.</p>
     pub cloud_watch_logs_log_group_arn: String,
@@ -1303,7 +1303,7 @@ impl CreateQueryLoggingConfigRequestSerializer {
         writer.write(xml::writer::XmlEvent::end_element())
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CreateQueryLoggingConfigResponse {
     /// <p>The unique URL representing the new query logging configuration.</p>
     pub location: String,
@@ -1354,7 +1354,7 @@ impl CreateQueryLoggingConfigResponseDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CreateReusableDelegationSetRequest {
     /// <p>A unique string that identifies the request, and that allows you to retry failed <code>CreateReusableDelegationSet</code> requests without the risk of executing the operation twice. You must use a unique <code>CallerReference</code> string every time you submit a <code>CreateReusableDelegationSet</code> request. <code>CallerReference</code> can be any unique string, for example a date/time stamp.</p>
     pub caller_reference: String,
@@ -1382,7 +1382,7 @@ impl CreateReusableDelegationSetRequestSerializer {
         writer.write(xml::writer::XmlEvent::end_element())
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CreateReusableDelegationSetResponse {
     /// <p>A complex type that contains name server information.</p>
     pub delegation_set: DelegationSet,
@@ -1433,7 +1433,7 @@ impl CreateReusableDelegationSetResponseDeserializer {
     }
 }
 /// <p>A complex type that contains information about the resource record sets that you want to create based on a specified traffic policy.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CreateTrafficPolicyInstanceRequest {
     /// <p>The ID of the hosted zone in which you want Amazon Route 53 to create resource record sets by using the configuration in a traffic policy.</p>
     pub hosted_zone_id: String,
@@ -1477,7 +1477,7 @@ impl CreateTrafficPolicyInstanceRequestSerializer {
     }
 }
 /// <p>A complex type that contains the response information for the <code>CreateTrafficPolicyInstance</code> request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CreateTrafficPolicyInstanceResponse {
     /// <p>A unique URL that represents a new traffic policy instance.</p>
     pub location: String,
@@ -1529,7 +1529,7 @@ impl CreateTrafficPolicyInstanceResponseDeserializer {
     }
 }
 /// <p>A complex type that contains information about the traffic policy that you want to create.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CreateTrafficPolicyRequest {
     /// <p>(Optional) Any comments that you want to include about the traffic policy.</p>
     pub comment: Option<String>,
@@ -1561,7 +1561,7 @@ impl CreateTrafficPolicyRequestSerializer {
     }
 }
 /// <p>A complex type that contains the response information for the <code>CreateTrafficPolicy</code> request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CreateTrafficPolicyResponse {
     /// <p>A unique URL that represents a new traffic policy.</p>
     pub location: String,
@@ -1612,7 +1612,7 @@ impl CreateTrafficPolicyResponseDeserializer {
     }
 }
 /// <p>A complex type that contains information about the traffic policy that you want to create a new version for.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CreateTrafficPolicyVersionRequest {
     /// <p>The comment that you specified in the <code>CreateTrafficPolicyVersion</code> request, if any.</p>
     pub comment: Option<String>,
@@ -1643,7 +1643,7 @@ impl CreateTrafficPolicyVersionRequestSerializer {
     }
 }
 /// <p>A complex type that contains the response information for the <code>CreateTrafficPolicyVersion</code> request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CreateTrafficPolicyVersionResponse {
     /// <p>A unique URL that represents a new traffic policy version.</p>
     pub location: String,
@@ -1694,7 +1694,7 @@ impl CreateTrafficPolicyVersionResponseDeserializer {
     }
 }
 /// <p>A complex type that contains information about the request to authorize associating a VPC with your private hosted zone. Authorization is only required when a private hosted zone and a VPC were created by using different accounts.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CreateVPCAssociationAuthorizationRequest {
     /// <p>The ID of the private hosted zone that you want to authorize associating a VPC with.</p>
     pub hosted_zone_id: String,
@@ -1720,7 +1720,7 @@ impl CreateVPCAssociationAuthorizationRequestSerializer {
     }
 }
 /// <p>A complex type that contains the response information from a <code>CreateVPCAssociationAuthorization</code> request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CreateVPCAssociationAuthorizationResponse {
     /// <p>The ID of the hosted zone that you authorized associating a VPC with.</p>
     pub hosted_zone_id: String,
@@ -1821,7 +1821,7 @@ impl DNSRCodeDeserializer {
     }
 }
 /// <p>A complex type that lists the name servers in a delegation set, as well as the <code>CallerReference</code> and the <code>ID</code> for the delegation set.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct DelegationSet {
     /// <p>The value that you specified for <code>CallerReference</code> when you created the reusable delegation set.</p>
     pub caller_reference: Option<String>,
@@ -1965,14 +1965,14 @@ impl DelegationSetsDeserializer {
     }
 }
 /// <p>This action deletes a health check.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct DeleteHealthCheckRequest {
     /// <p>The ID of the health check that you want to delete.</p>
     pub health_check_id: String,
 }
 
 /// <p>An empty element.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct DeleteHealthCheckResponse;
 
 struct DeleteHealthCheckResponseDeserializer;
@@ -1992,14 +1992,14 @@ impl DeleteHealthCheckResponseDeserializer {
     }
 }
 /// <p>A request to delete a hosted zone.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct DeleteHostedZoneRequest {
     /// <p>The ID of the hosted zone you want to delete.</p>
     pub id: String,
 }
 
 /// <p>A complex type that contains the response to a <code>DeleteHostedZone</code> request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct DeleteHostedZoneResponse {
     /// <p>A complex type that contains the ID, the status, and the date and time of a request to delete a hosted zone.</p>
     pub change_info: ChangeInfo,
@@ -2045,13 +2045,13 @@ impl DeleteHostedZoneResponseDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct DeleteQueryLoggingConfigRequest {
     /// <p>The ID of the configuration that you want to delete. </p>
     pub id: String,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct DeleteQueryLoggingConfigResponse;
 
 struct DeleteQueryLoggingConfigResponseDeserializer;
@@ -2071,14 +2071,14 @@ impl DeleteQueryLoggingConfigResponseDeserializer {
     }
 }
 /// <p>A request to delete a reusable delegation set.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct DeleteReusableDelegationSetRequest {
     /// <p>The ID of the reusable delegation set that you want to delete.</p>
     pub id: String,
 }
 
 /// <p>An empty element.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct DeleteReusableDelegationSetResponse;
 
 struct DeleteReusableDelegationSetResponseDeserializer;
@@ -2098,14 +2098,14 @@ impl DeleteReusableDelegationSetResponseDeserializer {
     }
 }
 /// <p>A request to delete a specified traffic policy instance.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct DeleteTrafficPolicyInstanceRequest {
     /// <p><p>The ID of the traffic policy instance that you want to delete. </p> <important> <p>When you delete a traffic policy instance, Amazon Route 53 also deletes all of the resource record sets that were created when you created the traffic policy instance.</p> </important></p>
     pub id: String,
 }
 
 /// <p>An empty element.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct DeleteTrafficPolicyInstanceResponse;
 
 struct DeleteTrafficPolicyInstanceResponseDeserializer;
@@ -2125,7 +2125,7 @@ impl DeleteTrafficPolicyInstanceResponseDeserializer {
     }
 }
 /// <p>A request to delete a specified traffic policy version.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct DeleteTrafficPolicyRequest {
     /// <p>The ID of the traffic policy that you want to delete.</p>
     pub id: String,
@@ -2134,7 +2134,7 @@ pub struct DeleteTrafficPolicyRequest {
 }
 
 /// <p>An empty element.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct DeleteTrafficPolicyResponse;
 
 struct DeleteTrafficPolicyResponseDeserializer;
@@ -2154,7 +2154,7 @@ impl DeleteTrafficPolicyResponseDeserializer {
     }
 }
 /// <p>A complex type that contains information about the request to remove authorization to associate a VPC that was created by one AWS account with a hosted zone that was created with a different AWS account. </p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct DeleteVPCAssociationAuthorizationRequest {
     /// <p>When removing authorization to associate a VPC that was created by one AWS account with a hosted zone that was created with a different AWS account, the ID of the hosted zone.</p>
     pub hosted_zone_id: String,
@@ -2180,7 +2180,7 @@ impl DeleteVPCAssociationAuthorizationRequestSerializer {
     }
 }
 /// <p>Empty response for the request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct DeleteVPCAssociationAuthorizationResponse;
 
 struct DeleteVPCAssociationAuthorizationResponseDeserializer;
@@ -2200,7 +2200,7 @@ impl DeleteVPCAssociationAuthorizationResponseDeserializer {
     }
 }
 /// <p>For the metric that the CloudWatch alarm is associated with, a complex type that contains information about one dimension.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct Dimension {
     /// <p>For the metric that the CloudWatch alarm is associated with, the name of one dimension.</p>
     pub name: String,
@@ -2326,7 +2326,7 @@ impl DisassociateVPCCommentSerializer {
 }
 
 /// <p>A complex type that contains information about the VPC that you want to disassociate from a specified private hosted zone.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct DisassociateVPCFromHostedZoneRequest {
     /// <p> <i>Optional:</i> A comment about the disassociation request.</p>
     pub comment: Option<String>,
@@ -2357,7 +2357,7 @@ impl DisassociateVPCFromHostedZoneRequestSerializer {
     }
 }
 /// <p>A complex type that contains the response information for the disassociate request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct DisassociateVPCFromHostedZoneResponse {
     /// <p>A complex type that describes the changes made to the specified private hosted zone.</p>
     pub change_info: ChangeInfo,
@@ -2523,7 +2523,7 @@ impl FullyQualifiedDomainNameSerializer {
 }
 
 /// <p>A complex type that contains information about a geo location.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GeoLocation {
     /// <p>The two-letter code for the continent.</p> <p>Valid values: <code>AF</code> | <code>AN</code> | <code>AS</code> | <code>EU</code> | <code>OC</code> | <code>NA</code> | <code>SA</code> </p> <p>Constraint: Specifying <code>ContinentCode</code> with either <code>CountryCode</code> or <code>SubdivisionCode</code> returns an <code>InvalidInput</code> error.</p>
     pub continent_code: Option<String>,
@@ -2728,7 +2728,7 @@ impl GeoLocationCountryNameDeserializer {
     }
 }
 /// <p>A complex type that contains the codes and full continent, country, and subdivision names for the specified <code>geolocation</code> code.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GeoLocationDetails {
     /// <p>The two-letter code for the continent.</p>
     pub continent_code: Option<String>,
@@ -2911,14 +2911,14 @@ impl GeoLocationSubdivisionNameDeserializer {
     }
 }
 /// <p>A complex type that contains information about the request to create a hosted zone.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetAccountLimitRequest {
     /// <p><p>The limit that you want to get. Valid values include the following:</p> <ul> <li> <p> <b>MAX<em>HEALTH</em>CHECKS<em>BY</em>OWNER</b>: The maximum number of health checks that you can create using the current account.</p> </li> <li> <p> <b>MAX<em>HOSTED</em>ZONES<em>BY</em>OWNER</b>: The maximum number of hosted zones that you can create using the current account.</p> </li> <li> <p> <b>MAX<em>REUSABLE</em>DELEGATION<em>SETS</em>BY<em>OWNER</b>: The maximum number of reusable delegation sets that you can create using the current account.</p> </li> <li> <p> <b>MAX</em>TRAFFIC<em>POLICIES</em>BY<em>OWNER</b>: The maximum number of traffic policies that you can create using the current account.</p> </li> <li> <p> <b>MAX</em>TRAFFIC<em>POLICY</em>INSTANCES<em>BY</em>OWNER</b>: The maximum number of traffic policy instances that you can create using the current account. (Traffic policy instances are referred to as traffic flow policy records in the Amazon Route 53 console.)</p> </li> </ul></p>
     pub type_: String,
 }
 
 /// <p>A complex type that contains the requested limit. </p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetAccountLimitResponse {
     /// <p>The current number of entities that you have created of the specified type. For example, if you specified <code>MAX_HEALTH_CHECKS_BY_OWNER</code> for the value of <code>Type</code> in the request, the value of <code>Count</code> is the current number of health checks that you have created using the current account.</p>
     pub count: i64,
@@ -2969,14 +2969,14 @@ impl GetAccountLimitResponseDeserializer {
     }
 }
 /// <p>The input for a GetChange request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetChangeRequest {
     /// <p>The ID of the change batch request. The value that you specify here is the value that <code>ChangeResourceRecordSets</code> returned in the <code>Id</code> element when you submitted the request.</p>
     pub id: String,
 }
 
 /// <p>A complex type that contains the <code>ChangeInfo</code> element.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetChangeResponse {
     /// <p>A complex type that contains information about the specified change batch.</p>
     pub change_info: ChangeInfo,
@@ -3022,10 +3022,10 @@ impl GetChangeResponseDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetCheckerIpRangesRequest;
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetCheckerIpRangesResponse {
     pub checker_ip_ranges: Vec<String>,
 }
@@ -3073,7 +3073,7 @@ impl GetCheckerIpRangesResponseDeserializer {
     }
 }
 /// <p>A request for information about whether a specified geographic location is supported for Amazon Route 53 geolocation resource record sets.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetGeoLocationRequest {
     /// <p><p>Amazon Route 53 supports the following continent codes:</p> <ul> <li> <p> <b>AF</b>: Africa</p> </li> <li> <p> <b>AN</b>: Antarctica</p> </li> <li> <p> <b>AS</b>: Asia</p> </li> <li> <p> <b>EU</b>: Europe</p> </li> <li> <p> <b>OC</b>: Oceania</p> </li> <li> <p> <b>NA</b>: North America</p> </li> <li> <p> <b>SA</b>: South America</p> </li> </ul></p>
     pub continent_code: Option<String>,
@@ -3084,7 +3084,7 @@ pub struct GetGeoLocationRequest {
 }
 
 /// <p>A complex type that contains the response information for the specified geolocation code.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetGeoLocationResponse {
     /// <p>A complex type that contains the codes and full continent, country, and subdivision names for the specified geolocation code.</p>
     pub geo_location_details: GeoLocationDetails,
@@ -3134,11 +3134,11 @@ impl GetGeoLocationResponseDeserializer {
     }
 }
 /// <p>A request for the number of health checks that are associated with the current AWS account.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetHealthCheckCountRequest;
 
 /// <p>A complex type that contains the response to a <code>GetHealthCheckCount</code> request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetHealthCheckCountResponse {
     /// <p>The number of health checks associated with the current AWS account.</p>
     pub health_check_count: i64,
@@ -3187,14 +3187,14 @@ impl GetHealthCheckCountResponseDeserializer {
     }
 }
 /// <p>A request for the reason that a health check failed most recently.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetHealthCheckLastFailureReasonRequest {
     /// <p><p>The ID for the health check for which you want the last failure reason. When you created the health check, <code>CreateHealthCheck</code> returned the ID in the response, in the <code>HealthCheckId</code> element.</p> <note> <p>If you want to get the last failure reason for a calculated health check, you must use the Amazon Route 53 console or the CloudWatch console. You can&#39;t use <code>GetHealthCheckLastFailureReason</code> for a calculated health check.</p> </note></p>
     pub health_check_id: String,
 }
 
 /// <p>A complex type that contains the response to a <code>GetHealthCheckLastFailureReason</code> request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetHealthCheckLastFailureReasonResponse {
     /// <p>A list that contains one <code>Observation</code> element for each Amazon Route 53 health checker that is reporting a last failure reason. </p>
     pub health_check_observations: Vec<HealthCheckObservation>,
@@ -3244,14 +3244,14 @@ impl GetHealthCheckLastFailureReasonResponseDeserializer {
     }
 }
 /// <p>A request to get information about a specified health check. </p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetHealthCheckRequest {
     /// <p>The identifier that Amazon Route 53 assigned to the health check when you created it. When you add or update a resource record set, you use this value to specify which health check to use. The value can be up to 64 characters long.</p>
     pub health_check_id: String,
 }
 
 /// <p>A complex type that contains the response to a <code>GetHealthCheck</code> request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetHealthCheckResponse {
     /// <p>A complex type that contains information about one health check that is associated with the current AWS account.</p>
     pub health_check: HealthCheck,
@@ -3298,14 +3298,14 @@ impl GetHealthCheckResponseDeserializer {
     }
 }
 /// <p>A request to get the status for a health check.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetHealthCheckStatusRequest {
     /// <p><p>The ID for the health check that you want the current status for. When you created the health check, <code>CreateHealthCheck</code> returned the ID in the response, in the <code>HealthCheckId</code> element.</p> <note> <p>If you want to check the status of a calculated health check, you must use the Amazon Route 53 console or the CloudWatch console. You can&#39;t use <code>GetHealthCheckStatus</code> to get the status of a calculated health check.</p> </note></p>
     pub health_check_id: String,
 }
 
 /// <p>A complex type that contains the response to a <code>GetHealthCheck</code> request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetHealthCheckStatusResponse {
     /// <p>A list that contains one <code>HealthCheckObservation</code> element for each Amazon Route 53 health checker that is reporting a status about the health check endpoint.</p>
     pub health_check_observations: Vec<HealthCheckObservation>,
@@ -3355,11 +3355,11 @@ impl GetHealthCheckStatusResponseDeserializer {
     }
 }
 /// <p>A request to retrieve a count of all the hosted zones that are associated with the current AWS account.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetHostedZoneCountRequest;
 
 /// <p>A complex type that contains the response to a <code>GetHostedZoneCount</code> request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetHostedZoneCountResponse {
     /// <p>The total number of public and private hosted zones that are associated with the current AWS account.</p>
     pub hosted_zone_count: i64,
@@ -3408,7 +3408,7 @@ impl GetHostedZoneCountResponseDeserializer {
     }
 }
 /// <p>A complex type that contains information about the request to create a hosted zone.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetHostedZoneLimitRequest {
     /// <p>The ID of the hosted zone that you want to get a limit for.</p>
     pub hosted_zone_id: String,
@@ -3417,7 +3417,7 @@ pub struct GetHostedZoneLimitRequest {
 }
 
 /// <p>A complex type that contains the requested limit. </p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetHostedZoneLimitResponse {
     /// <p>The current number of entities that you have created of the specified type. For example, if you specified <code>MAX_RRSETS_BY_ZONE</code> for the value of <code>Type</code> in the request, the value of <code>Count</code> is the current number of records that you have created in the specified hosted zone.</p>
     pub count: i64,
@@ -3468,14 +3468,14 @@ impl GetHostedZoneLimitResponseDeserializer {
     }
 }
 /// <p>A request to get information about a specified hosted zone. </p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetHostedZoneRequest {
     /// <p>The ID of the hosted zone that you want to get information about.</p>
     pub id: String,
 }
 
 /// <p>A complex type that contain the response to a <code>GetHostedZone</code> request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetHostedZoneResponse {
     /// <p>A complex type that lists the Amazon Route 53 name servers for the specified hosted zone.</p>
     pub delegation_set: Option<DelegationSet>,
@@ -3534,13 +3534,13 @@ impl GetHostedZoneResponseDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetQueryLoggingConfigRequest {
     /// <p>The ID of the configuration for DNS query logging that you want to get information about.</p>
     pub id: String,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetQueryLoggingConfigResponse {
     /// <p>A complex type that contains information about the query logging configuration that you specified in a <a>GetQueryLoggingConfig</a> request.</p>
     pub query_logging_config: QueryLoggingConfig,
@@ -3590,7 +3590,7 @@ impl GetQueryLoggingConfigResponseDeserializer {
     }
 }
 /// <p>A complex type that contains information about the request to create a hosted zone.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetReusableDelegationSetLimitRequest {
     /// <p>The ID of the delegation set that you want to get the limit for.</p>
     pub delegation_set_id: String,
@@ -3599,7 +3599,7 @@ pub struct GetReusableDelegationSetLimitRequest {
 }
 
 /// <p>A complex type that contains the requested limit. </p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetReusableDelegationSetLimitResponse {
     /// <p>The current number of hosted zones that you can associate with the specified reusable delegation set.</p>
     pub count: i64,
@@ -3653,14 +3653,14 @@ impl GetReusableDelegationSetLimitResponseDeserializer {
     }
 }
 /// <p>A request to get information about a specified reusable delegation set.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetReusableDelegationSetRequest {
     /// <p>The ID of the reusable delegation set that you want to get a list of name servers for.</p>
     pub id: String,
 }
 
 /// <p>A complex type that contains the response to the <code>GetReusableDelegationSet</code> request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetReusableDelegationSetResponse {
     /// <p>A complex type that contains information about the reusable delegation set.</p>
     pub delegation_set: DelegationSet,
@@ -3709,11 +3709,11 @@ impl GetReusableDelegationSetResponseDeserializer {
     }
 }
 /// <p>Request to get the number of traffic policy instances that are associated with the current AWS account.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetTrafficPolicyInstanceCountRequest;
 
 /// <p>A complex type that contains information about the resource record sets that Amazon Route 53 created based on a specified traffic policy.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetTrafficPolicyInstanceCountResponse {
     /// <p>The number of traffic policy instances that are associated with the current AWS account.</p>
     pub traffic_policy_instance_count: i64,
@@ -3763,14 +3763,14 @@ impl GetTrafficPolicyInstanceCountResponseDeserializer {
     }
 }
 /// <p>Gets information about a specified traffic policy instance.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetTrafficPolicyInstanceRequest {
     /// <p>The ID of the traffic policy instance that you want to get information about.</p>
     pub id: String,
 }
 
 /// <p>A complex type that contains information about the resource record sets that Amazon Route 53 created based on a specified traffic policy.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetTrafficPolicyInstanceResponse {
     /// <p>A complex type that contains settings for the traffic policy instance.</p>
     pub traffic_policy_instance: TrafficPolicyInstance,
@@ -3820,7 +3820,7 @@ impl GetTrafficPolicyInstanceResponseDeserializer {
     }
 }
 /// <p>Gets information about a specific traffic policy version.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetTrafficPolicyRequest {
     /// <p>The ID of the traffic policy that you want to get information about.</p>
     pub id: String,
@@ -3829,7 +3829,7 @@ pub struct GetTrafficPolicyRequest {
 }
 
 /// <p>A complex type that contains the response information for the request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetTrafficPolicyResponse {
     /// <p>A complex type that contains settings for the specified traffic policy.</p>
     pub traffic_policy: TrafficPolicy,
@@ -3878,7 +3878,7 @@ impl GetTrafficPolicyResponseDeserializer {
     }
 }
 /// <p>A complex type that contains information about one health check that is associated with the current AWS account.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct HealthCheck {
     /// <p>A unique string that you specified when you created the health check.</p>
     pub caller_reference: String,
@@ -3966,7 +3966,7 @@ impl HealthCheckDeserializer {
     }
 }
 /// <p>A complex type that contains information about the health check.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct HealthCheckConfig {
     /// <p>A complex type that identifies the CloudWatch alarm that you want Amazon Route 53 health checkers to use to determine whether this health check is healthy.</p>
     pub alarm_identifier: Option<AlarmIdentifier>,
@@ -4339,7 +4339,7 @@ impl HealthCheckNonceSerializer {
 }
 
 /// <p>A complex type that contains the last failure reason as reported by one Amazon Route 53 health checker.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct HealthCheckObservation {
     /// <p>The IP address of the Amazon Route 53 health checker that provided the failure reason in <code>StatusReport</code>.</p>
     pub ip_address: Option<String>,
@@ -4692,7 +4692,7 @@ impl HealthThresholdSerializer {
 }
 
 /// <p>A complex type that contains general information about the hosted zone.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct HostedZone {
     /// <p>The value that you specified for <code>CallerReference</code> when you created the hosted zone.</p>
     pub caller_reference: String,
@@ -4774,7 +4774,7 @@ impl HostedZoneDeserializer {
     }
 }
 /// <p>A complex type that contains an optional comment about your hosted zone. If you don't want to specify a comment, omit both the <code>HostedZoneConfig</code> and <code>Comment</code> elements.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct HostedZoneConfig {
     /// <p>Any comments that you want to include about the hosted zone.</p>
     pub comment: Option<String>,
@@ -4878,7 +4878,7 @@ impl HostedZoneCountDeserializer {
     }
 }
 /// <p>A complex type that contains the type of limit that you specified in the request and the current value for that limit.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct HostedZoneLimit {
     /// <p><p>The limit that you requested. Valid values include the following:</p> <ul> <li> <p> <b>MAX<em>RRSETS</em>BY<em>ZONE</b>: The maximum number of records that you can create in the specified hosted zone.</p> </li> <li> <p> <b>MAX</em>VPCS<em>ASSOCIATED</em>BY_ZONE</b>: The maximum number of Amazon VPCs that you can associate with the specified private hosted zone.</p> </li> </ul></p>
     pub type_: String,
@@ -5190,7 +5190,7 @@ impl LimitValueDeserializer {
     }
 }
 /// <p>If a health check or hosted zone was created by another service, <code>LinkedService</code> is a complex type that describes the service that created the resource. When a resource is created by another service, you can't edit or delete it using Amazon Route 53. </p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct LinkedService {
     /// <p>If the health check or hosted zone was created by another service, an optional description that can be provided by the other service. When a resource is created by another service, you can't edit or delete it using Amazon Route 53. </p>
     pub description: Option<String>,
@@ -5245,7 +5245,7 @@ impl LinkedServiceDeserializer {
     }
 }
 /// <p>A request to get a list of geographic locations that Amazon Route 53 supports for geolocation resource record sets. </p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListGeoLocationsRequest {
     /// <p>(Optional) The maximum number of geolocations to be included in the response body for this request. If more than <code>MaxItems</code> geolocations remain to be listed, then the value of the <code>IsTruncated</code> element in the response is <code>true</code>.</p>
     pub max_items: Option<String>,
@@ -5258,7 +5258,7 @@ pub struct ListGeoLocationsRequest {
 }
 
 /// <p>A complex type containing the response information for the request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListGeoLocationsResponse {
     /// <p>A complex type that contains one <code>GeoLocationDetails</code> element for each location that Amazon Route 53 supports for geolocation.</p>
     pub geo_location_details_list: Vec<GeoLocationDetails>,
@@ -5347,7 +5347,7 @@ impl ListGeoLocationsResponseDeserializer {
     }
 }
 /// <p>A request to retrieve a list of the health checks that are associated with the current AWS account.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListHealthChecksRequest {
     /// <p>If the value of <code>IsTruncated</code> in the previous response was <code>true</code>, you have more health checks. To get another group, submit another <code>ListHealthChecks</code> request. </p> <p>For the value of <code>marker</code>, specify the value of <code>NextMarker</code> from the previous response, which is the ID of the first health check that Amazon Route 53 will return if you submit another request.</p> <p>If the value of <code>IsTruncated</code> in the previous response was <code>false</code>, there are no more health checks to get.</p>
     pub marker: Option<String>,
@@ -5356,7 +5356,7 @@ pub struct ListHealthChecksRequest {
 }
 
 /// <p>A complex type that contains the response to a <code>ListHealthChecks</code> request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListHealthChecksResponse {
     /// <p>A complex type that contains one <code>HealthCheck</code> element for each health check that is associated with the current AWS account.</p>
     pub health_checks: Vec<HealthCheck>,
@@ -5428,7 +5428,7 @@ impl ListHealthChecksResponseDeserializer {
     }
 }
 /// <p>Retrieves a list of the public and private hosted zones that are associated with the current AWS account in ASCII order by domain name. </p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListHostedZonesByNameRequest {
     /// <p>(Optional) For your first request to <code>ListHostedZonesByName</code>, include the <code>dnsname</code> parameter only if you want to specify the name of the first hosted zone in the response. If you don't include the <code>dnsname</code> parameter, Amazon Route 53 returns all of the hosted zones that were created by the current AWS account, in ASCII order. For subsequent requests, include both <code>dnsname</code> and <code>hostedzoneid</code> parameters. For <code>dnsname</code>, specify the value of <code>NextDNSName</code> from the previous response.</p>
     pub dns_name: Option<String>,
@@ -5439,7 +5439,7 @@ pub struct ListHostedZonesByNameRequest {
 }
 
 /// <p>A complex type that contains the response information for the request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListHostedZonesByNameResponse {
     /// <p>For the second and subsequent calls to <code>ListHostedZonesByName</code>, <code>DNSName</code> is the value that you specified for the <code>dnsname</code> parameter in the request that produced the current response.</p>
     pub dns_name: Option<String>,
@@ -5526,7 +5526,7 @@ impl ListHostedZonesByNameResponseDeserializer {
     }
 }
 /// <p>A request to retrieve a list of the public and private hosted zones that are associated with the current AWS account.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListHostedZonesRequest {
     /// <p>If you're using reusable delegation sets and you want to list all of the hosted zones that are associated with a reusable delegation set, specify the ID of that reusable delegation set. </p>
     pub delegation_set_id: Option<String>,
@@ -5536,7 +5536,7 @@ pub struct ListHostedZonesRequest {
     pub max_items: Option<String>,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListHostedZonesResponse {
     /// <p>A complex type that contains general information about the hosted zone.</p>
     pub hosted_zones: Vec<HostedZone>,
@@ -5607,7 +5607,7 @@ impl ListHostedZonesResponseDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListQueryLoggingConfigsRequest {
     /// <p>(Optional) If you want to list the query logging configuration that is associated with a hosted zone, specify the ID in <code>HostedZoneId</code>. </p> <p>If you don't specify a hosted zone ID, <code>ListQueryLoggingConfigs</code> returns all of the configurations that are associated with the current AWS account.</p>
     pub hosted_zone_id: Option<String>,
@@ -5617,7 +5617,7 @@ pub struct ListQueryLoggingConfigsRequest {
     pub next_token: Option<String>,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListQueryLoggingConfigsResponse {
     /// <p>If a response includes the last of the query logging configurations that are associated with the current AWS account, <code>NextToken</code> doesn't appear in the response.</p> <p>If a response doesn't include the last of the configurations, you can get more configurations by submitting another <a>ListQueryLoggingConfigs</a> request. Get the value of <code>NextToken</code> that Amazon Route 53 returned in the previous response and include it in <code>NextToken</code> in the next request.</p>
     pub next_token: Option<String>,
@@ -5675,7 +5675,7 @@ impl ListQueryLoggingConfigsResponseDeserializer {
     }
 }
 /// <p>A request for the resource record sets that are associated with a specified hosted zone.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListResourceRecordSetsRequest {
     /// <p>The ID of the hosted zone that contains the resource record sets that you want to list.</p>
     pub hosted_zone_id: String,
@@ -5690,7 +5690,7 @@ pub struct ListResourceRecordSetsRequest {
 }
 
 /// <p>A complex type that contains list information for the resource record set.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListResourceRecordSetsResponse {
     /// <p>A flag that indicates whether more resource record sets remain to be listed. If your results were truncated, you can make a follow-up pagination request by using the <code>NextRecordName</code> element.</p>
     pub is_truncated: bool,
@@ -5777,7 +5777,7 @@ impl ListResourceRecordSetsResponseDeserializer {
     }
 }
 /// <p>A request to get a list of the reusable delegation sets that are associated with the current AWS account.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListReusableDelegationSetsRequest {
     /// <p>If the value of <code>IsTruncated</code> in the previous response was <code>true</code>, you have more reusable delegation sets. To get another group, submit another <code>ListReusableDelegationSets</code> request. </p> <p>For the value of <code>marker</code>, specify the value of <code>NextMarker</code> from the previous response, which is the ID of the first reusable delegation set that Amazon Route 53 will return if you submit another request.</p> <p>If the value of <code>IsTruncated</code> in the previous response was <code>false</code>, there are no more reusable delegation sets to get.</p>
     pub marker: Option<String>,
@@ -5786,7 +5786,7 @@ pub struct ListReusableDelegationSetsRequest {
 }
 
 /// <p>A complex type that contains information about the reusable delegation sets that are associated with the current AWS account.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListReusableDelegationSetsResponse {
     /// <p>A complex type that contains one <code>DelegationSet</code> element for each reusable delegation set that was created by the current AWS account.</p>
     pub delegation_sets: Vec<DelegationSet>,
@@ -5860,7 +5860,7 @@ impl ListReusableDelegationSetsResponseDeserializer {
     }
 }
 /// <p>A complex type containing information about a request for a list of the tags that are associated with an individual resource.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListTagsForResourceRequest {
     /// <p>The ID of the resource for which you want to retrieve tags.</p>
     pub resource_id: String,
@@ -5869,7 +5869,7 @@ pub struct ListTagsForResourceRequest {
 }
 
 /// <p>A complex type that contains information about the health checks or hosted zones for which you want to list tags.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListTagsForResourceResponse {
     /// <p>A <code>ResourceTagSet</code> containing tags associated with the specified resource.</p>
     pub resource_tag_set: ResourceTagSet,
@@ -5918,7 +5918,7 @@ impl ListTagsForResourceResponseDeserializer {
     }
 }
 /// <p>A complex type that contains information about the health checks or hosted zones for which you want to list tags.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListTagsForResourcesRequest {
     /// <p>A complex type that contains the ResourceId element for each resource for which you want to get a list of tags.</p>
     pub resource_ids: Vec<String>,
@@ -5944,7 +5944,7 @@ impl ListTagsForResourcesRequestSerializer {
     }
 }
 /// <p>A complex type containing tags for the specified resources.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListTagsForResourcesResponse {
     /// <p>A list of <code>ResourceTagSet</code>s containing tags associated with the specified resources.</p>
     pub resource_tag_sets: Vec<ResourceTagSet>,
@@ -5993,7 +5993,7 @@ impl ListTagsForResourcesResponseDeserializer {
     }
 }
 /// <p>A complex type that contains the information about the request to list the traffic policies that are associated with the current AWS account.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListTrafficPoliciesRequest {
     /// <p>(Optional) The maximum number of traffic policies that you want Amazon Route 53 to return in response to this request. If you have more than <code>MaxItems</code> traffic policies, the value of <code>IsTruncated</code> in the response is <code>true</code>, and the value of <code>TrafficPolicyIdMarker</code> is the ID of the first traffic policy that Amazon Route 53 will return if you submit another request.</p>
     pub max_items: Option<String>,
@@ -6002,7 +6002,7 @@ pub struct ListTrafficPoliciesRequest {
 }
 
 /// <p>A complex type that contains the response information for the request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListTrafficPoliciesResponse {
     /// <p>A flag that indicates whether there are more traffic policies to be listed. If the response was truncated, you can get the next group of traffic policies by submitting another <code>ListTrafficPolicies</code> request and specifying the value of <code>TrafficPolicyIdMarker</code> in the <code>TrafficPolicyIdMarker</code> request parameter.</p>
     pub is_truncated: bool,
@@ -6073,7 +6073,7 @@ impl ListTrafficPoliciesResponseDeserializer {
     }
 }
 /// <p>A request for the traffic policy instances that you created in a specified hosted zone.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListTrafficPolicyInstancesByHostedZoneRequest {
     /// <p>The ID of the hosted zone that you want to list traffic policy instances for.</p>
     pub hosted_zone_id: String,
@@ -6086,7 +6086,7 @@ pub struct ListTrafficPolicyInstancesByHostedZoneRequest {
 }
 
 /// <p>A complex type that contains the response information for the request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListTrafficPolicyInstancesByHostedZoneResponse {
     /// <p>A flag that indicates whether there are more traffic policy instances to be listed. If the response was truncated, you can get the next group of traffic policy instances by submitting another <code>ListTrafficPolicyInstancesByHostedZone</code> request and specifying the values of <code>HostedZoneIdMarker</code>, <code>TrafficPolicyInstanceNameMarker</code>, and <code>TrafficPolicyInstanceTypeMarker</code> in the corresponding request parameters.</p>
     pub is_truncated: bool,
@@ -6166,7 +6166,7 @@ impl ListTrafficPolicyInstancesByHostedZoneResponseDeserializer {
     }
 }
 /// <p>A complex type that contains the information about the request to list your traffic policy instances.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListTrafficPolicyInstancesByPolicyRequest {
     /// <p>If the value of <code>IsTruncated</code> in the previous response was <code>true</code>, you have more traffic policy instances. To get more traffic policy instances, submit another <code>ListTrafficPolicyInstancesByPolicy</code> request. </p> <p>For the value of <code>hostedzoneid</code>, specify the value of <code>HostedZoneIdMarker</code> from the previous response, which is the hosted zone ID of the first traffic policy instance that Amazon Route 53 will return if you submit another request.</p> <p>If the value of <code>IsTruncated</code> in the previous response was <code>false</code>, there are no more traffic policy instances to get.</p>
     pub hosted_zone_id_marker: Option<String>,
@@ -6183,7 +6183,7 @@ pub struct ListTrafficPolicyInstancesByPolicyRequest {
 }
 
 /// <p>A complex type that contains the response information for the request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListTrafficPolicyInstancesByPolicyResponse {
     /// <p>If <code>IsTruncated</code> is <code>true</code>, <code>HostedZoneIdMarker</code> is the ID of the hosted zone of the first traffic policy instance in the next group of traffic policy instances.</p>
     pub hosted_zone_id_marker: Option<String>,
@@ -6270,7 +6270,7 @@ impl ListTrafficPolicyInstancesByPolicyResponseDeserializer {
     }
 }
 /// <p>A request to get information about the traffic policy instances that you created by using the current AWS account.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListTrafficPolicyInstancesRequest {
     /// <p>If the value of <code>IsTruncated</code> in the previous response was <code>true</code>, you have more traffic policy instances. To get more traffic policy instances, submit another <code>ListTrafficPolicyInstances</code> request. For the value of <code>HostedZoneId</code>, specify the value of <code>HostedZoneIdMarker</code> from the previous response, which is the hosted zone ID of the first traffic policy instance in the next group of traffic policy instances.</p> <p>If the value of <code>IsTruncated</code> in the previous response was <code>false</code>, there are no more traffic policy instances to get.</p>
     pub hosted_zone_id_marker: Option<String>,
@@ -6283,7 +6283,7 @@ pub struct ListTrafficPolicyInstancesRequest {
 }
 
 /// <p>A complex type that contains the response information for the request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListTrafficPolicyInstancesResponse {
     /// <p>If <code>IsTruncated</code> is <code>true</code>, <code>HostedZoneIdMarker</code> is the ID of the hosted zone of the first traffic policy instance that Amazon Route 53 will return if you submit another <code>ListTrafficPolicyInstances</code> request. </p>
     pub hosted_zone_id_marker: Option<String>,
@@ -6370,7 +6370,7 @@ impl ListTrafficPolicyInstancesResponseDeserializer {
     }
 }
 /// <p>A complex type that contains the information about the request to list your traffic policies.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListTrafficPolicyVersionsRequest {
     /// <p>Specify the value of <code>Id</code> of the traffic policy for which you want to list all versions.</p>
     pub id: String,
@@ -6381,7 +6381,7 @@ pub struct ListTrafficPolicyVersionsRequest {
 }
 
 /// <p>A complex type that contains the response information for the request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListTrafficPolicyVersionsResponse {
     /// <p>A flag that indicates whether there are more traffic policies to be listed. If the response was truncated, you can get the next group of traffic policies by submitting another <code>ListTrafficPolicyVersions</code> request and specifying the value of <code>NextMarker</code> in the <code>marker</code> parameter.</p>
     pub is_truncated: bool,
@@ -6451,7 +6451,7 @@ impl ListTrafficPolicyVersionsResponseDeserializer {
     }
 }
 /// <p>A complex type that contains information about that can be associated with your hosted zone.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListVPCAssociationAuthorizationsRequest {
     /// <p>The ID of the hosted zone for which you want a list of VPCs that can be associated with the hosted zone.</p>
     pub hosted_zone_id: String,
@@ -6462,7 +6462,7 @@ pub struct ListVPCAssociationAuthorizationsRequest {
 }
 
 /// <p>A complex type that contains the response information for the request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListVPCAssociationAuthorizationsResponse {
     /// <p>The ID of the hosted zone that you can associate the listed VPCs with.</p>
     pub hosted_zone_id: String,
@@ -6837,7 +6837,7 @@ impl PortSerializer {
 }
 
 /// <p>A complex type that contains information about a configuration for DNS query logging.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct QueryLoggingConfig {
     /// <p>The Amazon Resource Name (ARN) of the CloudWatch Logs log group that Amazon Route 53 is publishing logs to.</p>
     pub cloud_watch_logs_log_group_arn: String,
@@ -7283,7 +7283,7 @@ impl ResourcePathSerializer {
 }
 
 /// <p><p>Information specific to the resource record.</p> <note> <p>If you&#39;re creating an alias resource record set, omit <code>ResourceRecord</code>.</p> </note></p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ResourceRecord {
     /// <p><p>The current or new DNS record value, not to exceed 4,000 characters. In the case of a <code>DELETE</code> action, if the current value does not match the actual value, an error is returned. For descriptions about how to format <code>Value</code> for different record types, see <a href="http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/ResourceRecordTypes.html">Supported DNS Resource Record Types</a> in the <i>Amazon Route 53 Developer Guide</i>.</p> <p>You can specify more than one value for all record types except <code>CNAME</code> and <code>SOA</code>. </p> <note> <p>If you&#39;re creating an alias resource record set, omit <code>Value</code>.</p> </note></p>
     pub value: String,
@@ -7352,7 +7352,7 @@ impl ResourceRecordSerializer {
 }
 
 /// <p>Information about the resource record set to create or delete.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ResourceRecordSet {
     /// <p><p> <i>Alias resource record sets only:</i> Information about the CloudFront distribution, AWS Elastic Beanstalk environment, ELB load balancer, Amazon S3 bucket, or Amazon Route 53 resource record set to which you&#39;re redirecting queries. The AWS Elastic Beanstalk environment must have a regionalized subdomain.</p> <p>If you&#39;re creating resource records sets for a private hosted zone, note the following:</p> <ul> <li> <p>You can&#39;t create alias resource record sets for CloudFront distributions in a private hosted zone.</p> </li> <li> <p>Creating geolocation alias resource record sets or latency alias resource record sets in a private hosted zone is unsupported.</p> </li> <li> <p>For information about creating failover resource record sets in a private hosted zone, see <a href="http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover-private-hosted-zones.html">Configuring Failover in a Private Hosted Zone</a> in the <i>Amazon Route 53 Developer Guide</i>.</p> </li> </ul></p>
     pub alias_target: Option<AliasTarget>,
@@ -7876,7 +7876,7 @@ impl ResourceRecordsSerializer {
 }
 
 /// <p>A complex type containing a resource and its associated tags.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ResourceTagSet {
     /// <p>The ID for the specified resource.</p>
     pub resource_id: Option<String>,
@@ -7981,7 +7981,7 @@ impl ResourceTagSetListDeserializer {
     }
 }
 /// <p>A complex type that contains the type of limit that you specified in the request and the current value for that limit.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ReusableDelegationSetLimit {
     /// <p>The limit that you requested: <code>MAX_ZONES_BY_REUSABLE_DELEGATION_SET</code>, the maximum number of hosted zones that you can associate with the specified reusable delegation set.</p>
     pub type_: String,
@@ -8147,7 +8147,7 @@ impl StatusDeserializer {
     }
 }
 /// <p>A complex type that contains the status that one Amazon Route 53 health checker reports and the time of the health check.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct StatusReport {
     /// <p>The date and time that the health checker performed the health check in <a href="https://en.wikipedia.org/wiki/ISO_8601">ISO 8601 format</a> and Coordinated Universal Time (UTC). For example, the value <code>2017-03-27T17:48:16.751Z</code> represents March 27, 2017 at 17:48:16.751 UTC.</p>
     pub checked_time: Option<String>,
@@ -8257,7 +8257,7 @@ impl TTLSerializer {
 }
 
 /// <p>A complex type that contains information about a tag that you want to add or edit for the specified health check or hosted zone.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct Tag {
     /// <p><p>The value of <code>Key</code> depends on the operation that you want to perform:</p> <ul> <li> <p> <b>Add a tag to a health check or hosted zone</b>: <code>Key</code> is the name that you want to give the new tag.</p> </li> <li> <p> <b>Edit a tag</b>: <code>Key</code> is the name of the tag that you want to change the <code>Value</code> for.</p> </li> <li> <p> <b> Delete a key</b>: <code>Key</code> is the name of the tag you want to remove.</p> </li> <li> <p> <b>Give a name to a health check</b>: Edit the default <code>Name</code> tag. In the Amazon Route 53 console, the list of your health checks includes a <b>Name</b> column that lets you see the name that you&#39;ve given to each health check.</p> </li> </ul></p>
     pub key: Option<String>,
@@ -8582,7 +8582,7 @@ impl TagValueSerializer {
 }
 
 /// <p>Gets the value that Amazon Route 53 returns in response to a DNS request for a specified record name and type. You can optionally specify the IP address of a DNS resolver, an EDNS0 client subnet IP address, and a subnet mask. </p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct TestDNSAnswerRequest {
     /// <p>If the resolver that you specified for resolverip supports EDNS0, specify the IPv4 or IPv6 address of a client in the applicable location, for example, <code>192.0.2.44</code> or <code>2001:db8:85a3::8a2e:370:7334</code>.</p>
     pub edns0_client_subnet_ip: Option<String>,
@@ -8599,7 +8599,7 @@ pub struct TestDNSAnswerRequest {
 }
 
 /// <p>A complex type that contains the response to a <code>TestDNSAnswer</code> request. </p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct TestDNSAnswerResponse {
     /// <p>The Amazon Route 53 name server used to respond to the request.</p>
     pub nameserver: String,
@@ -8749,7 +8749,7 @@ impl TrafficPoliciesDeserializer {
     }
 }
 /// <p>A complex type that contains settings for a traffic policy.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct TrafficPolicy {
     /// <p>The comment that you specify in the <code>CreateTrafficPolicy</code> request, if any.</p>
     pub comment: Option<String>,
@@ -8934,7 +8934,7 @@ impl TrafficPolicyIdSerializer {
 }
 
 /// <p>A complex type that contains settings for the new traffic policy instance.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct TrafficPolicyInstance {
     /// <p>The ID of the hosted zone that Amazon Route 53 created resource record sets in.</p>
     pub hosted_zone_id: String,
@@ -9219,7 +9219,7 @@ impl TrafficPolicySummariesDeserializer {
     }
 }
 /// <p>A complex type that contains information about the latest version of one traffic policy that is associated with the current AWS account.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct TrafficPolicySummary {
     /// <p>The ID that Amazon Route 53 assigned to the traffic policy when you created it.</p>
     pub id: String,
@@ -9376,7 +9376,7 @@ impl TransportProtocolDeserializer {
     }
 }
 /// <p>A complex type that contains information about a request to update a health check.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct UpdateHealthCheckRequest {
     pub alarm_identifier: Option<AlarmIdentifier>,
     /// <p>A complex type that contains one <code>ChildHealthCheck</code> element for each health check that you want to associate with a <code>CALCULATED</code> health check.</p>
@@ -9480,7 +9480,7 @@ impl UpdateHealthCheckRequestSerializer {
         writer.write(xml::writer::XmlEvent::end_element())
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct UpdateHealthCheckResponse {
     pub health_check: HealthCheck,
 }
@@ -9526,7 +9526,7 @@ impl UpdateHealthCheckResponseDeserializer {
     }
 }
 /// <p>A request to update the comment for a hosted zone.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct UpdateHostedZoneCommentRequest {
     /// <p>The new comment for the hosted zone. If you don't specify a value for <code>Comment</code>, Amazon Route 53 deletes the existing value of the <code>Comment</code> element, if any.</p>
     pub comment: Option<String>,
@@ -9554,7 +9554,7 @@ impl UpdateHostedZoneCommentRequestSerializer {
     }
 }
 /// <p>A complex type that contains the response to the <code>UpdateHostedZoneComment</code> request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct UpdateHostedZoneCommentResponse {
     pub hosted_zone: HostedZone,
 }
@@ -9600,7 +9600,7 @@ impl UpdateHostedZoneCommentResponseDeserializer {
     }
 }
 /// <p>A complex type that contains information about the traffic policy that you want to update the comment for.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct UpdateTrafficPolicyCommentRequest {
     /// <p>The new comment for the specified traffic policy and version.</p>
     pub comment: String,
@@ -9628,7 +9628,7 @@ impl UpdateTrafficPolicyCommentRequestSerializer {
     }
 }
 /// <p>A complex type that contains the response information for the traffic policy.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct UpdateTrafficPolicyCommentResponse {
     /// <p>A complex type that contains settings for the specified traffic policy.</p>
     pub traffic_policy: TrafficPolicy,
@@ -9677,7 +9677,7 @@ impl UpdateTrafficPolicyCommentResponseDeserializer {
     }
 }
 /// <p>A complex type that contains information about the resource record sets that you want to update based on a specified traffic policy instance.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct UpdateTrafficPolicyInstanceRequest {
     /// <p>The ID of the traffic policy instance that you want to update.</p>
     pub id: String,
@@ -9717,7 +9717,7 @@ impl UpdateTrafficPolicyInstanceRequestSerializer {
     }
 }
 /// <p>A complex type that contains information about the resource record sets that Amazon Route 53 created based on a specified traffic policy.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct UpdateTrafficPolicyInstanceResponse {
     /// <p>A complex type that contains settings for the updated traffic policy instance.</p>
     pub traffic_policy_instance: TrafficPolicyInstance,
@@ -9781,7 +9781,7 @@ impl UsageCountDeserializer {
     }
 }
 /// <p>(Private hosted zones only) A complex type that contains information about an Amazon VPC.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct VPC {
     pub vpc_id: Option<String>,
     /// <p>(Private hosted zones only) The region in which you created an Amazon VPC.</p>
diff --git a/rusoto/services/route53domains/Cargo.toml b/rusoto/services/route53domains/Cargo.toml
index 70ec6105fe0..781933a85f6 100644
--- a/rusoto/services/route53domains/Cargo.toml
+++ b/rusoto/services/route53domains/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon Route 53 Domains @ 2014-05-15"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_route53domains/index.html"
 keywords = ["AWS", "Amazon", "route53domains"]
 license = "MIT"
 name = "rusoto_route53domains"
diff --git a/rusoto/services/s3/Cargo.toml b/rusoto/services/s3/Cargo.toml
index 3e641016e65..e8a0672543f 100644
--- a/rusoto/services/s3/Cargo.toml
+++ b/rusoto/services/s3/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon Simple Storage Service @ 2006-03-01"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_s3/index.html"
 keywords = ["AWS", "Amazon", "s3"]
 license = "MIT"
 name = "rusoto_s3"
diff --git a/rusoto/services/s3/src/generated.rs b/rusoto/services/s3/src/generated.rs
index 4bbae7936ec..43ea9384e34 100644
--- a/rusoto/services/s3/src/generated.rs
+++ b/rusoto/services/s3/src/generated.rs
@@ -47,7 +47,7 @@ enum DeserializerNext {
 use md5;
 use base64;
 /// <p>Specifies the days since the initiation of an Incomplete Multipart Upload that Lifecycle will wait before permanently removing all parts of the upload.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct AbortIncompleteMultipartUpload {
     /// <p>Indicates the number of days that must pass since initiation for Lifecycle to abort an Incomplete Multipart Upload.</p>
     pub days_after_initiation: Option<i64>,
@@ -121,7 +121,7 @@ impl AbortIncompleteMultipartUploadSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct AbortMultipartUploadOutput {
     pub request_charged: Option<String>,
 }
@@ -142,7 +142,7 @@ impl AbortMultipartUploadOutputDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct AbortMultipartUploadRequest {
     pub bucket: String,
     pub key: String,
@@ -150,7 +150,7 @@ pub struct AbortMultipartUploadRequest {
     pub upload_id: String,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct AccelerateConfiguration {
     /// <p>The accelerate configuration of the bucket.</p>
     pub status: Option<String>,
@@ -180,7 +180,7 @@ impl AccelerateConfigurationSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct AccessControlPolicy {
     /// <p>A list of grants.</p>
     pub grants: Option<Vec<Grant>>,
@@ -210,7 +210,7 @@ impl AccessControlPolicySerializer {
 }
 
 /// <p>Container for information regarding the access control for replicas.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct AccessControlTranslation {
     /// <p>The override value for the owner of the replica object.</p>
     pub owner: String,
@@ -559,7 +559,7 @@ impl AllowedOriginsSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct AnalyticsAndOperator {
     /// <p>The prefix to use when evaluating an AND predicate.</p>
     pub prefix: Option<String>,
@@ -637,7 +637,7 @@ impl AnalyticsAndOperatorSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct AnalyticsConfiguration {
     /// <p>The filter used to describe a set of objects for analyses. A filter must have exactly one prefix, one tag, or one conjunction (AnalyticsAndOperator). If no filter is provided, all objects will be considered in any analysis.</p>
     pub filter: Option<AnalyticsFilter>,
@@ -758,7 +758,7 @@ impl AnalyticsConfigurationListDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct AnalyticsExportDestination {
     /// <p>A destination signifying output to an S3 bucket.</p>
     pub s3_bucket_destination: AnalyticsS3BucketDestination,
@@ -829,7 +829,7 @@ impl AnalyticsExportDestinationSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct AnalyticsFilter {
     /// <p>A conjunction (logical AND) of predicates, which is used in evaluating an analytics filter. The operator must have at least two predicates.</p>
     pub and: Option<AnalyticsAndOperator>,
@@ -953,7 +953,7 @@ impl AnalyticsIdSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct AnalyticsS3BucketDestination {
     /// <p>The Amazon resource name (ARN) of the bucket to which data is exported.</p>
     pub bucket: String,
@@ -1149,7 +1149,7 @@ impl BodySerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct Bucket {
     /// <p>Date the bucket was created.</p>
     pub creation_date: Option<String>,
@@ -1237,7 +1237,7 @@ impl BucketAccelerateStatusSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct BucketLifecycleConfiguration {
     pub rules: Vec<LifecycleRule>,
 }
@@ -1294,7 +1294,7 @@ impl BucketLocationConstraintSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct BucketLoggingStatus {
     pub logging_enabled: Option<LoggingEnabled>,
 }
@@ -1463,7 +1463,7 @@ impl BucketsDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CORSConfiguration {
     pub cors_rules: Vec<CORSRule>,
 }
@@ -1485,7 +1485,7 @@ impl CORSConfigurationSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CORSRule {
     /// <p>Specifies which headers are allowed in a pre-flight OPTIONS request.</p>
     pub allowed_headers: Option<Vec<String>>,
@@ -1642,7 +1642,7 @@ impl CORSRulesSerializer {
 }
 
 /// <p>Describes how a CSV-formatted input object is formatted.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CSVInput {
     /// <p>Single character used to indicate a row should be ignored when present at the start of a row.</p>
     pub comments: Option<String>,
@@ -1723,7 +1723,7 @@ impl CSVInputSerializer {
 }
 
 /// <p>Describes how CSV-formatted results are formatted.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CSVOutput {
     /// <p>Value used to separate individual fields in a record.</p>
     pub field_delimiter: Option<String>,
@@ -1828,7 +1828,7 @@ impl CloudFunctionSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CloudFunctionConfiguration {
     pub cloud_function: Option<String>,
     pub events: Option<Vec<String>>,
@@ -2005,7 +2005,7 @@ impl CommentsSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CommonPrefix {
     pub prefix: Option<String>,
 }
@@ -2074,7 +2074,7 @@ impl CommonPrefixListDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CompleteMultipartUploadOutput {
     pub bucket: Option<String>,
     /// <p>Entity tag of the object.</p>
@@ -2142,7 +2142,7 @@ impl CompleteMultipartUploadOutputDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CompleteMultipartUploadRequest {
     pub bucket: String,
     pub key: String,
@@ -2151,7 +2151,7 @@ pub struct CompleteMultipartUploadRequest {
     pub upload_id: String,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CompletedMultipartUpload {
     pub parts: Option<Vec<CompletedPart>>,
 }
@@ -2175,7 +2175,7 @@ impl CompletedMultipartUploadSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CompletedPart {
     /// <p>Entity tag returned when the part was uploaded.</p>
     pub e_tag: Option<String>,
@@ -2233,7 +2233,7 @@ impl CompletedPartListSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct Condition {
     /// <p>The HTTP error code when the redirect is applied. In the event of an error, if the error code equals this value, then the specified redirect is applied. Required when parent element Condition is specified and sibling KeyPrefixEquals is not specified. If both are specified, then both must be true for the redirect to be applied.</p>
     pub http_error_code_returned_equals: Option<String>,
@@ -2324,7 +2324,7 @@ impl ConditionSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CopyObjectOutput {
     pub copy_object_result: Option<CopyObjectResult>,
     pub copy_source_version_id: Option<String>,
@@ -2384,7 +2384,7 @@ impl CopyObjectOutputDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CopyObjectRequest {
     /// <p>The canned ACL to apply to the object.</p>
     pub acl: Option<String>,
@@ -2451,7 +2451,7 @@ pub struct CopyObjectRequest {
     pub website_redirect_location: Option<String>,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CopyObjectResult {
     pub e_tag: Option<String>,
     pub last_modified: Option<String>,
@@ -2502,7 +2502,7 @@ impl CopyObjectResultDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CopyPartResult {
     /// <p>Entity tag of the object.</p>
     pub e_tag: Option<String>,
@@ -2555,7 +2555,7 @@ impl CopyPartResultDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CreateBucketConfiguration {
     /// <p>Specifies the region where the bucket will be created. If you don&#39;t specify a region, the bucket will be created in US Standard.</p>
     pub location_constraint: Option<String>,
@@ -2585,7 +2585,7 @@ impl CreateBucketConfigurationSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CreateBucketOutput {
     pub location: Option<String>,
 }
@@ -2606,7 +2606,7 @@ impl CreateBucketOutputDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CreateBucketRequest {
     /// <p>The canned ACL to apply to the bucket.</p>
     pub acl: Option<String>,
@@ -2624,7 +2624,7 @@ pub struct CreateBucketRequest {
     pub grant_write_acp: Option<String>,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CreateMultipartUploadOutput {
     /// <p>Date when multipart upload will become eligible for abort operation by lifecycle.</p>
     pub abort_date: Option<String>,
@@ -2696,7 +2696,7 @@ impl CreateMultipartUploadOutputDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct CreateMultipartUploadRequest {
     /// <p>The canned ACL to apply to the object.</p>
     pub acl: Option<String>,
@@ -2862,7 +2862,7 @@ impl DaysAfterInitiationSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct Delete {
     pub objects: Vec<ObjectIdentifier>,
     /// <p>Element to enable quiet mode for the request. When you add this element, you must set its value to true.</p>
@@ -2894,7 +2894,7 @@ impl DeleteSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct DeleteBucketAnalyticsConfigurationRequest {
     /// <p>The name of the bucket from which an analytics configuration is deleted.</p>
     pub bucket: String,
@@ -2902,18 +2902,18 @@ pub struct DeleteBucketAnalyticsConfigurationRequest {
     pub id: String,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct DeleteBucketCorsRequest {
     pub bucket: String,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct DeleteBucketEncryptionRequest {
     /// <p>The name of the bucket containing the server-side encryption configuration to delete.</p>
     pub bucket: String,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct DeleteBucketInventoryConfigurationRequest {
     /// <p>The name of the bucket containing the inventory configuration to delete.</p>
     pub bucket: String,
@@ -2921,12 +2921,12 @@ pub struct DeleteBucketInventoryConfigurationRequest {
     pub id: String,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct DeleteBucketLifecycleRequest {
     pub bucket: String,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct DeleteBucketMetricsConfigurationRequest {
     /// <p>The name of the bucket containing the metrics configuration to delete.</p>
     pub bucket: String,
@@ -2934,27 +2934,27 @@ pub struct DeleteBucketMetricsConfigurationRequest {
     pub id: String,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct DeleteBucketPolicyRequest {
     pub bucket: String,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct DeleteBucketReplicationRequest {
     pub bucket: String,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct DeleteBucketRequest {
     pub bucket: String,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct DeleteBucketTaggingRequest {
     pub bucket: String,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct DeleteBucketWebsiteRequest {
     pub bucket: String,
 }
@@ -2973,7 +2973,7 @@ impl DeleteMarkerDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct DeleteMarkerEntry {
     /// <p>Specifies whether the object is (true) or is not (false) the latest version of an object.</p>
     pub is_latest: Option<bool>,
@@ -3086,7 +3086,7 @@ impl DeleteMarkersDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct DeleteObjectOutput {
     /// <p>Specifies whether the versioned object that was permanently deleted was (true) or was not (false) a delete marker.</p>
     pub delete_marker: Option<bool>,
@@ -3111,7 +3111,7 @@ impl DeleteObjectOutputDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct DeleteObjectRequest {
     pub bucket: String,
     pub key: String,
@@ -3122,7 +3122,7 @@ pub struct DeleteObjectRequest {
     pub version_id: Option<String>,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct DeleteObjectTaggingOutput {
     /// <p>The versionId of the object the tag-set was removed from.</p>
     pub version_id: Option<String>,
@@ -3144,7 +3144,7 @@ impl DeleteObjectTaggingOutputDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct DeleteObjectTaggingRequest {
     pub bucket: String,
     pub key: String,
@@ -3152,7 +3152,7 @@ pub struct DeleteObjectTaggingRequest {
     pub version_id: Option<String>,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct DeleteObjectsOutput {
     pub deleted: Option<Vec<DeletedObject>>,
     pub errors: Option<Vec<S3Error>>,
@@ -3204,7 +3204,7 @@ impl DeleteObjectsOutputDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct DeleteObjectsRequest {
     pub bucket: String,
     pub delete: Delete,
@@ -3213,7 +3213,7 @@ pub struct DeleteObjectsRequest {
     pub request_payer: Option<String>,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct DeletedObject {
     pub delete_marker: Option<bool>,
     pub delete_marker_version_id: Option<String>,
@@ -3363,7 +3363,7 @@ impl DescriptionSerializer {
 }
 
 /// <p>Container for replication destination information.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct Destination {
     /// <p>Container for information regarding the access control for replicas.</p>
     pub access_control_translation: Option<AccessControlTranslation>,
@@ -3634,7 +3634,7 @@ impl EncodingTypeSerializer {
 }
 
 /// <p>Describes the server-side encryption that will be applied to the restore results.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct Encryption {
     /// <p>The server-side encryption algorithm used when storing job results in Amazon S3 (e.g., AES256, aws:kms).</p>
     pub encryption_type: String,
@@ -3683,7 +3683,7 @@ impl EncryptionSerializer {
 }
 
 /// <p>Container for information regarding encryption based configuration for replicas.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct EncryptionConfiguration {
     /// <p>The id of the KMS key used to encrypt the replica object.</p>
     pub replica_kms_key_id: Option<String>,
@@ -3755,7 +3755,7 @@ impl EncryptionConfigurationSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct S3Error {
     pub code: Option<String>,
     pub key: Option<String>,
@@ -3815,7 +3815,7 @@ impl S3ErrorDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ErrorDocument {
     /// <p>The object key name to use when a 4XX class error occurs.</p>
     pub key: String,
@@ -4237,7 +4237,7 @@ impl FileHeaderInfoSerializer {
 }
 
 /// <p>Container for key value pair that defines the criteria for the filter rule.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct FilterRule {
     /// <p>Object key name prefix or suffix identifying one or more objects to which the filtering rule applies. Maximum prefix length can be up to 1,024 characters. Overlapping prefixes and suffixes are not supported. For more information, go to <a href="http://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html">Configuring Event Notifications</a> in the Amazon Simple Storage Service Developer Guide.</p>
     pub name: Option<String>,
@@ -4437,7 +4437,7 @@ impl FilterRuleValueSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetBucketAccelerateConfigurationOutput {
     /// <p>The accelerate configuration of the bucket.</p>
     pub status: Option<String>,
@@ -4485,13 +4485,13 @@ impl GetBucketAccelerateConfigurationOutputDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetBucketAccelerateConfigurationRequest {
     /// <p>Name of the bucket for which the accelerate configuration is retrieved.</p>
     pub bucket: String,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetBucketAclOutput {
     /// <p>A list of grants.</p>
     pub grants: Option<Vec<Grant>>,
@@ -4543,12 +4543,12 @@ impl GetBucketAclOutputDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetBucketAclRequest {
     pub bucket: String,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetBucketAnalyticsConfigurationOutput {
     /// <p>The configuration and any analyses for the analytics filter.</p>
     pub analytics_configuration: Option<AnalyticsConfiguration>,
@@ -4597,7 +4597,7 @@ impl GetBucketAnalyticsConfigurationOutputDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetBucketAnalyticsConfigurationRequest {
     /// <p>The name of the bucket from which an analytics configuration is retrieved.</p>
     pub bucket: String,
@@ -4605,7 +4605,7 @@ pub struct GetBucketAnalyticsConfigurationRequest {
     pub id: String,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetBucketCorsOutput {
     pub cors_rules: Option<Vec<CORSRule>>,
 }
@@ -4650,12 +4650,12 @@ impl GetBucketCorsOutputDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetBucketCorsRequest {
     pub bucket: String,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetBucketEncryptionOutput {
     pub server_side_encryption_configuration: Option<ServerSideEncryptionConfiguration>,
 }
@@ -4704,13 +4704,13 @@ impl GetBucketEncryptionOutputDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetBucketEncryptionRequest {
     /// <p>The name of the bucket from which the server-side encryption configuration is retrieved.</p>
     pub bucket: String,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetBucketInventoryConfigurationOutput {
     /// <p>Specifies the inventory configuration.</p>
     pub inventory_configuration: Option<InventoryConfiguration>,
@@ -4759,7 +4759,7 @@ impl GetBucketInventoryConfigurationOutputDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetBucketInventoryConfigurationRequest {
     /// <p>The name of the bucket containing the inventory configuration to retrieve.</p>
     pub bucket: String,
@@ -4767,7 +4767,7 @@ pub struct GetBucketInventoryConfigurationRequest {
     pub id: String,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetBucketLifecycleConfigurationOutput {
     pub rules: Option<Vec<LifecycleRule>>,
 }
@@ -4812,12 +4812,12 @@ impl GetBucketLifecycleConfigurationOutputDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetBucketLifecycleConfigurationRequest {
     pub bucket: String,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetBucketLifecycleOutput {
     pub rules: Option<Vec<Rule>>,
 }
@@ -4861,12 +4861,12 @@ impl GetBucketLifecycleOutputDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetBucketLifecycleRequest {
     pub bucket: String,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetBucketLocationOutput {
     pub location_constraint: Option<String>,
 }
@@ -4886,12 +4886,12 @@ impl GetBucketLocationOutputDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetBucketLocationRequest {
     pub bucket: String,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetBucketLoggingOutput {
     pub logging_enabled: Option<LoggingEnabled>,
 }
@@ -4938,12 +4938,12 @@ impl GetBucketLoggingOutputDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetBucketLoggingRequest {
     pub bucket: String,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetBucketMetricsConfigurationOutput {
     /// <p>Specifies the metrics configuration.</p>
     pub metrics_configuration: Option<MetricsConfiguration>,
@@ -4992,7 +4992,7 @@ impl GetBucketMetricsConfigurationOutputDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetBucketMetricsConfigurationRequest {
     /// <p>The name of the bucket containing the metrics configuration to retrieve.</p>
     pub bucket: String,
@@ -5000,24 +5000,24 @@ pub struct GetBucketMetricsConfigurationRequest {
     pub id: String,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetBucketNotificationConfigurationRequest {
     /// <p>Name of the bucket to get the notification configuration for.</p>
     pub bucket: String,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetBucketPolicyOutput {
     /// <p>The bucket policy as a JSON document.</p>
     pub policy: Option<String>,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetBucketPolicyRequest {
     pub bucket: String,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetBucketReplicationOutput {
     pub replication_configuration: Option<ReplicationConfiguration>,
 }
@@ -5065,12 +5065,12 @@ impl GetBucketReplicationOutputDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetBucketReplicationRequest {
     pub bucket: String,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetBucketRequestPaymentOutput {
     /// <p>Specifies who pays for the download and request fees.</p>
     pub payer: Option<String>,
@@ -5115,12 +5115,12 @@ impl GetBucketRequestPaymentOutputDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetBucketRequestPaymentRequest {
     pub bucket: String,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetBucketTaggingOutput {
     pub tag_set: Vec<Tag>,
 }
@@ -5164,12 +5164,12 @@ impl GetBucketTaggingOutputDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetBucketTaggingRequest {
     pub bucket: String,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetBucketVersioningOutput {
     /// <p>Specifies whether MFA delete is enabled in the bucket versioning configuration. This element is only returned if the bucket has been configured with MFA delete. If the bucket has never been so configured, this element is not returned.</p>
     pub mfa_delete: Option<String>,
@@ -5225,12 +5225,12 @@ impl GetBucketVersioningOutputDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetBucketVersioningRequest {
     pub bucket: String,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetBucketWebsiteOutput {
     pub error_document: Option<ErrorDocument>,
     pub index_document: Option<IndexDocument>,
@@ -5299,12 +5299,12 @@ impl GetBucketWebsiteOutputDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetBucketWebsiteRequest {
     pub bucket: String,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetObjectAclOutput {
     /// <p>A list of grants.</p>
     pub grants: Option<Vec<Grant>>,
@@ -5357,7 +5357,7 @@ impl GetObjectAclOutputDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetObjectAclRequest {
     pub bucket: String,
     pub key: String,
@@ -5422,7 +5422,7 @@ pub struct GetObjectOutput {
     pub website_redirect_location: Option<String>,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetObjectRequest {
     pub bucket: String,
     /// <p>Return the object only if its entity tag (ETag) is the same as the one specified, otherwise return a 412 (precondition failed).</p>
@@ -5461,7 +5461,7 @@ pub struct GetObjectRequest {
     pub version_id: Option<String>,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetObjectTaggingOutput {
     pub tag_set: Vec<Tag>,
     pub version_id: Option<String>,
@@ -5506,7 +5506,7 @@ impl GetObjectTaggingOutputDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetObjectTaggingRequest {
     pub bucket: String,
     pub key: String,
@@ -5519,14 +5519,14 @@ pub struct GetObjectTorrentOutput {
     pub request_charged: Option<String>,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GetObjectTorrentRequest {
     pub bucket: String,
     pub key: String,
     pub request_payer: Option<String>,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct GlacierJobParameters {
     /// <p>Glacier retrieval tier at which the restore will be processed.</p>
     pub tier: String,
@@ -5554,7 +5554,7 @@ impl GlacierJobParametersSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct Grant {
     pub grantee: Option<Grantee>,
     /// <p>Specifies the permission given to the grantee.</p>
@@ -5635,7 +5635,7 @@ impl GrantSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct Grantee {
     /// <p>Screen name of the grantee.</p>
     pub display_name: Option<String>,
@@ -5822,12 +5822,12 @@ impl GrantsSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct HeadBucketRequest {
     pub bucket: String,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct HeadObjectOutput {
     pub accept_ranges: Option<String>,
     /// <p>Specifies caching behavior along the request/reply chain.</p>
@@ -5893,7 +5893,7 @@ impl HeadObjectOutputDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct HeadObjectRequest {
     pub bucket: String,
     /// <p>Return the object only if its entity tag (ETag) is the same as the one specified, otherwise return a 412 (precondition failed).</p>
@@ -6060,7 +6060,7 @@ impl IDSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct IndexDocument {
     /// <p>A suffix that is appended to a request that is for a directory on the website endpoint (e.g. if the suffix is index.html and you make a request to samplebucket/images/ the data that is returned will be for the object with the key name images/index.html) The suffix must not be empty and must not include a slash character.</p>
     pub suffix: String,
@@ -6142,7 +6142,7 @@ impl InitiatedDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct Initiator {
     /// <p>Name of the Principal.</p>
     pub display_name: Option<String>,
@@ -6196,7 +6196,7 @@ impl InitiatorDeserializer {
     }
 }
 /// <p>Describes the serialization format of the object.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct InputSerialization {
     /// <p>Describes the serialization of a CSV-encoded object.</p>
     pub csv: Option<CSVInput>,
@@ -6221,7 +6221,7 @@ impl InputSerializationSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct InventoryConfiguration {
     /// <p>Contains information about where to publish the inventory results.</p>
     pub destination: InventoryDestination,
@@ -6387,7 +6387,7 @@ impl InventoryConfigurationListDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct InventoryDestination {
     /// <p>Contains the bucket name, file format, bucket owner (optional), and prefix (optional) where inventory results are published.</p>
     pub s3_bucket_destination: InventoryS3BucketDestination,
@@ -6459,7 +6459,7 @@ impl InventoryDestinationSerializer {
 }
 
 /// <p>Contains the type of server-side encryption used to encrypt the inventory results.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct InventoryEncryption {
     /// <p>Specifies the use of SSE-KMS to encrypt delievered Inventory reports.</p>
     pub ssekms: Option<SSEKMS>,
@@ -6532,7 +6532,7 @@ impl InventoryEncryptionSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct InventoryFilter {
     /// <p>The prefix that an object must have to be included in the inventory results.</p>
     pub prefix: String,
@@ -6839,7 +6839,7 @@ impl InventoryOptionalFieldsSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct InventoryS3BucketDestination {
     /// <p>The ID of the account that owns the destination bucket.</p>
     pub account_id: Option<String>,
@@ -6957,7 +6957,7 @@ impl InventoryS3BucketDestinationSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct InventorySchedule {
     /// <p>Specifies how frequently inventory results are produced.</p>
     pub frequency: String,
@@ -7232,7 +7232,7 @@ impl LambdaFunctionArnSerializer {
 }
 
 /// <p>Container for specifying the AWS Lambda notification configuration.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct LambdaFunctionConfiguration {
     pub events: Vec<String>,
     pub filter: Option<NotificationConfigurationFilter>,
@@ -7392,7 +7392,7 @@ impl LastModifiedDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct LifecycleConfiguration {
     pub rules: Vec<Rule>,
 }
@@ -7414,7 +7414,7 @@ impl LifecycleConfigurationSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct LifecycleExpiration {
     /// <p>Indicates at what date the object is to be moved or deleted. Should be in GMT ISO 8601 Format.</p>
     pub date: Option<String>,
@@ -7516,7 +7516,7 @@ impl LifecycleExpirationSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct LifecycleRule {
     pub abort_incomplete_multipart_upload: Option<AbortIncompleteMultipartUpload>,
     pub expiration: Option<LifecycleExpiration>,
@@ -7676,7 +7676,7 @@ impl LifecycleRuleSerializer {
 }
 
 /// <p>This is used in a Lifecycle Rule Filter to apply a logical AND to two or more predicates. The Lifecycle Rule will apply to any object matching all of the predicates configured inside the And operator.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct LifecycleRuleAndOperator {
     pub prefix: Option<String>,
     /// <p>All of these tags must exist in the object&#39;s tag set in order for the rule to apply.</p>
@@ -7754,7 +7754,7 @@ impl LifecycleRuleAndOperatorSerializer {
 }
 
 /// <p>The Filter is used to identify objects that a Lifecycle Rule applies to. A Filter must have exactly one of Prefix, Tag, or And specified.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct LifecycleRuleFilter {
     pub and: Option<LifecycleRuleAndOperator>,
     /// <p>Prefix identifying one or more objects to which the rule applies.</p>
@@ -7889,7 +7889,7 @@ impl LifecycleRulesSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListBucketAnalyticsConfigurationsOutput {
     /// <p>The list of analytics configurations for a bucket.</p>
     pub analytics_configuration_list: Option<Vec<AnalyticsConfiguration>>,
@@ -7961,7 +7961,7 @@ impl ListBucketAnalyticsConfigurationsOutputDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListBucketAnalyticsConfigurationsRequest {
     /// <p>The name of the bucket from which analytics configurations are retrieved.</p>
     pub bucket: String,
@@ -7969,7 +7969,7 @@ pub struct ListBucketAnalyticsConfigurationsRequest {
     pub continuation_token: Option<String>,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListBucketInventoryConfigurationsOutput {
     /// <p>If sent in the request, the marker that is used as a starting point for this inventory configuration list response.</p>
     pub continuation_token: Option<String>,
@@ -8041,7 +8041,7 @@ impl ListBucketInventoryConfigurationsOutputDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListBucketInventoryConfigurationsRequest {
     /// <p>The name of the bucket containing the inventory configurations to retrieve.</p>
     pub bucket: String,
@@ -8049,7 +8049,7 @@ pub struct ListBucketInventoryConfigurationsRequest {
     pub continuation_token: Option<String>,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListBucketMetricsConfigurationsOutput {
     /// <p>The marker that is used as a starting point for this metrics configuration list response. This value is present if it was sent in the request.</p>
     pub continuation_token: Option<String>,
@@ -8121,7 +8121,7 @@ impl ListBucketMetricsConfigurationsOutputDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListBucketMetricsConfigurationsRequest {
     /// <p>The name of the bucket containing the metrics configurations to retrieve.</p>
     pub bucket: String,
@@ -8129,7 +8129,7 @@ pub struct ListBucketMetricsConfigurationsRequest {
     pub continuation_token: Option<String>,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListBucketsOutput {
     pub buckets: Option<Vec<Bucket>>,
     pub owner: Option<Owner>,
@@ -8178,7 +8178,7 @@ impl ListBucketsOutputDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListMultipartUploadsOutput {
     /// <p>Name of the bucket to which the multipart upload was initiated.</p>
     pub bucket: Option<String>,
@@ -8301,7 +8301,7 @@ impl ListMultipartUploadsOutputDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListMultipartUploadsRequest {
     pub bucket: String,
     /// <p>Character you use to group keys.</p>
@@ -8317,7 +8317,7 @@ pub struct ListMultipartUploadsRequest {
     pub upload_id_marker: Option<String>,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListObjectVersionsOutput {
     pub common_prefixes: Option<Vec<CommonPrefix>>,
     pub delete_markers: Option<Vec<DeleteMarkerEntry>>,
@@ -8440,7 +8440,7 @@ impl ListObjectVersionsOutputDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListObjectVersionsRequest {
     pub bucket: String,
     /// <p>A delimiter is a character you use to group keys.</p>
@@ -8456,7 +8456,7 @@ pub struct ListObjectVersionsRequest {
     pub version_id_marker: Option<String>,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListObjectsOutput {
     pub common_prefixes: Option<Vec<CommonPrefix>>,
     pub contents: Option<Vec<Object>>,
@@ -8553,7 +8553,7 @@ impl ListObjectsOutputDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListObjectsRequest {
     pub bucket: String,
     /// <p>A delimiter is a character you use to group keys.</p>
@@ -8569,7 +8569,7 @@ pub struct ListObjectsRequest {
     pub request_payer: Option<String>,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListObjectsV2Output {
     /// <p>CommonPrefixes contains all (if there are any) keys between Prefix and the next occurrence of the string specified by delimiter</p>
     pub common_prefixes: Option<Vec<CommonPrefix>>,
@@ -8689,7 +8689,7 @@ impl ListObjectsV2OutputDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListObjectsV2Request {
     /// <p>Name of the bucket to list.</p>
     pub bucket: String,
@@ -8711,7 +8711,7 @@ pub struct ListObjectsV2Request {
     pub start_after: Option<String>,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListPartsOutput {
     /// <p>Date when multipart upload will become eligible for abort operation by lifecycle.</p>
     pub abort_date: Option<String>,
@@ -8827,7 +8827,7 @@ impl ListPartsOutputDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ListPartsRequest {
     pub bucket: String,
     pub key: String,
@@ -8875,7 +8875,7 @@ impl LocationPrefixSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct LoggingEnabled {
     /// <p>Specifies the bucket where you want Amazon S3 to store server access logs. You can have your logs delivered to any bucket that you own, including the same bucket that is being logged. You can also configure multiple buckets to deliver their logs to the same target bucket. In this case you should choose a different TargetPrefix for each source bucket so that the delivered log files can be distinguished by key.</p>
     pub target_bucket: Option<String>,
@@ -9198,7 +9198,7 @@ impl MessageDeserializer {
     }
 }
 /// <p>A metadata key-value pair to store with an object.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct MetadataEntry {
     pub name: Option<String>,
     pub value: Option<String>,
@@ -9276,7 +9276,7 @@ impl MetadataValueSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct MetricsAndOperator {
     /// <p>The prefix used when evaluating an AND predicate.</p>
     pub prefix: Option<String>,
@@ -9354,7 +9354,7 @@ impl MetricsAndOperatorSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct MetricsConfiguration {
     /// <p>Specifies a metrics configuration filter. The metrics configuration will only include objects that meet the filter&#39;s criteria. A filter must be a prefix, a tag, or a conjunction (MetricsAndOperator).</p>
     pub filter: Option<MetricsFilter>,
@@ -9461,7 +9461,7 @@ impl MetricsConfigurationListDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct MetricsFilter {
     /// <p>A conjunction (logical AND) of predicates, which is used in evaluating a metrics filter. The operator must have at least two predicates, and an object must match all of the predicates in order for the filter to apply.</p>
     pub and: Option<MetricsAndOperator>,
@@ -9585,7 +9585,7 @@ impl MetricsIdSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct MultipartUpload {
     /// <p>Date and time at which the multipart upload was initiated.</p>
     pub initiated: Option<String>,
@@ -9810,7 +9810,7 @@ impl NextVersionIdMarkerDeserializer {
     }
 }
 /// <p>Specifies when noncurrent object versions expire. Upon expiration, Amazon S3 permanently deletes the noncurrent object versions. You set this lifecycle configuration action on a bucket that has versioning enabled (or suspended) to request that Amazon S3 delete noncurrent object versions at a specific period in the object&#39;s lifetime.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct NoncurrentVersionExpiration {
     /// <p>Specifies the number of days an object is noncurrent before Amazon S3 can perform the associated action. For information about the noncurrent days calculations, see <a href="http://docs.aws.amazon.com/AmazonS3/latest/dev/s3-access-control.html">How Amazon S3 Calculates When an Object Became Noncurrent</a> in the Amazon Simple Storage Service Developer Guide.</p>
     pub noncurrent_days: Option<i64>,
@@ -9882,7 +9882,7 @@ impl NoncurrentVersionExpirationSerializer {
 }
 
 /// <p>Container for the transition rule that describes when noncurrent objects transition to the STANDARD<em>IA or GLACIER storage class. If your bucket is versioning-enabled (or versioning is suspended), you can set this action to request that Amazon S3 transition noncurrent object versions to the STANDARD</em>IA or GLACIER storage class at a specific period in the object&#39;s lifetime.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct NoncurrentVersionTransition {
     /// <p>Specifies the number of days an object is noncurrent before Amazon S3 can perform the associated action. For information about the noncurrent days calculations, see <a href="http://docs.aws.amazon.com/AmazonS3/latest/dev/s3-access-control.html">How Amazon S3 Calculates When an Object Became Noncurrent</a> in the Amazon Simple Storage Service Developer Guide.</p>
     pub noncurrent_days: Option<i64>,
@@ -10016,7 +10016,7 @@ impl NoncurrentVersionTransitionListSerializer {
 }
 
 /// <p>Container for specifying the notification configuration of the bucket. If this element is empty, notifications are turned off on the bucket.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct NotificationConfiguration {
     pub lambda_function_configurations: Option<Vec<LambdaFunctionConfiguration>>,
     pub queue_configurations: Option<Vec<QueueConfiguration>>,
@@ -10111,7 +10111,7 @@ impl NotificationConfigurationSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct NotificationConfigurationDeprecated {
     pub cloud_function_configuration: Option<CloudFunctionConfiguration>,
     pub queue_configuration: Option<QueueConfigurationDeprecated>,
@@ -10216,7 +10216,7 @@ impl NotificationConfigurationDeprecatedSerializer {
 }
 
 /// <p>Container for object key name filtering rules. For information about key name filtering, go to <a href="http://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html">Configuring Event Notifications</a> in the Amazon Simple Storage Service Developer Guide.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct NotificationConfigurationFilter {
     pub key: Option<S3KeyFilter>,
 }
@@ -10315,7 +10315,7 @@ impl NotificationIdSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct Object {
     pub e_tag: Option<String>,
     pub key: Option<String>,
@@ -10406,7 +10406,7 @@ impl ObjectCannedACLSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ObjectIdentifier {
     /// <p>Key name of the object to delete.</p>
     pub key: String,
@@ -10536,7 +10536,7 @@ impl ObjectStorageClassDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ObjectVersion {
     pub e_tag: Option<String>,
     /// <p>Specifies whether the object is (true) or is not (false) the latest version of an object.</p>
@@ -10703,7 +10703,7 @@ impl ObjectVersionStorageClassDeserializer {
     }
 }
 /// <p>Describes the location where the restore job&#39;s output is stored.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct OutputLocation {
     /// <p>Describes an S3 location that will receive the results of the restore request.</p>
     pub s3: Option<S3Location>,
@@ -10729,7 +10729,7 @@ impl OutputLocationSerializer {
 }
 
 /// <p>Describes how results of the Select job are serialized.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct OutputSerialization {
     /// <p>Describes the serialization of CSV-encoded Select results.</p>
     pub csv: Option<CSVOutput>,
@@ -10754,7 +10754,7 @@ impl OutputSerializationSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct Owner {
     pub display_name: Option<String>,
     pub id: Option<String>,
@@ -10873,7 +10873,7 @@ impl OwnerOverrideSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct Part {
     /// <p>Entity tag returned when the part was uploaded.</p>
     pub e_tag: Option<String>,
@@ -11194,7 +11194,7 @@ impl ProtocolSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct PutBucketAccelerateConfigurationRequest {
     /// <p>Specifies the Accelerate Configuration you want to set for the bucket.</p>
     pub accelerate_configuration: AccelerateConfiguration,
@@ -11202,7 +11202,7 @@ pub struct PutBucketAccelerateConfigurationRequest {
     pub bucket: String,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct PutBucketAclRequest {
     /// <p>The canned ACL to apply to the bucket.</p>
     pub acl: Option<String>,
@@ -11221,7 +11221,7 @@ pub struct PutBucketAclRequest {
     pub grant_write_acp: Option<String>,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct PutBucketAnalyticsConfigurationRequest {
     /// <p>The configuration and any analyses for the analytics filter.</p>
     pub analytics_configuration: AnalyticsConfiguration,
@@ -11231,14 +11231,14 @@ pub struct PutBucketAnalyticsConfigurationRequest {
     pub id: String,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct PutBucketCorsRequest {
     pub bucket: String,
     pub cors_configuration: CORSConfiguration,
     pub content_md5: Option<String>,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct PutBucketEncryptionRequest {
     /// <p>The name of the bucket for which the server-side encryption configuration is set.</p>
     pub bucket: String,
@@ -11247,7 +11247,7 @@ pub struct PutBucketEncryptionRequest {
     pub server_side_encryption_configuration: ServerSideEncryptionConfiguration,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct PutBucketInventoryConfigurationRequest {
     /// <p>The name of the bucket where the inventory configuration will be stored.</p>
     pub bucket: String,
@@ -11257,27 +11257,27 @@ pub struct PutBucketInventoryConfigurationRequest {
     pub inventory_configuration: InventoryConfiguration,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct PutBucketLifecycleConfigurationRequest {
     pub bucket: String,
     pub lifecycle_configuration: Option<BucketLifecycleConfiguration>,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct PutBucketLifecycleRequest {
     pub bucket: String,
     pub content_md5: Option<String>,
     pub lifecycle_configuration: Option<LifecycleConfiguration>,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct PutBucketLoggingRequest {
     pub bucket: String,
     pub bucket_logging_status: BucketLoggingStatus,
     pub content_md5: Option<String>,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct PutBucketMetricsConfigurationRequest {
     /// <p>The name of the bucket for which the metrics configuration is set.</p>
     pub bucket: String,
@@ -11287,20 +11287,20 @@ pub struct PutBucketMetricsConfigurationRequest {
     pub metrics_configuration: MetricsConfiguration,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct PutBucketNotificationConfigurationRequest {
     pub bucket: String,
     pub notification_configuration: NotificationConfiguration,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct PutBucketNotificationRequest {
     pub bucket: String,
     pub content_md5: Option<String>,
     pub notification_configuration: NotificationConfigurationDeprecated,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct PutBucketPolicyRequest {
     pub bucket: String,
     /// <p>Set this parameter to true to confirm that you want to remove your permissions to change this bucket policy in the future.</p>
@@ -11310,28 +11310,28 @@ pub struct PutBucketPolicyRequest {
     pub policy: String,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct PutBucketReplicationRequest {
     pub bucket: String,
     pub content_md5: Option<String>,
     pub replication_configuration: ReplicationConfiguration,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct PutBucketRequestPaymentRequest {
     pub bucket: String,
     pub content_md5: Option<String>,
     pub request_payment_configuration: RequestPaymentConfiguration,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct PutBucketTaggingRequest {
     pub bucket: String,
     pub content_md5: Option<String>,
     pub tagging: Tagging,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct PutBucketVersioningRequest {
     pub bucket: String,
     pub content_md5: Option<String>,
@@ -11340,14 +11340,14 @@ pub struct PutBucketVersioningRequest {
     pub versioning_configuration: VersioningConfiguration,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct PutBucketWebsiteRequest {
     pub bucket: String,
     pub content_md5: Option<String>,
     pub website_configuration: WebsiteConfiguration,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct PutObjectAclOutput {
     pub request_charged: Option<String>,
 }
@@ -11368,7 +11368,7 @@ impl PutObjectAclOutputDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct PutObjectAclRequest {
     /// <p>The canned ACL to apply to the object.</p>
     pub acl: Option<String>,
@@ -11391,7 +11391,7 @@ pub struct PutObjectAclRequest {
     pub version_id: Option<String>,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct PutObjectOutput {
     /// <p>Entity tag for the uploaded object.</p>
     pub e_tag: Option<String>,
@@ -11481,7 +11481,7 @@ pub struct PutObjectRequest {
     pub website_redirect_location: Option<String>,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct PutObjectTaggingOutput {
     pub version_id: Option<String>,
 }
@@ -11502,7 +11502,7 @@ impl PutObjectTaggingOutputDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct PutObjectTaggingRequest {
     pub bucket: String,
     pub content_md5: Option<String>,
@@ -11547,7 +11547,7 @@ impl QueueArnSerializer {
 }
 
 /// <p>Container for specifying an configuration when you want Amazon S3 to publish events to an Amazon Simple Queue Service (Amazon SQS) queue.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct QueueConfiguration {
     pub events: Vec<String>,
     pub filter: Option<NotificationConfigurationFilter>,
@@ -11644,7 +11644,7 @@ impl QueueConfigurationSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct QueueConfigurationDeprecated {
     pub events: Option<Vec<String>>,
     pub id: Option<String>,
@@ -11879,7 +11879,7 @@ impl RecordDelimiterSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct Redirect {
     /// <p>The host name to use in the redirect request.</p>
     pub host_name: Option<String>,
@@ -12011,7 +12011,7 @@ impl RedirectSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct RedirectAllRequestsTo {
     /// <p>Name of the host where requests will be redirected.</p>
     pub host_name: String,
@@ -12199,7 +12199,7 @@ impl ReplicaKmsKeyIDSerializer {
 }
 
 /// <p>Container for replication rules. You can add as many as 1,000 rules. Total replication configuration size can be up to 2 MB.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ReplicationConfiguration {
     /// <p>Amazon Resource Name (ARN) of an IAM role for Amazon S3 to assume when replicating the objects.</p>
     pub role: String,
@@ -12274,7 +12274,7 @@ impl ReplicationConfigurationSerializer {
 }
 
 /// <p>Container for information about a particular replication rule.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ReplicationRule {
     /// <p>Container for replication destination information.</p>
     pub destination: Destination,
@@ -12474,7 +12474,7 @@ impl ReplicationRulesSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct RequestPaymentConfiguration {
     /// <p>Specifies who pays for the download and request fees.</p>
     pub payer: String,
@@ -12622,7 +12622,7 @@ impl ResponseExpiresSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct RestoreObjectOutput {
     pub request_charged: Option<String>,
     /// <p>Indicates the path in the provided S3 output location where Select results will be restored to.</p>
@@ -12645,7 +12645,7 @@ impl RestoreObjectOutputDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct RestoreObjectRequest {
     pub bucket: String,
     pub key: String,
@@ -12655,7 +12655,7 @@ pub struct RestoreObjectRequest {
 }
 
 /// <p>Container for restore job parameters.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct RestoreRequest {
     /// <p>Lifetime of the active copy in days. Do not use with restores that specify OutputLocation.</p>
     pub days: Option<i64>,
@@ -12785,7 +12785,7 @@ impl RoleSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct RoutingRule {
     /// <p>A container for describing a condition that must be met for the specified redirect to apply. For example, 1. If request is for pages in the /docs folder, redirect to the /documents folder. 2. If request results in HTTP error 4xx, redirect request to another host where you might process the error.</p>
     pub condition: Option<Condition>,
@@ -12921,7 +12921,7 @@ impl RoutingRulesSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct Rule {
     pub abort_incomplete_multipart_upload: Option<AbortIncompleteMultipartUpload>,
     pub expiration: Option<LifecycleExpiration>,
@@ -13125,7 +13125,7 @@ impl RulesSerializer {
 }
 
 /// <p>Container for object key name prefix and suffix filtering rules.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct S3KeyFilter {
     pub filter_rules: Option<Vec<FilterRule>>,
 }
@@ -13193,7 +13193,7 @@ impl S3KeyFilterSerializer {
 }
 
 /// <p>Describes an S3 location that will receive the results of the restore request.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct S3Location {
     /// <p>A list of grants that control access to the staged results.</p>
     pub access_control_list: Option<Vec<Grant>>,
@@ -13269,7 +13269,7 @@ impl S3LocationSerializer {
 }
 
 /// <p>Specifies the use of SSE-KMS to encrypt delievered Inventory reports.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct SSEKMS {
     /// <p>Specifies the ID of the AWS Key Management Service (KMS) master encryption key to use for encrypting Inventory reports.</p>
     pub key_id: String,
@@ -13373,7 +13373,7 @@ impl SSEKMSKeyIdSerializer {
 }
 
 /// <p>Specifies the use of SSE-S3 to encrypt delievered Inventory reports.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct SSES3;
 
 struct SSES3Deserializer;
@@ -13410,7 +13410,7 @@ impl SSES3Serializer {
 }
 
 /// <p>Describes the parameters for Select job types.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct SelectParameters {
     /// <p>The expression that is used to query the object.</p>
     pub expression: String,
@@ -13496,7 +13496,7 @@ impl ServerSideEncryptionSerializer {
 }
 
 /// <p>Describes the default server-side encryption to apply to new objects in the bucket. If Put Object request does not specify any server-side encryption, this default encryption will be applied.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ServerSideEncryptionByDefault {
     /// <p>KMS master key ID to use for the default encryption. This parameter is allowed if SSEAlgorithm is aws:kms.</p>
     pub kms_master_key_id: Option<String>,
@@ -13584,7 +13584,7 @@ impl ServerSideEncryptionByDefaultSerializer {
 }
 
 /// <p>Container for server-side encryption configuration rules. Currently S3 supports one rule only.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ServerSideEncryptionConfiguration {
     /// <p>Container for information about a particular server-side encryption configuration rule.</p>
     pub rules: Vec<ServerSideEncryptionRule>,
@@ -13651,7 +13651,7 @@ impl ServerSideEncryptionConfigurationSerializer {
 }
 
 /// <p>Container for information about a particular server-side encryption configuration rule.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct ServerSideEncryptionRule {
     /// <p>Describes the default server-side encryption to apply to new objects in the bucket. If Put Object request does not specify any server-side encryption, this default encryption will be applied.</p>
     pub apply_server_side_encryption_by_default: Option<ServerSideEncryptionByDefault>,
@@ -13787,7 +13787,7 @@ impl SizeDeserializer {
     }
 }
 /// <p>Container for filters that define which source objects should be replicated.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct SourceSelectionCriteria {
     /// <p>Container for filter information of selection of KMS Encrypted S3 objects.</p>
     pub sse_kms_encrypted_objects: Option<SseKmsEncryptedObjects>,
@@ -13861,7 +13861,7 @@ impl SourceSelectionCriteriaSerializer {
 }
 
 /// <p>Container for filter information of selection of KMS Encrypted S3 objects.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct SseKmsEncryptedObjects {
     /// <p>The replication for KMS encrypted S3 objects is disabled if status is not Enabled.</p>
     pub status: String,
@@ -14037,7 +14037,7 @@ impl StorageClassSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct StorageClassAnalysis {
     /// <p>A container used to describe how data related to the storage class analysis should be exported.</p>
     pub data_export: Option<StorageClassAnalysisDataExport>,
@@ -14107,7 +14107,7 @@ impl StorageClassAnalysisSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct StorageClassAnalysisDataExport {
     /// <p>The place to store the data for an analysis.</p>
     pub destination: AnalyticsExportDestination,
@@ -14263,7 +14263,7 @@ impl SuffixSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct Tag {
     /// <p>Name of the tag.</p>
     pub key: String,
@@ -14403,7 +14403,7 @@ impl TagSetSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct Tagging {
     pub tag_set: Vec<Tag>,
 }
@@ -14460,7 +14460,7 @@ impl TargetBucketSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct TargetGrant {
     pub grantee: Option<Grantee>,
     /// <p>Logging permissions assigned to the Grantee for the bucket.</p>
@@ -14727,7 +14727,7 @@ impl TopicArnSerializer {
 }
 
 /// <p>Container for specifying the configuration when you want Amazon S3 to publish events to an Amazon Simple Notification Service (Amazon SNS) topic.</p>
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct TopicConfiguration {
     pub events: Vec<String>,
     pub filter: Option<NotificationConfigurationFilter>,
@@ -14824,7 +14824,7 @@ impl TopicConfigurationSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct TopicConfigurationDeprecated {
     pub events: Option<Vec<String>>,
     pub id: Option<String>,
@@ -14960,7 +14960,7 @@ impl TopicConfigurationListSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct Transition {
     /// <p>Indicates at what date the object is to be moved or deleted. Should be in GMT ISO 8601 Format.</p>
     pub date: Option<String>,
@@ -15242,7 +15242,7 @@ impl UploadIdMarkerSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct UploadPartCopyOutput {
     pub copy_part_result: Option<CopyPartResult>,
     /// <p>The version of the source object that was copied, if you have enabled versioning on the source bucket.</p>
@@ -15299,7 +15299,7 @@ impl UploadPartCopyOutputDeserializer {
         Ok(obj)
     }
 }
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct UploadPartCopyRequest {
     pub bucket: String,
     /// <p>The name of the source bucket and key name of the source object, separated by a slash (/). Must be URL-encoded.</p>
@@ -15334,7 +15334,7 @@ pub struct UploadPartCopyRequest {
     pub upload_id: String,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct UploadPartOutput {
     /// <p>Entity tag for the uploaded object.</p>
     pub e_tag: Option<String>,
@@ -15480,7 +15480,7 @@ impl VersionIdMarkerSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct VersioningConfiguration {
     /// <p>Specifies whether MFA delete is enabled in the bucket versioning configuration. This element is only returned if the bucket has been configured with MFA delete. If the bucket has never been so configured, this element is not returned.</p>
     pub mfa_delete: Option<String>,
@@ -15520,7 +15520,7 @@ impl VersioningConfigurationSerializer {
     }
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Clone)]
 pub struct WebsiteConfiguration {
     pub error_document: Option<ErrorDocument>,
     pub index_document: Option<IndexDocument>,
diff --git a/rusoto/services/sdb/Cargo.toml b/rusoto/services/sdb/Cargo.toml
index 2d9ca51070a..e5eb00a6409 100644
--- a/rusoto/services/sdb/Cargo.toml
+++ b/rusoto/services/sdb/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon SimpleDB @ 2009-04-15"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_sdb/index.html"
 keywords = ["AWS", "Amazon", "sdb"]
 license = "MIT"
 name = "rusoto_sdb"
diff --git a/rusoto/services/servicecatalog/Cargo.toml b/rusoto/services/servicecatalog/Cargo.toml
index 30f47b813b4..5cf1babdcb7 100644
--- a/rusoto/services/servicecatalog/Cargo.toml
+++ b/rusoto/services/servicecatalog/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWS Service Catalog @ 2015-12-10"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_servicecatalog/index.html"
 keywords = ["AWS", "Amazon", "servicecatalog"]
 license = "MIT"
 name = "rusoto_servicecatalog"
diff --git a/rusoto/services/ses/Cargo.toml b/rusoto/services/ses/Cargo.toml
index 63503eadc0f..ed8dd23d6ee 100644
--- a/rusoto/services/ses/Cargo.toml
+++ b/rusoto/services/ses/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon Simple Email Service @ 2010-12-01"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_ses/index.html"
 keywords = ["AWS", "Amazon", "ses"]
 license = "MIT"
 name = "rusoto_ses"
diff --git a/rusoto/services/shield/Cargo.toml b/rusoto/services/shield/Cargo.toml
index 2caacb7ad20..7f8a84b3a9a 100644
--- a/rusoto/services/shield/Cargo.toml
+++ b/rusoto/services/shield/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWS Shield @ 2016-06-02"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_shield/index.html"
 keywords = ["AWS", "Amazon", "shield"]
 license = "MIT"
 name = "rusoto_shield"
diff --git a/rusoto/services/sms/Cargo.toml b/rusoto/services/sms/Cargo.toml
index bfa37f26452..688fead025d 100644
--- a/rusoto/services/sms/Cargo.toml
+++ b/rusoto/services/sms/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWS Server Migration Service @ 2016-10-24"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_sms/index.html"
 keywords = ["AWS", "Amazon", "sms"]
 license = "MIT"
 name = "rusoto_sms"
diff --git a/rusoto/services/snowball/Cargo.toml b/rusoto/services/snowball/Cargo.toml
index 444f392ba39..bc5b85dcf9a 100644
--- a/rusoto/services/snowball/Cargo.toml
+++ b/rusoto/services/snowball/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon Import/Export Snowball @ 2016-06-30"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_snowball/index.html"
 keywords = ["AWS", "Amazon", "snowball"]
 license = "MIT"
 name = "rusoto_snowball"
diff --git a/rusoto/services/sns/Cargo.toml b/rusoto/services/sns/Cargo.toml
index 181c182405a..7f2cc191be4 100644
--- a/rusoto/services/sns/Cargo.toml
+++ b/rusoto/services/sns/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon Simple Notification Service @ 2010-03-31"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_sns/index.html"
 keywords = ["AWS", "Amazon", "sns"]
 license = "MIT"
 name = "rusoto_sns"
diff --git a/rusoto/services/sqs/Cargo.toml b/rusoto/services/sqs/Cargo.toml
index ce39a223c99..44d58bcca83 100644
--- a/rusoto/services/sqs/Cargo.toml
+++ b/rusoto/services/sqs/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon Simple Queue Service @ 2012-11-05"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_sqs/index.html"
 keywords = ["AWS", "Amazon", "sqs"]
 license = "MIT"
 name = "rusoto_sqs"
diff --git a/rusoto/services/ssm/Cargo.toml b/rusoto/services/ssm/Cargo.toml
index ea58fefe331..62abf956a27 100644
--- a/rusoto/services/ssm/Cargo.toml
+++ b/rusoto/services/ssm/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon Simple Systems Manager (SSM) @ 2014-11-06"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_ssm/index.html"
 keywords = ["AWS", "Amazon", "ssm"]
 license = "MIT"
 name = "rusoto_ssm"
diff --git a/rusoto/services/stepfunctions/Cargo.toml b/rusoto/services/stepfunctions/Cargo.toml
index 6638609c6b9..e224783979e 100644
--- a/rusoto/services/stepfunctions/Cargo.toml
+++ b/rusoto/services/stepfunctions/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWS Step Functions @ 2016-11-23"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_stepfunctions/index.html"
 keywords = ["AWS", "Amazon", "stepfunctions"]
 license = "MIT"
 name = "rusoto_stepfunctions"
diff --git a/rusoto/services/storagegateway/Cargo.toml b/rusoto/services/storagegateway/Cargo.toml
index c0a0f6b2d8f..c4838aad882 100644
--- a/rusoto/services/storagegateway/Cargo.toml
+++ b/rusoto/services/storagegateway/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWS Storage Gateway @ 2013-06-30"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_storagegateway/index.html"
 keywords = ["AWS", "Amazon", "storagegateway"]
 license = "MIT"
 name = "rusoto_storagegateway"
diff --git a/rusoto/services/sts/Cargo.toml b/rusoto/services/sts/Cargo.toml
index 0f85c0cd36e..18725b4e466 100644
--- a/rusoto/services/sts/Cargo.toml
+++ b/rusoto/services/sts/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWS Security Token Service @ 2011-06-15"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_sts/index.html"
 keywords = ["AWS", "Amazon", "sts"]
 license = "MIT"
 name = "rusoto_sts"
diff --git a/rusoto/services/sts/src/custom/credential.rs b/rusoto/services/sts/src/custom/credential.rs
index 8421bc9bfe1..21ef29b1558 100644
--- a/rusoto/services/sts/src/custom/credential.rs
+++ b/rusoto/services/sts/src/custom/credential.rs
@@ -27,7 +27,7 @@ pub trait NewAwsCredsForStsCreds {
 
 impl NewAwsCredsForStsCreds for AwsCredentials {
     fn new_for_credentials(sts_creds: ::Credentials) -> Result<AwsCredentials, CredentialsError> {
-        let expires_at = try!(sts_creds.expiration.parse::<DateTime<Utc>>().map_err(CredentialsError::from));
+        let expires_at = Some(try!(sts_creds.expiration.parse::<DateTime<Utc>>().map_err(CredentialsError::from)));
 
         Ok(AwsCredentials::new(
             sts_creds.access_key_id, 
diff --git a/rusoto/services/support/Cargo.toml b/rusoto/services/support/Cargo.toml
index af05b481681..84beccc485c 100644
--- a/rusoto/services/support/Cargo.toml
+++ b/rusoto/services/support/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWS Support @ 2013-04-15"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_support/index.html"
 keywords = ["AWS", "Amazon", "support"]
 license = "MIT"
 name = "rusoto_support"
diff --git a/rusoto/services/swf/Cargo.toml b/rusoto/services/swf/Cargo.toml
index 8030095f607..1c3ab14a0ba 100644
--- a/rusoto/services/swf/Cargo.toml
+++ b/rusoto/services/swf/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon Simple Workflow Service @ 2012-01-25"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_swf/index.html"
 keywords = ["AWS", "Amazon", "swf"]
 license = "MIT"
 name = "rusoto_swf"
diff --git a/rusoto/services/waf-regional/Cargo.toml b/rusoto/services/waf-regional/Cargo.toml
index 83e52e07b18..b081507ee3b 100644
--- a/rusoto/services/waf-regional/Cargo.toml
+++ b/rusoto/services/waf-regional/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWS WAF Regional @ 2016-11-28"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_waf_regional/index.html"
 keywords = ["AWS", "Amazon", "waf-regional"]
 license = "MIT"
 name = "rusoto_waf_regional"
diff --git a/rusoto/services/waf/Cargo.toml b/rusoto/services/waf/Cargo.toml
index 68afa1e5ad5..fab65d4a687 100644
--- a/rusoto/services/waf/Cargo.toml
+++ b/rusoto/services/waf/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWS WAF @ 2015-08-24"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_waf/index.html"
 keywords = ["AWS", "Amazon", "waf"]
 license = "MIT"
 name = "rusoto_waf"
diff --git a/rusoto/services/workdocs/Cargo.toml b/rusoto/services/workdocs/Cargo.toml
index 527106acc49..9cc9ec2c16f 100644
--- a/rusoto/services/workdocs/Cargo.toml
+++ b/rusoto/services/workdocs/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon WorkDocs @ 2016-05-01"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_workdocs/index.html"
 keywords = ["AWS", "Amazon", "workdocs"]
 license = "MIT"
 name = "rusoto_workdocs"
diff --git a/rusoto/services/workspaces/Cargo.toml b/rusoto/services/workspaces/Cargo.toml
index 13af2617956..a49f4b7ef9a 100644
--- a/rusoto/services/workspaces/Cargo.toml
+++ b/rusoto/services/workspaces/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - Amazon WorkSpaces @ 2015-04-08"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_workspaces/index.html"
 keywords = ["AWS", "Amazon", "workspaces"]
 license = "MIT"
 name = "rusoto_workspaces"
diff --git a/rusoto/services/xray/Cargo.toml b/rusoto/services/xray/Cargo.toml
index cba4337eb11..050f7623ab3 100644
--- a/rusoto/services/xray/Cargo.toml
+++ b/rusoto/services/xray/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["Anthony DiMarco <ocramida@gmail.com>", "Jimmy Cuadra <jimmy@jimmycuadra.com>", "Matthew Mayer <matthewkmayer@gmail.com>", "Nikita Pekin <contact@nikitapek.in>"]
 description = "AWS SDK for Rust - AWS X-Ray @ 2016-04-12"
-documentation = "https://rusoto.github.io/rusoto/rusoto_core/index.html"
+documentation = "https://rusoto.github.io/rusoto/rusoto_xray/index.html"
 keywords = ["AWS", "Amazon", "xray"]
 license = "MIT"
 name = "rusoto_xray"
diff --git a/service_crategen/src/commands/generate/codegen/json.rs b/service_crategen/src/commands/generate/codegen/json.rs
index e032466d95b..d1f506dd3f2 100644
--- a/service_crategen/src/commands/generate/codegen/json.rs
+++ b/service_crategen/src/commands/generate/codegen/json.rs
@@ -80,21 +80,12 @@ impl GenerateProtocol for JsonGenerator {
         use hyper::StatusCode;")
     }
 
-    fn generate_struct_attributes(&self,
-                                  serialized: bool,
-                                  deserialized: bool)
-                                  -> String {
-        let mut derived = vec!["Default", "Debug", "Clone"];
-
-        if serialized {
-            derived.push("Serialize");
-        }
-
-        if deserialized {
-            derived.push("Deserialize")
-        }
+    fn serialize_trait(&self) -> Option<&'static str> {
+        Some("Serialize")
+    }
 
-        format!("#[derive({})]", derived.join(","))
+    fn deserialize_trait(&self) -> Option<&'static str> {
+        Some("Deserialize")
     }
 
     fn timestamp_type(&self) -> &'static str {
diff --git a/service_crategen/src/commands/generate/codegen/mod.rs b/service_crategen/src/commands/generate/codegen/mod.rs
index 681dbef87e4..f3b289e98dc 100644
--- a/service_crategen/src/commands/generate/codegen/mod.rs
+++ b/service_crategen/src/commands/generate/codegen/mod.rs
@@ -4,7 +4,7 @@ use std::io::{Write, BufWriter};
 use inflector::Inflector;
 
 use Service;
-use botocore::{Shape, ShapeType};
+use botocore::{Member, Shape, ShapeType};
 use self::json::JsonGenerator;
 use self::query::QueryGenerator;
 use self::rest_json::RestJsonGenerator;
@@ -40,10 +40,18 @@ pub trait GenerateProtocol {
     /// The method generated by this method are inserted into an enclosing `impl FooClient {}` block
     fn generate_method_impls(&self, writer: &mut FileWriter, service: &Service) -> IoResult;
 
-    /// Add any attributes that should decorate the struct for the given type (typically `Debug`, `Clone`, etc.)
-    fn generate_struct_attributes(&self, serialized: bool, deserialized: bool) -> String;
+    /// If possible, return the trait that can be derived to serialize types
+    fn serialize_trait(&self) -> Option<&'static str> {
+        None
+    }
+
+    /// If possible, return the trait that can be derived to deserialize types
+    fn deserialize_trait(&self) -> Option<&'static str> {
+        None
+    }
 
     /// If necessary, generate a serializer for the specified type
+    /// This should be necessary only if `serialize_trait` returns `None`
     fn generate_serializer(&self,
                            _name: &str,
                            _shape: &Shape,
@@ -53,6 +61,7 @@ pub trait GenerateProtocol {
     }
 
     /// If necessary, generate a deserializer for the specified type
+    /// This should be necessary only if `deserialize_trait` returns `None`
     fn generate_deserializer(&self,
                              _name: &str,
                              _shape: &Shape,
@@ -235,19 +244,20 @@ pub fn get_rust_type(service: &Service,
     }
 }
 
-fn has_streaming_member(name: &str, shape: &Shape) -> bool {
-    shape.shape_type == ShapeType::Structure &&
-    shape.members.is_some() &&
-    shape.members.as_ref()
-                 .unwrap()
-                 .iter()
-                 .any(|(_, member)| member.shape == name && member.streaming())
+fn streaming_members<'a>(shape: &'a Shape) -> Box<Iterator<Item = &'a Member> + 'a> {
+    let it = shape
+        .members
+        .as_ref()
+        .into_iter()
+        .flat_map(|members| members.values())
+        .filter(|&member| member.streaming());
+    Box::new(it)
 }
 
 fn is_streaming_shape(service: &Service, name: &str) -> bool {
     service.shapes()
            .iter()
-           .any(|(_, shape)| has_streaming_member(name, shape))
+           .any(|(_, shape)| streaming_members(shape).any(|member| member.shape == name))
 }
 
 fn is_input_shape(service: &Service, name: &str) -> bool {
@@ -301,6 +311,7 @@ fn generate_types<P>(writer: &mut FileWriter, service: &Service, protocol_genera
 
         let type_name = mutate_type_name(service, name);
 
+        let streaming = is_streaming_shape(service, name);
         let deserialized = deserialized_types.contains(&type_name);
         let serialized = serialized_types.contains(&type_name);
 
@@ -315,6 +326,7 @@ fn generate_types<P>(writer: &mut FileWriter, service: &Service, protocol_genera
                 let generated = generate_struct(service,
                                                 &type_name,
                                                 shape,
+                                                streaming,
                                                 serialized,
                                                 deserialized,
                                                 protocol_generator);
@@ -322,7 +334,7 @@ fn generate_types<P>(writer: &mut FileWriter, service: &Service, protocol_genera
             }
         }
 
-        if is_streaming_shape(service, name) {
+        if streaming {
             // Add a second type for streaming blobs, which are the only streaming type we can have
             writeln!(writer,
                      "pub struct {streaming_name} {{
@@ -360,6 +372,7 @@ fn generate_types<P>(writer: &mut FileWriter, service: &Service, protocol_genera
         if deserialized {
             if let Some(deserializer) =
                 protocol_generator.generate_deserializer(&type_name, shape, service) {
+                assert!(protocol_generator.deserialize_trait().is_none());
                 writeln!(writer, "{}", deserializer)?;
             }
         }
@@ -367,6 +380,7 @@ fn generate_types<P>(writer: &mut FileWriter, service: &Service, protocol_genera
         if serialized {
             if let Some(serializer) =
                 protocol_generator.generate_serializer(&type_name, shape, service) {
+                assert!(protocol_generator.serialize_trait().is_none());
                 writeln!(writer, "{}", serializer)?;
             }
         }
@@ -377,33 +391,53 @@ fn generate_types<P>(writer: &mut FileWriter, service: &Service, protocol_genera
 fn generate_struct<P>(service: &Service,
                       name: &str,
                       shape: &Shape,
+                      streaming: bool,
                       serialized: bool,
                       deserialized: bool,
                       protocol_generator: &P)
                       -> String
     where P: GenerateProtocol
 {
+    let mut derived = vec!["Default", "Debug"];
+
+    // Streaming is implemented with Box<Stream<...>>, so we can't derive Clone.
+    // This affects both the streaming struct itself, and structs which contain it.
+    if !streaming && streaming_members(shape).next().is_none() {
+        derived.push("Clone");
+    }
+
+    if serialized {
+        if let Some(serialize_trait) = protocol_generator.serialize_trait() {
+            derived.push(serialize_trait);
+        }
+    }
+
+    if deserialized {
+        if let Some(deserialize_trait) = protocol_generator.deserialize_trait() {
+            derived.push(deserialize_trait);
+        }
+    }
+
+    let attributes = format!("#[derive({})]", derived.join(","));
 
     if shape.members.is_none() || shape.members.as_ref().unwrap().is_empty() {
         format!(
             "{attributes}
             pub struct {name};
             ",
-            attributes = protocol_generator.generate_struct_attributes(serialized, deserialized),
+            attributes = attributes,
             name = name,
         )
     } else {
-        let struct_attributes =
-            protocol_generator.generate_struct_attributes(serialized, deserialized);
         // Serde attributes are only needed if deriving the Serialize or Deserialize trait
-        let need_serde_attrs = struct_attributes.contains("erialize");
+        let need_serde_attrs = derived.iter().any(|&x| x == "Serialize" || x == "Deserialize");
         format!(
             "{attributes}
             pub struct {name} {{
                 {struct_fields}
             }}
             ",
-            attributes = struct_attributes,
+            attributes = attributes,
             name = name,
             struct_fields = generate_struct_fields(service, shape, name, need_serde_attrs, protocol_generator),
         )
diff --git a/service_crategen/src/commands/generate/codegen/query.rs b/service_crategen/src/commands/generate/codegen/query.rs
index 876b7ef7997..367aef13cbc 100644
--- a/service_crategen/src/commands/generate/codegen/query.rs
+++ b/service_crategen/src/commands/generate/codegen/query.rs
@@ -86,13 +86,6 @@ impl GenerateProtocol for QueryGenerator {
         }}")
     }
 
-    fn generate_struct_attributes(&self,
-                                  _serialized: bool,
-                                  deserialized: bool)
-                                  -> String {
-        xml_payload_parser::generate_struct_attributes(deserialized)
-    }
-
     fn generate_serializer(&self, name: &str, shape: &Shape, service: &Service) -> Option<String> {
         if shape.is_primitive() {
             return None;
diff --git a/service_crategen/src/commands/generate/codegen/rest_json.rs b/service_crategen/src/commands/generate/codegen/rest_json.rs
index eff74ce5e3c..3a5196fb10a 100644
--- a/service_crategen/src/commands/generate/codegen/rest_json.rs
+++ b/service_crategen/src/commands/generate/codegen/rest_json.rs
@@ -119,18 +119,12 @@ impl GenerateProtocol for RestJsonGenerator {
 
     }
 
-    fn generate_struct_attributes(&self, serialized: bool, deserialized: bool) -> String {
-        let mut derived = vec!["Default", "Debug", "Clone"];
-
-        if serialized {
-            derived.push("Serialize");
-        }
-
-        if deserialized {
-            derived.push("Deserialize")
-        }
+    fn serialize_trait(&self) -> Option<&'static str> {
+        Some("Serialize")
+    }
 
-        format!("#[derive({})]", derived.join(","))
+    fn deserialize_trait(&self) -> Option<&'static str> {
+        Some("Deserialize")
     }
 
     fn timestamp_type(&self) -> &'static str {
diff --git a/service_crategen/src/commands/generate/codegen/rest_xml.rs b/service_crategen/src/commands/generate/codegen/rest_xml.rs
index 48f774c6eaf..97e253d9b42 100644
--- a/service_crategen/src/commands/generate/codegen/rest_xml.rs
+++ b/service_crategen/src/commands/generate/codegen/rest_xml.rs
@@ -112,15 +112,6 @@ impl GenerateProtocol for RestXmlGenerator {
         writeln!(writer, "{}", imports)
     }
 
-    fn generate_struct_attributes(&self,
-                                  _serialized: bool,
-                                  _deserialized: bool)
-                                  -> String {
-        let derived = vec!["Default", "Debug"];
-
-        format!("#[derive({})]", derived.join(","))
-    }
-
     fn generate_serializer(&self, name: &str, shape: &Shape, service: &Service) -> Option<String> {
         if name != "RestoreRequest" && name.ends_with("Request") {
             if used_as_request_payload(shape) {
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 e11a93918dc..3bb0fdb4a65 100644
--- a/service_crategen/src/commands/generate/codegen/xml_payload_parser.rs
+++ b/service_crategen/src/commands/generate/codegen/xml_payload_parser.rs
@@ -4,11 +4,6 @@ use ::Service;
 use botocore::{Member, Operation, Shape, ShapeType};
 use super::{generate_field_name, mutate_type_name, mutate_type_name_for_streaming};
 
-pub fn generate_struct_attributes(_deserialized: bool) -> String {
-    let derived = vec!["Default", "Debug", "Clone"];
-    format!("#[derive({})]", derived.join(","))
-}
-
 pub fn generate_deserializer(name: &str, ty: &str, shape: &Shape, service: &Service) -> String {
     format!("struct {name}Deserializer;
             impl {name}Deserializer {{
diff --git a/service_crategen/src/commands/generate/mod.rs b/service_crategen/src/commands/generate/mod.rs
index df6cfd160fa..f596130f9a9 100644
--- a/service_crategen/src/commands/generate/mod.rs
+++ b/service_crategen/src/commands/generate/mod.rs
@@ -116,7 +116,7 @@ pub fn generate_services(services: &BTreeMap<String, ServiceConfig>, out_dir: &P
                     "Nikita Pekin <contact@nikitapek.in>".into()
                 ]),
                 description: Some(format!("AWS SDK for Rust - {} @ {}", service.full_name(), service.api_version())),
-                documentation: Some("https://rusoto.github.io/rusoto/rusoto_core/index.html".into()),
+                documentation: Some(format!("https://rusoto.github.io/rusoto/{}/index.html", crate_name)),
                 keywords: Some(vec!["AWS".into(), "Amazon".into(), name_for_keyword]),
                 license: Some("MIT".into()),
                 name: crate_name.clone(),


Test patch:
diff --git a/rusoto/services/s3/src/custom/custom_tests.rs b/rusoto/services/s3/src/custom/custom_tests.rs
index 88925d96402..588894b3a2f 100644
--- a/rusoto/services/s3/src/custom/custom_tests.rs
+++ b/rusoto/services/s3/src/custom/custom_tests.rs
@@ -335,6 +335,17 @@ fn can_construct_streaming_body() {
     assert_eq!("Simple Body Test", read_string);
 }
 
+#[test]
+fn structs_should_impl_clone() {
+    fn assert_clone<T: Clone>() {}
+
+    // GetObjectRequest is common but simple. It must impl Clone.
+    // (But note GetObjectOutput cannot impl Clone because it uses streaming.)
+    assert_clone::<GetObjectRequest>();
+    // RestoreObjectRequest has several layers of structs, all of which must impl Clone.
+    assert_clone::<RestoreObjectRequest>();
+}
+
 /// returns Some(String)
 fn sstr(value: &'static str) -> Option<String> {
     Some(value.to_string())