diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,373 @@
+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.
+
+Exhibit B - "Incompatible With Secondary Licenses" Notice
+---------------------------------------------------------
+
+  This Source Code Form is "Incompatible With Secondary Licenses", as
+  defined by the Mozilla Public License, v. 2.0.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,44 @@
+# Amazon Device Farm SDK
+
+* [Version](#version)
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+
+## Version
+
+`1.0.0`
+
+
+## Description
+
+AWS Device Farm is a service that enables mobile app developers to test
+Android, iOS, and Fire OS apps on physical phones, tablets, and other
+devices in the cloud.
+
+Documentation is available via [Hackage](http://hackage.haskell.org/package/amazonka-devicefarm)
+and the [AWS API Reference](http://docs.aws.amazon.com/devicefarm/latest/APIReference/Welcome.html).
+
+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 and sending requests.
+
+Use of lenses is required for constructing and manipulating types.
+This is due to the amount 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).
+
+## 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-devicefarm` 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-devicefarm.cabal b/amazonka-devicefarm.cabal
new file mode 100644
--- /dev/null
+++ b/amazonka-devicefarm.cabal
@@ -0,0 +1,108 @@
+name:                  amazonka-devicefarm
+version:               1.0.0
+synopsis:              Amazon Device Farm SDK.
+homepage:              https://github.com/brendanhay/amazonka
+license:               OtherLicense
+license-file:          LICENSE
+author:                Brendan Hay
+maintainer:            Brendan Hay <brendan.g.hay@gmail.com>
+copyright:             Copyright (c) 2013-2015 Brendan Hay
+category:              Network, AWS, Cloud, Distributed Computing
+build-type:            Simple
+extra-source-files:    README.md
+cabal-version:         >= 1.10
+
+description:
+    AWS Device Farm is a service that enables mobile app developers to test
+    Android, iOS, and Fire OS apps on physical phones, tablets, and other
+    devices in the cloud.
+    .
+    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 and sending requests.
+    .
+    Use of lenses is required for constructing and manipulating types.
+    This is due to the amount 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.DeviceFarm" and the <http://docs.aws.amazon.com/devicefarm/latest/APIReference/Welcome.html AWS API Reference>
+    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.DeviceFarm
+        , Network.AWS.DeviceFarm.CreateDevicePool
+        , Network.AWS.DeviceFarm.CreateProject
+        , Network.AWS.DeviceFarm.CreateUpload
+        , Network.AWS.DeviceFarm.GetAccountSettings
+        , Network.AWS.DeviceFarm.GetDevice
+        , Network.AWS.DeviceFarm.GetDevicePool
+        , Network.AWS.DeviceFarm.GetDevicePoolCompatibility
+        , Network.AWS.DeviceFarm.GetJob
+        , Network.AWS.DeviceFarm.GetProject
+        , Network.AWS.DeviceFarm.GetRun
+        , Network.AWS.DeviceFarm.GetSuite
+        , Network.AWS.DeviceFarm.GetTest
+        , Network.AWS.DeviceFarm.GetUpload
+        , Network.AWS.DeviceFarm.ListArtifacts
+        , Network.AWS.DeviceFarm.ListDevicePools
+        , Network.AWS.DeviceFarm.ListDevices
+        , Network.AWS.DeviceFarm.ListJobs
+        , Network.AWS.DeviceFarm.ListProjects
+        , Network.AWS.DeviceFarm.ListRuns
+        , Network.AWS.DeviceFarm.ListSamples
+        , Network.AWS.DeviceFarm.ListSuites
+        , Network.AWS.DeviceFarm.ListTests
+        , Network.AWS.DeviceFarm.ListUniqueProblems
+        , Network.AWS.DeviceFarm.ListUploads
+        , Network.AWS.DeviceFarm.ScheduleRun
+        , Network.AWS.DeviceFarm.Types
+        , Network.AWS.DeviceFarm.Waiters
+
+    other-modules:
+          Network.AWS.DeviceFarm.Types.Product
+        , Network.AWS.DeviceFarm.Types.Sum
+
+    build-depends:
+          amazonka-core == 1.0.0.*
+        , base          >= 4.7     && < 5
+
+test-suite amazonka-devicefarm-test
+    type:              exitcode-stdio-1.0
+    default-language:  Haskell2010
+    hs-source-dirs:    test
+    main-is:           Main.hs
+
+    ghc-options:       -Wall -threaded
+
+    -- This is not comprehensive if modules have manually been added.
+    -- It exists to ensure cabal 'somewhat' detects test module changes.
+    other-modules:
+          Test.AWS.DeviceFarm
+        , Test.AWS.Gen.DeviceFarm
+        , Test.AWS.DeviceFarm.Internal
+
+    build-depends:
+          amazonka-core == 1.0.0
+        , amazonka-test == 1.0.0
+        , amazonka-devicefarm == 1.0.0
+        , base
+        , bytestring
+        , lens
+        , tasty
+        , tasty-hunit
+        , text
+        , time
+        , unordered-containers
diff --git a/gen/Network/AWS/DeviceFarm.hs b/gen/Network/AWS/DeviceFarm.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DeviceFarm.hs
@@ -0,0 +1,454 @@
+{-# 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.DeviceFarm
+-- Copyright   : (c) 2013-2015 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)
+--
+-- AWS Device Farm is a service that enables mobile app developers to test
+-- Android, iOS, and Fire OS apps on physical phones, tablets, and other
+-- devices in the cloud.
+--
+-- /See:/ <http://docs.aws.amazon.com/devicefarm/latest/APIReference/Welcome.html AWS API Reference>
+module Network.AWS.DeviceFarm
+    (
+    -- * Service
+      DeviceFarm
+
+    -- * Errors
+    -- $errors
+
+    -- ** IdempotencyException
+    , _IdempotencyException
+
+    -- ** NotFoundException
+    , _NotFoundException
+
+    -- ** ArgumentException
+    , _ArgumentException
+
+    -- ** ServiceAccountException
+    , _ServiceAccountException
+
+    -- ** LimitExceededException
+    , _LimitExceededException
+
+    -- * Waiters
+    -- $waiters
+
+    -- * Operations
+    -- $operations
+
+    -- ** ListProjects
+    , module Network.AWS.DeviceFarm.ListProjects
+
+    -- ** GetDevicePoolCompatibility
+    , module Network.AWS.DeviceFarm.GetDevicePoolCompatibility
+
+    -- ** ListTests
+    , module Network.AWS.DeviceFarm.ListTests
+
+    -- ** CreateUpload
+    , module Network.AWS.DeviceFarm.CreateUpload
+
+    -- ** ListArtifacts
+    , module Network.AWS.DeviceFarm.ListArtifacts
+
+    -- ** GetDevicePool
+    , module Network.AWS.DeviceFarm.GetDevicePool
+
+    -- ** GetUpload
+    , module Network.AWS.DeviceFarm.GetUpload
+
+    -- ** ListDevicePools
+    , module Network.AWS.DeviceFarm.ListDevicePools
+
+    -- ** GetTest
+    , module Network.AWS.DeviceFarm.GetTest
+
+    -- ** CreateDevicePool
+    , module Network.AWS.DeviceFarm.CreateDevicePool
+
+    -- ** ListRuns
+    , module Network.AWS.DeviceFarm.ListRuns
+
+    -- ** ListJobs
+    , module Network.AWS.DeviceFarm.ListJobs
+
+    -- ** GetDevice
+    , module Network.AWS.DeviceFarm.GetDevice
+
+    -- ** GetJob
+    , module Network.AWS.DeviceFarm.GetJob
+
+    -- ** ScheduleRun
+    , module Network.AWS.DeviceFarm.ScheduleRun
+
+    -- ** GetRun
+    , module Network.AWS.DeviceFarm.GetRun
+
+    -- ** ListSamples
+    , module Network.AWS.DeviceFarm.ListSamples
+
+    -- ** ListSuites
+    , module Network.AWS.DeviceFarm.ListSuites
+
+    -- ** GetAccountSettings
+    , module Network.AWS.DeviceFarm.GetAccountSettings
+
+    -- ** ListUploads
+    , module Network.AWS.DeviceFarm.ListUploads
+
+    -- ** GetSuite
+    , module Network.AWS.DeviceFarm.GetSuite
+
+    -- ** GetProject
+    , module Network.AWS.DeviceFarm.GetProject
+
+    -- ** ListDevices
+    , module Network.AWS.DeviceFarm.ListDevices
+
+    -- ** ListUniqueProblems
+    , module Network.AWS.DeviceFarm.ListUniqueProblems
+
+    -- ** CreateProject
+    , module Network.AWS.DeviceFarm.CreateProject
+
+    -- * Types
+
+    -- ** ArtifactCategory
+    , ArtifactCategory (..)
+
+    -- ** ArtifactType
+    , ArtifactType (..)
+
+    -- ** BillingMethod
+    , BillingMethod (..)
+
+    -- ** DeviceAttribute
+    , DeviceAttribute (..)
+
+    -- ** DeviceFormFactor
+    , DeviceFormFactor (..)
+
+    -- ** DevicePlatform
+    , DevicePlatform (..)
+
+    -- ** DevicePoolType
+    , DevicePoolType (..)
+
+    -- ** ExecutionResult
+    , ExecutionResult (..)
+
+    -- ** ExecutionStatus
+    , ExecutionStatus (..)
+
+    -- ** RuleOperator
+    , RuleOperator (..)
+
+    -- ** SampleType
+    , SampleType (..)
+
+    -- ** TestType
+    , TestType (..)
+
+    -- ** UploadStatus
+    , UploadStatus (..)
+
+    -- ** UploadType
+    , UploadType (..)
+
+    -- ** AccountSettings
+    , AccountSettings
+    , accountSettings
+    , asAwsAccountNumber
+    , asUnmeteredDevices
+
+    -- ** Artifact
+    , Artifact
+    , artifact
+    , aArn
+    , aUrl
+    , aExtension
+    , aName
+    , aType
+
+    -- ** CPU
+    , CPU
+    , cpu
+    , cpuFrequency
+    , cpuClock
+    , cpuArchitecture
+
+    -- ** Counters
+    , Counters
+    , counters
+    , cPassed
+    , cSkipped
+    , cWarned
+    , cStopped
+    , cTotal
+    , cFailed
+    , cErrored
+
+    -- ** Device
+    , Device
+    , device
+    , dCarrier
+    , dImage
+    , dManufacturer
+    , dPlatform
+    , dArn
+    , dFormFactor
+    , dResolution
+    , dMemory
+    , dRadio
+    , dOs
+    , dName
+    , dModel
+    , dCpu
+    , dHeapSize
+
+    -- ** DevicePool
+    , DevicePool
+    , devicePool
+    , dpArn
+    , dpRules
+    , dpName
+    , dpType
+    , dpDescription
+
+    -- ** DevicePoolCompatibilityResult
+    , DevicePoolCompatibilityResult
+    , devicePoolCompatibilityResult
+    , dpcrDevice
+    , dpcrCompatible
+    , dpcrIncompatibilityMessages
+
+    -- ** IncompatibilityMessage
+    , IncompatibilityMessage
+    , incompatibilityMessage
+    , imType
+    , imMessage
+
+    -- ** Job
+    , Job
+    , job
+    , jobStatus
+    , jobCounters
+    , jobArn
+    , jobCreated
+    , jobDevice
+    , jobStopped
+    , jobResult
+    , jobName
+    , jobType
+    , jobMessage
+    , jobStarted
+
+    -- ** Location
+    , Location
+    , location
+    , lLatitude
+    , lLongitude
+
+    -- ** Problem
+    , Problem
+    , problem
+    , pDevice
+    , pTest
+    , pResult
+    , pRun
+    , pJob
+    , pMessage
+    , pSuite
+
+    -- ** ProblemDetail
+    , ProblemDetail
+    , problemDetail
+    , pdArn
+    , pdName
+
+    -- ** Project
+    , Project
+    , project
+    , pArn
+    , pCreated
+    , pName
+
+    -- ** Radios
+    , Radios
+    , radios
+    , rNfc
+    , rGps
+    , rBluetooth
+    , rWifi
+
+    -- ** Resolution
+    , Resolution
+    , resolution
+    , rHeight
+    , rWidth
+
+    -- ** Rule
+    , Rule
+    , rule
+    , rAttribute
+    , rOperator
+    , rValue
+
+    -- ** Run
+    , Run
+    , run
+    , runStatus
+    , runBillingMethod
+    , runCounters
+    , runPlatform
+    , runArn
+    , runCreated
+    , runCompletedJobs
+    , runStopped
+    , runResult
+    , runName
+    , runType
+    , runMessage
+    , runTotalJobs
+    , runStarted
+
+    -- ** Sample
+    , Sample
+    , sample
+    , sArn
+    , sUrl
+    , sType
+
+    -- ** ScheduleRunConfiguration
+    , ScheduleRunConfiguration
+    , scheduleRunConfiguration
+    , srcBillingMethod
+    , srcRadios
+    , srcLocation
+    , srcLocale
+    , srcNetworkProfileARN
+    , srcExtraDataPackageARN
+    , srcAuxiliaryApps
+
+    -- ** ScheduleRunTest
+    , ScheduleRunTest
+    , scheduleRunTest
+    , srtTestPackageARN
+    , srtParameters
+    , srtFilter
+    , srtType
+
+    -- ** Suite
+    , Suite
+    , suite
+    , suiStatus
+    , suiCounters
+    , suiArn
+    , suiCreated
+    , suiStopped
+    , suiResult
+    , suiName
+    , suiType
+    , suiMessage
+    , suiStarted
+
+    -- ** Test
+    , Test
+    , test
+    , tStatus
+    , tCounters
+    , tArn
+    , tCreated
+    , tStopped
+    , tResult
+    , tName
+    , tType
+    , tMessage
+    , tStarted
+
+    -- ** UniqueProblem
+    , UniqueProblem
+    , uniqueProblem
+    , upProblems
+    , upMessage
+
+    -- ** Upload
+    , Upload
+    , upload
+    , uStatus
+    , uArn
+    , uCreated
+    , uUrl
+    , uName
+    , uMetadata
+    , uType
+    , uMessage
+    , uContentType
+    ) where
+
+import           Network.AWS.DeviceFarm.CreateDevicePool
+import           Network.AWS.DeviceFarm.CreateProject
+import           Network.AWS.DeviceFarm.CreateUpload
+import           Network.AWS.DeviceFarm.GetAccountSettings
+import           Network.AWS.DeviceFarm.GetDevice
+import           Network.AWS.DeviceFarm.GetDevicePool
+import           Network.AWS.DeviceFarm.GetDevicePoolCompatibility
+import           Network.AWS.DeviceFarm.GetJob
+import           Network.AWS.DeviceFarm.GetProject
+import           Network.AWS.DeviceFarm.GetRun
+import           Network.AWS.DeviceFarm.GetSuite
+import           Network.AWS.DeviceFarm.GetTest
+import           Network.AWS.DeviceFarm.GetUpload
+import           Network.AWS.DeviceFarm.ListArtifacts
+import           Network.AWS.DeviceFarm.ListDevicePools
+import           Network.AWS.DeviceFarm.ListDevices
+import           Network.AWS.DeviceFarm.ListJobs
+import           Network.AWS.DeviceFarm.ListProjects
+import           Network.AWS.DeviceFarm.ListRuns
+import           Network.AWS.DeviceFarm.ListSamples
+import           Network.AWS.DeviceFarm.ListSuites
+import           Network.AWS.DeviceFarm.ListTests
+import           Network.AWS.DeviceFarm.ListUniqueProblems
+import           Network.AWS.DeviceFarm.ListUploads
+import           Network.AWS.DeviceFarm.ScheduleRun
+import           Network.AWS.DeviceFarm.Types
+import           Network.AWS.DeviceFarm.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 'DeviceFarm'.
+-}
+
+{- $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/DeviceFarm/CreateDevicePool.hs b/gen/Network/AWS/DeviceFarm/CreateDevicePool.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DeviceFarm/CreateDevicePool.hs
@@ -0,0 +1,161 @@
+{-# 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.DeviceFarm.CreateDevicePool
+-- Copyright   : (c) 2013-2015 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 a device pool.
+--
+-- /See:/ <http://docs.aws.amazon.com/devicefarm/latest/APIReference/API_CreateDevicePool.html AWS API Reference> for CreateDevicePool.
+module Network.AWS.DeviceFarm.CreateDevicePool
+    (
+    -- * Creating a Request
+      createDevicePool
+    , CreateDevicePool
+    -- * Request Lenses
+    , cdpDescription
+    , cdpProjectARN
+    , cdpName
+    , cdpRules
+
+    -- * Destructuring the Response
+    , createDevicePoolResponse
+    , CreateDevicePoolResponse
+    -- * Response Lenses
+    , cdprsDevicePool
+    , cdprsStatus
+    ) where
+
+import           Network.AWS.DeviceFarm.Types
+import           Network.AWS.DeviceFarm.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | Represents a request to the create device pool operation.
+--
+-- /See:/ 'createDevicePool' smart constructor.
+data CreateDevicePool = CreateDevicePool'
+    { _cdpDescription :: !(Maybe Text)
+    , _cdpProjectARN  :: !Text
+    , _cdpName        :: !Text
+    , _cdpRules       :: ![Rule]
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CreateDevicePool' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cdpDescription'
+--
+-- * 'cdpProjectARN'
+--
+-- * 'cdpName'
+--
+-- * 'cdpRules'
+createDevicePool
+    :: Text -- ^ 'cdpProjectARN'
+    -> Text -- ^ 'cdpName'
+    -> CreateDevicePool
+createDevicePool pProjectARN_ pName_ =
+    CreateDevicePool'
+    { _cdpDescription = Nothing
+    , _cdpProjectARN = pProjectARN_
+    , _cdpName = pName_
+    , _cdpRules = mempty
+    }
+
+-- | The device pool\'s description.
+cdpDescription :: Lens' CreateDevicePool (Maybe Text)
+cdpDescription = lens _cdpDescription (\ s a -> s{_cdpDescription = a});
+
+-- | The ARN of the project for the device pool.
+cdpProjectARN :: Lens' CreateDevicePool Text
+cdpProjectARN = lens _cdpProjectARN (\ s a -> s{_cdpProjectARN = a});
+
+-- | The device pool\'s name.
+cdpName :: Lens' CreateDevicePool Text
+cdpName = lens _cdpName (\ s a -> s{_cdpName = a});
+
+-- | The device pool\'s rules.
+cdpRules :: Lens' CreateDevicePool [Rule]
+cdpRules = lens _cdpRules (\ s a -> s{_cdpRules = a}) . _Coerce;
+
+instance AWSRequest CreateDevicePool where
+        type Sv CreateDevicePool = DeviceFarm
+        type Rs CreateDevicePool = CreateDevicePoolResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 CreateDevicePoolResponse' <$>
+                   (x .?> "devicePool") <*> (pure (fromEnum s)))
+
+instance ToHeaders CreateDevicePool where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DeviceFarm_20150623.CreateDevicePool" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON CreateDevicePool where
+        toJSON CreateDevicePool'{..}
+          = object
+              ["description" .= _cdpDescription,
+               "projectArn" .= _cdpProjectARN, "name" .= _cdpName,
+               "rules" .= _cdpRules]
+
+instance ToPath CreateDevicePool where
+        toPath = const "/"
+
+instance ToQuery CreateDevicePool where
+        toQuery = const mempty
+
+-- | Represents the result of a create device pool request.
+--
+-- /See:/ 'createDevicePoolResponse' smart constructor.
+data CreateDevicePoolResponse = CreateDevicePoolResponse'
+    { _cdprsDevicePool :: !(Maybe DevicePool)
+    , _cdprsStatus     :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CreateDevicePoolResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cdprsDevicePool'
+--
+-- * 'cdprsStatus'
+createDevicePoolResponse
+    :: Int -- ^ 'cdprsStatus'
+    -> CreateDevicePoolResponse
+createDevicePoolResponse pStatus_ =
+    CreateDevicePoolResponse'
+    { _cdprsDevicePool = Nothing
+    , _cdprsStatus = pStatus_
+    }
+
+-- | The newly created device pool.
+cdprsDevicePool :: Lens' CreateDevicePoolResponse (Maybe DevicePool)
+cdprsDevicePool = lens _cdprsDevicePool (\ s a -> s{_cdprsDevicePool = a});
+
+-- | The response status code.
+cdprsStatus :: Lens' CreateDevicePoolResponse Int
+cdprsStatus = lens _cdprsStatus (\ s a -> s{_cdprsStatus = a});
diff --git a/gen/Network/AWS/DeviceFarm/CreateProject.hs b/gen/Network/AWS/DeviceFarm/CreateProject.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DeviceFarm/CreateProject.hs
@@ -0,0 +1,129 @@
+{-# 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.DeviceFarm.CreateProject
+-- Copyright   : (c) 2013-2015 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 a new project.
+--
+-- /See:/ <http://docs.aws.amazon.com/devicefarm/latest/APIReference/API_CreateProject.html AWS API Reference> for CreateProject.
+module Network.AWS.DeviceFarm.CreateProject
+    (
+    -- * Creating a Request
+      createProject
+    , CreateProject
+    -- * Request Lenses
+    , cpName
+
+    -- * Destructuring the Response
+    , createProjectResponse
+    , CreateProjectResponse
+    -- * Response Lenses
+    , cprsProject
+    , cprsStatus
+    ) where
+
+import           Network.AWS.DeviceFarm.Types
+import           Network.AWS.DeviceFarm.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | Represents a request to the create project operation.
+--
+-- /See:/ 'createProject' smart constructor.
+newtype CreateProject = CreateProject'
+    { _cpName :: Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CreateProject' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cpName'
+createProject
+    :: Text -- ^ 'cpName'
+    -> CreateProject
+createProject pName_ =
+    CreateProject'
+    { _cpName = pName_
+    }
+
+-- | The project\'s name.
+cpName :: Lens' CreateProject Text
+cpName = lens _cpName (\ s a -> s{_cpName = a});
+
+instance AWSRequest CreateProject where
+        type Sv CreateProject = DeviceFarm
+        type Rs CreateProject = CreateProjectResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 CreateProjectResponse' <$>
+                   (x .?> "project") <*> (pure (fromEnum s)))
+
+instance ToHeaders CreateProject where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DeviceFarm_20150623.CreateProject" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON CreateProject where
+        toJSON CreateProject'{..}
+          = object ["name" .= _cpName]
+
+instance ToPath CreateProject where
+        toPath = const "/"
+
+instance ToQuery CreateProject where
+        toQuery = const mempty
+
+-- | Represents the result of a create project request.
+--
+-- /See:/ 'createProjectResponse' smart constructor.
+data CreateProjectResponse = CreateProjectResponse'
+    { _cprsProject :: !(Maybe Project)
+    , _cprsStatus  :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CreateProjectResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cprsProject'
+--
+-- * 'cprsStatus'
+createProjectResponse
+    :: Int -- ^ 'cprsStatus'
+    -> CreateProjectResponse
+createProjectResponse pStatus_ =
+    CreateProjectResponse'
+    { _cprsProject = Nothing
+    , _cprsStatus = pStatus_
+    }
+
+-- | The newly created project.
+cprsProject :: Lens' CreateProjectResponse (Maybe Project)
+cprsProject = lens _cprsProject (\ s a -> s{_cprsProject = a});
+
+-- | The response status code.
+cprsStatus :: Lens' CreateProjectResponse Int
+cprsStatus = lens _cprsStatus (\ s a -> s{_cprsStatus = a});
diff --git a/gen/Network/AWS/DeviceFarm/CreateUpload.hs b/gen/Network/AWS/DeviceFarm/CreateUpload.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DeviceFarm/CreateUpload.hs
@@ -0,0 +1,184 @@
+{-# 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.DeviceFarm.CreateUpload
+-- Copyright   : (c) 2013-2015 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)
+--
+-- Uploads an app or test scripts.
+--
+-- /See:/ <http://docs.aws.amazon.com/devicefarm/latest/APIReference/API_CreateUpload.html AWS API Reference> for CreateUpload.
+module Network.AWS.DeviceFarm.CreateUpload
+    (
+    -- * Creating a Request
+      createUpload
+    , CreateUpload
+    -- * Request Lenses
+    , cuContentType
+    , cuProjectARN
+    , cuName
+    , cuType
+
+    -- * Destructuring the Response
+    , createUploadResponse
+    , CreateUploadResponse
+    -- * Response Lenses
+    , cursUpload
+    , cursStatus
+    ) where
+
+import           Network.AWS.DeviceFarm.Types
+import           Network.AWS.DeviceFarm.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | Represents a request to the create upload operation.
+--
+-- /See:/ 'createUpload' smart constructor.
+data CreateUpload = CreateUpload'
+    { _cuContentType :: !(Maybe Text)
+    , _cuProjectARN  :: !Text
+    , _cuName        :: !Text
+    , _cuType        :: !UploadType
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CreateUpload' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cuContentType'
+--
+-- * 'cuProjectARN'
+--
+-- * 'cuName'
+--
+-- * 'cuType'
+createUpload
+    :: Text -- ^ 'cuProjectARN'
+    -> Text -- ^ 'cuName'
+    -> UploadType -- ^ 'cuType'
+    -> CreateUpload
+createUpload pProjectARN_ pName_ pType_ =
+    CreateUpload'
+    { _cuContentType = Nothing
+    , _cuProjectARN = pProjectARN_
+    , _cuName = pName_
+    , _cuType = pType_
+    }
+
+-- | The upload\'s content type (for example, \"application\/octet-stream\").
+cuContentType :: Lens' CreateUpload (Maybe Text)
+cuContentType = lens _cuContentType (\ s a -> s{_cuContentType = a});
+
+-- | The ARN of the project for the upload.
+cuProjectARN :: Lens' CreateUpload Text
+cuProjectARN = lens _cuProjectARN (\ s a -> s{_cuProjectARN = a});
+
+-- | The upload\'s file name.
+cuName :: Lens' CreateUpload Text
+cuName = lens _cuName (\ s a -> s{_cuName = a});
+
+-- | The upload\'s upload type.
+--
+-- Must be one of the following values:
+--
+-- -   ANDROID_APP: An Android upload.
+--
+-- -   IOS_APP: An iOS upload.
+--
+-- -   EXTERNAL_DATA: An external data upload.
+--
+-- -   APPIUM_JAVA_JUNIT_TEST_PACKAGE: An Appium Java JUnit test package
+--     upload.
+--
+-- -   APPIUM_JAVA_TESTNG_TEST_PACKAGE: An Appium Java TestNG test package
+--     upload.
+--
+-- -   CALABASH_TEST_PACKAGE: A Calabash test package upload.
+--
+-- -   INSTRUMENTATION_TEST_PACKAGE: An instrumentation upload.
+--
+-- -   UIAUTOMATOR_TEST_PACKAGE: A uiautomator test package upload.
+--
+-- -   XCTEST_TEST_PACKAGE: An XCode test package upload.
+--
+cuType :: Lens' CreateUpload UploadType
+cuType = lens _cuType (\ s a -> s{_cuType = a});
+
+instance AWSRequest CreateUpload where
+        type Sv CreateUpload = DeviceFarm
+        type Rs CreateUpload = CreateUploadResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 CreateUploadResponse' <$>
+                   (x .?> "upload") <*> (pure (fromEnum s)))
+
+instance ToHeaders CreateUpload where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DeviceFarm_20150623.CreateUpload" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON CreateUpload where
+        toJSON CreateUpload'{..}
+          = object
+              ["contentType" .= _cuContentType,
+               "projectArn" .= _cuProjectARN, "name" .= _cuName,
+               "type" .= _cuType]
+
+instance ToPath CreateUpload where
+        toPath = const "/"
+
+instance ToQuery CreateUpload where
+        toQuery = const mempty
+
+-- | Represents the result of a create upload request.
+--
+-- /See:/ 'createUploadResponse' smart constructor.
+data CreateUploadResponse = CreateUploadResponse'
+    { _cursUpload :: !(Maybe Upload)
+    , _cursStatus :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CreateUploadResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cursUpload'
+--
+-- * 'cursStatus'
+createUploadResponse
+    :: Int -- ^ 'cursStatus'
+    -> CreateUploadResponse
+createUploadResponse pStatus_ =
+    CreateUploadResponse'
+    { _cursUpload = Nothing
+    , _cursStatus = pStatus_
+    }
+
+-- | The newly created upload.
+cursUpload :: Lens' CreateUploadResponse (Maybe Upload)
+cursUpload = lens _cursUpload (\ s a -> s{_cursUpload = a});
+
+-- | The response status code.
+cursStatus :: Lens' CreateUploadResponse Int
+cursStatus = lens _cursStatus (\ s a -> s{_cursStatus = a});
diff --git a/gen/Network/AWS/DeviceFarm/GetAccountSettings.hs b/gen/Network/AWS/DeviceFarm/GetAccountSettings.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DeviceFarm/GetAccountSettings.hs
@@ -0,0 +1,114 @@
+{-# 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.DeviceFarm.GetAccountSettings
+-- Copyright   : (c) 2013-2015 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 the number of unmetered iOS and\/or unmetered Android devices
+-- that have been purchased by the account.
+--
+-- /See:/ <http://docs.aws.amazon.com/devicefarm/latest/APIReference/API_GetAccountSettings.html AWS API Reference> for GetAccountSettings.
+module Network.AWS.DeviceFarm.GetAccountSettings
+    (
+    -- * Creating a Request
+      getAccountSettings
+    , GetAccountSettings
+
+    -- * Destructuring the Response
+    , getAccountSettingsResponse
+    , GetAccountSettingsResponse
+    -- * Response Lenses
+    , gasrsAccountSettings
+    , gasrsStatus
+    ) where
+
+import           Network.AWS.DeviceFarm.Types
+import           Network.AWS.DeviceFarm.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'getAccountSettings' smart constructor.
+data GetAccountSettings =
+    GetAccountSettings'
+    deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetAccountSettings' with the minimum fields required to make a request.
+--
+getAccountSettings
+    :: GetAccountSettings
+getAccountSettings = GetAccountSettings'
+
+instance AWSRequest GetAccountSettings where
+        type Sv GetAccountSettings = DeviceFarm
+        type Rs GetAccountSettings =
+             GetAccountSettingsResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 GetAccountSettingsResponse' <$>
+                   (x .?> "accountSettings") <*> (pure (fromEnum s)))
+
+instance ToHeaders GetAccountSettings where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DeviceFarm_20150623.GetAccountSettings" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON GetAccountSettings where
+        toJSON = const (Object mempty)
+
+instance ToPath GetAccountSettings where
+        toPath = const "/"
+
+instance ToQuery GetAccountSettings where
+        toQuery = const mempty
+
+-- | /See:/ 'getAccountSettingsResponse' smart constructor.
+data GetAccountSettingsResponse = GetAccountSettingsResponse'
+    { _gasrsAccountSettings :: !(Maybe AccountSettings)
+    , _gasrsStatus          :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetAccountSettingsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gasrsAccountSettings'
+--
+-- * 'gasrsStatus'
+getAccountSettingsResponse
+    :: Int -- ^ 'gasrsStatus'
+    -> GetAccountSettingsResponse
+getAccountSettingsResponse pStatus_ =
+    GetAccountSettingsResponse'
+    { _gasrsAccountSettings = Nothing
+    , _gasrsStatus = pStatus_
+    }
+
+-- | Undocumented member.
+gasrsAccountSettings :: Lens' GetAccountSettingsResponse (Maybe AccountSettings)
+gasrsAccountSettings = lens _gasrsAccountSettings (\ s a -> s{_gasrsAccountSettings = a});
+
+-- | The response status code.
+gasrsStatus :: Lens' GetAccountSettingsResponse Int
+gasrsStatus = lens _gasrsStatus (\ s a -> s{_gasrsStatus = a});
diff --git a/gen/Network/AWS/DeviceFarm/GetDevice.hs b/gen/Network/AWS/DeviceFarm/GetDevice.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DeviceFarm/GetDevice.hs
@@ -0,0 +1,128 @@
+{-# 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.DeviceFarm.GetDevice
+-- Copyright   : (c) 2013-2015 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)
+--
+-- Gets information about a unique device type.
+--
+-- /See:/ <http://docs.aws.amazon.com/devicefarm/latest/APIReference/API_GetDevice.html AWS API Reference> for GetDevice.
+module Network.AWS.DeviceFarm.GetDevice
+    (
+    -- * Creating a Request
+      getDevice
+    , GetDevice
+    -- * Request Lenses
+    , gdArn
+
+    -- * Destructuring the Response
+    , getDeviceResponse
+    , GetDeviceResponse
+    -- * Response Lenses
+    , gdrsDevice
+    , gdrsStatus
+    ) where
+
+import           Network.AWS.DeviceFarm.Types
+import           Network.AWS.DeviceFarm.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | Represents a request to the get device request.
+--
+-- /See:/ 'getDevice' smart constructor.
+newtype GetDevice = GetDevice'
+    { _gdArn :: Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetDevice' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gdArn'
+getDevice
+    :: Text -- ^ 'gdArn'
+    -> GetDevice
+getDevice pArn_ =
+    GetDevice'
+    { _gdArn = pArn_
+    }
+
+-- | The device type\'s ARN.
+gdArn :: Lens' GetDevice Text
+gdArn = lens _gdArn (\ s a -> s{_gdArn = a});
+
+instance AWSRequest GetDevice where
+        type Sv GetDevice = DeviceFarm
+        type Rs GetDevice = GetDeviceResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 GetDeviceResponse' <$>
+                   (x .?> "device") <*> (pure (fromEnum s)))
+
+instance ToHeaders GetDevice where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DeviceFarm_20150623.GetDevice" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON GetDevice where
+        toJSON GetDevice'{..} = object ["arn" .= _gdArn]
+
+instance ToPath GetDevice where
+        toPath = const "/"
+
+instance ToQuery GetDevice where
+        toQuery = const mempty
+
+-- | Represents the result of a get device request.
+--
+-- /See:/ 'getDeviceResponse' smart constructor.
+data GetDeviceResponse = GetDeviceResponse'
+    { _gdrsDevice :: !(Maybe Device)
+    , _gdrsStatus :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetDeviceResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gdrsDevice'
+--
+-- * 'gdrsStatus'
+getDeviceResponse
+    :: Int -- ^ 'gdrsStatus'
+    -> GetDeviceResponse
+getDeviceResponse pStatus_ =
+    GetDeviceResponse'
+    { _gdrsDevice = Nothing
+    , _gdrsStatus = pStatus_
+    }
+
+-- | Undocumented member.
+gdrsDevice :: Lens' GetDeviceResponse (Maybe Device)
+gdrsDevice = lens _gdrsDevice (\ s a -> s{_gdrsDevice = a});
+
+-- | The response status code.
+gdrsStatus :: Lens' GetDeviceResponse Int
+gdrsStatus = lens _gdrsStatus (\ s a -> s{_gdrsStatus = a});
diff --git a/gen/Network/AWS/DeviceFarm/GetDevicePool.hs b/gen/Network/AWS/DeviceFarm/GetDevicePool.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DeviceFarm/GetDevicePool.hs
@@ -0,0 +1,128 @@
+{-# 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.DeviceFarm.GetDevicePool
+-- Copyright   : (c) 2013-2015 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)
+--
+-- Gets information about a device pool.
+--
+-- /See:/ <http://docs.aws.amazon.com/devicefarm/latest/APIReference/API_GetDevicePool.html AWS API Reference> for GetDevicePool.
+module Network.AWS.DeviceFarm.GetDevicePool
+    (
+    -- * Creating a Request
+      getDevicePool
+    , GetDevicePool
+    -- * Request Lenses
+    , gdpArn
+
+    -- * Destructuring the Response
+    , getDevicePoolResponse
+    , GetDevicePoolResponse
+    -- * Response Lenses
+    , gdprsDevicePool
+    , gdprsStatus
+    ) where
+
+import           Network.AWS.DeviceFarm.Types
+import           Network.AWS.DeviceFarm.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | Represents a request to the get device pool operation.
+--
+-- /See:/ 'getDevicePool' smart constructor.
+newtype GetDevicePool = GetDevicePool'
+    { _gdpArn :: Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetDevicePool' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gdpArn'
+getDevicePool
+    :: Text -- ^ 'gdpArn'
+    -> GetDevicePool
+getDevicePool pArn_ =
+    GetDevicePool'
+    { _gdpArn = pArn_
+    }
+
+-- | The device pool\'s ARN.
+gdpArn :: Lens' GetDevicePool Text
+gdpArn = lens _gdpArn (\ s a -> s{_gdpArn = a});
+
+instance AWSRequest GetDevicePool where
+        type Sv GetDevicePool = DeviceFarm
+        type Rs GetDevicePool = GetDevicePoolResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 GetDevicePoolResponse' <$>
+                   (x .?> "devicePool") <*> (pure (fromEnum s)))
+
+instance ToHeaders GetDevicePool where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DeviceFarm_20150623.GetDevicePool" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON GetDevicePool where
+        toJSON GetDevicePool'{..} = object ["arn" .= _gdpArn]
+
+instance ToPath GetDevicePool where
+        toPath = const "/"
+
+instance ToQuery GetDevicePool where
+        toQuery = const mempty
+
+-- | Represents the result of a get device pool request.
+--
+-- /See:/ 'getDevicePoolResponse' smart constructor.
+data GetDevicePoolResponse = GetDevicePoolResponse'
+    { _gdprsDevicePool :: !(Maybe DevicePool)
+    , _gdprsStatus     :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetDevicePoolResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gdprsDevicePool'
+--
+-- * 'gdprsStatus'
+getDevicePoolResponse
+    :: Int -- ^ 'gdprsStatus'
+    -> GetDevicePoolResponse
+getDevicePoolResponse pStatus_ =
+    GetDevicePoolResponse'
+    { _gdprsDevicePool = Nothing
+    , _gdprsStatus = pStatus_
+    }
+
+-- | Undocumented member.
+gdprsDevicePool :: Lens' GetDevicePoolResponse (Maybe DevicePool)
+gdprsDevicePool = lens _gdprsDevicePool (\ s a -> s{_gdprsDevicePool = a});
+
+-- | The response status code.
+gdprsStatus :: Lens' GetDevicePoolResponse Int
+gdprsStatus = lens _gdprsStatus (\ s a -> s{_gdprsStatus = a});
diff --git a/gen/Network/AWS/DeviceFarm/GetDevicePoolCompatibility.hs b/gen/Network/AWS/DeviceFarm/GetDevicePoolCompatibility.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DeviceFarm/GetDevicePoolCompatibility.hs
@@ -0,0 +1,187 @@
+{-# 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.DeviceFarm.GetDevicePoolCompatibility
+-- Copyright   : (c) 2013-2015 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)
+--
+-- Gets information about compatibility with a device pool.
+--
+-- /See:/ <http://docs.aws.amazon.com/devicefarm/latest/APIReference/API_GetDevicePoolCompatibility.html AWS API Reference> for GetDevicePoolCompatibility.
+module Network.AWS.DeviceFarm.GetDevicePoolCompatibility
+    (
+    -- * Creating a Request
+      getDevicePoolCompatibility
+    , GetDevicePoolCompatibility
+    -- * Request Lenses
+    , gdpcTestType
+    , gdpcDevicePoolARN
+    , gdpcAppARN
+
+    -- * Destructuring the Response
+    , getDevicePoolCompatibilityResponse
+    , GetDevicePoolCompatibilityResponse
+    -- * Response Lenses
+    , gdpcrsIncompatibleDevices
+    , gdpcrsCompatibleDevices
+    , gdpcrsStatus
+    ) where
+
+import           Network.AWS.DeviceFarm.Types
+import           Network.AWS.DeviceFarm.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | Represents a request to the get device pool compatibility operation.
+--
+-- /See:/ 'getDevicePoolCompatibility' smart constructor.
+data GetDevicePoolCompatibility = GetDevicePoolCompatibility'
+    { _gdpcTestType      :: !(Maybe TestType)
+    , _gdpcDevicePoolARN :: !Text
+    , _gdpcAppARN        :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetDevicePoolCompatibility' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gdpcTestType'
+--
+-- * 'gdpcDevicePoolARN'
+--
+-- * 'gdpcAppARN'
+getDevicePoolCompatibility
+    :: Text -- ^ 'gdpcDevicePoolARN'
+    -> Text -- ^ 'gdpcAppARN'
+    -> GetDevicePoolCompatibility
+getDevicePoolCompatibility pDevicePoolARN_ pAppARN_ =
+    GetDevicePoolCompatibility'
+    { _gdpcTestType = Nothing
+    , _gdpcDevicePoolARN = pDevicePoolARN_
+    , _gdpcAppARN = pAppARN_
+    }
+
+-- | The test type for the specified device pool.
+--
+-- Allowed values include the following:
+--
+-- -   BUILTIN_FUZZ: The built-in fuzz type.
+--
+-- -   BUILTIN_EXPLORER: For Android, an app explorer that will traverse an
+--     Android app, interacting with it and capturing screenshots at the
+--     same time.
+--
+-- -   APPIUM_JAVA_JUNIT: The Appium Java JUnit type.
+--
+-- -   APPIUM_JAVA_TESTNG: The Appium Java TestNG type.
+--
+-- -   CALABASH: The Calabash type.
+--
+-- -   INSTRUMENTATION: The Instrumentation type.
+--
+-- -   UIAUTOMATION: The uiautomation type.
+--
+-- -   UIAUTOMATOR: The uiautomator type.
+--
+-- -   XCTEST: The XCode test type.
+--
+gdpcTestType :: Lens' GetDevicePoolCompatibility (Maybe TestType)
+gdpcTestType = lens _gdpcTestType (\ s a -> s{_gdpcTestType = a});
+
+-- | The device pool\'s ARN.
+gdpcDevicePoolARN :: Lens' GetDevicePoolCompatibility Text
+gdpcDevicePoolARN = lens _gdpcDevicePoolARN (\ s a -> s{_gdpcDevicePoolARN = a});
+
+-- | The ARN of the app that is associated with the specified device pool.
+gdpcAppARN :: Lens' GetDevicePoolCompatibility Text
+gdpcAppARN = lens _gdpcAppARN (\ s a -> s{_gdpcAppARN = a});
+
+instance AWSRequest GetDevicePoolCompatibility where
+        type Sv GetDevicePoolCompatibility = DeviceFarm
+        type Rs GetDevicePoolCompatibility =
+             GetDevicePoolCompatibilityResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 GetDevicePoolCompatibilityResponse' <$>
+                   (x .?> "incompatibleDevices" .!@ mempty) <*>
+                     (x .?> "compatibleDevices" .!@ mempty)
+                     <*> (pure (fromEnum s)))
+
+instance ToHeaders GetDevicePoolCompatibility where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DeviceFarm_20150623.GetDevicePoolCompatibility" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON GetDevicePoolCompatibility where
+        toJSON GetDevicePoolCompatibility'{..}
+          = object
+              ["testType" .= _gdpcTestType,
+               "devicePoolArn" .= _gdpcDevicePoolARN,
+               "appArn" .= _gdpcAppARN]
+
+instance ToPath GetDevicePoolCompatibility where
+        toPath = const "/"
+
+instance ToQuery GetDevicePoolCompatibility where
+        toQuery = const mempty
+
+-- | Represents the result of describe device pool compatibility request.
+--
+-- /See:/ 'getDevicePoolCompatibilityResponse' smart constructor.
+data GetDevicePoolCompatibilityResponse = GetDevicePoolCompatibilityResponse'
+    { _gdpcrsIncompatibleDevices :: !(Maybe [DevicePoolCompatibilityResult])
+    , _gdpcrsCompatibleDevices   :: !(Maybe [DevicePoolCompatibilityResult])
+    , _gdpcrsStatus              :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetDevicePoolCompatibilityResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gdpcrsIncompatibleDevices'
+--
+-- * 'gdpcrsCompatibleDevices'
+--
+-- * 'gdpcrsStatus'
+getDevicePoolCompatibilityResponse
+    :: Int -- ^ 'gdpcrsStatus'
+    -> GetDevicePoolCompatibilityResponse
+getDevicePoolCompatibilityResponse pStatus_ =
+    GetDevicePoolCompatibilityResponse'
+    { _gdpcrsIncompatibleDevices = Nothing
+    , _gdpcrsCompatibleDevices = Nothing
+    , _gdpcrsStatus = pStatus_
+    }
+
+-- | Information about incompatible devices.
+gdpcrsIncompatibleDevices :: Lens' GetDevicePoolCompatibilityResponse [DevicePoolCompatibilityResult]
+gdpcrsIncompatibleDevices = lens _gdpcrsIncompatibleDevices (\ s a -> s{_gdpcrsIncompatibleDevices = a}) . _Default . _Coerce;
+
+-- | Information about compatible devices.
+gdpcrsCompatibleDevices :: Lens' GetDevicePoolCompatibilityResponse [DevicePoolCompatibilityResult]
+gdpcrsCompatibleDevices = lens _gdpcrsCompatibleDevices (\ s a -> s{_gdpcrsCompatibleDevices = a}) . _Default . _Coerce;
+
+-- | The response status code.
+gdpcrsStatus :: Lens' GetDevicePoolCompatibilityResponse Int
+gdpcrsStatus = lens _gdpcrsStatus (\ s a -> s{_gdpcrsStatus = a});
diff --git a/gen/Network/AWS/DeviceFarm/GetJob.hs b/gen/Network/AWS/DeviceFarm/GetJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DeviceFarm/GetJob.hs
@@ -0,0 +1,128 @@
+{-# 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.DeviceFarm.GetJob
+-- Copyright   : (c) 2013-2015 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)
+--
+-- Gets information about a job.
+--
+-- /See:/ <http://docs.aws.amazon.com/devicefarm/latest/APIReference/API_GetJob.html AWS API Reference> for GetJob.
+module Network.AWS.DeviceFarm.GetJob
+    (
+    -- * Creating a Request
+      getJob
+    , GetJob
+    -- * Request Lenses
+    , gjArn
+
+    -- * Destructuring the Response
+    , getJobResponse
+    , GetJobResponse
+    -- * Response Lenses
+    , gjrsJob
+    , gjrsStatus
+    ) where
+
+import           Network.AWS.DeviceFarm.Types
+import           Network.AWS.DeviceFarm.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | Represents a request to the get job operation.
+--
+-- /See:/ 'getJob' smart constructor.
+newtype GetJob = GetJob'
+    { _gjArn :: Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetJob' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gjArn'
+getJob
+    :: Text -- ^ 'gjArn'
+    -> GetJob
+getJob pArn_ =
+    GetJob'
+    { _gjArn = pArn_
+    }
+
+-- | The job\'s ARN.
+gjArn :: Lens' GetJob Text
+gjArn = lens _gjArn (\ s a -> s{_gjArn = a});
+
+instance AWSRequest GetJob where
+        type Sv GetJob = DeviceFarm
+        type Rs GetJob = GetJobResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 GetJobResponse' <$>
+                   (x .?> "job") <*> (pure (fromEnum s)))
+
+instance ToHeaders GetJob where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DeviceFarm_20150623.GetJob" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON GetJob where
+        toJSON GetJob'{..} = object ["arn" .= _gjArn]
+
+instance ToPath GetJob where
+        toPath = const "/"
+
+instance ToQuery GetJob where
+        toQuery = const mempty
+
+-- | Represents the result of a get job request.
+--
+-- /See:/ 'getJobResponse' smart constructor.
+data GetJobResponse = GetJobResponse'
+    { _gjrsJob    :: !(Maybe Job)
+    , _gjrsStatus :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetJobResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gjrsJob'
+--
+-- * 'gjrsStatus'
+getJobResponse
+    :: Int -- ^ 'gjrsStatus'
+    -> GetJobResponse
+getJobResponse pStatus_ =
+    GetJobResponse'
+    { _gjrsJob = Nothing
+    , _gjrsStatus = pStatus_
+    }
+
+-- | Undocumented member.
+gjrsJob :: Lens' GetJobResponse (Maybe Job)
+gjrsJob = lens _gjrsJob (\ s a -> s{_gjrsJob = a});
+
+-- | The response status code.
+gjrsStatus :: Lens' GetJobResponse Int
+gjrsStatus = lens _gjrsStatus (\ s a -> s{_gjrsStatus = a});
diff --git a/gen/Network/AWS/DeviceFarm/GetProject.hs b/gen/Network/AWS/DeviceFarm/GetProject.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DeviceFarm/GetProject.hs
@@ -0,0 +1,128 @@
+{-# 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.DeviceFarm.GetProject
+-- Copyright   : (c) 2013-2015 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)
+--
+-- Gets information about a project.
+--
+-- /See:/ <http://docs.aws.amazon.com/devicefarm/latest/APIReference/API_GetProject.html AWS API Reference> for GetProject.
+module Network.AWS.DeviceFarm.GetProject
+    (
+    -- * Creating a Request
+      getProject
+    , GetProject
+    -- * Request Lenses
+    , gpArn
+
+    -- * Destructuring the Response
+    , getProjectResponse
+    , GetProjectResponse
+    -- * Response Lenses
+    , gprsProject
+    , gprsStatus
+    ) where
+
+import           Network.AWS.DeviceFarm.Types
+import           Network.AWS.DeviceFarm.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | Represents a request to the get project operation.
+--
+-- /See:/ 'getProject' smart constructor.
+newtype GetProject = GetProject'
+    { _gpArn :: Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetProject' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gpArn'
+getProject
+    :: Text -- ^ 'gpArn'
+    -> GetProject
+getProject pArn_ =
+    GetProject'
+    { _gpArn = pArn_
+    }
+
+-- | The project\'s ARN.
+gpArn :: Lens' GetProject Text
+gpArn = lens _gpArn (\ s a -> s{_gpArn = a});
+
+instance AWSRequest GetProject where
+        type Sv GetProject = DeviceFarm
+        type Rs GetProject = GetProjectResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 GetProjectResponse' <$>
+                   (x .?> "project") <*> (pure (fromEnum s)))
+
+instance ToHeaders GetProject where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DeviceFarm_20150623.GetProject" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON GetProject where
+        toJSON GetProject'{..} = object ["arn" .= _gpArn]
+
+instance ToPath GetProject where
+        toPath = const "/"
+
+instance ToQuery GetProject where
+        toQuery = const mempty
+
+-- | Represents the result of a get project request.
+--
+-- /See:/ 'getProjectResponse' smart constructor.
+data GetProjectResponse = GetProjectResponse'
+    { _gprsProject :: !(Maybe Project)
+    , _gprsStatus  :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetProjectResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gprsProject'
+--
+-- * 'gprsStatus'
+getProjectResponse
+    :: Int -- ^ 'gprsStatus'
+    -> GetProjectResponse
+getProjectResponse pStatus_ =
+    GetProjectResponse'
+    { _gprsProject = Nothing
+    , _gprsStatus = pStatus_
+    }
+
+-- | Undocumented member.
+gprsProject :: Lens' GetProjectResponse (Maybe Project)
+gprsProject = lens _gprsProject (\ s a -> s{_gprsProject = a});
+
+-- | The response status code.
+gprsStatus :: Lens' GetProjectResponse Int
+gprsStatus = lens _gprsStatus (\ s a -> s{_gprsStatus = a});
diff --git a/gen/Network/AWS/DeviceFarm/GetRun.hs b/gen/Network/AWS/DeviceFarm/GetRun.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DeviceFarm/GetRun.hs
@@ -0,0 +1,128 @@
+{-# 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.DeviceFarm.GetRun
+-- Copyright   : (c) 2013-2015 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)
+--
+-- Gets information about a run.
+--
+-- /See:/ <http://docs.aws.amazon.com/devicefarm/latest/APIReference/API_GetRun.html AWS API Reference> for GetRun.
+module Network.AWS.DeviceFarm.GetRun
+    (
+    -- * Creating a Request
+      getRun
+    , GetRun
+    -- * Request Lenses
+    , grArn
+
+    -- * Destructuring the Response
+    , getRunResponse
+    , GetRunResponse
+    -- * Response Lenses
+    , grrsRun
+    , grrsStatus
+    ) where
+
+import           Network.AWS.DeviceFarm.Types
+import           Network.AWS.DeviceFarm.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | Represents a request to the get run operation.
+--
+-- /See:/ 'getRun' smart constructor.
+newtype GetRun = GetRun'
+    { _grArn :: Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetRun' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'grArn'
+getRun
+    :: Text -- ^ 'grArn'
+    -> GetRun
+getRun pArn_ =
+    GetRun'
+    { _grArn = pArn_
+    }
+
+-- | The run\'s ARN.
+grArn :: Lens' GetRun Text
+grArn = lens _grArn (\ s a -> s{_grArn = a});
+
+instance AWSRequest GetRun where
+        type Sv GetRun = DeviceFarm
+        type Rs GetRun = GetRunResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 GetRunResponse' <$>
+                   (x .?> "run") <*> (pure (fromEnum s)))
+
+instance ToHeaders GetRun where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DeviceFarm_20150623.GetRun" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON GetRun where
+        toJSON GetRun'{..} = object ["arn" .= _grArn]
+
+instance ToPath GetRun where
+        toPath = const "/"
+
+instance ToQuery GetRun where
+        toQuery = const mempty
+
+-- | Represents the result of a get run request.
+--
+-- /See:/ 'getRunResponse' smart constructor.
+data GetRunResponse = GetRunResponse'
+    { _grrsRun    :: !(Maybe Run)
+    , _grrsStatus :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetRunResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'grrsRun'
+--
+-- * 'grrsStatus'
+getRunResponse
+    :: Int -- ^ 'grrsStatus'
+    -> GetRunResponse
+getRunResponse pStatus_ =
+    GetRunResponse'
+    { _grrsRun = Nothing
+    , _grrsStatus = pStatus_
+    }
+
+-- | Undocumented member.
+grrsRun :: Lens' GetRunResponse (Maybe Run)
+grrsRun = lens _grrsRun (\ s a -> s{_grrsRun = a});
+
+-- | The response status code.
+grrsStatus :: Lens' GetRunResponse Int
+grrsStatus = lens _grrsStatus (\ s a -> s{_grrsStatus = a});
diff --git a/gen/Network/AWS/DeviceFarm/GetSuite.hs b/gen/Network/AWS/DeviceFarm/GetSuite.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DeviceFarm/GetSuite.hs
@@ -0,0 +1,128 @@
+{-# 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.DeviceFarm.GetSuite
+-- Copyright   : (c) 2013-2015 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)
+--
+-- Gets information about a suite.
+--
+-- /See:/ <http://docs.aws.amazon.com/devicefarm/latest/APIReference/API_GetSuite.html AWS API Reference> for GetSuite.
+module Network.AWS.DeviceFarm.GetSuite
+    (
+    -- * Creating a Request
+      getSuite
+    , GetSuite
+    -- * Request Lenses
+    , gsArn
+
+    -- * Destructuring the Response
+    , getSuiteResponse
+    , GetSuiteResponse
+    -- * Response Lenses
+    , gsrsSuite
+    , gsrsStatus
+    ) where
+
+import           Network.AWS.DeviceFarm.Types
+import           Network.AWS.DeviceFarm.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | Represents a request to the get suite operation.
+--
+-- /See:/ 'getSuite' smart constructor.
+newtype GetSuite = GetSuite'
+    { _gsArn :: Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetSuite' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gsArn'
+getSuite
+    :: Text -- ^ 'gsArn'
+    -> GetSuite
+getSuite pArn_ =
+    GetSuite'
+    { _gsArn = pArn_
+    }
+
+-- | The suite\'s ARN.
+gsArn :: Lens' GetSuite Text
+gsArn = lens _gsArn (\ s a -> s{_gsArn = a});
+
+instance AWSRequest GetSuite where
+        type Sv GetSuite = DeviceFarm
+        type Rs GetSuite = GetSuiteResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 GetSuiteResponse' <$>
+                   (x .?> "suite") <*> (pure (fromEnum s)))
+
+instance ToHeaders GetSuite where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DeviceFarm_20150623.GetSuite" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON GetSuite where
+        toJSON GetSuite'{..} = object ["arn" .= _gsArn]
+
+instance ToPath GetSuite where
+        toPath = const "/"
+
+instance ToQuery GetSuite where
+        toQuery = const mempty
+
+-- | Represents the result of a get suite request.
+--
+-- /See:/ 'getSuiteResponse' smart constructor.
+data GetSuiteResponse = GetSuiteResponse'
+    { _gsrsSuite  :: !(Maybe Suite)
+    , _gsrsStatus :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetSuiteResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gsrsSuite'
+--
+-- * 'gsrsStatus'
+getSuiteResponse
+    :: Int -- ^ 'gsrsStatus'
+    -> GetSuiteResponse
+getSuiteResponse pStatus_ =
+    GetSuiteResponse'
+    { _gsrsSuite = Nothing
+    , _gsrsStatus = pStatus_
+    }
+
+-- | Undocumented member.
+gsrsSuite :: Lens' GetSuiteResponse (Maybe Suite)
+gsrsSuite = lens _gsrsSuite (\ s a -> s{_gsrsSuite = a});
+
+-- | The response status code.
+gsrsStatus :: Lens' GetSuiteResponse Int
+gsrsStatus = lens _gsrsStatus (\ s a -> s{_gsrsStatus = a});
diff --git a/gen/Network/AWS/DeviceFarm/GetTest.hs b/gen/Network/AWS/DeviceFarm/GetTest.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DeviceFarm/GetTest.hs
@@ -0,0 +1,128 @@
+{-# 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.DeviceFarm.GetTest
+-- Copyright   : (c) 2013-2015 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)
+--
+-- Gets information about a test.
+--
+-- /See:/ <http://docs.aws.amazon.com/devicefarm/latest/APIReference/API_GetTest.html AWS API Reference> for GetTest.
+module Network.AWS.DeviceFarm.GetTest
+    (
+    -- * Creating a Request
+      getTest
+    , GetTest
+    -- * Request Lenses
+    , gtArn
+
+    -- * Destructuring the Response
+    , getTestResponse
+    , GetTestResponse
+    -- * Response Lenses
+    , gtrsTest
+    , gtrsStatus
+    ) where
+
+import           Network.AWS.DeviceFarm.Types
+import           Network.AWS.DeviceFarm.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | Represents a request to the get test operation.
+--
+-- /See:/ 'getTest' smart constructor.
+newtype GetTest = GetTest'
+    { _gtArn :: Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetTest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gtArn'
+getTest
+    :: Text -- ^ 'gtArn'
+    -> GetTest
+getTest pArn_ =
+    GetTest'
+    { _gtArn = pArn_
+    }
+
+-- | The test\'s ARN.
+gtArn :: Lens' GetTest Text
+gtArn = lens _gtArn (\ s a -> s{_gtArn = a});
+
+instance AWSRequest GetTest where
+        type Sv GetTest = DeviceFarm
+        type Rs GetTest = GetTestResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 GetTestResponse' <$>
+                   (x .?> "test") <*> (pure (fromEnum s)))
+
+instance ToHeaders GetTest where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DeviceFarm_20150623.GetTest" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON GetTest where
+        toJSON GetTest'{..} = object ["arn" .= _gtArn]
+
+instance ToPath GetTest where
+        toPath = const "/"
+
+instance ToQuery GetTest where
+        toQuery = const mempty
+
+-- | Represents the result of a get test request.
+--
+-- /See:/ 'getTestResponse' smart constructor.
+data GetTestResponse = GetTestResponse'
+    { _gtrsTest   :: !(Maybe Test)
+    , _gtrsStatus :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetTestResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gtrsTest'
+--
+-- * 'gtrsStatus'
+getTestResponse
+    :: Int -- ^ 'gtrsStatus'
+    -> GetTestResponse
+getTestResponse pStatus_ =
+    GetTestResponse'
+    { _gtrsTest = Nothing
+    , _gtrsStatus = pStatus_
+    }
+
+-- | Undocumented member.
+gtrsTest :: Lens' GetTestResponse (Maybe Test)
+gtrsTest = lens _gtrsTest (\ s a -> s{_gtrsTest = a});
+
+-- | The response status code.
+gtrsStatus :: Lens' GetTestResponse Int
+gtrsStatus = lens _gtrsStatus (\ s a -> s{_gtrsStatus = a});
diff --git a/gen/Network/AWS/DeviceFarm/GetUpload.hs b/gen/Network/AWS/DeviceFarm/GetUpload.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DeviceFarm/GetUpload.hs
@@ -0,0 +1,128 @@
+{-# 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.DeviceFarm.GetUpload
+-- Copyright   : (c) 2013-2015 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)
+--
+-- Gets information about an upload.
+--
+-- /See:/ <http://docs.aws.amazon.com/devicefarm/latest/APIReference/API_GetUpload.html AWS API Reference> for GetUpload.
+module Network.AWS.DeviceFarm.GetUpload
+    (
+    -- * Creating a Request
+      getUpload
+    , GetUpload
+    -- * Request Lenses
+    , guArn
+
+    -- * Destructuring the Response
+    , getUploadResponse
+    , GetUploadResponse
+    -- * Response Lenses
+    , gursUpload
+    , gursStatus
+    ) where
+
+import           Network.AWS.DeviceFarm.Types
+import           Network.AWS.DeviceFarm.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | Represents a request to the get upload operation.
+--
+-- /See:/ 'getUpload' smart constructor.
+newtype GetUpload = GetUpload'
+    { _guArn :: Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetUpload' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'guArn'
+getUpload
+    :: Text -- ^ 'guArn'
+    -> GetUpload
+getUpload pArn_ =
+    GetUpload'
+    { _guArn = pArn_
+    }
+
+-- | The upload\'s ARN.
+guArn :: Lens' GetUpload Text
+guArn = lens _guArn (\ s a -> s{_guArn = a});
+
+instance AWSRequest GetUpload where
+        type Sv GetUpload = DeviceFarm
+        type Rs GetUpload = GetUploadResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 GetUploadResponse' <$>
+                   (x .?> "upload") <*> (pure (fromEnum s)))
+
+instance ToHeaders GetUpload where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DeviceFarm_20150623.GetUpload" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON GetUpload where
+        toJSON GetUpload'{..} = object ["arn" .= _guArn]
+
+instance ToPath GetUpload where
+        toPath = const "/"
+
+instance ToQuery GetUpload where
+        toQuery = const mempty
+
+-- | Represents the result of a get upload request.
+--
+-- /See:/ 'getUploadResponse' smart constructor.
+data GetUploadResponse = GetUploadResponse'
+    { _gursUpload :: !(Maybe Upload)
+    , _gursStatus :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetUploadResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gursUpload'
+--
+-- * 'gursStatus'
+getUploadResponse
+    :: Int -- ^ 'gursStatus'
+    -> GetUploadResponse
+getUploadResponse pStatus_ =
+    GetUploadResponse'
+    { _gursUpload = Nothing
+    , _gursStatus = pStatus_
+    }
+
+-- | Undocumented member.
+gursUpload :: Lens' GetUploadResponse (Maybe Upload)
+gursUpload = lens _gursUpload (\ s a -> s{_gursUpload = a});
+
+-- | The response status code.
+gursStatus :: Lens' GetUploadResponse Int
+gursStatus = lens _gursStatus (\ s a -> s{_gursStatus = a});
diff --git a/gen/Network/AWS/DeviceFarm/ListArtifacts.hs b/gen/Network/AWS/DeviceFarm/ListArtifacts.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DeviceFarm/ListArtifacts.hs
@@ -0,0 +1,171 @@
+{-# 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.DeviceFarm.ListArtifacts
+-- Copyright   : (c) 2013-2015 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)
+--
+-- Gets information about artifacts.
+--
+-- /See:/ <http://docs.aws.amazon.com/devicefarm/latest/APIReference/API_ListArtifacts.html AWS API Reference> for ListArtifacts.
+module Network.AWS.DeviceFarm.ListArtifacts
+    (
+    -- * Creating a Request
+      listArtifacts
+    , ListArtifacts
+    -- * Request Lenses
+    , laNextToken
+    , laArn
+    , laType
+
+    -- * Destructuring the Response
+    , listArtifactsResponse
+    , ListArtifactsResponse
+    -- * Response Lenses
+    , larsArtifacts
+    , larsNextToken
+    , larsStatus
+    ) where
+
+import           Network.AWS.DeviceFarm.Types
+import           Network.AWS.DeviceFarm.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | Represents a request to the list artifacts operation.
+--
+-- /See:/ 'listArtifacts' smart constructor.
+data ListArtifacts = ListArtifacts'
+    { _laNextToken :: !(Maybe Text)
+    , _laArn       :: !Text
+    , _laType      :: !ArtifactCategory
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ListArtifacts' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'laNextToken'
+--
+-- * 'laArn'
+--
+-- * 'laType'
+listArtifacts
+    :: Text -- ^ 'laArn'
+    -> ArtifactCategory -- ^ 'laType'
+    -> ListArtifacts
+listArtifacts pArn_ pType_ =
+    ListArtifacts'
+    { _laNextToken = Nothing
+    , _laArn = pArn_
+    , _laType = pType_
+    }
+
+-- | An identifier that was returned from the previous call to this
+-- operation, which can be used to return the next set of items in the
+-- list.
+laNextToken :: Lens' ListArtifacts (Maybe Text)
+laNextToken = lens _laNextToken (\ s a -> s{_laNextToken = a});
+
+-- | The artifacts\' ARNs.
+laArn :: Lens' ListArtifacts Text
+laArn = lens _laArn (\ s a -> s{_laArn = a});
+
+-- | The artifacts\' type.
+--
+-- Allowed values include:
+--
+-- -   FILE: The artifacts are files.
+-- -   LOG: The artifacts are logs.
+-- -   SCREENSHOT: The artifacts are screenshots.
+laType :: Lens' ListArtifacts ArtifactCategory
+laType = lens _laType (\ s a -> s{_laType = a});
+
+instance AWSRequest ListArtifacts where
+        type Sv ListArtifacts = DeviceFarm
+        type Rs ListArtifacts = ListArtifactsResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 ListArtifactsResponse' <$>
+                   (x .?> "artifacts" .!@ mempty) <*>
+                     (x .?> "nextToken")
+                     <*> (pure (fromEnum s)))
+
+instance ToHeaders ListArtifacts where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DeviceFarm_20150623.ListArtifacts" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON ListArtifacts where
+        toJSON ListArtifacts'{..}
+          = object
+              ["nextToken" .= _laNextToken, "arn" .= _laArn,
+               "type" .= _laType]
+
+instance ToPath ListArtifacts where
+        toPath = const "/"
+
+instance ToQuery ListArtifacts where
+        toQuery = const mempty
+
+-- | Represents the result of a list artifacts operation.
+--
+-- /See:/ 'listArtifactsResponse' smart constructor.
+data ListArtifactsResponse = ListArtifactsResponse'
+    { _larsArtifacts :: !(Maybe [Artifact])
+    , _larsNextToken :: !(Maybe Text)
+    , _larsStatus    :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ListArtifactsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'larsArtifacts'
+--
+-- * 'larsNextToken'
+--
+-- * 'larsStatus'
+listArtifactsResponse
+    :: Int -- ^ 'larsStatus'
+    -> ListArtifactsResponse
+listArtifactsResponse pStatus_ =
+    ListArtifactsResponse'
+    { _larsArtifacts = Nothing
+    , _larsNextToken = Nothing
+    , _larsStatus = pStatus_
+    }
+
+-- | Information about the artifacts.
+larsArtifacts :: Lens' ListArtifactsResponse [Artifact]
+larsArtifacts = lens _larsArtifacts (\ s a -> s{_larsArtifacts = a}) . _Default . _Coerce;
+
+-- | If the number of items that are returned is significantly large, this is
+-- an identifier that is also returned, which can be used in a subsequent
+-- call to this operation to return the next set of items in the list.
+larsNextToken :: Lens' ListArtifactsResponse (Maybe Text)
+larsNextToken = lens _larsNextToken (\ s a -> s{_larsNextToken = a});
+
+-- | The response status code.
+larsStatus :: Lens' ListArtifactsResponse Int
+larsStatus = lens _larsStatus (\ s a -> s{_larsStatus = a});
diff --git a/gen/Network/AWS/DeviceFarm/ListDevicePools.hs b/gen/Network/AWS/DeviceFarm/ListDevicePools.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DeviceFarm/ListDevicePools.hs
@@ -0,0 +1,174 @@
+{-# 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.DeviceFarm.ListDevicePools
+-- Copyright   : (c) 2013-2015 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)
+--
+-- Gets information about device pools.
+--
+-- /See:/ <http://docs.aws.amazon.com/devicefarm/latest/APIReference/API_ListDevicePools.html AWS API Reference> for ListDevicePools.
+module Network.AWS.DeviceFarm.ListDevicePools
+    (
+    -- * Creating a Request
+      listDevicePools
+    , ListDevicePools
+    -- * Request Lenses
+    , ldpNextToken
+    , ldpType
+    , ldpArn
+
+    -- * Destructuring the Response
+    , listDevicePoolsResponse
+    , ListDevicePoolsResponse
+    -- * Response Lenses
+    , ldprsDevicePools
+    , ldprsNextToken
+    , ldprsStatus
+    ) where
+
+import           Network.AWS.DeviceFarm.Types
+import           Network.AWS.DeviceFarm.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | Represents the result of a list device pools request.
+--
+-- /See:/ 'listDevicePools' smart constructor.
+data ListDevicePools = ListDevicePools'
+    { _ldpNextToken :: !(Maybe Text)
+    , _ldpType      :: !(Maybe DevicePoolType)
+    , _ldpArn       :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ListDevicePools' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ldpNextToken'
+--
+-- * 'ldpType'
+--
+-- * 'ldpArn'
+listDevicePools
+    :: Text -- ^ 'ldpArn'
+    -> ListDevicePools
+listDevicePools pArn_ =
+    ListDevicePools'
+    { _ldpNextToken = Nothing
+    , _ldpType = Nothing
+    , _ldpArn = pArn_
+    }
+
+-- | An identifier that was returned from the previous call to this
+-- operation, which can be used to return the next set of items in the
+-- list.
+ldpNextToken :: Lens' ListDevicePools (Maybe Text)
+ldpNextToken = lens _ldpNextToken (\ s a -> s{_ldpNextToken = a});
+
+-- | The device pools\' type.
+--
+-- Allowed values include:
+--
+-- -   CURATED: A device pool that is created and managed by AWS Device
+--     Farm.
+--
+-- -   PRIVATE: A device pool that is created and managed by the device
+--     pool developer.
+--
+ldpType :: Lens' ListDevicePools (Maybe DevicePoolType)
+ldpType = lens _ldpType (\ s a -> s{_ldpType = a});
+
+-- | The project ARN.
+ldpArn :: Lens' ListDevicePools Text
+ldpArn = lens _ldpArn (\ s a -> s{_ldpArn = a});
+
+instance AWSRequest ListDevicePools where
+        type Sv ListDevicePools = DeviceFarm
+        type Rs ListDevicePools = ListDevicePoolsResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 ListDevicePoolsResponse' <$>
+                   (x .?> "devicePools" .!@ mempty) <*>
+                     (x .?> "nextToken")
+                     <*> (pure (fromEnum s)))
+
+instance ToHeaders ListDevicePools where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DeviceFarm_20150623.ListDevicePools" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON ListDevicePools where
+        toJSON ListDevicePools'{..}
+          = object
+              ["nextToken" .= _ldpNextToken, "type" .= _ldpType,
+               "arn" .= _ldpArn]
+
+instance ToPath ListDevicePools where
+        toPath = const "/"
+
+instance ToQuery ListDevicePools where
+        toQuery = const mempty
+
+-- | Represents the result of a list device pools request.
+--
+-- /See:/ 'listDevicePoolsResponse' smart constructor.
+data ListDevicePoolsResponse = ListDevicePoolsResponse'
+    { _ldprsDevicePools :: !(Maybe [DevicePool])
+    , _ldprsNextToken   :: !(Maybe Text)
+    , _ldprsStatus      :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ListDevicePoolsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ldprsDevicePools'
+--
+-- * 'ldprsNextToken'
+--
+-- * 'ldprsStatus'
+listDevicePoolsResponse
+    :: Int -- ^ 'ldprsStatus'
+    -> ListDevicePoolsResponse
+listDevicePoolsResponse pStatus_ =
+    ListDevicePoolsResponse'
+    { _ldprsDevicePools = Nothing
+    , _ldprsNextToken = Nothing
+    , _ldprsStatus = pStatus_
+    }
+
+-- | Information about the device pools.
+ldprsDevicePools :: Lens' ListDevicePoolsResponse [DevicePool]
+ldprsDevicePools = lens _ldprsDevicePools (\ s a -> s{_ldprsDevicePools = a}) . _Default . _Coerce;
+
+-- | If the number of items that are returned is significantly large, this is
+-- an identifier that is also returned, which can be used in a subsequent
+-- call to this operation to return the next set of items in the list.
+ldprsNextToken :: Lens' ListDevicePoolsResponse (Maybe Text)
+ldprsNextToken = lens _ldprsNextToken (\ s a -> s{_ldprsNextToken = a});
+
+-- | The response status code.
+ldprsStatus :: Lens' ListDevicePoolsResponse Int
+ldprsStatus = lens _ldprsStatus (\ s a -> s{_ldprsStatus = a});
diff --git a/gen/Network/AWS/DeviceFarm/ListDevices.hs b/gen/Network/AWS/DeviceFarm/ListDevices.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DeviceFarm/ListDevices.hs
@@ -0,0 +1,152 @@
+{-# 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.DeviceFarm.ListDevices
+-- Copyright   : (c) 2013-2015 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)
+--
+-- Gets information about unique device types.
+--
+-- /See:/ <http://docs.aws.amazon.com/devicefarm/latest/APIReference/API_ListDevices.html AWS API Reference> for ListDevices.
+module Network.AWS.DeviceFarm.ListDevices
+    (
+    -- * Creating a Request
+      listDevices
+    , ListDevices
+    -- * Request Lenses
+    , ldArn
+    , ldNextToken
+
+    -- * Destructuring the Response
+    , listDevicesResponse
+    , ListDevicesResponse
+    -- * Response Lenses
+    , ldrsNextToken
+    , ldrsDevices
+    , ldrsStatus
+    ) where
+
+import           Network.AWS.DeviceFarm.Types
+import           Network.AWS.DeviceFarm.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | Represents the result of a list devices request.
+--
+-- /See:/ 'listDevices' smart constructor.
+data ListDevices = ListDevices'
+    { _ldArn       :: !(Maybe Text)
+    , _ldNextToken :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ListDevices' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ldArn'
+--
+-- * 'ldNextToken'
+listDevices
+    :: ListDevices
+listDevices =
+    ListDevices'
+    { _ldArn = Nothing
+    , _ldNextToken = Nothing
+    }
+
+-- | The device types\' ARNs.
+ldArn :: Lens' ListDevices (Maybe Text)
+ldArn = lens _ldArn (\ s a -> s{_ldArn = a});
+
+-- | An identifier that was returned from the previous call to this
+-- operation, which can be used to return the next set of items in the
+-- list.
+ldNextToken :: Lens' ListDevices (Maybe Text)
+ldNextToken = lens _ldNextToken (\ s a -> s{_ldNextToken = a});
+
+instance AWSRequest ListDevices where
+        type Sv ListDevices = DeviceFarm
+        type Rs ListDevices = ListDevicesResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 ListDevicesResponse' <$>
+                   (x .?> "nextToken") <*> (x .?> "devices" .!@ mempty)
+                     <*> (pure (fromEnum s)))
+
+instance ToHeaders ListDevices where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DeviceFarm_20150623.ListDevices" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON ListDevices where
+        toJSON ListDevices'{..}
+          = object
+              ["arn" .= _ldArn, "nextToken" .= _ldNextToken]
+
+instance ToPath ListDevices where
+        toPath = const "/"
+
+instance ToQuery ListDevices where
+        toQuery = const mempty
+
+-- | Represents the result of a list devices operation.
+--
+-- /See:/ 'listDevicesResponse' smart constructor.
+data ListDevicesResponse = ListDevicesResponse'
+    { _ldrsNextToken :: !(Maybe Text)
+    , _ldrsDevices   :: !(Maybe [Device])
+    , _ldrsStatus    :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ListDevicesResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ldrsNextToken'
+--
+-- * 'ldrsDevices'
+--
+-- * 'ldrsStatus'
+listDevicesResponse
+    :: Int -- ^ 'ldrsStatus'
+    -> ListDevicesResponse
+listDevicesResponse pStatus_ =
+    ListDevicesResponse'
+    { _ldrsNextToken = Nothing
+    , _ldrsDevices = Nothing
+    , _ldrsStatus = pStatus_
+    }
+
+-- | If the number of items that are returned is significantly large, this is
+-- an identifier that is also returned, which can be used in a subsequent
+-- call to this operation to return the next set of items in the list.
+ldrsNextToken :: Lens' ListDevicesResponse (Maybe Text)
+ldrsNextToken = lens _ldrsNextToken (\ s a -> s{_ldrsNextToken = a});
+
+-- | Information about the devices.
+ldrsDevices :: Lens' ListDevicesResponse [Device]
+ldrsDevices = lens _ldrsDevices (\ s a -> s{_ldrsDevices = a}) . _Default . _Coerce;
+
+-- | The response status code.
+ldrsStatus :: Lens' ListDevicesResponse Int
+ldrsStatus = lens _ldrsStatus (\ s a -> s{_ldrsStatus = a});
diff --git a/gen/Network/AWS/DeviceFarm/ListJobs.hs b/gen/Network/AWS/DeviceFarm/ListJobs.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DeviceFarm/ListJobs.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.DeviceFarm.ListJobs
+-- Copyright   : (c) 2013-2015 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)
+--
+-- Gets information about jobs.
+--
+-- /See:/ <http://docs.aws.amazon.com/devicefarm/latest/APIReference/API_ListJobs.html AWS API Reference> for ListJobs.
+module Network.AWS.DeviceFarm.ListJobs
+    (
+    -- * Creating a Request
+      listJobs
+    , ListJobs
+    -- * Request Lenses
+    , ljNextToken
+    , ljArn
+
+    -- * Destructuring the Response
+    , listJobsResponse
+    , ListJobsResponse
+    -- * Response Lenses
+    , ljrsJobs
+    , ljrsNextToken
+    , ljrsStatus
+    ) where
+
+import           Network.AWS.DeviceFarm.Types
+import           Network.AWS.DeviceFarm.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | Represents a request to the list jobs operation.
+--
+-- /See:/ 'listJobs' smart constructor.
+data ListJobs = ListJobs'
+    { _ljNextToken :: !(Maybe Text)
+    , _ljArn       :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ListJobs' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ljNextToken'
+--
+-- * 'ljArn'
+listJobs
+    :: Text -- ^ 'ljArn'
+    -> ListJobs
+listJobs pArn_ =
+    ListJobs'
+    { _ljNextToken = Nothing
+    , _ljArn = pArn_
+    }
+
+-- | An identifier that was returned from the previous call to this
+-- operation, which can be used to return the next set of items in the
+-- list.
+ljNextToken :: Lens' ListJobs (Maybe Text)
+ljNextToken = lens _ljNextToken (\ s a -> s{_ljNextToken = a});
+
+-- | The jobs\' ARNs.
+ljArn :: Lens' ListJobs Text
+ljArn = lens _ljArn (\ s a -> s{_ljArn = a});
+
+instance AWSRequest ListJobs where
+        type Sv ListJobs = DeviceFarm
+        type Rs ListJobs = ListJobsResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 ListJobsResponse' <$>
+                   (x .?> "jobs" .!@ mempty) <*> (x .?> "nextToken") <*>
+                     (pure (fromEnum s)))
+
+instance ToHeaders ListJobs where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DeviceFarm_20150623.ListJobs" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON ListJobs where
+        toJSON ListJobs'{..}
+          = object
+              ["nextToken" .= _ljNextToken, "arn" .= _ljArn]
+
+instance ToPath ListJobs where
+        toPath = const "/"
+
+instance ToQuery ListJobs where
+        toQuery = const mempty
+
+-- | Represents the result of a list jobs request.
+--
+-- /See:/ 'listJobsResponse' smart constructor.
+data ListJobsResponse = ListJobsResponse'
+    { _ljrsJobs      :: !(Maybe [Job])
+    , _ljrsNextToken :: !(Maybe Text)
+    , _ljrsStatus    :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ListJobsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ljrsJobs'
+--
+-- * 'ljrsNextToken'
+--
+-- * 'ljrsStatus'
+listJobsResponse
+    :: Int -- ^ 'ljrsStatus'
+    -> ListJobsResponse
+listJobsResponse pStatus_ =
+    ListJobsResponse'
+    { _ljrsJobs = Nothing
+    , _ljrsNextToken = Nothing
+    , _ljrsStatus = pStatus_
+    }
+
+-- | Information about the jobs.
+ljrsJobs :: Lens' ListJobsResponse [Job]
+ljrsJobs = lens _ljrsJobs (\ s a -> s{_ljrsJobs = a}) . _Default . _Coerce;
+
+-- | If the number of items that are returned is significantly large, this is
+-- an identifier that is also returned, which can be used in a subsequent
+-- call to this operation to return the next set of items in the list.
+ljrsNextToken :: Lens' ListJobsResponse (Maybe Text)
+ljrsNextToken = lens _ljrsNextToken (\ s a -> s{_ljrsNextToken = a});
+
+-- | The response status code.
+ljrsStatus :: Lens' ListJobsResponse Int
+ljrsStatus = lens _ljrsStatus (\ s a -> s{_ljrsStatus = a});
diff --git a/gen/Network/AWS/DeviceFarm/ListProjects.hs b/gen/Network/AWS/DeviceFarm/ListProjects.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DeviceFarm/ListProjects.hs
@@ -0,0 +1,152 @@
+{-# 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.DeviceFarm.ListProjects
+-- Copyright   : (c) 2013-2015 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)
+--
+-- Gets information about projects.
+--
+-- /See:/ <http://docs.aws.amazon.com/devicefarm/latest/APIReference/API_ListProjects.html AWS API Reference> for ListProjects.
+module Network.AWS.DeviceFarm.ListProjects
+    (
+    -- * Creating a Request
+      listProjects
+    , ListProjects
+    -- * Request Lenses
+    , lpArn
+    , lpNextToken
+
+    -- * Destructuring the Response
+    , listProjectsResponse
+    , ListProjectsResponse
+    -- * Response Lenses
+    , lprsNextToken
+    , lprsProjects
+    , lprsStatus
+    ) where
+
+import           Network.AWS.DeviceFarm.Types
+import           Network.AWS.DeviceFarm.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | Represents a request to the list projects operation.
+--
+-- /See:/ 'listProjects' smart constructor.
+data ListProjects = ListProjects'
+    { _lpArn       :: !(Maybe Text)
+    , _lpNextToken :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ListProjects' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'lpArn'
+--
+-- * 'lpNextToken'
+listProjects
+    :: ListProjects
+listProjects =
+    ListProjects'
+    { _lpArn = Nothing
+    , _lpNextToken = Nothing
+    }
+
+-- | The projects\' ARNs.
+lpArn :: Lens' ListProjects (Maybe Text)
+lpArn = lens _lpArn (\ s a -> s{_lpArn = a});
+
+-- | An identifier that was returned from the previous call to this
+-- operation, which can be used to return the next set of items in the
+-- list.
+lpNextToken :: Lens' ListProjects (Maybe Text)
+lpNextToken = lens _lpNextToken (\ s a -> s{_lpNextToken = a});
+
+instance AWSRequest ListProjects where
+        type Sv ListProjects = DeviceFarm
+        type Rs ListProjects = ListProjectsResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 ListProjectsResponse' <$>
+                   (x .?> "nextToken") <*> (x .?> "projects" .!@ mempty)
+                     <*> (pure (fromEnum s)))
+
+instance ToHeaders ListProjects where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DeviceFarm_20150623.ListProjects" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON ListProjects where
+        toJSON ListProjects'{..}
+          = object
+              ["arn" .= _lpArn, "nextToken" .= _lpNextToken]
+
+instance ToPath ListProjects where
+        toPath = const "/"
+
+instance ToQuery ListProjects where
+        toQuery = const mempty
+
+-- | Represents the result of a list projects request.
+--
+-- /See:/ 'listProjectsResponse' smart constructor.
+data ListProjectsResponse = ListProjectsResponse'
+    { _lprsNextToken :: !(Maybe Text)
+    , _lprsProjects  :: !(Maybe [Project])
+    , _lprsStatus    :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ListProjectsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'lprsNextToken'
+--
+-- * 'lprsProjects'
+--
+-- * 'lprsStatus'
+listProjectsResponse
+    :: Int -- ^ 'lprsStatus'
+    -> ListProjectsResponse
+listProjectsResponse pStatus_ =
+    ListProjectsResponse'
+    { _lprsNextToken = Nothing
+    , _lprsProjects = Nothing
+    , _lprsStatus = pStatus_
+    }
+
+-- | If the number of items that are returned is significantly large, this is
+-- an identifier that is also returned, which can be used in a subsequent
+-- call to this operation to return the next set of items in the list.
+lprsNextToken :: Lens' ListProjectsResponse (Maybe Text)
+lprsNextToken = lens _lprsNextToken (\ s a -> s{_lprsNextToken = a});
+
+-- | Information about the projects.
+lprsProjects :: Lens' ListProjectsResponse [Project]
+lprsProjects = lens _lprsProjects (\ s a -> s{_lprsProjects = a}) . _Default . _Coerce;
+
+-- | The response status code.
+lprsStatus :: Lens' ListProjectsResponse Int
+lprsStatus = lens _lprsStatus (\ s a -> s{_lprsStatus = a});
diff --git a/gen/Network/AWS/DeviceFarm/ListRuns.hs b/gen/Network/AWS/DeviceFarm/ListRuns.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DeviceFarm/ListRuns.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.DeviceFarm.ListRuns
+-- Copyright   : (c) 2013-2015 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)
+--
+-- Gets information about runs.
+--
+-- /See:/ <http://docs.aws.amazon.com/devicefarm/latest/APIReference/API_ListRuns.html AWS API Reference> for ListRuns.
+module Network.AWS.DeviceFarm.ListRuns
+    (
+    -- * Creating a Request
+      listRuns
+    , ListRuns
+    -- * Request Lenses
+    , lrNextToken
+    , lrArn
+
+    -- * Destructuring the Response
+    , listRunsResponse
+    , ListRunsResponse
+    -- * Response Lenses
+    , lrrsRuns
+    , lrrsNextToken
+    , lrrsStatus
+    ) where
+
+import           Network.AWS.DeviceFarm.Types
+import           Network.AWS.DeviceFarm.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | Represents a request to the list runs operation.
+--
+-- /See:/ 'listRuns' smart constructor.
+data ListRuns = ListRuns'
+    { _lrNextToken :: !(Maybe Text)
+    , _lrArn       :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ListRuns' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'lrNextToken'
+--
+-- * 'lrArn'
+listRuns
+    :: Text -- ^ 'lrArn'
+    -> ListRuns
+listRuns pArn_ =
+    ListRuns'
+    { _lrNextToken = Nothing
+    , _lrArn = pArn_
+    }
+
+-- | An identifier that was returned from the previous call to this
+-- operation, which can be used to return the next set of items in the
+-- list.
+lrNextToken :: Lens' ListRuns (Maybe Text)
+lrNextToken = lens _lrNextToken (\ s a -> s{_lrNextToken = a});
+
+-- | The runs\' ARNs.
+lrArn :: Lens' ListRuns Text
+lrArn = lens _lrArn (\ s a -> s{_lrArn = a});
+
+instance AWSRequest ListRuns where
+        type Sv ListRuns = DeviceFarm
+        type Rs ListRuns = ListRunsResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 ListRunsResponse' <$>
+                   (x .?> "runs" .!@ mempty) <*> (x .?> "nextToken") <*>
+                     (pure (fromEnum s)))
+
+instance ToHeaders ListRuns where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DeviceFarm_20150623.ListRuns" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON ListRuns where
+        toJSON ListRuns'{..}
+          = object
+              ["nextToken" .= _lrNextToken, "arn" .= _lrArn]
+
+instance ToPath ListRuns where
+        toPath = const "/"
+
+instance ToQuery ListRuns where
+        toQuery = const mempty
+
+-- | Represents the result of a list runs request.
+--
+-- /See:/ 'listRunsResponse' smart constructor.
+data ListRunsResponse = ListRunsResponse'
+    { _lrrsRuns      :: !(Maybe [Run])
+    , _lrrsNextToken :: !(Maybe Text)
+    , _lrrsStatus    :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ListRunsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'lrrsRuns'
+--
+-- * 'lrrsNextToken'
+--
+-- * 'lrrsStatus'
+listRunsResponse
+    :: Int -- ^ 'lrrsStatus'
+    -> ListRunsResponse
+listRunsResponse pStatus_ =
+    ListRunsResponse'
+    { _lrrsRuns = Nothing
+    , _lrrsNextToken = Nothing
+    , _lrrsStatus = pStatus_
+    }
+
+-- | Information about the runs.
+lrrsRuns :: Lens' ListRunsResponse [Run]
+lrrsRuns = lens _lrrsRuns (\ s a -> s{_lrrsRuns = a}) . _Default . _Coerce;
+
+-- | If the number of items that are returned is significantly large, this is
+-- an identifier that is also returned, which can be used in a subsequent
+-- call to this operation to return the next set of items in the list.
+lrrsNextToken :: Lens' ListRunsResponse (Maybe Text)
+lrrsNextToken = lens _lrrsNextToken (\ s a -> s{_lrrsNextToken = a});
+
+-- | The response status code.
+lrrsStatus :: Lens' ListRunsResponse Int
+lrrsStatus = lens _lrrsStatus (\ s a -> s{_lrrsStatus = a});
diff --git a/gen/Network/AWS/DeviceFarm/ListSamples.hs b/gen/Network/AWS/DeviceFarm/ListSamples.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DeviceFarm/ListSamples.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.DeviceFarm.ListSamples
+-- Copyright   : (c) 2013-2015 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)
+--
+-- Gets information about samples.
+--
+-- /See:/ <http://docs.aws.amazon.com/devicefarm/latest/APIReference/API_ListSamples.html AWS API Reference> for ListSamples.
+module Network.AWS.DeviceFarm.ListSamples
+    (
+    -- * Creating a Request
+      listSamples
+    , ListSamples
+    -- * Request Lenses
+    , lsNextToken
+    , lsArn
+
+    -- * Destructuring the Response
+    , listSamplesResponse
+    , ListSamplesResponse
+    -- * Response Lenses
+    , lsrsNextToken
+    , lsrsSamples
+    , lsrsStatus
+    ) where
+
+import           Network.AWS.DeviceFarm.Types
+import           Network.AWS.DeviceFarm.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | Represents a request to the list samples operation.
+--
+-- /See:/ 'listSamples' smart constructor.
+data ListSamples = ListSamples'
+    { _lsNextToken :: !(Maybe Text)
+    , _lsArn       :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ListSamples' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'lsNextToken'
+--
+-- * 'lsArn'
+listSamples
+    :: Text -- ^ 'lsArn'
+    -> ListSamples
+listSamples pArn_ =
+    ListSamples'
+    { _lsNextToken = Nothing
+    , _lsArn = pArn_
+    }
+
+-- | An identifier that was returned from the previous call to this
+-- operation, which can be used to return the next set of items in the
+-- list.
+lsNextToken :: Lens' ListSamples (Maybe Text)
+lsNextToken = lens _lsNextToken (\ s a -> s{_lsNextToken = a});
+
+-- | The samples\' ARNs.
+lsArn :: Lens' ListSamples Text
+lsArn = lens _lsArn (\ s a -> s{_lsArn = a});
+
+instance AWSRequest ListSamples where
+        type Sv ListSamples = DeviceFarm
+        type Rs ListSamples = ListSamplesResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 ListSamplesResponse' <$>
+                   (x .?> "nextToken") <*> (x .?> "samples" .!@ mempty)
+                     <*> (pure (fromEnum s)))
+
+instance ToHeaders ListSamples where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DeviceFarm_20150623.ListSamples" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON ListSamples where
+        toJSON ListSamples'{..}
+          = object
+              ["nextToken" .= _lsNextToken, "arn" .= _lsArn]
+
+instance ToPath ListSamples where
+        toPath = const "/"
+
+instance ToQuery ListSamples where
+        toQuery = const mempty
+
+-- | Represents the result of a list samples request.
+--
+-- /See:/ 'listSamplesResponse' smart constructor.
+data ListSamplesResponse = ListSamplesResponse'
+    { _lsrsNextToken :: !(Maybe Text)
+    , _lsrsSamples   :: !(Maybe [Sample])
+    , _lsrsStatus    :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ListSamplesResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'lsrsNextToken'
+--
+-- * 'lsrsSamples'
+--
+-- * 'lsrsStatus'
+listSamplesResponse
+    :: Int -- ^ 'lsrsStatus'
+    -> ListSamplesResponse
+listSamplesResponse pStatus_ =
+    ListSamplesResponse'
+    { _lsrsNextToken = Nothing
+    , _lsrsSamples = Nothing
+    , _lsrsStatus = pStatus_
+    }
+
+-- | If the number of items that are returned is significantly large, this is
+-- an identifier that is also returned, which can be used in a subsequent
+-- call to this operation to return the next set of items in the list.
+lsrsNextToken :: Lens' ListSamplesResponse (Maybe Text)
+lsrsNextToken = lens _lsrsNextToken (\ s a -> s{_lsrsNextToken = a});
+
+-- | Information about the samples.
+lsrsSamples :: Lens' ListSamplesResponse [Sample]
+lsrsSamples = lens _lsrsSamples (\ s a -> s{_lsrsSamples = a}) . _Default . _Coerce;
+
+-- | The response status code.
+lsrsStatus :: Lens' ListSamplesResponse Int
+lsrsStatus = lens _lsrsStatus (\ s a -> s{_lsrsStatus = a});
diff --git a/gen/Network/AWS/DeviceFarm/ListSuites.hs b/gen/Network/AWS/DeviceFarm/ListSuites.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DeviceFarm/ListSuites.hs
@@ -0,0 +1,152 @@
+{-# 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.DeviceFarm.ListSuites
+-- Copyright   : (c) 2013-2015 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)
+--
+-- Gets information about suites.
+--
+-- /See:/ <http://docs.aws.amazon.com/devicefarm/latest/APIReference/API_ListSuites.html AWS API Reference> for ListSuites.
+module Network.AWS.DeviceFarm.ListSuites
+    (
+    -- * Creating a Request
+      listSuites
+    , ListSuites
+    -- * Request Lenses
+    , lNextToken
+    , lArn
+
+    -- * Destructuring the Response
+    , listSuitesResponse
+    , ListSuitesResponse
+    -- * Response Lenses
+    , lrsNextToken
+    , lrsSuites
+    , lrsStatus
+    ) where
+
+import           Network.AWS.DeviceFarm.Types
+import           Network.AWS.DeviceFarm.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | Represents a request to the list suites operation.
+--
+-- /See:/ 'listSuites' smart constructor.
+data ListSuites = ListSuites'
+    { _lNextToken :: !(Maybe Text)
+    , _lArn       :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ListSuites' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'lNextToken'
+--
+-- * 'lArn'
+listSuites
+    :: Text -- ^ 'lArn'
+    -> ListSuites
+listSuites pArn_ =
+    ListSuites'
+    { _lNextToken = Nothing
+    , _lArn = pArn_
+    }
+
+-- | An identifier that was returned from the previous call to this
+-- operation, which can be used to return the next set of items in the
+-- list.
+lNextToken :: Lens' ListSuites (Maybe Text)
+lNextToken = lens _lNextToken (\ s a -> s{_lNextToken = a});
+
+-- | The suites\' ARNs.
+lArn :: Lens' ListSuites Text
+lArn = lens _lArn (\ s a -> s{_lArn = a});
+
+instance AWSRequest ListSuites where
+        type Sv ListSuites = DeviceFarm
+        type Rs ListSuites = ListSuitesResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 ListSuitesResponse' <$>
+                   (x .?> "nextToken") <*> (x .?> "suites" .!@ mempty)
+                     <*> (pure (fromEnum s)))
+
+instance ToHeaders ListSuites where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DeviceFarm_20150623.ListSuites" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON ListSuites where
+        toJSON ListSuites'{..}
+          = object ["nextToken" .= _lNextToken, "arn" .= _lArn]
+
+instance ToPath ListSuites where
+        toPath = const "/"
+
+instance ToQuery ListSuites where
+        toQuery = const mempty
+
+-- | Represents the result of a list suites request.
+--
+-- /See:/ 'listSuitesResponse' smart constructor.
+data ListSuitesResponse = ListSuitesResponse'
+    { _lrsNextToken :: !(Maybe Text)
+    , _lrsSuites    :: !(Maybe [Suite])
+    , _lrsStatus    :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ListSuitesResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'lrsNextToken'
+--
+-- * 'lrsSuites'
+--
+-- * 'lrsStatus'
+listSuitesResponse
+    :: Int -- ^ 'lrsStatus'
+    -> ListSuitesResponse
+listSuitesResponse pStatus_ =
+    ListSuitesResponse'
+    { _lrsNextToken = Nothing
+    , _lrsSuites = Nothing
+    , _lrsStatus = pStatus_
+    }
+
+-- | If the number of items that are returned is significantly large, this is
+-- an identifier that is also returned, which can be used in a subsequent
+-- call to this operation to return the next set of items in the list.
+lrsNextToken :: Lens' ListSuitesResponse (Maybe Text)
+lrsNextToken = lens _lrsNextToken (\ s a -> s{_lrsNextToken = a});
+
+-- | Information about the suites.
+lrsSuites :: Lens' ListSuitesResponse [Suite]
+lrsSuites = lens _lrsSuites (\ s a -> s{_lrsSuites = a}) . _Default . _Coerce;
+
+-- | The response status code.
+lrsStatus :: Lens' ListSuitesResponse Int
+lrsStatus = lens _lrsStatus (\ s a -> s{_lrsStatus = a});
diff --git a/gen/Network/AWS/DeviceFarm/ListTests.hs b/gen/Network/AWS/DeviceFarm/ListTests.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DeviceFarm/ListTests.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.DeviceFarm.ListTests
+-- Copyright   : (c) 2013-2015 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)
+--
+-- Gets information about tests.
+--
+-- /See:/ <http://docs.aws.amazon.com/devicefarm/latest/APIReference/API_ListTests.html AWS API Reference> for ListTests.
+module Network.AWS.DeviceFarm.ListTests
+    (
+    -- * Creating a Request
+      listTests
+    , ListTests
+    -- * Request Lenses
+    , ltNextToken
+    , ltArn
+
+    -- * Destructuring the Response
+    , listTestsResponse
+    , ListTestsResponse
+    -- * Response Lenses
+    , ltrsTests
+    , ltrsNextToken
+    , ltrsStatus
+    ) where
+
+import           Network.AWS.DeviceFarm.Types
+import           Network.AWS.DeviceFarm.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | Represents a request to the list tests operation.
+--
+-- /See:/ 'listTests' smart constructor.
+data ListTests = ListTests'
+    { _ltNextToken :: !(Maybe Text)
+    , _ltArn       :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ListTests' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ltNextToken'
+--
+-- * 'ltArn'
+listTests
+    :: Text -- ^ 'ltArn'
+    -> ListTests
+listTests pArn_ =
+    ListTests'
+    { _ltNextToken = Nothing
+    , _ltArn = pArn_
+    }
+
+-- | An identifier that was returned from the previous call to this
+-- operation, which can be used to return the next set of items in the
+-- list.
+ltNextToken :: Lens' ListTests (Maybe Text)
+ltNextToken = lens _ltNextToken (\ s a -> s{_ltNextToken = a});
+
+-- | The tests\' ARNs.
+ltArn :: Lens' ListTests Text
+ltArn = lens _ltArn (\ s a -> s{_ltArn = a});
+
+instance AWSRequest ListTests where
+        type Sv ListTests = DeviceFarm
+        type Rs ListTests = ListTestsResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 ListTestsResponse' <$>
+                   (x .?> "tests" .!@ mempty) <*> (x .?> "nextToken")
+                     <*> (pure (fromEnum s)))
+
+instance ToHeaders ListTests where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DeviceFarm_20150623.ListTests" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON ListTests where
+        toJSON ListTests'{..}
+          = object
+              ["nextToken" .= _ltNextToken, "arn" .= _ltArn]
+
+instance ToPath ListTests where
+        toPath = const "/"
+
+instance ToQuery ListTests where
+        toQuery = const mempty
+
+-- | Represents the result of a list tests request.
+--
+-- /See:/ 'listTestsResponse' smart constructor.
+data ListTestsResponse = ListTestsResponse'
+    { _ltrsTests     :: !(Maybe [Test])
+    , _ltrsNextToken :: !(Maybe Text)
+    , _ltrsStatus    :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ListTestsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ltrsTests'
+--
+-- * 'ltrsNextToken'
+--
+-- * 'ltrsStatus'
+listTestsResponse
+    :: Int -- ^ 'ltrsStatus'
+    -> ListTestsResponse
+listTestsResponse pStatus_ =
+    ListTestsResponse'
+    { _ltrsTests = Nothing
+    , _ltrsNextToken = Nothing
+    , _ltrsStatus = pStatus_
+    }
+
+-- | Information about the tests.
+ltrsTests :: Lens' ListTestsResponse [Test]
+ltrsTests = lens _ltrsTests (\ s a -> s{_ltrsTests = a}) . _Default . _Coerce;
+
+-- | If the number of items that are returned is significantly large, this is
+-- an identifier that is also returned, which can be used in a subsequent
+-- call to this operation to return the next set of items in the list.
+ltrsNextToken :: Lens' ListTestsResponse (Maybe Text)
+ltrsNextToken = lens _ltrsNextToken (\ s a -> s{_ltrsNextToken = a});
+
+-- | The response status code.
+ltrsStatus :: Lens' ListTestsResponse Int
+ltrsStatus = lens _ltrsStatus (\ s a -> s{_ltrsStatus = a});
diff --git a/gen/Network/AWS/DeviceFarm/ListUniqueProblems.hs b/gen/Network/AWS/DeviceFarm/ListUniqueProblems.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DeviceFarm/ListUniqueProblems.hs
@@ -0,0 +1,173 @@
+{-# 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.DeviceFarm.ListUniqueProblems
+-- Copyright   : (c) 2013-2015 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)
+--
+-- Gets information about unique problems.
+--
+-- /See:/ <http://docs.aws.amazon.com/devicefarm/latest/APIReference/API_ListUniqueProblems.html AWS API Reference> for ListUniqueProblems.
+module Network.AWS.DeviceFarm.ListUniqueProblems
+    (
+    -- * Creating a Request
+      listUniqueProblems
+    , ListUniqueProblems
+    -- * Request Lenses
+    , lupNextToken
+    , lupArn
+
+    -- * Destructuring the Response
+    , listUniqueProblemsResponse
+    , ListUniqueProblemsResponse
+    -- * Response Lenses
+    , luprsNextToken
+    , luprsUniqueProblems
+    , luprsStatus
+    ) where
+
+import           Network.AWS.DeviceFarm.Types
+import           Network.AWS.DeviceFarm.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | Represents a request to the list unique problems operation.
+--
+-- /See:/ 'listUniqueProblems' smart constructor.
+data ListUniqueProblems = ListUniqueProblems'
+    { _lupNextToken :: !(Maybe Text)
+    , _lupArn       :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ListUniqueProblems' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'lupNextToken'
+--
+-- * 'lupArn'
+listUniqueProblems
+    :: Text -- ^ 'lupArn'
+    -> ListUniqueProblems
+listUniqueProblems pArn_ =
+    ListUniqueProblems'
+    { _lupNextToken = Nothing
+    , _lupArn = pArn_
+    }
+
+-- | An identifier that was returned from the previous call to this
+-- operation, which can be used to return the next set of items in the
+-- list.
+lupNextToken :: Lens' ListUniqueProblems (Maybe Text)
+lupNextToken = lens _lupNextToken (\ s a -> s{_lupNextToken = a});
+
+-- | The unique problems\' ARNs.
+lupArn :: Lens' ListUniqueProblems Text
+lupArn = lens _lupArn (\ s a -> s{_lupArn = a});
+
+instance AWSRequest ListUniqueProblems where
+        type Sv ListUniqueProblems = DeviceFarm
+        type Rs ListUniqueProblems =
+             ListUniqueProblemsResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 ListUniqueProblemsResponse' <$>
+                   (x .?> "nextToken") <*>
+                     (x .?> "uniqueProblems" .!@ mempty)
+                     <*> (pure (fromEnum s)))
+
+instance ToHeaders ListUniqueProblems where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DeviceFarm_20150623.ListUniqueProblems" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON ListUniqueProblems where
+        toJSON ListUniqueProblems'{..}
+          = object
+              ["nextToken" .= _lupNextToken, "arn" .= _lupArn]
+
+instance ToPath ListUniqueProblems where
+        toPath = const "/"
+
+instance ToQuery ListUniqueProblems where
+        toQuery = const mempty
+
+-- | Represents the result of a list unique problems request.
+--
+-- /See:/ 'listUniqueProblemsResponse' smart constructor.
+data ListUniqueProblemsResponse = ListUniqueProblemsResponse'
+    { _luprsNextToken      :: !(Maybe Text)
+    , _luprsUniqueProblems :: !(Maybe (Map ExecutionResult [UniqueProblem]))
+    , _luprsStatus         :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ListUniqueProblemsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'luprsNextToken'
+--
+-- * 'luprsUniqueProblems'
+--
+-- * 'luprsStatus'
+listUniqueProblemsResponse
+    :: Int -- ^ 'luprsStatus'
+    -> ListUniqueProblemsResponse
+listUniqueProblemsResponse pStatus_ =
+    ListUniqueProblemsResponse'
+    { _luprsNextToken = Nothing
+    , _luprsUniqueProblems = Nothing
+    , _luprsStatus = pStatus_
+    }
+
+-- | If the number of items that are returned is significantly large, this is
+-- an identifier that is also returned, which can be used in a subsequent
+-- call to this operation to return the next set of items in the list.
+luprsNextToken :: Lens' ListUniqueProblemsResponse (Maybe Text)
+luprsNextToken = lens _luprsNextToken (\ s a -> s{_luprsNextToken = a});
+
+-- | Information about the unique problems.
+--
+-- Allowed values include:
+--
+-- -   ERRORED: An error condition.
+--
+-- -   FAILED: A failed condition.
+--
+-- -   SKIPPED: A skipped condition.
+--
+-- -   STOPPED: A stopped condition.
+--
+-- -   PASSED: A passing condition.
+--
+-- -   PENDING: A pending condition.
+--
+-- -   WARNED: A warning condition.
+--
+luprsUniqueProblems :: Lens' ListUniqueProblemsResponse (HashMap ExecutionResult [UniqueProblem])
+luprsUniqueProblems = lens _luprsUniqueProblems (\ s a -> s{_luprsUniqueProblems = a}) . _Default . _Map;
+
+-- | The response status code.
+luprsStatus :: Lens' ListUniqueProblemsResponse Int
+luprsStatus = lens _luprsStatus (\ s a -> s{_luprsStatus = a});
diff --git a/gen/Network/AWS/DeviceFarm/ListUploads.hs b/gen/Network/AWS/DeviceFarm/ListUploads.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DeviceFarm/ListUploads.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.DeviceFarm.ListUploads
+-- Copyright   : (c) 2013-2015 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)
+--
+-- Gets information about uploads.
+--
+-- /See:/ <http://docs.aws.amazon.com/devicefarm/latest/APIReference/API_ListUploads.html AWS API Reference> for ListUploads.
+module Network.AWS.DeviceFarm.ListUploads
+    (
+    -- * Creating a Request
+      listUploads
+    , ListUploads
+    -- * Request Lenses
+    , luNextToken
+    , luArn
+
+    -- * Destructuring the Response
+    , listUploadsResponse
+    , ListUploadsResponse
+    -- * Response Lenses
+    , lursNextToken
+    , lursUploads
+    , lursStatus
+    ) where
+
+import           Network.AWS.DeviceFarm.Types
+import           Network.AWS.DeviceFarm.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | Represents a request to the list uploads operation.
+--
+-- /See:/ 'listUploads' smart constructor.
+data ListUploads = ListUploads'
+    { _luNextToken :: !(Maybe Text)
+    , _luArn       :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ListUploads' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'luNextToken'
+--
+-- * 'luArn'
+listUploads
+    :: Text -- ^ 'luArn'
+    -> ListUploads
+listUploads pArn_ =
+    ListUploads'
+    { _luNextToken = Nothing
+    , _luArn = pArn_
+    }
+
+-- | An identifier that was returned from the previous call to this
+-- operation, which can be used to return the next set of items in the
+-- list.
+luNextToken :: Lens' ListUploads (Maybe Text)
+luNextToken = lens _luNextToken (\ s a -> s{_luNextToken = a});
+
+-- | The uploads\' ARNs.
+luArn :: Lens' ListUploads Text
+luArn = lens _luArn (\ s a -> s{_luArn = a});
+
+instance AWSRequest ListUploads where
+        type Sv ListUploads = DeviceFarm
+        type Rs ListUploads = ListUploadsResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 ListUploadsResponse' <$>
+                   (x .?> "nextToken") <*> (x .?> "uploads" .!@ mempty)
+                     <*> (pure (fromEnum s)))
+
+instance ToHeaders ListUploads where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DeviceFarm_20150623.ListUploads" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON ListUploads where
+        toJSON ListUploads'{..}
+          = object
+              ["nextToken" .= _luNextToken, "arn" .= _luArn]
+
+instance ToPath ListUploads where
+        toPath = const "/"
+
+instance ToQuery ListUploads where
+        toQuery = const mempty
+
+-- | Represents the result of a list uploads request.
+--
+-- /See:/ 'listUploadsResponse' smart constructor.
+data ListUploadsResponse = ListUploadsResponse'
+    { _lursNextToken :: !(Maybe Text)
+    , _lursUploads   :: !(Maybe [Upload])
+    , _lursStatus    :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ListUploadsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'lursNextToken'
+--
+-- * 'lursUploads'
+--
+-- * 'lursStatus'
+listUploadsResponse
+    :: Int -- ^ 'lursStatus'
+    -> ListUploadsResponse
+listUploadsResponse pStatus_ =
+    ListUploadsResponse'
+    { _lursNextToken = Nothing
+    , _lursUploads = Nothing
+    , _lursStatus = pStatus_
+    }
+
+-- | If the number of items that are returned is significantly large, this is
+-- an identifier that is also returned, which can be used in a subsequent
+-- call to this operation to return the next set of items in the list.
+lursNextToken :: Lens' ListUploadsResponse (Maybe Text)
+lursNextToken = lens _lursNextToken (\ s a -> s{_lursNextToken = a});
+
+-- | Information about the uploads.
+lursUploads :: Lens' ListUploadsResponse [Upload]
+lursUploads = lens _lursUploads (\ s a -> s{_lursUploads = a}) . _Default . _Coerce;
+
+-- | The response status code.
+lursStatus :: Lens' ListUploadsResponse Int
+lursStatus = lens _lursStatus (\ s a -> s{_lursStatus = a});
diff --git a/gen/Network/AWS/DeviceFarm/ScheduleRun.hs b/gen/Network/AWS/DeviceFarm/ScheduleRun.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DeviceFarm/ScheduleRun.hs
@@ -0,0 +1,182 @@
+{-# 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.DeviceFarm.ScheduleRun
+-- Copyright   : (c) 2013-2015 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)
+--
+-- Schedules a run.
+--
+-- /See:/ <http://docs.aws.amazon.com/devicefarm/latest/APIReference/API_ScheduleRun.html AWS API Reference> for ScheduleRun.
+module Network.AWS.DeviceFarm.ScheduleRun
+    (
+    -- * Creating a Request
+      scheduleRun
+    , ScheduleRun
+    -- * Request Lenses
+    , srName
+    , srConfiguration
+    , srProjectARN
+    , srAppARN
+    , srDevicePoolARN
+    , srTest
+
+    -- * Destructuring the Response
+    , scheduleRunResponse
+    , ScheduleRunResponse
+    -- * Response Lenses
+    , srrsRun
+    , srrsStatus
+    ) where
+
+import           Network.AWS.DeviceFarm.Types
+import           Network.AWS.DeviceFarm.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | Represents a request to the schedule run operation.
+--
+-- /See:/ 'scheduleRun' smart constructor.
+data ScheduleRun = ScheduleRun'
+    { _srName          :: !(Maybe Text)
+    , _srConfiguration :: !(Maybe ScheduleRunConfiguration)
+    , _srProjectARN    :: !Text
+    , _srAppARN        :: !Text
+    , _srDevicePoolARN :: !Text
+    , _srTest          :: !ScheduleRunTest
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ScheduleRun' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'srName'
+--
+-- * 'srConfiguration'
+--
+-- * 'srProjectARN'
+--
+-- * 'srAppARN'
+--
+-- * 'srDevicePoolARN'
+--
+-- * 'srTest'
+scheduleRun
+    :: Text -- ^ 'srProjectARN'
+    -> Text -- ^ 'srAppARN'
+    -> Text -- ^ 'srDevicePoolARN'
+    -> ScheduleRunTest -- ^ 'srTest'
+    -> ScheduleRun
+scheduleRun pProjectARN_ pAppARN_ pDevicePoolARN_ pTest_ =
+    ScheduleRun'
+    { _srName = Nothing
+    , _srConfiguration = Nothing
+    , _srProjectARN = pProjectARN_
+    , _srAppARN = pAppARN_
+    , _srDevicePoolARN = pDevicePoolARN_
+    , _srTest = pTest_
+    }
+
+-- | The name for the run to be scheduled.
+srName :: Lens' ScheduleRun (Maybe Text)
+srName = lens _srName (\ s a -> s{_srName = a});
+
+-- | Information about the settings for the run to be scheduled.
+srConfiguration :: Lens' ScheduleRun (Maybe ScheduleRunConfiguration)
+srConfiguration = lens _srConfiguration (\ s a -> s{_srConfiguration = a});
+
+-- | The ARN of the project for the run to be scheduled.
+srProjectARN :: Lens' ScheduleRun Text
+srProjectARN = lens _srProjectARN (\ s a -> s{_srProjectARN = a});
+
+-- | The ARN of the app to schedule a run.
+srAppARN :: Lens' ScheduleRun Text
+srAppARN = lens _srAppARN (\ s a -> s{_srAppARN = a});
+
+-- | The ARN of the device pool for the run to be scheduled.
+srDevicePoolARN :: Lens' ScheduleRun Text
+srDevicePoolARN = lens _srDevicePoolARN (\ s a -> s{_srDevicePoolARN = a});
+
+-- | Information about the test for the run to be scheduled.
+srTest :: Lens' ScheduleRun ScheduleRunTest
+srTest = lens _srTest (\ s a -> s{_srTest = a});
+
+instance AWSRequest ScheduleRun where
+        type Sv ScheduleRun = DeviceFarm
+        type Rs ScheduleRun = ScheduleRunResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 ScheduleRunResponse' <$>
+                   (x .?> "run") <*> (pure (fromEnum s)))
+
+instance ToHeaders ScheduleRun where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DeviceFarm_20150623.ScheduleRun" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON ScheduleRun where
+        toJSON ScheduleRun'{..}
+          = object
+              ["name" .= _srName,
+               "configuration" .= _srConfiguration,
+               "projectArn" .= _srProjectARN, "appArn" .= _srAppARN,
+               "devicePoolArn" .= _srDevicePoolARN,
+               "test" .= _srTest]
+
+instance ToPath ScheduleRun where
+        toPath = const "/"
+
+instance ToQuery ScheduleRun where
+        toQuery = const mempty
+
+-- | Represents the result of a schedule run request.
+--
+-- /See:/ 'scheduleRunResponse' smart constructor.
+data ScheduleRunResponse = ScheduleRunResponse'
+    { _srrsRun    :: !(Maybe Run)
+    , _srrsStatus :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ScheduleRunResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'srrsRun'
+--
+-- * 'srrsStatus'
+scheduleRunResponse
+    :: Int -- ^ 'srrsStatus'
+    -> ScheduleRunResponse
+scheduleRunResponse pStatus_ =
+    ScheduleRunResponse'
+    { _srrsRun = Nothing
+    , _srrsStatus = pStatus_
+    }
+
+-- | Information about the scheduled run.
+srrsRun :: Lens' ScheduleRunResponse (Maybe Run)
+srrsRun = lens _srrsRun (\ s a -> s{_srrsRun = a});
+
+-- | The response status code.
+srrsStatus :: Lens' ScheduleRunResponse Int
+srrsStatus = lens _srrsStatus (\ s a -> s{_srrsStatus = a});
diff --git a/gen/Network/AWS/DeviceFarm/Types.hs b/gen/Network/AWS/DeviceFarm/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DeviceFarm/Types.hs
@@ -0,0 +1,356 @@
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TypeFamilies      #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.DeviceFarm.Types
+-- Copyright   : (c) 2013-2015 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.DeviceFarm.Types
+    (
+    -- * Service
+      DeviceFarm
+
+    -- * Errors
+    , _IdempotencyException
+    , _NotFoundException
+    , _ArgumentException
+    , _ServiceAccountException
+    , _LimitExceededException
+
+    -- * ArtifactCategory
+    , ArtifactCategory (..)
+
+    -- * ArtifactType
+    , ArtifactType (..)
+
+    -- * BillingMethod
+    , BillingMethod (..)
+
+    -- * DeviceAttribute
+    , DeviceAttribute (..)
+
+    -- * DeviceFormFactor
+    , DeviceFormFactor (..)
+
+    -- * DevicePlatform
+    , DevicePlatform (..)
+
+    -- * DevicePoolType
+    , DevicePoolType (..)
+
+    -- * ExecutionResult
+    , ExecutionResult (..)
+
+    -- * ExecutionStatus
+    , ExecutionStatus (..)
+
+    -- * RuleOperator
+    , RuleOperator (..)
+
+    -- * SampleType
+    , SampleType (..)
+
+    -- * TestType
+    , TestType (..)
+
+    -- * UploadStatus
+    , UploadStatus (..)
+
+    -- * UploadType
+    , UploadType (..)
+
+    -- * AccountSettings
+    , AccountSettings
+    , accountSettings
+    , asAwsAccountNumber
+    , asUnmeteredDevices
+
+    -- * Artifact
+    , Artifact
+    , artifact
+    , aArn
+    , aUrl
+    , aExtension
+    , aName
+    , aType
+
+    -- * CPU
+    , CPU
+    , cpu
+    , cpuFrequency
+    , cpuClock
+    , cpuArchitecture
+
+    -- * Counters
+    , Counters
+    , counters
+    , cPassed
+    , cSkipped
+    , cWarned
+    , cStopped
+    , cTotal
+    , cFailed
+    , cErrored
+
+    -- * Device
+    , Device
+    , device
+    , dCarrier
+    , dImage
+    , dManufacturer
+    , dPlatform
+    , dArn
+    , dFormFactor
+    , dResolution
+    , dMemory
+    , dRadio
+    , dOs
+    , dName
+    , dModel
+    , dCpu
+    , dHeapSize
+
+    -- * DevicePool
+    , DevicePool
+    , devicePool
+    , dpArn
+    , dpRules
+    , dpName
+    , dpType
+    , dpDescription
+
+    -- * DevicePoolCompatibilityResult
+    , DevicePoolCompatibilityResult
+    , devicePoolCompatibilityResult
+    , dpcrDevice
+    , dpcrCompatible
+    , dpcrIncompatibilityMessages
+
+    -- * IncompatibilityMessage
+    , IncompatibilityMessage
+    , incompatibilityMessage
+    , imType
+    , imMessage
+
+    -- * Job
+    , Job
+    , job
+    , jobStatus
+    , jobCounters
+    , jobArn
+    , jobCreated
+    , jobDevice
+    , jobStopped
+    , jobResult
+    , jobName
+    , jobType
+    , jobMessage
+    , jobStarted
+
+    -- * Location
+    , Location
+    , location
+    , lLatitude
+    , lLongitude
+
+    -- * Problem
+    , Problem
+    , problem
+    , pDevice
+    , pTest
+    , pResult
+    , pRun
+    , pJob
+    , pMessage
+    , pSuite
+
+    -- * ProblemDetail
+    , ProblemDetail
+    , problemDetail
+    , pdArn
+    , pdName
+
+    -- * Project
+    , Project
+    , project
+    , pArn
+    , pCreated
+    , pName
+
+    -- * Radios
+    , Radios
+    , radios
+    , rNfc
+    , rGps
+    , rBluetooth
+    , rWifi
+
+    -- * Resolution
+    , Resolution
+    , resolution
+    , rHeight
+    , rWidth
+
+    -- * Rule
+    , Rule
+    , rule
+    , rAttribute
+    , rOperator
+    , rValue
+
+    -- * Run
+    , Run
+    , run
+    , runStatus
+    , runBillingMethod
+    , runCounters
+    , runPlatform
+    , runArn
+    , runCreated
+    , runCompletedJobs
+    , runStopped
+    , runResult
+    , runName
+    , runType
+    , runMessage
+    , runTotalJobs
+    , runStarted
+
+    -- * Sample
+    , Sample
+    , sample
+    , sArn
+    , sUrl
+    , sType
+
+    -- * ScheduleRunConfiguration
+    , ScheduleRunConfiguration
+    , scheduleRunConfiguration
+    , srcBillingMethod
+    , srcRadios
+    , srcLocation
+    , srcLocale
+    , srcNetworkProfileARN
+    , srcExtraDataPackageARN
+    , srcAuxiliaryApps
+
+    -- * ScheduleRunTest
+    , ScheduleRunTest
+    , scheduleRunTest
+    , srtTestPackageARN
+    , srtParameters
+    , srtFilter
+    , srtType
+
+    -- * Suite
+    , Suite
+    , suite
+    , suiStatus
+    , suiCounters
+    , suiArn
+    , suiCreated
+    , suiStopped
+    , suiResult
+    , suiName
+    , suiType
+    , suiMessage
+    , suiStarted
+
+    -- * Test
+    , Test
+    , test
+    , tStatus
+    , tCounters
+    , tArn
+    , tCreated
+    , tStopped
+    , tResult
+    , tName
+    , tType
+    , tMessage
+    , tStarted
+
+    -- * UniqueProblem
+    , UniqueProblem
+    , uniqueProblem
+    , upProblems
+    , upMessage
+
+    -- * Upload
+    , Upload
+    , upload
+    , uStatus
+    , uArn
+    , uCreated
+    , uUrl
+    , uName
+    , uMetadata
+    , uType
+    , uMessage
+    , uContentType
+    ) where
+
+import           Network.AWS.DeviceFarm.Types.Product
+import           Network.AWS.DeviceFarm.Types.Sum
+import           Network.AWS.Prelude
+import           Network.AWS.Sign.V4
+
+-- | Version @2015-06-23@ of the Amazon Device Farm SDK.
+data DeviceFarm
+
+instance AWSService DeviceFarm where
+    type Sg DeviceFarm = V4
+    service = const svc
+      where
+        svc =
+            Service
+            { _svcAbbrev = "DeviceFarm"
+            , _svcPrefix = "devicefarm"
+            , _svcVersion = "2015-06-23"
+            , _svcEndpoint = defaultEndpoint svc
+            , _svcTimeout = Just 70
+            , _svcStatus = statusSuccess
+            , _svcError = parseJSONError
+            , _svcRetry = retry
+            }
+        retry =
+            Exponential
+            { _retryBase = 5.0e-2
+            , _retryGrowth = 2
+            , _retryAttempts = 5
+            , _retryCheck = check
+            }
+        check e
+          | has (hasCode "ThrottlingException" . hasStatus 400) e =
+              Just "throttling_exception"
+          | has (hasCode "Throttling" . hasStatus 400) e = Just "throttling"
+          | has (hasStatus 503) e = Just "service_unavailable"
+          | has (hasStatus 500) e = Just "general_server_error"
+          | has (hasStatus 509) e = Just "limit_exceeded"
+          | otherwise = Nothing
+
+-- | An entity with the same name already exists.
+_IdempotencyException :: AsError a => Getting (First ServiceError) a ServiceError
+_IdempotencyException = _ServiceError . hasCode "IdempotencyException"
+
+-- | The specified entity was not found.
+_NotFoundException :: AsError a => Getting (First ServiceError) a ServiceError
+_NotFoundException = _ServiceError . hasCode "NotFoundException"
+
+-- | An invalid argument was specified.
+_ArgumentException :: AsError a => Getting (First ServiceError) a ServiceError
+_ArgumentException = _ServiceError . hasCode "ArgumentException"
+
+-- | There was a problem with the service account.
+_ServiceAccountException :: AsError a => Getting (First ServiceError) a ServiceError
+_ServiceAccountException = _ServiceError . hasCode "ServiceAccountException"
+
+-- | A limit was exceeded.
+_LimitExceededException :: AsError a => Getting (First ServiceError) a ServiceError
+_LimitExceededException = _ServiceError . hasCode "LimitExceededException"
diff --git a/gen/Network/AWS/DeviceFarm/Types/Product.hs b/gen/Network/AWS/DeviceFarm/Types/Product.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DeviceFarm/Types/Product.hs
@@ -0,0 +1,2159 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.DeviceFarm.Types.Product
+-- Copyright   : (c) 2013-2015 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.DeviceFarm.Types.Product where
+
+import           Network.AWS.DeviceFarm.Types.Sum
+import           Network.AWS.Prelude
+
+-- | A container for account-level settings within AWS Device Farm.
+--
+-- /See:/ 'accountSettings' smart constructor.
+data AccountSettings = AccountSettings'
+    { _asAwsAccountNumber :: !(Maybe Text)
+    , _asUnmeteredDevices :: !(Maybe (Map DevicePlatform Int))
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'AccountSettings' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'asAwsAccountNumber'
+--
+-- * 'asUnmeteredDevices'
+accountSettings
+    :: AccountSettings
+accountSettings =
+    AccountSettings'
+    { _asAwsAccountNumber = Nothing
+    , _asUnmeteredDevices = Nothing
+    }
+
+-- | The AWS account number specified in the 'AccountSettings' container.
+asAwsAccountNumber :: Lens' AccountSettings (Maybe Text)
+asAwsAccountNumber = lens _asAwsAccountNumber (\ s a -> s{_asAwsAccountNumber = a});
+
+-- | Returns the unmetered devices you have purchased.
+asUnmeteredDevices :: Lens' AccountSettings (HashMap DevicePlatform Int)
+asUnmeteredDevices = lens _asUnmeteredDevices (\ s a -> s{_asUnmeteredDevices = a}) . _Default . _Map;
+
+instance FromJSON AccountSettings where
+        parseJSON
+          = withObject "AccountSettings"
+              (\ x ->
+                 AccountSettings' <$>
+                   (x .:? "awsAccountNumber") <*>
+                     (x .:? "unmeteredDevices" .!= mempty))
+
+-- | Represents the output of a test. Examples of artifacts include logs and
+-- screenshots.
+--
+-- /See:/ 'artifact' smart constructor.
+data Artifact = Artifact'
+    { _aArn       :: !(Maybe Text)
+    , _aUrl       :: !(Maybe Text)
+    , _aExtension :: !(Maybe Text)
+    , _aName      :: !(Maybe Text)
+    , _aType      :: !(Maybe ArtifactType)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Artifact' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'aArn'
+--
+-- * 'aUrl'
+--
+-- * 'aExtension'
+--
+-- * 'aName'
+--
+-- * 'aType'
+artifact
+    :: Artifact
+artifact =
+    Artifact'
+    { _aArn = Nothing
+    , _aUrl = Nothing
+    , _aExtension = Nothing
+    , _aName = Nothing
+    , _aType = Nothing
+    }
+
+-- | The artifact\'s ARN.
+aArn :: Lens' Artifact (Maybe Text)
+aArn = lens _aArn (\ s a -> s{_aArn = a});
+
+-- | The pre-signed Amazon S3 URL that can be used with a corresponding GET
+-- request to download the artifact\'s file.
+aUrl :: Lens' Artifact (Maybe Text)
+aUrl = lens _aUrl (\ s a -> s{_aUrl = a});
+
+-- | The artifact\'s file extension.
+aExtension :: Lens' Artifact (Maybe Text)
+aExtension = lens _aExtension (\ s a -> s{_aExtension = a});
+
+-- | The artifact\'s name.
+aName :: Lens' Artifact (Maybe Text)
+aName = lens _aName (\ s a -> s{_aName = a});
+
+-- | The artifact\'s type.
+--
+-- Allowed values include the following:
+--
+-- -   APPIUM_JAVA_OUTPUT: The Appium Java output type.
+--
+-- -   APPIUM_JAVA_XML_OUTPUT: The Appium Java XML output type.
+--
+-- -   APPIUM_SERVER_OUTPUT: The Appium server output type.
+--
+-- -   AUTOMATION_OUTPUT: The automation output type.
+--
+-- -   CALABASH_JSON_OUTPUT: The Calabash JSON output type.
+--
+-- -   CALABASH_JAVA_XML_OUTPUT: The Calabash Java XML output type.
+--
+-- -   CALABASH_PRETTY_OUTPUT: The Calabash pretty output type.
+--
+-- -   CALABASH_STANDARD_OUTPUT: The Calabash standard output type.
+--
+-- -   DEVICE_LOG: The device log type.
+--
+-- -   EXERCISER_MONKEY_OUTPUT: For Android, the artifact (log) generated
+--     by an Android fuzz test.
+--
+-- -   INSTRUMENTATION_OUTPUT: The instrumentation type.
+--
+-- -   MESSAGE_LOG: The message log type.
+--
+-- -   RESULT_LOG: The result log type.
+--
+-- -   SCREENSHOT: The screenshot type.
+--
+-- -   SERVICE_LOG: The service log type.
+--
+-- -   UNKNOWN: An unknown type.
+--
+aType :: Lens' Artifact (Maybe ArtifactType)
+aType = lens _aType (\ s a -> s{_aType = a});
+
+instance FromJSON Artifact where
+        parseJSON
+          = withObject "Artifact"
+              (\ x ->
+                 Artifact' <$>
+                   (x .:? "arn") <*> (x .:? "url") <*>
+                     (x .:? "extension")
+                     <*> (x .:? "name")
+                     <*> (x .:? "type"))
+
+-- | Represents the amount of CPU that an app is using on a physical device.
+--
+-- Note that this does not represent system-wide CPU usage.
+--
+-- /See:/ 'cpu' smart constructor.
+data CPU = CPU'
+    { _cpuFrequency    :: !(Maybe Text)
+    , _cpuClock        :: !(Maybe Double)
+    , _cpuArchitecture :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CPU' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cpuFrequency'
+--
+-- * 'cpuClock'
+--
+-- * 'cpuArchitecture'
+cpu
+    :: CPU
+cpu =
+    CPU'
+    { _cpuFrequency = Nothing
+    , _cpuClock = Nothing
+    , _cpuArchitecture = Nothing
+    }
+
+-- | The CPU\'s frequency.
+cpuFrequency :: Lens' CPU (Maybe Text)
+cpuFrequency = lens _cpuFrequency (\ s a -> s{_cpuFrequency = a});
+
+-- | The clock speed of the device\'s CPU, expressed in hertz (Hz). For
+-- example, a 1.2 GHz CPU is expressed as 1200000000.
+cpuClock :: Lens' CPU (Maybe Double)
+cpuClock = lens _cpuClock (\ s a -> s{_cpuClock = a});
+
+-- | The CPU\'s architecture, for example x86 or ARM.
+cpuArchitecture :: Lens' CPU (Maybe Text)
+cpuArchitecture = lens _cpuArchitecture (\ s a -> s{_cpuArchitecture = a});
+
+instance FromJSON CPU where
+        parseJSON
+          = withObject "CPU"
+              (\ x ->
+                 CPU' <$>
+                   (x .:? "frequency") <*> (x .:? "clock") <*>
+                     (x .:? "architecture"))
+
+-- | Represents entity counters.
+--
+-- /See:/ 'counters' smart constructor.
+data Counters = Counters'
+    { _cPassed  :: !(Maybe Int)
+    , _cSkipped :: !(Maybe Int)
+    , _cWarned  :: !(Maybe Int)
+    , _cStopped :: !(Maybe Int)
+    , _cTotal   :: !(Maybe Int)
+    , _cFailed  :: !(Maybe Int)
+    , _cErrored :: !(Maybe Int)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Counters' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cPassed'
+--
+-- * 'cSkipped'
+--
+-- * 'cWarned'
+--
+-- * 'cStopped'
+--
+-- * 'cTotal'
+--
+-- * 'cFailed'
+--
+-- * 'cErrored'
+counters
+    :: Counters
+counters =
+    Counters'
+    { _cPassed = Nothing
+    , _cSkipped = Nothing
+    , _cWarned = Nothing
+    , _cStopped = Nothing
+    , _cTotal = Nothing
+    , _cFailed = Nothing
+    , _cErrored = Nothing
+    }
+
+-- | The number of passed entities.
+cPassed :: Lens' Counters (Maybe Int)
+cPassed = lens _cPassed (\ s a -> s{_cPassed = a});
+
+-- | The number of skipped entities.
+cSkipped :: Lens' Counters (Maybe Int)
+cSkipped = lens _cSkipped (\ s a -> s{_cSkipped = a});
+
+-- | The number of warned entities.
+cWarned :: Lens' Counters (Maybe Int)
+cWarned = lens _cWarned (\ s a -> s{_cWarned = a});
+
+-- | The number of stopped entities.
+cStopped :: Lens' Counters (Maybe Int)
+cStopped = lens _cStopped (\ s a -> s{_cStopped = a});
+
+-- | The total number of entities.
+cTotal :: Lens' Counters (Maybe Int)
+cTotal = lens _cTotal (\ s a -> s{_cTotal = a});
+
+-- | The number of failed entities.
+cFailed :: Lens' Counters (Maybe Int)
+cFailed = lens _cFailed (\ s a -> s{_cFailed = a});
+
+-- | The number of errored entities.
+cErrored :: Lens' Counters (Maybe Int)
+cErrored = lens _cErrored (\ s a -> s{_cErrored = a});
+
+instance FromJSON Counters where
+        parseJSON
+          = withObject "Counters"
+              (\ x ->
+                 Counters' <$>
+                   (x .:? "passed") <*> (x .:? "skipped") <*>
+                     (x .:? "warned")
+                     <*> (x .:? "stopped")
+                     <*> (x .:? "total")
+                     <*> (x .:? "failed")
+                     <*> (x .:? "errored"))
+
+-- | Represents a device type that an app is tested against.
+--
+-- /See:/ 'device' smart constructor.
+data Device = Device'
+    { _dCarrier      :: !(Maybe Text)
+    , _dImage        :: !(Maybe Text)
+    , _dManufacturer :: !(Maybe Text)
+    , _dPlatform     :: !(Maybe DevicePlatform)
+    , _dArn          :: !(Maybe Text)
+    , _dFormFactor   :: !(Maybe DeviceFormFactor)
+    , _dResolution   :: !(Maybe Resolution)
+    , _dMemory       :: !(Maybe Integer)
+    , _dRadio        :: !(Maybe Text)
+    , _dOs           :: !(Maybe Text)
+    , _dName         :: !(Maybe Text)
+    , _dModel        :: !(Maybe Text)
+    , _dCpu          :: !(Maybe CPU)
+    , _dHeapSize     :: !(Maybe Integer)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Device' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dCarrier'
+--
+-- * 'dImage'
+--
+-- * 'dManufacturer'
+--
+-- * 'dPlatform'
+--
+-- * 'dArn'
+--
+-- * 'dFormFactor'
+--
+-- * 'dResolution'
+--
+-- * 'dMemory'
+--
+-- * 'dRadio'
+--
+-- * 'dOs'
+--
+-- * 'dName'
+--
+-- * 'dModel'
+--
+-- * 'dCpu'
+--
+-- * 'dHeapSize'
+device
+    :: Device
+device =
+    Device'
+    { _dCarrier = Nothing
+    , _dImage = Nothing
+    , _dManufacturer = Nothing
+    , _dPlatform = Nothing
+    , _dArn = Nothing
+    , _dFormFactor = Nothing
+    , _dResolution = Nothing
+    , _dMemory = Nothing
+    , _dRadio = Nothing
+    , _dOs = Nothing
+    , _dName = Nothing
+    , _dModel = Nothing
+    , _dCpu = Nothing
+    , _dHeapSize = Nothing
+    }
+
+-- | The device\'s carrier.
+dCarrier :: Lens' Device (Maybe Text)
+dCarrier = lens _dCarrier (\ s a -> s{_dCarrier = a});
+
+-- | The device\'s image name.
+dImage :: Lens' Device (Maybe Text)
+dImage = lens _dImage (\ s a -> s{_dImage = a});
+
+-- | The device\'s manufacturer name.
+dManufacturer :: Lens' Device (Maybe Text)
+dManufacturer = lens _dManufacturer (\ s a -> s{_dManufacturer = a});
+
+-- | The device\'s platform.
+--
+-- Allowed values include:
+--
+-- -   ANDROID: The Android platform.
+--
+-- -   IOS: The iOS platform.
+--
+dPlatform :: Lens' Device (Maybe DevicePlatform)
+dPlatform = lens _dPlatform (\ s a -> s{_dPlatform = a});
+
+-- | The device\'s ARN.
+dArn :: Lens' Device (Maybe Text)
+dArn = lens _dArn (\ s a -> s{_dArn = a});
+
+-- | The device\'s form factor.
+--
+-- Allowed values include:
+--
+-- -   PHONE: The phone form factor.
+--
+-- -   TABLET: The tablet form factor.
+--
+dFormFactor :: Lens' Device (Maybe DeviceFormFactor)
+dFormFactor = lens _dFormFactor (\ s a -> s{_dFormFactor = a});
+
+-- | Undocumented member.
+dResolution :: Lens' Device (Maybe Resolution)
+dResolution = lens _dResolution (\ s a -> s{_dResolution = a});
+
+-- | The device\'s total memory size, expressed in bytes.
+dMemory :: Lens' Device (Maybe Integer)
+dMemory = lens _dMemory (\ s a -> s{_dMemory = a});
+
+-- | The device\'s radio.
+dRadio :: Lens' Device (Maybe Text)
+dRadio = lens _dRadio (\ s a -> s{_dRadio = a});
+
+-- | The device\'s operating system type.
+dOs :: Lens' Device (Maybe Text)
+dOs = lens _dOs (\ s a -> s{_dOs = a});
+
+-- | The device\'s display name.
+dName :: Lens' Device (Maybe Text)
+dName = lens _dName (\ s a -> s{_dName = a});
+
+-- | The device\'s model name.
+dModel :: Lens' Device (Maybe Text)
+dModel = lens _dModel (\ s a -> s{_dModel = a});
+
+-- | Information about the device\'s CPU.
+dCpu :: Lens' Device (Maybe CPU)
+dCpu = lens _dCpu (\ s a -> s{_dCpu = a});
+
+-- | The device\'s heap size, expressed in bytes.
+dHeapSize :: Lens' Device (Maybe Integer)
+dHeapSize = lens _dHeapSize (\ s a -> s{_dHeapSize = a});
+
+instance FromJSON Device where
+        parseJSON
+          = withObject "Device"
+              (\ x ->
+                 Device' <$>
+                   (x .:? "carrier") <*> (x .:? "image") <*>
+                     (x .:? "manufacturer")
+                     <*> (x .:? "platform")
+                     <*> (x .:? "arn")
+                     <*> (x .:? "formFactor")
+                     <*> (x .:? "resolution")
+                     <*> (x .:? "memory")
+                     <*> (x .:? "radio")
+                     <*> (x .:? "os")
+                     <*> (x .:? "name")
+                     <*> (x .:? "model")
+                     <*> (x .:? "cpu")
+                     <*> (x .:? "heapSize"))
+
+-- | Represents a collection of device types.
+--
+-- /See:/ 'devicePool' smart constructor.
+data DevicePool = DevicePool'
+    { _dpArn         :: !(Maybe Text)
+    , _dpRules       :: !(Maybe [Rule])
+    , _dpName        :: !(Maybe Text)
+    , _dpType        :: !(Maybe DevicePoolType)
+    , _dpDescription :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DevicePool' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dpArn'
+--
+-- * 'dpRules'
+--
+-- * 'dpName'
+--
+-- * 'dpType'
+--
+-- * 'dpDescription'
+devicePool
+    :: DevicePool
+devicePool =
+    DevicePool'
+    { _dpArn = Nothing
+    , _dpRules = Nothing
+    , _dpName = Nothing
+    , _dpType = Nothing
+    , _dpDescription = Nothing
+    }
+
+-- | The device pool\'s ARN.
+dpArn :: Lens' DevicePool (Maybe Text)
+dpArn = lens _dpArn (\ s a -> s{_dpArn = a});
+
+-- | Information about the device pool\'s rules.
+dpRules :: Lens' DevicePool [Rule]
+dpRules = lens _dpRules (\ s a -> s{_dpRules = a}) . _Default . _Coerce;
+
+-- | The device pool\'s name.
+dpName :: Lens' DevicePool (Maybe Text)
+dpName = lens _dpName (\ s a -> s{_dpName = a});
+
+-- | The device pool\'s type.
+--
+-- Allowed values include:
+--
+-- -   CURATED: A device pool that is created and managed by AWS Device
+--     Farm.
+--
+-- -   PRIVATE: A device pool that is created and managed by the device
+--     pool developer.
+--
+dpType :: Lens' DevicePool (Maybe DevicePoolType)
+dpType = lens _dpType (\ s a -> s{_dpType = a});
+
+-- | The device pool\'s description.
+dpDescription :: Lens' DevicePool (Maybe Text)
+dpDescription = lens _dpDescription (\ s a -> s{_dpDescription = a});
+
+instance FromJSON DevicePool where
+        parseJSON
+          = withObject "DevicePool"
+              (\ x ->
+                 DevicePool' <$>
+                   (x .:? "arn") <*> (x .:? "rules" .!= mempty) <*>
+                     (x .:? "name")
+                     <*> (x .:? "type")
+                     <*> (x .:? "description"))
+
+-- | Represents a device pool compatibility result.
+--
+-- /See:/ 'devicePoolCompatibilityResult' smart constructor.
+data DevicePoolCompatibilityResult = DevicePoolCompatibilityResult'
+    { _dpcrDevice                  :: !(Maybe Device)
+    , _dpcrCompatible              :: !(Maybe Bool)
+    , _dpcrIncompatibilityMessages :: !(Maybe [IncompatibilityMessage])
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DevicePoolCompatibilityResult' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dpcrDevice'
+--
+-- * 'dpcrCompatible'
+--
+-- * 'dpcrIncompatibilityMessages'
+devicePoolCompatibilityResult
+    :: DevicePoolCompatibilityResult
+devicePoolCompatibilityResult =
+    DevicePoolCompatibilityResult'
+    { _dpcrDevice = Nothing
+    , _dpcrCompatible = Nothing
+    , _dpcrIncompatibilityMessages = Nothing
+    }
+
+-- | Undocumented member.
+dpcrDevice :: Lens' DevicePoolCompatibilityResult (Maybe Device)
+dpcrDevice = lens _dpcrDevice (\ s a -> s{_dpcrDevice = a});
+
+-- | Whether the result was compatible with the device pool.
+dpcrCompatible :: Lens' DevicePoolCompatibilityResult (Maybe Bool)
+dpcrCompatible = lens _dpcrCompatible (\ s a -> s{_dpcrCompatible = a});
+
+-- | Information about the compatibility.
+dpcrIncompatibilityMessages :: Lens' DevicePoolCompatibilityResult [IncompatibilityMessage]
+dpcrIncompatibilityMessages = lens _dpcrIncompatibilityMessages (\ s a -> s{_dpcrIncompatibilityMessages = a}) . _Default . _Coerce;
+
+instance FromJSON DevicePoolCompatibilityResult where
+        parseJSON
+          = withObject "DevicePoolCompatibilityResult"
+              (\ x ->
+                 DevicePoolCompatibilityResult' <$>
+                   (x .:? "device") <*> (x .:? "compatible") <*>
+                     (x .:? "incompatibilityMessages" .!= mempty))
+
+-- | Represents information about incompatibility.
+--
+-- /See:/ 'incompatibilityMessage' smart constructor.
+data IncompatibilityMessage = IncompatibilityMessage'
+    { _imType    :: !(Maybe DeviceAttribute)
+    , _imMessage :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'IncompatibilityMessage' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'imType'
+--
+-- * 'imMessage'
+incompatibilityMessage
+    :: IncompatibilityMessage
+incompatibilityMessage =
+    IncompatibilityMessage'
+    { _imType = Nothing
+    , _imMessage = Nothing
+    }
+
+-- | The type of incompatibility.
+--
+-- Allowed values include:
+--
+-- -   ARN: The ARN.
+--
+-- -   FORM_FACTOR: The form factor (for example, phone or tablet).
+--
+-- -   MANUFACTURER: The manufacturer.
+--
+-- -   PLATFORM: The platform (for example, Android or iOS).
+--
+imType :: Lens' IncompatibilityMessage (Maybe DeviceAttribute)
+imType = lens _imType (\ s a -> s{_imType = a});
+
+-- | A message about the incompatibility.
+imMessage :: Lens' IncompatibilityMessage (Maybe Text)
+imMessage = lens _imMessage (\ s a -> s{_imMessage = a});
+
+instance FromJSON IncompatibilityMessage where
+        parseJSON
+          = withObject "IncompatibilityMessage"
+              (\ x ->
+                 IncompatibilityMessage' <$>
+                   (x .:? "type") <*> (x .:? "message"))
+
+-- | Represents a device.
+--
+-- /See:/ 'job' smart constructor.
+data Job = Job'
+    { _jobStatus   :: !(Maybe ExecutionStatus)
+    , _jobCounters :: !(Maybe Counters)
+    , _jobArn      :: !(Maybe Text)
+    , _jobCreated  :: !(Maybe POSIX)
+    , _jobDevice   :: !(Maybe Device)
+    , _jobStopped  :: !(Maybe POSIX)
+    , _jobResult   :: !(Maybe ExecutionResult)
+    , _jobName     :: !(Maybe Text)
+    , _jobType     :: !(Maybe TestType)
+    , _jobMessage  :: !(Maybe Text)
+    , _jobStarted  :: !(Maybe POSIX)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Job' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'jobStatus'
+--
+-- * 'jobCounters'
+--
+-- * 'jobArn'
+--
+-- * 'jobCreated'
+--
+-- * 'jobDevice'
+--
+-- * 'jobStopped'
+--
+-- * 'jobResult'
+--
+-- * 'jobName'
+--
+-- * 'jobType'
+--
+-- * 'jobMessage'
+--
+-- * 'jobStarted'
+job
+    :: Job
+job =
+    Job'
+    { _jobStatus = Nothing
+    , _jobCounters = Nothing
+    , _jobArn = Nothing
+    , _jobCreated = Nothing
+    , _jobDevice = Nothing
+    , _jobStopped = Nothing
+    , _jobResult = Nothing
+    , _jobName = Nothing
+    , _jobType = Nothing
+    , _jobMessage = Nothing
+    , _jobStarted = Nothing
+    }
+
+-- | The job\'s status.
+--
+-- Allowed values include:
+--
+-- -   COMPLETED: A completed status.
+--
+-- -   PENDING: A pending status.
+--
+-- -   PROCESSING: A processing status.
+--
+-- -   RUNNING: A running status.
+--
+-- -   SCHEDULING: A scheduling status.
+--
+jobStatus :: Lens' Job (Maybe ExecutionStatus)
+jobStatus = lens _jobStatus (\ s a -> s{_jobStatus = a});
+
+-- | The job\'s result counters.
+jobCounters :: Lens' Job (Maybe Counters)
+jobCounters = lens _jobCounters (\ s a -> s{_jobCounters = a});
+
+-- | The job\'s ARN.
+jobArn :: Lens' Job (Maybe Text)
+jobArn = lens _jobArn (\ s a -> s{_jobArn = a});
+
+-- | When the job was created.
+jobCreated :: Lens' Job (Maybe UTCTime)
+jobCreated = lens _jobCreated (\ s a -> s{_jobCreated = a}) . mapping _Time;
+
+-- | Undocumented member.
+jobDevice :: Lens' Job (Maybe Device)
+jobDevice = lens _jobDevice (\ s a -> s{_jobDevice = a});
+
+-- | The job\'s stop time.
+jobStopped :: Lens' Job (Maybe UTCTime)
+jobStopped = lens _jobStopped (\ s a -> s{_jobStopped = a}) . mapping _Time;
+
+-- | The job\'s result.
+--
+-- Allowed values include:
+--
+-- -   ERRORED: An error condition.
+--
+-- -   FAILED: A failed condition.
+--
+-- -   SKIPPED: A skipped condition.
+--
+-- -   STOPPED: A stopped condition.
+--
+-- -   PASSED: A passing condition.
+--
+-- -   PENDING: A pending condition.
+--
+-- -   WARNED: A warning condition.
+--
+jobResult :: Lens' Job (Maybe ExecutionResult)
+jobResult = lens _jobResult (\ s a -> s{_jobResult = a});
+
+-- | The job\'s name.
+jobName :: Lens' Job (Maybe Text)
+jobName = lens _jobName (\ s a -> s{_jobName = a});
+
+-- | The job\'s type.
+--
+-- Allowed values include the following:
+--
+-- -   BUILTIN_FUZZ: The built-in fuzz type.
+--
+-- -   BUILTIN_EXPLORER: For Android, an app explorer that will traverse an
+--     Android app, interacting with it and capturing screenshots at the
+--     same time.
+--
+-- -   APPIUM_JAVA_JUNIT: The Appium Java JUnit type.
+--
+-- -   APPIUM_JAVA_TESTNG: The Appium Java TestNG type.
+--
+-- -   CALABASH: The Calabash type.
+--
+-- -   INSTRUMENTATION: The Instrumentation type.
+--
+-- -   UIAUTOMATION: The uiautomation type.
+--
+-- -   UIAUTOMATOR: The uiautomator type.
+--
+-- -   XCTEST: The XCode test type.
+--
+jobType :: Lens' Job (Maybe TestType)
+jobType = lens _jobType (\ s a -> s{_jobType = a});
+
+-- | A message about the job\'s result.
+jobMessage :: Lens' Job (Maybe Text)
+jobMessage = lens _jobMessage (\ s a -> s{_jobMessage = a});
+
+-- | The job\'s start time.
+jobStarted :: Lens' Job (Maybe UTCTime)
+jobStarted = lens _jobStarted (\ s a -> s{_jobStarted = a}) . mapping _Time;
+
+instance FromJSON Job where
+        parseJSON
+          = withObject "Job"
+              (\ x ->
+                 Job' <$>
+                   (x .:? "status") <*> (x .:? "counters") <*>
+                     (x .:? "arn")
+                     <*> (x .:? "created")
+                     <*> (x .:? "device")
+                     <*> (x .:? "stopped")
+                     <*> (x .:? "result")
+                     <*> (x .:? "name")
+                     <*> (x .:? "type")
+                     <*> (x .:? "message")
+                     <*> (x .:? "started"))
+
+-- | Represents a latitude and longitude pair, expressed in geographic
+-- coordinate system degrees (for example 47.6204, -122.3491).
+--
+-- Elevation is currently not supported.
+--
+-- /See:/ 'location' smart constructor.
+data Location = Location'
+    { _lLatitude  :: !Double
+    , _lLongitude :: !Double
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Location' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'lLatitude'
+--
+-- * 'lLongitude'
+location
+    :: Double -- ^ 'lLatitude'
+    -> Double -- ^ 'lLongitude'
+    -> Location
+location pLatitude_ pLongitude_ =
+    Location'
+    { _lLatitude = pLatitude_
+    , _lLongitude = pLongitude_
+    }
+
+-- | The latitude.
+lLatitude :: Lens' Location Double
+lLatitude = lens _lLatitude (\ s a -> s{_lLatitude = a});
+
+-- | The longitude.
+lLongitude :: Lens' Location Double
+lLongitude = lens _lLongitude (\ s a -> s{_lLongitude = a});
+
+instance ToJSON Location where
+        toJSON Location'{..}
+          = object
+              ["latitude" .= _lLatitude,
+               "longitude" .= _lLongitude]
+
+-- | Represents a specific warning or failure.
+--
+-- /See:/ 'problem' smart constructor.
+data Problem = Problem'
+    { _pDevice  :: !(Maybe Device)
+    , _pTest    :: !(Maybe ProblemDetail)
+    , _pResult  :: !(Maybe ExecutionResult)
+    , _pRun     :: !(Maybe ProblemDetail)
+    , _pJob     :: !(Maybe ProblemDetail)
+    , _pMessage :: !(Maybe Text)
+    , _pSuite   :: !(Maybe ProblemDetail)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Problem' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'pDevice'
+--
+-- * 'pTest'
+--
+-- * 'pResult'
+--
+-- * 'pRun'
+--
+-- * 'pJob'
+--
+-- * 'pMessage'
+--
+-- * 'pSuite'
+problem
+    :: Problem
+problem =
+    Problem'
+    { _pDevice = Nothing
+    , _pTest = Nothing
+    , _pResult = Nothing
+    , _pRun = Nothing
+    , _pJob = Nothing
+    , _pMessage = Nothing
+    , _pSuite = Nothing
+    }
+
+-- | Information about the associated device.
+pDevice :: Lens' Problem (Maybe Device)
+pDevice = lens _pDevice (\ s a -> s{_pDevice = a});
+
+-- | Information about the associated test.
+pTest :: Lens' Problem (Maybe ProblemDetail)
+pTest = lens _pTest (\ s a -> s{_pTest = a});
+
+-- | The problem\'s result.
+--
+-- Allowed values include:
+--
+-- -   ERRORED: An error condition.
+--
+-- -   FAILED: A failed condition.
+--
+-- -   SKIPPED: A skipped condition.
+--
+-- -   STOPPED: A stopped condition.
+--
+-- -   PASSED: A passing condition.
+--
+-- -   PENDING: A pending condition.
+--
+-- -   WARNED: A warning condition.
+--
+pResult :: Lens' Problem (Maybe ExecutionResult)
+pResult = lens _pResult (\ s a -> s{_pResult = a});
+
+-- | Information about the associated run.
+pRun :: Lens' Problem (Maybe ProblemDetail)
+pRun = lens _pRun (\ s a -> s{_pRun = a});
+
+-- | Information about the associated job.
+pJob :: Lens' Problem (Maybe ProblemDetail)
+pJob = lens _pJob (\ s a -> s{_pJob = a});
+
+-- | A message about the problem\'s result.
+pMessage :: Lens' Problem (Maybe Text)
+pMessage = lens _pMessage (\ s a -> s{_pMessage = a});
+
+-- | Information about the associated suite.
+pSuite :: Lens' Problem (Maybe ProblemDetail)
+pSuite = lens _pSuite (\ s a -> s{_pSuite = a});
+
+instance FromJSON Problem where
+        parseJSON
+          = withObject "Problem"
+              (\ x ->
+                 Problem' <$>
+                   (x .:? "device") <*> (x .:? "test") <*>
+                     (x .:? "result")
+                     <*> (x .:? "run")
+                     <*> (x .:? "job")
+                     <*> (x .:? "message")
+                     <*> (x .:? "suite"))
+
+-- | Information about a problem detail.
+--
+-- /See:/ 'problemDetail' smart constructor.
+data ProblemDetail = ProblemDetail'
+    { _pdArn  :: !(Maybe Text)
+    , _pdName :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ProblemDetail' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'pdArn'
+--
+-- * 'pdName'
+problemDetail
+    :: ProblemDetail
+problemDetail =
+    ProblemDetail'
+    { _pdArn = Nothing
+    , _pdName = Nothing
+    }
+
+-- | The problem detail\'s ARN.
+pdArn :: Lens' ProblemDetail (Maybe Text)
+pdArn = lens _pdArn (\ s a -> s{_pdArn = a});
+
+-- | The problem detail\'s name.
+pdName :: Lens' ProblemDetail (Maybe Text)
+pdName = lens _pdName (\ s a -> s{_pdName = a});
+
+instance FromJSON ProblemDetail where
+        parseJSON
+          = withObject "ProblemDetail"
+              (\ x ->
+                 ProblemDetail' <$> (x .:? "arn") <*> (x .:? "name"))
+
+-- | Represents an operating-system neutral workspace for running and
+-- managing tests.
+--
+-- /See:/ 'project' smart constructor.
+data Project = Project'
+    { _pArn     :: !(Maybe Text)
+    , _pCreated :: !(Maybe POSIX)
+    , _pName    :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Project' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'pArn'
+--
+-- * 'pCreated'
+--
+-- * 'pName'
+project
+    :: Project
+project =
+    Project'
+    { _pArn = Nothing
+    , _pCreated = Nothing
+    , _pName = Nothing
+    }
+
+-- | The project\'s ARN.
+pArn :: Lens' Project (Maybe Text)
+pArn = lens _pArn (\ s a -> s{_pArn = a});
+
+-- | When the project was created.
+pCreated :: Lens' Project (Maybe UTCTime)
+pCreated = lens _pCreated (\ s a -> s{_pCreated = a}) . mapping _Time;
+
+-- | The project\'s name.
+pName :: Lens' Project (Maybe Text)
+pName = lens _pName (\ s a -> s{_pName = a});
+
+instance FromJSON Project where
+        parseJSON
+          = withObject "Project"
+              (\ x ->
+                 Project' <$>
+                   (x .:? "arn") <*> (x .:? "created") <*>
+                     (x .:? "name"))
+
+-- | Represents the set of radios and their states on a device. Examples of
+-- radios include Wi-Fi, GPS, Bluetooth, and NFC.
+--
+-- /See:/ 'radios' smart constructor.
+data Radios = Radios'
+    { _rNfc       :: !(Maybe Bool)
+    , _rGps       :: !(Maybe Bool)
+    , _rBluetooth :: !(Maybe Bool)
+    , _rWifi      :: !(Maybe Bool)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Radios' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'rNfc'
+--
+-- * 'rGps'
+--
+-- * 'rBluetooth'
+--
+-- * 'rWifi'
+radios
+    :: Radios
+radios =
+    Radios'
+    { _rNfc = Nothing
+    , _rGps = Nothing
+    , _rBluetooth = Nothing
+    , _rWifi = Nothing
+    }
+
+-- | True if NFC is enabled at the beginning of the test; otherwise, false.
+rNfc :: Lens' Radios (Maybe Bool)
+rNfc = lens _rNfc (\ s a -> s{_rNfc = a});
+
+-- | True if GPS is enabled at the beginning of the test; otherwise, false.
+rGps :: Lens' Radios (Maybe Bool)
+rGps = lens _rGps (\ s a -> s{_rGps = a});
+
+-- | True if Bluetooth is enabled at the beginning of the test; otherwise,
+-- false.
+rBluetooth :: Lens' Radios (Maybe Bool)
+rBluetooth = lens _rBluetooth (\ s a -> s{_rBluetooth = a});
+
+-- | True if Wi-Fi is enabled at the beginning of the test; otherwise, false.
+rWifi :: Lens' Radios (Maybe Bool)
+rWifi = lens _rWifi (\ s a -> s{_rWifi = a});
+
+instance ToJSON Radios where
+        toJSON Radios'{..}
+          = object
+              ["nfc" .= _rNfc, "gps" .= _rGps,
+               "bluetooth" .= _rBluetooth, "wifi" .= _rWifi]
+
+-- | Represents the screen resolution of a device in height and width,
+-- expressed in pixels.
+--
+-- /See:/ 'resolution' smart constructor.
+data Resolution = Resolution'
+    { _rHeight :: !(Maybe Int)
+    , _rWidth  :: !(Maybe Int)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Resolution' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'rHeight'
+--
+-- * 'rWidth'
+resolution
+    :: Resolution
+resolution =
+    Resolution'
+    { _rHeight = Nothing
+    , _rWidth = Nothing
+    }
+
+-- | The screen resolution\'s height, expressed in pixels.
+rHeight :: Lens' Resolution (Maybe Int)
+rHeight = lens _rHeight (\ s a -> s{_rHeight = a});
+
+-- | The screen resolution\'s width, expressed in pixels.
+rWidth :: Lens' Resolution (Maybe Int)
+rWidth = lens _rWidth (\ s a -> s{_rWidth = a});
+
+instance FromJSON Resolution where
+        parseJSON
+          = withObject "Resolution"
+              (\ x ->
+                 Resolution' <$> (x .:? "height") <*> (x .:? "width"))
+
+-- | Represents a condition for a device pool.
+--
+-- /See:/ 'rule' smart constructor.
+data Rule = Rule'
+    { _rAttribute :: !(Maybe DeviceAttribute)
+    , _rOperator  :: !(Maybe RuleOperator)
+    , _rValue     :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Rule' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'rAttribute'
+--
+-- * 'rOperator'
+--
+-- * 'rValue'
+rule
+    :: Rule
+rule =
+    Rule'
+    { _rAttribute = Nothing
+    , _rOperator = Nothing
+    , _rValue = Nothing
+    }
+
+-- | The rule\'s attribute.
+--
+-- Allowed values include:
+--
+-- -   ARN: The ARN.
+--
+-- -   FORM_FACTOR: The form factor (for example, phone or tablet).
+--
+-- -   MANUFACTURER: The manufacturer.
+--
+-- -   PLATFORM: The platform (for example, Android or iOS).
+--
+rAttribute :: Lens' Rule (Maybe DeviceAttribute)
+rAttribute = lens _rAttribute (\ s a -> s{_rAttribute = a});
+
+-- | The rule\'s operator.
+--
+-- -   EQUALS: The equals operator.
+--
+-- -   GREATER_THAN: The greater-than operator.
+--
+-- -   IN: The in operator.
+--
+-- -   LESS_THAN: The less-than operator.
+--
+-- -   NOT_IN: The not-in operator.
+--
+rOperator :: Lens' Rule (Maybe RuleOperator)
+rOperator = lens _rOperator (\ s a -> s{_rOperator = a});
+
+-- | The rule\'s value.
+rValue :: Lens' Rule (Maybe Text)
+rValue = lens _rValue (\ s a -> s{_rValue = a});
+
+instance FromJSON Rule where
+        parseJSON
+          = withObject "Rule"
+              (\ x ->
+                 Rule' <$>
+                   (x .:? "attribute") <*> (x .:? "operator") <*>
+                     (x .:? "value"))
+
+instance ToJSON Rule where
+        toJSON Rule'{..}
+          = object
+              ["attribute" .= _rAttribute,
+               "operator" .= _rOperator, "value" .= _rValue]
+
+-- | Represents an app on a set of devices with a specific test and
+-- configuration.
+--
+-- /See:/ 'run' smart constructor.
+data Run = Run'
+    { _runStatus        :: !(Maybe ExecutionStatus)
+    , _runBillingMethod :: !(Maybe BillingMethod)
+    , _runCounters      :: !(Maybe Counters)
+    , _runPlatform      :: !(Maybe DevicePlatform)
+    , _runArn           :: !(Maybe Text)
+    , _runCreated       :: !(Maybe POSIX)
+    , _runCompletedJobs :: !(Maybe Int)
+    , _runStopped       :: !(Maybe POSIX)
+    , _runResult        :: !(Maybe ExecutionResult)
+    , _runName          :: !(Maybe Text)
+    , _runType          :: !(Maybe TestType)
+    , _runMessage       :: !(Maybe Text)
+    , _runTotalJobs     :: !(Maybe Int)
+    , _runStarted       :: !(Maybe POSIX)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Run' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'runStatus'
+--
+-- * 'runBillingMethod'
+--
+-- * 'runCounters'
+--
+-- * 'runPlatform'
+--
+-- * 'runArn'
+--
+-- * 'runCreated'
+--
+-- * 'runCompletedJobs'
+--
+-- * 'runStopped'
+--
+-- * 'runResult'
+--
+-- * 'runName'
+--
+-- * 'runType'
+--
+-- * 'runMessage'
+--
+-- * 'runTotalJobs'
+--
+-- * 'runStarted'
+run
+    :: Run
+run =
+    Run'
+    { _runStatus = Nothing
+    , _runBillingMethod = Nothing
+    , _runCounters = Nothing
+    , _runPlatform = Nothing
+    , _runArn = Nothing
+    , _runCreated = Nothing
+    , _runCompletedJobs = Nothing
+    , _runStopped = Nothing
+    , _runResult = Nothing
+    , _runName = Nothing
+    , _runType = Nothing
+    , _runMessage = Nothing
+    , _runTotalJobs = Nothing
+    , _runStarted = Nothing
+    }
+
+-- | The run\'s status.
+--
+-- Allowed values include:
+--
+-- -   COMPLETED: A completed status.
+--
+-- -   PENDING: A pending status.
+--
+-- -   PROCESSING: A processing status.
+--
+-- -   RUNNING: A running status.
+--
+-- -   SCHEDULING: A scheduling status.
+--
+runStatus :: Lens' Run (Maybe ExecutionStatus)
+runStatus = lens _runStatus (\ s a -> s{_runStatus = a});
+
+-- | Specifies the billing method for a test run: 'metered' or 'unmetered'.
+-- If the parameter is not specified, the default value is 'unmetered'.
+runBillingMethod :: Lens' Run (Maybe BillingMethod)
+runBillingMethod = lens _runBillingMethod (\ s a -> s{_runBillingMethod = a});
+
+-- | The run\'s result counters.
+runCounters :: Lens' Run (Maybe Counters)
+runCounters = lens _runCounters (\ s a -> s{_runCounters = a});
+
+-- | The run\'s platform.
+--
+-- Allowed values include:
+--
+-- -   ANDROID: The Android platform.
+--
+-- -   IOS: The iOS platform.
+--
+runPlatform :: Lens' Run (Maybe DevicePlatform)
+runPlatform = lens _runPlatform (\ s a -> s{_runPlatform = a});
+
+-- | The run\'s ARN.
+runArn :: Lens' Run (Maybe Text)
+runArn = lens _runArn (\ s a -> s{_runArn = a});
+
+-- | When the run was created.
+runCreated :: Lens' Run (Maybe UTCTime)
+runCreated = lens _runCreated (\ s a -> s{_runCreated = a}) . mapping _Time;
+
+-- | The total number of completed jobs.
+runCompletedJobs :: Lens' Run (Maybe Int)
+runCompletedJobs = lens _runCompletedJobs (\ s a -> s{_runCompletedJobs = a});
+
+-- | The run\'s stop time.
+runStopped :: Lens' Run (Maybe UTCTime)
+runStopped = lens _runStopped (\ s a -> s{_runStopped = a}) . mapping _Time;
+
+-- | The run\'s result.
+--
+-- Allowed values include:
+--
+-- -   ERRORED: An error condition.
+--
+-- -   FAILED: A failed condition.
+--
+-- -   SKIPPED: A skipped condition.
+--
+-- -   STOPPED: A stopped condition.
+--
+-- -   PASSED: A passing condition.
+--
+-- -   PENDING: A pending condition.
+--
+-- -   WARNED: A warning condition.
+--
+runResult :: Lens' Run (Maybe ExecutionResult)
+runResult = lens _runResult (\ s a -> s{_runResult = a});
+
+-- | The run\'s name.
+runName :: Lens' Run (Maybe Text)
+runName = lens _runName (\ s a -> s{_runName = a});
+
+-- | The run\'s type.
+--
+-- Must be one of the following values:
+--
+-- -   BUILTIN_FUZZ: The built-in fuzz type.
+--
+-- -   BUILTIN_EXPLORER: For Android, an app explorer that will traverse an
+--     Android app, interacting with it and capturing screenshots at the
+--     same time.
+--
+-- -   APPIUM_JAVA_JUNIT: The Appium Java JUnit type.
+--
+-- -   APPIUM_JAVA_TESTNG: The Appium Java TestNG type.
+--
+-- -   CALABASH: The Calabash type.
+--
+-- -   INSTRUMENTATION: The Instrumentation type.
+--
+-- -   UIAUTOMATION: The uiautomation type.
+--
+-- -   UIAUTOMATOR: The uiautomator type.
+--
+-- -   XCTEST: The XCode test type.
+--
+runType :: Lens' Run (Maybe TestType)
+runType = lens _runType (\ s a -> s{_runType = a});
+
+-- | A message about the run\'s result.
+runMessage :: Lens' Run (Maybe Text)
+runMessage = lens _runMessage (\ s a -> s{_runMessage = a});
+
+-- | The total number of jobs for the run.
+runTotalJobs :: Lens' Run (Maybe Int)
+runTotalJobs = lens _runTotalJobs (\ s a -> s{_runTotalJobs = a});
+
+-- | The run\'s start time.
+runStarted :: Lens' Run (Maybe UTCTime)
+runStarted = lens _runStarted (\ s a -> s{_runStarted = a}) . mapping _Time;
+
+instance FromJSON Run where
+        parseJSON
+          = withObject "Run"
+              (\ x ->
+                 Run' <$>
+                   (x .:? "status") <*> (x .:? "billingMethod") <*>
+                     (x .:? "counters")
+                     <*> (x .:? "platform")
+                     <*> (x .:? "arn")
+                     <*> (x .:? "created")
+                     <*> (x .:? "completedJobs")
+                     <*> (x .:? "stopped")
+                     <*> (x .:? "result")
+                     <*> (x .:? "name")
+                     <*> (x .:? "type")
+                     <*> (x .:? "message")
+                     <*> (x .:? "totalJobs")
+                     <*> (x .:? "started"))
+
+-- | Represents a sample of performance data.
+--
+-- /See:/ 'sample' smart constructor.
+data Sample = Sample'
+    { _sArn  :: !(Maybe Text)
+    , _sUrl  :: !(Maybe Text)
+    , _sType :: !(Maybe SampleType)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Sample' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sArn'
+--
+-- * 'sUrl'
+--
+-- * 'sType'
+sample
+    :: Sample
+sample =
+    Sample'
+    { _sArn = Nothing
+    , _sUrl = Nothing
+    , _sType = Nothing
+    }
+
+-- | The sample\'s ARN.
+sArn :: Lens' Sample (Maybe Text)
+sArn = lens _sArn (\ s a -> s{_sArn = a});
+
+-- | The pre-signed Amazon S3 URL that can be used with a corresponding GET
+-- request to download the sample\'s file.
+sUrl :: Lens' Sample (Maybe Text)
+sUrl = lens _sUrl (\ s a -> s{_sUrl = a});
+
+-- | The sample\'s type.
+--
+-- Must be one of the following values:
+--
+-- -   CPU: A CPU sample type. This is expressed as the app processing CPU
+--     time (including child processes) as reported by process, as a
+--     percentage.
+--
+-- -   MEMORY: A memory usage sample type. This is expressed as the total
+--     proportional set size of an app process, in kilobytes.
+--
+-- -   NATIVE_AVG_DRAWTIME
+--
+-- -   NATIVE_FPS
+--
+-- -   NATIVE_FRAMES
+--
+-- -   NATIVE_MAX_DRAWTIME
+--
+-- -   NATIVE_MIN_DRAWTIME
+--
+-- -   OPENGL_AVG_DRAWTIME
+--
+-- -   OPENGL_FPS
+--
+-- -   OPENGL_FRAMES
+--
+-- -   OPENGL_MAX_DRAWTIME
+--
+-- -   OPENGL_MIN_DRAWTIME
+--
+-- -   RX
+--
+-- -   RX_RATE: The total number of bytes per second (TCP and UDP) that are
+--     sent, by app process.
+--
+-- -   THREADS: A threads sample type. This is expressed as the total
+--     number of threads per app process.
+--
+-- -   TX
+--
+-- -   TX_RATE: The total number of bytes per second (TCP and UDP) that are
+--     received, by app process.
+--
+sType :: Lens' Sample (Maybe SampleType)
+sType = lens _sType (\ s a -> s{_sType = a});
+
+instance FromJSON Sample where
+        parseJSON
+          = withObject "Sample"
+              (\ x ->
+                 Sample' <$>
+                   (x .:? "arn") <*> (x .:? "url") <*> (x .:? "type"))
+
+-- | Represents the settings for a run. Includes things like location, radio
+-- states, auxiliary apps, and network profiles.
+--
+-- /See:/ 'scheduleRunConfiguration' smart constructor.
+data ScheduleRunConfiguration = ScheduleRunConfiguration'
+    { _srcBillingMethod       :: !(Maybe BillingMethod)
+    , _srcRadios              :: !(Maybe Radios)
+    , _srcLocation            :: !(Maybe Location)
+    , _srcLocale              :: !(Maybe Text)
+    , _srcNetworkProfileARN   :: !(Maybe Text)
+    , _srcExtraDataPackageARN :: !(Maybe Text)
+    , _srcAuxiliaryApps       :: !(Maybe [Text])
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ScheduleRunConfiguration' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'srcBillingMethod'
+--
+-- * 'srcRadios'
+--
+-- * 'srcLocation'
+--
+-- * 'srcLocale'
+--
+-- * 'srcNetworkProfileARN'
+--
+-- * 'srcExtraDataPackageARN'
+--
+-- * 'srcAuxiliaryApps'
+scheduleRunConfiguration
+    :: ScheduleRunConfiguration
+scheduleRunConfiguration =
+    ScheduleRunConfiguration'
+    { _srcBillingMethod = Nothing
+    , _srcRadios = Nothing
+    , _srcLocation = Nothing
+    , _srcLocale = Nothing
+    , _srcNetworkProfileARN = Nothing
+    , _srcExtraDataPackageARN = Nothing
+    , _srcAuxiliaryApps = Nothing
+    }
+
+-- | Specifies the billing method for a test run: 'metered' or 'unmetered'.
+-- If the parameter is not specified, the default value is 'unmetered'.
+srcBillingMethod :: Lens' ScheduleRunConfiguration (Maybe BillingMethod)
+srcBillingMethod = lens _srcBillingMethod (\ s a -> s{_srcBillingMethod = a});
+
+-- | Information about the radio states for the run.
+srcRadios :: Lens' ScheduleRunConfiguration (Maybe Radios)
+srcRadios = lens _srcRadios (\ s a -> s{_srcRadios = a});
+
+-- | Information about the location that is used for the run.
+srcLocation :: Lens' ScheduleRunConfiguration (Maybe Location)
+srcLocation = lens _srcLocation (\ s a -> s{_srcLocation = a});
+
+-- | Information about the locale that is used for the run.
+srcLocale :: Lens' ScheduleRunConfiguration (Maybe Text)
+srcLocale = lens _srcLocale (\ s a -> s{_srcLocale = a});
+
+-- | Reserved for internal use.
+srcNetworkProfileARN :: Lens' ScheduleRunConfiguration (Maybe Text)
+srcNetworkProfileARN = lens _srcNetworkProfileARN (\ s a -> s{_srcNetworkProfileARN = a});
+
+-- | The ARN of the extra data for the run. The extra data is a .zip file
+-- that AWS Device Farm will extract to external data for Android or the
+-- app\'s sandbox for iOS.
+srcExtraDataPackageARN :: Lens' ScheduleRunConfiguration (Maybe Text)
+srcExtraDataPackageARN = lens _srcExtraDataPackageARN (\ s a -> s{_srcExtraDataPackageARN = a});
+
+-- | A list of auxiliary apps for the run.
+srcAuxiliaryApps :: Lens' ScheduleRunConfiguration [Text]
+srcAuxiliaryApps = lens _srcAuxiliaryApps (\ s a -> s{_srcAuxiliaryApps = a}) . _Default . _Coerce;
+
+instance ToJSON ScheduleRunConfiguration where
+        toJSON ScheduleRunConfiguration'{..}
+          = object
+              ["billingMethod" .= _srcBillingMethod,
+               "radios" .= _srcRadios, "location" .= _srcLocation,
+               "locale" .= _srcLocale,
+               "networkProfileArn" .= _srcNetworkProfileARN,
+               "extraDataPackageArn" .= _srcExtraDataPackageARN,
+               "auxiliaryApps" .= _srcAuxiliaryApps]
+
+-- | Represents additional test settings.
+--
+-- /See:/ 'scheduleRunTest' smart constructor.
+data ScheduleRunTest = ScheduleRunTest'
+    { _srtTestPackageARN :: !(Maybe Text)
+    , _srtParameters     :: !(Maybe (Map Text Text))
+    , _srtFilter         :: !(Maybe Text)
+    , _srtType           :: !TestType
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ScheduleRunTest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'srtTestPackageARN'
+--
+-- * 'srtParameters'
+--
+-- * 'srtFilter'
+--
+-- * 'srtType'
+scheduleRunTest
+    :: TestType -- ^ 'srtType'
+    -> ScheduleRunTest
+scheduleRunTest pType_ =
+    ScheduleRunTest'
+    { _srtTestPackageARN = Nothing
+    , _srtParameters = Nothing
+    , _srtFilter = Nothing
+    , _srtType = pType_
+    }
+
+-- | The ARN of the uploaded test that will be run.
+srtTestPackageARN :: Lens' ScheduleRunTest (Maybe Text)
+srtTestPackageARN = lens _srtTestPackageARN (\ s a -> s{_srtTestPackageARN = a});
+
+-- | The test\'s parameters, such as test framework parameters and fixture
+-- settings.
+srtParameters :: Lens' ScheduleRunTest (HashMap Text Text)
+srtParameters = lens _srtParameters (\ s a -> s{_srtParameters = a}) . _Default . _Map;
+
+-- | The test\'s filter.
+srtFilter :: Lens' ScheduleRunTest (Maybe Text)
+srtFilter = lens _srtFilter (\ s a -> s{_srtFilter = a});
+
+-- | The test\'s type.
+--
+-- Must be one of the following values:
+--
+-- -   BUILTIN_FUZZ: The built-in fuzz type.
+--
+-- -   BUILTIN_EXPLORER: For Android, an app explorer that will traverse an
+--     Android app, interacting with it and capturing screenshots at the
+--     same time.
+--
+-- -   APPIUM_JAVA_JUNIT: The Appium Java JUnit type.
+--
+-- -   APPIUM_JAVA_TESTNG: The Appium Java TestNG type.
+--
+-- -   CALABASH: The Calabash type.
+--
+-- -   INSTRUMENTATION: The Instrumentation type.
+--
+-- -   UIAUTOMATION: The uiautomation type.
+--
+-- -   UIAUTOMATOR: The uiautomator type.
+--
+-- -   XCTEST: The XCode test type.
+--
+srtType :: Lens' ScheduleRunTest TestType
+srtType = lens _srtType (\ s a -> s{_srtType = a});
+
+instance ToJSON ScheduleRunTest where
+        toJSON ScheduleRunTest'{..}
+          = object
+              ["testPackageArn" .= _srtTestPackageARN,
+               "parameters" .= _srtParameters,
+               "filter" .= _srtFilter, "type" .= _srtType]
+
+-- | Represents a collection of one or more tests.
+--
+-- /See:/ 'suite' smart constructor.
+data Suite = Suite'
+    { _suiStatus   :: !(Maybe ExecutionStatus)
+    , _suiCounters :: !(Maybe Counters)
+    , _suiArn      :: !(Maybe Text)
+    , _suiCreated  :: !(Maybe POSIX)
+    , _suiStopped  :: !(Maybe POSIX)
+    , _suiResult   :: !(Maybe ExecutionResult)
+    , _suiName     :: !(Maybe Text)
+    , _suiType     :: !(Maybe TestType)
+    , _suiMessage  :: !(Maybe Text)
+    , _suiStarted  :: !(Maybe POSIX)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Suite' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'suiStatus'
+--
+-- * 'suiCounters'
+--
+-- * 'suiArn'
+--
+-- * 'suiCreated'
+--
+-- * 'suiStopped'
+--
+-- * 'suiResult'
+--
+-- * 'suiName'
+--
+-- * 'suiType'
+--
+-- * 'suiMessage'
+--
+-- * 'suiStarted'
+suite
+    :: Suite
+suite =
+    Suite'
+    { _suiStatus = Nothing
+    , _suiCounters = Nothing
+    , _suiArn = Nothing
+    , _suiCreated = Nothing
+    , _suiStopped = Nothing
+    , _suiResult = Nothing
+    , _suiName = Nothing
+    , _suiType = Nothing
+    , _suiMessage = Nothing
+    , _suiStarted = Nothing
+    }
+
+-- | The suite\'s status.
+--
+-- Allowed values include:
+--
+-- -   COMPLETED: A completed status.
+--
+-- -   PENDING: A pending status.
+--
+-- -   PROCESSING: A processing status.
+--
+-- -   RUNNING: A running status.
+--
+-- -   SCHEDULING: A scheduling status.
+--
+suiStatus :: Lens' Suite (Maybe ExecutionStatus)
+suiStatus = lens _suiStatus (\ s a -> s{_suiStatus = a});
+
+-- | The suite\'s result counters.
+suiCounters :: Lens' Suite (Maybe Counters)
+suiCounters = lens _suiCounters (\ s a -> s{_suiCounters = a});
+
+-- | The suite\'s ARN.
+suiArn :: Lens' Suite (Maybe Text)
+suiArn = lens _suiArn (\ s a -> s{_suiArn = a});
+
+-- | When the suite was created.
+suiCreated :: Lens' Suite (Maybe UTCTime)
+suiCreated = lens _suiCreated (\ s a -> s{_suiCreated = a}) . mapping _Time;
+
+-- | The suite\'s stop time.
+suiStopped :: Lens' Suite (Maybe UTCTime)
+suiStopped = lens _suiStopped (\ s a -> s{_suiStopped = a}) . mapping _Time;
+
+-- | The suite\'s result.
+--
+-- Allowed values include:
+--
+-- -   ERRORED: An error condition.
+--
+-- -   FAILED: A failed condition.
+--
+-- -   SKIPPED: A skipped condition.
+--
+-- -   STOPPED: A stopped condition.
+--
+-- -   PASSED: A passing condition.
+--
+-- -   PENDING: A pending condition.
+--
+-- -   WARNED: A warning condition.
+--
+suiResult :: Lens' Suite (Maybe ExecutionResult)
+suiResult = lens _suiResult (\ s a -> s{_suiResult = a});
+
+-- | The suite\'s name.
+suiName :: Lens' Suite (Maybe Text)
+suiName = lens _suiName (\ s a -> s{_suiName = a});
+
+-- | The suite\'s type.
+--
+-- Must be one of the following values:
+--
+-- -   BUILTIN_FUZZ: The built-in fuzz type.
+--
+-- -   BUILTIN_EXPLORER: For Android, an app explorer that will traverse an
+--     Android app, interacting with it and capturing screenshots at the
+--     same time.
+--
+-- -   APPIUM_JAVA_JUNIT: The Appium Java JUnit type.
+--
+-- -   APPIUM_JAVA_TESTNG: The Appium Java TestNG type.
+--
+-- -   CALABASH: The Calabash type.
+--
+-- -   INSTRUMENTATION: The Instrumentation type.
+--
+-- -   UIAUTOMATION: The uiautomation type.
+--
+-- -   UIAUTOMATOR: The uiautomator type.
+--
+-- -   XCTEST: The XCode test type.
+--
+suiType :: Lens' Suite (Maybe TestType)
+suiType = lens _suiType (\ s a -> s{_suiType = a});
+
+-- | A message about the suite\'s result.
+suiMessage :: Lens' Suite (Maybe Text)
+suiMessage = lens _suiMessage (\ s a -> s{_suiMessage = a});
+
+-- | The suite\'s start time.
+suiStarted :: Lens' Suite (Maybe UTCTime)
+suiStarted = lens _suiStarted (\ s a -> s{_suiStarted = a}) . mapping _Time;
+
+instance FromJSON Suite where
+        parseJSON
+          = withObject "Suite"
+              (\ x ->
+                 Suite' <$>
+                   (x .:? "status") <*> (x .:? "counters") <*>
+                     (x .:? "arn")
+                     <*> (x .:? "created")
+                     <*> (x .:? "stopped")
+                     <*> (x .:? "result")
+                     <*> (x .:? "name")
+                     <*> (x .:? "type")
+                     <*> (x .:? "message")
+                     <*> (x .:? "started"))
+
+-- | Represents a condition that is evaluated.
+--
+-- /See:/ 'test' smart constructor.
+data Test = Test'
+    { _tStatus   :: !(Maybe ExecutionStatus)
+    , _tCounters :: !(Maybe Counters)
+    , _tArn      :: !(Maybe Text)
+    , _tCreated  :: !(Maybe POSIX)
+    , _tStopped  :: !(Maybe POSIX)
+    , _tResult   :: !(Maybe ExecutionResult)
+    , _tName     :: !(Maybe Text)
+    , _tType     :: !(Maybe TestType)
+    , _tMessage  :: !(Maybe Text)
+    , _tStarted  :: !(Maybe POSIX)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Test' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'tStatus'
+--
+-- * 'tCounters'
+--
+-- * 'tArn'
+--
+-- * 'tCreated'
+--
+-- * 'tStopped'
+--
+-- * 'tResult'
+--
+-- * 'tName'
+--
+-- * 'tType'
+--
+-- * 'tMessage'
+--
+-- * 'tStarted'
+test
+    :: Test
+test =
+    Test'
+    { _tStatus = Nothing
+    , _tCounters = Nothing
+    , _tArn = Nothing
+    , _tCreated = Nothing
+    , _tStopped = Nothing
+    , _tResult = Nothing
+    , _tName = Nothing
+    , _tType = Nothing
+    , _tMessage = Nothing
+    , _tStarted = Nothing
+    }
+
+-- | The test\'s status.
+--
+-- Allowed values include:
+--
+-- -   COMPLETED: A completed status.
+--
+-- -   PENDING: A pending status.
+--
+-- -   PROCESSING: A processing status.
+--
+-- -   RUNNING: A running status.
+--
+-- -   SCHEDULING: A scheduling status.
+--
+tStatus :: Lens' Test (Maybe ExecutionStatus)
+tStatus = lens _tStatus (\ s a -> s{_tStatus = a});
+
+-- | The test\'s result counters.
+tCounters :: Lens' Test (Maybe Counters)
+tCounters = lens _tCounters (\ s a -> s{_tCounters = a});
+
+-- | The test\'s ARN.
+tArn :: Lens' Test (Maybe Text)
+tArn = lens _tArn (\ s a -> s{_tArn = a});
+
+-- | When the test was created.
+tCreated :: Lens' Test (Maybe UTCTime)
+tCreated = lens _tCreated (\ s a -> s{_tCreated = a}) . mapping _Time;
+
+-- | The test\'s stop time.
+tStopped :: Lens' Test (Maybe UTCTime)
+tStopped = lens _tStopped (\ s a -> s{_tStopped = a}) . mapping _Time;
+
+-- | The test\'s result.
+--
+-- Allowed values include:
+--
+-- -   ERRORED: An error condition.
+--
+-- -   FAILED: A failed condition.
+--
+-- -   SKIPPED: A skipped condition.
+--
+-- -   STOPPED: A stopped condition.
+--
+-- -   PASSED: A passing condition.
+--
+-- -   PENDING: A pending condition.
+--
+-- -   WARNED: A warning condition.
+--
+tResult :: Lens' Test (Maybe ExecutionResult)
+tResult = lens _tResult (\ s a -> s{_tResult = a});
+
+-- | The test\'s name.
+tName :: Lens' Test (Maybe Text)
+tName = lens _tName (\ s a -> s{_tName = a});
+
+-- | The test\'s type.
+--
+-- Must be one of the following values:
+--
+-- -   BUILTIN_FUZZ: The built-in fuzz type.
+--
+-- -   BUILTIN_EXPLORER: For Android, an app explorer that will traverse an
+--     Android app, interacting with it and capturing screenshots at the
+--     same time.
+--
+-- -   APPIUM_JAVA_JUNIT: The Appium Java JUnit type.
+--
+-- -   APPIUM_JAVA_TESTNG: The Appium Java TestNG type.
+--
+-- -   CALABASH: The Calabash type.
+--
+-- -   INSTRUMENTATION: The Instrumentation type.
+--
+-- -   UIAUTOMATION: The uiautomation type.
+--
+-- -   UIAUTOMATOR: The uiautomator type.
+--
+-- -   XCTEST: The XCode test type.
+--
+tType :: Lens' Test (Maybe TestType)
+tType = lens _tType (\ s a -> s{_tType = a});
+
+-- | A message about the test\'s result.
+tMessage :: Lens' Test (Maybe Text)
+tMessage = lens _tMessage (\ s a -> s{_tMessage = a});
+
+-- | The test\'s start time.
+tStarted :: Lens' Test (Maybe UTCTime)
+tStarted = lens _tStarted (\ s a -> s{_tStarted = a}) . mapping _Time;
+
+instance FromJSON Test where
+        parseJSON
+          = withObject "Test"
+              (\ x ->
+                 Test' <$>
+                   (x .:? "status") <*> (x .:? "counters") <*>
+                     (x .:? "arn")
+                     <*> (x .:? "created")
+                     <*> (x .:? "stopped")
+                     <*> (x .:? "result")
+                     <*> (x .:? "name")
+                     <*> (x .:? "type")
+                     <*> (x .:? "message")
+                     <*> (x .:? "started"))
+
+-- | A collection of one or more problems, grouped by their result.
+--
+-- /See:/ 'uniqueProblem' smart constructor.
+data UniqueProblem = UniqueProblem'
+    { _upProblems :: !(Maybe [Problem])
+    , _upMessage  :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'UniqueProblem' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'upProblems'
+--
+-- * 'upMessage'
+uniqueProblem
+    :: UniqueProblem
+uniqueProblem =
+    UniqueProblem'
+    { _upProblems = Nothing
+    , _upMessage = Nothing
+    }
+
+-- | Information about the problems.
+upProblems :: Lens' UniqueProblem [Problem]
+upProblems = lens _upProblems (\ s a -> s{_upProblems = a}) . _Default . _Coerce;
+
+-- | A message about the unique problems\' result.
+upMessage :: Lens' UniqueProblem (Maybe Text)
+upMessage = lens _upMessage (\ s a -> s{_upMessage = a});
+
+instance FromJSON UniqueProblem where
+        parseJSON
+          = withObject "UniqueProblem"
+              (\ x ->
+                 UniqueProblem' <$>
+                   (x .:? "problems" .!= mempty) <*> (x .:? "message"))
+
+-- | An app or a set of one or more tests to upload or that have been
+-- uploaded.
+--
+-- /See:/ 'upload' smart constructor.
+data Upload = Upload'
+    { _uStatus      :: !(Maybe UploadStatus)
+    , _uArn         :: !(Maybe Text)
+    , _uCreated     :: !(Maybe POSIX)
+    , _uUrl         :: !(Maybe Text)
+    , _uName        :: !(Maybe Text)
+    , _uMetadata    :: !(Maybe Text)
+    , _uType        :: !(Maybe UploadType)
+    , _uMessage     :: !(Maybe Text)
+    , _uContentType :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Upload' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'uStatus'
+--
+-- * 'uArn'
+--
+-- * 'uCreated'
+--
+-- * 'uUrl'
+--
+-- * 'uName'
+--
+-- * 'uMetadata'
+--
+-- * 'uType'
+--
+-- * 'uMessage'
+--
+-- * 'uContentType'
+upload
+    :: Upload
+upload =
+    Upload'
+    { _uStatus = Nothing
+    , _uArn = Nothing
+    , _uCreated = Nothing
+    , _uUrl = Nothing
+    , _uName = Nothing
+    , _uMetadata = Nothing
+    , _uType = Nothing
+    , _uMessage = Nothing
+    , _uContentType = Nothing
+    }
+
+-- | The upload\'s status.
+--
+-- Must be one of the following values:
+--
+-- -   FAILED: A failed status.
+--
+-- -   INITIALIZED: An initialized status.
+--
+-- -   PROCESSING: A processing status.
+--
+-- -   SUCCEEDED: A succeeded status.
+--
+uStatus :: Lens' Upload (Maybe UploadStatus)
+uStatus = lens _uStatus (\ s a -> s{_uStatus = a});
+
+-- | The upload\'s ARN.
+uArn :: Lens' Upload (Maybe Text)
+uArn = lens _uArn (\ s a -> s{_uArn = a});
+
+-- | When the upload was created.
+uCreated :: Lens' Upload (Maybe UTCTime)
+uCreated = lens _uCreated (\ s a -> s{_uCreated = a}) . mapping _Time;
+
+-- | The pre-signed Amazon S3 URL that was used to store a file through a
+-- corresponding PUT request.
+uUrl :: Lens' Upload (Maybe Text)
+uUrl = lens _uUrl (\ s a -> s{_uUrl = a});
+
+-- | The upload\'s file name.
+uName :: Lens' Upload (Maybe Text)
+uName = lens _uName (\ s a -> s{_uName = a});
+
+-- | The upload\'s metadata. For example, for Android, this contains
+-- information that is parsed from the manifest and is displayed in the AWS
+-- Device Farm console after the associated app is uploaded.
+uMetadata :: Lens' Upload (Maybe Text)
+uMetadata = lens _uMetadata (\ s a -> s{_uMetadata = a});
+
+-- | The upload\'s type.
+--
+-- Must be one of the following values:
+--
+-- -   ANDROID_APP: An Android upload.
+--
+-- -   IOS_APP: An iOS upload.
+--
+-- -   EXTERNAL_DATA: An external data upload.
+--
+-- -   APPIUM_JAVA_JUNIT_TEST_PACKAGE: An Appium Java JUnit test package
+--     upload.
+--
+-- -   APPIUM_JAVA_TESTNG_TEST_PACKAGE: An Appium Java TestNG test package
+--     upload.
+--
+-- -   CALABASH_TEST_PACKAGE: A Calabash test package upload.
+--
+-- -   INSTRUMENTATION_TEST_PACKAGE: An instrumentation upload.
+--
+-- -   UIAUTOMATOR_TEST_PACKAGE: A uiautomator test package upload.
+--
+-- -   XCTEST_TEST_PACKAGE: An XCode test package upload.
+--
+uType :: Lens' Upload (Maybe UploadType)
+uType = lens _uType (\ s a -> s{_uType = a});
+
+-- | A message about the upload\'s result.
+uMessage :: Lens' Upload (Maybe Text)
+uMessage = lens _uMessage (\ s a -> s{_uMessage = a});
+
+-- | The upload\'s content type (for example, \"application\/octet-stream\").
+uContentType :: Lens' Upload (Maybe Text)
+uContentType = lens _uContentType (\ s a -> s{_uContentType = a});
+
+instance FromJSON Upload where
+        parseJSON
+          = withObject "Upload"
+              (\ x ->
+                 Upload' <$>
+                   (x .:? "status") <*> (x .:? "arn") <*>
+                     (x .:? "created")
+                     <*> (x .:? "url")
+                     <*> (x .:? "name")
+                     <*> (x .:? "metadata")
+                     <*> (x .:? "type")
+                     <*> (x .:? "message")
+                     <*> (x .:? "contentType"))
diff --git a/gen/Network/AWS/DeviceFarm/Types/Sum.hs b/gen/Network/AWS/DeviceFarm/Types/Sum.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DeviceFarm/Types/Sum.hs
@@ -0,0 +1,568 @@
+{-# 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.DeviceFarm.Types.Sum
+-- Copyright   : (c) 2013-2015 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.DeviceFarm.Types.Sum where
+
+import           Network.AWS.Prelude
+
+data ArtifactCategory
+    = ACFile
+    | ACLog
+    | ACScreenshot
+    deriving (Eq,Ord,Read,Show,Enum,Data,Typeable,Generic)
+
+instance FromText ArtifactCategory where
+    parser = takeLowerText >>= \case
+        "file" -> pure ACFile
+        "log" -> pure ACLog
+        "screenshot" -> pure ACScreenshot
+        e -> fromTextError $ "Failure parsing ArtifactCategory from value: '" <> e
+           <> "'. Accepted values: file, log, screenshot"
+
+instance ToText ArtifactCategory where
+    toText = \case
+        ACFile -> "file"
+        ACLog -> "log"
+        ACScreenshot -> "screenshot"
+
+instance Hashable     ArtifactCategory
+instance ToByteString ArtifactCategory
+instance ToQuery      ArtifactCategory
+instance ToHeader     ArtifactCategory
+
+instance ToJSON ArtifactCategory where
+    toJSON = toJSONText
+
+data ArtifactType
+    = AppiumJavaOutput
+    | AppiumJavaXMLOutput
+    | AppiumServerOutput
+    | AutomationOutput
+    | CalabashJSONOutput
+    | CalabashJavaXMLOutput
+    | CalabashPrettyOutput
+    | CalabashStandardOutput
+    | DeviceLog
+    | ExerciserMonkeyOutput
+    | InstrumentationOutput
+    | MessageLog
+    | ResultLog
+    | Screenshot
+    | ServiceLog
+    | Unknown
+    deriving (Eq,Ord,Read,Show,Enum,Data,Typeable,Generic)
+
+instance FromText ArtifactType where
+    parser = takeLowerText >>= \case
+        "appium_java_output" -> pure AppiumJavaOutput
+        "appium_java_xml_output" -> pure AppiumJavaXMLOutput
+        "appium_server_output" -> pure AppiumServerOutput
+        "automation_output" -> pure AutomationOutput
+        "calabash_json_output" -> pure CalabashJSONOutput
+        "calabash_java_xml_output" -> pure CalabashJavaXMLOutput
+        "calabash_pretty_output" -> pure CalabashPrettyOutput
+        "calabash_standard_output" -> pure CalabashStandardOutput
+        "device_log" -> pure DeviceLog
+        "exerciser_monkey_output" -> pure ExerciserMonkeyOutput
+        "instrumentation_output" -> pure InstrumentationOutput
+        "message_log" -> pure MessageLog
+        "result_log" -> pure ResultLog
+        "screenshot" -> pure Screenshot
+        "service_log" -> pure ServiceLog
+        "unknown" -> pure Unknown
+        e -> fromTextError $ "Failure parsing ArtifactType from value: '" <> e
+           <> "'. Accepted values: appium_java_output, appium_java_xml_output, appium_server_output, automation_output, calabash_json_output, calabash_java_xml_output, calabash_pretty_output, calabash_standard_output, device_log, exerciser_monkey_output, instrumentation_output, message_log, result_log, screenshot, service_log, unknown"
+
+instance ToText ArtifactType where
+    toText = \case
+        AppiumJavaOutput -> "appium_java_output"
+        AppiumJavaXMLOutput -> "appium_java_xml_output"
+        AppiumServerOutput -> "appium_server_output"
+        AutomationOutput -> "automation_output"
+        CalabashJSONOutput -> "calabash_json_output"
+        CalabashJavaXMLOutput -> "calabash_java_xml_output"
+        CalabashPrettyOutput -> "calabash_pretty_output"
+        CalabashStandardOutput -> "calabash_standard_output"
+        DeviceLog -> "device_log"
+        ExerciserMonkeyOutput -> "exerciser_monkey_output"
+        InstrumentationOutput -> "instrumentation_output"
+        MessageLog -> "message_log"
+        ResultLog -> "result_log"
+        Screenshot -> "screenshot"
+        ServiceLog -> "service_log"
+        Unknown -> "unknown"
+
+instance Hashable     ArtifactType
+instance ToByteString ArtifactType
+instance ToQuery      ArtifactType
+instance ToHeader     ArtifactType
+
+instance FromJSON ArtifactType where
+    parseJSON = parseJSONText "ArtifactType"
+
+data BillingMethod
+    = Metered
+    | Unmetered
+    deriving (Eq,Ord,Read,Show,Enum,Data,Typeable,Generic)
+
+instance FromText BillingMethod where
+    parser = takeLowerText >>= \case
+        "metered" -> pure Metered
+        "unmetered" -> pure Unmetered
+        e -> fromTextError $ "Failure parsing BillingMethod from value: '" <> e
+           <> "'. Accepted values: metered, unmetered"
+
+instance ToText BillingMethod where
+    toText = \case
+        Metered -> "metered"
+        Unmetered -> "unmetered"
+
+instance Hashable     BillingMethod
+instance ToByteString BillingMethod
+instance ToQuery      BillingMethod
+instance ToHeader     BillingMethod
+
+instance ToJSON BillingMethod where
+    toJSON = toJSONText
+
+instance FromJSON BillingMethod where
+    parseJSON = parseJSONText "BillingMethod"
+
+data DeviceAttribute
+    = ARN
+    | FormFactor
+    | Manufacturer
+    | Platform
+    deriving (Eq,Ord,Read,Show,Enum,Data,Typeable,Generic)
+
+instance FromText DeviceAttribute where
+    parser = takeLowerText >>= \case
+        "arn" -> pure ARN
+        "form_factor" -> pure FormFactor
+        "manufacturer" -> pure Manufacturer
+        "platform" -> pure Platform
+        e -> fromTextError $ "Failure parsing DeviceAttribute from value: '" <> e
+           <> "'. Accepted values: arn, form_factor, manufacturer, platform"
+
+instance ToText DeviceAttribute where
+    toText = \case
+        ARN -> "arn"
+        FormFactor -> "form_factor"
+        Manufacturer -> "manufacturer"
+        Platform -> "platform"
+
+instance Hashable     DeviceAttribute
+instance ToByteString DeviceAttribute
+instance ToQuery      DeviceAttribute
+instance ToHeader     DeviceAttribute
+
+instance ToJSON DeviceAttribute where
+    toJSON = toJSONText
+
+instance FromJSON DeviceAttribute where
+    parseJSON = parseJSONText "DeviceAttribute"
+
+data DeviceFormFactor
+    = Phone
+    | Tablet
+    deriving (Eq,Ord,Read,Show,Enum,Data,Typeable,Generic)
+
+instance FromText DeviceFormFactor where
+    parser = takeLowerText >>= \case
+        "phone" -> pure Phone
+        "tablet" -> pure Tablet
+        e -> fromTextError $ "Failure parsing DeviceFormFactor from value: '" <> e
+           <> "'. Accepted values: phone, tablet"
+
+instance ToText DeviceFormFactor where
+    toText = \case
+        Phone -> "phone"
+        Tablet -> "tablet"
+
+instance Hashable     DeviceFormFactor
+instance ToByteString DeviceFormFactor
+instance ToQuery      DeviceFormFactor
+instance ToHeader     DeviceFormFactor
+
+instance FromJSON DeviceFormFactor where
+    parseJSON = parseJSONText "DeviceFormFactor"
+
+data DevicePlatform
+    = Android
+    | Ios
+    deriving (Eq,Ord,Read,Show,Enum,Data,Typeable,Generic)
+
+instance FromText DevicePlatform where
+    parser = takeLowerText >>= \case
+        "android" -> pure Android
+        "ios" -> pure Ios
+        e -> fromTextError $ "Failure parsing DevicePlatform from value: '" <> e
+           <> "'. Accepted values: android, ios"
+
+instance ToText DevicePlatform where
+    toText = \case
+        Android -> "android"
+        Ios -> "ios"
+
+instance Hashable     DevicePlatform
+instance ToByteString DevicePlatform
+instance ToQuery      DevicePlatform
+instance ToHeader     DevicePlatform
+
+instance FromJSON DevicePlatform where
+    parseJSON = parseJSONText "DevicePlatform"
+
+data DevicePoolType
+    = Curated
+    | Private
+    deriving (Eq,Ord,Read,Show,Enum,Data,Typeable,Generic)
+
+instance FromText DevicePoolType where
+    parser = takeLowerText >>= \case
+        "curated" -> pure Curated
+        "private" -> pure Private
+        e -> fromTextError $ "Failure parsing DevicePoolType from value: '" <> e
+           <> "'. Accepted values: curated, private"
+
+instance ToText DevicePoolType where
+    toText = \case
+        Curated -> "curated"
+        Private -> "private"
+
+instance Hashable     DevicePoolType
+instance ToByteString DevicePoolType
+instance ToQuery      DevicePoolType
+instance ToHeader     DevicePoolType
+
+instance ToJSON DevicePoolType where
+    toJSON = toJSONText
+
+instance FromJSON DevicePoolType where
+    parseJSON = parseJSONText "DevicePoolType"
+
+data ExecutionResult
+    = ERErrored
+    | ERFailed
+    | ERPassed
+    | ERPending
+    | ERSkipped
+    | ERStopped
+    | ERWarned
+    deriving (Eq,Ord,Read,Show,Enum,Data,Typeable,Generic)
+
+instance FromText ExecutionResult where
+    parser = takeLowerText >>= \case
+        "errored" -> pure ERErrored
+        "failed" -> pure ERFailed
+        "passed" -> pure ERPassed
+        "pending" -> pure ERPending
+        "skipped" -> pure ERSkipped
+        "stopped" -> pure ERStopped
+        "warned" -> pure ERWarned
+        e -> fromTextError $ "Failure parsing ExecutionResult from value: '" <> e
+           <> "'. Accepted values: errored, failed, passed, pending, skipped, stopped, warned"
+
+instance ToText ExecutionResult where
+    toText = \case
+        ERErrored -> "errored"
+        ERFailed -> "failed"
+        ERPassed -> "passed"
+        ERPending -> "pending"
+        ERSkipped -> "skipped"
+        ERStopped -> "stopped"
+        ERWarned -> "warned"
+
+instance Hashable     ExecutionResult
+instance ToByteString ExecutionResult
+instance ToQuery      ExecutionResult
+instance ToHeader     ExecutionResult
+
+instance FromJSON ExecutionResult where
+    parseJSON = parseJSONText "ExecutionResult"
+
+data ExecutionStatus
+    = Completed
+    | Pending
+    | Processing
+    | Running
+    | Scheduling
+    deriving (Eq,Ord,Read,Show,Enum,Data,Typeable,Generic)
+
+instance FromText ExecutionStatus where
+    parser = takeLowerText >>= \case
+        "completed" -> pure Completed
+        "pending" -> pure Pending
+        "processing" -> pure Processing
+        "running" -> pure Running
+        "scheduling" -> pure Scheduling
+        e -> fromTextError $ "Failure parsing ExecutionStatus from value: '" <> e
+           <> "'. Accepted values: completed, pending, processing, running, scheduling"
+
+instance ToText ExecutionStatus where
+    toText = \case
+        Completed -> "completed"
+        Pending -> "pending"
+        Processing -> "processing"
+        Running -> "running"
+        Scheduling -> "scheduling"
+
+instance Hashable     ExecutionStatus
+instance ToByteString ExecutionStatus
+instance ToQuery      ExecutionStatus
+instance ToHeader     ExecutionStatus
+
+instance FromJSON ExecutionStatus where
+    parseJSON = parseJSONText "ExecutionStatus"
+
+data RuleOperator
+    = Equals
+    | GreaterThan
+    | IN
+    | LessThan
+    | NotIn
+    deriving (Eq,Ord,Read,Show,Enum,Data,Typeable,Generic)
+
+instance FromText RuleOperator where
+    parser = takeLowerText >>= \case
+        "equals" -> pure Equals
+        "greater_than" -> pure GreaterThan
+        "in" -> pure IN
+        "less_than" -> pure LessThan
+        "not_in" -> pure NotIn
+        e -> fromTextError $ "Failure parsing RuleOperator from value: '" <> e
+           <> "'. Accepted values: equals, greater_than, in, less_than, not_in"
+
+instance ToText RuleOperator where
+    toText = \case
+        Equals -> "equals"
+        GreaterThan -> "greater_than"
+        IN -> "in"
+        LessThan -> "less_than"
+        NotIn -> "not_in"
+
+instance Hashable     RuleOperator
+instance ToByteString RuleOperator
+instance ToQuery      RuleOperator
+instance ToHeader     RuleOperator
+
+instance ToJSON RuleOperator where
+    toJSON = toJSONText
+
+instance FromJSON RuleOperator where
+    parseJSON = parseJSONText "RuleOperator"
+
+data SampleType
+    = CPU
+    | Memory
+    | NativeAvgDrawtime
+    | NativeFps
+    | NativeFrames
+    | NativeMaxDrawtime
+    | NativeMinDrawtime
+    | OpenglAvgDrawtime
+    | OpenglFps
+    | OpenglFrames
+    | OpenglMaxDrawtime
+    | OpenglMinDrawtime
+    | RX
+    | RxRate
+    | TX
+    | Threads
+    | TxRate
+    deriving (Eq,Ord,Read,Show,Enum,Data,Typeable,Generic)
+
+instance FromText SampleType where
+    parser = takeLowerText >>= \case
+        "cpu" -> pure CPU
+        "memory" -> pure Memory
+        "native_avg_drawtime" -> pure NativeAvgDrawtime
+        "native_fps" -> pure NativeFps
+        "native_frames" -> pure NativeFrames
+        "native_max_drawtime" -> pure NativeMaxDrawtime
+        "native_min_drawtime" -> pure NativeMinDrawtime
+        "opengl_avg_drawtime" -> pure OpenglAvgDrawtime
+        "opengl_fps" -> pure OpenglFps
+        "opengl_frames" -> pure OpenglFrames
+        "opengl_max_drawtime" -> pure OpenglMaxDrawtime
+        "opengl_min_drawtime" -> pure OpenglMinDrawtime
+        "rx" -> pure RX
+        "rx_rate" -> pure RxRate
+        "tx" -> pure TX
+        "threads" -> pure Threads
+        "tx_rate" -> pure TxRate
+        e -> fromTextError $ "Failure parsing SampleType from value: '" <> e
+           <> "'. Accepted values: cpu, memory, native_avg_drawtime, native_fps, native_frames, native_max_drawtime, native_min_drawtime, opengl_avg_drawtime, opengl_fps, opengl_frames, opengl_max_drawtime, opengl_min_drawtime, rx, rx_rate, tx, threads, tx_rate"
+
+instance ToText SampleType where
+    toText = \case
+        CPU -> "cpu"
+        Memory -> "memory"
+        NativeAvgDrawtime -> "native_avg_drawtime"
+        NativeFps -> "native_fps"
+        NativeFrames -> "native_frames"
+        NativeMaxDrawtime -> "native_max_drawtime"
+        NativeMinDrawtime -> "native_min_drawtime"
+        OpenglAvgDrawtime -> "opengl_avg_drawtime"
+        OpenglFps -> "opengl_fps"
+        OpenglFrames -> "opengl_frames"
+        OpenglMaxDrawtime -> "opengl_max_drawtime"
+        OpenglMinDrawtime -> "opengl_min_drawtime"
+        RX -> "rx"
+        RxRate -> "rx_rate"
+        TX -> "tx"
+        Threads -> "threads"
+        TxRate -> "tx_rate"
+
+instance Hashable     SampleType
+instance ToByteString SampleType
+instance ToQuery      SampleType
+instance ToHeader     SampleType
+
+instance FromJSON SampleType where
+    parseJSON = parseJSONText "SampleType"
+
+data TestType
+    = AppiumJavaJunit
+    | AppiumJavaTestng
+    | BuiltinExplorer
+    | BuiltinFuzz
+    | Calabash
+    | Instrumentation
+    | Uiautomation
+    | Uiautomator
+    | Xctest
+    deriving (Eq,Ord,Read,Show,Enum,Data,Typeable,Generic)
+
+instance FromText TestType where
+    parser = takeLowerText >>= \case
+        "appium_java_junit" -> pure AppiumJavaJunit
+        "appium_java_testng" -> pure AppiumJavaTestng
+        "builtin_explorer" -> pure BuiltinExplorer
+        "builtin_fuzz" -> pure BuiltinFuzz
+        "calabash" -> pure Calabash
+        "instrumentation" -> pure Instrumentation
+        "uiautomation" -> pure Uiautomation
+        "uiautomator" -> pure Uiautomator
+        "xctest" -> pure Xctest
+        e -> fromTextError $ "Failure parsing TestType from value: '" <> e
+           <> "'. Accepted values: appium_java_junit, appium_java_testng, builtin_explorer, builtin_fuzz, calabash, instrumentation, uiautomation, uiautomator, xctest"
+
+instance ToText TestType where
+    toText = \case
+        AppiumJavaJunit -> "appium_java_junit"
+        AppiumJavaTestng -> "appium_java_testng"
+        BuiltinExplorer -> "builtin_explorer"
+        BuiltinFuzz -> "builtin_fuzz"
+        Calabash -> "calabash"
+        Instrumentation -> "instrumentation"
+        Uiautomation -> "uiautomation"
+        Uiautomator -> "uiautomator"
+        Xctest -> "xctest"
+
+instance Hashable     TestType
+instance ToByteString TestType
+instance ToQuery      TestType
+instance ToHeader     TestType
+
+instance ToJSON TestType where
+    toJSON = toJSONText
+
+instance FromJSON TestType where
+    parseJSON = parseJSONText "TestType"
+
+data UploadStatus
+    = USFailed
+    | USInitialized
+    | USProcessing
+    | USSucceeded
+    deriving (Eq,Ord,Read,Show,Enum,Data,Typeable,Generic)
+
+instance FromText UploadStatus where
+    parser = takeLowerText >>= \case
+        "failed" -> pure USFailed
+        "initialized" -> pure USInitialized
+        "processing" -> pure USProcessing
+        "succeeded" -> pure USSucceeded
+        e -> fromTextError $ "Failure parsing UploadStatus from value: '" <> e
+           <> "'. Accepted values: failed, initialized, processing, succeeded"
+
+instance ToText UploadStatus where
+    toText = \case
+        USFailed -> "failed"
+        USInitialized -> "initialized"
+        USProcessing -> "processing"
+        USSucceeded -> "succeeded"
+
+instance Hashable     UploadStatus
+instance ToByteString UploadStatus
+instance ToQuery      UploadStatus
+instance ToHeader     UploadStatus
+
+instance FromJSON UploadStatus where
+    parseJSON = parseJSONText "UploadStatus"
+
+data UploadType
+    = AndroidApp
+    | AppiumJavaJunitTestPackage
+    | AppiumJavaTestngTestPackage
+    | CalabashTestPackage
+    | ExternalData
+    | InstrumentationTestPackage
+    | IosApp
+    | UiautomationTestPackage
+    | UiautomatorTestPackage
+    | XctestTestPackage
+    deriving (Eq,Ord,Read,Show,Enum,Data,Typeable,Generic)
+
+instance FromText UploadType where
+    parser = takeLowerText >>= \case
+        "android_app" -> pure AndroidApp
+        "appium_java_junit_test_package" -> pure AppiumJavaJunitTestPackage
+        "appium_java_testng_test_package" -> pure AppiumJavaTestngTestPackage
+        "calabash_test_package" -> pure CalabashTestPackage
+        "external_data" -> pure ExternalData
+        "instrumentation_test_package" -> pure InstrumentationTestPackage
+        "ios_app" -> pure IosApp
+        "uiautomation_test_package" -> pure UiautomationTestPackage
+        "uiautomator_test_package" -> pure UiautomatorTestPackage
+        "xctest_test_package" -> pure XctestTestPackage
+        e -> fromTextError $ "Failure parsing UploadType from value: '" <> e
+           <> "'. Accepted values: android_app, appium_java_junit_test_package, appium_java_testng_test_package, calabash_test_package, external_data, instrumentation_test_package, ios_app, uiautomation_test_package, uiautomator_test_package, xctest_test_package"
+
+instance ToText UploadType where
+    toText = \case
+        AndroidApp -> "android_app"
+        AppiumJavaJunitTestPackage -> "appium_java_junit_test_package"
+        AppiumJavaTestngTestPackage -> "appium_java_testng_test_package"
+        CalabashTestPackage -> "calabash_test_package"
+        ExternalData -> "external_data"
+        InstrumentationTestPackage -> "instrumentation_test_package"
+        IosApp -> "ios_app"
+        UiautomationTestPackage -> "uiautomation_test_package"
+        UiautomatorTestPackage -> "uiautomator_test_package"
+        XctestTestPackage -> "xctest_test_package"
+
+instance Hashable     UploadType
+instance ToByteString UploadType
+instance ToQuery      UploadType
+instance ToHeader     UploadType
+
+instance ToJSON UploadType where
+    toJSON = toJSONText
+
+instance FromJSON UploadType where
+    parseJSON = parseJSONText "UploadType"
diff --git a/gen/Network/AWS/DeviceFarm/Waiters.hs b/gen/Network/AWS/DeviceFarm/Waiters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DeviceFarm/Waiters.hs
@@ -0,0 +1,20 @@
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TypeFamilies      #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.DeviceFarm.Waiters
+-- Copyright   : (c) 2013-2015 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.DeviceFarm.Waiters where
+
+import           Network.AWS.DeviceFarm.Types
+import           Network.AWS.Prelude
+import           Network.AWS.Waiter
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-2015 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.DeviceFarm
+import Test.AWS.DeviceFarm.Internal
+
+main :: IO ()
+main = defaultMain $ testGroup "DeviceFarm"
+    [ testGroup "tests"    tests
+    , testGroup "fixtures" fixtures
+    ]
diff --git a/test/Test/AWS/DeviceFarm.hs b/test/Test/AWS/DeviceFarm.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/AWS/DeviceFarm.hs
@@ -0,0 +1,26 @@
+{-# LANGUAGE OverloadedStrings #-}
+
+-- Module      : Test.AWS.DeviceFarm
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : This Source Code Form is subject to the terms of
+--               the Mozilla Public License, v. 2.0.
+--               A copy of the MPL can be found in the LICENSE file or
+--               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : experimental
+-- Portability : non-portable (GHC extensions)
+
+module Test.AWS.DeviceFarm
+    ( tests
+    , fixtures
+    ) where
+
+import           Network.AWS.DeviceFarm
+import           Test.AWS.Gen.DeviceFarm
+import           Test.Tasty
+
+tests :: [TestTree]
+tests = []
+
+fixtures :: [TestTree]
+fixtures = []
diff --git a/test/Test/AWS/DeviceFarm/Internal.hs b/test/Test/AWS/DeviceFarm/Internal.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/AWS/DeviceFarm/Internal.hs
@@ -0,0 +1,16 @@
+{-# LANGUAGE OverloadedStrings #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Test.AWS.DeviceFarm.Internal
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : This Source Code Form is subject to the terms of
+--               the Mozilla Public License, v. 2.0.
+--               A copy of the MPL can be found in the LICENSE file or
+--               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : experimental
+-- Portability : non-portable (GHC extensions)
+
+module Test.AWS.DeviceFarm.Internal where
+
+import           Test.AWS.Prelude
diff --git a/test/Test/AWS/Gen/DeviceFarm.hs b/test/Test/AWS/Gen/DeviceFarm.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/AWS/Gen/DeviceFarm.hs
@@ -0,0 +1,464 @@
+{-# 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.DeviceFarm
+-- Copyright   : (c) 2013-2015 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.DeviceFarm where
+
+import Data.Proxy
+import Test.AWS.Fixture
+import Test.AWS.Prelude
+import Test.Tasty
+import Network.AWS.DeviceFarm
+import Test.AWS.DeviceFarm.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"
+--         [ testListProjects $
+--             listProjects
+--
+--         , testGetDevicePoolCompatibility $
+--             getDevicePoolCompatibility
+--
+--         , testListTests $
+--             listTests
+--
+--         , testCreateUpload $
+--             createUpload
+--
+--         , testListArtifacts $
+--             listArtifacts
+--
+--         , testGetDevicePool $
+--             getDevicePool
+--
+--         , testGetUpload $
+--             getUpload
+--
+--         , testListDevicePools $
+--             listDevicePools
+--
+--         , testGetTest $
+--             getTest
+--
+--         , testCreateDevicePool $
+--             createDevicePool
+--
+--         , testListRuns $
+--             listRuns
+--
+--         , testListJobs $
+--             listJobs
+--
+--         , testGetDevice $
+--             getDevice
+--
+--         , testGetJob $
+--             getJob
+--
+--         , testScheduleRun $
+--             scheduleRun
+--
+--         , testGetRun $
+--             getRun
+--
+--         , testListSamples $
+--             listSamples
+--
+--         , testListSuites $
+--             listSuites
+--
+--         , testGetAccountSettings $
+--             getAccountSettings
+--
+--         , testListUploads $
+--             listUploads
+--
+--         , testGetSuite $
+--             getSuite
+--
+--         , testGetProject $
+--             getProject
+--
+--         , testListDevices $
+--             listDevices
+--
+--         , testListUniqueProblems $
+--             listUniqueProblems
+--
+--         , testCreateProject $
+--             createProject
+--
+--           ]
+
+--     , testGroup "response"
+--         [ testListProjectsResponse $
+--             listProjectsResponse
+--
+--         , testGetDevicePoolCompatibilityResponse $
+--             getDevicePoolCompatibilityResponse
+--
+--         , testListTestsResponse $
+--             listTestsResponse
+--
+--         , testCreateUploadResponse $
+--             createUploadResponse
+--
+--         , testListArtifactsResponse $
+--             listArtifactsResponse
+--
+--         , testGetDevicePoolResponse $
+--             getDevicePoolResponse
+--
+--         , testGetUploadResponse $
+--             getUploadResponse
+--
+--         , testListDevicePoolsResponse $
+--             listDevicePoolsResponse
+--
+--         , testGetTestResponse $
+--             getTestResponse
+--
+--         , testCreateDevicePoolResponse $
+--             createDevicePoolResponse
+--
+--         , testListRunsResponse $
+--             listRunsResponse
+--
+--         , testListJobsResponse $
+--             listJobsResponse
+--
+--         , testGetDeviceResponse $
+--             getDeviceResponse
+--
+--         , testGetJobResponse $
+--             getJobResponse
+--
+--         , testScheduleRunResponse $
+--             scheduleRunResponse
+--
+--         , testGetRunResponse $
+--             getRunResponse
+--
+--         , testListSamplesResponse $
+--             listSamplesResponse
+--
+--         , testListSuitesResponse $
+--             listSuitesResponse
+--
+--         , testGetAccountSettingsResponse $
+--             getAccountSettingsResponse
+--
+--         , testListUploadsResponse $
+--             listUploadsResponse
+--
+--         , testGetSuiteResponse $
+--             getSuiteResponse
+--
+--         , testGetProjectResponse $
+--             getProjectResponse
+--
+--         , testListDevicesResponse $
+--             listDevicesResponse
+--
+--         , testListUniqueProblemsResponse $
+--             listUniqueProblemsResponse
+--
+--         , testCreateProjectResponse $
+--             createProjectResponse
+--
+--           ]
+--     ]
+
+-- Requests
+
+testListProjects :: ListProjects -> TestTree
+testListProjects = req
+    "ListProjects"
+    "fixture/ListProjects"
+
+testGetDevicePoolCompatibility :: GetDevicePoolCompatibility -> TestTree
+testGetDevicePoolCompatibility = req
+    "GetDevicePoolCompatibility"
+    "fixture/GetDevicePoolCompatibility"
+
+testListTests :: ListTests -> TestTree
+testListTests = req
+    "ListTests"
+    "fixture/ListTests"
+
+testCreateUpload :: CreateUpload -> TestTree
+testCreateUpload = req
+    "CreateUpload"
+    "fixture/CreateUpload"
+
+testListArtifacts :: ListArtifacts -> TestTree
+testListArtifacts = req
+    "ListArtifacts"
+    "fixture/ListArtifacts"
+
+testGetDevicePool :: GetDevicePool -> TestTree
+testGetDevicePool = req
+    "GetDevicePool"
+    "fixture/GetDevicePool"
+
+testGetUpload :: GetUpload -> TestTree
+testGetUpload = req
+    "GetUpload"
+    "fixture/GetUpload"
+
+testListDevicePools :: ListDevicePools -> TestTree
+testListDevicePools = req
+    "ListDevicePools"
+    "fixture/ListDevicePools"
+
+testGetTest :: GetTest -> TestTree
+testGetTest = req
+    "GetTest"
+    "fixture/GetTest"
+
+testCreateDevicePool :: CreateDevicePool -> TestTree
+testCreateDevicePool = req
+    "CreateDevicePool"
+    "fixture/CreateDevicePool"
+
+testListRuns :: ListRuns -> TestTree
+testListRuns = req
+    "ListRuns"
+    "fixture/ListRuns"
+
+testListJobs :: ListJobs -> TestTree
+testListJobs = req
+    "ListJobs"
+    "fixture/ListJobs"
+
+testGetDevice :: GetDevice -> TestTree
+testGetDevice = req
+    "GetDevice"
+    "fixture/GetDevice"
+
+testGetJob :: GetJob -> TestTree
+testGetJob = req
+    "GetJob"
+    "fixture/GetJob"
+
+testScheduleRun :: ScheduleRun -> TestTree
+testScheduleRun = req
+    "ScheduleRun"
+    "fixture/ScheduleRun"
+
+testGetRun :: GetRun -> TestTree
+testGetRun = req
+    "GetRun"
+    "fixture/GetRun"
+
+testListSamples :: ListSamples -> TestTree
+testListSamples = req
+    "ListSamples"
+    "fixture/ListSamples"
+
+testListSuites :: ListSuites -> TestTree
+testListSuites = req
+    "ListSuites"
+    "fixture/ListSuites"
+
+testGetAccountSettings :: GetAccountSettings -> TestTree
+testGetAccountSettings = req
+    "GetAccountSettings"
+    "fixture/GetAccountSettings"
+
+testListUploads :: ListUploads -> TestTree
+testListUploads = req
+    "ListUploads"
+    "fixture/ListUploads"
+
+testGetSuite :: GetSuite -> TestTree
+testGetSuite = req
+    "GetSuite"
+    "fixture/GetSuite"
+
+testGetProject :: GetProject -> TestTree
+testGetProject = req
+    "GetProject"
+    "fixture/GetProject"
+
+testListDevices :: ListDevices -> TestTree
+testListDevices = req
+    "ListDevices"
+    "fixture/ListDevices"
+
+testListUniqueProblems :: ListUniqueProblems -> TestTree
+testListUniqueProblems = req
+    "ListUniqueProblems"
+    "fixture/ListUniqueProblems"
+
+testCreateProject :: CreateProject -> TestTree
+testCreateProject = req
+    "CreateProject"
+    "fixture/CreateProject"
+
+-- Responses
+
+testListProjectsResponse :: ListProjectsResponse -> TestTree
+testListProjectsResponse = res
+    "ListProjectsResponse"
+    "fixture/ListProjectsResponse"
+    (Proxy :: Proxy ListProjects)
+
+testGetDevicePoolCompatibilityResponse :: GetDevicePoolCompatibilityResponse -> TestTree
+testGetDevicePoolCompatibilityResponse = res
+    "GetDevicePoolCompatibilityResponse"
+    "fixture/GetDevicePoolCompatibilityResponse"
+    (Proxy :: Proxy GetDevicePoolCompatibility)
+
+testListTestsResponse :: ListTestsResponse -> TestTree
+testListTestsResponse = res
+    "ListTestsResponse"
+    "fixture/ListTestsResponse"
+    (Proxy :: Proxy ListTests)
+
+testCreateUploadResponse :: CreateUploadResponse -> TestTree
+testCreateUploadResponse = res
+    "CreateUploadResponse"
+    "fixture/CreateUploadResponse"
+    (Proxy :: Proxy CreateUpload)
+
+testListArtifactsResponse :: ListArtifactsResponse -> TestTree
+testListArtifactsResponse = res
+    "ListArtifactsResponse"
+    "fixture/ListArtifactsResponse"
+    (Proxy :: Proxy ListArtifacts)
+
+testGetDevicePoolResponse :: GetDevicePoolResponse -> TestTree
+testGetDevicePoolResponse = res
+    "GetDevicePoolResponse"
+    "fixture/GetDevicePoolResponse"
+    (Proxy :: Proxy GetDevicePool)
+
+testGetUploadResponse :: GetUploadResponse -> TestTree
+testGetUploadResponse = res
+    "GetUploadResponse"
+    "fixture/GetUploadResponse"
+    (Proxy :: Proxy GetUpload)
+
+testListDevicePoolsResponse :: ListDevicePoolsResponse -> TestTree
+testListDevicePoolsResponse = res
+    "ListDevicePoolsResponse"
+    "fixture/ListDevicePoolsResponse"
+    (Proxy :: Proxy ListDevicePools)
+
+testGetTestResponse :: GetTestResponse -> TestTree
+testGetTestResponse = res
+    "GetTestResponse"
+    "fixture/GetTestResponse"
+    (Proxy :: Proxy GetTest)
+
+testCreateDevicePoolResponse :: CreateDevicePoolResponse -> TestTree
+testCreateDevicePoolResponse = res
+    "CreateDevicePoolResponse"
+    "fixture/CreateDevicePoolResponse"
+    (Proxy :: Proxy CreateDevicePool)
+
+testListRunsResponse :: ListRunsResponse -> TestTree
+testListRunsResponse = res
+    "ListRunsResponse"
+    "fixture/ListRunsResponse"
+    (Proxy :: Proxy ListRuns)
+
+testListJobsResponse :: ListJobsResponse -> TestTree
+testListJobsResponse = res
+    "ListJobsResponse"
+    "fixture/ListJobsResponse"
+    (Proxy :: Proxy ListJobs)
+
+testGetDeviceResponse :: GetDeviceResponse -> TestTree
+testGetDeviceResponse = res
+    "GetDeviceResponse"
+    "fixture/GetDeviceResponse"
+    (Proxy :: Proxy GetDevice)
+
+testGetJobResponse :: GetJobResponse -> TestTree
+testGetJobResponse = res
+    "GetJobResponse"
+    "fixture/GetJobResponse"
+    (Proxy :: Proxy GetJob)
+
+testScheduleRunResponse :: ScheduleRunResponse -> TestTree
+testScheduleRunResponse = res
+    "ScheduleRunResponse"
+    "fixture/ScheduleRunResponse"
+    (Proxy :: Proxy ScheduleRun)
+
+testGetRunResponse :: GetRunResponse -> TestTree
+testGetRunResponse = res
+    "GetRunResponse"
+    "fixture/GetRunResponse"
+    (Proxy :: Proxy GetRun)
+
+testListSamplesResponse :: ListSamplesResponse -> TestTree
+testListSamplesResponse = res
+    "ListSamplesResponse"
+    "fixture/ListSamplesResponse"
+    (Proxy :: Proxy ListSamples)
+
+testListSuitesResponse :: ListSuitesResponse -> TestTree
+testListSuitesResponse = res
+    "ListSuitesResponse"
+    "fixture/ListSuitesResponse"
+    (Proxy :: Proxy ListSuites)
+
+testGetAccountSettingsResponse :: GetAccountSettingsResponse -> TestTree
+testGetAccountSettingsResponse = res
+    "GetAccountSettingsResponse"
+    "fixture/GetAccountSettingsResponse"
+    (Proxy :: Proxy GetAccountSettings)
+
+testListUploadsResponse :: ListUploadsResponse -> TestTree
+testListUploadsResponse = res
+    "ListUploadsResponse"
+    "fixture/ListUploadsResponse"
+    (Proxy :: Proxy ListUploads)
+
+testGetSuiteResponse :: GetSuiteResponse -> TestTree
+testGetSuiteResponse = res
+    "GetSuiteResponse"
+    "fixture/GetSuiteResponse"
+    (Proxy :: Proxy GetSuite)
+
+testGetProjectResponse :: GetProjectResponse -> TestTree
+testGetProjectResponse = res
+    "GetProjectResponse"
+    "fixture/GetProjectResponse"
+    (Proxy :: Proxy GetProject)
+
+testListDevicesResponse :: ListDevicesResponse -> TestTree
+testListDevicesResponse = res
+    "ListDevicesResponse"
+    "fixture/ListDevicesResponse"
+    (Proxy :: Proxy ListDevices)
+
+testListUniqueProblemsResponse :: ListUniqueProblemsResponse -> TestTree
+testListUniqueProblemsResponse = res
+    "ListUniqueProblemsResponse"
+    "fixture/ListUniqueProblemsResponse"
+    (Proxy :: Proxy ListUniqueProblems)
+
+testCreateProjectResponse :: CreateProjectResponse -> TestTree
+testCreateProjectResponse = res
+    "CreateProjectResponse"
+    "fixture/CreateProjectResponse"
+    (Proxy :: Proxy CreateProject)
