diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,367 @@
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+    means each individual or legal entity that creates, contributes to
+    the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+    means the combination of the Contributions of others (if any) used
+    by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+    means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+    means Source Code Form to which the initial Contributor has attached
+    the notice in Exhibit A, the Executable Form of such Source Code
+    Form, and Modifications of such Source Code Form, in each case
+    including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+    means
+
+    (a) that the initial Contributor has attached the notice described
+        in Exhibit B to the Covered Software; or
+
+    (b) that the Covered Software was made available under the terms of
+        version 1.1 or earlier of the License, but not also under the
+        terms of a Secondary License.
+
+1.6. "Executable Form"
+    means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+    means a work that combines Covered Software with other material, in
+    a separate file or files, that is not Covered Software.
+
+1.8. "License"
+    means this document.
+
+1.9. "Licensable"
+    means having the right to grant, to the maximum extent possible,
+    whether at the time of the initial grant or subsequently, any and
+    all of the rights conveyed by this License.
+
+1.10. "Modifications"
+    means any of the following:
+
+    (a) any file in Source Code Form that results from an addition to,
+        deletion from, or modification of the contents of Covered
+        Software; or
+
+    (b) any new file in Source Code Form that contains any Covered
+        Software.
+
+1.11. "Patent Claims" of a Contributor
+    means any patent claim(s), including without limitation, method,
+    process, and apparatus claims, in any patent Licensable by such
+    Contributor that would be infringed, but for the grant of the
+    License, by the making, using, selling, offering for sale, having
+    made, import, or transfer of either its Contributions or its
+    Contributor Version.
+
+1.12. "Secondary License"
+    means either the GNU General Public License, Version 2.0, the GNU
+    Lesser General Public License, Version 2.1, the GNU Affero General
+    Public License, Version 3.0, or any later versions of those
+    licenses.
+
+1.13. "Source Code Form"
+    means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+    means an individual or a legal entity exercising rights under this
+    License. For legal entities, "You" includes any entity that
+    controls, is controlled by, or is under common control with You. For
+    purposes of this definition, "control" means (a) the power, direct
+    or indirect, to cause the direction or management of such entity,
+    whether by contract or otherwise, or (b) ownership of more than
+    fifty percent (50%) of the outstanding shares or beneficial
+    ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+    Licensable by such Contributor to use, reproduce, make available,
+    modify, display, perform, distribute, and otherwise exploit its
+    Contributions, either on an unmodified basis, with Modifications, or
+    as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+    for sale, have made, import, and otherwise transfer either its
+    Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+    or
+
+(b) for infringements caused by: (i) Your and any other third party's
+    modifications of Covered Software, or (ii) the combination of its
+    Contributions with other software (except as part of its Contributor
+    Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+    its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+    Form, as described in Section 3.1, and You must inform recipients of
+    the Executable Form how they can obtain a copy of such Source Code
+    Form by reasonable means in a timely manner, at a charge no more
+    than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+    License, or sublicense it under different terms, provided that the
+    license for the Executable Form does not attempt to limit or alter
+    the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+*                                                                      *
+*  6. Disclaimer of Warranty                                           *
+*  -------------------------                                           *
+*                                                                      *
+*  Covered Software is provided under this License on an "as is"       *
+*  basis, without warranty of any kind, either expressed, implied, or  *
+*  statutory, including, without limitation, warranties that the       *
+*  Covered Software is free of defects, merchantable, fit for a        *
+*  particular purpose or non-infringing. The entire risk as to the     *
+*  quality and performance of the Covered Software is with You.        *
+*  Should any Covered Software prove defective in any respect, You     *
+*  (not any Contributor) assume the cost of any necessary servicing,   *
+*  repair, or correction. This disclaimer of warranty constitutes an   *
+*  essential part of this License. No use of any Covered Software is   *
+*  authorized under this License except under this disclaimer.         *
+*                                                                      *
+************************************************************************
+
+************************************************************************
+*                                                                      *
+*  7. Limitation of Liability                                          *
+*  --------------------------                                          *
+*                                                                      *
+*  Under no circumstances and under no legal theory, whether tort      *
+*  (including negligence), contract, or otherwise, shall any           *
+*  Contributor, or anyone who distributes Covered Software as          *
+*  permitted above, be liable to You for any direct, indirect,         *
+*  special, incidental, or consequential damages of any character      *
+*  including, without limitation, damages for lost profits, loss of    *
+*  goodwill, work stoppage, computer failure or malfunction, or any    *
+*  and all other commercial damages or losses, even if such party      *
+*  shall have been informed of the possibility of such damages. This   *
+*  limitation of liability shall not apply to liability for death or   *
+*  personal injury resulting from such party's negligence to the       *
+*  extent applicable law prohibits such limitation. Some               *
+*  jurisdictions do not allow the exclusion or limitation of           *
+*  incidental or consequential damages, so this exclusion and          *
+*  limitation may not apply to You.                                    *
+*                                                                      *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+  This Source Code Form is subject to the terms of the Mozilla Public
+  License, v. 2.0. If a copy of the MPL was not distributed with this
+  file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,45 @@
+# Amazon AppStream SDK
+
+* [Version](#version)
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+
+## Version
+
+`1.4.5`
+
+
+## Description
+
+Documentation is available via [Hackage](http://hackage.haskell.org/package/amazonka-appstream)
+and the [AWS API Reference](https://aws.amazon.com/documentation/).
+
+The types from this library are intended to be used with [amazonka](http://hackage.haskell.org/package/amazonka),
+which provides mechanisms for specifying AuthN/AuthZ information, sending requests,
+and receiving responses.
+
+Lenses are used for constructing and manipulating types,
+due to the depth of nesting of AWS types and transparency regarding
+de/serialisation into more palatable Haskell values.
+The provided lenses should be compatible with any of the major lens libraries
+[lens](http://hackage.haskell.org/package/lens) or [lens-family-core](http://hackage.haskell.org/package/lens-family-core).
+
+See [Network.AWS.AppStream](http://hackage.haskell.org/package/amazonka-appstream/docs/Network-AWS-AppStream.html)
+or [the AWS documentation](https://aws.amazon.com/documentation/) to get started.
+
+
+## Contribute
+
+For any problems, comments, or feedback please create an issue [here on GitHub](https://github.com/brendanhay/amazonka/issues).
+
+> _Note:_ this library is an auto-generated Haskell package. Please see `amazonka-gen` for more information.
+
+
+## Licence
+
+`amazonka-appstream` 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-appstream.cabal b/amazonka-appstream.cabal
new file mode 100644
--- /dev/null
+++ b/amazonka-appstream.cabal
@@ -0,0 +1,98 @@
+name:                  amazonka-appstream
+version:               1.4.5
+synopsis:              Amazon AppStream SDK.
+homepage:              https://github.com/brendanhay/amazonka
+bug-reports:           https://github.com/brendanhay/amazonka/issues
+license:               OtherLicense
+license-file:          LICENSE
+author:                Brendan Hay
+maintainer:            Brendan Hay <brendan.g.hay@gmail.com>
+copyright:             Copyright (c) 2013-2016 Brendan Hay
+category:              Network, AWS, Cloud, Distributed Computing
+build-type:            Simple
+cabal-version:         >= 1.10
+extra-source-files:    README.md fixture/*.yaml fixture/*.proto src/.gitkeep
+description:
+    The types from this library are intended to be used with
+    <http://hackage.haskell.org/package/amazonka amazonka>, which provides
+    mechanisms for specifying AuthN/AuthZ information, sending requests,
+    and receiving responses.
+    .
+    Lenses are used for constructing and manipulating types,
+    due to the depth of nesting of AWS types and transparency regarding
+    de/serialisation into more palatable Haskell values.
+    The provided lenses should be compatible with any of the major lens libraries
+    such as <http://hackage.haskell.org/package/lens lens> or
+    <http://hackage.haskell.org/package/lens-family-core lens-family-core>.
+    .
+    See "Network.AWS.AppStream" or <https://aws.amazon.com/documentation/ the AWS documentation>
+    to get started.
+
+source-repository head
+    type:     git
+    location: git://github.com/brendanhay/amazonka.git
+
+library
+    default-language:  Haskell2010
+    hs-source-dirs:    src gen
+
+    ghc-options:       -Wall
+
+    exposed-modules:
+          Network.AWS.AppStream
+        , Network.AWS.AppStream.AssociateFleet
+        , Network.AWS.AppStream.CreateFleet
+        , Network.AWS.AppStream.CreateStack
+        , Network.AWS.AppStream.CreateStreamingURL
+        , Network.AWS.AppStream.DeleteFleet
+        , Network.AWS.AppStream.DeleteStack
+        , Network.AWS.AppStream.DescribeFleets
+        , Network.AWS.AppStream.DescribeImages
+        , Network.AWS.AppStream.DescribeSessions
+        , Network.AWS.AppStream.DescribeStacks
+        , Network.AWS.AppStream.DisassociateFleet
+        , Network.AWS.AppStream.ExpireSession
+        , Network.AWS.AppStream.ListAssociatedFleets
+        , Network.AWS.AppStream.ListAssociatedStacks
+        , Network.AWS.AppStream.StartFleet
+        , Network.AWS.AppStream.StopFleet
+        , Network.AWS.AppStream.Types
+        , Network.AWS.AppStream.UpdateFleet
+        , Network.AWS.AppStream.UpdateStack
+        , Network.AWS.AppStream.Waiters
+
+    other-modules:
+          Network.AWS.AppStream.Types.Product
+        , Network.AWS.AppStream.Types.Sum
+
+    build-depends:
+          amazonka-core == 1.4.5.*
+        , base          >= 4.7     && < 5
+
+test-suite amazonka-appstream-test
+    type:              exitcode-stdio-1.0
+    default-language:  Haskell2010
+    hs-source-dirs:    test
+    main-is:           Main.hs
+
+    ghc-options:       -Wall -threaded
+
+    -- This section is encoded by the template and any modules added by
+    -- hand outside these namespaces will not correctly be added to the
+    -- distribution package.
+    other-modules:
+          Test.AWS.AppStream
+        , Test.AWS.Gen.AppStream
+        , Test.AWS.AppStream.Internal
+
+    build-depends:
+          amazonka-core == 1.4.5.*
+        , amazonka-test == 1.4.5.*
+        , amazonka-appstream == 1.4.5.*
+        , base
+        , bytestring
+        , tasty
+        , tasty-hunit
+        , text
+        , time
+        , unordered-containers
diff --git a/fixture/AssociateFleet.yaml b/fixture/AssociateFleet.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/AssociateFleet.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appstream2/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appstream2.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/AssociateFleetResponse.proto b/fixture/AssociateFleetResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/AssociateFleetResponse.proto
diff --git a/fixture/CreateFleet.yaml b/fixture/CreateFleet.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateFleet.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appstream2/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appstream2.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateFleetResponse.proto b/fixture/CreateFleetResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateFleetResponse.proto
diff --git a/fixture/CreateStack.yaml b/fixture/CreateStack.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateStack.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appstream2/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appstream2.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateStackResponse.proto b/fixture/CreateStackResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateStackResponse.proto
diff --git a/fixture/CreateStreamingURL.yaml b/fixture/CreateStreamingURL.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateStreamingURL.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appstream2/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appstream2.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateStreamingURLResponse.proto b/fixture/CreateStreamingURLResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateStreamingURLResponse.proto
diff --git a/fixture/DeleteFleet.yaml b/fixture/DeleteFleet.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteFleet.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appstream2/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appstream2.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteFleetResponse.proto b/fixture/DeleteFleetResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteFleetResponse.proto
diff --git a/fixture/DeleteStack.yaml b/fixture/DeleteStack.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteStack.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appstream2/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appstream2.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteStackResponse.proto b/fixture/DeleteStackResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteStackResponse.proto
diff --git a/fixture/DescribeFleets.yaml b/fixture/DescribeFleets.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeFleets.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appstream2/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appstream2.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeFleetsResponse.proto b/fixture/DescribeFleetsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeFleetsResponse.proto
diff --git a/fixture/DescribeImages.yaml b/fixture/DescribeImages.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeImages.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appstream2/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appstream2.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeImagesResponse.proto b/fixture/DescribeImagesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeImagesResponse.proto
diff --git a/fixture/DescribeSessions.yaml b/fixture/DescribeSessions.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeSessions.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appstream2/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appstream2.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeSessionsResponse.proto b/fixture/DescribeSessionsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeSessionsResponse.proto
diff --git a/fixture/DescribeStacks.yaml b/fixture/DescribeStacks.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeStacks.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appstream2/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appstream2.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeStacksResponse.proto b/fixture/DescribeStacksResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeStacksResponse.proto
diff --git a/fixture/DisassociateFleet.yaml b/fixture/DisassociateFleet.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DisassociateFleet.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appstream2/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appstream2.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DisassociateFleetResponse.proto b/fixture/DisassociateFleetResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DisassociateFleetResponse.proto
diff --git a/fixture/ExpireSession.yaml b/fixture/ExpireSession.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ExpireSession.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appstream2/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appstream2.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ExpireSessionResponse.proto b/fixture/ExpireSessionResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ExpireSessionResponse.proto
diff --git a/fixture/ListAssociatedFleets.yaml b/fixture/ListAssociatedFleets.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListAssociatedFleets.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appstream2/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appstream2.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListAssociatedFleetsResponse.proto b/fixture/ListAssociatedFleetsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListAssociatedFleetsResponse.proto
diff --git a/fixture/ListAssociatedStacks.yaml b/fixture/ListAssociatedStacks.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListAssociatedStacks.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appstream2/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appstream2.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListAssociatedStacksResponse.proto b/fixture/ListAssociatedStacksResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListAssociatedStacksResponse.proto
diff --git a/fixture/StartFleet.yaml b/fixture/StartFleet.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/StartFleet.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appstream2/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appstream2.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/StartFleetResponse.proto b/fixture/StartFleetResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/StartFleetResponse.proto
diff --git a/fixture/StopFleet.yaml b/fixture/StopFleet.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/StopFleet.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appstream2/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appstream2.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/StopFleetResponse.proto b/fixture/StopFleetResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/StopFleetResponse.proto
diff --git a/fixture/UpdateFleet.yaml b/fixture/UpdateFleet.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateFleet.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appstream2/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appstream2.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UpdateFleetResponse.proto b/fixture/UpdateFleetResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateFleetResponse.proto
diff --git a/fixture/UpdateStack.yaml b/fixture/UpdateStack.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateStack.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appstream2/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appstream2.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UpdateStackResponse.proto b/fixture/UpdateStackResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateStackResponse.proto
diff --git a/gen/Network/AWS/AppStream.hs b/gen/Network/AWS/AppStream.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AppStream.hs
@@ -0,0 +1,271 @@
+{-# 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.AppStream
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- __Amazon AppStream 2.0__
+--
+-- API documentation for Amazon AppStream 2.0.
+--
+module Network.AWS.AppStream
+    (
+    -- * Service Configuration
+      appStream
+
+    -- * Errors
+    -- $errors
+
+    -- ** InvalidRoleException
+    , _InvalidRoleException
+
+    -- ** ResourceAlreadyExistsException
+    , _ResourceAlreadyExistsException
+
+    -- ** OperationNotPermittedException
+    , _OperationNotPermittedException
+
+    -- ** ResourceNotFoundException
+    , _ResourceNotFoundException
+
+    -- ** ResourceNotAvailableException
+    , _ResourceNotAvailableException
+
+    -- ** LimitExceededException
+    , _LimitExceededException
+
+    -- ** ResourceInUseException
+    , _ResourceInUseException
+
+    -- * Waiters
+    -- $waiters
+
+    -- * Operations
+    -- $operations
+
+    -- ** DisassociateFleet
+    , module Network.AWS.AppStream.DisassociateFleet
+
+    -- ** ListAssociatedFleets
+    , module Network.AWS.AppStream.ListAssociatedFleets
+
+    -- ** DeleteStack
+    , module Network.AWS.AppStream.DeleteStack
+
+    -- ** UpdateStack
+    , module Network.AWS.AppStream.UpdateStack
+
+    -- ** ListAssociatedStacks
+    , module Network.AWS.AppStream.ListAssociatedStacks
+
+    -- ** DeleteFleet
+    , module Network.AWS.AppStream.DeleteFleet
+
+    -- ** UpdateFleet
+    , module Network.AWS.AppStream.UpdateFleet
+
+    -- ** AssociateFleet
+    , module Network.AWS.AppStream.AssociateFleet
+
+    -- ** DescribeSessions
+    , module Network.AWS.AppStream.DescribeSessions
+
+    -- ** DescribeStacks
+    , module Network.AWS.AppStream.DescribeStacks
+
+    -- ** DescribeFleets
+    , module Network.AWS.AppStream.DescribeFleets
+
+    -- ** StopFleet
+    , module Network.AWS.AppStream.StopFleet
+
+    -- ** CreateFleet
+    , module Network.AWS.AppStream.CreateFleet
+
+    -- ** CreateStack
+    , module Network.AWS.AppStream.CreateStack
+
+    -- ** ExpireSession
+    , module Network.AWS.AppStream.ExpireSession
+
+    -- ** CreateStreamingURL
+    , module Network.AWS.AppStream.CreateStreamingURL
+
+    -- ** StartFleet
+    , module Network.AWS.AppStream.StartFleet
+
+    -- ** DescribeImages
+    , module Network.AWS.AppStream.DescribeImages
+
+    -- * Types
+
+    -- ** FleetErrorCode
+    , FleetErrorCode (..)
+
+    -- ** FleetState
+    , FleetState (..)
+
+    -- ** ImageState
+    , ImageState (..)
+
+    -- ** ImageStateChangeReasonCode
+    , ImageStateChangeReasonCode (..)
+
+    -- ** PlatformType
+    , PlatformType (..)
+
+    -- ** SessionState
+    , SessionState (..)
+
+    -- ** VisibilityType
+    , VisibilityType (..)
+
+    -- ** Application
+    , Application
+    , application
+    , aEnabled
+    , aLaunchPath
+    , aLaunchParameters
+    , aName
+    , aDisplayName
+    , aMetadata
+    , aIconURL
+
+    -- ** ComputeCapacity
+    , ComputeCapacity
+    , computeCapacity
+    , ccDesiredInstances
+
+    -- ** ComputeCapacityStatus
+    , ComputeCapacityStatus
+    , computeCapacityStatus
+    , ccsInUse
+    , ccsRunning
+    , ccsAvailable
+    , ccsDesired
+
+    -- ** Fleet
+    , Fleet
+    , fleet
+    , fDisconnectTimeoutInSeconds
+    , fMaxUserDurationInSeconds
+    , fCreatedTime
+    , fVPCConfig
+    , fFleetErrors
+    , fDisplayName
+    , fDescription
+    , fARN
+    , fName
+    , fImageName
+    , fInstanceType
+    , fComputeCapacityStatus
+    , fState
+
+    -- ** FleetError
+    , FleetError
+    , fleetError
+    , feErrorCode
+    , feErrorMessage
+
+    -- ** Image
+    , Image
+    , image
+    , iState
+    , iPlatform
+    , iStateChangeReason
+    , iARN
+    , iCreatedTime
+    , iVisibility
+    , iBaseImageARN
+    , iDisplayName
+    , iDescription
+    , iApplications
+    , iName
+
+    -- ** ImageStateChangeReason
+    , ImageStateChangeReason
+    , imageStateChangeReason
+    , iscrCode
+    , iscrMessage
+
+    -- ** Session
+    , Session
+    , session
+    , sId
+    , sUserId
+    , sStackName
+    , sFleetName
+    , sState
+
+    -- ** Stack
+    , Stack
+    , stack
+    , sARN
+    , sCreatedTime
+    , sDisplayName
+    , sDescription
+    , sName
+
+    -- ** VPCConfig
+    , VPCConfig
+    , vpcConfig
+    , vcSubnetIds
+    ) where
+
+import           Network.AWS.AppStream.AssociateFleet
+import           Network.AWS.AppStream.CreateFleet
+import           Network.AWS.AppStream.CreateStack
+import           Network.AWS.AppStream.CreateStreamingURL
+import           Network.AWS.AppStream.DeleteFleet
+import           Network.AWS.AppStream.DeleteStack
+import           Network.AWS.AppStream.DescribeFleets
+import           Network.AWS.AppStream.DescribeImages
+import           Network.AWS.AppStream.DescribeSessions
+import           Network.AWS.AppStream.DescribeStacks
+import           Network.AWS.AppStream.DisassociateFleet
+import           Network.AWS.AppStream.ExpireSession
+import           Network.AWS.AppStream.ListAssociatedFleets
+import           Network.AWS.AppStream.ListAssociatedStacks
+import           Network.AWS.AppStream.StartFleet
+import           Network.AWS.AppStream.StopFleet
+import           Network.AWS.AppStream.Types
+import           Network.AWS.AppStream.UpdateFleet
+import           Network.AWS.AppStream.UpdateStack
+import           Network.AWS.AppStream.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 'AppStream'.
+-}
+
+{- $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/AppStream/AssociateFleet.hs b/gen/Network/AWS/AppStream/AssociateFleet.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AppStream/AssociateFleet.hs
@@ -0,0 +1,135 @@
+{-# 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.AppStream.AssociateFleet
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Associate a fleet to a stack.
+--
+--
+module Network.AWS.AppStream.AssociateFleet
+    (
+    -- * Creating a Request
+      associateFleet
+    , AssociateFleet
+    -- * Request Lenses
+    , afFleetName
+    , afStackName
+
+    -- * Destructuring the Response
+    , associateFleetResponse
+    , AssociateFleetResponse
+    -- * Response Lenses
+    , afrsResponseStatus
+    ) where
+
+import           Network.AWS.AppStream.Types
+import           Network.AWS.AppStream.Types.Product
+import           Network.AWS.Lens
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'associateFleet' smart constructor.
+data AssociateFleet = AssociateFleet'
+    { _afFleetName :: !Text
+    , _afStackName :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'AssociateFleet' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'afFleetName' - The name of the fleet to associate.
+--
+-- * 'afStackName' - The name of the stack to which the fleet is associated.
+associateFleet
+    :: Text -- ^ 'afFleetName'
+    -> Text -- ^ 'afStackName'
+    -> AssociateFleet
+associateFleet pFleetName_ pStackName_ =
+    AssociateFleet'
+    { _afFleetName = pFleetName_
+    , _afStackName = pStackName_
+    }
+
+-- | The name of the fleet to associate.
+afFleetName :: Lens' AssociateFleet Text
+afFleetName = lens _afFleetName (\ s a -> s{_afFleetName = a});
+
+-- | The name of the stack to which the fleet is associated.
+afStackName :: Lens' AssociateFleet Text
+afStackName = lens _afStackName (\ s a -> s{_afStackName = a});
+
+instance AWSRequest AssociateFleet where
+        type Rs AssociateFleet = AssociateFleetResponse
+        request = postJSON appStream
+        response
+          = receiveEmpty
+              (\ s h x ->
+                 AssociateFleetResponse' <$> (pure (fromEnum s)))
+
+instance Hashable AssociateFleet
+
+instance NFData AssociateFleet
+
+instance ToHeaders AssociateFleet where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("PhotonAdminProxyService.AssociateFleet" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON AssociateFleet where
+        toJSON AssociateFleet'{..}
+          = object
+              (catMaybes
+                 [Just ("FleetName" .= _afFleetName),
+                  Just ("StackName" .= _afStackName)])
+
+instance ToPath AssociateFleet where
+        toPath = const "/"
+
+instance ToQuery AssociateFleet where
+        toQuery = const mempty
+
+-- | /See:/ 'associateFleetResponse' smart constructor.
+newtype AssociateFleetResponse = AssociateFleetResponse'
+    { _afrsResponseStatus :: Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'AssociateFleetResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'afrsResponseStatus' - -- | The response status code.
+associateFleetResponse
+    :: Int -- ^ 'afrsResponseStatus'
+    -> AssociateFleetResponse
+associateFleetResponse pResponseStatus_ =
+    AssociateFleetResponse'
+    { _afrsResponseStatus = pResponseStatus_
+    }
+
+-- | -- | The response status code.
+afrsResponseStatus :: Lens' AssociateFleetResponse Int
+afrsResponseStatus = lens _afrsResponseStatus (\ s a -> s{_afrsResponseStatus = a});
+
+instance NFData AssociateFleetResponse
diff --git a/gen/Network/AWS/AppStream/CreateFleet.hs b/gen/Network/AWS/AppStream/CreateFleet.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AppStream/CreateFleet.hs
@@ -0,0 +1,223 @@
+{-# 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.AppStream.CreateFleet
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a new fleet.
+--
+--
+module Network.AWS.AppStream.CreateFleet
+    (
+    -- * Creating a Request
+      createFleet
+    , CreateFleet
+    -- * Request Lenses
+    , cfDisconnectTimeoutInSeconds
+    , cfMaxUserDurationInSeconds
+    , cfVPCConfig
+    , cfDisplayName
+    , cfDescription
+    , cfName
+    , cfImageName
+    , cfInstanceType
+    , cfComputeCapacity
+
+    -- * Destructuring the Response
+    , createFleetResponse
+    , CreateFleetResponse
+    -- * Response Lenses
+    , cfrsFleet
+    , cfrsResponseStatus
+    ) where
+
+import           Network.AWS.AppStream.Types
+import           Network.AWS.AppStream.Types.Product
+import           Network.AWS.Lens
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | Contains the parameters for the new fleet to create.
+--
+--
+--
+-- /See:/ 'createFleet' smart constructor.
+data CreateFleet = CreateFleet'
+    { _cfDisconnectTimeoutInSeconds :: !(Maybe Int)
+    , _cfMaxUserDurationInSeconds   :: !(Maybe Int)
+    , _cfVPCConfig                  :: !(Maybe VPCConfig)
+    , _cfDisplayName                :: !(Maybe Text)
+    , _cfDescription                :: !(Maybe Text)
+    , _cfName                       :: !Text
+    , _cfImageName                  :: !Text
+    , _cfInstanceType               :: !Text
+    , _cfComputeCapacity            :: !ComputeCapacity
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CreateFleet' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cfDisconnectTimeoutInSeconds' - The time after disconnection when a session is considered to have ended. If a user who got disconnected reconnects within this timeout interval, the user is connected back to his/her previous session.
+--
+-- * 'cfMaxUserDurationInSeconds' - The maximum time up to which a streaming session can run.
+--
+-- * 'cfVPCConfig' - The VPC configuration for the fleet.
+--
+-- * 'cfDisplayName' - The display name of the fleet.
+--
+-- * 'cfDescription' - The description of the fleet.
+--
+-- * 'cfName' - A unique identifier for the fleet.
+--
+-- * 'cfImageName' - Unique name of the image used by the fleet.
+--
+-- * 'cfInstanceType' - The instance type of compute resources for the fleet. Fleet instances are launched from this instance type.
+--
+-- * 'cfComputeCapacity' - The parameters for the capacity allocated to the fleet.
+createFleet
+    :: Text -- ^ 'cfName'
+    -> Text -- ^ 'cfImageName'
+    -> Text -- ^ 'cfInstanceType'
+    -> ComputeCapacity -- ^ 'cfComputeCapacity'
+    -> CreateFleet
+createFleet pName_ pImageName_ pInstanceType_ pComputeCapacity_ =
+    CreateFleet'
+    { _cfDisconnectTimeoutInSeconds = Nothing
+    , _cfMaxUserDurationInSeconds = Nothing
+    , _cfVPCConfig = Nothing
+    , _cfDisplayName = Nothing
+    , _cfDescription = Nothing
+    , _cfName = pName_
+    , _cfImageName = pImageName_
+    , _cfInstanceType = pInstanceType_
+    , _cfComputeCapacity = pComputeCapacity_
+    }
+
+-- | The time after disconnection when a session is considered to have ended. If a user who got disconnected reconnects within this timeout interval, the user is connected back to his/her previous session.
+cfDisconnectTimeoutInSeconds :: Lens' CreateFleet (Maybe Int)
+cfDisconnectTimeoutInSeconds = lens _cfDisconnectTimeoutInSeconds (\ s a -> s{_cfDisconnectTimeoutInSeconds = a});
+
+-- | The maximum time up to which a streaming session can run.
+cfMaxUserDurationInSeconds :: Lens' CreateFleet (Maybe Int)
+cfMaxUserDurationInSeconds = lens _cfMaxUserDurationInSeconds (\ s a -> s{_cfMaxUserDurationInSeconds = a});
+
+-- | The VPC configuration for the fleet.
+cfVPCConfig :: Lens' CreateFleet (Maybe VPCConfig)
+cfVPCConfig = lens _cfVPCConfig (\ s a -> s{_cfVPCConfig = a});
+
+-- | The display name of the fleet.
+cfDisplayName :: Lens' CreateFleet (Maybe Text)
+cfDisplayName = lens _cfDisplayName (\ s a -> s{_cfDisplayName = a});
+
+-- | The description of the fleet.
+cfDescription :: Lens' CreateFleet (Maybe Text)
+cfDescription = lens _cfDescription (\ s a -> s{_cfDescription = a});
+
+-- | A unique identifier for the fleet.
+cfName :: Lens' CreateFleet Text
+cfName = lens _cfName (\ s a -> s{_cfName = a});
+
+-- | Unique name of the image used by the fleet.
+cfImageName :: Lens' CreateFleet Text
+cfImageName = lens _cfImageName (\ s a -> s{_cfImageName = a});
+
+-- | The instance type of compute resources for the fleet. Fleet instances are launched from this instance type.
+cfInstanceType :: Lens' CreateFleet Text
+cfInstanceType = lens _cfInstanceType (\ s a -> s{_cfInstanceType = a});
+
+-- | The parameters for the capacity allocated to the fleet.
+cfComputeCapacity :: Lens' CreateFleet ComputeCapacity
+cfComputeCapacity = lens _cfComputeCapacity (\ s a -> s{_cfComputeCapacity = a});
+
+instance AWSRequest CreateFleet where
+        type Rs CreateFleet = CreateFleetResponse
+        request = postJSON appStream
+        response
+          = receiveJSON
+              (\ s h x ->
+                 CreateFleetResponse' <$>
+                   (x .?> "Fleet") <*> (pure (fromEnum s)))
+
+instance Hashable CreateFleet
+
+instance NFData CreateFleet
+
+instance ToHeaders CreateFleet where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("PhotonAdminProxyService.CreateFleet" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON CreateFleet where
+        toJSON CreateFleet'{..}
+          = object
+              (catMaybes
+                 [("DisconnectTimeoutInSeconds" .=) <$>
+                    _cfDisconnectTimeoutInSeconds,
+                  ("MaxUserDurationInSeconds" .=) <$>
+                    _cfMaxUserDurationInSeconds,
+                  ("VpcConfig" .=) <$> _cfVPCConfig,
+                  ("DisplayName" .=) <$> _cfDisplayName,
+                  ("Description" .=) <$> _cfDescription,
+                  Just ("Name" .= _cfName),
+                  Just ("ImageName" .= _cfImageName),
+                  Just ("InstanceType" .= _cfInstanceType),
+                  Just ("ComputeCapacity" .= _cfComputeCapacity)])
+
+instance ToPath CreateFleet where
+        toPath = const "/"
+
+instance ToQuery CreateFleet where
+        toQuery = const mempty
+
+-- | /See:/ 'createFleetResponse' smart constructor.
+data CreateFleetResponse = CreateFleetResponse'
+    { _cfrsFleet          :: !(Maybe Fleet)
+    , _cfrsResponseStatus :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CreateFleetResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cfrsFleet' - The details for the created fleet.
+--
+-- * 'cfrsResponseStatus' - -- | The response status code.
+createFleetResponse
+    :: Int -- ^ 'cfrsResponseStatus'
+    -> CreateFleetResponse
+createFleetResponse pResponseStatus_ =
+    CreateFleetResponse'
+    { _cfrsFleet = Nothing
+    , _cfrsResponseStatus = pResponseStatus_
+    }
+
+-- | The details for the created fleet.
+cfrsFleet :: Lens' CreateFleetResponse (Maybe Fleet)
+cfrsFleet = lens _cfrsFleet (\ s a -> s{_cfrsFleet = a});
+
+-- | -- | The response status code.
+cfrsResponseStatus :: Lens' CreateFleetResponse Int
+cfrsResponseStatus = lens _cfrsResponseStatus (\ s a -> s{_cfrsResponseStatus = a});
+
+instance NFData CreateFleetResponse
diff --git a/gen/Network/AWS/AppStream/CreateStack.hs b/gen/Network/AWS/AppStream/CreateStack.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AppStream/CreateStack.hs
@@ -0,0 +1,154 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.AppStream.CreateStack
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Create a new stack.
+--
+--
+module Network.AWS.AppStream.CreateStack
+    (
+    -- * Creating a Request
+      createStack
+    , CreateStack
+    -- * Request Lenses
+    , csDisplayName
+    , csDescription
+    , csName
+
+    -- * Destructuring the Response
+    , createStackResponse
+    , CreateStackResponse
+    -- * Response Lenses
+    , csrsStack
+    , csrsResponseStatus
+    ) where
+
+import           Network.AWS.AppStream.Types
+import           Network.AWS.AppStream.Types.Product
+import           Network.AWS.Lens
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'createStack' smart constructor.
+data CreateStack = CreateStack'
+    { _csDisplayName :: !(Maybe Text)
+    , _csDescription :: !(Maybe Text)
+    , _csName        :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CreateStack' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'csDisplayName' - The name displayed to end users on the AppStream 2.0 portal.
+--
+-- * 'csDescription' - The description displayed to end users on the AppStream 2.0 portal.
+--
+-- * 'csName' - The unique identifier for this stack.
+createStack
+    :: Text -- ^ 'csName'
+    -> CreateStack
+createStack pName_ =
+    CreateStack'
+    { _csDisplayName = Nothing
+    , _csDescription = Nothing
+    , _csName = pName_
+    }
+
+-- | The name displayed to end users on the AppStream 2.0 portal.
+csDisplayName :: Lens' CreateStack (Maybe Text)
+csDisplayName = lens _csDisplayName (\ s a -> s{_csDisplayName = a});
+
+-- | The description displayed to end users on the AppStream 2.0 portal.
+csDescription :: Lens' CreateStack (Maybe Text)
+csDescription = lens _csDescription (\ s a -> s{_csDescription = a});
+
+-- | The unique identifier for this stack.
+csName :: Lens' CreateStack Text
+csName = lens _csName (\ s a -> s{_csName = a});
+
+instance AWSRequest CreateStack where
+        type Rs CreateStack = CreateStackResponse
+        request = postJSON appStream
+        response
+          = receiveJSON
+              (\ s h x ->
+                 CreateStackResponse' <$>
+                   (x .?> "Stack") <*> (pure (fromEnum s)))
+
+instance Hashable CreateStack
+
+instance NFData CreateStack
+
+instance ToHeaders CreateStack where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("PhotonAdminProxyService.CreateStack" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON CreateStack where
+        toJSON CreateStack'{..}
+          = object
+              (catMaybes
+                 [("DisplayName" .=) <$> _csDisplayName,
+                  ("Description" .=) <$> _csDescription,
+                  Just ("Name" .= _csName)])
+
+instance ToPath CreateStack where
+        toPath = const "/"
+
+instance ToQuery CreateStack where
+        toQuery = const mempty
+
+-- | /See:/ 'createStackResponse' smart constructor.
+data CreateStackResponse = CreateStackResponse'
+    { _csrsStack          :: !(Maybe Stack)
+    , _csrsResponseStatus :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CreateStackResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'csrsStack' - The details for the created stack.
+--
+-- * 'csrsResponseStatus' - -- | The response status code.
+createStackResponse
+    :: Int -- ^ 'csrsResponseStatus'
+    -> CreateStackResponse
+createStackResponse pResponseStatus_ =
+    CreateStackResponse'
+    { _csrsStack = Nothing
+    , _csrsResponseStatus = pResponseStatus_
+    }
+
+-- | The details for the created stack.
+csrsStack :: Lens' CreateStackResponse (Maybe Stack)
+csrsStack = lens _csrsStack (\ s a -> s{_csrsStack = a});
+
+-- | -- | The response status code.
+csrsResponseStatus :: Lens' CreateStackResponse Int
+csrsResponseStatus = lens _csrsResponseStatus (\ s a -> s{_csrsResponseStatus = a});
+
+instance NFData CreateStackResponse
diff --git a/gen/Network/AWS/AppStream/CreateStreamingURL.hs b/gen/Network/AWS/AppStream/CreateStreamingURL.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AppStream/CreateStreamingURL.hs
@@ -0,0 +1,197 @@
+{-# 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.AppStream.CreateStreamingURL
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a URL to start an AppStream 2.0 streaming session for a user. By default, the URL is valid only for 1 minute from the time that it is generated.
+--
+--
+module Network.AWS.AppStream.CreateStreamingURL
+    (
+    -- * Creating a Request
+      createStreamingURL
+    , CreateStreamingURL
+    -- * Request Lenses
+    , csuSessionContext
+    , csuApplicationId
+    , csuValidity
+    , csuStackName
+    , csuFleetName
+    , csuUserId
+
+    -- * Destructuring the Response
+    , createStreamingURLResponse
+    , CreateStreamingURLResponse
+    -- * Response Lenses
+    , csursStreamingURL
+    , csursExpires
+    , csursResponseStatus
+    ) where
+
+import           Network.AWS.AppStream.Types
+import           Network.AWS.AppStream.Types.Product
+import           Network.AWS.Lens
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'createStreamingURL' smart constructor.
+data CreateStreamingURL = CreateStreamingURL'
+    { _csuSessionContext :: !(Maybe Text)
+    , _csuApplicationId  :: !(Maybe Text)
+    , _csuValidity       :: !(Maybe Integer)
+    , _csuStackName      :: !Text
+    , _csuFleetName      :: !Text
+    , _csuUserId         :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CreateStreamingURL' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'csuSessionContext' - The sessionContext of the streaming URL.
+--
+-- * 'csuApplicationId' - The ID of the application that must be launched after the session starts.
+--
+-- * 'csuValidity' - The validity duration of the URL in seconds. After this duration, the URL returned by this operation becomes invalid.
+--
+-- * 'csuStackName' - The stack for which the URL is generated.
+--
+-- * 'csuFleetName' - The fleet for which the URL is generated.
+--
+-- * 'csuUserId' - A unique user ID for whom the URL is generated.
+createStreamingURL
+    :: Text -- ^ 'csuStackName'
+    -> Text -- ^ 'csuFleetName'
+    -> Text -- ^ 'csuUserId'
+    -> CreateStreamingURL
+createStreamingURL pStackName_ pFleetName_ pUserId_ =
+    CreateStreamingURL'
+    { _csuSessionContext = Nothing
+    , _csuApplicationId = Nothing
+    , _csuValidity = Nothing
+    , _csuStackName = pStackName_
+    , _csuFleetName = pFleetName_
+    , _csuUserId = pUserId_
+    }
+
+-- | The sessionContext of the streaming URL.
+csuSessionContext :: Lens' CreateStreamingURL (Maybe Text)
+csuSessionContext = lens _csuSessionContext (\ s a -> s{_csuSessionContext = a});
+
+-- | The ID of the application that must be launched after the session starts.
+csuApplicationId :: Lens' CreateStreamingURL (Maybe Text)
+csuApplicationId = lens _csuApplicationId (\ s a -> s{_csuApplicationId = a});
+
+-- | The validity duration of the URL in seconds. After this duration, the URL returned by this operation becomes invalid.
+csuValidity :: Lens' CreateStreamingURL (Maybe Integer)
+csuValidity = lens _csuValidity (\ s a -> s{_csuValidity = a});
+
+-- | The stack for which the URL is generated.
+csuStackName :: Lens' CreateStreamingURL Text
+csuStackName = lens _csuStackName (\ s a -> s{_csuStackName = a});
+
+-- | The fleet for which the URL is generated.
+csuFleetName :: Lens' CreateStreamingURL Text
+csuFleetName = lens _csuFleetName (\ s a -> s{_csuFleetName = a});
+
+-- | A unique user ID for whom the URL is generated.
+csuUserId :: Lens' CreateStreamingURL Text
+csuUserId = lens _csuUserId (\ s a -> s{_csuUserId = a});
+
+instance AWSRequest CreateStreamingURL where
+        type Rs CreateStreamingURL =
+             CreateStreamingURLResponse
+        request = postJSON appStream
+        response
+          = receiveJSON
+              (\ s h x ->
+                 CreateStreamingURLResponse' <$>
+                   (x .?> "StreamingURL") <*> (x .?> "Expires") <*>
+                     (pure (fromEnum s)))
+
+instance Hashable CreateStreamingURL
+
+instance NFData CreateStreamingURL
+
+instance ToHeaders CreateStreamingURL where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("PhotonAdminProxyService.CreateStreamingURL" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON CreateStreamingURL where
+        toJSON CreateStreamingURL'{..}
+          = object
+              (catMaybes
+                 [("SessionContext" .=) <$> _csuSessionContext,
+                  ("ApplicationId" .=) <$> _csuApplicationId,
+                  ("Validity" .=) <$> _csuValidity,
+                  Just ("StackName" .= _csuStackName),
+                  Just ("FleetName" .= _csuFleetName),
+                  Just ("UserId" .= _csuUserId)])
+
+instance ToPath CreateStreamingURL where
+        toPath = const "/"
+
+instance ToQuery CreateStreamingURL where
+        toQuery = const mempty
+
+-- | /See:/ 'createStreamingURLResponse' smart constructor.
+data CreateStreamingURLResponse = CreateStreamingURLResponse'
+    { _csursStreamingURL   :: !(Maybe Text)
+    , _csursExpires        :: !(Maybe POSIX)
+    , _csursResponseStatus :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CreateStreamingURLResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'csursStreamingURL' - The URL to start the AppStream 2.0 streaming session.
+--
+-- * 'csursExpires' - Elapsed seconds after the Unix epoch, at which time this URL expires.
+--
+-- * 'csursResponseStatus' - -- | The response status code.
+createStreamingURLResponse
+    :: Int -- ^ 'csursResponseStatus'
+    -> CreateStreamingURLResponse
+createStreamingURLResponse pResponseStatus_ =
+    CreateStreamingURLResponse'
+    { _csursStreamingURL = Nothing
+    , _csursExpires = Nothing
+    , _csursResponseStatus = pResponseStatus_
+    }
+
+-- | The URL to start the AppStream 2.0 streaming session.
+csursStreamingURL :: Lens' CreateStreamingURLResponse (Maybe Text)
+csursStreamingURL = lens _csursStreamingURL (\ s a -> s{_csursStreamingURL = a});
+
+-- | Elapsed seconds after the Unix epoch, at which time this URL expires.
+csursExpires :: Lens' CreateStreamingURLResponse (Maybe UTCTime)
+csursExpires = lens _csursExpires (\ s a -> s{_csursExpires = a}) . mapping _Time;
+
+-- | -- | The response status code.
+csursResponseStatus :: Lens' CreateStreamingURLResponse Int
+csursResponseStatus = lens _csursResponseStatus (\ s a -> s{_csursResponseStatus = a});
+
+instance NFData CreateStreamingURLResponse
diff --git a/gen/Network/AWS/AppStream/DeleteFleet.hs b/gen/Network/AWS/AppStream/DeleteFleet.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AppStream/DeleteFleet.hs
@@ -0,0 +1,122 @@
+{-# 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.AppStream.DeleteFleet
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes a fleet.
+--
+--
+module Network.AWS.AppStream.DeleteFleet
+    (
+    -- * Creating a Request
+      deleteFleet
+    , DeleteFleet
+    -- * Request Lenses
+    , dfName
+
+    -- * Destructuring the Response
+    , deleteFleetResponse
+    , DeleteFleetResponse
+    -- * Response Lenses
+    , dfrsResponseStatus
+    ) where
+
+import           Network.AWS.AppStream.Types
+import           Network.AWS.AppStream.Types.Product
+import           Network.AWS.Lens
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'deleteFleet' smart constructor.
+newtype DeleteFleet = DeleteFleet'
+    { _dfName :: Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DeleteFleet' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dfName' - The name of the fleet to be deleted.
+deleteFleet
+    :: Text -- ^ 'dfName'
+    -> DeleteFleet
+deleteFleet pName_ =
+    DeleteFleet'
+    { _dfName = pName_
+    }
+
+-- | The name of the fleet to be deleted.
+dfName :: Lens' DeleteFleet Text
+dfName = lens _dfName (\ s a -> s{_dfName = a});
+
+instance AWSRequest DeleteFleet where
+        type Rs DeleteFleet = DeleteFleetResponse
+        request = postJSON appStream
+        response
+          = receiveEmpty
+              (\ s h x ->
+                 DeleteFleetResponse' <$> (pure (fromEnum s)))
+
+instance Hashable DeleteFleet
+
+instance NFData DeleteFleet
+
+instance ToHeaders DeleteFleet where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("PhotonAdminProxyService.DeleteFleet" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON DeleteFleet where
+        toJSON DeleteFleet'{..}
+          = object (catMaybes [Just ("Name" .= _dfName)])
+
+instance ToPath DeleteFleet where
+        toPath = const "/"
+
+instance ToQuery DeleteFleet where
+        toQuery = const mempty
+
+-- | /See:/ 'deleteFleetResponse' smart constructor.
+newtype DeleteFleetResponse = DeleteFleetResponse'
+    { _dfrsResponseStatus :: Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DeleteFleetResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dfrsResponseStatus' - -- | The response status code.
+deleteFleetResponse
+    :: Int -- ^ 'dfrsResponseStatus'
+    -> DeleteFleetResponse
+deleteFleetResponse pResponseStatus_ =
+    DeleteFleetResponse'
+    { _dfrsResponseStatus = pResponseStatus_
+    }
+
+-- | -- | The response status code.
+dfrsResponseStatus :: Lens' DeleteFleetResponse Int
+dfrsResponseStatus = lens _dfrsResponseStatus (\ s a -> s{_dfrsResponseStatus = a});
+
+instance NFData DeleteFleetResponse
diff --git a/gen/Network/AWS/AppStream/DeleteStack.hs b/gen/Network/AWS/AppStream/DeleteStack.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AppStream/DeleteStack.hs
@@ -0,0 +1,122 @@
+{-# 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.AppStream.DeleteStack
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes the stack. After this operation completes, the environment can no longer be activated, and any reservations made for the stack are released.
+--
+--
+module Network.AWS.AppStream.DeleteStack
+    (
+    -- * Creating a Request
+      deleteStack
+    , DeleteStack
+    -- * Request Lenses
+    , dsName
+
+    -- * Destructuring the Response
+    , deleteStackResponse
+    , DeleteStackResponse
+    -- * Response Lenses
+    , dsrsResponseStatus
+    ) where
+
+import           Network.AWS.AppStream.Types
+import           Network.AWS.AppStream.Types.Product
+import           Network.AWS.Lens
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'deleteStack' smart constructor.
+newtype DeleteStack = DeleteStack'
+    { _dsName :: Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DeleteStack' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dsName' - The name of the stack to delete.
+deleteStack
+    :: Text -- ^ 'dsName'
+    -> DeleteStack
+deleteStack pName_ =
+    DeleteStack'
+    { _dsName = pName_
+    }
+
+-- | The name of the stack to delete.
+dsName :: Lens' DeleteStack Text
+dsName = lens _dsName (\ s a -> s{_dsName = a});
+
+instance AWSRequest DeleteStack where
+        type Rs DeleteStack = DeleteStackResponse
+        request = postJSON appStream
+        response
+          = receiveEmpty
+              (\ s h x ->
+                 DeleteStackResponse' <$> (pure (fromEnum s)))
+
+instance Hashable DeleteStack
+
+instance NFData DeleteStack
+
+instance ToHeaders DeleteStack where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("PhotonAdminProxyService.DeleteStack" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON DeleteStack where
+        toJSON DeleteStack'{..}
+          = object (catMaybes [Just ("Name" .= _dsName)])
+
+instance ToPath DeleteStack where
+        toPath = const "/"
+
+instance ToQuery DeleteStack where
+        toQuery = const mempty
+
+-- | /See:/ 'deleteStackResponse' smart constructor.
+newtype DeleteStackResponse = DeleteStackResponse'
+    { _dsrsResponseStatus :: Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DeleteStackResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dsrsResponseStatus' - -- | The response status code.
+deleteStackResponse
+    :: Int -- ^ 'dsrsResponseStatus'
+    -> DeleteStackResponse
+deleteStackResponse pResponseStatus_ =
+    DeleteStackResponse'
+    { _dsrsResponseStatus = pResponseStatus_
+    }
+
+-- | -- | The response status code.
+dsrsResponseStatus :: Lens' DeleteStackResponse Int
+dsrsResponseStatus = lens _dsrsResponseStatus (\ s a -> s{_dsrsResponseStatus = a});
+
+instance NFData DeleteStackResponse
diff --git a/gen/Network/AWS/AppStream/DescribeFleets.hs b/gen/Network/AWS/AppStream/DescribeFleets.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AppStream/DescribeFleets.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.AppStream.DescribeFleets
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- If fleet names are provided, this operation describes the specified fleets; otherwise, all the fleets in the account are described.
+--
+--
+module Network.AWS.AppStream.DescribeFleets
+    (
+    -- * Creating a Request
+      describeFleets
+    , DescribeFleets
+    -- * Request Lenses
+    , dfNextToken
+    , dfNames
+
+    -- * Destructuring the Response
+    , describeFleetsResponse
+    , DescribeFleetsResponse
+    -- * Response Lenses
+    , dfsrsNextToken
+    , dfsrsFleets
+    , dfsrsResponseStatus
+    ) where
+
+import           Network.AWS.AppStream.Types
+import           Network.AWS.AppStream.Types.Product
+import           Network.AWS.Lens
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'describeFleets' smart constructor.
+data DescribeFleets = DescribeFleets'
+    { _dfNextToken :: !(Maybe Text)
+    , _dfNames     :: !(Maybe [Text])
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DescribeFleets' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dfNextToken' - The pagination token to use to retrieve the next page of results for this operation. If this value is null, it retrieves the first page.
+--
+-- * 'dfNames' - The fleet names to describe. Use null to describe all the fleets for the AWS account.
+describeFleets
+    :: DescribeFleets
+describeFleets =
+    DescribeFleets'
+    { _dfNextToken = Nothing
+    , _dfNames = Nothing
+    }
+
+-- | The pagination token to use to retrieve the next page of results for this operation. If this value is null, it retrieves the first page.
+dfNextToken :: Lens' DescribeFleets (Maybe Text)
+dfNextToken = lens _dfNextToken (\ s a -> s{_dfNextToken = a});
+
+-- | The fleet names to describe. Use null to describe all the fleets for the AWS account.
+dfNames :: Lens' DescribeFleets [Text]
+dfNames = lens _dfNames (\ s a -> s{_dfNames = a}) . _Default . _Coerce;
+
+instance AWSRequest DescribeFleets where
+        type Rs DescribeFleets = DescribeFleetsResponse
+        request = postJSON appStream
+        response
+          = receiveJSON
+              (\ s h x ->
+                 DescribeFleetsResponse' <$>
+                   (x .?> "NextToken") <*> (x .?> "Fleets" .!@ mempty)
+                     <*> (pure (fromEnum s)))
+
+instance Hashable DescribeFleets
+
+instance NFData DescribeFleets
+
+instance ToHeaders DescribeFleets where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("PhotonAdminProxyService.DescribeFleets" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON DescribeFleets where
+        toJSON DescribeFleets'{..}
+          = object
+              (catMaybes
+                 [("NextToken" .=) <$> _dfNextToken,
+                  ("Names" .=) <$> _dfNames])
+
+instance ToPath DescribeFleets where
+        toPath = const "/"
+
+instance ToQuery DescribeFleets where
+        toQuery = const mempty
+
+-- | /See:/ 'describeFleetsResponse' smart constructor.
+data DescribeFleetsResponse = DescribeFleetsResponse'
+    { _dfsrsNextToken      :: !(Maybe Text)
+    , _dfsrsFleets         :: !(Maybe [Fleet])
+    , _dfsrsResponseStatus :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DescribeFleetsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dfsrsNextToken' - The pagination token to use to retrieve the next page of results for this operation. If there are no more pages, this value is null.
+--
+-- * 'dfsrsFleets' - The list of fleet details.
+--
+-- * 'dfsrsResponseStatus' - -- | The response status code.
+describeFleetsResponse
+    :: Int -- ^ 'dfsrsResponseStatus'
+    -> DescribeFleetsResponse
+describeFleetsResponse pResponseStatus_ =
+    DescribeFleetsResponse'
+    { _dfsrsNextToken = Nothing
+    , _dfsrsFleets = Nothing
+    , _dfsrsResponseStatus = pResponseStatus_
+    }
+
+-- | The pagination token to use to retrieve the next page of results for this operation. If there are no more pages, this value is null.
+dfsrsNextToken :: Lens' DescribeFleetsResponse (Maybe Text)
+dfsrsNextToken = lens _dfsrsNextToken (\ s a -> s{_dfsrsNextToken = a});
+
+-- | The list of fleet details.
+dfsrsFleets :: Lens' DescribeFleetsResponse [Fleet]
+dfsrsFleets = lens _dfsrsFleets (\ s a -> s{_dfsrsFleets = a}) . _Default . _Coerce;
+
+-- | -- | The response status code.
+dfsrsResponseStatus :: Lens' DescribeFleetsResponse Int
+dfsrsResponseStatus = lens _dfsrsResponseStatus (\ s a -> s{_dfsrsResponseStatus = a});
+
+instance NFData DescribeFleetsResponse
diff --git a/gen/Network/AWS/AppStream/DescribeImages.hs b/gen/Network/AWS/AppStream/DescribeImages.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AppStream/DescribeImages.hs
@@ -0,0 +1,131 @@
+{-# 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.AppStream.DescribeImages
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes the images. If a list of names is not provided, all images in your account are returned. This operation does not return a paginated result.
+--
+--
+module Network.AWS.AppStream.DescribeImages
+    (
+    -- * Creating a Request
+      describeImages
+    , DescribeImages
+    -- * Request Lenses
+    , diNames
+
+    -- * Destructuring the Response
+    , describeImagesResponse
+    , DescribeImagesResponse
+    -- * Response Lenses
+    , dirsImages
+    , dirsResponseStatus
+    ) where
+
+import           Network.AWS.AppStream.Types
+import           Network.AWS.AppStream.Types.Product
+import           Network.AWS.Lens
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'describeImages' smart constructor.
+newtype DescribeImages = DescribeImages'
+    { _diNames :: Maybe [Text]
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DescribeImages' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'diNames' - A specific list of images to describe.
+describeImages
+    :: DescribeImages
+describeImages =
+    DescribeImages'
+    { _diNames = Nothing
+    }
+
+-- | A specific list of images to describe.
+diNames :: Lens' DescribeImages [Text]
+diNames = lens _diNames (\ s a -> s{_diNames = a}) . _Default . _Coerce;
+
+instance AWSRequest DescribeImages where
+        type Rs DescribeImages = DescribeImagesResponse
+        request = postJSON appStream
+        response
+          = receiveJSON
+              (\ s h x ->
+                 DescribeImagesResponse' <$>
+                   (x .?> "Images" .!@ mempty) <*> (pure (fromEnum s)))
+
+instance Hashable DescribeImages
+
+instance NFData DescribeImages
+
+instance ToHeaders DescribeImages where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("PhotonAdminProxyService.DescribeImages" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON DescribeImages where
+        toJSON DescribeImages'{..}
+          = object (catMaybes [("Names" .=) <$> _diNames])
+
+instance ToPath DescribeImages where
+        toPath = const "/"
+
+instance ToQuery DescribeImages where
+        toQuery = const mempty
+
+-- | /See:/ 'describeImagesResponse' smart constructor.
+data DescribeImagesResponse = DescribeImagesResponse'
+    { _dirsImages         :: !(Maybe [Image])
+    , _dirsResponseStatus :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DescribeImagesResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dirsImages' - The list of images.
+--
+-- * 'dirsResponseStatus' - -- | The response status code.
+describeImagesResponse
+    :: Int -- ^ 'dirsResponseStatus'
+    -> DescribeImagesResponse
+describeImagesResponse pResponseStatus_ =
+    DescribeImagesResponse'
+    { _dirsImages = Nothing
+    , _dirsResponseStatus = pResponseStatus_
+    }
+
+-- | The list of images.
+dirsImages :: Lens' DescribeImagesResponse [Image]
+dirsImages = lens _dirsImages (\ s a -> s{_dirsImages = a}) . _Default . _Coerce;
+
+-- | -- | The response status code.
+dirsResponseStatus :: Lens' DescribeImagesResponse Int
+dirsResponseStatus = lens _dirsResponseStatus (\ s a -> s{_dirsResponseStatus = a});
+
+instance NFData DescribeImagesResponse
diff --git a/gen/Network/AWS/AppStream/DescribeSessions.hs b/gen/Network/AWS/AppStream/DescribeSessions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AppStream/DescribeSessions.hs
@@ -0,0 +1,185 @@
+{-# 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.AppStream.DescribeSessions
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes the streaming sessions for a stack and a fleet. If a user ID is provided, this operation returns streaming sessions for only that user. Pass this value for the @nextToken@ parameter in a subsequent call to this operation to retrieve the next set of items.
+--
+--
+module Network.AWS.AppStream.DescribeSessions
+    (
+    -- * Creating a Request
+      describeSessions
+    , DescribeSessions
+    -- * Request Lenses
+    , dsUserId
+    , dsNextToken
+    , dsLimit
+    , dsStackName
+    , dsFleetName
+
+    -- * Destructuring the Response
+    , describeSessionsResponse
+    , DescribeSessionsResponse
+    -- * Response Lenses
+    , dssrsNextToken
+    , dssrsSessions
+    , dssrsResponseStatus
+    ) where
+
+import           Network.AWS.AppStream.Types
+import           Network.AWS.AppStream.Types.Product
+import           Network.AWS.Lens
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'describeSessions' smart constructor.
+data DescribeSessions = DescribeSessions'
+    { _dsUserId    :: !(Maybe Text)
+    , _dsNextToken :: !(Maybe Text)
+    , _dsLimit     :: !(Maybe Int)
+    , _dsStackName :: !Text
+    , _dsFleetName :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DescribeSessions' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dsUserId' - The user for whom to list sessions. Use null to describe all the sessions for the stack and fleet.
+--
+-- * 'dsNextToken' - The pagination token to use to retrieve the next page of results for this operation. If this value is null, it retrieves the first page.
+--
+-- * 'dsLimit' - The size of each page of results. The default value is 20 and the maximum supported value is 50.
+--
+-- * 'dsStackName' - The name of the stack for which to list sessions.
+--
+-- * 'dsFleetName' - The name of the fleet for which to list sessions.
+describeSessions
+    :: Text -- ^ 'dsStackName'
+    -> Text -- ^ 'dsFleetName'
+    -> DescribeSessions
+describeSessions pStackName_ pFleetName_ =
+    DescribeSessions'
+    { _dsUserId = Nothing
+    , _dsNextToken = Nothing
+    , _dsLimit = Nothing
+    , _dsStackName = pStackName_
+    , _dsFleetName = pFleetName_
+    }
+
+-- | The user for whom to list sessions. Use null to describe all the sessions for the stack and fleet.
+dsUserId :: Lens' DescribeSessions (Maybe Text)
+dsUserId = lens _dsUserId (\ s a -> s{_dsUserId = a});
+
+-- | The pagination token to use to retrieve the next page of results for this operation. If this value is null, it retrieves the first page.
+dsNextToken :: Lens' DescribeSessions (Maybe Text)
+dsNextToken = lens _dsNextToken (\ s a -> s{_dsNextToken = a});
+
+-- | The size of each page of results. The default value is 20 and the maximum supported value is 50.
+dsLimit :: Lens' DescribeSessions (Maybe Int)
+dsLimit = lens _dsLimit (\ s a -> s{_dsLimit = a});
+
+-- | The name of the stack for which to list sessions.
+dsStackName :: Lens' DescribeSessions Text
+dsStackName = lens _dsStackName (\ s a -> s{_dsStackName = a});
+
+-- | The name of the fleet for which to list sessions.
+dsFleetName :: Lens' DescribeSessions Text
+dsFleetName = lens _dsFleetName (\ s a -> s{_dsFleetName = a});
+
+instance AWSRequest DescribeSessions where
+        type Rs DescribeSessions = DescribeSessionsResponse
+        request = postJSON appStream
+        response
+          = receiveJSON
+              (\ s h x ->
+                 DescribeSessionsResponse' <$>
+                   (x .?> "NextToken") <*> (x .?> "Sessions" .!@ mempty)
+                     <*> (pure (fromEnum s)))
+
+instance Hashable DescribeSessions
+
+instance NFData DescribeSessions
+
+instance ToHeaders DescribeSessions where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("PhotonAdminProxyService.DescribeSessions" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON DescribeSessions where
+        toJSON DescribeSessions'{..}
+          = object
+              (catMaybes
+                 [("UserId" .=) <$> _dsUserId,
+                  ("NextToken" .=) <$> _dsNextToken,
+                  ("Limit" .=) <$> _dsLimit,
+                  Just ("StackName" .= _dsStackName),
+                  Just ("FleetName" .= _dsFleetName)])
+
+instance ToPath DescribeSessions where
+        toPath = const "/"
+
+instance ToQuery DescribeSessions where
+        toQuery = const mempty
+
+-- | /See:/ 'describeSessionsResponse' smart constructor.
+data DescribeSessionsResponse = DescribeSessionsResponse'
+    { _dssrsNextToken      :: !(Maybe Text)
+    , _dssrsSessions       :: !(Maybe [Session])
+    , _dssrsResponseStatus :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DescribeSessionsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dssrsNextToken' - The pagination token to use to retrieve the next page of results for this operation. If there are no more pages, this value is null.
+--
+-- * 'dssrsSessions' - The list of streaming sessions.
+--
+-- * 'dssrsResponseStatus' - -- | The response status code.
+describeSessionsResponse
+    :: Int -- ^ 'dssrsResponseStatus'
+    -> DescribeSessionsResponse
+describeSessionsResponse pResponseStatus_ =
+    DescribeSessionsResponse'
+    { _dssrsNextToken = Nothing
+    , _dssrsSessions = Nothing
+    , _dssrsResponseStatus = pResponseStatus_
+    }
+
+-- | The pagination token to use to retrieve the next page of results for this operation. If there are no more pages, this value is null.
+dssrsNextToken :: Lens' DescribeSessionsResponse (Maybe Text)
+dssrsNextToken = lens _dssrsNextToken (\ s a -> s{_dssrsNextToken = a});
+
+-- | The list of streaming sessions.
+dssrsSessions :: Lens' DescribeSessionsResponse [Session]
+dssrsSessions = lens _dssrsSessions (\ s a -> s{_dssrsSessions = a}) . _Default . _Coerce;
+
+-- | -- | The response status code.
+dssrsResponseStatus :: Lens' DescribeSessionsResponse Int
+dssrsResponseStatus = lens _dssrsResponseStatus (\ s a -> s{_dssrsResponseStatus = a});
+
+instance NFData DescribeSessionsResponse
diff --git a/gen/Network/AWS/AppStream/DescribeStacks.hs b/gen/Network/AWS/AppStream/DescribeStacks.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AppStream/DescribeStacks.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.AppStream.DescribeStacks
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- If stack names are not provided, this operation describes the specified stacks; otherwise, all stacks in the account are described. Pass the @nextToken@ value in a subsequent call to this operation to retrieve the next set of items.
+--
+--
+module Network.AWS.AppStream.DescribeStacks
+    (
+    -- * Creating a Request
+      describeStacks
+    , DescribeStacks
+    -- * Request Lenses
+    , dNextToken
+    , dNames
+
+    -- * Destructuring the Response
+    , describeStacksResponse
+    , DescribeStacksResponse
+    -- * Response Lenses
+    , desrsNextToken
+    , desrsStacks
+    , desrsResponseStatus
+    ) where
+
+import           Network.AWS.AppStream.Types
+import           Network.AWS.AppStream.Types.Product
+import           Network.AWS.Lens
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'describeStacks' smart constructor.
+data DescribeStacks = DescribeStacks'
+    { _dNextToken :: !(Maybe Text)
+    , _dNames     :: !(Maybe [Text])
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DescribeStacks' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dNextToken' - The pagination token to use to retrieve the next page of results for this operation. If this value is null, it retrieves the first page.
+--
+-- * 'dNames' - The stack names to describe. Use null to describe all the stacks for the AWS account.
+describeStacks
+    :: DescribeStacks
+describeStacks =
+    DescribeStacks'
+    { _dNextToken = Nothing
+    , _dNames = Nothing
+    }
+
+-- | The pagination token to use to retrieve the next page of results for this operation. If this value is null, it retrieves the first page.
+dNextToken :: Lens' DescribeStacks (Maybe Text)
+dNextToken = lens _dNextToken (\ s a -> s{_dNextToken = a});
+
+-- | The stack names to describe. Use null to describe all the stacks for the AWS account.
+dNames :: Lens' DescribeStacks [Text]
+dNames = lens _dNames (\ s a -> s{_dNames = a}) . _Default . _Coerce;
+
+instance AWSRequest DescribeStacks where
+        type Rs DescribeStacks = DescribeStacksResponse
+        request = postJSON appStream
+        response
+          = receiveJSON
+              (\ s h x ->
+                 DescribeStacksResponse' <$>
+                   (x .?> "NextToken") <*> (x .?> "Stacks" .!@ mempty)
+                     <*> (pure (fromEnum s)))
+
+instance Hashable DescribeStacks
+
+instance NFData DescribeStacks
+
+instance ToHeaders DescribeStacks where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("PhotonAdminProxyService.DescribeStacks" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON DescribeStacks where
+        toJSON DescribeStacks'{..}
+          = object
+              (catMaybes
+                 [("NextToken" .=) <$> _dNextToken,
+                  ("Names" .=) <$> _dNames])
+
+instance ToPath DescribeStacks where
+        toPath = const "/"
+
+instance ToQuery DescribeStacks where
+        toQuery = const mempty
+
+-- | /See:/ 'describeStacksResponse' smart constructor.
+data DescribeStacksResponse = DescribeStacksResponse'
+    { _desrsNextToken      :: !(Maybe Text)
+    , _desrsStacks         :: !(Maybe [Stack])
+    , _desrsResponseStatus :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DescribeStacksResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'desrsNextToken' - The pagination token to use to retrieve the next page of results for this operation. If there are no more pages, this value is null.
+--
+-- * 'desrsStacks' - The list of stack details.
+--
+-- * 'desrsResponseStatus' - -- | The response status code.
+describeStacksResponse
+    :: Int -- ^ 'desrsResponseStatus'
+    -> DescribeStacksResponse
+describeStacksResponse pResponseStatus_ =
+    DescribeStacksResponse'
+    { _desrsNextToken = Nothing
+    , _desrsStacks = Nothing
+    , _desrsResponseStatus = pResponseStatus_
+    }
+
+-- | The pagination token to use to retrieve the next page of results for this operation. If there are no more pages, this value is null.
+desrsNextToken :: Lens' DescribeStacksResponse (Maybe Text)
+desrsNextToken = lens _desrsNextToken (\ s a -> s{_desrsNextToken = a});
+
+-- | The list of stack details.
+desrsStacks :: Lens' DescribeStacksResponse [Stack]
+desrsStacks = lens _desrsStacks (\ s a -> s{_desrsStacks = a}) . _Default . _Coerce;
+
+-- | -- | The response status code.
+desrsResponseStatus :: Lens' DescribeStacksResponse Int
+desrsResponseStatus = lens _desrsResponseStatus (\ s a -> s{_desrsResponseStatus = a});
+
+instance NFData DescribeStacksResponse
diff --git a/gen/Network/AWS/AppStream/DisassociateFleet.hs b/gen/Network/AWS/AppStream/DisassociateFleet.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AppStream/DisassociateFleet.hs
@@ -0,0 +1,135 @@
+{-# 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.AppStream.DisassociateFleet
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Disassociates a fleet from a stack.
+--
+--
+module Network.AWS.AppStream.DisassociateFleet
+    (
+    -- * Creating a Request
+      disassociateFleet
+    , DisassociateFleet
+    -- * Request Lenses
+    , dfFleetName
+    , dfStackName
+
+    -- * Destructuring the Response
+    , disassociateFleetResponse
+    , DisassociateFleetResponse
+    -- * Response Lenses
+    , drsResponseStatus
+    ) where
+
+import           Network.AWS.AppStream.Types
+import           Network.AWS.AppStream.Types.Product
+import           Network.AWS.Lens
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'disassociateFleet' smart constructor.
+data DisassociateFleet = DisassociateFleet'
+    { _dfFleetName :: !Text
+    , _dfStackName :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DisassociateFleet' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dfFleetName' - The name of the fleet to disassociate.
+--
+-- * 'dfStackName' - The name of the stack with which the fleet is associated.
+disassociateFleet
+    :: Text -- ^ 'dfFleetName'
+    -> Text -- ^ 'dfStackName'
+    -> DisassociateFleet
+disassociateFleet pFleetName_ pStackName_ =
+    DisassociateFleet'
+    { _dfFleetName = pFleetName_
+    , _dfStackName = pStackName_
+    }
+
+-- | The name of the fleet to disassociate.
+dfFleetName :: Lens' DisassociateFleet Text
+dfFleetName = lens _dfFleetName (\ s a -> s{_dfFleetName = a});
+
+-- | The name of the stack with which the fleet is associated.
+dfStackName :: Lens' DisassociateFleet Text
+dfStackName = lens _dfStackName (\ s a -> s{_dfStackName = a});
+
+instance AWSRequest DisassociateFleet where
+        type Rs DisassociateFleet = DisassociateFleetResponse
+        request = postJSON appStream
+        response
+          = receiveEmpty
+              (\ s h x ->
+                 DisassociateFleetResponse' <$> (pure (fromEnum s)))
+
+instance Hashable DisassociateFleet
+
+instance NFData DisassociateFleet
+
+instance ToHeaders DisassociateFleet where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("PhotonAdminProxyService.DisassociateFleet" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON DisassociateFleet where
+        toJSON DisassociateFleet'{..}
+          = object
+              (catMaybes
+                 [Just ("FleetName" .= _dfFleetName),
+                  Just ("StackName" .= _dfStackName)])
+
+instance ToPath DisassociateFleet where
+        toPath = const "/"
+
+instance ToQuery DisassociateFleet where
+        toQuery = const mempty
+
+-- | /See:/ 'disassociateFleetResponse' smart constructor.
+newtype DisassociateFleetResponse = DisassociateFleetResponse'
+    { _drsResponseStatus :: Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DisassociateFleetResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'drsResponseStatus' - -- | The response status code.
+disassociateFleetResponse
+    :: Int -- ^ 'drsResponseStatus'
+    -> DisassociateFleetResponse
+disassociateFleetResponse pResponseStatus_ =
+    DisassociateFleetResponse'
+    { _drsResponseStatus = pResponseStatus_
+    }
+
+-- | -- | The response status code.
+drsResponseStatus :: Lens' DisassociateFleetResponse Int
+drsResponseStatus = lens _drsResponseStatus (\ s a -> s{_drsResponseStatus = a});
+
+instance NFData DisassociateFleetResponse
diff --git a/gen/Network/AWS/AppStream/ExpireSession.hs b/gen/Network/AWS/AppStream/ExpireSession.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AppStream/ExpireSession.hs
@@ -0,0 +1,123 @@
+{-# 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.AppStream.ExpireSession
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- This operation immediately stops a streaming session.
+--
+--
+module Network.AWS.AppStream.ExpireSession
+    (
+    -- * Creating a Request
+      expireSession
+    , ExpireSession
+    -- * Request Lenses
+    , esSessionId
+
+    -- * Destructuring the Response
+    , expireSessionResponse
+    , ExpireSessionResponse
+    -- * Response Lenses
+    , esrsResponseStatus
+    ) where
+
+import           Network.AWS.AppStream.Types
+import           Network.AWS.AppStream.Types.Product
+import           Network.AWS.Lens
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'expireSession' smart constructor.
+newtype ExpireSession = ExpireSession'
+    { _esSessionId :: Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ExpireSession' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'esSessionId' - The unique identifier of the streaming session to be stopped.
+expireSession
+    :: Text -- ^ 'esSessionId'
+    -> ExpireSession
+expireSession pSessionId_ =
+    ExpireSession'
+    { _esSessionId = pSessionId_
+    }
+
+-- | The unique identifier of the streaming session to be stopped.
+esSessionId :: Lens' ExpireSession Text
+esSessionId = lens _esSessionId (\ s a -> s{_esSessionId = a});
+
+instance AWSRequest ExpireSession where
+        type Rs ExpireSession = ExpireSessionResponse
+        request = postJSON appStream
+        response
+          = receiveEmpty
+              (\ s h x ->
+                 ExpireSessionResponse' <$> (pure (fromEnum s)))
+
+instance Hashable ExpireSession
+
+instance NFData ExpireSession
+
+instance ToHeaders ExpireSession where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("PhotonAdminProxyService.ExpireSession" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON ExpireSession where
+        toJSON ExpireSession'{..}
+          = object
+              (catMaybes [Just ("SessionId" .= _esSessionId)])
+
+instance ToPath ExpireSession where
+        toPath = const "/"
+
+instance ToQuery ExpireSession where
+        toQuery = const mempty
+
+-- | /See:/ 'expireSessionResponse' smart constructor.
+newtype ExpireSessionResponse = ExpireSessionResponse'
+    { _esrsResponseStatus :: Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ExpireSessionResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'esrsResponseStatus' - -- | The response status code.
+expireSessionResponse
+    :: Int -- ^ 'esrsResponseStatus'
+    -> ExpireSessionResponse
+expireSessionResponse pResponseStatus_ =
+    ExpireSessionResponse'
+    { _esrsResponseStatus = pResponseStatus_
+    }
+
+-- | -- | The response status code.
+esrsResponseStatus :: Lens' ExpireSessionResponse Int
+esrsResponseStatus = lens _esrsResponseStatus (\ s a -> s{_esrsResponseStatus = a});
+
+instance NFData ExpireSessionResponse
diff --git a/gen/Network/AWS/AppStream/ListAssociatedFleets.hs b/gen/Network/AWS/AppStream/ListAssociatedFleets.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AppStream/ListAssociatedFleets.hs
@@ -0,0 +1,159 @@
+{-# 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.AppStream.ListAssociatedFleets
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists all fleets associated with the stack.
+--
+--
+module Network.AWS.AppStream.ListAssociatedFleets
+    (
+    -- * Creating a Request
+      listAssociatedFleets
+    , ListAssociatedFleets
+    -- * Request Lenses
+    , lafNextToken
+    , lafStackName
+
+    -- * Destructuring the Response
+    , listAssociatedFleetsResponse
+    , ListAssociatedFleetsResponse
+    -- * Response Lenses
+    , lafrsNextToken
+    , lafrsNames
+    , lafrsResponseStatus
+    ) where
+
+import           Network.AWS.AppStream.Types
+import           Network.AWS.AppStream.Types.Product
+import           Network.AWS.Lens
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'listAssociatedFleets' smart constructor.
+data ListAssociatedFleets = ListAssociatedFleets'
+    { _lafNextToken :: !(Maybe Text)
+    , _lafStackName :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ListAssociatedFleets' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'lafNextToken' - The pagination token to use to retrieve the next page of results for this operation. If this value is null, it retrieves the first page.
+--
+-- * 'lafStackName' - The name of the stack whose associated fleets are listed.
+listAssociatedFleets
+    :: Text -- ^ 'lafStackName'
+    -> ListAssociatedFleets
+listAssociatedFleets pStackName_ =
+    ListAssociatedFleets'
+    { _lafNextToken = Nothing
+    , _lafStackName = pStackName_
+    }
+
+-- | The pagination token to use to retrieve the next page of results for this operation. If this value is null, it retrieves the first page.
+lafNextToken :: Lens' ListAssociatedFleets (Maybe Text)
+lafNextToken = lens _lafNextToken (\ s a -> s{_lafNextToken = a});
+
+-- | The name of the stack whose associated fleets are listed.
+lafStackName :: Lens' ListAssociatedFleets Text
+lafStackName = lens _lafStackName (\ s a -> s{_lafStackName = a});
+
+instance AWSRequest ListAssociatedFleets where
+        type Rs ListAssociatedFleets =
+             ListAssociatedFleetsResponse
+        request = postJSON appStream
+        response
+          = receiveJSON
+              (\ s h x ->
+                 ListAssociatedFleetsResponse' <$>
+                   (x .?> "NextToken") <*> (x .?> "Names" .!@ mempty)
+                     <*> (pure (fromEnum s)))
+
+instance Hashable ListAssociatedFleets
+
+instance NFData ListAssociatedFleets
+
+instance ToHeaders ListAssociatedFleets where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("PhotonAdminProxyService.ListAssociatedFleets" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON ListAssociatedFleets where
+        toJSON ListAssociatedFleets'{..}
+          = object
+              (catMaybes
+                 [("NextToken" .=) <$> _lafNextToken,
+                  Just ("StackName" .= _lafStackName)])
+
+instance ToPath ListAssociatedFleets where
+        toPath = const "/"
+
+instance ToQuery ListAssociatedFleets where
+        toQuery = const mempty
+
+-- | The response from a successful operation.
+--
+--
+--
+-- /See:/ 'listAssociatedFleetsResponse' smart constructor.
+data ListAssociatedFleetsResponse = ListAssociatedFleetsResponse'
+    { _lafrsNextToken      :: !(Maybe Text)
+    , _lafrsNames          :: !(Maybe [Text])
+    , _lafrsResponseStatus :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ListAssociatedFleetsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'lafrsNextToken' - The pagination token to use to retrieve the next page of results for this operation. If there are no more pages, this value is null.
+--
+-- * 'lafrsNames' - The names of associated fleets.
+--
+-- * 'lafrsResponseStatus' - -- | The response status code.
+listAssociatedFleetsResponse
+    :: Int -- ^ 'lafrsResponseStatus'
+    -> ListAssociatedFleetsResponse
+listAssociatedFleetsResponse pResponseStatus_ =
+    ListAssociatedFleetsResponse'
+    { _lafrsNextToken = Nothing
+    , _lafrsNames = Nothing
+    , _lafrsResponseStatus = pResponseStatus_
+    }
+
+-- | The pagination token to use to retrieve the next page of results for this operation. If there are no more pages, this value is null.
+lafrsNextToken :: Lens' ListAssociatedFleetsResponse (Maybe Text)
+lafrsNextToken = lens _lafrsNextToken (\ s a -> s{_lafrsNextToken = a});
+
+-- | The names of associated fleets.
+lafrsNames :: Lens' ListAssociatedFleetsResponse [Text]
+lafrsNames = lens _lafrsNames (\ s a -> s{_lafrsNames = a}) . _Default . _Coerce;
+
+-- | -- | The response status code.
+lafrsResponseStatus :: Lens' ListAssociatedFleetsResponse Int
+lafrsResponseStatus = lens _lafrsResponseStatus (\ s a -> s{_lafrsResponseStatus = a});
+
+instance NFData ListAssociatedFleetsResponse
diff --git a/gen/Network/AWS/AppStream/ListAssociatedStacks.hs b/gen/Network/AWS/AppStream/ListAssociatedStacks.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AppStream/ListAssociatedStacks.hs
@@ -0,0 +1,159 @@
+{-# 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.AppStream.ListAssociatedStacks
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists all stacks to which the specified fleet is associated.
+--
+--
+module Network.AWS.AppStream.ListAssociatedStacks
+    (
+    -- * Creating a Request
+      listAssociatedStacks
+    , ListAssociatedStacks
+    -- * Request Lenses
+    , lasNextToken
+    , lasFleetName
+
+    -- * Destructuring the Response
+    , listAssociatedStacksResponse
+    , ListAssociatedStacksResponse
+    -- * Response Lenses
+    , lasrsNextToken
+    , lasrsNames
+    , lasrsResponseStatus
+    ) where
+
+import           Network.AWS.AppStream.Types
+import           Network.AWS.AppStream.Types.Product
+import           Network.AWS.Lens
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'listAssociatedStacks' smart constructor.
+data ListAssociatedStacks = ListAssociatedStacks'
+    { _lasNextToken :: !(Maybe Text)
+    , _lasFleetName :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ListAssociatedStacks' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'lasNextToken' - The pagination token to use to retrieve the next page of results for this operation. If this value is null, it retrieves the first page.
+--
+-- * 'lasFleetName' - The name of the fleet whose associated stacks are listed.
+listAssociatedStacks
+    :: Text -- ^ 'lasFleetName'
+    -> ListAssociatedStacks
+listAssociatedStacks pFleetName_ =
+    ListAssociatedStacks'
+    { _lasNextToken = Nothing
+    , _lasFleetName = pFleetName_
+    }
+
+-- | The pagination token to use to retrieve the next page of results for this operation. If this value is null, it retrieves the first page.
+lasNextToken :: Lens' ListAssociatedStacks (Maybe Text)
+lasNextToken = lens _lasNextToken (\ s a -> s{_lasNextToken = a});
+
+-- | The name of the fleet whose associated stacks are listed.
+lasFleetName :: Lens' ListAssociatedStacks Text
+lasFleetName = lens _lasFleetName (\ s a -> s{_lasFleetName = a});
+
+instance AWSRequest ListAssociatedStacks where
+        type Rs ListAssociatedStacks =
+             ListAssociatedStacksResponse
+        request = postJSON appStream
+        response
+          = receiveJSON
+              (\ s h x ->
+                 ListAssociatedStacksResponse' <$>
+                   (x .?> "NextToken") <*> (x .?> "Names" .!@ mempty)
+                     <*> (pure (fromEnum s)))
+
+instance Hashable ListAssociatedStacks
+
+instance NFData ListAssociatedStacks
+
+instance ToHeaders ListAssociatedStacks where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("PhotonAdminProxyService.ListAssociatedStacks" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON ListAssociatedStacks where
+        toJSON ListAssociatedStacks'{..}
+          = object
+              (catMaybes
+                 [("NextToken" .=) <$> _lasNextToken,
+                  Just ("FleetName" .= _lasFleetName)])
+
+instance ToPath ListAssociatedStacks where
+        toPath = const "/"
+
+instance ToQuery ListAssociatedStacks where
+        toQuery = const mempty
+
+-- | The response from a successful operation.
+--
+--
+--
+-- /See:/ 'listAssociatedStacksResponse' smart constructor.
+data ListAssociatedStacksResponse = ListAssociatedStacksResponse'
+    { _lasrsNextToken      :: !(Maybe Text)
+    , _lasrsNames          :: !(Maybe [Text])
+    , _lasrsResponseStatus :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ListAssociatedStacksResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'lasrsNextToken' - The pagination token to use to retrieve the next page of results for this operation. If there are no more pages, this value is null.
+--
+-- * 'lasrsNames' - The names of associated stacks.
+--
+-- * 'lasrsResponseStatus' - -- | The response status code.
+listAssociatedStacksResponse
+    :: Int -- ^ 'lasrsResponseStatus'
+    -> ListAssociatedStacksResponse
+listAssociatedStacksResponse pResponseStatus_ =
+    ListAssociatedStacksResponse'
+    { _lasrsNextToken = Nothing
+    , _lasrsNames = Nothing
+    , _lasrsResponseStatus = pResponseStatus_
+    }
+
+-- | The pagination token to use to retrieve the next page of results for this operation. If there are no more pages, this value is null.
+lasrsNextToken :: Lens' ListAssociatedStacksResponse (Maybe Text)
+lasrsNextToken = lens _lasrsNextToken (\ s a -> s{_lasrsNextToken = a});
+
+-- | The names of associated stacks.
+lasrsNames :: Lens' ListAssociatedStacksResponse [Text]
+lasrsNames = lens _lasrsNames (\ s a -> s{_lasrsNames = a}) . _Default . _Coerce;
+
+-- | -- | The response status code.
+lasrsResponseStatus :: Lens' ListAssociatedStacksResponse Int
+lasrsResponseStatus = lens _lasrsResponseStatus (\ s a -> s{_lasrsResponseStatus = a});
+
+instance NFData ListAssociatedStacksResponse
diff --git a/gen/Network/AWS/AppStream/StartFleet.hs b/gen/Network/AWS/AppStream/StartFleet.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AppStream/StartFleet.hs
@@ -0,0 +1,121 @@
+{-# 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.AppStream.StartFleet
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Starts a fleet.
+--
+--
+module Network.AWS.AppStream.StartFleet
+    (
+    -- * Creating a Request
+      startFleet
+    , StartFleet
+    -- * Request Lenses
+    , staName
+
+    -- * Destructuring the Response
+    , startFleetResponse
+    , StartFleetResponse
+    -- * Response Lenses
+    , sfrsResponseStatus
+    ) where
+
+import           Network.AWS.AppStream.Types
+import           Network.AWS.AppStream.Types.Product
+import           Network.AWS.Lens
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'startFleet' smart constructor.
+newtype StartFleet = StartFleet'
+    { _staName :: Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'StartFleet' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'staName' - The name of the fleet to start.
+startFleet
+    :: Text -- ^ 'staName'
+    -> StartFleet
+startFleet pName_ =
+    StartFleet'
+    { _staName = pName_
+    }
+
+-- | The name of the fleet to start.
+staName :: Lens' StartFleet Text
+staName = lens _staName (\ s a -> s{_staName = a});
+
+instance AWSRequest StartFleet where
+        type Rs StartFleet = StartFleetResponse
+        request = postJSON appStream
+        response
+          = receiveEmpty
+              (\ s h x ->
+                 StartFleetResponse' <$> (pure (fromEnum s)))
+
+instance Hashable StartFleet
+
+instance NFData StartFleet
+
+instance ToHeaders StartFleet where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("PhotonAdminProxyService.StartFleet" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON StartFleet where
+        toJSON StartFleet'{..}
+          = object (catMaybes [Just ("Name" .= _staName)])
+
+instance ToPath StartFleet where
+        toPath = const "/"
+
+instance ToQuery StartFleet where
+        toQuery = const mempty
+
+-- | /See:/ 'startFleetResponse' smart constructor.
+newtype StartFleetResponse = StartFleetResponse'
+    { _sfrsResponseStatus :: Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'StartFleetResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sfrsResponseStatus' - -- | The response status code.
+startFleetResponse
+    :: Int -- ^ 'sfrsResponseStatus'
+    -> StartFleetResponse
+startFleetResponse pResponseStatus_ =
+    StartFleetResponse'
+    { _sfrsResponseStatus = pResponseStatus_
+    }
+
+-- | -- | The response status code.
+sfrsResponseStatus :: Lens' StartFleetResponse Int
+sfrsResponseStatus = lens _sfrsResponseStatus (\ s a -> s{_sfrsResponseStatus = a});
+
+instance NFData StartFleetResponse
diff --git a/gen/Network/AWS/AppStream/StopFleet.hs b/gen/Network/AWS/AppStream/StopFleet.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AppStream/StopFleet.hs
@@ -0,0 +1,121 @@
+{-# 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.AppStream.StopFleet
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Stops a fleet.
+--
+--
+module Network.AWS.AppStream.StopFleet
+    (
+    -- * Creating a Request
+      stopFleet
+    , StopFleet
+    -- * Request Lenses
+    , sfName
+
+    -- * Destructuring the Response
+    , stopFleetResponse
+    , StopFleetResponse
+    -- * Response Lenses
+    , srsResponseStatus
+    ) where
+
+import           Network.AWS.AppStream.Types
+import           Network.AWS.AppStream.Types.Product
+import           Network.AWS.Lens
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'stopFleet' smart constructor.
+newtype StopFleet = StopFleet'
+    { _sfName :: Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'StopFleet' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sfName' - The name of the fleet to stop.
+stopFleet
+    :: Text -- ^ 'sfName'
+    -> StopFleet
+stopFleet pName_ =
+    StopFleet'
+    { _sfName = pName_
+    }
+
+-- | The name of the fleet to stop.
+sfName :: Lens' StopFleet Text
+sfName = lens _sfName (\ s a -> s{_sfName = a});
+
+instance AWSRequest StopFleet where
+        type Rs StopFleet = StopFleetResponse
+        request = postJSON appStream
+        response
+          = receiveEmpty
+              (\ s h x ->
+                 StopFleetResponse' <$> (pure (fromEnum s)))
+
+instance Hashable StopFleet
+
+instance NFData StopFleet
+
+instance ToHeaders StopFleet where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("PhotonAdminProxyService.StopFleet" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON StopFleet where
+        toJSON StopFleet'{..}
+          = object (catMaybes [Just ("Name" .= _sfName)])
+
+instance ToPath StopFleet where
+        toPath = const "/"
+
+instance ToQuery StopFleet where
+        toQuery = const mempty
+
+-- | /See:/ 'stopFleetResponse' smart constructor.
+newtype StopFleetResponse = StopFleetResponse'
+    { _srsResponseStatus :: Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'StopFleetResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'srsResponseStatus' - -- | The response status code.
+stopFleetResponse
+    :: Int -- ^ 'srsResponseStatus'
+    -> StopFleetResponse
+stopFleetResponse pResponseStatus_ =
+    StopFleetResponse'
+    { _srsResponseStatus = pResponseStatus_
+    }
+
+-- | -- | The response status code.
+srsResponseStatus :: Lens' StopFleetResponse Int
+srsResponseStatus = lens _srsResponseStatus (\ s a -> s{_srsResponseStatus = a});
+
+instance NFData StopFleetResponse
diff --git a/gen/Network/AWS/AppStream/Types.hs b/gen/Network/AWS/AppStream/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AppStream/Types.hs
@@ -0,0 +1,224 @@
+{-# LANGUAGE OverloadedStrings #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.AppStream.Types
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+module Network.AWS.AppStream.Types
+    (
+    -- * Service Configuration
+      appStream
+
+    -- * Errors
+    , _InvalidRoleException
+    , _ResourceAlreadyExistsException
+    , _OperationNotPermittedException
+    , _ResourceNotFoundException
+    , _ResourceNotAvailableException
+    , _LimitExceededException
+    , _ResourceInUseException
+
+    -- * FleetErrorCode
+    , FleetErrorCode (..)
+
+    -- * FleetState
+    , FleetState (..)
+
+    -- * ImageState
+    , ImageState (..)
+
+    -- * ImageStateChangeReasonCode
+    , ImageStateChangeReasonCode (..)
+
+    -- * PlatformType
+    , PlatformType (..)
+
+    -- * SessionState
+    , SessionState (..)
+
+    -- * VisibilityType
+    , VisibilityType (..)
+
+    -- * Application
+    , Application
+    , application
+    , aEnabled
+    , aLaunchPath
+    , aLaunchParameters
+    , aName
+    , aDisplayName
+    , aMetadata
+    , aIconURL
+
+    -- * ComputeCapacity
+    , ComputeCapacity
+    , computeCapacity
+    , ccDesiredInstances
+
+    -- * ComputeCapacityStatus
+    , ComputeCapacityStatus
+    , computeCapacityStatus
+    , ccsInUse
+    , ccsRunning
+    , ccsAvailable
+    , ccsDesired
+
+    -- * Fleet
+    , Fleet
+    , fleet
+    , fDisconnectTimeoutInSeconds
+    , fMaxUserDurationInSeconds
+    , fCreatedTime
+    , fVPCConfig
+    , fFleetErrors
+    , fDisplayName
+    , fDescription
+    , fARN
+    , fName
+    , fImageName
+    , fInstanceType
+    , fComputeCapacityStatus
+    , fState
+
+    -- * FleetError
+    , FleetError
+    , fleetError
+    , feErrorCode
+    , feErrorMessage
+
+    -- * Image
+    , Image
+    , image
+    , iState
+    , iPlatform
+    , iStateChangeReason
+    , iARN
+    , iCreatedTime
+    , iVisibility
+    , iBaseImageARN
+    , iDisplayName
+    , iDescription
+    , iApplications
+    , iName
+
+    -- * ImageStateChangeReason
+    , ImageStateChangeReason
+    , imageStateChangeReason
+    , iscrCode
+    , iscrMessage
+
+    -- * Session
+    , Session
+    , session
+    , sId
+    , sUserId
+    , sStackName
+    , sFleetName
+    , sState
+
+    -- * Stack
+    , Stack
+    , stack
+    , sARN
+    , sCreatedTime
+    , sDisplayName
+    , sDescription
+    , sName
+
+    -- * VPCConfig
+    , VPCConfig
+    , vpcConfig
+    , vcSubnetIds
+    ) where
+
+import           Network.AWS.AppStream.Types.Product
+import           Network.AWS.AppStream.Types.Sum
+import           Network.AWS.Lens
+import           Network.AWS.Prelude
+import           Network.AWS.Sign.V4
+
+-- | API version @2016-12-01@ of the Amazon AppStream SDK configuration.
+appStream :: Service
+appStream =
+    Service
+    { _svcAbbrev = "AppStream"
+    , _svcSigner = v4
+    , _svcPrefix = "appstream2"
+    , _svcVersion = "2016-12-01"
+    , _svcEndpoint = defaultEndpoint appStream
+    , _svcTimeout = Just 70
+    , _svcCheck = statusSuccess
+    , _svcError = parseJSONError "AppStream"
+    , _svcRetry = retry
+    }
+  where
+    retry =
+        Exponential
+        { _retryBase = 5.0e-2
+        , _retryGrowth = 2
+        , _retryAttempts = 5
+        , _retryCheck = check
+        }
+    check e
+      | has (hasStatus 429) e = Just "too_many_requests"
+      | has (hasCode "ThrottlingException" . hasStatus 400) e =
+          Just "throttling_exception"
+      | has (hasCode "Throttling" . hasStatus 400) e = Just "throttling"
+      | has (hasStatus 504) e = Just "gateway_timeout"
+      | has (hasStatus 502) e = Just "bad_gateway"
+      | has (hasStatus 503) e = Just "service_unavailable"
+      | has (hasStatus 500) e = Just "general_server_error"
+      | has (hasStatus 509) e = Just "limit_exceeded"
+      | otherwise = Nothing
+
+-- | The specified role is invalid.
+--
+--
+_InvalidRoleException :: AsError a => Getting (First ServiceError) a ServiceError
+_InvalidRoleException = _ServiceError . hasCode "InvalidRoleException"
+
+-- | The specified resource already exists.
+--
+--
+_ResourceAlreadyExistsException :: AsError a => Getting (First ServiceError) a ServiceError
+_ResourceAlreadyExistsException =
+    _ServiceError . hasCode "ResourceAlreadyExistsException"
+
+-- | The attempted operation is not permitted.
+--
+--
+_OperationNotPermittedException :: AsError a => Getting (First ServiceError) a ServiceError
+_OperationNotPermittedException =
+    _ServiceError . hasCode "OperationNotPermittedException"
+
+-- | The specified resource was not found.
+--
+--
+_ResourceNotFoundException :: AsError a => Getting (First ServiceError) a ServiceError
+_ResourceNotFoundException =
+    _ServiceError . hasCode "ResourceNotFoundException"
+
+-- | The specified resource exists and is not in use, but isn't available.
+--
+--
+_ResourceNotAvailableException :: AsError a => Getting (First ServiceError) a ServiceError
+_ResourceNotAvailableException =
+    _ServiceError . hasCode "ResourceNotAvailableException"
+
+-- | The requested limit exceeds the permitted limit for an account.
+--
+--
+_LimitExceededException :: AsError a => Getting (First ServiceError) a ServiceError
+_LimitExceededException = _ServiceError . hasCode "LimitExceededException"
+
+-- | The specified resource is in use.
+--
+--
+_ResourceInUseException :: AsError a => Getting (First ServiceError) a ServiceError
+_ResourceInUseException = _ServiceError . hasCode "ResourceInUseException"
diff --git a/gen/Network/AWS/AppStream/Types/Product.hs b/gen/Network/AWS/AppStream/Types/Product.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AppStream/Types/Product.hs
@@ -0,0 +1,762 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.AppStream.Types.Product
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+module Network.AWS.AppStream.Types.Product where
+
+import           Network.AWS.AppStream.Types.Sum
+import           Network.AWS.Lens
+import           Network.AWS.Prelude
+
+-- | An entry for a single application in the application catalog.
+--
+--
+--
+-- /See:/ 'application' smart constructor.
+data Application = Application'
+    { _aEnabled          :: !(Maybe Bool)
+    , _aLaunchPath       :: !(Maybe Text)
+    , _aLaunchParameters :: !(Maybe Text)
+    , _aName             :: !(Maybe Text)
+    , _aDisplayName      :: !(Maybe Text)
+    , _aMetadata         :: !(Maybe (Map Text Text))
+    , _aIconURL          :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Application' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'aEnabled' - An application can be disabled after image creation if there is a problem.
+--
+-- * 'aLaunchPath' - The path to the application executable in the instance.
+--
+-- * 'aLaunchParameters' - A list of arguments that are passed to the application at launch.
+--
+-- * 'aName' - The unique identifier for the application.
+--
+-- * 'aDisplayName' - The name of the application shown to the end users.
+--
+-- * 'aMetadata' - Additional attributes that describes the application.
+--
+-- * 'aIconURL' - The URL for the application icon. This URL may be time-limited.
+application
+    :: Application
+application =
+    Application'
+    { _aEnabled = Nothing
+    , _aLaunchPath = Nothing
+    , _aLaunchParameters = Nothing
+    , _aName = Nothing
+    , _aDisplayName = Nothing
+    , _aMetadata = Nothing
+    , _aIconURL = Nothing
+    }
+
+-- | An application can be disabled after image creation if there is a problem.
+aEnabled :: Lens' Application (Maybe Bool)
+aEnabled = lens _aEnabled (\ s a -> s{_aEnabled = a});
+
+-- | The path to the application executable in the instance.
+aLaunchPath :: Lens' Application (Maybe Text)
+aLaunchPath = lens _aLaunchPath (\ s a -> s{_aLaunchPath = a});
+
+-- | A list of arguments that are passed to the application at launch.
+aLaunchParameters :: Lens' Application (Maybe Text)
+aLaunchParameters = lens _aLaunchParameters (\ s a -> s{_aLaunchParameters = a});
+
+-- | The unique identifier for the application.
+aName :: Lens' Application (Maybe Text)
+aName = lens _aName (\ s a -> s{_aName = a});
+
+-- | The name of the application shown to the end users.
+aDisplayName :: Lens' Application (Maybe Text)
+aDisplayName = lens _aDisplayName (\ s a -> s{_aDisplayName = a});
+
+-- | Additional attributes that describes the application.
+aMetadata :: Lens' Application (HashMap Text Text)
+aMetadata = lens _aMetadata (\ s a -> s{_aMetadata = a}) . _Default . _Map;
+
+-- | The URL for the application icon. This URL may be time-limited.
+aIconURL :: Lens' Application (Maybe Text)
+aIconURL = lens _aIconURL (\ s a -> s{_aIconURL = a});
+
+instance FromJSON Application where
+        parseJSON
+          = withObject "Application"
+              (\ x ->
+                 Application' <$>
+                   (x .:? "Enabled") <*> (x .:? "LaunchPath") <*>
+                     (x .:? "LaunchParameters")
+                     <*> (x .:? "Name")
+                     <*> (x .:? "DisplayName")
+                     <*> (x .:? "Metadata" .!= mempty)
+                     <*> (x .:? "IconURL"))
+
+instance Hashable Application
+
+instance NFData Application
+
+-- | The capacity configuration for the fleet.
+--
+--
+--
+-- /See:/ 'computeCapacity' smart constructor.
+newtype ComputeCapacity = ComputeCapacity'
+    { _ccDesiredInstances :: Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ComputeCapacity' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ccDesiredInstances' - The desired number of streaming instances.
+computeCapacity
+    :: Int -- ^ 'ccDesiredInstances'
+    -> ComputeCapacity
+computeCapacity pDesiredInstances_ =
+    ComputeCapacity'
+    { _ccDesiredInstances = pDesiredInstances_
+    }
+
+-- | The desired number of streaming instances.
+ccDesiredInstances :: Lens' ComputeCapacity Int
+ccDesiredInstances = lens _ccDesiredInstances (\ s a -> s{_ccDesiredInstances = a});
+
+instance Hashable ComputeCapacity
+
+instance NFData ComputeCapacity
+
+instance ToJSON ComputeCapacity where
+        toJSON ComputeCapacity'{..}
+          = object
+              (catMaybes
+                 [Just ("DesiredInstances" .= _ccDesiredInstances)])
+
+-- | The capacity information for the fleet.
+--
+--
+--
+-- /See:/ 'computeCapacityStatus' smart constructor.
+data ComputeCapacityStatus = ComputeCapacityStatus'
+    { _ccsInUse     :: !(Maybe Int)
+    , _ccsRunning   :: !(Maybe Int)
+    , _ccsAvailable :: !(Maybe Int)
+    , _ccsDesired   :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ComputeCapacityStatus' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ccsInUse' - The number of instances that are being used for streaming.
+--
+-- * 'ccsRunning' - The total number of simultaneous streaming instances that are running.
+--
+-- * 'ccsAvailable' - The number of currently available instances that can be used to stream sessions.
+--
+-- * 'ccsDesired' - The desired number of streaming instances.
+computeCapacityStatus
+    :: Int -- ^ 'ccsDesired'
+    -> ComputeCapacityStatus
+computeCapacityStatus pDesired_ =
+    ComputeCapacityStatus'
+    { _ccsInUse = Nothing
+    , _ccsRunning = Nothing
+    , _ccsAvailable = Nothing
+    , _ccsDesired = pDesired_
+    }
+
+-- | The number of instances that are being used for streaming.
+ccsInUse :: Lens' ComputeCapacityStatus (Maybe Int)
+ccsInUse = lens _ccsInUse (\ s a -> s{_ccsInUse = a});
+
+-- | The total number of simultaneous streaming instances that are running.
+ccsRunning :: Lens' ComputeCapacityStatus (Maybe Int)
+ccsRunning = lens _ccsRunning (\ s a -> s{_ccsRunning = a});
+
+-- | The number of currently available instances that can be used to stream sessions.
+ccsAvailable :: Lens' ComputeCapacityStatus (Maybe Int)
+ccsAvailable = lens _ccsAvailable (\ s a -> s{_ccsAvailable = a});
+
+-- | The desired number of streaming instances.
+ccsDesired :: Lens' ComputeCapacityStatus Int
+ccsDesired = lens _ccsDesired (\ s a -> s{_ccsDesired = a});
+
+instance FromJSON ComputeCapacityStatus where
+        parseJSON
+          = withObject "ComputeCapacityStatus"
+              (\ x ->
+                 ComputeCapacityStatus' <$>
+                   (x .:? "InUse") <*> (x .:? "Running") <*>
+                     (x .:? "Available")
+                     <*> (x .: "Desired"))
+
+instance Hashable ComputeCapacityStatus
+
+instance NFData ComputeCapacityStatus
+
+-- | Contains the parameters for a fleet.
+--
+--
+--
+-- /See:/ 'fleet' smart constructor.
+data Fleet = Fleet'
+    { _fDisconnectTimeoutInSeconds :: !(Maybe Int)
+    , _fMaxUserDurationInSeconds   :: !(Maybe Int)
+    , _fCreatedTime                :: !(Maybe POSIX)
+    , _fVPCConfig                  :: !(Maybe VPCConfig)
+    , _fFleetErrors                :: !(Maybe [FleetError])
+    , _fDisplayName                :: !(Maybe Text)
+    , _fDescription                :: !(Maybe Text)
+    , _fARN                        :: !Text
+    , _fName                       :: !Text
+    , _fImageName                  :: !Text
+    , _fInstanceType               :: !Text
+    , _fComputeCapacityStatus      :: !ComputeCapacityStatus
+    , _fState                      :: !FleetState
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Fleet' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'fDisconnectTimeoutInSeconds' - The time after disconnection when a session is considered to have ended. When a user reconnects after a disconnection, the user is connected to the same session and instance within this time interval.
+--
+-- * 'fMaxUserDurationInSeconds' - The maximum time during which a streaming session can run.
+--
+-- * 'fCreatedTime' - The time at which the fleet was created.
+--
+-- * 'fVPCConfig' - The VPC configuration for the fleet.
+--
+-- * 'fFleetErrors' - The list of fleet errors is appended to this list.
+--
+-- * 'fDisplayName' - The name displayed to end users on the AppStream 2.0 portal.
+--
+-- * 'fDescription' - The description displayed to end users on the AppStream 2.0 portal.
+--
+-- * 'fARN' - The ARN for the fleet.
+--
+-- * 'fName' - The name of the fleet.
+--
+-- * 'fImageName' - The image used by the fleet.
+--
+-- * 'fInstanceType' - The instance type of compute resources for the fleet. The fleet instances are launched from this instance type.
+--
+-- * 'fComputeCapacityStatus' - The capacity information for the fleet.
+--
+-- * 'fState' - The current state for the fleet.
+fleet
+    :: Text -- ^ 'fARN'
+    -> Text -- ^ 'fName'
+    -> Text -- ^ 'fImageName'
+    -> Text -- ^ 'fInstanceType'
+    -> ComputeCapacityStatus -- ^ 'fComputeCapacityStatus'
+    -> FleetState -- ^ 'fState'
+    -> Fleet
+fleet pARN_ pName_ pImageName_ pInstanceType_ pComputeCapacityStatus_ pState_ =
+    Fleet'
+    { _fDisconnectTimeoutInSeconds = Nothing
+    , _fMaxUserDurationInSeconds = Nothing
+    , _fCreatedTime = Nothing
+    , _fVPCConfig = Nothing
+    , _fFleetErrors = Nothing
+    , _fDisplayName = Nothing
+    , _fDescription = Nothing
+    , _fARN = pARN_
+    , _fName = pName_
+    , _fImageName = pImageName_
+    , _fInstanceType = pInstanceType_
+    , _fComputeCapacityStatus = pComputeCapacityStatus_
+    , _fState = pState_
+    }
+
+-- | The time after disconnection when a session is considered to have ended. When a user reconnects after a disconnection, the user is connected to the same session and instance within this time interval.
+fDisconnectTimeoutInSeconds :: Lens' Fleet (Maybe Int)
+fDisconnectTimeoutInSeconds = lens _fDisconnectTimeoutInSeconds (\ s a -> s{_fDisconnectTimeoutInSeconds = a});
+
+-- | The maximum time during which a streaming session can run.
+fMaxUserDurationInSeconds :: Lens' Fleet (Maybe Int)
+fMaxUserDurationInSeconds = lens _fMaxUserDurationInSeconds (\ s a -> s{_fMaxUserDurationInSeconds = a});
+
+-- | The time at which the fleet was created.
+fCreatedTime :: Lens' Fleet (Maybe UTCTime)
+fCreatedTime = lens _fCreatedTime (\ s a -> s{_fCreatedTime = a}) . mapping _Time;
+
+-- | The VPC configuration for the fleet.
+fVPCConfig :: Lens' Fleet (Maybe VPCConfig)
+fVPCConfig = lens _fVPCConfig (\ s a -> s{_fVPCConfig = a});
+
+-- | The list of fleet errors is appended to this list.
+fFleetErrors :: Lens' Fleet [FleetError]
+fFleetErrors = lens _fFleetErrors (\ s a -> s{_fFleetErrors = a}) . _Default . _Coerce;
+
+-- | The name displayed to end users on the AppStream 2.0 portal.
+fDisplayName :: Lens' Fleet (Maybe Text)
+fDisplayName = lens _fDisplayName (\ s a -> s{_fDisplayName = a});
+
+-- | The description displayed to end users on the AppStream 2.0 portal.
+fDescription :: Lens' Fleet (Maybe Text)
+fDescription = lens _fDescription (\ s a -> s{_fDescription = a});
+
+-- | The ARN for the fleet.
+fARN :: Lens' Fleet Text
+fARN = lens _fARN (\ s a -> s{_fARN = a});
+
+-- | The name of the fleet.
+fName :: Lens' Fleet Text
+fName = lens _fName (\ s a -> s{_fName = a});
+
+-- | The image used by the fleet.
+fImageName :: Lens' Fleet Text
+fImageName = lens _fImageName (\ s a -> s{_fImageName = a});
+
+-- | The instance type of compute resources for the fleet. The fleet instances are launched from this instance type.
+fInstanceType :: Lens' Fleet Text
+fInstanceType = lens _fInstanceType (\ s a -> s{_fInstanceType = a});
+
+-- | The capacity information for the fleet.
+fComputeCapacityStatus :: Lens' Fleet ComputeCapacityStatus
+fComputeCapacityStatus = lens _fComputeCapacityStatus (\ s a -> s{_fComputeCapacityStatus = a});
+
+-- | The current state for the fleet.
+fState :: Lens' Fleet FleetState
+fState = lens _fState (\ s a -> s{_fState = a});
+
+instance FromJSON Fleet where
+        parseJSON
+          = withObject "Fleet"
+              (\ x ->
+                 Fleet' <$>
+                   (x .:? "DisconnectTimeoutInSeconds") <*>
+                     (x .:? "MaxUserDurationInSeconds")
+                     <*> (x .:? "CreatedTime")
+                     <*> (x .:? "VpcConfig")
+                     <*> (x .:? "FleetErrors" .!= mempty)
+                     <*> (x .:? "DisplayName")
+                     <*> (x .:? "Description")
+                     <*> (x .: "Arn")
+                     <*> (x .: "Name")
+                     <*> (x .: "ImageName")
+                     <*> (x .: "InstanceType")
+                     <*> (x .: "ComputeCapacityStatus")
+                     <*> (x .: "State"))
+
+instance Hashable Fleet
+
+instance NFData Fleet
+
+-- | The details of the fleet error.
+--
+--
+--
+-- /See:/ 'fleetError' smart constructor.
+data FleetError = FleetError'
+    { _feErrorCode    :: !(Maybe FleetErrorCode)
+    , _feErrorMessage :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'FleetError' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'feErrorCode' - The error code for the fleet error.
+--
+-- * 'feErrorMessage' - The error message generated when the fleet has errors.
+fleetError
+    :: FleetError
+fleetError =
+    FleetError'
+    { _feErrorCode = Nothing
+    , _feErrorMessage = Nothing
+    }
+
+-- | The error code for the fleet error.
+feErrorCode :: Lens' FleetError (Maybe FleetErrorCode)
+feErrorCode = lens _feErrorCode (\ s a -> s{_feErrorCode = a});
+
+-- | The error message generated when the fleet has errors.
+feErrorMessage :: Lens' FleetError (Maybe Text)
+feErrorMessage = lens _feErrorMessage (\ s a -> s{_feErrorMessage = a});
+
+instance FromJSON FleetError where
+        parseJSON
+          = withObject "FleetError"
+              (\ x ->
+                 FleetError' <$>
+                   (x .:? "ErrorCode") <*> (x .:? "ErrorMessage"))
+
+instance Hashable FleetError
+
+instance NFData FleetError
+
+-- | New streaming instances are booted from images. The image stores the application catalog and is connected to fleets.
+--
+--
+--
+-- /See:/ 'image' smart constructor.
+data Image = Image'
+    { _iState             :: !(Maybe ImageState)
+    , _iPlatform          :: !(Maybe PlatformType)
+    , _iStateChangeReason :: !(Maybe ImageStateChangeReason)
+    , _iARN               :: !(Maybe Text)
+    , _iCreatedTime       :: !(Maybe POSIX)
+    , _iVisibility        :: !(Maybe VisibilityType)
+    , _iBaseImageARN      :: !(Maybe Text)
+    , _iDisplayName       :: !(Maybe Text)
+    , _iDescription       :: !(Maybe Text)
+    , _iApplications      :: !(Maybe [Application])
+    , _iName              :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Image' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'iState' - The image starts in the __PENDING__ state, and then moves to __AVAILABLE__ if image creation succeeds and __FAILED__ if image creation has failed.
+--
+-- * 'iPlatform' - The operating system platform of the image.
+--
+-- * 'iStateChangeReason' - The reason why the last state change occurred.
+--
+-- * 'iARN' - The ARN for the image.
+--
+-- * 'iCreatedTime' - The timestamp when the image was created.
+--
+-- * 'iVisibility' - The visibility of an image to the user; images can be public or private.
+--
+-- * 'iBaseImageARN' - The source image ARN from which this image was created.
+--
+-- * 'iDisplayName' - The display name for the image.
+--
+-- * 'iDescription' - A meaningful description for the image.
+--
+-- * 'iApplications' - The applications associated with an image.
+--
+-- * 'iName' - The unique identifier for the image.
+image
+    :: Text -- ^ 'iName'
+    -> Image
+image pName_ =
+    Image'
+    { _iState = Nothing
+    , _iPlatform = Nothing
+    , _iStateChangeReason = Nothing
+    , _iARN = Nothing
+    , _iCreatedTime = Nothing
+    , _iVisibility = Nothing
+    , _iBaseImageARN = Nothing
+    , _iDisplayName = Nothing
+    , _iDescription = Nothing
+    , _iApplications = Nothing
+    , _iName = pName_
+    }
+
+-- | The image starts in the __PENDING__ state, and then moves to __AVAILABLE__ if image creation succeeds and __FAILED__ if image creation has failed.
+iState :: Lens' Image (Maybe ImageState)
+iState = lens _iState (\ s a -> s{_iState = a});
+
+-- | The operating system platform of the image.
+iPlatform :: Lens' Image (Maybe PlatformType)
+iPlatform = lens _iPlatform (\ s a -> s{_iPlatform = a});
+
+-- | The reason why the last state change occurred.
+iStateChangeReason :: Lens' Image (Maybe ImageStateChangeReason)
+iStateChangeReason = lens _iStateChangeReason (\ s a -> s{_iStateChangeReason = a});
+
+-- | The ARN for the image.
+iARN :: Lens' Image (Maybe Text)
+iARN = lens _iARN (\ s a -> s{_iARN = a});
+
+-- | The timestamp when the image was created.
+iCreatedTime :: Lens' Image (Maybe UTCTime)
+iCreatedTime = lens _iCreatedTime (\ s a -> s{_iCreatedTime = a}) . mapping _Time;
+
+-- | The visibility of an image to the user; images can be public or private.
+iVisibility :: Lens' Image (Maybe VisibilityType)
+iVisibility = lens _iVisibility (\ s a -> s{_iVisibility = a});
+
+-- | The source image ARN from which this image was created.
+iBaseImageARN :: Lens' Image (Maybe Text)
+iBaseImageARN = lens _iBaseImageARN (\ s a -> s{_iBaseImageARN = a});
+
+-- | The display name for the image.
+iDisplayName :: Lens' Image (Maybe Text)
+iDisplayName = lens _iDisplayName (\ s a -> s{_iDisplayName = a});
+
+-- | A meaningful description for the image.
+iDescription :: Lens' Image (Maybe Text)
+iDescription = lens _iDescription (\ s a -> s{_iDescription = a});
+
+-- | The applications associated with an image.
+iApplications :: Lens' Image [Application]
+iApplications = lens _iApplications (\ s a -> s{_iApplications = a}) . _Default . _Coerce;
+
+-- | The unique identifier for the image.
+iName :: Lens' Image Text
+iName = lens _iName (\ s a -> s{_iName = a});
+
+instance FromJSON Image where
+        parseJSON
+          = withObject "Image"
+              (\ x ->
+                 Image' <$>
+                   (x .:? "State") <*> (x .:? "Platform") <*>
+                     (x .:? "StateChangeReason")
+                     <*> (x .:? "Arn")
+                     <*> (x .:? "CreatedTime")
+                     <*> (x .:? "Visibility")
+                     <*> (x .:? "BaseImageArn")
+                     <*> (x .:? "DisplayName")
+                     <*> (x .:? "Description")
+                     <*> (x .:? "Applications" .!= mempty)
+                     <*> (x .: "Name"))
+
+instance Hashable Image
+
+instance NFData Image
+
+-- | The reason why the last state change occurred.
+--
+--
+--
+-- /See:/ 'imageStateChangeReason' smart constructor.
+data ImageStateChangeReason = ImageStateChangeReason'
+    { _iscrCode    :: !(Maybe ImageStateChangeReasonCode)
+    , _iscrMessage :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ImageStateChangeReason' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'iscrCode' - The state change reason code of the image.
+--
+-- * 'iscrMessage' - The state change reason message to the end user.
+imageStateChangeReason
+    :: ImageStateChangeReason
+imageStateChangeReason =
+    ImageStateChangeReason'
+    { _iscrCode = Nothing
+    , _iscrMessage = Nothing
+    }
+
+-- | The state change reason code of the image.
+iscrCode :: Lens' ImageStateChangeReason (Maybe ImageStateChangeReasonCode)
+iscrCode = lens _iscrCode (\ s a -> s{_iscrCode = a});
+
+-- | The state change reason message to the end user.
+iscrMessage :: Lens' ImageStateChangeReason (Maybe Text)
+iscrMessage = lens _iscrMessage (\ s a -> s{_iscrMessage = a});
+
+instance FromJSON ImageStateChangeReason where
+        parseJSON
+          = withObject "ImageStateChangeReason"
+              (\ x ->
+                 ImageStateChangeReason' <$>
+                   (x .:? "Code") <*> (x .:? "Message"))
+
+instance Hashable ImageStateChangeReason
+
+instance NFData ImageStateChangeReason
+
+-- | Contains the parameters for a streaming session.
+--
+--
+--
+-- /See:/ 'session' smart constructor.
+data Session = Session'
+    { _sId        :: !Text
+    , _sUserId    :: !Text
+    , _sStackName :: !Text
+    , _sFleetName :: !Text
+    , _sState     :: !SessionState
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Session' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sId' - The unique ID for a streaming session.
+--
+-- * 'sUserId' - The identifier of the user for whom the session was created.
+--
+-- * 'sStackName' - The name of the stack for which the streaming session was created.
+--
+-- * 'sFleetName' - The name of the fleet for which the streaming session was created.
+--
+-- * 'sState' - The current state of the streaming session.
+session
+    :: Text -- ^ 'sId'
+    -> Text -- ^ 'sUserId'
+    -> Text -- ^ 'sStackName'
+    -> Text -- ^ 'sFleetName'
+    -> SessionState -- ^ 'sState'
+    -> Session
+session pId_ pUserId_ pStackName_ pFleetName_ pState_ =
+    Session'
+    { _sId = pId_
+    , _sUserId = pUserId_
+    , _sStackName = pStackName_
+    , _sFleetName = pFleetName_
+    , _sState = pState_
+    }
+
+-- | The unique ID for a streaming session.
+sId :: Lens' Session Text
+sId = lens _sId (\ s a -> s{_sId = a});
+
+-- | The identifier of the user for whom the session was created.
+sUserId :: Lens' Session Text
+sUserId = lens _sUserId (\ s a -> s{_sUserId = a});
+
+-- | The name of the stack for which the streaming session was created.
+sStackName :: Lens' Session Text
+sStackName = lens _sStackName (\ s a -> s{_sStackName = a});
+
+-- | The name of the fleet for which the streaming session was created.
+sFleetName :: Lens' Session Text
+sFleetName = lens _sFleetName (\ s a -> s{_sFleetName = a});
+
+-- | The current state of the streaming session.
+sState :: Lens' Session SessionState
+sState = lens _sState (\ s a -> s{_sState = a});
+
+instance FromJSON Session where
+        parseJSON
+          = withObject "Session"
+              (\ x ->
+                 Session' <$>
+                   (x .: "Id") <*> (x .: "UserId") <*>
+                     (x .: "StackName")
+                     <*> (x .: "FleetName")
+                     <*> (x .: "State"))
+
+instance Hashable Session
+
+instance NFData Session
+
+-- | Details about a stack.
+--
+--
+--
+-- /See:/ 'stack' smart constructor.
+data Stack = Stack'
+    { _sARN         :: !(Maybe Text)
+    , _sCreatedTime :: !(Maybe POSIX)
+    , _sDisplayName :: !(Maybe Text)
+    , _sDescription :: !(Maybe Text)
+    , _sName        :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Stack' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sARN' - The ARN of the stack.
+--
+-- * 'sCreatedTime' - The timestamp when the stack was created.
+--
+-- * 'sDisplayName' - A display name for the stack.
+--
+-- * 'sDescription' - A meaningful description for the stack.
+--
+-- * 'sName' - The unique identifier of the stack.
+stack
+    :: Text -- ^ 'sName'
+    -> Stack
+stack pName_ =
+    Stack'
+    { _sARN = Nothing
+    , _sCreatedTime = Nothing
+    , _sDisplayName = Nothing
+    , _sDescription = Nothing
+    , _sName = pName_
+    }
+
+-- | The ARN of the stack.
+sARN :: Lens' Stack (Maybe Text)
+sARN = lens _sARN (\ s a -> s{_sARN = a});
+
+-- | The timestamp when the stack was created.
+sCreatedTime :: Lens' Stack (Maybe UTCTime)
+sCreatedTime = lens _sCreatedTime (\ s a -> s{_sCreatedTime = a}) . mapping _Time;
+
+-- | A display name for the stack.
+sDisplayName :: Lens' Stack (Maybe Text)
+sDisplayName = lens _sDisplayName (\ s a -> s{_sDisplayName = a});
+
+-- | A meaningful description for the stack.
+sDescription :: Lens' Stack (Maybe Text)
+sDescription = lens _sDescription (\ s a -> s{_sDescription = a});
+
+-- | The unique identifier of the stack.
+sName :: Lens' Stack Text
+sName = lens _sName (\ s a -> s{_sName = a});
+
+instance FromJSON Stack where
+        parseJSON
+          = withObject "Stack"
+              (\ x ->
+                 Stack' <$>
+                   (x .:? "Arn") <*> (x .:? "CreatedTime") <*>
+                     (x .:? "DisplayName")
+                     <*> (x .:? "Description")
+                     <*> (x .: "Name"))
+
+instance Hashable Stack
+
+instance NFData Stack
+
+-- | The VPC in which the fleet is launched.
+--
+--
+--
+-- /See:/ 'vpcConfig' smart constructor.
+newtype VPCConfig = VPCConfig'
+    { _vcSubnetIds :: List1 Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'VPCConfig' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'vcSubnetIds' - The list of subnets to which a network interface is established from the fleet instance.
+vpcConfig
+    :: NonEmpty Text -- ^ 'vcSubnetIds'
+    -> VPCConfig
+vpcConfig pSubnetIds_ =
+    VPCConfig'
+    { _vcSubnetIds = _List1 # pSubnetIds_
+    }
+
+-- | The list of subnets to which a network interface is established from the fleet instance.
+vcSubnetIds :: Lens' VPCConfig (NonEmpty Text)
+vcSubnetIds = lens _vcSubnetIds (\ s a -> s{_vcSubnetIds = a}) . _List1;
+
+instance FromJSON VPCConfig where
+        parseJSON
+          = withObject "VPCConfig"
+              (\ x -> VPCConfig' <$> (x .: "SubnetIds"))
+
+instance Hashable VPCConfig
+
+instance NFData VPCConfig
+
+instance ToJSON VPCConfig where
+        toJSON VPCConfig'{..}
+          = object
+              (catMaybes [Just ("SubnetIds" .= _vcSubnetIds)])
diff --git a/gen/Network/AWS/AppStream/Types/Sum.hs b/gen/Network/AWS/AppStream/Types/Sum.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AppStream/Types/Sum.hs
@@ -0,0 +1,244 @@
+{-# 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.AppStream.Types.Sum
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+module Network.AWS.AppStream.Types.Sum where
+
+import           Network.AWS.Prelude
+
+data FleetErrorCode
+    = IAMServiceRoleIsMissing
+    | IAMServiceRoleMissingDescribeSubnetAction
+    | IAMServiceRoleMissingEniCreateAction
+    | IAMServiceRoleMissingEniDeleteAction
+    | IAMServiceRoleMissingEniDescribeAction
+    | ImageNotFound
+    | InternalServiceError
+    | InvalidSubnetConfiguration
+    | NetworkInterfaceLimitExceeded
+    | SubnetHasInsufficientIPAddresses
+    | SubnetNotFound
+    deriving (Eq,Ord,Read,Show,Enum,Bounded,Data,Typeable,Generic)
+
+instance FromText FleetErrorCode where
+    parser = takeLowerText >>= \case
+        "iam_service_role_is_missing" -> pure IAMServiceRoleIsMissing
+        "iam_service_role_missing_describe_subnet_action" -> pure IAMServiceRoleMissingDescribeSubnetAction
+        "iam_service_role_missing_eni_create_action" -> pure IAMServiceRoleMissingEniCreateAction
+        "iam_service_role_missing_eni_delete_action" -> pure IAMServiceRoleMissingEniDeleteAction
+        "iam_service_role_missing_eni_describe_action" -> pure IAMServiceRoleMissingEniDescribeAction
+        "image_not_found" -> pure ImageNotFound
+        "internal_service_error" -> pure InternalServiceError
+        "invalid_subnet_configuration" -> pure InvalidSubnetConfiguration
+        "network_interface_limit_exceeded" -> pure NetworkInterfaceLimitExceeded
+        "subnet_has_insufficient_ip_addresses" -> pure SubnetHasInsufficientIPAddresses
+        "subnet_not_found" -> pure SubnetNotFound
+        e -> fromTextError $ "Failure parsing FleetErrorCode from value: '" <> e
+           <> "'. Accepted values: iam_service_role_is_missing, iam_service_role_missing_describe_subnet_action, iam_service_role_missing_eni_create_action, iam_service_role_missing_eni_delete_action, iam_service_role_missing_eni_describe_action, image_not_found, internal_service_error, invalid_subnet_configuration, network_interface_limit_exceeded, subnet_has_insufficient_ip_addresses, subnet_not_found"
+
+instance ToText FleetErrorCode where
+    toText = \case
+        IAMServiceRoleIsMissing -> "IAM_SERVICE_ROLE_IS_MISSING"
+        IAMServiceRoleMissingDescribeSubnetAction -> "IAM_SERVICE_ROLE_MISSING_DESCRIBE_SUBNET_ACTION"
+        IAMServiceRoleMissingEniCreateAction -> "IAM_SERVICE_ROLE_MISSING_ENI_CREATE_ACTION"
+        IAMServiceRoleMissingEniDeleteAction -> "IAM_SERVICE_ROLE_MISSING_ENI_DELETE_ACTION"
+        IAMServiceRoleMissingEniDescribeAction -> "IAM_SERVICE_ROLE_MISSING_ENI_DESCRIBE_ACTION"
+        ImageNotFound -> "IMAGE_NOT_FOUND"
+        InternalServiceError -> "INTERNAL_SERVICE_ERROR"
+        InvalidSubnetConfiguration -> "INVALID_SUBNET_CONFIGURATION"
+        NetworkInterfaceLimitExceeded -> "NETWORK_INTERFACE_LIMIT_EXCEEDED"
+        SubnetHasInsufficientIPAddresses -> "SUBNET_HAS_INSUFFICIENT_IP_ADDRESSES"
+        SubnetNotFound -> "SUBNET_NOT_FOUND"
+
+instance Hashable     FleetErrorCode
+instance NFData       FleetErrorCode
+instance ToByteString FleetErrorCode
+instance ToQuery      FleetErrorCode
+instance ToHeader     FleetErrorCode
+
+instance FromJSON FleetErrorCode where
+    parseJSON = parseJSONText "FleetErrorCode"
+
+data FleetState
+    = Running
+    | Starting
+    | Stopped
+    | Stopping
+    deriving (Eq,Ord,Read,Show,Enum,Bounded,Data,Typeable,Generic)
+
+instance FromText FleetState where
+    parser = takeLowerText >>= \case
+        "running" -> pure Running
+        "starting" -> pure Starting
+        "stopped" -> pure Stopped
+        "stopping" -> pure Stopping
+        e -> fromTextError $ "Failure parsing FleetState from value: '" <> e
+           <> "'. Accepted values: running, starting, stopped, stopping"
+
+instance ToText FleetState where
+    toText = \case
+        Running -> "RUNNING"
+        Starting -> "STARTING"
+        Stopped -> "STOPPED"
+        Stopping -> "STOPPING"
+
+instance Hashable     FleetState
+instance NFData       FleetState
+instance ToByteString FleetState
+instance ToQuery      FleetState
+instance ToHeader     FleetState
+
+instance FromJSON FleetState where
+    parseJSON = parseJSONText "FleetState"
+
+data ImageState
+    = ISAvailable
+    | ISDeleting
+    | ISFailed
+    | ISPending
+    deriving (Eq,Ord,Read,Show,Enum,Bounded,Data,Typeable,Generic)
+
+instance FromText ImageState where
+    parser = takeLowerText >>= \case
+        "available" -> pure ISAvailable
+        "deleting" -> pure ISDeleting
+        "failed" -> pure ISFailed
+        "pending" -> pure ISPending
+        e -> fromTextError $ "Failure parsing ImageState from value: '" <> e
+           <> "'. Accepted values: available, deleting, failed, pending"
+
+instance ToText ImageState where
+    toText = \case
+        ISAvailable -> "AVAILABLE"
+        ISDeleting -> "DELETING"
+        ISFailed -> "FAILED"
+        ISPending -> "PENDING"
+
+instance Hashable     ImageState
+instance NFData       ImageState
+instance ToByteString ImageState
+instance ToQuery      ImageState
+instance ToHeader     ImageState
+
+instance FromJSON ImageState where
+    parseJSON = parseJSONText "ImageState"
+
+data ImageStateChangeReasonCode
+    = ImageBuilderNotAvailable
+    | InternalError
+    deriving (Eq,Ord,Read,Show,Enum,Bounded,Data,Typeable,Generic)
+
+instance FromText ImageStateChangeReasonCode where
+    parser = takeLowerText >>= \case
+        "image_builder_not_available" -> pure ImageBuilderNotAvailable
+        "internal_error" -> pure InternalError
+        e -> fromTextError $ "Failure parsing ImageStateChangeReasonCode from value: '" <> e
+           <> "'. Accepted values: image_builder_not_available, internal_error"
+
+instance ToText ImageStateChangeReasonCode where
+    toText = \case
+        ImageBuilderNotAvailable -> "IMAGE_BUILDER_NOT_AVAILABLE"
+        InternalError -> "INTERNAL_ERROR"
+
+instance Hashable     ImageStateChangeReasonCode
+instance NFData       ImageStateChangeReasonCode
+instance ToByteString ImageStateChangeReasonCode
+instance ToQuery      ImageStateChangeReasonCode
+instance ToHeader     ImageStateChangeReasonCode
+
+instance FromJSON ImageStateChangeReasonCode where
+    parseJSON = parseJSONText "ImageStateChangeReasonCode"
+
+data PlatformType =
+    Windows
+    deriving (Eq,Ord,Read,Show,Enum,Bounded,Data,Typeable,Generic)
+
+instance FromText PlatformType where
+    parser = takeLowerText >>= \case
+        "windows" -> pure Windows
+        e -> fromTextError $ "Failure parsing PlatformType from value: '" <> e
+           <> "'. Accepted values: windows"
+
+instance ToText PlatformType where
+    toText = \case
+        Windows -> "WINDOWS"
+
+instance Hashable     PlatformType
+instance NFData       PlatformType
+instance ToByteString PlatformType
+instance ToQuery      PlatformType
+instance ToHeader     PlatformType
+
+instance FromJSON PlatformType where
+    parseJSON = parseJSONText "PlatformType"
+
+-- | Possible values for the state of a streaming session.
+--
+--
+data SessionState
+    = Active
+    | Expired
+    | Pending
+    deriving (Eq,Ord,Read,Show,Enum,Bounded,Data,Typeable,Generic)
+
+instance FromText SessionState where
+    parser = takeLowerText >>= \case
+        "active" -> pure Active
+        "expired" -> pure Expired
+        "pending" -> pure Pending
+        e -> fromTextError $ "Failure parsing SessionState from value: '" <> e
+           <> "'. Accepted values: active, expired, pending"
+
+instance ToText SessionState where
+    toText = \case
+        Active -> "ACTIVE"
+        Expired -> "EXPIRED"
+        Pending -> "PENDING"
+
+instance Hashable     SessionState
+instance NFData       SessionState
+instance ToByteString SessionState
+instance ToQuery      SessionState
+instance ToHeader     SessionState
+
+instance FromJSON SessionState where
+    parseJSON = parseJSONText "SessionState"
+
+data VisibilityType
+    = Private
+    | Public
+    deriving (Eq,Ord,Read,Show,Enum,Bounded,Data,Typeable,Generic)
+
+instance FromText VisibilityType where
+    parser = takeLowerText >>= \case
+        "private" -> pure Private
+        "public" -> pure Public
+        e -> fromTextError $ "Failure parsing VisibilityType from value: '" <> e
+           <> "'. Accepted values: private, public"
+
+instance ToText VisibilityType where
+    toText = \case
+        Private -> "PRIVATE"
+        Public -> "PUBLIC"
+
+instance Hashable     VisibilityType
+instance NFData       VisibilityType
+instance ToByteString VisibilityType
+instance ToQuery      VisibilityType
+instance ToHeader     VisibilityType
+
+instance FromJSON VisibilityType where
+    parseJSON = parseJSONText "VisibilityType"
diff --git a/gen/Network/AWS/AppStream/UpdateFleet.hs b/gen/Network/AWS/AppStream/UpdateFleet.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AppStream/UpdateFleet.hs
@@ -0,0 +1,226 @@
+{-# 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.AppStream.UpdateFleet
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates an existing fleet. All the attributes except the fleet name can be updated in the __STOPPED__ state. Only __ComputeCapacity__ and __ImageName__ can be updated in any other state.
+--
+--
+module Network.AWS.AppStream.UpdateFleet
+    (
+    -- * Creating a Request
+      updateFleet
+    , UpdateFleet
+    -- * Request Lenses
+    , ufDisconnectTimeoutInSeconds
+    , ufMaxUserDurationInSeconds
+    , ufDeleteVPCConfig
+    , ufInstanceType
+    , ufVPCConfig
+    , ufDisplayName
+    , ufImageName
+    , ufDescription
+    , ufComputeCapacity
+    , ufName
+
+    -- * Destructuring the Response
+    , updateFleetResponse
+    , UpdateFleetResponse
+    -- * Response Lenses
+    , ufrsFleet
+    , ufrsResponseStatus
+    ) where
+
+import           Network.AWS.AppStream.Types
+import           Network.AWS.AppStream.Types.Product
+import           Network.AWS.Lens
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'updateFleet' smart constructor.
+data UpdateFleet = UpdateFleet'
+    { _ufDisconnectTimeoutInSeconds :: !(Maybe Int)
+    , _ufMaxUserDurationInSeconds   :: !(Maybe Int)
+    , _ufDeleteVPCConfig            :: !(Maybe Bool)
+    , _ufInstanceType               :: !(Maybe Text)
+    , _ufVPCConfig                  :: !(Maybe VPCConfig)
+    , _ufDisplayName                :: !(Maybe Text)
+    , _ufImageName                  :: !(Maybe Text)
+    , _ufDescription                :: !(Maybe Text)
+    , _ufComputeCapacity            :: !(Maybe ComputeCapacity)
+    , _ufName                       :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'UpdateFleet' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ufDisconnectTimeoutInSeconds' - The time after disconnection when a session is considered to have ended. When the user reconnects after a disconnection, the user is connected to the same instance within this time interval.
+--
+-- * 'ufMaxUserDurationInSeconds' - The maximum time during which a streaming session can run.
+--
+-- * 'ufDeleteVPCConfig' - Delete the VPC association for the specified fleet.
+--
+-- * 'ufInstanceType' - The instance type of compute resources for the fleet. Fleet instances are launched from this instance type.
+--
+-- * 'ufVPCConfig' - The VPC configuration for the fleet.
+--
+-- * 'ufDisplayName' - The name displayed to end users on the AppStream 2.0 portal.
+--
+-- * 'ufImageName' - The image name from which a fleet is created.
+--
+-- * 'ufDescription' - The description displayed to end users on the AppStream 2.0 portal.
+--
+-- * 'ufComputeCapacity' - The parameters for the capacity allocated to the fleet.
+--
+-- * 'ufName' - The name of the fleet.
+updateFleet
+    :: Text -- ^ 'ufName'
+    -> UpdateFleet
+updateFleet pName_ =
+    UpdateFleet'
+    { _ufDisconnectTimeoutInSeconds = Nothing
+    , _ufMaxUserDurationInSeconds = Nothing
+    , _ufDeleteVPCConfig = Nothing
+    , _ufInstanceType = Nothing
+    , _ufVPCConfig = Nothing
+    , _ufDisplayName = Nothing
+    , _ufImageName = Nothing
+    , _ufDescription = Nothing
+    , _ufComputeCapacity = Nothing
+    , _ufName = pName_
+    }
+
+-- | The time after disconnection when a session is considered to have ended. When the user reconnects after a disconnection, the user is connected to the same instance within this time interval.
+ufDisconnectTimeoutInSeconds :: Lens' UpdateFleet (Maybe Int)
+ufDisconnectTimeoutInSeconds = lens _ufDisconnectTimeoutInSeconds (\ s a -> s{_ufDisconnectTimeoutInSeconds = a});
+
+-- | The maximum time during which a streaming session can run.
+ufMaxUserDurationInSeconds :: Lens' UpdateFleet (Maybe Int)
+ufMaxUserDurationInSeconds = lens _ufMaxUserDurationInSeconds (\ s a -> s{_ufMaxUserDurationInSeconds = a});
+
+-- | Delete the VPC association for the specified fleet.
+ufDeleteVPCConfig :: Lens' UpdateFleet (Maybe Bool)
+ufDeleteVPCConfig = lens _ufDeleteVPCConfig (\ s a -> s{_ufDeleteVPCConfig = a});
+
+-- | The instance type of compute resources for the fleet. Fleet instances are launched from this instance type.
+ufInstanceType :: Lens' UpdateFleet (Maybe Text)
+ufInstanceType = lens _ufInstanceType (\ s a -> s{_ufInstanceType = a});
+
+-- | The VPC configuration for the fleet.
+ufVPCConfig :: Lens' UpdateFleet (Maybe VPCConfig)
+ufVPCConfig = lens _ufVPCConfig (\ s a -> s{_ufVPCConfig = a});
+
+-- | The name displayed to end users on the AppStream 2.0 portal.
+ufDisplayName :: Lens' UpdateFleet (Maybe Text)
+ufDisplayName = lens _ufDisplayName (\ s a -> s{_ufDisplayName = a});
+
+-- | The image name from which a fleet is created.
+ufImageName :: Lens' UpdateFleet (Maybe Text)
+ufImageName = lens _ufImageName (\ s a -> s{_ufImageName = a});
+
+-- | The description displayed to end users on the AppStream 2.0 portal.
+ufDescription :: Lens' UpdateFleet (Maybe Text)
+ufDescription = lens _ufDescription (\ s a -> s{_ufDescription = a});
+
+-- | The parameters for the capacity allocated to the fleet.
+ufComputeCapacity :: Lens' UpdateFleet (Maybe ComputeCapacity)
+ufComputeCapacity = lens _ufComputeCapacity (\ s a -> s{_ufComputeCapacity = a});
+
+-- | The name of the fleet.
+ufName :: Lens' UpdateFleet Text
+ufName = lens _ufName (\ s a -> s{_ufName = a});
+
+instance AWSRequest UpdateFleet where
+        type Rs UpdateFleet = UpdateFleetResponse
+        request = postJSON appStream
+        response
+          = receiveJSON
+              (\ s h x ->
+                 UpdateFleetResponse' <$>
+                   (x .?> "Fleet") <*> (pure (fromEnum s)))
+
+instance Hashable UpdateFleet
+
+instance NFData UpdateFleet
+
+instance ToHeaders UpdateFleet where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("PhotonAdminProxyService.UpdateFleet" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON UpdateFleet where
+        toJSON UpdateFleet'{..}
+          = object
+              (catMaybes
+                 [("DisconnectTimeoutInSeconds" .=) <$>
+                    _ufDisconnectTimeoutInSeconds,
+                  ("MaxUserDurationInSeconds" .=) <$>
+                    _ufMaxUserDurationInSeconds,
+                  ("DeleteVpcConfig" .=) <$> _ufDeleteVPCConfig,
+                  ("InstanceType" .=) <$> _ufInstanceType,
+                  ("VpcConfig" .=) <$> _ufVPCConfig,
+                  ("DisplayName" .=) <$> _ufDisplayName,
+                  ("ImageName" .=) <$> _ufImageName,
+                  ("Description" .=) <$> _ufDescription,
+                  ("ComputeCapacity" .=) <$> _ufComputeCapacity,
+                  Just ("Name" .= _ufName)])
+
+instance ToPath UpdateFleet where
+        toPath = const "/"
+
+instance ToQuery UpdateFleet where
+        toQuery = const mempty
+
+-- | /See:/ 'updateFleetResponse' smart constructor.
+data UpdateFleetResponse = UpdateFleetResponse'
+    { _ufrsFleet          :: !(Maybe Fleet)
+    , _ufrsResponseStatus :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'UpdateFleetResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ufrsFleet' - A list of fleet details.
+--
+-- * 'ufrsResponseStatus' - -- | The response status code.
+updateFleetResponse
+    :: Int -- ^ 'ufrsResponseStatus'
+    -> UpdateFleetResponse
+updateFleetResponse pResponseStatus_ =
+    UpdateFleetResponse'
+    { _ufrsFleet = Nothing
+    , _ufrsResponseStatus = pResponseStatus_
+    }
+
+-- | A list of fleet details.
+ufrsFleet :: Lens' UpdateFleetResponse (Maybe Fleet)
+ufrsFleet = lens _ufrsFleet (\ s a -> s{_ufrsFleet = a});
+
+-- | -- | The response status code.
+ufrsResponseStatus :: Lens' UpdateFleetResponse Int
+ufrsResponseStatus = lens _ufrsResponseStatus (\ s a -> s{_ufrsResponseStatus = a});
+
+instance NFData UpdateFleetResponse
diff --git a/gen/Network/AWS/AppStream/UpdateStack.hs b/gen/Network/AWS/AppStream/UpdateStack.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AppStream/UpdateStack.hs
@@ -0,0 +1,154 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.AppStream.UpdateStack
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates the specified fields in the stack with the specified name.
+--
+--
+module Network.AWS.AppStream.UpdateStack
+    (
+    -- * Creating a Request
+      updateStack
+    , UpdateStack
+    -- * Request Lenses
+    , usDisplayName
+    , usDescription
+    , usName
+
+    -- * Destructuring the Response
+    , updateStackResponse
+    , UpdateStackResponse
+    -- * Response Lenses
+    , usrsStack
+    , usrsResponseStatus
+    ) where
+
+import           Network.AWS.AppStream.Types
+import           Network.AWS.AppStream.Types.Product
+import           Network.AWS.Lens
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'updateStack' smart constructor.
+data UpdateStack = UpdateStack'
+    { _usDisplayName :: !(Maybe Text)
+    , _usDescription :: !(Maybe Text)
+    , _usName        :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'UpdateStack' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'usDisplayName' - The name displayed to end users on the AppStream 2.0 portal.
+--
+-- * 'usDescription' - The description displayed to end users on the AppStream 2.0 portal.
+--
+-- * 'usName' - The name of the stack to update.
+updateStack
+    :: Text -- ^ 'usName'
+    -> UpdateStack
+updateStack pName_ =
+    UpdateStack'
+    { _usDisplayName = Nothing
+    , _usDescription = Nothing
+    , _usName = pName_
+    }
+
+-- | The name displayed to end users on the AppStream 2.0 portal.
+usDisplayName :: Lens' UpdateStack (Maybe Text)
+usDisplayName = lens _usDisplayName (\ s a -> s{_usDisplayName = a});
+
+-- | The description displayed to end users on the AppStream 2.0 portal.
+usDescription :: Lens' UpdateStack (Maybe Text)
+usDescription = lens _usDescription (\ s a -> s{_usDescription = a});
+
+-- | The name of the stack to update.
+usName :: Lens' UpdateStack Text
+usName = lens _usName (\ s a -> s{_usName = a});
+
+instance AWSRequest UpdateStack where
+        type Rs UpdateStack = UpdateStackResponse
+        request = postJSON appStream
+        response
+          = receiveJSON
+              (\ s h x ->
+                 UpdateStackResponse' <$>
+                   (x .?> "Stack") <*> (pure (fromEnum s)))
+
+instance Hashable UpdateStack
+
+instance NFData UpdateStack
+
+instance ToHeaders UpdateStack where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("PhotonAdminProxyService.UpdateStack" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON UpdateStack where
+        toJSON UpdateStack'{..}
+          = object
+              (catMaybes
+                 [("DisplayName" .=) <$> _usDisplayName,
+                  ("Description" .=) <$> _usDescription,
+                  Just ("Name" .= _usName)])
+
+instance ToPath UpdateStack where
+        toPath = const "/"
+
+instance ToQuery UpdateStack where
+        toQuery = const mempty
+
+-- | /See:/ 'updateStackResponse' smart constructor.
+data UpdateStackResponse = UpdateStackResponse'
+    { _usrsStack          :: !(Maybe Stack)
+    , _usrsResponseStatus :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'UpdateStackResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'usrsStack' - A list of stack details.
+--
+-- * 'usrsResponseStatus' - -- | The response status code.
+updateStackResponse
+    :: Int -- ^ 'usrsResponseStatus'
+    -> UpdateStackResponse
+updateStackResponse pResponseStatus_ =
+    UpdateStackResponse'
+    { _usrsStack = Nothing
+    , _usrsResponseStatus = pResponseStatus_
+    }
+
+-- | A list of stack details.
+usrsStack :: Lens' UpdateStackResponse (Maybe Stack)
+usrsStack = lens _usrsStack (\ s a -> s{_usrsStack = a});
+
+-- | -- | The response status code.
+usrsResponseStatus :: Lens' UpdateStackResponse Int
+usrsResponseStatus = lens _usrsResponseStatus (\ s a -> s{_usrsResponseStatus = a});
+
+instance NFData UpdateStackResponse
diff --git a/gen/Network/AWS/AppStream/Waiters.hs b/gen/Network/AWS/AppStream/Waiters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AppStream/Waiters.hs
@@ -0,0 +1,21 @@
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TypeFamilies      #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.AppStream.Waiters
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+module Network.AWS.AppStream.Waiters where
+
+import           Network.AWS.AppStream.Types
+import           Network.AWS.Lens
+import           Network.AWS.Prelude
+import           Network.AWS.Waiter
diff --git a/src/.gitkeep b/src/.gitkeep
new file mode 100644
--- /dev/null
+++ b/src/.gitkeep
diff --git a/test/Main.hs b/test/Main.hs
new file mode 100644
--- /dev/null
+++ b/test/Main.hs
@@ -0,0 +1,21 @@
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Main
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+module Main (main) where
+
+import Test.Tasty
+import Test.AWS.AppStream
+import Test.AWS.AppStream.Internal
+
+main :: IO ()
+main = defaultMain $ testGroup "AppStream"
+    [ testGroup "tests"    tests
+    , testGroup "fixtures" fixtures
+    ]
diff --git a/test/Test/AWS/AppStream.hs b/test/Test/AWS/AppStream.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/AWS/AppStream.hs
@@ -0,0 +1,20 @@
+-- |
+-- Module      : Test.AWS.AppStream
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+module Test.AWS.AppStream
+    ( tests
+    , fixtures
+    ) where
+
+import Test.Tasty (TestTree)
+
+tests :: [TestTree]
+tests = []
+
+fixtures :: [TestTree]
+fixtures = []
diff --git a/test/Test/AWS/AppStream/Internal.hs b/test/Test/AWS/AppStream/Internal.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/AWS/AppStream/Internal.hs
@@ -0,0 +1,9 @@
+-- |
+-- Module      : Test.AWS.AppStream.Internal
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+module Test.AWS.AppStream.Internal where
diff --git a/test/Test/AWS/Gen/AppStream.hs b/test/Test/AWS/Gen/AppStream.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/AWS/Gen/AppStream.hs
@@ -0,0 +1,363 @@
+{-# 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.AppStream
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+module Test.AWS.Gen.AppStream where
+
+import Data.Proxy
+import Test.AWS.Fixture
+import Test.AWS.Prelude
+import Test.Tasty
+import Network.AWS.AppStream
+import Test.AWS.AppStream.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"
+--         [ requestDisassociateFleet $
+--             disassociateFleet
+--
+--         , requestListAssociatedFleets $
+--             listAssociatedFleets
+--
+--         , requestDeleteStack $
+--             deleteStack
+--
+--         , requestUpdateStack $
+--             updateStack
+--
+--         , requestListAssociatedStacks $
+--             listAssociatedStacks
+--
+--         , requestDeleteFleet $
+--             deleteFleet
+--
+--         , requestUpdateFleet $
+--             updateFleet
+--
+--         , requestAssociateFleet $
+--             associateFleet
+--
+--         , requestDescribeSessions $
+--             describeSessions
+--
+--         , requestDescribeStacks $
+--             describeStacks
+--
+--         , requestDescribeFleets $
+--             describeFleets
+--
+--         , requestStopFleet $
+--             stopFleet
+--
+--         , requestCreateFleet $
+--             createFleet
+--
+--         , requestCreateStack $
+--             createStack
+--
+--         , requestExpireSession $
+--             expireSession
+--
+--         , requestCreateStreamingURL $
+--             createStreamingURL
+--
+--         , requestStartFleet $
+--             startFleet
+--
+--         , requestDescribeImages $
+--             describeImages
+--
+--           ]
+
+--     , testGroup "response"
+--         [ responseDisassociateFleet $
+--             disassociateFleetResponse
+--
+--         , responseListAssociatedFleets $
+--             listAssociatedFleetsResponse
+--
+--         , responseDeleteStack $
+--             deleteStackResponse
+--
+--         , responseUpdateStack $
+--             updateStackResponse
+--
+--         , responseListAssociatedStacks $
+--             listAssociatedStacksResponse
+--
+--         , responseDeleteFleet $
+--             deleteFleetResponse
+--
+--         , responseUpdateFleet $
+--             updateFleetResponse
+--
+--         , responseAssociateFleet $
+--             associateFleetResponse
+--
+--         , responseDescribeSessions $
+--             describeSessionsResponse
+--
+--         , responseDescribeStacks $
+--             describeStacksResponse
+--
+--         , responseDescribeFleets $
+--             describeFleetsResponse
+--
+--         , responseStopFleet $
+--             stopFleetResponse
+--
+--         , responseCreateFleet $
+--             createFleetResponse
+--
+--         , responseCreateStack $
+--             createStackResponse
+--
+--         , responseExpireSession $
+--             expireSessionResponse
+--
+--         , responseCreateStreamingURL $
+--             createStreamingURLResponse
+--
+--         , responseStartFleet $
+--             startFleetResponse
+--
+--         , responseDescribeImages $
+--             describeImagesResponse
+--
+--           ]
+--     ]
+
+-- Requests
+
+requestDisassociateFleet :: DisassociateFleet -> TestTree
+requestDisassociateFleet = req
+    "DisassociateFleet"
+    "fixture/DisassociateFleet.yaml"
+
+requestListAssociatedFleets :: ListAssociatedFleets -> TestTree
+requestListAssociatedFleets = req
+    "ListAssociatedFleets"
+    "fixture/ListAssociatedFleets.yaml"
+
+requestDeleteStack :: DeleteStack -> TestTree
+requestDeleteStack = req
+    "DeleteStack"
+    "fixture/DeleteStack.yaml"
+
+requestUpdateStack :: UpdateStack -> TestTree
+requestUpdateStack = req
+    "UpdateStack"
+    "fixture/UpdateStack.yaml"
+
+requestListAssociatedStacks :: ListAssociatedStacks -> TestTree
+requestListAssociatedStacks = req
+    "ListAssociatedStacks"
+    "fixture/ListAssociatedStacks.yaml"
+
+requestDeleteFleet :: DeleteFleet -> TestTree
+requestDeleteFleet = req
+    "DeleteFleet"
+    "fixture/DeleteFleet.yaml"
+
+requestUpdateFleet :: UpdateFleet -> TestTree
+requestUpdateFleet = req
+    "UpdateFleet"
+    "fixture/UpdateFleet.yaml"
+
+requestAssociateFleet :: AssociateFleet -> TestTree
+requestAssociateFleet = req
+    "AssociateFleet"
+    "fixture/AssociateFleet.yaml"
+
+requestDescribeSessions :: DescribeSessions -> TestTree
+requestDescribeSessions = req
+    "DescribeSessions"
+    "fixture/DescribeSessions.yaml"
+
+requestDescribeStacks :: DescribeStacks -> TestTree
+requestDescribeStacks = req
+    "DescribeStacks"
+    "fixture/DescribeStacks.yaml"
+
+requestDescribeFleets :: DescribeFleets -> TestTree
+requestDescribeFleets = req
+    "DescribeFleets"
+    "fixture/DescribeFleets.yaml"
+
+requestStopFleet :: StopFleet -> TestTree
+requestStopFleet = req
+    "StopFleet"
+    "fixture/StopFleet.yaml"
+
+requestCreateFleet :: CreateFleet -> TestTree
+requestCreateFleet = req
+    "CreateFleet"
+    "fixture/CreateFleet.yaml"
+
+requestCreateStack :: CreateStack -> TestTree
+requestCreateStack = req
+    "CreateStack"
+    "fixture/CreateStack.yaml"
+
+requestExpireSession :: ExpireSession -> TestTree
+requestExpireSession = req
+    "ExpireSession"
+    "fixture/ExpireSession.yaml"
+
+requestCreateStreamingURL :: CreateStreamingURL -> TestTree
+requestCreateStreamingURL = req
+    "CreateStreamingURL"
+    "fixture/CreateStreamingURL.yaml"
+
+requestStartFleet :: StartFleet -> TestTree
+requestStartFleet = req
+    "StartFleet"
+    "fixture/StartFleet.yaml"
+
+requestDescribeImages :: DescribeImages -> TestTree
+requestDescribeImages = req
+    "DescribeImages"
+    "fixture/DescribeImages.yaml"
+
+-- Responses
+
+responseDisassociateFleet :: DisassociateFleetResponse -> TestTree
+responseDisassociateFleet = res
+    "DisassociateFleetResponse"
+    "fixture/DisassociateFleetResponse.proto"
+    appStream
+    (Proxy :: Proxy DisassociateFleet)
+
+responseListAssociatedFleets :: ListAssociatedFleetsResponse -> TestTree
+responseListAssociatedFleets = res
+    "ListAssociatedFleetsResponse"
+    "fixture/ListAssociatedFleetsResponse.proto"
+    appStream
+    (Proxy :: Proxy ListAssociatedFleets)
+
+responseDeleteStack :: DeleteStackResponse -> TestTree
+responseDeleteStack = res
+    "DeleteStackResponse"
+    "fixture/DeleteStackResponse.proto"
+    appStream
+    (Proxy :: Proxy DeleteStack)
+
+responseUpdateStack :: UpdateStackResponse -> TestTree
+responseUpdateStack = res
+    "UpdateStackResponse"
+    "fixture/UpdateStackResponse.proto"
+    appStream
+    (Proxy :: Proxy UpdateStack)
+
+responseListAssociatedStacks :: ListAssociatedStacksResponse -> TestTree
+responseListAssociatedStacks = res
+    "ListAssociatedStacksResponse"
+    "fixture/ListAssociatedStacksResponse.proto"
+    appStream
+    (Proxy :: Proxy ListAssociatedStacks)
+
+responseDeleteFleet :: DeleteFleetResponse -> TestTree
+responseDeleteFleet = res
+    "DeleteFleetResponse"
+    "fixture/DeleteFleetResponse.proto"
+    appStream
+    (Proxy :: Proxy DeleteFleet)
+
+responseUpdateFleet :: UpdateFleetResponse -> TestTree
+responseUpdateFleet = res
+    "UpdateFleetResponse"
+    "fixture/UpdateFleetResponse.proto"
+    appStream
+    (Proxy :: Proxy UpdateFleet)
+
+responseAssociateFleet :: AssociateFleetResponse -> TestTree
+responseAssociateFleet = res
+    "AssociateFleetResponse"
+    "fixture/AssociateFleetResponse.proto"
+    appStream
+    (Proxy :: Proxy AssociateFleet)
+
+responseDescribeSessions :: DescribeSessionsResponse -> TestTree
+responseDescribeSessions = res
+    "DescribeSessionsResponse"
+    "fixture/DescribeSessionsResponse.proto"
+    appStream
+    (Proxy :: Proxy DescribeSessions)
+
+responseDescribeStacks :: DescribeStacksResponse -> TestTree
+responseDescribeStacks = res
+    "DescribeStacksResponse"
+    "fixture/DescribeStacksResponse.proto"
+    appStream
+    (Proxy :: Proxy DescribeStacks)
+
+responseDescribeFleets :: DescribeFleetsResponse -> TestTree
+responseDescribeFleets = res
+    "DescribeFleetsResponse"
+    "fixture/DescribeFleetsResponse.proto"
+    appStream
+    (Proxy :: Proxy DescribeFleets)
+
+responseStopFleet :: StopFleetResponse -> TestTree
+responseStopFleet = res
+    "StopFleetResponse"
+    "fixture/StopFleetResponse.proto"
+    appStream
+    (Proxy :: Proxy StopFleet)
+
+responseCreateFleet :: CreateFleetResponse -> TestTree
+responseCreateFleet = res
+    "CreateFleetResponse"
+    "fixture/CreateFleetResponse.proto"
+    appStream
+    (Proxy :: Proxy CreateFleet)
+
+responseCreateStack :: CreateStackResponse -> TestTree
+responseCreateStack = res
+    "CreateStackResponse"
+    "fixture/CreateStackResponse.proto"
+    appStream
+    (Proxy :: Proxy CreateStack)
+
+responseExpireSession :: ExpireSessionResponse -> TestTree
+responseExpireSession = res
+    "ExpireSessionResponse"
+    "fixture/ExpireSessionResponse.proto"
+    appStream
+    (Proxy :: Proxy ExpireSession)
+
+responseCreateStreamingURL :: CreateStreamingURLResponse -> TestTree
+responseCreateStreamingURL = res
+    "CreateStreamingURLResponse"
+    "fixture/CreateStreamingURLResponse.proto"
+    appStream
+    (Proxy :: Proxy CreateStreamingURL)
+
+responseStartFleet :: StartFleetResponse -> TestTree
+responseStartFleet = res
+    "StartFleetResponse"
+    "fixture/StartFleetResponse.proto"
+    appStream
+    (Proxy :: Proxy StartFleet)
+
+responseDescribeImages :: DescribeImagesResponse -> TestTree
+responseDescribeImages = res
+    "DescribeImagesResponse"
+    "fixture/DescribeImagesResponse.proto"
+    appStream
+    (Proxy :: Proxy DescribeImages)
