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 Resource Groups 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-resourcegroups)
+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.ResourceGroups](http://hackage.haskell.org/package/amazonka-resourcegroups/docs/Network-AWS-ResourceGroups.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-resourcegroups` 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-resourcegroups.cabal b/amazonka-resourcegroups.cabal
new file mode 100644
--- /dev/null
+++ b/amazonka-resourcegroups.cabal
@@ -0,0 +1,97 @@
+name:                  amazonka-resourcegroups
+version:               1.6.0
+synopsis:              Amazon Resource Groups 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.ResourceGroups" 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-resourcegroups
+
+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.ResourceGroups
+        , Network.AWS.ResourceGroups.CreateGroup
+        , Network.AWS.ResourceGroups.DeleteGroup
+        , Network.AWS.ResourceGroups.GetGroup
+        , Network.AWS.ResourceGroups.GetGroupQuery
+        , Network.AWS.ResourceGroups.GetTags
+        , Network.AWS.ResourceGroups.ListGroupResources
+        , Network.AWS.ResourceGroups.ListGroups
+        , Network.AWS.ResourceGroups.SearchResources
+        , Network.AWS.ResourceGroups.Tag
+        , Network.AWS.ResourceGroups.Types
+        , Network.AWS.ResourceGroups.Untag
+        , Network.AWS.ResourceGroups.UpdateGroup
+        , Network.AWS.ResourceGroups.UpdateGroupQuery
+        , Network.AWS.ResourceGroups.Waiters
+
+    other-modules:
+          Network.AWS.ResourceGroups.Types.Product
+        , Network.AWS.ResourceGroups.Types.Sum
+
+    build-depends:
+          amazonka-core == 1.6.0.*
+        , base          >= 4.7     && < 5
+
+test-suite amazonka-resourcegroups-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.ResourceGroups
+        , Test.AWS.Gen.ResourceGroups
+        , Test.AWS.ResourceGroups.Internal
+
+    build-depends:
+          amazonka-core == 1.6.0.*
+        , amazonka-test == 1.6.0.*
+        , amazonka-resourcegroups
+        , base
+        , bytestring
+        , tasty
+        , tasty-hunit
+        , text
+        , time
+        , unordered-containers
diff --git a/fixture/CreateGroup.yaml b/fixture/CreateGroup.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateGroup.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/resource-groups/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  resource-groups.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/CreateGroupResponse.proto b/fixture/CreateGroupResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateGroupResponse.proto
diff --git a/fixture/DeleteGroup.yaml b/fixture/DeleteGroup.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteGroup.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/resource-groups/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  resource-groups.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/DeleteGroupResponse.proto b/fixture/DeleteGroupResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteGroupResponse.proto
diff --git a/fixture/GetGroup.yaml b/fixture/GetGroup.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetGroup.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/resource-groups/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  resource-groups.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/GetGroupQuery.yaml b/fixture/GetGroupQuery.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetGroupQuery.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/resource-groups/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  resource-groups.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/GetGroupQueryResponse.proto b/fixture/GetGroupQueryResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetGroupQueryResponse.proto
diff --git a/fixture/GetGroupResponse.proto b/fixture/GetGroupResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetGroupResponse.proto
diff --git a/fixture/GetTags.yaml b/fixture/GetTags.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetTags.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/resource-groups/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  resource-groups.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/GetTagsResponse.proto b/fixture/GetTagsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetTagsResponse.proto
diff --git a/fixture/ListGroupResources.yaml b/fixture/ListGroupResources.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListGroupResources.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/resource-groups/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  resource-groups.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/ListGroupResourcesResponse.proto b/fixture/ListGroupResourcesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListGroupResourcesResponse.proto
diff --git a/fixture/ListGroups.yaml b/fixture/ListGroups.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListGroups.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/resource-groups/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  resource-groups.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/ListGroupsResponse.proto b/fixture/ListGroupsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListGroupsResponse.proto
diff --git a/fixture/SearchResources.yaml b/fixture/SearchResources.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/SearchResources.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/resource-groups/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  resource-groups.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/SearchResourcesResponse.proto b/fixture/SearchResourcesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/SearchResourcesResponse.proto
diff --git a/fixture/Tag.yaml b/fixture/Tag.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/Tag.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/resource-groups/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  resource-groups.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/TagResponse.proto b/fixture/TagResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/TagResponse.proto
diff --git a/fixture/Untag.yaml b/fixture/Untag.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/Untag.yaml
@@ -0,0 +1,10 @@
+---
+method: PATCH
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/resource-groups/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  resource-groups.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/UntagResponse.proto b/fixture/UntagResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UntagResponse.proto
diff --git a/fixture/UpdateGroup.yaml b/fixture/UpdateGroup.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateGroup.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/resource-groups/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  resource-groups.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/UpdateGroupQuery.yaml b/fixture/UpdateGroupQuery.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateGroupQuery.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/resource-groups/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  resource-groups.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/UpdateGroupQueryResponse.proto b/fixture/UpdateGroupQueryResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateGroupQueryResponse.proto
diff --git a/fixture/UpdateGroupResponse.proto b/fixture/UpdateGroupResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateGroupResponse.proto
diff --git a/gen/Network/AWS/ResourceGroups.hs b/gen/Network/AWS/ResourceGroups.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ResourceGroups.hs
@@ -0,0 +1,181 @@
+{-# 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.ResourceGroups
+-- 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)
+--
+-- __AWS Resource Groups__
+--
+-- AWS Resource Groups lets you organize AWS resources such as Amazon EC2 instances, Amazon Relational Database Service databases, and Amazon S3 buckets into groups using criteria that you define as tags. A resource group is a collection of resources that match the resource types specified in a query, and share one or more tags or portions of tags. You can create a group of resources based on their roles in your cloud infrastructure, lifecycle stages, regions, application layers, or virtually any criteria. Resource groups enable you to automate management tasks, such as those in AWS Systems Manager Automation documents, on tag-related resources in AWS Systems Manager. Groups of tagged resources also let you quickly view a custom console in AWS Systems Manager that shows AWS Config compliance and other monitoring data about member resources.
+--
+-- To create a resource group, build a resource query, and specify tags that identify the criteria that members of the group have in common. Tags are key-value pairs.
+--
+-- For more information about Resource Groups, see the <https://docs.aws.amazon.com/ARG/latest/userguide/welcome.html AWS Resource Groups User Guide> .
+--
+-- AWS Resource Groups uses a REST-compliant API that you can use to perform the following types of operations.
+--
+--     * Create, Read, Update, and Delete (CRUD) operations on resource groups and resource query entities
+--
+--     * Applying, editing, and removing tags from resource groups
+--
+--     * Resolving resource group member ARNs so they can be returned as search results
+--
+--     * Getting data about resources that are members of a group
+--
+--     * Searching AWS resources based on a resource query
+--
+--
+--
+module Network.AWS.ResourceGroups
+    (
+    -- * Service Configuration
+      resourceGroups
+
+    -- * Errors
+    -- $errors
+
+    -- ** ForbiddenException
+    , _ForbiddenException
+
+    -- ** NotFoundException
+    , _NotFoundException
+
+    -- ** TooManyRequestsException
+    , _TooManyRequestsException
+
+    -- ** InternalServerErrorException
+    , _InternalServerErrorException
+
+    -- ** MethodNotAllowedException
+    , _MethodNotAllowedException
+
+    -- ** UnauthorizedException
+    , _UnauthorizedException
+
+    -- ** BadRequestException
+    , _BadRequestException
+
+    -- * Waiters
+    -- $waiters
+
+    -- * Operations
+    -- $operations
+
+    -- ** SearchResources (Paginated)
+    , module Network.AWS.ResourceGroups.SearchResources
+
+    -- ** GetTags
+    , module Network.AWS.ResourceGroups.GetTags
+
+    -- ** Tag
+    , module Network.AWS.ResourceGroups.Tag
+
+    -- ** Untag
+    , module Network.AWS.ResourceGroups.Untag
+
+    -- ** UpdateGroupQuery
+    , module Network.AWS.ResourceGroups.UpdateGroupQuery
+
+    -- ** ListGroupResources (Paginated)
+    , module Network.AWS.ResourceGroups.ListGroupResources
+
+    -- ** GetGroupQuery
+    , module Network.AWS.ResourceGroups.GetGroupQuery
+
+    -- ** CreateGroup
+    , module Network.AWS.ResourceGroups.CreateGroup
+
+    -- ** DeleteGroup
+    , module Network.AWS.ResourceGroups.DeleteGroup
+
+    -- ** UpdateGroup
+    , module Network.AWS.ResourceGroups.UpdateGroup
+
+    -- ** ListGroups (Paginated)
+    , module Network.AWS.ResourceGroups.ListGroups
+
+    -- ** GetGroup
+    , module Network.AWS.ResourceGroups.GetGroup
+
+    -- * Types
+
+    -- ** QueryType
+    , QueryType (..)
+
+    -- ** Group
+    , Group
+    , group'
+    , gDescription
+    , gGroupARN
+    , gName
+
+    -- ** GroupQuery
+    , GroupQuery
+    , groupQuery
+    , gqGroupName
+    , gqResourceQuery
+
+    -- ** ResourceIdentifier
+    , ResourceIdentifier
+    , resourceIdentifier
+    , riResourceType
+    , riResourceARN
+
+    -- ** ResourceQuery
+    , ResourceQuery
+    , resourceQuery
+    , rqType
+    , rqSearchQuery
+    ) where
+
+import Network.AWS.ResourceGroups.CreateGroup
+import Network.AWS.ResourceGroups.DeleteGroup
+import Network.AWS.ResourceGroups.GetGroup
+import Network.AWS.ResourceGroups.GetGroupQuery
+import Network.AWS.ResourceGroups.GetTags
+import Network.AWS.ResourceGroups.ListGroupResources
+import Network.AWS.ResourceGroups.ListGroups
+import Network.AWS.ResourceGroups.SearchResources
+import Network.AWS.ResourceGroups.Tag
+import Network.AWS.ResourceGroups.Types
+import Network.AWS.ResourceGroups.Untag
+import Network.AWS.ResourceGroups.UpdateGroup
+import Network.AWS.ResourceGroups.UpdateGroupQuery
+import Network.AWS.ResourceGroups.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 'ResourceGroups'.
+-}
+
+{- $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/ResourceGroups/CreateGroup.hs b/gen/Network/AWS/ResourceGroups/CreateGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ResourceGroups/CreateGroup.hs
@@ -0,0 +1,181 @@
+{-# 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.ResourceGroups.CreateGroup
+-- 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 group with a specified name, description, and resource query.
+--
+--
+module Network.AWS.ResourceGroups.CreateGroup
+    (
+    -- * Creating a Request
+      createGroup
+    , CreateGroup
+    -- * Request Lenses
+    , cgDescription
+    , cgTags
+    , cgName
+    , cgResourceQuery
+
+    -- * Destructuring the Response
+    , createGroupResponse
+    , CreateGroupResponse
+    -- * Response Lenses
+    , cgrsGroup
+    , cgrsResourceQuery
+    , cgrsTags
+    , cgrsResponseStatus
+    ) where
+
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.ResourceGroups.Types
+import Network.AWS.ResourceGroups.Types.Product
+import Network.AWS.Response
+
+-- | /See:/ 'createGroup' smart constructor.
+data CreateGroup = CreateGroup'
+  { _cgDescription   :: !(Maybe Text)
+  , _cgTags          :: !(Maybe (Map Text Text))
+  , _cgName          :: !Text
+  , _cgResourceQuery :: !ResourceQuery
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'CreateGroup' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cgDescription' - The description of the resource group. Descriptions can have a maximum of 511 characters, including letters, numbers, hyphens, underscores, punctuation, and spaces.
+--
+-- * 'cgTags' - The tags to add to the group. A tag is a string-to-string map of key-value pairs. Tag keys can have a maximum character length of 127 characters, and tag values can have a maximum length of 255 characters.
+--
+-- * 'cgName' - The name of the group, which is the identifier of the group in other operations. A resource group name cannot be updated after it is created. A resource group name can have a maximum of 127 characters, including letters, numbers, hyphens, dots, and underscores. The name cannot start with @AWS@ or @aws@ ; these are reserved. A resource group name must be unique within your account.
+--
+-- * 'cgResourceQuery' - The resource query that determines which AWS resources are members of this group.
+createGroup
+    :: Text -- ^ 'cgName'
+    -> ResourceQuery -- ^ 'cgResourceQuery'
+    -> CreateGroup
+createGroup pName_ pResourceQuery_ =
+  CreateGroup'
+    { _cgDescription = Nothing
+    , _cgTags = Nothing
+    , _cgName = pName_
+    , _cgResourceQuery = pResourceQuery_
+    }
+
+
+-- | The description of the resource group. Descriptions can have a maximum of 511 characters, including letters, numbers, hyphens, underscores, punctuation, and spaces.
+cgDescription :: Lens' CreateGroup (Maybe Text)
+cgDescription = lens _cgDescription (\ s a -> s{_cgDescription = a})
+
+-- | The tags to add to the group. A tag is a string-to-string map of key-value pairs. Tag keys can have a maximum character length of 127 characters, and tag values can have a maximum length of 255 characters.
+cgTags :: Lens' CreateGroup (HashMap Text Text)
+cgTags = lens _cgTags (\ s a -> s{_cgTags = a}) . _Default . _Map
+
+-- | The name of the group, which is the identifier of the group in other operations. A resource group name cannot be updated after it is created. A resource group name can have a maximum of 127 characters, including letters, numbers, hyphens, dots, and underscores. The name cannot start with @AWS@ or @aws@ ; these are reserved. A resource group name must be unique within your account.
+cgName :: Lens' CreateGroup Text
+cgName = lens _cgName (\ s a -> s{_cgName = a})
+
+-- | The resource query that determines which AWS resources are members of this group.
+cgResourceQuery :: Lens' CreateGroup ResourceQuery
+cgResourceQuery = lens _cgResourceQuery (\ s a -> s{_cgResourceQuery = a})
+
+instance AWSRequest CreateGroup where
+        type Rs CreateGroup = CreateGroupResponse
+        request = postJSON resourceGroups
+        response
+          = receiveJSON
+              (\ s h x ->
+                 CreateGroupResponse' <$>
+                   (x .?> "Group") <*> (x .?> "ResourceQuery") <*>
+                     (x .?> "Tags" .!@ mempty)
+                     <*> (pure (fromEnum s)))
+
+instance Hashable CreateGroup where
+
+instance NFData CreateGroup where
+
+instance ToHeaders CreateGroup where
+        toHeaders = const mempty
+
+instance ToJSON CreateGroup where
+        toJSON CreateGroup'{..}
+          = object
+              (catMaybes
+                 [("Description" .=) <$> _cgDescription,
+                  ("Tags" .=) <$> _cgTags, Just ("Name" .= _cgName),
+                  Just ("ResourceQuery" .= _cgResourceQuery)])
+
+instance ToPath CreateGroup where
+        toPath = const "/groups"
+
+instance ToQuery CreateGroup where
+        toQuery = const mempty
+
+-- | /See:/ 'createGroupResponse' smart constructor.
+data CreateGroupResponse = CreateGroupResponse'
+  { _cgrsGroup          :: !(Maybe Group)
+  , _cgrsResourceQuery  :: !(Maybe ResourceQuery)
+  , _cgrsTags           :: !(Maybe (Map Text Text))
+  , _cgrsResponseStatus :: !Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'CreateGroupResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cgrsGroup' - A full description of the resource group after it is created.
+--
+-- * 'cgrsResourceQuery' - The resource query associated with the group.
+--
+-- * 'cgrsTags' - The tags associated with the group.
+--
+-- * 'cgrsResponseStatus' - -- | The response status code.
+createGroupResponse
+    :: Int -- ^ 'cgrsResponseStatus'
+    -> CreateGroupResponse
+createGroupResponse pResponseStatus_ =
+  CreateGroupResponse'
+    { _cgrsGroup = Nothing
+    , _cgrsResourceQuery = Nothing
+    , _cgrsTags = Nothing
+    , _cgrsResponseStatus = pResponseStatus_
+    }
+
+
+-- | A full description of the resource group after it is created.
+cgrsGroup :: Lens' CreateGroupResponse (Maybe Group)
+cgrsGroup = lens _cgrsGroup (\ s a -> s{_cgrsGroup = a})
+
+-- | The resource query associated with the group.
+cgrsResourceQuery :: Lens' CreateGroupResponse (Maybe ResourceQuery)
+cgrsResourceQuery = lens _cgrsResourceQuery (\ s a -> s{_cgrsResourceQuery = a})
+
+-- | The tags associated with the group.
+cgrsTags :: Lens' CreateGroupResponse (HashMap Text Text)
+cgrsTags = lens _cgrsTags (\ s a -> s{_cgrsTags = a}) . _Default . _Map
+
+-- | -- | The response status code.
+cgrsResponseStatus :: Lens' CreateGroupResponse Int
+cgrsResponseStatus = lens _cgrsResponseStatus (\ s a -> s{_cgrsResponseStatus = a})
+
+instance NFData CreateGroupResponse where
diff --git a/gen/Network/AWS/ResourceGroups/DeleteGroup.hs b/gen/Network/AWS/ResourceGroups/DeleteGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ResourceGroups/DeleteGroup.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.ResourceGroups.DeleteGroup
+-- 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 resource group. Deleting a resource group does not delete resources that are members of the group; it only deletes the group structure.
+--
+--
+module Network.AWS.ResourceGroups.DeleteGroup
+    (
+    -- * Creating a Request
+      deleteGroup
+    , DeleteGroup
+    -- * Request Lenses
+    , dgGroupName
+
+    -- * Destructuring the Response
+    , deleteGroupResponse
+    , DeleteGroupResponse
+    -- * Response Lenses
+    , dgrsGroup
+    , dgrsResponseStatus
+    ) where
+
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.ResourceGroups.Types
+import Network.AWS.ResourceGroups.Types.Product
+import Network.AWS.Response
+
+-- | /See:/ 'deleteGroup' smart constructor.
+newtype DeleteGroup = DeleteGroup'
+  { _dgGroupName :: Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'DeleteGroup' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dgGroupName' - The name of the resource group to delete.
+deleteGroup
+    :: Text -- ^ 'dgGroupName'
+    -> DeleteGroup
+deleteGroup pGroupName_ = DeleteGroup' {_dgGroupName = pGroupName_}
+
+
+-- | The name of the resource group to delete.
+dgGroupName :: Lens' DeleteGroup Text
+dgGroupName = lens _dgGroupName (\ s a -> s{_dgGroupName = a})
+
+instance AWSRequest DeleteGroup where
+        type Rs DeleteGroup = DeleteGroupResponse
+        request = delete resourceGroups
+        response
+          = receiveJSON
+              (\ s h x ->
+                 DeleteGroupResponse' <$>
+                   (x .?> "Group") <*> (pure (fromEnum s)))
+
+instance Hashable DeleteGroup where
+
+instance NFData DeleteGroup where
+
+instance ToHeaders DeleteGroup where
+        toHeaders = const mempty
+
+instance ToPath DeleteGroup where
+        toPath DeleteGroup'{..}
+          = mconcat ["/groups/", toBS _dgGroupName]
+
+instance ToQuery DeleteGroup where
+        toQuery = const mempty
+
+-- | /See:/ 'deleteGroupResponse' smart constructor.
+data DeleteGroupResponse = DeleteGroupResponse'
+  { _dgrsGroup          :: !(Maybe Group)
+  , _dgrsResponseStatus :: !Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'DeleteGroupResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dgrsGroup' - A full description of the deleted resource group.
+--
+-- * 'dgrsResponseStatus' - -- | The response status code.
+deleteGroupResponse
+    :: Int -- ^ 'dgrsResponseStatus'
+    -> DeleteGroupResponse
+deleteGroupResponse pResponseStatus_ =
+  DeleteGroupResponse'
+    {_dgrsGroup = Nothing, _dgrsResponseStatus = pResponseStatus_}
+
+
+-- | A full description of the deleted resource group.
+dgrsGroup :: Lens' DeleteGroupResponse (Maybe Group)
+dgrsGroup = lens _dgrsGroup (\ s a -> s{_dgrsGroup = a})
+
+-- | -- | The response status code.
+dgrsResponseStatus :: Lens' DeleteGroupResponse Int
+dgrsResponseStatus = lens _dgrsResponseStatus (\ s a -> s{_dgrsResponseStatus = a})
+
+instance NFData DeleteGroupResponse where
diff --git a/gen/Network/AWS/ResourceGroups/GetGroup.hs b/gen/Network/AWS/ResourceGroups/GetGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ResourceGroups/GetGroup.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.ResourceGroups.GetGroup
+-- 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)
+--
+-- Returns information about a specified resource group.
+--
+--
+module Network.AWS.ResourceGroups.GetGroup
+    (
+    -- * Creating a Request
+      getGroup
+    , GetGroup
+    -- * Request Lenses
+    , ggGroupName
+
+    -- * Destructuring the Response
+    , getGroupResponse
+    , GetGroupResponse
+    -- * Response Lenses
+    , ggrsGroup
+    , ggrsResponseStatus
+    ) where
+
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.ResourceGroups.Types
+import Network.AWS.ResourceGroups.Types.Product
+import Network.AWS.Response
+
+-- | /See:/ 'getGroup' smart constructor.
+newtype GetGroup = GetGroup'
+  { _ggGroupName :: Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'GetGroup' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ggGroupName' - The name of the resource group.
+getGroup
+    :: Text -- ^ 'ggGroupName'
+    -> GetGroup
+getGroup pGroupName_ = GetGroup' {_ggGroupName = pGroupName_}
+
+
+-- | The name of the resource group.
+ggGroupName :: Lens' GetGroup Text
+ggGroupName = lens _ggGroupName (\ s a -> s{_ggGroupName = a})
+
+instance AWSRequest GetGroup where
+        type Rs GetGroup = GetGroupResponse
+        request = get resourceGroups
+        response
+          = receiveJSON
+              (\ s h x ->
+                 GetGroupResponse' <$>
+                   (x .?> "Group") <*> (pure (fromEnum s)))
+
+instance Hashable GetGroup where
+
+instance NFData GetGroup where
+
+instance ToHeaders GetGroup where
+        toHeaders = const mempty
+
+instance ToPath GetGroup where
+        toPath GetGroup'{..}
+          = mconcat ["/groups/", toBS _ggGroupName]
+
+instance ToQuery GetGroup where
+        toQuery = const mempty
+
+-- | /See:/ 'getGroupResponse' smart constructor.
+data GetGroupResponse = GetGroupResponse'
+  { _ggrsGroup          :: !(Maybe Group)
+  , _ggrsResponseStatus :: !Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'GetGroupResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ggrsGroup' - A full description of the resource group.
+--
+-- * 'ggrsResponseStatus' - -- | The response status code.
+getGroupResponse
+    :: Int -- ^ 'ggrsResponseStatus'
+    -> GetGroupResponse
+getGroupResponse pResponseStatus_ =
+  GetGroupResponse'
+    {_ggrsGroup = Nothing, _ggrsResponseStatus = pResponseStatus_}
+
+
+-- | A full description of the resource group.
+ggrsGroup :: Lens' GetGroupResponse (Maybe Group)
+ggrsGroup = lens _ggrsGroup (\ s a -> s{_ggrsGroup = a})
+
+-- | -- | The response status code.
+ggrsResponseStatus :: Lens' GetGroupResponse Int
+ggrsResponseStatus = lens _ggrsResponseStatus (\ s a -> s{_ggrsResponseStatus = a})
+
+instance NFData GetGroupResponse where
diff --git a/gen/Network/AWS/ResourceGroups/GetGroupQuery.hs b/gen/Network/AWS/ResourceGroups/GetGroupQuery.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ResourceGroups/GetGroupQuery.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.ResourceGroups.GetGroupQuery
+-- 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)
+--
+-- Returns the resource query associated with the specified resource group.
+--
+--
+module Network.AWS.ResourceGroups.GetGroupQuery
+    (
+    -- * Creating a Request
+      getGroupQuery
+    , GetGroupQuery
+    -- * Request Lenses
+    , ggqGroupName
+
+    -- * Destructuring the Response
+    , getGroupQueryResponse
+    , GetGroupQueryResponse
+    -- * Response Lenses
+    , ggqrsGroupQuery
+    , ggqrsResponseStatus
+    ) where
+
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.ResourceGroups.Types
+import Network.AWS.ResourceGroups.Types.Product
+import Network.AWS.Response
+
+-- | /See:/ 'getGroupQuery' smart constructor.
+newtype GetGroupQuery = GetGroupQuery'
+  { _ggqGroupName :: Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'GetGroupQuery' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ggqGroupName' - The name of the resource group.
+getGroupQuery
+    :: Text -- ^ 'ggqGroupName'
+    -> GetGroupQuery
+getGroupQuery pGroupName_ = GetGroupQuery' {_ggqGroupName = pGroupName_}
+
+
+-- | The name of the resource group.
+ggqGroupName :: Lens' GetGroupQuery Text
+ggqGroupName = lens _ggqGroupName (\ s a -> s{_ggqGroupName = a})
+
+instance AWSRequest GetGroupQuery where
+        type Rs GetGroupQuery = GetGroupQueryResponse
+        request = get resourceGroups
+        response
+          = receiveJSON
+              (\ s h x ->
+                 GetGroupQueryResponse' <$>
+                   (x .?> "GroupQuery") <*> (pure (fromEnum s)))
+
+instance Hashable GetGroupQuery where
+
+instance NFData GetGroupQuery where
+
+instance ToHeaders GetGroupQuery where
+        toHeaders = const mempty
+
+instance ToPath GetGroupQuery where
+        toPath GetGroupQuery'{..}
+          = mconcat ["/groups/", toBS _ggqGroupName, "/query"]
+
+instance ToQuery GetGroupQuery where
+        toQuery = const mempty
+
+-- | /See:/ 'getGroupQueryResponse' smart constructor.
+data GetGroupQueryResponse = GetGroupQueryResponse'
+  { _ggqrsGroupQuery     :: !(Maybe GroupQuery)
+  , _ggqrsResponseStatus :: !Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'GetGroupQueryResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ggqrsGroupQuery' - The resource query associated with the specified group.
+--
+-- * 'ggqrsResponseStatus' - -- | The response status code.
+getGroupQueryResponse
+    :: Int -- ^ 'ggqrsResponseStatus'
+    -> GetGroupQueryResponse
+getGroupQueryResponse pResponseStatus_ =
+  GetGroupQueryResponse'
+    {_ggqrsGroupQuery = Nothing, _ggqrsResponseStatus = pResponseStatus_}
+
+
+-- | The resource query associated with the specified group.
+ggqrsGroupQuery :: Lens' GetGroupQueryResponse (Maybe GroupQuery)
+ggqrsGroupQuery = lens _ggqrsGroupQuery (\ s a -> s{_ggqrsGroupQuery = a})
+
+-- | -- | The response status code.
+ggqrsResponseStatus :: Lens' GetGroupQueryResponse Int
+ggqrsResponseStatus = lens _ggqrsResponseStatus (\ s a -> s{_ggqrsResponseStatus = a})
+
+instance NFData GetGroupQueryResponse where
diff --git a/gen/Network/AWS/ResourceGroups/GetTags.hs b/gen/Network/AWS/ResourceGroups/GetTags.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ResourceGroups/GetTags.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.ResourceGroups.GetTags
+-- 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)
+--
+-- Returns a list of tags that are associated with a resource, specified by an ARN.
+--
+--
+module Network.AWS.ResourceGroups.GetTags
+    (
+    -- * Creating a Request
+      getTags
+    , GetTags
+    -- * Request Lenses
+    , gtARN
+
+    -- * Destructuring the Response
+    , getTagsResponse
+    , GetTagsResponse
+    -- * Response Lenses
+    , gtrsARN
+    , gtrsTags
+    , gtrsResponseStatus
+    ) where
+
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.ResourceGroups.Types
+import Network.AWS.ResourceGroups.Types.Product
+import Network.AWS.Response
+
+-- | /See:/ 'getTags' smart constructor.
+newtype GetTags = GetTags'
+  { _gtARN :: Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'GetTags' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gtARN' - The ARN of the resource for which you want a list of tags. The resource must exist within the account you are using.
+getTags
+    :: Text -- ^ 'gtARN'
+    -> GetTags
+getTags pARN_ = GetTags' {_gtARN = pARN_}
+
+
+-- | The ARN of the resource for which you want a list of tags. The resource must exist within the account you are using.
+gtARN :: Lens' GetTags Text
+gtARN = lens _gtARN (\ s a -> s{_gtARN = a})
+
+instance AWSRequest GetTags where
+        type Rs GetTags = GetTagsResponse
+        request = get resourceGroups
+        response
+          = receiveJSON
+              (\ s h x ->
+                 GetTagsResponse' <$>
+                   (x .?> "Arn") <*> (x .?> "Tags" .!@ mempty) <*>
+                     (pure (fromEnum s)))
+
+instance Hashable GetTags where
+
+instance NFData GetTags where
+
+instance ToHeaders GetTags where
+        toHeaders = const mempty
+
+instance ToPath GetTags where
+        toPath GetTags'{..}
+          = mconcat ["/resources/", toBS _gtARN, "/tags"]
+
+instance ToQuery GetTags where
+        toQuery = const mempty
+
+-- | /See:/ 'getTagsResponse' smart constructor.
+data GetTagsResponse = GetTagsResponse'
+  { _gtrsARN            :: !(Maybe Text)
+  , _gtrsTags           :: !(Maybe (Map Text Text))
+  , _gtrsResponseStatus :: !Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'GetTagsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gtrsARN' - The ARN of the tagged resource.
+--
+-- * 'gtrsTags' - The tags associated with the specified resource.
+--
+-- * 'gtrsResponseStatus' - -- | The response status code.
+getTagsResponse
+    :: Int -- ^ 'gtrsResponseStatus'
+    -> GetTagsResponse
+getTagsResponse pResponseStatus_ =
+  GetTagsResponse'
+    { _gtrsARN = Nothing
+    , _gtrsTags = Nothing
+    , _gtrsResponseStatus = pResponseStatus_
+    }
+
+
+-- | The ARN of the tagged resource.
+gtrsARN :: Lens' GetTagsResponse (Maybe Text)
+gtrsARN = lens _gtrsARN (\ s a -> s{_gtrsARN = a})
+
+-- | The tags associated with the specified resource.
+gtrsTags :: Lens' GetTagsResponse (HashMap Text Text)
+gtrsTags = lens _gtrsTags (\ s a -> s{_gtrsTags = a}) . _Default . _Map
+
+-- | -- | The response status code.
+gtrsResponseStatus :: Lens' GetTagsResponse Int
+gtrsResponseStatus = lens _gtrsResponseStatus (\ s a -> s{_gtrsResponseStatus = a})
+
+instance NFData GetTagsResponse where
diff --git a/gen/Network/AWS/ResourceGroups/ListGroupResources.hs b/gen/Network/AWS/ResourceGroups/ListGroupResources.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ResourceGroups/ListGroupResources.hs
@@ -0,0 +1,171 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.ResourceGroups.ListGroupResources
+-- 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)
+--
+-- Returns a list of ARNs of resources that are members of a specified resource group.
+--
+--
+--
+-- This operation returns paginated results.
+module Network.AWS.ResourceGroups.ListGroupResources
+    (
+    -- * Creating a Request
+      listGroupResources
+    , ListGroupResources
+    -- * Request Lenses
+    , lgrNextToken
+    , lgrMaxResults
+    , lgrGroupName
+
+    -- * Destructuring the Response
+    , listGroupResourcesResponse
+    , ListGroupResourcesResponse
+    -- * Response Lenses
+    , lgrrsNextToken
+    , lgrrsResourceIdentifiers
+    , lgrrsResponseStatus
+    ) where
+
+import Network.AWS.Lens
+import Network.AWS.Pager
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.ResourceGroups.Types
+import Network.AWS.ResourceGroups.Types.Product
+import Network.AWS.Response
+
+-- | /See:/ 'listGroupResources' smart constructor.
+data ListGroupResources = ListGroupResources'
+  { _lgrNextToken  :: !(Maybe Text)
+  , _lgrMaxResults :: !(Maybe Nat)
+  , _lgrGroupName  :: !Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'ListGroupResources' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'lgrNextToken' - The NextToken value that is returned in a paginated ListGroupResources request. To get the next page of results, run the call again, add the NextToken parameter, and specify the NextToken value.
+--
+-- * 'lgrMaxResults' - The maximum number of group member ARNs that are returned in a single call by ListGroupResources, in paginated output. By default, this number is 50.
+--
+-- * 'lgrGroupName' - The name of the resource group.
+listGroupResources
+    :: Text -- ^ 'lgrGroupName'
+    -> ListGroupResources
+listGroupResources pGroupName_ =
+  ListGroupResources'
+    { _lgrNextToken = Nothing
+    , _lgrMaxResults = Nothing
+    , _lgrGroupName = pGroupName_
+    }
+
+
+-- | The NextToken value that is returned in a paginated ListGroupResources request. To get the next page of results, run the call again, add the NextToken parameter, and specify the NextToken value.
+lgrNextToken :: Lens' ListGroupResources (Maybe Text)
+lgrNextToken = lens _lgrNextToken (\ s a -> s{_lgrNextToken = a})
+
+-- | The maximum number of group member ARNs that are returned in a single call by ListGroupResources, in paginated output. By default, this number is 50.
+lgrMaxResults :: Lens' ListGroupResources (Maybe Natural)
+lgrMaxResults = lens _lgrMaxResults (\ s a -> s{_lgrMaxResults = a}) . mapping _Nat
+
+-- | The name of the resource group.
+lgrGroupName :: Lens' ListGroupResources Text
+lgrGroupName = lens _lgrGroupName (\ s a -> s{_lgrGroupName = a})
+
+instance AWSPager ListGroupResources where
+        page rq rs
+          | stop (rs ^. lgrrsNextToken) = Nothing
+          | stop (rs ^. lgrrsResourceIdentifiers) = Nothing
+          | otherwise =
+            Just $ rq & lgrNextToken .~ rs ^. lgrrsNextToken
+
+instance AWSRequest ListGroupResources where
+        type Rs ListGroupResources =
+             ListGroupResourcesResponse
+        request = get resourceGroups
+        response
+          = receiveJSON
+              (\ s h x ->
+                 ListGroupResourcesResponse' <$>
+                   (x .?> "NextToken") <*>
+                     (x .?> "ResourceIdentifiers" .!@ mempty)
+                     <*> (pure (fromEnum s)))
+
+instance Hashable ListGroupResources where
+
+instance NFData ListGroupResources where
+
+instance ToHeaders ListGroupResources where
+        toHeaders = const mempty
+
+instance ToPath ListGroupResources where
+        toPath ListGroupResources'{..}
+          = mconcat
+              ["/groups/", toBS _lgrGroupName,
+               "/resource-identifiers"]
+
+instance ToQuery ListGroupResources where
+        toQuery ListGroupResources'{..}
+          = mconcat
+              ["nextToken" =: _lgrNextToken,
+               "maxResults" =: _lgrMaxResults]
+
+-- | /See:/ 'listGroupResourcesResponse' smart constructor.
+data ListGroupResourcesResponse = ListGroupResourcesResponse'
+  { _lgrrsNextToken           :: !(Maybe Text)
+  , _lgrrsResourceIdentifiers :: !(Maybe [ResourceIdentifier])
+  , _lgrrsResponseStatus      :: !Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'ListGroupResourcesResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'lgrrsNextToken' - The NextToken value to include in a subsequent @ListGroupResources@ request, to get more results.
+--
+-- * 'lgrrsResourceIdentifiers' - The ARNs and resource types of resources that are members of the group that you specified.
+--
+-- * 'lgrrsResponseStatus' - -- | The response status code.
+listGroupResourcesResponse
+    :: Int -- ^ 'lgrrsResponseStatus'
+    -> ListGroupResourcesResponse
+listGroupResourcesResponse pResponseStatus_ =
+  ListGroupResourcesResponse'
+    { _lgrrsNextToken = Nothing
+    , _lgrrsResourceIdentifiers = Nothing
+    , _lgrrsResponseStatus = pResponseStatus_
+    }
+
+
+-- | The NextToken value to include in a subsequent @ListGroupResources@ request, to get more results.
+lgrrsNextToken :: Lens' ListGroupResourcesResponse (Maybe Text)
+lgrrsNextToken = lens _lgrrsNextToken (\ s a -> s{_lgrrsNextToken = a})
+
+-- | The ARNs and resource types of resources that are members of the group that you specified.
+lgrrsResourceIdentifiers :: Lens' ListGroupResourcesResponse [ResourceIdentifier]
+lgrrsResourceIdentifiers = lens _lgrrsResourceIdentifiers (\ s a -> s{_lgrrsResourceIdentifiers = a}) . _Default . _Coerce
+
+-- | -- | The response status code.
+lgrrsResponseStatus :: Lens' ListGroupResourcesResponse Int
+lgrrsResponseStatus = lens _lgrrsResponseStatus (\ s a -> s{_lgrrsResponseStatus = a})
+
+instance NFData ListGroupResourcesResponse where
diff --git a/gen/Network/AWS/ResourceGroups/ListGroups.hs b/gen/Network/AWS/ResourceGroups/ListGroups.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ResourceGroups/ListGroups.hs
@@ -0,0 +1,152 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.ResourceGroups.ListGroups
+-- 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)
+--
+-- Returns a list of existing resource groups in your account.
+--
+--
+--
+-- This operation returns paginated results.
+module Network.AWS.ResourceGroups.ListGroups
+    (
+    -- * Creating a Request
+      listGroups
+    , ListGroups
+    -- * Request Lenses
+    , lgNextToken
+    , lgMaxResults
+
+    -- * Destructuring the Response
+    , listGroupsResponse
+    , ListGroupsResponse
+    -- * Response Lenses
+    , lgrsGroups
+    , lgrsNextToken
+    , lgrsResponseStatus
+    ) where
+
+import Network.AWS.Lens
+import Network.AWS.Pager
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.ResourceGroups.Types
+import Network.AWS.ResourceGroups.Types.Product
+import Network.AWS.Response
+
+-- | /See:/ 'listGroups' smart constructor.
+data ListGroups = ListGroups'
+  { _lgNextToken  :: !(Maybe Text)
+  , _lgMaxResults :: !(Maybe Nat)
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'ListGroups' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'lgNextToken' - The NextToken value that is returned in a paginated @ListGroups@ request. To get the next page of results, run the call again, add the NextToken parameter, and specify the NextToken value.
+--
+-- * 'lgMaxResults' - The maximum number of resource group results that are returned by ListGroups in paginated output. By default, this number is 50.
+listGroups
+    :: ListGroups
+listGroups = ListGroups' {_lgNextToken = Nothing, _lgMaxResults = Nothing}
+
+
+-- | The NextToken value that is returned in a paginated @ListGroups@ request. To get the next page of results, run the call again, add the NextToken parameter, and specify the NextToken value.
+lgNextToken :: Lens' ListGroups (Maybe Text)
+lgNextToken = lens _lgNextToken (\ s a -> s{_lgNextToken = a})
+
+-- | The maximum number of resource group results that are returned by ListGroups in paginated output. By default, this number is 50.
+lgMaxResults :: Lens' ListGroups (Maybe Natural)
+lgMaxResults = lens _lgMaxResults (\ s a -> s{_lgMaxResults = a}) . mapping _Nat
+
+instance AWSPager ListGroups where
+        page rq rs
+          | stop (rs ^. lgrsNextToken) = Nothing
+          | stop (rs ^. lgrsGroups) = Nothing
+          | otherwise =
+            Just $ rq & lgNextToken .~ rs ^. lgrsNextToken
+
+instance AWSRequest ListGroups where
+        type Rs ListGroups = ListGroupsResponse
+        request = get resourceGroups
+        response
+          = receiveJSON
+              (\ s h x ->
+                 ListGroupsResponse' <$>
+                   (x .?> "Groups" .!@ mempty) <*> (x .?> "NextToken")
+                     <*> (pure (fromEnum s)))
+
+instance Hashable ListGroups where
+
+instance NFData ListGroups where
+
+instance ToHeaders ListGroups where
+        toHeaders = const mempty
+
+instance ToPath ListGroups where
+        toPath = const "/groups"
+
+instance ToQuery ListGroups where
+        toQuery ListGroups'{..}
+          = mconcat
+              ["nextToken" =: _lgNextToken,
+               "maxResults" =: _lgMaxResults]
+
+-- | /See:/ 'listGroupsResponse' smart constructor.
+data ListGroupsResponse = ListGroupsResponse'
+  { _lgrsGroups         :: !(Maybe [Group])
+  , _lgrsNextToken      :: !(Maybe Text)
+  , _lgrsResponseStatus :: !Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'ListGroupsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'lgrsGroups' - A list of resource groups.
+--
+-- * 'lgrsNextToken' - The NextToken value to include in a subsequent @ListGroups@ request, to get more results.
+--
+-- * 'lgrsResponseStatus' - -- | The response status code.
+listGroupsResponse
+    :: Int -- ^ 'lgrsResponseStatus'
+    -> ListGroupsResponse
+listGroupsResponse pResponseStatus_ =
+  ListGroupsResponse'
+    { _lgrsGroups = Nothing
+    , _lgrsNextToken = Nothing
+    , _lgrsResponseStatus = pResponseStatus_
+    }
+
+
+-- | A list of resource groups.
+lgrsGroups :: Lens' ListGroupsResponse [Group]
+lgrsGroups = lens _lgrsGroups (\ s a -> s{_lgrsGroups = a}) . _Default . _Coerce
+
+-- | The NextToken value to include in a subsequent @ListGroups@ request, to get more results.
+lgrsNextToken :: Lens' ListGroupsResponse (Maybe Text)
+lgrsNextToken = lens _lgrsNextToken (\ s a -> s{_lgrsNextToken = a})
+
+-- | -- | The response status code.
+lgrsResponseStatus :: Lens' ListGroupsResponse Int
+lgrsResponseStatus = lens _lgrsResponseStatus (\ s a -> s{_lgrsResponseStatus = a})
+
+instance NFData ListGroupsResponse where
diff --git a/gen/Network/AWS/ResourceGroups/SearchResources.hs b/gen/Network/AWS/ResourceGroups/SearchResources.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ResourceGroups/SearchResources.hs
@@ -0,0 +1,172 @@
+{-# 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.ResourceGroups.SearchResources
+-- 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)
+--
+-- Returns a list of AWS resource identifiers that matches a specified query. The query uses the same format as a resource query in a CreateGroup or UpdateGroupQuery operation.
+--
+--
+--
+-- This operation returns paginated results.
+module Network.AWS.ResourceGroups.SearchResources
+    (
+    -- * Creating a Request
+      searchResources
+    , SearchResources
+    -- * Request Lenses
+    , srNextToken
+    , srMaxResults
+    , srResourceQuery
+
+    -- * Destructuring the Response
+    , searchResourcesResponse
+    , SearchResourcesResponse
+    -- * Response Lenses
+    , srrsNextToken
+    , srrsResourceIdentifiers
+    , srrsResponseStatus
+    ) where
+
+import Network.AWS.Lens
+import Network.AWS.Pager
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.ResourceGroups.Types
+import Network.AWS.ResourceGroups.Types.Product
+import Network.AWS.Response
+
+-- | /See:/ 'searchResources' smart constructor.
+data SearchResources = SearchResources'
+  { _srNextToken     :: !(Maybe Text)
+  , _srMaxResults    :: !(Maybe Nat)
+  , _srResourceQuery :: !ResourceQuery
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'SearchResources' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'srNextToken' - The NextToken value that is returned in a paginated @SearchResources@ request. To get the next page of results, run the call again, add the NextToken parameter, and specify the NextToken value.
+--
+-- * 'srMaxResults' - The maximum number of group member ARNs returned by @SearchResources@ in paginated output. By default, this number is 50.
+--
+-- * 'srResourceQuery' - The search query, using the same formats that are supported for resource group definition.
+searchResources
+    :: ResourceQuery -- ^ 'srResourceQuery'
+    -> SearchResources
+searchResources pResourceQuery_ =
+  SearchResources'
+    { _srNextToken = Nothing
+    , _srMaxResults = Nothing
+    , _srResourceQuery = pResourceQuery_
+    }
+
+
+-- | The NextToken value that is returned in a paginated @SearchResources@ request. To get the next page of results, run the call again, add the NextToken parameter, and specify the NextToken value.
+srNextToken :: Lens' SearchResources (Maybe Text)
+srNextToken = lens _srNextToken (\ s a -> s{_srNextToken = a})
+
+-- | The maximum number of group member ARNs returned by @SearchResources@ in paginated output. By default, this number is 50.
+srMaxResults :: Lens' SearchResources (Maybe Natural)
+srMaxResults = lens _srMaxResults (\ s a -> s{_srMaxResults = a}) . mapping _Nat
+
+-- | The search query, using the same formats that are supported for resource group definition.
+srResourceQuery :: Lens' SearchResources ResourceQuery
+srResourceQuery = lens _srResourceQuery (\ s a -> s{_srResourceQuery = a})
+
+instance AWSPager SearchResources where
+        page rq rs
+          | stop (rs ^. srrsNextToken) = Nothing
+          | stop (rs ^. srrsResourceIdentifiers) = Nothing
+          | otherwise =
+            Just $ rq & srNextToken .~ rs ^. srrsNextToken
+
+instance AWSRequest SearchResources where
+        type Rs SearchResources = SearchResourcesResponse
+        request = postJSON resourceGroups
+        response
+          = receiveJSON
+              (\ s h x ->
+                 SearchResourcesResponse' <$>
+                   (x .?> "NextToken") <*>
+                     (x .?> "ResourceIdentifiers" .!@ mempty)
+                     <*> (pure (fromEnum s)))
+
+instance Hashable SearchResources where
+
+instance NFData SearchResources where
+
+instance ToHeaders SearchResources where
+        toHeaders = const mempty
+
+instance ToJSON SearchResources where
+        toJSON SearchResources'{..}
+          = object
+              (catMaybes
+                 [("NextToken" .=) <$> _srNextToken,
+                  ("MaxResults" .=) <$> _srMaxResults,
+                  Just ("ResourceQuery" .= _srResourceQuery)])
+
+instance ToPath SearchResources where
+        toPath = const "/resources/search"
+
+instance ToQuery SearchResources where
+        toQuery = const mempty
+
+-- | /See:/ 'searchResourcesResponse' smart constructor.
+data SearchResourcesResponse = SearchResourcesResponse'
+  { _srrsNextToken           :: !(Maybe Text)
+  , _srrsResourceIdentifiers :: !(Maybe [ResourceIdentifier])
+  , _srrsResponseStatus      :: !Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'SearchResourcesResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'srrsNextToken' - The NextToken value to include in a subsequent @SearchResources@ request, to get more results.
+--
+-- * 'srrsResourceIdentifiers' - The ARNs and resource types of resources that are members of the group that you specified.
+--
+-- * 'srrsResponseStatus' - -- | The response status code.
+searchResourcesResponse
+    :: Int -- ^ 'srrsResponseStatus'
+    -> SearchResourcesResponse
+searchResourcesResponse pResponseStatus_ =
+  SearchResourcesResponse'
+    { _srrsNextToken = Nothing
+    , _srrsResourceIdentifiers = Nothing
+    , _srrsResponseStatus = pResponseStatus_
+    }
+
+
+-- | The NextToken value to include in a subsequent @SearchResources@ request, to get more results.
+srrsNextToken :: Lens' SearchResourcesResponse (Maybe Text)
+srrsNextToken = lens _srrsNextToken (\ s a -> s{_srrsNextToken = a})
+
+-- | The ARNs and resource types of resources that are members of the group that you specified.
+srrsResourceIdentifiers :: Lens' SearchResourcesResponse [ResourceIdentifier]
+srrsResourceIdentifiers = lens _srrsResourceIdentifiers (\ s a -> s{_srrsResourceIdentifiers = a}) . _Default . _Coerce
+
+-- | -- | The response status code.
+srrsResponseStatus :: Lens' SearchResourcesResponse Int
+srrsResponseStatus = lens _srrsResponseStatus (\ s a -> s{_srrsResponseStatus = a})
+
+instance NFData SearchResourcesResponse where
diff --git a/gen/Network/AWS/ResourceGroups/Tag.hs b/gen/Network/AWS/ResourceGroups/Tag.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ResourceGroups/Tag.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.ResourceGroups.Tag
+-- 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 specified tags to a resource with the specified ARN. Existing tags on a resource are not changed if they are not specified in the request parameters.
+--
+--
+module Network.AWS.ResourceGroups.Tag
+    (
+    -- * Creating a Request
+      tag
+    , Tag
+    -- * Request Lenses
+    , tagARN
+    , tagTags
+
+    -- * Destructuring the Response
+    , tagResponse
+    , TagResponse
+    -- * Response Lenses
+    , tagrsARN
+    , tagrsTags
+    , tagrsResponseStatus
+    ) where
+
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.ResourceGroups.Types
+import Network.AWS.ResourceGroups.Types.Product
+import Network.AWS.Response
+
+-- | /See:/ 'tag' smart constructor.
+data Tag = Tag'
+  { _tagARN  :: !Text
+  , _tagTags :: !(Map Text 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:
+--
+-- * 'tagARN' - The ARN of the resource to which to add tags.
+--
+-- * 'tagTags' - The tags to add to the specified resource. A tag is a string-to-string map of key-value pairs. Tag keys can have a maximum character length of 127 characters, and tag values can have a maximum length of 255 characters.
+tag
+    :: Text -- ^ 'tagARN'
+    -> Tag
+tag pARN_ = Tag' {_tagARN = pARN_, _tagTags = mempty}
+
+
+-- | The ARN of the resource to which to add tags.
+tagARN :: Lens' Tag Text
+tagARN = lens _tagARN (\ s a -> s{_tagARN = a})
+
+-- | The tags to add to the specified resource. A tag is a string-to-string map of key-value pairs. Tag keys can have a maximum character length of 127 characters, and tag values can have a maximum length of 255 characters.
+tagTags :: Lens' Tag (HashMap Text Text)
+tagTags = lens _tagTags (\ s a -> s{_tagTags = a}) . _Map
+
+instance AWSRequest Tag where
+        type Rs Tag = TagResponse
+        request = putJSON resourceGroups
+        response
+          = receiveJSON
+              (\ s h x ->
+                 TagResponse' <$>
+                   (x .?> "Arn") <*> (x .?> "Tags" .!@ mempty) <*>
+                     (pure (fromEnum s)))
+
+instance Hashable Tag where
+
+instance NFData Tag where
+
+instance ToHeaders Tag where
+        toHeaders = const mempty
+
+instance ToJSON Tag where
+        toJSON Tag'{..}
+          = object (catMaybes [Just ("Tags" .= _tagTags)])
+
+instance ToPath Tag where
+        toPath Tag'{..}
+          = mconcat ["/resources/", toBS _tagARN, "/tags"]
+
+instance ToQuery Tag where
+        toQuery = const mempty
+
+-- | /See:/ 'tagResponse' smart constructor.
+data TagResponse = TagResponse'
+  { _tagrsARN            :: !(Maybe Text)
+  , _tagrsTags           :: !(Maybe (Map Text Text))
+  , _tagrsResponseStatus :: !Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'TagResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'tagrsARN' - The ARN of the tagged resource.
+--
+-- * 'tagrsTags' - The tags that have been added to the specified resource.
+--
+-- * 'tagrsResponseStatus' - -- | The response status code.
+tagResponse
+    :: Int -- ^ 'tagrsResponseStatus'
+    -> TagResponse
+tagResponse pResponseStatus_ =
+  TagResponse'
+    { _tagrsARN = Nothing
+    , _tagrsTags = Nothing
+    , _tagrsResponseStatus = pResponseStatus_
+    }
+
+
+-- | The ARN of the tagged resource.
+tagrsARN :: Lens' TagResponse (Maybe Text)
+tagrsARN = lens _tagrsARN (\ s a -> s{_tagrsARN = a})
+
+-- | The tags that have been added to the specified resource.
+tagrsTags :: Lens' TagResponse (HashMap Text Text)
+tagrsTags = lens _tagrsTags (\ s a -> s{_tagrsTags = a}) . _Default . _Map
+
+-- | -- | The response status code.
+tagrsResponseStatus :: Lens' TagResponse Int
+tagrsResponseStatus = lens _tagrsResponseStatus (\ s a -> s{_tagrsResponseStatus = a})
+
+instance NFData TagResponse where
diff --git a/gen/Network/AWS/ResourceGroups/Types.hs b/gen/Network/AWS/ResourceGroups/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ResourceGroups/Types.hs
@@ -0,0 +1,156 @@
+{-# LANGUAGE OverloadedStrings #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.ResourceGroups.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.ResourceGroups.Types
+    (
+    -- * Service Configuration
+      resourceGroups
+
+    -- * Errors
+    , _ForbiddenException
+    , _NotFoundException
+    , _TooManyRequestsException
+    , _InternalServerErrorException
+    , _MethodNotAllowedException
+    , _UnauthorizedException
+    , _BadRequestException
+
+    -- * QueryType
+    , QueryType (..)
+
+    -- * Group
+    , Group
+    , group'
+    , gDescription
+    , gGroupARN
+    , gName
+
+    -- * GroupQuery
+    , GroupQuery
+    , groupQuery
+    , gqGroupName
+    , gqResourceQuery
+
+    -- * ResourceIdentifier
+    , ResourceIdentifier
+    , resourceIdentifier
+    , riResourceType
+    , riResourceARN
+
+    -- * ResourceQuery
+    , ResourceQuery
+    , resourceQuery
+    , rqType
+    , rqSearchQuery
+    ) where
+
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.ResourceGroups.Types.Product
+import Network.AWS.ResourceGroups.Types.Sum
+import Network.AWS.Sign.V4
+
+-- | API version @2017-11-27@ of the Amazon Resource Groups SDK configuration.
+resourceGroups :: Service
+resourceGroups =
+  Service
+    { _svcAbbrev = "ResourceGroups"
+    , _svcSigner = v4
+    , _svcPrefix = "resource-groups"
+    , _svcVersion = "2017-11-27"
+    , _svcEndpoint = defaultEndpoint resourceGroups
+    , _svcTimeout = Just 70
+    , _svcCheck = statusSuccess
+    , _svcError = parseJSONError "ResourceGroups"
+    , _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 caller is not authorized to make the request.
+--
+--
+_ForbiddenException :: AsError a => Getting (First ServiceError) a ServiceError
+_ForbiddenException =
+  _MatchServiceError resourceGroups "ForbiddenException" . hasStatus 403
+
+
+-- | One or more resources specified in the request do not exist.
+--
+--
+_NotFoundException :: AsError a => Getting (First ServiceError) a ServiceError
+_NotFoundException =
+  _MatchServiceError resourceGroups "NotFoundException" . hasStatus 404
+
+
+-- | The caller has exceeded throttling limits.
+--
+--
+_TooManyRequestsException :: AsError a => Getting (First ServiceError) a ServiceError
+_TooManyRequestsException =
+  _MatchServiceError resourceGroups "TooManyRequestsException" . hasStatus 429
+
+
+-- | An internal error occurred while processing the request.
+--
+--
+_InternalServerErrorException :: AsError a => Getting (First ServiceError) a ServiceError
+_InternalServerErrorException =
+  _MatchServiceError resourceGroups "InternalServerErrorException" .
+  hasStatus 500
+
+
+-- | The request uses an HTTP method which is not allowed for the specified resource.
+--
+--
+_MethodNotAllowedException :: AsError a => Getting (First ServiceError) a ServiceError
+_MethodNotAllowedException =
+  _MatchServiceError resourceGroups "MethodNotAllowedException" . hasStatus 405
+
+
+-- | The request has not been applied because it lacks valid authentication credentials for the target resource.
+--
+--
+_UnauthorizedException :: AsError a => Getting (First ServiceError) a ServiceError
+_UnauthorizedException =
+  _MatchServiceError resourceGroups "UnauthorizedException" . hasStatus 401
+
+
+-- | The request does not comply with validation rules that are defined for the request parameters.
+--
+--
+_BadRequestException :: AsError a => Getting (First ServiceError) a ServiceError
+_BadRequestException =
+  _MatchServiceError resourceGroups "BadRequestException" . hasStatus 400
+
diff --git a/gen/Network/AWS/ResourceGroups/Types/Product.hs b/gen/Network/AWS/ResourceGroups/Types/Product.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ResourceGroups/Types/Product.hs
@@ -0,0 +1,214 @@
+{-# 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.ResourceGroups.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.ResourceGroups.Types.Product where
+
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.ResourceGroups.Types.Sum
+
+-- | A resource group.
+--
+--
+--
+-- /See:/ 'group'' smart constructor.
+data Group = Group'
+  { _gDescription :: !(Maybe Text)
+  , _gGroupARN    :: !Text
+  , _gName        :: !Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'Group' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gDescription' - The description of the resource group.
+--
+-- * 'gGroupARN' - The ARN of a resource group.
+--
+-- * 'gName' - The name of a resource group.
+group'
+    :: Text -- ^ 'gGroupARN'
+    -> Text -- ^ 'gName'
+    -> Group
+group' pGroupARN_ pName_ =
+  Group' {_gDescription = Nothing, _gGroupARN = pGroupARN_, _gName = pName_}
+
+
+-- | The description of the resource group.
+gDescription :: Lens' Group (Maybe Text)
+gDescription = lens _gDescription (\ s a -> s{_gDescription = a})
+
+-- | The ARN of a resource group.
+gGroupARN :: Lens' Group Text
+gGroupARN = lens _gGroupARN (\ s a -> s{_gGroupARN = a})
+
+-- | The name of a resource group.
+gName :: Lens' Group Text
+gName = lens _gName (\ s a -> s{_gName = a})
+
+instance FromJSON Group where
+        parseJSON
+          = withObject "Group"
+              (\ x ->
+                 Group' <$>
+                   (x .:? "Description") <*> (x .: "GroupArn") <*>
+                     (x .: "Name"))
+
+instance Hashable Group where
+
+instance NFData Group where
+
+-- | The underlying resource query of a resource group. Resources that match query results are part of the group.
+--
+--
+--
+-- /See:/ 'groupQuery' smart constructor.
+data GroupQuery = GroupQuery'
+  { _gqGroupName     :: !Text
+  , _gqResourceQuery :: !ResourceQuery
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'GroupQuery' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gqGroupName' - The name of a resource group that is associated with a specific resource query.
+--
+-- * 'gqResourceQuery' - The resource query which determines which AWS resources are members of the associated resource group.
+groupQuery
+    :: Text -- ^ 'gqGroupName'
+    -> ResourceQuery -- ^ 'gqResourceQuery'
+    -> GroupQuery
+groupQuery pGroupName_ pResourceQuery_ =
+  GroupQuery' {_gqGroupName = pGroupName_, _gqResourceQuery = pResourceQuery_}
+
+
+-- | The name of a resource group that is associated with a specific resource query.
+gqGroupName :: Lens' GroupQuery Text
+gqGroupName = lens _gqGroupName (\ s a -> s{_gqGroupName = a})
+
+-- | The resource query which determines which AWS resources are members of the associated resource group.
+gqResourceQuery :: Lens' GroupQuery ResourceQuery
+gqResourceQuery = lens _gqResourceQuery (\ s a -> s{_gqResourceQuery = a})
+
+instance FromJSON GroupQuery where
+        parseJSON
+          = withObject "GroupQuery"
+              (\ x ->
+                 GroupQuery' <$>
+                   (x .: "GroupName") <*> (x .: "ResourceQuery"))
+
+instance Hashable GroupQuery where
+
+instance NFData GroupQuery where
+
+-- | The ARN of a resource, and its resource type.
+--
+--
+--
+-- /See:/ 'resourceIdentifier' smart constructor.
+data ResourceIdentifier = ResourceIdentifier'
+  { _riResourceType :: !(Maybe Text)
+  , _riResourceARN  :: !(Maybe Text)
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'ResourceIdentifier' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'riResourceType' - The resource type of a resource, such as @AWS::EC2::Instance@ .
+--
+-- * 'riResourceARN' - The ARN of a resource.
+resourceIdentifier
+    :: ResourceIdentifier
+resourceIdentifier =
+  ResourceIdentifier' {_riResourceType = Nothing, _riResourceARN = Nothing}
+
+
+-- | The resource type of a resource, such as @AWS::EC2::Instance@ .
+riResourceType :: Lens' ResourceIdentifier (Maybe Text)
+riResourceType = lens _riResourceType (\ s a -> s{_riResourceType = a})
+
+-- | The ARN of a resource.
+riResourceARN :: Lens' ResourceIdentifier (Maybe Text)
+riResourceARN = lens _riResourceARN (\ s a -> s{_riResourceARN = a})
+
+instance FromJSON ResourceIdentifier where
+        parseJSON
+          = withObject "ResourceIdentifier"
+              (\ x ->
+                 ResourceIdentifier' <$>
+                   (x .:? "ResourceType") <*> (x .:? "ResourceArn"))
+
+instance Hashable ResourceIdentifier where
+
+instance NFData ResourceIdentifier where
+
+-- | The query that is used to define a resource group or a search for resources.
+--
+--
+--
+-- /See:/ 'resourceQuery' smart constructor.
+data ResourceQuery = ResourceQuery'
+  { _rqType        :: !QueryType
+  , _rqSearchQuery :: !Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'ResourceQuery' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'rqType' - The type of the query. The valid value in this release is @TAG_FILTERS_1_0@ . /@TAG_FILTERS_1_0:@ / A JSON syntax that lets you specify a collection of simple tag filters for resource types and tags, as supported by the AWS Tagging API GetResources operation. When more than one element is present, only resources that match all filters are part of the result. If a filter specifies more than one value for a key, a resource matches the filter if its tag value matches any of the specified values.
+--
+-- * 'rqSearchQuery' - The query that defines a group or a search.
+resourceQuery
+    :: QueryType -- ^ 'rqType'
+    -> Text -- ^ 'rqSearchQuery'
+    -> ResourceQuery
+resourceQuery pType_ pSearchQuery_ =
+  ResourceQuery' {_rqType = pType_, _rqSearchQuery = pSearchQuery_}
+
+
+-- | The type of the query. The valid value in this release is @TAG_FILTERS_1_0@ . /@TAG_FILTERS_1_0:@ / A JSON syntax that lets you specify a collection of simple tag filters for resource types and tags, as supported by the AWS Tagging API GetResources operation. When more than one element is present, only resources that match all filters are part of the result. If a filter specifies more than one value for a key, a resource matches the filter if its tag value matches any of the specified values.
+rqType :: Lens' ResourceQuery QueryType
+rqType = lens _rqType (\ s a -> s{_rqType = a})
+
+-- | The query that defines a group or a search.
+rqSearchQuery :: Lens' ResourceQuery Text
+rqSearchQuery = lens _rqSearchQuery (\ s a -> s{_rqSearchQuery = a})
+
+instance FromJSON ResourceQuery where
+        parseJSON
+          = withObject "ResourceQuery"
+              (\ x ->
+                 ResourceQuery' <$> (x .: "Type") <*> (x .: "Query"))
+
+instance Hashable ResourceQuery where
+
+instance NFData ResourceQuery where
+
+instance ToJSON ResourceQuery where
+        toJSON ResourceQuery'{..}
+          = object
+              (catMaybes
+                 [Just ("Type" .= _rqType),
+                  Just ("Query" .= _rqSearchQuery)])
diff --git a/gen/Network/AWS/ResourceGroups/Types/Sum.hs b/gen/Network/AWS/ResourceGroups/Types/Sum.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ResourceGroups/Types/Sum.hs
@@ -0,0 +1,47 @@
+{-# 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.ResourceGroups.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.ResourceGroups.Types.Sum where
+
+import Network.AWS.Prelude
+
+data QueryType =
+  TagFilters10
+  deriving (Eq, Ord, Read, Show, Enum, Bounded, Data, Typeable, Generic)
+
+
+instance FromText QueryType where
+    parser = takeLowerText >>= \case
+        "tag_filters_1_0" -> pure TagFilters10
+        e -> fromTextError $ "Failure parsing QueryType from value: '" <> e
+           <> "'. Accepted values: tag_filters_1_0"
+
+instance ToText QueryType where
+    toText = \case
+        TagFilters10 -> "TAG_FILTERS_1_0"
+
+instance Hashable     QueryType
+instance NFData       QueryType
+instance ToByteString QueryType
+instance ToQuery      QueryType
+instance ToHeader     QueryType
+
+instance ToJSON QueryType where
+    toJSON = toJSONText
+
+instance FromJSON QueryType where
+    parseJSON = parseJSONText "QueryType"
diff --git a/gen/Network/AWS/ResourceGroups/Untag.hs b/gen/Network/AWS/ResourceGroups/Untag.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ResourceGroups/Untag.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.ResourceGroups.Untag
+-- 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 specified tags from a specified resource.
+--
+--
+module Network.AWS.ResourceGroups.Untag
+    (
+    -- * Creating a Request
+      untag
+    , Untag
+    -- * Request Lenses
+    , uARN
+    , uKeys
+
+    -- * Destructuring the Response
+    , untagResponse
+    , UntagResponse
+    -- * Response Lenses
+    , ursARN
+    , ursKeys
+    , ursResponseStatus
+    ) where
+
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.ResourceGroups.Types
+import Network.AWS.ResourceGroups.Types.Product
+import Network.AWS.Response
+
+-- | /See:/ 'untag' smart constructor.
+data Untag = Untag'
+  { _uARN  :: !Text
+  , _uKeys :: ![Text]
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'Untag' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'uARN' - The ARN of the resource from which to remove tags.
+--
+-- * 'uKeys' - The keys of the tags to be removed.
+untag
+    :: Text -- ^ 'uARN'
+    -> Untag
+untag pARN_ = Untag' {_uARN = pARN_, _uKeys = mempty}
+
+
+-- | The ARN of the resource from which to remove tags.
+uARN :: Lens' Untag Text
+uARN = lens _uARN (\ s a -> s{_uARN = a})
+
+-- | The keys of the tags to be removed.
+uKeys :: Lens' Untag [Text]
+uKeys = lens _uKeys (\ s a -> s{_uKeys = a}) . _Coerce
+
+instance AWSRequest Untag where
+        type Rs Untag = UntagResponse
+        request = patchJSON resourceGroups
+        response
+          = receiveJSON
+              (\ s h x ->
+                 UntagResponse' <$>
+                   (x .?> "Arn") <*> (x .?> "Keys" .!@ mempty) <*>
+                     (pure (fromEnum s)))
+
+instance Hashable Untag where
+
+instance NFData Untag where
+
+instance ToHeaders Untag where
+        toHeaders = const mempty
+
+instance ToJSON Untag where
+        toJSON Untag'{..}
+          = object (catMaybes [Just ("Keys" .= _uKeys)])
+
+instance ToPath Untag where
+        toPath Untag'{..}
+          = mconcat ["/resources/", toBS _uARN, "/tags"]
+
+instance ToQuery Untag where
+        toQuery = const mempty
+
+-- | /See:/ 'untagResponse' smart constructor.
+data UntagResponse = UntagResponse'
+  { _ursARN            :: !(Maybe Text)
+  , _ursKeys           :: !(Maybe [Text])
+  , _ursResponseStatus :: !Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'UntagResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ursARN' - The ARN of the resource from which tags have been removed.
+--
+-- * 'ursKeys' - The keys of tags that have been removed.
+--
+-- * 'ursResponseStatus' - -- | The response status code.
+untagResponse
+    :: Int -- ^ 'ursResponseStatus'
+    -> UntagResponse
+untagResponse pResponseStatus_ =
+  UntagResponse'
+    { _ursARN = Nothing
+    , _ursKeys = Nothing
+    , _ursResponseStatus = pResponseStatus_
+    }
+
+
+-- | The ARN of the resource from which tags have been removed.
+ursARN :: Lens' UntagResponse (Maybe Text)
+ursARN = lens _ursARN (\ s a -> s{_ursARN = a})
+
+-- | The keys of tags that have been removed.
+ursKeys :: Lens' UntagResponse [Text]
+ursKeys = lens _ursKeys (\ s a -> s{_ursKeys = a}) . _Default . _Coerce
+
+-- | -- | The response status code.
+ursResponseStatus :: Lens' UntagResponse Int
+ursResponseStatus = lens _ursResponseStatus (\ s a -> s{_ursResponseStatus = a})
+
+instance NFData UntagResponse where
diff --git a/gen/Network/AWS/ResourceGroups/UpdateGroup.hs b/gen/Network/AWS/ResourceGroups/UpdateGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ResourceGroups/UpdateGroup.hs
@@ -0,0 +1,135 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.ResourceGroups.UpdateGroup
+-- 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 group with a new or changed description. You cannot update the name of a resource group.
+--
+--
+module Network.AWS.ResourceGroups.UpdateGroup
+    (
+    -- * Creating a Request
+      updateGroup
+    , UpdateGroup
+    -- * Request Lenses
+    , ugDescription
+    , ugGroupName
+
+    -- * Destructuring the Response
+    , updateGroupResponse
+    , UpdateGroupResponse
+    -- * Response Lenses
+    , ugrsGroup
+    , ugrsResponseStatus
+    ) where
+
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.ResourceGroups.Types
+import Network.AWS.ResourceGroups.Types.Product
+import Network.AWS.Response
+
+-- | /See:/ 'updateGroup' smart constructor.
+data UpdateGroup = UpdateGroup'
+  { _ugDescription :: !(Maybe Text)
+  , _ugGroupName   :: !Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'UpdateGroup' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ugDescription' - The description of the resource group. Descriptions can have a maximum of 511 characters, including letters, numbers, hyphens, underscores, punctuation, and spaces.
+--
+-- * 'ugGroupName' - The name of the resource group for which you want to update its description.
+updateGroup
+    :: Text -- ^ 'ugGroupName'
+    -> UpdateGroup
+updateGroup pGroupName_ =
+  UpdateGroup' {_ugDescription = Nothing, _ugGroupName = pGroupName_}
+
+
+-- | The description of the resource group. Descriptions can have a maximum of 511 characters, including letters, numbers, hyphens, underscores, punctuation, and spaces.
+ugDescription :: Lens' UpdateGroup (Maybe Text)
+ugDescription = lens _ugDescription (\ s a -> s{_ugDescription = a})
+
+-- | The name of the resource group for which you want to update its description.
+ugGroupName :: Lens' UpdateGroup Text
+ugGroupName = lens _ugGroupName (\ s a -> s{_ugGroupName = a})
+
+instance AWSRequest UpdateGroup where
+        type Rs UpdateGroup = UpdateGroupResponse
+        request = putJSON resourceGroups
+        response
+          = receiveJSON
+              (\ s h x ->
+                 UpdateGroupResponse' <$>
+                   (x .?> "Group") <*> (pure (fromEnum s)))
+
+instance Hashable UpdateGroup where
+
+instance NFData UpdateGroup where
+
+instance ToHeaders UpdateGroup where
+        toHeaders = const mempty
+
+instance ToJSON UpdateGroup where
+        toJSON UpdateGroup'{..}
+          = object
+              (catMaybes [("Description" .=) <$> _ugDescription])
+
+instance ToPath UpdateGroup where
+        toPath UpdateGroup'{..}
+          = mconcat ["/groups/", toBS _ugGroupName]
+
+instance ToQuery UpdateGroup where
+        toQuery = const mempty
+
+-- | /See:/ 'updateGroupResponse' smart constructor.
+data UpdateGroupResponse = UpdateGroupResponse'
+  { _ugrsGroup          :: !(Maybe Group)
+  , _ugrsResponseStatus :: !Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'UpdateGroupResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ugrsGroup' - The full description of the resource group after it has been updated.
+--
+-- * 'ugrsResponseStatus' - -- | The response status code.
+updateGroupResponse
+    :: Int -- ^ 'ugrsResponseStatus'
+    -> UpdateGroupResponse
+updateGroupResponse pResponseStatus_ =
+  UpdateGroupResponse'
+    {_ugrsGroup = Nothing, _ugrsResponseStatus = pResponseStatus_}
+
+
+-- | The full description of the resource group after it has been updated.
+ugrsGroup :: Lens' UpdateGroupResponse (Maybe Group)
+ugrsGroup = lens _ugrsGroup (\ s a -> s{_ugrsGroup = a})
+
+-- | -- | The response status code.
+ugrsResponseStatus :: Lens' UpdateGroupResponse Int
+ugrsResponseStatus = lens _ugrsResponseStatus (\ s a -> s{_ugrsResponseStatus = a})
+
+instance NFData UpdateGroupResponse where
diff --git a/gen/Network/AWS/ResourceGroups/UpdateGroupQuery.hs b/gen/Network/AWS/ResourceGroups/UpdateGroupQuery.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ResourceGroups/UpdateGroupQuery.hs
@@ -0,0 +1,138 @@
+{-# 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.ResourceGroups.UpdateGroupQuery
+-- 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 resource query of a group.
+--
+--
+module Network.AWS.ResourceGroups.UpdateGroupQuery
+    (
+    -- * Creating a Request
+      updateGroupQuery
+    , UpdateGroupQuery
+    -- * Request Lenses
+    , ugqGroupName
+    , ugqResourceQuery
+
+    -- * Destructuring the Response
+    , updateGroupQueryResponse
+    , UpdateGroupQueryResponse
+    -- * Response Lenses
+    , ugqrsGroupQuery
+    , ugqrsResponseStatus
+    ) where
+
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.ResourceGroups.Types
+import Network.AWS.ResourceGroups.Types.Product
+import Network.AWS.Response
+
+-- | /See:/ 'updateGroupQuery' smart constructor.
+data UpdateGroupQuery = UpdateGroupQuery'
+  { _ugqGroupName     :: !Text
+  , _ugqResourceQuery :: !ResourceQuery
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'UpdateGroupQuery' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ugqGroupName' - The name of the resource group for which you want to edit the query.
+--
+-- * 'ugqResourceQuery' - The resource query that determines which AWS resources are members of the resource group.
+updateGroupQuery
+    :: Text -- ^ 'ugqGroupName'
+    -> ResourceQuery -- ^ 'ugqResourceQuery'
+    -> UpdateGroupQuery
+updateGroupQuery pGroupName_ pResourceQuery_ =
+  UpdateGroupQuery'
+    {_ugqGroupName = pGroupName_, _ugqResourceQuery = pResourceQuery_}
+
+
+-- | The name of the resource group for which you want to edit the query.
+ugqGroupName :: Lens' UpdateGroupQuery Text
+ugqGroupName = lens _ugqGroupName (\ s a -> s{_ugqGroupName = a})
+
+-- | The resource query that determines which AWS resources are members of the resource group.
+ugqResourceQuery :: Lens' UpdateGroupQuery ResourceQuery
+ugqResourceQuery = lens _ugqResourceQuery (\ s a -> s{_ugqResourceQuery = a})
+
+instance AWSRequest UpdateGroupQuery where
+        type Rs UpdateGroupQuery = UpdateGroupQueryResponse
+        request = putJSON resourceGroups
+        response
+          = receiveJSON
+              (\ s h x ->
+                 UpdateGroupQueryResponse' <$>
+                   (x .?> "GroupQuery") <*> (pure (fromEnum s)))
+
+instance Hashable UpdateGroupQuery where
+
+instance NFData UpdateGroupQuery where
+
+instance ToHeaders UpdateGroupQuery where
+        toHeaders = const mempty
+
+instance ToJSON UpdateGroupQuery where
+        toJSON UpdateGroupQuery'{..}
+          = object
+              (catMaybes
+                 [Just ("ResourceQuery" .= _ugqResourceQuery)])
+
+instance ToPath UpdateGroupQuery where
+        toPath UpdateGroupQuery'{..}
+          = mconcat ["/groups/", toBS _ugqGroupName, "/query"]
+
+instance ToQuery UpdateGroupQuery where
+        toQuery = const mempty
+
+-- | /See:/ 'updateGroupQueryResponse' smart constructor.
+data UpdateGroupQueryResponse = UpdateGroupQueryResponse'
+  { _ugqrsGroupQuery     :: !(Maybe GroupQuery)
+  , _ugqrsResponseStatus :: !Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'UpdateGroupQueryResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ugqrsGroupQuery' - The resource query associated with the resource group after the update.
+--
+-- * 'ugqrsResponseStatus' - -- | The response status code.
+updateGroupQueryResponse
+    :: Int -- ^ 'ugqrsResponseStatus'
+    -> UpdateGroupQueryResponse
+updateGroupQueryResponse pResponseStatus_ =
+  UpdateGroupQueryResponse'
+    {_ugqrsGroupQuery = Nothing, _ugqrsResponseStatus = pResponseStatus_}
+
+
+-- | The resource query associated with the resource group after the update.
+ugqrsGroupQuery :: Lens' UpdateGroupQueryResponse (Maybe GroupQuery)
+ugqrsGroupQuery = lens _ugqrsGroupQuery (\ s a -> s{_ugqrsGroupQuery = a})
+
+-- | -- | The response status code.
+ugqrsResponseStatus :: Lens' UpdateGroupQueryResponse Int
+ugqrsResponseStatus = lens _ugqrsResponseStatus (\ s a -> s{_ugqrsResponseStatus = a})
+
+instance NFData UpdateGroupQueryResponse where
diff --git a/gen/Network/AWS/ResourceGroups/Waiters.hs b/gen/Network/AWS/ResourceGroups/Waiters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ResourceGroups/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.ResourceGroups.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.ResourceGroups.Waiters where
+
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.ResourceGroups.Types
+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.ResourceGroups
+import Test.AWS.ResourceGroups.Internal
+
+main :: IO ()
+main = defaultMain $ testGroup "ResourceGroups"
+    [ testGroup "tests"    tests
+    , testGroup "fixtures" fixtures
+    ]
diff --git a/test/Test/AWS/Gen/ResourceGroups.hs b/test/Test/AWS/Gen/ResourceGroups.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/AWS/Gen/ResourceGroups.hs
@@ -0,0 +1,255 @@
+{-# 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.ResourceGroups
+-- 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.ResourceGroups where
+
+import Data.Proxy
+import Network.AWS.ResourceGroups
+import Test.AWS.Fixture
+import Test.AWS.Prelude
+import Test.AWS.ResourceGroups.Internal
+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"
+--         [ requestSearchResources $
+--             searchResources
+--
+--         , requestGetTags $
+--             getTags
+--
+--         , requestTag $
+--             tag
+--
+--         , requestUntag $
+--             untag
+--
+--         , requestUpdateGroupQuery $
+--             updateGroupQuery
+--
+--         , requestListGroupResources $
+--             listGroupResources
+--
+--         , requestGetGroupQuery $
+--             getGroupQuery
+--
+--         , requestCreateGroup $
+--             createGroup
+--
+--         , requestDeleteGroup $
+--             deleteGroup
+--
+--         , requestUpdateGroup $
+--             updateGroup
+--
+--         , requestListGroups $
+--             listGroups
+--
+--         , requestGetGroup $
+--             getGroup
+--
+--           ]
+
+--     , testGroup "response"
+--         [ responseSearchResources $
+--             searchResourcesResponse
+--
+--         , responseGetTags $
+--             getTagsResponse
+--
+--         , responseTag $
+--             tagResponse
+--
+--         , responseUntag $
+--             untagResponse
+--
+--         , responseUpdateGroupQuery $
+--             updateGroupQueryResponse
+--
+--         , responseListGroupResources $
+--             listGroupResourcesResponse
+--
+--         , responseGetGroupQuery $
+--             getGroupQueryResponse
+--
+--         , responseCreateGroup $
+--             createGroupResponse
+--
+--         , responseDeleteGroup $
+--             deleteGroupResponse
+--
+--         , responseUpdateGroup $
+--             updateGroupResponse
+--
+--         , responseListGroups $
+--             listGroupsResponse
+--
+--         , responseGetGroup $
+--             getGroupResponse
+--
+--           ]
+--     ]
+
+-- Requests
+
+requestSearchResources :: SearchResources -> TestTree
+requestSearchResources = req
+    "SearchResources"
+    "fixture/SearchResources.yaml"
+
+requestGetTags :: GetTags -> TestTree
+requestGetTags = req
+    "GetTags"
+    "fixture/GetTags.yaml"
+
+requestTag :: Tag -> TestTree
+requestTag = req
+    "Tag"
+    "fixture/Tag.yaml"
+
+requestUntag :: Untag -> TestTree
+requestUntag = req
+    "Untag"
+    "fixture/Untag.yaml"
+
+requestUpdateGroupQuery :: UpdateGroupQuery -> TestTree
+requestUpdateGroupQuery = req
+    "UpdateGroupQuery"
+    "fixture/UpdateGroupQuery.yaml"
+
+requestListGroupResources :: ListGroupResources -> TestTree
+requestListGroupResources = req
+    "ListGroupResources"
+    "fixture/ListGroupResources.yaml"
+
+requestGetGroupQuery :: GetGroupQuery -> TestTree
+requestGetGroupQuery = req
+    "GetGroupQuery"
+    "fixture/GetGroupQuery.yaml"
+
+requestCreateGroup :: CreateGroup -> TestTree
+requestCreateGroup = req
+    "CreateGroup"
+    "fixture/CreateGroup.yaml"
+
+requestDeleteGroup :: DeleteGroup -> TestTree
+requestDeleteGroup = req
+    "DeleteGroup"
+    "fixture/DeleteGroup.yaml"
+
+requestUpdateGroup :: UpdateGroup -> TestTree
+requestUpdateGroup = req
+    "UpdateGroup"
+    "fixture/UpdateGroup.yaml"
+
+requestListGroups :: ListGroups -> TestTree
+requestListGroups = req
+    "ListGroups"
+    "fixture/ListGroups.yaml"
+
+requestGetGroup :: GetGroup -> TestTree
+requestGetGroup = req
+    "GetGroup"
+    "fixture/GetGroup.yaml"
+
+-- Responses
+
+responseSearchResources :: SearchResourcesResponse -> TestTree
+responseSearchResources = res
+    "SearchResourcesResponse"
+    "fixture/SearchResourcesResponse.proto"
+    resourceGroups
+    (Proxy :: Proxy SearchResources)
+
+responseGetTags :: GetTagsResponse -> TestTree
+responseGetTags = res
+    "GetTagsResponse"
+    "fixture/GetTagsResponse.proto"
+    resourceGroups
+    (Proxy :: Proxy GetTags)
+
+responseTag :: TagResponse -> TestTree
+responseTag = res
+    "TagResponse"
+    "fixture/TagResponse.proto"
+    resourceGroups
+    (Proxy :: Proxy Tag)
+
+responseUntag :: UntagResponse -> TestTree
+responseUntag = res
+    "UntagResponse"
+    "fixture/UntagResponse.proto"
+    resourceGroups
+    (Proxy :: Proxy Untag)
+
+responseUpdateGroupQuery :: UpdateGroupQueryResponse -> TestTree
+responseUpdateGroupQuery = res
+    "UpdateGroupQueryResponse"
+    "fixture/UpdateGroupQueryResponse.proto"
+    resourceGroups
+    (Proxy :: Proxy UpdateGroupQuery)
+
+responseListGroupResources :: ListGroupResourcesResponse -> TestTree
+responseListGroupResources = res
+    "ListGroupResourcesResponse"
+    "fixture/ListGroupResourcesResponse.proto"
+    resourceGroups
+    (Proxy :: Proxy ListGroupResources)
+
+responseGetGroupQuery :: GetGroupQueryResponse -> TestTree
+responseGetGroupQuery = res
+    "GetGroupQueryResponse"
+    "fixture/GetGroupQueryResponse.proto"
+    resourceGroups
+    (Proxy :: Proxy GetGroupQuery)
+
+responseCreateGroup :: CreateGroupResponse -> TestTree
+responseCreateGroup = res
+    "CreateGroupResponse"
+    "fixture/CreateGroupResponse.proto"
+    resourceGroups
+    (Proxy :: Proxy CreateGroup)
+
+responseDeleteGroup :: DeleteGroupResponse -> TestTree
+responseDeleteGroup = res
+    "DeleteGroupResponse"
+    "fixture/DeleteGroupResponse.proto"
+    resourceGroups
+    (Proxy :: Proxy DeleteGroup)
+
+responseUpdateGroup :: UpdateGroupResponse -> TestTree
+responseUpdateGroup = res
+    "UpdateGroupResponse"
+    "fixture/UpdateGroupResponse.proto"
+    resourceGroups
+    (Proxy :: Proxy UpdateGroup)
+
+responseListGroups :: ListGroupsResponse -> TestTree
+responseListGroups = res
+    "ListGroupsResponse"
+    "fixture/ListGroupsResponse.proto"
+    resourceGroups
+    (Proxy :: Proxy ListGroups)
+
+responseGetGroup :: GetGroupResponse -> TestTree
+responseGetGroup = res
+    "GetGroupResponse"
+    "fixture/GetGroupResponse.proto"
+    resourceGroups
+    (Proxy :: Proxy GetGroup)
diff --git a/test/Test/AWS/ResourceGroups.hs b/test/Test/AWS/ResourceGroups.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/AWS/ResourceGroups.hs
@@ -0,0 +1,20 @@
+-- |
+-- Module      : Test.AWS.ResourceGroups
+-- 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.ResourceGroups
+    ( tests
+    , fixtures
+    ) where
+
+import Test.Tasty (TestTree)
+
+tests :: [TestTree]
+tests = []
+
+fixtures :: [TestTree]
+fixtures = []
diff --git a/test/Test/AWS/ResourceGroups/Internal.hs b/test/Test/AWS/ResourceGroups/Internal.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/AWS/ResourceGroups/Internal.hs
@@ -0,0 +1,9 @@
+-- |
+-- Module      : Test.AWS.ResourceGroups.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.ResourceGroups.Internal where
