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 Alexa For Business SDK
+
+* [Version](#version)
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+
+## Version
+
+`1.6.0`
+
+
+## Description
+
+Documentation is available via [Hackage](http://hackage.haskell.org/package/amazonka-alexa-business)
+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.AlexaBusiness](http://hackage.haskell.org/package/amazonka-alexa-business/docs/Network-AWS-AlexaBusiness.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-alexa-business` 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-alexa-business.cabal b/amazonka-alexa-business.cabal
new file mode 100644
--- /dev/null
+++ b/amazonka-alexa-business.cabal
@@ -0,0 +1,134 @@
+name:                  amazonka-alexa-business
+version:               1.6.0
+synopsis:              Amazon Alexa For Business SDK.
+homepage:              https://github.com/brendanhay/amazonka
+bug-reports:           https://github.com/brendanhay/amazonka/issues
+license:               MPL-2.0
+license-file:          LICENSE
+author:                Brendan Hay
+maintainer:            Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+copyright:             Copyright (c) 2013-2018 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.AlexaBusiness" or <https://aws.amazon.com/documentation/ the AWS documentation>
+    to get started.
+
+source-repository head
+    type:              git
+    location:          git://github.com/brendanhay/amazonka.git
+    subdir:            amazonka-alexa-business
+
+library
+    default-language:  Haskell2010
+    hs-source-dirs:    src gen
+
+    ghc-options:
+        -Wall
+        -fwarn-incomplete-uni-patterns
+        -fwarn-incomplete-record-updates
+        -funbox-strict-fields
+
+    exposed-modules:
+          Network.AWS.AlexaBusiness
+        , Network.AWS.AlexaBusiness.AssociateContactWithAddressBook
+        , Network.AWS.AlexaBusiness.AssociateDeviceWithRoom
+        , Network.AWS.AlexaBusiness.AssociateSkillGroupWithRoom
+        , Network.AWS.AlexaBusiness.CreateAddressBook
+        , Network.AWS.AlexaBusiness.CreateContact
+        , Network.AWS.AlexaBusiness.CreateProfile
+        , Network.AWS.AlexaBusiness.CreateRoom
+        , Network.AWS.AlexaBusiness.CreateSkillGroup
+        , Network.AWS.AlexaBusiness.CreateUser
+        , Network.AWS.AlexaBusiness.DeleteAddressBook
+        , Network.AWS.AlexaBusiness.DeleteContact
+        , Network.AWS.AlexaBusiness.DeleteProfile
+        , Network.AWS.AlexaBusiness.DeleteRoom
+        , Network.AWS.AlexaBusiness.DeleteRoomSkillParameter
+        , Network.AWS.AlexaBusiness.DeleteSkillGroup
+        , Network.AWS.AlexaBusiness.DeleteUser
+        , Network.AWS.AlexaBusiness.DisassociateContactFromAddressBook
+        , Network.AWS.AlexaBusiness.DisassociateDeviceFromRoom
+        , Network.AWS.AlexaBusiness.DisassociateSkillGroupFromRoom
+        , Network.AWS.AlexaBusiness.GetAddressBook
+        , Network.AWS.AlexaBusiness.GetContact
+        , Network.AWS.AlexaBusiness.GetDevice
+        , Network.AWS.AlexaBusiness.GetProfile
+        , Network.AWS.AlexaBusiness.GetRoom
+        , Network.AWS.AlexaBusiness.GetRoomSkillParameter
+        , Network.AWS.AlexaBusiness.GetSkillGroup
+        , Network.AWS.AlexaBusiness.ListDeviceEvents
+        , Network.AWS.AlexaBusiness.ListSkills
+        , Network.AWS.AlexaBusiness.ListTags
+        , Network.AWS.AlexaBusiness.PutRoomSkillParameter
+        , Network.AWS.AlexaBusiness.ResolveRoom
+        , Network.AWS.AlexaBusiness.RevokeInvitation
+        , Network.AWS.AlexaBusiness.SearchAddressBooks
+        , Network.AWS.AlexaBusiness.SearchContacts
+        , Network.AWS.AlexaBusiness.SearchDevices
+        , Network.AWS.AlexaBusiness.SearchProfiles
+        , Network.AWS.AlexaBusiness.SearchRooms
+        , Network.AWS.AlexaBusiness.SearchSkillGroups
+        , Network.AWS.AlexaBusiness.SearchUsers
+        , Network.AWS.AlexaBusiness.SendInvitation
+        , Network.AWS.AlexaBusiness.StartDeviceSync
+        , Network.AWS.AlexaBusiness.TagResource
+        , Network.AWS.AlexaBusiness.Types
+        , Network.AWS.AlexaBusiness.UntagResource
+        , Network.AWS.AlexaBusiness.UpdateAddressBook
+        , Network.AWS.AlexaBusiness.UpdateContact
+        , Network.AWS.AlexaBusiness.UpdateDevice
+        , Network.AWS.AlexaBusiness.UpdateProfile
+        , Network.AWS.AlexaBusiness.UpdateRoom
+        , Network.AWS.AlexaBusiness.UpdateSkillGroup
+        , Network.AWS.AlexaBusiness.Waiters
+
+    other-modules:
+          Network.AWS.AlexaBusiness.Types.Product
+        , Network.AWS.AlexaBusiness.Types.Sum
+
+    build-depends:
+          amazonka-core == 1.6.0.*
+        , base          >= 4.7     && < 5
+
+test-suite amazonka-alexa-business-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.AlexaBusiness
+        , Test.AWS.Gen.AlexaBusiness
+        , Test.AWS.AlexaBusiness.Internal
+
+    build-depends:
+          amazonka-core == 1.6.0.*
+        , amazonka-test == 1.6.0.*
+        , amazonka-alexa-business
+        , base
+        , bytestring
+        , tasty
+        , tasty-hunit
+        , text
+        , time
+        , unordered-containers
diff --git a/fixture/AssociateContactWithAddressBook.yaml b/fixture/AssociateContactWithAddressBook.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/AssociateContactWithAddressBook.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/AssociateContactWithAddressBookResponse.proto b/fixture/AssociateContactWithAddressBookResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/AssociateContactWithAddressBookResponse.proto
diff --git a/fixture/AssociateDeviceWithRoom.yaml b/fixture/AssociateDeviceWithRoom.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/AssociateDeviceWithRoom.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/AssociateDeviceWithRoomResponse.proto b/fixture/AssociateDeviceWithRoomResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/AssociateDeviceWithRoomResponse.proto
diff --git a/fixture/AssociateSkillGroupWithRoom.yaml b/fixture/AssociateSkillGroupWithRoom.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/AssociateSkillGroupWithRoom.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/AssociateSkillGroupWithRoomResponse.proto b/fixture/AssociateSkillGroupWithRoomResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/AssociateSkillGroupWithRoomResponse.proto
diff --git a/fixture/CreateAddressBook.yaml b/fixture/CreateAddressBook.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateAddressBook.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/CreateAddressBookResponse.proto b/fixture/CreateAddressBookResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateAddressBookResponse.proto
diff --git a/fixture/CreateContact.yaml b/fixture/CreateContact.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateContact.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/CreateContactResponse.proto b/fixture/CreateContactResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateContactResponse.proto
diff --git a/fixture/CreateProfile.yaml b/fixture/CreateProfile.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateProfile.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/CreateProfileResponse.proto b/fixture/CreateProfileResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateProfileResponse.proto
diff --git a/fixture/CreateRoom.yaml b/fixture/CreateRoom.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateRoom.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/CreateRoomResponse.proto b/fixture/CreateRoomResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateRoomResponse.proto
diff --git a/fixture/CreateSkillGroup.yaml b/fixture/CreateSkillGroup.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateSkillGroup.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/CreateSkillGroupResponse.proto b/fixture/CreateSkillGroupResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateSkillGroupResponse.proto
diff --git a/fixture/CreateUser.yaml b/fixture/CreateUser.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateUser.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/CreateUserResponse.proto b/fixture/CreateUserResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateUserResponse.proto
diff --git a/fixture/DeleteAddressBook.yaml b/fixture/DeleteAddressBook.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteAddressBook.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/DeleteAddressBookResponse.proto b/fixture/DeleteAddressBookResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteAddressBookResponse.proto
diff --git a/fixture/DeleteContact.yaml b/fixture/DeleteContact.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteContact.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/DeleteContactResponse.proto b/fixture/DeleteContactResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteContactResponse.proto
diff --git a/fixture/DeleteProfile.yaml b/fixture/DeleteProfile.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteProfile.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/DeleteProfileResponse.proto b/fixture/DeleteProfileResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteProfileResponse.proto
diff --git a/fixture/DeleteRoom.yaml b/fixture/DeleteRoom.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteRoom.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/DeleteRoomResponse.proto b/fixture/DeleteRoomResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteRoomResponse.proto
diff --git a/fixture/DeleteRoomSkillParameter.yaml b/fixture/DeleteRoomSkillParameter.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteRoomSkillParameter.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/DeleteRoomSkillParameterResponse.proto b/fixture/DeleteRoomSkillParameterResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteRoomSkillParameterResponse.proto
diff --git a/fixture/DeleteSkillGroup.yaml b/fixture/DeleteSkillGroup.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteSkillGroup.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/DeleteSkillGroupResponse.proto b/fixture/DeleteSkillGroupResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteSkillGroupResponse.proto
diff --git a/fixture/DeleteUser.yaml b/fixture/DeleteUser.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteUser.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/DeleteUserResponse.proto b/fixture/DeleteUserResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteUserResponse.proto
diff --git a/fixture/DisassociateContactFromAddressBook.yaml b/fixture/DisassociateContactFromAddressBook.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DisassociateContactFromAddressBook.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/DisassociateContactFromAddressBookResponse.proto b/fixture/DisassociateContactFromAddressBookResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DisassociateContactFromAddressBookResponse.proto
diff --git a/fixture/DisassociateDeviceFromRoom.yaml b/fixture/DisassociateDeviceFromRoom.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DisassociateDeviceFromRoom.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/DisassociateDeviceFromRoomResponse.proto b/fixture/DisassociateDeviceFromRoomResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DisassociateDeviceFromRoomResponse.proto
diff --git a/fixture/DisassociateSkillGroupFromRoom.yaml b/fixture/DisassociateSkillGroupFromRoom.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DisassociateSkillGroupFromRoom.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/DisassociateSkillGroupFromRoomResponse.proto b/fixture/DisassociateSkillGroupFromRoomResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DisassociateSkillGroupFromRoomResponse.proto
diff --git a/fixture/GetAddressBook.yaml b/fixture/GetAddressBook.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetAddressBook.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/GetAddressBookResponse.proto b/fixture/GetAddressBookResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetAddressBookResponse.proto
diff --git a/fixture/GetContact.yaml b/fixture/GetContact.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetContact.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/GetContactResponse.proto b/fixture/GetContactResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetContactResponse.proto
diff --git a/fixture/GetDevice.yaml b/fixture/GetDevice.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetDevice.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/GetDeviceResponse.proto b/fixture/GetDeviceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetDeviceResponse.proto
diff --git a/fixture/GetProfile.yaml b/fixture/GetProfile.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetProfile.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/GetProfileResponse.proto b/fixture/GetProfileResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetProfileResponse.proto
diff --git a/fixture/GetRoom.yaml b/fixture/GetRoom.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetRoom.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/GetRoomResponse.proto b/fixture/GetRoomResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetRoomResponse.proto
diff --git a/fixture/GetRoomSkillParameter.yaml b/fixture/GetRoomSkillParameter.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetRoomSkillParameter.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/GetRoomSkillParameterResponse.proto b/fixture/GetRoomSkillParameterResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetRoomSkillParameterResponse.proto
diff --git a/fixture/GetSkillGroup.yaml b/fixture/GetSkillGroup.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetSkillGroup.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/GetSkillGroupResponse.proto b/fixture/GetSkillGroupResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetSkillGroupResponse.proto
diff --git a/fixture/ListDeviceEvents.yaml b/fixture/ListDeviceEvents.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListDeviceEvents.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/ListDeviceEventsResponse.proto b/fixture/ListDeviceEventsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListDeviceEventsResponse.proto
diff --git a/fixture/ListSkills.yaml b/fixture/ListSkills.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListSkills.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/ListSkillsResponse.proto b/fixture/ListSkillsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListSkillsResponse.proto
diff --git a/fixture/ListTags.yaml b/fixture/ListTags.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListTags.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/ListTagsResponse.proto b/fixture/ListTagsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListTagsResponse.proto
diff --git a/fixture/PutRoomSkillParameter.yaml b/fixture/PutRoomSkillParameter.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/PutRoomSkillParameter.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/PutRoomSkillParameterResponse.proto b/fixture/PutRoomSkillParameterResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/PutRoomSkillParameterResponse.proto
diff --git a/fixture/ResolveRoom.yaml b/fixture/ResolveRoom.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ResolveRoom.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/ResolveRoomResponse.proto b/fixture/ResolveRoomResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ResolveRoomResponse.proto
diff --git a/fixture/RevokeInvitation.yaml b/fixture/RevokeInvitation.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/RevokeInvitation.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/RevokeInvitationResponse.proto b/fixture/RevokeInvitationResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/RevokeInvitationResponse.proto
diff --git a/fixture/SearchAddressBooks.yaml b/fixture/SearchAddressBooks.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/SearchAddressBooks.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/SearchAddressBooksResponse.proto b/fixture/SearchAddressBooksResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/SearchAddressBooksResponse.proto
diff --git a/fixture/SearchContacts.yaml b/fixture/SearchContacts.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/SearchContacts.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/SearchContactsResponse.proto b/fixture/SearchContactsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/SearchContactsResponse.proto
diff --git a/fixture/SearchDevices.yaml b/fixture/SearchDevices.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/SearchDevices.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/SearchDevicesResponse.proto b/fixture/SearchDevicesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/SearchDevicesResponse.proto
diff --git a/fixture/SearchProfiles.yaml b/fixture/SearchProfiles.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/SearchProfiles.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/SearchProfilesResponse.proto b/fixture/SearchProfilesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/SearchProfilesResponse.proto
diff --git a/fixture/SearchRooms.yaml b/fixture/SearchRooms.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/SearchRooms.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/SearchRoomsResponse.proto b/fixture/SearchRoomsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/SearchRoomsResponse.proto
diff --git a/fixture/SearchSkillGroups.yaml b/fixture/SearchSkillGroups.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/SearchSkillGroups.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/SearchSkillGroupsResponse.proto b/fixture/SearchSkillGroupsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/SearchSkillGroupsResponse.proto
diff --git a/fixture/SearchUsers.yaml b/fixture/SearchUsers.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/SearchUsers.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/SearchUsersResponse.proto b/fixture/SearchUsersResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/SearchUsersResponse.proto
diff --git a/fixture/SendInvitation.yaml b/fixture/SendInvitation.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/SendInvitation.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/SendInvitationResponse.proto b/fixture/SendInvitationResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/SendInvitationResponse.proto
diff --git a/fixture/StartDeviceSync.yaml b/fixture/StartDeviceSync.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/StartDeviceSync.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/StartDeviceSyncResponse.proto b/fixture/StartDeviceSyncResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/StartDeviceSyncResponse.proto
diff --git a/fixture/TagResource.yaml b/fixture/TagResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/TagResource.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/TagResourceResponse.proto b/fixture/TagResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/TagResourceResponse.proto
diff --git a/fixture/UntagResource.yaml b/fixture/UntagResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UntagResource.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/UntagResourceResponse.proto b/fixture/UntagResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UntagResourceResponse.proto
diff --git a/fixture/UpdateAddressBook.yaml b/fixture/UpdateAddressBook.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateAddressBook.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/UpdateAddressBookResponse.proto b/fixture/UpdateAddressBookResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateAddressBookResponse.proto
diff --git a/fixture/UpdateContact.yaml b/fixture/UpdateContact.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateContact.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/UpdateContactResponse.proto b/fixture/UpdateContactResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateContactResponse.proto
diff --git a/fixture/UpdateDevice.yaml b/fixture/UpdateDevice.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateDevice.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/UpdateDeviceResponse.proto b/fixture/UpdateDeviceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateDeviceResponse.proto
diff --git a/fixture/UpdateProfile.yaml b/fixture/UpdateProfile.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateProfile.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/UpdateProfileResponse.proto b/fixture/UpdateProfileResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateProfileResponse.proto
diff --git a/fixture/UpdateRoom.yaml b/fixture/UpdateRoom.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateRoom.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/UpdateRoomResponse.proto b/fixture/UpdateRoomResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateRoomResponse.proto
diff --git a/fixture/UpdateSkillGroup.yaml b/fixture/UpdateSkillGroup.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateSkillGroup.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/a4b/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  a4b.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/UpdateSkillGroupResponse.proto b/fixture/UpdateSkillGroupResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateSkillGroupResponse.proto
diff --git a/gen/Network/AWS/AlexaBusiness.hs b/gen/Network/AWS/AlexaBusiness.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness.hs
@@ -0,0 +1,485 @@
+{-# 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.AlexaBusiness
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Alexa for Business makes it easy for you to use Alexa in your organization. Alexa for Business gives you the tools you need for managing Alexa devices, enroll your users, and assign skills, at scale. You can build your own context-aware voice skills using the Alexa Skills Kit and the Alexa for Business API operations. You can make also these available as private skills for your organization. Alexa for Business makes it easy to voice-enable your products and services, providing context-aware voice experiences for your customers.
+--
+--
+module Network.AWS.AlexaBusiness
+    (
+    -- * Service Configuration
+      alexaBusiness
+
+    -- * Errors
+    -- $errors
+
+    -- ** InvalidUserStatusException
+    , _InvalidUserStatusException
+
+    -- ** NotFoundException
+    , _NotFoundException
+
+    -- ** NameInUseException
+    , _NameInUseException
+
+    -- ** AlreadyExistsException
+    , _AlreadyExistsException
+
+    -- ** LimitExceededException
+    , _LimitExceededException
+
+    -- ** ResourceInUseException
+    , _ResourceInUseException
+
+    -- * Waiters
+    -- $waiters
+
+    -- * Operations
+    -- $operations
+
+    -- ** SearchUsers (Paginated)
+    , module Network.AWS.AlexaBusiness.SearchUsers
+
+    -- ** AssociateSkillGroupWithRoom
+    , module Network.AWS.AlexaBusiness.AssociateSkillGroupWithRoom
+
+    -- ** DeleteProfile
+    , module Network.AWS.AlexaBusiness.DeleteProfile
+
+    -- ** UpdateProfile
+    , module Network.AWS.AlexaBusiness.UpdateProfile
+
+    -- ** SearchRooms (Paginated)
+    , module Network.AWS.AlexaBusiness.SearchRooms
+
+    -- ** DisassociateContactFromAddressBook
+    , module Network.AWS.AlexaBusiness.DisassociateContactFromAddressBook
+
+    -- ** CreateAddressBook
+    , module Network.AWS.AlexaBusiness.CreateAddressBook
+
+    -- ** DeleteAddressBook
+    , module Network.AWS.AlexaBusiness.DeleteAddressBook
+
+    -- ** UpdateAddressBook
+    , module Network.AWS.AlexaBusiness.UpdateAddressBook
+
+    -- ** UpdateRoom
+    , module Network.AWS.AlexaBusiness.UpdateRoom
+
+    -- ** DeleteRoom
+    , module Network.AWS.AlexaBusiness.DeleteRoom
+
+    -- ** GetDevice
+    , module Network.AWS.AlexaBusiness.GetDevice
+
+    -- ** GetContact
+    , module Network.AWS.AlexaBusiness.GetContact
+
+    -- ** AssociateDeviceWithRoom
+    , module Network.AWS.AlexaBusiness.AssociateDeviceWithRoom
+
+    -- ** GetRoomSkillParameter
+    , module Network.AWS.AlexaBusiness.GetRoomSkillParameter
+
+    -- ** DeleteContact
+    , module Network.AWS.AlexaBusiness.DeleteContact
+
+    -- ** UpdateContact
+    , module Network.AWS.AlexaBusiness.UpdateContact
+
+    -- ** GetAddressBook
+    , module Network.AWS.AlexaBusiness.GetAddressBook
+
+    -- ** CreateContact
+    , module Network.AWS.AlexaBusiness.CreateContact
+
+    -- ** CreateProfile
+    , module Network.AWS.AlexaBusiness.CreateProfile
+
+    -- ** DeleteSkillGroup
+    , module Network.AWS.AlexaBusiness.DeleteSkillGroup
+
+    -- ** UpdateSkillGroup
+    , module Network.AWS.AlexaBusiness.UpdateSkillGroup
+
+    -- ** StartDeviceSync
+    , module Network.AWS.AlexaBusiness.StartDeviceSync
+
+    -- ** SearchAddressBooks
+    , module Network.AWS.AlexaBusiness.SearchAddressBooks
+
+    -- ** CreateSkillGroup
+    , module Network.AWS.AlexaBusiness.CreateSkillGroup
+
+    -- ** GetProfile
+    , module Network.AWS.AlexaBusiness.GetProfile
+
+    -- ** DisassociateSkillGroupFromRoom
+    , module Network.AWS.AlexaBusiness.DisassociateSkillGroupFromRoom
+
+    -- ** SendInvitation
+    , module Network.AWS.AlexaBusiness.SendInvitation
+
+    -- ** ListDeviceEvents
+    , module Network.AWS.AlexaBusiness.ListDeviceEvents
+
+    -- ** CreateUser
+    , module Network.AWS.AlexaBusiness.CreateUser
+
+    -- ** SearchDevices (Paginated)
+    , module Network.AWS.AlexaBusiness.SearchDevices
+
+    -- ** SearchContacts
+    , module Network.AWS.AlexaBusiness.SearchContacts
+
+    -- ** DeleteUser
+    , module Network.AWS.AlexaBusiness.DeleteUser
+
+    -- ** GetSkillGroup
+    , module Network.AWS.AlexaBusiness.GetSkillGroup
+
+    -- ** ListSkills (Paginated)
+    , module Network.AWS.AlexaBusiness.ListSkills
+
+    -- ** TagResource
+    , module Network.AWS.AlexaBusiness.TagResource
+
+    -- ** DisassociateDeviceFromRoom
+    , module Network.AWS.AlexaBusiness.DisassociateDeviceFromRoom
+
+    -- ** SearchSkillGroups (Paginated)
+    , module Network.AWS.AlexaBusiness.SearchSkillGroups
+
+    -- ** ListTags (Paginated)
+    , module Network.AWS.AlexaBusiness.ListTags
+
+    -- ** UntagResource
+    , module Network.AWS.AlexaBusiness.UntagResource
+
+    -- ** ResolveRoom
+    , module Network.AWS.AlexaBusiness.ResolveRoom
+
+    -- ** CreateRoom
+    , module Network.AWS.AlexaBusiness.CreateRoom
+
+    -- ** DeleteRoomSkillParameter
+    , module Network.AWS.AlexaBusiness.DeleteRoomSkillParameter
+
+    -- ** PutRoomSkillParameter
+    , module Network.AWS.AlexaBusiness.PutRoomSkillParameter
+
+    -- ** SearchProfiles (Paginated)
+    , module Network.AWS.AlexaBusiness.SearchProfiles
+
+    -- ** RevokeInvitation
+    , module Network.AWS.AlexaBusiness.RevokeInvitation
+
+    -- ** UpdateDevice
+    , module Network.AWS.AlexaBusiness.UpdateDevice
+
+    -- ** GetRoom
+    , module Network.AWS.AlexaBusiness.GetRoom
+
+    -- ** AssociateContactWithAddressBook
+    , module Network.AWS.AlexaBusiness.AssociateContactWithAddressBook
+
+    -- * Types
+
+    -- ** ConnectionStatus
+    , ConnectionStatus (..)
+
+    -- ** DeviceEventType
+    , DeviceEventType (..)
+
+    -- ** DeviceStatus
+    , DeviceStatus (..)
+
+    -- ** DeviceStatusDetailCode
+    , DeviceStatusDetailCode (..)
+
+    -- ** DistanceUnit
+    , DistanceUnit (..)
+
+    -- ** EnrollmentStatus
+    , EnrollmentStatus (..)
+
+    -- ** Feature
+    , Feature (..)
+
+    -- ** SortValue
+    , SortValue (..)
+
+    -- ** TemperatureUnit
+    , TemperatureUnit (..)
+
+    -- ** WakeWord
+    , WakeWord (..)
+
+    -- ** AddressBook
+    , AddressBook
+    , addressBook
+    , abAddressBookARN
+    , abName
+    , abDescription
+
+    -- ** AddressBookData
+    , AddressBookData
+    , addressBookData
+    , abdAddressBookARN
+    , abdName
+    , abdDescription
+
+    -- ** Contact
+    , Contact
+    , contact
+    , cLastName
+    , cContactARN
+    , cPhoneNumber
+    , cFirstName
+    , cDisplayName
+
+    -- ** ContactData
+    , ContactData
+    , contactData
+    , cdLastName
+    , cdContactARN
+    , cdPhoneNumber
+    , cdFirstName
+    , cdDisplayName
+
+    -- ** Device
+    , Device
+    , device
+    , dDeviceStatus
+    , dDeviceStatusInfo
+    , dDeviceARN
+    , dMACAddress
+    , dDeviceName
+    , dRoomARN
+    , dSoftwareVersion
+    , dDeviceType
+    , dDeviceSerialNumber
+
+    -- ** DeviceData
+    , DeviceData
+    , deviceData
+    , ddDeviceStatus
+    , ddDeviceStatusInfo
+    , ddDeviceARN
+    , ddMACAddress
+    , ddDeviceName
+    , ddRoomARN
+    , ddSoftwareVersion
+    , ddDeviceType
+    , ddRoomName
+    , ddDeviceSerialNumber
+
+    -- ** DeviceEvent
+    , DeviceEvent
+    , deviceEvent
+    , deValue
+    , deType
+    , deTimestamp
+
+    -- ** DeviceStatusDetail
+    , DeviceStatusDetail
+    , deviceStatusDetail
+    , dsdCode
+
+    -- ** DeviceStatusInfo
+    , DeviceStatusInfo
+    , deviceStatusInfo
+    , dsiDeviceStatusDetails
+    , dsiConnectionStatus
+
+    -- ** Filter
+    , Filter
+    , filter'
+    , fKey
+    , fValues
+
+    -- ** Profile
+    , Profile
+    , profile
+    , pSetupModeDisabled
+    , pPSTNEnabled
+    , pDistanceUnit
+    , pAddress
+    , pProfileARN
+    , pWakeWord
+    , pProfileName
+    , pTemperatureUnit
+    , pTimezone
+    , pMaxVolumeLimit
+
+    -- ** ProfileData
+    , ProfileData
+    , profileData
+    , pdDistanceUnit
+    , pdAddress
+    , pdProfileARN
+    , pdWakeWord
+    , pdProfileName
+    , pdTemperatureUnit
+    , pdTimezone
+
+    -- ** Room
+    , Room
+    , room
+    , rProfileARN
+    , rProviderCalendarId
+    , rRoomARN
+    , rRoomName
+    , rDescription
+
+    -- ** RoomData
+    , RoomData
+    , roomData
+    , rdProfileARN
+    , rdProviderCalendarId
+    , rdProfileName
+    , rdRoomARN
+    , rdRoomName
+    , rdDescription
+
+    -- ** RoomSkillParameter
+    , RoomSkillParameter
+    , roomSkillParameter
+    , rspParameterKey
+    , rspParameterValue
+
+    -- ** SkillGroup
+    , SkillGroup
+    , skillGroup
+    , sgSkillGroupARN
+    , sgDescription
+    , sgSkillGroupName
+
+    -- ** SkillGroupData
+    , SkillGroupData
+    , skillGroupData
+    , sgdSkillGroupARN
+    , sgdDescription
+    , sgdSkillGroupName
+
+    -- ** SkillSummary
+    , SkillSummary
+    , skillSummary
+    , ssSkillId
+    , ssSupportsLinking
+    , ssSkillName
+
+    -- ** Sort
+    , Sort
+    , sort
+    , sKey
+    , sValue
+
+    -- ** Tag
+    , Tag
+    , tag
+    , tagValue
+    , tagKey
+
+    -- ** UserData
+    , UserData
+    , userData
+    , udEmail
+    , udLastName
+    , udEnrollmentId
+    , udUserARN
+    , udFirstName
+    , udEnrollmentStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.AssociateContactWithAddressBook
+import Network.AWS.AlexaBusiness.AssociateDeviceWithRoom
+import Network.AWS.AlexaBusiness.AssociateSkillGroupWithRoom
+import Network.AWS.AlexaBusiness.CreateAddressBook
+import Network.AWS.AlexaBusiness.CreateContact
+import Network.AWS.AlexaBusiness.CreateProfile
+import Network.AWS.AlexaBusiness.CreateRoom
+import Network.AWS.AlexaBusiness.CreateSkillGroup
+import Network.AWS.AlexaBusiness.CreateUser
+import Network.AWS.AlexaBusiness.DeleteAddressBook
+import Network.AWS.AlexaBusiness.DeleteContact
+import Network.AWS.AlexaBusiness.DeleteProfile
+import Network.AWS.AlexaBusiness.DeleteRoom
+import Network.AWS.AlexaBusiness.DeleteRoomSkillParameter
+import Network.AWS.AlexaBusiness.DeleteSkillGroup
+import Network.AWS.AlexaBusiness.DeleteUser
+import Network.AWS.AlexaBusiness.DisassociateContactFromAddressBook
+import Network.AWS.AlexaBusiness.DisassociateDeviceFromRoom
+import Network.AWS.AlexaBusiness.DisassociateSkillGroupFromRoom
+import Network.AWS.AlexaBusiness.GetAddressBook
+import Network.AWS.AlexaBusiness.GetContact
+import Network.AWS.AlexaBusiness.GetDevice
+import Network.AWS.AlexaBusiness.GetProfile
+import Network.AWS.AlexaBusiness.GetRoom
+import Network.AWS.AlexaBusiness.GetRoomSkillParameter
+import Network.AWS.AlexaBusiness.GetSkillGroup
+import Network.AWS.AlexaBusiness.ListDeviceEvents
+import Network.AWS.AlexaBusiness.ListSkills
+import Network.AWS.AlexaBusiness.ListTags
+import Network.AWS.AlexaBusiness.PutRoomSkillParameter
+import Network.AWS.AlexaBusiness.ResolveRoom
+import Network.AWS.AlexaBusiness.RevokeInvitation
+import Network.AWS.AlexaBusiness.SearchAddressBooks
+import Network.AWS.AlexaBusiness.SearchContacts
+import Network.AWS.AlexaBusiness.SearchDevices
+import Network.AWS.AlexaBusiness.SearchProfiles
+import Network.AWS.AlexaBusiness.SearchRooms
+import Network.AWS.AlexaBusiness.SearchSkillGroups
+import Network.AWS.AlexaBusiness.SearchUsers
+import Network.AWS.AlexaBusiness.SendInvitation
+import Network.AWS.AlexaBusiness.StartDeviceSync
+import Network.AWS.AlexaBusiness.TagResource
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.UntagResource
+import Network.AWS.AlexaBusiness.UpdateAddressBook
+import Network.AWS.AlexaBusiness.UpdateContact
+import Network.AWS.AlexaBusiness.UpdateDevice
+import Network.AWS.AlexaBusiness.UpdateProfile
+import Network.AWS.AlexaBusiness.UpdateRoom
+import Network.AWS.AlexaBusiness.UpdateSkillGroup
+import Network.AWS.AlexaBusiness.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 'AlexaBusiness'.
+-}
+
+{- $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/AlexaBusiness/AssociateContactWithAddressBook.hs b/gen/Network/AWS/AlexaBusiness/AssociateContactWithAddressBook.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/AssociateContactWithAddressBook.hs
@@ -0,0 +1,144 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.AlexaBusiness.AssociateContactWithAddressBook
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Associates a contact with a given address book.
+--
+--
+module Network.AWS.AlexaBusiness.AssociateContactWithAddressBook
+    (
+    -- * Creating a Request
+      associateContactWithAddressBook
+    , AssociateContactWithAddressBook
+    -- * Request Lenses
+    , acwabContactARN
+    , acwabAddressBookARN
+
+    -- * Destructuring the Response
+    , associateContactWithAddressBookResponse
+    , AssociateContactWithAddressBookResponse
+    -- * Response Lenses
+    , acwabrsResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'associateContactWithAddressBook' smart constructor.
+data AssociateContactWithAddressBook = AssociateContactWithAddressBook'
+  { _acwabContactARN     :: !Text
+  , _acwabAddressBookARN :: !Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'AssociateContactWithAddressBook' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'acwabContactARN' - The ARN of the contact to associate with an address book.
+--
+-- * 'acwabAddressBookARN' - The ARN of the address book with which to associate the contact.
+associateContactWithAddressBook
+    :: Text -- ^ 'acwabContactARN'
+    -> Text -- ^ 'acwabAddressBookARN'
+    -> AssociateContactWithAddressBook
+associateContactWithAddressBook pContactARN_ pAddressBookARN_ =
+  AssociateContactWithAddressBook'
+    {_acwabContactARN = pContactARN_, _acwabAddressBookARN = pAddressBookARN_}
+
+
+-- | The ARN of the contact to associate with an address book.
+acwabContactARN :: Lens' AssociateContactWithAddressBook Text
+acwabContactARN = lens _acwabContactARN (\ s a -> s{_acwabContactARN = a})
+
+-- | The ARN of the address book with which to associate the contact.
+acwabAddressBookARN :: Lens' AssociateContactWithAddressBook Text
+acwabAddressBookARN = lens _acwabAddressBookARN (\ s a -> s{_acwabAddressBookARN = a})
+
+instance AWSRequest AssociateContactWithAddressBook
+         where
+        type Rs AssociateContactWithAddressBook =
+             AssociateContactWithAddressBookResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveEmpty
+              (\ s h x ->
+                 AssociateContactWithAddressBookResponse' <$>
+                   (pure (fromEnum s)))
+
+instance Hashable AssociateContactWithAddressBook
+         where
+
+instance NFData AssociateContactWithAddressBook where
+
+instance ToHeaders AssociateContactWithAddressBook
+         where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.AssociateContactWithAddressBook"
+                       :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON AssociateContactWithAddressBook where
+        toJSON AssociateContactWithAddressBook'{..}
+          = object
+              (catMaybes
+                 [Just ("ContactArn" .= _acwabContactARN),
+                  Just ("AddressBookArn" .= _acwabAddressBookARN)])
+
+instance ToPath AssociateContactWithAddressBook where
+        toPath = const "/"
+
+instance ToQuery AssociateContactWithAddressBook
+         where
+        toQuery = const mempty
+
+-- | /See:/ 'associateContactWithAddressBookResponse' smart constructor.
+newtype AssociateContactWithAddressBookResponse = AssociateContactWithAddressBookResponse'
+  { _acwabrsResponseStatus :: Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'AssociateContactWithAddressBookResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'acwabrsResponseStatus' - -- | The response status code.
+associateContactWithAddressBookResponse
+    :: Int -- ^ 'acwabrsResponseStatus'
+    -> AssociateContactWithAddressBookResponse
+associateContactWithAddressBookResponse pResponseStatus_ =
+  AssociateContactWithAddressBookResponse'
+    {_acwabrsResponseStatus = pResponseStatus_}
+
+
+-- | -- | The response status code.
+acwabrsResponseStatus :: Lens' AssociateContactWithAddressBookResponse Int
+acwabrsResponseStatus = lens _acwabrsResponseStatus (\ s a -> s{_acwabrsResponseStatus = a})
+
+instance NFData
+           AssociateContactWithAddressBookResponse
+         where
diff --git a/gen/Network/AWS/AlexaBusiness/AssociateDeviceWithRoom.hs b/gen/Network/AWS/AlexaBusiness/AssociateDeviceWithRoom.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/AssociateDeviceWithRoom.hs
@@ -0,0 +1,134 @@
+{-# 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.AlexaBusiness.AssociateDeviceWithRoom
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Associates a device with a given room. This applies all the settings from the room profile to the device, and all the skills in any skill groups added to that room. This operation requires the device to be online, or else a manual sync is required.
+--
+--
+module Network.AWS.AlexaBusiness.AssociateDeviceWithRoom
+    (
+    -- * Creating a Request
+      associateDeviceWithRoom
+    , AssociateDeviceWithRoom
+    -- * Request Lenses
+    , adwrDeviceARN
+    , adwrRoomARN
+
+    -- * Destructuring the Response
+    , associateDeviceWithRoomResponse
+    , AssociateDeviceWithRoomResponse
+    -- * Response Lenses
+    , adwrrsResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'associateDeviceWithRoom' smart constructor.
+data AssociateDeviceWithRoom = AssociateDeviceWithRoom'
+  { _adwrDeviceARN :: !(Maybe Text)
+  , _adwrRoomARN   :: !(Maybe Text)
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'AssociateDeviceWithRoom' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'adwrDeviceARN' - The ARN of the device to associate to a room. Required.
+--
+-- * 'adwrRoomARN' - The ARN of the room with which to associate the device. Required.
+associateDeviceWithRoom
+    :: AssociateDeviceWithRoom
+associateDeviceWithRoom =
+  AssociateDeviceWithRoom' {_adwrDeviceARN = Nothing, _adwrRoomARN = Nothing}
+
+
+-- | The ARN of the device to associate to a room. Required.
+adwrDeviceARN :: Lens' AssociateDeviceWithRoom (Maybe Text)
+adwrDeviceARN = lens _adwrDeviceARN (\ s a -> s{_adwrDeviceARN = a})
+
+-- | The ARN of the room with which to associate the device. Required.
+adwrRoomARN :: Lens' AssociateDeviceWithRoom (Maybe Text)
+adwrRoomARN = lens _adwrRoomARN (\ s a -> s{_adwrRoomARN = a})
+
+instance AWSRequest AssociateDeviceWithRoom where
+        type Rs AssociateDeviceWithRoom =
+             AssociateDeviceWithRoomResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveEmpty
+              (\ s h x ->
+                 AssociateDeviceWithRoomResponse' <$>
+                   (pure (fromEnum s)))
+
+instance Hashable AssociateDeviceWithRoom where
+
+instance NFData AssociateDeviceWithRoom where
+
+instance ToHeaders AssociateDeviceWithRoom where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.AssociateDeviceWithRoom" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON AssociateDeviceWithRoom where
+        toJSON AssociateDeviceWithRoom'{..}
+          = object
+              (catMaybes
+                 [("DeviceArn" .=) <$> _adwrDeviceARN,
+                  ("RoomArn" .=) <$> _adwrRoomARN])
+
+instance ToPath AssociateDeviceWithRoom where
+        toPath = const "/"
+
+instance ToQuery AssociateDeviceWithRoom where
+        toQuery = const mempty
+
+-- | /See:/ 'associateDeviceWithRoomResponse' smart constructor.
+newtype AssociateDeviceWithRoomResponse = AssociateDeviceWithRoomResponse'
+  { _adwrrsResponseStatus :: Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'AssociateDeviceWithRoomResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'adwrrsResponseStatus' - -- | The response status code.
+associateDeviceWithRoomResponse
+    :: Int -- ^ 'adwrrsResponseStatus'
+    -> AssociateDeviceWithRoomResponse
+associateDeviceWithRoomResponse pResponseStatus_ =
+  AssociateDeviceWithRoomResponse' {_adwrrsResponseStatus = pResponseStatus_}
+
+
+-- | -- | The response status code.
+adwrrsResponseStatus :: Lens' AssociateDeviceWithRoomResponse Int
+adwrrsResponseStatus = lens _adwrrsResponseStatus (\ s a -> s{_adwrrsResponseStatus = a})
+
+instance NFData AssociateDeviceWithRoomResponse where
diff --git a/gen/Network/AWS/AlexaBusiness/AssociateSkillGroupWithRoom.hs b/gen/Network/AWS/AlexaBusiness/AssociateSkillGroupWithRoom.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/AssociateSkillGroupWithRoom.hs
@@ -0,0 +1,137 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.AlexaBusiness.AssociateSkillGroupWithRoom
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Associates a skill group with a given room. This enables all skills in the associated skill group on all devices in the room.
+--
+--
+module Network.AWS.AlexaBusiness.AssociateSkillGroupWithRoom
+    (
+    -- * Creating a Request
+      associateSkillGroupWithRoom
+    , AssociateSkillGroupWithRoom
+    -- * Request Lenses
+    , asgwrSkillGroupARN
+    , asgwrRoomARN
+
+    -- * Destructuring the Response
+    , associateSkillGroupWithRoomResponse
+    , AssociateSkillGroupWithRoomResponse
+    -- * Response Lenses
+    , asgwrrsResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'associateSkillGroupWithRoom' smart constructor.
+data AssociateSkillGroupWithRoom = AssociateSkillGroupWithRoom'
+  { _asgwrSkillGroupARN :: !(Maybe Text)
+  , _asgwrRoomARN       :: !(Maybe Text)
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'AssociateSkillGroupWithRoom' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'asgwrSkillGroupARN' - The ARN of the skill group to associate with a room. Required.
+--
+-- * 'asgwrRoomARN' - The ARN of the room with which to associate the skill group. Required.
+associateSkillGroupWithRoom
+    :: AssociateSkillGroupWithRoom
+associateSkillGroupWithRoom =
+  AssociateSkillGroupWithRoom'
+    {_asgwrSkillGroupARN = Nothing, _asgwrRoomARN = Nothing}
+
+
+-- | The ARN of the skill group to associate with a room. Required.
+asgwrSkillGroupARN :: Lens' AssociateSkillGroupWithRoom (Maybe Text)
+asgwrSkillGroupARN = lens _asgwrSkillGroupARN (\ s a -> s{_asgwrSkillGroupARN = a})
+
+-- | The ARN of the room with which to associate the skill group. Required.
+asgwrRoomARN :: Lens' AssociateSkillGroupWithRoom (Maybe Text)
+asgwrRoomARN = lens _asgwrRoomARN (\ s a -> s{_asgwrRoomARN = a})
+
+instance AWSRequest AssociateSkillGroupWithRoom where
+        type Rs AssociateSkillGroupWithRoom =
+             AssociateSkillGroupWithRoomResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveEmpty
+              (\ s h x ->
+                 AssociateSkillGroupWithRoomResponse' <$>
+                   (pure (fromEnum s)))
+
+instance Hashable AssociateSkillGroupWithRoom where
+
+instance NFData AssociateSkillGroupWithRoom where
+
+instance ToHeaders AssociateSkillGroupWithRoom where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.AssociateSkillGroupWithRoom" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON AssociateSkillGroupWithRoom where
+        toJSON AssociateSkillGroupWithRoom'{..}
+          = object
+              (catMaybes
+                 [("SkillGroupArn" .=) <$> _asgwrSkillGroupARN,
+                  ("RoomArn" .=) <$> _asgwrRoomARN])
+
+instance ToPath AssociateSkillGroupWithRoom where
+        toPath = const "/"
+
+instance ToQuery AssociateSkillGroupWithRoom where
+        toQuery = const mempty
+
+-- | /See:/ 'associateSkillGroupWithRoomResponse' smart constructor.
+newtype AssociateSkillGroupWithRoomResponse = AssociateSkillGroupWithRoomResponse'
+  { _asgwrrsResponseStatus :: Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'AssociateSkillGroupWithRoomResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'asgwrrsResponseStatus' - -- | The response status code.
+associateSkillGroupWithRoomResponse
+    :: Int -- ^ 'asgwrrsResponseStatus'
+    -> AssociateSkillGroupWithRoomResponse
+associateSkillGroupWithRoomResponse pResponseStatus_ =
+  AssociateSkillGroupWithRoomResponse'
+    {_asgwrrsResponseStatus = pResponseStatus_}
+
+
+-- | -- | The response status code.
+asgwrrsResponseStatus :: Lens' AssociateSkillGroupWithRoomResponse Int
+asgwrrsResponseStatus = lens _asgwrrsResponseStatus (\ s a -> s{_asgwrrsResponseStatus = a})
+
+instance NFData AssociateSkillGroupWithRoomResponse
+         where
diff --git a/gen/Network/AWS/AlexaBusiness/CreateAddressBook.hs b/gen/Network/AWS/AlexaBusiness/CreateAddressBook.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/CreateAddressBook.hs
@@ -0,0 +1,156 @@
+{-# 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.AlexaBusiness.CreateAddressBook
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates an address book with the specified details.
+--
+--
+module Network.AWS.AlexaBusiness.CreateAddressBook
+    (
+    -- * Creating a Request
+      createAddressBook
+    , CreateAddressBook
+    -- * Request Lenses
+    , cabClientRequestToken
+    , cabDescription
+    , cabName
+
+    -- * Destructuring the Response
+    , createAddressBookResponse
+    , CreateAddressBookResponse
+    -- * Response Lenses
+    , cabrsAddressBookARN
+    , cabrsResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'createAddressBook' smart constructor.
+data CreateAddressBook = CreateAddressBook'
+  { _cabClientRequestToken :: !(Maybe Text)
+  , _cabDescription        :: !(Maybe Text)
+  , _cabName               :: !Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'CreateAddressBook' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cabClientRequestToken' - A unique, user-specified identifier for the request that ensures idempotency.
+--
+-- * 'cabDescription' - The description of the address book.
+--
+-- * 'cabName' - The name of the address book.
+createAddressBook
+    :: Text -- ^ 'cabName'
+    -> CreateAddressBook
+createAddressBook pName_ =
+  CreateAddressBook'
+    { _cabClientRequestToken = Nothing
+    , _cabDescription = Nothing
+    , _cabName = pName_
+    }
+
+
+-- | A unique, user-specified identifier for the request that ensures idempotency.
+cabClientRequestToken :: Lens' CreateAddressBook (Maybe Text)
+cabClientRequestToken = lens _cabClientRequestToken (\ s a -> s{_cabClientRequestToken = a})
+
+-- | The description of the address book.
+cabDescription :: Lens' CreateAddressBook (Maybe Text)
+cabDescription = lens _cabDescription (\ s a -> s{_cabDescription = a})
+
+-- | The name of the address book.
+cabName :: Lens' CreateAddressBook Text
+cabName = lens _cabName (\ s a -> s{_cabName = a})
+
+instance AWSRequest CreateAddressBook where
+        type Rs CreateAddressBook = CreateAddressBookResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveJSON
+              (\ s h x ->
+                 CreateAddressBookResponse' <$>
+                   (x .?> "AddressBookArn") <*> (pure (fromEnum s)))
+
+instance Hashable CreateAddressBook where
+
+instance NFData CreateAddressBook where
+
+instance ToHeaders CreateAddressBook where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.CreateAddressBook" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON CreateAddressBook where
+        toJSON CreateAddressBook'{..}
+          = object
+              (catMaybes
+                 [("ClientRequestToken" .=) <$>
+                    _cabClientRequestToken,
+                  ("Description" .=) <$> _cabDescription,
+                  Just ("Name" .= _cabName)])
+
+instance ToPath CreateAddressBook where
+        toPath = const "/"
+
+instance ToQuery CreateAddressBook where
+        toQuery = const mempty
+
+-- | /See:/ 'createAddressBookResponse' smart constructor.
+data CreateAddressBookResponse = CreateAddressBookResponse'
+  { _cabrsAddressBookARN :: !(Maybe Text)
+  , _cabrsResponseStatus :: !Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'CreateAddressBookResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cabrsAddressBookARN' - The ARN of the newly created address book.
+--
+-- * 'cabrsResponseStatus' - -- | The response status code.
+createAddressBookResponse
+    :: Int -- ^ 'cabrsResponseStatus'
+    -> CreateAddressBookResponse
+createAddressBookResponse pResponseStatus_ =
+  CreateAddressBookResponse'
+    {_cabrsAddressBookARN = Nothing, _cabrsResponseStatus = pResponseStatus_}
+
+
+-- | The ARN of the newly created address book.
+cabrsAddressBookARN :: Lens' CreateAddressBookResponse (Maybe Text)
+cabrsAddressBookARN = lens _cabrsAddressBookARN (\ s a -> s{_cabrsAddressBookARN = a})
+
+-- | -- | The response status code.
+cabrsResponseStatus :: Lens' CreateAddressBookResponse Int
+cabrsResponseStatus = lens _cabrsResponseStatus (\ s a -> s{_cabrsResponseStatus = a})
+
+instance NFData CreateAddressBookResponse where
diff --git a/gen/Network/AWS/AlexaBusiness/CreateContact.hs b/gen/Network/AWS/AlexaBusiness/CreateContact.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/CreateContact.hs
@@ -0,0 +1,176 @@
+{-# 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.AlexaBusiness.CreateContact
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a contact with the specified details.
+--
+--
+module Network.AWS.AlexaBusiness.CreateContact
+    (
+    -- * Creating a Request
+      createContact
+    , CreateContact
+    -- * Request Lenses
+    , ccLastName
+    , ccDisplayName
+    , ccClientRequestToken
+    , ccFirstName
+    , ccPhoneNumber
+
+    -- * Destructuring the Response
+    , createContactResponse
+    , CreateContactResponse
+    -- * Response Lenses
+    , ccrsContactARN
+    , ccrsResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'createContact' smart constructor.
+data CreateContact = CreateContact'
+  { _ccLastName           :: !(Maybe Text)
+  , _ccDisplayName        :: !(Maybe Text)
+  , _ccClientRequestToken :: !(Maybe Text)
+  , _ccFirstName          :: !Text
+  , _ccPhoneNumber        :: !Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'CreateContact' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ccLastName' - The last name of the contact that is used to call the contact on the device.
+--
+-- * 'ccDisplayName' - The name of the contact to display on the console.
+--
+-- * 'ccClientRequestToken' - A unique, user-specified identifier for this request that ensures idempotency.
+--
+-- * 'ccFirstName' - The first name of the contact that is used to call the contact on the device.
+--
+-- * 'ccPhoneNumber' - The phone number of the contact in E.164 format.
+createContact
+    :: Text -- ^ 'ccFirstName'
+    -> Text -- ^ 'ccPhoneNumber'
+    -> CreateContact
+createContact pFirstName_ pPhoneNumber_ =
+  CreateContact'
+    { _ccLastName = Nothing
+    , _ccDisplayName = Nothing
+    , _ccClientRequestToken = Nothing
+    , _ccFirstName = pFirstName_
+    , _ccPhoneNumber = pPhoneNumber_
+    }
+
+
+-- | The last name of the contact that is used to call the contact on the device.
+ccLastName :: Lens' CreateContact (Maybe Text)
+ccLastName = lens _ccLastName (\ s a -> s{_ccLastName = a})
+
+-- | The name of the contact to display on the console.
+ccDisplayName :: Lens' CreateContact (Maybe Text)
+ccDisplayName = lens _ccDisplayName (\ s a -> s{_ccDisplayName = a})
+
+-- | A unique, user-specified identifier for this request that ensures idempotency.
+ccClientRequestToken :: Lens' CreateContact (Maybe Text)
+ccClientRequestToken = lens _ccClientRequestToken (\ s a -> s{_ccClientRequestToken = a})
+
+-- | The first name of the contact that is used to call the contact on the device.
+ccFirstName :: Lens' CreateContact Text
+ccFirstName = lens _ccFirstName (\ s a -> s{_ccFirstName = a})
+
+-- | The phone number of the contact in E.164 format.
+ccPhoneNumber :: Lens' CreateContact Text
+ccPhoneNumber = lens _ccPhoneNumber (\ s a -> s{_ccPhoneNumber = a})
+
+instance AWSRequest CreateContact where
+        type Rs CreateContact = CreateContactResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveJSON
+              (\ s h x ->
+                 CreateContactResponse' <$>
+                   (x .?> "ContactArn") <*> (pure (fromEnum s)))
+
+instance Hashable CreateContact where
+
+instance NFData CreateContact where
+
+instance ToHeaders CreateContact where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.CreateContact" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON CreateContact where
+        toJSON CreateContact'{..}
+          = object
+              (catMaybes
+                 [("LastName" .=) <$> _ccLastName,
+                  ("DisplayName" .=) <$> _ccDisplayName,
+                  ("ClientRequestToken" .=) <$> _ccClientRequestToken,
+                  Just ("FirstName" .= _ccFirstName),
+                  Just ("PhoneNumber" .= _ccPhoneNumber)])
+
+instance ToPath CreateContact where
+        toPath = const "/"
+
+instance ToQuery CreateContact where
+        toQuery = const mempty
+
+-- | /See:/ 'createContactResponse' smart constructor.
+data CreateContactResponse = CreateContactResponse'
+  { _ccrsContactARN     :: !(Maybe Text)
+  , _ccrsResponseStatus :: !Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'CreateContactResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ccrsContactARN' - The ARN of the newly created address book.
+--
+-- * 'ccrsResponseStatus' - -- | The response status code.
+createContactResponse
+    :: Int -- ^ 'ccrsResponseStatus'
+    -> CreateContactResponse
+createContactResponse pResponseStatus_ =
+  CreateContactResponse'
+    {_ccrsContactARN = Nothing, _ccrsResponseStatus = pResponseStatus_}
+
+
+-- | The ARN of the newly created address book.
+ccrsContactARN :: Lens' CreateContactResponse (Maybe Text)
+ccrsContactARN = lens _ccrsContactARN (\ s a -> s{_ccrsContactARN = a})
+
+-- | -- | The response status code.
+ccrsResponseStatus :: Lens' CreateContactResponse Int
+ccrsResponseStatus = lens _ccrsResponseStatus (\ s a -> s{_ccrsResponseStatus = a})
+
+instance NFData CreateContactResponse where
diff --git a/gen/Network/AWS/AlexaBusiness/CreateProfile.hs b/gen/Network/AWS/AlexaBusiness/CreateProfile.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/CreateProfile.hs
@@ -0,0 +1,230 @@
+{-# 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.AlexaBusiness.CreateProfile
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a new room profile with the specified details.
+--
+--
+module Network.AWS.AlexaBusiness.CreateProfile
+    (
+    -- * Creating a Request
+      createProfile
+    , CreateProfile
+    -- * Request Lenses
+    , cpSetupModeDisabled
+    , cpPSTNEnabled
+    , cpClientRequestToken
+    , cpMaxVolumeLimit
+    , cpProfileName
+    , cpTimezone
+    , cpAddress
+    , cpDistanceUnit
+    , cpTemperatureUnit
+    , cpWakeWord
+
+    -- * Destructuring the Response
+    , createProfileResponse
+    , CreateProfileResponse
+    -- * Response Lenses
+    , cprsProfileARN
+    , cprsResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'createProfile' smart constructor.
+data CreateProfile = CreateProfile'
+  { _cpSetupModeDisabled  :: !(Maybe Bool)
+  , _cpPSTNEnabled        :: !(Maybe Bool)
+  , _cpClientRequestToken :: !(Maybe Text)
+  , _cpMaxVolumeLimit     :: !(Maybe Int)
+  , _cpProfileName        :: !Text
+  , _cpTimezone           :: !Text
+  , _cpAddress            :: !Text
+  , _cpDistanceUnit       :: !DistanceUnit
+  , _cpTemperatureUnit    :: !TemperatureUnit
+  , _cpWakeWord           :: !WakeWord
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'CreateProfile' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cpSetupModeDisabled' - Whether room profile setup is enabled.
+--
+-- * 'cpPSTNEnabled' - Whether PSTN calling is enabled.
+--
+-- * 'cpClientRequestToken' - The user-specified token that is used during the creation of a profile.
+--
+-- * 'cpMaxVolumeLimit' - The maximum volume limit for a room profile.
+--
+-- * 'cpProfileName' - The name of a room profile.
+--
+-- * 'cpTimezone' - The time zone used by a room profile.
+--
+-- * 'cpAddress' - The valid address for the room.
+--
+-- * 'cpDistanceUnit' - The distance unit to be used by devices in the profile.
+--
+-- * 'cpTemperatureUnit' - The temperature unit to be used by devices in the profile.
+--
+-- * 'cpWakeWord' - A wake word for Alexa, Echo, Amazon, or a computer.
+createProfile
+    :: Text -- ^ 'cpProfileName'
+    -> Text -- ^ 'cpTimezone'
+    -> Text -- ^ 'cpAddress'
+    -> DistanceUnit -- ^ 'cpDistanceUnit'
+    -> TemperatureUnit -- ^ 'cpTemperatureUnit'
+    -> WakeWord -- ^ 'cpWakeWord'
+    -> CreateProfile
+createProfile pProfileName_ pTimezone_ pAddress_ pDistanceUnit_ pTemperatureUnit_ pWakeWord_ =
+  CreateProfile'
+    { _cpSetupModeDisabled = Nothing
+    , _cpPSTNEnabled = Nothing
+    , _cpClientRequestToken = Nothing
+    , _cpMaxVolumeLimit = Nothing
+    , _cpProfileName = pProfileName_
+    , _cpTimezone = pTimezone_
+    , _cpAddress = pAddress_
+    , _cpDistanceUnit = pDistanceUnit_
+    , _cpTemperatureUnit = pTemperatureUnit_
+    , _cpWakeWord = pWakeWord_
+    }
+
+
+-- | Whether room profile setup is enabled.
+cpSetupModeDisabled :: Lens' CreateProfile (Maybe Bool)
+cpSetupModeDisabled = lens _cpSetupModeDisabled (\ s a -> s{_cpSetupModeDisabled = a})
+
+-- | Whether PSTN calling is enabled.
+cpPSTNEnabled :: Lens' CreateProfile (Maybe Bool)
+cpPSTNEnabled = lens _cpPSTNEnabled (\ s a -> s{_cpPSTNEnabled = a})
+
+-- | The user-specified token that is used during the creation of a profile.
+cpClientRequestToken :: Lens' CreateProfile (Maybe Text)
+cpClientRequestToken = lens _cpClientRequestToken (\ s a -> s{_cpClientRequestToken = a})
+
+-- | The maximum volume limit for a room profile.
+cpMaxVolumeLimit :: Lens' CreateProfile (Maybe Int)
+cpMaxVolumeLimit = lens _cpMaxVolumeLimit (\ s a -> s{_cpMaxVolumeLimit = a})
+
+-- | The name of a room profile.
+cpProfileName :: Lens' CreateProfile Text
+cpProfileName = lens _cpProfileName (\ s a -> s{_cpProfileName = a})
+
+-- | The time zone used by a room profile.
+cpTimezone :: Lens' CreateProfile Text
+cpTimezone = lens _cpTimezone (\ s a -> s{_cpTimezone = a})
+
+-- | The valid address for the room.
+cpAddress :: Lens' CreateProfile Text
+cpAddress = lens _cpAddress (\ s a -> s{_cpAddress = a})
+
+-- | The distance unit to be used by devices in the profile.
+cpDistanceUnit :: Lens' CreateProfile DistanceUnit
+cpDistanceUnit = lens _cpDistanceUnit (\ s a -> s{_cpDistanceUnit = a})
+
+-- | The temperature unit to be used by devices in the profile.
+cpTemperatureUnit :: Lens' CreateProfile TemperatureUnit
+cpTemperatureUnit = lens _cpTemperatureUnit (\ s a -> s{_cpTemperatureUnit = a})
+
+-- | A wake word for Alexa, Echo, Amazon, or a computer.
+cpWakeWord :: Lens' CreateProfile WakeWord
+cpWakeWord = lens _cpWakeWord (\ s a -> s{_cpWakeWord = a})
+
+instance AWSRequest CreateProfile where
+        type Rs CreateProfile = CreateProfileResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveJSON
+              (\ s h x ->
+                 CreateProfileResponse' <$>
+                   (x .?> "ProfileArn") <*> (pure (fromEnum s)))
+
+instance Hashable CreateProfile where
+
+instance NFData CreateProfile where
+
+instance ToHeaders CreateProfile where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.CreateProfile" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON CreateProfile where
+        toJSON CreateProfile'{..}
+          = object
+              (catMaybes
+                 [("SetupModeDisabled" .=) <$> _cpSetupModeDisabled,
+                  ("PSTNEnabled" .=) <$> _cpPSTNEnabled,
+                  ("ClientRequestToken" .=) <$> _cpClientRequestToken,
+                  ("MaxVolumeLimit" .=) <$> _cpMaxVolumeLimit,
+                  Just ("ProfileName" .= _cpProfileName),
+                  Just ("Timezone" .= _cpTimezone),
+                  Just ("Address" .= _cpAddress),
+                  Just ("DistanceUnit" .= _cpDistanceUnit),
+                  Just ("TemperatureUnit" .= _cpTemperatureUnit),
+                  Just ("WakeWord" .= _cpWakeWord)])
+
+instance ToPath CreateProfile where
+        toPath = const "/"
+
+instance ToQuery CreateProfile where
+        toQuery = const mempty
+
+-- | /See:/ 'createProfileResponse' smart constructor.
+data CreateProfileResponse = CreateProfileResponse'
+  { _cprsProfileARN     :: !(Maybe Text)
+  , _cprsResponseStatus :: !Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'CreateProfileResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cprsProfileARN' - The ARN of the newly created room profile in the response.
+--
+-- * 'cprsResponseStatus' - -- | The response status code.
+createProfileResponse
+    :: Int -- ^ 'cprsResponseStatus'
+    -> CreateProfileResponse
+createProfileResponse pResponseStatus_ =
+  CreateProfileResponse'
+    {_cprsProfileARN = Nothing, _cprsResponseStatus = pResponseStatus_}
+
+
+-- | The ARN of the newly created room profile in the response.
+cprsProfileARN :: Lens' CreateProfileResponse (Maybe Text)
+cprsProfileARN = lens _cprsProfileARN (\ s a -> s{_cprsProfileARN = a})
+
+-- | -- | The response status code.
+cprsResponseStatus :: Lens' CreateProfileResponse Int
+cprsResponseStatus = lens _cprsResponseStatus (\ s a -> s{_cprsResponseStatus = a})
+
+instance NFData CreateProfileResponse where
diff --git a/gen/Network/AWS/AlexaBusiness/CreateRoom.hs b/gen/Network/AWS/AlexaBusiness/CreateRoom.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/CreateRoom.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.AlexaBusiness.CreateRoom
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a room with the specified details.
+--
+--
+module Network.AWS.AlexaBusiness.CreateRoom
+    (
+    -- * Creating a Request
+      createRoom
+    , CreateRoom
+    -- * Request Lenses
+    , crProfileARN
+    , crProviderCalendarId
+    , crClientRequestToken
+    , crDescription
+    , crTags
+    , crRoomName
+
+    -- * Destructuring the Response
+    , createRoomResponse
+    , CreateRoomResponse
+    -- * Response Lenses
+    , crrsRoomARN
+    , crrsResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'createRoom' smart constructor.
+data CreateRoom = CreateRoom'
+  { _crProfileARN         :: !(Maybe Text)
+  , _crProviderCalendarId :: !(Maybe Text)
+  , _crClientRequestToken :: !(Maybe Text)
+  , _crDescription        :: !(Maybe Text)
+  , _crTags               :: !(Maybe [Tag])
+  , _crRoomName           :: !Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'CreateRoom' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'crProfileARN' - The profile ARN for the room.
+--
+-- * 'crProviderCalendarId' - The calendar ARN for the room.
+--
+-- * 'crClientRequestToken' - A unique, user-specified identifier for this request that ensures idempotency.
+--
+-- * 'crDescription' - The description for the room.
+--
+-- * 'crTags' - The tags for the room.
+--
+-- * 'crRoomName' - The name for the room.
+createRoom
+    :: Text -- ^ 'crRoomName'
+    -> CreateRoom
+createRoom pRoomName_ =
+  CreateRoom'
+    { _crProfileARN = Nothing
+    , _crProviderCalendarId = Nothing
+    , _crClientRequestToken = Nothing
+    , _crDescription = Nothing
+    , _crTags = Nothing
+    , _crRoomName = pRoomName_
+    }
+
+
+-- | The profile ARN for the room.
+crProfileARN :: Lens' CreateRoom (Maybe Text)
+crProfileARN = lens _crProfileARN (\ s a -> s{_crProfileARN = a})
+
+-- | The calendar ARN for the room.
+crProviderCalendarId :: Lens' CreateRoom (Maybe Text)
+crProviderCalendarId = lens _crProviderCalendarId (\ s a -> s{_crProviderCalendarId = a})
+
+-- | A unique, user-specified identifier for this request that ensures idempotency.
+crClientRequestToken :: Lens' CreateRoom (Maybe Text)
+crClientRequestToken = lens _crClientRequestToken (\ s a -> s{_crClientRequestToken = a})
+
+-- | The description for the room.
+crDescription :: Lens' CreateRoom (Maybe Text)
+crDescription = lens _crDescription (\ s a -> s{_crDescription = a})
+
+-- | The tags for the room.
+crTags :: Lens' CreateRoom [Tag]
+crTags = lens _crTags (\ s a -> s{_crTags = a}) . _Default . _Coerce
+
+-- | The name for the room.
+crRoomName :: Lens' CreateRoom Text
+crRoomName = lens _crRoomName (\ s a -> s{_crRoomName = a})
+
+instance AWSRequest CreateRoom where
+        type Rs CreateRoom = CreateRoomResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveJSON
+              (\ s h x ->
+                 CreateRoomResponse' <$>
+                   (x .?> "RoomArn") <*> (pure (fromEnum s)))
+
+instance Hashable CreateRoom where
+
+instance NFData CreateRoom where
+
+instance ToHeaders CreateRoom where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.CreateRoom" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON CreateRoom where
+        toJSON CreateRoom'{..}
+          = object
+              (catMaybes
+                 [("ProfileArn" .=) <$> _crProfileARN,
+                  ("ProviderCalendarId" .=) <$> _crProviderCalendarId,
+                  ("ClientRequestToken" .=) <$> _crClientRequestToken,
+                  ("Description" .=) <$> _crDescription,
+                  ("Tags" .=) <$> _crTags,
+                  Just ("RoomName" .= _crRoomName)])
+
+instance ToPath CreateRoom where
+        toPath = const "/"
+
+instance ToQuery CreateRoom where
+        toQuery = const mempty
+
+-- | /See:/ 'createRoomResponse' smart constructor.
+data CreateRoomResponse = CreateRoomResponse'
+  { _crrsRoomARN        :: !(Maybe Text)
+  , _crrsResponseStatus :: !Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'CreateRoomResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'crrsRoomARN' - The ARN of the newly created room in the response.
+--
+-- * 'crrsResponseStatus' - -- | The response status code.
+createRoomResponse
+    :: Int -- ^ 'crrsResponseStatus'
+    -> CreateRoomResponse
+createRoomResponse pResponseStatus_ =
+  CreateRoomResponse'
+    {_crrsRoomARN = Nothing, _crrsResponseStatus = pResponseStatus_}
+
+
+-- | The ARN of the newly created room in the response.
+crrsRoomARN :: Lens' CreateRoomResponse (Maybe Text)
+crrsRoomARN = lens _crrsRoomARN (\ s a -> s{_crrsRoomARN = a})
+
+-- | -- | The response status code.
+crrsResponseStatus :: Lens' CreateRoomResponse Int
+crrsResponseStatus = lens _crrsResponseStatus (\ s a -> s{_crrsResponseStatus = a})
+
+instance NFData CreateRoomResponse where
diff --git a/gen/Network/AWS/AlexaBusiness/CreateSkillGroup.hs b/gen/Network/AWS/AlexaBusiness/CreateSkillGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/CreateSkillGroup.hs
@@ -0,0 +1,156 @@
+{-# 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.AlexaBusiness.CreateSkillGroup
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a skill group with a specified name and description.
+--
+--
+module Network.AWS.AlexaBusiness.CreateSkillGroup
+    (
+    -- * Creating a Request
+      createSkillGroup
+    , CreateSkillGroup
+    -- * Request Lenses
+    , csgClientRequestToken
+    , csgDescription
+    , csgSkillGroupName
+
+    -- * Destructuring the Response
+    , createSkillGroupResponse
+    , CreateSkillGroupResponse
+    -- * Response Lenses
+    , csgrsSkillGroupARN
+    , csgrsResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'createSkillGroup' smart constructor.
+data CreateSkillGroup = CreateSkillGroup'
+  { _csgClientRequestToken :: !(Maybe Text)
+  , _csgDescription        :: !(Maybe Text)
+  , _csgSkillGroupName     :: !Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'CreateSkillGroup' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'csgClientRequestToken' - A unique, user-specified identifier for this request that ensures idempotency.
+--
+-- * 'csgDescription' - The description for the skill group.
+--
+-- * 'csgSkillGroupName' - The name for the skill group.
+createSkillGroup
+    :: Text -- ^ 'csgSkillGroupName'
+    -> CreateSkillGroup
+createSkillGroup pSkillGroupName_ =
+  CreateSkillGroup'
+    { _csgClientRequestToken = Nothing
+    , _csgDescription = Nothing
+    , _csgSkillGroupName = pSkillGroupName_
+    }
+
+
+-- | A unique, user-specified identifier for this request that ensures idempotency.
+csgClientRequestToken :: Lens' CreateSkillGroup (Maybe Text)
+csgClientRequestToken = lens _csgClientRequestToken (\ s a -> s{_csgClientRequestToken = a})
+
+-- | The description for the skill group.
+csgDescription :: Lens' CreateSkillGroup (Maybe Text)
+csgDescription = lens _csgDescription (\ s a -> s{_csgDescription = a})
+
+-- | The name for the skill group.
+csgSkillGroupName :: Lens' CreateSkillGroup Text
+csgSkillGroupName = lens _csgSkillGroupName (\ s a -> s{_csgSkillGroupName = a})
+
+instance AWSRequest CreateSkillGroup where
+        type Rs CreateSkillGroup = CreateSkillGroupResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveJSON
+              (\ s h x ->
+                 CreateSkillGroupResponse' <$>
+                   (x .?> "SkillGroupArn") <*> (pure (fromEnum s)))
+
+instance Hashable CreateSkillGroup where
+
+instance NFData CreateSkillGroup where
+
+instance ToHeaders CreateSkillGroup where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.CreateSkillGroup" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON CreateSkillGroup where
+        toJSON CreateSkillGroup'{..}
+          = object
+              (catMaybes
+                 [("ClientRequestToken" .=) <$>
+                    _csgClientRequestToken,
+                  ("Description" .=) <$> _csgDescription,
+                  Just ("SkillGroupName" .= _csgSkillGroupName)])
+
+instance ToPath CreateSkillGroup where
+        toPath = const "/"
+
+instance ToQuery CreateSkillGroup where
+        toQuery = const mempty
+
+-- | /See:/ 'createSkillGroupResponse' smart constructor.
+data CreateSkillGroupResponse = CreateSkillGroupResponse'
+  { _csgrsSkillGroupARN  :: !(Maybe Text)
+  , _csgrsResponseStatus :: !Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'CreateSkillGroupResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'csgrsSkillGroupARN' - The ARN of the newly created skill group in the response.
+--
+-- * 'csgrsResponseStatus' - -- | The response status code.
+createSkillGroupResponse
+    :: Int -- ^ 'csgrsResponseStatus'
+    -> CreateSkillGroupResponse
+createSkillGroupResponse pResponseStatus_ =
+  CreateSkillGroupResponse'
+    {_csgrsSkillGroupARN = Nothing, _csgrsResponseStatus = pResponseStatus_}
+
+
+-- | The ARN of the newly created skill group in the response.
+csgrsSkillGroupARN :: Lens' CreateSkillGroupResponse (Maybe Text)
+csgrsSkillGroupARN = lens _csgrsSkillGroupARN (\ s a -> s{_csgrsSkillGroupARN = a})
+
+-- | -- | The response status code.
+csgrsResponseStatus :: Lens' CreateSkillGroupResponse Int
+csgrsResponseStatus = lens _csgrsResponseStatus (\ s a -> s{_csgrsResponseStatus = a})
+
+instance NFData CreateSkillGroupResponse where
diff --git a/gen/Network/AWS/AlexaBusiness/CreateUser.hs b/gen/Network/AWS/AlexaBusiness/CreateUser.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/CreateUser.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.AlexaBusiness.CreateUser
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a user.
+--
+--
+module Network.AWS.AlexaBusiness.CreateUser
+    (
+    -- * Creating a Request
+      createUser
+    , CreateUser
+    -- * Request Lenses
+    , cuEmail
+    , cuLastName
+    , cuFirstName
+    , cuClientRequestToken
+    , cuTags
+    , cuUserId
+
+    -- * Destructuring the Response
+    , createUserResponse
+    , CreateUserResponse
+    -- * Response Lenses
+    , cursUserARN
+    , cursResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'createUser' smart constructor.
+data CreateUser = CreateUser'
+  { _cuEmail              :: !(Maybe Text)
+  , _cuLastName           :: !(Maybe Text)
+  , _cuFirstName          :: !(Maybe Text)
+  , _cuClientRequestToken :: !(Maybe Text)
+  , _cuTags               :: !(Maybe [Tag])
+  , _cuUserId             :: !Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'CreateUser' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cuEmail' - The email address for the user.
+--
+-- * 'cuLastName' - The last name for the user.
+--
+-- * 'cuFirstName' - The first name for the user.
+--
+-- * 'cuClientRequestToken' - A unique, user-specified identifier for this request that ensures idempotency.
+--
+-- * 'cuTags' - The tags for the user.
+--
+-- * 'cuUserId' - The ARN for the user.
+createUser
+    :: Text -- ^ 'cuUserId'
+    -> CreateUser
+createUser pUserId_ =
+  CreateUser'
+    { _cuEmail = Nothing
+    , _cuLastName = Nothing
+    , _cuFirstName = Nothing
+    , _cuClientRequestToken = Nothing
+    , _cuTags = Nothing
+    , _cuUserId = pUserId_
+    }
+
+
+-- | The email address for the user.
+cuEmail :: Lens' CreateUser (Maybe Text)
+cuEmail = lens _cuEmail (\ s a -> s{_cuEmail = a})
+
+-- | The last name for the user.
+cuLastName :: Lens' CreateUser (Maybe Text)
+cuLastName = lens _cuLastName (\ s a -> s{_cuLastName = a})
+
+-- | The first name for the user.
+cuFirstName :: Lens' CreateUser (Maybe Text)
+cuFirstName = lens _cuFirstName (\ s a -> s{_cuFirstName = a})
+
+-- | A unique, user-specified identifier for this request that ensures idempotency.
+cuClientRequestToken :: Lens' CreateUser (Maybe Text)
+cuClientRequestToken = lens _cuClientRequestToken (\ s a -> s{_cuClientRequestToken = a})
+
+-- | The tags for the user.
+cuTags :: Lens' CreateUser [Tag]
+cuTags = lens _cuTags (\ s a -> s{_cuTags = a}) . _Default . _Coerce
+
+-- | The ARN for the user.
+cuUserId :: Lens' CreateUser Text
+cuUserId = lens _cuUserId (\ s a -> s{_cuUserId = a})
+
+instance AWSRequest CreateUser where
+        type Rs CreateUser = CreateUserResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveJSON
+              (\ s h x ->
+                 CreateUserResponse' <$>
+                   (x .?> "UserArn") <*> (pure (fromEnum s)))
+
+instance Hashable CreateUser where
+
+instance NFData CreateUser where
+
+instance ToHeaders CreateUser where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.CreateUser" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON CreateUser where
+        toJSON CreateUser'{..}
+          = object
+              (catMaybes
+                 [("Email" .=) <$> _cuEmail,
+                  ("LastName" .=) <$> _cuLastName,
+                  ("FirstName" .=) <$> _cuFirstName,
+                  ("ClientRequestToken" .=) <$> _cuClientRequestToken,
+                  ("Tags" .=) <$> _cuTags,
+                  Just ("UserId" .= _cuUserId)])
+
+instance ToPath CreateUser where
+        toPath = const "/"
+
+instance ToQuery CreateUser where
+        toQuery = const mempty
+
+-- | /See:/ 'createUserResponse' smart constructor.
+data CreateUserResponse = CreateUserResponse'
+  { _cursUserARN        :: !(Maybe Text)
+  , _cursResponseStatus :: !Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'CreateUserResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cursUserARN' - The ARN of the newly created user in the response.
+--
+-- * 'cursResponseStatus' - -- | The response status code.
+createUserResponse
+    :: Int -- ^ 'cursResponseStatus'
+    -> CreateUserResponse
+createUserResponse pResponseStatus_ =
+  CreateUserResponse'
+    {_cursUserARN = Nothing, _cursResponseStatus = pResponseStatus_}
+
+
+-- | The ARN of the newly created user in the response.
+cursUserARN :: Lens' CreateUserResponse (Maybe Text)
+cursUserARN = lens _cursUserARN (\ s a -> s{_cursUserARN = a})
+
+-- | -- | The response status code.
+cursResponseStatus :: Lens' CreateUserResponse Int
+cursResponseStatus = lens _cursResponseStatus (\ s a -> s{_cursResponseStatus = a})
+
+instance NFData CreateUserResponse where
diff --git a/gen/Network/AWS/AlexaBusiness/DeleteAddressBook.hs b/gen/Network/AWS/AlexaBusiness/DeleteAddressBook.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/DeleteAddressBook.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.AlexaBusiness.DeleteAddressBook
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes an address book by the address book ARN.
+--
+--
+module Network.AWS.AlexaBusiness.DeleteAddressBook
+    (
+    -- * Creating a Request
+      deleteAddressBook
+    , DeleteAddressBook
+    -- * Request Lenses
+    , dabAddressBookARN
+
+    -- * Destructuring the Response
+    , deleteAddressBookResponse
+    , DeleteAddressBookResponse
+    -- * Response Lenses
+    , dabrsResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'deleteAddressBook' smart constructor.
+newtype DeleteAddressBook = DeleteAddressBook'
+  { _dabAddressBookARN :: Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'DeleteAddressBook' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dabAddressBookARN' - The ARN of the address book to delete.
+deleteAddressBook
+    :: Text -- ^ 'dabAddressBookARN'
+    -> DeleteAddressBook
+deleteAddressBook pAddressBookARN_ =
+  DeleteAddressBook' {_dabAddressBookARN = pAddressBookARN_}
+
+
+-- | The ARN of the address book to delete.
+dabAddressBookARN :: Lens' DeleteAddressBook Text
+dabAddressBookARN = lens _dabAddressBookARN (\ s a -> s{_dabAddressBookARN = a})
+
+instance AWSRequest DeleteAddressBook where
+        type Rs DeleteAddressBook = DeleteAddressBookResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveEmpty
+              (\ s h x ->
+                 DeleteAddressBookResponse' <$> (pure (fromEnum s)))
+
+instance Hashable DeleteAddressBook where
+
+instance NFData DeleteAddressBook where
+
+instance ToHeaders DeleteAddressBook where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.DeleteAddressBook" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON DeleteAddressBook where
+        toJSON DeleteAddressBook'{..}
+          = object
+              (catMaybes
+                 [Just ("AddressBookArn" .= _dabAddressBookARN)])
+
+instance ToPath DeleteAddressBook where
+        toPath = const "/"
+
+instance ToQuery DeleteAddressBook where
+        toQuery = const mempty
+
+-- | /See:/ 'deleteAddressBookResponse' smart constructor.
+newtype DeleteAddressBookResponse = DeleteAddressBookResponse'
+  { _dabrsResponseStatus :: Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'DeleteAddressBookResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dabrsResponseStatus' - -- | The response status code.
+deleteAddressBookResponse
+    :: Int -- ^ 'dabrsResponseStatus'
+    -> DeleteAddressBookResponse
+deleteAddressBookResponse pResponseStatus_ =
+  DeleteAddressBookResponse' {_dabrsResponseStatus = pResponseStatus_}
+
+
+-- | -- | The response status code.
+dabrsResponseStatus :: Lens' DeleteAddressBookResponse Int
+dabrsResponseStatus = lens _dabrsResponseStatus (\ s a -> s{_dabrsResponseStatus = a})
+
+instance NFData DeleteAddressBookResponse where
diff --git a/gen/Network/AWS/AlexaBusiness/DeleteContact.hs b/gen/Network/AWS/AlexaBusiness/DeleteContact.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/DeleteContact.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.AlexaBusiness.DeleteContact
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes a contact by the contact ARN.
+--
+--
+module Network.AWS.AlexaBusiness.DeleteContact
+    (
+    -- * Creating a Request
+      deleteContact
+    , DeleteContact
+    -- * Request Lenses
+    , dcContactARN
+
+    -- * Destructuring the Response
+    , deleteContactResponse
+    , DeleteContactResponse
+    -- * Response Lenses
+    , dcrsResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'deleteContact' smart constructor.
+newtype DeleteContact = DeleteContact'
+  { _dcContactARN :: Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'DeleteContact' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dcContactARN' - The ARN of the contact to delete.
+deleteContact
+    :: Text -- ^ 'dcContactARN'
+    -> DeleteContact
+deleteContact pContactARN_ = DeleteContact' {_dcContactARN = pContactARN_}
+
+
+-- | The ARN of the contact to delete.
+dcContactARN :: Lens' DeleteContact Text
+dcContactARN = lens _dcContactARN (\ s a -> s{_dcContactARN = a})
+
+instance AWSRequest DeleteContact where
+        type Rs DeleteContact = DeleteContactResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveEmpty
+              (\ s h x ->
+                 DeleteContactResponse' <$> (pure (fromEnum s)))
+
+instance Hashable DeleteContact where
+
+instance NFData DeleteContact where
+
+instance ToHeaders DeleteContact where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.DeleteContact" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON DeleteContact where
+        toJSON DeleteContact'{..}
+          = object
+              (catMaybes [Just ("ContactArn" .= _dcContactARN)])
+
+instance ToPath DeleteContact where
+        toPath = const "/"
+
+instance ToQuery DeleteContact where
+        toQuery = const mempty
+
+-- | /See:/ 'deleteContactResponse' smart constructor.
+newtype DeleteContactResponse = DeleteContactResponse'
+  { _dcrsResponseStatus :: Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'DeleteContactResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dcrsResponseStatus' - -- | The response status code.
+deleteContactResponse
+    :: Int -- ^ 'dcrsResponseStatus'
+    -> DeleteContactResponse
+deleteContactResponse pResponseStatus_ =
+  DeleteContactResponse' {_dcrsResponseStatus = pResponseStatus_}
+
+
+-- | -- | The response status code.
+dcrsResponseStatus :: Lens' DeleteContactResponse Int
+dcrsResponseStatus = lens _dcrsResponseStatus (\ s a -> s{_dcrsResponseStatus = a})
+
+instance NFData DeleteContactResponse where
diff --git a/gen/Network/AWS/AlexaBusiness/DeleteProfile.hs b/gen/Network/AWS/AlexaBusiness/DeleteProfile.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/DeleteProfile.hs
@@ -0,0 +1,120 @@
+{-# 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.AlexaBusiness.DeleteProfile
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes a room profile by the profile ARN.
+--
+--
+module Network.AWS.AlexaBusiness.DeleteProfile
+    (
+    -- * Creating a Request
+      deleteProfile
+    , DeleteProfile
+    -- * Request Lenses
+    , dpProfileARN
+
+    -- * Destructuring the Response
+    , deleteProfileResponse
+    , DeleteProfileResponse
+    -- * Response Lenses
+    , dprsResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'deleteProfile' smart constructor.
+newtype DeleteProfile = DeleteProfile'
+  { _dpProfileARN :: Maybe Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'DeleteProfile' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dpProfileARN' - The ARN of the room profile to delete. Required.
+deleteProfile
+    :: DeleteProfile
+deleteProfile = DeleteProfile' {_dpProfileARN = Nothing}
+
+
+-- | The ARN of the room profile to delete. Required.
+dpProfileARN :: Lens' DeleteProfile (Maybe Text)
+dpProfileARN = lens _dpProfileARN (\ s a -> s{_dpProfileARN = a})
+
+instance AWSRequest DeleteProfile where
+        type Rs DeleteProfile = DeleteProfileResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveEmpty
+              (\ s h x ->
+                 DeleteProfileResponse' <$> (pure (fromEnum s)))
+
+instance Hashable DeleteProfile where
+
+instance NFData DeleteProfile where
+
+instance ToHeaders DeleteProfile where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.DeleteProfile" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON DeleteProfile where
+        toJSON DeleteProfile'{..}
+          = object
+              (catMaybes [("ProfileArn" .=) <$> _dpProfileARN])
+
+instance ToPath DeleteProfile where
+        toPath = const "/"
+
+instance ToQuery DeleteProfile where
+        toQuery = const mempty
+
+-- | /See:/ 'deleteProfileResponse' smart constructor.
+newtype DeleteProfileResponse = DeleteProfileResponse'
+  { _dprsResponseStatus :: Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'DeleteProfileResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dprsResponseStatus' - -- | The response status code.
+deleteProfileResponse
+    :: Int -- ^ 'dprsResponseStatus'
+    -> DeleteProfileResponse
+deleteProfileResponse pResponseStatus_ =
+  DeleteProfileResponse' {_dprsResponseStatus = pResponseStatus_}
+
+
+-- | -- | The response status code.
+dprsResponseStatus :: Lens' DeleteProfileResponse Int
+dprsResponseStatus = lens _dprsResponseStatus (\ s a -> s{_dprsResponseStatus = a})
+
+instance NFData DeleteProfileResponse where
diff --git a/gen/Network/AWS/AlexaBusiness/DeleteRoom.hs b/gen/Network/AWS/AlexaBusiness/DeleteRoom.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/DeleteRoom.hs
@@ -0,0 +1,119 @@
+{-# 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.AlexaBusiness.DeleteRoom
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes a room by the room ARN.
+--
+--
+module Network.AWS.AlexaBusiness.DeleteRoom
+    (
+    -- * Creating a Request
+      deleteRoom
+    , DeleteRoom
+    -- * Request Lenses
+    , drRoomARN
+
+    -- * Destructuring the Response
+    , deleteRoomResponse
+    , DeleteRoomResponse
+    -- * Response Lenses
+    , drrsResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'deleteRoom' smart constructor.
+newtype DeleteRoom = DeleteRoom'
+  { _drRoomARN :: Maybe Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'DeleteRoom' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'drRoomARN' - The ARN of the room to delete. Required.
+deleteRoom
+    :: DeleteRoom
+deleteRoom = DeleteRoom' {_drRoomARN = Nothing}
+
+
+-- | The ARN of the room to delete. Required.
+drRoomARN :: Lens' DeleteRoom (Maybe Text)
+drRoomARN = lens _drRoomARN (\ s a -> s{_drRoomARN = a})
+
+instance AWSRequest DeleteRoom where
+        type Rs DeleteRoom = DeleteRoomResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveEmpty
+              (\ s h x ->
+                 DeleteRoomResponse' <$> (pure (fromEnum s)))
+
+instance Hashable DeleteRoom where
+
+instance NFData DeleteRoom where
+
+instance ToHeaders DeleteRoom where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.DeleteRoom" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON DeleteRoom where
+        toJSON DeleteRoom'{..}
+          = object (catMaybes [("RoomArn" .=) <$> _drRoomARN])
+
+instance ToPath DeleteRoom where
+        toPath = const "/"
+
+instance ToQuery DeleteRoom where
+        toQuery = const mempty
+
+-- | /See:/ 'deleteRoomResponse' smart constructor.
+newtype DeleteRoomResponse = DeleteRoomResponse'
+  { _drrsResponseStatus :: Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'DeleteRoomResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'drrsResponseStatus' - -- | The response status code.
+deleteRoomResponse
+    :: Int -- ^ 'drrsResponseStatus'
+    -> DeleteRoomResponse
+deleteRoomResponse pResponseStatus_ =
+  DeleteRoomResponse' {_drrsResponseStatus = pResponseStatus_}
+
+
+-- | -- | The response status code.
+drrsResponseStatus :: Lens' DeleteRoomResponse Int
+drrsResponseStatus = lens _drrsResponseStatus (\ s a -> s{_drrsResponseStatus = a})
+
+instance NFData DeleteRoomResponse where
diff --git a/gen/Network/AWS/AlexaBusiness/DeleteRoomSkillParameter.hs b/gen/Network/AWS/AlexaBusiness/DeleteRoomSkillParameter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/DeleteRoomSkillParameter.hs
@@ -0,0 +1,150 @@
+{-# 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.AlexaBusiness.DeleteRoomSkillParameter
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes room skill parameter details by room, skill, and parameter key ID.
+--
+--
+module Network.AWS.AlexaBusiness.DeleteRoomSkillParameter
+    (
+    -- * Creating a Request
+      deleteRoomSkillParameter
+    , DeleteRoomSkillParameter
+    -- * Request Lenses
+    , drspRoomARN
+    , drspSkillId
+    , drspParameterKey
+
+    -- * Destructuring the Response
+    , deleteRoomSkillParameterResponse
+    , DeleteRoomSkillParameterResponse
+    -- * Response Lenses
+    , drsprsResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'deleteRoomSkillParameter' smart constructor.
+data DeleteRoomSkillParameter = DeleteRoomSkillParameter'
+  { _drspRoomARN      :: !(Maybe Text)
+  , _drspSkillId      :: !Text
+  , _drspParameterKey :: !Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'DeleteRoomSkillParameter' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'drspRoomARN' - The ARN of the room from which to remove the room skill parameter details.
+--
+-- * 'drspSkillId' - The ID of the skill from which to remove the room skill parameter details.
+--
+-- * 'drspParameterKey' - The room skill parameter key for which to remove details.
+deleteRoomSkillParameter
+    :: Text -- ^ 'drspSkillId'
+    -> Text -- ^ 'drspParameterKey'
+    -> DeleteRoomSkillParameter
+deleteRoomSkillParameter pSkillId_ pParameterKey_ =
+  DeleteRoomSkillParameter'
+    { _drspRoomARN = Nothing
+    , _drspSkillId = pSkillId_
+    , _drspParameterKey = pParameterKey_
+    }
+
+
+-- | The ARN of the room from which to remove the room skill parameter details.
+drspRoomARN :: Lens' DeleteRoomSkillParameter (Maybe Text)
+drspRoomARN = lens _drspRoomARN (\ s a -> s{_drspRoomARN = a})
+
+-- | The ID of the skill from which to remove the room skill parameter details.
+drspSkillId :: Lens' DeleteRoomSkillParameter Text
+drspSkillId = lens _drspSkillId (\ s a -> s{_drspSkillId = a})
+
+-- | The room skill parameter key for which to remove details.
+drspParameterKey :: Lens' DeleteRoomSkillParameter Text
+drspParameterKey = lens _drspParameterKey (\ s a -> s{_drspParameterKey = a})
+
+instance AWSRequest DeleteRoomSkillParameter where
+        type Rs DeleteRoomSkillParameter =
+             DeleteRoomSkillParameterResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveEmpty
+              (\ s h x ->
+                 DeleteRoomSkillParameterResponse' <$>
+                   (pure (fromEnum s)))
+
+instance Hashable DeleteRoomSkillParameter where
+
+instance NFData DeleteRoomSkillParameter where
+
+instance ToHeaders DeleteRoomSkillParameter where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.DeleteRoomSkillParameter" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON DeleteRoomSkillParameter where
+        toJSON DeleteRoomSkillParameter'{..}
+          = object
+              (catMaybes
+                 [("RoomArn" .=) <$> _drspRoomARN,
+                  Just ("SkillId" .= _drspSkillId),
+                  Just ("ParameterKey" .= _drspParameterKey)])
+
+instance ToPath DeleteRoomSkillParameter where
+        toPath = const "/"
+
+instance ToQuery DeleteRoomSkillParameter where
+        toQuery = const mempty
+
+-- | /See:/ 'deleteRoomSkillParameterResponse' smart constructor.
+newtype DeleteRoomSkillParameterResponse = DeleteRoomSkillParameterResponse'
+  { _drsprsResponseStatus :: Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'DeleteRoomSkillParameterResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'drsprsResponseStatus' - -- | The response status code.
+deleteRoomSkillParameterResponse
+    :: Int -- ^ 'drsprsResponseStatus'
+    -> DeleteRoomSkillParameterResponse
+deleteRoomSkillParameterResponse pResponseStatus_ =
+  DeleteRoomSkillParameterResponse' {_drsprsResponseStatus = pResponseStatus_}
+
+
+-- | -- | The response status code.
+drsprsResponseStatus :: Lens' DeleteRoomSkillParameterResponse Int
+drsprsResponseStatus = lens _drsprsResponseStatus (\ s a -> s{_drsprsResponseStatus = a})
+
+instance NFData DeleteRoomSkillParameterResponse
+         where
diff --git a/gen/Network/AWS/AlexaBusiness/DeleteSkillGroup.hs b/gen/Network/AWS/AlexaBusiness/DeleteSkillGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/DeleteSkillGroup.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.AlexaBusiness.DeleteSkillGroup
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes a skill group by skill group ARN.
+--
+--
+module Network.AWS.AlexaBusiness.DeleteSkillGroup
+    (
+    -- * Creating a Request
+      deleteSkillGroup
+    , DeleteSkillGroup
+    -- * Request Lenses
+    , dsgSkillGroupARN
+
+    -- * Destructuring the Response
+    , deleteSkillGroupResponse
+    , DeleteSkillGroupResponse
+    -- * Response Lenses
+    , dsgrsResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'deleteSkillGroup' smart constructor.
+newtype DeleteSkillGroup = DeleteSkillGroup'
+  { _dsgSkillGroupARN :: Maybe Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'DeleteSkillGroup' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dsgSkillGroupARN' - The ARN of the skill group to delete. Required.
+deleteSkillGroup
+    :: DeleteSkillGroup
+deleteSkillGroup = DeleteSkillGroup' {_dsgSkillGroupARN = Nothing}
+
+
+-- | The ARN of the skill group to delete. Required.
+dsgSkillGroupARN :: Lens' DeleteSkillGroup (Maybe Text)
+dsgSkillGroupARN = lens _dsgSkillGroupARN (\ s a -> s{_dsgSkillGroupARN = a})
+
+instance AWSRequest DeleteSkillGroup where
+        type Rs DeleteSkillGroup = DeleteSkillGroupResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveEmpty
+              (\ s h x ->
+                 DeleteSkillGroupResponse' <$> (pure (fromEnum s)))
+
+instance Hashable DeleteSkillGroup where
+
+instance NFData DeleteSkillGroup where
+
+instance ToHeaders DeleteSkillGroup where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.DeleteSkillGroup" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON DeleteSkillGroup where
+        toJSON DeleteSkillGroup'{..}
+          = object
+              (catMaybes
+                 [("SkillGroupArn" .=) <$> _dsgSkillGroupARN])
+
+instance ToPath DeleteSkillGroup where
+        toPath = const "/"
+
+instance ToQuery DeleteSkillGroup where
+        toQuery = const mempty
+
+-- | /See:/ 'deleteSkillGroupResponse' smart constructor.
+newtype DeleteSkillGroupResponse = DeleteSkillGroupResponse'
+  { _dsgrsResponseStatus :: Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'DeleteSkillGroupResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dsgrsResponseStatus' - -- | The response status code.
+deleteSkillGroupResponse
+    :: Int -- ^ 'dsgrsResponseStatus'
+    -> DeleteSkillGroupResponse
+deleteSkillGroupResponse pResponseStatus_ =
+  DeleteSkillGroupResponse' {_dsgrsResponseStatus = pResponseStatus_}
+
+
+-- | -- | The response status code.
+dsgrsResponseStatus :: Lens' DeleteSkillGroupResponse Int
+dsgrsResponseStatus = lens _dsgrsResponseStatus (\ s a -> s{_dsgrsResponseStatus = a})
+
+instance NFData DeleteSkillGroupResponse where
diff --git a/gen/Network/AWS/AlexaBusiness/DeleteUser.hs b/gen/Network/AWS/AlexaBusiness/DeleteUser.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/DeleteUser.hs
@@ -0,0 +1,132 @@
+{-# 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.AlexaBusiness.DeleteUser
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes a specified user by user ARN and enrollment ARN.
+--
+--
+module Network.AWS.AlexaBusiness.DeleteUser
+    (
+    -- * Creating a Request
+      deleteUser
+    , DeleteUser
+    -- * Request Lenses
+    , duUserARN
+    , duEnrollmentId
+
+    -- * Destructuring the Response
+    , deleteUserResponse
+    , DeleteUserResponse
+    -- * Response Lenses
+    , dursResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'deleteUser' smart constructor.
+data DeleteUser = DeleteUser'
+  { _duUserARN      :: !(Maybe Text)
+  , _duEnrollmentId :: !Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'DeleteUser' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'duUserARN' - The ARN of the user to delete in the organization. Required.
+--
+-- * 'duEnrollmentId' - The ARN of the user's enrollment in the organization. Required.
+deleteUser
+    :: Text -- ^ 'duEnrollmentId'
+    -> DeleteUser
+deleteUser pEnrollmentId_ =
+  DeleteUser' {_duUserARN = Nothing, _duEnrollmentId = pEnrollmentId_}
+
+
+-- | The ARN of the user to delete in the organization. Required.
+duUserARN :: Lens' DeleteUser (Maybe Text)
+duUserARN = lens _duUserARN (\ s a -> s{_duUserARN = a})
+
+-- | The ARN of the user's enrollment in the organization. Required.
+duEnrollmentId :: Lens' DeleteUser Text
+duEnrollmentId = lens _duEnrollmentId (\ s a -> s{_duEnrollmentId = a})
+
+instance AWSRequest DeleteUser where
+        type Rs DeleteUser = DeleteUserResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveEmpty
+              (\ s h x ->
+                 DeleteUserResponse' <$> (pure (fromEnum s)))
+
+instance Hashable DeleteUser where
+
+instance NFData DeleteUser where
+
+instance ToHeaders DeleteUser where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.DeleteUser" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON DeleteUser where
+        toJSON DeleteUser'{..}
+          = object
+              (catMaybes
+                 [("UserArn" .=) <$> _duUserARN,
+                  Just ("EnrollmentId" .= _duEnrollmentId)])
+
+instance ToPath DeleteUser where
+        toPath = const "/"
+
+instance ToQuery DeleteUser where
+        toQuery = const mempty
+
+-- | /See:/ 'deleteUserResponse' smart constructor.
+newtype DeleteUserResponse = DeleteUserResponse'
+  { _dursResponseStatus :: Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'DeleteUserResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dursResponseStatus' - -- | The response status code.
+deleteUserResponse
+    :: Int -- ^ 'dursResponseStatus'
+    -> DeleteUserResponse
+deleteUserResponse pResponseStatus_ =
+  DeleteUserResponse' {_dursResponseStatus = pResponseStatus_}
+
+
+-- | -- | The response status code.
+dursResponseStatus :: Lens' DeleteUserResponse Int
+dursResponseStatus = lens _dursResponseStatus (\ s a -> s{_dursResponseStatus = a})
+
+instance NFData DeleteUserResponse where
diff --git a/gen/Network/AWS/AlexaBusiness/DisassociateContactFromAddressBook.hs b/gen/Network/AWS/AlexaBusiness/DisassociateContactFromAddressBook.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/DisassociateContactFromAddressBook.hs
@@ -0,0 +1,148 @@
+{-# 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.AlexaBusiness.DisassociateContactFromAddressBook
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Disassociates a contact from a given address book.
+--
+--
+module Network.AWS.AlexaBusiness.DisassociateContactFromAddressBook
+    (
+    -- * Creating a Request
+      disassociateContactFromAddressBook
+    , DisassociateContactFromAddressBook
+    -- * Request Lenses
+    , dcfabContactARN
+    , dcfabAddressBookARN
+
+    -- * Destructuring the Response
+    , disassociateContactFromAddressBookResponse
+    , DisassociateContactFromAddressBookResponse
+    -- * Response Lenses
+    , dcfabrsResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'disassociateContactFromAddressBook' smart constructor.
+data DisassociateContactFromAddressBook = DisassociateContactFromAddressBook'
+  { _dcfabContactARN     :: !Text
+  , _dcfabAddressBookARN :: !Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'DisassociateContactFromAddressBook' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dcfabContactARN' - The ARN of the contact to disassociate from an address book.
+--
+-- * 'dcfabAddressBookARN' - The ARN of the address from which to disassociate the contact.
+disassociateContactFromAddressBook
+    :: Text -- ^ 'dcfabContactARN'
+    -> Text -- ^ 'dcfabAddressBookARN'
+    -> DisassociateContactFromAddressBook
+disassociateContactFromAddressBook pContactARN_ pAddressBookARN_ =
+  DisassociateContactFromAddressBook'
+    {_dcfabContactARN = pContactARN_, _dcfabAddressBookARN = pAddressBookARN_}
+
+
+-- | The ARN of the contact to disassociate from an address book.
+dcfabContactARN :: Lens' DisassociateContactFromAddressBook Text
+dcfabContactARN = lens _dcfabContactARN (\ s a -> s{_dcfabContactARN = a})
+
+-- | The ARN of the address from which to disassociate the contact.
+dcfabAddressBookARN :: Lens' DisassociateContactFromAddressBook Text
+dcfabAddressBookARN = lens _dcfabAddressBookARN (\ s a -> s{_dcfabAddressBookARN = a})
+
+instance AWSRequest
+           DisassociateContactFromAddressBook
+         where
+        type Rs DisassociateContactFromAddressBook =
+             DisassociateContactFromAddressBookResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveEmpty
+              (\ s h x ->
+                 DisassociateContactFromAddressBookResponse' <$>
+                   (pure (fromEnum s)))
+
+instance Hashable DisassociateContactFromAddressBook
+         where
+
+instance NFData DisassociateContactFromAddressBook
+         where
+
+instance ToHeaders DisassociateContactFromAddressBook
+         where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.DisassociateContactFromAddressBook"
+                       :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON DisassociateContactFromAddressBook
+         where
+        toJSON DisassociateContactFromAddressBook'{..}
+          = object
+              (catMaybes
+                 [Just ("ContactArn" .= _dcfabContactARN),
+                  Just ("AddressBookArn" .= _dcfabAddressBookARN)])
+
+instance ToPath DisassociateContactFromAddressBook
+         where
+        toPath = const "/"
+
+instance ToQuery DisassociateContactFromAddressBook
+         where
+        toQuery = const mempty
+
+-- | /See:/ 'disassociateContactFromAddressBookResponse' smart constructor.
+newtype DisassociateContactFromAddressBookResponse = DisassociateContactFromAddressBookResponse'
+  { _dcfabrsResponseStatus :: Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'DisassociateContactFromAddressBookResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dcfabrsResponseStatus' - -- | The response status code.
+disassociateContactFromAddressBookResponse
+    :: Int -- ^ 'dcfabrsResponseStatus'
+    -> DisassociateContactFromAddressBookResponse
+disassociateContactFromAddressBookResponse pResponseStatus_ =
+  DisassociateContactFromAddressBookResponse'
+    {_dcfabrsResponseStatus = pResponseStatus_}
+
+
+-- | -- | The response status code.
+dcfabrsResponseStatus :: Lens' DisassociateContactFromAddressBookResponse Int
+dcfabrsResponseStatus = lens _dcfabrsResponseStatus (\ s a -> s{_dcfabrsResponseStatus = a})
+
+instance NFData
+           DisassociateContactFromAddressBookResponse
+         where
diff --git a/gen/Network/AWS/AlexaBusiness/DisassociateDeviceFromRoom.hs b/gen/Network/AWS/AlexaBusiness/DisassociateDeviceFromRoom.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/DisassociateDeviceFromRoom.hs
@@ -0,0 +1,125 @@
+{-# 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.AlexaBusiness.DisassociateDeviceFromRoom
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Disassociates a device from its current room. The device continues to be connected to the Wi-Fi network and is still registered to the account. The device settings and skills are removed from the room.
+--
+--
+module Network.AWS.AlexaBusiness.DisassociateDeviceFromRoom
+    (
+    -- * Creating a Request
+      disassociateDeviceFromRoom
+    , DisassociateDeviceFromRoom
+    -- * Request Lenses
+    , ddfrDeviceARN
+
+    -- * Destructuring the Response
+    , disassociateDeviceFromRoomResponse
+    , DisassociateDeviceFromRoomResponse
+    -- * Response Lenses
+    , ddfrrsResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'disassociateDeviceFromRoom' smart constructor.
+newtype DisassociateDeviceFromRoom = DisassociateDeviceFromRoom'
+  { _ddfrDeviceARN :: Maybe Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'DisassociateDeviceFromRoom' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ddfrDeviceARN' - The ARN of the device to disassociate from a room. Required.
+disassociateDeviceFromRoom
+    :: DisassociateDeviceFromRoom
+disassociateDeviceFromRoom =
+  DisassociateDeviceFromRoom' {_ddfrDeviceARN = Nothing}
+
+
+-- | The ARN of the device to disassociate from a room. Required.
+ddfrDeviceARN :: Lens' DisassociateDeviceFromRoom (Maybe Text)
+ddfrDeviceARN = lens _ddfrDeviceARN (\ s a -> s{_ddfrDeviceARN = a})
+
+instance AWSRequest DisassociateDeviceFromRoom where
+        type Rs DisassociateDeviceFromRoom =
+             DisassociateDeviceFromRoomResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveEmpty
+              (\ s h x ->
+                 DisassociateDeviceFromRoomResponse' <$>
+                   (pure (fromEnum s)))
+
+instance Hashable DisassociateDeviceFromRoom where
+
+instance NFData DisassociateDeviceFromRoom where
+
+instance ToHeaders DisassociateDeviceFromRoom where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.DisassociateDeviceFromRoom" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON DisassociateDeviceFromRoom where
+        toJSON DisassociateDeviceFromRoom'{..}
+          = object
+              (catMaybes [("DeviceArn" .=) <$> _ddfrDeviceARN])
+
+instance ToPath DisassociateDeviceFromRoom where
+        toPath = const "/"
+
+instance ToQuery DisassociateDeviceFromRoom where
+        toQuery = const mempty
+
+-- | /See:/ 'disassociateDeviceFromRoomResponse' smart constructor.
+newtype DisassociateDeviceFromRoomResponse = DisassociateDeviceFromRoomResponse'
+  { _ddfrrsResponseStatus :: Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'DisassociateDeviceFromRoomResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ddfrrsResponseStatus' - -- | The response status code.
+disassociateDeviceFromRoomResponse
+    :: Int -- ^ 'ddfrrsResponseStatus'
+    -> DisassociateDeviceFromRoomResponse
+disassociateDeviceFromRoomResponse pResponseStatus_ =
+  DisassociateDeviceFromRoomResponse' {_ddfrrsResponseStatus = pResponseStatus_}
+
+
+-- | -- | The response status code.
+ddfrrsResponseStatus :: Lens' DisassociateDeviceFromRoomResponse Int
+ddfrrsResponseStatus = lens _ddfrrsResponseStatus (\ s a -> s{_ddfrrsResponseStatus = a})
+
+instance NFData DisassociateDeviceFromRoomResponse
+         where
diff --git a/gen/Network/AWS/AlexaBusiness/DisassociateSkillGroupFromRoom.hs b/gen/Network/AWS/AlexaBusiness/DisassociateSkillGroupFromRoom.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/DisassociateSkillGroupFromRoom.hs
@@ -0,0 +1,141 @@
+{-# 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.AlexaBusiness.DisassociateSkillGroupFromRoom
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Disassociates a skill group from a specified room. This disables all skills in the skill group on all devices in the room.
+--
+--
+module Network.AWS.AlexaBusiness.DisassociateSkillGroupFromRoom
+    (
+    -- * Creating a Request
+      disassociateSkillGroupFromRoom
+    , DisassociateSkillGroupFromRoom
+    -- * Request Lenses
+    , dsgfrSkillGroupARN
+    , dsgfrRoomARN
+
+    -- * Destructuring the Response
+    , disassociateSkillGroupFromRoomResponse
+    , DisassociateSkillGroupFromRoomResponse
+    -- * Response Lenses
+    , dsgfrrsResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'disassociateSkillGroupFromRoom' smart constructor.
+data DisassociateSkillGroupFromRoom = DisassociateSkillGroupFromRoom'
+  { _dsgfrSkillGroupARN :: !(Maybe Text)
+  , _dsgfrRoomARN       :: !(Maybe Text)
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'DisassociateSkillGroupFromRoom' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dsgfrSkillGroupARN' - The ARN of the skill group to disassociate from a room. Required.
+--
+-- * 'dsgfrRoomARN' - The ARN of the room from which the skill group is to be disassociated. Required.
+disassociateSkillGroupFromRoom
+    :: DisassociateSkillGroupFromRoom
+disassociateSkillGroupFromRoom =
+  DisassociateSkillGroupFromRoom'
+    {_dsgfrSkillGroupARN = Nothing, _dsgfrRoomARN = Nothing}
+
+
+-- | The ARN of the skill group to disassociate from a room. Required.
+dsgfrSkillGroupARN :: Lens' DisassociateSkillGroupFromRoom (Maybe Text)
+dsgfrSkillGroupARN = lens _dsgfrSkillGroupARN (\ s a -> s{_dsgfrSkillGroupARN = a})
+
+-- | The ARN of the room from which the skill group is to be disassociated. Required.
+dsgfrRoomARN :: Lens' DisassociateSkillGroupFromRoom (Maybe Text)
+dsgfrRoomARN = lens _dsgfrRoomARN (\ s a -> s{_dsgfrRoomARN = a})
+
+instance AWSRequest DisassociateSkillGroupFromRoom
+         where
+        type Rs DisassociateSkillGroupFromRoom =
+             DisassociateSkillGroupFromRoomResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveEmpty
+              (\ s h x ->
+                 DisassociateSkillGroupFromRoomResponse' <$>
+                   (pure (fromEnum s)))
+
+instance Hashable DisassociateSkillGroupFromRoom
+         where
+
+instance NFData DisassociateSkillGroupFromRoom where
+
+instance ToHeaders DisassociateSkillGroupFromRoom
+         where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.DisassociateSkillGroupFromRoom" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON DisassociateSkillGroupFromRoom where
+        toJSON DisassociateSkillGroupFromRoom'{..}
+          = object
+              (catMaybes
+                 [("SkillGroupArn" .=) <$> _dsgfrSkillGroupARN,
+                  ("RoomArn" .=) <$> _dsgfrRoomARN])
+
+instance ToPath DisassociateSkillGroupFromRoom where
+        toPath = const "/"
+
+instance ToQuery DisassociateSkillGroupFromRoom where
+        toQuery = const mempty
+
+-- | /See:/ 'disassociateSkillGroupFromRoomResponse' smart constructor.
+newtype DisassociateSkillGroupFromRoomResponse = DisassociateSkillGroupFromRoomResponse'
+  { _dsgfrrsResponseStatus :: Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'DisassociateSkillGroupFromRoomResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dsgfrrsResponseStatus' - -- | The response status code.
+disassociateSkillGroupFromRoomResponse
+    :: Int -- ^ 'dsgfrrsResponseStatus'
+    -> DisassociateSkillGroupFromRoomResponse
+disassociateSkillGroupFromRoomResponse pResponseStatus_ =
+  DisassociateSkillGroupFromRoomResponse'
+    {_dsgfrrsResponseStatus = pResponseStatus_}
+
+
+-- | -- | The response status code.
+dsgfrrsResponseStatus :: Lens' DisassociateSkillGroupFromRoomResponse Int
+dsgfrrsResponseStatus = lens _dsgfrrsResponseStatus (\ s a -> s{_dsgfrrsResponseStatus = a})
+
+instance NFData
+           DisassociateSkillGroupFromRoomResponse
+         where
diff --git a/gen/Network/AWS/AlexaBusiness/GetAddressBook.hs b/gen/Network/AWS/AlexaBusiness/GetAddressBook.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/GetAddressBook.hs
@@ -0,0 +1,133 @@
+{-# 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.AlexaBusiness.GetAddressBook
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets address the book details by the address book ARN.
+--
+--
+module Network.AWS.AlexaBusiness.GetAddressBook
+    (
+    -- * Creating a Request
+      getAddressBook
+    , GetAddressBook
+    -- * Request Lenses
+    , gabAddressBookARN
+
+    -- * Destructuring the Response
+    , getAddressBookResponse
+    , GetAddressBookResponse
+    -- * Response Lenses
+    , gabrsAddressBook
+    , gabrsResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'getAddressBook' smart constructor.
+newtype GetAddressBook = GetAddressBook'
+  { _gabAddressBookARN :: Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'GetAddressBook' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gabAddressBookARN' - The ARN of the address book for which to request details.
+getAddressBook
+    :: Text -- ^ 'gabAddressBookARN'
+    -> GetAddressBook
+getAddressBook pAddressBookARN_ =
+  GetAddressBook' {_gabAddressBookARN = pAddressBookARN_}
+
+
+-- | The ARN of the address book for which to request details.
+gabAddressBookARN :: Lens' GetAddressBook Text
+gabAddressBookARN = lens _gabAddressBookARN (\ s a -> s{_gabAddressBookARN = a})
+
+instance AWSRequest GetAddressBook where
+        type Rs GetAddressBook = GetAddressBookResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveJSON
+              (\ s h x ->
+                 GetAddressBookResponse' <$>
+                   (x .?> "AddressBook") <*> (pure (fromEnum s)))
+
+instance Hashable GetAddressBook where
+
+instance NFData GetAddressBook where
+
+instance ToHeaders GetAddressBook where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.GetAddressBook" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON GetAddressBook where
+        toJSON GetAddressBook'{..}
+          = object
+              (catMaybes
+                 [Just ("AddressBookArn" .= _gabAddressBookARN)])
+
+instance ToPath GetAddressBook where
+        toPath = const "/"
+
+instance ToQuery GetAddressBook where
+        toQuery = const mempty
+
+-- | /See:/ 'getAddressBookResponse' smart constructor.
+data GetAddressBookResponse = GetAddressBookResponse'
+  { _gabrsAddressBook    :: !(Maybe AddressBook)
+  , _gabrsResponseStatus :: !Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'GetAddressBookResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gabrsAddressBook' - The details of the requested address book.
+--
+-- * 'gabrsResponseStatus' - -- | The response status code.
+getAddressBookResponse
+    :: Int -- ^ 'gabrsResponseStatus'
+    -> GetAddressBookResponse
+getAddressBookResponse pResponseStatus_ =
+  GetAddressBookResponse'
+    {_gabrsAddressBook = Nothing, _gabrsResponseStatus = pResponseStatus_}
+
+
+-- | The details of the requested address book.
+gabrsAddressBook :: Lens' GetAddressBookResponse (Maybe AddressBook)
+gabrsAddressBook = lens _gabrsAddressBook (\ s a -> s{_gabrsAddressBook = a})
+
+-- | -- | The response status code.
+gabrsResponseStatus :: Lens' GetAddressBookResponse Int
+gabrsResponseStatus = lens _gabrsResponseStatus (\ s a -> s{_gabrsResponseStatus = a})
+
+instance NFData GetAddressBookResponse where
diff --git a/gen/Network/AWS/AlexaBusiness/GetContact.hs b/gen/Network/AWS/AlexaBusiness/GetContact.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/GetContact.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.AlexaBusiness.GetContact
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets the contact details by the contact ARN.
+--
+--
+module Network.AWS.AlexaBusiness.GetContact
+    (
+    -- * Creating a Request
+      getContact
+    , GetContact
+    -- * Request Lenses
+    , gcContactARN
+
+    -- * Destructuring the Response
+    , getContactResponse
+    , GetContactResponse
+    -- * Response Lenses
+    , gcrsContact
+    , gcrsResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'getContact' smart constructor.
+newtype GetContact = GetContact'
+  { _gcContactARN :: Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'GetContact' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gcContactARN' - The ARN of the contact for which to request details.
+getContact
+    :: Text -- ^ 'gcContactARN'
+    -> GetContact
+getContact pContactARN_ = GetContact' {_gcContactARN = pContactARN_}
+
+
+-- | The ARN of the contact for which to request details.
+gcContactARN :: Lens' GetContact Text
+gcContactARN = lens _gcContactARN (\ s a -> s{_gcContactARN = a})
+
+instance AWSRequest GetContact where
+        type Rs GetContact = GetContactResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveJSON
+              (\ s h x ->
+                 GetContactResponse' <$>
+                   (x .?> "Contact") <*> (pure (fromEnum s)))
+
+instance Hashable GetContact where
+
+instance NFData GetContact where
+
+instance ToHeaders GetContact where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.GetContact" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON GetContact where
+        toJSON GetContact'{..}
+          = object
+              (catMaybes [Just ("ContactArn" .= _gcContactARN)])
+
+instance ToPath GetContact where
+        toPath = const "/"
+
+instance ToQuery GetContact where
+        toQuery = const mempty
+
+-- | /See:/ 'getContactResponse' smart constructor.
+data GetContactResponse = GetContactResponse'
+  { _gcrsContact        :: !(Maybe Contact)
+  , _gcrsResponseStatus :: !Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'GetContactResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gcrsContact' - The details of the requested contact.
+--
+-- * 'gcrsResponseStatus' - -- | The response status code.
+getContactResponse
+    :: Int -- ^ 'gcrsResponseStatus'
+    -> GetContactResponse
+getContactResponse pResponseStatus_ =
+  GetContactResponse'
+    {_gcrsContact = Nothing, _gcrsResponseStatus = pResponseStatus_}
+
+
+-- | The details of the requested contact.
+gcrsContact :: Lens' GetContactResponse (Maybe Contact)
+gcrsContact = lens _gcrsContact (\ s a -> s{_gcrsContact = a})
+
+-- | -- | The response status code.
+gcrsResponseStatus :: Lens' GetContactResponse Int
+gcrsResponseStatus = lens _gcrsResponseStatus (\ s a -> s{_gcrsResponseStatus = a})
+
+instance NFData GetContactResponse where
diff --git a/gen/Network/AWS/AlexaBusiness/GetDevice.hs b/gen/Network/AWS/AlexaBusiness/GetDevice.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/GetDevice.hs
@@ -0,0 +1,130 @@
+{-# 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.AlexaBusiness.GetDevice
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets the details of a device by device ARN.
+--
+--
+module Network.AWS.AlexaBusiness.GetDevice
+    (
+    -- * Creating a Request
+      getDevice
+    , GetDevice
+    -- * Request Lenses
+    , gdDeviceARN
+
+    -- * Destructuring the Response
+    , getDeviceResponse
+    , GetDeviceResponse
+    -- * Response Lenses
+    , gdrsDevice
+    , gdrsResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'getDevice' smart constructor.
+newtype GetDevice = GetDevice'
+  { _gdDeviceARN :: Maybe Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'GetDevice' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gdDeviceARN' - The ARN of the device for which to request details. Required.
+getDevice
+    :: GetDevice
+getDevice = GetDevice' {_gdDeviceARN = Nothing}
+
+
+-- | The ARN of the device for which to request details. Required.
+gdDeviceARN :: Lens' GetDevice (Maybe Text)
+gdDeviceARN = lens _gdDeviceARN (\ s a -> s{_gdDeviceARN = a})
+
+instance AWSRequest GetDevice where
+        type Rs GetDevice = GetDeviceResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveJSON
+              (\ s h x ->
+                 GetDeviceResponse' <$>
+                   (x .?> "Device") <*> (pure (fromEnum s)))
+
+instance Hashable GetDevice where
+
+instance NFData GetDevice where
+
+instance ToHeaders GetDevice where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.GetDevice" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON GetDevice where
+        toJSON GetDevice'{..}
+          = object
+              (catMaybes [("DeviceArn" .=) <$> _gdDeviceARN])
+
+instance ToPath GetDevice where
+        toPath = const "/"
+
+instance ToQuery GetDevice where
+        toQuery = const mempty
+
+-- | /See:/ 'getDeviceResponse' smart constructor.
+data GetDeviceResponse = GetDeviceResponse'
+  { _gdrsDevice         :: !(Maybe Device)
+  , _gdrsResponseStatus :: !Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'GetDeviceResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gdrsDevice' - The details of the device requested. Required.
+--
+-- * 'gdrsResponseStatus' - -- | The response status code.
+getDeviceResponse
+    :: Int -- ^ 'gdrsResponseStatus'
+    -> GetDeviceResponse
+getDeviceResponse pResponseStatus_ =
+  GetDeviceResponse'
+    {_gdrsDevice = Nothing, _gdrsResponseStatus = pResponseStatus_}
+
+
+-- | The details of the device requested. Required.
+gdrsDevice :: Lens' GetDeviceResponse (Maybe Device)
+gdrsDevice = lens _gdrsDevice (\ s a -> s{_gdrsDevice = a})
+
+-- | -- | The response status code.
+gdrsResponseStatus :: Lens' GetDeviceResponse Int
+gdrsResponseStatus = lens _gdrsResponseStatus (\ s a -> s{_gdrsResponseStatus = a})
+
+instance NFData GetDeviceResponse where
diff --git a/gen/Network/AWS/AlexaBusiness/GetProfile.hs b/gen/Network/AWS/AlexaBusiness/GetProfile.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/GetProfile.hs
@@ -0,0 +1,130 @@
+{-# 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.AlexaBusiness.GetProfile
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets the details of a room profile by profile ARN.
+--
+--
+module Network.AWS.AlexaBusiness.GetProfile
+    (
+    -- * Creating a Request
+      getProfile
+    , GetProfile
+    -- * Request Lenses
+    , gpProfileARN
+
+    -- * Destructuring the Response
+    , getProfileResponse
+    , GetProfileResponse
+    -- * Response Lenses
+    , gprsProfile
+    , gprsResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'getProfile' smart constructor.
+newtype GetProfile = GetProfile'
+  { _gpProfileARN :: Maybe Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'GetProfile' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gpProfileARN' - The ARN of the room profile for which to request details. Required.
+getProfile
+    :: GetProfile
+getProfile = GetProfile' {_gpProfileARN = Nothing}
+
+
+-- | The ARN of the room profile for which to request details. Required.
+gpProfileARN :: Lens' GetProfile (Maybe Text)
+gpProfileARN = lens _gpProfileARN (\ s a -> s{_gpProfileARN = a})
+
+instance AWSRequest GetProfile where
+        type Rs GetProfile = GetProfileResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveJSON
+              (\ s h x ->
+                 GetProfileResponse' <$>
+                   (x .?> "Profile") <*> (pure (fromEnum s)))
+
+instance Hashable GetProfile where
+
+instance NFData GetProfile where
+
+instance ToHeaders GetProfile where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.GetProfile" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON GetProfile where
+        toJSON GetProfile'{..}
+          = object
+              (catMaybes [("ProfileArn" .=) <$> _gpProfileARN])
+
+instance ToPath GetProfile where
+        toPath = const "/"
+
+instance ToQuery GetProfile where
+        toQuery = const mempty
+
+-- | /See:/ 'getProfileResponse' smart constructor.
+data GetProfileResponse = GetProfileResponse'
+  { _gprsProfile        :: !(Maybe Profile)
+  , _gprsResponseStatus :: !Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'GetProfileResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gprsProfile' - The details of the room profile requested. Required.
+--
+-- * 'gprsResponseStatus' - -- | The response status code.
+getProfileResponse
+    :: Int -- ^ 'gprsResponseStatus'
+    -> GetProfileResponse
+getProfileResponse pResponseStatus_ =
+  GetProfileResponse'
+    {_gprsProfile = Nothing, _gprsResponseStatus = pResponseStatus_}
+
+
+-- | The details of the room profile requested. Required.
+gprsProfile :: Lens' GetProfileResponse (Maybe Profile)
+gprsProfile = lens _gprsProfile (\ s a -> s{_gprsProfile = a})
+
+-- | -- | The response status code.
+gprsResponseStatus :: Lens' GetProfileResponse Int
+gprsResponseStatus = lens _gprsResponseStatus (\ s a -> s{_gprsResponseStatus = a})
+
+instance NFData GetProfileResponse where
diff --git a/gen/Network/AWS/AlexaBusiness/GetRoom.hs b/gen/Network/AWS/AlexaBusiness/GetRoom.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/GetRoom.hs
@@ -0,0 +1,128 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.AlexaBusiness.GetRoom
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets room details by room ARN.
+--
+--
+module Network.AWS.AlexaBusiness.GetRoom
+    (
+    -- * Creating a Request
+      getRoom
+    , GetRoom
+    -- * Request Lenses
+    , grRoomARN
+
+    -- * Destructuring the Response
+    , getRoomResponse
+    , GetRoomResponse
+    -- * Response Lenses
+    , grrsRoom
+    , grrsResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'getRoom' smart constructor.
+newtype GetRoom = GetRoom'
+  { _grRoomARN :: Maybe Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'GetRoom' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'grRoomARN' - The ARN of the room for which to request details. Required.
+getRoom
+    :: GetRoom
+getRoom = GetRoom' {_grRoomARN = Nothing}
+
+
+-- | The ARN of the room for which to request details. Required.
+grRoomARN :: Lens' GetRoom (Maybe Text)
+grRoomARN = lens _grRoomARN (\ s a -> s{_grRoomARN = a})
+
+instance AWSRequest GetRoom where
+        type Rs GetRoom = GetRoomResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveJSON
+              (\ s h x ->
+                 GetRoomResponse' <$>
+                   (x .?> "Room") <*> (pure (fromEnum s)))
+
+instance Hashable GetRoom where
+
+instance NFData GetRoom where
+
+instance ToHeaders GetRoom where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.GetRoom" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON GetRoom where
+        toJSON GetRoom'{..}
+          = object (catMaybes [("RoomArn" .=) <$> _grRoomARN])
+
+instance ToPath GetRoom where
+        toPath = const "/"
+
+instance ToQuery GetRoom where
+        toQuery = const mempty
+
+-- | /See:/ 'getRoomResponse' smart constructor.
+data GetRoomResponse = GetRoomResponse'
+  { _grrsRoom           :: !(Maybe Room)
+  , _grrsResponseStatus :: !Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'GetRoomResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'grrsRoom' - The details of the room requested.
+--
+-- * 'grrsResponseStatus' - -- | The response status code.
+getRoomResponse
+    :: Int -- ^ 'grrsResponseStatus'
+    -> GetRoomResponse
+getRoomResponse pResponseStatus_ =
+  GetRoomResponse' {_grrsRoom = Nothing, _grrsResponseStatus = pResponseStatus_}
+
+
+-- | The details of the room requested.
+grrsRoom :: Lens' GetRoomResponse (Maybe Room)
+grrsRoom = lens _grrsRoom (\ s a -> s{_grrsRoom = a})
+
+-- | -- | The response status code.
+grrsResponseStatus :: Lens' GetRoomResponse Int
+grrsResponseStatus = lens _grrsResponseStatus (\ s a -> s{_grrsResponseStatus = a})
+
+instance NFData GetRoomResponse where
diff --git a/gen/Network/AWS/AlexaBusiness/GetRoomSkillParameter.hs b/gen/Network/AWS/AlexaBusiness/GetRoomSkillParameter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/GetRoomSkillParameter.hs
@@ -0,0 +1,160 @@
+{-# 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.AlexaBusiness.GetRoomSkillParameter
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets room skill parameter details by room, skill, and parameter key ARN.
+--
+--
+module Network.AWS.AlexaBusiness.GetRoomSkillParameter
+    (
+    -- * Creating a Request
+      getRoomSkillParameter
+    , GetRoomSkillParameter
+    -- * Request Lenses
+    , grspRoomARN
+    , grspSkillId
+    , grspParameterKey
+
+    -- * Destructuring the Response
+    , getRoomSkillParameterResponse
+    , GetRoomSkillParameterResponse
+    -- * Response Lenses
+    , grsprsRoomSkillParameter
+    , grsprsResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'getRoomSkillParameter' smart constructor.
+data GetRoomSkillParameter = GetRoomSkillParameter'
+  { _grspRoomARN      :: !(Maybe Text)
+  , _grspSkillId      :: !Text
+  , _grspParameterKey :: !Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'GetRoomSkillParameter' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'grspRoomARN' - The ARN of the room from which to get the room skill parameter details.
+--
+-- * 'grspSkillId' - The ARN of the skill from which to get the room skill parameter details. Required.
+--
+-- * 'grspParameterKey' - The room skill parameter key for which to get details. Required.
+getRoomSkillParameter
+    :: Text -- ^ 'grspSkillId'
+    -> Text -- ^ 'grspParameterKey'
+    -> GetRoomSkillParameter
+getRoomSkillParameter pSkillId_ pParameterKey_ =
+  GetRoomSkillParameter'
+    { _grspRoomARN = Nothing
+    , _grspSkillId = pSkillId_
+    , _grspParameterKey = pParameterKey_
+    }
+
+
+-- | The ARN of the room from which to get the room skill parameter details.
+grspRoomARN :: Lens' GetRoomSkillParameter (Maybe Text)
+grspRoomARN = lens _grspRoomARN (\ s a -> s{_grspRoomARN = a})
+
+-- | The ARN of the skill from which to get the room skill parameter details. Required.
+grspSkillId :: Lens' GetRoomSkillParameter Text
+grspSkillId = lens _grspSkillId (\ s a -> s{_grspSkillId = a})
+
+-- | The room skill parameter key for which to get details. Required.
+grspParameterKey :: Lens' GetRoomSkillParameter Text
+grspParameterKey = lens _grspParameterKey (\ s a -> s{_grspParameterKey = a})
+
+instance AWSRequest GetRoomSkillParameter where
+        type Rs GetRoomSkillParameter =
+             GetRoomSkillParameterResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveJSON
+              (\ s h x ->
+                 GetRoomSkillParameterResponse' <$>
+                   (x .?> "RoomSkillParameter") <*> (pure (fromEnum s)))
+
+instance Hashable GetRoomSkillParameter where
+
+instance NFData GetRoomSkillParameter where
+
+instance ToHeaders GetRoomSkillParameter where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.GetRoomSkillParameter" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON GetRoomSkillParameter where
+        toJSON GetRoomSkillParameter'{..}
+          = object
+              (catMaybes
+                 [("RoomArn" .=) <$> _grspRoomARN,
+                  Just ("SkillId" .= _grspSkillId),
+                  Just ("ParameterKey" .= _grspParameterKey)])
+
+instance ToPath GetRoomSkillParameter where
+        toPath = const "/"
+
+instance ToQuery GetRoomSkillParameter where
+        toQuery = const mempty
+
+-- | /See:/ 'getRoomSkillParameterResponse' smart constructor.
+data GetRoomSkillParameterResponse = GetRoomSkillParameterResponse'
+  { _grsprsRoomSkillParameter :: !(Maybe RoomSkillParameter)
+  , _grsprsResponseStatus     :: !Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'GetRoomSkillParameterResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'grsprsRoomSkillParameter' - The details of the room skill parameter requested. Required.
+--
+-- * 'grsprsResponseStatus' - -- | The response status code.
+getRoomSkillParameterResponse
+    :: Int -- ^ 'grsprsResponseStatus'
+    -> GetRoomSkillParameterResponse
+getRoomSkillParameterResponse pResponseStatus_ =
+  GetRoomSkillParameterResponse'
+    { _grsprsRoomSkillParameter = Nothing
+    , _grsprsResponseStatus = pResponseStatus_
+    }
+
+
+-- | The details of the room skill parameter requested. Required.
+grsprsRoomSkillParameter :: Lens' GetRoomSkillParameterResponse (Maybe RoomSkillParameter)
+grsprsRoomSkillParameter = lens _grsprsRoomSkillParameter (\ s a -> s{_grsprsRoomSkillParameter = a})
+
+-- | -- | The response status code.
+grsprsResponseStatus :: Lens' GetRoomSkillParameterResponse Int
+grsprsResponseStatus = lens _grsprsResponseStatus (\ s a -> s{_grsprsResponseStatus = a})
+
+instance NFData GetRoomSkillParameterResponse where
diff --git a/gen/Network/AWS/AlexaBusiness/GetSkillGroup.hs b/gen/Network/AWS/AlexaBusiness/GetSkillGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/GetSkillGroup.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.AlexaBusiness.GetSkillGroup
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets skill group details by skill group ARN.
+--
+--
+module Network.AWS.AlexaBusiness.GetSkillGroup
+    (
+    -- * Creating a Request
+      getSkillGroup
+    , GetSkillGroup
+    -- * Request Lenses
+    , gsgSkillGroupARN
+
+    -- * Destructuring the Response
+    , getSkillGroupResponse
+    , GetSkillGroupResponse
+    -- * Response Lenses
+    , gsgrsSkillGroup
+    , gsgrsResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'getSkillGroup' smart constructor.
+newtype GetSkillGroup = GetSkillGroup'
+  { _gsgSkillGroupARN :: Maybe Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'GetSkillGroup' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gsgSkillGroupARN' - The ARN of the skill group for which to get details. Required.
+getSkillGroup
+    :: GetSkillGroup
+getSkillGroup = GetSkillGroup' {_gsgSkillGroupARN = Nothing}
+
+
+-- | The ARN of the skill group for which to get details. Required.
+gsgSkillGroupARN :: Lens' GetSkillGroup (Maybe Text)
+gsgSkillGroupARN = lens _gsgSkillGroupARN (\ s a -> s{_gsgSkillGroupARN = a})
+
+instance AWSRequest GetSkillGroup where
+        type Rs GetSkillGroup = GetSkillGroupResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveJSON
+              (\ s h x ->
+                 GetSkillGroupResponse' <$>
+                   (x .?> "SkillGroup") <*> (pure (fromEnum s)))
+
+instance Hashable GetSkillGroup where
+
+instance NFData GetSkillGroup where
+
+instance ToHeaders GetSkillGroup where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.GetSkillGroup" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON GetSkillGroup where
+        toJSON GetSkillGroup'{..}
+          = object
+              (catMaybes
+                 [("SkillGroupArn" .=) <$> _gsgSkillGroupARN])
+
+instance ToPath GetSkillGroup where
+        toPath = const "/"
+
+instance ToQuery GetSkillGroup where
+        toQuery = const mempty
+
+-- | /See:/ 'getSkillGroupResponse' smart constructor.
+data GetSkillGroupResponse = GetSkillGroupResponse'
+  { _gsgrsSkillGroup     :: !(Maybe SkillGroup)
+  , _gsgrsResponseStatus :: !Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'GetSkillGroupResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gsgrsSkillGroup' - The details of the skill group requested. Required.
+--
+-- * 'gsgrsResponseStatus' - -- | The response status code.
+getSkillGroupResponse
+    :: Int -- ^ 'gsgrsResponseStatus'
+    -> GetSkillGroupResponse
+getSkillGroupResponse pResponseStatus_ =
+  GetSkillGroupResponse'
+    {_gsgrsSkillGroup = Nothing, _gsgrsResponseStatus = pResponseStatus_}
+
+
+-- | The details of the skill group requested. Required.
+gsgrsSkillGroup :: Lens' GetSkillGroupResponse (Maybe SkillGroup)
+gsgrsSkillGroup = lens _gsgrsSkillGroup (\ s a -> s{_gsgrsSkillGroup = a})
+
+-- | -- | The response status code.
+gsgrsResponseStatus :: Lens' GetSkillGroupResponse Int
+gsgrsResponseStatus = lens _gsgrsResponseStatus (\ s a -> s{_gsgrsResponseStatus = a})
+
+instance NFData GetSkillGroupResponse where
diff --git a/gen/Network/AWS/AlexaBusiness/ListDeviceEvents.hs b/gen/Network/AWS/AlexaBusiness/ListDeviceEvents.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/ListDeviceEvents.hs
@@ -0,0 +1,178 @@
+{-# 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.AlexaBusiness.ListDeviceEvents
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists the Device Event history for up to 30 days. If EventType isn't specified in the request, this returns a list of all device events in reverse chronological order. If EventType is specified, this returns a list of device events for that EventType in reverse chronological order.
+--
+--
+module Network.AWS.AlexaBusiness.ListDeviceEvents
+    (
+    -- * Creating a Request
+      listDeviceEvents
+    , ListDeviceEvents
+    -- * Request Lenses
+    , ldeNextToken
+    , ldeEventType
+    , ldeMaxResults
+    , ldeDeviceARN
+
+    -- * Destructuring the Response
+    , listDeviceEventsResponse
+    , ListDeviceEventsResponse
+    -- * Response Lenses
+    , ldersNextToken
+    , ldersDeviceEvents
+    , ldersResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'listDeviceEvents' smart constructor.
+data ListDeviceEvents = ListDeviceEvents'
+  { _ldeNextToken  :: !(Maybe Text)
+  , _ldeEventType  :: !(Maybe DeviceEventType)
+  , _ldeMaxResults :: !(Maybe Nat)
+  , _ldeDeviceARN  :: !Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'ListDeviceEvents' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ldeNextToken' - An optional token returned from a prior request. Use this token for pagination of results from this action. If this parameter is specified, the response only includes results beyond the token, up to the value specified by MaxResults.
+--
+-- * 'ldeEventType' - The event type to filter device events.
+--
+-- * 'ldeMaxResults' - The maximum number of results to include in the response. If more results exist than the specified MaxResults value, a token is included in the response so that the remaining results can be retrieved. Required.
+--
+-- * 'ldeDeviceARN' - The ARN of a device.
+listDeviceEvents
+    :: Text -- ^ 'ldeDeviceARN'
+    -> ListDeviceEvents
+listDeviceEvents pDeviceARN_ =
+  ListDeviceEvents'
+    { _ldeNextToken = Nothing
+    , _ldeEventType = Nothing
+    , _ldeMaxResults = Nothing
+    , _ldeDeviceARN = pDeviceARN_
+    }
+
+
+-- | An optional token returned from a prior request. Use this token for pagination of results from this action. If this parameter is specified, the response only includes results beyond the token, up to the value specified by MaxResults.
+ldeNextToken :: Lens' ListDeviceEvents (Maybe Text)
+ldeNextToken = lens _ldeNextToken (\ s a -> s{_ldeNextToken = a})
+
+-- | The event type to filter device events.
+ldeEventType :: Lens' ListDeviceEvents (Maybe DeviceEventType)
+ldeEventType = lens _ldeEventType (\ s a -> s{_ldeEventType = a})
+
+-- | The maximum number of results to include in the response. If more results exist than the specified MaxResults value, a token is included in the response so that the remaining results can be retrieved. Required.
+ldeMaxResults :: Lens' ListDeviceEvents (Maybe Natural)
+ldeMaxResults = lens _ldeMaxResults (\ s a -> s{_ldeMaxResults = a}) . mapping _Nat
+
+-- | The ARN of a device.
+ldeDeviceARN :: Lens' ListDeviceEvents Text
+ldeDeviceARN = lens _ldeDeviceARN (\ s a -> s{_ldeDeviceARN = a})
+
+instance AWSRequest ListDeviceEvents where
+        type Rs ListDeviceEvents = ListDeviceEventsResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveJSON
+              (\ s h x ->
+                 ListDeviceEventsResponse' <$>
+                   (x .?> "NextToken") <*>
+                     (x .?> "DeviceEvents" .!@ mempty)
+                     <*> (pure (fromEnum s)))
+
+instance Hashable ListDeviceEvents where
+
+instance NFData ListDeviceEvents where
+
+instance ToHeaders ListDeviceEvents where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.ListDeviceEvents" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON ListDeviceEvents where
+        toJSON ListDeviceEvents'{..}
+          = object
+              (catMaybes
+                 [("NextToken" .=) <$> _ldeNextToken,
+                  ("EventType" .=) <$> _ldeEventType,
+                  ("MaxResults" .=) <$> _ldeMaxResults,
+                  Just ("DeviceArn" .= _ldeDeviceARN)])
+
+instance ToPath ListDeviceEvents where
+        toPath = const "/"
+
+instance ToQuery ListDeviceEvents where
+        toQuery = const mempty
+
+-- | /See:/ 'listDeviceEventsResponse' smart constructor.
+data ListDeviceEventsResponse = ListDeviceEventsResponse'
+  { _ldersNextToken      :: !(Maybe Text)
+  , _ldersDeviceEvents   :: !(Maybe [DeviceEvent])
+  , _ldersResponseStatus :: !Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'ListDeviceEventsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ldersNextToken' -
+--
+-- * 'ldersDeviceEvents' -
+--
+-- * 'ldersResponseStatus' - -- | The response status code.
+listDeviceEventsResponse
+    :: Int -- ^ 'ldersResponseStatus'
+    -> ListDeviceEventsResponse
+listDeviceEventsResponse pResponseStatus_ =
+  ListDeviceEventsResponse'
+    { _ldersNextToken = Nothing
+    , _ldersDeviceEvents = Nothing
+    , _ldersResponseStatus = pResponseStatus_
+    }
+
+
+-- |
+ldersNextToken :: Lens' ListDeviceEventsResponse (Maybe Text)
+ldersNextToken = lens _ldersNextToken (\ s a -> s{_ldersNextToken = a})
+
+-- |
+ldersDeviceEvents :: Lens' ListDeviceEventsResponse [DeviceEvent]
+ldersDeviceEvents = lens _ldersDeviceEvents (\ s a -> s{_ldersDeviceEvents = a}) . _Default . _Coerce
+
+-- | -- | The response status code.
+ldersResponseStatus :: Lens' ListDeviceEventsResponse Int
+ldersResponseStatus = lens _ldersResponseStatus (\ s a -> s{_ldersResponseStatus = a})
+
+instance NFData ListDeviceEventsResponse where
diff --git a/gen/Network/AWS/AlexaBusiness/ListSkills.hs b/gen/Network/AWS/AlexaBusiness/ListSkills.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/ListSkills.hs
@@ -0,0 +1,177 @@
+{-# 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.AlexaBusiness.ListSkills
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists all enabled skills in a specific skill group.
+--
+--
+--
+-- This operation returns paginated results.
+module Network.AWS.AlexaBusiness.ListSkills
+    (
+    -- * Creating a Request
+      listSkills
+    , ListSkills
+    -- * Request Lenses
+    , lsSkillGroupARN
+    , lsNextToken
+    , lsMaxResults
+
+    -- * Destructuring the Response
+    , listSkillsResponse
+    , ListSkillsResponse
+    -- * Response Lenses
+    , lsrsNextToken
+    , lsrsSkillSummaries
+    , lsrsResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Pager
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'listSkills' smart constructor.
+data ListSkills = ListSkills'
+  { _lsSkillGroupARN :: !(Maybe Text)
+  , _lsNextToken     :: !(Maybe Text)
+  , _lsMaxResults    :: !(Maybe Nat)
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'ListSkills' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'lsSkillGroupARN' - The ARN of the skill group for which to list enabled skills. Required.
+--
+-- * 'lsNextToken' - An optional token returned from a prior request. Use this token for pagination of results from this action. If this parameter is specified, the response includes only results beyond the token, up to the value specified by @MaxResults@ . Required.
+--
+-- * 'lsMaxResults' - The maximum number of results to include in the response. If more results exist than the specified @MaxResults@ value, a token is included in the response so that the remaining results can be retrieved. Required.
+listSkills
+    :: ListSkills
+listSkills =
+  ListSkills'
+    { _lsSkillGroupARN = Nothing
+    , _lsNextToken = Nothing
+    , _lsMaxResults = Nothing
+    }
+
+
+-- | The ARN of the skill group for which to list enabled skills. Required.
+lsSkillGroupARN :: Lens' ListSkills (Maybe Text)
+lsSkillGroupARN = lens _lsSkillGroupARN (\ s a -> s{_lsSkillGroupARN = a})
+
+-- | An optional token returned from a prior request. Use this token for pagination of results from this action. If this parameter is specified, the response includes only results beyond the token, up to the value specified by @MaxResults@ . Required.
+lsNextToken :: Lens' ListSkills (Maybe Text)
+lsNextToken = lens _lsNextToken (\ s a -> s{_lsNextToken = a})
+
+-- | The maximum number of results to include in the response. If more results exist than the specified @MaxResults@ value, a token is included in the response so that the remaining results can be retrieved. Required.
+lsMaxResults :: Lens' ListSkills (Maybe Natural)
+lsMaxResults = lens _lsMaxResults (\ s a -> s{_lsMaxResults = a}) . mapping _Nat
+
+instance AWSPager ListSkills where
+        page rq rs
+          | stop (rs ^. lsrsNextToken) = Nothing
+          | stop (rs ^. lsrsSkillSummaries) = Nothing
+          | otherwise =
+            Just $ rq & lsNextToken .~ rs ^. lsrsNextToken
+
+instance AWSRequest ListSkills where
+        type Rs ListSkills = ListSkillsResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveJSON
+              (\ s h x ->
+                 ListSkillsResponse' <$>
+                   (x .?> "NextToken") <*>
+                     (x .?> "SkillSummaries" .!@ mempty)
+                     <*> (pure (fromEnum s)))
+
+instance Hashable ListSkills where
+
+instance NFData ListSkills where
+
+instance ToHeaders ListSkills where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.ListSkills" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON ListSkills where
+        toJSON ListSkills'{..}
+          = object
+              (catMaybes
+                 [("SkillGroupArn" .=) <$> _lsSkillGroupARN,
+                  ("NextToken" .=) <$> _lsNextToken,
+                  ("MaxResults" .=) <$> _lsMaxResults])
+
+instance ToPath ListSkills where
+        toPath = const "/"
+
+instance ToQuery ListSkills where
+        toQuery = const mempty
+
+-- | /See:/ 'listSkillsResponse' smart constructor.
+data ListSkillsResponse = ListSkillsResponse'
+  { _lsrsNextToken      :: !(Maybe Text)
+  , _lsrsSkillSummaries :: !(Maybe [SkillSummary])
+  , _lsrsResponseStatus :: !Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'ListSkillsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'lsrsNextToken' - The token returned to indicate that there is more data available.
+--
+-- * 'lsrsSkillSummaries' - The list of enabled skills requested. Required.
+--
+-- * 'lsrsResponseStatus' - -- | The response status code.
+listSkillsResponse
+    :: Int -- ^ 'lsrsResponseStatus'
+    -> ListSkillsResponse
+listSkillsResponse pResponseStatus_ =
+  ListSkillsResponse'
+    { _lsrsNextToken = Nothing
+    , _lsrsSkillSummaries = Nothing
+    , _lsrsResponseStatus = pResponseStatus_
+    }
+
+
+-- | The token returned to indicate that there is more data available.
+lsrsNextToken :: Lens' ListSkillsResponse (Maybe Text)
+lsrsNextToken = lens _lsrsNextToken (\ s a -> s{_lsrsNextToken = a})
+
+-- | The list of enabled skills requested. Required.
+lsrsSkillSummaries :: Lens' ListSkillsResponse [SkillSummary]
+lsrsSkillSummaries = lens _lsrsSkillSummaries (\ s a -> s{_lsrsSkillSummaries = a}) . _Default . _Coerce
+
+-- | -- | The response status code.
+lsrsResponseStatus :: Lens' ListSkillsResponse Int
+lsrsResponseStatus = lens _lsrsResponseStatus (\ s a -> s{_lsrsResponseStatus = a})
+
+instance NFData ListSkillsResponse where
diff --git a/gen/Network/AWS/AlexaBusiness/ListTags.hs b/gen/Network/AWS/AlexaBusiness/ListTags.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/ListTags.hs
@@ -0,0 +1,173 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.AlexaBusiness.ListTags
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists all tags for a specific resource.
+--
+--
+--
+-- This operation returns paginated results.
+module Network.AWS.AlexaBusiness.ListTags
+    (
+    -- * Creating a Request
+      listTags
+    , ListTags
+    -- * Request Lenses
+    , ltNextToken
+    , ltMaxResults
+    , ltARN
+
+    -- * Destructuring the Response
+    , listTagsResponse
+    , ListTagsResponse
+    -- * Response Lenses
+    , ltrsNextToken
+    , ltrsTags
+    , ltrsResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Pager
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'listTags' smart constructor.
+data ListTags = ListTags'
+  { _ltNextToken  :: !(Maybe Text)
+  , _ltMaxResults :: !(Maybe Nat)
+  , _ltARN        :: !Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'ListTags' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ltNextToken' - An optional token returned from a prior request. Use this token for pagination of results from this action. If this parameter is specified, the response includes only results beyond the token, up to the value specified by @MaxResults@ .
+--
+-- * 'ltMaxResults' - The maximum number of results to include in the response. If more results exist than the specified @MaxResults@ value, a token is included in the response so that the remaining results can be retrieved.
+--
+-- * 'ltARN' - The ARN of the specific resource for which to list tags. Required.
+listTags
+    :: Text -- ^ 'ltARN'
+    -> ListTags
+listTags pARN_ =
+  ListTags' {_ltNextToken = Nothing, _ltMaxResults = Nothing, _ltARN = pARN_}
+
+
+-- | An optional token returned from a prior request. Use this token for pagination of results from this action. If this parameter is specified, the response includes only results beyond the token, up to the value specified by @MaxResults@ .
+ltNextToken :: Lens' ListTags (Maybe Text)
+ltNextToken = lens _ltNextToken (\ s a -> s{_ltNextToken = a})
+
+-- | The maximum number of results to include in the response. If more results exist than the specified @MaxResults@ value, a token is included in the response so that the remaining results can be retrieved.
+ltMaxResults :: Lens' ListTags (Maybe Natural)
+ltMaxResults = lens _ltMaxResults (\ s a -> s{_ltMaxResults = a}) . mapping _Nat
+
+-- | The ARN of the specific resource for which to list tags. Required.
+ltARN :: Lens' ListTags Text
+ltARN = lens _ltARN (\ s a -> s{_ltARN = a})
+
+instance AWSPager ListTags where
+        page rq rs
+          | stop (rs ^. ltrsNextToken) = Nothing
+          | stop (rs ^. ltrsTags) = Nothing
+          | otherwise =
+            Just $ rq & ltNextToken .~ rs ^. ltrsNextToken
+
+instance AWSRequest ListTags where
+        type Rs ListTags = ListTagsResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveJSON
+              (\ s h x ->
+                 ListTagsResponse' <$>
+                   (x .?> "NextToken") <*> (x .?> "Tags" .!@ mempty) <*>
+                     (pure (fromEnum s)))
+
+instance Hashable ListTags where
+
+instance NFData ListTags where
+
+instance ToHeaders ListTags where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.ListTags" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON ListTags where
+        toJSON ListTags'{..}
+          = object
+              (catMaybes
+                 [("NextToken" .=) <$> _ltNextToken,
+                  ("MaxResults" .=) <$> _ltMaxResults,
+                  Just ("Arn" .= _ltARN)])
+
+instance ToPath ListTags where
+        toPath = const "/"
+
+instance ToQuery ListTags where
+        toQuery = const mempty
+
+-- | /See:/ 'listTagsResponse' smart constructor.
+data ListTagsResponse = ListTagsResponse'
+  { _ltrsNextToken      :: !(Maybe Text)
+  , _ltrsTags           :: !(Maybe [Tag])
+  , _ltrsResponseStatus :: !Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'ListTagsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ltrsNextToken' - The token returned to indicate that there is more data available.
+--
+-- * 'ltrsTags' - The list of tags requested for the specific resource.
+--
+-- * 'ltrsResponseStatus' - -- | The response status code.
+listTagsResponse
+    :: Int -- ^ 'ltrsResponseStatus'
+    -> ListTagsResponse
+listTagsResponse pResponseStatus_ =
+  ListTagsResponse'
+    { _ltrsNextToken = Nothing
+    , _ltrsTags = Nothing
+    , _ltrsResponseStatus = pResponseStatus_
+    }
+
+
+-- | The token returned to indicate that there is more data available.
+ltrsNextToken :: Lens' ListTagsResponse (Maybe Text)
+ltrsNextToken = lens _ltrsNextToken (\ s a -> s{_ltrsNextToken = a})
+
+-- | The list of tags requested for the specific resource.
+ltrsTags :: Lens' ListTagsResponse [Tag]
+ltrsTags = lens _ltrsTags (\ s a -> s{_ltrsTags = a}) . _Default . _Coerce
+
+-- | -- | The response status code.
+ltrsResponseStatus :: Lens' ListTagsResponse Int
+ltrsResponseStatus = lens _ltrsResponseStatus (\ s a -> s{_ltrsResponseStatus = a})
+
+instance NFData ListTagsResponse where
diff --git a/gen/Network/AWS/AlexaBusiness/PutRoomSkillParameter.hs b/gen/Network/AWS/AlexaBusiness/PutRoomSkillParameter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/PutRoomSkillParameter.hs
@@ -0,0 +1,150 @@
+{-# 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.AlexaBusiness.PutRoomSkillParameter
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates room skill parameter details by room, skill, and parameter key ID. Not all skills have a room skill parameter.
+--
+--
+module Network.AWS.AlexaBusiness.PutRoomSkillParameter
+    (
+    -- * Creating a Request
+      putRoomSkillParameter
+    , PutRoomSkillParameter
+    -- * Request Lenses
+    , prspRoomARN
+    , prspSkillId
+    , prspRoomSkillParameter
+
+    -- * Destructuring the Response
+    , putRoomSkillParameterResponse
+    , PutRoomSkillParameterResponse
+    -- * Response Lenses
+    , prsprsResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'putRoomSkillParameter' smart constructor.
+data PutRoomSkillParameter = PutRoomSkillParameter'
+  { _prspRoomARN            :: !(Maybe Text)
+  , _prspSkillId            :: !Text
+  , _prspRoomSkillParameter :: !RoomSkillParameter
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'PutRoomSkillParameter' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'prspRoomARN' - The ARN of the room associated with the room skill parameter. Required.
+--
+-- * 'prspSkillId' - The ARN of the skill associated with the room skill parameter. Required.
+--
+-- * 'prspRoomSkillParameter' - The updated room skill parameter. Required.
+putRoomSkillParameter
+    :: Text -- ^ 'prspSkillId'
+    -> RoomSkillParameter -- ^ 'prspRoomSkillParameter'
+    -> PutRoomSkillParameter
+putRoomSkillParameter pSkillId_ pRoomSkillParameter_ =
+  PutRoomSkillParameter'
+    { _prspRoomARN = Nothing
+    , _prspSkillId = pSkillId_
+    , _prspRoomSkillParameter = pRoomSkillParameter_
+    }
+
+
+-- | The ARN of the room associated with the room skill parameter. Required.
+prspRoomARN :: Lens' PutRoomSkillParameter (Maybe Text)
+prspRoomARN = lens _prspRoomARN (\ s a -> s{_prspRoomARN = a})
+
+-- | The ARN of the skill associated with the room skill parameter. Required.
+prspSkillId :: Lens' PutRoomSkillParameter Text
+prspSkillId = lens _prspSkillId (\ s a -> s{_prspSkillId = a})
+
+-- | The updated room skill parameter. Required.
+prspRoomSkillParameter :: Lens' PutRoomSkillParameter RoomSkillParameter
+prspRoomSkillParameter = lens _prspRoomSkillParameter (\ s a -> s{_prspRoomSkillParameter = a})
+
+instance AWSRequest PutRoomSkillParameter where
+        type Rs PutRoomSkillParameter =
+             PutRoomSkillParameterResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveEmpty
+              (\ s h x ->
+                 PutRoomSkillParameterResponse' <$>
+                   (pure (fromEnum s)))
+
+instance Hashable PutRoomSkillParameter where
+
+instance NFData PutRoomSkillParameter where
+
+instance ToHeaders PutRoomSkillParameter where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.PutRoomSkillParameter" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON PutRoomSkillParameter where
+        toJSON PutRoomSkillParameter'{..}
+          = object
+              (catMaybes
+                 [("RoomArn" .=) <$> _prspRoomARN,
+                  Just ("SkillId" .= _prspSkillId),
+                  Just
+                    ("RoomSkillParameter" .= _prspRoomSkillParameter)])
+
+instance ToPath PutRoomSkillParameter where
+        toPath = const "/"
+
+instance ToQuery PutRoomSkillParameter where
+        toQuery = const mempty
+
+-- | /See:/ 'putRoomSkillParameterResponse' smart constructor.
+newtype PutRoomSkillParameterResponse = PutRoomSkillParameterResponse'
+  { _prsprsResponseStatus :: Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'PutRoomSkillParameterResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'prsprsResponseStatus' - -- | The response status code.
+putRoomSkillParameterResponse
+    :: Int -- ^ 'prsprsResponseStatus'
+    -> PutRoomSkillParameterResponse
+putRoomSkillParameterResponse pResponseStatus_ =
+  PutRoomSkillParameterResponse' {_prsprsResponseStatus = pResponseStatus_}
+
+
+-- | -- | The response status code.
+prsprsResponseStatus :: Lens' PutRoomSkillParameterResponse Int
+prsprsResponseStatus = lens _prsprsResponseStatus (\ s a -> s{_prsprsResponseStatus = a})
+
+instance NFData PutRoomSkillParameterResponse where
diff --git a/gen/Network/AWS/AlexaBusiness/ResolveRoom.hs b/gen/Network/AWS/AlexaBusiness/ResolveRoom.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/ResolveRoom.hs
@@ -0,0 +1,166 @@
+{-# 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.AlexaBusiness.ResolveRoom
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Determines the details for the room from which a skill request was invoked. This operation is used by skill developers.
+--
+--
+module Network.AWS.AlexaBusiness.ResolveRoom
+    (
+    -- * Creating a Request
+      resolveRoom
+    , ResolveRoom
+    -- * Request Lenses
+    , rrUserId
+    , rrSkillId
+
+    -- * Destructuring the Response
+    , resolveRoomResponse
+    , ResolveRoomResponse
+    -- * Response Lenses
+    , rrrsRoomSkillParameters
+    , rrrsRoomARN
+    , rrrsRoomName
+    , rrrsResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'resolveRoom' smart constructor.
+data ResolveRoom = ResolveRoom'
+  { _rrUserId  :: !Text
+  , _rrSkillId :: !Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'ResolveRoom' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'rrUserId' - The ARN of the user. Required.
+--
+-- * 'rrSkillId' - The ARN of the skill that was requested. Required.
+resolveRoom
+    :: Text -- ^ 'rrUserId'
+    -> Text -- ^ 'rrSkillId'
+    -> ResolveRoom
+resolveRoom pUserId_ pSkillId_ =
+  ResolveRoom' {_rrUserId = pUserId_, _rrSkillId = pSkillId_}
+
+
+-- | The ARN of the user. Required.
+rrUserId :: Lens' ResolveRoom Text
+rrUserId = lens _rrUserId (\ s a -> s{_rrUserId = a})
+
+-- | The ARN of the skill that was requested. Required.
+rrSkillId :: Lens' ResolveRoom Text
+rrSkillId = lens _rrSkillId (\ s a -> s{_rrSkillId = a})
+
+instance AWSRequest ResolveRoom where
+        type Rs ResolveRoom = ResolveRoomResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveJSON
+              (\ s h x ->
+                 ResolveRoomResponse' <$>
+                   (x .?> "RoomSkillParameters" .!@ mempty) <*>
+                     (x .?> "RoomArn")
+                     <*> (x .?> "RoomName")
+                     <*> (pure (fromEnum s)))
+
+instance Hashable ResolveRoom where
+
+instance NFData ResolveRoom where
+
+instance ToHeaders ResolveRoom where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.ResolveRoom" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON ResolveRoom where
+        toJSON ResolveRoom'{..}
+          = object
+              (catMaybes
+                 [Just ("UserId" .= _rrUserId),
+                  Just ("SkillId" .= _rrSkillId)])
+
+instance ToPath ResolveRoom where
+        toPath = const "/"
+
+instance ToQuery ResolveRoom where
+        toQuery = const mempty
+
+-- | /See:/ 'resolveRoomResponse' smart constructor.
+data ResolveRoomResponse = ResolveRoomResponse'
+  { _rrrsRoomSkillParameters :: !(Maybe [RoomSkillParameter])
+  , _rrrsRoomARN             :: !(Maybe Text)
+  , _rrrsRoomName            :: !(Maybe Text)
+  , _rrrsResponseStatus      :: !Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'ResolveRoomResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'rrrsRoomSkillParameters' - Response to get the room profile request. Required.
+--
+-- * 'rrrsRoomARN' - The ARN of the room from which the skill request was invoked.
+--
+-- * 'rrrsRoomName' - The name of the room from which the skill request was invoked.
+--
+-- * 'rrrsResponseStatus' - -- | The response status code.
+resolveRoomResponse
+    :: Int -- ^ 'rrrsResponseStatus'
+    -> ResolveRoomResponse
+resolveRoomResponse pResponseStatus_ =
+  ResolveRoomResponse'
+    { _rrrsRoomSkillParameters = Nothing
+    , _rrrsRoomARN = Nothing
+    , _rrrsRoomName = Nothing
+    , _rrrsResponseStatus = pResponseStatus_
+    }
+
+
+-- | Response to get the room profile request. Required.
+rrrsRoomSkillParameters :: Lens' ResolveRoomResponse [RoomSkillParameter]
+rrrsRoomSkillParameters = lens _rrrsRoomSkillParameters (\ s a -> s{_rrrsRoomSkillParameters = a}) . _Default . _Coerce
+
+-- | The ARN of the room from which the skill request was invoked.
+rrrsRoomARN :: Lens' ResolveRoomResponse (Maybe Text)
+rrrsRoomARN = lens _rrrsRoomARN (\ s a -> s{_rrrsRoomARN = a})
+
+-- | The name of the room from which the skill request was invoked.
+rrrsRoomName :: Lens' ResolveRoomResponse (Maybe Text)
+rrrsRoomName = lens _rrrsRoomName (\ s a -> s{_rrrsRoomName = a})
+
+-- | -- | The response status code.
+rrrsResponseStatus :: Lens' ResolveRoomResponse Int
+rrrsResponseStatus = lens _rrrsResponseStatus (\ s a -> s{_rrrsResponseStatus = a})
+
+instance NFData ResolveRoomResponse where
diff --git a/gen/Network/AWS/AlexaBusiness/RevokeInvitation.hs b/gen/Network/AWS/AlexaBusiness/RevokeInvitation.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/RevokeInvitation.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.AlexaBusiness.RevokeInvitation
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Revokes an invitation and invalidates the enrollment URL.
+--
+--
+module Network.AWS.AlexaBusiness.RevokeInvitation
+    (
+    -- * Creating a Request
+      revokeInvitation
+    , RevokeInvitation
+    -- * Request Lenses
+    , riEnrollmentId
+    , riUserARN
+
+    -- * Destructuring the Response
+    , revokeInvitationResponse
+    , RevokeInvitationResponse
+    -- * Response Lenses
+    , rirsResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'revokeInvitation' smart constructor.
+data RevokeInvitation = RevokeInvitation'
+  { _riEnrollmentId :: !(Maybe Text)
+  , _riUserARN      :: !(Maybe Text)
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'RevokeInvitation' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'riEnrollmentId' - The ARN of the enrollment invitation to revoke. Required.
+--
+-- * 'riUserARN' - The ARN of the user for whom to revoke an enrollment invitation. Required.
+revokeInvitation
+    :: RevokeInvitation
+revokeInvitation =
+  RevokeInvitation' {_riEnrollmentId = Nothing, _riUserARN = Nothing}
+
+
+-- | The ARN of the enrollment invitation to revoke. Required.
+riEnrollmentId :: Lens' RevokeInvitation (Maybe Text)
+riEnrollmentId = lens _riEnrollmentId (\ s a -> s{_riEnrollmentId = a})
+
+-- | The ARN of the user for whom to revoke an enrollment invitation. Required.
+riUserARN :: Lens' RevokeInvitation (Maybe Text)
+riUserARN = lens _riUserARN (\ s a -> s{_riUserARN = a})
+
+instance AWSRequest RevokeInvitation where
+        type Rs RevokeInvitation = RevokeInvitationResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveEmpty
+              (\ s h x ->
+                 RevokeInvitationResponse' <$> (pure (fromEnum s)))
+
+instance Hashable RevokeInvitation where
+
+instance NFData RevokeInvitation where
+
+instance ToHeaders RevokeInvitation where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.RevokeInvitation" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON RevokeInvitation where
+        toJSON RevokeInvitation'{..}
+          = object
+              (catMaybes
+                 [("EnrollmentId" .=) <$> _riEnrollmentId,
+                  ("UserArn" .=) <$> _riUserARN])
+
+instance ToPath RevokeInvitation where
+        toPath = const "/"
+
+instance ToQuery RevokeInvitation where
+        toQuery = const mempty
+
+-- | /See:/ 'revokeInvitationResponse' smart constructor.
+newtype RevokeInvitationResponse = RevokeInvitationResponse'
+  { _rirsResponseStatus :: Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'RevokeInvitationResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'rirsResponseStatus' - -- | The response status code.
+revokeInvitationResponse
+    :: Int -- ^ 'rirsResponseStatus'
+    -> RevokeInvitationResponse
+revokeInvitationResponse pResponseStatus_ =
+  RevokeInvitationResponse' {_rirsResponseStatus = pResponseStatus_}
+
+
+-- | -- | The response status code.
+rirsResponseStatus :: Lens' RevokeInvitationResponse Int
+rirsResponseStatus = lens _rirsResponseStatus (\ s a -> s{_rirsResponseStatus = a})
+
+instance NFData RevokeInvitationResponse where
diff --git a/gen/Network/AWS/AlexaBusiness/SearchAddressBooks.hs b/gen/Network/AWS/AlexaBusiness/SearchAddressBooks.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/SearchAddressBooks.hs
@@ -0,0 +1,189 @@
+{-# 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.AlexaBusiness.SearchAddressBooks
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Searches address books and lists the ones that meet a set of filter and sort criteria.
+--
+--
+module Network.AWS.AlexaBusiness.SearchAddressBooks
+    (
+    -- * Creating a Request
+      searchAddressBooks
+    , SearchAddressBooks
+    -- * Request Lenses
+    , sabFilters
+    , sabSortCriteria
+    , sabNextToken
+    , sabMaxResults
+
+    -- * Destructuring the Response
+    , searchAddressBooksResponse
+    , SearchAddressBooksResponse
+    -- * Response Lenses
+    , sabrsNextToken
+    , sabrsAddressBooks
+    , sabrsTotalCount
+    , sabrsResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'searchAddressBooks' smart constructor.
+data SearchAddressBooks = SearchAddressBooks'
+  { _sabFilters      :: !(Maybe [Filter])
+  , _sabSortCriteria :: !(Maybe [Sort])
+  , _sabNextToken    :: !(Maybe Text)
+  , _sabMaxResults   :: !(Maybe Nat)
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'SearchAddressBooks' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sabFilters' - The filters to use to list a specified set of address books. The supported filter key is AddressBookName.
+--
+-- * 'sabSortCriteria' - The sort order to use in listing the specified set of address books. The supported sort key is AddressBookName.
+--
+-- * 'sabNextToken' - An optional token returned from a prior request. Use this token for pagination of results from this action. If this parameter is specified, the response only includes results beyond the token, up to the value specified by MaxResults.
+--
+-- * 'sabMaxResults' - The maximum number of results to include in the response. If more results exist than the specified MaxResults value, a token is included in the response so that the remaining results can be retrieved.
+searchAddressBooks
+    :: SearchAddressBooks
+searchAddressBooks =
+  SearchAddressBooks'
+    { _sabFilters = Nothing
+    , _sabSortCriteria = Nothing
+    , _sabNextToken = Nothing
+    , _sabMaxResults = Nothing
+    }
+
+
+-- | The filters to use to list a specified set of address books. The supported filter key is AddressBookName.
+sabFilters :: Lens' SearchAddressBooks [Filter]
+sabFilters = lens _sabFilters (\ s a -> s{_sabFilters = a}) . _Default . _Coerce
+
+-- | The sort order to use in listing the specified set of address books. The supported sort key is AddressBookName.
+sabSortCriteria :: Lens' SearchAddressBooks [Sort]
+sabSortCriteria = lens _sabSortCriteria (\ s a -> s{_sabSortCriteria = a}) . _Default . _Coerce
+
+-- | An optional token returned from a prior request. Use this token for pagination of results from this action. If this parameter is specified, the response only includes results beyond the token, up to the value specified by MaxResults.
+sabNextToken :: Lens' SearchAddressBooks (Maybe Text)
+sabNextToken = lens _sabNextToken (\ s a -> s{_sabNextToken = a})
+
+-- | The maximum number of results to include in the response. If more results exist than the specified MaxResults value, a token is included in the response so that the remaining results can be retrieved.
+sabMaxResults :: Lens' SearchAddressBooks (Maybe Natural)
+sabMaxResults = lens _sabMaxResults (\ s a -> s{_sabMaxResults = a}) . mapping _Nat
+
+instance AWSRequest SearchAddressBooks where
+        type Rs SearchAddressBooks =
+             SearchAddressBooksResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveJSON
+              (\ s h x ->
+                 SearchAddressBooksResponse' <$>
+                   (x .?> "NextToken") <*>
+                     (x .?> "AddressBooks" .!@ mempty)
+                     <*> (x .?> "TotalCount")
+                     <*> (pure (fromEnum s)))
+
+instance Hashable SearchAddressBooks where
+
+instance NFData SearchAddressBooks where
+
+instance ToHeaders SearchAddressBooks where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.SearchAddressBooks" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON SearchAddressBooks where
+        toJSON SearchAddressBooks'{..}
+          = object
+              (catMaybes
+                 [("Filters" .=) <$> _sabFilters,
+                  ("SortCriteria" .=) <$> _sabSortCriteria,
+                  ("NextToken" .=) <$> _sabNextToken,
+                  ("MaxResults" .=) <$> _sabMaxResults])
+
+instance ToPath SearchAddressBooks where
+        toPath = const "/"
+
+instance ToQuery SearchAddressBooks where
+        toQuery = const mempty
+
+-- | /See:/ 'searchAddressBooksResponse' smart constructor.
+data SearchAddressBooksResponse = SearchAddressBooksResponse'
+  { _sabrsNextToken      :: !(Maybe Text)
+  , _sabrsAddressBooks   :: !(Maybe [AddressBookData])
+  , _sabrsTotalCount     :: !(Maybe Int)
+  , _sabrsResponseStatus :: !Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'SearchAddressBooksResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sabrsNextToken' - The token returned to indicate that there is more data available.
+--
+-- * 'sabrsAddressBooks' - The address books that meet the specified set of filter criteria, in sort order.
+--
+-- * 'sabrsTotalCount' - The total number of address books returned.
+--
+-- * 'sabrsResponseStatus' - -- | The response status code.
+searchAddressBooksResponse
+    :: Int -- ^ 'sabrsResponseStatus'
+    -> SearchAddressBooksResponse
+searchAddressBooksResponse pResponseStatus_ =
+  SearchAddressBooksResponse'
+    { _sabrsNextToken = Nothing
+    , _sabrsAddressBooks = Nothing
+    , _sabrsTotalCount = Nothing
+    , _sabrsResponseStatus = pResponseStatus_
+    }
+
+
+-- | The token returned to indicate that there is more data available.
+sabrsNextToken :: Lens' SearchAddressBooksResponse (Maybe Text)
+sabrsNextToken = lens _sabrsNextToken (\ s a -> s{_sabrsNextToken = a})
+
+-- | The address books that meet the specified set of filter criteria, in sort order.
+sabrsAddressBooks :: Lens' SearchAddressBooksResponse [AddressBookData]
+sabrsAddressBooks = lens _sabrsAddressBooks (\ s a -> s{_sabrsAddressBooks = a}) . _Default . _Coerce
+
+-- | The total number of address books returned.
+sabrsTotalCount :: Lens' SearchAddressBooksResponse (Maybe Int)
+sabrsTotalCount = lens _sabrsTotalCount (\ s a -> s{_sabrsTotalCount = a})
+
+-- | -- | The response status code.
+sabrsResponseStatus :: Lens' SearchAddressBooksResponse Int
+sabrsResponseStatus = lens _sabrsResponseStatus (\ s a -> s{_sabrsResponseStatus = a})
+
+instance NFData SearchAddressBooksResponse where
diff --git a/gen/Network/AWS/AlexaBusiness/SearchContacts.hs b/gen/Network/AWS/AlexaBusiness/SearchContacts.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/SearchContacts.hs
@@ -0,0 +1,186 @@
+{-# 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.AlexaBusiness.SearchContacts
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Searches contacts and lists the ones that meet a set of filter and sort criteria.
+--
+--
+module Network.AWS.AlexaBusiness.SearchContacts
+    (
+    -- * Creating a Request
+      searchContacts
+    , SearchContacts
+    -- * Request Lenses
+    , scFilters
+    , scSortCriteria
+    , scNextToken
+    , scMaxResults
+
+    -- * Destructuring the Response
+    , searchContactsResponse
+    , SearchContactsResponse
+    -- * Response Lenses
+    , scrsNextToken
+    , scrsContacts
+    , scrsTotalCount
+    , scrsResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'searchContacts' smart constructor.
+data SearchContacts = SearchContacts'
+  { _scFilters      :: !(Maybe [Filter])
+  , _scSortCriteria :: !(Maybe [Sort])
+  , _scNextToken    :: !(Maybe Text)
+  , _scMaxResults   :: !(Maybe Nat)
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'SearchContacts' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'scFilters' - The filters to use to list a specified set of address books. The supported filter keys are DisplayName, FirstName, LastName, and AddressBookArns.
+--
+-- * 'scSortCriteria' - The sort order to use in listing the specified set of contacts. The supported sort keys are DisplayName, FirstName, and LastName.
+--
+-- * 'scNextToken' - An optional token returned from a prior request. Use this token for pagination of results from this action. If this parameter is specified, the response only includes results beyond the token, up to the value specified by MaxResults.
+--
+-- * 'scMaxResults' - The maximum number of results to include in the response. If more results exist than the specified MaxResults value, a token is included in the response so that the remaining results can be retrieved.
+searchContacts
+    :: SearchContacts
+searchContacts =
+  SearchContacts'
+    { _scFilters = Nothing
+    , _scSortCriteria = Nothing
+    , _scNextToken = Nothing
+    , _scMaxResults = Nothing
+    }
+
+
+-- | The filters to use to list a specified set of address books. The supported filter keys are DisplayName, FirstName, LastName, and AddressBookArns.
+scFilters :: Lens' SearchContacts [Filter]
+scFilters = lens _scFilters (\ s a -> s{_scFilters = a}) . _Default . _Coerce
+
+-- | The sort order to use in listing the specified set of contacts. The supported sort keys are DisplayName, FirstName, and LastName.
+scSortCriteria :: Lens' SearchContacts [Sort]
+scSortCriteria = lens _scSortCriteria (\ s a -> s{_scSortCriteria = a}) . _Default . _Coerce
+
+-- | An optional token returned from a prior request. Use this token for pagination of results from this action. If this parameter is specified, the response only includes results beyond the token, up to the value specified by MaxResults.
+scNextToken :: Lens' SearchContacts (Maybe Text)
+scNextToken = lens _scNextToken (\ s a -> s{_scNextToken = a})
+
+-- | The maximum number of results to include in the response. If more results exist than the specified MaxResults value, a token is included in the response so that the remaining results can be retrieved.
+scMaxResults :: Lens' SearchContacts (Maybe Natural)
+scMaxResults = lens _scMaxResults (\ s a -> s{_scMaxResults = a}) . mapping _Nat
+
+instance AWSRequest SearchContacts where
+        type Rs SearchContacts = SearchContactsResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveJSON
+              (\ s h x ->
+                 SearchContactsResponse' <$>
+                   (x .?> "NextToken") <*> (x .?> "Contacts" .!@ mempty)
+                     <*> (x .?> "TotalCount")
+                     <*> (pure (fromEnum s)))
+
+instance Hashable SearchContacts where
+
+instance NFData SearchContacts where
+
+instance ToHeaders SearchContacts where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.SearchContacts" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON SearchContacts where
+        toJSON SearchContacts'{..}
+          = object
+              (catMaybes
+                 [("Filters" .=) <$> _scFilters,
+                  ("SortCriteria" .=) <$> _scSortCriteria,
+                  ("NextToken" .=) <$> _scNextToken,
+                  ("MaxResults" .=) <$> _scMaxResults])
+
+instance ToPath SearchContacts where
+        toPath = const "/"
+
+instance ToQuery SearchContacts where
+        toQuery = const mempty
+
+-- | /See:/ 'searchContactsResponse' smart constructor.
+data SearchContactsResponse = SearchContactsResponse'
+  { _scrsNextToken      :: !(Maybe Text)
+  , _scrsContacts       :: !(Maybe [ContactData])
+  , _scrsTotalCount     :: !(Maybe Int)
+  , _scrsResponseStatus :: !Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'SearchContactsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'scrsNextToken' - The token returned to indicate that there is more data available.
+--
+-- * 'scrsContacts' - The contacts that meet the specified set of filter criteria, in sort order.
+--
+-- * 'scrsTotalCount' - The total number of contacts returned.
+--
+-- * 'scrsResponseStatus' - -- | The response status code.
+searchContactsResponse
+    :: Int -- ^ 'scrsResponseStatus'
+    -> SearchContactsResponse
+searchContactsResponse pResponseStatus_ =
+  SearchContactsResponse'
+    { _scrsNextToken = Nothing
+    , _scrsContacts = Nothing
+    , _scrsTotalCount = Nothing
+    , _scrsResponseStatus = pResponseStatus_
+    }
+
+
+-- | The token returned to indicate that there is more data available.
+scrsNextToken :: Lens' SearchContactsResponse (Maybe Text)
+scrsNextToken = lens _scrsNextToken (\ s a -> s{_scrsNextToken = a})
+
+-- | The contacts that meet the specified set of filter criteria, in sort order.
+scrsContacts :: Lens' SearchContactsResponse [ContactData]
+scrsContacts = lens _scrsContacts (\ s a -> s{_scrsContacts = a}) . _Default . _Coerce
+
+-- | The total number of contacts returned.
+scrsTotalCount :: Lens' SearchContactsResponse (Maybe Int)
+scrsTotalCount = lens _scrsTotalCount (\ s a -> s{_scrsTotalCount = a})
+
+-- | -- | The response status code.
+scrsResponseStatus :: Lens' SearchContactsResponse Int
+scrsResponseStatus = lens _scrsResponseStatus (\ s a -> s{_scrsResponseStatus = a})
+
+instance NFData SearchContactsResponse where
diff --git a/gen/Network/AWS/AlexaBusiness/SearchDevices.hs b/gen/Network/AWS/AlexaBusiness/SearchDevices.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/SearchDevices.hs
@@ -0,0 +1,196 @@
+{-# 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.AlexaBusiness.SearchDevices
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Searches devices and lists the ones that meet a set of filter criteria.
+--
+--
+--
+-- This operation returns paginated results.
+module Network.AWS.AlexaBusiness.SearchDevices
+    (
+    -- * Creating a Request
+      searchDevices
+    , SearchDevices
+    -- * Request Lenses
+    , sdFilters
+    , sdSortCriteria
+    , sdNextToken
+    , sdMaxResults
+
+    -- * Destructuring the Response
+    , searchDevicesResponse
+    , SearchDevicesResponse
+    -- * Response Lenses
+    , sdrsNextToken
+    , sdrsDevices
+    , sdrsTotalCount
+    , sdrsResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Pager
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'searchDevices' smart constructor.
+data SearchDevices = SearchDevices'
+  { _sdFilters      :: !(Maybe [Filter])
+  , _sdSortCriteria :: !(Maybe [Sort])
+  , _sdNextToken    :: !(Maybe Text)
+  , _sdMaxResults   :: !(Maybe Nat)
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'SearchDevices' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sdFilters' - The filters to use to list a specified set of devices. Supported filter keys are DeviceName, DeviceStatus, DeviceStatusDetailCode, RoomName, DeviceType, DeviceSerialNumber, UnassociatedOnly, and ConnectionStatus (ONLINE and OFFLINE).
+--
+-- * 'sdSortCriteria' - The sort order to use in listing the specified set of devices. Supported sort keys are DeviceName, DeviceStatus, RoomName, DeviceType, DeviceSerialNumber, and ConnectionStatus.
+--
+-- * 'sdNextToken' - An optional token returned from a prior request. Use this token for pagination of results from this action. If this parameter is specified, the response includes only results beyond the token, up to the value specified by @MaxResults@ .
+--
+-- * 'sdMaxResults' - The maximum number of results to include in the response. If more results exist than the specified @MaxResults@ value, a token is included in the response so that the remaining results can be retrieved.
+searchDevices
+    :: SearchDevices
+searchDevices =
+  SearchDevices'
+    { _sdFilters = Nothing
+    , _sdSortCriteria = Nothing
+    , _sdNextToken = Nothing
+    , _sdMaxResults = Nothing
+    }
+
+
+-- | The filters to use to list a specified set of devices. Supported filter keys are DeviceName, DeviceStatus, DeviceStatusDetailCode, RoomName, DeviceType, DeviceSerialNumber, UnassociatedOnly, and ConnectionStatus (ONLINE and OFFLINE).
+sdFilters :: Lens' SearchDevices [Filter]
+sdFilters = lens _sdFilters (\ s a -> s{_sdFilters = a}) . _Default . _Coerce
+
+-- | The sort order to use in listing the specified set of devices. Supported sort keys are DeviceName, DeviceStatus, RoomName, DeviceType, DeviceSerialNumber, and ConnectionStatus.
+sdSortCriteria :: Lens' SearchDevices [Sort]
+sdSortCriteria = lens _sdSortCriteria (\ s a -> s{_sdSortCriteria = a}) . _Default . _Coerce
+
+-- | An optional token returned from a prior request. Use this token for pagination of results from this action. If this parameter is specified, the response includes only results beyond the token, up to the value specified by @MaxResults@ .
+sdNextToken :: Lens' SearchDevices (Maybe Text)
+sdNextToken = lens _sdNextToken (\ s a -> s{_sdNextToken = a})
+
+-- | The maximum number of results to include in the response. If more results exist than the specified @MaxResults@ value, a token is included in the response so that the remaining results can be retrieved.
+sdMaxResults :: Lens' SearchDevices (Maybe Natural)
+sdMaxResults = lens _sdMaxResults (\ s a -> s{_sdMaxResults = a}) . mapping _Nat
+
+instance AWSPager SearchDevices where
+        page rq rs
+          | stop (rs ^. sdrsNextToken) = Nothing
+          | stop (rs ^. sdrsDevices) = Nothing
+          | otherwise =
+            Just $ rq & sdNextToken .~ rs ^. sdrsNextToken
+
+instance AWSRequest SearchDevices where
+        type Rs SearchDevices = SearchDevicesResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveJSON
+              (\ s h x ->
+                 SearchDevicesResponse' <$>
+                   (x .?> "NextToken") <*> (x .?> "Devices" .!@ mempty)
+                     <*> (x .?> "TotalCount")
+                     <*> (pure (fromEnum s)))
+
+instance Hashable SearchDevices where
+
+instance NFData SearchDevices where
+
+instance ToHeaders SearchDevices where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.SearchDevices" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON SearchDevices where
+        toJSON SearchDevices'{..}
+          = object
+              (catMaybes
+                 [("Filters" .=) <$> _sdFilters,
+                  ("SortCriteria" .=) <$> _sdSortCriteria,
+                  ("NextToken" .=) <$> _sdNextToken,
+                  ("MaxResults" .=) <$> _sdMaxResults])
+
+instance ToPath SearchDevices where
+        toPath = const "/"
+
+instance ToQuery SearchDevices where
+        toQuery = const mempty
+
+-- | /See:/ 'searchDevicesResponse' smart constructor.
+data SearchDevicesResponse = SearchDevicesResponse'
+  { _sdrsNextToken      :: !(Maybe Text)
+  , _sdrsDevices        :: !(Maybe [DeviceData])
+  , _sdrsTotalCount     :: !(Maybe Int)
+  , _sdrsResponseStatus :: !Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'SearchDevicesResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sdrsNextToken' - The token returned to indicate that there is more data available.
+--
+-- * 'sdrsDevices' - The devices that meet the specified set of filter criteria, in sort order.
+--
+-- * 'sdrsTotalCount' - The total number of devices returned.
+--
+-- * 'sdrsResponseStatus' - -- | The response status code.
+searchDevicesResponse
+    :: Int -- ^ 'sdrsResponseStatus'
+    -> SearchDevicesResponse
+searchDevicesResponse pResponseStatus_ =
+  SearchDevicesResponse'
+    { _sdrsNextToken = Nothing
+    , _sdrsDevices = Nothing
+    , _sdrsTotalCount = Nothing
+    , _sdrsResponseStatus = pResponseStatus_
+    }
+
+
+-- | The token returned to indicate that there is more data available.
+sdrsNextToken :: Lens' SearchDevicesResponse (Maybe Text)
+sdrsNextToken = lens _sdrsNextToken (\ s a -> s{_sdrsNextToken = a})
+
+-- | The devices that meet the specified set of filter criteria, in sort order.
+sdrsDevices :: Lens' SearchDevicesResponse [DeviceData]
+sdrsDevices = lens _sdrsDevices (\ s a -> s{_sdrsDevices = a}) . _Default . _Coerce
+
+-- | The total number of devices returned.
+sdrsTotalCount :: Lens' SearchDevicesResponse (Maybe Int)
+sdrsTotalCount = lens _sdrsTotalCount (\ s a -> s{_sdrsTotalCount = a})
+
+-- | -- | The response status code.
+sdrsResponseStatus :: Lens' SearchDevicesResponse Int
+sdrsResponseStatus = lens _sdrsResponseStatus (\ s a -> s{_sdrsResponseStatus = a})
+
+instance NFData SearchDevicesResponse where
diff --git a/gen/Network/AWS/AlexaBusiness/SearchProfiles.hs b/gen/Network/AWS/AlexaBusiness/SearchProfiles.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/SearchProfiles.hs
@@ -0,0 +1,196 @@
+{-# 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.AlexaBusiness.SearchProfiles
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Searches room profiles and lists the ones that meet a set of filter criteria.
+--
+--
+--
+-- This operation returns paginated results.
+module Network.AWS.AlexaBusiness.SearchProfiles
+    (
+    -- * Creating a Request
+      searchProfiles
+    , SearchProfiles
+    -- * Request Lenses
+    , spFilters
+    , spSortCriteria
+    , spNextToken
+    , spMaxResults
+
+    -- * Destructuring the Response
+    , searchProfilesResponse
+    , SearchProfilesResponse
+    -- * Response Lenses
+    , sprsProfiles
+    , sprsNextToken
+    , sprsTotalCount
+    , sprsResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Pager
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'searchProfiles' smart constructor.
+data SearchProfiles = SearchProfiles'
+  { _spFilters      :: !(Maybe [Filter])
+  , _spSortCriteria :: !(Maybe [Sort])
+  , _spNextToken    :: !(Maybe Text)
+  , _spMaxResults   :: !(Maybe Nat)
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'SearchProfiles' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'spFilters' - The filters to use to list a specified set of room profiles. Supported filter keys are ProfileName and Address. Required.
+--
+-- * 'spSortCriteria' - The sort order to use in listing the specified set of room profiles. Supported sort keys are ProfileName and Address.
+--
+-- * 'spNextToken' - An optional token returned from a prior request. Use this token for pagination of results from this action. If this parameter is specified, the response includes only results beyond the token, up to the value specified by @MaxResults@ .
+--
+-- * 'spMaxResults' - The maximum number of results to include in the response. If more results exist than the specified @MaxResults@ value, a token is included in the response so that the remaining results can be retrieved.
+searchProfiles
+    :: SearchProfiles
+searchProfiles =
+  SearchProfiles'
+    { _spFilters = Nothing
+    , _spSortCriteria = Nothing
+    , _spNextToken = Nothing
+    , _spMaxResults = Nothing
+    }
+
+
+-- | The filters to use to list a specified set of room profiles. Supported filter keys are ProfileName and Address. Required.
+spFilters :: Lens' SearchProfiles [Filter]
+spFilters = lens _spFilters (\ s a -> s{_spFilters = a}) . _Default . _Coerce
+
+-- | The sort order to use in listing the specified set of room profiles. Supported sort keys are ProfileName and Address.
+spSortCriteria :: Lens' SearchProfiles [Sort]
+spSortCriteria = lens _spSortCriteria (\ s a -> s{_spSortCriteria = a}) . _Default . _Coerce
+
+-- | An optional token returned from a prior request. Use this token for pagination of results from this action. If this parameter is specified, the response includes only results beyond the token, up to the value specified by @MaxResults@ .
+spNextToken :: Lens' SearchProfiles (Maybe Text)
+spNextToken = lens _spNextToken (\ s a -> s{_spNextToken = a})
+
+-- | The maximum number of results to include in the response. If more results exist than the specified @MaxResults@ value, a token is included in the response so that the remaining results can be retrieved.
+spMaxResults :: Lens' SearchProfiles (Maybe Natural)
+spMaxResults = lens _spMaxResults (\ s a -> s{_spMaxResults = a}) . mapping _Nat
+
+instance AWSPager SearchProfiles where
+        page rq rs
+          | stop (rs ^. sprsNextToken) = Nothing
+          | stop (rs ^. sprsProfiles) = Nothing
+          | otherwise =
+            Just $ rq & spNextToken .~ rs ^. sprsNextToken
+
+instance AWSRequest SearchProfiles where
+        type Rs SearchProfiles = SearchProfilesResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveJSON
+              (\ s h x ->
+                 SearchProfilesResponse' <$>
+                   (x .?> "Profiles" .!@ mempty) <*> (x .?> "NextToken")
+                     <*> (x .?> "TotalCount")
+                     <*> (pure (fromEnum s)))
+
+instance Hashable SearchProfiles where
+
+instance NFData SearchProfiles where
+
+instance ToHeaders SearchProfiles where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.SearchProfiles" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON SearchProfiles where
+        toJSON SearchProfiles'{..}
+          = object
+              (catMaybes
+                 [("Filters" .=) <$> _spFilters,
+                  ("SortCriteria" .=) <$> _spSortCriteria,
+                  ("NextToken" .=) <$> _spNextToken,
+                  ("MaxResults" .=) <$> _spMaxResults])
+
+instance ToPath SearchProfiles where
+        toPath = const "/"
+
+instance ToQuery SearchProfiles where
+        toQuery = const mempty
+
+-- | /See:/ 'searchProfilesResponse' smart constructor.
+data SearchProfilesResponse = SearchProfilesResponse'
+  { _sprsProfiles       :: !(Maybe [ProfileData])
+  , _sprsNextToken      :: !(Maybe Text)
+  , _sprsTotalCount     :: !(Maybe Int)
+  , _sprsResponseStatus :: !Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'SearchProfilesResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sprsProfiles' - The profiles that meet the specified set of filter criteria, in sort order.
+--
+-- * 'sprsNextToken' - The token returned to indicate that there is more data available.
+--
+-- * 'sprsTotalCount' - The total number of room profiles returned.
+--
+-- * 'sprsResponseStatus' - -- | The response status code.
+searchProfilesResponse
+    :: Int -- ^ 'sprsResponseStatus'
+    -> SearchProfilesResponse
+searchProfilesResponse pResponseStatus_ =
+  SearchProfilesResponse'
+    { _sprsProfiles = Nothing
+    , _sprsNextToken = Nothing
+    , _sprsTotalCount = Nothing
+    , _sprsResponseStatus = pResponseStatus_
+    }
+
+
+-- | The profiles that meet the specified set of filter criteria, in sort order.
+sprsProfiles :: Lens' SearchProfilesResponse [ProfileData]
+sprsProfiles = lens _sprsProfiles (\ s a -> s{_sprsProfiles = a}) . _Default . _Coerce
+
+-- | The token returned to indicate that there is more data available.
+sprsNextToken :: Lens' SearchProfilesResponse (Maybe Text)
+sprsNextToken = lens _sprsNextToken (\ s a -> s{_sprsNextToken = a})
+
+-- | The total number of room profiles returned.
+sprsTotalCount :: Lens' SearchProfilesResponse (Maybe Int)
+sprsTotalCount = lens _sprsTotalCount (\ s a -> s{_sprsTotalCount = a})
+
+-- | -- | The response status code.
+sprsResponseStatus :: Lens' SearchProfilesResponse Int
+sprsResponseStatus = lens _sprsResponseStatus (\ s a -> s{_sprsResponseStatus = a})
+
+instance NFData SearchProfilesResponse where
diff --git a/gen/Network/AWS/AlexaBusiness/SearchRooms.hs b/gen/Network/AWS/AlexaBusiness/SearchRooms.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/SearchRooms.hs
@@ -0,0 +1,196 @@
+{-# 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.AlexaBusiness.SearchRooms
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Searches rooms and lists the ones that meet a set of filter and sort criteria.
+--
+--
+--
+-- This operation returns paginated results.
+module Network.AWS.AlexaBusiness.SearchRooms
+    (
+    -- * Creating a Request
+      searchRooms
+    , SearchRooms
+    -- * Request Lenses
+    , srFilters
+    , srSortCriteria
+    , srNextToken
+    , srMaxResults
+
+    -- * Destructuring the Response
+    , searchRoomsResponse
+    , SearchRoomsResponse
+    -- * Response Lenses
+    , srrsRooms
+    , srrsNextToken
+    , srrsTotalCount
+    , srrsResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Pager
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'searchRooms' smart constructor.
+data SearchRooms = SearchRooms'
+  { _srFilters      :: !(Maybe [Filter])
+  , _srSortCriteria :: !(Maybe [Sort])
+  , _srNextToken    :: !(Maybe Text)
+  , _srMaxResults   :: !(Maybe Nat)
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'SearchRooms' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'srFilters' - The filters to use to list a specified set of rooms. The supported filter keys are RoomName and ProfileName.
+--
+-- * 'srSortCriteria' - The sort order to use in listing the specified set of rooms. The supported sort keys are RoomName and ProfileName.
+--
+-- * 'srNextToken' - An optional token returned from a prior request. Use this token for pagination of results from this action. If this parameter is specified, the response includes only results beyond the token, up to the value specified by @MaxResults@ .
+--
+-- * 'srMaxResults' - The maximum number of results to include in the response. If more results exist than the specified @MaxResults@ value, a token is included in the response so that the remaining results can be retrieved.
+searchRooms
+    :: SearchRooms
+searchRooms =
+  SearchRooms'
+    { _srFilters = Nothing
+    , _srSortCriteria = Nothing
+    , _srNextToken = Nothing
+    , _srMaxResults = Nothing
+    }
+
+
+-- | The filters to use to list a specified set of rooms. The supported filter keys are RoomName and ProfileName.
+srFilters :: Lens' SearchRooms [Filter]
+srFilters = lens _srFilters (\ s a -> s{_srFilters = a}) . _Default . _Coerce
+
+-- | The sort order to use in listing the specified set of rooms. The supported sort keys are RoomName and ProfileName.
+srSortCriteria :: Lens' SearchRooms [Sort]
+srSortCriteria = lens _srSortCriteria (\ s a -> s{_srSortCriteria = a}) . _Default . _Coerce
+
+-- | An optional token returned from a prior request. Use this token for pagination of results from this action. If this parameter is specified, the response includes only results beyond the token, up to the value specified by @MaxResults@ .
+srNextToken :: Lens' SearchRooms (Maybe Text)
+srNextToken = lens _srNextToken (\ s a -> s{_srNextToken = a})
+
+-- | The maximum number of results to include in the response. If more results exist than the specified @MaxResults@ value, a token is included in the response so that the remaining results can be retrieved.
+srMaxResults :: Lens' SearchRooms (Maybe Natural)
+srMaxResults = lens _srMaxResults (\ s a -> s{_srMaxResults = a}) . mapping _Nat
+
+instance AWSPager SearchRooms where
+        page rq rs
+          | stop (rs ^. srrsNextToken) = Nothing
+          | stop (rs ^. srrsRooms) = Nothing
+          | otherwise =
+            Just $ rq & srNextToken .~ rs ^. srrsNextToken
+
+instance AWSRequest SearchRooms where
+        type Rs SearchRooms = SearchRoomsResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveJSON
+              (\ s h x ->
+                 SearchRoomsResponse' <$>
+                   (x .?> "Rooms" .!@ mempty) <*> (x .?> "NextToken")
+                     <*> (x .?> "TotalCount")
+                     <*> (pure (fromEnum s)))
+
+instance Hashable SearchRooms where
+
+instance NFData SearchRooms where
+
+instance ToHeaders SearchRooms where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.SearchRooms" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON SearchRooms where
+        toJSON SearchRooms'{..}
+          = object
+              (catMaybes
+                 [("Filters" .=) <$> _srFilters,
+                  ("SortCriteria" .=) <$> _srSortCriteria,
+                  ("NextToken" .=) <$> _srNextToken,
+                  ("MaxResults" .=) <$> _srMaxResults])
+
+instance ToPath SearchRooms where
+        toPath = const "/"
+
+instance ToQuery SearchRooms where
+        toQuery = const mempty
+
+-- | /See:/ 'searchRoomsResponse' smart constructor.
+data SearchRoomsResponse = SearchRoomsResponse'
+  { _srrsRooms          :: !(Maybe [RoomData])
+  , _srrsNextToken      :: !(Maybe Text)
+  , _srrsTotalCount     :: !(Maybe Int)
+  , _srrsResponseStatus :: !Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'SearchRoomsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'srrsRooms' - The rooms that meet the specified set of filter criteria, in sort order.
+--
+-- * 'srrsNextToken' - The token returned to indicate that there is more data available.
+--
+-- * 'srrsTotalCount' - The total number of rooms returned.
+--
+-- * 'srrsResponseStatus' - -- | The response status code.
+searchRoomsResponse
+    :: Int -- ^ 'srrsResponseStatus'
+    -> SearchRoomsResponse
+searchRoomsResponse pResponseStatus_ =
+  SearchRoomsResponse'
+    { _srrsRooms = Nothing
+    , _srrsNextToken = Nothing
+    , _srrsTotalCount = Nothing
+    , _srrsResponseStatus = pResponseStatus_
+    }
+
+
+-- | The rooms that meet the specified set of filter criteria, in sort order.
+srrsRooms :: Lens' SearchRoomsResponse [RoomData]
+srrsRooms = lens _srrsRooms (\ s a -> s{_srrsRooms = a}) . _Default . _Coerce
+
+-- | The token returned to indicate that there is more data available.
+srrsNextToken :: Lens' SearchRoomsResponse (Maybe Text)
+srrsNextToken = lens _srrsNextToken (\ s a -> s{_srrsNextToken = a})
+
+-- | The total number of rooms returned.
+srrsTotalCount :: Lens' SearchRoomsResponse (Maybe Int)
+srrsTotalCount = lens _srrsTotalCount (\ s a -> s{_srrsTotalCount = a})
+
+-- | -- | The response status code.
+srrsResponseStatus :: Lens' SearchRoomsResponse Int
+srrsResponseStatus = lens _srrsResponseStatus (\ s a -> s{_srrsResponseStatus = a})
+
+instance NFData SearchRoomsResponse where
diff --git a/gen/Network/AWS/AlexaBusiness/SearchSkillGroups.hs b/gen/Network/AWS/AlexaBusiness/SearchSkillGroups.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/SearchSkillGroups.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.AlexaBusiness.SearchSkillGroups
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Searches skill groups and lists the ones that meet a set of filter and sort criteria.
+--
+--
+--
+-- This operation returns paginated results.
+module Network.AWS.AlexaBusiness.SearchSkillGroups
+    (
+    -- * Creating a Request
+      searchSkillGroups
+    , SearchSkillGroups
+    -- * Request Lenses
+    , ssgFilters
+    , ssgSortCriteria
+    , ssgNextToken
+    , ssgMaxResults
+
+    -- * Destructuring the Response
+    , searchSkillGroupsResponse
+    , SearchSkillGroupsResponse
+    -- * Response Lenses
+    , ssgrsNextToken
+    , ssgrsSkillGroups
+    , ssgrsTotalCount
+    , ssgrsResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Pager
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'searchSkillGroups' smart constructor.
+data SearchSkillGroups = SearchSkillGroups'
+  { _ssgFilters      :: !(Maybe [Filter])
+  , _ssgSortCriteria :: !(Maybe [Sort])
+  , _ssgNextToken    :: !(Maybe Text)
+  , _ssgMaxResults   :: !(Maybe Nat)
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'SearchSkillGroups' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ssgFilters' - The filters to use to list a specified set of skill groups. The supported filter key is SkillGroupName.
+--
+-- * 'ssgSortCriteria' - The sort order to use in listing the specified set of skill groups. The supported sort key is SkillGroupName.
+--
+-- * 'ssgNextToken' - An optional token returned from a prior request. Use this token for pagination of results from this action. If this parameter is specified, the response includes only results beyond the token, up to the value specified by @MaxResults@ . Required.
+--
+-- * 'ssgMaxResults' - The maximum number of results to include in the response. If more results exist than the specified @MaxResults@ value, a token is included in the response so that the remaining results can be retrieved.
+searchSkillGroups
+    :: SearchSkillGroups
+searchSkillGroups =
+  SearchSkillGroups'
+    { _ssgFilters = Nothing
+    , _ssgSortCriteria = Nothing
+    , _ssgNextToken = Nothing
+    , _ssgMaxResults = Nothing
+    }
+
+
+-- | The filters to use to list a specified set of skill groups. The supported filter key is SkillGroupName.
+ssgFilters :: Lens' SearchSkillGroups [Filter]
+ssgFilters = lens _ssgFilters (\ s a -> s{_ssgFilters = a}) . _Default . _Coerce
+
+-- | The sort order to use in listing the specified set of skill groups. The supported sort key is SkillGroupName.
+ssgSortCriteria :: Lens' SearchSkillGroups [Sort]
+ssgSortCriteria = lens _ssgSortCriteria (\ s a -> s{_ssgSortCriteria = a}) . _Default . _Coerce
+
+-- | An optional token returned from a prior request. Use this token for pagination of results from this action. If this parameter is specified, the response includes only results beyond the token, up to the value specified by @MaxResults@ . Required.
+ssgNextToken :: Lens' SearchSkillGroups (Maybe Text)
+ssgNextToken = lens _ssgNextToken (\ s a -> s{_ssgNextToken = a})
+
+-- | The maximum number of results to include in the response. If more results exist than the specified @MaxResults@ value, a token is included in the response so that the remaining results can be retrieved.
+ssgMaxResults :: Lens' SearchSkillGroups (Maybe Natural)
+ssgMaxResults = lens _ssgMaxResults (\ s a -> s{_ssgMaxResults = a}) . mapping _Nat
+
+instance AWSPager SearchSkillGroups where
+        page rq rs
+          | stop (rs ^. ssgrsNextToken) = Nothing
+          | stop (rs ^. ssgrsSkillGroups) = Nothing
+          | otherwise =
+            Just $ rq & ssgNextToken .~ rs ^. ssgrsNextToken
+
+instance AWSRequest SearchSkillGroups where
+        type Rs SearchSkillGroups = SearchSkillGroupsResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveJSON
+              (\ s h x ->
+                 SearchSkillGroupsResponse' <$>
+                   (x .?> "NextToken") <*>
+                     (x .?> "SkillGroups" .!@ mempty)
+                     <*> (x .?> "TotalCount")
+                     <*> (pure (fromEnum s)))
+
+instance Hashable SearchSkillGroups where
+
+instance NFData SearchSkillGroups where
+
+instance ToHeaders SearchSkillGroups where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.SearchSkillGroups" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON SearchSkillGroups where
+        toJSON SearchSkillGroups'{..}
+          = object
+              (catMaybes
+                 [("Filters" .=) <$> _ssgFilters,
+                  ("SortCriteria" .=) <$> _ssgSortCriteria,
+                  ("NextToken" .=) <$> _ssgNextToken,
+                  ("MaxResults" .=) <$> _ssgMaxResults])
+
+instance ToPath SearchSkillGroups where
+        toPath = const "/"
+
+instance ToQuery SearchSkillGroups where
+        toQuery = const mempty
+
+-- | /See:/ 'searchSkillGroupsResponse' smart constructor.
+data SearchSkillGroupsResponse = SearchSkillGroupsResponse'
+  { _ssgrsNextToken      :: !(Maybe Text)
+  , _ssgrsSkillGroups    :: !(Maybe [SkillGroupData])
+  , _ssgrsTotalCount     :: !(Maybe Int)
+  , _ssgrsResponseStatus :: !Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'SearchSkillGroupsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ssgrsNextToken' - The token returned to indicate that there is more data available.
+--
+-- * 'ssgrsSkillGroups' - The skill groups that meet the filter criteria, in sort order.
+--
+-- * 'ssgrsTotalCount' - The total number of skill groups returned.
+--
+-- * 'ssgrsResponseStatus' - -- | The response status code.
+searchSkillGroupsResponse
+    :: Int -- ^ 'ssgrsResponseStatus'
+    -> SearchSkillGroupsResponse
+searchSkillGroupsResponse pResponseStatus_ =
+  SearchSkillGroupsResponse'
+    { _ssgrsNextToken = Nothing
+    , _ssgrsSkillGroups = Nothing
+    , _ssgrsTotalCount = Nothing
+    , _ssgrsResponseStatus = pResponseStatus_
+    }
+
+
+-- | The token returned to indicate that there is more data available.
+ssgrsNextToken :: Lens' SearchSkillGroupsResponse (Maybe Text)
+ssgrsNextToken = lens _ssgrsNextToken (\ s a -> s{_ssgrsNextToken = a})
+
+-- | The skill groups that meet the filter criteria, in sort order.
+ssgrsSkillGroups :: Lens' SearchSkillGroupsResponse [SkillGroupData]
+ssgrsSkillGroups = lens _ssgrsSkillGroups (\ s a -> s{_ssgrsSkillGroups = a}) . _Default . _Coerce
+
+-- | The total number of skill groups returned.
+ssgrsTotalCount :: Lens' SearchSkillGroupsResponse (Maybe Int)
+ssgrsTotalCount = lens _ssgrsTotalCount (\ s a -> s{_ssgrsTotalCount = a})
+
+-- | -- | The response status code.
+ssgrsResponseStatus :: Lens' SearchSkillGroupsResponse Int
+ssgrsResponseStatus = lens _ssgrsResponseStatus (\ s a -> s{_ssgrsResponseStatus = a})
+
+instance NFData SearchSkillGroupsResponse where
diff --git a/gen/Network/AWS/AlexaBusiness/SearchUsers.hs b/gen/Network/AWS/AlexaBusiness/SearchUsers.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/SearchUsers.hs
@@ -0,0 +1,196 @@
+{-# 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.AlexaBusiness.SearchUsers
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Searches users and lists the ones that meet a set of filter and sort criteria.
+--
+--
+--
+-- This operation returns paginated results.
+module Network.AWS.AlexaBusiness.SearchUsers
+    (
+    -- * Creating a Request
+      searchUsers
+    , SearchUsers
+    -- * Request Lenses
+    , suFilters
+    , suSortCriteria
+    , suNextToken
+    , suMaxResults
+
+    -- * Destructuring the Response
+    , searchUsersResponse
+    , SearchUsersResponse
+    -- * Response Lenses
+    , sursUsers
+    , sursNextToken
+    , sursTotalCount
+    , sursResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Pager
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'searchUsers' smart constructor.
+data SearchUsers = SearchUsers'
+  { _suFilters      :: !(Maybe [Filter])
+  , _suSortCriteria :: !(Maybe [Sort])
+  , _suNextToken    :: !(Maybe Text)
+  , _suMaxResults   :: !(Maybe Nat)
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'SearchUsers' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'suFilters' - The filters to use for listing a specific set of users. Required. Supported filter keys are UserId, FirstName, LastName, Email, and EnrollmentStatus.
+--
+-- * 'suSortCriteria' - The sort order to use in listing the filtered set of users. Required. Supported sort keys are UserId, FirstName, LastName, Email, and EnrollmentStatus.
+--
+-- * 'suNextToken' - An optional token returned from a prior request. Use this token for pagination of results from this action. If this parameter is specified, the response includes only results beyond the token, up to the value specified by @MaxResults@ . Required.
+--
+-- * 'suMaxResults' - The maximum number of results to include in the response. If more results exist than the specified @MaxResults@ value, a token is included in the response so that the remaining results can be retrieved. Required.
+searchUsers
+    :: SearchUsers
+searchUsers =
+  SearchUsers'
+    { _suFilters = Nothing
+    , _suSortCriteria = Nothing
+    , _suNextToken = Nothing
+    , _suMaxResults = Nothing
+    }
+
+
+-- | The filters to use for listing a specific set of users. Required. Supported filter keys are UserId, FirstName, LastName, Email, and EnrollmentStatus.
+suFilters :: Lens' SearchUsers [Filter]
+suFilters = lens _suFilters (\ s a -> s{_suFilters = a}) . _Default . _Coerce
+
+-- | The sort order to use in listing the filtered set of users. Required. Supported sort keys are UserId, FirstName, LastName, Email, and EnrollmentStatus.
+suSortCriteria :: Lens' SearchUsers [Sort]
+suSortCriteria = lens _suSortCriteria (\ s a -> s{_suSortCriteria = a}) . _Default . _Coerce
+
+-- | An optional token returned from a prior request. Use this token for pagination of results from this action. If this parameter is specified, the response includes only results beyond the token, up to the value specified by @MaxResults@ . Required.
+suNextToken :: Lens' SearchUsers (Maybe Text)
+suNextToken = lens _suNextToken (\ s a -> s{_suNextToken = a})
+
+-- | The maximum number of results to include in the response. If more results exist than the specified @MaxResults@ value, a token is included in the response so that the remaining results can be retrieved. Required.
+suMaxResults :: Lens' SearchUsers (Maybe Natural)
+suMaxResults = lens _suMaxResults (\ s a -> s{_suMaxResults = a}) . mapping _Nat
+
+instance AWSPager SearchUsers where
+        page rq rs
+          | stop (rs ^. sursNextToken) = Nothing
+          | stop (rs ^. sursUsers) = Nothing
+          | otherwise =
+            Just $ rq & suNextToken .~ rs ^. sursNextToken
+
+instance AWSRequest SearchUsers where
+        type Rs SearchUsers = SearchUsersResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveJSON
+              (\ s h x ->
+                 SearchUsersResponse' <$>
+                   (x .?> "Users" .!@ mempty) <*> (x .?> "NextToken")
+                     <*> (x .?> "TotalCount")
+                     <*> (pure (fromEnum s)))
+
+instance Hashable SearchUsers where
+
+instance NFData SearchUsers where
+
+instance ToHeaders SearchUsers where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.SearchUsers" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON SearchUsers where
+        toJSON SearchUsers'{..}
+          = object
+              (catMaybes
+                 [("Filters" .=) <$> _suFilters,
+                  ("SortCriteria" .=) <$> _suSortCriteria,
+                  ("NextToken" .=) <$> _suNextToken,
+                  ("MaxResults" .=) <$> _suMaxResults])
+
+instance ToPath SearchUsers where
+        toPath = const "/"
+
+instance ToQuery SearchUsers where
+        toQuery = const mempty
+
+-- | /See:/ 'searchUsersResponse' smart constructor.
+data SearchUsersResponse = SearchUsersResponse'
+  { _sursUsers          :: !(Maybe [UserData])
+  , _sursNextToken      :: !(Maybe Text)
+  , _sursTotalCount     :: !(Maybe Int)
+  , _sursResponseStatus :: !Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'SearchUsersResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sursUsers' - The users that meet the specified set of filter criteria, in sort order.
+--
+-- * 'sursNextToken' - The token returned to indicate that there is more data available.
+--
+-- * 'sursTotalCount' - The total number of users returned.
+--
+-- * 'sursResponseStatus' - -- | The response status code.
+searchUsersResponse
+    :: Int -- ^ 'sursResponseStatus'
+    -> SearchUsersResponse
+searchUsersResponse pResponseStatus_ =
+  SearchUsersResponse'
+    { _sursUsers = Nothing
+    , _sursNextToken = Nothing
+    , _sursTotalCount = Nothing
+    , _sursResponseStatus = pResponseStatus_
+    }
+
+
+-- | The users that meet the specified set of filter criteria, in sort order.
+sursUsers :: Lens' SearchUsersResponse [UserData]
+sursUsers = lens _sursUsers (\ s a -> s{_sursUsers = a}) . _Default . _Coerce
+
+-- | The token returned to indicate that there is more data available.
+sursNextToken :: Lens' SearchUsersResponse (Maybe Text)
+sursNextToken = lens _sursNextToken (\ s a -> s{_sursNextToken = a})
+
+-- | The total number of users returned.
+sursTotalCount :: Lens' SearchUsersResponse (Maybe Int)
+sursTotalCount = lens _sursTotalCount (\ s a -> s{_sursTotalCount = a})
+
+-- | -- | The response status code.
+sursResponseStatus :: Lens' SearchUsersResponse Int
+sursResponseStatus = lens _sursResponseStatus (\ s a -> s{_sursResponseStatus = a})
+
+instance NFData SearchUsersResponse where
diff --git a/gen/Network/AWS/AlexaBusiness/SendInvitation.hs b/gen/Network/AWS/AlexaBusiness/SendInvitation.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/SendInvitation.hs
@@ -0,0 +1,119 @@
+{-# 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.AlexaBusiness.SendInvitation
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Sends an enrollment invitation email with a URL to a user. The URL is valid for 72 hours or until you call this operation again, whichever comes first.
+--
+--
+module Network.AWS.AlexaBusiness.SendInvitation
+    (
+    -- * Creating a Request
+      sendInvitation
+    , SendInvitation
+    -- * Request Lenses
+    , siUserARN
+
+    -- * Destructuring the Response
+    , sendInvitationResponse
+    , SendInvitationResponse
+    -- * Response Lenses
+    , sirsResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'sendInvitation' smart constructor.
+newtype SendInvitation = SendInvitation'
+  { _siUserARN :: Maybe Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'SendInvitation' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'siUserARN' - The ARN of the user to whom to send an invitation. Required.
+sendInvitation
+    :: SendInvitation
+sendInvitation = SendInvitation' {_siUserARN = Nothing}
+
+
+-- | The ARN of the user to whom to send an invitation. Required.
+siUserARN :: Lens' SendInvitation (Maybe Text)
+siUserARN = lens _siUserARN (\ s a -> s{_siUserARN = a})
+
+instance AWSRequest SendInvitation where
+        type Rs SendInvitation = SendInvitationResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveEmpty
+              (\ s h x ->
+                 SendInvitationResponse' <$> (pure (fromEnum s)))
+
+instance Hashable SendInvitation where
+
+instance NFData SendInvitation where
+
+instance ToHeaders SendInvitation where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.SendInvitation" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON SendInvitation where
+        toJSON SendInvitation'{..}
+          = object (catMaybes [("UserArn" .=) <$> _siUserARN])
+
+instance ToPath SendInvitation where
+        toPath = const "/"
+
+instance ToQuery SendInvitation where
+        toQuery = const mempty
+
+-- | /See:/ 'sendInvitationResponse' smart constructor.
+newtype SendInvitationResponse = SendInvitationResponse'
+  { _sirsResponseStatus :: Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'SendInvitationResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sirsResponseStatus' - -- | The response status code.
+sendInvitationResponse
+    :: Int -- ^ 'sirsResponseStatus'
+    -> SendInvitationResponse
+sendInvitationResponse pResponseStatus_ =
+  SendInvitationResponse' {_sirsResponseStatus = pResponseStatus_}
+
+
+-- | -- | The response status code.
+sirsResponseStatus :: Lens' SendInvitationResponse Int
+sirsResponseStatus = lens _sirsResponseStatus (\ s a -> s{_sirsResponseStatus = a})
+
+instance NFData SendInvitationResponse where
diff --git a/gen/Network/AWS/AlexaBusiness/StartDeviceSync.hs b/gen/Network/AWS/AlexaBusiness/StartDeviceSync.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/StartDeviceSync.hs
@@ -0,0 +1,141 @@
+{-# 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.AlexaBusiness.StartDeviceSync
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Resets a device and its account to the known default settings, by clearing all information and settings set by previous users.
+--
+--
+module Network.AWS.AlexaBusiness.StartDeviceSync
+    (
+    -- * Creating a Request
+      startDeviceSync
+    , StartDeviceSync
+    -- * Request Lenses
+    , sdsDeviceARN
+    , sdsRoomARN
+    , sdsFeatures
+
+    -- * Destructuring the Response
+    , startDeviceSyncResponse
+    , StartDeviceSyncResponse
+    -- * Response Lenses
+    , sdsrsResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'startDeviceSync' smart constructor.
+data StartDeviceSync = StartDeviceSync'
+  { _sdsDeviceARN :: !(Maybe Text)
+  , _sdsRoomARN   :: !(Maybe Text)
+  , _sdsFeatures  :: ![Feature]
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'StartDeviceSync' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sdsDeviceARN' - The ARN of the device to sync. Required.
+--
+-- * 'sdsRoomARN' - The ARN of the room with which the device to sync is associated. Required.
+--
+-- * 'sdsFeatures' - Request structure to start the device sync. Required.
+startDeviceSync
+    :: StartDeviceSync
+startDeviceSync =
+  StartDeviceSync'
+    {_sdsDeviceARN = Nothing, _sdsRoomARN = Nothing, _sdsFeatures = mempty}
+
+
+-- | The ARN of the device to sync. Required.
+sdsDeviceARN :: Lens' StartDeviceSync (Maybe Text)
+sdsDeviceARN = lens _sdsDeviceARN (\ s a -> s{_sdsDeviceARN = a})
+
+-- | The ARN of the room with which the device to sync is associated. Required.
+sdsRoomARN :: Lens' StartDeviceSync (Maybe Text)
+sdsRoomARN = lens _sdsRoomARN (\ s a -> s{_sdsRoomARN = a})
+
+-- | Request structure to start the device sync. Required.
+sdsFeatures :: Lens' StartDeviceSync [Feature]
+sdsFeatures = lens _sdsFeatures (\ s a -> s{_sdsFeatures = a}) . _Coerce
+
+instance AWSRequest StartDeviceSync where
+        type Rs StartDeviceSync = StartDeviceSyncResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveEmpty
+              (\ s h x ->
+                 StartDeviceSyncResponse' <$> (pure (fromEnum s)))
+
+instance Hashable StartDeviceSync where
+
+instance NFData StartDeviceSync where
+
+instance ToHeaders StartDeviceSync where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.StartDeviceSync" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON StartDeviceSync where
+        toJSON StartDeviceSync'{..}
+          = object
+              (catMaybes
+                 [("DeviceArn" .=) <$> _sdsDeviceARN,
+                  ("RoomArn" .=) <$> _sdsRoomARN,
+                  Just ("Features" .= _sdsFeatures)])
+
+instance ToPath StartDeviceSync where
+        toPath = const "/"
+
+instance ToQuery StartDeviceSync where
+        toQuery = const mempty
+
+-- | /See:/ 'startDeviceSyncResponse' smart constructor.
+newtype StartDeviceSyncResponse = StartDeviceSyncResponse'
+  { _sdsrsResponseStatus :: Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'StartDeviceSyncResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sdsrsResponseStatus' - -- | The response status code.
+startDeviceSyncResponse
+    :: Int -- ^ 'sdsrsResponseStatus'
+    -> StartDeviceSyncResponse
+startDeviceSyncResponse pResponseStatus_ =
+  StartDeviceSyncResponse' {_sdsrsResponseStatus = pResponseStatus_}
+
+
+-- | -- | The response status code.
+sdsrsResponseStatus :: Lens' StartDeviceSyncResponse Int
+sdsrsResponseStatus = lens _sdsrsResponseStatus (\ s a -> s{_sdsrsResponseStatus = a})
+
+instance NFData StartDeviceSyncResponse where
diff --git a/gen/Network/AWS/AlexaBusiness/TagResource.hs b/gen/Network/AWS/AlexaBusiness/TagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/TagResource.hs
@@ -0,0 +1,130 @@
+{-# 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.AlexaBusiness.TagResource
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Adds metadata tags to a specified resource.
+--
+--
+module Network.AWS.AlexaBusiness.TagResource
+    (
+    -- * Creating a Request
+      tagResource
+    , TagResource
+    -- * Request Lenses
+    , trARN
+    , trTags
+
+    -- * Destructuring the Response
+    , tagResourceResponse
+    , TagResourceResponse
+    -- * Response Lenses
+    , trrsResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'tagResource' smart constructor.
+data TagResource = TagResource'
+  { _trARN  :: !Text
+  , _trTags :: ![Tag]
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'TagResource' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'trARN' - The ARN of the resource to which to add metadata tags. Required.
+--
+-- * 'trTags' - The tags to be added to the specified resource. Do not provide system tags. Required.
+tagResource
+    :: Text -- ^ 'trARN'
+    -> TagResource
+tagResource pARN_ = TagResource' {_trARN = pARN_, _trTags = mempty}
+
+
+-- | The ARN of the resource to which to add metadata tags. Required.
+trARN :: Lens' TagResource Text
+trARN = lens _trARN (\ s a -> s{_trARN = a})
+
+-- | The tags to be added to the specified resource. Do not provide system tags. Required.
+trTags :: Lens' TagResource [Tag]
+trTags = lens _trTags (\ s a -> s{_trTags = a}) . _Coerce
+
+instance AWSRequest TagResource where
+        type Rs TagResource = TagResourceResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveEmpty
+              (\ s h x ->
+                 TagResourceResponse' <$> (pure (fromEnum s)))
+
+instance Hashable TagResource where
+
+instance NFData TagResource where
+
+instance ToHeaders TagResource where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.TagResource" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON TagResource where
+        toJSON TagResource'{..}
+          = object
+              (catMaybes
+                 [Just ("Arn" .= _trARN), Just ("Tags" .= _trTags)])
+
+instance ToPath TagResource where
+        toPath = const "/"
+
+instance ToQuery TagResource where
+        toQuery = const mempty
+
+-- | /See:/ 'tagResourceResponse' smart constructor.
+newtype TagResourceResponse = TagResourceResponse'
+  { _trrsResponseStatus :: Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'TagResourceResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'trrsResponseStatus' - -- | The response status code.
+tagResourceResponse
+    :: Int -- ^ 'trrsResponseStatus'
+    -> TagResourceResponse
+tagResourceResponse pResponseStatus_ =
+  TagResourceResponse' {_trrsResponseStatus = pResponseStatus_}
+
+
+-- | -- | The response status code.
+trrsResponseStatus :: Lens' TagResourceResponse Int
+trrsResponseStatus = lens _trrsResponseStatus (\ s a -> s{_trrsResponseStatus = a})
+
+instance NFData TagResourceResponse where
diff --git a/gen/Network/AWS/AlexaBusiness/Types.hs b/gen/Network/AWS/AlexaBusiness/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/Types.hs
@@ -0,0 +1,322 @@
+{-# LANGUAGE OverloadedStrings #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.AlexaBusiness.Types
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+module Network.AWS.AlexaBusiness.Types
+    (
+    -- * Service Configuration
+      alexaBusiness
+
+    -- * Errors
+    , _InvalidUserStatusException
+    , _NotFoundException
+    , _NameInUseException
+    , _AlreadyExistsException
+    , _LimitExceededException
+    , _ResourceInUseException
+
+    -- * ConnectionStatus
+    , ConnectionStatus (..)
+
+    -- * DeviceEventType
+    , DeviceEventType (..)
+
+    -- * DeviceStatus
+    , DeviceStatus (..)
+
+    -- * DeviceStatusDetailCode
+    , DeviceStatusDetailCode (..)
+
+    -- * DistanceUnit
+    , DistanceUnit (..)
+
+    -- * EnrollmentStatus
+    , EnrollmentStatus (..)
+
+    -- * Feature
+    , Feature (..)
+
+    -- * SortValue
+    , SortValue (..)
+
+    -- * TemperatureUnit
+    , TemperatureUnit (..)
+
+    -- * WakeWord
+    , WakeWord (..)
+
+    -- * AddressBook
+    , AddressBook
+    , addressBook
+    , abAddressBookARN
+    , abName
+    , abDescription
+
+    -- * AddressBookData
+    , AddressBookData
+    , addressBookData
+    , abdAddressBookARN
+    , abdName
+    , abdDescription
+
+    -- * Contact
+    , Contact
+    , contact
+    , cLastName
+    , cContactARN
+    , cPhoneNumber
+    , cFirstName
+    , cDisplayName
+
+    -- * ContactData
+    , ContactData
+    , contactData
+    , cdLastName
+    , cdContactARN
+    , cdPhoneNumber
+    , cdFirstName
+    , cdDisplayName
+
+    -- * Device
+    , Device
+    , device
+    , dDeviceStatus
+    , dDeviceStatusInfo
+    , dDeviceARN
+    , dMACAddress
+    , dDeviceName
+    , dRoomARN
+    , dSoftwareVersion
+    , dDeviceType
+    , dDeviceSerialNumber
+
+    -- * DeviceData
+    , DeviceData
+    , deviceData
+    , ddDeviceStatus
+    , ddDeviceStatusInfo
+    , ddDeviceARN
+    , ddMACAddress
+    , ddDeviceName
+    , ddRoomARN
+    , ddSoftwareVersion
+    , ddDeviceType
+    , ddRoomName
+    , ddDeviceSerialNumber
+
+    -- * DeviceEvent
+    , DeviceEvent
+    , deviceEvent
+    , deValue
+    , deType
+    , deTimestamp
+
+    -- * DeviceStatusDetail
+    , DeviceStatusDetail
+    , deviceStatusDetail
+    , dsdCode
+
+    -- * DeviceStatusInfo
+    , DeviceStatusInfo
+    , deviceStatusInfo
+    , dsiDeviceStatusDetails
+    , dsiConnectionStatus
+
+    -- * Filter
+    , Filter
+    , filter'
+    , fKey
+    , fValues
+
+    -- * Profile
+    , Profile
+    , profile
+    , pSetupModeDisabled
+    , pPSTNEnabled
+    , pDistanceUnit
+    , pAddress
+    , pProfileARN
+    , pWakeWord
+    , pProfileName
+    , pTemperatureUnit
+    , pTimezone
+    , pMaxVolumeLimit
+
+    -- * ProfileData
+    , ProfileData
+    , profileData
+    , pdDistanceUnit
+    , pdAddress
+    , pdProfileARN
+    , pdWakeWord
+    , pdProfileName
+    , pdTemperatureUnit
+    , pdTimezone
+
+    -- * Room
+    , Room
+    , room
+    , rProfileARN
+    , rProviderCalendarId
+    , rRoomARN
+    , rRoomName
+    , rDescription
+
+    -- * RoomData
+    , RoomData
+    , roomData
+    , rdProfileARN
+    , rdProviderCalendarId
+    , rdProfileName
+    , rdRoomARN
+    , rdRoomName
+    , rdDescription
+
+    -- * RoomSkillParameter
+    , RoomSkillParameter
+    , roomSkillParameter
+    , rspParameterKey
+    , rspParameterValue
+
+    -- * SkillGroup
+    , SkillGroup
+    , skillGroup
+    , sgSkillGroupARN
+    , sgDescription
+    , sgSkillGroupName
+
+    -- * SkillGroupData
+    , SkillGroupData
+    , skillGroupData
+    , sgdSkillGroupARN
+    , sgdDescription
+    , sgdSkillGroupName
+
+    -- * SkillSummary
+    , SkillSummary
+    , skillSummary
+    , ssSkillId
+    , ssSupportsLinking
+    , ssSkillName
+
+    -- * Sort
+    , Sort
+    , sort
+    , sKey
+    , sValue
+
+    -- * Tag
+    , Tag
+    , tag
+    , tagValue
+    , tagKey
+
+    -- * UserData
+    , UserData
+    , userData
+    , udEmail
+    , udLastName
+    , udEnrollmentId
+    , udUserARN
+    , udFirstName
+    , udEnrollmentStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.AlexaBusiness.Types.Sum
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Sign.V4
+
+-- | API version @2017-11-09@ of the Amazon Alexa For Business SDK configuration.
+alexaBusiness :: Service
+alexaBusiness =
+  Service
+    { _svcAbbrev = "AlexaBusiness"
+    , _svcSigner = v4
+    , _svcPrefix = "a4b"
+    , _svcVersion = "2017-11-09"
+    , _svcEndpoint = defaultEndpoint alexaBusiness
+    , _svcTimeout = Just 70
+    , _svcCheck = statusSuccess
+    , _svcError = parseJSONError "AlexaBusiness"
+    , _svcRetry = retry
+    }
+  where
+    retry =
+      Exponential
+        { _retryBase = 5.0e-2
+        , _retryGrowth = 2
+        , _retryAttempts = 5
+        , _retryCheck = check
+        }
+    check e
+      | has (hasCode "ThrottledException" . hasStatus 400) e =
+        Just "throttled_exception"
+      | 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 (hasCode "RequestThrottledException" . hasStatus 400) e =
+        Just "request_throttled_exception"
+      | 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 attempt to update a user is invalid due to the user's current status. HTTP Status Code: 400
+--
+--
+_InvalidUserStatusException :: AsError a => Getting (First ServiceError) a ServiceError
+_InvalidUserStatusException =
+  _MatchServiceError alexaBusiness "InvalidUserStatusException"
+
+
+-- | The resource is not found. HTTP Status Code: 400
+--
+--
+_NotFoundException :: AsError a => Getting (First ServiceError) a ServiceError
+_NotFoundException = _MatchServiceError alexaBusiness "NotFoundException"
+
+
+-- | The name sent in the request is already in use. HTTP Status Code: 400
+--
+--
+_NameInUseException :: AsError a => Getting (First ServiceError) a ServiceError
+_NameInUseException = _MatchServiceError alexaBusiness "NameInUseException"
+
+
+-- | The resource being created already exists. HTTP Status Code: 400
+--
+--
+_AlreadyExistsException :: AsError a => Getting (First ServiceError) a ServiceError
+_AlreadyExistsException =
+  _MatchServiceError alexaBusiness "AlreadyExistsException"
+
+
+-- | You are performing an action that would put you beyond your account's limits. HTTP Status Code: 400
+--
+--
+_LimitExceededException :: AsError a => Getting (First ServiceError) a ServiceError
+_LimitExceededException =
+  _MatchServiceError alexaBusiness "LimitExceededException"
+
+
+-- | The resource in the request is already in use. HTTP Status Code: 400
+--
+--
+_ResourceInUseException :: AsError a => Getting (First ServiceError) a ServiceError
+_ResourceInUseException =
+  _MatchServiceError alexaBusiness "ResourceInUseException"
+
diff --git a/gen/Network/AWS/AlexaBusiness/Types/Product.hs b/gen/Network/AWS/AlexaBusiness/Types/Product.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/Types/Product.hs
@@ -0,0 +1,1423 @@
+{-# 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.AlexaBusiness.Types.Product
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+module Network.AWS.AlexaBusiness.Types.Product where
+
+import Network.AWS.AlexaBusiness.Types.Sum
+import Network.AWS.Lens
+import Network.AWS.Prelude
+
+-- | An address book with attributes.
+--
+--
+--
+-- /See:/ 'addressBook' smart constructor.
+data AddressBook = AddressBook'
+  { _abAddressBookARN :: !(Maybe Text)
+  , _abName           :: !(Maybe Text)
+  , _abDescription    :: !(Maybe Text)
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'AddressBook' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'abAddressBookARN' - The ARN of the address book.
+--
+-- * 'abName' - The name of the address book.
+--
+-- * 'abDescription' - The description of the address book.
+addressBook
+    :: AddressBook
+addressBook =
+  AddressBook'
+    {_abAddressBookARN = Nothing, _abName = Nothing, _abDescription = Nothing}
+
+
+-- | The ARN of the address book.
+abAddressBookARN :: Lens' AddressBook (Maybe Text)
+abAddressBookARN = lens _abAddressBookARN (\ s a -> s{_abAddressBookARN = a})
+
+-- | The name of the address book.
+abName :: Lens' AddressBook (Maybe Text)
+abName = lens _abName (\ s a -> s{_abName = a})
+
+-- | The description of the address book.
+abDescription :: Lens' AddressBook (Maybe Text)
+abDescription = lens _abDescription (\ s a -> s{_abDescription = a})
+
+instance FromJSON AddressBook where
+        parseJSON
+          = withObject "AddressBook"
+              (\ x ->
+                 AddressBook' <$>
+                   (x .:? "AddressBookArn") <*> (x .:? "Name") <*>
+                     (x .:? "Description"))
+
+instance Hashable AddressBook where
+
+instance NFData AddressBook where
+
+-- | Information related to an address book.
+--
+--
+--
+-- /See:/ 'addressBookData' smart constructor.
+data AddressBookData = AddressBookData'
+  { _abdAddressBookARN :: !(Maybe Text)
+  , _abdName           :: !(Maybe Text)
+  , _abdDescription    :: !(Maybe Text)
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'AddressBookData' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'abdAddressBookARN' - The ARN of the address book.
+--
+-- * 'abdName' - The name of the address book.
+--
+-- * 'abdDescription' - The description of the address book.
+addressBookData
+    :: AddressBookData
+addressBookData =
+  AddressBookData'
+    { _abdAddressBookARN = Nothing
+    , _abdName = Nothing
+    , _abdDescription = Nothing
+    }
+
+
+-- | The ARN of the address book.
+abdAddressBookARN :: Lens' AddressBookData (Maybe Text)
+abdAddressBookARN = lens _abdAddressBookARN (\ s a -> s{_abdAddressBookARN = a})
+
+-- | The name of the address book.
+abdName :: Lens' AddressBookData (Maybe Text)
+abdName = lens _abdName (\ s a -> s{_abdName = a})
+
+-- | The description of the address book.
+abdDescription :: Lens' AddressBookData (Maybe Text)
+abdDescription = lens _abdDescription (\ s a -> s{_abdDescription = a})
+
+instance FromJSON AddressBookData where
+        parseJSON
+          = withObject "AddressBookData"
+              (\ x ->
+                 AddressBookData' <$>
+                   (x .:? "AddressBookArn") <*> (x .:? "Name") <*>
+                     (x .:? "Description"))
+
+instance Hashable AddressBookData where
+
+instance NFData AddressBookData where
+
+-- | A contact with attributes.
+--
+--
+--
+-- /See:/ 'contact' smart constructor.
+data Contact = Contact'
+  { _cLastName    :: !(Maybe Text)
+  , _cContactARN  :: !(Maybe Text)
+  , _cPhoneNumber :: !(Maybe Text)
+  , _cFirstName   :: !(Maybe Text)
+  , _cDisplayName :: !(Maybe Text)
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'Contact' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cLastName' - The last name of the contact, used to call the contact on the device.
+--
+-- * 'cContactARN' - The ARN of the contact.
+--
+-- * 'cPhoneNumber' - The phone number of the contact.
+--
+-- * 'cFirstName' - The first name of the contact, used to call the contact on the device.
+--
+-- * 'cDisplayName' - The name of the contact to display on the console.
+contact
+    :: Contact
+contact =
+  Contact'
+    { _cLastName = Nothing
+    , _cContactARN = Nothing
+    , _cPhoneNumber = Nothing
+    , _cFirstName = Nothing
+    , _cDisplayName = Nothing
+    }
+
+
+-- | The last name of the contact, used to call the contact on the device.
+cLastName :: Lens' Contact (Maybe Text)
+cLastName = lens _cLastName (\ s a -> s{_cLastName = a})
+
+-- | The ARN of the contact.
+cContactARN :: Lens' Contact (Maybe Text)
+cContactARN = lens _cContactARN (\ s a -> s{_cContactARN = a})
+
+-- | The phone number of the contact.
+cPhoneNumber :: Lens' Contact (Maybe Text)
+cPhoneNumber = lens _cPhoneNumber (\ s a -> s{_cPhoneNumber = a})
+
+-- | The first name of the contact, used to call the contact on the device.
+cFirstName :: Lens' Contact (Maybe Text)
+cFirstName = lens _cFirstName (\ s a -> s{_cFirstName = a})
+
+-- | The name of the contact to display on the console.
+cDisplayName :: Lens' Contact (Maybe Text)
+cDisplayName = lens _cDisplayName (\ s a -> s{_cDisplayName = a})
+
+instance FromJSON Contact where
+        parseJSON
+          = withObject "Contact"
+              (\ x ->
+                 Contact' <$>
+                   (x .:? "LastName") <*> (x .:? "ContactArn") <*>
+                     (x .:? "PhoneNumber")
+                     <*> (x .:? "FirstName")
+                     <*> (x .:? "DisplayName"))
+
+instance Hashable Contact where
+
+instance NFData Contact where
+
+-- | Information related to a contact.
+--
+--
+--
+-- /See:/ 'contactData' smart constructor.
+data ContactData = ContactData'
+  { _cdLastName    :: !(Maybe Text)
+  , _cdContactARN  :: !(Maybe Text)
+  , _cdPhoneNumber :: !(Maybe Text)
+  , _cdFirstName   :: !(Maybe Text)
+  , _cdDisplayName :: !(Maybe Text)
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'ContactData' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cdLastName' - The last name of the contact, used to call the contact on the device.
+--
+-- * 'cdContactARN' - The ARN of the contact.
+--
+-- * 'cdPhoneNumber' - The phone number of the contact.
+--
+-- * 'cdFirstName' - The first name of the contact, used to call the contact on the device.
+--
+-- * 'cdDisplayName' - The name of the contact to display on the console.
+contactData
+    :: ContactData
+contactData =
+  ContactData'
+    { _cdLastName = Nothing
+    , _cdContactARN = Nothing
+    , _cdPhoneNumber = Nothing
+    , _cdFirstName = Nothing
+    , _cdDisplayName = Nothing
+    }
+
+
+-- | The last name of the contact, used to call the contact on the device.
+cdLastName :: Lens' ContactData (Maybe Text)
+cdLastName = lens _cdLastName (\ s a -> s{_cdLastName = a})
+
+-- | The ARN of the contact.
+cdContactARN :: Lens' ContactData (Maybe Text)
+cdContactARN = lens _cdContactARN (\ s a -> s{_cdContactARN = a})
+
+-- | The phone number of the contact.
+cdPhoneNumber :: Lens' ContactData (Maybe Text)
+cdPhoneNumber = lens _cdPhoneNumber (\ s a -> s{_cdPhoneNumber = a})
+
+-- | The first name of the contact, used to call the contact on the device.
+cdFirstName :: Lens' ContactData (Maybe Text)
+cdFirstName = lens _cdFirstName (\ s a -> s{_cdFirstName = a})
+
+-- | The name of the contact to display on the console.
+cdDisplayName :: Lens' ContactData (Maybe Text)
+cdDisplayName = lens _cdDisplayName (\ s a -> s{_cdDisplayName = a})
+
+instance FromJSON ContactData where
+        parseJSON
+          = withObject "ContactData"
+              (\ x ->
+                 ContactData' <$>
+                   (x .:? "LastName") <*> (x .:? "ContactArn") <*>
+                     (x .:? "PhoneNumber")
+                     <*> (x .:? "FirstName")
+                     <*> (x .:? "DisplayName"))
+
+instance Hashable ContactData where
+
+instance NFData ContactData where
+
+-- | A device with attributes.
+--
+--
+--
+-- /See:/ 'device' smart constructor.
+data Device = Device'
+  { _dDeviceStatus       :: !(Maybe DeviceStatus)
+  , _dDeviceStatusInfo   :: !(Maybe DeviceStatusInfo)
+  , _dDeviceARN          :: !(Maybe Text)
+  , _dMACAddress         :: !(Maybe Text)
+  , _dDeviceName         :: !(Maybe Text)
+  , _dRoomARN            :: !(Maybe Text)
+  , _dSoftwareVersion    :: !(Maybe Text)
+  , _dDeviceType         :: !(Maybe Text)
+  , _dDeviceSerialNumber :: !(Maybe Text)
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'Device' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dDeviceStatus' - The status of a device. If the status is not READY, check the DeviceStatusInfo value for details.
+--
+-- * 'dDeviceStatusInfo' - Detailed information about a device's status.
+--
+-- * 'dDeviceARN' - The ARN of a device.
+--
+-- * 'dMACAddress' - The MAC address of a device.
+--
+-- * 'dDeviceName' - The name of a device.
+--
+-- * 'dRoomARN' - The room ARN of a device.
+--
+-- * 'dSoftwareVersion' - The software version of a device.
+--
+-- * 'dDeviceType' - The type of a device.
+--
+-- * 'dDeviceSerialNumber' - The serial number of a device.
+device
+    :: Device
+device =
+  Device'
+    { _dDeviceStatus = Nothing
+    , _dDeviceStatusInfo = Nothing
+    , _dDeviceARN = Nothing
+    , _dMACAddress = Nothing
+    , _dDeviceName = Nothing
+    , _dRoomARN = Nothing
+    , _dSoftwareVersion = Nothing
+    , _dDeviceType = Nothing
+    , _dDeviceSerialNumber = Nothing
+    }
+
+
+-- | The status of a device. If the status is not READY, check the DeviceStatusInfo value for details.
+dDeviceStatus :: Lens' Device (Maybe DeviceStatus)
+dDeviceStatus = lens _dDeviceStatus (\ s a -> s{_dDeviceStatus = a})
+
+-- | Detailed information about a device's status.
+dDeviceStatusInfo :: Lens' Device (Maybe DeviceStatusInfo)
+dDeviceStatusInfo = lens _dDeviceStatusInfo (\ s a -> s{_dDeviceStatusInfo = a})
+
+-- | The ARN of a device.
+dDeviceARN :: Lens' Device (Maybe Text)
+dDeviceARN = lens _dDeviceARN (\ s a -> s{_dDeviceARN = a})
+
+-- | The MAC address of a device.
+dMACAddress :: Lens' Device (Maybe Text)
+dMACAddress = lens _dMACAddress (\ s a -> s{_dMACAddress = a})
+
+-- | The name of a device.
+dDeviceName :: Lens' Device (Maybe Text)
+dDeviceName = lens _dDeviceName (\ s a -> s{_dDeviceName = a})
+
+-- | The room ARN of a device.
+dRoomARN :: Lens' Device (Maybe Text)
+dRoomARN = lens _dRoomARN (\ s a -> s{_dRoomARN = a})
+
+-- | The software version of a device.
+dSoftwareVersion :: Lens' Device (Maybe Text)
+dSoftwareVersion = lens _dSoftwareVersion (\ s a -> s{_dSoftwareVersion = a})
+
+-- | The type of a device.
+dDeviceType :: Lens' Device (Maybe Text)
+dDeviceType = lens _dDeviceType (\ s a -> s{_dDeviceType = a})
+
+-- | The serial number of a device.
+dDeviceSerialNumber :: Lens' Device (Maybe Text)
+dDeviceSerialNumber = lens _dDeviceSerialNumber (\ s a -> s{_dDeviceSerialNumber = a})
+
+instance FromJSON Device where
+        parseJSON
+          = withObject "Device"
+              (\ x ->
+                 Device' <$>
+                   (x .:? "DeviceStatus") <*> (x .:? "DeviceStatusInfo")
+                     <*> (x .:? "DeviceArn")
+                     <*> (x .:? "MacAddress")
+                     <*> (x .:? "DeviceName")
+                     <*> (x .:? "RoomArn")
+                     <*> (x .:? "SoftwareVersion")
+                     <*> (x .:? "DeviceType")
+                     <*> (x .:? "DeviceSerialNumber"))
+
+instance Hashable Device where
+
+instance NFData Device where
+
+-- | Device attributes.
+--
+--
+--
+-- /See:/ 'deviceData' smart constructor.
+data DeviceData = DeviceData'
+  { _ddDeviceStatus       :: !(Maybe DeviceStatus)
+  , _ddDeviceStatusInfo   :: !(Maybe DeviceStatusInfo)
+  , _ddDeviceARN          :: !(Maybe Text)
+  , _ddMACAddress         :: !(Maybe Text)
+  , _ddDeviceName         :: !(Maybe Text)
+  , _ddRoomARN            :: !(Maybe Text)
+  , _ddSoftwareVersion    :: !(Maybe Text)
+  , _ddDeviceType         :: !(Maybe Text)
+  , _ddRoomName           :: !(Maybe Text)
+  , _ddDeviceSerialNumber :: !(Maybe Text)
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'DeviceData' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ddDeviceStatus' - The status of a device.
+--
+-- * 'ddDeviceStatusInfo' - Detailed information about a device's status.
+--
+-- * 'ddDeviceARN' - The ARN of a device.
+--
+-- * 'ddMACAddress' - The MAC address of a device.
+--
+-- * 'ddDeviceName' - The name of a device.
+--
+-- * 'ddRoomARN' - The room ARN associated with a device.
+--
+-- * 'ddSoftwareVersion' - The software version of a device.
+--
+-- * 'ddDeviceType' - The type of a device.
+--
+-- * 'ddRoomName' - The name of the room associated with a device.
+--
+-- * 'ddDeviceSerialNumber' - The serial number of a device.
+deviceData
+    :: DeviceData
+deviceData =
+  DeviceData'
+    { _ddDeviceStatus = Nothing
+    , _ddDeviceStatusInfo = Nothing
+    , _ddDeviceARN = Nothing
+    , _ddMACAddress = Nothing
+    , _ddDeviceName = Nothing
+    , _ddRoomARN = Nothing
+    , _ddSoftwareVersion = Nothing
+    , _ddDeviceType = Nothing
+    , _ddRoomName = Nothing
+    , _ddDeviceSerialNumber = Nothing
+    }
+
+
+-- | The status of a device.
+ddDeviceStatus :: Lens' DeviceData (Maybe DeviceStatus)
+ddDeviceStatus = lens _ddDeviceStatus (\ s a -> s{_ddDeviceStatus = a})
+
+-- | Detailed information about a device's status.
+ddDeviceStatusInfo :: Lens' DeviceData (Maybe DeviceStatusInfo)
+ddDeviceStatusInfo = lens _ddDeviceStatusInfo (\ s a -> s{_ddDeviceStatusInfo = a})
+
+-- | The ARN of a device.
+ddDeviceARN :: Lens' DeviceData (Maybe Text)
+ddDeviceARN = lens _ddDeviceARN (\ s a -> s{_ddDeviceARN = a})
+
+-- | The MAC address of a device.
+ddMACAddress :: Lens' DeviceData (Maybe Text)
+ddMACAddress = lens _ddMACAddress (\ s a -> s{_ddMACAddress = a})
+
+-- | The name of a device.
+ddDeviceName :: Lens' DeviceData (Maybe Text)
+ddDeviceName = lens _ddDeviceName (\ s a -> s{_ddDeviceName = a})
+
+-- | The room ARN associated with a device.
+ddRoomARN :: Lens' DeviceData (Maybe Text)
+ddRoomARN = lens _ddRoomARN (\ s a -> s{_ddRoomARN = a})
+
+-- | The software version of a device.
+ddSoftwareVersion :: Lens' DeviceData (Maybe Text)
+ddSoftwareVersion = lens _ddSoftwareVersion (\ s a -> s{_ddSoftwareVersion = a})
+
+-- | The type of a device.
+ddDeviceType :: Lens' DeviceData (Maybe Text)
+ddDeviceType = lens _ddDeviceType (\ s a -> s{_ddDeviceType = a})
+
+-- | The name of the room associated with a device.
+ddRoomName :: Lens' DeviceData (Maybe Text)
+ddRoomName = lens _ddRoomName (\ s a -> s{_ddRoomName = a})
+
+-- | The serial number of a device.
+ddDeviceSerialNumber :: Lens' DeviceData (Maybe Text)
+ddDeviceSerialNumber = lens _ddDeviceSerialNumber (\ s a -> s{_ddDeviceSerialNumber = a})
+
+instance FromJSON DeviceData where
+        parseJSON
+          = withObject "DeviceData"
+              (\ x ->
+                 DeviceData' <$>
+                   (x .:? "DeviceStatus") <*> (x .:? "DeviceStatusInfo")
+                     <*> (x .:? "DeviceArn")
+                     <*> (x .:? "MacAddress")
+                     <*> (x .:? "DeviceName")
+                     <*> (x .:? "RoomArn")
+                     <*> (x .:? "SoftwareVersion")
+                     <*> (x .:? "DeviceType")
+                     <*> (x .:? "RoomName")
+                     <*> (x .:? "DeviceSerialNumber"))
+
+instance Hashable DeviceData where
+
+instance NFData DeviceData where
+
+-- | The list of device events.
+--
+--
+--
+-- /See:/ 'deviceEvent' smart constructor.
+data DeviceEvent = DeviceEvent'
+  { _deValue     :: !(Maybe Text)
+  , _deType      :: !(Maybe DeviceEventType)
+  , _deTimestamp :: !(Maybe POSIX)
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'DeviceEvent' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'deValue' - The value of the event.
+--
+-- * 'deType' - The type of device event.
+--
+-- * 'deTimestamp' - The time (in epoch) when the event occurred.
+deviceEvent
+    :: DeviceEvent
+deviceEvent =
+  DeviceEvent' {_deValue = Nothing, _deType = Nothing, _deTimestamp = Nothing}
+
+
+-- | The value of the event.
+deValue :: Lens' DeviceEvent (Maybe Text)
+deValue = lens _deValue (\ s a -> s{_deValue = a})
+
+-- | The type of device event.
+deType :: Lens' DeviceEvent (Maybe DeviceEventType)
+deType = lens _deType (\ s a -> s{_deType = a})
+
+-- | The time (in epoch) when the event occurred.
+deTimestamp :: Lens' DeviceEvent (Maybe UTCTime)
+deTimestamp = lens _deTimestamp (\ s a -> s{_deTimestamp = a}) . mapping _Time
+
+instance FromJSON DeviceEvent where
+        parseJSON
+          = withObject "DeviceEvent"
+              (\ x ->
+                 DeviceEvent' <$>
+                   (x .:? "Value") <*> (x .:? "Type") <*>
+                     (x .:? "Timestamp"))
+
+instance Hashable DeviceEvent where
+
+instance NFData DeviceEvent where
+
+-- | Details of a device’s status.
+--
+--
+--
+-- /See:/ 'deviceStatusDetail' smart constructor.
+newtype DeviceStatusDetail = DeviceStatusDetail'
+  { _dsdCode :: Maybe DeviceStatusDetailCode
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'DeviceStatusDetail' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dsdCode' - The device status detail code.
+deviceStatusDetail
+    :: DeviceStatusDetail
+deviceStatusDetail = DeviceStatusDetail' {_dsdCode = Nothing}
+
+
+-- | The device status detail code.
+dsdCode :: Lens' DeviceStatusDetail (Maybe DeviceStatusDetailCode)
+dsdCode = lens _dsdCode (\ s a -> s{_dsdCode = a})
+
+instance FromJSON DeviceStatusDetail where
+        parseJSON
+          = withObject "DeviceStatusDetail"
+              (\ x -> DeviceStatusDetail' <$> (x .:? "Code"))
+
+instance Hashable DeviceStatusDetail where
+
+instance NFData DeviceStatusDetail where
+
+-- | Detailed information about a device's status.
+--
+--
+--
+-- /See:/ 'deviceStatusInfo' smart constructor.
+data DeviceStatusInfo = DeviceStatusInfo'
+  { _dsiDeviceStatusDetails :: !(Maybe [DeviceStatusDetail])
+  , _dsiConnectionStatus    :: !(Maybe ConnectionStatus)
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'DeviceStatusInfo' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dsiDeviceStatusDetails' - One or more device status detail descriptions.
+--
+-- * 'dsiConnectionStatus' - The latest available information about the connection status of a device.
+deviceStatusInfo
+    :: DeviceStatusInfo
+deviceStatusInfo =
+  DeviceStatusInfo'
+    {_dsiDeviceStatusDetails = Nothing, _dsiConnectionStatus = Nothing}
+
+
+-- | One or more device status detail descriptions.
+dsiDeviceStatusDetails :: Lens' DeviceStatusInfo [DeviceStatusDetail]
+dsiDeviceStatusDetails = lens _dsiDeviceStatusDetails (\ s a -> s{_dsiDeviceStatusDetails = a}) . _Default . _Coerce
+
+-- | The latest available information about the connection status of a device.
+dsiConnectionStatus :: Lens' DeviceStatusInfo (Maybe ConnectionStatus)
+dsiConnectionStatus = lens _dsiConnectionStatus (\ s a -> s{_dsiConnectionStatus = a})
+
+instance FromJSON DeviceStatusInfo where
+        parseJSON
+          = withObject "DeviceStatusInfo"
+              (\ x ->
+                 DeviceStatusInfo' <$>
+                   (x .:? "DeviceStatusDetails" .!= mempty) <*>
+                     (x .:? "ConnectionStatus"))
+
+instance Hashable DeviceStatusInfo where
+
+instance NFData DeviceStatusInfo where
+
+-- | A filter name and value pair that is used to return a more specific list of results. Filters can be used to match a set of resources by various criteria.
+--
+--
+--
+-- /See:/ 'filter'' smart constructor.
+data Filter = Filter'
+  { _fKey    :: !Text
+  , _fValues :: ![Text]
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'Filter' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'fKey' - The key of a filter.
+--
+-- * 'fValues' - The values of a filter.
+filter'
+    :: Text -- ^ 'fKey'
+    -> Filter
+filter' pKey_ = Filter' {_fKey = pKey_, _fValues = mempty}
+
+
+-- | The key of a filter.
+fKey :: Lens' Filter Text
+fKey = lens _fKey (\ s a -> s{_fKey = a})
+
+-- | The values of a filter.
+fValues :: Lens' Filter [Text]
+fValues = lens _fValues (\ s a -> s{_fValues = a}) . _Coerce
+
+instance Hashable Filter where
+
+instance NFData Filter where
+
+instance ToJSON Filter where
+        toJSON Filter'{..}
+          = object
+              (catMaybes
+                 [Just ("Key" .= _fKey), Just ("Values" .= _fValues)])
+
+-- | A room profile with attributes.
+--
+--
+--
+-- /See:/ 'profile' smart constructor.
+data Profile = Profile'
+  { _pSetupModeDisabled :: !(Maybe Bool)
+  , _pPSTNEnabled       :: !(Maybe Bool)
+  , _pDistanceUnit      :: !(Maybe DistanceUnit)
+  , _pAddress           :: !(Maybe Text)
+  , _pProfileARN        :: !(Maybe Text)
+  , _pWakeWord          :: !(Maybe WakeWord)
+  , _pProfileName       :: !(Maybe Text)
+  , _pTemperatureUnit   :: !(Maybe TemperatureUnit)
+  , _pTimezone          :: !(Maybe Text)
+  , _pMaxVolumeLimit    :: !(Maybe Int)
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'Profile' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'pSetupModeDisabled' - The setup mode of a room profile.
+--
+-- * 'pPSTNEnabled' - The PSTN setting of a room profile.
+--
+-- * 'pDistanceUnit' - The distance unit of a room profile.
+--
+-- * 'pAddress' - The address of a room profile.
+--
+-- * 'pProfileARN' - The ARN of a room profile.
+--
+-- * 'pWakeWord' - The wake word of a room profile.
+--
+-- * 'pProfileName' - The name of a room profile.
+--
+-- * 'pTemperatureUnit' - The temperature unit of a room profile.
+--
+-- * 'pTimezone' - The time zone of a room profile.
+--
+-- * 'pMaxVolumeLimit' - The max volume limit of a room profile.
+profile
+    :: Profile
+profile =
+  Profile'
+    { _pSetupModeDisabled = Nothing
+    , _pPSTNEnabled = Nothing
+    , _pDistanceUnit = Nothing
+    , _pAddress = Nothing
+    , _pProfileARN = Nothing
+    , _pWakeWord = Nothing
+    , _pProfileName = Nothing
+    , _pTemperatureUnit = Nothing
+    , _pTimezone = Nothing
+    , _pMaxVolumeLimit = Nothing
+    }
+
+
+-- | The setup mode of a room profile.
+pSetupModeDisabled :: Lens' Profile (Maybe Bool)
+pSetupModeDisabled = lens _pSetupModeDisabled (\ s a -> s{_pSetupModeDisabled = a})
+
+-- | The PSTN setting of a room profile.
+pPSTNEnabled :: Lens' Profile (Maybe Bool)
+pPSTNEnabled = lens _pPSTNEnabled (\ s a -> s{_pPSTNEnabled = a})
+
+-- | The distance unit of a room profile.
+pDistanceUnit :: Lens' Profile (Maybe DistanceUnit)
+pDistanceUnit = lens _pDistanceUnit (\ s a -> s{_pDistanceUnit = a})
+
+-- | The address of a room profile.
+pAddress :: Lens' Profile (Maybe Text)
+pAddress = lens _pAddress (\ s a -> s{_pAddress = a})
+
+-- | The ARN of a room profile.
+pProfileARN :: Lens' Profile (Maybe Text)
+pProfileARN = lens _pProfileARN (\ s a -> s{_pProfileARN = a})
+
+-- | The wake word of a room profile.
+pWakeWord :: Lens' Profile (Maybe WakeWord)
+pWakeWord = lens _pWakeWord (\ s a -> s{_pWakeWord = a})
+
+-- | The name of a room profile.
+pProfileName :: Lens' Profile (Maybe Text)
+pProfileName = lens _pProfileName (\ s a -> s{_pProfileName = a})
+
+-- | The temperature unit of a room profile.
+pTemperatureUnit :: Lens' Profile (Maybe TemperatureUnit)
+pTemperatureUnit = lens _pTemperatureUnit (\ s a -> s{_pTemperatureUnit = a})
+
+-- | The time zone of a room profile.
+pTimezone :: Lens' Profile (Maybe Text)
+pTimezone = lens _pTimezone (\ s a -> s{_pTimezone = a})
+
+-- | The max volume limit of a room profile.
+pMaxVolumeLimit :: Lens' Profile (Maybe Int)
+pMaxVolumeLimit = lens _pMaxVolumeLimit (\ s a -> s{_pMaxVolumeLimit = a})
+
+instance FromJSON Profile where
+        parseJSON
+          = withObject "Profile"
+              (\ x ->
+                 Profile' <$>
+                   (x .:? "SetupModeDisabled") <*> (x .:? "PSTNEnabled")
+                     <*> (x .:? "DistanceUnit")
+                     <*> (x .:? "Address")
+                     <*> (x .:? "ProfileArn")
+                     <*> (x .:? "WakeWord")
+                     <*> (x .:? "ProfileName")
+                     <*> (x .:? "TemperatureUnit")
+                     <*> (x .:? "Timezone")
+                     <*> (x .:? "MaxVolumeLimit"))
+
+instance Hashable Profile where
+
+instance NFData Profile where
+
+-- | The data of a room profile.
+--
+--
+--
+-- /See:/ 'profileData' smart constructor.
+data ProfileData = ProfileData'
+  { _pdDistanceUnit    :: !(Maybe DistanceUnit)
+  , _pdAddress         :: !(Maybe Text)
+  , _pdProfileARN      :: !(Maybe Text)
+  , _pdWakeWord        :: !(Maybe WakeWord)
+  , _pdProfileName     :: !(Maybe Text)
+  , _pdTemperatureUnit :: !(Maybe TemperatureUnit)
+  , _pdTimezone        :: !(Maybe Text)
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'ProfileData' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'pdDistanceUnit' - The distance unit of a room profile.
+--
+-- * 'pdAddress' - The address of a room profile.
+--
+-- * 'pdProfileARN' - The ARN of a room profile.
+--
+-- * 'pdWakeWord' - The wake word of a room profile.
+--
+-- * 'pdProfileName' - The name of a room profile.
+--
+-- * 'pdTemperatureUnit' - The temperature unit of a room profile.
+--
+-- * 'pdTimezone' - The timezone of a room profile.
+profileData
+    :: ProfileData
+profileData =
+  ProfileData'
+    { _pdDistanceUnit = Nothing
+    , _pdAddress = Nothing
+    , _pdProfileARN = Nothing
+    , _pdWakeWord = Nothing
+    , _pdProfileName = Nothing
+    , _pdTemperatureUnit = Nothing
+    , _pdTimezone = Nothing
+    }
+
+
+-- | The distance unit of a room profile.
+pdDistanceUnit :: Lens' ProfileData (Maybe DistanceUnit)
+pdDistanceUnit = lens _pdDistanceUnit (\ s a -> s{_pdDistanceUnit = a})
+
+-- | The address of a room profile.
+pdAddress :: Lens' ProfileData (Maybe Text)
+pdAddress = lens _pdAddress (\ s a -> s{_pdAddress = a})
+
+-- | The ARN of a room profile.
+pdProfileARN :: Lens' ProfileData (Maybe Text)
+pdProfileARN = lens _pdProfileARN (\ s a -> s{_pdProfileARN = a})
+
+-- | The wake word of a room profile.
+pdWakeWord :: Lens' ProfileData (Maybe WakeWord)
+pdWakeWord = lens _pdWakeWord (\ s a -> s{_pdWakeWord = a})
+
+-- | The name of a room profile.
+pdProfileName :: Lens' ProfileData (Maybe Text)
+pdProfileName = lens _pdProfileName (\ s a -> s{_pdProfileName = a})
+
+-- | The temperature unit of a room profile.
+pdTemperatureUnit :: Lens' ProfileData (Maybe TemperatureUnit)
+pdTemperatureUnit = lens _pdTemperatureUnit (\ s a -> s{_pdTemperatureUnit = a})
+
+-- | The timezone of a room profile.
+pdTimezone :: Lens' ProfileData (Maybe Text)
+pdTimezone = lens _pdTimezone (\ s a -> s{_pdTimezone = a})
+
+instance FromJSON ProfileData where
+        parseJSON
+          = withObject "ProfileData"
+              (\ x ->
+                 ProfileData' <$>
+                   (x .:? "DistanceUnit") <*> (x .:? "Address") <*>
+                     (x .:? "ProfileArn")
+                     <*> (x .:? "WakeWord")
+                     <*> (x .:? "ProfileName")
+                     <*> (x .:? "TemperatureUnit")
+                     <*> (x .:? "Timezone"))
+
+instance Hashable ProfileData where
+
+instance NFData ProfileData where
+
+-- | A room with attributes.
+--
+--
+--
+-- /See:/ 'room' smart constructor.
+data Room = Room'
+  { _rProfileARN         :: !(Maybe Text)
+  , _rProviderCalendarId :: !(Maybe Text)
+  , _rRoomARN            :: !(Maybe Text)
+  , _rRoomName           :: !(Maybe Text)
+  , _rDescription        :: !(Maybe Text)
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'Room' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'rProfileARN' - The profile ARN of a room.
+--
+-- * 'rProviderCalendarId' - The provider calendar ARN of a room.
+--
+-- * 'rRoomARN' - The ARN of a room.
+--
+-- * 'rRoomName' - The name of a room.
+--
+-- * 'rDescription' - The description of a room.
+room
+    :: Room
+room =
+  Room'
+    { _rProfileARN = Nothing
+    , _rProviderCalendarId = Nothing
+    , _rRoomARN = Nothing
+    , _rRoomName = Nothing
+    , _rDescription = Nothing
+    }
+
+
+-- | The profile ARN of a room.
+rProfileARN :: Lens' Room (Maybe Text)
+rProfileARN = lens _rProfileARN (\ s a -> s{_rProfileARN = a})
+
+-- | The provider calendar ARN of a room.
+rProviderCalendarId :: Lens' Room (Maybe Text)
+rProviderCalendarId = lens _rProviderCalendarId (\ s a -> s{_rProviderCalendarId = a})
+
+-- | The ARN of a room.
+rRoomARN :: Lens' Room (Maybe Text)
+rRoomARN = lens _rRoomARN (\ s a -> s{_rRoomARN = a})
+
+-- | The name of a room.
+rRoomName :: Lens' Room (Maybe Text)
+rRoomName = lens _rRoomName (\ s a -> s{_rRoomName = a})
+
+-- | The description of a room.
+rDescription :: Lens' Room (Maybe Text)
+rDescription = lens _rDescription (\ s a -> s{_rDescription = a})
+
+instance FromJSON Room where
+        parseJSON
+          = withObject "Room"
+              (\ x ->
+                 Room' <$>
+                   (x .:? "ProfileArn") <*> (x .:? "ProviderCalendarId")
+                     <*> (x .:? "RoomArn")
+                     <*> (x .:? "RoomName")
+                     <*> (x .:? "Description"))
+
+instance Hashable Room where
+
+instance NFData Room where
+
+-- | The data of a room.
+--
+--
+--
+-- /See:/ 'roomData' smart constructor.
+data RoomData = RoomData'
+  { _rdProfileARN         :: !(Maybe Text)
+  , _rdProviderCalendarId :: !(Maybe Text)
+  , _rdProfileName        :: !(Maybe Text)
+  , _rdRoomARN            :: !(Maybe Text)
+  , _rdRoomName           :: !(Maybe Text)
+  , _rdDescription        :: !(Maybe Text)
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'RoomData' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'rdProfileARN' - The profile ARN of a room.
+--
+-- * 'rdProviderCalendarId' - The provider calendar ARN of a room.
+--
+-- * 'rdProfileName' - The profile name of a room.
+--
+-- * 'rdRoomARN' - The ARN of a room.
+--
+-- * 'rdRoomName' - The name of a room.
+--
+-- * 'rdDescription' - The description of a room.
+roomData
+    :: RoomData
+roomData =
+  RoomData'
+    { _rdProfileARN = Nothing
+    , _rdProviderCalendarId = Nothing
+    , _rdProfileName = Nothing
+    , _rdRoomARN = Nothing
+    , _rdRoomName = Nothing
+    , _rdDescription = Nothing
+    }
+
+
+-- | The profile ARN of a room.
+rdProfileARN :: Lens' RoomData (Maybe Text)
+rdProfileARN = lens _rdProfileARN (\ s a -> s{_rdProfileARN = a})
+
+-- | The provider calendar ARN of a room.
+rdProviderCalendarId :: Lens' RoomData (Maybe Text)
+rdProviderCalendarId = lens _rdProviderCalendarId (\ s a -> s{_rdProviderCalendarId = a})
+
+-- | The profile name of a room.
+rdProfileName :: Lens' RoomData (Maybe Text)
+rdProfileName = lens _rdProfileName (\ s a -> s{_rdProfileName = a})
+
+-- | The ARN of a room.
+rdRoomARN :: Lens' RoomData (Maybe Text)
+rdRoomARN = lens _rdRoomARN (\ s a -> s{_rdRoomARN = a})
+
+-- | The name of a room.
+rdRoomName :: Lens' RoomData (Maybe Text)
+rdRoomName = lens _rdRoomName (\ s a -> s{_rdRoomName = a})
+
+-- | The description of a room.
+rdDescription :: Lens' RoomData (Maybe Text)
+rdDescription = lens _rdDescription (\ s a -> s{_rdDescription = a})
+
+instance FromJSON RoomData where
+        parseJSON
+          = withObject "RoomData"
+              (\ x ->
+                 RoomData' <$>
+                   (x .:? "ProfileArn") <*> (x .:? "ProviderCalendarId")
+                     <*> (x .:? "ProfileName")
+                     <*> (x .:? "RoomArn")
+                     <*> (x .:? "RoomName")
+                     <*> (x .:? "Description"))
+
+instance Hashable RoomData where
+
+instance NFData RoomData where
+
+-- | A skill parameter associated with a room.
+--
+--
+--
+-- /See:/ 'roomSkillParameter' smart constructor.
+data RoomSkillParameter = RoomSkillParameter'
+  { _rspParameterKey   :: !Text
+  , _rspParameterValue :: !Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'RoomSkillParameter' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'rspParameterKey' - The parameter key of a room skill parameter. ParameterKey is an enumerated type that only takes “DEFAULT” or “SCOPE” as valid values.
+--
+-- * 'rspParameterValue' - The parameter value of a room skill parameter.
+roomSkillParameter
+    :: Text -- ^ 'rspParameterKey'
+    -> Text -- ^ 'rspParameterValue'
+    -> RoomSkillParameter
+roomSkillParameter pParameterKey_ pParameterValue_ =
+  RoomSkillParameter'
+    {_rspParameterKey = pParameterKey_, _rspParameterValue = pParameterValue_}
+
+
+-- | The parameter key of a room skill parameter. ParameterKey is an enumerated type that only takes “DEFAULT” or “SCOPE” as valid values.
+rspParameterKey :: Lens' RoomSkillParameter Text
+rspParameterKey = lens _rspParameterKey (\ s a -> s{_rspParameterKey = a})
+
+-- | The parameter value of a room skill parameter.
+rspParameterValue :: Lens' RoomSkillParameter Text
+rspParameterValue = lens _rspParameterValue (\ s a -> s{_rspParameterValue = a})
+
+instance FromJSON RoomSkillParameter where
+        parseJSON
+          = withObject "RoomSkillParameter"
+              (\ x ->
+                 RoomSkillParameter' <$>
+                   (x .: "ParameterKey") <*> (x .: "ParameterValue"))
+
+instance Hashable RoomSkillParameter where
+
+instance NFData RoomSkillParameter where
+
+instance ToJSON RoomSkillParameter where
+        toJSON RoomSkillParameter'{..}
+          = object
+              (catMaybes
+                 [Just ("ParameterKey" .= _rspParameterKey),
+                  Just ("ParameterValue" .= _rspParameterValue)])
+
+-- | A skill group with attributes.
+--
+--
+--
+-- /See:/ 'skillGroup' smart constructor.
+data SkillGroup = SkillGroup'
+  { _sgSkillGroupARN  :: !(Maybe Text)
+  , _sgDescription    :: !(Maybe Text)
+  , _sgSkillGroupName :: !(Maybe Text)
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'SkillGroup' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sgSkillGroupARN' - The ARN of a skill group.
+--
+-- * 'sgDescription' - The description of a skill group.
+--
+-- * 'sgSkillGroupName' - The name of a skill group.
+skillGroup
+    :: SkillGroup
+skillGroup =
+  SkillGroup'
+    { _sgSkillGroupARN = Nothing
+    , _sgDescription = Nothing
+    , _sgSkillGroupName = Nothing
+    }
+
+
+-- | The ARN of a skill group.
+sgSkillGroupARN :: Lens' SkillGroup (Maybe Text)
+sgSkillGroupARN = lens _sgSkillGroupARN (\ s a -> s{_sgSkillGroupARN = a})
+
+-- | The description of a skill group.
+sgDescription :: Lens' SkillGroup (Maybe Text)
+sgDescription = lens _sgDescription (\ s a -> s{_sgDescription = a})
+
+-- | The name of a skill group.
+sgSkillGroupName :: Lens' SkillGroup (Maybe Text)
+sgSkillGroupName = lens _sgSkillGroupName (\ s a -> s{_sgSkillGroupName = a})
+
+instance FromJSON SkillGroup where
+        parseJSON
+          = withObject "SkillGroup"
+              (\ x ->
+                 SkillGroup' <$>
+                   (x .:? "SkillGroupArn") <*> (x .:? "Description") <*>
+                     (x .:? "SkillGroupName"))
+
+instance Hashable SkillGroup where
+
+instance NFData SkillGroup where
+
+-- | The attributes of a skill group.
+--
+--
+--
+-- /See:/ 'skillGroupData' smart constructor.
+data SkillGroupData = SkillGroupData'
+  { _sgdSkillGroupARN  :: !(Maybe Text)
+  , _sgdDescription    :: !(Maybe Text)
+  , _sgdSkillGroupName :: !(Maybe Text)
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'SkillGroupData' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sgdSkillGroupARN' - The skill group ARN of a skill group.
+--
+-- * 'sgdDescription' - The description of a skill group.
+--
+-- * 'sgdSkillGroupName' - The skill group name of a skill group.
+skillGroupData
+    :: SkillGroupData
+skillGroupData =
+  SkillGroupData'
+    { _sgdSkillGroupARN = Nothing
+    , _sgdDescription = Nothing
+    , _sgdSkillGroupName = Nothing
+    }
+
+
+-- | The skill group ARN of a skill group.
+sgdSkillGroupARN :: Lens' SkillGroupData (Maybe Text)
+sgdSkillGroupARN = lens _sgdSkillGroupARN (\ s a -> s{_sgdSkillGroupARN = a})
+
+-- | The description of a skill group.
+sgdDescription :: Lens' SkillGroupData (Maybe Text)
+sgdDescription = lens _sgdDescription (\ s a -> s{_sgdDescription = a})
+
+-- | The skill group name of a skill group.
+sgdSkillGroupName :: Lens' SkillGroupData (Maybe Text)
+sgdSkillGroupName = lens _sgdSkillGroupName (\ s a -> s{_sgdSkillGroupName = a})
+
+instance FromJSON SkillGroupData where
+        parseJSON
+          = withObject "SkillGroupData"
+              (\ x ->
+                 SkillGroupData' <$>
+                   (x .:? "SkillGroupArn") <*> (x .:? "Description") <*>
+                     (x .:? "SkillGroupName"))
+
+instance Hashable SkillGroupData where
+
+instance NFData SkillGroupData where
+
+-- | The summary of skills.
+--
+--
+--
+-- /See:/ 'skillSummary' smart constructor.
+data SkillSummary = SkillSummary'
+  { _ssSkillId         :: !(Maybe Text)
+  , _ssSupportsLinking :: !(Maybe Bool)
+  , _ssSkillName       :: !(Maybe Text)
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'SkillSummary' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ssSkillId' - The ARN of the skill summary.
+--
+-- * 'ssSupportsLinking' - Linking support for a skill.
+--
+-- * 'ssSkillName' - The name of the skill.
+skillSummary
+    :: SkillSummary
+skillSummary =
+  SkillSummary'
+    {_ssSkillId = Nothing, _ssSupportsLinking = Nothing, _ssSkillName = Nothing}
+
+
+-- | The ARN of the skill summary.
+ssSkillId :: Lens' SkillSummary (Maybe Text)
+ssSkillId = lens _ssSkillId (\ s a -> s{_ssSkillId = a})
+
+-- | Linking support for a skill.
+ssSupportsLinking :: Lens' SkillSummary (Maybe Bool)
+ssSupportsLinking = lens _ssSupportsLinking (\ s a -> s{_ssSupportsLinking = a})
+
+-- | The name of the skill.
+ssSkillName :: Lens' SkillSummary (Maybe Text)
+ssSkillName = lens _ssSkillName (\ s a -> s{_ssSkillName = a})
+
+instance FromJSON SkillSummary where
+        parseJSON
+          = withObject "SkillSummary"
+              (\ x ->
+                 SkillSummary' <$>
+                   (x .:? "SkillId") <*> (x .:? "SupportsLinking") <*>
+                     (x .:? "SkillName"))
+
+instance Hashable SkillSummary where
+
+instance NFData SkillSummary where
+
+-- | An object representing a sort criteria.
+--
+--
+--
+-- /See:/ 'sort' smart constructor.
+data Sort = Sort'
+  { _sKey   :: !Text
+  , _sValue :: !SortValue
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'Sort' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sKey' - The sort key of a sort object.
+--
+-- * 'sValue' - The sort value of a sort object.
+sort
+    :: Text -- ^ 'sKey'
+    -> SortValue -- ^ 'sValue'
+    -> Sort
+sort pKey_ pValue_ = Sort' {_sKey = pKey_, _sValue = pValue_}
+
+
+-- | The sort key of a sort object.
+sKey :: Lens' Sort Text
+sKey = lens _sKey (\ s a -> s{_sKey = a})
+
+-- | The sort value of a sort object.
+sValue :: Lens' Sort SortValue
+sValue = lens _sValue (\ s a -> s{_sValue = a})
+
+instance Hashable Sort where
+
+instance NFData Sort where
+
+instance ToJSON Sort where
+        toJSON Sort'{..}
+          = object
+              (catMaybes
+                 [Just ("Key" .= _sKey), Just ("Value" .= _sValue)])
+
+-- | A key-value pair that can be associated with a resource.
+--
+--
+--
+-- /See:/ 'tag' smart constructor.
+data Tag = Tag'
+  { _tagValue :: !(Maybe Text)
+  , _tagKey   :: !(Maybe Text)
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'Tag' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'tagValue' - The value of a tag. Tag values are case-sensitive and can be null.
+--
+-- * 'tagKey' - The key of a tag. Tag keys are case-sensitive.
+tag
+    :: Tag
+tag = Tag' {_tagValue = Nothing, _tagKey = Nothing}
+
+
+-- | The value of a tag. Tag values are case-sensitive and can be null.
+tagValue :: Lens' Tag (Maybe Text)
+tagValue = lens _tagValue (\ s a -> s{_tagValue = a})
+
+-- | The key of a tag. Tag keys are case-sensitive.
+tagKey :: Lens' Tag (Maybe Text)
+tagKey = lens _tagKey (\ s a -> s{_tagKey = a})
+
+instance FromJSON Tag where
+        parseJSON
+          = withObject "Tag"
+              (\ x -> Tag' <$> (x .:? "Value") <*> (x .:? "Key"))
+
+instance Hashable Tag where
+
+instance NFData Tag where
+
+instance ToJSON Tag where
+        toJSON Tag'{..}
+          = object
+              (catMaybes
+                 [("Value" .=) <$> _tagValue, ("Key" .=) <$> _tagKey])
+
+-- | Information related to a user.
+--
+--
+--
+-- /See:/ 'userData' smart constructor.
+data UserData = UserData'
+  { _udEmail            :: !(Maybe Text)
+  , _udLastName         :: !(Maybe Text)
+  , _udEnrollmentId     :: !(Maybe Text)
+  , _udUserARN          :: !(Maybe Text)
+  , _udFirstName        :: !(Maybe Text)
+  , _udEnrollmentStatus :: !(Maybe EnrollmentStatus)
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'UserData' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'udEmail' - The email of a user.
+--
+-- * 'udLastName' - The last name of a user.
+--
+-- * 'udEnrollmentId' - The enrollment ARN of a user.
+--
+-- * 'udUserARN' - The ARN of a user.
+--
+-- * 'udFirstName' - The first name of a user.
+--
+-- * 'udEnrollmentStatus' - The enrollment status of a user.
+userData
+    :: UserData
+userData =
+  UserData'
+    { _udEmail = Nothing
+    , _udLastName = Nothing
+    , _udEnrollmentId = Nothing
+    , _udUserARN = Nothing
+    , _udFirstName = Nothing
+    , _udEnrollmentStatus = Nothing
+    }
+
+
+-- | The email of a user.
+udEmail :: Lens' UserData (Maybe Text)
+udEmail = lens _udEmail (\ s a -> s{_udEmail = a})
+
+-- | The last name of a user.
+udLastName :: Lens' UserData (Maybe Text)
+udLastName = lens _udLastName (\ s a -> s{_udLastName = a})
+
+-- | The enrollment ARN of a user.
+udEnrollmentId :: Lens' UserData (Maybe Text)
+udEnrollmentId = lens _udEnrollmentId (\ s a -> s{_udEnrollmentId = a})
+
+-- | The ARN of a user.
+udUserARN :: Lens' UserData (Maybe Text)
+udUserARN = lens _udUserARN (\ s a -> s{_udUserARN = a})
+
+-- | The first name of a user.
+udFirstName :: Lens' UserData (Maybe Text)
+udFirstName = lens _udFirstName (\ s a -> s{_udFirstName = a})
+
+-- | The enrollment status of a user.
+udEnrollmentStatus :: Lens' UserData (Maybe EnrollmentStatus)
+udEnrollmentStatus = lens _udEnrollmentStatus (\ s a -> s{_udEnrollmentStatus = a})
+
+instance FromJSON UserData where
+        parseJSON
+          = withObject "UserData"
+              (\ x ->
+                 UserData' <$>
+                   (x .:? "Email") <*> (x .:? "LastName") <*>
+                     (x .:? "EnrollmentId")
+                     <*> (x .:? "UserArn")
+                     <*> (x .:? "FirstName")
+                     <*> (x .:? "EnrollmentStatus"))
+
+instance Hashable UserData where
+
+instance NFData UserData where
diff --git a/gen/Network/AWS/AlexaBusiness/Types/Sum.hs b/gen/Network/AWS/AlexaBusiness/Types/Sum.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/Types/Sum.hs
@@ -0,0 +1,335 @@
+{-# 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.AlexaBusiness.Types.Sum
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+module Network.AWS.AlexaBusiness.Types.Sum where
+
+import Network.AWS.Prelude
+
+data ConnectionStatus
+  = Offline
+  | Online
+  deriving (Eq, Ord, Read, Show, Enum, Bounded, Data, Typeable, Generic)
+
+
+instance FromText ConnectionStatus where
+    parser = takeLowerText >>= \case
+        "offline" -> pure Offline
+        "online" -> pure Online
+        e -> fromTextError $ "Failure parsing ConnectionStatus from value: '" <> e
+           <> "'. Accepted values: offline, online"
+
+instance ToText ConnectionStatus where
+    toText = \case
+        Offline -> "OFFLINE"
+        Online -> "ONLINE"
+
+instance Hashable     ConnectionStatus
+instance NFData       ConnectionStatus
+instance ToByteString ConnectionStatus
+instance ToQuery      ConnectionStatus
+instance ToHeader     ConnectionStatus
+
+instance FromJSON ConnectionStatus where
+    parseJSON = parseJSONText "ConnectionStatus"
+
+data DeviceEventType
+  = ConnectionStatus
+  | DeviceStatus
+  deriving (Eq, Ord, Read, Show, Enum, Bounded, Data, Typeable, Generic)
+
+
+instance FromText DeviceEventType where
+    parser = takeLowerText >>= \case
+        "connection_status" -> pure ConnectionStatus
+        "device_status" -> pure DeviceStatus
+        e -> fromTextError $ "Failure parsing DeviceEventType from value: '" <> e
+           <> "'. Accepted values: connection_status, device_status"
+
+instance ToText DeviceEventType where
+    toText = \case
+        ConnectionStatus -> "CONNECTION_STATUS"
+        DeviceStatus -> "DEVICE_STATUS"
+
+instance Hashable     DeviceEventType
+instance NFData       DeviceEventType
+instance ToByteString DeviceEventType
+instance ToQuery      DeviceEventType
+instance ToHeader     DeviceEventType
+
+instance ToJSON DeviceEventType where
+    toJSON = toJSONText
+
+instance FromJSON DeviceEventType where
+    parseJSON = parseJSONText "DeviceEventType"
+
+data DeviceStatus
+  = Deregistered
+  | Pending
+  | Ready
+  | WasOffline
+  deriving (Eq, Ord, Read, Show, Enum, Bounded, Data, Typeable, Generic)
+
+
+instance FromText DeviceStatus where
+    parser = takeLowerText >>= \case
+        "deregistered" -> pure Deregistered
+        "pending" -> pure Pending
+        "ready" -> pure Ready
+        "was_offline" -> pure WasOffline
+        e -> fromTextError $ "Failure parsing DeviceStatus from value: '" <> e
+           <> "'. Accepted values: deregistered, pending, ready, was_offline"
+
+instance ToText DeviceStatus where
+    toText = \case
+        Deregistered -> "DEREGISTERED"
+        Pending -> "PENDING"
+        Ready -> "READY"
+        WasOffline -> "WAS_OFFLINE"
+
+instance Hashable     DeviceStatus
+instance NFData       DeviceStatus
+instance ToByteString DeviceStatus
+instance ToQuery      DeviceStatus
+instance ToHeader     DeviceStatus
+
+instance FromJSON DeviceStatus where
+    parseJSON = parseJSONText "DeviceStatus"
+
+data DeviceStatusDetailCode
+  = DeviceSoftwareUpdateNeeded
+  | DeviceWasOffline
+  deriving (Eq, Ord, Read, Show, Enum, Bounded, Data, Typeable, Generic)
+
+
+instance FromText DeviceStatusDetailCode where
+    parser = takeLowerText >>= \case
+        "device_software_update_needed" -> pure DeviceSoftwareUpdateNeeded
+        "device_was_offline" -> pure DeviceWasOffline
+        e -> fromTextError $ "Failure parsing DeviceStatusDetailCode from value: '" <> e
+           <> "'. Accepted values: device_software_update_needed, device_was_offline"
+
+instance ToText DeviceStatusDetailCode where
+    toText = \case
+        DeviceSoftwareUpdateNeeded -> "DEVICE_SOFTWARE_UPDATE_NEEDED"
+        DeviceWasOffline -> "DEVICE_WAS_OFFLINE"
+
+instance Hashable     DeviceStatusDetailCode
+instance NFData       DeviceStatusDetailCode
+instance ToByteString DeviceStatusDetailCode
+instance ToQuery      DeviceStatusDetailCode
+instance ToHeader     DeviceStatusDetailCode
+
+instance FromJSON DeviceStatusDetailCode where
+    parseJSON = parseJSONText "DeviceStatusDetailCode"
+
+data DistanceUnit
+  = Imperial
+  | Metric
+  deriving (Eq, Ord, Read, Show, Enum, Bounded, Data, Typeable, Generic)
+
+
+instance FromText DistanceUnit where
+    parser = takeLowerText >>= \case
+        "imperial" -> pure Imperial
+        "metric" -> pure Metric
+        e -> fromTextError $ "Failure parsing DistanceUnit from value: '" <> e
+           <> "'. Accepted values: imperial, metric"
+
+instance ToText DistanceUnit where
+    toText = \case
+        Imperial -> "IMPERIAL"
+        Metric -> "METRIC"
+
+instance Hashable     DistanceUnit
+instance NFData       DistanceUnit
+instance ToByteString DistanceUnit
+instance ToQuery      DistanceUnit
+instance ToHeader     DistanceUnit
+
+instance ToJSON DistanceUnit where
+    toJSON = toJSONText
+
+instance FromJSON DistanceUnit where
+    parseJSON = parseJSONText "DistanceUnit"
+
+data EnrollmentStatus
+  = ESDeregistering
+  | ESDisassociating
+  | ESInitialized
+  | ESPending
+  | ESRegistered
+  deriving (Eq, Ord, Read, Show, Enum, Bounded, Data, Typeable, Generic)
+
+
+instance FromText EnrollmentStatus where
+    parser = takeLowerText >>= \case
+        "deregistering" -> pure ESDeregistering
+        "disassociating" -> pure ESDisassociating
+        "initialized" -> pure ESInitialized
+        "pending" -> pure ESPending
+        "registered" -> pure ESRegistered
+        e -> fromTextError $ "Failure parsing EnrollmentStatus from value: '" <> e
+           <> "'. Accepted values: deregistering, disassociating, initialized, pending, registered"
+
+instance ToText EnrollmentStatus where
+    toText = \case
+        ESDeregistering -> "DEREGISTERING"
+        ESDisassociating -> "DISASSOCIATING"
+        ESInitialized -> "INITIALIZED"
+        ESPending -> "PENDING"
+        ESRegistered -> "REGISTERED"
+
+instance Hashable     EnrollmentStatus
+instance NFData       EnrollmentStatus
+instance ToByteString EnrollmentStatus
+instance ToQuery      EnrollmentStatus
+instance ToHeader     EnrollmentStatus
+
+instance FromJSON EnrollmentStatus where
+    parseJSON = parseJSONText "EnrollmentStatus"
+
+data Feature
+  = All
+  | Bluetooth
+  | Lists
+  | Notifications
+  | Skills
+  | Volume
+  deriving (Eq, Ord, Read, Show, Enum, Bounded, Data, Typeable, Generic)
+
+
+instance FromText Feature where
+    parser = takeLowerText >>= \case
+        "all" -> pure All
+        "bluetooth" -> pure Bluetooth
+        "lists" -> pure Lists
+        "notifications" -> pure Notifications
+        "skills" -> pure Skills
+        "volume" -> pure Volume
+        e -> fromTextError $ "Failure parsing Feature from value: '" <> e
+           <> "'. Accepted values: all, bluetooth, lists, notifications, skills, volume"
+
+instance ToText Feature where
+    toText = \case
+        All -> "ALL"
+        Bluetooth -> "BLUETOOTH"
+        Lists -> "LISTS"
+        Notifications -> "NOTIFICATIONS"
+        Skills -> "SKILLS"
+        Volume -> "VOLUME"
+
+instance Hashable     Feature
+instance NFData       Feature
+instance ToByteString Feature
+instance ToQuery      Feature
+instance ToHeader     Feature
+
+instance ToJSON Feature where
+    toJSON = toJSONText
+
+data SortValue
+  = Asc
+  | Desc
+  deriving (Eq, Ord, Read, Show, Enum, Bounded, Data, Typeable, Generic)
+
+
+instance FromText SortValue where
+    parser = takeLowerText >>= \case
+        "asc" -> pure Asc
+        "desc" -> pure Desc
+        e -> fromTextError $ "Failure parsing SortValue from value: '" <> e
+           <> "'. Accepted values: asc, desc"
+
+instance ToText SortValue where
+    toText = \case
+        Asc -> "ASC"
+        Desc -> "DESC"
+
+instance Hashable     SortValue
+instance NFData       SortValue
+instance ToByteString SortValue
+instance ToQuery      SortValue
+instance ToHeader     SortValue
+
+instance ToJSON SortValue where
+    toJSON = toJSONText
+
+data TemperatureUnit
+  = Celsius
+  | Fahrenheit
+  deriving (Eq, Ord, Read, Show, Enum, Bounded, Data, Typeable, Generic)
+
+
+instance FromText TemperatureUnit where
+    parser = takeLowerText >>= \case
+        "celsius" -> pure Celsius
+        "fahrenheit" -> pure Fahrenheit
+        e -> fromTextError $ "Failure parsing TemperatureUnit from value: '" <> e
+           <> "'. Accepted values: celsius, fahrenheit"
+
+instance ToText TemperatureUnit where
+    toText = \case
+        Celsius -> "CELSIUS"
+        Fahrenheit -> "FAHRENHEIT"
+
+instance Hashable     TemperatureUnit
+instance NFData       TemperatureUnit
+instance ToByteString TemperatureUnit
+instance ToQuery      TemperatureUnit
+instance ToHeader     TemperatureUnit
+
+instance ToJSON TemperatureUnit where
+    toJSON = toJSONText
+
+instance FromJSON TemperatureUnit where
+    parseJSON = parseJSONText "TemperatureUnit"
+
+data WakeWord
+  = Alexa
+  | Amazon
+  | Computer
+  | Echo
+  deriving (Eq, Ord, Read, Show, Enum, Bounded, Data, Typeable, Generic)
+
+
+instance FromText WakeWord where
+    parser = takeLowerText >>= \case
+        "alexa" -> pure Alexa
+        "amazon" -> pure Amazon
+        "computer" -> pure Computer
+        "echo" -> pure Echo
+        e -> fromTextError $ "Failure parsing WakeWord from value: '" <> e
+           <> "'. Accepted values: alexa, amazon, computer, echo"
+
+instance ToText WakeWord where
+    toText = \case
+        Alexa -> "ALEXA"
+        Amazon -> "AMAZON"
+        Computer -> "COMPUTER"
+        Echo -> "ECHO"
+
+instance Hashable     WakeWord
+instance NFData       WakeWord
+instance ToByteString WakeWord
+instance ToQuery      WakeWord
+instance ToHeader     WakeWord
+
+instance ToJSON WakeWord where
+    toJSON = toJSONText
+
+instance FromJSON WakeWord where
+    parseJSON = parseJSONText "WakeWord"
diff --git a/gen/Network/AWS/AlexaBusiness/UntagResource.hs b/gen/Network/AWS/AlexaBusiness/UntagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/UntagResource.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.AlexaBusiness.UntagResource
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Removes metadata tags from a specified resource.
+--
+--
+module Network.AWS.AlexaBusiness.UntagResource
+    (
+    -- * Creating a Request
+      untagResource
+    , UntagResource
+    -- * Request Lenses
+    , urARN
+    , urTagKeys
+
+    -- * Destructuring the Response
+    , untagResourceResponse
+    , UntagResourceResponse
+    -- * Response Lenses
+    , ursResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'untagResource' smart constructor.
+data UntagResource = UntagResource'
+  { _urARN     :: !Text
+  , _urTagKeys :: ![Text]
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'UntagResource' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'urARN' - The ARN of the resource from which to remove metadata tags. Required.
+--
+-- * 'urTagKeys' - The tags to be removed from the specified resource. Do not provide system tags. Required.
+untagResource
+    :: Text -- ^ 'urARN'
+    -> UntagResource
+untagResource pARN_ = UntagResource' {_urARN = pARN_, _urTagKeys = mempty}
+
+
+-- | The ARN of the resource from which to remove metadata tags. Required.
+urARN :: Lens' UntagResource Text
+urARN = lens _urARN (\ s a -> s{_urARN = a})
+
+-- | The tags to be removed from the specified resource. Do not provide system tags. Required.
+urTagKeys :: Lens' UntagResource [Text]
+urTagKeys = lens _urTagKeys (\ s a -> s{_urTagKeys = a}) . _Coerce
+
+instance AWSRequest UntagResource where
+        type Rs UntagResource = UntagResourceResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveEmpty
+              (\ s h x ->
+                 UntagResourceResponse' <$> (pure (fromEnum s)))
+
+instance Hashable UntagResource where
+
+instance NFData UntagResource where
+
+instance ToHeaders UntagResource where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.UntagResource" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON UntagResource where
+        toJSON UntagResource'{..}
+          = object
+              (catMaybes
+                 [Just ("Arn" .= _urARN),
+                  Just ("TagKeys" .= _urTagKeys)])
+
+instance ToPath UntagResource where
+        toPath = const "/"
+
+instance ToQuery UntagResource where
+        toQuery = const mempty
+
+-- | /See:/ 'untagResourceResponse' smart constructor.
+newtype UntagResourceResponse = UntagResourceResponse'
+  { _ursResponseStatus :: Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'UntagResourceResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ursResponseStatus' - -- | The response status code.
+untagResourceResponse
+    :: Int -- ^ 'ursResponseStatus'
+    -> UntagResourceResponse
+untagResourceResponse pResponseStatus_ =
+  UntagResourceResponse' {_ursResponseStatus = pResponseStatus_}
+
+
+-- | -- | The response status code.
+ursResponseStatus :: Lens' UntagResourceResponse Int
+ursResponseStatus = lens _ursResponseStatus (\ s a -> s{_ursResponseStatus = a})
+
+instance NFData UntagResourceResponse where
diff --git a/gen/Network/AWS/AlexaBusiness/UpdateAddressBook.hs b/gen/Network/AWS/AlexaBusiness/UpdateAddressBook.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/UpdateAddressBook.hs
@@ -0,0 +1,145 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.AlexaBusiness.UpdateAddressBook
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates address book details by the address book ARN.
+--
+--
+module Network.AWS.AlexaBusiness.UpdateAddressBook
+    (
+    -- * Creating a Request
+      updateAddressBook
+    , UpdateAddressBook
+    -- * Request Lenses
+    , uabName
+    , uabDescription
+    , uabAddressBookARN
+
+    -- * Destructuring the Response
+    , updateAddressBookResponse
+    , UpdateAddressBookResponse
+    -- * Response Lenses
+    , uabrsResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'updateAddressBook' smart constructor.
+data UpdateAddressBook = UpdateAddressBook'
+  { _uabName           :: !(Maybe Text)
+  , _uabDescription    :: !(Maybe Text)
+  , _uabAddressBookARN :: !Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'UpdateAddressBook' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'uabName' - The updated name of the room.
+--
+-- * 'uabDescription' - The updated description of the room.
+--
+-- * 'uabAddressBookARN' - The ARN of the room to update.
+updateAddressBook
+    :: Text -- ^ 'uabAddressBookARN'
+    -> UpdateAddressBook
+updateAddressBook pAddressBookARN_ =
+  UpdateAddressBook'
+    { _uabName = Nothing
+    , _uabDescription = Nothing
+    , _uabAddressBookARN = pAddressBookARN_
+    }
+
+
+-- | The updated name of the room.
+uabName :: Lens' UpdateAddressBook (Maybe Text)
+uabName = lens _uabName (\ s a -> s{_uabName = a})
+
+-- | The updated description of the room.
+uabDescription :: Lens' UpdateAddressBook (Maybe Text)
+uabDescription = lens _uabDescription (\ s a -> s{_uabDescription = a})
+
+-- | The ARN of the room to update.
+uabAddressBookARN :: Lens' UpdateAddressBook Text
+uabAddressBookARN = lens _uabAddressBookARN (\ s a -> s{_uabAddressBookARN = a})
+
+instance AWSRequest UpdateAddressBook where
+        type Rs UpdateAddressBook = UpdateAddressBookResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveEmpty
+              (\ s h x ->
+                 UpdateAddressBookResponse' <$> (pure (fromEnum s)))
+
+instance Hashable UpdateAddressBook where
+
+instance NFData UpdateAddressBook where
+
+instance ToHeaders UpdateAddressBook where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.UpdateAddressBook" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON UpdateAddressBook where
+        toJSON UpdateAddressBook'{..}
+          = object
+              (catMaybes
+                 [("Name" .=) <$> _uabName,
+                  ("Description" .=) <$> _uabDescription,
+                  Just ("AddressBookArn" .= _uabAddressBookARN)])
+
+instance ToPath UpdateAddressBook where
+        toPath = const "/"
+
+instance ToQuery UpdateAddressBook where
+        toQuery = const mempty
+
+-- | /See:/ 'updateAddressBookResponse' smart constructor.
+newtype UpdateAddressBookResponse = UpdateAddressBookResponse'
+  { _uabrsResponseStatus :: Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'UpdateAddressBookResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'uabrsResponseStatus' - -- | The response status code.
+updateAddressBookResponse
+    :: Int -- ^ 'uabrsResponseStatus'
+    -> UpdateAddressBookResponse
+updateAddressBookResponse pResponseStatus_ =
+  UpdateAddressBookResponse' {_uabrsResponseStatus = pResponseStatus_}
+
+
+-- | -- | The response status code.
+uabrsResponseStatus :: Lens' UpdateAddressBookResponse Int
+uabrsResponseStatus = lens _uabrsResponseStatus (\ s a -> s{_uabrsResponseStatus = a})
+
+instance NFData UpdateAddressBookResponse where
diff --git a/gen/Network/AWS/AlexaBusiness/UpdateContact.hs b/gen/Network/AWS/AlexaBusiness/UpdateContact.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/UpdateContact.hs
@@ -0,0 +1,165 @@
+{-# 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.AlexaBusiness.UpdateContact
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates the contact details by the contact ARN.
+--
+--
+module Network.AWS.AlexaBusiness.UpdateContact
+    (
+    -- * Creating a Request
+      updateContact
+    , UpdateContact
+    -- * Request Lenses
+    , ucLastName
+    , ucPhoneNumber
+    , ucFirstName
+    , ucDisplayName
+    , ucContactARN
+
+    -- * Destructuring the Response
+    , updateContactResponse
+    , UpdateContactResponse
+    -- * Response Lenses
+    , ucrsResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'updateContact' smart constructor.
+data UpdateContact = UpdateContact'
+  { _ucLastName    :: !(Maybe Text)
+  , _ucPhoneNumber :: !(Maybe Text)
+  , _ucFirstName   :: !(Maybe Text)
+  , _ucDisplayName :: !(Maybe Text)
+  , _ucContactARN  :: !Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'UpdateContact' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ucLastName' - The updated last name of the contact.
+--
+-- * 'ucPhoneNumber' - The updated phone number of the contact.
+--
+-- * 'ucFirstName' - The updated first name of the contact.
+--
+-- * 'ucDisplayName' - The updated display name of the contact.
+--
+-- * 'ucContactARN' - The ARN of the contact to update.
+updateContact
+    :: Text -- ^ 'ucContactARN'
+    -> UpdateContact
+updateContact pContactARN_ =
+  UpdateContact'
+    { _ucLastName = Nothing
+    , _ucPhoneNumber = Nothing
+    , _ucFirstName = Nothing
+    , _ucDisplayName = Nothing
+    , _ucContactARN = pContactARN_
+    }
+
+
+-- | The updated last name of the contact.
+ucLastName :: Lens' UpdateContact (Maybe Text)
+ucLastName = lens _ucLastName (\ s a -> s{_ucLastName = a})
+
+-- | The updated phone number of the contact.
+ucPhoneNumber :: Lens' UpdateContact (Maybe Text)
+ucPhoneNumber = lens _ucPhoneNumber (\ s a -> s{_ucPhoneNumber = a})
+
+-- | The updated first name of the contact.
+ucFirstName :: Lens' UpdateContact (Maybe Text)
+ucFirstName = lens _ucFirstName (\ s a -> s{_ucFirstName = a})
+
+-- | The updated display name of the contact.
+ucDisplayName :: Lens' UpdateContact (Maybe Text)
+ucDisplayName = lens _ucDisplayName (\ s a -> s{_ucDisplayName = a})
+
+-- | The ARN of the contact to update.
+ucContactARN :: Lens' UpdateContact Text
+ucContactARN = lens _ucContactARN (\ s a -> s{_ucContactARN = a})
+
+instance AWSRequest UpdateContact where
+        type Rs UpdateContact = UpdateContactResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveEmpty
+              (\ s h x ->
+                 UpdateContactResponse' <$> (pure (fromEnum s)))
+
+instance Hashable UpdateContact where
+
+instance NFData UpdateContact where
+
+instance ToHeaders UpdateContact where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.UpdateContact" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON UpdateContact where
+        toJSON UpdateContact'{..}
+          = object
+              (catMaybes
+                 [("LastName" .=) <$> _ucLastName,
+                  ("PhoneNumber" .=) <$> _ucPhoneNumber,
+                  ("FirstName" .=) <$> _ucFirstName,
+                  ("DisplayName" .=) <$> _ucDisplayName,
+                  Just ("ContactArn" .= _ucContactARN)])
+
+instance ToPath UpdateContact where
+        toPath = const "/"
+
+instance ToQuery UpdateContact where
+        toQuery = const mempty
+
+-- | /See:/ 'updateContactResponse' smart constructor.
+newtype UpdateContactResponse = UpdateContactResponse'
+  { _ucrsResponseStatus :: Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'UpdateContactResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ucrsResponseStatus' - -- | The response status code.
+updateContactResponse
+    :: Int -- ^ 'ucrsResponseStatus'
+    -> UpdateContactResponse
+updateContactResponse pResponseStatus_ =
+  UpdateContactResponse' {_ucrsResponseStatus = pResponseStatus_}
+
+
+-- | -- | The response status code.
+ucrsResponseStatus :: Lens' UpdateContactResponse Int
+ucrsResponseStatus = lens _ucrsResponseStatus (\ s a -> s{_ucrsResponseStatus = a})
+
+instance NFData UpdateContactResponse where
diff --git a/gen/Network/AWS/AlexaBusiness/UpdateDevice.hs b/gen/Network/AWS/AlexaBusiness/UpdateDevice.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/UpdateDevice.hs
@@ -0,0 +1,130 @@
+{-# 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.AlexaBusiness.UpdateDevice
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates the device name by device ARN.
+--
+--
+module Network.AWS.AlexaBusiness.UpdateDevice
+    (
+    -- * Creating a Request
+      updateDevice
+    , UpdateDevice
+    -- * Request Lenses
+    , udDeviceARN
+    , udDeviceName
+
+    -- * Destructuring the Response
+    , updateDeviceResponse
+    , UpdateDeviceResponse
+    -- * Response Lenses
+    , udrsResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'updateDevice' smart constructor.
+data UpdateDevice = UpdateDevice'
+  { _udDeviceARN  :: !(Maybe Text)
+  , _udDeviceName :: !(Maybe Text)
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'UpdateDevice' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'udDeviceARN' - The ARN of the device to update. Required.
+--
+-- * 'udDeviceName' - The updated device name. Required.
+updateDevice
+    :: UpdateDevice
+updateDevice = UpdateDevice' {_udDeviceARN = Nothing, _udDeviceName = Nothing}
+
+
+-- | The ARN of the device to update. Required.
+udDeviceARN :: Lens' UpdateDevice (Maybe Text)
+udDeviceARN = lens _udDeviceARN (\ s a -> s{_udDeviceARN = a})
+
+-- | The updated device name. Required.
+udDeviceName :: Lens' UpdateDevice (Maybe Text)
+udDeviceName = lens _udDeviceName (\ s a -> s{_udDeviceName = a})
+
+instance AWSRequest UpdateDevice where
+        type Rs UpdateDevice = UpdateDeviceResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveEmpty
+              (\ s h x ->
+                 UpdateDeviceResponse' <$> (pure (fromEnum s)))
+
+instance Hashable UpdateDevice where
+
+instance NFData UpdateDevice where
+
+instance ToHeaders UpdateDevice where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.UpdateDevice" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON UpdateDevice where
+        toJSON UpdateDevice'{..}
+          = object
+              (catMaybes
+                 [("DeviceArn" .=) <$> _udDeviceARN,
+                  ("DeviceName" .=) <$> _udDeviceName])
+
+instance ToPath UpdateDevice where
+        toPath = const "/"
+
+instance ToQuery UpdateDevice where
+        toQuery = const mempty
+
+-- | /See:/ 'updateDeviceResponse' smart constructor.
+newtype UpdateDeviceResponse = UpdateDeviceResponse'
+  { _udrsResponseStatus :: Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'UpdateDeviceResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'udrsResponseStatus' - -- | The response status code.
+updateDeviceResponse
+    :: Int -- ^ 'udrsResponseStatus'
+    -> UpdateDeviceResponse
+updateDeviceResponse pResponseStatus_ =
+  UpdateDeviceResponse' {_udrsResponseStatus = pResponseStatus_}
+
+
+-- | -- | The response status code.
+udrsResponseStatus :: Lens' UpdateDeviceResponse Int
+udrsResponseStatus = lens _udrsResponseStatus (\ s a -> s{_udrsResponseStatus = a})
+
+instance NFData UpdateDeviceResponse where
diff --git a/gen/Network/AWS/AlexaBusiness/UpdateProfile.hs b/gen/Network/AWS/AlexaBusiness/UpdateProfile.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/UpdateProfile.hs
@@ -0,0 +1,214 @@
+{-# 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.AlexaBusiness.UpdateProfile
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates an existing room profile by room profile ARN.
+--
+--
+module Network.AWS.AlexaBusiness.UpdateProfile
+    (
+    -- * Creating a Request
+      updateProfile
+    , UpdateProfile
+    -- * Request Lenses
+    , upSetupModeDisabled
+    , upPSTNEnabled
+    , upDistanceUnit
+    , upAddress
+    , upProfileARN
+    , upWakeWord
+    , upProfileName
+    , upTemperatureUnit
+    , upTimezone
+    , upMaxVolumeLimit
+
+    -- * Destructuring the Response
+    , updateProfileResponse
+    , UpdateProfileResponse
+    -- * Response Lenses
+    , uprsResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'updateProfile' smart constructor.
+data UpdateProfile = UpdateProfile'
+  { _upSetupModeDisabled :: !(Maybe Bool)
+  , _upPSTNEnabled       :: !(Maybe Bool)
+  , _upDistanceUnit      :: !(Maybe DistanceUnit)
+  , _upAddress           :: !(Maybe Text)
+  , _upProfileARN        :: !(Maybe Text)
+  , _upWakeWord          :: !(Maybe WakeWord)
+  , _upProfileName       :: !(Maybe Text)
+  , _upTemperatureUnit   :: !(Maybe TemperatureUnit)
+  , _upTimezone          :: !(Maybe Text)
+  , _upMaxVolumeLimit    :: !(Maybe Int)
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'UpdateProfile' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'upSetupModeDisabled' - Whether the setup mode of the profile is enabled.
+--
+-- * 'upPSTNEnabled' - Whether the PSTN setting of the room profile is enabled.
+--
+-- * 'upDistanceUnit' - The updated distance unit for the room profile.
+--
+-- * 'upAddress' - The updated address for the room profile.
+--
+-- * 'upProfileARN' - The ARN of the room profile to update. Required.
+--
+-- * 'upWakeWord' - The updated wake word for the room profile.
+--
+-- * 'upProfileName' - The updated name for the room profile.
+--
+-- * 'upTemperatureUnit' - The updated temperature unit for the room profile.
+--
+-- * 'upTimezone' - The updated timezone for the room profile.
+--
+-- * 'upMaxVolumeLimit' - The updated maximum volume limit for the room profile.
+updateProfile
+    :: UpdateProfile
+updateProfile =
+  UpdateProfile'
+    { _upSetupModeDisabled = Nothing
+    , _upPSTNEnabled = Nothing
+    , _upDistanceUnit = Nothing
+    , _upAddress = Nothing
+    , _upProfileARN = Nothing
+    , _upWakeWord = Nothing
+    , _upProfileName = Nothing
+    , _upTemperatureUnit = Nothing
+    , _upTimezone = Nothing
+    , _upMaxVolumeLimit = Nothing
+    }
+
+
+-- | Whether the setup mode of the profile is enabled.
+upSetupModeDisabled :: Lens' UpdateProfile (Maybe Bool)
+upSetupModeDisabled = lens _upSetupModeDisabled (\ s a -> s{_upSetupModeDisabled = a})
+
+-- | Whether the PSTN setting of the room profile is enabled.
+upPSTNEnabled :: Lens' UpdateProfile (Maybe Bool)
+upPSTNEnabled = lens _upPSTNEnabled (\ s a -> s{_upPSTNEnabled = a})
+
+-- | The updated distance unit for the room profile.
+upDistanceUnit :: Lens' UpdateProfile (Maybe DistanceUnit)
+upDistanceUnit = lens _upDistanceUnit (\ s a -> s{_upDistanceUnit = a})
+
+-- | The updated address for the room profile.
+upAddress :: Lens' UpdateProfile (Maybe Text)
+upAddress = lens _upAddress (\ s a -> s{_upAddress = a})
+
+-- | The ARN of the room profile to update. Required.
+upProfileARN :: Lens' UpdateProfile (Maybe Text)
+upProfileARN = lens _upProfileARN (\ s a -> s{_upProfileARN = a})
+
+-- | The updated wake word for the room profile.
+upWakeWord :: Lens' UpdateProfile (Maybe WakeWord)
+upWakeWord = lens _upWakeWord (\ s a -> s{_upWakeWord = a})
+
+-- | The updated name for the room profile.
+upProfileName :: Lens' UpdateProfile (Maybe Text)
+upProfileName = lens _upProfileName (\ s a -> s{_upProfileName = a})
+
+-- | The updated temperature unit for the room profile.
+upTemperatureUnit :: Lens' UpdateProfile (Maybe TemperatureUnit)
+upTemperatureUnit = lens _upTemperatureUnit (\ s a -> s{_upTemperatureUnit = a})
+
+-- | The updated timezone for the room profile.
+upTimezone :: Lens' UpdateProfile (Maybe Text)
+upTimezone = lens _upTimezone (\ s a -> s{_upTimezone = a})
+
+-- | The updated maximum volume limit for the room profile.
+upMaxVolumeLimit :: Lens' UpdateProfile (Maybe Int)
+upMaxVolumeLimit = lens _upMaxVolumeLimit (\ s a -> s{_upMaxVolumeLimit = a})
+
+instance AWSRequest UpdateProfile where
+        type Rs UpdateProfile = UpdateProfileResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveEmpty
+              (\ s h x ->
+                 UpdateProfileResponse' <$> (pure (fromEnum s)))
+
+instance Hashable UpdateProfile where
+
+instance NFData UpdateProfile where
+
+instance ToHeaders UpdateProfile where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.UpdateProfile" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON UpdateProfile where
+        toJSON UpdateProfile'{..}
+          = object
+              (catMaybes
+                 [("SetupModeDisabled" .=) <$> _upSetupModeDisabled,
+                  ("PSTNEnabled" .=) <$> _upPSTNEnabled,
+                  ("DistanceUnit" .=) <$> _upDistanceUnit,
+                  ("Address" .=) <$> _upAddress,
+                  ("ProfileArn" .=) <$> _upProfileARN,
+                  ("WakeWord" .=) <$> _upWakeWord,
+                  ("ProfileName" .=) <$> _upProfileName,
+                  ("TemperatureUnit" .=) <$> _upTemperatureUnit,
+                  ("Timezone" .=) <$> _upTimezone,
+                  ("MaxVolumeLimit" .=) <$> _upMaxVolumeLimit])
+
+instance ToPath UpdateProfile where
+        toPath = const "/"
+
+instance ToQuery UpdateProfile where
+        toQuery = const mempty
+
+-- | /See:/ 'updateProfileResponse' smart constructor.
+newtype UpdateProfileResponse = UpdateProfileResponse'
+  { _uprsResponseStatus :: Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'UpdateProfileResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'uprsResponseStatus' - -- | The response status code.
+updateProfileResponse
+    :: Int -- ^ 'uprsResponseStatus'
+    -> UpdateProfileResponse
+updateProfileResponse pResponseStatus_ =
+  UpdateProfileResponse' {_uprsResponseStatus = pResponseStatus_}
+
+
+-- | -- | The response status code.
+uprsResponseStatus :: Lens' UpdateProfileResponse Int
+uprsResponseStatus = lens _uprsResponseStatus (\ s a -> s{_uprsResponseStatus = a})
+
+instance NFData UpdateProfileResponse where
diff --git a/gen/Network/AWS/AlexaBusiness/UpdateRoom.hs b/gen/Network/AWS/AlexaBusiness/UpdateRoom.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/UpdateRoom.hs
@@ -0,0 +1,164 @@
+{-# 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.AlexaBusiness.UpdateRoom
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates room details by room ARN.
+--
+--
+module Network.AWS.AlexaBusiness.UpdateRoom
+    (
+    -- * Creating a Request
+      updateRoom
+    , UpdateRoom
+    -- * Request Lenses
+    , urProfileARN
+    , urProviderCalendarId
+    , urRoomARN
+    , urRoomName
+    , urDescription
+
+    -- * Destructuring the Response
+    , updateRoomResponse
+    , UpdateRoomResponse
+    -- * Response Lenses
+    , urrsResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'updateRoom' smart constructor.
+data UpdateRoom = UpdateRoom'
+  { _urProfileARN         :: !(Maybe Text)
+  , _urProviderCalendarId :: !(Maybe Text)
+  , _urRoomARN            :: !(Maybe Text)
+  , _urRoomName           :: !(Maybe Text)
+  , _urDescription        :: !(Maybe Text)
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'UpdateRoom' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'urProfileARN' - The updated profile ARN for the room.
+--
+-- * 'urProviderCalendarId' - The updated provider calendar ARN for the room.
+--
+-- * 'urRoomARN' - The ARN of the room to update.
+--
+-- * 'urRoomName' - The updated name for the room.
+--
+-- * 'urDescription' - The updated description for the room.
+updateRoom
+    :: UpdateRoom
+updateRoom =
+  UpdateRoom'
+    { _urProfileARN = Nothing
+    , _urProviderCalendarId = Nothing
+    , _urRoomARN = Nothing
+    , _urRoomName = Nothing
+    , _urDescription = Nothing
+    }
+
+
+-- | The updated profile ARN for the room.
+urProfileARN :: Lens' UpdateRoom (Maybe Text)
+urProfileARN = lens _urProfileARN (\ s a -> s{_urProfileARN = a})
+
+-- | The updated provider calendar ARN for the room.
+urProviderCalendarId :: Lens' UpdateRoom (Maybe Text)
+urProviderCalendarId = lens _urProviderCalendarId (\ s a -> s{_urProviderCalendarId = a})
+
+-- | The ARN of the room to update.
+urRoomARN :: Lens' UpdateRoom (Maybe Text)
+urRoomARN = lens _urRoomARN (\ s a -> s{_urRoomARN = a})
+
+-- | The updated name for the room.
+urRoomName :: Lens' UpdateRoom (Maybe Text)
+urRoomName = lens _urRoomName (\ s a -> s{_urRoomName = a})
+
+-- | The updated description for the room.
+urDescription :: Lens' UpdateRoom (Maybe Text)
+urDescription = lens _urDescription (\ s a -> s{_urDescription = a})
+
+instance AWSRequest UpdateRoom where
+        type Rs UpdateRoom = UpdateRoomResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveEmpty
+              (\ s h x ->
+                 UpdateRoomResponse' <$> (pure (fromEnum s)))
+
+instance Hashable UpdateRoom where
+
+instance NFData UpdateRoom where
+
+instance ToHeaders UpdateRoom where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.UpdateRoom" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON UpdateRoom where
+        toJSON UpdateRoom'{..}
+          = object
+              (catMaybes
+                 [("ProfileArn" .=) <$> _urProfileARN,
+                  ("ProviderCalendarId" .=) <$> _urProviderCalendarId,
+                  ("RoomArn" .=) <$> _urRoomARN,
+                  ("RoomName" .=) <$> _urRoomName,
+                  ("Description" .=) <$> _urDescription])
+
+instance ToPath UpdateRoom where
+        toPath = const "/"
+
+instance ToQuery UpdateRoom where
+        toQuery = const mempty
+
+-- | /See:/ 'updateRoomResponse' smart constructor.
+newtype UpdateRoomResponse = UpdateRoomResponse'
+  { _urrsResponseStatus :: Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'UpdateRoomResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'urrsResponseStatus' - -- | The response status code.
+updateRoomResponse
+    :: Int -- ^ 'urrsResponseStatus'
+    -> UpdateRoomResponse
+updateRoomResponse pResponseStatus_ =
+  UpdateRoomResponse' {_urrsResponseStatus = pResponseStatus_}
+
+
+-- | -- | The response status code.
+urrsResponseStatus :: Lens' UpdateRoomResponse Int
+urrsResponseStatus = lens _urrsResponseStatus (\ s a -> s{_urrsResponseStatus = a})
+
+instance NFData UpdateRoomResponse where
diff --git a/gen/Network/AWS/AlexaBusiness/UpdateSkillGroup.hs b/gen/Network/AWS/AlexaBusiness/UpdateSkillGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/UpdateSkillGroup.hs
@@ -0,0 +1,144 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.AlexaBusiness.UpdateSkillGroup
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates skill group details by skill group ARN.
+--
+--
+module Network.AWS.AlexaBusiness.UpdateSkillGroup
+    (
+    -- * Creating a Request
+      updateSkillGroup
+    , UpdateSkillGroup
+    -- * Request Lenses
+    , usgSkillGroupARN
+    , usgDescription
+    , usgSkillGroupName
+
+    -- * Destructuring the Response
+    , updateSkillGroupResponse
+    , UpdateSkillGroupResponse
+    -- * Response Lenses
+    , usgrsResponseStatus
+    ) where
+
+import Network.AWS.AlexaBusiness.Types
+import Network.AWS.AlexaBusiness.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'updateSkillGroup' smart constructor.
+data UpdateSkillGroup = UpdateSkillGroup'
+  { _usgSkillGroupARN  :: !(Maybe Text)
+  , _usgDescription    :: !(Maybe Text)
+  , _usgSkillGroupName :: !(Maybe Text)
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'UpdateSkillGroup' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'usgSkillGroupARN' - The ARN of the skill group to update.
+--
+-- * 'usgDescription' - The updated description for the skill group.
+--
+-- * 'usgSkillGroupName' - The updated name for the skill group.
+updateSkillGroup
+    :: UpdateSkillGroup
+updateSkillGroup =
+  UpdateSkillGroup'
+    { _usgSkillGroupARN = Nothing
+    , _usgDescription = Nothing
+    , _usgSkillGroupName = Nothing
+    }
+
+
+-- | The ARN of the skill group to update.
+usgSkillGroupARN :: Lens' UpdateSkillGroup (Maybe Text)
+usgSkillGroupARN = lens _usgSkillGroupARN (\ s a -> s{_usgSkillGroupARN = a})
+
+-- | The updated description for the skill group.
+usgDescription :: Lens' UpdateSkillGroup (Maybe Text)
+usgDescription = lens _usgDescription (\ s a -> s{_usgDescription = a})
+
+-- | The updated name for the skill group.
+usgSkillGroupName :: Lens' UpdateSkillGroup (Maybe Text)
+usgSkillGroupName = lens _usgSkillGroupName (\ s a -> s{_usgSkillGroupName = a})
+
+instance AWSRequest UpdateSkillGroup where
+        type Rs UpdateSkillGroup = UpdateSkillGroupResponse
+        request = postJSON alexaBusiness
+        response
+          = receiveEmpty
+              (\ s h x ->
+                 UpdateSkillGroupResponse' <$> (pure (fromEnum s)))
+
+instance Hashable UpdateSkillGroup where
+
+instance NFData UpdateSkillGroup where
+
+instance ToHeaders UpdateSkillGroup where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("AlexaForBusiness.UpdateSkillGroup" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON UpdateSkillGroup where
+        toJSON UpdateSkillGroup'{..}
+          = object
+              (catMaybes
+                 [("SkillGroupArn" .=) <$> _usgSkillGroupARN,
+                  ("Description" .=) <$> _usgDescription,
+                  ("SkillGroupName" .=) <$> _usgSkillGroupName])
+
+instance ToPath UpdateSkillGroup where
+        toPath = const "/"
+
+instance ToQuery UpdateSkillGroup where
+        toQuery = const mempty
+
+-- | /See:/ 'updateSkillGroupResponse' smart constructor.
+newtype UpdateSkillGroupResponse = UpdateSkillGroupResponse'
+  { _usgrsResponseStatus :: Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'UpdateSkillGroupResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'usgrsResponseStatus' - -- | The response status code.
+updateSkillGroupResponse
+    :: Int -- ^ 'usgrsResponseStatus'
+    -> UpdateSkillGroupResponse
+updateSkillGroupResponse pResponseStatus_ =
+  UpdateSkillGroupResponse' {_usgrsResponseStatus = pResponseStatus_}
+
+
+-- | -- | The response status code.
+usgrsResponseStatus :: Lens' UpdateSkillGroupResponse Int
+usgrsResponseStatus = lens _usgrsResponseStatus (\ s a -> s{_usgrsResponseStatus = a})
+
+instance NFData UpdateSkillGroupResponse where
diff --git a/gen/Network/AWS/AlexaBusiness/Waiters.hs b/gen/Network/AWS/AlexaBusiness/Waiters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/AlexaBusiness/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.AlexaBusiness.Waiters
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+module Network.AWS.AlexaBusiness.Waiters where
+
+import Network.AWS.AlexaBusiness.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-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+module Main (main) where
+
+import Test.Tasty
+import Test.AWS.AlexaBusiness
+import Test.AWS.AlexaBusiness.Internal
+
+main :: IO ()
+main = defaultMain $ testGroup "AlexaBusiness"
+    [ testGroup "tests"    tests
+    , testGroup "fixtures" fixtures
+    ]
diff --git a/test/Test/AWS/AlexaBusiness.hs b/test/Test/AWS/AlexaBusiness.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/AWS/AlexaBusiness.hs
@@ -0,0 +1,20 @@
+-- |
+-- Module      : Test.AWS.AlexaBusiness
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+module Test.AWS.AlexaBusiness
+    ( tests
+    , fixtures
+    ) where
+
+import Test.Tasty (TestTree)
+
+tests :: [TestTree]
+tests = []
+
+fixtures :: [TestTree]
+fixtures = []
diff --git a/test/Test/AWS/AlexaBusiness/Internal.hs b/test/Test/AWS/AlexaBusiness/Internal.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/AWS/AlexaBusiness/Internal.hs
@@ -0,0 +1,9 @@
+-- |
+-- Module      : Test.AWS.AlexaBusiness.Internal
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+module Test.AWS.AlexaBusiness.Internal where
diff --git a/test/Test/AWS/Gen/AlexaBusiness.hs b/test/Test/AWS/Gen/AlexaBusiness.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/AWS/Gen/AlexaBusiness.hs
@@ -0,0 +1,921 @@
+{-# 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.AlexaBusiness
+-- Copyright   : (c) 2013-2018 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+module Test.AWS.Gen.AlexaBusiness where
+
+import Data.Proxy
+import Network.AWS.AlexaBusiness
+import Test.AWS.AlexaBusiness.Internal
+import Test.AWS.Fixture
+import Test.AWS.Prelude
+import Test.Tasty
+
+-- 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"
+--         [ requestSearchUsers $
+--             searchUsers
+--
+--         , requestAssociateSkillGroupWithRoom $
+--             associateSkillGroupWithRoom
+--
+--         , requestDeleteProfile $
+--             deleteProfile
+--
+--         , requestUpdateProfile $
+--             updateProfile
+--
+--         , requestSearchRooms $
+--             searchRooms
+--
+--         , requestDisassociateContactFromAddressBook $
+--             disassociateContactFromAddressBook
+--
+--         , requestCreateAddressBook $
+--             createAddressBook
+--
+--         , requestDeleteAddressBook $
+--             deleteAddressBook
+--
+--         , requestUpdateAddressBook $
+--             updateAddressBook
+--
+--         , requestUpdateRoom $
+--             updateRoom
+--
+--         , requestDeleteRoom $
+--             deleteRoom
+--
+--         , requestGetDevice $
+--             getDevice
+--
+--         , requestGetContact $
+--             getContact
+--
+--         , requestAssociateDeviceWithRoom $
+--             associateDeviceWithRoom
+--
+--         , requestGetRoomSkillParameter $
+--             getRoomSkillParameter
+--
+--         , requestDeleteContact $
+--             deleteContact
+--
+--         , requestUpdateContact $
+--             updateContact
+--
+--         , requestGetAddressBook $
+--             getAddressBook
+--
+--         , requestCreateContact $
+--             createContact
+--
+--         , requestCreateProfile $
+--             createProfile
+--
+--         , requestDeleteSkillGroup $
+--             deleteSkillGroup
+--
+--         , requestUpdateSkillGroup $
+--             updateSkillGroup
+--
+--         , requestStartDeviceSync $
+--             startDeviceSync
+--
+--         , requestSearchAddressBooks $
+--             searchAddressBooks
+--
+--         , requestCreateSkillGroup $
+--             createSkillGroup
+--
+--         , requestGetProfile $
+--             getProfile
+--
+--         , requestDisassociateSkillGroupFromRoom $
+--             disassociateSkillGroupFromRoom
+--
+--         , requestSendInvitation $
+--             sendInvitation
+--
+--         , requestListDeviceEvents $
+--             listDeviceEvents
+--
+--         , requestCreateUser $
+--             createUser
+--
+--         , requestSearchDevices $
+--             searchDevices
+--
+--         , requestSearchContacts $
+--             searchContacts
+--
+--         , requestDeleteUser $
+--             deleteUser
+--
+--         , requestGetSkillGroup $
+--             getSkillGroup
+--
+--         , requestListSkills $
+--             listSkills
+--
+--         , requestTagResource $
+--             tagResource
+--
+--         , requestDisassociateDeviceFromRoom $
+--             disassociateDeviceFromRoom
+--
+--         , requestSearchSkillGroups $
+--             searchSkillGroups
+--
+--         , requestListTags $
+--             listTags
+--
+--         , requestUntagResource $
+--             untagResource
+--
+--         , requestResolveRoom $
+--             resolveRoom
+--
+--         , requestCreateRoom $
+--             createRoom
+--
+--         , requestDeleteRoomSkillParameter $
+--             deleteRoomSkillParameter
+--
+--         , requestPutRoomSkillParameter $
+--             putRoomSkillParameter
+--
+--         , requestSearchProfiles $
+--             searchProfiles
+--
+--         , requestRevokeInvitation $
+--             revokeInvitation
+--
+--         , requestUpdateDevice $
+--             updateDevice
+--
+--         , requestGetRoom $
+--             getRoom
+--
+--         , requestAssociateContactWithAddressBook $
+--             associateContactWithAddressBook
+--
+--           ]
+
+--     , testGroup "response"
+--         [ responseSearchUsers $
+--             searchUsersResponse
+--
+--         , responseAssociateSkillGroupWithRoom $
+--             associateSkillGroupWithRoomResponse
+--
+--         , responseDeleteProfile $
+--             deleteProfileResponse
+--
+--         , responseUpdateProfile $
+--             updateProfileResponse
+--
+--         , responseSearchRooms $
+--             searchRoomsResponse
+--
+--         , responseDisassociateContactFromAddressBook $
+--             disassociateContactFromAddressBookResponse
+--
+--         , responseCreateAddressBook $
+--             createAddressBookResponse
+--
+--         , responseDeleteAddressBook $
+--             deleteAddressBookResponse
+--
+--         , responseUpdateAddressBook $
+--             updateAddressBookResponse
+--
+--         , responseUpdateRoom $
+--             updateRoomResponse
+--
+--         , responseDeleteRoom $
+--             deleteRoomResponse
+--
+--         , responseGetDevice $
+--             getDeviceResponse
+--
+--         , responseGetContact $
+--             getContactResponse
+--
+--         , responseAssociateDeviceWithRoom $
+--             associateDeviceWithRoomResponse
+--
+--         , responseGetRoomSkillParameter $
+--             getRoomSkillParameterResponse
+--
+--         , responseDeleteContact $
+--             deleteContactResponse
+--
+--         , responseUpdateContact $
+--             updateContactResponse
+--
+--         , responseGetAddressBook $
+--             getAddressBookResponse
+--
+--         , responseCreateContact $
+--             createContactResponse
+--
+--         , responseCreateProfile $
+--             createProfileResponse
+--
+--         , responseDeleteSkillGroup $
+--             deleteSkillGroupResponse
+--
+--         , responseUpdateSkillGroup $
+--             updateSkillGroupResponse
+--
+--         , responseStartDeviceSync $
+--             startDeviceSyncResponse
+--
+--         , responseSearchAddressBooks $
+--             searchAddressBooksResponse
+--
+--         , responseCreateSkillGroup $
+--             createSkillGroupResponse
+--
+--         , responseGetProfile $
+--             getProfileResponse
+--
+--         , responseDisassociateSkillGroupFromRoom $
+--             disassociateSkillGroupFromRoomResponse
+--
+--         , responseSendInvitation $
+--             sendInvitationResponse
+--
+--         , responseListDeviceEvents $
+--             listDeviceEventsResponse
+--
+--         , responseCreateUser $
+--             createUserResponse
+--
+--         , responseSearchDevices $
+--             searchDevicesResponse
+--
+--         , responseSearchContacts $
+--             searchContactsResponse
+--
+--         , responseDeleteUser $
+--             deleteUserResponse
+--
+--         , responseGetSkillGroup $
+--             getSkillGroupResponse
+--
+--         , responseListSkills $
+--             listSkillsResponse
+--
+--         , responseTagResource $
+--             tagResourceResponse
+--
+--         , responseDisassociateDeviceFromRoom $
+--             disassociateDeviceFromRoomResponse
+--
+--         , responseSearchSkillGroups $
+--             searchSkillGroupsResponse
+--
+--         , responseListTags $
+--             listTagsResponse
+--
+--         , responseUntagResource $
+--             untagResourceResponse
+--
+--         , responseResolveRoom $
+--             resolveRoomResponse
+--
+--         , responseCreateRoom $
+--             createRoomResponse
+--
+--         , responseDeleteRoomSkillParameter $
+--             deleteRoomSkillParameterResponse
+--
+--         , responsePutRoomSkillParameter $
+--             putRoomSkillParameterResponse
+--
+--         , responseSearchProfiles $
+--             searchProfilesResponse
+--
+--         , responseRevokeInvitation $
+--             revokeInvitationResponse
+--
+--         , responseUpdateDevice $
+--             updateDeviceResponse
+--
+--         , responseGetRoom $
+--             getRoomResponse
+--
+--         , responseAssociateContactWithAddressBook $
+--             associateContactWithAddressBookResponse
+--
+--           ]
+--     ]
+
+-- Requests
+
+requestSearchUsers :: SearchUsers -> TestTree
+requestSearchUsers = req
+    "SearchUsers"
+    "fixture/SearchUsers.yaml"
+
+requestAssociateSkillGroupWithRoom :: AssociateSkillGroupWithRoom -> TestTree
+requestAssociateSkillGroupWithRoom = req
+    "AssociateSkillGroupWithRoom"
+    "fixture/AssociateSkillGroupWithRoom.yaml"
+
+requestDeleteProfile :: DeleteProfile -> TestTree
+requestDeleteProfile = req
+    "DeleteProfile"
+    "fixture/DeleteProfile.yaml"
+
+requestUpdateProfile :: UpdateProfile -> TestTree
+requestUpdateProfile = req
+    "UpdateProfile"
+    "fixture/UpdateProfile.yaml"
+
+requestSearchRooms :: SearchRooms -> TestTree
+requestSearchRooms = req
+    "SearchRooms"
+    "fixture/SearchRooms.yaml"
+
+requestDisassociateContactFromAddressBook :: DisassociateContactFromAddressBook -> TestTree
+requestDisassociateContactFromAddressBook = req
+    "DisassociateContactFromAddressBook"
+    "fixture/DisassociateContactFromAddressBook.yaml"
+
+requestCreateAddressBook :: CreateAddressBook -> TestTree
+requestCreateAddressBook = req
+    "CreateAddressBook"
+    "fixture/CreateAddressBook.yaml"
+
+requestDeleteAddressBook :: DeleteAddressBook -> TestTree
+requestDeleteAddressBook = req
+    "DeleteAddressBook"
+    "fixture/DeleteAddressBook.yaml"
+
+requestUpdateAddressBook :: UpdateAddressBook -> TestTree
+requestUpdateAddressBook = req
+    "UpdateAddressBook"
+    "fixture/UpdateAddressBook.yaml"
+
+requestUpdateRoom :: UpdateRoom -> TestTree
+requestUpdateRoom = req
+    "UpdateRoom"
+    "fixture/UpdateRoom.yaml"
+
+requestDeleteRoom :: DeleteRoom -> TestTree
+requestDeleteRoom = req
+    "DeleteRoom"
+    "fixture/DeleteRoom.yaml"
+
+requestGetDevice :: GetDevice -> TestTree
+requestGetDevice = req
+    "GetDevice"
+    "fixture/GetDevice.yaml"
+
+requestGetContact :: GetContact -> TestTree
+requestGetContact = req
+    "GetContact"
+    "fixture/GetContact.yaml"
+
+requestAssociateDeviceWithRoom :: AssociateDeviceWithRoom -> TestTree
+requestAssociateDeviceWithRoom = req
+    "AssociateDeviceWithRoom"
+    "fixture/AssociateDeviceWithRoom.yaml"
+
+requestGetRoomSkillParameter :: GetRoomSkillParameter -> TestTree
+requestGetRoomSkillParameter = req
+    "GetRoomSkillParameter"
+    "fixture/GetRoomSkillParameter.yaml"
+
+requestDeleteContact :: DeleteContact -> TestTree
+requestDeleteContact = req
+    "DeleteContact"
+    "fixture/DeleteContact.yaml"
+
+requestUpdateContact :: UpdateContact -> TestTree
+requestUpdateContact = req
+    "UpdateContact"
+    "fixture/UpdateContact.yaml"
+
+requestGetAddressBook :: GetAddressBook -> TestTree
+requestGetAddressBook = req
+    "GetAddressBook"
+    "fixture/GetAddressBook.yaml"
+
+requestCreateContact :: CreateContact -> TestTree
+requestCreateContact = req
+    "CreateContact"
+    "fixture/CreateContact.yaml"
+
+requestCreateProfile :: CreateProfile -> TestTree
+requestCreateProfile = req
+    "CreateProfile"
+    "fixture/CreateProfile.yaml"
+
+requestDeleteSkillGroup :: DeleteSkillGroup -> TestTree
+requestDeleteSkillGroup = req
+    "DeleteSkillGroup"
+    "fixture/DeleteSkillGroup.yaml"
+
+requestUpdateSkillGroup :: UpdateSkillGroup -> TestTree
+requestUpdateSkillGroup = req
+    "UpdateSkillGroup"
+    "fixture/UpdateSkillGroup.yaml"
+
+requestStartDeviceSync :: StartDeviceSync -> TestTree
+requestStartDeviceSync = req
+    "StartDeviceSync"
+    "fixture/StartDeviceSync.yaml"
+
+requestSearchAddressBooks :: SearchAddressBooks -> TestTree
+requestSearchAddressBooks = req
+    "SearchAddressBooks"
+    "fixture/SearchAddressBooks.yaml"
+
+requestCreateSkillGroup :: CreateSkillGroup -> TestTree
+requestCreateSkillGroup = req
+    "CreateSkillGroup"
+    "fixture/CreateSkillGroup.yaml"
+
+requestGetProfile :: GetProfile -> TestTree
+requestGetProfile = req
+    "GetProfile"
+    "fixture/GetProfile.yaml"
+
+requestDisassociateSkillGroupFromRoom :: DisassociateSkillGroupFromRoom -> TestTree
+requestDisassociateSkillGroupFromRoom = req
+    "DisassociateSkillGroupFromRoom"
+    "fixture/DisassociateSkillGroupFromRoom.yaml"
+
+requestSendInvitation :: SendInvitation -> TestTree
+requestSendInvitation = req
+    "SendInvitation"
+    "fixture/SendInvitation.yaml"
+
+requestListDeviceEvents :: ListDeviceEvents -> TestTree
+requestListDeviceEvents = req
+    "ListDeviceEvents"
+    "fixture/ListDeviceEvents.yaml"
+
+requestCreateUser :: CreateUser -> TestTree
+requestCreateUser = req
+    "CreateUser"
+    "fixture/CreateUser.yaml"
+
+requestSearchDevices :: SearchDevices -> TestTree
+requestSearchDevices = req
+    "SearchDevices"
+    "fixture/SearchDevices.yaml"
+
+requestSearchContacts :: SearchContacts -> TestTree
+requestSearchContacts = req
+    "SearchContacts"
+    "fixture/SearchContacts.yaml"
+
+requestDeleteUser :: DeleteUser -> TestTree
+requestDeleteUser = req
+    "DeleteUser"
+    "fixture/DeleteUser.yaml"
+
+requestGetSkillGroup :: GetSkillGroup -> TestTree
+requestGetSkillGroup = req
+    "GetSkillGroup"
+    "fixture/GetSkillGroup.yaml"
+
+requestListSkills :: ListSkills -> TestTree
+requestListSkills = req
+    "ListSkills"
+    "fixture/ListSkills.yaml"
+
+requestTagResource :: TagResource -> TestTree
+requestTagResource = req
+    "TagResource"
+    "fixture/TagResource.yaml"
+
+requestDisassociateDeviceFromRoom :: DisassociateDeviceFromRoom -> TestTree
+requestDisassociateDeviceFromRoom = req
+    "DisassociateDeviceFromRoom"
+    "fixture/DisassociateDeviceFromRoom.yaml"
+
+requestSearchSkillGroups :: SearchSkillGroups -> TestTree
+requestSearchSkillGroups = req
+    "SearchSkillGroups"
+    "fixture/SearchSkillGroups.yaml"
+
+requestListTags :: ListTags -> TestTree
+requestListTags = req
+    "ListTags"
+    "fixture/ListTags.yaml"
+
+requestUntagResource :: UntagResource -> TestTree
+requestUntagResource = req
+    "UntagResource"
+    "fixture/UntagResource.yaml"
+
+requestResolveRoom :: ResolveRoom -> TestTree
+requestResolveRoom = req
+    "ResolveRoom"
+    "fixture/ResolveRoom.yaml"
+
+requestCreateRoom :: CreateRoom -> TestTree
+requestCreateRoom = req
+    "CreateRoom"
+    "fixture/CreateRoom.yaml"
+
+requestDeleteRoomSkillParameter :: DeleteRoomSkillParameter -> TestTree
+requestDeleteRoomSkillParameter = req
+    "DeleteRoomSkillParameter"
+    "fixture/DeleteRoomSkillParameter.yaml"
+
+requestPutRoomSkillParameter :: PutRoomSkillParameter -> TestTree
+requestPutRoomSkillParameter = req
+    "PutRoomSkillParameter"
+    "fixture/PutRoomSkillParameter.yaml"
+
+requestSearchProfiles :: SearchProfiles -> TestTree
+requestSearchProfiles = req
+    "SearchProfiles"
+    "fixture/SearchProfiles.yaml"
+
+requestRevokeInvitation :: RevokeInvitation -> TestTree
+requestRevokeInvitation = req
+    "RevokeInvitation"
+    "fixture/RevokeInvitation.yaml"
+
+requestUpdateDevice :: UpdateDevice -> TestTree
+requestUpdateDevice = req
+    "UpdateDevice"
+    "fixture/UpdateDevice.yaml"
+
+requestGetRoom :: GetRoom -> TestTree
+requestGetRoom = req
+    "GetRoom"
+    "fixture/GetRoom.yaml"
+
+requestAssociateContactWithAddressBook :: AssociateContactWithAddressBook -> TestTree
+requestAssociateContactWithAddressBook = req
+    "AssociateContactWithAddressBook"
+    "fixture/AssociateContactWithAddressBook.yaml"
+
+-- Responses
+
+responseSearchUsers :: SearchUsersResponse -> TestTree
+responseSearchUsers = res
+    "SearchUsersResponse"
+    "fixture/SearchUsersResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy SearchUsers)
+
+responseAssociateSkillGroupWithRoom :: AssociateSkillGroupWithRoomResponse -> TestTree
+responseAssociateSkillGroupWithRoom = res
+    "AssociateSkillGroupWithRoomResponse"
+    "fixture/AssociateSkillGroupWithRoomResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy AssociateSkillGroupWithRoom)
+
+responseDeleteProfile :: DeleteProfileResponse -> TestTree
+responseDeleteProfile = res
+    "DeleteProfileResponse"
+    "fixture/DeleteProfileResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy DeleteProfile)
+
+responseUpdateProfile :: UpdateProfileResponse -> TestTree
+responseUpdateProfile = res
+    "UpdateProfileResponse"
+    "fixture/UpdateProfileResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy UpdateProfile)
+
+responseSearchRooms :: SearchRoomsResponse -> TestTree
+responseSearchRooms = res
+    "SearchRoomsResponse"
+    "fixture/SearchRoomsResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy SearchRooms)
+
+responseDisassociateContactFromAddressBook :: DisassociateContactFromAddressBookResponse -> TestTree
+responseDisassociateContactFromAddressBook = res
+    "DisassociateContactFromAddressBookResponse"
+    "fixture/DisassociateContactFromAddressBookResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy DisassociateContactFromAddressBook)
+
+responseCreateAddressBook :: CreateAddressBookResponse -> TestTree
+responseCreateAddressBook = res
+    "CreateAddressBookResponse"
+    "fixture/CreateAddressBookResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy CreateAddressBook)
+
+responseDeleteAddressBook :: DeleteAddressBookResponse -> TestTree
+responseDeleteAddressBook = res
+    "DeleteAddressBookResponse"
+    "fixture/DeleteAddressBookResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy DeleteAddressBook)
+
+responseUpdateAddressBook :: UpdateAddressBookResponse -> TestTree
+responseUpdateAddressBook = res
+    "UpdateAddressBookResponse"
+    "fixture/UpdateAddressBookResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy UpdateAddressBook)
+
+responseUpdateRoom :: UpdateRoomResponse -> TestTree
+responseUpdateRoom = res
+    "UpdateRoomResponse"
+    "fixture/UpdateRoomResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy UpdateRoom)
+
+responseDeleteRoom :: DeleteRoomResponse -> TestTree
+responseDeleteRoom = res
+    "DeleteRoomResponse"
+    "fixture/DeleteRoomResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy DeleteRoom)
+
+responseGetDevice :: GetDeviceResponse -> TestTree
+responseGetDevice = res
+    "GetDeviceResponse"
+    "fixture/GetDeviceResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy GetDevice)
+
+responseGetContact :: GetContactResponse -> TestTree
+responseGetContact = res
+    "GetContactResponse"
+    "fixture/GetContactResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy GetContact)
+
+responseAssociateDeviceWithRoom :: AssociateDeviceWithRoomResponse -> TestTree
+responseAssociateDeviceWithRoom = res
+    "AssociateDeviceWithRoomResponse"
+    "fixture/AssociateDeviceWithRoomResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy AssociateDeviceWithRoom)
+
+responseGetRoomSkillParameter :: GetRoomSkillParameterResponse -> TestTree
+responseGetRoomSkillParameter = res
+    "GetRoomSkillParameterResponse"
+    "fixture/GetRoomSkillParameterResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy GetRoomSkillParameter)
+
+responseDeleteContact :: DeleteContactResponse -> TestTree
+responseDeleteContact = res
+    "DeleteContactResponse"
+    "fixture/DeleteContactResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy DeleteContact)
+
+responseUpdateContact :: UpdateContactResponse -> TestTree
+responseUpdateContact = res
+    "UpdateContactResponse"
+    "fixture/UpdateContactResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy UpdateContact)
+
+responseGetAddressBook :: GetAddressBookResponse -> TestTree
+responseGetAddressBook = res
+    "GetAddressBookResponse"
+    "fixture/GetAddressBookResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy GetAddressBook)
+
+responseCreateContact :: CreateContactResponse -> TestTree
+responseCreateContact = res
+    "CreateContactResponse"
+    "fixture/CreateContactResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy CreateContact)
+
+responseCreateProfile :: CreateProfileResponse -> TestTree
+responseCreateProfile = res
+    "CreateProfileResponse"
+    "fixture/CreateProfileResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy CreateProfile)
+
+responseDeleteSkillGroup :: DeleteSkillGroupResponse -> TestTree
+responseDeleteSkillGroup = res
+    "DeleteSkillGroupResponse"
+    "fixture/DeleteSkillGroupResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy DeleteSkillGroup)
+
+responseUpdateSkillGroup :: UpdateSkillGroupResponse -> TestTree
+responseUpdateSkillGroup = res
+    "UpdateSkillGroupResponse"
+    "fixture/UpdateSkillGroupResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy UpdateSkillGroup)
+
+responseStartDeviceSync :: StartDeviceSyncResponse -> TestTree
+responseStartDeviceSync = res
+    "StartDeviceSyncResponse"
+    "fixture/StartDeviceSyncResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy StartDeviceSync)
+
+responseSearchAddressBooks :: SearchAddressBooksResponse -> TestTree
+responseSearchAddressBooks = res
+    "SearchAddressBooksResponse"
+    "fixture/SearchAddressBooksResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy SearchAddressBooks)
+
+responseCreateSkillGroup :: CreateSkillGroupResponse -> TestTree
+responseCreateSkillGroup = res
+    "CreateSkillGroupResponse"
+    "fixture/CreateSkillGroupResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy CreateSkillGroup)
+
+responseGetProfile :: GetProfileResponse -> TestTree
+responseGetProfile = res
+    "GetProfileResponse"
+    "fixture/GetProfileResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy GetProfile)
+
+responseDisassociateSkillGroupFromRoom :: DisassociateSkillGroupFromRoomResponse -> TestTree
+responseDisassociateSkillGroupFromRoom = res
+    "DisassociateSkillGroupFromRoomResponse"
+    "fixture/DisassociateSkillGroupFromRoomResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy DisassociateSkillGroupFromRoom)
+
+responseSendInvitation :: SendInvitationResponse -> TestTree
+responseSendInvitation = res
+    "SendInvitationResponse"
+    "fixture/SendInvitationResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy SendInvitation)
+
+responseListDeviceEvents :: ListDeviceEventsResponse -> TestTree
+responseListDeviceEvents = res
+    "ListDeviceEventsResponse"
+    "fixture/ListDeviceEventsResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy ListDeviceEvents)
+
+responseCreateUser :: CreateUserResponse -> TestTree
+responseCreateUser = res
+    "CreateUserResponse"
+    "fixture/CreateUserResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy CreateUser)
+
+responseSearchDevices :: SearchDevicesResponse -> TestTree
+responseSearchDevices = res
+    "SearchDevicesResponse"
+    "fixture/SearchDevicesResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy SearchDevices)
+
+responseSearchContacts :: SearchContactsResponse -> TestTree
+responseSearchContacts = res
+    "SearchContactsResponse"
+    "fixture/SearchContactsResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy SearchContacts)
+
+responseDeleteUser :: DeleteUserResponse -> TestTree
+responseDeleteUser = res
+    "DeleteUserResponse"
+    "fixture/DeleteUserResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy DeleteUser)
+
+responseGetSkillGroup :: GetSkillGroupResponse -> TestTree
+responseGetSkillGroup = res
+    "GetSkillGroupResponse"
+    "fixture/GetSkillGroupResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy GetSkillGroup)
+
+responseListSkills :: ListSkillsResponse -> TestTree
+responseListSkills = res
+    "ListSkillsResponse"
+    "fixture/ListSkillsResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy ListSkills)
+
+responseTagResource :: TagResourceResponse -> TestTree
+responseTagResource = res
+    "TagResourceResponse"
+    "fixture/TagResourceResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy TagResource)
+
+responseDisassociateDeviceFromRoom :: DisassociateDeviceFromRoomResponse -> TestTree
+responseDisassociateDeviceFromRoom = res
+    "DisassociateDeviceFromRoomResponse"
+    "fixture/DisassociateDeviceFromRoomResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy DisassociateDeviceFromRoom)
+
+responseSearchSkillGroups :: SearchSkillGroupsResponse -> TestTree
+responseSearchSkillGroups = res
+    "SearchSkillGroupsResponse"
+    "fixture/SearchSkillGroupsResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy SearchSkillGroups)
+
+responseListTags :: ListTagsResponse -> TestTree
+responseListTags = res
+    "ListTagsResponse"
+    "fixture/ListTagsResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy ListTags)
+
+responseUntagResource :: UntagResourceResponse -> TestTree
+responseUntagResource = res
+    "UntagResourceResponse"
+    "fixture/UntagResourceResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy UntagResource)
+
+responseResolveRoom :: ResolveRoomResponse -> TestTree
+responseResolveRoom = res
+    "ResolveRoomResponse"
+    "fixture/ResolveRoomResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy ResolveRoom)
+
+responseCreateRoom :: CreateRoomResponse -> TestTree
+responseCreateRoom = res
+    "CreateRoomResponse"
+    "fixture/CreateRoomResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy CreateRoom)
+
+responseDeleteRoomSkillParameter :: DeleteRoomSkillParameterResponse -> TestTree
+responseDeleteRoomSkillParameter = res
+    "DeleteRoomSkillParameterResponse"
+    "fixture/DeleteRoomSkillParameterResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy DeleteRoomSkillParameter)
+
+responsePutRoomSkillParameter :: PutRoomSkillParameterResponse -> TestTree
+responsePutRoomSkillParameter = res
+    "PutRoomSkillParameterResponse"
+    "fixture/PutRoomSkillParameterResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy PutRoomSkillParameter)
+
+responseSearchProfiles :: SearchProfilesResponse -> TestTree
+responseSearchProfiles = res
+    "SearchProfilesResponse"
+    "fixture/SearchProfilesResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy SearchProfiles)
+
+responseRevokeInvitation :: RevokeInvitationResponse -> TestTree
+responseRevokeInvitation = res
+    "RevokeInvitationResponse"
+    "fixture/RevokeInvitationResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy RevokeInvitation)
+
+responseUpdateDevice :: UpdateDeviceResponse -> TestTree
+responseUpdateDevice = res
+    "UpdateDeviceResponse"
+    "fixture/UpdateDeviceResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy UpdateDevice)
+
+responseGetRoom :: GetRoomResponse -> TestTree
+responseGetRoom = res
+    "GetRoomResponse"
+    "fixture/GetRoomResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy GetRoom)
+
+responseAssociateContactWithAddressBook :: AssociateContactWithAddressBookResponse -> TestTree
+responseAssociateContactWithAddressBook = res
+    "AssociateContactWithAddressBookResponse"
+    "fixture/AssociateContactWithAddressBookResponse.proto"
+    alexaBusiness
+    (Proxy :: Proxy AssociateContactWithAddressBook)
