diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,367 @@
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+    means each individual or legal entity that creates, contributes to
+    the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+    means the combination of the Contributions of others (if any) used
+    by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+    means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+    means Source Code Form to which the initial Contributor has attached
+    the notice in Exhibit A, the Executable Form of such Source Code
+    Form, and Modifications of such Source Code Form, in each case
+    including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+    means
+
+    (a) that the initial Contributor has attached the notice described
+        in Exhibit B to the Covered Software; or
+
+    (b) that the Covered Software was made available under the terms of
+        version 1.1 or earlier of the License, but not also under the
+        terms of a Secondary License.
+
+1.6. "Executable Form"
+    means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+    means a work that combines Covered Software with other material, in
+    a separate file or files, that is not Covered Software.
+
+1.8. "License"
+    means this document.
+
+1.9. "Licensable"
+    means having the right to grant, to the maximum extent possible,
+    whether at the time of the initial grant or subsequently, any and
+    all of the rights conveyed by this License.
+
+1.10. "Modifications"
+    means any of the following:
+
+    (a) any file in Source Code Form that results from an addition to,
+        deletion from, or modification of the contents of Covered
+        Software; or
+
+    (b) any new file in Source Code Form that contains any Covered
+        Software.
+
+1.11. "Patent Claims" of a Contributor
+    means any patent claim(s), including without limitation, method,
+    process, and apparatus claims, in any patent Licensable by such
+    Contributor that would be infringed, but for the grant of the
+    License, by the making, using, selling, offering for sale, having
+    made, import, or transfer of either its Contributions or its
+    Contributor Version.
+
+1.12. "Secondary License"
+    means either the GNU General Public License, Version 2.0, the GNU
+    Lesser General Public License, Version 2.1, the GNU Affero General
+    Public License, Version 3.0, or any later versions of those
+    licenses.
+
+1.13. "Source Code Form"
+    means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+    means an individual or a legal entity exercising rights under this
+    License. For legal entities, "You" includes any entity that
+    controls, is controlled by, or is under common control with You. For
+    purposes of this definition, "control" means (a) the power, direct
+    or indirect, to cause the direction or management of such entity,
+    whether by contract or otherwise, or (b) ownership of more than
+    fifty percent (50%) of the outstanding shares or beneficial
+    ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+    Licensable by such Contributor to use, reproduce, make available,
+    modify, display, perform, distribute, and otherwise exploit its
+    Contributions, either on an unmodified basis, with Modifications, or
+    as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+    for sale, have made, import, and otherwise transfer either its
+    Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+    or
+
+(b) for infringements caused by: (i) Your and any other third party's
+    modifications of Covered Software, or (ii) the combination of its
+    Contributions with other software (except as part of its Contributor
+    Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+    its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+    Form, as described in Section 3.1, and You must inform recipients of
+    the Executable Form how they can obtain a copy of such Source Code
+    Form by reasonable means in a timely manner, at a charge no more
+    than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+    License, or sublicense it under different terms, provided that the
+    license for the Executable Form does not attempt to limit or alter
+    the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+*                                                                      *
+*  6. Disclaimer of Warranty                                           *
+*  -------------------------                                           *
+*                                                                      *
+*  Covered Software is provided under this License on an "as is"       *
+*  basis, without warranty of any kind, either expressed, implied, or  *
+*  statutory, including, without limitation, warranties that the       *
+*  Covered Software is free of defects, merchantable, fit for a        *
+*  particular purpose or non-infringing. The entire risk as to the     *
+*  quality and performance of the Covered Software is with You.        *
+*  Should any Covered Software prove defective in any respect, You     *
+*  (not any Contributor) assume the cost of any necessary servicing,   *
+*  repair, or correction. This disclaimer of warranty constitutes an   *
+*  essential part of this License. No use of any Covered Software is   *
+*  authorized under this License except under this disclaimer.         *
+*                                                                      *
+************************************************************************
+
+************************************************************************
+*                                                                      *
+*  7. Limitation of Liability                                          *
+*  --------------------------                                          *
+*                                                                      *
+*  Under no circumstances and under no legal theory, whether tort      *
+*  (including negligence), contract, or otherwise, shall any           *
+*  Contributor, or anyone who distributes Covered Software as          *
+*  permitted above, be liable to You for any direct, indirect,         *
+*  special, incidental, or consequential damages of any character      *
+*  including, without limitation, damages for lost profits, loss of    *
+*  goodwill, work stoppage, computer failure or malfunction, or any    *
+*  and all other commercial damages or losses, even if such party      *
+*  shall have been informed of the possibility of such damages. This   *
+*  limitation of liability shall not apply to liability for death or   *
+*  personal injury resulting from such party's negligence to the       *
+*  extent applicable law prohibits such limitation. Some               *
+*  jurisdictions do not allow the exclusion or limitation of           *
+*  incidental or consequential damages, so this exclusion and          *
+*  limitation may not apply to You.                                    *
+*                                                                      *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+  This Source Code Form is subject to the terms of the Mozilla Public
+  License, v. 2.0. If a copy of the MPL was not distributed with this
+  file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,45 @@
+# Amazon Pinpoint SDK
+
+* [Version](#version)
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+
+## Version
+
+`1.4.5`
+
+
+## Description
+
+Documentation is available via [Hackage](http://hackage.haskell.org/package/amazonka-pinpoint)
+and the [AWS API Reference](https://aws.amazon.com/documentation/).
+
+The types from this library are intended to be used with [amazonka](http://hackage.haskell.org/package/amazonka),
+which provides mechanisms for specifying AuthN/AuthZ information, sending requests,
+and receiving responses.
+
+Lenses are used for constructing and manipulating types,
+due to the depth of nesting of AWS types and transparency regarding
+de/serialisation into more palatable Haskell values.
+The provided lenses should be compatible with any of the major lens libraries
+[lens](http://hackage.haskell.org/package/lens) or [lens-family-core](http://hackage.haskell.org/package/lens-family-core).
+
+See [Network.AWS.Pinpoint](http://hackage.haskell.org/package/amazonka-pinpoint/docs/Network-AWS-Pinpoint.html)
+or [the AWS documentation](https://aws.amazon.com/documentation/) to get started.
+
+
+## Contribute
+
+For any problems, comments, or feedback please create an issue [here on GitHub](https://github.com/brendanhay/amazonka/issues).
+
+> _Note:_ this library is an auto-generated Haskell package. Please see `amazonka-gen` for more information.
+
+
+## Licence
+
+`amazonka-pinpoint` is released under the [Mozilla Public License Version 2.0](http://www.mozilla.org/MPL/).
+
+Parts of the code are derived from AWS service descriptions, licensed under Apache 2.0.
+Source files subject to this contain an additional licensing clause in their header.
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import           Distribution.Simple
+main = defaultMain
diff --git a/amazonka-pinpoint.cabal b/amazonka-pinpoint.cabal
new file mode 100644
--- /dev/null
+++ b/amazonka-pinpoint.cabal
@@ -0,0 +1,110 @@
+name:                  amazonka-pinpoint
+version:               1.4.5
+synopsis:              Amazon Pinpoint SDK.
+homepage:              https://github.com/brendanhay/amazonka
+bug-reports:           https://github.com/brendanhay/amazonka/issues
+license:               OtherLicense
+license-file:          LICENSE
+author:                Brendan Hay
+maintainer:            Brendan Hay <brendan.g.hay@gmail.com>
+copyright:             Copyright (c) 2013-2016 Brendan Hay
+category:              Network, AWS, Cloud, Distributed Computing
+build-type:            Simple
+cabal-version:         >= 1.10
+extra-source-files:    README.md fixture/*.yaml fixture/*.proto src/.gitkeep
+description:
+    The types from this library are intended to be used with
+    <http://hackage.haskell.org/package/amazonka amazonka>, which provides
+    mechanisms for specifying AuthN/AuthZ information, sending requests,
+    and receiving responses.
+    .
+    Lenses are used for constructing and manipulating types,
+    due to the depth of nesting of AWS types and transparency regarding
+    de/serialisation into more palatable Haskell values.
+    The provided lenses should be compatible with any of the major lens libraries
+    such as <http://hackage.haskell.org/package/lens lens> or
+    <http://hackage.haskell.org/package/lens-family-core lens-family-core>.
+    .
+    See "Network.AWS.Pinpoint" or <https://aws.amazon.com/documentation/ the AWS documentation>
+    to get started.
+
+source-repository head
+    type:     git
+    location: git://github.com/brendanhay/amazonka.git
+
+library
+    default-language:  Haskell2010
+    hs-source-dirs:    src gen
+
+    ghc-options:       -Wall
+
+    exposed-modules:
+          Network.AWS.Pinpoint
+        , Network.AWS.Pinpoint.CreateCampaign
+        , Network.AWS.Pinpoint.CreateImportJob
+        , Network.AWS.Pinpoint.CreateSegment
+        , Network.AWS.Pinpoint.DeleteAPNSChannel
+        , Network.AWS.Pinpoint.DeleteCampaign
+        , Network.AWS.Pinpoint.DeleteGCMChannel
+        , Network.AWS.Pinpoint.DeleteSegment
+        , Network.AWS.Pinpoint.GetAPNSChannel
+        , Network.AWS.Pinpoint.GetApplicationSettings
+        , Network.AWS.Pinpoint.GetCampaign
+        , Network.AWS.Pinpoint.GetCampaignActivities
+        , Network.AWS.Pinpoint.GetCampaignVersion
+        , Network.AWS.Pinpoint.GetCampaignVersions
+        , Network.AWS.Pinpoint.GetCampaigns
+        , Network.AWS.Pinpoint.GetEndpoint
+        , Network.AWS.Pinpoint.GetGCMChannel
+        , Network.AWS.Pinpoint.GetImportJob
+        , Network.AWS.Pinpoint.GetImportJobs
+        , Network.AWS.Pinpoint.GetSegment
+        , Network.AWS.Pinpoint.GetSegmentImportJobs
+        , Network.AWS.Pinpoint.GetSegmentVersion
+        , Network.AWS.Pinpoint.GetSegmentVersions
+        , Network.AWS.Pinpoint.GetSegments
+        , Network.AWS.Pinpoint.Types
+        , Network.AWS.Pinpoint.UpdateAPNSChannel
+        , Network.AWS.Pinpoint.UpdateApplicationSettings
+        , Network.AWS.Pinpoint.UpdateCampaign
+        , Network.AWS.Pinpoint.UpdateEndpoint
+        , Network.AWS.Pinpoint.UpdateEndpointsBatch
+        , Network.AWS.Pinpoint.UpdateGCMChannel
+        , Network.AWS.Pinpoint.UpdateSegment
+        , Network.AWS.Pinpoint.Waiters
+
+    other-modules:
+          Network.AWS.Pinpoint.Types.Product
+        , Network.AWS.Pinpoint.Types.Sum
+
+    build-depends:
+          amazonka-core == 1.4.5.*
+        , base          >= 4.7     && < 5
+
+test-suite amazonka-pinpoint-test
+    type:              exitcode-stdio-1.0
+    default-language:  Haskell2010
+    hs-source-dirs:    test
+    main-is:           Main.hs
+
+    ghc-options:       -Wall -threaded
+
+    -- This section is encoded by the template and any modules added by
+    -- hand outside these namespaces will not correctly be added to the
+    -- distribution package.
+    other-modules:
+          Test.AWS.Pinpoint
+        , Test.AWS.Gen.Pinpoint
+        , Test.AWS.Pinpoint.Internal
+
+    build-depends:
+          amazonka-core == 1.4.5.*
+        , amazonka-test == 1.4.5.*
+        , amazonka-pinpoint == 1.4.5.*
+        , base
+        , bytestring
+        , tasty
+        , tasty-hunit
+        , text
+        , time
+        , unordered-containers
diff --git a/fixture/CreateCampaign.yaml b/fixture/CreateCampaign.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateCampaign.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/pinpoint/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  pinpoint.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateCampaignResponse.proto b/fixture/CreateCampaignResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateCampaignResponse.proto
diff --git a/fixture/CreateImportJob.yaml b/fixture/CreateImportJob.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateImportJob.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/pinpoint/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  pinpoint.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateImportJobResponse.proto b/fixture/CreateImportJobResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateImportJobResponse.proto
diff --git a/fixture/CreateSegment.yaml b/fixture/CreateSegment.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateSegment.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/pinpoint/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  pinpoint.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateSegmentResponse.proto b/fixture/CreateSegmentResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateSegmentResponse.proto
diff --git a/fixture/DeleteAPNSChannel.yaml b/fixture/DeleteAPNSChannel.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteAPNSChannel.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/pinpoint/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  pinpoint.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteAPNSChannelResponse.proto b/fixture/DeleteAPNSChannelResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteAPNSChannelResponse.proto
diff --git a/fixture/DeleteCampaign.yaml b/fixture/DeleteCampaign.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteCampaign.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/pinpoint/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  pinpoint.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteCampaignResponse.proto b/fixture/DeleteCampaignResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteCampaignResponse.proto
diff --git a/fixture/DeleteGCMChannel.yaml b/fixture/DeleteGCMChannel.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteGCMChannel.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/pinpoint/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  pinpoint.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteGCMChannelResponse.proto b/fixture/DeleteGCMChannelResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteGCMChannelResponse.proto
diff --git a/fixture/DeleteSegment.yaml b/fixture/DeleteSegment.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteSegment.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/pinpoint/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  pinpoint.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteSegmentResponse.proto b/fixture/DeleteSegmentResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteSegmentResponse.proto
diff --git a/fixture/GetAPNSChannel.yaml b/fixture/GetAPNSChannel.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetAPNSChannel.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/pinpoint/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  pinpoint.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/GetAPNSChannelResponse.proto b/fixture/GetAPNSChannelResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetAPNSChannelResponse.proto
diff --git a/fixture/GetApplicationSettings.yaml b/fixture/GetApplicationSettings.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetApplicationSettings.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/pinpoint/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  pinpoint.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/GetApplicationSettingsResponse.proto b/fixture/GetApplicationSettingsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetApplicationSettingsResponse.proto
diff --git a/fixture/GetCampaign.yaml b/fixture/GetCampaign.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetCampaign.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/pinpoint/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  pinpoint.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/GetCampaignActivities.yaml b/fixture/GetCampaignActivities.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetCampaignActivities.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/pinpoint/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  pinpoint.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/GetCampaignActivitiesResponse.proto b/fixture/GetCampaignActivitiesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetCampaignActivitiesResponse.proto
diff --git a/fixture/GetCampaignResponse.proto b/fixture/GetCampaignResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetCampaignResponse.proto
diff --git a/fixture/GetCampaignVersion.yaml b/fixture/GetCampaignVersion.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetCampaignVersion.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/pinpoint/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  pinpoint.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/GetCampaignVersionResponse.proto b/fixture/GetCampaignVersionResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetCampaignVersionResponse.proto
diff --git a/fixture/GetCampaignVersions.yaml b/fixture/GetCampaignVersions.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetCampaignVersions.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/pinpoint/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  pinpoint.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/GetCampaignVersionsResponse.proto b/fixture/GetCampaignVersionsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetCampaignVersionsResponse.proto
diff --git a/fixture/GetCampaigns.yaml b/fixture/GetCampaigns.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetCampaigns.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/pinpoint/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  pinpoint.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/GetCampaignsResponse.proto b/fixture/GetCampaignsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetCampaignsResponse.proto
diff --git a/fixture/GetEndpoint.yaml b/fixture/GetEndpoint.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetEndpoint.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/pinpoint/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  pinpoint.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/GetEndpointResponse.proto b/fixture/GetEndpointResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetEndpointResponse.proto
diff --git a/fixture/GetGCMChannel.yaml b/fixture/GetGCMChannel.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetGCMChannel.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/pinpoint/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  pinpoint.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/GetGCMChannelResponse.proto b/fixture/GetGCMChannelResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetGCMChannelResponse.proto
diff --git a/fixture/GetImportJob.yaml b/fixture/GetImportJob.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetImportJob.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/pinpoint/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  pinpoint.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/GetImportJobResponse.proto b/fixture/GetImportJobResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetImportJobResponse.proto
diff --git a/fixture/GetImportJobs.yaml b/fixture/GetImportJobs.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetImportJobs.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/pinpoint/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  pinpoint.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/GetImportJobsResponse.proto b/fixture/GetImportJobsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetImportJobsResponse.proto
diff --git a/fixture/GetSegment.yaml b/fixture/GetSegment.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetSegment.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/pinpoint/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  pinpoint.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/GetSegmentImportJobs.yaml b/fixture/GetSegmentImportJobs.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetSegmentImportJobs.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/pinpoint/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  pinpoint.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/GetSegmentImportJobsResponse.proto b/fixture/GetSegmentImportJobsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetSegmentImportJobsResponse.proto
diff --git a/fixture/GetSegmentResponse.proto b/fixture/GetSegmentResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetSegmentResponse.proto
diff --git a/fixture/GetSegmentVersion.yaml b/fixture/GetSegmentVersion.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetSegmentVersion.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/pinpoint/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  pinpoint.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/GetSegmentVersionResponse.proto b/fixture/GetSegmentVersionResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetSegmentVersionResponse.proto
diff --git a/fixture/GetSegmentVersions.yaml b/fixture/GetSegmentVersions.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetSegmentVersions.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/pinpoint/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  pinpoint.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/GetSegmentVersionsResponse.proto b/fixture/GetSegmentVersionsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetSegmentVersionsResponse.proto
diff --git a/fixture/GetSegments.yaml b/fixture/GetSegments.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetSegments.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/pinpoint/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  pinpoint.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/GetSegmentsResponse.proto b/fixture/GetSegmentsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetSegmentsResponse.proto
diff --git a/fixture/UpdateAPNSChannel.yaml b/fixture/UpdateAPNSChannel.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateAPNSChannel.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/pinpoint/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  pinpoint.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UpdateAPNSChannelResponse.proto b/fixture/UpdateAPNSChannelResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateAPNSChannelResponse.proto
diff --git a/fixture/UpdateApplicationSettings.yaml b/fixture/UpdateApplicationSettings.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateApplicationSettings.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/pinpoint/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  pinpoint.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UpdateApplicationSettingsResponse.proto b/fixture/UpdateApplicationSettingsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateApplicationSettingsResponse.proto
diff --git a/fixture/UpdateCampaign.yaml b/fixture/UpdateCampaign.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateCampaign.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/pinpoint/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  pinpoint.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UpdateCampaignResponse.proto b/fixture/UpdateCampaignResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateCampaignResponse.proto
diff --git a/fixture/UpdateEndpoint.yaml b/fixture/UpdateEndpoint.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateEndpoint.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/pinpoint/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  pinpoint.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UpdateEndpointResponse.proto b/fixture/UpdateEndpointResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateEndpointResponse.proto
diff --git a/fixture/UpdateEndpointsBatch.yaml b/fixture/UpdateEndpointsBatch.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateEndpointsBatch.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/pinpoint/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  pinpoint.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UpdateEndpointsBatchResponse.proto b/fixture/UpdateEndpointsBatchResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateEndpointsBatchResponse.proto
diff --git a/fixture/UpdateGCMChannel.yaml b/fixture/UpdateGCMChannel.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateGCMChannel.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/pinpoint/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  pinpoint.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UpdateGCMChannelResponse.proto b/fixture/UpdateGCMChannelResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateGCMChannelResponse.proto
diff --git a/fixture/UpdateSegment.yaml b/fixture/UpdateSegment.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateSegment.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/pinpoint/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  pinpoint.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UpdateSegmentResponse.proto b/fixture/UpdateSegmentResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateSegmentResponse.proto
diff --git a/gen/Network/AWS/Pinpoint.hs b/gen/Network/AWS/Pinpoint.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Pinpoint.hs
@@ -0,0 +1,640 @@
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.Pinpoint
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Amazon Pinpoint makes it easy to run targeted campaigns to drive user engagement in mobile apps. Amazon Pinpoint helps you understand user behavior, define which users to target, determine which messages to send, schedule the best time to deliver the messages, and then track the results of your campaign.
+--
+--
+-- Targeted push notifications based on app usage trends and user behavior have become a popular approach for mobile app user engagement because response rates are often several times higher than tradition email marketing campaigns. By using targeted push notifications, you can increase message relevance and effectiveness, measure engagement, and continually improve your campaigns.
+--
+-- Getting started with Amazon Pinpoint is easy. First, AWS Mobile Hub guides you through the process to integrate the AWS Mobile SDK with your app. Next, you define your target segments, campaign message, and specify the delivery schedule. Once your campaign is running, Pinpoint provides metrics so you can run analytics and track the impact of your campaign.
+--
+-- With Amazon Pinpoint, there are no upfront setup costs, and no fixed monthly cost. You only pay for the number of users your campaign targets, the messages you send, and the events you collect, so you can start small and scale as your application grows.
+--
+module Network.AWS.Pinpoint
+    (
+    -- * Service Configuration
+      pinpoint
+
+    -- * Errors
+    -- $errors
+
+    -- ** ForbiddenException
+    , _ForbiddenException
+
+    -- ** NotFoundException
+    , _NotFoundException
+
+    -- ** TooManyRequestsException
+    , _TooManyRequestsException
+
+    -- ** InternalServerErrorException
+    , _InternalServerErrorException
+
+    -- ** MethodNotAllowedException
+    , _MethodNotAllowedException
+
+    -- ** BadRequestException
+    , _BadRequestException
+
+    -- * Waiters
+    -- $waiters
+
+    -- * Operations
+    -- $operations
+
+    -- ** GetGCMChannel
+    , module Network.AWS.Pinpoint.GetGCMChannel
+
+    -- ** GetSegmentImportJobs
+    , module Network.AWS.Pinpoint.GetSegmentImportJobs
+
+    -- ** GetImportJob
+    , module Network.AWS.Pinpoint.GetImportJob
+
+    -- ** GetSegmentVersions
+    , module Network.AWS.Pinpoint.GetSegmentVersions
+
+    -- ** DeleteCampaign
+    , module Network.AWS.Pinpoint.DeleteCampaign
+
+    -- ** UpdateCampaign
+    , module Network.AWS.Pinpoint.UpdateCampaign
+
+    -- ** GetSegmentVersion
+    , module Network.AWS.Pinpoint.GetSegmentVersion
+
+    -- ** CreateSegment
+    , module Network.AWS.Pinpoint.CreateSegment
+
+    -- ** UpdateEndpoint
+    , module Network.AWS.Pinpoint.UpdateEndpoint
+
+    -- ** CreateCampaign
+    , module Network.AWS.Pinpoint.CreateCampaign
+
+    -- ** GetEndpoint
+    , module Network.AWS.Pinpoint.GetEndpoint
+
+    -- ** GetSegment
+    , module Network.AWS.Pinpoint.GetSegment
+
+    -- ** UpdateEndpointsBatch
+    , module Network.AWS.Pinpoint.UpdateEndpointsBatch
+
+    -- ** GetCampaign
+    , module Network.AWS.Pinpoint.GetCampaign
+
+    -- ** UpdateGCMChannel
+    , module Network.AWS.Pinpoint.UpdateGCMChannel
+
+    -- ** DeleteGCMChannel
+    , module Network.AWS.Pinpoint.DeleteGCMChannel
+
+    -- ** GetCampaignActivities
+    , module Network.AWS.Pinpoint.GetCampaignActivities
+
+    -- ** DeleteAPNSChannel
+    , module Network.AWS.Pinpoint.DeleteAPNSChannel
+
+    -- ** UpdateAPNSChannel
+    , module Network.AWS.Pinpoint.UpdateAPNSChannel
+
+    -- ** GetCampaignVersions
+    , module Network.AWS.Pinpoint.GetCampaignVersions
+
+    -- ** GetAPNSChannel
+    , module Network.AWS.Pinpoint.GetAPNSChannel
+
+    -- ** GetImportJobs
+    , module Network.AWS.Pinpoint.GetImportJobs
+
+    -- ** GetCampaignVersion
+    , module Network.AWS.Pinpoint.GetCampaignVersion
+
+    -- ** DeleteSegment
+    , module Network.AWS.Pinpoint.DeleteSegment
+
+    -- ** UpdateSegment
+    , module Network.AWS.Pinpoint.UpdateSegment
+
+    -- ** GetCampaigns
+    , module Network.AWS.Pinpoint.GetCampaigns
+
+    -- ** UpdateApplicationSettings
+    , module Network.AWS.Pinpoint.UpdateApplicationSettings
+
+    -- ** GetSegments
+    , module Network.AWS.Pinpoint.GetSegments
+
+    -- ** CreateImportJob
+    , module Network.AWS.Pinpoint.CreateImportJob
+
+    -- ** GetApplicationSettings
+    , module Network.AWS.Pinpoint.GetApplicationSettings
+
+    -- * Types
+
+    -- ** Action
+    , Action (..)
+
+    -- ** AttributeType
+    , AttributeType (..)
+
+    -- ** CampaignStatus
+    , CampaignStatus (..)
+
+    -- ** ChannelType
+    , ChannelType (..)
+
+    -- ** DefinitionFormat
+    , DefinitionFormat (..)
+
+    -- ** DimensionType
+    , DimensionType (..)
+
+    -- ** Duration
+    , Duration (..)
+
+    -- ** Frequency
+    , Frequency (..)
+
+    -- ** JobStatus
+    , JobStatus (..)
+
+    -- ** RecencyType
+    , RecencyType (..)
+
+    -- ** SegmentType
+    , SegmentType (..)
+
+    -- ** APNSChannelRequest
+    , APNSChannelRequest
+    , apnsChannelRequest
+    , acrPrivateKey
+    , acrCertificate
+
+    -- ** APNSChannelResponse
+    , APNSChannelResponse
+    , apnsChannelResponse
+    , acPlatform
+    , acLastModifiedDate
+    , acIsArchived
+    , acApplicationId
+    , acVersion
+    , acId
+    , acCreationDate
+    , acLastModifiedBy
+
+    -- ** ActivitiesResponse
+    , ActivitiesResponse
+    , activitiesResponse
+    , aItem
+
+    -- ** ActivityResponse
+    , ActivityResponse
+    , activityResponse
+    , aState
+    , aStart
+    , aCampaignId
+    , aResult
+    , aTreatmentId
+    , aSuccessfulEndpointCount
+    , aEnd
+    , aApplicationId
+    , aTotalEndpointCount
+    , aId
+    , aScheduledStart
+
+    -- ** ApplicationSettingsResource
+    , ApplicationSettingsResource
+    , applicationSettingsResource
+    , asrLastModifiedDate
+    , asrLimits
+    , asrQuietTime
+    , asrApplicationId
+
+    -- ** AttributeDimension
+    , AttributeDimension
+    , attributeDimension
+    , adValues
+    , adAttributeType
+
+    -- ** CampaignLimits
+    , CampaignLimits
+    , campaignLimits
+    , clDaily
+    , clTotal
+
+    -- ** CampaignResponse
+    , CampaignResponse
+    , campaignResponse
+    , cState
+    , cLastModifiedDate
+    , cSchedule
+    , cTreatmentName
+    , cLimits
+    , cIsPaused
+    , cDefaultState
+    , cApplicationId
+    , cName
+    , cVersion
+    , cHoldoutPercent
+    , cTreatmentDescription
+    , cId
+    , cCreationDate
+    , cMessageConfiguration
+    , cDescription
+    , cSegmentId
+    , cAdditionalTreatments
+    , cSegmentVersion
+
+    -- ** CampaignState
+    , CampaignState
+    , campaignState
+    , csCampaignStatus
+
+    -- ** CampaignsResponse
+    , CampaignsResponse
+    , campaignsResponse
+    , cNextToken
+    , cItem
+
+    -- ** EndpointBatchItem
+    , EndpointBatchItem
+    , endpointBatchItem
+    , ebiRequestId
+    , ebiMetrics
+    , ebiLocation
+    , ebiDemographic
+    , ebiAddress
+    , ebiEffectiveDate
+    , ebiUser
+    , ebiAttributes
+    , ebiEndpointStatus
+    , ebiOptOut
+    , ebiId
+    , ebiChannelType
+
+    -- ** EndpointBatchRequest
+    , EndpointBatchRequest
+    , endpointBatchRequest
+    , ebrItem
+
+    -- ** EndpointDemographic
+    , EndpointDemographic
+    , endpointDemographic
+    , edPlatform
+    , edPlatformVersion
+    , edLocale
+    , edAppVersion
+    , edModel
+    , edMake
+    , edModelVersion
+    , edTimezone
+
+    -- ** EndpointLocation
+    , EndpointLocation
+    , endpointLocation
+    , elPostalCode
+    , elLatitude
+    , elCountry
+    , elCity
+    , elRegion
+    , elLongitude
+
+    -- ** EndpointRequest
+    , EndpointRequest
+    , endpointRequest
+    , erRequestId
+    , erMetrics
+    , erLocation
+    , erDemographic
+    , erAddress
+    , erEffectiveDate
+    , erUser
+    , erAttributes
+    , erEndpointStatus
+    , erOptOut
+    , erChannelType
+
+    -- ** EndpointResponse
+    , EndpointResponse
+    , endpointResponse
+    , eRequestId
+    , eMetrics
+    , eLocation
+    , eDemographic
+    , eCohortId
+    , eAddress
+    , eEffectiveDate
+    , eUser
+    , eApplicationId
+    , eAttributes
+    , eEndpointStatus
+    , eOptOut
+    , eId
+    , eCreationDate
+    , eChannelType
+    , eShardId
+
+    -- ** EndpointUser
+    , EndpointUser
+    , endpointUser
+    , euUserAttributes
+    , euUserId
+
+    -- ** GCMChannelRequest
+    , GCMChannelRequest
+    , gcmChannelRequest
+    , gcrAPIKey
+
+    -- ** GCMChannelResponse
+    , GCMChannelResponse
+    , gcmChannelResponse
+    , gcPlatform
+    , gcLastModifiedDate
+    , gcCredential
+    , gcIsArchived
+    , gcApplicationId
+    , gcVersion
+    , gcId
+    , gcCreationDate
+    , gcLastModifiedBy
+
+    -- ** ImportJobRequest
+    , ImportJobRequest
+    , importJobRequest
+    , iSegmentName
+    , iFormat
+    , iDefineSegment
+    , iRegisterEndpoints
+    , iExternalId
+    , iS3URL
+    , iSegmentId
+    , iRoleARN
+
+    -- ** ImportJobResource
+    , ImportJobResource
+    , importJobResource
+    , ijrSegmentName
+    , ijrFormat
+    , ijrDefineSegment
+    , ijrRegisterEndpoints
+    , ijrExternalId
+    , ijrS3URL
+    , ijrSegmentId
+    , ijrRoleARN
+
+    -- ** ImportJobResponse
+    , ImportJobResponse
+    , importJobResponse
+    , ijCompletedPieces
+    , ijFailedPieces
+    , ijDefinition
+    , ijTotalProcessed
+    , ijFailures
+    , ijTotalPieces
+    , ijApplicationId
+    , ijId
+    , ijCreationDate
+    , ijType
+    , ijCompletionDate
+    , ijJobStatus
+    , ijTotalFailures
+
+    -- ** ImportJobsResponse
+    , ImportJobsResponse
+    , importJobsResponse
+    , ijNextToken
+    , ijItem
+
+    -- ** Message
+    , Message
+    , message
+    , mSilentPush
+    , mImageIconURL
+    , mBody
+    , mJSONBody
+    , mURL
+    , mAction
+    , mImageURL
+    , mMediaURL
+    , mTitle
+
+    -- ** MessageBody
+    , MessageBody
+    , messageBody
+    , mbRequestId
+    , mbMessage
+
+    -- ** MessageConfiguration
+    , MessageConfiguration
+    , messageConfiguration
+    , mcAPNSMessage
+    , mcGCMMessage
+    , mcDefaultMessage
+
+    -- ** QuietTime
+    , QuietTime
+    , quietTime
+    , qtStart
+    , qtEnd
+
+    -- ** RecencyDimension
+    , RecencyDimension
+    , recencyDimension
+    , rdRecencyType
+    , rdDuration
+
+    -- ** Schedule
+    , Schedule
+    , schedule
+    , sFrequency
+    , sStartTime
+    , sQuietTime
+    , sIsLocalTime
+    , sEndTime
+    , sTimezone
+
+    -- ** SegmentBehaviors
+    , SegmentBehaviors
+    , segmentBehaviors
+    , sbRecency
+
+    -- ** SegmentDemographics
+    , SegmentDemographics
+    , segmentDemographics
+    , sdPlatform
+    , sdAppVersion
+    , sdModel
+    , sdMake
+    , sdDeviceType
+
+    -- ** SegmentDimensions
+    , SegmentDimensions
+    , segmentDimensions
+    , sdLocation
+    , sdDemographic
+    , sdBehavior
+    , sdAttributes
+
+    -- ** SegmentImportResource
+    , SegmentImportResource
+    , segmentImportResource
+    , sirSize
+    , sirFormat
+    , sirExternalId
+    , sirS3URL
+    , sirRoleARN
+
+    -- ** SegmentLocation
+    , SegmentLocation
+    , segmentLocation
+    , slCountry
+
+    -- ** SegmentResponse
+    , SegmentResponse
+    , segmentResponse
+    , sLastModifiedDate
+    , sSegmentType
+    , sApplicationId
+    , sName
+    , sVersion
+    , sId
+    , sCreationDate
+    , sImportDefinition
+    , sDimensions
+
+    -- ** SegmentsResponse
+    , SegmentsResponse
+    , segmentsResponse
+    , sNextToken
+    , sItem
+
+    -- ** SetDimension
+    , SetDimension
+    , setDimension
+    , sdValues
+    , sdDimensionType
+
+    -- ** TreatmentResource
+    , TreatmentResource
+    , treatmentResource
+    , trState
+    , trSchedule
+    , trTreatmentName
+    , trSizePercent
+    , trTreatmentDescription
+    , trId
+    , trMessageConfiguration
+
+    -- ** WriteApplicationSettingsRequest
+    , WriteApplicationSettingsRequest
+    , writeApplicationSettingsRequest
+    , wasrLimits
+    , wasrQuietTime
+
+    -- ** WriteCampaignRequest
+    , WriteCampaignRequest
+    , writeCampaignRequest
+    , wcrSchedule
+    , wcrTreatmentName
+    , wcrLimits
+    , wcrIsPaused
+    , wcrName
+    , wcrHoldoutPercent
+    , wcrTreatmentDescription
+    , wcrMessageConfiguration
+    , wcrDescription
+    , wcrSegmentId
+    , wcrAdditionalTreatments
+    , wcrSegmentVersion
+
+    -- ** WriteSegmentRequest
+    , WriteSegmentRequest
+    , writeSegmentRequest
+    , wsrName
+    , wsrDimensions
+
+    -- ** WriteTreatmentResource
+    , WriteTreatmentResource
+    , writeTreatmentResource
+    , wtrSchedule
+    , wtrTreatmentName
+    , wtrSizePercent
+    , wtrTreatmentDescription
+    , wtrMessageConfiguration
+    ) where
+
+import           Network.AWS.Pinpoint.CreateCampaign
+import           Network.AWS.Pinpoint.CreateImportJob
+import           Network.AWS.Pinpoint.CreateSegment
+import           Network.AWS.Pinpoint.DeleteAPNSChannel
+import           Network.AWS.Pinpoint.DeleteCampaign
+import           Network.AWS.Pinpoint.DeleteGCMChannel
+import           Network.AWS.Pinpoint.DeleteSegment
+import           Network.AWS.Pinpoint.GetAPNSChannel
+import           Network.AWS.Pinpoint.GetApplicationSettings
+import           Network.AWS.Pinpoint.GetCampaign
+import           Network.AWS.Pinpoint.GetCampaignActivities
+import           Network.AWS.Pinpoint.GetCampaigns
+import           Network.AWS.Pinpoint.GetCampaignVersion
+import           Network.AWS.Pinpoint.GetCampaignVersions
+import           Network.AWS.Pinpoint.GetEndpoint
+import           Network.AWS.Pinpoint.GetGCMChannel
+import           Network.AWS.Pinpoint.GetImportJob
+import           Network.AWS.Pinpoint.GetImportJobs
+import           Network.AWS.Pinpoint.GetSegment
+import           Network.AWS.Pinpoint.GetSegmentImportJobs
+import           Network.AWS.Pinpoint.GetSegments
+import           Network.AWS.Pinpoint.GetSegmentVersion
+import           Network.AWS.Pinpoint.GetSegmentVersions
+import           Network.AWS.Pinpoint.Types
+import           Network.AWS.Pinpoint.UpdateAPNSChannel
+import           Network.AWS.Pinpoint.UpdateApplicationSettings
+import           Network.AWS.Pinpoint.UpdateCampaign
+import           Network.AWS.Pinpoint.UpdateEndpoint
+import           Network.AWS.Pinpoint.UpdateEndpointsBatch
+import           Network.AWS.Pinpoint.UpdateGCMChannel
+import           Network.AWS.Pinpoint.UpdateSegment
+import           Network.AWS.Pinpoint.Waiters
+
+{- $errors
+Error matchers are designed for use with the functions provided by
+<http://hackage.haskell.org/package/lens/docs/Control-Exception-Lens.html Control.Exception.Lens>.
+This allows catching (and rethrowing) service specific errors returned
+by 'Pinpoint'.
+-}
+
+{- $operations
+Some AWS operations return results that are incomplete and require subsequent
+requests in order to obtain the entire result set. The process of sending
+subsequent requests to continue where a previous request left off is called
+pagination. For example, the 'ListObjects' operation of Amazon S3 returns up to
+1000 objects at a time, and you must send subsequent requests with the
+appropriate Marker in order to retrieve the next page of results.
+
+Operations that have an 'AWSPager' instance can transparently perform subsequent
+requests, correctly setting Markers and other request facets to iterate through
+the entire result set of a truncated API operation. Operations which support
+this have an additional note in the documentation.
+
+Many operations have the ability to filter results on the server side. See the
+individual operation parameters for details.
+-}
+
+{- $waiters
+Waiters poll by repeatedly sending a request until some remote success condition
+configured by the 'Wait' specification is fulfilled. The 'Wait' specification
+determines how many attempts should be made, in addition to delay and retry strategies.
+-}
diff --git a/gen/Network/AWS/Pinpoint/CreateCampaign.hs b/gen/Network/AWS/Pinpoint/CreateCampaign.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Pinpoint/CreateCampaign.hs
@@ -0,0 +1,143 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.Pinpoint.CreateCampaign
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates or updates a campaign.
+module Network.AWS.Pinpoint.CreateCampaign
+    (
+    -- * Creating a Request
+      createCampaign
+    , CreateCampaign
+    -- * Request Lenses
+    , ccApplicationId
+    , ccWriteCampaignRequest
+
+    -- * Destructuring the Response
+    , createCampaignResponse
+    , CreateCampaignResponse
+    -- * Response Lenses
+    , ccrsResponseStatus
+    , ccrsCampaignResponse
+    ) where
+
+import           Network.AWS.Lens
+import           Network.AWS.Pinpoint.Types
+import           Network.AWS.Pinpoint.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'createCampaign' smart constructor.
+data CreateCampaign = CreateCampaign'
+    { _ccApplicationId        :: !Text
+    , _ccWriteCampaignRequest :: !WriteCampaignRequest
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CreateCampaign' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ccApplicationId' - Undocumented member.
+--
+-- * 'ccWriteCampaignRequest' - Undocumented member.
+createCampaign
+    :: Text -- ^ 'ccApplicationId'
+    -> WriteCampaignRequest -- ^ 'ccWriteCampaignRequest'
+    -> CreateCampaign
+createCampaign pApplicationId_ pWriteCampaignRequest_ =
+    CreateCampaign'
+    { _ccApplicationId = pApplicationId_
+    , _ccWriteCampaignRequest = pWriteCampaignRequest_
+    }
+
+-- | Undocumented member.
+ccApplicationId :: Lens' CreateCampaign Text
+ccApplicationId = lens _ccApplicationId (\ s a -> s{_ccApplicationId = a});
+
+-- | Undocumented member.
+ccWriteCampaignRequest :: Lens' CreateCampaign WriteCampaignRequest
+ccWriteCampaignRequest = lens _ccWriteCampaignRequest (\ s a -> s{_ccWriteCampaignRequest = a});
+
+instance AWSRequest CreateCampaign where
+        type Rs CreateCampaign = CreateCampaignResponse
+        request = postJSON pinpoint
+        response
+          = receiveJSON
+              (\ s h x ->
+                 CreateCampaignResponse' <$>
+                   (pure (fromEnum s)) <*> (eitherParseJSON x))
+
+instance Hashable CreateCampaign
+
+instance NFData CreateCampaign
+
+instance ToHeaders CreateCampaign where
+        toHeaders
+          = const
+              (mconcat
+                 ["Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON CreateCampaign where
+        toJSON CreateCampaign'{..}
+          = object
+              (catMaybes
+                 [Just
+                    ("WriteCampaignRequest" .= _ccWriteCampaignRequest)])
+
+instance ToPath CreateCampaign where
+        toPath CreateCampaign'{..}
+          = mconcat
+              ["/v1/apps/", toBS _ccApplicationId, "/campaigns"]
+
+instance ToQuery CreateCampaign where
+        toQuery = const mempty
+
+-- | /See:/ 'createCampaignResponse' smart constructor.
+data CreateCampaignResponse = CreateCampaignResponse'
+    { _ccrsResponseStatus   :: !Int
+    , _ccrsCampaignResponse :: !CampaignResponse
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CreateCampaignResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ccrsResponseStatus' - -- | The response status code.
+--
+-- * 'ccrsCampaignResponse' - Undocumented member.
+createCampaignResponse
+    :: Int -- ^ 'ccrsResponseStatus'
+    -> CampaignResponse -- ^ 'ccrsCampaignResponse'
+    -> CreateCampaignResponse
+createCampaignResponse pResponseStatus_ pCampaignResponse_ =
+    CreateCampaignResponse'
+    { _ccrsResponseStatus = pResponseStatus_
+    , _ccrsCampaignResponse = pCampaignResponse_
+    }
+
+-- | -- | The response status code.
+ccrsResponseStatus :: Lens' CreateCampaignResponse Int
+ccrsResponseStatus = lens _ccrsResponseStatus (\ s a -> s{_ccrsResponseStatus = a});
+
+-- | Undocumented member.
+ccrsCampaignResponse :: Lens' CreateCampaignResponse CampaignResponse
+ccrsCampaignResponse = lens _ccrsCampaignResponse (\ s a -> s{_ccrsCampaignResponse = a});
+
+instance NFData CreateCampaignResponse
diff --git a/gen/Network/AWS/Pinpoint/CreateImportJob.hs b/gen/Network/AWS/Pinpoint/CreateImportJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Pinpoint/CreateImportJob.hs
@@ -0,0 +1,142 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.Pinpoint.CreateImportJob
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates or updates an import job.
+module Network.AWS.Pinpoint.CreateImportJob
+    (
+    -- * Creating a Request
+      createImportJob
+    , CreateImportJob
+    -- * Request Lenses
+    , cijApplicationId
+    , cijImportJobRequest
+
+    -- * Destructuring the Response
+    , createImportJobResponse
+    , CreateImportJobResponse
+    -- * Response Lenses
+    , cijrsResponseStatus
+    , cijrsImportJobResponse
+    ) where
+
+import           Network.AWS.Lens
+import           Network.AWS.Pinpoint.Types
+import           Network.AWS.Pinpoint.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'createImportJob' smart constructor.
+data CreateImportJob = CreateImportJob'
+    { _cijApplicationId    :: !Text
+    , _cijImportJobRequest :: !ImportJobRequest
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CreateImportJob' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cijApplicationId' - Undocumented member.
+--
+-- * 'cijImportJobRequest' - Undocumented member.
+createImportJob
+    :: Text -- ^ 'cijApplicationId'
+    -> ImportJobRequest -- ^ 'cijImportJobRequest'
+    -> CreateImportJob
+createImportJob pApplicationId_ pImportJobRequest_ =
+    CreateImportJob'
+    { _cijApplicationId = pApplicationId_
+    , _cijImportJobRequest = pImportJobRequest_
+    }
+
+-- | Undocumented member.
+cijApplicationId :: Lens' CreateImportJob Text
+cijApplicationId = lens _cijApplicationId (\ s a -> s{_cijApplicationId = a});
+
+-- | Undocumented member.
+cijImportJobRequest :: Lens' CreateImportJob ImportJobRequest
+cijImportJobRequest = lens _cijImportJobRequest (\ s a -> s{_cijImportJobRequest = a});
+
+instance AWSRequest CreateImportJob where
+        type Rs CreateImportJob = CreateImportJobResponse
+        request = postJSON pinpoint
+        response
+          = receiveJSON
+              (\ s h x ->
+                 CreateImportJobResponse' <$>
+                   (pure (fromEnum s)) <*> (eitherParseJSON x))
+
+instance Hashable CreateImportJob
+
+instance NFData CreateImportJob
+
+instance ToHeaders CreateImportJob where
+        toHeaders
+          = const
+              (mconcat
+                 ["Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON CreateImportJob where
+        toJSON CreateImportJob'{..}
+          = object
+              (catMaybes
+                 [Just ("ImportJobRequest" .= _cijImportJobRequest)])
+
+instance ToPath CreateImportJob where
+        toPath CreateImportJob'{..}
+          = mconcat
+              ["/v1/apps/", toBS _cijApplicationId, "/jobs/import"]
+
+instance ToQuery CreateImportJob where
+        toQuery = const mempty
+
+-- | /See:/ 'createImportJobResponse' smart constructor.
+data CreateImportJobResponse = CreateImportJobResponse'
+    { _cijrsResponseStatus    :: !Int
+    , _cijrsImportJobResponse :: !ImportJobResponse
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CreateImportJobResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cijrsResponseStatus' - -- | The response status code.
+--
+-- * 'cijrsImportJobResponse' - Undocumented member.
+createImportJobResponse
+    :: Int -- ^ 'cijrsResponseStatus'
+    -> ImportJobResponse -- ^ 'cijrsImportJobResponse'
+    -> CreateImportJobResponse
+createImportJobResponse pResponseStatus_ pImportJobResponse_ =
+    CreateImportJobResponse'
+    { _cijrsResponseStatus = pResponseStatus_
+    , _cijrsImportJobResponse = pImportJobResponse_
+    }
+
+-- | -- | The response status code.
+cijrsResponseStatus :: Lens' CreateImportJobResponse Int
+cijrsResponseStatus = lens _cijrsResponseStatus (\ s a -> s{_cijrsResponseStatus = a});
+
+-- | Undocumented member.
+cijrsImportJobResponse :: Lens' CreateImportJobResponse ImportJobResponse
+cijrsImportJobResponse = lens _cijrsImportJobResponse (\ s a -> s{_cijrsImportJobResponse = a});
+
+instance NFData CreateImportJobResponse
diff --git a/gen/Network/AWS/Pinpoint/CreateSegment.hs b/gen/Network/AWS/Pinpoint/CreateSegment.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Pinpoint/CreateSegment.hs
@@ -0,0 +1,143 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.Pinpoint.CreateSegment
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Used to create or update a segment.
+module Network.AWS.Pinpoint.CreateSegment
+    (
+    -- * Creating a Request
+      createSegment
+    , CreateSegment
+    -- * Request Lenses
+    , csApplicationId
+    , csWriteSegmentRequest
+
+    -- * Destructuring the Response
+    , createSegmentResponse
+    , CreateSegmentResponse
+    -- * Response Lenses
+    , csrsResponseStatus
+    , csrsSegmentResponse
+    ) where
+
+import           Network.AWS.Lens
+import           Network.AWS.Pinpoint.Types
+import           Network.AWS.Pinpoint.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'createSegment' smart constructor.
+data CreateSegment = CreateSegment'
+    { _csApplicationId       :: !Text
+    , _csWriteSegmentRequest :: !WriteSegmentRequest
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CreateSegment' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'csApplicationId' - Undocumented member.
+--
+-- * 'csWriteSegmentRequest' - Undocumented member.
+createSegment
+    :: Text -- ^ 'csApplicationId'
+    -> WriteSegmentRequest -- ^ 'csWriteSegmentRequest'
+    -> CreateSegment
+createSegment pApplicationId_ pWriteSegmentRequest_ =
+    CreateSegment'
+    { _csApplicationId = pApplicationId_
+    , _csWriteSegmentRequest = pWriteSegmentRequest_
+    }
+
+-- | Undocumented member.
+csApplicationId :: Lens' CreateSegment Text
+csApplicationId = lens _csApplicationId (\ s a -> s{_csApplicationId = a});
+
+-- | Undocumented member.
+csWriteSegmentRequest :: Lens' CreateSegment WriteSegmentRequest
+csWriteSegmentRequest = lens _csWriteSegmentRequest (\ s a -> s{_csWriteSegmentRequest = a});
+
+instance AWSRequest CreateSegment where
+        type Rs CreateSegment = CreateSegmentResponse
+        request = postJSON pinpoint
+        response
+          = receiveJSON
+              (\ s h x ->
+                 CreateSegmentResponse' <$>
+                   (pure (fromEnum s)) <*> (eitherParseJSON x))
+
+instance Hashable CreateSegment
+
+instance NFData CreateSegment
+
+instance ToHeaders CreateSegment where
+        toHeaders
+          = const
+              (mconcat
+                 ["Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON CreateSegment where
+        toJSON CreateSegment'{..}
+          = object
+              (catMaybes
+                 [Just
+                    ("WriteSegmentRequest" .= _csWriteSegmentRequest)])
+
+instance ToPath CreateSegment where
+        toPath CreateSegment'{..}
+          = mconcat
+              ["/v1/apps/", toBS _csApplicationId, "/segments"]
+
+instance ToQuery CreateSegment where
+        toQuery = const mempty
+
+-- | /See:/ 'createSegmentResponse' smart constructor.
+data CreateSegmentResponse = CreateSegmentResponse'
+    { _csrsResponseStatus  :: !Int
+    , _csrsSegmentResponse :: !SegmentResponse
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CreateSegmentResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'csrsResponseStatus' - -- | The response status code.
+--
+-- * 'csrsSegmentResponse' - Undocumented member.
+createSegmentResponse
+    :: Int -- ^ 'csrsResponseStatus'
+    -> SegmentResponse -- ^ 'csrsSegmentResponse'
+    -> CreateSegmentResponse
+createSegmentResponse pResponseStatus_ pSegmentResponse_ =
+    CreateSegmentResponse'
+    { _csrsResponseStatus = pResponseStatus_
+    , _csrsSegmentResponse = pSegmentResponse_
+    }
+
+-- | -- | The response status code.
+csrsResponseStatus :: Lens' CreateSegmentResponse Int
+csrsResponseStatus = lens _csrsResponseStatus (\ s a -> s{_csrsResponseStatus = a});
+
+-- | Undocumented member.
+csrsSegmentResponse :: Lens' CreateSegmentResponse SegmentResponse
+csrsSegmentResponse = lens _csrsSegmentResponse (\ s a -> s{_csrsSegmentResponse = a});
+
+instance NFData CreateSegmentResponse
diff --git a/gen/Network/AWS/Pinpoint/DeleteAPNSChannel.hs b/gen/Network/AWS/Pinpoint/DeleteAPNSChannel.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Pinpoint/DeleteAPNSChannel.hs
@@ -0,0 +1,127 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.Pinpoint.DeleteAPNSChannel
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes the APNs channel for an app.
+module Network.AWS.Pinpoint.DeleteAPNSChannel
+    (
+    -- * Creating a Request
+      deleteAPNSChannel
+    , DeleteAPNSChannel
+    -- * Request Lenses
+    , dacApplicationId
+
+    -- * Destructuring the Response
+    , deleteAPNSChannelResponse
+    , DeleteAPNSChannelResponse
+    -- * Response Lenses
+    , dacrsResponseStatus
+    , dacrsAPNSChannelResponse
+    ) where
+
+import           Network.AWS.Lens
+import           Network.AWS.Pinpoint.Types
+import           Network.AWS.Pinpoint.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'deleteAPNSChannel' smart constructor.
+newtype DeleteAPNSChannel = DeleteAPNSChannel'
+    { _dacApplicationId :: Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DeleteAPNSChannel' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dacApplicationId' - Undocumented member.
+deleteAPNSChannel
+    :: Text -- ^ 'dacApplicationId'
+    -> DeleteAPNSChannel
+deleteAPNSChannel pApplicationId_ =
+    DeleteAPNSChannel'
+    { _dacApplicationId = pApplicationId_
+    }
+
+-- | Undocumented member.
+dacApplicationId :: Lens' DeleteAPNSChannel Text
+dacApplicationId = lens _dacApplicationId (\ s a -> s{_dacApplicationId = a});
+
+instance AWSRequest DeleteAPNSChannel where
+        type Rs DeleteAPNSChannel = DeleteAPNSChannelResponse
+        request = delete pinpoint
+        response
+          = receiveJSON
+              (\ s h x ->
+                 DeleteAPNSChannelResponse' <$>
+                   (pure (fromEnum s)) <*> (eitherParseJSON x))
+
+instance Hashable DeleteAPNSChannel
+
+instance NFData DeleteAPNSChannel
+
+instance ToHeaders DeleteAPNSChannel where
+        toHeaders
+          = const
+              (mconcat
+                 ["Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToPath DeleteAPNSChannel where
+        toPath DeleteAPNSChannel'{..}
+          = mconcat
+              ["/v1/apps/", toBS _dacApplicationId,
+               "/channels/apns"]
+
+instance ToQuery DeleteAPNSChannel where
+        toQuery = const mempty
+
+-- | /See:/ 'deleteAPNSChannelResponse' smart constructor.
+data DeleteAPNSChannelResponse = DeleteAPNSChannelResponse'
+    { _dacrsResponseStatus      :: !Int
+    , _dacrsAPNSChannelResponse :: !APNSChannelResponse
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DeleteAPNSChannelResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dacrsResponseStatus' - -- | The response status code.
+--
+-- * 'dacrsAPNSChannelResponse' - Undocumented member.
+deleteAPNSChannelResponse
+    :: Int -- ^ 'dacrsResponseStatus'
+    -> APNSChannelResponse -- ^ 'dacrsAPNSChannelResponse'
+    -> DeleteAPNSChannelResponse
+deleteAPNSChannelResponse pResponseStatus_ pAPNSChannelResponse_ =
+    DeleteAPNSChannelResponse'
+    { _dacrsResponseStatus = pResponseStatus_
+    , _dacrsAPNSChannelResponse = pAPNSChannelResponse_
+    }
+
+-- | -- | The response status code.
+dacrsResponseStatus :: Lens' DeleteAPNSChannelResponse Int
+dacrsResponseStatus = lens _dacrsResponseStatus (\ s a -> s{_dacrsResponseStatus = a});
+
+-- | Undocumented member.
+dacrsAPNSChannelResponse :: Lens' DeleteAPNSChannelResponse APNSChannelResponse
+dacrsAPNSChannelResponse = lens _dacrsAPNSChannelResponse (\ s a -> s{_dacrsAPNSChannelResponse = a});
+
+instance NFData DeleteAPNSChannelResponse
diff --git a/gen/Network/AWS/Pinpoint/DeleteCampaign.hs b/gen/Network/AWS/Pinpoint/DeleteCampaign.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Pinpoint/DeleteCampaign.hs
@@ -0,0 +1,137 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.Pinpoint.DeleteCampaign
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes a campaign.
+module Network.AWS.Pinpoint.DeleteCampaign
+    (
+    -- * Creating a Request
+      deleteCampaign
+    , DeleteCampaign
+    -- * Request Lenses
+    , dcCampaignId
+    , dcApplicationId
+
+    -- * Destructuring the Response
+    , deleteCampaignResponse
+    , DeleteCampaignResponse
+    -- * Response Lenses
+    , dcrsResponseStatus
+    , dcrsCampaignResponse
+    ) where
+
+import           Network.AWS.Lens
+import           Network.AWS.Pinpoint.Types
+import           Network.AWS.Pinpoint.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'deleteCampaign' smart constructor.
+data DeleteCampaign = DeleteCampaign'
+    { _dcCampaignId    :: !Text
+    , _dcApplicationId :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DeleteCampaign' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dcCampaignId' - Undocumented member.
+--
+-- * 'dcApplicationId' - Undocumented member.
+deleteCampaign
+    :: Text -- ^ 'dcCampaignId'
+    -> Text -- ^ 'dcApplicationId'
+    -> DeleteCampaign
+deleteCampaign pCampaignId_ pApplicationId_ =
+    DeleteCampaign'
+    { _dcCampaignId = pCampaignId_
+    , _dcApplicationId = pApplicationId_
+    }
+
+-- | Undocumented member.
+dcCampaignId :: Lens' DeleteCampaign Text
+dcCampaignId = lens _dcCampaignId (\ s a -> s{_dcCampaignId = a});
+
+-- | Undocumented member.
+dcApplicationId :: Lens' DeleteCampaign Text
+dcApplicationId = lens _dcApplicationId (\ s a -> s{_dcApplicationId = a});
+
+instance AWSRequest DeleteCampaign where
+        type Rs DeleteCampaign = DeleteCampaignResponse
+        request = delete pinpoint
+        response
+          = receiveJSON
+              (\ s h x ->
+                 DeleteCampaignResponse' <$>
+                   (pure (fromEnum s)) <*> (eitherParseJSON x))
+
+instance Hashable DeleteCampaign
+
+instance NFData DeleteCampaign
+
+instance ToHeaders DeleteCampaign where
+        toHeaders
+          = const
+              (mconcat
+                 ["Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToPath DeleteCampaign where
+        toPath DeleteCampaign'{..}
+          = mconcat
+              ["/v1/apps/", toBS _dcApplicationId, "/campaigns/",
+               toBS _dcCampaignId]
+
+instance ToQuery DeleteCampaign where
+        toQuery = const mempty
+
+-- | /See:/ 'deleteCampaignResponse' smart constructor.
+data DeleteCampaignResponse = DeleteCampaignResponse'
+    { _dcrsResponseStatus   :: !Int
+    , _dcrsCampaignResponse :: !CampaignResponse
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DeleteCampaignResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dcrsResponseStatus' - -- | The response status code.
+--
+-- * 'dcrsCampaignResponse' - Undocumented member.
+deleteCampaignResponse
+    :: Int -- ^ 'dcrsResponseStatus'
+    -> CampaignResponse -- ^ 'dcrsCampaignResponse'
+    -> DeleteCampaignResponse
+deleteCampaignResponse pResponseStatus_ pCampaignResponse_ =
+    DeleteCampaignResponse'
+    { _dcrsResponseStatus = pResponseStatus_
+    , _dcrsCampaignResponse = pCampaignResponse_
+    }
+
+-- | -- | The response status code.
+dcrsResponseStatus :: Lens' DeleteCampaignResponse Int
+dcrsResponseStatus = lens _dcrsResponseStatus (\ s a -> s{_dcrsResponseStatus = a});
+
+-- | Undocumented member.
+dcrsCampaignResponse :: Lens' DeleteCampaignResponse CampaignResponse
+dcrsCampaignResponse = lens _dcrsCampaignResponse (\ s a -> s{_dcrsCampaignResponse = a});
+
+instance NFData DeleteCampaignResponse
diff --git a/gen/Network/AWS/Pinpoint/DeleteGCMChannel.hs b/gen/Network/AWS/Pinpoint/DeleteGCMChannel.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Pinpoint/DeleteGCMChannel.hs
@@ -0,0 +1,127 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.Pinpoint.DeleteGCMChannel
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes the GCM channel for an app.
+module Network.AWS.Pinpoint.DeleteGCMChannel
+    (
+    -- * Creating a Request
+      deleteGCMChannel
+    , DeleteGCMChannel
+    -- * Request Lenses
+    , dgcApplicationId
+
+    -- * Destructuring the Response
+    , deleteGCMChannelResponse
+    , DeleteGCMChannelResponse
+    -- * Response Lenses
+    , dgcrsResponseStatus
+    , dgcrsGCMChannelResponse
+    ) where
+
+import           Network.AWS.Lens
+import           Network.AWS.Pinpoint.Types
+import           Network.AWS.Pinpoint.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'deleteGCMChannel' smart constructor.
+newtype DeleteGCMChannel = DeleteGCMChannel'
+    { _dgcApplicationId :: Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DeleteGCMChannel' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dgcApplicationId' - Undocumented member.
+deleteGCMChannel
+    :: Text -- ^ 'dgcApplicationId'
+    -> DeleteGCMChannel
+deleteGCMChannel pApplicationId_ =
+    DeleteGCMChannel'
+    { _dgcApplicationId = pApplicationId_
+    }
+
+-- | Undocumented member.
+dgcApplicationId :: Lens' DeleteGCMChannel Text
+dgcApplicationId = lens _dgcApplicationId (\ s a -> s{_dgcApplicationId = a});
+
+instance AWSRequest DeleteGCMChannel where
+        type Rs DeleteGCMChannel = DeleteGCMChannelResponse
+        request = delete pinpoint
+        response
+          = receiveJSON
+              (\ s h x ->
+                 DeleteGCMChannelResponse' <$>
+                   (pure (fromEnum s)) <*> (eitherParseJSON x))
+
+instance Hashable DeleteGCMChannel
+
+instance NFData DeleteGCMChannel
+
+instance ToHeaders DeleteGCMChannel where
+        toHeaders
+          = const
+              (mconcat
+                 ["Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToPath DeleteGCMChannel where
+        toPath DeleteGCMChannel'{..}
+          = mconcat
+              ["/v1/apps/", toBS _dgcApplicationId,
+               "/channels/gcm"]
+
+instance ToQuery DeleteGCMChannel where
+        toQuery = const mempty
+
+-- | /See:/ 'deleteGCMChannelResponse' smart constructor.
+data DeleteGCMChannelResponse = DeleteGCMChannelResponse'
+    { _dgcrsResponseStatus     :: !Int
+    , _dgcrsGCMChannelResponse :: !GCMChannelResponse
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DeleteGCMChannelResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dgcrsResponseStatus' - -- | The response status code.
+--
+-- * 'dgcrsGCMChannelResponse' - Undocumented member.
+deleteGCMChannelResponse
+    :: Int -- ^ 'dgcrsResponseStatus'
+    -> GCMChannelResponse -- ^ 'dgcrsGCMChannelResponse'
+    -> DeleteGCMChannelResponse
+deleteGCMChannelResponse pResponseStatus_ pGCMChannelResponse_ =
+    DeleteGCMChannelResponse'
+    { _dgcrsResponseStatus = pResponseStatus_
+    , _dgcrsGCMChannelResponse = pGCMChannelResponse_
+    }
+
+-- | -- | The response status code.
+dgcrsResponseStatus :: Lens' DeleteGCMChannelResponse Int
+dgcrsResponseStatus = lens _dgcrsResponseStatus (\ s a -> s{_dgcrsResponseStatus = a});
+
+-- | Undocumented member.
+dgcrsGCMChannelResponse :: Lens' DeleteGCMChannelResponse GCMChannelResponse
+dgcrsGCMChannelResponse = lens _dgcrsGCMChannelResponse (\ s a -> s{_dgcrsGCMChannelResponse = a});
+
+instance NFData DeleteGCMChannelResponse
diff --git a/gen/Network/AWS/Pinpoint/DeleteSegment.hs b/gen/Network/AWS/Pinpoint/DeleteSegment.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Pinpoint/DeleteSegment.hs
@@ -0,0 +1,137 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.Pinpoint.DeleteSegment
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes a segment.
+module Network.AWS.Pinpoint.DeleteSegment
+    (
+    -- * Creating a Request
+      deleteSegment
+    , DeleteSegment
+    -- * Request Lenses
+    , dsSegmentId
+    , dsApplicationId
+
+    -- * Destructuring the Response
+    , deleteSegmentResponse
+    , DeleteSegmentResponse
+    -- * Response Lenses
+    , dsrsResponseStatus
+    , dsrsSegmentResponse
+    ) where
+
+import           Network.AWS.Lens
+import           Network.AWS.Pinpoint.Types
+import           Network.AWS.Pinpoint.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'deleteSegment' smart constructor.
+data DeleteSegment = DeleteSegment'
+    { _dsSegmentId     :: !Text
+    , _dsApplicationId :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DeleteSegment' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dsSegmentId' - Undocumented member.
+--
+-- * 'dsApplicationId' - Undocumented member.
+deleteSegment
+    :: Text -- ^ 'dsSegmentId'
+    -> Text -- ^ 'dsApplicationId'
+    -> DeleteSegment
+deleteSegment pSegmentId_ pApplicationId_ =
+    DeleteSegment'
+    { _dsSegmentId = pSegmentId_
+    , _dsApplicationId = pApplicationId_
+    }
+
+-- | Undocumented member.
+dsSegmentId :: Lens' DeleteSegment Text
+dsSegmentId = lens _dsSegmentId (\ s a -> s{_dsSegmentId = a});
+
+-- | Undocumented member.
+dsApplicationId :: Lens' DeleteSegment Text
+dsApplicationId = lens _dsApplicationId (\ s a -> s{_dsApplicationId = a});
+
+instance AWSRequest DeleteSegment where
+        type Rs DeleteSegment = DeleteSegmentResponse
+        request = delete pinpoint
+        response
+          = receiveJSON
+              (\ s h x ->
+                 DeleteSegmentResponse' <$>
+                   (pure (fromEnum s)) <*> (eitherParseJSON x))
+
+instance Hashable DeleteSegment
+
+instance NFData DeleteSegment
+
+instance ToHeaders DeleteSegment where
+        toHeaders
+          = const
+              (mconcat
+                 ["Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToPath DeleteSegment where
+        toPath DeleteSegment'{..}
+          = mconcat
+              ["/v1/apps/", toBS _dsApplicationId, "/segments/",
+               toBS _dsSegmentId]
+
+instance ToQuery DeleteSegment where
+        toQuery = const mempty
+
+-- | /See:/ 'deleteSegmentResponse' smart constructor.
+data DeleteSegmentResponse = DeleteSegmentResponse'
+    { _dsrsResponseStatus  :: !Int
+    , _dsrsSegmentResponse :: !SegmentResponse
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DeleteSegmentResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dsrsResponseStatus' - -- | The response status code.
+--
+-- * 'dsrsSegmentResponse' - Undocumented member.
+deleteSegmentResponse
+    :: Int -- ^ 'dsrsResponseStatus'
+    -> SegmentResponse -- ^ 'dsrsSegmentResponse'
+    -> DeleteSegmentResponse
+deleteSegmentResponse pResponseStatus_ pSegmentResponse_ =
+    DeleteSegmentResponse'
+    { _dsrsResponseStatus = pResponseStatus_
+    , _dsrsSegmentResponse = pSegmentResponse_
+    }
+
+-- | -- | The response status code.
+dsrsResponseStatus :: Lens' DeleteSegmentResponse Int
+dsrsResponseStatus = lens _dsrsResponseStatus (\ s a -> s{_dsrsResponseStatus = a});
+
+-- | Undocumented member.
+dsrsSegmentResponse :: Lens' DeleteSegmentResponse SegmentResponse
+dsrsSegmentResponse = lens _dsrsSegmentResponse (\ s a -> s{_dsrsSegmentResponse = a});
+
+instance NFData DeleteSegmentResponse
diff --git a/gen/Network/AWS/Pinpoint/GetAPNSChannel.hs b/gen/Network/AWS/Pinpoint/GetAPNSChannel.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Pinpoint/GetAPNSChannel.hs
@@ -0,0 +1,127 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.Pinpoint.GetAPNSChannel
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns information about the APNs channel for an app.
+module Network.AWS.Pinpoint.GetAPNSChannel
+    (
+    -- * Creating a Request
+      getAPNSChannel
+    , GetAPNSChannel
+    -- * Request Lenses
+    , gacApplicationId
+
+    -- * Destructuring the Response
+    , getAPNSChannelResponse
+    , GetAPNSChannelResponse
+    -- * Response Lenses
+    , gacrsResponseStatus
+    , gacrsAPNSChannelResponse
+    ) where
+
+import           Network.AWS.Lens
+import           Network.AWS.Pinpoint.Types
+import           Network.AWS.Pinpoint.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'getAPNSChannel' smart constructor.
+newtype GetAPNSChannel = GetAPNSChannel'
+    { _gacApplicationId :: Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetAPNSChannel' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gacApplicationId' - Undocumented member.
+getAPNSChannel
+    :: Text -- ^ 'gacApplicationId'
+    -> GetAPNSChannel
+getAPNSChannel pApplicationId_ =
+    GetAPNSChannel'
+    { _gacApplicationId = pApplicationId_
+    }
+
+-- | Undocumented member.
+gacApplicationId :: Lens' GetAPNSChannel Text
+gacApplicationId = lens _gacApplicationId (\ s a -> s{_gacApplicationId = a});
+
+instance AWSRequest GetAPNSChannel where
+        type Rs GetAPNSChannel = GetAPNSChannelResponse
+        request = get pinpoint
+        response
+          = receiveJSON
+              (\ s h x ->
+                 GetAPNSChannelResponse' <$>
+                   (pure (fromEnum s)) <*> (eitherParseJSON x))
+
+instance Hashable GetAPNSChannel
+
+instance NFData GetAPNSChannel
+
+instance ToHeaders GetAPNSChannel where
+        toHeaders
+          = const
+              (mconcat
+                 ["Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToPath GetAPNSChannel where
+        toPath GetAPNSChannel'{..}
+          = mconcat
+              ["/v1/apps/", toBS _gacApplicationId,
+               "/channels/apns"]
+
+instance ToQuery GetAPNSChannel where
+        toQuery = const mempty
+
+-- | /See:/ 'getAPNSChannelResponse' smart constructor.
+data GetAPNSChannelResponse = GetAPNSChannelResponse'
+    { _gacrsResponseStatus      :: !Int
+    , _gacrsAPNSChannelResponse :: !APNSChannelResponse
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetAPNSChannelResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gacrsResponseStatus' - -- | The response status code.
+--
+-- * 'gacrsAPNSChannelResponse' - Undocumented member.
+getAPNSChannelResponse
+    :: Int -- ^ 'gacrsResponseStatus'
+    -> APNSChannelResponse -- ^ 'gacrsAPNSChannelResponse'
+    -> GetAPNSChannelResponse
+getAPNSChannelResponse pResponseStatus_ pAPNSChannelResponse_ =
+    GetAPNSChannelResponse'
+    { _gacrsResponseStatus = pResponseStatus_
+    , _gacrsAPNSChannelResponse = pAPNSChannelResponse_
+    }
+
+-- | -- | The response status code.
+gacrsResponseStatus :: Lens' GetAPNSChannelResponse Int
+gacrsResponseStatus = lens _gacrsResponseStatus (\ s a -> s{_gacrsResponseStatus = a});
+
+-- | Undocumented member.
+gacrsAPNSChannelResponse :: Lens' GetAPNSChannelResponse APNSChannelResponse
+gacrsAPNSChannelResponse = lens _gacrsAPNSChannelResponse (\ s a -> s{_gacrsAPNSChannelResponse = a});
+
+instance NFData GetAPNSChannelResponse
diff --git a/gen/Network/AWS/Pinpoint/GetApplicationSettings.hs b/gen/Network/AWS/Pinpoint/GetApplicationSettings.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Pinpoint/GetApplicationSettings.hs
@@ -0,0 +1,127 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.Pinpoint.GetApplicationSettings
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Used to request the settings for an app.
+module Network.AWS.Pinpoint.GetApplicationSettings
+    (
+    -- * Creating a Request
+      getApplicationSettings
+    , GetApplicationSettings
+    -- * Request Lenses
+    , gasApplicationId
+
+    -- * Destructuring the Response
+    , getApplicationSettingsResponse
+    , GetApplicationSettingsResponse
+    -- * Response Lenses
+    , gasrsResponseStatus
+    , gasrsApplicationSettingsResource
+    ) where
+
+import           Network.AWS.Lens
+import           Network.AWS.Pinpoint.Types
+import           Network.AWS.Pinpoint.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'getApplicationSettings' smart constructor.
+newtype GetApplicationSettings = GetApplicationSettings'
+    { _gasApplicationId :: Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetApplicationSettings' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gasApplicationId' - Undocumented member.
+getApplicationSettings
+    :: Text -- ^ 'gasApplicationId'
+    -> GetApplicationSettings
+getApplicationSettings pApplicationId_ =
+    GetApplicationSettings'
+    { _gasApplicationId = pApplicationId_
+    }
+
+-- | Undocumented member.
+gasApplicationId :: Lens' GetApplicationSettings Text
+gasApplicationId = lens _gasApplicationId (\ s a -> s{_gasApplicationId = a});
+
+instance AWSRequest GetApplicationSettings where
+        type Rs GetApplicationSettings =
+             GetApplicationSettingsResponse
+        request = get pinpoint
+        response
+          = receiveJSON
+              (\ s h x ->
+                 GetApplicationSettingsResponse' <$>
+                   (pure (fromEnum s)) <*> (eitherParseJSON x))
+
+instance Hashable GetApplicationSettings
+
+instance NFData GetApplicationSettings
+
+instance ToHeaders GetApplicationSettings where
+        toHeaders
+          = const
+              (mconcat
+                 ["Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToPath GetApplicationSettings where
+        toPath GetApplicationSettings'{..}
+          = mconcat
+              ["/v1/apps/", toBS _gasApplicationId, "/settings"]
+
+instance ToQuery GetApplicationSettings where
+        toQuery = const mempty
+
+-- | /See:/ 'getApplicationSettingsResponse' smart constructor.
+data GetApplicationSettingsResponse = GetApplicationSettingsResponse'
+    { _gasrsResponseStatus              :: !Int
+    , _gasrsApplicationSettingsResource :: !ApplicationSettingsResource
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetApplicationSettingsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gasrsResponseStatus' - -- | The response status code.
+--
+-- * 'gasrsApplicationSettingsResource' - Undocumented member.
+getApplicationSettingsResponse
+    :: Int -- ^ 'gasrsResponseStatus'
+    -> ApplicationSettingsResource -- ^ 'gasrsApplicationSettingsResource'
+    -> GetApplicationSettingsResponse
+getApplicationSettingsResponse pResponseStatus_ pApplicationSettingsResource_ =
+    GetApplicationSettingsResponse'
+    { _gasrsResponseStatus = pResponseStatus_
+    , _gasrsApplicationSettingsResource = pApplicationSettingsResource_
+    }
+
+-- | -- | The response status code.
+gasrsResponseStatus :: Lens' GetApplicationSettingsResponse Int
+gasrsResponseStatus = lens _gasrsResponseStatus (\ s a -> s{_gasrsResponseStatus = a});
+
+-- | Undocumented member.
+gasrsApplicationSettingsResource :: Lens' GetApplicationSettingsResponse ApplicationSettingsResource
+gasrsApplicationSettingsResource = lens _gasrsApplicationSettingsResource (\ s a -> s{_gasrsApplicationSettingsResource = a});
+
+instance NFData GetApplicationSettingsResponse
diff --git a/gen/Network/AWS/Pinpoint/GetCampaign.hs b/gen/Network/AWS/Pinpoint/GetCampaign.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Pinpoint/GetCampaign.hs
@@ -0,0 +1,137 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.Pinpoint.GetCampaign
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns information about a campaign.
+module Network.AWS.Pinpoint.GetCampaign
+    (
+    -- * Creating a Request
+      getCampaign
+    , GetCampaign
+    -- * Request Lenses
+    , getCampaignId
+    , getApplicationId
+
+    -- * Destructuring the Response
+    , getCampaignResponse
+    , GetCampaignResponse
+    -- * Response Lenses
+    , gcrsResponseStatus
+    , gcrsCampaignResponse
+    ) where
+
+import           Network.AWS.Lens
+import           Network.AWS.Pinpoint.Types
+import           Network.AWS.Pinpoint.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'getCampaign' smart constructor.
+data GetCampaign = GetCampaign'
+    { _getCampaignId    :: !Text
+    , _getApplicationId :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetCampaign' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'getCampaignId' - Undocumented member.
+--
+-- * 'getApplicationId' - Undocumented member.
+getCampaign
+    :: Text -- ^ 'getCampaignId'
+    -> Text -- ^ 'getApplicationId'
+    -> GetCampaign
+getCampaign pCampaignId_ pApplicationId_ =
+    GetCampaign'
+    { _getCampaignId = pCampaignId_
+    , _getApplicationId = pApplicationId_
+    }
+
+-- | Undocumented member.
+getCampaignId :: Lens' GetCampaign Text
+getCampaignId = lens _getCampaignId (\ s a -> s{_getCampaignId = a});
+
+-- | Undocumented member.
+getApplicationId :: Lens' GetCampaign Text
+getApplicationId = lens _getApplicationId (\ s a -> s{_getApplicationId = a});
+
+instance AWSRequest GetCampaign where
+        type Rs GetCampaign = GetCampaignResponse
+        request = get pinpoint
+        response
+          = receiveJSON
+              (\ s h x ->
+                 GetCampaignResponse' <$>
+                   (pure (fromEnum s)) <*> (eitherParseJSON x))
+
+instance Hashable GetCampaign
+
+instance NFData GetCampaign
+
+instance ToHeaders GetCampaign where
+        toHeaders
+          = const
+              (mconcat
+                 ["Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToPath GetCampaign where
+        toPath GetCampaign'{..}
+          = mconcat
+              ["/v1/apps/", toBS _getApplicationId, "/campaigns/",
+               toBS _getCampaignId]
+
+instance ToQuery GetCampaign where
+        toQuery = const mempty
+
+-- | /See:/ 'getCampaignResponse' smart constructor.
+data GetCampaignResponse = GetCampaignResponse'
+    { _gcrsResponseStatus   :: !Int
+    , _gcrsCampaignResponse :: !CampaignResponse
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetCampaignResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gcrsResponseStatus' - -- | The response status code.
+--
+-- * 'gcrsCampaignResponse' - Undocumented member.
+getCampaignResponse
+    :: Int -- ^ 'gcrsResponseStatus'
+    -> CampaignResponse -- ^ 'gcrsCampaignResponse'
+    -> GetCampaignResponse
+getCampaignResponse pResponseStatus_ pCampaignResponse_ =
+    GetCampaignResponse'
+    { _gcrsResponseStatus = pResponseStatus_
+    , _gcrsCampaignResponse = pCampaignResponse_
+    }
+
+-- | -- | The response status code.
+gcrsResponseStatus :: Lens' GetCampaignResponse Int
+gcrsResponseStatus = lens _gcrsResponseStatus (\ s a -> s{_gcrsResponseStatus = a});
+
+-- | Undocumented member.
+gcrsCampaignResponse :: Lens' GetCampaignResponse CampaignResponse
+gcrsCampaignResponse = lens _gcrsCampaignResponse (\ s a -> s{_gcrsCampaignResponse = a});
+
+instance NFData GetCampaignResponse
diff --git a/gen/Network/AWS/Pinpoint/GetCampaignActivities.hs b/gen/Network/AWS/Pinpoint/GetCampaignActivities.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Pinpoint/GetCampaignActivities.hs
@@ -0,0 +1,158 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.Pinpoint.GetCampaignActivities
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns information about the activity performed by a campaign.
+module Network.AWS.Pinpoint.GetCampaignActivities
+    (
+    -- * Creating a Request
+      getCampaignActivities
+    , GetCampaignActivities
+    -- * Request Lenses
+    , gcaToken
+    , gcaPageSize
+    , gcaApplicationId
+    , gcaCampaignId
+
+    -- * Destructuring the Response
+    , getCampaignActivitiesResponse
+    , GetCampaignActivitiesResponse
+    -- * Response Lenses
+    , gcarsResponseStatus
+    , gcarsActivitiesResponse
+    ) where
+
+import           Network.AWS.Lens
+import           Network.AWS.Pinpoint.Types
+import           Network.AWS.Pinpoint.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'getCampaignActivities' smart constructor.
+data GetCampaignActivities = GetCampaignActivities'
+    { _gcaToken         :: !(Maybe Text)
+    , _gcaPageSize      :: !(Maybe Text)
+    , _gcaApplicationId :: !Text
+    , _gcaCampaignId    :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetCampaignActivities' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gcaToken' - Undocumented member.
+--
+-- * 'gcaPageSize' - Undocumented member.
+--
+-- * 'gcaApplicationId' - Undocumented member.
+--
+-- * 'gcaCampaignId' - Undocumented member.
+getCampaignActivities
+    :: Text -- ^ 'gcaApplicationId'
+    -> Text -- ^ 'gcaCampaignId'
+    -> GetCampaignActivities
+getCampaignActivities pApplicationId_ pCampaignId_ =
+    GetCampaignActivities'
+    { _gcaToken = Nothing
+    , _gcaPageSize = Nothing
+    , _gcaApplicationId = pApplicationId_
+    , _gcaCampaignId = pCampaignId_
+    }
+
+-- | Undocumented member.
+gcaToken :: Lens' GetCampaignActivities (Maybe Text)
+gcaToken = lens _gcaToken (\ s a -> s{_gcaToken = a});
+
+-- | Undocumented member.
+gcaPageSize :: Lens' GetCampaignActivities (Maybe Text)
+gcaPageSize = lens _gcaPageSize (\ s a -> s{_gcaPageSize = a});
+
+-- | Undocumented member.
+gcaApplicationId :: Lens' GetCampaignActivities Text
+gcaApplicationId = lens _gcaApplicationId (\ s a -> s{_gcaApplicationId = a});
+
+-- | Undocumented member.
+gcaCampaignId :: Lens' GetCampaignActivities Text
+gcaCampaignId = lens _gcaCampaignId (\ s a -> s{_gcaCampaignId = a});
+
+instance AWSRequest GetCampaignActivities where
+        type Rs GetCampaignActivities =
+             GetCampaignActivitiesResponse
+        request = get pinpoint
+        response
+          = receiveJSON
+              (\ s h x ->
+                 GetCampaignActivitiesResponse' <$>
+                   (pure (fromEnum s)) <*> (eitherParseJSON x))
+
+instance Hashable GetCampaignActivities
+
+instance NFData GetCampaignActivities
+
+instance ToHeaders GetCampaignActivities where
+        toHeaders
+          = const
+              (mconcat
+                 ["Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToPath GetCampaignActivities where
+        toPath GetCampaignActivities'{..}
+          = mconcat
+              ["/v1/apps/", toBS _gcaApplicationId, "/campaigns/",
+               toBS _gcaCampaignId, "/activities"]
+
+instance ToQuery GetCampaignActivities where
+        toQuery GetCampaignActivities'{..}
+          = mconcat
+              ["token" =: _gcaToken, "page-size" =: _gcaPageSize]
+
+-- | /See:/ 'getCampaignActivitiesResponse' smart constructor.
+data GetCampaignActivitiesResponse = GetCampaignActivitiesResponse'
+    { _gcarsResponseStatus     :: !Int
+    , _gcarsActivitiesResponse :: !ActivitiesResponse
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetCampaignActivitiesResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gcarsResponseStatus' - -- | The response status code.
+--
+-- * 'gcarsActivitiesResponse' - Undocumented member.
+getCampaignActivitiesResponse
+    :: Int -- ^ 'gcarsResponseStatus'
+    -> ActivitiesResponse -- ^ 'gcarsActivitiesResponse'
+    -> GetCampaignActivitiesResponse
+getCampaignActivitiesResponse pResponseStatus_ pActivitiesResponse_ =
+    GetCampaignActivitiesResponse'
+    { _gcarsResponseStatus = pResponseStatus_
+    , _gcarsActivitiesResponse = pActivitiesResponse_
+    }
+
+-- | -- | The response status code.
+gcarsResponseStatus :: Lens' GetCampaignActivitiesResponse Int
+gcarsResponseStatus = lens _gcarsResponseStatus (\ s a -> s{_gcarsResponseStatus = a});
+
+-- | Undocumented member.
+gcarsActivitiesResponse :: Lens' GetCampaignActivitiesResponse ActivitiesResponse
+gcarsActivitiesResponse = lens _gcarsActivitiesResponse (\ s a -> s{_gcarsActivitiesResponse = a});
+
+instance NFData GetCampaignActivitiesResponse
diff --git a/gen/Network/AWS/Pinpoint/GetCampaignVersion.hs b/gen/Network/AWS/Pinpoint/GetCampaignVersion.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Pinpoint/GetCampaignVersion.hs
@@ -0,0 +1,149 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.Pinpoint.GetCampaignVersion
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns information about your campaign versions.
+module Network.AWS.Pinpoint.GetCampaignVersion
+    (
+    -- * Creating a Request
+      getCampaignVersion
+    , GetCampaignVersion
+    -- * Request Lenses
+    , gcvcVersion
+    , gcvcApplicationId
+    , gcvcCampaignId
+
+    -- * Destructuring the Response
+    , getCampaignVersionResponse
+    , GetCampaignVersionResponse
+    -- * Response Lenses
+    , gcvcrsResponseStatus
+    , gcvcrsCampaignResponse
+    ) where
+
+import           Network.AWS.Lens
+import           Network.AWS.Pinpoint.Types
+import           Network.AWS.Pinpoint.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'getCampaignVersion' smart constructor.
+data GetCampaignVersion = GetCampaignVersion'
+    { _gcvcVersion       :: !Text
+    , _gcvcApplicationId :: !Text
+    , _gcvcCampaignId    :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetCampaignVersion' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gcvcVersion' - Undocumented member.
+--
+-- * 'gcvcApplicationId' - Undocumented member.
+--
+-- * 'gcvcCampaignId' - Undocumented member.
+getCampaignVersion
+    :: Text -- ^ 'gcvcVersion'
+    -> Text -- ^ 'gcvcApplicationId'
+    -> Text -- ^ 'gcvcCampaignId'
+    -> GetCampaignVersion
+getCampaignVersion pVersion_ pApplicationId_ pCampaignId_ =
+    GetCampaignVersion'
+    { _gcvcVersion = pVersion_
+    , _gcvcApplicationId = pApplicationId_
+    , _gcvcCampaignId = pCampaignId_
+    }
+
+-- | Undocumented member.
+gcvcVersion :: Lens' GetCampaignVersion Text
+gcvcVersion = lens _gcvcVersion (\ s a -> s{_gcvcVersion = a});
+
+-- | Undocumented member.
+gcvcApplicationId :: Lens' GetCampaignVersion Text
+gcvcApplicationId = lens _gcvcApplicationId (\ s a -> s{_gcvcApplicationId = a});
+
+-- | Undocumented member.
+gcvcCampaignId :: Lens' GetCampaignVersion Text
+gcvcCampaignId = lens _gcvcCampaignId (\ s a -> s{_gcvcCampaignId = a});
+
+instance AWSRequest GetCampaignVersion where
+        type Rs GetCampaignVersion =
+             GetCampaignVersionResponse
+        request = get pinpoint
+        response
+          = receiveJSON
+              (\ s h x ->
+                 GetCampaignVersionResponse' <$>
+                   (pure (fromEnum s)) <*> (eitherParseJSON x))
+
+instance Hashable GetCampaignVersion
+
+instance NFData GetCampaignVersion
+
+instance ToHeaders GetCampaignVersion where
+        toHeaders
+          = const
+              (mconcat
+                 ["Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToPath GetCampaignVersion where
+        toPath GetCampaignVersion'{..}
+          = mconcat
+              ["/v1/apps/", toBS _gcvcApplicationId, "/campaigns/",
+               toBS _gcvcCampaignId, "/versions/",
+               toBS _gcvcVersion]
+
+instance ToQuery GetCampaignVersion where
+        toQuery = const mempty
+
+-- | /See:/ 'getCampaignVersionResponse' smart constructor.
+data GetCampaignVersionResponse = GetCampaignVersionResponse'
+    { _gcvcrsResponseStatus   :: !Int
+    , _gcvcrsCampaignResponse :: !CampaignResponse
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetCampaignVersionResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gcvcrsResponseStatus' - -- | The response status code.
+--
+-- * 'gcvcrsCampaignResponse' - Undocumented member.
+getCampaignVersionResponse
+    :: Int -- ^ 'gcvcrsResponseStatus'
+    -> CampaignResponse -- ^ 'gcvcrsCampaignResponse'
+    -> GetCampaignVersionResponse
+getCampaignVersionResponse pResponseStatus_ pCampaignResponse_ =
+    GetCampaignVersionResponse'
+    { _gcvcrsResponseStatus = pResponseStatus_
+    , _gcvcrsCampaignResponse = pCampaignResponse_
+    }
+
+-- | -- | The response status code.
+gcvcrsResponseStatus :: Lens' GetCampaignVersionResponse Int
+gcvcrsResponseStatus = lens _gcvcrsResponseStatus (\ s a -> s{_gcvcrsResponseStatus = a});
+
+-- | Undocumented member.
+gcvcrsCampaignResponse :: Lens' GetCampaignVersionResponse CampaignResponse
+gcvcrsCampaignResponse = lens _gcvcrsCampaignResponse (\ s a -> s{_gcvcrsCampaignResponse = a});
+
+instance NFData GetCampaignVersionResponse
diff --git a/gen/Network/AWS/Pinpoint/GetCampaignVersions.hs b/gen/Network/AWS/Pinpoint/GetCampaignVersions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Pinpoint/GetCampaignVersions.hs
@@ -0,0 +1,158 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.Pinpoint.GetCampaignVersions
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns information about your campaign versions.
+module Network.AWS.Pinpoint.GetCampaignVersions
+    (
+    -- * Creating a Request
+      getCampaignVersions
+    , GetCampaignVersions
+    -- * Request Lenses
+    , gcvToken
+    , gcvPageSize
+    , gcvApplicationId
+    , gcvCampaignId
+
+    -- * Destructuring the Response
+    , getCampaignVersionsResponse
+    , GetCampaignVersionsResponse
+    -- * Response Lenses
+    , gcvrsResponseStatus
+    , gcvrsCampaignsResponse
+    ) where
+
+import           Network.AWS.Lens
+import           Network.AWS.Pinpoint.Types
+import           Network.AWS.Pinpoint.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'getCampaignVersions' smart constructor.
+data GetCampaignVersions = GetCampaignVersions'
+    { _gcvToken         :: !(Maybe Text)
+    , _gcvPageSize      :: !(Maybe Text)
+    , _gcvApplicationId :: !Text
+    , _gcvCampaignId    :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetCampaignVersions' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gcvToken' - Undocumented member.
+--
+-- * 'gcvPageSize' - Undocumented member.
+--
+-- * 'gcvApplicationId' - Undocumented member.
+--
+-- * 'gcvCampaignId' - Undocumented member.
+getCampaignVersions
+    :: Text -- ^ 'gcvApplicationId'
+    -> Text -- ^ 'gcvCampaignId'
+    -> GetCampaignVersions
+getCampaignVersions pApplicationId_ pCampaignId_ =
+    GetCampaignVersions'
+    { _gcvToken = Nothing
+    , _gcvPageSize = Nothing
+    , _gcvApplicationId = pApplicationId_
+    , _gcvCampaignId = pCampaignId_
+    }
+
+-- | Undocumented member.
+gcvToken :: Lens' GetCampaignVersions (Maybe Text)
+gcvToken = lens _gcvToken (\ s a -> s{_gcvToken = a});
+
+-- | Undocumented member.
+gcvPageSize :: Lens' GetCampaignVersions (Maybe Text)
+gcvPageSize = lens _gcvPageSize (\ s a -> s{_gcvPageSize = a});
+
+-- | Undocumented member.
+gcvApplicationId :: Lens' GetCampaignVersions Text
+gcvApplicationId = lens _gcvApplicationId (\ s a -> s{_gcvApplicationId = a});
+
+-- | Undocumented member.
+gcvCampaignId :: Lens' GetCampaignVersions Text
+gcvCampaignId = lens _gcvCampaignId (\ s a -> s{_gcvCampaignId = a});
+
+instance AWSRequest GetCampaignVersions where
+        type Rs GetCampaignVersions =
+             GetCampaignVersionsResponse
+        request = get pinpoint
+        response
+          = receiveJSON
+              (\ s h x ->
+                 GetCampaignVersionsResponse' <$>
+                   (pure (fromEnum s)) <*> (eitherParseJSON x))
+
+instance Hashable GetCampaignVersions
+
+instance NFData GetCampaignVersions
+
+instance ToHeaders GetCampaignVersions where
+        toHeaders
+          = const
+              (mconcat
+                 ["Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToPath GetCampaignVersions where
+        toPath GetCampaignVersions'{..}
+          = mconcat
+              ["/v1/apps/", toBS _gcvApplicationId, "/campaigns/",
+               toBS _gcvCampaignId, "/versions"]
+
+instance ToQuery GetCampaignVersions where
+        toQuery GetCampaignVersions'{..}
+          = mconcat
+              ["token" =: _gcvToken, "page-size" =: _gcvPageSize]
+
+-- | /See:/ 'getCampaignVersionsResponse' smart constructor.
+data GetCampaignVersionsResponse = GetCampaignVersionsResponse'
+    { _gcvrsResponseStatus    :: !Int
+    , _gcvrsCampaignsResponse :: !CampaignsResponse
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetCampaignVersionsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gcvrsResponseStatus' - -- | The response status code.
+--
+-- * 'gcvrsCampaignsResponse' - Undocumented member.
+getCampaignVersionsResponse
+    :: Int -- ^ 'gcvrsResponseStatus'
+    -> CampaignsResponse -- ^ 'gcvrsCampaignsResponse'
+    -> GetCampaignVersionsResponse
+getCampaignVersionsResponse pResponseStatus_ pCampaignsResponse_ =
+    GetCampaignVersionsResponse'
+    { _gcvrsResponseStatus = pResponseStatus_
+    , _gcvrsCampaignsResponse = pCampaignsResponse_
+    }
+
+-- | -- | The response status code.
+gcvrsResponseStatus :: Lens' GetCampaignVersionsResponse Int
+gcvrsResponseStatus = lens _gcvrsResponseStatus (\ s a -> s{_gcvrsResponseStatus = a});
+
+-- | Undocumented member.
+gcvrsCampaignsResponse :: Lens' GetCampaignVersionsResponse CampaignsResponse
+gcvrsCampaignsResponse = lens _gcvrsCampaignsResponse (\ s a -> s{_gcvrsCampaignsResponse = a});
+
+instance NFData GetCampaignVersionsResponse
diff --git a/gen/Network/AWS/Pinpoint/GetCampaigns.hs b/gen/Network/AWS/Pinpoint/GetCampaigns.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Pinpoint/GetCampaigns.hs
@@ -0,0 +1,146 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.Pinpoint.GetCampaigns
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns information about your campaigns.
+module Network.AWS.Pinpoint.GetCampaigns
+    (
+    -- * Creating a Request
+      getCampaigns
+    , GetCampaigns
+    -- * Request Lenses
+    , gcsToken
+    , gcsPageSize
+    , gcsApplicationId
+
+    -- * Destructuring the Response
+    , getCampaignsResponse
+    , GetCampaignsResponse
+    -- * Response Lenses
+    , gcsrsResponseStatus
+    , gcsrsCampaignsResponse
+    ) where
+
+import           Network.AWS.Lens
+import           Network.AWS.Pinpoint.Types
+import           Network.AWS.Pinpoint.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'getCampaigns' smart constructor.
+data GetCampaigns = GetCampaigns'
+    { _gcsToken         :: !(Maybe Text)
+    , _gcsPageSize      :: !(Maybe Text)
+    , _gcsApplicationId :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetCampaigns' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gcsToken' - Undocumented member.
+--
+-- * 'gcsPageSize' - Undocumented member.
+--
+-- * 'gcsApplicationId' - Undocumented member.
+getCampaigns
+    :: Text -- ^ 'gcsApplicationId'
+    -> GetCampaigns
+getCampaigns pApplicationId_ =
+    GetCampaigns'
+    { _gcsToken = Nothing
+    , _gcsPageSize = Nothing
+    , _gcsApplicationId = pApplicationId_
+    }
+
+-- | Undocumented member.
+gcsToken :: Lens' GetCampaigns (Maybe Text)
+gcsToken = lens _gcsToken (\ s a -> s{_gcsToken = a});
+
+-- | Undocumented member.
+gcsPageSize :: Lens' GetCampaigns (Maybe Text)
+gcsPageSize = lens _gcsPageSize (\ s a -> s{_gcsPageSize = a});
+
+-- | Undocumented member.
+gcsApplicationId :: Lens' GetCampaigns Text
+gcsApplicationId = lens _gcsApplicationId (\ s a -> s{_gcsApplicationId = a});
+
+instance AWSRequest GetCampaigns where
+        type Rs GetCampaigns = GetCampaignsResponse
+        request = get pinpoint
+        response
+          = receiveJSON
+              (\ s h x ->
+                 GetCampaignsResponse' <$>
+                   (pure (fromEnum s)) <*> (eitherParseJSON x))
+
+instance Hashable GetCampaigns
+
+instance NFData GetCampaigns
+
+instance ToHeaders GetCampaigns where
+        toHeaders
+          = const
+              (mconcat
+                 ["Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToPath GetCampaigns where
+        toPath GetCampaigns'{..}
+          = mconcat
+              ["/v1/apps/", toBS _gcsApplicationId, "/campaigns"]
+
+instance ToQuery GetCampaigns where
+        toQuery GetCampaigns'{..}
+          = mconcat
+              ["token" =: _gcsToken, "page-size" =: _gcsPageSize]
+
+-- | /See:/ 'getCampaignsResponse' smart constructor.
+data GetCampaignsResponse = GetCampaignsResponse'
+    { _gcsrsResponseStatus    :: !Int
+    , _gcsrsCampaignsResponse :: !CampaignsResponse
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetCampaignsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gcsrsResponseStatus' - -- | The response status code.
+--
+-- * 'gcsrsCampaignsResponse' - Undocumented member.
+getCampaignsResponse
+    :: Int -- ^ 'gcsrsResponseStatus'
+    -> CampaignsResponse -- ^ 'gcsrsCampaignsResponse'
+    -> GetCampaignsResponse
+getCampaignsResponse pResponseStatus_ pCampaignsResponse_ =
+    GetCampaignsResponse'
+    { _gcsrsResponseStatus = pResponseStatus_
+    , _gcsrsCampaignsResponse = pCampaignsResponse_
+    }
+
+-- | -- | The response status code.
+gcsrsResponseStatus :: Lens' GetCampaignsResponse Int
+gcsrsResponseStatus = lens _gcsrsResponseStatus (\ s a -> s{_gcsrsResponseStatus = a});
+
+-- | Undocumented member.
+gcsrsCampaignsResponse :: Lens' GetCampaignsResponse CampaignsResponse
+gcsrsCampaignsResponse = lens _gcsrsCampaignsResponse (\ s a -> s{_gcsrsCampaignsResponse = a});
+
+instance NFData GetCampaignsResponse
diff --git a/gen/Network/AWS/Pinpoint/GetEndpoint.hs b/gen/Network/AWS/Pinpoint/GetEndpoint.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Pinpoint/GetEndpoint.hs
@@ -0,0 +1,137 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.Pinpoint.GetEndpoint
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns information about an endpoint.
+module Network.AWS.Pinpoint.GetEndpoint
+    (
+    -- * Creating a Request
+      getEndpoint
+    , GetEndpoint
+    -- * Request Lenses
+    , geApplicationId
+    , geEndpointId
+
+    -- * Destructuring the Response
+    , getEndpointResponse
+    , GetEndpointResponse
+    -- * Response Lenses
+    , gersResponseStatus
+    , gersEndpointResponse
+    ) where
+
+import           Network.AWS.Lens
+import           Network.AWS.Pinpoint.Types
+import           Network.AWS.Pinpoint.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'getEndpoint' smart constructor.
+data GetEndpoint = GetEndpoint'
+    { _geApplicationId :: !Text
+    , _geEndpointId    :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetEndpoint' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'geApplicationId' - Undocumented member.
+--
+-- * 'geEndpointId' - Undocumented member.
+getEndpoint
+    :: Text -- ^ 'geApplicationId'
+    -> Text -- ^ 'geEndpointId'
+    -> GetEndpoint
+getEndpoint pApplicationId_ pEndpointId_ =
+    GetEndpoint'
+    { _geApplicationId = pApplicationId_
+    , _geEndpointId = pEndpointId_
+    }
+
+-- | Undocumented member.
+geApplicationId :: Lens' GetEndpoint Text
+geApplicationId = lens _geApplicationId (\ s a -> s{_geApplicationId = a});
+
+-- | Undocumented member.
+geEndpointId :: Lens' GetEndpoint Text
+geEndpointId = lens _geEndpointId (\ s a -> s{_geEndpointId = a});
+
+instance AWSRequest GetEndpoint where
+        type Rs GetEndpoint = GetEndpointResponse
+        request = get pinpoint
+        response
+          = receiveJSON
+              (\ s h x ->
+                 GetEndpointResponse' <$>
+                   (pure (fromEnum s)) <*> (eitherParseJSON x))
+
+instance Hashable GetEndpoint
+
+instance NFData GetEndpoint
+
+instance ToHeaders GetEndpoint where
+        toHeaders
+          = const
+              (mconcat
+                 ["Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToPath GetEndpoint where
+        toPath GetEndpoint'{..}
+          = mconcat
+              ["/v1/apps/", toBS _geApplicationId, "/endpoints/",
+               toBS _geEndpointId]
+
+instance ToQuery GetEndpoint where
+        toQuery = const mempty
+
+-- | /See:/ 'getEndpointResponse' smart constructor.
+data GetEndpointResponse = GetEndpointResponse'
+    { _gersResponseStatus   :: !Int
+    , _gersEndpointResponse :: !EndpointResponse
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetEndpointResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gersResponseStatus' - -- | The response status code.
+--
+-- * 'gersEndpointResponse' - Undocumented member.
+getEndpointResponse
+    :: Int -- ^ 'gersResponseStatus'
+    -> EndpointResponse -- ^ 'gersEndpointResponse'
+    -> GetEndpointResponse
+getEndpointResponse pResponseStatus_ pEndpointResponse_ =
+    GetEndpointResponse'
+    { _gersResponseStatus = pResponseStatus_
+    , _gersEndpointResponse = pEndpointResponse_
+    }
+
+-- | -- | The response status code.
+gersResponseStatus :: Lens' GetEndpointResponse Int
+gersResponseStatus = lens _gersResponseStatus (\ s a -> s{_gersResponseStatus = a});
+
+-- | Undocumented member.
+gersEndpointResponse :: Lens' GetEndpointResponse EndpointResponse
+gersEndpointResponse = lens _gersEndpointResponse (\ s a -> s{_gersEndpointResponse = a});
+
+instance NFData GetEndpointResponse
diff --git a/gen/Network/AWS/Pinpoint/GetGCMChannel.hs b/gen/Network/AWS/Pinpoint/GetGCMChannel.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Pinpoint/GetGCMChannel.hs
@@ -0,0 +1,127 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.Pinpoint.GetGCMChannel
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns information about the GCM channel for an app.
+module Network.AWS.Pinpoint.GetGCMChannel
+    (
+    -- * Creating a Request
+      getGCMChannel
+    , GetGCMChannel
+    -- * Request Lenses
+    , ggcApplicationId
+
+    -- * Destructuring the Response
+    , getGCMChannelResponse
+    , GetGCMChannelResponse
+    -- * Response Lenses
+    , ggcrsResponseStatus
+    , ggcrsGCMChannelResponse
+    ) where
+
+import           Network.AWS.Lens
+import           Network.AWS.Pinpoint.Types
+import           Network.AWS.Pinpoint.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'getGCMChannel' smart constructor.
+newtype GetGCMChannel = GetGCMChannel'
+    { _ggcApplicationId :: Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetGCMChannel' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ggcApplicationId' - Undocumented member.
+getGCMChannel
+    :: Text -- ^ 'ggcApplicationId'
+    -> GetGCMChannel
+getGCMChannel pApplicationId_ =
+    GetGCMChannel'
+    { _ggcApplicationId = pApplicationId_
+    }
+
+-- | Undocumented member.
+ggcApplicationId :: Lens' GetGCMChannel Text
+ggcApplicationId = lens _ggcApplicationId (\ s a -> s{_ggcApplicationId = a});
+
+instance AWSRequest GetGCMChannel where
+        type Rs GetGCMChannel = GetGCMChannelResponse
+        request = get pinpoint
+        response
+          = receiveJSON
+              (\ s h x ->
+                 GetGCMChannelResponse' <$>
+                   (pure (fromEnum s)) <*> (eitherParseJSON x))
+
+instance Hashable GetGCMChannel
+
+instance NFData GetGCMChannel
+
+instance ToHeaders GetGCMChannel where
+        toHeaders
+          = const
+              (mconcat
+                 ["Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToPath GetGCMChannel where
+        toPath GetGCMChannel'{..}
+          = mconcat
+              ["/v1/apps/", toBS _ggcApplicationId,
+               "/channels/gcm"]
+
+instance ToQuery GetGCMChannel where
+        toQuery = const mempty
+
+-- | /See:/ 'getGCMChannelResponse' smart constructor.
+data GetGCMChannelResponse = GetGCMChannelResponse'
+    { _ggcrsResponseStatus     :: !Int
+    , _ggcrsGCMChannelResponse :: !GCMChannelResponse
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetGCMChannelResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ggcrsResponseStatus' - -- | The response status code.
+--
+-- * 'ggcrsGCMChannelResponse' - Undocumented member.
+getGCMChannelResponse
+    :: Int -- ^ 'ggcrsResponseStatus'
+    -> GCMChannelResponse -- ^ 'ggcrsGCMChannelResponse'
+    -> GetGCMChannelResponse
+getGCMChannelResponse pResponseStatus_ pGCMChannelResponse_ =
+    GetGCMChannelResponse'
+    { _ggcrsResponseStatus = pResponseStatus_
+    , _ggcrsGCMChannelResponse = pGCMChannelResponse_
+    }
+
+-- | -- | The response status code.
+ggcrsResponseStatus :: Lens' GetGCMChannelResponse Int
+ggcrsResponseStatus = lens _ggcrsResponseStatus (\ s a -> s{_ggcrsResponseStatus = a});
+
+-- | Undocumented member.
+ggcrsGCMChannelResponse :: Lens' GetGCMChannelResponse GCMChannelResponse
+ggcrsGCMChannelResponse = lens _ggcrsGCMChannelResponse (\ s a -> s{_ggcrsGCMChannelResponse = a});
+
+instance NFData GetGCMChannelResponse
diff --git a/gen/Network/AWS/Pinpoint/GetImportJob.hs b/gen/Network/AWS/Pinpoint/GetImportJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Pinpoint/GetImportJob.hs
@@ -0,0 +1,137 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.Pinpoint.GetImportJob
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns information about an import job.
+module Network.AWS.Pinpoint.GetImportJob
+    (
+    -- * Creating a Request
+      getImportJob
+    , GetImportJob
+    -- * Request Lenses
+    , gijApplicationId
+    , gijJobId
+
+    -- * Destructuring the Response
+    , getImportJobResponse
+    , GetImportJobResponse
+    -- * Response Lenses
+    , gijrsResponseStatus
+    , gijrsImportJobResponse
+    ) where
+
+import           Network.AWS.Lens
+import           Network.AWS.Pinpoint.Types
+import           Network.AWS.Pinpoint.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'getImportJob' smart constructor.
+data GetImportJob = GetImportJob'
+    { _gijApplicationId :: !Text
+    , _gijJobId         :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetImportJob' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gijApplicationId' - Undocumented member.
+--
+-- * 'gijJobId' - Undocumented member.
+getImportJob
+    :: Text -- ^ 'gijApplicationId'
+    -> Text -- ^ 'gijJobId'
+    -> GetImportJob
+getImportJob pApplicationId_ pJobId_ =
+    GetImportJob'
+    { _gijApplicationId = pApplicationId_
+    , _gijJobId = pJobId_
+    }
+
+-- | Undocumented member.
+gijApplicationId :: Lens' GetImportJob Text
+gijApplicationId = lens _gijApplicationId (\ s a -> s{_gijApplicationId = a});
+
+-- | Undocumented member.
+gijJobId :: Lens' GetImportJob Text
+gijJobId = lens _gijJobId (\ s a -> s{_gijJobId = a});
+
+instance AWSRequest GetImportJob where
+        type Rs GetImportJob = GetImportJobResponse
+        request = get pinpoint
+        response
+          = receiveJSON
+              (\ s h x ->
+                 GetImportJobResponse' <$>
+                   (pure (fromEnum s)) <*> (eitherParseJSON x))
+
+instance Hashable GetImportJob
+
+instance NFData GetImportJob
+
+instance ToHeaders GetImportJob where
+        toHeaders
+          = const
+              (mconcat
+                 ["Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToPath GetImportJob where
+        toPath GetImportJob'{..}
+          = mconcat
+              ["/v1/apps/", toBS _gijApplicationId,
+               "/jobs/import/", toBS _gijJobId]
+
+instance ToQuery GetImportJob where
+        toQuery = const mempty
+
+-- | /See:/ 'getImportJobResponse' smart constructor.
+data GetImportJobResponse = GetImportJobResponse'
+    { _gijrsResponseStatus    :: !Int
+    , _gijrsImportJobResponse :: !ImportJobResponse
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetImportJobResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gijrsResponseStatus' - -- | The response status code.
+--
+-- * 'gijrsImportJobResponse' - Undocumented member.
+getImportJobResponse
+    :: Int -- ^ 'gijrsResponseStatus'
+    -> ImportJobResponse -- ^ 'gijrsImportJobResponse'
+    -> GetImportJobResponse
+getImportJobResponse pResponseStatus_ pImportJobResponse_ =
+    GetImportJobResponse'
+    { _gijrsResponseStatus = pResponseStatus_
+    , _gijrsImportJobResponse = pImportJobResponse_
+    }
+
+-- | -- | The response status code.
+gijrsResponseStatus :: Lens' GetImportJobResponse Int
+gijrsResponseStatus = lens _gijrsResponseStatus (\ s a -> s{_gijrsResponseStatus = a});
+
+-- | Undocumented member.
+gijrsImportJobResponse :: Lens' GetImportJobResponse ImportJobResponse
+gijrsImportJobResponse = lens _gijrsImportJobResponse (\ s a -> s{_gijrsImportJobResponse = a});
+
+instance NFData GetImportJobResponse
diff --git a/gen/Network/AWS/Pinpoint/GetImportJobs.hs b/gen/Network/AWS/Pinpoint/GetImportJobs.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Pinpoint/GetImportJobs.hs
@@ -0,0 +1,147 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.Pinpoint.GetImportJobs
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns information about your import jobs.
+module Network.AWS.Pinpoint.GetImportJobs
+    (
+    -- * Creating a Request
+      getImportJobs
+    , GetImportJobs
+    -- * Request Lenses
+    , gijsToken
+    , gijsPageSize
+    , gijsApplicationId
+
+    -- * Destructuring the Response
+    , getImportJobsResponse
+    , GetImportJobsResponse
+    -- * Response Lenses
+    , gijsrsResponseStatus
+    , gijsrsImportJobsResponse
+    ) where
+
+import           Network.AWS.Lens
+import           Network.AWS.Pinpoint.Types
+import           Network.AWS.Pinpoint.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'getImportJobs' smart constructor.
+data GetImportJobs = GetImportJobs'
+    { _gijsToken         :: !(Maybe Text)
+    , _gijsPageSize      :: !(Maybe Text)
+    , _gijsApplicationId :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetImportJobs' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gijsToken' - Undocumented member.
+--
+-- * 'gijsPageSize' - Undocumented member.
+--
+-- * 'gijsApplicationId' - Undocumented member.
+getImportJobs
+    :: Text -- ^ 'gijsApplicationId'
+    -> GetImportJobs
+getImportJobs pApplicationId_ =
+    GetImportJobs'
+    { _gijsToken = Nothing
+    , _gijsPageSize = Nothing
+    , _gijsApplicationId = pApplicationId_
+    }
+
+-- | Undocumented member.
+gijsToken :: Lens' GetImportJobs (Maybe Text)
+gijsToken = lens _gijsToken (\ s a -> s{_gijsToken = a});
+
+-- | Undocumented member.
+gijsPageSize :: Lens' GetImportJobs (Maybe Text)
+gijsPageSize = lens _gijsPageSize (\ s a -> s{_gijsPageSize = a});
+
+-- | Undocumented member.
+gijsApplicationId :: Lens' GetImportJobs Text
+gijsApplicationId = lens _gijsApplicationId (\ s a -> s{_gijsApplicationId = a});
+
+instance AWSRequest GetImportJobs where
+        type Rs GetImportJobs = GetImportJobsResponse
+        request = get pinpoint
+        response
+          = receiveJSON
+              (\ s h x ->
+                 GetImportJobsResponse' <$>
+                   (pure (fromEnum s)) <*> (eitherParseJSON x))
+
+instance Hashable GetImportJobs
+
+instance NFData GetImportJobs
+
+instance ToHeaders GetImportJobs where
+        toHeaders
+          = const
+              (mconcat
+                 ["Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToPath GetImportJobs where
+        toPath GetImportJobs'{..}
+          = mconcat
+              ["/v1/apps/", toBS _gijsApplicationId,
+               "/jobs/import"]
+
+instance ToQuery GetImportJobs where
+        toQuery GetImportJobs'{..}
+          = mconcat
+              ["token" =: _gijsToken, "page-size" =: _gijsPageSize]
+
+-- | /See:/ 'getImportJobsResponse' smart constructor.
+data GetImportJobsResponse = GetImportJobsResponse'
+    { _gijsrsResponseStatus     :: !Int
+    , _gijsrsImportJobsResponse :: !ImportJobsResponse
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetImportJobsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gijsrsResponseStatus' - -- | The response status code.
+--
+-- * 'gijsrsImportJobsResponse' - Undocumented member.
+getImportJobsResponse
+    :: Int -- ^ 'gijsrsResponseStatus'
+    -> ImportJobsResponse -- ^ 'gijsrsImportJobsResponse'
+    -> GetImportJobsResponse
+getImportJobsResponse pResponseStatus_ pImportJobsResponse_ =
+    GetImportJobsResponse'
+    { _gijsrsResponseStatus = pResponseStatus_
+    , _gijsrsImportJobsResponse = pImportJobsResponse_
+    }
+
+-- | -- | The response status code.
+gijsrsResponseStatus :: Lens' GetImportJobsResponse Int
+gijsrsResponseStatus = lens _gijsrsResponseStatus (\ s a -> s{_gijsrsResponseStatus = a});
+
+-- | Undocumented member.
+gijsrsImportJobsResponse :: Lens' GetImportJobsResponse ImportJobsResponse
+gijsrsImportJobsResponse = lens _gijsrsImportJobsResponse (\ s a -> s{_gijsrsImportJobsResponse = a});
+
+instance NFData GetImportJobsResponse
diff --git a/gen/Network/AWS/Pinpoint/GetSegment.hs b/gen/Network/AWS/Pinpoint/GetSegment.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Pinpoint/GetSegment.hs
@@ -0,0 +1,137 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.Pinpoint.GetSegment
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns information about a segment.
+module Network.AWS.Pinpoint.GetSegment
+    (
+    -- * Creating a Request
+      getSegment
+    , GetSegment
+    -- * Request Lenses
+    , gsSegmentId
+    , gsApplicationId
+
+    -- * Destructuring the Response
+    , getSegmentResponse
+    , GetSegmentResponse
+    -- * Response Lenses
+    , getrsResponseStatus
+    , getrsSegmentResponse
+    ) where
+
+import           Network.AWS.Lens
+import           Network.AWS.Pinpoint.Types
+import           Network.AWS.Pinpoint.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'getSegment' smart constructor.
+data GetSegment = GetSegment'
+    { _gsSegmentId     :: !Text
+    , _gsApplicationId :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetSegment' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gsSegmentId' - Undocumented member.
+--
+-- * 'gsApplicationId' - Undocumented member.
+getSegment
+    :: Text -- ^ 'gsSegmentId'
+    -> Text -- ^ 'gsApplicationId'
+    -> GetSegment
+getSegment pSegmentId_ pApplicationId_ =
+    GetSegment'
+    { _gsSegmentId = pSegmentId_
+    , _gsApplicationId = pApplicationId_
+    }
+
+-- | Undocumented member.
+gsSegmentId :: Lens' GetSegment Text
+gsSegmentId = lens _gsSegmentId (\ s a -> s{_gsSegmentId = a});
+
+-- | Undocumented member.
+gsApplicationId :: Lens' GetSegment Text
+gsApplicationId = lens _gsApplicationId (\ s a -> s{_gsApplicationId = a});
+
+instance AWSRequest GetSegment where
+        type Rs GetSegment = GetSegmentResponse
+        request = get pinpoint
+        response
+          = receiveJSON
+              (\ s h x ->
+                 GetSegmentResponse' <$>
+                   (pure (fromEnum s)) <*> (eitherParseJSON x))
+
+instance Hashable GetSegment
+
+instance NFData GetSegment
+
+instance ToHeaders GetSegment where
+        toHeaders
+          = const
+              (mconcat
+                 ["Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToPath GetSegment where
+        toPath GetSegment'{..}
+          = mconcat
+              ["/v1/apps/", toBS _gsApplicationId, "/segments/",
+               toBS _gsSegmentId]
+
+instance ToQuery GetSegment where
+        toQuery = const mempty
+
+-- | /See:/ 'getSegmentResponse' smart constructor.
+data GetSegmentResponse = GetSegmentResponse'
+    { _getrsResponseStatus  :: !Int
+    , _getrsSegmentResponse :: !SegmentResponse
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetSegmentResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'getrsResponseStatus' - -- | The response status code.
+--
+-- * 'getrsSegmentResponse' - Undocumented member.
+getSegmentResponse
+    :: Int -- ^ 'getrsResponseStatus'
+    -> SegmentResponse -- ^ 'getrsSegmentResponse'
+    -> GetSegmentResponse
+getSegmentResponse pResponseStatus_ pSegmentResponse_ =
+    GetSegmentResponse'
+    { _getrsResponseStatus = pResponseStatus_
+    , _getrsSegmentResponse = pSegmentResponse_
+    }
+
+-- | -- | The response status code.
+getrsResponseStatus :: Lens' GetSegmentResponse Int
+getrsResponseStatus = lens _getrsResponseStatus (\ s a -> s{_getrsResponseStatus = a});
+
+-- | Undocumented member.
+getrsSegmentResponse :: Lens' GetSegmentResponse SegmentResponse
+getrsSegmentResponse = lens _getrsSegmentResponse (\ s a -> s{_getrsSegmentResponse = a});
+
+instance NFData GetSegmentResponse
diff --git a/gen/Network/AWS/Pinpoint/GetSegmentImportJobs.hs b/gen/Network/AWS/Pinpoint/GetSegmentImportJobs.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Pinpoint/GetSegmentImportJobs.hs
@@ -0,0 +1,158 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.Pinpoint.GetSegmentImportJobs
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns a list of import jobs for a specific segment.
+module Network.AWS.Pinpoint.GetSegmentImportJobs
+    (
+    -- * Creating a Request
+      getSegmentImportJobs
+    , GetSegmentImportJobs
+    -- * Request Lenses
+    , gsijToken
+    , gsijPageSize
+    , gsijSegmentId
+    , gsijApplicationId
+
+    -- * Destructuring the Response
+    , getSegmentImportJobsResponse
+    , GetSegmentImportJobsResponse
+    -- * Response Lenses
+    , gsijrsResponseStatus
+    , gsijrsImportJobsResponse
+    ) where
+
+import           Network.AWS.Lens
+import           Network.AWS.Pinpoint.Types
+import           Network.AWS.Pinpoint.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'getSegmentImportJobs' smart constructor.
+data GetSegmentImportJobs = GetSegmentImportJobs'
+    { _gsijToken         :: !(Maybe Text)
+    , _gsijPageSize      :: !(Maybe Text)
+    , _gsijSegmentId     :: !Text
+    , _gsijApplicationId :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetSegmentImportJobs' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gsijToken' - Undocumented member.
+--
+-- * 'gsijPageSize' - Undocumented member.
+--
+-- * 'gsijSegmentId' - Undocumented member.
+--
+-- * 'gsijApplicationId' - Undocumented member.
+getSegmentImportJobs
+    :: Text -- ^ 'gsijSegmentId'
+    -> Text -- ^ 'gsijApplicationId'
+    -> GetSegmentImportJobs
+getSegmentImportJobs pSegmentId_ pApplicationId_ =
+    GetSegmentImportJobs'
+    { _gsijToken = Nothing
+    , _gsijPageSize = Nothing
+    , _gsijSegmentId = pSegmentId_
+    , _gsijApplicationId = pApplicationId_
+    }
+
+-- | Undocumented member.
+gsijToken :: Lens' GetSegmentImportJobs (Maybe Text)
+gsijToken = lens _gsijToken (\ s a -> s{_gsijToken = a});
+
+-- | Undocumented member.
+gsijPageSize :: Lens' GetSegmentImportJobs (Maybe Text)
+gsijPageSize = lens _gsijPageSize (\ s a -> s{_gsijPageSize = a});
+
+-- | Undocumented member.
+gsijSegmentId :: Lens' GetSegmentImportJobs Text
+gsijSegmentId = lens _gsijSegmentId (\ s a -> s{_gsijSegmentId = a});
+
+-- | Undocumented member.
+gsijApplicationId :: Lens' GetSegmentImportJobs Text
+gsijApplicationId = lens _gsijApplicationId (\ s a -> s{_gsijApplicationId = a});
+
+instance AWSRequest GetSegmentImportJobs where
+        type Rs GetSegmentImportJobs =
+             GetSegmentImportJobsResponse
+        request = get pinpoint
+        response
+          = receiveJSON
+              (\ s h x ->
+                 GetSegmentImportJobsResponse' <$>
+                   (pure (fromEnum s)) <*> (eitherParseJSON x))
+
+instance Hashable GetSegmentImportJobs
+
+instance NFData GetSegmentImportJobs
+
+instance ToHeaders GetSegmentImportJobs where
+        toHeaders
+          = const
+              (mconcat
+                 ["Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToPath GetSegmentImportJobs where
+        toPath GetSegmentImportJobs'{..}
+          = mconcat
+              ["/v1/apps/", toBS _gsijApplicationId, "/segments/",
+               toBS _gsijSegmentId, "/jobs/import"]
+
+instance ToQuery GetSegmentImportJobs where
+        toQuery GetSegmentImportJobs'{..}
+          = mconcat
+              ["token" =: _gsijToken, "page-size" =: _gsijPageSize]
+
+-- | /See:/ 'getSegmentImportJobsResponse' smart constructor.
+data GetSegmentImportJobsResponse = GetSegmentImportJobsResponse'
+    { _gsijrsResponseStatus     :: !Int
+    , _gsijrsImportJobsResponse :: !ImportJobsResponse
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetSegmentImportJobsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gsijrsResponseStatus' - -- | The response status code.
+--
+-- * 'gsijrsImportJobsResponse' - Undocumented member.
+getSegmentImportJobsResponse
+    :: Int -- ^ 'gsijrsResponseStatus'
+    -> ImportJobsResponse -- ^ 'gsijrsImportJobsResponse'
+    -> GetSegmentImportJobsResponse
+getSegmentImportJobsResponse pResponseStatus_ pImportJobsResponse_ =
+    GetSegmentImportJobsResponse'
+    { _gsijrsResponseStatus = pResponseStatus_
+    , _gsijrsImportJobsResponse = pImportJobsResponse_
+    }
+
+-- | -- | The response status code.
+gsijrsResponseStatus :: Lens' GetSegmentImportJobsResponse Int
+gsijrsResponseStatus = lens _gsijrsResponseStatus (\ s a -> s{_gsijrsResponseStatus = a});
+
+-- | Undocumented member.
+gsijrsImportJobsResponse :: Lens' GetSegmentImportJobsResponse ImportJobsResponse
+gsijrsImportJobsResponse = lens _gsijrsImportJobsResponse (\ s a -> s{_gsijrsImportJobsResponse = a});
+
+instance NFData GetSegmentImportJobsResponse
diff --git a/gen/Network/AWS/Pinpoint/GetSegmentVersion.hs b/gen/Network/AWS/Pinpoint/GetSegmentVersion.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Pinpoint/GetSegmentVersion.hs
@@ -0,0 +1,147 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.Pinpoint.GetSegmentVersion
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns information about a segment version.
+module Network.AWS.Pinpoint.GetSegmentVersion
+    (
+    -- * Creating a Request
+      getSegmentVersion
+    , GetSegmentVersion
+    -- * Request Lenses
+    , gSegmentId
+    , gVersion
+    , gApplicationId
+
+    -- * Destructuring the Response
+    , getSegmentVersionResponse
+    , GetSegmentVersionResponse
+    -- * Response Lenses
+    , gsvrsResponseStatus
+    , gsvrsSegmentResponse
+    ) where
+
+import           Network.AWS.Lens
+import           Network.AWS.Pinpoint.Types
+import           Network.AWS.Pinpoint.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'getSegmentVersion' smart constructor.
+data GetSegmentVersion = GetSegmentVersion'
+    { _gSegmentId     :: !Text
+    , _gVersion       :: !Text
+    , _gApplicationId :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetSegmentVersion' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gSegmentId' - Undocumented member.
+--
+-- * 'gVersion' - Undocumented member.
+--
+-- * 'gApplicationId' - Undocumented member.
+getSegmentVersion
+    :: Text -- ^ 'gSegmentId'
+    -> Text -- ^ 'gVersion'
+    -> Text -- ^ 'gApplicationId'
+    -> GetSegmentVersion
+getSegmentVersion pSegmentId_ pVersion_ pApplicationId_ =
+    GetSegmentVersion'
+    { _gSegmentId = pSegmentId_
+    , _gVersion = pVersion_
+    , _gApplicationId = pApplicationId_
+    }
+
+-- | Undocumented member.
+gSegmentId :: Lens' GetSegmentVersion Text
+gSegmentId = lens _gSegmentId (\ s a -> s{_gSegmentId = a});
+
+-- | Undocumented member.
+gVersion :: Lens' GetSegmentVersion Text
+gVersion = lens _gVersion (\ s a -> s{_gVersion = a});
+
+-- | Undocumented member.
+gApplicationId :: Lens' GetSegmentVersion Text
+gApplicationId = lens _gApplicationId (\ s a -> s{_gApplicationId = a});
+
+instance AWSRequest GetSegmentVersion where
+        type Rs GetSegmentVersion = GetSegmentVersionResponse
+        request = get pinpoint
+        response
+          = receiveJSON
+              (\ s h x ->
+                 GetSegmentVersionResponse' <$>
+                   (pure (fromEnum s)) <*> (eitherParseJSON x))
+
+instance Hashable GetSegmentVersion
+
+instance NFData GetSegmentVersion
+
+instance ToHeaders GetSegmentVersion where
+        toHeaders
+          = const
+              (mconcat
+                 ["Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToPath GetSegmentVersion where
+        toPath GetSegmentVersion'{..}
+          = mconcat
+              ["/v1/apps/", toBS _gApplicationId, "/segments/",
+               toBS _gSegmentId, "/versions/", toBS _gVersion]
+
+instance ToQuery GetSegmentVersion where
+        toQuery = const mempty
+
+-- | /See:/ 'getSegmentVersionResponse' smart constructor.
+data GetSegmentVersionResponse = GetSegmentVersionResponse'
+    { _gsvrsResponseStatus  :: !Int
+    , _gsvrsSegmentResponse :: !SegmentResponse
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetSegmentVersionResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gsvrsResponseStatus' - -- | The response status code.
+--
+-- * 'gsvrsSegmentResponse' - Undocumented member.
+getSegmentVersionResponse
+    :: Int -- ^ 'gsvrsResponseStatus'
+    -> SegmentResponse -- ^ 'gsvrsSegmentResponse'
+    -> GetSegmentVersionResponse
+getSegmentVersionResponse pResponseStatus_ pSegmentResponse_ =
+    GetSegmentVersionResponse'
+    { _gsvrsResponseStatus = pResponseStatus_
+    , _gsvrsSegmentResponse = pSegmentResponse_
+    }
+
+-- | -- | The response status code.
+gsvrsResponseStatus :: Lens' GetSegmentVersionResponse Int
+gsvrsResponseStatus = lens _gsvrsResponseStatus (\ s a -> s{_gsvrsResponseStatus = a});
+
+-- | Undocumented member.
+gsvrsSegmentResponse :: Lens' GetSegmentVersionResponse SegmentResponse
+gsvrsSegmentResponse = lens _gsvrsSegmentResponse (\ s a -> s{_gsvrsSegmentResponse = a});
+
+instance NFData GetSegmentVersionResponse
diff --git a/gen/Network/AWS/Pinpoint/GetSegmentVersions.hs b/gen/Network/AWS/Pinpoint/GetSegmentVersions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Pinpoint/GetSegmentVersions.hs
@@ -0,0 +1,158 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.Pinpoint.GetSegmentVersions
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns information about your segment versions.
+module Network.AWS.Pinpoint.GetSegmentVersions
+    (
+    -- * Creating a Request
+      getSegmentVersions
+    , GetSegmentVersions
+    -- * Request Lenses
+    , gsvToken
+    , gsvPageSize
+    , gsvSegmentId
+    , gsvApplicationId
+
+    -- * Destructuring the Response
+    , getSegmentVersionsResponse
+    , GetSegmentVersionsResponse
+    -- * Response Lenses
+    , grsResponseStatus
+    , grsSegmentsResponse
+    ) where
+
+import           Network.AWS.Lens
+import           Network.AWS.Pinpoint.Types
+import           Network.AWS.Pinpoint.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'getSegmentVersions' smart constructor.
+data GetSegmentVersions = GetSegmentVersions'
+    { _gsvToken         :: !(Maybe Text)
+    , _gsvPageSize      :: !(Maybe Text)
+    , _gsvSegmentId     :: !Text
+    , _gsvApplicationId :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetSegmentVersions' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gsvToken' - Undocumented member.
+--
+-- * 'gsvPageSize' - Undocumented member.
+--
+-- * 'gsvSegmentId' - Undocumented member.
+--
+-- * 'gsvApplicationId' - Undocumented member.
+getSegmentVersions
+    :: Text -- ^ 'gsvSegmentId'
+    -> Text -- ^ 'gsvApplicationId'
+    -> GetSegmentVersions
+getSegmentVersions pSegmentId_ pApplicationId_ =
+    GetSegmentVersions'
+    { _gsvToken = Nothing
+    , _gsvPageSize = Nothing
+    , _gsvSegmentId = pSegmentId_
+    , _gsvApplicationId = pApplicationId_
+    }
+
+-- | Undocumented member.
+gsvToken :: Lens' GetSegmentVersions (Maybe Text)
+gsvToken = lens _gsvToken (\ s a -> s{_gsvToken = a});
+
+-- | Undocumented member.
+gsvPageSize :: Lens' GetSegmentVersions (Maybe Text)
+gsvPageSize = lens _gsvPageSize (\ s a -> s{_gsvPageSize = a});
+
+-- | Undocumented member.
+gsvSegmentId :: Lens' GetSegmentVersions Text
+gsvSegmentId = lens _gsvSegmentId (\ s a -> s{_gsvSegmentId = a});
+
+-- | Undocumented member.
+gsvApplicationId :: Lens' GetSegmentVersions Text
+gsvApplicationId = lens _gsvApplicationId (\ s a -> s{_gsvApplicationId = a});
+
+instance AWSRequest GetSegmentVersions where
+        type Rs GetSegmentVersions =
+             GetSegmentVersionsResponse
+        request = get pinpoint
+        response
+          = receiveJSON
+              (\ s h x ->
+                 GetSegmentVersionsResponse' <$>
+                   (pure (fromEnum s)) <*> (eitherParseJSON x))
+
+instance Hashable GetSegmentVersions
+
+instance NFData GetSegmentVersions
+
+instance ToHeaders GetSegmentVersions where
+        toHeaders
+          = const
+              (mconcat
+                 ["Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToPath GetSegmentVersions where
+        toPath GetSegmentVersions'{..}
+          = mconcat
+              ["/v1/apps/", toBS _gsvApplicationId, "/segments/",
+               toBS _gsvSegmentId, "/versions"]
+
+instance ToQuery GetSegmentVersions where
+        toQuery GetSegmentVersions'{..}
+          = mconcat
+              ["token" =: _gsvToken, "page-size" =: _gsvPageSize]
+
+-- | /See:/ 'getSegmentVersionsResponse' smart constructor.
+data GetSegmentVersionsResponse = GetSegmentVersionsResponse'
+    { _grsResponseStatus   :: !Int
+    , _grsSegmentsResponse :: !SegmentsResponse
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetSegmentVersionsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'grsResponseStatus' - -- | The response status code.
+--
+-- * 'grsSegmentsResponse' - Undocumented member.
+getSegmentVersionsResponse
+    :: Int -- ^ 'grsResponseStatus'
+    -> SegmentsResponse -- ^ 'grsSegmentsResponse'
+    -> GetSegmentVersionsResponse
+getSegmentVersionsResponse pResponseStatus_ pSegmentsResponse_ =
+    GetSegmentVersionsResponse'
+    { _grsResponseStatus = pResponseStatus_
+    , _grsSegmentsResponse = pSegmentsResponse_
+    }
+
+-- | -- | The response status code.
+grsResponseStatus :: Lens' GetSegmentVersionsResponse Int
+grsResponseStatus = lens _grsResponseStatus (\ s a -> s{_grsResponseStatus = a});
+
+-- | Undocumented member.
+grsSegmentsResponse :: Lens' GetSegmentVersionsResponse SegmentsResponse
+grsSegmentsResponse = lens _grsSegmentsResponse (\ s a -> s{_grsSegmentsResponse = a});
+
+instance NFData GetSegmentVersionsResponse
diff --git a/gen/Network/AWS/Pinpoint/GetSegments.hs b/gen/Network/AWS/Pinpoint/GetSegments.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Pinpoint/GetSegments.hs
@@ -0,0 +1,146 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.Pinpoint.GetSegments
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Used to get information about your segments.
+module Network.AWS.Pinpoint.GetSegments
+    (
+    -- * Creating a Request
+      getSegments
+    , GetSegments
+    -- * Request Lenses
+    , gssToken
+    , gssPageSize
+    , gssApplicationId
+
+    -- * Destructuring the Response
+    , getSegmentsResponse
+    , GetSegmentsResponse
+    -- * Response Lenses
+    , gsrsResponseStatus
+    , gsrsSegmentsResponse
+    ) where
+
+import           Network.AWS.Lens
+import           Network.AWS.Pinpoint.Types
+import           Network.AWS.Pinpoint.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'getSegments' smart constructor.
+data GetSegments = GetSegments'
+    { _gssToken         :: !(Maybe Text)
+    , _gssPageSize      :: !(Maybe Text)
+    , _gssApplicationId :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetSegments' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gssToken' - Undocumented member.
+--
+-- * 'gssPageSize' - Undocumented member.
+--
+-- * 'gssApplicationId' - Undocumented member.
+getSegments
+    :: Text -- ^ 'gssApplicationId'
+    -> GetSegments
+getSegments pApplicationId_ =
+    GetSegments'
+    { _gssToken = Nothing
+    , _gssPageSize = Nothing
+    , _gssApplicationId = pApplicationId_
+    }
+
+-- | Undocumented member.
+gssToken :: Lens' GetSegments (Maybe Text)
+gssToken = lens _gssToken (\ s a -> s{_gssToken = a});
+
+-- | Undocumented member.
+gssPageSize :: Lens' GetSegments (Maybe Text)
+gssPageSize = lens _gssPageSize (\ s a -> s{_gssPageSize = a});
+
+-- | Undocumented member.
+gssApplicationId :: Lens' GetSegments Text
+gssApplicationId = lens _gssApplicationId (\ s a -> s{_gssApplicationId = a});
+
+instance AWSRequest GetSegments where
+        type Rs GetSegments = GetSegmentsResponse
+        request = get pinpoint
+        response
+          = receiveJSON
+              (\ s h x ->
+                 GetSegmentsResponse' <$>
+                   (pure (fromEnum s)) <*> (eitherParseJSON x))
+
+instance Hashable GetSegments
+
+instance NFData GetSegments
+
+instance ToHeaders GetSegments where
+        toHeaders
+          = const
+              (mconcat
+                 ["Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToPath GetSegments where
+        toPath GetSegments'{..}
+          = mconcat
+              ["/v1/apps/", toBS _gssApplicationId, "/segments"]
+
+instance ToQuery GetSegments where
+        toQuery GetSegments'{..}
+          = mconcat
+              ["token" =: _gssToken, "page-size" =: _gssPageSize]
+
+-- | /See:/ 'getSegmentsResponse' smart constructor.
+data GetSegmentsResponse = GetSegmentsResponse'
+    { _gsrsResponseStatus   :: !Int
+    , _gsrsSegmentsResponse :: !SegmentsResponse
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetSegmentsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gsrsResponseStatus' - -- | The response status code.
+--
+-- * 'gsrsSegmentsResponse' - Undocumented member.
+getSegmentsResponse
+    :: Int -- ^ 'gsrsResponseStatus'
+    -> SegmentsResponse -- ^ 'gsrsSegmentsResponse'
+    -> GetSegmentsResponse
+getSegmentsResponse pResponseStatus_ pSegmentsResponse_ =
+    GetSegmentsResponse'
+    { _gsrsResponseStatus = pResponseStatus_
+    , _gsrsSegmentsResponse = pSegmentsResponse_
+    }
+
+-- | -- | The response status code.
+gsrsResponseStatus :: Lens' GetSegmentsResponse Int
+gsrsResponseStatus = lens _gsrsResponseStatus (\ s a -> s{_gsrsResponseStatus = a});
+
+-- | Undocumented member.
+gsrsSegmentsResponse :: Lens' GetSegmentsResponse SegmentsResponse
+gsrsSegmentsResponse = lens _gsrsSegmentsResponse (\ s a -> s{_gsrsSegmentsResponse = a});
+
+instance NFData GetSegmentsResponse
diff --git a/gen/Network/AWS/Pinpoint/Types.hs b/gen/Network/AWS/Pinpoint/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Pinpoint/Types.hs
@@ -0,0 +1,526 @@
+{-# LANGUAGE OverloadedStrings #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.Pinpoint.Types
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+module Network.AWS.Pinpoint.Types
+    (
+    -- * Service Configuration
+      pinpoint
+
+    -- * Errors
+    , _ForbiddenException
+    , _NotFoundException
+    , _TooManyRequestsException
+    , _InternalServerErrorException
+    , _MethodNotAllowedException
+    , _BadRequestException
+
+    -- * Action
+    , Action (..)
+
+    -- * AttributeType
+    , AttributeType (..)
+
+    -- * CampaignStatus
+    , CampaignStatus (..)
+
+    -- * ChannelType
+    , ChannelType (..)
+
+    -- * DefinitionFormat
+    , DefinitionFormat (..)
+
+    -- * DimensionType
+    , DimensionType (..)
+
+    -- * Duration
+    , Duration (..)
+
+    -- * Frequency
+    , Frequency (..)
+
+    -- * JobStatus
+    , JobStatus (..)
+
+    -- * RecencyType
+    , RecencyType (..)
+
+    -- * SegmentType
+    , SegmentType (..)
+
+    -- * APNSChannelRequest
+    , APNSChannelRequest
+    , apnsChannelRequest
+    , acrPrivateKey
+    , acrCertificate
+
+    -- * APNSChannelResponse
+    , APNSChannelResponse
+    , apnsChannelResponse
+    , acPlatform
+    , acLastModifiedDate
+    , acIsArchived
+    , acApplicationId
+    , acVersion
+    , acId
+    , acCreationDate
+    , acLastModifiedBy
+
+    -- * ActivitiesResponse
+    , ActivitiesResponse
+    , activitiesResponse
+    , aItem
+
+    -- * ActivityResponse
+    , ActivityResponse
+    , activityResponse
+    , aState
+    , aStart
+    , aCampaignId
+    , aResult
+    , aTreatmentId
+    , aSuccessfulEndpointCount
+    , aEnd
+    , aApplicationId
+    , aTotalEndpointCount
+    , aId
+    , aScheduledStart
+
+    -- * ApplicationSettingsResource
+    , ApplicationSettingsResource
+    , applicationSettingsResource
+    , asrLastModifiedDate
+    , asrLimits
+    , asrQuietTime
+    , asrApplicationId
+
+    -- * AttributeDimension
+    , AttributeDimension
+    , attributeDimension
+    , adValues
+    , adAttributeType
+
+    -- * CampaignLimits
+    , CampaignLimits
+    , campaignLimits
+    , clDaily
+    , clTotal
+
+    -- * CampaignResponse
+    , CampaignResponse
+    , campaignResponse
+    , cState
+    , cLastModifiedDate
+    , cSchedule
+    , cTreatmentName
+    , cLimits
+    , cIsPaused
+    , cDefaultState
+    , cApplicationId
+    , cName
+    , cVersion
+    , cHoldoutPercent
+    , cTreatmentDescription
+    , cId
+    , cCreationDate
+    , cMessageConfiguration
+    , cDescription
+    , cSegmentId
+    , cAdditionalTreatments
+    , cSegmentVersion
+
+    -- * CampaignState
+    , CampaignState
+    , campaignState
+    , csCampaignStatus
+
+    -- * CampaignsResponse
+    , CampaignsResponse
+    , campaignsResponse
+    , cNextToken
+    , cItem
+
+    -- * EndpointBatchItem
+    , EndpointBatchItem
+    , endpointBatchItem
+    , ebiRequestId
+    , ebiMetrics
+    , ebiLocation
+    , ebiDemographic
+    , ebiAddress
+    , ebiEffectiveDate
+    , ebiUser
+    , ebiAttributes
+    , ebiEndpointStatus
+    , ebiOptOut
+    , ebiId
+    , ebiChannelType
+
+    -- * EndpointBatchRequest
+    , EndpointBatchRequest
+    , endpointBatchRequest
+    , ebrItem
+
+    -- * EndpointDemographic
+    , EndpointDemographic
+    , endpointDemographic
+    , edPlatform
+    , edPlatformVersion
+    , edLocale
+    , edAppVersion
+    , edModel
+    , edMake
+    , edModelVersion
+    , edTimezone
+
+    -- * EndpointLocation
+    , EndpointLocation
+    , endpointLocation
+    , elPostalCode
+    , elLatitude
+    , elCountry
+    , elCity
+    , elRegion
+    , elLongitude
+
+    -- * EndpointRequest
+    , EndpointRequest
+    , endpointRequest
+    , erRequestId
+    , erMetrics
+    , erLocation
+    , erDemographic
+    , erAddress
+    , erEffectiveDate
+    , erUser
+    , erAttributes
+    , erEndpointStatus
+    , erOptOut
+    , erChannelType
+
+    -- * EndpointResponse
+    , EndpointResponse
+    , endpointResponse
+    , eRequestId
+    , eMetrics
+    , eLocation
+    , eDemographic
+    , eCohortId
+    , eAddress
+    , eEffectiveDate
+    , eUser
+    , eApplicationId
+    , eAttributes
+    , eEndpointStatus
+    , eOptOut
+    , eId
+    , eCreationDate
+    , eChannelType
+    , eShardId
+
+    -- * EndpointUser
+    , EndpointUser
+    , endpointUser
+    , euUserAttributes
+    , euUserId
+
+    -- * GCMChannelRequest
+    , GCMChannelRequest
+    , gcmChannelRequest
+    , gcrAPIKey
+
+    -- * GCMChannelResponse
+    , GCMChannelResponse
+    , gcmChannelResponse
+    , gcPlatform
+    , gcLastModifiedDate
+    , gcCredential
+    , gcIsArchived
+    , gcApplicationId
+    , gcVersion
+    , gcId
+    , gcCreationDate
+    , gcLastModifiedBy
+
+    -- * ImportJobRequest
+    , ImportJobRequest
+    , importJobRequest
+    , iSegmentName
+    , iFormat
+    , iDefineSegment
+    , iRegisterEndpoints
+    , iExternalId
+    , iS3URL
+    , iSegmentId
+    , iRoleARN
+
+    -- * ImportJobResource
+    , ImportJobResource
+    , importJobResource
+    , ijrSegmentName
+    , ijrFormat
+    , ijrDefineSegment
+    , ijrRegisterEndpoints
+    , ijrExternalId
+    , ijrS3URL
+    , ijrSegmentId
+    , ijrRoleARN
+
+    -- * ImportJobResponse
+    , ImportJobResponse
+    , importJobResponse
+    , ijCompletedPieces
+    , ijFailedPieces
+    , ijDefinition
+    , ijTotalProcessed
+    , ijFailures
+    , ijTotalPieces
+    , ijApplicationId
+    , ijId
+    , ijCreationDate
+    , ijType
+    , ijCompletionDate
+    , ijJobStatus
+    , ijTotalFailures
+
+    -- * ImportJobsResponse
+    , ImportJobsResponse
+    , importJobsResponse
+    , ijNextToken
+    , ijItem
+
+    -- * Message
+    , Message
+    , message
+    , mSilentPush
+    , mImageIconURL
+    , mBody
+    , mJSONBody
+    , mURL
+    , mAction
+    , mImageURL
+    , mMediaURL
+    , mTitle
+
+    -- * MessageBody
+    , MessageBody
+    , messageBody
+    , mbRequestId
+    , mbMessage
+
+    -- * MessageConfiguration
+    , MessageConfiguration
+    , messageConfiguration
+    , mcAPNSMessage
+    , mcGCMMessage
+    , mcDefaultMessage
+
+    -- * QuietTime
+    , QuietTime
+    , quietTime
+    , qtStart
+    , qtEnd
+
+    -- * RecencyDimension
+    , RecencyDimension
+    , recencyDimension
+    , rdRecencyType
+    , rdDuration
+
+    -- * Schedule
+    , Schedule
+    , schedule
+    , sFrequency
+    , sStartTime
+    , sQuietTime
+    , sIsLocalTime
+    , sEndTime
+    , sTimezone
+
+    -- * SegmentBehaviors
+    , SegmentBehaviors
+    , segmentBehaviors
+    , sbRecency
+
+    -- * SegmentDemographics
+    , SegmentDemographics
+    , segmentDemographics
+    , sdPlatform
+    , sdAppVersion
+    , sdModel
+    , sdMake
+    , sdDeviceType
+
+    -- * SegmentDimensions
+    , SegmentDimensions
+    , segmentDimensions
+    , sdLocation
+    , sdDemographic
+    , sdBehavior
+    , sdAttributes
+
+    -- * SegmentImportResource
+    , SegmentImportResource
+    , segmentImportResource
+    , sirSize
+    , sirFormat
+    , sirExternalId
+    , sirS3URL
+    , sirRoleARN
+
+    -- * SegmentLocation
+    , SegmentLocation
+    , segmentLocation
+    , slCountry
+
+    -- * SegmentResponse
+    , SegmentResponse
+    , segmentResponse
+    , sLastModifiedDate
+    , sSegmentType
+    , sApplicationId
+    , sName
+    , sVersion
+    , sId
+    , sCreationDate
+    , sImportDefinition
+    , sDimensions
+
+    -- * SegmentsResponse
+    , SegmentsResponse
+    , segmentsResponse
+    , sNextToken
+    , sItem
+
+    -- * SetDimension
+    , SetDimension
+    , setDimension
+    , sdValues
+    , sdDimensionType
+
+    -- * TreatmentResource
+    , TreatmentResource
+    , treatmentResource
+    , trState
+    , trSchedule
+    , trTreatmentName
+    , trSizePercent
+    , trTreatmentDescription
+    , trId
+    , trMessageConfiguration
+
+    -- * WriteApplicationSettingsRequest
+    , WriteApplicationSettingsRequest
+    , writeApplicationSettingsRequest
+    , wasrLimits
+    , wasrQuietTime
+
+    -- * WriteCampaignRequest
+    , WriteCampaignRequest
+    , writeCampaignRequest
+    , wcrSchedule
+    , wcrTreatmentName
+    , wcrLimits
+    , wcrIsPaused
+    , wcrName
+    , wcrHoldoutPercent
+    , wcrTreatmentDescription
+    , wcrMessageConfiguration
+    , wcrDescription
+    , wcrSegmentId
+    , wcrAdditionalTreatments
+    , wcrSegmentVersion
+
+    -- * WriteSegmentRequest
+    , WriteSegmentRequest
+    , writeSegmentRequest
+    , wsrName
+    , wsrDimensions
+
+    -- * WriteTreatmentResource
+    , WriteTreatmentResource
+    , writeTreatmentResource
+    , wtrSchedule
+    , wtrTreatmentName
+    , wtrSizePercent
+    , wtrTreatmentDescription
+    , wtrMessageConfiguration
+    ) where
+
+import           Network.AWS.Lens
+import           Network.AWS.Pinpoint.Types.Product
+import           Network.AWS.Pinpoint.Types.Sum
+import           Network.AWS.Prelude
+import           Network.AWS.Sign.V4
+
+-- | API version @2016-12-01@ of the Amazon Pinpoint SDK configuration.
+pinpoint :: Service
+pinpoint =
+    Service
+    { _svcAbbrev = "Pinpoint"
+    , _svcSigner = v4
+    , _svcPrefix = "pinpoint"
+    , _svcVersion = "2016-12-01"
+    , _svcEndpoint = defaultEndpoint pinpoint
+    , _svcTimeout = Just 70
+    , _svcCheck = statusSuccess
+    , _svcError = parseJSONError "Pinpoint"
+    , _svcRetry = retry
+    }
+  where
+    retry =
+        Exponential
+        { _retryBase = 5.0e-2
+        , _retryGrowth = 2
+        , _retryAttempts = 5
+        , _retryCheck = check
+        }
+    check e
+      | has (hasStatus 429) e = Just "too_many_requests"
+      | has (hasCode "ThrottlingException" . hasStatus 400) e =
+          Just "throttling_exception"
+      | has (hasCode "Throttling" . hasStatus 400) e = Just "throttling"
+      | has (hasStatus 504) e = Just "gateway_timeout"
+      | has (hasStatus 502) e = Just "bad_gateway"
+      | has (hasStatus 503) e = Just "service_unavailable"
+      | has (hasStatus 500) e = Just "general_server_error"
+      | has (hasStatus 509) e = Just "limit_exceeded"
+      | otherwise = Nothing
+
+-- | Prism for ForbiddenException' errors.
+_ForbiddenException :: AsError a => Getting (First ServiceError) a ServiceError
+_ForbiddenException =
+    _ServiceError . hasStatus 403 . hasCode "ForbiddenException"
+
+-- | Prism for NotFoundException' errors.
+_NotFoundException :: AsError a => Getting (First ServiceError) a ServiceError
+_NotFoundException =
+    _ServiceError . hasStatus 404 . hasCode "NotFoundException"
+
+-- | Prism for TooManyRequestsException' errors.
+_TooManyRequestsException :: AsError a => Getting (First ServiceError) a ServiceError
+_TooManyRequestsException =
+    _ServiceError . hasStatus 429 . hasCode "TooManyRequestsException"
+
+-- | Prism for InternalServerErrorException' errors.
+_InternalServerErrorException :: AsError a => Getting (First ServiceError) a ServiceError
+_InternalServerErrorException =
+    _ServiceError . hasStatus 500 . hasCode "InternalServerErrorException"
+
+-- | Prism for MethodNotAllowedException' errors.
+_MethodNotAllowedException :: AsError a => Getting (First ServiceError) a ServiceError
+_MethodNotAllowedException =
+    _ServiceError . hasStatus 405 . hasCode "MethodNotAllowedException"
+
+-- | Prism for BadRequestException' errors.
+_BadRequestException :: AsError a => Getting (First ServiceError) a ServiceError
+_BadRequestException =
+    _ServiceError . hasStatus 400 . hasCode "BadRequestException"
diff --git a/gen/Network/AWS/Pinpoint/Types/Product.hs b/gen/Network/AWS/Pinpoint/Types/Product.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Pinpoint/Types/Product.hs
@@ -0,0 +1,3136 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.Pinpoint.Types.Product
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+module Network.AWS.Pinpoint.Types.Product where
+
+import           Network.AWS.Lens
+import           Network.AWS.Pinpoint.Types.Sum
+import           Network.AWS.Prelude
+
+-- | /See:/ 'apnsChannelRequest' smart constructor.
+data APNSChannelRequest = APNSChannelRequest'
+    { _acrPrivateKey  :: !(Maybe Text)
+    , _acrCertificate :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'APNSChannelRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'acrPrivateKey' - The certificate private key.
+--
+-- * 'acrCertificate' - The distribution certificate from Apple.
+apnsChannelRequest
+    :: APNSChannelRequest
+apnsChannelRequest =
+    APNSChannelRequest'
+    { _acrPrivateKey = Nothing
+    , _acrCertificate = Nothing
+    }
+
+-- | The certificate private key.
+acrPrivateKey :: Lens' APNSChannelRequest (Maybe Text)
+acrPrivateKey = lens _acrPrivateKey (\ s a -> s{_acrPrivateKey = a});
+
+-- | The distribution certificate from Apple.
+acrCertificate :: Lens' APNSChannelRequest (Maybe Text)
+acrCertificate = lens _acrCertificate (\ s a -> s{_acrCertificate = a});
+
+instance Hashable APNSChannelRequest
+
+instance NFData APNSChannelRequest
+
+instance ToJSON APNSChannelRequest where
+        toJSON APNSChannelRequest'{..}
+          = object
+              (catMaybes
+                 [("PrivateKey" .=) <$> _acrPrivateKey,
+                  ("Certificate" .=) <$> _acrCertificate])
+
+-- | /See:/ 'apnsChannelResponse' smart constructor.
+data APNSChannelResponse = APNSChannelResponse'
+    { _acPlatform         :: !(Maybe Text)
+    , _acLastModifiedDate :: !(Maybe Text)
+    , _acIsArchived       :: !(Maybe Bool)
+    , _acApplicationId    :: !(Maybe Text)
+    , _acVersion          :: !(Maybe Int)
+    , _acId               :: !(Maybe Text)
+    , _acCreationDate     :: !(Maybe Text)
+    , _acLastModifiedBy   :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'APNSChannelResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'acPlatform' - The platform type. Will be APNS.
+--
+-- * 'acLastModifiedDate' - Last date this was updated
+--
+-- * 'acIsArchived' - Is this channel archived
+--
+-- * 'acApplicationId' - Undocumented member.
+--
+-- * 'acVersion' - Version of channel
+--
+-- * 'acId' - Undocumented member.
+--
+-- * 'acCreationDate' - When was this segment created
+--
+-- * 'acLastModifiedBy' - Who last updated this entry
+apnsChannelResponse
+    :: APNSChannelResponse
+apnsChannelResponse =
+    APNSChannelResponse'
+    { _acPlatform = Nothing
+    , _acLastModifiedDate = Nothing
+    , _acIsArchived = Nothing
+    , _acApplicationId = Nothing
+    , _acVersion = Nothing
+    , _acId = Nothing
+    , _acCreationDate = Nothing
+    , _acLastModifiedBy = Nothing
+    }
+
+-- | The platform type. Will be APNS.
+acPlatform :: Lens' APNSChannelResponse (Maybe Text)
+acPlatform = lens _acPlatform (\ s a -> s{_acPlatform = a});
+
+-- | Last date this was updated
+acLastModifiedDate :: Lens' APNSChannelResponse (Maybe Text)
+acLastModifiedDate = lens _acLastModifiedDate (\ s a -> s{_acLastModifiedDate = a});
+
+-- | Is this channel archived
+acIsArchived :: Lens' APNSChannelResponse (Maybe Bool)
+acIsArchived = lens _acIsArchived (\ s a -> s{_acIsArchived = a});
+
+-- | Undocumented member.
+acApplicationId :: Lens' APNSChannelResponse (Maybe Text)
+acApplicationId = lens _acApplicationId (\ s a -> s{_acApplicationId = a});
+
+-- | Version of channel
+acVersion :: Lens' APNSChannelResponse (Maybe Int)
+acVersion = lens _acVersion (\ s a -> s{_acVersion = a});
+
+-- | Undocumented member.
+acId :: Lens' APNSChannelResponse (Maybe Text)
+acId = lens _acId (\ s a -> s{_acId = a});
+
+-- | When was this segment created
+acCreationDate :: Lens' APNSChannelResponse (Maybe Text)
+acCreationDate = lens _acCreationDate (\ s a -> s{_acCreationDate = a});
+
+-- | Who last updated this entry
+acLastModifiedBy :: Lens' APNSChannelResponse (Maybe Text)
+acLastModifiedBy = lens _acLastModifiedBy (\ s a -> s{_acLastModifiedBy = a});
+
+instance FromJSON APNSChannelResponse where
+        parseJSON
+          = withObject "APNSChannelResponse"
+              (\ x ->
+                 APNSChannelResponse' <$>
+                   (x .:? "Platform") <*> (x .:? "LastModifiedDate") <*>
+                     (x .:? "IsArchived")
+                     <*> (x .:? "ApplicationId")
+                     <*> (x .:? "Version")
+                     <*> (x .:? "Id")
+                     <*> (x .:? "CreationDate")
+                     <*> (x .:? "LastModifiedBy"))
+
+instance Hashable APNSChannelResponse
+
+instance NFData APNSChannelResponse
+
+-- | /See:/ 'activitiesResponse' smart constructor.
+newtype ActivitiesResponse = ActivitiesResponse'
+    { _aItem :: Maybe [ActivityResponse]
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ActivitiesResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'aItem' - List of campaign activities
+activitiesResponse
+    :: ActivitiesResponse
+activitiesResponse =
+    ActivitiesResponse'
+    { _aItem = Nothing
+    }
+
+-- | List of campaign activities
+aItem :: Lens' ActivitiesResponse [ActivityResponse]
+aItem = lens _aItem (\ s a -> s{_aItem = a}) . _Default . _Coerce;
+
+instance FromJSON ActivitiesResponse where
+        parseJSON
+          = withObject "ActivitiesResponse"
+              (\ x ->
+                 ActivitiesResponse' <$> (x .:? "Item" .!= mempty))
+
+instance Hashable ActivitiesResponse
+
+instance NFData ActivitiesResponse
+
+-- | /See:/ 'activityResponse' smart constructor.
+data ActivityResponse = ActivityResponse'
+    { _aState                   :: !(Maybe Text)
+    , _aStart                   :: !(Maybe Text)
+    , _aCampaignId              :: !(Maybe Text)
+    , _aResult                  :: !(Maybe Text)
+    , _aTreatmentId             :: !(Maybe Text)
+    , _aSuccessfulEndpointCount :: !(Maybe Int)
+    , _aEnd                     :: !(Maybe Text)
+    , _aApplicationId           :: !(Maybe Text)
+    , _aTotalEndpointCount      :: !(Maybe Int)
+    , _aId                      :: !(Maybe Text)
+    , _aScheduledStart          :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ActivityResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'aState' - The state of the activity. Valid values: PENDING, INITIALIZING, RUNNING, PAUSED, CANCELLED, COMPLETED
+--
+-- * 'aStart' - The actual start time of the activity in ISO 8601 format.
+--
+-- * 'aCampaignId' - The ID of the campaign to which the activity applies.
+--
+-- * 'aResult' - Indicates whether the activity succeeded. Valid values: SUCCESS, FAIL
+--
+-- * 'aTreatmentId' - The ID of a variation of the campaign used for A/B testing.
+--
+-- * 'aSuccessfulEndpointCount' - The total number of endpoints to which the campaign successfully delivered messages.
+--
+-- * 'aEnd' - The actual time the activity was marked CANCELLED or COMPLETED. Provided in ISO 8601 format.
+--
+-- * 'aApplicationId' - The ID of the application to which the campaign applies.
+--
+-- * 'aTotalEndpointCount' - The total number of endpoints to which the campaign attempts to deliver messages.
+--
+-- * 'aId' - The unique activity ID.
+--
+-- * 'aScheduledStart' - The scheduled start time for the activity in ISO 8601 format.
+activityResponse
+    :: ActivityResponse
+activityResponse =
+    ActivityResponse'
+    { _aState = Nothing
+    , _aStart = Nothing
+    , _aCampaignId = Nothing
+    , _aResult = Nothing
+    , _aTreatmentId = Nothing
+    , _aSuccessfulEndpointCount = Nothing
+    , _aEnd = Nothing
+    , _aApplicationId = Nothing
+    , _aTotalEndpointCount = Nothing
+    , _aId = Nothing
+    , _aScheduledStart = Nothing
+    }
+
+-- | The state of the activity. Valid values: PENDING, INITIALIZING, RUNNING, PAUSED, CANCELLED, COMPLETED
+aState :: Lens' ActivityResponse (Maybe Text)
+aState = lens _aState (\ s a -> s{_aState = a});
+
+-- | The actual start time of the activity in ISO 8601 format.
+aStart :: Lens' ActivityResponse (Maybe Text)
+aStart = lens _aStart (\ s a -> s{_aStart = a});
+
+-- | The ID of the campaign to which the activity applies.
+aCampaignId :: Lens' ActivityResponse (Maybe Text)
+aCampaignId = lens _aCampaignId (\ s a -> s{_aCampaignId = a});
+
+-- | Indicates whether the activity succeeded. Valid values: SUCCESS, FAIL
+aResult :: Lens' ActivityResponse (Maybe Text)
+aResult = lens _aResult (\ s a -> s{_aResult = a});
+
+-- | The ID of a variation of the campaign used for A/B testing.
+aTreatmentId :: Lens' ActivityResponse (Maybe Text)
+aTreatmentId = lens _aTreatmentId (\ s a -> s{_aTreatmentId = a});
+
+-- | The total number of endpoints to which the campaign successfully delivered messages.
+aSuccessfulEndpointCount :: Lens' ActivityResponse (Maybe Int)
+aSuccessfulEndpointCount = lens _aSuccessfulEndpointCount (\ s a -> s{_aSuccessfulEndpointCount = a});
+
+-- | The actual time the activity was marked CANCELLED or COMPLETED. Provided in ISO 8601 format.
+aEnd :: Lens' ActivityResponse (Maybe Text)
+aEnd = lens _aEnd (\ s a -> s{_aEnd = a});
+
+-- | The ID of the application to which the campaign applies.
+aApplicationId :: Lens' ActivityResponse (Maybe Text)
+aApplicationId = lens _aApplicationId (\ s a -> s{_aApplicationId = a});
+
+-- | The total number of endpoints to which the campaign attempts to deliver messages.
+aTotalEndpointCount :: Lens' ActivityResponse (Maybe Int)
+aTotalEndpointCount = lens _aTotalEndpointCount (\ s a -> s{_aTotalEndpointCount = a});
+
+-- | The unique activity ID.
+aId :: Lens' ActivityResponse (Maybe Text)
+aId = lens _aId (\ s a -> s{_aId = a});
+
+-- | The scheduled start time for the activity in ISO 8601 format.
+aScheduledStart :: Lens' ActivityResponse (Maybe Text)
+aScheduledStart = lens _aScheduledStart (\ s a -> s{_aScheduledStart = a});
+
+instance FromJSON ActivityResponse where
+        parseJSON
+          = withObject "ActivityResponse"
+              (\ x ->
+                 ActivityResponse' <$>
+                   (x .:? "State") <*> (x .:? "Start") <*>
+                     (x .:? "CampaignId")
+                     <*> (x .:? "Result")
+                     <*> (x .:? "TreatmentId")
+                     <*> (x .:? "SuccessfulEndpointCount")
+                     <*> (x .:? "End")
+                     <*> (x .:? "ApplicationId")
+                     <*> (x .:? "TotalEndpointCount")
+                     <*> (x .:? "Id")
+                     <*> (x .:? "ScheduledStart"))
+
+instance Hashable ActivityResponse
+
+instance NFData ActivityResponse
+
+-- | /See:/ 'applicationSettingsResource' smart constructor.
+data ApplicationSettingsResource = ApplicationSettingsResource'
+    { _asrLastModifiedDate :: !(Maybe Text)
+    , _asrLimits           :: !(Maybe CampaignLimits)
+    , _asrQuietTime        :: !(Maybe QuietTime)
+    , _asrApplicationId    :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ApplicationSettingsResource' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'asrLastModifiedDate' - The date that the settings were last updated in ISO 8601 format.
+--
+-- * 'asrLimits' - The default campaign limits for the app. These limits apply to each campaign for the app, unless the campaign overrides the default with limits of its own.
+--
+-- * 'asrQuietTime' - The default quiet time for the app. Each campaign for this app sends no messages during this time unless the campaign overrides the default with a quiet time of its own.
+--
+-- * 'asrApplicationId' - The unique ID for the application.
+applicationSettingsResource
+    :: ApplicationSettingsResource
+applicationSettingsResource =
+    ApplicationSettingsResource'
+    { _asrLastModifiedDate = Nothing
+    , _asrLimits = Nothing
+    , _asrQuietTime = Nothing
+    , _asrApplicationId = Nothing
+    }
+
+-- | The date that the settings were last updated in ISO 8601 format.
+asrLastModifiedDate :: Lens' ApplicationSettingsResource (Maybe Text)
+asrLastModifiedDate = lens _asrLastModifiedDate (\ s a -> s{_asrLastModifiedDate = a});
+
+-- | The default campaign limits for the app. These limits apply to each campaign for the app, unless the campaign overrides the default with limits of its own.
+asrLimits :: Lens' ApplicationSettingsResource (Maybe CampaignLimits)
+asrLimits = lens _asrLimits (\ s a -> s{_asrLimits = a});
+
+-- | The default quiet time for the app. Each campaign for this app sends no messages during this time unless the campaign overrides the default with a quiet time of its own.
+asrQuietTime :: Lens' ApplicationSettingsResource (Maybe QuietTime)
+asrQuietTime = lens _asrQuietTime (\ s a -> s{_asrQuietTime = a});
+
+-- | The unique ID for the application.
+asrApplicationId :: Lens' ApplicationSettingsResource (Maybe Text)
+asrApplicationId = lens _asrApplicationId (\ s a -> s{_asrApplicationId = a});
+
+instance FromJSON ApplicationSettingsResource where
+        parseJSON
+          = withObject "ApplicationSettingsResource"
+              (\ x ->
+                 ApplicationSettingsResource' <$>
+                   (x .:? "LastModifiedDate") <*> (x .:? "Limits") <*>
+                     (x .:? "QuietTime")
+                     <*> (x .:? "ApplicationId"))
+
+instance Hashable ApplicationSettingsResource
+
+instance NFData ApplicationSettingsResource
+
+-- | /See:/ 'attributeDimension' smart constructor.
+data AttributeDimension = AttributeDimension'
+    { _adValues        :: !(Maybe [Text])
+    , _adAttributeType :: !(Maybe AttributeType)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'AttributeDimension' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'adValues' - The criteria values for the segment dimension. Endpoints with matching attribute values are included or excluded from the segment, depending on the setting for Type.
+--
+-- * 'adAttributeType' - The type of dimension: INCLUSIVE – Endpoints that match the criteria are included in the segment. EXCLUSIVE – Endpoints that match the criteria are excluded from the segment.
+attributeDimension
+    :: AttributeDimension
+attributeDimension =
+    AttributeDimension'
+    { _adValues = Nothing
+    , _adAttributeType = Nothing
+    }
+
+-- | The criteria values for the segment dimension. Endpoints with matching attribute values are included or excluded from the segment, depending on the setting for Type.
+adValues :: Lens' AttributeDimension [Text]
+adValues = lens _adValues (\ s a -> s{_adValues = a}) . _Default . _Coerce;
+
+-- | The type of dimension: INCLUSIVE – Endpoints that match the criteria are included in the segment. EXCLUSIVE – Endpoints that match the criteria are excluded from the segment.
+adAttributeType :: Lens' AttributeDimension (Maybe AttributeType)
+adAttributeType = lens _adAttributeType (\ s a -> s{_adAttributeType = a});
+
+instance FromJSON AttributeDimension where
+        parseJSON
+          = withObject "AttributeDimension"
+              (\ x ->
+                 AttributeDimension' <$>
+                   (x .:? "Values" .!= mempty) <*>
+                     (x .:? "AttributeType"))
+
+instance Hashable AttributeDimension
+
+instance NFData AttributeDimension
+
+instance ToJSON AttributeDimension where
+        toJSON AttributeDimension'{..}
+          = object
+              (catMaybes
+                 [("Values" .=) <$> _adValues,
+                  ("AttributeType" .=) <$> _adAttributeType])
+
+-- | /See:/ 'campaignLimits' smart constructor.
+data CampaignLimits = CampaignLimits'
+    { _clDaily :: !(Maybe Int)
+    , _clTotal :: !(Maybe Int)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CampaignLimits' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'clDaily' - The maximum number of messages that the campaign can send daily.
+--
+-- * 'clTotal' - The maximum total number of messages that the campaign can send.
+campaignLimits
+    :: CampaignLimits
+campaignLimits =
+    CampaignLimits'
+    { _clDaily = Nothing
+    , _clTotal = Nothing
+    }
+
+-- | The maximum number of messages that the campaign can send daily.
+clDaily :: Lens' CampaignLimits (Maybe Int)
+clDaily = lens _clDaily (\ s a -> s{_clDaily = a});
+
+-- | The maximum total number of messages that the campaign can send.
+clTotal :: Lens' CampaignLimits (Maybe Int)
+clTotal = lens _clTotal (\ s a -> s{_clTotal = a});
+
+instance FromJSON CampaignLimits where
+        parseJSON
+          = withObject "CampaignLimits"
+              (\ x ->
+                 CampaignLimits' <$>
+                   (x .:? "Daily") <*> (x .:? "Total"))
+
+instance Hashable CampaignLimits
+
+instance NFData CampaignLimits
+
+instance ToJSON CampaignLimits where
+        toJSON CampaignLimits'{..}
+          = object
+              (catMaybes
+                 [("Daily" .=) <$> _clDaily,
+                  ("Total" .=) <$> _clTotal])
+
+-- | /See:/ 'campaignResponse' smart constructor.
+data CampaignResponse = CampaignResponse'
+    { _cState                :: !(Maybe CampaignState)
+    , _cLastModifiedDate     :: !(Maybe Text)
+    , _cSchedule             :: !(Maybe Schedule)
+    , _cTreatmentName        :: !(Maybe Text)
+    , _cLimits               :: !(Maybe CampaignLimits)
+    , _cIsPaused             :: !(Maybe Bool)
+    , _cDefaultState         :: !(Maybe CampaignState)
+    , _cApplicationId        :: !(Maybe Text)
+    , _cName                 :: !(Maybe Text)
+    , _cVersion              :: !(Maybe Int)
+    , _cHoldoutPercent       :: !(Maybe Int)
+    , _cTreatmentDescription :: !(Maybe Text)
+    , _cId                   :: !(Maybe Text)
+    , _cCreationDate         :: !(Maybe Text)
+    , _cMessageConfiguration :: !(Maybe MessageConfiguration)
+    , _cDescription          :: !(Maybe Text)
+    , _cSegmentId            :: !(Maybe Text)
+    , _cAdditionalTreatments :: !(Maybe [TreatmentResource])
+    , _cSegmentVersion       :: !(Maybe Int)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CampaignResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cState' - The campaign status. An A/B test campaign will have a status of COMPLETED only when all treatments have a status of COMPLETED.
+--
+-- * 'cLastModifiedDate' - The date the campaign was last updated in ISO 8601 format.
+--
+-- * 'cSchedule' - The campaign schedule.
+--
+-- * 'cTreatmentName' - The custom name of a variation of the campaign used for A/B testing.
+--
+-- * 'cLimits' - The campaign limits settings.
+--
+-- * 'cIsPaused' - Indicates whether the campaign is paused. A paused campaign does not send messages unless you resume it by setting IsPaused to false.
+--
+-- * 'cDefaultState' - The status of the campaign's default treatment. Only present for A/B test campaigns.
+--
+-- * 'cApplicationId' - The ID of the application to which the campaign applies.
+--
+-- * 'cName' - The custom name of the campaign.
+--
+-- * 'cVersion' - The campaign version number.
+--
+-- * 'cHoldoutPercent' - The allocated percentage of end users who will not receive messages from this campaign.
+--
+-- * 'cTreatmentDescription' - A custom description for the treatment.
+--
+-- * 'cId' - The unique campaign ID.
+--
+-- * 'cCreationDate' - The date the campaign was created in ISO 8601 format.
+--
+-- * 'cMessageConfiguration' - The message configuration settings.
+--
+-- * 'cDescription' - A description of the campaign.
+--
+-- * 'cSegmentId' - The ID of the segment to which the campaign sends messages.
+--
+-- * 'cAdditionalTreatments' - Treatments that are defined in addition to the default treatment.
+--
+-- * 'cSegmentVersion' - The version of the segment to which the campaign sends messages.
+campaignResponse
+    :: CampaignResponse
+campaignResponse =
+    CampaignResponse'
+    { _cState = Nothing
+    , _cLastModifiedDate = Nothing
+    , _cSchedule = Nothing
+    , _cTreatmentName = Nothing
+    , _cLimits = Nothing
+    , _cIsPaused = Nothing
+    , _cDefaultState = Nothing
+    , _cApplicationId = Nothing
+    , _cName = Nothing
+    , _cVersion = Nothing
+    , _cHoldoutPercent = Nothing
+    , _cTreatmentDescription = Nothing
+    , _cId = Nothing
+    , _cCreationDate = Nothing
+    , _cMessageConfiguration = Nothing
+    , _cDescription = Nothing
+    , _cSegmentId = Nothing
+    , _cAdditionalTreatments = Nothing
+    , _cSegmentVersion = Nothing
+    }
+
+-- | The campaign status. An A/B test campaign will have a status of COMPLETED only when all treatments have a status of COMPLETED.
+cState :: Lens' CampaignResponse (Maybe CampaignState)
+cState = lens _cState (\ s a -> s{_cState = a});
+
+-- | The date the campaign was last updated in ISO 8601 format.
+cLastModifiedDate :: Lens' CampaignResponse (Maybe Text)
+cLastModifiedDate = lens _cLastModifiedDate (\ s a -> s{_cLastModifiedDate = a});
+
+-- | The campaign schedule.
+cSchedule :: Lens' CampaignResponse (Maybe Schedule)
+cSchedule = lens _cSchedule (\ s a -> s{_cSchedule = a});
+
+-- | The custom name of a variation of the campaign used for A/B testing.
+cTreatmentName :: Lens' CampaignResponse (Maybe Text)
+cTreatmentName = lens _cTreatmentName (\ s a -> s{_cTreatmentName = a});
+
+-- | The campaign limits settings.
+cLimits :: Lens' CampaignResponse (Maybe CampaignLimits)
+cLimits = lens _cLimits (\ s a -> s{_cLimits = a});
+
+-- | Indicates whether the campaign is paused. A paused campaign does not send messages unless you resume it by setting IsPaused to false.
+cIsPaused :: Lens' CampaignResponse (Maybe Bool)
+cIsPaused = lens _cIsPaused (\ s a -> s{_cIsPaused = a});
+
+-- | The status of the campaign's default treatment. Only present for A/B test campaigns.
+cDefaultState :: Lens' CampaignResponse (Maybe CampaignState)
+cDefaultState = lens _cDefaultState (\ s a -> s{_cDefaultState = a});
+
+-- | The ID of the application to which the campaign applies.
+cApplicationId :: Lens' CampaignResponse (Maybe Text)
+cApplicationId = lens _cApplicationId (\ s a -> s{_cApplicationId = a});
+
+-- | The custom name of the campaign.
+cName :: Lens' CampaignResponse (Maybe Text)
+cName = lens _cName (\ s a -> s{_cName = a});
+
+-- | The campaign version number.
+cVersion :: Lens' CampaignResponse (Maybe Int)
+cVersion = lens _cVersion (\ s a -> s{_cVersion = a});
+
+-- | The allocated percentage of end users who will not receive messages from this campaign.
+cHoldoutPercent :: Lens' CampaignResponse (Maybe Int)
+cHoldoutPercent = lens _cHoldoutPercent (\ s a -> s{_cHoldoutPercent = a});
+
+-- | A custom description for the treatment.
+cTreatmentDescription :: Lens' CampaignResponse (Maybe Text)
+cTreatmentDescription = lens _cTreatmentDescription (\ s a -> s{_cTreatmentDescription = a});
+
+-- | The unique campaign ID.
+cId :: Lens' CampaignResponse (Maybe Text)
+cId = lens _cId (\ s a -> s{_cId = a});
+
+-- | The date the campaign was created in ISO 8601 format.
+cCreationDate :: Lens' CampaignResponse (Maybe Text)
+cCreationDate = lens _cCreationDate (\ s a -> s{_cCreationDate = a});
+
+-- | The message configuration settings.
+cMessageConfiguration :: Lens' CampaignResponse (Maybe MessageConfiguration)
+cMessageConfiguration = lens _cMessageConfiguration (\ s a -> s{_cMessageConfiguration = a});
+
+-- | A description of the campaign.
+cDescription :: Lens' CampaignResponse (Maybe Text)
+cDescription = lens _cDescription (\ s a -> s{_cDescription = a});
+
+-- | The ID of the segment to which the campaign sends messages.
+cSegmentId :: Lens' CampaignResponse (Maybe Text)
+cSegmentId = lens _cSegmentId (\ s a -> s{_cSegmentId = a});
+
+-- | Treatments that are defined in addition to the default treatment.
+cAdditionalTreatments :: Lens' CampaignResponse [TreatmentResource]
+cAdditionalTreatments = lens _cAdditionalTreatments (\ s a -> s{_cAdditionalTreatments = a}) . _Default . _Coerce;
+
+-- | The version of the segment to which the campaign sends messages.
+cSegmentVersion :: Lens' CampaignResponse (Maybe Int)
+cSegmentVersion = lens _cSegmentVersion (\ s a -> s{_cSegmentVersion = a});
+
+instance FromJSON CampaignResponse where
+        parseJSON
+          = withObject "CampaignResponse"
+              (\ x ->
+                 CampaignResponse' <$>
+                   (x .:? "State") <*> (x .:? "LastModifiedDate") <*>
+                     (x .:? "Schedule")
+                     <*> (x .:? "TreatmentName")
+                     <*> (x .:? "Limits")
+                     <*> (x .:? "IsPaused")
+                     <*> (x .:? "DefaultState")
+                     <*> (x .:? "ApplicationId")
+                     <*> (x .:? "Name")
+                     <*> (x .:? "Version")
+                     <*> (x .:? "HoldoutPercent")
+                     <*> (x .:? "TreatmentDescription")
+                     <*> (x .:? "Id")
+                     <*> (x .:? "CreationDate")
+                     <*> (x .:? "MessageConfiguration")
+                     <*> (x .:? "Description")
+                     <*> (x .:? "SegmentId")
+                     <*> (x .:? "AdditionalTreatments" .!= mempty)
+                     <*> (x .:? "SegmentVersion"))
+
+instance Hashable CampaignResponse
+
+instance NFData CampaignResponse
+
+-- | /See:/ 'campaignState' smart constructor.
+newtype CampaignState = CampaignState'
+    { _csCampaignStatus :: Maybe CampaignStatus
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CampaignState' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'csCampaignStatus' - The status of the campaign, or the status of a treatment that belongs to an A/B test campaign. Valid values: SCHEDULED, EXECUTING, PENDING_NEXT_RUN, COMPLETED, PAUSED
+campaignState
+    :: CampaignState
+campaignState =
+    CampaignState'
+    { _csCampaignStatus = Nothing
+    }
+
+-- | The status of the campaign, or the status of a treatment that belongs to an A/B test campaign. Valid values: SCHEDULED, EXECUTING, PENDING_NEXT_RUN, COMPLETED, PAUSED
+csCampaignStatus :: Lens' CampaignState (Maybe CampaignStatus)
+csCampaignStatus = lens _csCampaignStatus (\ s a -> s{_csCampaignStatus = a});
+
+instance FromJSON CampaignState where
+        parseJSON
+          = withObject "CampaignState"
+              (\ x -> CampaignState' <$> (x .:? "CampaignStatus"))
+
+instance Hashable CampaignState
+
+instance NFData CampaignState
+
+-- | /See:/ 'campaignsResponse' smart constructor.
+data CampaignsResponse = CampaignsResponse'
+    { _cNextToken :: !(Maybe Text)
+    , _cItem      :: !(Maybe [CampaignResponse])
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CampaignsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cNextToken' - The string that you use in a subsequent request to get the next page of results in a paginated response.
+--
+-- * 'cItem' - A list of campaigns.
+campaignsResponse
+    :: CampaignsResponse
+campaignsResponse =
+    CampaignsResponse'
+    { _cNextToken = Nothing
+    , _cItem = Nothing
+    }
+
+-- | The string that you use in a subsequent request to get the next page of results in a paginated response.
+cNextToken :: Lens' CampaignsResponse (Maybe Text)
+cNextToken = lens _cNextToken (\ s a -> s{_cNextToken = a});
+
+-- | A list of campaigns.
+cItem :: Lens' CampaignsResponse [CampaignResponse]
+cItem = lens _cItem (\ s a -> s{_cItem = a}) . _Default . _Coerce;
+
+instance FromJSON CampaignsResponse where
+        parseJSON
+          = withObject "CampaignsResponse"
+              (\ x ->
+                 CampaignsResponse' <$>
+                   (x .:? "NextToken") <*> (x .:? "Item" .!= mempty))
+
+instance Hashable CampaignsResponse
+
+instance NFData CampaignsResponse
+
+-- | /See:/ 'endpointBatchItem' smart constructor.
+data EndpointBatchItem = EndpointBatchItem'
+    { _ebiRequestId      :: !(Maybe Text)
+    , _ebiMetrics        :: !(Maybe (Map Text Double))
+    , _ebiLocation       :: !(Maybe EndpointLocation)
+    , _ebiDemographic    :: !(Maybe EndpointDemographic)
+    , _ebiAddress        :: !(Maybe Text)
+    , _ebiEffectiveDate  :: !(Maybe Text)
+    , _ebiUser           :: !(Maybe EndpointUser)
+    , _ebiAttributes     :: !(Maybe (Map Text [Text]))
+    , _ebiEndpointStatus :: !(Maybe Text)
+    , _ebiOptOut         :: !(Maybe Text)
+    , _ebiId             :: !(Maybe Text)
+    , _ebiChannelType    :: !(Maybe ChannelType)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'EndpointBatchItem' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ebiRequestId' - The unique ID for the most recent request to update the endpoint.
+--
+-- * 'ebiMetrics' - Custom metrics that your app reports to Amazon Pinpoint.
+--
+-- * 'ebiLocation' - The endpoint location attributes.
+--
+-- * 'ebiDemographic' - The endpoint demographic attributes.
+--
+-- * 'ebiAddress' - The address or token of the endpoint.
+--
+-- * 'ebiEffectiveDate' - The last time the endpoint was updated. Provided in ISO 8601 format.
+--
+-- * 'ebiUser' - Custom user-specific attributes that your app reports to Amazon Pinpoint.
+--
+-- * 'ebiAttributes' - Custom attributes that your app reports to Amazon Pinpoint. You can use these attributes as selection criteria when you create a segment.
+--
+-- * 'ebiEndpointStatus' - The endpoint status. Can be either ACTIVE or INACTIVE. Will be set to INACTIVE if a delivery fails. Will be set to ACTIVE if the address is updated.
+--
+-- * 'ebiOptOut' - Indicates whether a user has opted out of receiving messages with one of the following values: ALL – User receives all messages. NONE – User receives no messages.
+--
+-- * 'ebiId' - Undocumented member.
+--
+-- * 'ebiChannelType' - The channel type. Valid values: APNS, GCM
+endpointBatchItem
+    :: EndpointBatchItem
+endpointBatchItem =
+    EndpointBatchItem'
+    { _ebiRequestId = Nothing
+    , _ebiMetrics = Nothing
+    , _ebiLocation = Nothing
+    , _ebiDemographic = Nothing
+    , _ebiAddress = Nothing
+    , _ebiEffectiveDate = Nothing
+    , _ebiUser = Nothing
+    , _ebiAttributes = Nothing
+    , _ebiEndpointStatus = Nothing
+    , _ebiOptOut = Nothing
+    , _ebiId = Nothing
+    , _ebiChannelType = Nothing
+    }
+
+-- | The unique ID for the most recent request to update the endpoint.
+ebiRequestId :: Lens' EndpointBatchItem (Maybe Text)
+ebiRequestId = lens _ebiRequestId (\ s a -> s{_ebiRequestId = a});
+
+-- | Custom metrics that your app reports to Amazon Pinpoint.
+ebiMetrics :: Lens' EndpointBatchItem (HashMap Text Double)
+ebiMetrics = lens _ebiMetrics (\ s a -> s{_ebiMetrics = a}) . _Default . _Map;
+
+-- | The endpoint location attributes.
+ebiLocation :: Lens' EndpointBatchItem (Maybe EndpointLocation)
+ebiLocation = lens _ebiLocation (\ s a -> s{_ebiLocation = a});
+
+-- | The endpoint demographic attributes.
+ebiDemographic :: Lens' EndpointBatchItem (Maybe EndpointDemographic)
+ebiDemographic = lens _ebiDemographic (\ s a -> s{_ebiDemographic = a});
+
+-- | The address or token of the endpoint.
+ebiAddress :: Lens' EndpointBatchItem (Maybe Text)
+ebiAddress = lens _ebiAddress (\ s a -> s{_ebiAddress = a});
+
+-- | The last time the endpoint was updated. Provided in ISO 8601 format.
+ebiEffectiveDate :: Lens' EndpointBatchItem (Maybe Text)
+ebiEffectiveDate = lens _ebiEffectiveDate (\ s a -> s{_ebiEffectiveDate = a});
+
+-- | Custom user-specific attributes that your app reports to Amazon Pinpoint.
+ebiUser :: Lens' EndpointBatchItem (Maybe EndpointUser)
+ebiUser = lens _ebiUser (\ s a -> s{_ebiUser = a});
+
+-- | Custom attributes that your app reports to Amazon Pinpoint. You can use these attributes as selection criteria when you create a segment.
+ebiAttributes :: Lens' EndpointBatchItem (HashMap Text [Text])
+ebiAttributes = lens _ebiAttributes (\ s a -> s{_ebiAttributes = a}) . _Default . _Map;
+
+-- | The endpoint status. Can be either ACTIVE or INACTIVE. Will be set to INACTIVE if a delivery fails. Will be set to ACTIVE if the address is updated.
+ebiEndpointStatus :: Lens' EndpointBatchItem (Maybe Text)
+ebiEndpointStatus = lens _ebiEndpointStatus (\ s a -> s{_ebiEndpointStatus = a});
+
+-- | Indicates whether a user has opted out of receiving messages with one of the following values: ALL – User receives all messages. NONE – User receives no messages.
+ebiOptOut :: Lens' EndpointBatchItem (Maybe Text)
+ebiOptOut = lens _ebiOptOut (\ s a -> s{_ebiOptOut = a});
+
+-- | Undocumented member.
+ebiId :: Lens' EndpointBatchItem (Maybe Text)
+ebiId = lens _ebiId (\ s a -> s{_ebiId = a});
+
+-- | The channel type. Valid values: APNS, GCM
+ebiChannelType :: Lens' EndpointBatchItem (Maybe ChannelType)
+ebiChannelType = lens _ebiChannelType (\ s a -> s{_ebiChannelType = a});
+
+instance Hashable EndpointBatchItem
+
+instance NFData EndpointBatchItem
+
+instance ToJSON EndpointBatchItem where
+        toJSON EndpointBatchItem'{..}
+          = object
+              (catMaybes
+                 [("RequestId" .=) <$> _ebiRequestId,
+                  ("Metrics" .=) <$> _ebiMetrics,
+                  ("Location" .=) <$> _ebiLocation,
+                  ("Demographic" .=) <$> _ebiDemographic,
+                  ("Address" .=) <$> _ebiAddress,
+                  ("EffectiveDate" .=) <$> _ebiEffectiveDate,
+                  ("User" .=) <$> _ebiUser,
+                  ("Attributes" .=) <$> _ebiAttributes,
+                  ("EndpointStatus" .=) <$> _ebiEndpointStatus,
+                  ("OptOut" .=) <$> _ebiOptOut, ("Id" .=) <$> _ebiId,
+                  ("ChannelType" .=) <$> _ebiChannelType])
+
+-- | /See:/ 'endpointBatchRequest' smart constructor.
+newtype EndpointBatchRequest = EndpointBatchRequest'
+    { _ebrItem :: Maybe [EndpointBatchItem]
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'EndpointBatchRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ebrItem' - List of items to update. Maximum 100 items
+endpointBatchRequest
+    :: EndpointBatchRequest
+endpointBatchRequest =
+    EndpointBatchRequest'
+    { _ebrItem = Nothing
+    }
+
+-- | List of items to update. Maximum 100 items
+ebrItem :: Lens' EndpointBatchRequest [EndpointBatchItem]
+ebrItem = lens _ebrItem (\ s a -> s{_ebrItem = a}) . _Default . _Coerce;
+
+instance Hashable EndpointBatchRequest
+
+instance NFData EndpointBatchRequest
+
+instance ToJSON EndpointBatchRequest where
+        toJSON EndpointBatchRequest'{..}
+          = object (catMaybes [("Item" .=) <$> _ebrItem])
+
+-- | /See:/ 'endpointDemographic' smart constructor.
+data EndpointDemographic = EndpointDemographic'
+    { _edPlatform        :: !(Maybe Text)
+    , _edPlatformVersion :: !(Maybe Text)
+    , _edLocale          :: !(Maybe Text)
+    , _edAppVersion      :: !(Maybe Text)
+    , _edModel           :: !(Maybe Text)
+    , _edMake            :: !(Maybe Text)
+    , _edModelVersion    :: !(Maybe Text)
+    , _edTimezone        :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'EndpointDemographic' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'edPlatform' - The endpoint platform, such as ios or android.
+--
+-- * 'edPlatformVersion' - The endpoint platform version.
+--
+-- * 'edLocale' - The endpoint locale in the following format: The ISO 639-1 alpha-2 code, followed by an underscore, followed by an ISO 3166-1 alpha-2 value.
+--
+-- * 'edAppVersion' - The version of the application associated with the endpoint.
+--
+-- * 'edModel' - The endpoint model, such as iPhone.
+--
+-- * 'edMake' - The endpoint make, such as such as Apple or Samsung.
+--
+-- * 'edModelVersion' - The endpoint model version.
+--
+-- * 'edTimezone' - The timezone of the endpoint. Specified as a tz database value, such as Americas/Los_Angeles.
+endpointDemographic
+    :: EndpointDemographic
+endpointDemographic =
+    EndpointDemographic'
+    { _edPlatform = Nothing
+    , _edPlatformVersion = Nothing
+    , _edLocale = Nothing
+    , _edAppVersion = Nothing
+    , _edModel = Nothing
+    , _edMake = Nothing
+    , _edModelVersion = Nothing
+    , _edTimezone = Nothing
+    }
+
+-- | The endpoint platform, such as ios or android.
+edPlatform :: Lens' EndpointDemographic (Maybe Text)
+edPlatform = lens _edPlatform (\ s a -> s{_edPlatform = a});
+
+-- | The endpoint platform version.
+edPlatformVersion :: Lens' EndpointDemographic (Maybe Text)
+edPlatformVersion = lens _edPlatformVersion (\ s a -> s{_edPlatformVersion = a});
+
+-- | The endpoint locale in the following format: The ISO 639-1 alpha-2 code, followed by an underscore, followed by an ISO 3166-1 alpha-2 value.
+edLocale :: Lens' EndpointDemographic (Maybe Text)
+edLocale = lens _edLocale (\ s a -> s{_edLocale = a});
+
+-- | The version of the application associated with the endpoint.
+edAppVersion :: Lens' EndpointDemographic (Maybe Text)
+edAppVersion = lens _edAppVersion (\ s a -> s{_edAppVersion = a});
+
+-- | The endpoint model, such as iPhone.
+edModel :: Lens' EndpointDemographic (Maybe Text)
+edModel = lens _edModel (\ s a -> s{_edModel = a});
+
+-- | The endpoint make, such as such as Apple or Samsung.
+edMake :: Lens' EndpointDemographic (Maybe Text)
+edMake = lens _edMake (\ s a -> s{_edMake = a});
+
+-- | The endpoint model version.
+edModelVersion :: Lens' EndpointDemographic (Maybe Text)
+edModelVersion = lens _edModelVersion (\ s a -> s{_edModelVersion = a});
+
+-- | The timezone of the endpoint. Specified as a tz database value, such as Americas/Los_Angeles.
+edTimezone :: Lens' EndpointDemographic (Maybe Text)
+edTimezone = lens _edTimezone (\ s a -> s{_edTimezone = a});
+
+instance FromJSON EndpointDemographic where
+        parseJSON
+          = withObject "EndpointDemographic"
+              (\ x ->
+                 EndpointDemographic' <$>
+                   (x .:? "Platform") <*> (x .:? "PlatformVersion") <*>
+                     (x .:? "Locale")
+                     <*> (x .:? "AppVersion")
+                     <*> (x .:? "Model")
+                     <*> (x .:? "Make")
+                     <*> (x .:? "ModelVersion")
+                     <*> (x .:? "Timezone"))
+
+instance Hashable EndpointDemographic
+
+instance NFData EndpointDemographic
+
+instance ToJSON EndpointDemographic where
+        toJSON EndpointDemographic'{..}
+          = object
+              (catMaybes
+                 [("Platform" .=) <$> _edPlatform,
+                  ("PlatformVersion" .=) <$> _edPlatformVersion,
+                  ("Locale" .=) <$> _edLocale,
+                  ("AppVersion" .=) <$> _edAppVersion,
+                  ("Model" .=) <$> _edModel, ("Make" .=) <$> _edMake,
+                  ("ModelVersion" .=) <$> _edModelVersion,
+                  ("Timezone" .=) <$> _edTimezone])
+
+-- | /See:/ 'endpointLocation' smart constructor.
+data EndpointLocation = EndpointLocation'
+    { _elPostalCode :: !(Maybe Text)
+    , _elLatitude   :: !(Maybe Double)
+    , _elCountry    :: !(Maybe Text)
+    , _elCity       :: !(Maybe Text)
+    , _elRegion     :: !(Maybe Text)
+    , _elLongitude  :: !(Maybe Double)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'EndpointLocation' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'elPostalCode' - The postal code or zip code of the endpoint.
+--
+-- * 'elLatitude' - The latitude of the endpoint location. Rounded to one decimal (Roughly corresponding to a mile).
+--
+-- * 'elCountry' - Country according to ISO 3166-1 Alpha-2 codes. For example, US.
+--
+-- * 'elCity' - The city where the endpoint is located.
+--
+-- * 'elRegion' - The region of the endpoint location. For example, corresponds to a state in US.
+--
+-- * 'elLongitude' - The longitude of the endpoint location. Rounded to one decimal (Roughly corresponding to a mile).
+endpointLocation
+    :: EndpointLocation
+endpointLocation =
+    EndpointLocation'
+    { _elPostalCode = Nothing
+    , _elLatitude = Nothing
+    , _elCountry = Nothing
+    , _elCity = Nothing
+    , _elRegion = Nothing
+    , _elLongitude = Nothing
+    }
+
+-- | The postal code or zip code of the endpoint.
+elPostalCode :: Lens' EndpointLocation (Maybe Text)
+elPostalCode = lens _elPostalCode (\ s a -> s{_elPostalCode = a});
+
+-- | The latitude of the endpoint location. Rounded to one decimal (Roughly corresponding to a mile).
+elLatitude :: Lens' EndpointLocation (Maybe Double)
+elLatitude = lens _elLatitude (\ s a -> s{_elLatitude = a});
+
+-- | Country according to ISO 3166-1 Alpha-2 codes. For example, US.
+elCountry :: Lens' EndpointLocation (Maybe Text)
+elCountry = lens _elCountry (\ s a -> s{_elCountry = a});
+
+-- | The city where the endpoint is located.
+elCity :: Lens' EndpointLocation (Maybe Text)
+elCity = lens _elCity (\ s a -> s{_elCity = a});
+
+-- | The region of the endpoint location. For example, corresponds to a state in US.
+elRegion :: Lens' EndpointLocation (Maybe Text)
+elRegion = lens _elRegion (\ s a -> s{_elRegion = a});
+
+-- | The longitude of the endpoint location. Rounded to one decimal (Roughly corresponding to a mile).
+elLongitude :: Lens' EndpointLocation (Maybe Double)
+elLongitude = lens _elLongitude (\ s a -> s{_elLongitude = a});
+
+instance FromJSON EndpointLocation where
+        parseJSON
+          = withObject "EndpointLocation"
+              (\ x ->
+                 EndpointLocation' <$>
+                   (x .:? "PostalCode") <*> (x .:? "Latitude") <*>
+                     (x .:? "Country")
+                     <*> (x .:? "City")
+                     <*> (x .:? "Region")
+                     <*> (x .:? "Longitude"))
+
+instance Hashable EndpointLocation
+
+instance NFData EndpointLocation
+
+instance ToJSON EndpointLocation where
+        toJSON EndpointLocation'{..}
+          = object
+              (catMaybes
+                 [("PostalCode" .=) <$> _elPostalCode,
+                  ("Latitude" .=) <$> _elLatitude,
+                  ("Country" .=) <$> _elCountry,
+                  ("City" .=) <$> _elCity, ("Region" .=) <$> _elRegion,
+                  ("Longitude" .=) <$> _elLongitude])
+
+-- | /See:/ 'endpointRequest' smart constructor.
+data EndpointRequest = EndpointRequest'
+    { _erRequestId      :: !(Maybe Text)
+    , _erMetrics        :: !(Maybe (Map Text Double))
+    , _erLocation       :: !(Maybe EndpointLocation)
+    , _erDemographic    :: !(Maybe EndpointDemographic)
+    , _erAddress        :: !(Maybe Text)
+    , _erEffectiveDate  :: !(Maybe Text)
+    , _erUser           :: !(Maybe EndpointUser)
+    , _erAttributes     :: !(Maybe (Map Text [Text]))
+    , _erEndpointStatus :: !(Maybe Text)
+    , _erOptOut         :: !(Maybe Text)
+    , _erChannelType    :: !(Maybe ChannelType)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'EndpointRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'erRequestId' - The unique ID for the most recent request to update the endpoint.
+--
+-- * 'erMetrics' - Custom metrics that your app reports to Amazon Pinpoint.
+--
+-- * 'erLocation' - The endpoint location attributes.
+--
+-- * 'erDemographic' - The endpoint demographic attributes.
+--
+-- * 'erAddress' - The address or token of the endpoint.
+--
+-- * 'erEffectiveDate' - The last time the endpoint was updated. Provided in ISO 8601 format.
+--
+-- * 'erUser' - Custom user-specific attributes that your app reports to Amazon Pinpoint.
+--
+-- * 'erAttributes' - Custom attributes that your app reports to Amazon Pinpoint. You can use these attributes as selection criteria when you create a segment.
+--
+-- * 'erEndpointStatus' - The endpoint status. Can be either ACTIVE or INACTIVE. Will be set to INACTIVE if a delivery fails. Will be set to ACTIVE if the address is updated.
+--
+-- * 'erOptOut' - Indicates whether a user has opted out of receiving messages with one of the following values: ALL – User receives all messages. NONE – User receives no messages.
+--
+-- * 'erChannelType' - The channel type. Valid values: APNS, GCM
+endpointRequest
+    :: EndpointRequest
+endpointRequest =
+    EndpointRequest'
+    { _erRequestId = Nothing
+    , _erMetrics = Nothing
+    , _erLocation = Nothing
+    , _erDemographic = Nothing
+    , _erAddress = Nothing
+    , _erEffectiveDate = Nothing
+    , _erUser = Nothing
+    , _erAttributes = Nothing
+    , _erEndpointStatus = Nothing
+    , _erOptOut = Nothing
+    , _erChannelType = Nothing
+    }
+
+-- | The unique ID for the most recent request to update the endpoint.
+erRequestId :: Lens' EndpointRequest (Maybe Text)
+erRequestId = lens _erRequestId (\ s a -> s{_erRequestId = a});
+
+-- | Custom metrics that your app reports to Amazon Pinpoint.
+erMetrics :: Lens' EndpointRequest (HashMap Text Double)
+erMetrics = lens _erMetrics (\ s a -> s{_erMetrics = a}) . _Default . _Map;
+
+-- | The endpoint location attributes.
+erLocation :: Lens' EndpointRequest (Maybe EndpointLocation)
+erLocation = lens _erLocation (\ s a -> s{_erLocation = a});
+
+-- | The endpoint demographic attributes.
+erDemographic :: Lens' EndpointRequest (Maybe EndpointDemographic)
+erDemographic = lens _erDemographic (\ s a -> s{_erDemographic = a});
+
+-- | The address or token of the endpoint.
+erAddress :: Lens' EndpointRequest (Maybe Text)
+erAddress = lens _erAddress (\ s a -> s{_erAddress = a});
+
+-- | The last time the endpoint was updated. Provided in ISO 8601 format.
+erEffectiveDate :: Lens' EndpointRequest (Maybe Text)
+erEffectiveDate = lens _erEffectiveDate (\ s a -> s{_erEffectiveDate = a});
+
+-- | Custom user-specific attributes that your app reports to Amazon Pinpoint.
+erUser :: Lens' EndpointRequest (Maybe EndpointUser)
+erUser = lens _erUser (\ s a -> s{_erUser = a});
+
+-- | Custom attributes that your app reports to Amazon Pinpoint. You can use these attributes as selection criteria when you create a segment.
+erAttributes :: Lens' EndpointRequest (HashMap Text [Text])
+erAttributes = lens _erAttributes (\ s a -> s{_erAttributes = a}) . _Default . _Map;
+
+-- | The endpoint status. Can be either ACTIVE or INACTIVE. Will be set to INACTIVE if a delivery fails. Will be set to ACTIVE if the address is updated.
+erEndpointStatus :: Lens' EndpointRequest (Maybe Text)
+erEndpointStatus = lens _erEndpointStatus (\ s a -> s{_erEndpointStatus = a});
+
+-- | Indicates whether a user has opted out of receiving messages with one of the following values: ALL – User receives all messages. NONE – User receives no messages.
+erOptOut :: Lens' EndpointRequest (Maybe Text)
+erOptOut = lens _erOptOut (\ s a -> s{_erOptOut = a});
+
+-- | The channel type. Valid values: APNS, GCM
+erChannelType :: Lens' EndpointRequest (Maybe ChannelType)
+erChannelType = lens _erChannelType (\ s a -> s{_erChannelType = a});
+
+instance Hashable EndpointRequest
+
+instance NFData EndpointRequest
+
+instance ToJSON EndpointRequest where
+        toJSON EndpointRequest'{..}
+          = object
+              (catMaybes
+                 [("RequestId" .=) <$> _erRequestId,
+                  ("Metrics" .=) <$> _erMetrics,
+                  ("Location" .=) <$> _erLocation,
+                  ("Demographic" .=) <$> _erDemographic,
+                  ("Address" .=) <$> _erAddress,
+                  ("EffectiveDate" .=) <$> _erEffectiveDate,
+                  ("User" .=) <$> _erUser,
+                  ("Attributes" .=) <$> _erAttributes,
+                  ("EndpointStatus" .=) <$> _erEndpointStatus,
+                  ("OptOut" .=) <$> _erOptOut,
+                  ("ChannelType" .=) <$> _erChannelType])
+
+-- | /See:/ 'endpointResponse' smart constructor.
+data EndpointResponse = EndpointResponse'
+    { _eRequestId      :: !(Maybe Text)
+    , _eMetrics        :: !(Maybe (Map Text Double))
+    , _eLocation       :: !(Maybe EndpointLocation)
+    , _eDemographic    :: !(Maybe EndpointDemographic)
+    , _eCohortId       :: !(Maybe Text)
+    , _eAddress        :: !(Maybe Text)
+    , _eEffectiveDate  :: !(Maybe Text)
+    , _eUser           :: !(Maybe EndpointUser)
+    , _eApplicationId  :: !(Maybe Text)
+    , _eAttributes     :: !(Maybe (Map Text [Text]))
+    , _eEndpointStatus :: !(Maybe Text)
+    , _eOptOut         :: !(Maybe Text)
+    , _eId             :: !(Maybe Text)
+    , _eCreationDate   :: !(Maybe Text)
+    , _eChannelType    :: !(Maybe ChannelType)
+    , _eShardId        :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'EndpointResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'eRequestId' - The unique ID for the most recent request to update the endpoint.
+--
+-- * 'eMetrics' - Custom metrics that your app reports to Amazon Pinpoint.
+--
+-- * 'eLocation' - The endpoint location attributes.
+--
+-- * 'eDemographic' - The endpoint demographic attributes.
+--
+-- * 'eCohortId' - A number from 0 - 99 that represents the cohort the endpoint is assigned to. Endpoints are grouped into cohorts randomly, and each cohort contains approximately 1 percent of the endpoints for an app. Amazon Pinpoint assigns cohorts to the holdout or treatment allocations for a campaign.
+--
+-- * 'eAddress' - The address or token of the endpoint.
+--
+-- * 'eEffectiveDate' - The last time the endpoint was updated. Provided in ISO 8601 format.
+--
+-- * 'eUser' - Custom user-specific attributes that your app reports to Amazon Pinpoint.
+--
+-- * 'eApplicationId' - The ID of the application associated with the endpoint.
+--
+-- * 'eAttributes' - Custom attributes that your app reports to Amazon Pinpoint. You can use these attributes as selection criteria when you create a segment.
+--
+-- * 'eEndpointStatus' - The endpoint status. Can be either ACTIVE or INACTIVE. Will be set to INACTIVE if a delivery fails. Will be set to ACTIVE if the address is updated.
+--
+-- * 'eOptOut' - Indicates whether a user has opted out of receiving messages with one of the following values: ALL – User receives all messages. NONE – User receives no messages.
+--
+-- * 'eId' - The unique ID that you assigned to the endpoint. The ID should be a globally unique identifier (GUID) to ensure that it is unique compared to all other endpoints for the application.
+--
+-- * 'eCreationDate' - The last time the endpoint was created. Provided in ISO 8601 format.
+--
+-- * 'eChannelType' - The channel type. Valid values: APNS, GCM
+--
+-- * 'eShardId' - The ShardId of endpoint
+endpointResponse
+    :: EndpointResponse
+endpointResponse =
+    EndpointResponse'
+    { _eRequestId = Nothing
+    , _eMetrics = Nothing
+    , _eLocation = Nothing
+    , _eDemographic = Nothing
+    , _eCohortId = Nothing
+    , _eAddress = Nothing
+    , _eEffectiveDate = Nothing
+    , _eUser = Nothing
+    , _eApplicationId = Nothing
+    , _eAttributes = Nothing
+    , _eEndpointStatus = Nothing
+    , _eOptOut = Nothing
+    , _eId = Nothing
+    , _eCreationDate = Nothing
+    , _eChannelType = Nothing
+    , _eShardId = Nothing
+    }
+
+-- | The unique ID for the most recent request to update the endpoint.
+eRequestId :: Lens' EndpointResponse (Maybe Text)
+eRequestId = lens _eRequestId (\ s a -> s{_eRequestId = a});
+
+-- | Custom metrics that your app reports to Amazon Pinpoint.
+eMetrics :: Lens' EndpointResponse (HashMap Text Double)
+eMetrics = lens _eMetrics (\ s a -> s{_eMetrics = a}) . _Default . _Map;
+
+-- | The endpoint location attributes.
+eLocation :: Lens' EndpointResponse (Maybe EndpointLocation)
+eLocation = lens _eLocation (\ s a -> s{_eLocation = a});
+
+-- | The endpoint demographic attributes.
+eDemographic :: Lens' EndpointResponse (Maybe EndpointDemographic)
+eDemographic = lens _eDemographic (\ s a -> s{_eDemographic = a});
+
+-- | A number from 0 - 99 that represents the cohort the endpoint is assigned to. Endpoints are grouped into cohorts randomly, and each cohort contains approximately 1 percent of the endpoints for an app. Amazon Pinpoint assigns cohorts to the holdout or treatment allocations for a campaign.
+eCohortId :: Lens' EndpointResponse (Maybe Text)
+eCohortId = lens _eCohortId (\ s a -> s{_eCohortId = a});
+
+-- | The address or token of the endpoint.
+eAddress :: Lens' EndpointResponse (Maybe Text)
+eAddress = lens _eAddress (\ s a -> s{_eAddress = a});
+
+-- | The last time the endpoint was updated. Provided in ISO 8601 format.
+eEffectiveDate :: Lens' EndpointResponse (Maybe Text)
+eEffectiveDate = lens _eEffectiveDate (\ s a -> s{_eEffectiveDate = a});
+
+-- | Custom user-specific attributes that your app reports to Amazon Pinpoint.
+eUser :: Lens' EndpointResponse (Maybe EndpointUser)
+eUser = lens _eUser (\ s a -> s{_eUser = a});
+
+-- | The ID of the application associated with the endpoint.
+eApplicationId :: Lens' EndpointResponse (Maybe Text)
+eApplicationId = lens _eApplicationId (\ s a -> s{_eApplicationId = a});
+
+-- | Custom attributes that your app reports to Amazon Pinpoint. You can use these attributes as selection criteria when you create a segment.
+eAttributes :: Lens' EndpointResponse (HashMap Text [Text])
+eAttributes = lens _eAttributes (\ s a -> s{_eAttributes = a}) . _Default . _Map;
+
+-- | The endpoint status. Can be either ACTIVE or INACTIVE. Will be set to INACTIVE if a delivery fails. Will be set to ACTIVE if the address is updated.
+eEndpointStatus :: Lens' EndpointResponse (Maybe Text)
+eEndpointStatus = lens _eEndpointStatus (\ s a -> s{_eEndpointStatus = a});
+
+-- | Indicates whether a user has opted out of receiving messages with one of the following values: ALL – User receives all messages. NONE – User receives no messages.
+eOptOut :: Lens' EndpointResponse (Maybe Text)
+eOptOut = lens _eOptOut (\ s a -> s{_eOptOut = a});
+
+-- | The unique ID that you assigned to the endpoint. The ID should be a globally unique identifier (GUID) to ensure that it is unique compared to all other endpoints for the application.
+eId :: Lens' EndpointResponse (Maybe Text)
+eId = lens _eId (\ s a -> s{_eId = a});
+
+-- | The last time the endpoint was created. Provided in ISO 8601 format.
+eCreationDate :: Lens' EndpointResponse (Maybe Text)
+eCreationDate = lens _eCreationDate (\ s a -> s{_eCreationDate = a});
+
+-- | The channel type. Valid values: APNS, GCM
+eChannelType :: Lens' EndpointResponse (Maybe ChannelType)
+eChannelType = lens _eChannelType (\ s a -> s{_eChannelType = a});
+
+-- | The ShardId of endpoint
+eShardId :: Lens' EndpointResponse (Maybe Text)
+eShardId = lens _eShardId (\ s a -> s{_eShardId = a});
+
+instance FromJSON EndpointResponse where
+        parseJSON
+          = withObject "EndpointResponse"
+              (\ x ->
+                 EndpointResponse' <$>
+                   (x .:? "RequestId") <*> (x .:? "Metrics" .!= mempty)
+                     <*> (x .:? "Location")
+                     <*> (x .:? "Demographic")
+                     <*> (x .:? "CohortId")
+                     <*> (x .:? "Address")
+                     <*> (x .:? "EffectiveDate")
+                     <*> (x .:? "User")
+                     <*> (x .:? "ApplicationId")
+                     <*> (x .:? "Attributes" .!= mempty)
+                     <*> (x .:? "EndpointStatus")
+                     <*> (x .:? "OptOut")
+                     <*> (x .:? "Id")
+                     <*> (x .:? "CreationDate")
+                     <*> (x .:? "ChannelType")
+                     <*> (x .:? "ShardId"))
+
+instance Hashable EndpointResponse
+
+instance NFData EndpointResponse
+
+-- | /See:/ 'endpointUser' smart constructor.
+data EndpointUser = EndpointUser'
+    { _euUserAttributes :: !(Maybe (Map Text [Text]))
+    , _euUserId         :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'EndpointUser' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'euUserAttributes' - Custom attributesd specific to the user.
+--
+-- * 'euUserId' - The unique ID of the user.
+endpointUser
+    :: EndpointUser
+endpointUser =
+    EndpointUser'
+    { _euUserAttributes = Nothing
+    , _euUserId = Nothing
+    }
+
+-- | Custom attributesd specific to the user.
+euUserAttributes :: Lens' EndpointUser (HashMap Text [Text])
+euUserAttributes = lens _euUserAttributes (\ s a -> s{_euUserAttributes = a}) . _Default . _Map;
+
+-- | The unique ID of the user.
+euUserId :: Lens' EndpointUser (Maybe Text)
+euUserId = lens _euUserId (\ s a -> s{_euUserId = a});
+
+instance FromJSON EndpointUser where
+        parseJSON
+          = withObject "EndpointUser"
+              (\ x ->
+                 EndpointUser' <$>
+                   (x .:? "UserAttributes" .!= mempty) <*>
+                     (x .:? "UserId"))
+
+instance Hashable EndpointUser
+
+instance NFData EndpointUser
+
+instance ToJSON EndpointUser where
+        toJSON EndpointUser'{..}
+          = object
+              (catMaybes
+                 [("UserAttributes" .=) <$> _euUserAttributes,
+                  ("UserId" .=) <$> _euUserId])
+
+-- | /See:/ 'gcmChannelRequest' smart constructor.
+newtype GCMChannelRequest = GCMChannelRequest'
+    { _gcrAPIKey :: Maybe Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GCMChannelRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gcrAPIKey' - Platform credential API key from Google.
+gcmChannelRequest
+    :: GCMChannelRequest
+gcmChannelRequest =
+    GCMChannelRequest'
+    { _gcrAPIKey = Nothing
+    }
+
+-- | Platform credential API key from Google.
+gcrAPIKey :: Lens' GCMChannelRequest (Maybe Text)
+gcrAPIKey = lens _gcrAPIKey (\ s a -> s{_gcrAPIKey = a});
+
+instance Hashable GCMChannelRequest
+
+instance NFData GCMChannelRequest
+
+instance ToJSON GCMChannelRequest where
+        toJSON GCMChannelRequest'{..}
+          = object (catMaybes [("ApiKey" .=) <$> _gcrAPIKey])
+
+-- | /See:/ 'gcmChannelResponse' smart constructor.
+data GCMChannelResponse = GCMChannelResponse'
+    { _gcPlatform         :: !(Maybe Text)
+    , _gcLastModifiedDate :: !(Maybe Text)
+    , _gcCredential       :: !(Maybe Text)
+    , _gcIsArchived       :: !(Maybe Bool)
+    , _gcApplicationId    :: !(Maybe Text)
+    , _gcVersion          :: !(Maybe Int)
+    , _gcId               :: !(Maybe Text)
+    , _gcCreationDate     :: !(Maybe Text)
+    , _gcLastModifiedBy   :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GCMChannelResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gcPlatform' - The platform type. Will be GCM
+--
+-- * 'gcLastModifiedDate' - Last date this was updated
+--
+-- * 'gcCredential' - The GCM API key from Google.
+--
+-- * 'gcIsArchived' - Is this channel archived
+--
+-- * 'gcApplicationId' - Undocumented member.
+--
+-- * 'gcVersion' - Version of channel
+--
+-- * 'gcId' - Undocumented member.
+--
+-- * 'gcCreationDate' - When was this segment created
+--
+-- * 'gcLastModifiedBy' - Who last updated this entry
+gcmChannelResponse
+    :: GCMChannelResponse
+gcmChannelResponse =
+    GCMChannelResponse'
+    { _gcPlatform = Nothing
+    , _gcLastModifiedDate = Nothing
+    , _gcCredential = Nothing
+    , _gcIsArchived = Nothing
+    , _gcApplicationId = Nothing
+    , _gcVersion = Nothing
+    , _gcId = Nothing
+    , _gcCreationDate = Nothing
+    , _gcLastModifiedBy = Nothing
+    }
+
+-- | The platform type. Will be GCM
+gcPlatform :: Lens' GCMChannelResponse (Maybe Text)
+gcPlatform = lens _gcPlatform (\ s a -> s{_gcPlatform = a});
+
+-- | Last date this was updated
+gcLastModifiedDate :: Lens' GCMChannelResponse (Maybe Text)
+gcLastModifiedDate = lens _gcLastModifiedDate (\ s a -> s{_gcLastModifiedDate = a});
+
+-- | The GCM API key from Google.
+gcCredential :: Lens' GCMChannelResponse (Maybe Text)
+gcCredential = lens _gcCredential (\ s a -> s{_gcCredential = a});
+
+-- | Is this channel archived
+gcIsArchived :: Lens' GCMChannelResponse (Maybe Bool)
+gcIsArchived = lens _gcIsArchived (\ s a -> s{_gcIsArchived = a});
+
+-- | Undocumented member.
+gcApplicationId :: Lens' GCMChannelResponse (Maybe Text)
+gcApplicationId = lens _gcApplicationId (\ s a -> s{_gcApplicationId = a});
+
+-- | Version of channel
+gcVersion :: Lens' GCMChannelResponse (Maybe Int)
+gcVersion = lens _gcVersion (\ s a -> s{_gcVersion = a});
+
+-- | Undocumented member.
+gcId :: Lens' GCMChannelResponse (Maybe Text)
+gcId = lens _gcId (\ s a -> s{_gcId = a});
+
+-- | When was this segment created
+gcCreationDate :: Lens' GCMChannelResponse (Maybe Text)
+gcCreationDate = lens _gcCreationDate (\ s a -> s{_gcCreationDate = a});
+
+-- | Who last updated this entry
+gcLastModifiedBy :: Lens' GCMChannelResponse (Maybe Text)
+gcLastModifiedBy = lens _gcLastModifiedBy (\ s a -> s{_gcLastModifiedBy = a});
+
+instance FromJSON GCMChannelResponse where
+        parseJSON
+          = withObject "GCMChannelResponse"
+              (\ x ->
+                 GCMChannelResponse' <$>
+                   (x .:? "Platform") <*> (x .:? "LastModifiedDate") <*>
+                     (x .:? "Credential")
+                     <*> (x .:? "IsArchived")
+                     <*> (x .:? "ApplicationId")
+                     <*> (x .:? "Version")
+                     <*> (x .:? "Id")
+                     <*> (x .:? "CreationDate")
+                     <*> (x .:? "LastModifiedBy"))
+
+instance Hashable GCMChannelResponse
+
+instance NFData GCMChannelResponse
+
+-- | /See:/ 'importJobRequest' smart constructor.
+data ImportJobRequest = ImportJobRequest'
+    { _iSegmentName       :: !(Maybe Text)
+    , _iFormat            :: !(Maybe DefinitionFormat)
+    , _iDefineSegment     :: !(Maybe Bool)
+    , _iRegisterEndpoints :: !(Maybe Bool)
+    , _iExternalId        :: !(Maybe Text)
+    , _iS3URL             :: !(Maybe Text)
+    , _iSegmentId         :: !(Maybe Text)
+    , _iRoleARN           :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ImportJobRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'iSegmentName' - A custom name for the segment created by the import job. Use if DefineSegment is true.
+--
+-- * 'iFormat' - The format of the files that contain the endpoint definitions. Valid values: CSV, JSON
+--
+-- * 'iDefineSegment' - Sets whether the endpoints create a segment when they are imported.
+--
+-- * 'iRegisterEndpoints' - Sets whether the endpoints are registered with Amazon Pinpoint when they are imported.
+--
+-- * 'iExternalId' - A unique, custom ID assigned to the IAM role that restricts who can assume the role.
+--
+-- * 'iS3URL' - A URL that points to the location within an Amazon S3 bucket that contains the endpoints to import. The location can be a folder or a single file. The URL should follow this format: s3://bucket-name/folder-name/file-name Amazon Pinpoint will import endpoints from this location and any subfolders it contains.
+--
+-- * 'iSegmentId' - The ID of the segment to update if the import job is meant to update an existing segment.
+--
+-- * 'iRoleARN' - The Amazon Resource Name (ARN) of an IAM role that grants Amazon Pinpoint access to the Amazon S3 location that contains the endpoints to import.
+importJobRequest
+    :: ImportJobRequest
+importJobRequest =
+    ImportJobRequest'
+    { _iSegmentName = Nothing
+    , _iFormat = Nothing
+    , _iDefineSegment = Nothing
+    , _iRegisterEndpoints = Nothing
+    , _iExternalId = Nothing
+    , _iS3URL = Nothing
+    , _iSegmentId = Nothing
+    , _iRoleARN = Nothing
+    }
+
+-- | A custom name for the segment created by the import job. Use if DefineSegment is true.
+iSegmentName :: Lens' ImportJobRequest (Maybe Text)
+iSegmentName = lens _iSegmentName (\ s a -> s{_iSegmentName = a});
+
+-- | The format of the files that contain the endpoint definitions. Valid values: CSV, JSON
+iFormat :: Lens' ImportJobRequest (Maybe DefinitionFormat)
+iFormat = lens _iFormat (\ s a -> s{_iFormat = a});
+
+-- | Sets whether the endpoints create a segment when they are imported.
+iDefineSegment :: Lens' ImportJobRequest (Maybe Bool)
+iDefineSegment = lens _iDefineSegment (\ s a -> s{_iDefineSegment = a});
+
+-- | Sets whether the endpoints are registered with Amazon Pinpoint when they are imported.
+iRegisterEndpoints :: Lens' ImportJobRequest (Maybe Bool)
+iRegisterEndpoints = lens _iRegisterEndpoints (\ s a -> s{_iRegisterEndpoints = a});
+
+-- | A unique, custom ID assigned to the IAM role that restricts who can assume the role.
+iExternalId :: Lens' ImportJobRequest (Maybe Text)
+iExternalId = lens _iExternalId (\ s a -> s{_iExternalId = a});
+
+-- | A URL that points to the location within an Amazon S3 bucket that contains the endpoints to import. The location can be a folder or a single file. The URL should follow this format: s3://bucket-name/folder-name/file-name Amazon Pinpoint will import endpoints from this location and any subfolders it contains.
+iS3URL :: Lens' ImportJobRequest (Maybe Text)
+iS3URL = lens _iS3URL (\ s a -> s{_iS3URL = a});
+
+-- | The ID of the segment to update if the import job is meant to update an existing segment.
+iSegmentId :: Lens' ImportJobRequest (Maybe Text)
+iSegmentId = lens _iSegmentId (\ s a -> s{_iSegmentId = a});
+
+-- | The Amazon Resource Name (ARN) of an IAM role that grants Amazon Pinpoint access to the Amazon S3 location that contains the endpoints to import.
+iRoleARN :: Lens' ImportJobRequest (Maybe Text)
+iRoleARN = lens _iRoleARN (\ s a -> s{_iRoleARN = a});
+
+instance Hashable ImportJobRequest
+
+instance NFData ImportJobRequest
+
+instance ToJSON ImportJobRequest where
+        toJSON ImportJobRequest'{..}
+          = object
+              (catMaybes
+                 [("SegmentName" .=) <$> _iSegmentName,
+                  ("Format" .=) <$> _iFormat,
+                  ("DefineSegment" .=) <$> _iDefineSegment,
+                  ("RegisterEndpoints" .=) <$> _iRegisterEndpoints,
+                  ("ExternalId" .=) <$> _iExternalId,
+                  ("S3Url" .=) <$> _iS3URL,
+                  ("SegmentId" .=) <$> _iSegmentId,
+                  ("RoleArn" .=) <$> _iRoleARN])
+
+-- | /See:/ 'importJobResource' smart constructor.
+data ImportJobResource = ImportJobResource'
+    { _ijrSegmentName       :: !(Maybe Text)
+    , _ijrFormat            :: !(Maybe DefinitionFormat)
+    , _ijrDefineSegment     :: !(Maybe Bool)
+    , _ijrRegisterEndpoints :: !(Maybe Bool)
+    , _ijrExternalId        :: !(Maybe Text)
+    , _ijrS3URL             :: !(Maybe Text)
+    , _ijrSegmentId         :: !(Maybe Text)
+    , _ijrRoleARN           :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ImportJobResource' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ijrSegmentName' - A custom name for the segment created by the import job. Use if DefineSegment is true.
+--
+-- * 'ijrFormat' - The format of the files that contain the endpoint definitions. Valid values: CSV, JSON
+--
+-- * 'ijrDefineSegment' - Sets whether the endpoints create a segment when they are imported.
+--
+-- * 'ijrRegisterEndpoints' - Sets whether the endpoints are registered with Amazon Pinpoint when they are imported.
+--
+-- * 'ijrExternalId' - A unique, custom ID assigned to the IAM role that restricts who can assume the role.
+--
+-- * 'ijrS3URL' - A URL that points to the location within an Amazon S3 bucket that contains the endpoints to import. The location can be a folder or a single file. The URL should follow this format: s3://bucket-name/folder-name/file-name Amazon Pinpoint will import endpoints from this location and any subfolders it contains.
+--
+-- * 'ijrSegmentId' - The ID of the segment to update if the import job is meant to update an existing segment.
+--
+-- * 'ijrRoleARN' - The Amazon Resource Name (ARN) of an IAM role that grants Amazon Pinpoint access to the Amazon S3 location that contains the endpoints to import.
+importJobResource
+    :: ImportJobResource
+importJobResource =
+    ImportJobResource'
+    { _ijrSegmentName = Nothing
+    , _ijrFormat = Nothing
+    , _ijrDefineSegment = Nothing
+    , _ijrRegisterEndpoints = Nothing
+    , _ijrExternalId = Nothing
+    , _ijrS3URL = Nothing
+    , _ijrSegmentId = Nothing
+    , _ijrRoleARN = Nothing
+    }
+
+-- | A custom name for the segment created by the import job. Use if DefineSegment is true.
+ijrSegmentName :: Lens' ImportJobResource (Maybe Text)
+ijrSegmentName = lens _ijrSegmentName (\ s a -> s{_ijrSegmentName = a});
+
+-- | The format of the files that contain the endpoint definitions. Valid values: CSV, JSON
+ijrFormat :: Lens' ImportJobResource (Maybe DefinitionFormat)
+ijrFormat = lens _ijrFormat (\ s a -> s{_ijrFormat = a});
+
+-- | Sets whether the endpoints create a segment when they are imported.
+ijrDefineSegment :: Lens' ImportJobResource (Maybe Bool)
+ijrDefineSegment = lens _ijrDefineSegment (\ s a -> s{_ijrDefineSegment = a});
+
+-- | Sets whether the endpoints are registered with Amazon Pinpoint when they are imported.
+ijrRegisterEndpoints :: Lens' ImportJobResource (Maybe Bool)
+ijrRegisterEndpoints = lens _ijrRegisterEndpoints (\ s a -> s{_ijrRegisterEndpoints = a});
+
+-- | A unique, custom ID assigned to the IAM role that restricts who can assume the role.
+ijrExternalId :: Lens' ImportJobResource (Maybe Text)
+ijrExternalId = lens _ijrExternalId (\ s a -> s{_ijrExternalId = a});
+
+-- | A URL that points to the location within an Amazon S3 bucket that contains the endpoints to import. The location can be a folder or a single file. The URL should follow this format: s3://bucket-name/folder-name/file-name Amazon Pinpoint will import endpoints from this location and any subfolders it contains.
+ijrS3URL :: Lens' ImportJobResource (Maybe Text)
+ijrS3URL = lens _ijrS3URL (\ s a -> s{_ijrS3URL = a});
+
+-- | The ID of the segment to update if the import job is meant to update an existing segment.
+ijrSegmentId :: Lens' ImportJobResource (Maybe Text)
+ijrSegmentId = lens _ijrSegmentId (\ s a -> s{_ijrSegmentId = a});
+
+-- | The Amazon Resource Name (ARN) of an IAM role that grants Amazon Pinpoint access to the Amazon S3 location that contains the endpoints to import.
+ijrRoleARN :: Lens' ImportJobResource (Maybe Text)
+ijrRoleARN = lens _ijrRoleARN (\ s a -> s{_ijrRoleARN = a});
+
+instance FromJSON ImportJobResource where
+        parseJSON
+          = withObject "ImportJobResource"
+              (\ x ->
+                 ImportJobResource' <$>
+                   (x .:? "SegmentName") <*> (x .:? "Format") <*>
+                     (x .:? "DefineSegment")
+                     <*> (x .:? "RegisterEndpoints")
+                     <*> (x .:? "ExternalId")
+                     <*> (x .:? "S3Url")
+                     <*> (x .:? "SegmentId")
+                     <*> (x .:? "RoleArn"))
+
+instance Hashable ImportJobResource
+
+instance NFData ImportJobResource
+
+-- | /See:/ 'importJobResponse' smart constructor.
+data ImportJobResponse = ImportJobResponse'
+    { _ijCompletedPieces :: !(Maybe Int)
+    , _ijFailedPieces    :: !(Maybe Int)
+    , _ijDefinition      :: !(Maybe ImportJobResource)
+    , _ijTotalProcessed  :: !(Maybe Int)
+    , _ijFailures        :: !(Maybe [Text])
+    , _ijTotalPieces     :: !(Maybe Int)
+    , _ijApplicationId   :: !(Maybe Text)
+    , _ijId              :: !(Maybe Text)
+    , _ijCreationDate    :: !(Maybe Text)
+    , _ijType            :: !(Maybe Text)
+    , _ijCompletionDate  :: !(Maybe Text)
+    , _ijJobStatus       :: !(Maybe JobStatus)
+    , _ijTotalFailures   :: !(Maybe Int)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ImportJobResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ijCompletedPieces' - The number of pieces that have successfully imported as of the time of the request.
+--
+-- * 'ijFailedPieces' - The number of pieces that have failed to import as of the time of the request.
+--
+-- * 'ijDefinition' - The import job settings.
+--
+-- * 'ijTotalProcessed' - The number of endpoints that were processed by the import job.
+--
+-- * 'ijFailures' - Provides up to 100 of the first failed entries for the job, if any exist.
+--
+-- * 'ijTotalPieces' - The total number of pieces that must be imported to finish the job. Each piece is an approximately equal portion of the endpoints to import.
+--
+-- * 'ijApplicationId' - The unique ID of the application to which the import job applies.
+--
+-- * 'ijId' - The unique ID of the import job.
+--
+-- * 'ijCreationDate' - The date the import job was created in ISO 8601 format.
+--
+-- * 'ijType' - The job type. Will be Import.
+--
+-- * 'ijCompletionDate' - The date the import job completed in ISO 8601 format.
+--
+-- * 'ijJobStatus' - The status of the import job. Valid values: CREATED, INITIALIZING, PROCESSING, COMPLETING, COMPLETED, FAILING, FAILED The job status is FAILED if one or more pieces failed to import.
+--
+-- * 'ijTotalFailures' - The number of endpoints that failed to import; for example, because of syntax errors.
+importJobResponse
+    :: ImportJobResponse
+importJobResponse =
+    ImportJobResponse'
+    { _ijCompletedPieces = Nothing
+    , _ijFailedPieces = Nothing
+    , _ijDefinition = Nothing
+    , _ijTotalProcessed = Nothing
+    , _ijFailures = Nothing
+    , _ijTotalPieces = Nothing
+    , _ijApplicationId = Nothing
+    , _ijId = Nothing
+    , _ijCreationDate = Nothing
+    , _ijType = Nothing
+    , _ijCompletionDate = Nothing
+    , _ijJobStatus = Nothing
+    , _ijTotalFailures = Nothing
+    }
+
+-- | The number of pieces that have successfully imported as of the time of the request.
+ijCompletedPieces :: Lens' ImportJobResponse (Maybe Int)
+ijCompletedPieces = lens _ijCompletedPieces (\ s a -> s{_ijCompletedPieces = a});
+
+-- | The number of pieces that have failed to import as of the time of the request.
+ijFailedPieces :: Lens' ImportJobResponse (Maybe Int)
+ijFailedPieces = lens _ijFailedPieces (\ s a -> s{_ijFailedPieces = a});
+
+-- | The import job settings.
+ijDefinition :: Lens' ImportJobResponse (Maybe ImportJobResource)
+ijDefinition = lens _ijDefinition (\ s a -> s{_ijDefinition = a});
+
+-- | The number of endpoints that were processed by the import job.
+ijTotalProcessed :: Lens' ImportJobResponse (Maybe Int)
+ijTotalProcessed = lens _ijTotalProcessed (\ s a -> s{_ijTotalProcessed = a});
+
+-- | Provides up to 100 of the first failed entries for the job, if any exist.
+ijFailures :: Lens' ImportJobResponse [Text]
+ijFailures = lens _ijFailures (\ s a -> s{_ijFailures = a}) . _Default . _Coerce;
+
+-- | The total number of pieces that must be imported to finish the job. Each piece is an approximately equal portion of the endpoints to import.
+ijTotalPieces :: Lens' ImportJobResponse (Maybe Int)
+ijTotalPieces = lens _ijTotalPieces (\ s a -> s{_ijTotalPieces = a});
+
+-- | The unique ID of the application to which the import job applies.
+ijApplicationId :: Lens' ImportJobResponse (Maybe Text)
+ijApplicationId = lens _ijApplicationId (\ s a -> s{_ijApplicationId = a});
+
+-- | The unique ID of the import job.
+ijId :: Lens' ImportJobResponse (Maybe Text)
+ijId = lens _ijId (\ s a -> s{_ijId = a});
+
+-- | The date the import job was created in ISO 8601 format.
+ijCreationDate :: Lens' ImportJobResponse (Maybe Text)
+ijCreationDate = lens _ijCreationDate (\ s a -> s{_ijCreationDate = a});
+
+-- | The job type. Will be Import.
+ijType :: Lens' ImportJobResponse (Maybe Text)
+ijType = lens _ijType (\ s a -> s{_ijType = a});
+
+-- | The date the import job completed in ISO 8601 format.
+ijCompletionDate :: Lens' ImportJobResponse (Maybe Text)
+ijCompletionDate = lens _ijCompletionDate (\ s a -> s{_ijCompletionDate = a});
+
+-- | The status of the import job. Valid values: CREATED, INITIALIZING, PROCESSING, COMPLETING, COMPLETED, FAILING, FAILED The job status is FAILED if one or more pieces failed to import.
+ijJobStatus :: Lens' ImportJobResponse (Maybe JobStatus)
+ijJobStatus = lens _ijJobStatus (\ s a -> s{_ijJobStatus = a});
+
+-- | The number of endpoints that failed to import; for example, because of syntax errors.
+ijTotalFailures :: Lens' ImportJobResponse (Maybe Int)
+ijTotalFailures = lens _ijTotalFailures (\ s a -> s{_ijTotalFailures = a});
+
+instance FromJSON ImportJobResponse where
+        parseJSON
+          = withObject "ImportJobResponse"
+              (\ x ->
+                 ImportJobResponse' <$>
+                   (x .:? "CompletedPieces") <*> (x .:? "FailedPieces")
+                     <*> (x .:? "Definition")
+                     <*> (x .:? "TotalProcessed")
+                     <*> (x .:? "Failures" .!= mempty)
+                     <*> (x .:? "TotalPieces")
+                     <*> (x .:? "ApplicationId")
+                     <*> (x .:? "Id")
+                     <*> (x .:? "CreationDate")
+                     <*> (x .:? "Type")
+                     <*> (x .:? "CompletionDate")
+                     <*> (x .:? "JobStatus")
+                     <*> (x .:? "TotalFailures"))
+
+instance Hashable ImportJobResponse
+
+instance NFData ImportJobResponse
+
+-- | /See:/ 'importJobsResponse' smart constructor.
+data ImportJobsResponse = ImportJobsResponse'
+    { _ijNextToken :: !(Maybe Text)
+    , _ijItem      :: !(Maybe [ImportJobResponse])
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ImportJobsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ijNextToken' - The string that you use in a subsequent request to get the next page of results in a paginated response.
+--
+-- * 'ijItem' - A list of import jobs for the application.
+importJobsResponse
+    :: ImportJobsResponse
+importJobsResponse =
+    ImportJobsResponse'
+    { _ijNextToken = Nothing
+    , _ijItem = Nothing
+    }
+
+-- | The string that you use in a subsequent request to get the next page of results in a paginated response.
+ijNextToken :: Lens' ImportJobsResponse (Maybe Text)
+ijNextToken = lens _ijNextToken (\ s a -> s{_ijNextToken = a});
+
+-- | A list of import jobs for the application.
+ijItem :: Lens' ImportJobsResponse [ImportJobResponse]
+ijItem = lens _ijItem (\ s a -> s{_ijItem = a}) . _Default . _Coerce;
+
+instance FromJSON ImportJobsResponse where
+        parseJSON
+          = withObject "ImportJobsResponse"
+              (\ x ->
+                 ImportJobsResponse' <$>
+                   (x .:? "NextToken") <*> (x .:? "Item" .!= mempty))
+
+instance Hashable ImportJobsResponse
+
+instance NFData ImportJobsResponse
+
+-- | /See:/ 'message' smart constructor.
+data Message = Message'
+    { _mSilentPush   :: !(Maybe Bool)
+    , _mImageIconURL :: !(Maybe Text)
+    , _mBody         :: !(Maybe Text)
+    , _mJSONBody     :: !(Maybe Text)
+    , _mURL          :: !(Maybe Text)
+    , _mAction       :: !(Maybe Action)
+    , _mImageURL     :: !(Maybe Text)
+    , _mMediaURL     :: !(Maybe Text)
+    , _mTitle        :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Message' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'mSilentPush' - Indicates if the message should display on the users device. Silent pushes can be used for Remote Configuration and Phone Home use cases.
+--
+-- * 'mImageIconURL' - The URL that points to the icon image for the push notification icon, for example, the app icon.
+--
+-- * 'mBody' - The message body. Can include up to 140 characters.
+--
+-- * 'mJSONBody' - The JSON payload used for a silent push.
+--
+-- * 'mURL' - The URL to open in the user's mobile browser. Used if the value for Action is URL.
+--
+-- * 'mAction' - The action that occurs if the user taps a push notification delivered by the campaign: OPEN_APP – Your app launches, or it becomes the foreground app if it has been sent to the background. This is the default action. DEEP_LINK – Uses deep linking features in iOS and Android to open your app and display a designated user interface within the app. URL – The default mobile browser on the user's device launches and opens a web page at the URL you specify.
+--
+-- * 'mImageURL' - The URL that points to an image used in the push notification.
+--
+-- * 'mMediaURL' - The URL that points to the media resource, for example a .mp4 or .gif file.
+--
+-- * 'mTitle' - The message title that displays above the message on the user's device.
+message
+    :: Message
+message =
+    Message'
+    { _mSilentPush = Nothing
+    , _mImageIconURL = Nothing
+    , _mBody = Nothing
+    , _mJSONBody = Nothing
+    , _mURL = Nothing
+    , _mAction = Nothing
+    , _mImageURL = Nothing
+    , _mMediaURL = Nothing
+    , _mTitle = Nothing
+    }
+
+-- | Indicates if the message should display on the users device. Silent pushes can be used for Remote Configuration and Phone Home use cases.
+mSilentPush :: Lens' Message (Maybe Bool)
+mSilentPush = lens _mSilentPush (\ s a -> s{_mSilentPush = a});
+
+-- | The URL that points to the icon image for the push notification icon, for example, the app icon.
+mImageIconURL :: Lens' Message (Maybe Text)
+mImageIconURL = lens _mImageIconURL (\ s a -> s{_mImageIconURL = a});
+
+-- | The message body. Can include up to 140 characters.
+mBody :: Lens' Message (Maybe Text)
+mBody = lens _mBody (\ s a -> s{_mBody = a});
+
+-- | The JSON payload used for a silent push.
+mJSONBody :: Lens' Message (Maybe Text)
+mJSONBody = lens _mJSONBody (\ s a -> s{_mJSONBody = a});
+
+-- | The URL to open in the user's mobile browser. Used if the value for Action is URL.
+mURL :: Lens' Message (Maybe Text)
+mURL = lens _mURL (\ s a -> s{_mURL = a});
+
+-- | The action that occurs if the user taps a push notification delivered by the campaign: OPEN_APP – Your app launches, or it becomes the foreground app if it has been sent to the background. This is the default action. DEEP_LINK – Uses deep linking features in iOS and Android to open your app and display a designated user interface within the app. URL – The default mobile browser on the user's device launches and opens a web page at the URL you specify.
+mAction :: Lens' Message (Maybe Action)
+mAction = lens _mAction (\ s a -> s{_mAction = a});
+
+-- | The URL that points to an image used in the push notification.
+mImageURL :: Lens' Message (Maybe Text)
+mImageURL = lens _mImageURL (\ s a -> s{_mImageURL = a});
+
+-- | The URL that points to the media resource, for example a .mp4 or .gif file.
+mMediaURL :: Lens' Message (Maybe Text)
+mMediaURL = lens _mMediaURL (\ s a -> s{_mMediaURL = a});
+
+-- | The message title that displays above the message on the user's device.
+mTitle :: Lens' Message (Maybe Text)
+mTitle = lens _mTitle (\ s a -> s{_mTitle = a});
+
+instance FromJSON Message where
+        parseJSON
+          = withObject "Message"
+              (\ x ->
+                 Message' <$>
+                   (x .:? "SilentPush") <*> (x .:? "ImageIconUrl") <*>
+                     (x .:? "Body")
+                     <*> (x .:? "JsonBody")
+                     <*> (x .:? "Url")
+                     <*> (x .:? "Action")
+                     <*> (x .:? "ImageUrl")
+                     <*> (x .:? "MediaUrl")
+                     <*> (x .:? "Title"))
+
+instance Hashable Message
+
+instance NFData Message
+
+instance ToJSON Message where
+        toJSON Message'{..}
+          = object
+              (catMaybes
+                 [("SilentPush" .=) <$> _mSilentPush,
+                  ("ImageIconUrl" .=) <$> _mImageIconURL,
+                  ("Body" .=) <$> _mBody,
+                  ("JsonBody" .=) <$> _mJSONBody, ("Url" .=) <$> _mURL,
+                  ("Action" .=) <$> _mAction,
+                  ("ImageUrl" .=) <$> _mImageURL,
+                  ("MediaUrl" .=) <$> _mMediaURL,
+                  ("Title" .=) <$> _mTitle])
+
+-- | /See:/ 'messageBody' smart constructor.
+data MessageBody = MessageBody'
+    { _mbRequestId :: !(Maybe Text)
+    , _mbMessage   :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'MessageBody' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'mbRequestId' - Undocumented member.
+--
+-- * 'mbMessage' - Undocumented member.
+messageBody
+    :: MessageBody
+messageBody =
+    MessageBody'
+    { _mbRequestId = Nothing
+    , _mbMessage = Nothing
+    }
+
+-- | Undocumented member.
+mbRequestId :: Lens' MessageBody (Maybe Text)
+mbRequestId = lens _mbRequestId (\ s a -> s{_mbRequestId = a});
+
+-- | Undocumented member.
+mbMessage :: Lens' MessageBody (Maybe Text)
+mbMessage = lens _mbMessage (\ s a -> s{_mbMessage = a});
+
+instance FromJSON MessageBody where
+        parseJSON
+          = withObject "MessageBody"
+              (\ x ->
+                 MessageBody' <$>
+                   (x .:? "RequestID") <*> (x .:? "Message"))
+
+instance Hashable MessageBody
+
+instance NFData MessageBody
+
+-- | /See:/ 'messageConfiguration' smart constructor.
+data MessageConfiguration = MessageConfiguration'
+    { _mcAPNSMessage    :: !(Maybe Message)
+    , _mcGCMMessage     :: !(Maybe Message)
+    , _mcDefaultMessage :: !(Maybe Message)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'MessageConfiguration' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'mcAPNSMessage' - The message that the campaign delivers to APNS channels. Overrides the default message.
+--
+-- * 'mcGCMMessage' - The message that the campaign delivers to GCM channels. Overrides the default message.
+--
+-- * 'mcDefaultMessage' - The default message for all channels.
+messageConfiguration
+    :: MessageConfiguration
+messageConfiguration =
+    MessageConfiguration'
+    { _mcAPNSMessage = Nothing
+    , _mcGCMMessage = Nothing
+    , _mcDefaultMessage = Nothing
+    }
+
+-- | The message that the campaign delivers to APNS channels. Overrides the default message.
+mcAPNSMessage :: Lens' MessageConfiguration (Maybe Message)
+mcAPNSMessage = lens _mcAPNSMessage (\ s a -> s{_mcAPNSMessage = a});
+
+-- | The message that the campaign delivers to GCM channels. Overrides the default message.
+mcGCMMessage :: Lens' MessageConfiguration (Maybe Message)
+mcGCMMessage = lens _mcGCMMessage (\ s a -> s{_mcGCMMessage = a});
+
+-- | The default message for all channels.
+mcDefaultMessage :: Lens' MessageConfiguration (Maybe Message)
+mcDefaultMessage = lens _mcDefaultMessage (\ s a -> s{_mcDefaultMessage = a});
+
+instance FromJSON MessageConfiguration where
+        parseJSON
+          = withObject "MessageConfiguration"
+              (\ x ->
+                 MessageConfiguration' <$>
+                   (x .:? "APNSMessage") <*> (x .:? "GCMMessage") <*>
+                     (x .:? "DefaultMessage"))
+
+instance Hashable MessageConfiguration
+
+instance NFData MessageConfiguration
+
+instance ToJSON MessageConfiguration where
+        toJSON MessageConfiguration'{..}
+          = object
+              (catMaybes
+                 [("APNSMessage" .=) <$> _mcAPNSMessage,
+                  ("GCMMessage" .=) <$> _mcGCMMessage,
+                  ("DefaultMessage" .=) <$> _mcDefaultMessage])
+
+-- | /See:/ 'quietTime' smart constructor.
+data QuietTime = QuietTime'
+    { _qtStart :: !(Maybe Text)
+    , _qtEnd   :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'QuietTime' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'qtStart' - The default start time for quiet time in ISO 8601 format.
+--
+-- * 'qtEnd' - The default end time for quiet time in ISO 8601 format.
+quietTime
+    :: QuietTime
+quietTime =
+    QuietTime'
+    { _qtStart = Nothing
+    , _qtEnd = Nothing
+    }
+
+-- | The default start time for quiet time in ISO 8601 format.
+qtStart :: Lens' QuietTime (Maybe Text)
+qtStart = lens _qtStart (\ s a -> s{_qtStart = a});
+
+-- | The default end time for quiet time in ISO 8601 format.
+qtEnd :: Lens' QuietTime (Maybe Text)
+qtEnd = lens _qtEnd (\ s a -> s{_qtEnd = a});
+
+instance FromJSON QuietTime where
+        parseJSON
+          = withObject "QuietTime"
+              (\ x ->
+                 QuietTime' <$> (x .:? "Start") <*> (x .:? "End"))
+
+instance Hashable QuietTime
+
+instance NFData QuietTime
+
+instance ToJSON QuietTime where
+        toJSON QuietTime'{..}
+          = object
+              (catMaybes
+                 [("Start" .=) <$> _qtStart, ("End" .=) <$> _qtEnd])
+
+-- | /See:/ 'recencyDimension' smart constructor.
+data RecencyDimension = RecencyDimension'
+    { _rdRecencyType :: !(Maybe RecencyType)
+    , _rdDuration    :: !(Maybe Duration)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'RecencyDimension' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'rdRecencyType' - The recency dimension type: ACTIVE – Users who have used your app within the specified duration are included in the segment. INACTIVE – Users who have not used your app within the specified duration are included in the segment.
+--
+-- * 'rdDuration' - The length of time during which users have been active or inactive with your app. Valid values: HR_24, DAY_7, DAY_14, DAY_30
+recencyDimension
+    :: RecencyDimension
+recencyDimension =
+    RecencyDimension'
+    { _rdRecencyType = Nothing
+    , _rdDuration = Nothing
+    }
+
+-- | The recency dimension type: ACTIVE – Users who have used your app within the specified duration are included in the segment. INACTIVE – Users who have not used your app within the specified duration are included in the segment.
+rdRecencyType :: Lens' RecencyDimension (Maybe RecencyType)
+rdRecencyType = lens _rdRecencyType (\ s a -> s{_rdRecencyType = a});
+
+-- | The length of time during which users have been active or inactive with your app. Valid values: HR_24, DAY_7, DAY_14, DAY_30
+rdDuration :: Lens' RecencyDimension (Maybe Duration)
+rdDuration = lens _rdDuration (\ s a -> s{_rdDuration = a});
+
+instance FromJSON RecencyDimension where
+        parseJSON
+          = withObject "RecencyDimension"
+              (\ x ->
+                 RecencyDimension' <$>
+                   (x .:? "RecencyType") <*> (x .:? "Duration"))
+
+instance Hashable RecencyDimension
+
+instance NFData RecencyDimension
+
+instance ToJSON RecencyDimension where
+        toJSON RecencyDimension'{..}
+          = object
+              (catMaybes
+                 [("RecencyType" .=) <$> _rdRecencyType,
+                  ("Duration" .=) <$> _rdDuration])
+
+-- | /See:/ 'schedule' smart constructor.
+data Schedule = Schedule'
+    { _sFrequency   :: !(Maybe Frequency)
+    , _sStartTime   :: !(Maybe Text)
+    , _sQuietTime   :: !(Maybe QuietTime)
+    , _sIsLocalTime :: !(Maybe Bool)
+    , _sEndTime     :: !(Maybe Text)
+    , _sTimezone    :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Schedule' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sFrequency' - How often the campaign delivers messages. Valid values: ONCE, HOURLY, DAILY, WEEKLY, MONTHLY
+--
+-- * 'sStartTime' - The scheduled time that the campaign begins in ISO 8601 format.
+--
+-- * 'sQuietTime' - The time during which the campaign sends no messages.
+--
+-- * 'sIsLocalTime' - Indicates whether the campaign schedule takes effect according to each user's local time.
+--
+-- * 'sEndTime' - The scheduled time that the campaign ends in ISO 8601 format.
+--
+-- * 'sTimezone' - The starting UTC offset for the schedule if the value for isLocalTime is true Valid values:  UTC UTC+01 UTC+02 UTC+03 UTC+03:30 UTC+04 UTC+04:30 UTC+05 UTC+05:30 UTC+05:45 UTC+06 UTC+06:30 UTC+07 UTC+08 UTC+09 UTC+09:30 UTC+10 UTC+10:30 UTC+11 UTC+12 UTC+13 UTC-02 UTC-03 UTC-04 UTC-05 UTC-06 UTC-07 UTC-08 UTC-09 UTC-10 UTC-11
+schedule
+    :: Schedule
+schedule =
+    Schedule'
+    { _sFrequency = Nothing
+    , _sStartTime = Nothing
+    , _sQuietTime = Nothing
+    , _sIsLocalTime = Nothing
+    , _sEndTime = Nothing
+    , _sTimezone = Nothing
+    }
+
+-- | How often the campaign delivers messages. Valid values: ONCE, HOURLY, DAILY, WEEKLY, MONTHLY
+sFrequency :: Lens' Schedule (Maybe Frequency)
+sFrequency = lens _sFrequency (\ s a -> s{_sFrequency = a});
+
+-- | The scheduled time that the campaign begins in ISO 8601 format.
+sStartTime :: Lens' Schedule (Maybe Text)
+sStartTime = lens _sStartTime (\ s a -> s{_sStartTime = a});
+
+-- | The time during which the campaign sends no messages.
+sQuietTime :: Lens' Schedule (Maybe QuietTime)
+sQuietTime = lens _sQuietTime (\ s a -> s{_sQuietTime = a});
+
+-- | Indicates whether the campaign schedule takes effect according to each user's local time.
+sIsLocalTime :: Lens' Schedule (Maybe Bool)
+sIsLocalTime = lens _sIsLocalTime (\ s a -> s{_sIsLocalTime = a});
+
+-- | The scheduled time that the campaign ends in ISO 8601 format.
+sEndTime :: Lens' Schedule (Maybe Text)
+sEndTime = lens _sEndTime (\ s a -> s{_sEndTime = a});
+
+-- | The starting UTC offset for the schedule if the value for isLocalTime is true Valid values:  UTC UTC+01 UTC+02 UTC+03 UTC+03:30 UTC+04 UTC+04:30 UTC+05 UTC+05:30 UTC+05:45 UTC+06 UTC+06:30 UTC+07 UTC+08 UTC+09 UTC+09:30 UTC+10 UTC+10:30 UTC+11 UTC+12 UTC+13 UTC-02 UTC-03 UTC-04 UTC-05 UTC-06 UTC-07 UTC-08 UTC-09 UTC-10 UTC-11
+sTimezone :: Lens' Schedule (Maybe Text)
+sTimezone = lens _sTimezone (\ s a -> s{_sTimezone = a});
+
+instance FromJSON Schedule where
+        parseJSON
+          = withObject "Schedule"
+              (\ x ->
+                 Schedule' <$>
+                   (x .:? "Frequency") <*> (x .:? "StartTime") <*>
+                     (x .:? "QuietTime")
+                     <*> (x .:? "IsLocalTime")
+                     <*> (x .:? "EndTime")
+                     <*> (x .:? "Timezone"))
+
+instance Hashable Schedule
+
+instance NFData Schedule
+
+instance ToJSON Schedule where
+        toJSON Schedule'{..}
+          = object
+              (catMaybes
+                 [("Frequency" .=) <$> _sFrequency,
+                  ("StartTime" .=) <$> _sStartTime,
+                  ("QuietTime" .=) <$> _sQuietTime,
+                  ("IsLocalTime" .=) <$> _sIsLocalTime,
+                  ("EndTime" .=) <$> _sEndTime,
+                  ("Timezone" .=) <$> _sTimezone])
+
+-- | /See:/ 'segmentBehaviors' smart constructor.
+newtype SegmentBehaviors = SegmentBehaviors'
+    { _sbRecency :: Maybe RecencyDimension
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SegmentBehaviors' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sbRecency' - The recency of use.
+segmentBehaviors
+    :: SegmentBehaviors
+segmentBehaviors =
+    SegmentBehaviors'
+    { _sbRecency = Nothing
+    }
+
+-- | The recency of use.
+sbRecency :: Lens' SegmentBehaviors (Maybe RecencyDimension)
+sbRecency = lens _sbRecency (\ s a -> s{_sbRecency = a});
+
+instance FromJSON SegmentBehaviors where
+        parseJSON
+          = withObject "SegmentBehaviors"
+              (\ x -> SegmentBehaviors' <$> (x .:? "Recency"))
+
+instance Hashable SegmentBehaviors
+
+instance NFData SegmentBehaviors
+
+instance ToJSON SegmentBehaviors where
+        toJSON SegmentBehaviors'{..}
+          = object (catMaybes [("Recency" .=) <$> _sbRecency])
+
+-- | /See:/ 'segmentDemographics' smart constructor.
+data SegmentDemographics = SegmentDemographics'
+    { _sdPlatform   :: !(Maybe SetDimension)
+    , _sdAppVersion :: !(Maybe SetDimension)
+    , _sdModel      :: !(Maybe SetDimension)
+    , _sdMake       :: !(Maybe SetDimension)
+    , _sdDeviceType :: !(Maybe SetDimension)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SegmentDemographics' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sdPlatform' - The device platform criteria for the segment.
+--
+-- * 'sdAppVersion' - The app version criteria for the segment.
+--
+-- * 'sdModel' - The device model criteria for the segment.
+--
+-- * 'sdMake' - The device make criteria for the segment.
+--
+-- * 'sdDeviceType' - The device type criteria for the segment.
+segmentDemographics
+    :: SegmentDemographics
+segmentDemographics =
+    SegmentDemographics'
+    { _sdPlatform = Nothing
+    , _sdAppVersion = Nothing
+    , _sdModel = Nothing
+    , _sdMake = Nothing
+    , _sdDeviceType = Nothing
+    }
+
+-- | The device platform criteria for the segment.
+sdPlatform :: Lens' SegmentDemographics (Maybe SetDimension)
+sdPlatform = lens _sdPlatform (\ s a -> s{_sdPlatform = a});
+
+-- | The app version criteria for the segment.
+sdAppVersion :: Lens' SegmentDemographics (Maybe SetDimension)
+sdAppVersion = lens _sdAppVersion (\ s a -> s{_sdAppVersion = a});
+
+-- | The device model criteria for the segment.
+sdModel :: Lens' SegmentDemographics (Maybe SetDimension)
+sdModel = lens _sdModel (\ s a -> s{_sdModel = a});
+
+-- | The device make criteria for the segment.
+sdMake :: Lens' SegmentDemographics (Maybe SetDimension)
+sdMake = lens _sdMake (\ s a -> s{_sdMake = a});
+
+-- | The device type criteria for the segment.
+sdDeviceType :: Lens' SegmentDemographics (Maybe SetDimension)
+sdDeviceType = lens _sdDeviceType (\ s a -> s{_sdDeviceType = a});
+
+instance FromJSON SegmentDemographics where
+        parseJSON
+          = withObject "SegmentDemographics"
+              (\ x ->
+                 SegmentDemographics' <$>
+                   (x .:? "Platform") <*> (x .:? "AppVersion") <*>
+                     (x .:? "Model")
+                     <*> (x .:? "Make")
+                     <*> (x .:? "DeviceType"))
+
+instance Hashable SegmentDemographics
+
+instance NFData SegmentDemographics
+
+instance ToJSON SegmentDemographics where
+        toJSON SegmentDemographics'{..}
+          = object
+              (catMaybes
+                 [("Platform" .=) <$> _sdPlatform,
+                  ("AppVersion" .=) <$> _sdAppVersion,
+                  ("Model" .=) <$> _sdModel, ("Make" .=) <$> _sdMake,
+                  ("DeviceType" .=) <$> _sdDeviceType])
+
+-- | /See:/ 'segmentDimensions' smart constructor.
+data SegmentDimensions = SegmentDimensions'
+    { _sdLocation    :: !(Maybe SegmentLocation)
+    , _sdDemographic :: !(Maybe SegmentDemographics)
+    , _sdBehavior    :: !(Maybe SegmentBehaviors)
+    , _sdAttributes  :: !(Maybe (Map Text AttributeDimension))
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SegmentDimensions' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sdLocation' - The segment location attributes.
+--
+-- * 'sdDemographic' - The segment demographics attributes.
+--
+-- * 'sdBehavior' - The segment behaviors attributes.
+--
+-- * 'sdAttributes' - Custom segment attributes.
+segmentDimensions
+    :: SegmentDimensions
+segmentDimensions =
+    SegmentDimensions'
+    { _sdLocation = Nothing
+    , _sdDemographic = Nothing
+    , _sdBehavior = Nothing
+    , _sdAttributes = Nothing
+    }
+
+-- | The segment location attributes.
+sdLocation :: Lens' SegmentDimensions (Maybe SegmentLocation)
+sdLocation = lens _sdLocation (\ s a -> s{_sdLocation = a});
+
+-- | The segment demographics attributes.
+sdDemographic :: Lens' SegmentDimensions (Maybe SegmentDemographics)
+sdDemographic = lens _sdDemographic (\ s a -> s{_sdDemographic = a});
+
+-- | The segment behaviors attributes.
+sdBehavior :: Lens' SegmentDimensions (Maybe SegmentBehaviors)
+sdBehavior = lens _sdBehavior (\ s a -> s{_sdBehavior = a});
+
+-- | Custom segment attributes.
+sdAttributes :: Lens' SegmentDimensions (HashMap Text AttributeDimension)
+sdAttributes = lens _sdAttributes (\ s a -> s{_sdAttributes = a}) . _Default . _Map;
+
+instance FromJSON SegmentDimensions where
+        parseJSON
+          = withObject "SegmentDimensions"
+              (\ x ->
+                 SegmentDimensions' <$>
+                   (x .:? "Location") <*> (x .:? "Demographic") <*>
+                     (x .:? "Behavior")
+                     <*> (x .:? "Attributes" .!= mempty))
+
+instance Hashable SegmentDimensions
+
+instance NFData SegmentDimensions
+
+instance ToJSON SegmentDimensions where
+        toJSON SegmentDimensions'{..}
+          = object
+              (catMaybes
+                 [("Location" .=) <$> _sdLocation,
+                  ("Demographic" .=) <$> _sdDemographic,
+                  ("Behavior" .=) <$> _sdBehavior,
+                  ("Attributes" .=) <$> _sdAttributes])
+
+-- | /See:/ 'segmentImportResource' smart constructor.
+data SegmentImportResource = SegmentImportResource'
+    { _sirSize       :: !(Maybe Int)
+    , _sirFormat     :: !(Maybe DefinitionFormat)
+    , _sirExternalId :: !(Maybe Text)
+    , _sirS3URL      :: !(Maybe Text)
+    , _sirRoleARN    :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SegmentImportResource' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sirSize' - The number of endpoints that were successfully imported to create this segment.
+--
+-- * 'sirFormat' - The format of the endpoint files that were imported to create this segment. Valid values: CSV, JSON
+--
+-- * 'sirExternalId' - A unique, custom ID assigned to the IAM role that restricts who can assume the role.
+--
+-- * 'sirS3URL' - A URL that points to the Amazon S3 location from which the endpoints for this segment were imported.
+--
+-- * 'sirRoleARN' - The Amazon Resource Name (ARN) of an IAM role that grants Amazon Pinpoint access to the endpoints in Amazon S3.
+segmentImportResource
+    :: SegmentImportResource
+segmentImportResource =
+    SegmentImportResource'
+    { _sirSize = Nothing
+    , _sirFormat = Nothing
+    , _sirExternalId = Nothing
+    , _sirS3URL = Nothing
+    , _sirRoleARN = Nothing
+    }
+
+-- | The number of endpoints that were successfully imported to create this segment.
+sirSize :: Lens' SegmentImportResource (Maybe Int)
+sirSize = lens _sirSize (\ s a -> s{_sirSize = a});
+
+-- | The format of the endpoint files that were imported to create this segment. Valid values: CSV, JSON
+sirFormat :: Lens' SegmentImportResource (Maybe DefinitionFormat)
+sirFormat = lens _sirFormat (\ s a -> s{_sirFormat = a});
+
+-- | A unique, custom ID assigned to the IAM role that restricts who can assume the role.
+sirExternalId :: Lens' SegmentImportResource (Maybe Text)
+sirExternalId = lens _sirExternalId (\ s a -> s{_sirExternalId = a});
+
+-- | A URL that points to the Amazon S3 location from which the endpoints for this segment were imported.
+sirS3URL :: Lens' SegmentImportResource (Maybe Text)
+sirS3URL = lens _sirS3URL (\ s a -> s{_sirS3URL = a});
+
+-- | The Amazon Resource Name (ARN) of an IAM role that grants Amazon Pinpoint access to the endpoints in Amazon S3.
+sirRoleARN :: Lens' SegmentImportResource (Maybe Text)
+sirRoleARN = lens _sirRoleARN (\ s a -> s{_sirRoleARN = a});
+
+instance FromJSON SegmentImportResource where
+        parseJSON
+          = withObject "SegmentImportResource"
+              (\ x ->
+                 SegmentImportResource' <$>
+                   (x .:? "Size") <*> (x .:? "Format") <*>
+                     (x .:? "ExternalId")
+                     <*> (x .:? "S3Url")
+                     <*> (x .:? "RoleArn"))
+
+instance Hashable SegmentImportResource
+
+instance NFData SegmentImportResource
+
+-- | /See:/ 'segmentLocation' smart constructor.
+newtype SegmentLocation = SegmentLocation'
+    { _slCountry :: Maybe SetDimension
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SegmentLocation' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'slCountry' - The country filter according to ISO 3166-1 Alpha-2 codes.
+segmentLocation
+    :: SegmentLocation
+segmentLocation =
+    SegmentLocation'
+    { _slCountry = Nothing
+    }
+
+-- | The country filter according to ISO 3166-1 Alpha-2 codes.
+slCountry :: Lens' SegmentLocation (Maybe SetDimension)
+slCountry = lens _slCountry (\ s a -> s{_slCountry = a});
+
+instance FromJSON SegmentLocation where
+        parseJSON
+          = withObject "SegmentLocation"
+              (\ x -> SegmentLocation' <$> (x .:? "Country"))
+
+instance Hashable SegmentLocation
+
+instance NFData SegmentLocation
+
+instance ToJSON SegmentLocation where
+        toJSON SegmentLocation'{..}
+          = object (catMaybes [("Country" .=) <$> _slCountry])
+
+-- | /See:/ 'segmentResponse' smart constructor.
+data SegmentResponse = SegmentResponse'
+    { _sLastModifiedDate :: !(Maybe Text)
+    , _sSegmentType      :: !(Maybe SegmentType)
+    , _sApplicationId    :: !(Maybe Text)
+    , _sName             :: !(Maybe Text)
+    , _sVersion          :: !(Maybe Int)
+    , _sId               :: !(Maybe Text)
+    , _sCreationDate     :: !(Maybe Text)
+    , _sImportDefinition :: !(Maybe SegmentImportResource)
+    , _sDimensions       :: !(Maybe SegmentDimensions)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SegmentResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sLastModifiedDate' - The date the segment was last updated in ISO 8601 format.
+--
+-- * 'sSegmentType' - The segment type: DIMENSIONAL – A dynamic segment built from selection criteria based on endpoint data reported by your app. You create this type of segment by using the segment builder in the Amazon Pinpoint console or by making a POST request to the segments resource. IMPORT – A static segment built from an imported set of endpoint definitions. You create this type of segment by importing a segment in the Amazon Pinpoint console or by making a POST request to the jobs/import resource.
+--
+-- * 'sApplicationId' - The ID of the application to which the segment applies.
+--
+-- * 'sName' - The name of segment
+--
+-- * 'sVersion' - The segment version number.
+--
+-- * 'sId' - The unique segment ID.
+--
+-- * 'sCreationDate' - The date the segment was created in ISO 8601 format.
+--
+-- * 'sImportDefinition' - The import job settings.
+--
+-- * 'sDimensions' - The segment dimensions attributes.
+segmentResponse
+    :: SegmentResponse
+segmentResponse =
+    SegmentResponse'
+    { _sLastModifiedDate = Nothing
+    , _sSegmentType = Nothing
+    , _sApplicationId = Nothing
+    , _sName = Nothing
+    , _sVersion = Nothing
+    , _sId = Nothing
+    , _sCreationDate = Nothing
+    , _sImportDefinition = Nothing
+    , _sDimensions = Nothing
+    }
+
+-- | The date the segment was last updated in ISO 8601 format.
+sLastModifiedDate :: Lens' SegmentResponse (Maybe Text)
+sLastModifiedDate = lens _sLastModifiedDate (\ s a -> s{_sLastModifiedDate = a});
+
+-- | The segment type: DIMENSIONAL – A dynamic segment built from selection criteria based on endpoint data reported by your app. You create this type of segment by using the segment builder in the Amazon Pinpoint console or by making a POST request to the segments resource. IMPORT – A static segment built from an imported set of endpoint definitions. You create this type of segment by importing a segment in the Amazon Pinpoint console or by making a POST request to the jobs/import resource.
+sSegmentType :: Lens' SegmentResponse (Maybe SegmentType)
+sSegmentType = lens _sSegmentType (\ s a -> s{_sSegmentType = a});
+
+-- | The ID of the application to which the segment applies.
+sApplicationId :: Lens' SegmentResponse (Maybe Text)
+sApplicationId = lens _sApplicationId (\ s a -> s{_sApplicationId = a});
+
+-- | The name of segment
+sName :: Lens' SegmentResponse (Maybe Text)
+sName = lens _sName (\ s a -> s{_sName = a});
+
+-- | The segment version number.
+sVersion :: Lens' SegmentResponse (Maybe Int)
+sVersion = lens _sVersion (\ s a -> s{_sVersion = a});
+
+-- | The unique segment ID.
+sId :: Lens' SegmentResponse (Maybe Text)
+sId = lens _sId (\ s a -> s{_sId = a});
+
+-- | The date the segment was created in ISO 8601 format.
+sCreationDate :: Lens' SegmentResponse (Maybe Text)
+sCreationDate = lens _sCreationDate (\ s a -> s{_sCreationDate = a});
+
+-- | The import job settings.
+sImportDefinition :: Lens' SegmentResponse (Maybe SegmentImportResource)
+sImportDefinition = lens _sImportDefinition (\ s a -> s{_sImportDefinition = a});
+
+-- | The segment dimensions attributes.
+sDimensions :: Lens' SegmentResponse (Maybe SegmentDimensions)
+sDimensions = lens _sDimensions (\ s a -> s{_sDimensions = a});
+
+instance FromJSON SegmentResponse where
+        parseJSON
+          = withObject "SegmentResponse"
+              (\ x ->
+                 SegmentResponse' <$>
+                   (x .:? "LastModifiedDate") <*> (x .:? "SegmentType")
+                     <*> (x .:? "ApplicationId")
+                     <*> (x .:? "Name")
+                     <*> (x .:? "Version")
+                     <*> (x .:? "Id")
+                     <*> (x .:? "CreationDate")
+                     <*> (x .:? "ImportDefinition")
+                     <*> (x .:? "Dimensions"))
+
+instance Hashable SegmentResponse
+
+instance NFData SegmentResponse
+
+-- | /See:/ 'segmentsResponse' smart constructor.
+data SegmentsResponse = SegmentsResponse'
+    { _sNextToken :: !(Maybe Text)
+    , _sItem      :: !(Maybe [SegmentResponse])
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SegmentsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sNextToken' - An identifier used to retrieve the next page of results. The token is null if no additional pages exist.
+--
+-- * 'sItem' - The list of segments.
+segmentsResponse
+    :: SegmentsResponse
+segmentsResponse =
+    SegmentsResponse'
+    { _sNextToken = Nothing
+    , _sItem = Nothing
+    }
+
+-- | An identifier used to retrieve the next page of results. The token is null if no additional pages exist.
+sNextToken :: Lens' SegmentsResponse (Maybe Text)
+sNextToken = lens _sNextToken (\ s a -> s{_sNextToken = a});
+
+-- | The list of segments.
+sItem :: Lens' SegmentsResponse [SegmentResponse]
+sItem = lens _sItem (\ s a -> s{_sItem = a}) . _Default . _Coerce;
+
+instance FromJSON SegmentsResponse where
+        parseJSON
+          = withObject "SegmentsResponse"
+              (\ x ->
+                 SegmentsResponse' <$>
+                   (x .:? "NextToken") <*> (x .:? "Item" .!= mempty))
+
+instance Hashable SegmentsResponse
+
+instance NFData SegmentsResponse
+
+-- | /See:/ 'setDimension' smart constructor.
+data SetDimension = SetDimension'
+    { _sdValues        :: !(Maybe [Text])
+    , _sdDimensionType :: !(Maybe DimensionType)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SetDimension' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sdValues' - The criteria values for the segment dimension. Endpoints with matching attribute values are included or excluded from the segment, depending on the setting for Type.
+--
+-- * 'sdDimensionType' - The type of dimension: INCLUSIVE – Endpoints that match the criteria are included in the segment. EXCLUSIVE – Endpoints that match the criteria are excluded from the segment.
+setDimension
+    :: SetDimension
+setDimension =
+    SetDimension'
+    { _sdValues = Nothing
+    , _sdDimensionType = Nothing
+    }
+
+-- | The criteria values for the segment dimension. Endpoints with matching attribute values are included or excluded from the segment, depending on the setting for Type.
+sdValues :: Lens' SetDimension [Text]
+sdValues = lens _sdValues (\ s a -> s{_sdValues = a}) . _Default . _Coerce;
+
+-- | The type of dimension: INCLUSIVE – Endpoints that match the criteria are included in the segment. EXCLUSIVE – Endpoints that match the criteria are excluded from the segment.
+sdDimensionType :: Lens' SetDimension (Maybe DimensionType)
+sdDimensionType = lens _sdDimensionType (\ s a -> s{_sdDimensionType = a});
+
+instance FromJSON SetDimension where
+        parseJSON
+          = withObject "SetDimension"
+              (\ x ->
+                 SetDimension' <$>
+                   (x .:? "Values" .!= mempty) <*>
+                     (x .:? "DimensionType"))
+
+instance Hashable SetDimension
+
+instance NFData SetDimension
+
+instance ToJSON SetDimension where
+        toJSON SetDimension'{..}
+          = object
+              (catMaybes
+                 [("Values" .=) <$> _sdValues,
+                  ("DimensionType" .=) <$> _sdDimensionType])
+
+-- | /See:/ 'treatmentResource' smart constructor.
+data TreatmentResource = TreatmentResource'
+    { _trState                :: !(Maybe CampaignState)
+    , _trSchedule             :: !(Maybe Schedule)
+    , _trTreatmentName        :: !(Maybe Text)
+    , _trSizePercent          :: !(Maybe Int)
+    , _trTreatmentDescription :: !(Maybe Text)
+    , _trId                   :: !(Maybe Text)
+    , _trMessageConfiguration :: !(Maybe MessageConfiguration)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'TreatmentResource' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'trState' - The treatment status.
+--
+-- * 'trSchedule' - The campaign schedule.
+--
+-- * 'trTreatmentName' - The custom name of a variation of the campaign used for A/B testing.
+--
+-- * 'trSizePercent' - The allocated percentage of users for this treatment.
+--
+-- * 'trTreatmentDescription' - A custom description for the treatment.
+--
+-- * 'trId' - The unique treatment ID.
+--
+-- * 'trMessageConfiguration' - The message configuration settings.
+treatmentResource
+    :: TreatmentResource
+treatmentResource =
+    TreatmentResource'
+    { _trState = Nothing
+    , _trSchedule = Nothing
+    , _trTreatmentName = Nothing
+    , _trSizePercent = Nothing
+    , _trTreatmentDescription = Nothing
+    , _trId = Nothing
+    , _trMessageConfiguration = Nothing
+    }
+
+-- | The treatment status.
+trState :: Lens' TreatmentResource (Maybe CampaignState)
+trState = lens _trState (\ s a -> s{_trState = a});
+
+-- | The campaign schedule.
+trSchedule :: Lens' TreatmentResource (Maybe Schedule)
+trSchedule = lens _trSchedule (\ s a -> s{_trSchedule = a});
+
+-- | The custom name of a variation of the campaign used for A/B testing.
+trTreatmentName :: Lens' TreatmentResource (Maybe Text)
+trTreatmentName = lens _trTreatmentName (\ s a -> s{_trTreatmentName = a});
+
+-- | The allocated percentage of users for this treatment.
+trSizePercent :: Lens' TreatmentResource (Maybe Int)
+trSizePercent = lens _trSizePercent (\ s a -> s{_trSizePercent = a});
+
+-- | A custom description for the treatment.
+trTreatmentDescription :: Lens' TreatmentResource (Maybe Text)
+trTreatmentDescription = lens _trTreatmentDescription (\ s a -> s{_trTreatmentDescription = a});
+
+-- | The unique treatment ID.
+trId :: Lens' TreatmentResource (Maybe Text)
+trId = lens _trId (\ s a -> s{_trId = a});
+
+-- | The message configuration settings.
+trMessageConfiguration :: Lens' TreatmentResource (Maybe MessageConfiguration)
+trMessageConfiguration = lens _trMessageConfiguration (\ s a -> s{_trMessageConfiguration = a});
+
+instance FromJSON TreatmentResource where
+        parseJSON
+          = withObject "TreatmentResource"
+              (\ x ->
+                 TreatmentResource' <$>
+                   (x .:? "State") <*> (x .:? "Schedule") <*>
+                     (x .:? "TreatmentName")
+                     <*> (x .:? "SizePercent")
+                     <*> (x .:? "TreatmentDescription")
+                     <*> (x .:? "Id")
+                     <*> (x .:? "MessageConfiguration"))
+
+instance Hashable TreatmentResource
+
+instance NFData TreatmentResource
+
+-- | /See:/ 'writeApplicationSettingsRequest' smart constructor.
+data WriteApplicationSettingsRequest = WriteApplicationSettingsRequest'
+    { _wasrLimits    :: !(Maybe CampaignLimits)
+    , _wasrQuietTime :: !(Maybe QuietTime)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'WriteApplicationSettingsRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'wasrLimits' - The default campaign limits for the app. These limits apply to each campaign for the app, unless the campaign overrides the default with limits of its own.
+--
+-- * 'wasrQuietTime' - The default quiet time for the app. Each campaign for this app sends no messages during this time unless the campaign overrides the default with a quiet time of its own.
+writeApplicationSettingsRequest
+    :: WriteApplicationSettingsRequest
+writeApplicationSettingsRequest =
+    WriteApplicationSettingsRequest'
+    { _wasrLimits = Nothing
+    , _wasrQuietTime = Nothing
+    }
+
+-- | The default campaign limits for the app. These limits apply to each campaign for the app, unless the campaign overrides the default with limits of its own.
+wasrLimits :: Lens' WriteApplicationSettingsRequest (Maybe CampaignLimits)
+wasrLimits = lens _wasrLimits (\ s a -> s{_wasrLimits = a});
+
+-- | The default quiet time for the app. Each campaign for this app sends no messages during this time unless the campaign overrides the default with a quiet time of its own.
+wasrQuietTime :: Lens' WriteApplicationSettingsRequest (Maybe QuietTime)
+wasrQuietTime = lens _wasrQuietTime (\ s a -> s{_wasrQuietTime = a});
+
+instance Hashable WriteApplicationSettingsRequest
+
+instance NFData WriteApplicationSettingsRequest
+
+instance ToJSON WriteApplicationSettingsRequest where
+        toJSON WriteApplicationSettingsRequest'{..}
+          = object
+              (catMaybes
+                 [("Limits" .=) <$> _wasrLimits,
+                  ("QuietTime" .=) <$> _wasrQuietTime])
+
+-- | /See:/ 'writeCampaignRequest' smart constructor.
+data WriteCampaignRequest = WriteCampaignRequest'
+    { _wcrSchedule             :: !(Maybe Schedule)
+    , _wcrTreatmentName        :: !(Maybe Text)
+    , _wcrLimits               :: !(Maybe CampaignLimits)
+    , _wcrIsPaused             :: !(Maybe Bool)
+    , _wcrName                 :: !(Maybe Text)
+    , _wcrHoldoutPercent       :: !(Maybe Int)
+    , _wcrTreatmentDescription :: !(Maybe Text)
+    , _wcrMessageConfiguration :: !(Maybe MessageConfiguration)
+    , _wcrDescription          :: !(Maybe Text)
+    , _wcrSegmentId            :: !(Maybe Text)
+    , _wcrAdditionalTreatments :: !(Maybe [WriteTreatmentResource])
+    , _wcrSegmentVersion       :: !(Maybe Int)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'WriteCampaignRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'wcrSchedule' - The campaign schedule.
+--
+-- * 'wcrTreatmentName' - The custom name of a variation of the campaign used for A/B testing.
+--
+-- * 'wcrLimits' - The campaign limits settings.
+--
+-- * 'wcrIsPaused' - Indicates whether the campaign is paused. A paused campaign does not send messages unless you resume it by setting IsPaused to false.
+--
+-- * 'wcrName' - The custom name of the campaign.
+--
+-- * 'wcrHoldoutPercent' - The allocated percentage of end users who will not receive messages from this campaign.
+--
+-- * 'wcrTreatmentDescription' - A custom description for the treatment.
+--
+-- * 'wcrMessageConfiguration' - The message configuration settings.
+--
+-- * 'wcrDescription' - A description of the campaign.
+--
+-- * 'wcrSegmentId' - The ID of the segment to which the campaign sends messages.
+--
+-- * 'wcrAdditionalTreatments' - Treatments that are defined in addition to the default treatment.
+--
+-- * 'wcrSegmentVersion' - The version of the segment to which the campaign sends messages.
+writeCampaignRequest
+    :: WriteCampaignRequest
+writeCampaignRequest =
+    WriteCampaignRequest'
+    { _wcrSchedule = Nothing
+    , _wcrTreatmentName = Nothing
+    , _wcrLimits = Nothing
+    , _wcrIsPaused = Nothing
+    , _wcrName = Nothing
+    , _wcrHoldoutPercent = Nothing
+    , _wcrTreatmentDescription = Nothing
+    , _wcrMessageConfiguration = Nothing
+    , _wcrDescription = Nothing
+    , _wcrSegmentId = Nothing
+    , _wcrAdditionalTreatments = Nothing
+    , _wcrSegmentVersion = Nothing
+    }
+
+-- | The campaign schedule.
+wcrSchedule :: Lens' WriteCampaignRequest (Maybe Schedule)
+wcrSchedule = lens _wcrSchedule (\ s a -> s{_wcrSchedule = a});
+
+-- | The custom name of a variation of the campaign used for A/B testing.
+wcrTreatmentName :: Lens' WriteCampaignRequest (Maybe Text)
+wcrTreatmentName = lens _wcrTreatmentName (\ s a -> s{_wcrTreatmentName = a});
+
+-- | The campaign limits settings.
+wcrLimits :: Lens' WriteCampaignRequest (Maybe CampaignLimits)
+wcrLimits = lens _wcrLimits (\ s a -> s{_wcrLimits = a});
+
+-- | Indicates whether the campaign is paused. A paused campaign does not send messages unless you resume it by setting IsPaused to false.
+wcrIsPaused :: Lens' WriteCampaignRequest (Maybe Bool)
+wcrIsPaused = lens _wcrIsPaused (\ s a -> s{_wcrIsPaused = a});
+
+-- | The custom name of the campaign.
+wcrName :: Lens' WriteCampaignRequest (Maybe Text)
+wcrName = lens _wcrName (\ s a -> s{_wcrName = a});
+
+-- | The allocated percentage of end users who will not receive messages from this campaign.
+wcrHoldoutPercent :: Lens' WriteCampaignRequest (Maybe Int)
+wcrHoldoutPercent = lens _wcrHoldoutPercent (\ s a -> s{_wcrHoldoutPercent = a});
+
+-- | A custom description for the treatment.
+wcrTreatmentDescription :: Lens' WriteCampaignRequest (Maybe Text)
+wcrTreatmentDescription = lens _wcrTreatmentDescription (\ s a -> s{_wcrTreatmentDescription = a});
+
+-- | The message configuration settings.
+wcrMessageConfiguration :: Lens' WriteCampaignRequest (Maybe MessageConfiguration)
+wcrMessageConfiguration = lens _wcrMessageConfiguration (\ s a -> s{_wcrMessageConfiguration = a});
+
+-- | A description of the campaign.
+wcrDescription :: Lens' WriteCampaignRequest (Maybe Text)
+wcrDescription = lens _wcrDescription (\ s a -> s{_wcrDescription = a});
+
+-- | The ID of the segment to which the campaign sends messages.
+wcrSegmentId :: Lens' WriteCampaignRequest (Maybe Text)
+wcrSegmentId = lens _wcrSegmentId (\ s a -> s{_wcrSegmentId = a});
+
+-- | Treatments that are defined in addition to the default treatment.
+wcrAdditionalTreatments :: Lens' WriteCampaignRequest [WriteTreatmentResource]
+wcrAdditionalTreatments = lens _wcrAdditionalTreatments (\ s a -> s{_wcrAdditionalTreatments = a}) . _Default . _Coerce;
+
+-- | The version of the segment to which the campaign sends messages.
+wcrSegmentVersion :: Lens' WriteCampaignRequest (Maybe Int)
+wcrSegmentVersion = lens _wcrSegmentVersion (\ s a -> s{_wcrSegmentVersion = a});
+
+instance Hashable WriteCampaignRequest
+
+instance NFData WriteCampaignRequest
+
+instance ToJSON WriteCampaignRequest where
+        toJSON WriteCampaignRequest'{..}
+          = object
+              (catMaybes
+                 [("Schedule" .=) <$> _wcrSchedule,
+                  ("TreatmentName" .=) <$> _wcrTreatmentName,
+                  ("Limits" .=) <$> _wcrLimits,
+                  ("IsPaused" .=) <$> _wcrIsPaused,
+                  ("Name" .=) <$> _wcrName,
+                  ("HoldoutPercent" .=) <$> _wcrHoldoutPercent,
+                  ("TreatmentDescription" .=) <$>
+                    _wcrTreatmentDescription,
+                  ("MessageConfiguration" .=) <$>
+                    _wcrMessageConfiguration,
+                  ("Description" .=) <$> _wcrDescription,
+                  ("SegmentId" .=) <$> _wcrSegmentId,
+                  ("AdditionalTreatments" .=) <$>
+                    _wcrAdditionalTreatments,
+                  ("SegmentVersion" .=) <$> _wcrSegmentVersion])
+
+-- | /See:/ 'writeSegmentRequest' smart constructor.
+data WriteSegmentRequest = WriteSegmentRequest'
+    { _wsrName       :: !(Maybe Text)
+    , _wsrDimensions :: !(Maybe SegmentDimensions)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'WriteSegmentRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'wsrName' - The name of segment
+--
+-- * 'wsrDimensions' - The segment dimensions attributes.
+writeSegmentRequest
+    :: WriteSegmentRequest
+writeSegmentRequest =
+    WriteSegmentRequest'
+    { _wsrName = Nothing
+    , _wsrDimensions = Nothing
+    }
+
+-- | The name of segment
+wsrName :: Lens' WriteSegmentRequest (Maybe Text)
+wsrName = lens _wsrName (\ s a -> s{_wsrName = a});
+
+-- | The segment dimensions attributes.
+wsrDimensions :: Lens' WriteSegmentRequest (Maybe SegmentDimensions)
+wsrDimensions = lens _wsrDimensions (\ s a -> s{_wsrDimensions = a});
+
+instance Hashable WriteSegmentRequest
+
+instance NFData WriteSegmentRequest
+
+instance ToJSON WriteSegmentRequest where
+        toJSON WriteSegmentRequest'{..}
+          = object
+              (catMaybes
+                 [("Name" .=) <$> _wsrName,
+                  ("Dimensions" .=) <$> _wsrDimensions])
+
+-- | /See:/ 'writeTreatmentResource' smart constructor.
+data WriteTreatmentResource = WriteTreatmentResource'
+    { _wtrSchedule             :: !(Maybe Schedule)
+    , _wtrTreatmentName        :: !(Maybe Text)
+    , _wtrSizePercent          :: !(Maybe Int)
+    , _wtrTreatmentDescription :: !(Maybe Text)
+    , _wtrMessageConfiguration :: !(Maybe MessageConfiguration)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'WriteTreatmentResource' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'wtrSchedule' - The campaign schedule.
+--
+-- * 'wtrTreatmentName' - The custom name of a variation of the campaign used for A/B testing.
+--
+-- * 'wtrSizePercent' - The allocated percentage of users for this treatment.
+--
+-- * 'wtrTreatmentDescription' - A custom description for the treatment.
+--
+-- * 'wtrMessageConfiguration' - The message configuration settings.
+writeTreatmentResource
+    :: WriteTreatmentResource
+writeTreatmentResource =
+    WriteTreatmentResource'
+    { _wtrSchedule = Nothing
+    , _wtrTreatmentName = Nothing
+    , _wtrSizePercent = Nothing
+    , _wtrTreatmentDescription = Nothing
+    , _wtrMessageConfiguration = Nothing
+    }
+
+-- | The campaign schedule.
+wtrSchedule :: Lens' WriteTreatmentResource (Maybe Schedule)
+wtrSchedule = lens _wtrSchedule (\ s a -> s{_wtrSchedule = a});
+
+-- | The custom name of a variation of the campaign used for A/B testing.
+wtrTreatmentName :: Lens' WriteTreatmentResource (Maybe Text)
+wtrTreatmentName = lens _wtrTreatmentName (\ s a -> s{_wtrTreatmentName = a});
+
+-- | The allocated percentage of users for this treatment.
+wtrSizePercent :: Lens' WriteTreatmentResource (Maybe Int)
+wtrSizePercent = lens _wtrSizePercent (\ s a -> s{_wtrSizePercent = a});
+
+-- | A custom description for the treatment.
+wtrTreatmentDescription :: Lens' WriteTreatmentResource (Maybe Text)
+wtrTreatmentDescription = lens _wtrTreatmentDescription (\ s a -> s{_wtrTreatmentDescription = a});
+
+-- | The message configuration settings.
+wtrMessageConfiguration :: Lens' WriteTreatmentResource (Maybe MessageConfiguration)
+wtrMessageConfiguration = lens _wtrMessageConfiguration (\ s a -> s{_wtrMessageConfiguration = a});
+
+instance Hashable WriteTreatmentResource
+
+instance NFData WriteTreatmentResource
+
+instance ToJSON WriteTreatmentResource where
+        toJSON WriteTreatmentResource'{..}
+          = object
+              (catMaybes
+                 [("Schedule" .=) <$> _wtrSchedule,
+                  ("TreatmentName" .=) <$> _wtrTreatmentName,
+                  ("SizePercent" .=) <$> _wtrSizePercent,
+                  ("TreatmentDescription" .=) <$>
+                    _wtrTreatmentDescription,
+                  ("MessageConfiguration" .=) <$>
+                    _wtrMessageConfiguration])
diff --git a/gen/Network/AWS/Pinpoint/Types/Sum.hs b/gen/Network/AWS/Pinpoint/Types/Sum.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Pinpoint/Types/Sum.hs
@@ -0,0 +1,372 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE LambdaCase         #-}
+{-# LANGUAGE OverloadedStrings  #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.Pinpoint.Types.Sum
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+module Network.AWS.Pinpoint.Types.Sum where
+
+import           Network.AWS.Prelude
+
+data Action
+    = DeepLink
+    | OpenApp
+    | URL
+    deriving (Eq,Ord,Read,Show,Enum,Bounded,Data,Typeable,Generic)
+
+instance FromText Action where
+    parser = takeLowerText >>= \case
+        "deep_link" -> pure DeepLink
+        "open_app" -> pure OpenApp
+        "url" -> pure URL
+        e -> fromTextError $ "Failure parsing Action from value: '" <> e
+           <> "'. Accepted values: deep_link, open_app, url"
+
+instance ToText Action where
+    toText = \case
+        DeepLink -> "DEEP_LINK"
+        OpenApp -> "OPEN_APP"
+        URL -> "URL"
+
+instance Hashable     Action
+instance NFData       Action
+instance ToByteString Action
+instance ToQuery      Action
+instance ToHeader     Action
+
+instance ToJSON Action where
+    toJSON = toJSONText
+
+instance FromJSON Action where
+    parseJSON = parseJSONText "Action"
+
+data AttributeType
+    = Exclusive
+    | Inclusive
+    deriving (Eq,Ord,Read,Show,Enum,Bounded,Data,Typeable,Generic)
+
+instance FromText AttributeType where
+    parser = takeLowerText >>= \case
+        "exclusive" -> pure Exclusive
+        "inclusive" -> pure Inclusive
+        e -> fromTextError $ "Failure parsing AttributeType from value: '" <> e
+           <> "'. Accepted values: exclusive, inclusive"
+
+instance ToText AttributeType where
+    toText = \case
+        Exclusive -> "EXCLUSIVE"
+        Inclusive -> "INCLUSIVE"
+
+instance Hashable     AttributeType
+instance NFData       AttributeType
+instance ToByteString AttributeType
+instance ToQuery      AttributeType
+instance ToHeader     AttributeType
+
+instance ToJSON AttributeType where
+    toJSON = toJSONText
+
+instance FromJSON AttributeType where
+    parseJSON = parseJSONText "AttributeType"
+
+data CampaignStatus
+    = Completed
+    | Executing
+    | Paused
+    | PendingNextRun
+    | Scheduled
+    deriving (Eq,Ord,Read,Show,Enum,Bounded,Data,Typeable,Generic)
+
+instance FromText CampaignStatus where
+    parser = takeLowerText >>= \case
+        "completed" -> pure Completed
+        "executing" -> pure Executing
+        "paused" -> pure Paused
+        "pending_next_run" -> pure PendingNextRun
+        "scheduled" -> pure Scheduled
+        e -> fromTextError $ "Failure parsing CampaignStatus from value: '" <> e
+           <> "'. Accepted values: completed, executing, paused, pending_next_run, scheduled"
+
+instance ToText CampaignStatus where
+    toText = \case
+        Completed -> "COMPLETED"
+        Executing -> "EXECUTING"
+        Paused -> "PAUSED"
+        PendingNextRun -> "PENDING_NEXT_RUN"
+        Scheduled -> "SCHEDULED"
+
+instance Hashable     CampaignStatus
+instance NFData       CampaignStatus
+instance ToByteString CampaignStatus
+instance ToQuery      CampaignStatus
+instance ToHeader     CampaignStatus
+
+instance FromJSON CampaignStatus where
+    parseJSON = parseJSONText "CampaignStatus"
+
+data ChannelType
+    = APNS
+    | GCM
+    deriving (Eq,Ord,Read,Show,Enum,Bounded,Data,Typeable,Generic)
+
+instance FromText ChannelType where
+    parser = takeLowerText >>= \case
+        "apns" -> pure APNS
+        "gcm" -> pure GCM
+        e -> fromTextError $ "Failure parsing ChannelType from value: '" <> e
+           <> "'. Accepted values: apns, gcm"
+
+instance ToText ChannelType where
+    toText = \case
+        APNS -> "APNS"
+        GCM -> "GCM"
+
+instance Hashable     ChannelType
+instance NFData       ChannelType
+instance ToByteString ChannelType
+instance ToQuery      ChannelType
+instance ToHeader     ChannelType
+
+instance ToJSON ChannelType where
+    toJSON = toJSONText
+
+instance FromJSON ChannelType where
+    parseJSON = parseJSONText "ChannelType"
+
+data DefinitionFormat
+    = CSV
+    | JSON
+    deriving (Eq,Ord,Read,Show,Enum,Bounded,Data,Typeable,Generic)
+
+instance FromText DefinitionFormat where
+    parser = takeLowerText >>= \case
+        "csv" -> pure CSV
+        "json" -> pure JSON
+        e -> fromTextError $ "Failure parsing DefinitionFormat from value: '" <> e
+           <> "'. Accepted values: csv, json"
+
+instance ToText DefinitionFormat where
+    toText = \case
+        CSV -> "CSV"
+        JSON -> "JSON"
+
+instance Hashable     DefinitionFormat
+instance NFData       DefinitionFormat
+instance ToByteString DefinitionFormat
+instance ToQuery      DefinitionFormat
+instance ToHeader     DefinitionFormat
+
+instance ToJSON DefinitionFormat where
+    toJSON = toJSONText
+
+instance FromJSON DefinitionFormat where
+    parseJSON = parseJSONText "DefinitionFormat"
+
+data DimensionType
+    = DTExclusive
+    | DTInclusive
+    deriving (Eq,Ord,Read,Show,Enum,Bounded,Data,Typeable,Generic)
+
+instance FromText DimensionType where
+    parser = takeLowerText >>= \case
+        "exclusive" -> pure DTExclusive
+        "inclusive" -> pure DTInclusive
+        e -> fromTextError $ "Failure parsing DimensionType from value: '" <> e
+           <> "'. Accepted values: exclusive, inclusive"
+
+instance ToText DimensionType where
+    toText = \case
+        DTExclusive -> "EXCLUSIVE"
+        DTInclusive -> "INCLUSIVE"
+
+instance Hashable     DimensionType
+instance NFData       DimensionType
+instance ToByteString DimensionType
+instance ToQuery      DimensionType
+instance ToHeader     DimensionType
+
+instance ToJSON DimensionType where
+    toJSON = toJSONText
+
+instance FromJSON DimensionType where
+    parseJSON = parseJSONText "DimensionType"
+
+data Duration
+    = Day14
+    | Day30
+    | Day7
+    | Hr24
+    deriving (Eq,Ord,Read,Show,Enum,Bounded,Data,Typeable,Generic)
+
+instance FromText Duration where
+    parser = takeLowerText >>= \case
+        "day_14" -> pure Day14
+        "day_30" -> pure Day30
+        "day_7" -> pure Day7
+        "hr_24" -> pure Hr24
+        e -> fromTextError $ "Failure parsing Duration from value: '" <> e
+           <> "'. Accepted values: day_14, day_30, day_7, hr_24"
+
+instance ToText Duration where
+    toText = \case
+        Day14 -> "DAY_14"
+        Day30 -> "DAY_30"
+        Day7 -> "DAY_7"
+        Hr24 -> "HR_24"
+
+instance Hashable     Duration
+instance NFData       Duration
+instance ToByteString Duration
+instance ToQuery      Duration
+instance ToHeader     Duration
+
+instance ToJSON Duration where
+    toJSON = toJSONText
+
+instance FromJSON Duration where
+    parseJSON = parseJSONText "Duration"
+
+data Frequency
+    = Daily
+    | Hourly
+    | Monthly
+    | Once
+    | Weekly
+    deriving (Eq,Ord,Read,Show,Enum,Bounded,Data,Typeable,Generic)
+
+instance FromText Frequency where
+    parser = takeLowerText >>= \case
+        "daily" -> pure Daily
+        "hourly" -> pure Hourly
+        "monthly" -> pure Monthly
+        "once" -> pure Once
+        "weekly" -> pure Weekly
+        e -> fromTextError $ "Failure parsing Frequency from value: '" <> e
+           <> "'. Accepted values: daily, hourly, monthly, once, weekly"
+
+instance ToText Frequency where
+    toText = \case
+        Daily -> "DAILY"
+        Hourly -> "HOURLY"
+        Monthly -> "MONTHLY"
+        Once -> "ONCE"
+        Weekly -> "WEEKLY"
+
+instance Hashable     Frequency
+instance NFData       Frequency
+instance ToByteString Frequency
+instance ToQuery      Frequency
+instance ToHeader     Frequency
+
+instance ToJSON Frequency where
+    toJSON = toJSONText
+
+instance FromJSON Frequency where
+    parseJSON = parseJSONText "Frequency"
+
+data JobStatus
+    = JSCompleted
+    | JSCompleting
+    | JSCreated
+    | JSFailed
+    | JSFailing
+    | JSInitializing
+    | JSProcessing
+    deriving (Eq,Ord,Read,Show,Enum,Bounded,Data,Typeable,Generic)
+
+instance FromText JobStatus where
+    parser = takeLowerText >>= \case
+        "completed" -> pure JSCompleted
+        "completing" -> pure JSCompleting
+        "created" -> pure JSCreated
+        "failed" -> pure JSFailed
+        "failing" -> pure JSFailing
+        "initializing" -> pure JSInitializing
+        "processing" -> pure JSProcessing
+        e -> fromTextError $ "Failure parsing JobStatus from value: '" <> e
+           <> "'. Accepted values: completed, completing, created, failed, failing, initializing, processing"
+
+instance ToText JobStatus where
+    toText = \case
+        JSCompleted -> "COMPLETED"
+        JSCompleting -> "COMPLETING"
+        JSCreated -> "CREATED"
+        JSFailed -> "FAILED"
+        JSFailing -> "FAILING"
+        JSInitializing -> "INITIALIZING"
+        JSProcessing -> "PROCESSING"
+
+instance Hashable     JobStatus
+instance NFData       JobStatus
+instance ToByteString JobStatus
+instance ToQuery      JobStatus
+instance ToHeader     JobStatus
+
+instance FromJSON JobStatus where
+    parseJSON = parseJSONText "JobStatus"
+
+data RecencyType
+    = Active
+    | Inactive
+    deriving (Eq,Ord,Read,Show,Enum,Bounded,Data,Typeable,Generic)
+
+instance FromText RecencyType where
+    parser = takeLowerText >>= \case
+        "active" -> pure Active
+        "inactive" -> pure Inactive
+        e -> fromTextError $ "Failure parsing RecencyType from value: '" <> e
+           <> "'. Accepted values: active, inactive"
+
+instance ToText RecencyType where
+    toText = \case
+        Active -> "ACTIVE"
+        Inactive -> "INACTIVE"
+
+instance Hashable     RecencyType
+instance NFData       RecencyType
+instance ToByteString RecencyType
+instance ToQuery      RecencyType
+instance ToHeader     RecencyType
+
+instance ToJSON RecencyType where
+    toJSON = toJSONText
+
+instance FromJSON RecencyType where
+    parseJSON = parseJSONText "RecencyType"
+
+data SegmentType
+    = Dimensional
+    | Import
+    deriving (Eq,Ord,Read,Show,Enum,Bounded,Data,Typeable,Generic)
+
+instance FromText SegmentType where
+    parser = takeLowerText >>= \case
+        "dimensional" -> pure Dimensional
+        "import" -> pure Import
+        e -> fromTextError $ "Failure parsing SegmentType from value: '" <> e
+           <> "'. Accepted values: dimensional, import"
+
+instance ToText SegmentType where
+    toText = \case
+        Dimensional -> "DIMENSIONAL"
+        Import -> "IMPORT"
+
+instance Hashable     SegmentType
+instance NFData       SegmentType
+instance ToByteString SegmentType
+instance ToQuery      SegmentType
+instance ToHeader     SegmentType
+
+instance FromJSON SegmentType where
+    parseJSON = parseJSONText "SegmentType"
diff --git a/gen/Network/AWS/Pinpoint/UpdateAPNSChannel.hs b/gen/Network/AWS/Pinpoint/UpdateAPNSChannel.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Pinpoint/UpdateAPNSChannel.hs
@@ -0,0 +1,144 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.Pinpoint.UpdateAPNSChannel
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Use to update the APNs channel for an app.
+module Network.AWS.Pinpoint.UpdateAPNSChannel
+    (
+    -- * Creating a Request
+      updateAPNSChannel
+    , UpdateAPNSChannel
+    -- * Request Lenses
+    , uacApplicationId
+    , uacAPNSChannelRequest
+
+    -- * Destructuring the Response
+    , updateAPNSChannelResponse
+    , UpdateAPNSChannelResponse
+    -- * Response Lenses
+    , uacrsResponseStatus
+    , uacrsAPNSChannelResponse
+    ) where
+
+import           Network.AWS.Lens
+import           Network.AWS.Pinpoint.Types
+import           Network.AWS.Pinpoint.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'updateAPNSChannel' smart constructor.
+data UpdateAPNSChannel = UpdateAPNSChannel'
+    { _uacApplicationId      :: !Text
+    , _uacAPNSChannelRequest :: !APNSChannelRequest
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'UpdateAPNSChannel' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'uacApplicationId' - Undocumented member.
+--
+-- * 'uacAPNSChannelRequest' - Undocumented member.
+updateAPNSChannel
+    :: Text -- ^ 'uacApplicationId'
+    -> APNSChannelRequest -- ^ 'uacAPNSChannelRequest'
+    -> UpdateAPNSChannel
+updateAPNSChannel pApplicationId_ pAPNSChannelRequest_ =
+    UpdateAPNSChannel'
+    { _uacApplicationId = pApplicationId_
+    , _uacAPNSChannelRequest = pAPNSChannelRequest_
+    }
+
+-- | Undocumented member.
+uacApplicationId :: Lens' UpdateAPNSChannel Text
+uacApplicationId = lens _uacApplicationId (\ s a -> s{_uacApplicationId = a});
+
+-- | Undocumented member.
+uacAPNSChannelRequest :: Lens' UpdateAPNSChannel APNSChannelRequest
+uacAPNSChannelRequest = lens _uacAPNSChannelRequest (\ s a -> s{_uacAPNSChannelRequest = a});
+
+instance AWSRequest UpdateAPNSChannel where
+        type Rs UpdateAPNSChannel = UpdateAPNSChannelResponse
+        request = putJSON pinpoint
+        response
+          = receiveJSON
+              (\ s h x ->
+                 UpdateAPNSChannelResponse' <$>
+                   (pure (fromEnum s)) <*> (eitherParseJSON x))
+
+instance Hashable UpdateAPNSChannel
+
+instance NFData UpdateAPNSChannel
+
+instance ToHeaders UpdateAPNSChannel where
+        toHeaders
+          = const
+              (mconcat
+                 ["Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON UpdateAPNSChannel where
+        toJSON UpdateAPNSChannel'{..}
+          = object
+              (catMaybes
+                 [Just
+                    ("APNSChannelRequest" .= _uacAPNSChannelRequest)])
+
+instance ToPath UpdateAPNSChannel where
+        toPath UpdateAPNSChannel'{..}
+          = mconcat
+              ["/v1/apps/", toBS _uacApplicationId,
+               "/channels/apns"]
+
+instance ToQuery UpdateAPNSChannel where
+        toQuery = const mempty
+
+-- | /See:/ 'updateAPNSChannelResponse' smart constructor.
+data UpdateAPNSChannelResponse = UpdateAPNSChannelResponse'
+    { _uacrsResponseStatus      :: !Int
+    , _uacrsAPNSChannelResponse :: !APNSChannelResponse
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'UpdateAPNSChannelResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'uacrsResponseStatus' - -- | The response status code.
+--
+-- * 'uacrsAPNSChannelResponse' - Undocumented member.
+updateAPNSChannelResponse
+    :: Int -- ^ 'uacrsResponseStatus'
+    -> APNSChannelResponse -- ^ 'uacrsAPNSChannelResponse'
+    -> UpdateAPNSChannelResponse
+updateAPNSChannelResponse pResponseStatus_ pAPNSChannelResponse_ =
+    UpdateAPNSChannelResponse'
+    { _uacrsResponseStatus = pResponseStatus_
+    , _uacrsAPNSChannelResponse = pAPNSChannelResponse_
+    }
+
+-- | -- | The response status code.
+uacrsResponseStatus :: Lens' UpdateAPNSChannelResponse Int
+uacrsResponseStatus = lens _uacrsResponseStatus (\ s a -> s{_uacrsResponseStatus = a});
+
+-- | Undocumented member.
+uacrsAPNSChannelResponse :: Lens' UpdateAPNSChannelResponse APNSChannelResponse
+uacrsAPNSChannelResponse = lens _uacrsAPNSChannelResponse (\ s a -> s{_uacrsAPNSChannelResponse = a});
+
+instance NFData UpdateAPNSChannelResponse
diff --git a/gen/Network/AWS/Pinpoint/UpdateApplicationSettings.hs b/gen/Network/AWS/Pinpoint/UpdateApplicationSettings.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Pinpoint/UpdateApplicationSettings.hs
@@ -0,0 +1,145 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.Pinpoint.UpdateApplicationSettings
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Used to update the settings for an app.
+module Network.AWS.Pinpoint.UpdateApplicationSettings
+    (
+    -- * Creating a Request
+      updateApplicationSettings
+    , UpdateApplicationSettings
+    -- * Request Lenses
+    , uasApplicationId
+    , uasWriteApplicationSettingsRequest
+
+    -- * Destructuring the Response
+    , updateApplicationSettingsResponse
+    , UpdateApplicationSettingsResponse
+    -- * Response Lenses
+    , uasrsResponseStatus
+    , uasrsApplicationSettingsResource
+    ) where
+
+import           Network.AWS.Lens
+import           Network.AWS.Pinpoint.Types
+import           Network.AWS.Pinpoint.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'updateApplicationSettings' smart constructor.
+data UpdateApplicationSettings = UpdateApplicationSettings'
+    { _uasApplicationId                   :: !Text
+    , _uasWriteApplicationSettingsRequest :: !WriteApplicationSettingsRequest
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'UpdateApplicationSettings' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'uasApplicationId' - Undocumented member.
+--
+-- * 'uasWriteApplicationSettingsRequest' - Undocumented member.
+updateApplicationSettings
+    :: Text -- ^ 'uasApplicationId'
+    -> WriteApplicationSettingsRequest -- ^ 'uasWriteApplicationSettingsRequest'
+    -> UpdateApplicationSettings
+updateApplicationSettings pApplicationId_ pWriteApplicationSettingsRequest_ =
+    UpdateApplicationSettings'
+    { _uasApplicationId = pApplicationId_
+    , _uasWriteApplicationSettingsRequest = pWriteApplicationSettingsRequest_
+    }
+
+-- | Undocumented member.
+uasApplicationId :: Lens' UpdateApplicationSettings Text
+uasApplicationId = lens _uasApplicationId (\ s a -> s{_uasApplicationId = a});
+
+-- | Undocumented member.
+uasWriteApplicationSettingsRequest :: Lens' UpdateApplicationSettings WriteApplicationSettingsRequest
+uasWriteApplicationSettingsRequest = lens _uasWriteApplicationSettingsRequest (\ s a -> s{_uasWriteApplicationSettingsRequest = a});
+
+instance AWSRequest UpdateApplicationSettings where
+        type Rs UpdateApplicationSettings =
+             UpdateApplicationSettingsResponse
+        request = putJSON pinpoint
+        response
+          = receiveJSON
+              (\ s h x ->
+                 UpdateApplicationSettingsResponse' <$>
+                   (pure (fromEnum s)) <*> (eitherParseJSON x))
+
+instance Hashable UpdateApplicationSettings
+
+instance NFData UpdateApplicationSettings
+
+instance ToHeaders UpdateApplicationSettings where
+        toHeaders
+          = const
+              (mconcat
+                 ["Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON UpdateApplicationSettings where
+        toJSON UpdateApplicationSettings'{..}
+          = object
+              (catMaybes
+                 [Just
+                    ("WriteApplicationSettingsRequest" .=
+                       _uasWriteApplicationSettingsRequest)])
+
+instance ToPath UpdateApplicationSettings where
+        toPath UpdateApplicationSettings'{..}
+          = mconcat
+              ["/v1/apps/", toBS _uasApplicationId, "/settings"]
+
+instance ToQuery UpdateApplicationSettings where
+        toQuery = const mempty
+
+-- | /See:/ 'updateApplicationSettingsResponse' smart constructor.
+data UpdateApplicationSettingsResponse = UpdateApplicationSettingsResponse'
+    { _uasrsResponseStatus              :: !Int
+    , _uasrsApplicationSettingsResource :: !ApplicationSettingsResource
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'UpdateApplicationSettingsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'uasrsResponseStatus' - -- | The response status code.
+--
+-- * 'uasrsApplicationSettingsResource' - Undocumented member.
+updateApplicationSettingsResponse
+    :: Int -- ^ 'uasrsResponseStatus'
+    -> ApplicationSettingsResource -- ^ 'uasrsApplicationSettingsResource'
+    -> UpdateApplicationSettingsResponse
+updateApplicationSettingsResponse pResponseStatus_ pApplicationSettingsResource_ =
+    UpdateApplicationSettingsResponse'
+    { _uasrsResponseStatus = pResponseStatus_
+    , _uasrsApplicationSettingsResource = pApplicationSettingsResource_
+    }
+
+-- | -- | The response status code.
+uasrsResponseStatus :: Lens' UpdateApplicationSettingsResponse Int
+uasrsResponseStatus = lens _uasrsResponseStatus (\ s a -> s{_uasrsResponseStatus = a});
+
+-- | Undocumented member.
+uasrsApplicationSettingsResource :: Lens' UpdateApplicationSettingsResponse ApplicationSettingsResource
+uasrsApplicationSettingsResource = lens _uasrsApplicationSettingsResource (\ s a -> s{_uasrsApplicationSettingsResource = a});
+
+instance NFData UpdateApplicationSettingsResponse
diff --git a/gen/Network/AWS/Pinpoint/UpdateCampaign.hs b/gen/Network/AWS/Pinpoint/UpdateCampaign.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Pinpoint/UpdateCampaign.hs
@@ -0,0 +1,154 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.Pinpoint.UpdateCampaign
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Use to update a campaign.
+module Network.AWS.Pinpoint.UpdateCampaign
+    (
+    -- * Creating a Request
+      updateCampaign
+    , UpdateCampaign
+    -- * Request Lenses
+    , ucCampaignId
+    , ucApplicationId
+    , ucWriteCampaignRequest
+
+    -- * Destructuring the Response
+    , updateCampaignResponse
+    , UpdateCampaignResponse
+    -- * Response Lenses
+    , ucrsResponseStatus
+    , ucrsCampaignResponse
+    ) where
+
+import           Network.AWS.Lens
+import           Network.AWS.Pinpoint.Types
+import           Network.AWS.Pinpoint.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'updateCampaign' smart constructor.
+data UpdateCampaign = UpdateCampaign'
+    { _ucCampaignId           :: !Text
+    , _ucApplicationId        :: !Text
+    , _ucWriteCampaignRequest :: !WriteCampaignRequest
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'UpdateCampaign' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ucCampaignId' - Undocumented member.
+--
+-- * 'ucApplicationId' - Undocumented member.
+--
+-- * 'ucWriteCampaignRequest' - Undocumented member.
+updateCampaign
+    :: Text -- ^ 'ucCampaignId'
+    -> Text -- ^ 'ucApplicationId'
+    -> WriteCampaignRequest -- ^ 'ucWriteCampaignRequest'
+    -> UpdateCampaign
+updateCampaign pCampaignId_ pApplicationId_ pWriteCampaignRequest_ =
+    UpdateCampaign'
+    { _ucCampaignId = pCampaignId_
+    , _ucApplicationId = pApplicationId_
+    , _ucWriteCampaignRequest = pWriteCampaignRequest_
+    }
+
+-- | Undocumented member.
+ucCampaignId :: Lens' UpdateCampaign Text
+ucCampaignId = lens _ucCampaignId (\ s a -> s{_ucCampaignId = a});
+
+-- | Undocumented member.
+ucApplicationId :: Lens' UpdateCampaign Text
+ucApplicationId = lens _ucApplicationId (\ s a -> s{_ucApplicationId = a});
+
+-- | Undocumented member.
+ucWriteCampaignRequest :: Lens' UpdateCampaign WriteCampaignRequest
+ucWriteCampaignRequest = lens _ucWriteCampaignRequest (\ s a -> s{_ucWriteCampaignRequest = a});
+
+instance AWSRequest UpdateCampaign where
+        type Rs UpdateCampaign = UpdateCampaignResponse
+        request = putJSON pinpoint
+        response
+          = receiveJSON
+              (\ s h x ->
+                 UpdateCampaignResponse' <$>
+                   (pure (fromEnum s)) <*> (eitherParseJSON x))
+
+instance Hashable UpdateCampaign
+
+instance NFData UpdateCampaign
+
+instance ToHeaders UpdateCampaign where
+        toHeaders
+          = const
+              (mconcat
+                 ["Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON UpdateCampaign where
+        toJSON UpdateCampaign'{..}
+          = object
+              (catMaybes
+                 [Just
+                    ("WriteCampaignRequest" .= _ucWriteCampaignRequest)])
+
+instance ToPath UpdateCampaign where
+        toPath UpdateCampaign'{..}
+          = mconcat
+              ["/v1/apps/", toBS _ucApplicationId, "/campaigns/",
+               toBS _ucCampaignId]
+
+instance ToQuery UpdateCampaign where
+        toQuery = const mempty
+
+-- | /See:/ 'updateCampaignResponse' smart constructor.
+data UpdateCampaignResponse = UpdateCampaignResponse'
+    { _ucrsResponseStatus   :: !Int
+    , _ucrsCampaignResponse :: !CampaignResponse
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'UpdateCampaignResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ucrsResponseStatus' - -- | The response status code.
+--
+-- * 'ucrsCampaignResponse' - Undocumented member.
+updateCampaignResponse
+    :: Int -- ^ 'ucrsResponseStatus'
+    -> CampaignResponse -- ^ 'ucrsCampaignResponse'
+    -> UpdateCampaignResponse
+updateCampaignResponse pResponseStatus_ pCampaignResponse_ =
+    UpdateCampaignResponse'
+    { _ucrsResponseStatus = pResponseStatus_
+    , _ucrsCampaignResponse = pCampaignResponse_
+    }
+
+-- | -- | The response status code.
+ucrsResponseStatus :: Lens' UpdateCampaignResponse Int
+ucrsResponseStatus = lens _ucrsResponseStatus (\ s a -> s{_ucrsResponseStatus = a});
+
+-- | Undocumented member.
+ucrsCampaignResponse :: Lens' UpdateCampaignResponse CampaignResponse
+ucrsCampaignResponse = lens _ucrsCampaignResponse (\ s a -> s{_ucrsCampaignResponse = a});
+
+instance NFData UpdateCampaignResponse
diff --git a/gen/Network/AWS/Pinpoint/UpdateEndpoint.hs b/gen/Network/AWS/Pinpoint/UpdateEndpoint.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Pinpoint/UpdateEndpoint.hs
@@ -0,0 +1,153 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.Pinpoint.UpdateEndpoint
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Use to update an endpoint.
+module Network.AWS.Pinpoint.UpdateEndpoint
+    (
+    -- * Creating a Request
+      updateEndpoint
+    , UpdateEndpoint
+    -- * Request Lenses
+    , ueApplicationId
+    , ueEndpointId
+    , ueEndpointRequest
+
+    -- * Destructuring the Response
+    , updateEndpointResponse
+    , UpdateEndpointResponse
+    -- * Response Lenses
+    , uersResponseStatus
+    , uersMessageBody
+    ) where
+
+import           Network.AWS.Lens
+import           Network.AWS.Pinpoint.Types
+import           Network.AWS.Pinpoint.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'updateEndpoint' smart constructor.
+data UpdateEndpoint = UpdateEndpoint'
+    { _ueApplicationId   :: !Text
+    , _ueEndpointId      :: !Text
+    , _ueEndpointRequest :: !EndpointRequest
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'UpdateEndpoint' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ueApplicationId' - Undocumented member.
+--
+-- * 'ueEndpointId' - Undocumented member.
+--
+-- * 'ueEndpointRequest' - Undocumented member.
+updateEndpoint
+    :: Text -- ^ 'ueApplicationId'
+    -> Text -- ^ 'ueEndpointId'
+    -> EndpointRequest -- ^ 'ueEndpointRequest'
+    -> UpdateEndpoint
+updateEndpoint pApplicationId_ pEndpointId_ pEndpointRequest_ =
+    UpdateEndpoint'
+    { _ueApplicationId = pApplicationId_
+    , _ueEndpointId = pEndpointId_
+    , _ueEndpointRequest = pEndpointRequest_
+    }
+
+-- | Undocumented member.
+ueApplicationId :: Lens' UpdateEndpoint Text
+ueApplicationId = lens _ueApplicationId (\ s a -> s{_ueApplicationId = a});
+
+-- | Undocumented member.
+ueEndpointId :: Lens' UpdateEndpoint Text
+ueEndpointId = lens _ueEndpointId (\ s a -> s{_ueEndpointId = a});
+
+-- | Undocumented member.
+ueEndpointRequest :: Lens' UpdateEndpoint EndpointRequest
+ueEndpointRequest = lens _ueEndpointRequest (\ s a -> s{_ueEndpointRequest = a});
+
+instance AWSRequest UpdateEndpoint where
+        type Rs UpdateEndpoint = UpdateEndpointResponse
+        request = putJSON pinpoint
+        response
+          = receiveJSON
+              (\ s h x ->
+                 UpdateEndpointResponse' <$>
+                   (pure (fromEnum s)) <*> (eitherParseJSON x))
+
+instance Hashable UpdateEndpoint
+
+instance NFData UpdateEndpoint
+
+instance ToHeaders UpdateEndpoint where
+        toHeaders
+          = const
+              (mconcat
+                 ["Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON UpdateEndpoint where
+        toJSON UpdateEndpoint'{..}
+          = object
+              (catMaybes
+                 [Just ("EndpointRequest" .= _ueEndpointRequest)])
+
+instance ToPath UpdateEndpoint where
+        toPath UpdateEndpoint'{..}
+          = mconcat
+              ["/v1/apps/", toBS _ueApplicationId, "/endpoints/",
+               toBS _ueEndpointId]
+
+instance ToQuery UpdateEndpoint where
+        toQuery = const mempty
+
+-- | /See:/ 'updateEndpointResponse' smart constructor.
+data UpdateEndpointResponse = UpdateEndpointResponse'
+    { _uersResponseStatus :: !Int
+    , _uersMessageBody    :: !MessageBody
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'UpdateEndpointResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'uersResponseStatus' - -- | The response status code.
+--
+-- * 'uersMessageBody' - Undocumented member.
+updateEndpointResponse
+    :: Int -- ^ 'uersResponseStatus'
+    -> MessageBody -- ^ 'uersMessageBody'
+    -> UpdateEndpointResponse
+updateEndpointResponse pResponseStatus_ pMessageBody_ =
+    UpdateEndpointResponse'
+    { _uersResponseStatus = pResponseStatus_
+    , _uersMessageBody = pMessageBody_
+    }
+
+-- | -- | The response status code.
+uersResponseStatus :: Lens' UpdateEndpointResponse Int
+uersResponseStatus = lens _uersResponseStatus (\ s a -> s{_uersResponseStatus = a});
+
+-- | Undocumented member.
+uersMessageBody :: Lens' UpdateEndpointResponse MessageBody
+uersMessageBody = lens _uersMessageBody (\ s a -> s{_uersMessageBody = a});
+
+instance NFData UpdateEndpointResponse
diff --git a/gen/Network/AWS/Pinpoint/UpdateEndpointsBatch.hs b/gen/Network/AWS/Pinpoint/UpdateEndpointsBatch.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Pinpoint/UpdateEndpointsBatch.hs
@@ -0,0 +1,145 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.Pinpoint.UpdateEndpointsBatch
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Use to update your endpoints.
+module Network.AWS.Pinpoint.UpdateEndpointsBatch
+    (
+    -- * Creating a Request
+      updateEndpointsBatch
+    , UpdateEndpointsBatch
+    -- * Request Lenses
+    , uebApplicationId
+    , uebEndpointBatchRequest
+
+    -- * Destructuring the Response
+    , updateEndpointsBatchResponse
+    , UpdateEndpointsBatchResponse
+    -- * Response Lenses
+    , uebrsResponseStatus
+    , uebrsMessageBody
+    ) where
+
+import           Network.AWS.Lens
+import           Network.AWS.Pinpoint.Types
+import           Network.AWS.Pinpoint.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'updateEndpointsBatch' smart constructor.
+data UpdateEndpointsBatch = UpdateEndpointsBatch'
+    { _uebApplicationId        :: !Text
+    , _uebEndpointBatchRequest :: !EndpointBatchRequest
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'UpdateEndpointsBatch' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'uebApplicationId' - Undocumented member.
+--
+-- * 'uebEndpointBatchRequest' - Undocumented member.
+updateEndpointsBatch
+    :: Text -- ^ 'uebApplicationId'
+    -> EndpointBatchRequest -- ^ 'uebEndpointBatchRequest'
+    -> UpdateEndpointsBatch
+updateEndpointsBatch pApplicationId_ pEndpointBatchRequest_ =
+    UpdateEndpointsBatch'
+    { _uebApplicationId = pApplicationId_
+    , _uebEndpointBatchRequest = pEndpointBatchRequest_
+    }
+
+-- | Undocumented member.
+uebApplicationId :: Lens' UpdateEndpointsBatch Text
+uebApplicationId = lens _uebApplicationId (\ s a -> s{_uebApplicationId = a});
+
+-- | Undocumented member.
+uebEndpointBatchRequest :: Lens' UpdateEndpointsBatch EndpointBatchRequest
+uebEndpointBatchRequest = lens _uebEndpointBatchRequest (\ s a -> s{_uebEndpointBatchRequest = a});
+
+instance AWSRequest UpdateEndpointsBatch where
+        type Rs UpdateEndpointsBatch =
+             UpdateEndpointsBatchResponse
+        request = putJSON pinpoint
+        response
+          = receiveJSON
+              (\ s h x ->
+                 UpdateEndpointsBatchResponse' <$>
+                   (pure (fromEnum s)) <*> (eitherParseJSON x))
+
+instance Hashable UpdateEndpointsBatch
+
+instance NFData UpdateEndpointsBatch
+
+instance ToHeaders UpdateEndpointsBatch where
+        toHeaders
+          = const
+              (mconcat
+                 ["Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON UpdateEndpointsBatch where
+        toJSON UpdateEndpointsBatch'{..}
+          = object
+              (catMaybes
+                 [Just
+                    ("EndpointBatchRequest" .=
+                       _uebEndpointBatchRequest)])
+
+instance ToPath UpdateEndpointsBatch where
+        toPath UpdateEndpointsBatch'{..}
+          = mconcat
+              ["/v1/apps/", toBS _uebApplicationId, "/endpoints"]
+
+instance ToQuery UpdateEndpointsBatch where
+        toQuery = const mempty
+
+-- | /See:/ 'updateEndpointsBatchResponse' smart constructor.
+data UpdateEndpointsBatchResponse = UpdateEndpointsBatchResponse'
+    { _uebrsResponseStatus :: !Int
+    , _uebrsMessageBody    :: !MessageBody
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'UpdateEndpointsBatchResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'uebrsResponseStatus' - -- | The response status code.
+--
+-- * 'uebrsMessageBody' - Undocumented member.
+updateEndpointsBatchResponse
+    :: Int -- ^ 'uebrsResponseStatus'
+    -> MessageBody -- ^ 'uebrsMessageBody'
+    -> UpdateEndpointsBatchResponse
+updateEndpointsBatchResponse pResponseStatus_ pMessageBody_ =
+    UpdateEndpointsBatchResponse'
+    { _uebrsResponseStatus = pResponseStatus_
+    , _uebrsMessageBody = pMessageBody_
+    }
+
+-- | -- | The response status code.
+uebrsResponseStatus :: Lens' UpdateEndpointsBatchResponse Int
+uebrsResponseStatus = lens _uebrsResponseStatus (\ s a -> s{_uebrsResponseStatus = a});
+
+-- | Undocumented member.
+uebrsMessageBody :: Lens' UpdateEndpointsBatchResponse MessageBody
+uebrsMessageBody = lens _uebrsMessageBody (\ s a -> s{_uebrsMessageBody = a});
+
+instance NFData UpdateEndpointsBatchResponse
diff --git a/gen/Network/AWS/Pinpoint/UpdateGCMChannel.hs b/gen/Network/AWS/Pinpoint/UpdateGCMChannel.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Pinpoint/UpdateGCMChannel.hs
@@ -0,0 +1,144 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.Pinpoint.UpdateGCMChannel
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Use to update the GCM channel for an app.
+module Network.AWS.Pinpoint.UpdateGCMChannel
+    (
+    -- * Creating a Request
+      updateGCMChannel
+    , UpdateGCMChannel
+    -- * Request Lenses
+    , ugcApplicationId
+    , ugcGCMChannelRequest
+
+    -- * Destructuring the Response
+    , updateGCMChannelResponse
+    , UpdateGCMChannelResponse
+    -- * Response Lenses
+    , ugcrsResponseStatus
+    , ugcrsGCMChannelResponse
+    ) where
+
+import           Network.AWS.Lens
+import           Network.AWS.Pinpoint.Types
+import           Network.AWS.Pinpoint.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'updateGCMChannel' smart constructor.
+data UpdateGCMChannel = UpdateGCMChannel'
+    { _ugcApplicationId     :: !Text
+    , _ugcGCMChannelRequest :: !GCMChannelRequest
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'UpdateGCMChannel' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ugcApplicationId' - Undocumented member.
+--
+-- * 'ugcGCMChannelRequest' - Undocumented member.
+updateGCMChannel
+    :: Text -- ^ 'ugcApplicationId'
+    -> GCMChannelRequest -- ^ 'ugcGCMChannelRequest'
+    -> UpdateGCMChannel
+updateGCMChannel pApplicationId_ pGCMChannelRequest_ =
+    UpdateGCMChannel'
+    { _ugcApplicationId = pApplicationId_
+    , _ugcGCMChannelRequest = pGCMChannelRequest_
+    }
+
+-- | Undocumented member.
+ugcApplicationId :: Lens' UpdateGCMChannel Text
+ugcApplicationId = lens _ugcApplicationId (\ s a -> s{_ugcApplicationId = a});
+
+-- | Undocumented member.
+ugcGCMChannelRequest :: Lens' UpdateGCMChannel GCMChannelRequest
+ugcGCMChannelRequest = lens _ugcGCMChannelRequest (\ s a -> s{_ugcGCMChannelRequest = a});
+
+instance AWSRequest UpdateGCMChannel where
+        type Rs UpdateGCMChannel = UpdateGCMChannelResponse
+        request = putJSON pinpoint
+        response
+          = receiveJSON
+              (\ s h x ->
+                 UpdateGCMChannelResponse' <$>
+                   (pure (fromEnum s)) <*> (eitherParseJSON x))
+
+instance Hashable UpdateGCMChannel
+
+instance NFData UpdateGCMChannel
+
+instance ToHeaders UpdateGCMChannel where
+        toHeaders
+          = const
+              (mconcat
+                 ["Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON UpdateGCMChannel where
+        toJSON UpdateGCMChannel'{..}
+          = object
+              (catMaybes
+                 [Just
+                    ("GCMChannelRequest" .= _ugcGCMChannelRequest)])
+
+instance ToPath UpdateGCMChannel where
+        toPath UpdateGCMChannel'{..}
+          = mconcat
+              ["/v1/apps/", toBS _ugcApplicationId,
+               "/channels/gcm"]
+
+instance ToQuery UpdateGCMChannel where
+        toQuery = const mempty
+
+-- | /See:/ 'updateGCMChannelResponse' smart constructor.
+data UpdateGCMChannelResponse = UpdateGCMChannelResponse'
+    { _ugcrsResponseStatus     :: !Int
+    , _ugcrsGCMChannelResponse :: !GCMChannelResponse
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'UpdateGCMChannelResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ugcrsResponseStatus' - -- | The response status code.
+--
+-- * 'ugcrsGCMChannelResponse' - Undocumented member.
+updateGCMChannelResponse
+    :: Int -- ^ 'ugcrsResponseStatus'
+    -> GCMChannelResponse -- ^ 'ugcrsGCMChannelResponse'
+    -> UpdateGCMChannelResponse
+updateGCMChannelResponse pResponseStatus_ pGCMChannelResponse_ =
+    UpdateGCMChannelResponse'
+    { _ugcrsResponseStatus = pResponseStatus_
+    , _ugcrsGCMChannelResponse = pGCMChannelResponse_
+    }
+
+-- | -- | The response status code.
+ugcrsResponseStatus :: Lens' UpdateGCMChannelResponse Int
+ugcrsResponseStatus = lens _ugcrsResponseStatus (\ s a -> s{_ugcrsResponseStatus = a});
+
+-- | Undocumented member.
+ugcrsGCMChannelResponse :: Lens' UpdateGCMChannelResponse GCMChannelResponse
+ugcrsGCMChannelResponse = lens _ugcrsGCMChannelResponse (\ s a -> s{_ugcrsGCMChannelResponse = a});
+
+instance NFData UpdateGCMChannelResponse
diff --git a/gen/Network/AWS/Pinpoint/UpdateSegment.hs b/gen/Network/AWS/Pinpoint/UpdateSegment.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Pinpoint/UpdateSegment.hs
@@ -0,0 +1,154 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.Pinpoint.UpdateSegment
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Use to update a segment.
+module Network.AWS.Pinpoint.UpdateSegment
+    (
+    -- * Creating a Request
+      updateSegment
+    , UpdateSegment
+    -- * Request Lenses
+    , usSegmentId
+    , usApplicationId
+    , usWriteSegmentRequest
+
+    -- * Destructuring the Response
+    , updateSegmentResponse
+    , UpdateSegmentResponse
+    -- * Response Lenses
+    , usrsResponseStatus
+    , usrsSegmentResponse
+    ) where
+
+import           Network.AWS.Lens
+import           Network.AWS.Pinpoint.Types
+import           Network.AWS.Pinpoint.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'updateSegment' smart constructor.
+data UpdateSegment = UpdateSegment'
+    { _usSegmentId           :: !Text
+    , _usApplicationId       :: !Text
+    , _usWriteSegmentRequest :: !WriteSegmentRequest
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'UpdateSegment' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'usSegmentId' - Undocumented member.
+--
+-- * 'usApplicationId' - Undocumented member.
+--
+-- * 'usWriteSegmentRequest' - Undocumented member.
+updateSegment
+    :: Text -- ^ 'usSegmentId'
+    -> Text -- ^ 'usApplicationId'
+    -> WriteSegmentRequest -- ^ 'usWriteSegmentRequest'
+    -> UpdateSegment
+updateSegment pSegmentId_ pApplicationId_ pWriteSegmentRequest_ =
+    UpdateSegment'
+    { _usSegmentId = pSegmentId_
+    , _usApplicationId = pApplicationId_
+    , _usWriteSegmentRequest = pWriteSegmentRequest_
+    }
+
+-- | Undocumented member.
+usSegmentId :: Lens' UpdateSegment Text
+usSegmentId = lens _usSegmentId (\ s a -> s{_usSegmentId = a});
+
+-- | Undocumented member.
+usApplicationId :: Lens' UpdateSegment Text
+usApplicationId = lens _usApplicationId (\ s a -> s{_usApplicationId = a});
+
+-- | Undocumented member.
+usWriteSegmentRequest :: Lens' UpdateSegment WriteSegmentRequest
+usWriteSegmentRequest = lens _usWriteSegmentRequest (\ s a -> s{_usWriteSegmentRequest = a});
+
+instance AWSRequest UpdateSegment where
+        type Rs UpdateSegment = UpdateSegmentResponse
+        request = putJSON pinpoint
+        response
+          = receiveJSON
+              (\ s h x ->
+                 UpdateSegmentResponse' <$>
+                   (pure (fromEnum s)) <*> (eitherParseJSON x))
+
+instance Hashable UpdateSegment
+
+instance NFData UpdateSegment
+
+instance ToHeaders UpdateSegment where
+        toHeaders
+          = const
+              (mconcat
+                 ["Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON UpdateSegment where
+        toJSON UpdateSegment'{..}
+          = object
+              (catMaybes
+                 [Just
+                    ("WriteSegmentRequest" .= _usWriteSegmentRequest)])
+
+instance ToPath UpdateSegment where
+        toPath UpdateSegment'{..}
+          = mconcat
+              ["/v1/apps/", toBS _usApplicationId, "/segments/",
+               toBS _usSegmentId]
+
+instance ToQuery UpdateSegment where
+        toQuery = const mempty
+
+-- | /See:/ 'updateSegmentResponse' smart constructor.
+data UpdateSegmentResponse = UpdateSegmentResponse'
+    { _usrsResponseStatus  :: !Int
+    , _usrsSegmentResponse :: !SegmentResponse
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'UpdateSegmentResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'usrsResponseStatus' - -- | The response status code.
+--
+-- * 'usrsSegmentResponse' - Undocumented member.
+updateSegmentResponse
+    :: Int -- ^ 'usrsResponseStatus'
+    -> SegmentResponse -- ^ 'usrsSegmentResponse'
+    -> UpdateSegmentResponse
+updateSegmentResponse pResponseStatus_ pSegmentResponse_ =
+    UpdateSegmentResponse'
+    { _usrsResponseStatus = pResponseStatus_
+    , _usrsSegmentResponse = pSegmentResponse_
+    }
+
+-- | -- | The response status code.
+usrsResponseStatus :: Lens' UpdateSegmentResponse Int
+usrsResponseStatus = lens _usrsResponseStatus (\ s a -> s{_usrsResponseStatus = a});
+
+-- | Undocumented member.
+usrsSegmentResponse :: Lens' UpdateSegmentResponse SegmentResponse
+usrsSegmentResponse = lens _usrsSegmentResponse (\ s a -> s{_usrsSegmentResponse = a});
+
+instance NFData UpdateSegmentResponse
diff --git a/gen/Network/AWS/Pinpoint/Waiters.hs b/gen/Network/AWS/Pinpoint/Waiters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Pinpoint/Waiters.hs
@@ -0,0 +1,21 @@
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TypeFamilies      #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.Pinpoint.Waiters
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+module Network.AWS.Pinpoint.Waiters where
+
+import           Network.AWS.Lens
+import           Network.AWS.Pinpoint.Types
+import           Network.AWS.Prelude
+import           Network.AWS.Waiter
diff --git a/src/.gitkeep b/src/.gitkeep
new file mode 100644
--- /dev/null
+++ b/src/.gitkeep
diff --git a/test/Main.hs b/test/Main.hs
new file mode 100644
--- /dev/null
+++ b/test/Main.hs
@@ -0,0 +1,21 @@
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Main
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+module Main (main) where
+
+import Test.Tasty
+import Test.AWS.Pinpoint
+import Test.AWS.Pinpoint.Internal
+
+main :: IO ()
+main = defaultMain $ testGroup "Pinpoint"
+    [ testGroup "tests"    tests
+    , testGroup "fixtures" fixtures
+    ]
diff --git a/test/Test/AWS/Gen/Pinpoint.hs b/test/Test/AWS/Gen/Pinpoint.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/AWS/Gen/Pinpoint.hs
@@ -0,0 +1,579 @@
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-orphans        #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Test.AWS.Gen.Pinpoint
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+module Test.AWS.Gen.Pinpoint where
+
+import Data.Proxy
+import Test.AWS.Fixture
+import Test.AWS.Prelude
+import Test.Tasty
+import Network.AWS.Pinpoint
+import Test.AWS.Pinpoint.Internal
+
+-- Auto-generated: the actual test selection needs to be manually placed into
+-- the top-level so that real test data can be incrementally added.
+--
+-- This commented snippet is what the entire set should look like:
+
+-- fixtures :: TestTree
+-- fixtures =
+--     [ testGroup "request"
+--         [ requestGetGCMChannel $
+--             getGCMChannel
+--
+--         , requestGetSegmentImportJobs $
+--             getSegmentImportJobs
+--
+--         , requestGetImportJob $
+--             getImportJob
+--
+--         , requestGetSegmentVersions $
+--             getSegmentVersions
+--
+--         , requestDeleteCampaign $
+--             deleteCampaign
+--
+--         , requestUpdateCampaign $
+--             updateCampaign
+--
+--         , requestGetSegmentVersion $
+--             getSegmentVersion
+--
+--         , requestCreateSegment $
+--             createSegment
+--
+--         , requestUpdateEndpoint $
+--             updateEndpoint
+--
+--         , requestCreateCampaign $
+--             createCampaign
+--
+--         , requestGetEndpoint $
+--             getEndpoint
+--
+--         , requestGetSegment $
+--             getSegment
+--
+--         , requestUpdateEndpointsBatch $
+--             updateEndpointsBatch
+--
+--         , requestGetCampaign $
+--             getCampaign
+--
+--         , requestUpdateGCMChannel $
+--             updateGCMChannel
+--
+--         , requestDeleteGCMChannel $
+--             deleteGCMChannel
+--
+--         , requestGetCampaignActivities $
+--             getCampaignActivities
+--
+--         , requestDeleteAPNSChannel $
+--             deleteAPNSChannel
+--
+--         , requestUpdateAPNSChannel $
+--             updateAPNSChannel
+--
+--         , requestGetCampaignVersions $
+--             getCampaignVersions
+--
+--         , requestGetAPNSChannel $
+--             getAPNSChannel
+--
+--         , requestGetImportJobs $
+--             getImportJobs
+--
+--         , requestGetCampaignVersion $
+--             getCampaignVersion
+--
+--         , requestDeleteSegment $
+--             deleteSegment
+--
+--         , requestUpdateSegment $
+--             updateSegment
+--
+--         , requestGetCampaigns $
+--             getCampaigns
+--
+--         , requestUpdateApplicationSettings $
+--             updateApplicationSettings
+--
+--         , requestGetSegments $
+--             getSegments
+--
+--         , requestCreateImportJob $
+--             createImportJob
+--
+--         , requestGetApplicationSettings $
+--             getApplicationSettings
+--
+--           ]
+
+--     , testGroup "response"
+--         [ responseGetGCMChannel $
+--             getGCMChannelResponse
+--
+--         , responseGetSegmentImportJobs $
+--             getSegmentImportJobsResponse
+--
+--         , responseGetImportJob $
+--             getImportJobResponse
+--
+--         , responseGetSegmentVersions $
+--             getSegmentVersionsResponse
+--
+--         , responseDeleteCampaign $
+--             deleteCampaignResponse
+--
+--         , responseUpdateCampaign $
+--             updateCampaignResponse
+--
+--         , responseGetSegmentVersion $
+--             getSegmentVersionResponse
+--
+--         , responseCreateSegment $
+--             createSegmentResponse
+--
+--         , responseUpdateEndpoint $
+--             updateEndpointResponse
+--
+--         , responseCreateCampaign $
+--             createCampaignResponse
+--
+--         , responseGetEndpoint $
+--             getEndpointResponse
+--
+--         , responseGetSegment $
+--             getSegmentResponse
+--
+--         , responseUpdateEndpointsBatch $
+--             updateEndpointsBatchResponse
+--
+--         , responseGetCampaign $
+--             getCampaignResponse
+--
+--         , responseUpdateGCMChannel $
+--             updateGCMChannelResponse
+--
+--         , responseDeleteGCMChannel $
+--             deleteGCMChannelResponse
+--
+--         , responseGetCampaignActivities $
+--             getCampaignActivitiesResponse
+--
+--         , responseDeleteAPNSChannel $
+--             deleteAPNSChannelResponse
+--
+--         , responseUpdateAPNSChannel $
+--             updateAPNSChannelResponse
+--
+--         , responseGetCampaignVersions $
+--             getCampaignVersionsResponse
+--
+--         , responseGetAPNSChannel $
+--             getAPNSChannelResponse
+--
+--         , responseGetImportJobs $
+--             getImportJobsResponse
+--
+--         , responseGetCampaignVersion $
+--             getCampaignVersionResponse
+--
+--         , responseDeleteSegment $
+--             deleteSegmentResponse
+--
+--         , responseUpdateSegment $
+--             updateSegmentResponse
+--
+--         , responseGetCampaigns $
+--             getCampaignsResponse
+--
+--         , responseUpdateApplicationSettings $
+--             updateApplicationSettingsResponse
+--
+--         , responseGetSegments $
+--             getSegmentsResponse
+--
+--         , responseCreateImportJob $
+--             createImportJobResponse
+--
+--         , responseGetApplicationSettings $
+--             getApplicationSettingsResponse
+--
+--           ]
+--     ]
+
+-- Requests
+
+requestGetGCMChannel :: GetGCMChannel -> TestTree
+requestGetGCMChannel = req
+    "GetGCMChannel"
+    "fixture/GetGCMChannel.yaml"
+
+requestGetSegmentImportJobs :: GetSegmentImportJobs -> TestTree
+requestGetSegmentImportJobs = req
+    "GetSegmentImportJobs"
+    "fixture/GetSegmentImportJobs.yaml"
+
+requestGetImportJob :: GetImportJob -> TestTree
+requestGetImportJob = req
+    "GetImportJob"
+    "fixture/GetImportJob.yaml"
+
+requestGetSegmentVersions :: GetSegmentVersions -> TestTree
+requestGetSegmentVersions = req
+    "GetSegmentVersions"
+    "fixture/GetSegmentVersions.yaml"
+
+requestDeleteCampaign :: DeleteCampaign -> TestTree
+requestDeleteCampaign = req
+    "DeleteCampaign"
+    "fixture/DeleteCampaign.yaml"
+
+requestUpdateCampaign :: UpdateCampaign -> TestTree
+requestUpdateCampaign = req
+    "UpdateCampaign"
+    "fixture/UpdateCampaign.yaml"
+
+requestGetSegmentVersion :: GetSegmentVersion -> TestTree
+requestGetSegmentVersion = req
+    "GetSegmentVersion"
+    "fixture/GetSegmentVersion.yaml"
+
+requestCreateSegment :: CreateSegment -> TestTree
+requestCreateSegment = req
+    "CreateSegment"
+    "fixture/CreateSegment.yaml"
+
+requestUpdateEndpoint :: UpdateEndpoint -> TestTree
+requestUpdateEndpoint = req
+    "UpdateEndpoint"
+    "fixture/UpdateEndpoint.yaml"
+
+requestCreateCampaign :: CreateCampaign -> TestTree
+requestCreateCampaign = req
+    "CreateCampaign"
+    "fixture/CreateCampaign.yaml"
+
+requestGetEndpoint :: GetEndpoint -> TestTree
+requestGetEndpoint = req
+    "GetEndpoint"
+    "fixture/GetEndpoint.yaml"
+
+requestGetSegment :: GetSegment -> TestTree
+requestGetSegment = req
+    "GetSegment"
+    "fixture/GetSegment.yaml"
+
+requestUpdateEndpointsBatch :: UpdateEndpointsBatch -> TestTree
+requestUpdateEndpointsBatch = req
+    "UpdateEndpointsBatch"
+    "fixture/UpdateEndpointsBatch.yaml"
+
+requestGetCampaign :: GetCampaign -> TestTree
+requestGetCampaign = req
+    "GetCampaign"
+    "fixture/GetCampaign.yaml"
+
+requestUpdateGCMChannel :: UpdateGCMChannel -> TestTree
+requestUpdateGCMChannel = req
+    "UpdateGCMChannel"
+    "fixture/UpdateGCMChannel.yaml"
+
+requestDeleteGCMChannel :: DeleteGCMChannel -> TestTree
+requestDeleteGCMChannel = req
+    "DeleteGCMChannel"
+    "fixture/DeleteGCMChannel.yaml"
+
+requestGetCampaignActivities :: GetCampaignActivities -> TestTree
+requestGetCampaignActivities = req
+    "GetCampaignActivities"
+    "fixture/GetCampaignActivities.yaml"
+
+requestDeleteAPNSChannel :: DeleteAPNSChannel -> TestTree
+requestDeleteAPNSChannel = req
+    "DeleteAPNSChannel"
+    "fixture/DeleteAPNSChannel.yaml"
+
+requestUpdateAPNSChannel :: UpdateAPNSChannel -> TestTree
+requestUpdateAPNSChannel = req
+    "UpdateAPNSChannel"
+    "fixture/UpdateAPNSChannel.yaml"
+
+requestGetCampaignVersions :: GetCampaignVersions -> TestTree
+requestGetCampaignVersions = req
+    "GetCampaignVersions"
+    "fixture/GetCampaignVersions.yaml"
+
+requestGetAPNSChannel :: GetAPNSChannel -> TestTree
+requestGetAPNSChannel = req
+    "GetAPNSChannel"
+    "fixture/GetAPNSChannel.yaml"
+
+requestGetImportJobs :: GetImportJobs -> TestTree
+requestGetImportJobs = req
+    "GetImportJobs"
+    "fixture/GetImportJobs.yaml"
+
+requestGetCampaignVersion :: GetCampaignVersion -> TestTree
+requestGetCampaignVersion = req
+    "GetCampaignVersion"
+    "fixture/GetCampaignVersion.yaml"
+
+requestDeleteSegment :: DeleteSegment -> TestTree
+requestDeleteSegment = req
+    "DeleteSegment"
+    "fixture/DeleteSegment.yaml"
+
+requestUpdateSegment :: UpdateSegment -> TestTree
+requestUpdateSegment = req
+    "UpdateSegment"
+    "fixture/UpdateSegment.yaml"
+
+requestGetCampaigns :: GetCampaigns -> TestTree
+requestGetCampaigns = req
+    "GetCampaigns"
+    "fixture/GetCampaigns.yaml"
+
+requestUpdateApplicationSettings :: UpdateApplicationSettings -> TestTree
+requestUpdateApplicationSettings = req
+    "UpdateApplicationSettings"
+    "fixture/UpdateApplicationSettings.yaml"
+
+requestGetSegments :: GetSegments -> TestTree
+requestGetSegments = req
+    "GetSegments"
+    "fixture/GetSegments.yaml"
+
+requestCreateImportJob :: CreateImportJob -> TestTree
+requestCreateImportJob = req
+    "CreateImportJob"
+    "fixture/CreateImportJob.yaml"
+
+requestGetApplicationSettings :: GetApplicationSettings -> TestTree
+requestGetApplicationSettings = req
+    "GetApplicationSettings"
+    "fixture/GetApplicationSettings.yaml"
+
+-- Responses
+
+responseGetGCMChannel :: GetGCMChannelResponse -> TestTree
+responseGetGCMChannel = res
+    "GetGCMChannelResponse"
+    "fixture/GetGCMChannelResponse.proto"
+    pinpoint
+    (Proxy :: Proxy GetGCMChannel)
+
+responseGetSegmentImportJobs :: GetSegmentImportJobsResponse -> TestTree
+responseGetSegmentImportJobs = res
+    "GetSegmentImportJobsResponse"
+    "fixture/GetSegmentImportJobsResponse.proto"
+    pinpoint
+    (Proxy :: Proxy GetSegmentImportJobs)
+
+responseGetImportJob :: GetImportJobResponse -> TestTree
+responseGetImportJob = res
+    "GetImportJobResponse"
+    "fixture/GetImportJobResponse.proto"
+    pinpoint
+    (Proxy :: Proxy GetImportJob)
+
+responseGetSegmentVersions :: GetSegmentVersionsResponse -> TestTree
+responseGetSegmentVersions = res
+    "GetSegmentVersionsResponse"
+    "fixture/GetSegmentVersionsResponse.proto"
+    pinpoint
+    (Proxy :: Proxy GetSegmentVersions)
+
+responseDeleteCampaign :: DeleteCampaignResponse -> TestTree
+responseDeleteCampaign = res
+    "DeleteCampaignResponse"
+    "fixture/DeleteCampaignResponse.proto"
+    pinpoint
+    (Proxy :: Proxy DeleteCampaign)
+
+responseUpdateCampaign :: UpdateCampaignResponse -> TestTree
+responseUpdateCampaign = res
+    "UpdateCampaignResponse"
+    "fixture/UpdateCampaignResponse.proto"
+    pinpoint
+    (Proxy :: Proxy UpdateCampaign)
+
+responseGetSegmentVersion :: GetSegmentVersionResponse -> TestTree
+responseGetSegmentVersion = res
+    "GetSegmentVersionResponse"
+    "fixture/GetSegmentVersionResponse.proto"
+    pinpoint
+    (Proxy :: Proxy GetSegmentVersion)
+
+responseCreateSegment :: CreateSegmentResponse -> TestTree
+responseCreateSegment = res
+    "CreateSegmentResponse"
+    "fixture/CreateSegmentResponse.proto"
+    pinpoint
+    (Proxy :: Proxy CreateSegment)
+
+responseUpdateEndpoint :: UpdateEndpointResponse -> TestTree
+responseUpdateEndpoint = res
+    "UpdateEndpointResponse"
+    "fixture/UpdateEndpointResponse.proto"
+    pinpoint
+    (Proxy :: Proxy UpdateEndpoint)
+
+responseCreateCampaign :: CreateCampaignResponse -> TestTree
+responseCreateCampaign = res
+    "CreateCampaignResponse"
+    "fixture/CreateCampaignResponse.proto"
+    pinpoint
+    (Proxy :: Proxy CreateCampaign)
+
+responseGetEndpoint :: GetEndpointResponse -> TestTree
+responseGetEndpoint = res
+    "GetEndpointResponse"
+    "fixture/GetEndpointResponse.proto"
+    pinpoint
+    (Proxy :: Proxy GetEndpoint)
+
+responseGetSegment :: GetSegmentResponse -> TestTree
+responseGetSegment = res
+    "GetSegmentResponse"
+    "fixture/GetSegmentResponse.proto"
+    pinpoint
+    (Proxy :: Proxy GetSegment)
+
+responseUpdateEndpointsBatch :: UpdateEndpointsBatchResponse -> TestTree
+responseUpdateEndpointsBatch = res
+    "UpdateEndpointsBatchResponse"
+    "fixture/UpdateEndpointsBatchResponse.proto"
+    pinpoint
+    (Proxy :: Proxy UpdateEndpointsBatch)
+
+responseGetCampaign :: GetCampaignResponse -> TestTree
+responseGetCampaign = res
+    "GetCampaignResponse"
+    "fixture/GetCampaignResponse.proto"
+    pinpoint
+    (Proxy :: Proxy GetCampaign)
+
+responseUpdateGCMChannel :: UpdateGCMChannelResponse -> TestTree
+responseUpdateGCMChannel = res
+    "UpdateGCMChannelResponse"
+    "fixture/UpdateGCMChannelResponse.proto"
+    pinpoint
+    (Proxy :: Proxy UpdateGCMChannel)
+
+responseDeleteGCMChannel :: DeleteGCMChannelResponse -> TestTree
+responseDeleteGCMChannel = res
+    "DeleteGCMChannelResponse"
+    "fixture/DeleteGCMChannelResponse.proto"
+    pinpoint
+    (Proxy :: Proxy DeleteGCMChannel)
+
+responseGetCampaignActivities :: GetCampaignActivitiesResponse -> TestTree
+responseGetCampaignActivities = res
+    "GetCampaignActivitiesResponse"
+    "fixture/GetCampaignActivitiesResponse.proto"
+    pinpoint
+    (Proxy :: Proxy GetCampaignActivities)
+
+responseDeleteAPNSChannel :: DeleteAPNSChannelResponse -> TestTree
+responseDeleteAPNSChannel = res
+    "DeleteAPNSChannelResponse"
+    "fixture/DeleteAPNSChannelResponse.proto"
+    pinpoint
+    (Proxy :: Proxy DeleteAPNSChannel)
+
+responseUpdateAPNSChannel :: UpdateAPNSChannelResponse -> TestTree
+responseUpdateAPNSChannel = res
+    "UpdateAPNSChannelResponse"
+    "fixture/UpdateAPNSChannelResponse.proto"
+    pinpoint
+    (Proxy :: Proxy UpdateAPNSChannel)
+
+responseGetCampaignVersions :: GetCampaignVersionsResponse -> TestTree
+responseGetCampaignVersions = res
+    "GetCampaignVersionsResponse"
+    "fixture/GetCampaignVersionsResponse.proto"
+    pinpoint
+    (Proxy :: Proxy GetCampaignVersions)
+
+responseGetAPNSChannel :: GetAPNSChannelResponse -> TestTree
+responseGetAPNSChannel = res
+    "GetAPNSChannelResponse"
+    "fixture/GetAPNSChannelResponse.proto"
+    pinpoint
+    (Proxy :: Proxy GetAPNSChannel)
+
+responseGetImportJobs :: GetImportJobsResponse -> TestTree
+responseGetImportJobs = res
+    "GetImportJobsResponse"
+    "fixture/GetImportJobsResponse.proto"
+    pinpoint
+    (Proxy :: Proxy GetImportJobs)
+
+responseGetCampaignVersion :: GetCampaignVersionResponse -> TestTree
+responseGetCampaignVersion = res
+    "GetCampaignVersionResponse"
+    "fixture/GetCampaignVersionResponse.proto"
+    pinpoint
+    (Proxy :: Proxy GetCampaignVersion)
+
+responseDeleteSegment :: DeleteSegmentResponse -> TestTree
+responseDeleteSegment = res
+    "DeleteSegmentResponse"
+    "fixture/DeleteSegmentResponse.proto"
+    pinpoint
+    (Proxy :: Proxy DeleteSegment)
+
+responseUpdateSegment :: UpdateSegmentResponse -> TestTree
+responseUpdateSegment = res
+    "UpdateSegmentResponse"
+    "fixture/UpdateSegmentResponse.proto"
+    pinpoint
+    (Proxy :: Proxy UpdateSegment)
+
+responseGetCampaigns :: GetCampaignsResponse -> TestTree
+responseGetCampaigns = res
+    "GetCampaignsResponse"
+    "fixture/GetCampaignsResponse.proto"
+    pinpoint
+    (Proxy :: Proxy GetCampaigns)
+
+responseUpdateApplicationSettings :: UpdateApplicationSettingsResponse -> TestTree
+responseUpdateApplicationSettings = res
+    "UpdateApplicationSettingsResponse"
+    "fixture/UpdateApplicationSettingsResponse.proto"
+    pinpoint
+    (Proxy :: Proxy UpdateApplicationSettings)
+
+responseGetSegments :: GetSegmentsResponse -> TestTree
+responseGetSegments = res
+    "GetSegmentsResponse"
+    "fixture/GetSegmentsResponse.proto"
+    pinpoint
+    (Proxy :: Proxy GetSegments)
+
+responseCreateImportJob :: CreateImportJobResponse -> TestTree
+responseCreateImportJob = res
+    "CreateImportJobResponse"
+    "fixture/CreateImportJobResponse.proto"
+    pinpoint
+    (Proxy :: Proxy CreateImportJob)
+
+responseGetApplicationSettings :: GetApplicationSettingsResponse -> TestTree
+responseGetApplicationSettings = res
+    "GetApplicationSettingsResponse"
+    "fixture/GetApplicationSettingsResponse.proto"
+    pinpoint
+    (Proxy :: Proxy GetApplicationSettings)
diff --git a/test/Test/AWS/Pinpoint.hs b/test/Test/AWS/Pinpoint.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/AWS/Pinpoint.hs
@@ -0,0 +1,20 @@
+-- |
+-- Module      : Test.AWS.Pinpoint
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+module Test.AWS.Pinpoint
+    ( tests
+    , fixtures
+    ) where
+
+import Test.Tasty (TestTree)
+
+tests :: [TestTree]
+tests = []
+
+fixtures :: [TestTree]
+fixtures = []
diff --git a/test/Test/AWS/Pinpoint/Internal.hs b/test/Test/AWS/Pinpoint/Internal.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/AWS/Pinpoint/Internal.hs
@@ -0,0 +1,9 @@
+-- |
+-- Module      : Test.AWS.Pinpoint.Internal
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+module Test.AWS.Pinpoint.Internal where
