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,28 @@
+# gogol-cloudiot
+
+* [Version](#version)
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+
+## Version
+
+`0.3.0`
+
+
+## Description
+
+A client library for the Google Cloud IoT.
+
+
+## Contribute
+
+For any problems, comments, or feedback please create an issue [here on GitHub](https://github.com/brendanhay/gogol/issues).
+
+> _Note:_ this library is an auto-generated Haskell package. Please see `gogol-gen` for more information.
+
+
+## Licence
+
+`gogol-cloudiot` is released under the [Mozilla Public License Version 2.0](http://www.mozilla.org/MPL/).
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/gen/Network/Google/CloudIOT.hs b/gen/Network/Google/CloudIOT.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/CloudIOT.hs
@@ -0,0 +1,475 @@
+{-# LANGUAGE DataKinds         #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE TypeOperators     #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+
+-- |
+-- Module      : Network.Google.CloudIOT
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Registers and manages IoT (Internet of Things) devices that connect to
+-- the Google Cloud Platform.
+--
+-- /See:/ <https://cloud.google.com/iot Cloud IoT API Reference>
+module Network.Google.CloudIOT
+    (
+    -- * Service Configuration
+      cloudIOTService
+
+    -- * OAuth Scopes
+    , cloudIOTScope
+    , cloudPlatformScope
+
+    -- * API Declaration
+    , CloudIOTAPI
+
+    -- * Resources
+
+    -- ** cloudiot.projects.locations.registries.bindDeviceToGateway
+    , module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.BindDeviceToGateway
+
+    -- ** cloudiot.projects.locations.registries.create
+    , module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Create
+
+    -- ** cloudiot.projects.locations.registries.delete
+    , module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Delete
+
+    -- ** cloudiot.projects.locations.registries.devices.configVersions.list
+    , module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Devices.ConfigVersions.List
+
+    -- ** cloudiot.projects.locations.registries.devices.create
+    , module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Devices.Create
+
+    -- ** cloudiot.projects.locations.registries.devices.delete
+    , module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Devices.Delete
+
+    -- ** cloudiot.projects.locations.registries.devices.get
+    , module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Devices.Get
+
+    -- ** cloudiot.projects.locations.registries.devices.list
+    , module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Devices.List
+
+    -- ** cloudiot.projects.locations.registries.devices.modifyCloudToDeviceConfig
+    , module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Devices.ModifyCloudToDeviceConfig
+
+    -- ** cloudiot.projects.locations.registries.devices.patch
+    , module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Devices.Patch
+
+    -- ** cloudiot.projects.locations.registries.devices.sendCommandToDevice
+    , module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Devices.SendCommandToDevice
+
+    -- ** cloudiot.projects.locations.registries.devices.states.list
+    , module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Devices.States.List
+
+    -- ** cloudiot.projects.locations.registries.get
+    , module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Get
+
+    -- ** cloudiot.projects.locations.registries.getIamPolicy
+    , module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.GetIAMPolicy
+
+    -- ** cloudiot.projects.locations.registries.groups.bindDeviceToGateway
+    , module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.BindDeviceToGateway
+
+    -- ** cloudiot.projects.locations.registries.groups.devices.configVersions.list
+    , module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.Devices.ConfigVersions.List
+
+    -- ** cloudiot.projects.locations.registries.groups.devices.get
+    , module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.Devices.Get
+
+    -- ** cloudiot.projects.locations.registries.groups.devices.list
+    , module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.Devices.List
+
+    -- ** cloudiot.projects.locations.registries.groups.devices.modifyCloudToDeviceConfig
+    , module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.Devices.ModifyCloudToDeviceConfig
+
+    -- ** cloudiot.projects.locations.registries.groups.devices.patch
+    , module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.Devices.Patch
+
+    -- ** cloudiot.projects.locations.registries.groups.devices.sendCommandToDevice
+    , module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.Devices.SendCommandToDevice
+
+    -- ** cloudiot.projects.locations.registries.groups.devices.states.list
+    , module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.Devices.States.List
+
+    -- ** cloudiot.projects.locations.registries.groups.getIamPolicy
+    , module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.GetIAMPolicy
+
+    -- ** cloudiot.projects.locations.registries.groups.setIamPolicy
+    , module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.SetIAMPolicy
+
+    -- ** cloudiot.projects.locations.registries.groups.testIamPermissions
+    , module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.TestIAMPermissions
+
+    -- ** cloudiot.projects.locations.registries.groups.unbindDeviceFromGateway
+    , module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.UnbindDeviceFromGateway
+
+    -- ** cloudiot.projects.locations.registries.list
+    , module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.List
+
+    -- ** cloudiot.projects.locations.registries.patch
+    , module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Patch
+
+    -- ** cloudiot.projects.locations.registries.setIamPolicy
+    , module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.SetIAMPolicy
+
+    -- ** cloudiot.projects.locations.registries.testIamPermissions
+    , module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.TestIAMPermissions
+
+    -- ** cloudiot.projects.locations.registries.unbindDeviceFromGateway
+    , module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.UnbindDeviceFromGateway
+
+    -- * Types
+
+    -- ** Status
+    , Status
+    , status
+    , sDetails
+    , sCode
+    , sMessage
+
+    -- ** UnbindDeviceFromGatewayResponse
+    , UnbindDeviceFromGatewayResponse
+    , unbindDeviceFromGatewayResponse
+
+    -- ** DeviceState
+    , DeviceState
+    , deviceState
+    , dsUpdateTime
+    , dsBinaryData
+
+    -- ** Expr
+    , Expr
+    , expr
+    , eLocation
+    , eExpression
+    , eTitle
+    , eDescription
+
+    -- ** GetIAMPolicyRequest
+    , GetIAMPolicyRequest
+    , getIAMPolicyRequest
+
+    -- ** ListDeviceRegistriesResponse
+    , ListDeviceRegistriesResponse
+    , listDeviceRegistriesResponse
+    , ldrrNextPageToken
+    , ldrrDeviceRegistries
+
+    -- ** DeviceConfig
+    , DeviceConfig
+    , deviceConfig
+    , dcDeviceAckTime
+    , dcCloudUpdateTime
+    , dcBinaryData
+    , dcVersion
+
+    -- ** ListDeviceConfigVersionsResponse
+    , ListDeviceConfigVersionsResponse
+    , listDeviceConfigVersionsResponse
+    , ldcvrDeviceConfigs
+
+    -- ** DeviceLogLevel
+    , DeviceLogLevel (..)
+
+    -- ** GatewayConfig
+    , GatewayConfig
+    , gatewayConfig
+    , gcLastAccessedGatewayId
+    , gcGatewayAuthMethod
+    , gcLastAccessedGatewayTime
+    , gcGatewayType
+
+    -- ** ListDeviceStatesResponse
+    , ListDeviceStatesResponse
+    , listDeviceStatesResponse
+    , ldsrDeviceStates
+
+    -- ** Empty
+    , Empty
+    , empty
+
+    -- ** StateNotificationConfig
+    , StateNotificationConfig
+    , stateNotificationConfig
+    , sncPubsubTopicName
+
+    -- ** PublicKeyCertificateFormat
+    , PublicKeyCertificateFormat (..)
+
+    -- ** Device
+    , Device
+    , device
+    , dState
+    , dLastHeartbeatTime
+    , dGatewayConfig
+    , dLogLevel
+    , dConfig
+    , dCredentials
+    , dNumId
+    , dLastErrorStatus
+    , dLastConfigSendTime
+    , dLastConfigAckTime
+    , dName
+    , dLastErrorTime
+    , dMetadata
+    , dId
+    , dLastStateTime
+    , dBlocked
+    , dLastEventTime
+
+    -- ** DeviceCredential
+    , DeviceCredential
+    , deviceCredential
+    , dcPublicKey
+    , dcExpirationTime
+
+    -- ** EventNotificationConfig
+    , EventNotificationConfig
+    , eventNotificationConfig
+    , encPubsubTopicName
+    , encSubfolderMatches
+
+    -- ** X509CertificateDetails
+    , X509CertificateDetails
+    , x509CertificateDetails
+    , xcdSubject
+    , xcdExpiryTime
+    , xcdStartTime
+    , xcdSignatureAlgorithm
+    , xcdIssuer
+    , xcdPublicKeyType
+
+    -- ** PublicKeyCertificate
+    , PublicKeyCertificate
+    , publicKeyCertificate
+    , pkcFormat
+    , pkcCertificate
+    , pkcX509Details
+
+    -- ** StatusDetailsItem
+    , StatusDetailsItem
+    , statusDetailsItem
+    , sdiAddtional
+
+    -- ** PublicKeyCredentialFormat
+    , PublicKeyCredentialFormat (..)
+
+    -- ** MqttConfig
+    , MqttConfig
+    , mqttConfig
+    , mcMqttEnabledState
+
+    -- ** SetIAMPolicyRequest
+    , SetIAMPolicyRequest
+    , setIAMPolicyRequest
+    , siprPolicy
+
+    -- ** RegistryCredential
+    , RegistryCredential
+    , registryCredential
+    , rcPublicKeyCertificate
+
+    -- ** SendCommandToDeviceRequest
+    , SendCommandToDeviceRequest
+    , sendCommandToDeviceRequest
+    , sctdrBinaryData
+    , sctdrSubfolder
+
+    -- ** BindDeviceToGatewayResponse
+    , BindDeviceToGatewayResponse
+    , bindDeviceToGatewayResponse
+
+    -- ** DeviceRegistryLogLevel
+    , DeviceRegistryLogLevel (..)
+
+    -- ** HTTPConfig
+    , HTTPConfig
+    , hTTPConfig
+    , httpcHTTPEnabledState
+
+    -- ** Xgafv
+    , Xgafv (..)
+
+    -- ** TestIAMPermissionsRequest
+    , TestIAMPermissionsRequest
+    , testIAMPermissionsRequest
+    , tiprPermissions
+
+    -- ** GatewayConfigGatewayType
+    , GatewayConfigGatewayType (..)
+
+    -- ** ListDevicesResponse
+    , ListDevicesResponse
+    , listDevicesResponse
+    , ldrNextPageToken
+    , ldrDevices
+
+    -- ** DeviceMetadata
+    , DeviceMetadata
+    , deviceMetadata
+    , dmAddtional
+
+    -- ** GatewayConfigGatewayAuthMethod
+    , GatewayConfigGatewayAuthMethod (..)
+
+    -- ** DeviceRegistry
+    , DeviceRegistry
+    , deviceRegistry
+    , drLogLevel
+    , drCredentials
+    , drStateNotificationConfig
+    , drEventNotificationConfigs
+    , drMqttConfig
+    , drName
+    , drHTTPConfig
+    , drId
+
+    -- ** PublicKeyCredential
+    , PublicKeyCredential
+    , publicKeyCredential
+    , pFormat
+    , pKey
+
+    -- ** UnbindDeviceFromGatewayRequest
+    , UnbindDeviceFromGatewayRequest
+    , unbindDeviceFromGatewayRequest
+    , udfgrDeviceId
+    , udfgrGatewayId
+
+    -- ** MqttConfigMqttEnabledState
+    , MqttConfigMqttEnabledState (..)
+
+    -- ** TestIAMPermissionsResponse
+    , TestIAMPermissionsResponse
+    , testIAMPermissionsResponse
+    , tiamprPermissions
+
+    -- ** Policy
+    , Policy
+    , policy
+    , pEtag
+    , pVersion
+    , pBindings
+
+    -- ** HTTPConfigHTTPEnabledState
+    , HTTPConfigHTTPEnabledState (..)
+
+    -- ** SendCommandToDeviceResponse
+    , SendCommandToDeviceResponse
+    , sendCommandToDeviceResponse
+
+    -- ** BindDeviceToGatewayRequest
+    , BindDeviceToGatewayRequest
+    , bindDeviceToGatewayRequest
+    , bdtgrDeviceId
+    , bdtgrGatewayId
+
+    -- ** ModifyCloudToDeviceConfigRequest
+    , ModifyCloudToDeviceConfigRequest
+    , modifyCloudToDeviceConfigRequest
+    , mctdcrVersionToUpdate
+    , mctdcrBinaryData
+
+    -- ** Binding
+    , Binding
+    , binding
+    , bMembers
+    , bRole
+    , bCondition
+    ) where
+
+import           Network.Google.CloudIOT.Types
+import           Network.Google.Prelude
+import           Network.Google.Resource.CloudIOT.Projects.Locations.Registries.BindDeviceToGateway
+import           Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Create
+import           Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Delete
+import           Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Devices.ConfigVersions.List
+import           Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Devices.Create
+import           Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Devices.Delete
+import           Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Devices.Get
+import           Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Devices.List
+import           Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Devices.ModifyCloudToDeviceConfig
+import           Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Devices.Patch
+import           Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Devices.SendCommandToDevice
+import           Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Devices.States.List
+import           Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Get
+import           Network.Google.Resource.CloudIOT.Projects.Locations.Registries.GetIAMPolicy
+import           Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.BindDeviceToGateway
+import           Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.Devices.ConfigVersions.List
+import           Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.Devices.Get
+import           Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.Devices.List
+import           Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.Devices.ModifyCloudToDeviceConfig
+import           Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.Devices.Patch
+import           Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.Devices.SendCommandToDevice
+import           Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.Devices.States.List
+import           Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.GetIAMPolicy
+import           Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.SetIAMPolicy
+import           Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.TestIAMPermissions
+import           Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.UnbindDeviceFromGateway
+import           Network.Google.Resource.CloudIOT.Projects.Locations.Registries.List
+import           Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Patch
+import           Network.Google.Resource.CloudIOT.Projects.Locations.Registries.SetIAMPolicy
+import           Network.Google.Resource.CloudIOT.Projects.Locations.Registries.TestIAMPermissions
+import           Network.Google.Resource.CloudIOT.Projects.Locations.Registries.UnbindDeviceFromGateway
+
+{- $resources
+TODO
+-}
+
+-- | Represents the entirety of the methods and resources available for the Cloud IoT API service.
+type CloudIOTAPI =
+     ProjectsLocationsRegistriesGroupsDevicesStatesListResource
+       :<|>
+       ProjectsLocationsRegistriesGroupsDevicesConfigVersionsListResource
+       :<|>
+       ProjectsLocationsRegistriesGroupsDevicesListResource
+       :<|>
+       ProjectsLocationsRegistriesGroupsDevicesModifyCloudToDeviceConfigResource
+       :<|>
+       ProjectsLocationsRegistriesGroupsDevicesPatchResource
+       :<|>
+       ProjectsLocationsRegistriesGroupsDevicesGetResource
+       :<|>
+       ProjectsLocationsRegistriesGroupsDevicesSendCommandToDeviceResource
+       :<|>
+       ProjectsLocationsRegistriesGroupsUnbindDeviceFromGatewayResource
+       :<|>
+       ProjectsLocationsRegistriesGroupsBindDeviceToGatewayResource
+       :<|>
+       ProjectsLocationsRegistriesGroupsGetIAMPolicyResource
+       :<|>
+       ProjectsLocationsRegistriesGroupsSetIAMPolicyResource
+       :<|>
+       ProjectsLocationsRegistriesGroupsTestIAMPermissionsResource
+       :<|>
+       ProjectsLocationsRegistriesDevicesStatesListResource
+       :<|>
+       ProjectsLocationsRegistriesDevicesConfigVersionsListResource
+       :<|> ProjectsLocationsRegistriesDevicesListResource
+       :<|>
+       ProjectsLocationsRegistriesDevicesModifyCloudToDeviceConfigResource
+       :<|> ProjectsLocationsRegistriesDevicesPatchResource
+       :<|> ProjectsLocationsRegistriesDevicesGetResource
+       :<|> ProjectsLocationsRegistriesDevicesCreateResource
+       :<|>
+       ProjectsLocationsRegistriesDevicesSendCommandToDeviceResource
+       :<|> ProjectsLocationsRegistriesDevicesDeleteResource
+       :<|>
+       ProjectsLocationsRegistriesUnbindDeviceFromGatewayResource
+       :<|> ProjectsLocationsRegistriesListResource
+       :<|>
+       ProjectsLocationsRegistriesBindDeviceToGatewayResource
+       :<|> ProjectsLocationsRegistriesGetIAMPolicyResource
+       :<|> ProjectsLocationsRegistriesPatchResource
+       :<|> ProjectsLocationsRegistriesGetResource
+       :<|> ProjectsLocationsRegistriesCreateResource
+       :<|> ProjectsLocationsRegistriesSetIAMPolicyResource
+       :<|>
+       ProjectsLocationsRegistriesTestIAMPermissionsResource
+       :<|> ProjectsLocationsRegistriesDeleteResource
diff --git a/gen/Network/Google/CloudIOT/Types.hs b/gen/Network/Google/CloudIOT/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/CloudIOT/Types.hs
@@ -0,0 +1,300 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Network.Google.CloudIOT.Types
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+module Network.Google.CloudIOT.Types
+    (
+    -- * Service Configuration
+      cloudIOTService
+
+    -- * OAuth Scopes
+    , cloudIOTScope
+    , cloudPlatformScope
+
+    -- * Status
+    , Status
+    , status
+    , sDetails
+    , sCode
+    , sMessage
+
+    -- * UnbindDeviceFromGatewayResponse
+    , UnbindDeviceFromGatewayResponse
+    , unbindDeviceFromGatewayResponse
+
+    -- * DeviceState
+    , DeviceState
+    , deviceState
+    , dsUpdateTime
+    , dsBinaryData
+
+    -- * Expr
+    , Expr
+    , expr
+    , eLocation
+    , eExpression
+    , eTitle
+    , eDescription
+
+    -- * GetIAMPolicyRequest
+    , GetIAMPolicyRequest
+    , getIAMPolicyRequest
+
+    -- * ListDeviceRegistriesResponse
+    , ListDeviceRegistriesResponse
+    , listDeviceRegistriesResponse
+    , ldrrNextPageToken
+    , ldrrDeviceRegistries
+
+    -- * DeviceConfig
+    , DeviceConfig
+    , deviceConfig
+    , dcDeviceAckTime
+    , dcCloudUpdateTime
+    , dcBinaryData
+    , dcVersion
+
+    -- * ListDeviceConfigVersionsResponse
+    , ListDeviceConfigVersionsResponse
+    , listDeviceConfigVersionsResponse
+    , ldcvrDeviceConfigs
+
+    -- * DeviceLogLevel
+    , DeviceLogLevel (..)
+
+    -- * GatewayConfig
+    , GatewayConfig
+    , gatewayConfig
+    , gcLastAccessedGatewayId
+    , gcGatewayAuthMethod
+    , gcLastAccessedGatewayTime
+    , gcGatewayType
+
+    -- * ListDeviceStatesResponse
+    , ListDeviceStatesResponse
+    , listDeviceStatesResponse
+    , ldsrDeviceStates
+
+    -- * Empty
+    , Empty
+    , empty
+
+    -- * StateNotificationConfig
+    , StateNotificationConfig
+    , stateNotificationConfig
+    , sncPubsubTopicName
+
+    -- * PublicKeyCertificateFormat
+    , PublicKeyCertificateFormat (..)
+
+    -- * Device
+    , Device
+    , device
+    , dState
+    , dLastHeartbeatTime
+    , dGatewayConfig
+    , dLogLevel
+    , dConfig
+    , dCredentials
+    , dNumId
+    , dLastErrorStatus
+    , dLastConfigSendTime
+    , dLastConfigAckTime
+    , dName
+    , dLastErrorTime
+    , dMetadata
+    , dId
+    , dLastStateTime
+    , dBlocked
+    , dLastEventTime
+
+    -- * DeviceCredential
+    , DeviceCredential
+    , deviceCredential
+    , dcPublicKey
+    , dcExpirationTime
+
+    -- * EventNotificationConfig
+    , EventNotificationConfig
+    , eventNotificationConfig
+    , encPubsubTopicName
+    , encSubfolderMatches
+
+    -- * X509CertificateDetails
+    , X509CertificateDetails
+    , x509CertificateDetails
+    , xcdSubject
+    , xcdExpiryTime
+    , xcdStartTime
+    , xcdSignatureAlgorithm
+    , xcdIssuer
+    , xcdPublicKeyType
+
+    -- * PublicKeyCertificate
+    , PublicKeyCertificate
+    , publicKeyCertificate
+    , pkcFormat
+    , pkcCertificate
+    , pkcX509Details
+
+    -- * StatusDetailsItem
+    , StatusDetailsItem
+    , statusDetailsItem
+    , sdiAddtional
+
+    -- * PublicKeyCredentialFormat
+    , PublicKeyCredentialFormat (..)
+
+    -- * MqttConfig
+    , MqttConfig
+    , mqttConfig
+    , mcMqttEnabledState
+
+    -- * SetIAMPolicyRequest
+    , SetIAMPolicyRequest
+    , setIAMPolicyRequest
+    , siprPolicy
+
+    -- * RegistryCredential
+    , RegistryCredential
+    , registryCredential
+    , rcPublicKeyCertificate
+
+    -- * SendCommandToDeviceRequest
+    , SendCommandToDeviceRequest
+    , sendCommandToDeviceRequest
+    , sctdrBinaryData
+    , sctdrSubfolder
+
+    -- * BindDeviceToGatewayResponse
+    , BindDeviceToGatewayResponse
+    , bindDeviceToGatewayResponse
+
+    -- * DeviceRegistryLogLevel
+    , DeviceRegistryLogLevel (..)
+
+    -- * HTTPConfig
+    , HTTPConfig
+    , hTTPConfig
+    , httpcHTTPEnabledState
+
+    -- * Xgafv
+    , Xgafv (..)
+
+    -- * TestIAMPermissionsRequest
+    , TestIAMPermissionsRequest
+    , testIAMPermissionsRequest
+    , tiprPermissions
+
+    -- * GatewayConfigGatewayType
+    , GatewayConfigGatewayType (..)
+
+    -- * ListDevicesResponse
+    , ListDevicesResponse
+    , listDevicesResponse
+    , ldrNextPageToken
+    , ldrDevices
+
+    -- * DeviceMetadata
+    , DeviceMetadata
+    , deviceMetadata
+    , dmAddtional
+
+    -- * GatewayConfigGatewayAuthMethod
+    , GatewayConfigGatewayAuthMethod (..)
+
+    -- * DeviceRegistry
+    , DeviceRegistry
+    , deviceRegistry
+    , drLogLevel
+    , drCredentials
+    , drStateNotificationConfig
+    , drEventNotificationConfigs
+    , drMqttConfig
+    , drName
+    , drHTTPConfig
+    , drId
+
+    -- * PublicKeyCredential
+    , PublicKeyCredential
+    , publicKeyCredential
+    , pFormat
+    , pKey
+
+    -- * UnbindDeviceFromGatewayRequest
+    , UnbindDeviceFromGatewayRequest
+    , unbindDeviceFromGatewayRequest
+    , udfgrDeviceId
+    , udfgrGatewayId
+
+    -- * MqttConfigMqttEnabledState
+    , MqttConfigMqttEnabledState (..)
+
+    -- * TestIAMPermissionsResponse
+    , TestIAMPermissionsResponse
+    , testIAMPermissionsResponse
+    , tiamprPermissions
+
+    -- * Policy
+    , Policy
+    , policy
+    , pEtag
+    , pVersion
+    , pBindings
+
+    -- * HTTPConfigHTTPEnabledState
+    , HTTPConfigHTTPEnabledState (..)
+
+    -- * SendCommandToDeviceResponse
+    , SendCommandToDeviceResponse
+    , sendCommandToDeviceResponse
+
+    -- * BindDeviceToGatewayRequest
+    , BindDeviceToGatewayRequest
+    , bindDeviceToGatewayRequest
+    , bdtgrDeviceId
+    , bdtgrGatewayId
+
+    -- * ModifyCloudToDeviceConfigRequest
+    , ModifyCloudToDeviceConfigRequest
+    , modifyCloudToDeviceConfigRequest
+    , mctdcrVersionToUpdate
+    , mctdcrBinaryData
+
+    -- * Binding
+    , Binding
+    , binding
+    , bMembers
+    , bRole
+    , bCondition
+    ) where
+
+import           Network.Google.CloudIOT.Types.Product
+import           Network.Google.CloudIOT.Types.Sum
+import           Network.Google.Prelude
+
+-- | Default request referring to version 'v1' of the Cloud IoT API. This contains the host and root path used as a starting point for constructing service requests.
+cloudIOTService :: ServiceConfig
+cloudIOTService
+  = defaultService (ServiceId "cloudiot:v1")
+      "cloudiot.googleapis.com"
+
+-- | Register and manage devices in the Google Cloud IoT service
+cloudIOTScope :: Proxy '["https://www.googleapis.com/auth/cloudiot"]
+cloudIOTScope = Proxy;
+
+-- | View and manage your data across Google Cloud Platform services
+cloudPlatformScope :: Proxy '["https://www.googleapis.com/auth/cloud-platform"]
+cloudPlatformScope = Proxy;
diff --git a/gen/Network/Google/CloudIOT/Types/Product.hs b/gen/Network/Google/CloudIOT/Types/Product.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/CloudIOT/Types/Product.hs
@@ -0,0 +1,2160 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Network.Google.CloudIOT.Types.Product
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+module Network.Google.CloudIOT.Types.Product where
+
+import           Network.Google.CloudIOT.Types.Sum
+import           Network.Google.Prelude
+
+-- | The \`Status\` type defines a logical error model that is suitable for
+-- different programming environments, including REST APIs and RPC APIs. It
+-- is used by [gRPC](https:\/\/github.com\/grpc). The error model is
+-- designed to be: - Simple to use and understand for most users - Flexible
+-- enough to meet unexpected needs # Overview The \`Status\` message
+-- contains three pieces of data: error code, error message, and error
+-- details. The error code should be an enum value of google.rpc.Code, but
+-- it may accept additional error codes if needed. The error message should
+-- be a developer-facing English message that helps developers *understand*
+-- and *resolve* the error. If a localized user-facing error message is
+-- needed, put the localized message in the error details or localize it in
+-- the client. The optional error details may contain arbitrary information
+-- about the error. There is a predefined set of error detail types in the
+-- package \`google.rpc\` that can be used for common error conditions. #
+-- Language mapping The \`Status\` message is the logical representation of
+-- the error model, but it is not necessarily the actual wire format. When
+-- the \`Status\` message is exposed in different client libraries and
+-- different wire protocols, it can be mapped differently. For example, it
+-- will likely be mapped to some exceptions in Java, but more likely mapped
+-- to some error codes in C. # Other uses The error model and the
+-- \`Status\` message can be used in a variety of environments, either with
+-- or without APIs, to provide a consistent developer experience across
+-- different environments. Example uses of this error model include: -
+-- Partial errors. If a service needs to return partial errors to the
+-- client, it may embed the \`Status\` in the normal response to indicate
+-- the partial errors. - Workflow errors. A typical workflow has multiple
+-- steps. Each step may have a \`Status\` message for error reporting. -
+-- Batch operations. If a client uses batch request and batch response, the
+-- \`Status\` message should be used directly inside batch response, one
+-- for each error sub-response. - Asynchronous operations. If an API call
+-- embeds asynchronous operation results in its response, the status of
+-- those operations should be represented directly using the \`Status\`
+-- message. - Logging. If some API errors are stored in logs, the message
+-- \`Status\` could be used directly after any stripping needed for
+-- security\/privacy reasons.
+--
+-- /See:/ 'status' smart constructor.
+data Status = Status'
+    { _sDetails :: !(Maybe [StatusDetailsItem])
+    , _sCode    :: !(Maybe (Textual Int32))
+    , _sMessage :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Status' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sDetails'
+--
+-- * 'sCode'
+--
+-- * 'sMessage'
+status
+    :: Status
+status =
+    Status'
+    { _sDetails = Nothing
+    , _sCode = Nothing
+    , _sMessage = Nothing
+    }
+
+-- | A list of messages that carry the error details. There is a common set
+-- of message types for APIs to use.
+sDetails :: Lens' Status [StatusDetailsItem]
+sDetails
+  = lens _sDetails (\ s a -> s{_sDetails = a}) .
+      _Default
+      . _Coerce
+
+-- | The status code, which should be an enum value of google.rpc.Code.
+sCode :: Lens' Status (Maybe Int32)
+sCode
+  = lens _sCode (\ s a -> s{_sCode = a}) .
+      mapping _Coerce
+
+-- | A developer-facing error message, which should be in English. Any
+-- user-facing error message should be localized and sent in the
+-- google.rpc.Status.details field, or localized by the client.
+sMessage :: Lens' Status (Maybe Text)
+sMessage = lens _sMessage (\ s a -> s{_sMessage = a})
+
+instance FromJSON Status where
+        parseJSON
+          = withObject "Status"
+              (\ o ->
+                 Status' <$>
+                   (o .:? "details" .!= mempty) <*> (o .:? "code") <*>
+                     (o .:? "message"))
+
+instance ToJSON Status where
+        toJSON Status'{..}
+          = object
+              (catMaybes
+                 [("details" .=) <$> _sDetails,
+                  ("code" .=) <$> _sCode,
+                  ("message" .=) <$> _sMessage])
+
+-- | Response for \`UnbindDeviceFromGateway\`.
+--
+-- /See:/ 'unbindDeviceFromGatewayResponse' smart constructor.
+data UnbindDeviceFromGatewayResponse =
+    UnbindDeviceFromGatewayResponse'
+    deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'UnbindDeviceFromGatewayResponse' with the minimum fields required to make a request.
+--
+unbindDeviceFromGatewayResponse
+    :: UnbindDeviceFromGatewayResponse
+unbindDeviceFromGatewayResponse = UnbindDeviceFromGatewayResponse'
+
+instance FromJSON UnbindDeviceFromGatewayResponse
+         where
+        parseJSON
+          = withObject "UnbindDeviceFromGatewayResponse"
+              (\ o -> pure UnbindDeviceFromGatewayResponse')
+
+instance ToJSON UnbindDeviceFromGatewayResponse where
+        toJSON = const emptyObject
+
+-- | The device state, as reported by the device.
+--
+-- /See:/ 'deviceState' smart constructor.
+data DeviceState = DeviceState'
+    { _dsUpdateTime :: !(Maybe DateTime')
+    , _dsBinaryData :: !(Maybe Bytes)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DeviceState' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dsUpdateTime'
+--
+-- * 'dsBinaryData'
+deviceState
+    :: DeviceState
+deviceState =
+    DeviceState'
+    { _dsUpdateTime = Nothing
+    , _dsBinaryData = Nothing
+    }
+
+-- | [Output only] The time at which this state version was updated in Cloud
+-- IoT Core.
+dsUpdateTime :: Lens' DeviceState (Maybe UTCTime)
+dsUpdateTime
+  = lens _dsUpdateTime (\ s a -> s{_dsUpdateTime = a})
+      . mapping _DateTime
+
+-- | The device state data.
+dsBinaryData :: Lens' DeviceState (Maybe ByteString)
+dsBinaryData
+  = lens _dsBinaryData (\ s a -> s{_dsBinaryData = a})
+      . mapping _Bytes
+
+instance FromJSON DeviceState where
+        parseJSON
+          = withObject "DeviceState"
+              (\ o ->
+                 DeviceState' <$>
+                   (o .:? "updateTime") <*> (o .:? "binaryData"))
+
+instance ToJSON DeviceState where
+        toJSON DeviceState'{..}
+          = object
+              (catMaybes
+                 [("updateTime" .=) <$> _dsUpdateTime,
+                  ("binaryData" .=) <$> _dsBinaryData])
+
+-- | Represents an expression text. Example: title: \"User account presence\"
+-- description: \"Determines whether the request has a user account\"
+-- expression: \"size(request.user) > 0\"
+--
+-- /See:/ 'expr' smart constructor.
+data Expr = Expr'
+    { _eLocation    :: !(Maybe Text)
+    , _eExpression  :: !(Maybe Text)
+    , _eTitle       :: !(Maybe Text)
+    , _eDescription :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Expr' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'eLocation'
+--
+-- * 'eExpression'
+--
+-- * 'eTitle'
+--
+-- * 'eDescription'
+expr
+    :: Expr
+expr =
+    Expr'
+    { _eLocation = Nothing
+    , _eExpression = Nothing
+    , _eTitle = Nothing
+    , _eDescription = Nothing
+    }
+
+-- | An optional string indicating the location of the expression for error
+-- reporting, e.g. a file name and a position in the file.
+eLocation :: Lens' Expr (Maybe Text)
+eLocation
+  = lens _eLocation (\ s a -> s{_eLocation = a})
+
+-- | Textual representation of an expression in Common Expression Language
+-- syntax. The application context of the containing message determines
+-- which well-known feature set of CEL is supported.
+eExpression :: Lens' Expr (Maybe Text)
+eExpression
+  = lens _eExpression (\ s a -> s{_eExpression = a})
+
+-- | An optional title for the expression, i.e. a short string describing its
+-- purpose. This can be used e.g. in UIs which allow to enter the
+-- expression.
+eTitle :: Lens' Expr (Maybe Text)
+eTitle = lens _eTitle (\ s a -> s{_eTitle = a})
+
+-- | An optional description of the expression. This is a longer text which
+-- describes the expression, e.g. when hovered over it in a UI.
+eDescription :: Lens' Expr (Maybe Text)
+eDescription
+  = lens _eDescription (\ s a -> s{_eDescription = a})
+
+instance FromJSON Expr where
+        parseJSON
+          = withObject "Expr"
+              (\ o ->
+                 Expr' <$>
+                   (o .:? "location") <*> (o .:? "expression") <*>
+                     (o .:? "title")
+                     <*> (o .:? "description"))
+
+instance ToJSON Expr where
+        toJSON Expr'{..}
+          = object
+              (catMaybes
+                 [("location" .=) <$> _eLocation,
+                  ("expression" .=) <$> _eExpression,
+                  ("title" .=) <$> _eTitle,
+                  ("description" .=) <$> _eDescription])
+
+-- | Request message for \`GetIamPolicy\` method.
+--
+-- /See:/ 'getIAMPolicyRequest' smart constructor.
+data GetIAMPolicyRequest =
+    GetIAMPolicyRequest'
+    deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetIAMPolicyRequest' with the minimum fields required to make a request.
+--
+getIAMPolicyRequest
+    :: GetIAMPolicyRequest
+getIAMPolicyRequest = GetIAMPolicyRequest'
+
+instance FromJSON GetIAMPolicyRequest where
+        parseJSON
+          = withObject "GetIAMPolicyRequest"
+              (\ o -> pure GetIAMPolicyRequest')
+
+instance ToJSON GetIAMPolicyRequest where
+        toJSON = const emptyObject
+
+-- | Response for \`ListDeviceRegistries\`.
+--
+-- /See:/ 'listDeviceRegistriesResponse' smart constructor.
+data ListDeviceRegistriesResponse = ListDeviceRegistriesResponse'
+    { _ldrrNextPageToken    :: !(Maybe Text)
+    , _ldrrDeviceRegistries :: !(Maybe [DeviceRegistry])
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ListDeviceRegistriesResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ldrrNextPageToken'
+--
+-- * 'ldrrDeviceRegistries'
+listDeviceRegistriesResponse
+    :: ListDeviceRegistriesResponse
+listDeviceRegistriesResponse =
+    ListDeviceRegistriesResponse'
+    { _ldrrNextPageToken = Nothing
+    , _ldrrDeviceRegistries = Nothing
+    }
+
+-- | If not empty, indicates that there may be more registries that match the
+-- request; this value should be passed in a new
+-- \`ListDeviceRegistriesRequest\`.
+ldrrNextPageToken :: Lens' ListDeviceRegistriesResponse (Maybe Text)
+ldrrNextPageToken
+  = lens _ldrrNextPageToken
+      (\ s a -> s{_ldrrNextPageToken = a})
+
+-- | The registries that matched the query.
+ldrrDeviceRegistries :: Lens' ListDeviceRegistriesResponse [DeviceRegistry]
+ldrrDeviceRegistries
+  = lens _ldrrDeviceRegistries
+      (\ s a -> s{_ldrrDeviceRegistries = a})
+      . _Default
+      . _Coerce
+
+instance FromJSON ListDeviceRegistriesResponse where
+        parseJSON
+          = withObject "ListDeviceRegistriesResponse"
+              (\ o ->
+                 ListDeviceRegistriesResponse' <$>
+                   (o .:? "nextPageToken") <*>
+                     (o .:? "deviceRegistries" .!= mempty))
+
+instance ToJSON ListDeviceRegistriesResponse where
+        toJSON ListDeviceRegistriesResponse'{..}
+          = object
+              (catMaybes
+                 [("nextPageToken" .=) <$> _ldrrNextPageToken,
+                  ("deviceRegistries" .=) <$> _ldrrDeviceRegistries])
+
+-- | The device configuration. Eventually delivered to devices.
+--
+-- /See:/ 'deviceConfig' smart constructor.
+data DeviceConfig = DeviceConfig'
+    { _dcDeviceAckTime   :: !(Maybe DateTime')
+    , _dcCloudUpdateTime :: !(Maybe DateTime')
+    , _dcBinaryData      :: !(Maybe Bytes)
+    , _dcVersion         :: !(Maybe (Textual Int64))
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DeviceConfig' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dcDeviceAckTime'
+--
+-- * 'dcCloudUpdateTime'
+--
+-- * 'dcBinaryData'
+--
+-- * 'dcVersion'
+deviceConfig
+    :: DeviceConfig
+deviceConfig =
+    DeviceConfig'
+    { _dcDeviceAckTime = Nothing
+    , _dcCloudUpdateTime = Nothing
+    , _dcBinaryData = Nothing
+    , _dcVersion = Nothing
+    }
+
+-- | [Output only] The time at which Cloud IoT Core received the
+-- acknowledgment from the device, indicating that the device has received
+-- this configuration version. If this field is not present, the device has
+-- not yet acknowledged that it received this version. Note that when the
+-- config was sent to the device, many config versions may have been
+-- available in Cloud IoT Core while the device was disconnected, and on
+-- connection, only the latest version is sent to the device. Some versions
+-- may never be sent to the device, and therefore are never acknowledged.
+-- This timestamp is set by Cloud IoT Core.
+dcDeviceAckTime :: Lens' DeviceConfig (Maybe UTCTime)
+dcDeviceAckTime
+  = lens _dcDeviceAckTime
+      (\ s a -> s{_dcDeviceAckTime = a})
+      . mapping _DateTime
+
+-- | [Output only] The time at which this configuration version was updated
+-- in Cloud IoT Core. This timestamp is set by the server.
+dcCloudUpdateTime :: Lens' DeviceConfig (Maybe UTCTime)
+dcCloudUpdateTime
+  = lens _dcCloudUpdateTime
+      (\ s a -> s{_dcCloudUpdateTime = a})
+      . mapping _DateTime
+
+-- | The device configuration data.
+dcBinaryData :: Lens' DeviceConfig (Maybe ByteString)
+dcBinaryData
+  = lens _dcBinaryData (\ s a -> s{_dcBinaryData = a})
+      . mapping _Bytes
+
+-- | [Output only] The version of this update. The version number is assigned
+-- by the server, and is always greater than 0 after device creation. The
+-- version must be 0 on the \`CreateDevice\` request if a \`config\` is
+-- specified; the response of \`CreateDevice\` will always have a value of
+-- 1.
+dcVersion :: Lens' DeviceConfig (Maybe Int64)
+dcVersion
+  = lens _dcVersion (\ s a -> s{_dcVersion = a}) .
+      mapping _Coerce
+
+instance FromJSON DeviceConfig where
+        parseJSON
+          = withObject "DeviceConfig"
+              (\ o ->
+                 DeviceConfig' <$>
+                   (o .:? "deviceAckTime") <*> (o .:? "cloudUpdateTime")
+                     <*> (o .:? "binaryData")
+                     <*> (o .:? "version"))
+
+instance ToJSON DeviceConfig where
+        toJSON DeviceConfig'{..}
+          = object
+              (catMaybes
+                 [("deviceAckTime" .=) <$> _dcDeviceAckTime,
+                  ("cloudUpdateTime" .=) <$> _dcCloudUpdateTime,
+                  ("binaryData" .=) <$> _dcBinaryData,
+                  ("version" .=) <$> _dcVersion])
+
+-- | Response for \`ListDeviceConfigVersions\`.
+--
+-- /See:/ 'listDeviceConfigVersionsResponse' smart constructor.
+newtype ListDeviceConfigVersionsResponse = ListDeviceConfigVersionsResponse'
+    { _ldcvrDeviceConfigs :: Maybe [DeviceConfig]
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ListDeviceConfigVersionsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ldcvrDeviceConfigs'
+listDeviceConfigVersionsResponse
+    :: ListDeviceConfigVersionsResponse
+listDeviceConfigVersionsResponse =
+    ListDeviceConfigVersionsResponse'
+    { _ldcvrDeviceConfigs = Nothing
+    }
+
+-- | The device configuration for the last few versions. Versions are listed
+-- in decreasing order, starting from the most recent one.
+ldcvrDeviceConfigs :: Lens' ListDeviceConfigVersionsResponse [DeviceConfig]
+ldcvrDeviceConfigs
+  = lens _ldcvrDeviceConfigs
+      (\ s a -> s{_ldcvrDeviceConfigs = a})
+      . _Default
+      . _Coerce
+
+instance FromJSON ListDeviceConfigVersionsResponse
+         where
+        parseJSON
+          = withObject "ListDeviceConfigVersionsResponse"
+              (\ o ->
+                 ListDeviceConfigVersionsResponse' <$>
+                   (o .:? "deviceConfigs" .!= mempty))
+
+instance ToJSON ListDeviceConfigVersionsResponse
+         where
+        toJSON ListDeviceConfigVersionsResponse'{..}
+          = object
+              (catMaybes
+                 [("deviceConfigs" .=) <$> _ldcvrDeviceConfigs])
+
+-- | Gateway-related configuration and state.
+--
+-- /See:/ 'gatewayConfig' smart constructor.
+data GatewayConfig = GatewayConfig'
+    { _gcLastAccessedGatewayId   :: !(Maybe Text)
+    , _gcGatewayAuthMethod       :: !(Maybe GatewayConfigGatewayAuthMethod)
+    , _gcLastAccessedGatewayTime :: !(Maybe DateTime')
+    , _gcGatewayType             :: !(Maybe GatewayConfigGatewayType)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GatewayConfig' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gcLastAccessedGatewayId'
+--
+-- * 'gcGatewayAuthMethod'
+--
+-- * 'gcLastAccessedGatewayTime'
+--
+-- * 'gcGatewayType'
+gatewayConfig
+    :: GatewayConfig
+gatewayConfig =
+    GatewayConfig'
+    { _gcLastAccessedGatewayId = Nothing
+    , _gcGatewayAuthMethod = Nothing
+    , _gcLastAccessedGatewayTime = Nothing
+    , _gcGatewayType = Nothing
+    }
+
+-- | [Output only] The ID of the gateway the device accessed most recently.
+gcLastAccessedGatewayId :: Lens' GatewayConfig (Maybe Text)
+gcLastAccessedGatewayId
+  = lens _gcLastAccessedGatewayId
+      (\ s a -> s{_gcLastAccessedGatewayId = a})
+
+-- | Indicates how to authorize and\/or authenticate devices to access the
+-- gateway.
+gcGatewayAuthMethod :: Lens' GatewayConfig (Maybe GatewayConfigGatewayAuthMethod)
+gcGatewayAuthMethod
+  = lens _gcGatewayAuthMethod
+      (\ s a -> s{_gcGatewayAuthMethod = a})
+
+-- | [Output only] The most recent time at which the device accessed the
+-- gateway specified in \`last_accessed_gateway\`.
+gcLastAccessedGatewayTime :: Lens' GatewayConfig (Maybe UTCTime)
+gcLastAccessedGatewayTime
+  = lens _gcLastAccessedGatewayTime
+      (\ s a -> s{_gcLastAccessedGatewayTime = a})
+      . mapping _DateTime
+
+-- | Indicates whether the device is a gateway.
+gcGatewayType :: Lens' GatewayConfig (Maybe GatewayConfigGatewayType)
+gcGatewayType
+  = lens _gcGatewayType
+      (\ s a -> s{_gcGatewayType = a})
+
+instance FromJSON GatewayConfig where
+        parseJSON
+          = withObject "GatewayConfig"
+              (\ o ->
+                 GatewayConfig' <$>
+                   (o .:? "lastAccessedGatewayId") <*>
+                     (o .:? "gatewayAuthMethod")
+                     <*> (o .:? "lastAccessedGatewayTime")
+                     <*> (o .:? "gatewayType"))
+
+instance ToJSON GatewayConfig where
+        toJSON GatewayConfig'{..}
+          = object
+              (catMaybes
+                 [("lastAccessedGatewayId" .=) <$>
+                    _gcLastAccessedGatewayId,
+                  ("gatewayAuthMethod" .=) <$> _gcGatewayAuthMethod,
+                  ("lastAccessedGatewayTime" .=) <$>
+                    _gcLastAccessedGatewayTime,
+                  ("gatewayType" .=) <$> _gcGatewayType])
+
+-- | Response for \`ListDeviceStates\`.
+--
+-- /See:/ 'listDeviceStatesResponse' smart constructor.
+newtype ListDeviceStatesResponse = ListDeviceStatesResponse'
+    { _ldsrDeviceStates :: Maybe [DeviceState]
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ListDeviceStatesResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ldsrDeviceStates'
+listDeviceStatesResponse
+    :: ListDeviceStatesResponse
+listDeviceStatesResponse =
+    ListDeviceStatesResponse'
+    { _ldsrDeviceStates = Nothing
+    }
+
+-- | The last few device states. States are listed in descending order of
+-- server update time, starting from the most recent one.
+ldsrDeviceStates :: Lens' ListDeviceStatesResponse [DeviceState]
+ldsrDeviceStates
+  = lens _ldsrDeviceStates
+      (\ s a -> s{_ldsrDeviceStates = a})
+      . _Default
+      . _Coerce
+
+instance FromJSON ListDeviceStatesResponse where
+        parseJSON
+          = withObject "ListDeviceStatesResponse"
+              (\ o ->
+                 ListDeviceStatesResponse' <$>
+                   (o .:? "deviceStates" .!= mempty))
+
+instance ToJSON ListDeviceStatesResponse where
+        toJSON ListDeviceStatesResponse'{..}
+          = object
+              (catMaybes
+                 [("deviceStates" .=) <$> _ldsrDeviceStates])
+
+-- | A generic empty message that you can re-use to avoid defining duplicated
+-- empty messages in your APIs. A typical example is to use it as the
+-- request or the response type of an API method. For instance: service Foo
+-- { rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty); } The
+-- JSON representation for \`Empty\` is empty JSON object \`{}\`.
+--
+-- /See:/ 'empty' smart constructor.
+data Empty =
+    Empty'
+    deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Empty' with the minimum fields required to make a request.
+--
+empty
+    :: Empty
+empty = Empty'
+
+instance FromJSON Empty where
+        parseJSON = withObject "Empty" (\ o -> pure Empty')
+
+instance ToJSON Empty where
+        toJSON = const emptyObject
+
+-- | The configuration for notification of new states received from the
+-- device.
+--
+-- /See:/ 'stateNotificationConfig' smart constructor.
+newtype StateNotificationConfig = StateNotificationConfig'
+    { _sncPubsubTopicName :: Maybe Text
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'StateNotificationConfig' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sncPubsubTopicName'
+stateNotificationConfig
+    :: StateNotificationConfig
+stateNotificationConfig =
+    StateNotificationConfig'
+    { _sncPubsubTopicName = Nothing
+    }
+
+-- | A Cloud Pub\/Sub topic name. For example,
+-- \`projects\/myProject\/topics\/deviceEvents\`.
+sncPubsubTopicName :: Lens' StateNotificationConfig (Maybe Text)
+sncPubsubTopicName
+  = lens _sncPubsubTopicName
+      (\ s a -> s{_sncPubsubTopicName = a})
+
+instance FromJSON StateNotificationConfig where
+        parseJSON
+          = withObject "StateNotificationConfig"
+              (\ o ->
+                 StateNotificationConfig' <$>
+                   (o .:? "pubsubTopicName"))
+
+instance ToJSON StateNotificationConfig where
+        toJSON StateNotificationConfig'{..}
+          = object
+              (catMaybes
+                 [("pubsubTopicName" .=) <$> _sncPubsubTopicName])
+
+-- | The device resource.
+--
+-- /See:/ 'device' smart constructor.
+data Device = Device'
+    { _dState              :: !(Maybe DeviceState)
+    , _dLastHeartbeatTime  :: !(Maybe DateTime')
+    , _dGatewayConfig      :: !(Maybe GatewayConfig)
+    , _dLogLevel           :: !(Maybe DeviceLogLevel)
+    , _dConfig             :: !(Maybe DeviceConfig)
+    , _dCredentials        :: !(Maybe [DeviceCredential])
+    , _dNumId              :: !(Maybe (Textual Word64))
+    , _dLastErrorStatus    :: !(Maybe Status)
+    , _dLastConfigSendTime :: !(Maybe DateTime')
+    , _dLastConfigAckTime  :: !(Maybe DateTime')
+    , _dName               :: !(Maybe Text)
+    , _dLastErrorTime      :: !(Maybe DateTime')
+    , _dMetadata           :: !(Maybe DeviceMetadata)
+    , _dId                 :: !(Maybe Text)
+    , _dLastStateTime      :: !(Maybe DateTime')
+    , _dBlocked            :: !(Maybe Bool)
+    , _dLastEventTime      :: !(Maybe DateTime')
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Device' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dState'
+--
+-- * 'dLastHeartbeatTime'
+--
+-- * 'dGatewayConfig'
+--
+-- * 'dLogLevel'
+--
+-- * 'dConfig'
+--
+-- * 'dCredentials'
+--
+-- * 'dNumId'
+--
+-- * 'dLastErrorStatus'
+--
+-- * 'dLastConfigSendTime'
+--
+-- * 'dLastConfigAckTime'
+--
+-- * 'dName'
+--
+-- * 'dLastErrorTime'
+--
+-- * 'dMetadata'
+--
+-- * 'dId'
+--
+-- * 'dLastStateTime'
+--
+-- * 'dBlocked'
+--
+-- * 'dLastEventTime'
+device
+    :: Device
+device =
+    Device'
+    { _dState = Nothing
+    , _dLastHeartbeatTime = Nothing
+    , _dGatewayConfig = Nothing
+    , _dLogLevel = Nothing
+    , _dConfig = Nothing
+    , _dCredentials = Nothing
+    , _dNumId = Nothing
+    , _dLastErrorStatus = Nothing
+    , _dLastConfigSendTime = Nothing
+    , _dLastConfigAckTime = Nothing
+    , _dName = Nothing
+    , _dLastErrorTime = Nothing
+    , _dMetadata = Nothing
+    , _dId = Nothing
+    , _dLastStateTime = Nothing
+    , _dBlocked = Nothing
+    , _dLastEventTime = Nothing
+    }
+
+-- | [Output only] The state most recently received from the device. If no
+-- state has been reported, this field is not present.
+dState :: Lens' Device (Maybe DeviceState)
+dState = lens _dState (\ s a -> s{_dState = a})
+
+-- | [Output only] The last time an MQTT \`PINGREQ\` was received. This field
+-- applies only to devices connecting through MQTT. MQTT clients usually
+-- only send \`PINGREQ\` messages if the connection is idle, and no other
+-- messages have been sent. Timestamps are periodically collected and
+-- written to storage; they may be stale by a few minutes.
+dLastHeartbeatTime :: Lens' Device (Maybe UTCTime)
+dLastHeartbeatTime
+  = lens _dLastHeartbeatTime
+      (\ s a -> s{_dLastHeartbeatTime = a})
+      . mapping _DateTime
+
+-- | Gateway-related configuration and state.
+dGatewayConfig :: Lens' Device (Maybe GatewayConfig)
+dGatewayConfig
+  = lens _dGatewayConfig
+      (\ s a -> s{_dGatewayConfig = a})
+
+-- | **Beta Feature** The logging verbosity for device activity. If
+-- unspecified, DeviceRegistry.log_level will be used.
+dLogLevel :: Lens' Device (Maybe DeviceLogLevel)
+dLogLevel
+  = lens _dLogLevel (\ s a -> s{_dLogLevel = a})
+
+-- | The most recent device configuration, which is eventually sent from
+-- Cloud IoT Core to the device. If not present on creation, the
+-- configuration will be initialized with an empty payload and version
+-- value of \`1\`. To update this field after creation, use the
+-- \`DeviceManager.ModifyCloudToDeviceConfig\` method.
+dConfig :: Lens' Device (Maybe DeviceConfig)
+dConfig = lens _dConfig (\ s a -> s{_dConfig = a})
+
+-- | The credentials used to authenticate this device. To allow credential
+-- rotation without interruption, multiple device credentials can be bound
+-- to this device. No more than 3 credentials can be bound to a single
+-- device at a time. When new credentials are added to a device, they are
+-- verified against the registry credentials. For details, see the
+-- description of the \`DeviceRegistry.credentials\` field.
+dCredentials :: Lens' Device [DeviceCredential]
+dCredentials
+  = lens _dCredentials (\ s a -> s{_dCredentials = a})
+      . _Default
+      . _Coerce
+
+-- | [Output only] A server-defined unique numeric ID for the device. This is
+-- a more compact way to identify devices, and it is globally unique.
+dNumId :: Lens' Device (Maybe Word64)
+dNumId
+  = lens _dNumId (\ s a -> s{_dNumId = a}) .
+      mapping _Coerce
+
+-- | [Output only] The error message of the most recent error, such as a
+-- failure to publish to Cloud Pub\/Sub. \'last_error_time\' is the
+-- timestamp of this field. If no errors have occurred, this field has an
+-- empty message and the status code 0 == OK. Otherwise, this field is
+-- expected to have a status code other than OK.
+dLastErrorStatus :: Lens' Device (Maybe Status)
+dLastErrorStatus
+  = lens _dLastErrorStatus
+      (\ s a -> s{_dLastErrorStatus = a})
+
+-- | [Output only] The last time a cloud-to-device config version was sent to
+-- the device.
+dLastConfigSendTime :: Lens' Device (Maybe UTCTime)
+dLastConfigSendTime
+  = lens _dLastConfigSendTime
+      (\ s a -> s{_dLastConfigSendTime = a})
+      . mapping _DateTime
+
+-- | [Output only] The last time a cloud-to-device config version
+-- acknowledgment was received from the device. This field is only for
+-- configurations sent through MQTT.
+dLastConfigAckTime :: Lens' Device (Maybe UTCTime)
+dLastConfigAckTime
+  = lens _dLastConfigAckTime
+      (\ s a -> s{_dLastConfigAckTime = a})
+      . mapping _DateTime
+
+-- | The resource path name. For example,
+-- \`projects\/p1\/locations\/us-central1\/registries\/registry0\/devices\/dev0\`
+-- or
+-- \`projects\/p1\/locations\/us-central1\/registries\/registry0\/devices\/{num_id}\`.
+-- When \`name\` is populated as a response from the service, it always
+-- ends in the device numeric ID.
+dName :: Lens' Device (Maybe Text)
+dName = lens _dName (\ s a -> s{_dName = a})
+
+-- | [Output only] The time the most recent error occurred, such as a failure
+-- to publish to Cloud Pub\/Sub. This field is the timestamp of
+-- \'last_error_status\'.
+dLastErrorTime :: Lens' Device (Maybe UTCTime)
+dLastErrorTime
+  = lens _dLastErrorTime
+      (\ s a -> s{_dLastErrorTime = a})
+      . mapping _DateTime
+
+-- | The metadata key-value pairs assigned to the device. This metadata is
+-- not interpreted or indexed by Cloud IoT Core. It can be used to add
+-- contextual information for the device. Keys must conform to the regular
+-- expression a-zA-Z+ and be less than 128 bytes in length. Values are
+-- free-form strings. Each value must be less than or equal to 32 KB in
+-- size. The total size of all keys and values must be less than 256 KB,
+-- and the maximum number of key-value pairs is 500.
+dMetadata :: Lens' Device (Maybe DeviceMetadata)
+dMetadata
+  = lens _dMetadata (\ s a -> s{_dMetadata = a})
+
+-- | The user-defined device identifier. The device ID must be unique within
+-- a device registry.
+dId :: Lens' Device (Maybe Text)
+dId = lens _dId (\ s a -> s{_dId = a})
+
+-- | [Output only] The last time a state event was received. Timestamps are
+-- periodically collected and written to storage; they may be stale by a
+-- few minutes.
+dLastStateTime :: Lens' Device (Maybe UTCTime)
+dLastStateTime
+  = lens _dLastStateTime
+      (\ s a -> s{_dLastStateTime = a})
+      . mapping _DateTime
+
+-- | If a device is blocked, connections or requests from this device will
+-- fail. Can be used to temporarily prevent the device from connecting if,
+-- for example, the sensor is generating bad data and needs maintenance.
+dBlocked :: Lens' Device (Maybe Bool)
+dBlocked = lens _dBlocked (\ s a -> s{_dBlocked = a})
+
+-- | [Output only] The last time a telemetry event was received. Timestamps
+-- are periodically collected and written to storage; they may be stale by
+-- a few minutes.
+dLastEventTime :: Lens' Device (Maybe UTCTime)
+dLastEventTime
+  = lens _dLastEventTime
+      (\ s a -> s{_dLastEventTime = a})
+      . mapping _DateTime
+
+instance FromJSON Device where
+        parseJSON
+          = withObject "Device"
+              (\ o ->
+                 Device' <$>
+                   (o .:? "state") <*> (o .:? "lastHeartbeatTime") <*>
+                     (o .:? "gatewayConfig")
+                     <*> (o .:? "logLevel")
+                     <*> (o .:? "config")
+                     <*> (o .:? "credentials" .!= mempty)
+                     <*> (o .:? "numId")
+                     <*> (o .:? "lastErrorStatus")
+                     <*> (o .:? "lastConfigSendTime")
+                     <*> (o .:? "lastConfigAckTime")
+                     <*> (o .:? "name")
+                     <*> (o .:? "lastErrorTime")
+                     <*> (o .:? "metadata")
+                     <*> (o .:? "id")
+                     <*> (o .:? "lastStateTime")
+                     <*> (o .:? "blocked")
+                     <*> (o .:? "lastEventTime"))
+
+instance ToJSON Device where
+        toJSON Device'{..}
+          = object
+              (catMaybes
+                 [("state" .=) <$> _dState,
+                  ("lastHeartbeatTime" .=) <$> _dLastHeartbeatTime,
+                  ("gatewayConfig" .=) <$> _dGatewayConfig,
+                  ("logLevel" .=) <$> _dLogLevel,
+                  ("config" .=) <$> _dConfig,
+                  ("credentials" .=) <$> _dCredentials,
+                  ("numId" .=) <$> _dNumId,
+                  ("lastErrorStatus" .=) <$> _dLastErrorStatus,
+                  ("lastConfigSendTime" .=) <$> _dLastConfigSendTime,
+                  ("lastConfigAckTime" .=) <$> _dLastConfigAckTime,
+                  ("name" .=) <$> _dName,
+                  ("lastErrorTime" .=) <$> _dLastErrorTime,
+                  ("metadata" .=) <$> _dMetadata, ("id" .=) <$> _dId,
+                  ("lastStateTime" .=) <$> _dLastStateTime,
+                  ("blocked" .=) <$> _dBlocked,
+                  ("lastEventTime" .=) <$> _dLastEventTime])
+
+-- | A server-stored device credential used for authentication.
+--
+-- /See:/ 'deviceCredential' smart constructor.
+data DeviceCredential = DeviceCredential'
+    { _dcPublicKey      :: !(Maybe PublicKeyCredential)
+    , _dcExpirationTime :: !(Maybe DateTime')
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DeviceCredential' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dcPublicKey'
+--
+-- * 'dcExpirationTime'
+deviceCredential
+    :: DeviceCredential
+deviceCredential =
+    DeviceCredential'
+    { _dcPublicKey = Nothing
+    , _dcExpirationTime = Nothing
+    }
+
+-- | A public key used to verify the signature of JSON Web Tokens (JWTs).
+-- When adding a new device credential, either via device creation or via
+-- modifications, this public key credential may be required to be signed
+-- by one of the registry level certificates. More specifically, if the
+-- registry contains at least one certificate, any new device credential
+-- must be signed by one of the registry certificates. As a result, when
+-- the registry contains certificates, only X.509 certificates are accepted
+-- as device credentials. However, if the registry does not contain a
+-- certificate, self-signed certificates and public keys will be accepted.
+-- New device credentials must be different from every registry-level
+-- certificate.
+dcPublicKey :: Lens' DeviceCredential (Maybe PublicKeyCredential)
+dcPublicKey
+  = lens _dcPublicKey (\ s a -> s{_dcPublicKey = a})
+
+-- | [Optional] The time at which this credential becomes invalid. This
+-- credential will be ignored for new client authentication requests after
+-- this timestamp; however, it will not be automatically deleted.
+dcExpirationTime :: Lens' DeviceCredential (Maybe UTCTime)
+dcExpirationTime
+  = lens _dcExpirationTime
+      (\ s a -> s{_dcExpirationTime = a})
+      . mapping _DateTime
+
+instance FromJSON DeviceCredential where
+        parseJSON
+          = withObject "DeviceCredential"
+              (\ o ->
+                 DeviceCredential' <$>
+                   (o .:? "publicKey") <*> (o .:? "expirationTime"))
+
+instance ToJSON DeviceCredential where
+        toJSON DeviceCredential'{..}
+          = object
+              (catMaybes
+                 [("publicKey" .=) <$> _dcPublicKey,
+                  ("expirationTime" .=) <$> _dcExpirationTime])
+
+-- | The configuration for forwarding telemetry events.
+--
+-- /See:/ 'eventNotificationConfig' smart constructor.
+data EventNotificationConfig = EventNotificationConfig'
+    { _encPubsubTopicName  :: !(Maybe Text)
+    , _encSubfolderMatches :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'EventNotificationConfig' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'encPubsubTopicName'
+--
+-- * 'encSubfolderMatches'
+eventNotificationConfig
+    :: EventNotificationConfig
+eventNotificationConfig =
+    EventNotificationConfig'
+    { _encPubsubTopicName = Nothing
+    , _encSubfolderMatches = Nothing
+    }
+
+-- | A Cloud Pub\/Sub topic name. For example,
+-- \`projects\/myProject\/topics\/deviceEvents\`.
+encPubsubTopicName :: Lens' EventNotificationConfig (Maybe Text)
+encPubsubTopicName
+  = lens _encPubsubTopicName
+      (\ s a -> s{_encPubsubTopicName = a})
+
+-- | If the subfolder name matches this string exactly, this configuration
+-- will be used. The string must not include the leading \'\/\' character.
+-- If empty, all strings are matched. This field is used only for telemetry
+-- events; subfolders are not supported for state changes.
+encSubfolderMatches :: Lens' EventNotificationConfig (Maybe Text)
+encSubfolderMatches
+  = lens _encSubfolderMatches
+      (\ s a -> s{_encSubfolderMatches = a})
+
+instance FromJSON EventNotificationConfig where
+        parseJSON
+          = withObject "EventNotificationConfig"
+              (\ o ->
+                 EventNotificationConfig' <$>
+                   (o .:? "pubsubTopicName") <*>
+                     (o .:? "subfolderMatches"))
+
+instance ToJSON EventNotificationConfig where
+        toJSON EventNotificationConfig'{..}
+          = object
+              (catMaybes
+                 [("pubsubTopicName" .=) <$> _encPubsubTopicName,
+                  ("subfolderMatches" .=) <$> _encSubfolderMatches])
+
+-- | Details of an X.509 certificate. For informational purposes only.
+--
+-- /See:/ 'x509CertificateDetails' smart constructor.
+data X509CertificateDetails = X509CertificateDetails'
+    { _xcdSubject            :: !(Maybe Text)
+    , _xcdExpiryTime         :: !(Maybe DateTime')
+    , _xcdStartTime          :: !(Maybe DateTime')
+    , _xcdSignatureAlgorithm :: !(Maybe Text)
+    , _xcdIssuer             :: !(Maybe Text)
+    , _xcdPublicKeyType      :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'X509CertificateDetails' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'xcdSubject'
+--
+-- * 'xcdExpiryTime'
+--
+-- * 'xcdStartTime'
+--
+-- * 'xcdSignatureAlgorithm'
+--
+-- * 'xcdIssuer'
+--
+-- * 'xcdPublicKeyType'
+x509CertificateDetails
+    :: X509CertificateDetails
+x509CertificateDetails =
+    X509CertificateDetails'
+    { _xcdSubject = Nothing
+    , _xcdExpiryTime = Nothing
+    , _xcdStartTime = Nothing
+    , _xcdSignatureAlgorithm = Nothing
+    , _xcdIssuer = Nothing
+    , _xcdPublicKeyType = Nothing
+    }
+
+-- | The entity the certificate and public key belong to.
+xcdSubject :: Lens' X509CertificateDetails (Maybe Text)
+xcdSubject
+  = lens _xcdSubject (\ s a -> s{_xcdSubject = a})
+
+-- | The time the certificate becomes invalid.
+xcdExpiryTime :: Lens' X509CertificateDetails (Maybe UTCTime)
+xcdExpiryTime
+  = lens _xcdExpiryTime
+      (\ s a -> s{_xcdExpiryTime = a})
+      . mapping _DateTime
+
+-- | The time the certificate becomes valid.
+xcdStartTime :: Lens' X509CertificateDetails (Maybe UTCTime)
+xcdStartTime
+  = lens _xcdStartTime (\ s a -> s{_xcdStartTime = a})
+      . mapping _DateTime
+
+-- | The algorithm used to sign the certificate.
+xcdSignatureAlgorithm :: Lens' X509CertificateDetails (Maybe Text)
+xcdSignatureAlgorithm
+  = lens _xcdSignatureAlgorithm
+      (\ s a -> s{_xcdSignatureAlgorithm = a})
+
+-- | The entity that signed the certificate.
+xcdIssuer :: Lens' X509CertificateDetails (Maybe Text)
+xcdIssuer
+  = lens _xcdIssuer (\ s a -> s{_xcdIssuer = a})
+
+-- | The type of public key in the certificate.
+xcdPublicKeyType :: Lens' X509CertificateDetails (Maybe Text)
+xcdPublicKeyType
+  = lens _xcdPublicKeyType
+      (\ s a -> s{_xcdPublicKeyType = a})
+
+instance FromJSON X509CertificateDetails where
+        parseJSON
+          = withObject "X509CertificateDetails"
+              (\ o ->
+                 X509CertificateDetails' <$>
+                   (o .:? "subject") <*> (o .:? "expiryTime") <*>
+                     (o .:? "startTime")
+                     <*> (o .:? "signatureAlgorithm")
+                     <*> (o .:? "issuer")
+                     <*> (o .:? "publicKeyType"))
+
+instance ToJSON X509CertificateDetails where
+        toJSON X509CertificateDetails'{..}
+          = object
+              (catMaybes
+                 [("subject" .=) <$> _xcdSubject,
+                  ("expiryTime" .=) <$> _xcdExpiryTime,
+                  ("startTime" .=) <$> _xcdStartTime,
+                  ("signatureAlgorithm" .=) <$> _xcdSignatureAlgorithm,
+                  ("issuer" .=) <$> _xcdIssuer,
+                  ("publicKeyType" .=) <$> _xcdPublicKeyType])
+
+-- | A public key certificate format and data.
+--
+-- /See:/ 'publicKeyCertificate' smart constructor.
+data PublicKeyCertificate = PublicKeyCertificate'
+    { _pkcFormat      :: !(Maybe PublicKeyCertificateFormat)
+    , _pkcCertificate :: !(Maybe Text)
+    , _pkcX509Details :: !(Maybe X509CertificateDetails)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'PublicKeyCertificate' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'pkcFormat'
+--
+-- * 'pkcCertificate'
+--
+-- * 'pkcX509Details'
+publicKeyCertificate
+    :: PublicKeyCertificate
+publicKeyCertificate =
+    PublicKeyCertificate'
+    { _pkcFormat = Nothing
+    , _pkcCertificate = Nothing
+    , _pkcX509Details = Nothing
+    }
+
+-- | The certificate format.
+pkcFormat :: Lens' PublicKeyCertificate (Maybe PublicKeyCertificateFormat)
+pkcFormat
+  = lens _pkcFormat (\ s a -> s{_pkcFormat = a})
+
+-- | The certificate data.
+pkcCertificate :: Lens' PublicKeyCertificate (Maybe Text)
+pkcCertificate
+  = lens _pkcCertificate
+      (\ s a -> s{_pkcCertificate = a})
+
+-- | [Output only] The certificate details. Used only for X.509 certificates.
+pkcX509Details :: Lens' PublicKeyCertificate (Maybe X509CertificateDetails)
+pkcX509Details
+  = lens _pkcX509Details
+      (\ s a -> s{_pkcX509Details = a})
+
+instance FromJSON PublicKeyCertificate where
+        parseJSON
+          = withObject "PublicKeyCertificate"
+              (\ o ->
+                 PublicKeyCertificate' <$>
+                   (o .:? "format") <*> (o .:? "certificate") <*>
+                     (o .:? "x509Details"))
+
+instance ToJSON PublicKeyCertificate where
+        toJSON PublicKeyCertificate'{..}
+          = object
+              (catMaybes
+                 [("format" .=) <$> _pkcFormat,
+                  ("certificate" .=) <$> _pkcCertificate,
+                  ("x509Details" .=) <$> _pkcX509Details])
+
+--
+-- /See:/ 'statusDetailsItem' smart constructor.
+newtype StatusDetailsItem = StatusDetailsItem'
+    { _sdiAddtional :: HashMap Text JSONValue
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'StatusDetailsItem' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sdiAddtional'
+statusDetailsItem
+    :: HashMap Text JSONValue -- ^ 'sdiAddtional'
+    -> StatusDetailsItem
+statusDetailsItem pSdiAddtional_ =
+    StatusDetailsItem'
+    { _sdiAddtional = _Coerce # pSdiAddtional_
+    }
+
+-- | Properties of the object. Contains field \'type with type URL.
+sdiAddtional :: Lens' StatusDetailsItem (HashMap Text JSONValue)
+sdiAddtional
+  = lens _sdiAddtional (\ s a -> s{_sdiAddtional = a})
+      . _Coerce
+
+instance FromJSON StatusDetailsItem where
+        parseJSON
+          = withObject "StatusDetailsItem"
+              (\ o -> StatusDetailsItem' <$> (parseJSONObject o))
+
+instance ToJSON StatusDetailsItem where
+        toJSON = toJSON . _sdiAddtional
+
+-- | The configuration of MQTT for a device registry.
+--
+-- /See:/ 'mqttConfig' smart constructor.
+newtype MqttConfig = MqttConfig'
+    { _mcMqttEnabledState :: Maybe MqttConfigMqttEnabledState
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'MqttConfig' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'mcMqttEnabledState'
+mqttConfig
+    :: MqttConfig
+mqttConfig =
+    MqttConfig'
+    { _mcMqttEnabledState = Nothing
+    }
+
+-- | If enabled, allows connections using the MQTT protocol. Otherwise, MQTT
+-- connections to this registry will fail.
+mcMqttEnabledState :: Lens' MqttConfig (Maybe MqttConfigMqttEnabledState)
+mcMqttEnabledState
+  = lens _mcMqttEnabledState
+      (\ s a -> s{_mcMqttEnabledState = a})
+
+instance FromJSON MqttConfig where
+        parseJSON
+          = withObject "MqttConfig"
+              (\ o -> MqttConfig' <$> (o .:? "mqttEnabledState"))
+
+instance ToJSON MqttConfig where
+        toJSON MqttConfig'{..}
+          = object
+              (catMaybes
+                 [("mqttEnabledState" .=) <$> _mcMqttEnabledState])
+
+-- | Request message for \`SetIamPolicy\` method.
+--
+-- /See:/ 'setIAMPolicyRequest' smart constructor.
+newtype SetIAMPolicyRequest = SetIAMPolicyRequest'
+    { _siprPolicy :: Maybe Policy
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SetIAMPolicyRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'siprPolicy'
+setIAMPolicyRequest
+    :: SetIAMPolicyRequest
+setIAMPolicyRequest =
+    SetIAMPolicyRequest'
+    { _siprPolicy = Nothing
+    }
+
+-- | REQUIRED: The complete policy to be applied to the \`resource\`. The
+-- size of the policy is limited to a few 10s of KB. An empty policy is a
+-- valid policy but certain Cloud Platform services (such as Projects)
+-- might reject them.
+siprPolicy :: Lens' SetIAMPolicyRequest (Maybe Policy)
+siprPolicy
+  = lens _siprPolicy (\ s a -> s{_siprPolicy = a})
+
+instance FromJSON SetIAMPolicyRequest where
+        parseJSON
+          = withObject "SetIAMPolicyRequest"
+              (\ o -> SetIAMPolicyRequest' <$> (o .:? "policy"))
+
+instance ToJSON SetIAMPolicyRequest where
+        toJSON SetIAMPolicyRequest'{..}
+          = object (catMaybes [("policy" .=) <$> _siprPolicy])
+
+-- | A server-stored registry credential used to validate device credentials.
+--
+-- /See:/ 'registryCredential' smart constructor.
+newtype RegistryCredential = RegistryCredential'
+    { _rcPublicKeyCertificate :: Maybe PublicKeyCertificate
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'RegistryCredential' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'rcPublicKeyCertificate'
+registryCredential
+    :: RegistryCredential
+registryCredential =
+    RegistryCredential'
+    { _rcPublicKeyCertificate = Nothing
+    }
+
+-- | A public key certificate used to verify the device credentials.
+rcPublicKeyCertificate :: Lens' RegistryCredential (Maybe PublicKeyCertificate)
+rcPublicKeyCertificate
+  = lens _rcPublicKeyCertificate
+      (\ s a -> s{_rcPublicKeyCertificate = a})
+
+instance FromJSON RegistryCredential where
+        parseJSON
+          = withObject "RegistryCredential"
+              (\ o ->
+                 RegistryCredential' <$>
+                   (o .:? "publicKeyCertificate"))
+
+instance ToJSON RegistryCredential where
+        toJSON RegistryCredential'{..}
+          = object
+              (catMaybes
+                 [("publicKeyCertificate" .=) <$>
+                    _rcPublicKeyCertificate])
+
+-- | Request for \`SendCommandToDevice\`.
+--
+-- /See:/ 'sendCommandToDeviceRequest' smart constructor.
+data SendCommandToDeviceRequest = SendCommandToDeviceRequest'
+    { _sctdrBinaryData :: !(Maybe Bytes)
+    , _sctdrSubfolder  :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SendCommandToDeviceRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sctdrBinaryData'
+--
+-- * 'sctdrSubfolder'
+sendCommandToDeviceRequest
+    :: SendCommandToDeviceRequest
+sendCommandToDeviceRequest =
+    SendCommandToDeviceRequest'
+    { _sctdrBinaryData = Nothing
+    , _sctdrSubfolder = Nothing
+    }
+
+-- | The command data to send to the device.
+sctdrBinaryData :: Lens' SendCommandToDeviceRequest (Maybe ByteString)
+sctdrBinaryData
+  = lens _sctdrBinaryData
+      (\ s a -> s{_sctdrBinaryData = a})
+      . mapping _Bytes
+
+-- | Optional subfolder for the command. If empty, the command will be
+-- delivered to the \/devices\/{device-id}\/commands topic, otherwise it
+-- will be delivered to the \/devices\/{device-id}\/commands\/{subfolder}
+-- topic. Multi-level subfolders are allowed. This field must not have more
+-- than 256 characters, and must not contain any MQTT wildcards (\"+\" or
+-- \"#\") or null characters.
+sctdrSubfolder :: Lens' SendCommandToDeviceRequest (Maybe Text)
+sctdrSubfolder
+  = lens _sctdrSubfolder
+      (\ s a -> s{_sctdrSubfolder = a})
+
+instance FromJSON SendCommandToDeviceRequest where
+        parseJSON
+          = withObject "SendCommandToDeviceRequest"
+              (\ o ->
+                 SendCommandToDeviceRequest' <$>
+                   (o .:? "binaryData") <*> (o .:? "subfolder"))
+
+instance ToJSON SendCommandToDeviceRequest where
+        toJSON SendCommandToDeviceRequest'{..}
+          = object
+              (catMaybes
+                 [("binaryData" .=) <$> _sctdrBinaryData,
+                  ("subfolder" .=) <$> _sctdrSubfolder])
+
+-- | Response for \`BindDeviceToGateway\`.
+--
+-- /See:/ 'bindDeviceToGatewayResponse' smart constructor.
+data BindDeviceToGatewayResponse =
+    BindDeviceToGatewayResponse'
+    deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'BindDeviceToGatewayResponse' with the minimum fields required to make a request.
+--
+bindDeviceToGatewayResponse
+    :: BindDeviceToGatewayResponse
+bindDeviceToGatewayResponse = BindDeviceToGatewayResponse'
+
+instance FromJSON BindDeviceToGatewayResponse where
+        parseJSON
+          = withObject "BindDeviceToGatewayResponse"
+              (\ o -> pure BindDeviceToGatewayResponse')
+
+instance ToJSON BindDeviceToGatewayResponse where
+        toJSON = const emptyObject
+
+-- | The configuration of the HTTP bridge for a device registry.
+--
+-- /See:/ 'hTTPConfig' smart constructor.
+newtype HTTPConfig = HTTPConfig'
+    { _httpcHTTPEnabledState :: Maybe HTTPConfigHTTPEnabledState
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'HTTPConfig' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'httpcHTTPEnabledState'
+hTTPConfig
+    :: HTTPConfig
+hTTPConfig =
+    HTTPConfig'
+    { _httpcHTTPEnabledState = Nothing
+    }
+
+-- | If enabled, allows devices to use DeviceService via the HTTP protocol.
+-- Otherwise, any requests to DeviceService will fail for this registry.
+httpcHTTPEnabledState :: Lens' HTTPConfig (Maybe HTTPConfigHTTPEnabledState)
+httpcHTTPEnabledState
+  = lens _httpcHTTPEnabledState
+      (\ s a -> s{_httpcHTTPEnabledState = a})
+
+instance FromJSON HTTPConfig where
+        parseJSON
+          = withObject "HTTPConfig"
+              (\ o -> HTTPConfig' <$> (o .:? "httpEnabledState"))
+
+instance ToJSON HTTPConfig where
+        toJSON HTTPConfig'{..}
+          = object
+              (catMaybes
+                 [("httpEnabledState" .=) <$> _httpcHTTPEnabledState])
+
+-- | Request message for \`TestIamPermissions\` method.
+--
+-- /See:/ 'testIAMPermissionsRequest' smart constructor.
+newtype TestIAMPermissionsRequest = TestIAMPermissionsRequest'
+    { _tiprPermissions :: Maybe [Text]
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'TestIAMPermissionsRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'tiprPermissions'
+testIAMPermissionsRequest
+    :: TestIAMPermissionsRequest
+testIAMPermissionsRequest =
+    TestIAMPermissionsRequest'
+    { _tiprPermissions = Nothing
+    }
+
+-- | The set of permissions to check for the \`resource\`. Permissions with
+-- wildcards (such as \'*\' or \'storage.*\') are not allowed. For more
+-- information see [IAM
+-- Overview](https:\/\/cloud.google.com\/iam\/docs\/overview#permissions).
+tiprPermissions :: Lens' TestIAMPermissionsRequest [Text]
+tiprPermissions
+  = lens _tiprPermissions
+      (\ s a -> s{_tiprPermissions = a})
+      . _Default
+      . _Coerce
+
+instance FromJSON TestIAMPermissionsRequest where
+        parseJSON
+          = withObject "TestIAMPermissionsRequest"
+              (\ o ->
+                 TestIAMPermissionsRequest' <$>
+                   (o .:? "permissions" .!= mempty))
+
+instance ToJSON TestIAMPermissionsRequest where
+        toJSON TestIAMPermissionsRequest'{..}
+          = object
+              (catMaybes [("permissions" .=) <$> _tiprPermissions])
+
+-- | Response for \`ListDevices\`.
+--
+-- /See:/ 'listDevicesResponse' smart constructor.
+data ListDevicesResponse = ListDevicesResponse'
+    { _ldrNextPageToken :: !(Maybe Text)
+    , _ldrDevices       :: !(Maybe [Device])
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ListDevicesResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ldrNextPageToken'
+--
+-- * 'ldrDevices'
+listDevicesResponse
+    :: ListDevicesResponse
+listDevicesResponse =
+    ListDevicesResponse'
+    { _ldrNextPageToken = Nothing
+    , _ldrDevices = Nothing
+    }
+
+-- | If not empty, indicates that there may be more devices that match the
+-- request; this value should be passed in a new \`ListDevicesRequest\`.
+ldrNextPageToken :: Lens' ListDevicesResponse (Maybe Text)
+ldrNextPageToken
+  = lens _ldrNextPageToken
+      (\ s a -> s{_ldrNextPageToken = a})
+
+-- | The devices that match the request.
+ldrDevices :: Lens' ListDevicesResponse [Device]
+ldrDevices
+  = lens _ldrDevices (\ s a -> s{_ldrDevices = a}) .
+      _Default
+      . _Coerce
+
+instance FromJSON ListDevicesResponse where
+        parseJSON
+          = withObject "ListDevicesResponse"
+              (\ o ->
+                 ListDevicesResponse' <$>
+                   (o .:? "nextPageToken") <*>
+                     (o .:? "devices" .!= mempty))
+
+instance ToJSON ListDevicesResponse where
+        toJSON ListDevicesResponse'{..}
+          = object
+              (catMaybes
+                 [("nextPageToken" .=) <$> _ldrNextPageToken,
+                  ("devices" .=) <$> _ldrDevices])
+
+-- | The metadata key-value pairs assigned to the device. This metadata is
+-- not interpreted or indexed by Cloud IoT Core. It can be used to add
+-- contextual information for the device. Keys must conform to the regular
+-- expression a-zA-Z+ and be less than 128 bytes in length. Values are
+-- free-form strings. Each value must be less than or equal to 32 KB in
+-- size. The total size of all keys and values must be less than 256 KB,
+-- and the maximum number of key-value pairs is 500.
+--
+-- /See:/ 'deviceMetadata' smart constructor.
+newtype DeviceMetadata = DeviceMetadata'
+    { _dmAddtional :: HashMap Text Text
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DeviceMetadata' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dmAddtional'
+deviceMetadata
+    :: HashMap Text Text -- ^ 'dmAddtional'
+    -> DeviceMetadata
+deviceMetadata pDmAddtional_ =
+    DeviceMetadata'
+    { _dmAddtional = _Coerce # pDmAddtional_
+    }
+
+dmAddtional :: Lens' DeviceMetadata (HashMap Text Text)
+dmAddtional
+  = lens _dmAddtional (\ s a -> s{_dmAddtional = a}) .
+      _Coerce
+
+instance FromJSON DeviceMetadata where
+        parseJSON
+          = withObject "DeviceMetadata"
+              (\ o -> DeviceMetadata' <$> (parseJSONObject o))
+
+instance ToJSON DeviceMetadata where
+        toJSON = toJSON . _dmAddtional
+
+-- | A container for a group of devices.
+--
+-- /See:/ 'deviceRegistry' smart constructor.
+data DeviceRegistry = DeviceRegistry'
+    { _drLogLevel                 :: !(Maybe DeviceRegistryLogLevel)
+    , _drCredentials              :: !(Maybe [RegistryCredential])
+    , _drStateNotificationConfig  :: !(Maybe StateNotificationConfig)
+    , _drEventNotificationConfigs :: !(Maybe [EventNotificationConfig])
+    , _drMqttConfig               :: !(Maybe MqttConfig)
+    , _drName                     :: !(Maybe Text)
+    , _drHTTPConfig               :: !(Maybe HTTPConfig)
+    , _drId                       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DeviceRegistry' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'drLogLevel'
+--
+-- * 'drCredentials'
+--
+-- * 'drStateNotificationConfig'
+--
+-- * 'drEventNotificationConfigs'
+--
+-- * 'drMqttConfig'
+--
+-- * 'drName'
+--
+-- * 'drHTTPConfig'
+--
+-- * 'drId'
+deviceRegistry
+    :: DeviceRegistry
+deviceRegistry =
+    DeviceRegistry'
+    { _drLogLevel = Nothing
+    , _drCredentials = Nothing
+    , _drStateNotificationConfig = Nothing
+    , _drEventNotificationConfigs = Nothing
+    , _drMqttConfig = Nothing
+    , _drName = Nothing
+    , _drHTTPConfig = Nothing
+    , _drId = Nothing
+    }
+
+-- | **Beta Feature** The default logging verbosity for activity from devices
+-- in this registry. The verbosity level can be overridden by
+-- Device.log_level.
+drLogLevel :: Lens' DeviceRegistry (Maybe DeviceRegistryLogLevel)
+drLogLevel
+  = lens _drLogLevel (\ s a -> s{_drLogLevel = a})
+
+-- | The credentials used to verify the device credentials. No more than 10
+-- credentials can be bound to a single registry at a time. The
+-- verification process occurs at the time of device creation or update. If
+-- this field is empty, no verification is performed. Otherwise, the
+-- credentials of a newly created device or added credentials of an updated
+-- device should be signed with one of these registry credentials. Note,
+-- however, that existing devices will never be affected by modifications
+-- to this list of credentials: after a device has been successfully
+-- created in a registry, it should be able to connect even if its registry
+-- credentials are revoked, deleted, or modified.
+drCredentials :: Lens' DeviceRegistry [RegistryCredential]
+drCredentials
+  = lens _drCredentials
+      (\ s a -> s{_drCredentials = a})
+      . _Default
+      . _Coerce
+
+-- | The configuration for notification of new states received from the
+-- device. State updates are guaranteed to be stored in the state history,
+-- but notifications to Cloud Pub\/Sub are not guaranteed. For example, if
+-- permissions are misconfigured or the specified topic doesn\'t exist, no
+-- notification will be published but the state will still be stored in
+-- Cloud IoT Core.
+drStateNotificationConfig :: Lens' DeviceRegistry (Maybe StateNotificationConfig)
+drStateNotificationConfig
+  = lens _drStateNotificationConfig
+      (\ s a -> s{_drStateNotificationConfig = a})
+
+-- | The configuration for notification of telemetry events received from the
+-- device. All telemetry events that were successfully published by the
+-- device and acknowledged by Cloud IoT Core are guaranteed to be delivered
+-- to Cloud Pub\/Sub. If multiple configurations match a message, only the
+-- first matching configuration is used. If you try to publish a device
+-- telemetry event using MQTT without specifying a Cloud Pub\/Sub topic for
+-- the device\'s registry, the connection closes automatically. If you try
+-- to do so using an HTTP connection, an error is returned. Up to 10
+-- configurations may be provided.
+drEventNotificationConfigs :: Lens' DeviceRegistry [EventNotificationConfig]
+drEventNotificationConfigs
+  = lens _drEventNotificationConfigs
+      (\ s a -> s{_drEventNotificationConfigs = a})
+      . _Default
+      . _Coerce
+
+-- | The MQTT configuration for this device registry.
+drMqttConfig :: Lens' DeviceRegistry (Maybe MqttConfig)
+drMqttConfig
+  = lens _drMqttConfig (\ s a -> s{_drMqttConfig = a})
+
+-- | The resource path name. For example,
+-- \`projects\/example-project\/locations\/us-central1\/registries\/my-registry\`.
+drName :: Lens' DeviceRegistry (Maybe Text)
+drName = lens _drName (\ s a -> s{_drName = a})
+
+-- | The DeviceService (HTTP) configuration for this device registry.
+drHTTPConfig :: Lens' DeviceRegistry (Maybe HTTPConfig)
+drHTTPConfig
+  = lens _drHTTPConfig (\ s a -> s{_drHTTPConfig = a})
+
+-- | The identifier of this device registry. For example, \`myRegistry\`.
+drId :: Lens' DeviceRegistry (Maybe Text)
+drId = lens _drId (\ s a -> s{_drId = a})
+
+instance FromJSON DeviceRegistry where
+        parseJSON
+          = withObject "DeviceRegistry"
+              (\ o ->
+                 DeviceRegistry' <$>
+                   (o .:? "logLevel") <*>
+                     (o .:? "credentials" .!= mempty)
+                     <*> (o .:? "stateNotificationConfig")
+                     <*> (o .:? "eventNotificationConfigs" .!= mempty)
+                     <*> (o .:? "mqttConfig")
+                     <*> (o .:? "name")
+                     <*> (o .:? "httpConfig")
+                     <*> (o .:? "id"))
+
+instance ToJSON DeviceRegistry where
+        toJSON DeviceRegistry'{..}
+          = object
+              (catMaybes
+                 [("logLevel" .=) <$> _drLogLevel,
+                  ("credentials" .=) <$> _drCredentials,
+                  ("stateNotificationConfig" .=) <$>
+                    _drStateNotificationConfig,
+                  ("eventNotificationConfigs" .=) <$>
+                    _drEventNotificationConfigs,
+                  ("mqttConfig" .=) <$> _drMqttConfig,
+                  ("name" .=) <$> _drName,
+                  ("httpConfig" .=) <$> _drHTTPConfig,
+                  ("id" .=) <$> _drId])
+
+-- | A public key format and data.
+--
+-- /See:/ 'publicKeyCredential' smart constructor.
+data PublicKeyCredential = PublicKeyCredential'
+    { _pFormat :: !(Maybe PublicKeyCredentialFormat)
+    , _pKey    :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'PublicKeyCredential' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'pFormat'
+--
+-- * 'pKey'
+publicKeyCredential
+    :: PublicKeyCredential
+publicKeyCredential =
+    PublicKeyCredential'
+    { _pFormat = Nothing
+    , _pKey = Nothing
+    }
+
+-- | The format of the key.
+pFormat :: Lens' PublicKeyCredential (Maybe PublicKeyCredentialFormat)
+pFormat = lens _pFormat (\ s a -> s{_pFormat = a})
+
+-- | The key data.
+pKey :: Lens' PublicKeyCredential (Maybe Text)
+pKey = lens _pKey (\ s a -> s{_pKey = a})
+
+instance FromJSON PublicKeyCredential where
+        parseJSON
+          = withObject "PublicKeyCredential"
+              (\ o ->
+                 PublicKeyCredential' <$>
+                   (o .:? "format") <*> (o .:? "key"))
+
+instance ToJSON PublicKeyCredential where
+        toJSON PublicKeyCredential'{..}
+          = object
+              (catMaybes
+                 [("format" .=) <$> _pFormat, ("key" .=) <$> _pKey])
+
+-- | Request for \`UnbindDeviceFromGateway\`.
+--
+-- /See:/ 'unbindDeviceFromGatewayRequest' smart constructor.
+data UnbindDeviceFromGatewayRequest = UnbindDeviceFromGatewayRequest'
+    { _udfgrDeviceId  :: !(Maybe Text)
+    , _udfgrGatewayId :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'UnbindDeviceFromGatewayRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'udfgrDeviceId'
+--
+-- * 'udfgrGatewayId'
+unbindDeviceFromGatewayRequest
+    :: UnbindDeviceFromGatewayRequest
+unbindDeviceFromGatewayRequest =
+    UnbindDeviceFromGatewayRequest'
+    { _udfgrDeviceId = Nothing
+    , _udfgrGatewayId = Nothing
+    }
+
+-- | The device to disassociate from the specified gateway. The value of
+-- \`device_id\` can be either the device numeric ID or the user-defined
+-- device identifier.
+udfgrDeviceId :: Lens' UnbindDeviceFromGatewayRequest (Maybe Text)
+udfgrDeviceId
+  = lens _udfgrDeviceId
+      (\ s a -> s{_udfgrDeviceId = a})
+
+-- | The value of \`gateway_id\` can be either the device numeric ID or the
+-- user-defined device identifier.
+udfgrGatewayId :: Lens' UnbindDeviceFromGatewayRequest (Maybe Text)
+udfgrGatewayId
+  = lens _udfgrGatewayId
+      (\ s a -> s{_udfgrGatewayId = a})
+
+instance FromJSON UnbindDeviceFromGatewayRequest
+         where
+        parseJSON
+          = withObject "UnbindDeviceFromGatewayRequest"
+              (\ o ->
+                 UnbindDeviceFromGatewayRequest' <$>
+                   (o .:? "deviceId") <*> (o .:? "gatewayId"))
+
+instance ToJSON UnbindDeviceFromGatewayRequest where
+        toJSON UnbindDeviceFromGatewayRequest'{..}
+          = object
+              (catMaybes
+                 [("deviceId" .=) <$> _udfgrDeviceId,
+                  ("gatewayId" .=) <$> _udfgrGatewayId])
+
+-- | Response message for \`TestIamPermissions\` method.
+--
+-- /See:/ 'testIAMPermissionsResponse' smart constructor.
+newtype TestIAMPermissionsResponse = TestIAMPermissionsResponse'
+    { _tiamprPermissions :: Maybe [Text]
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'TestIAMPermissionsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'tiamprPermissions'
+testIAMPermissionsResponse
+    :: TestIAMPermissionsResponse
+testIAMPermissionsResponse =
+    TestIAMPermissionsResponse'
+    { _tiamprPermissions = Nothing
+    }
+
+-- | A subset of \`TestPermissionsRequest.permissions\` that the caller is
+-- allowed.
+tiamprPermissions :: Lens' TestIAMPermissionsResponse [Text]
+tiamprPermissions
+  = lens _tiamprPermissions
+      (\ s a -> s{_tiamprPermissions = a})
+      . _Default
+      . _Coerce
+
+instance FromJSON TestIAMPermissionsResponse where
+        parseJSON
+          = withObject "TestIAMPermissionsResponse"
+              (\ o ->
+                 TestIAMPermissionsResponse' <$>
+                   (o .:? "permissions" .!= mempty))
+
+instance ToJSON TestIAMPermissionsResponse where
+        toJSON TestIAMPermissionsResponse'{..}
+          = object
+              (catMaybes
+                 [("permissions" .=) <$> _tiamprPermissions])
+
+-- | Defines an Identity and Access Management (IAM) policy. It is used to
+-- specify access control policies for Cloud Platform resources. A
+-- \`Policy\` consists of a list of \`bindings\`. A \`binding\` binds a
+-- list of \`members\` to a \`role\`, where the members can be user
+-- accounts, Google groups, Google domains, and service accounts. A
+-- \`role\` is a named list of permissions defined by IAM. **JSON Example**
+-- { \"bindings\": [ { \"role\": \"roles\/owner\", \"members\": [
+-- \"user:mike\'example.com\", \"group:admins\'example.com\",
+-- \"domain:google.com\",
+-- \"serviceAccount:my-other-app\'appspot.gserviceaccount.com\" ] }, {
+-- \"role\": \"roles\/viewer\", \"members\": [\"user:sean\'example.com\"] }
+-- ] } **YAML Example** bindings: - members: - user:mike\'example.com -
+-- group:admins\'example.com - domain:google.com -
+-- serviceAccount:my-other-app\'appspot.gserviceaccount.com role:
+-- roles\/owner - members: - user:sean\'example.com role: roles\/viewer For
+-- a description of IAM and its features, see the [IAM developer\'s
+-- guide](https:\/\/cloud.google.com\/iam\/docs).
+--
+-- /See:/ 'policy' smart constructor.
+data Policy = Policy'
+    { _pEtag     :: !(Maybe Bytes)
+    , _pVersion  :: !(Maybe (Textual Int32))
+    , _pBindings :: !(Maybe [Binding])
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Policy' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'pEtag'
+--
+-- * 'pVersion'
+--
+-- * 'pBindings'
+policy
+    :: Policy
+policy =
+    Policy'
+    { _pEtag = Nothing
+    , _pVersion = Nothing
+    , _pBindings = Nothing
+    }
+
+-- | \`etag\` is used for optimistic concurrency control as a way to help
+-- prevent simultaneous updates of a policy from overwriting each other. It
+-- is strongly suggested that systems make use of the \`etag\` in the
+-- read-modify-write cycle to perform policy updates in order to avoid race
+-- conditions: An \`etag\` is returned in the response to \`getIamPolicy\`,
+-- and systems are expected to put that etag in the request to
+-- \`setIamPolicy\` to ensure that their change will be applied to the same
+-- version of the policy. If no \`etag\` is provided in the call to
+-- \`setIamPolicy\`, then the existing policy is overwritten blindly.
+pEtag :: Lens' Policy (Maybe ByteString)
+pEtag
+  = lens _pEtag (\ s a -> s{_pEtag = a}) .
+      mapping _Bytes
+
+-- | Deprecated.
+pVersion :: Lens' Policy (Maybe Int32)
+pVersion
+  = lens _pVersion (\ s a -> s{_pVersion = a}) .
+      mapping _Coerce
+
+-- | Associates a list of \`members\` to a \`role\`. \`bindings\` with no
+-- members will result in an error.
+pBindings :: Lens' Policy [Binding]
+pBindings
+  = lens _pBindings (\ s a -> s{_pBindings = a}) .
+      _Default
+      . _Coerce
+
+instance FromJSON Policy where
+        parseJSON
+          = withObject "Policy"
+              (\ o ->
+                 Policy' <$>
+                   (o .:? "etag") <*> (o .:? "version") <*>
+                     (o .:? "bindings" .!= mempty))
+
+instance ToJSON Policy where
+        toJSON Policy'{..}
+          = object
+              (catMaybes
+                 [("etag" .=) <$> _pEtag,
+                  ("version" .=) <$> _pVersion,
+                  ("bindings" .=) <$> _pBindings])
+
+-- | Response for \`SendCommandToDevice\`.
+--
+-- /See:/ 'sendCommandToDeviceResponse' smart constructor.
+data SendCommandToDeviceResponse =
+    SendCommandToDeviceResponse'
+    deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SendCommandToDeviceResponse' with the minimum fields required to make a request.
+--
+sendCommandToDeviceResponse
+    :: SendCommandToDeviceResponse
+sendCommandToDeviceResponse = SendCommandToDeviceResponse'
+
+instance FromJSON SendCommandToDeviceResponse where
+        parseJSON
+          = withObject "SendCommandToDeviceResponse"
+              (\ o -> pure SendCommandToDeviceResponse')
+
+instance ToJSON SendCommandToDeviceResponse where
+        toJSON = const emptyObject
+
+-- | Request for \`BindDeviceToGateway\`.
+--
+-- /See:/ 'bindDeviceToGatewayRequest' smart constructor.
+data BindDeviceToGatewayRequest = BindDeviceToGatewayRequest'
+    { _bdtgrDeviceId  :: !(Maybe Text)
+    , _bdtgrGatewayId :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'BindDeviceToGatewayRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'bdtgrDeviceId'
+--
+-- * 'bdtgrGatewayId'
+bindDeviceToGatewayRequest
+    :: BindDeviceToGatewayRequest
+bindDeviceToGatewayRequest =
+    BindDeviceToGatewayRequest'
+    { _bdtgrDeviceId = Nothing
+    , _bdtgrGatewayId = Nothing
+    }
+
+-- | The device to associate with the specified gateway. The value of
+-- \`device_id\` can be either the device numeric ID or the user-defined
+-- device identifier.
+bdtgrDeviceId :: Lens' BindDeviceToGatewayRequest (Maybe Text)
+bdtgrDeviceId
+  = lens _bdtgrDeviceId
+      (\ s a -> s{_bdtgrDeviceId = a})
+
+-- | The value of \`gateway_id\` can be either the device numeric ID or the
+-- user-defined device identifier.
+bdtgrGatewayId :: Lens' BindDeviceToGatewayRequest (Maybe Text)
+bdtgrGatewayId
+  = lens _bdtgrGatewayId
+      (\ s a -> s{_bdtgrGatewayId = a})
+
+instance FromJSON BindDeviceToGatewayRequest where
+        parseJSON
+          = withObject "BindDeviceToGatewayRequest"
+              (\ o ->
+                 BindDeviceToGatewayRequest' <$>
+                   (o .:? "deviceId") <*> (o .:? "gatewayId"))
+
+instance ToJSON BindDeviceToGatewayRequest where
+        toJSON BindDeviceToGatewayRequest'{..}
+          = object
+              (catMaybes
+                 [("deviceId" .=) <$> _bdtgrDeviceId,
+                  ("gatewayId" .=) <$> _bdtgrGatewayId])
+
+-- | Request for \`ModifyCloudToDeviceConfig\`.
+--
+-- /See:/ 'modifyCloudToDeviceConfigRequest' smart constructor.
+data ModifyCloudToDeviceConfigRequest = ModifyCloudToDeviceConfigRequest'
+    { _mctdcrVersionToUpdate :: !(Maybe (Textual Int64))
+    , _mctdcrBinaryData      :: !(Maybe Bytes)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ModifyCloudToDeviceConfigRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'mctdcrVersionToUpdate'
+--
+-- * 'mctdcrBinaryData'
+modifyCloudToDeviceConfigRequest
+    :: ModifyCloudToDeviceConfigRequest
+modifyCloudToDeviceConfigRequest =
+    ModifyCloudToDeviceConfigRequest'
+    { _mctdcrVersionToUpdate = Nothing
+    , _mctdcrBinaryData = Nothing
+    }
+
+-- | The version number to update. If this value is zero, it will not check
+-- the version number of the server and will always update the current
+-- version; otherwise, this update will fail if the version number found on
+-- the server does not match this version number. This is used to support
+-- multiple simultaneous updates without losing data.
+mctdcrVersionToUpdate :: Lens' ModifyCloudToDeviceConfigRequest (Maybe Int64)
+mctdcrVersionToUpdate
+  = lens _mctdcrVersionToUpdate
+      (\ s a -> s{_mctdcrVersionToUpdate = a})
+      . mapping _Coerce
+
+-- | The configuration data for the device.
+mctdcrBinaryData :: Lens' ModifyCloudToDeviceConfigRequest (Maybe ByteString)
+mctdcrBinaryData
+  = lens _mctdcrBinaryData
+      (\ s a -> s{_mctdcrBinaryData = a})
+      . mapping _Bytes
+
+instance FromJSON ModifyCloudToDeviceConfigRequest
+         where
+        parseJSON
+          = withObject "ModifyCloudToDeviceConfigRequest"
+              (\ o ->
+                 ModifyCloudToDeviceConfigRequest' <$>
+                   (o .:? "versionToUpdate") <*> (o .:? "binaryData"))
+
+instance ToJSON ModifyCloudToDeviceConfigRequest
+         where
+        toJSON ModifyCloudToDeviceConfigRequest'{..}
+          = object
+              (catMaybes
+                 [("versionToUpdate" .=) <$> _mctdcrVersionToUpdate,
+                  ("binaryData" .=) <$> _mctdcrBinaryData])
+
+-- | Associates \`members\` with a \`role\`.
+--
+-- /See:/ 'binding' smart constructor.
+data Binding = Binding'
+    { _bMembers   :: !(Maybe [Text])
+    , _bRole      :: !(Maybe Text)
+    , _bCondition :: !(Maybe Expr)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Binding' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'bMembers'
+--
+-- * 'bRole'
+--
+-- * 'bCondition'
+binding
+    :: Binding
+binding =
+    Binding'
+    { _bMembers = Nothing
+    , _bRole = Nothing
+    , _bCondition = Nothing
+    }
+
+-- | Specifies the identities requesting access for a Cloud Platform
+-- resource. \`members\` can have the following values: * \`allUsers\`: A
+-- special identifier that represents anyone who is on the internet; with
+-- or without a Google account. * \`allAuthenticatedUsers\`: A special
+-- identifier that represents anyone who is authenticated with a Google
+-- account or a service account. * \`user:{emailid}\`: An email address
+-- that represents a specific Google account. For example,
+-- \`alice\'gmail.com\` . * \`serviceAccount:{emailid}\`: An email address
+-- that represents a service account. For example,
+-- \`my-other-app\'appspot.gserviceaccount.com\`. * \`group:{emailid}\`: An
+-- email address that represents a Google group. For example,
+-- \`admins\'example.com\`. * \`domain:{domain}\`: A Google Apps domain
+-- name that represents all the users of that domain. For example,
+-- \`google.com\` or \`example.com\`.
+bMembers :: Lens' Binding [Text]
+bMembers
+  = lens _bMembers (\ s a -> s{_bMembers = a}) .
+      _Default
+      . _Coerce
+
+-- | Role that is assigned to \`members\`. For example, \`roles\/viewer\`,
+-- \`roles\/editor\`, or \`roles\/owner\`.
+bRole :: Lens' Binding (Maybe Text)
+bRole = lens _bRole (\ s a -> s{_bRole = a})
+
+-- | Unimplemented. The condition that is associated with this binding. NOTE:
+-- an unsatisfied condition will not allow user access via current binding.
+-- Different bindings, including their conditions, are examined
+-- independently.
+bCondition :: Lens' Binding (Maybe Expr)
+bCondition
+  = lens _bCondition (\ s a -> s{_bCondition = a})
+
+instance FromJSON Binding where
+        parseJSON
+          = withObject "Binding"
+              (\ o ->
+                 Binding' <$>
+                   (o .:? "members" .!= mempty) <*> (o .:? "role") <*>
+                     (o .:? "condition"))
+
+instance ToJSON Binding where
+        toJSON Binding'{..}
+          = object
+              (catMaybes
+                 [("members" .=) <$> _bMembers,
+                  ("role" .=) <$> _bRole,
+                  ("condition" .=) <$> _bCondition])
diff --git a/gen/Network/Google/CloudIOT/Types/Sum.hs b/gen/Network/Google/CloudIOT/Types/Sum.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/CloudIOT/Types/Sum.hs
@@ -0,0 +1,385 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE LambdaCase         #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Network.Google.CloudIOT.Types.Sum
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+module Network.Google.CloudIOT.Types.Sum where
+
+import           Network.Google.Prelude hiding (Bytes)
+
+-- | **Beta Feature** The logging verbosity for device activity. If
+-- unspecified, DeviceRegistry.log_level will be used.
+data DeviceLogLevel
+    = LogLevelUnspecified
+      -- ^ @LOG_LEVEL_UNSPECIFIED@
+      -- No logging specified. If not specified, logging will be disabled.
+    | None
+      -- ^ @NONE@
+      -- Disables logging.
+    | Error'
+      -- ^ @ERROR@
+      -- Error events will be logged.
+    | Info
+      -- ^ @INFO@
+      -- Informational events will be logged, such as connections and
+      -- disconnections.
+    | Debug
+      -- ^ @DEBUG@
+      -- All events will be logged.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable DeviceLogLevel
+
+instance FromHttpApiData DeviceLogLevel where
+    parseQueryParam = \case
+        "LOG_LEVEL_UNSPECIFIED" -> Right LogLevelUnspecified
+        "NONE" -> Right None
+        "ERROR" -> Right Error'
+        "INFO" -> Right Info
+        "DEBUG" -> Right Debug
+        x -> Left ("Unable to parse DeviceLogLevel from: " <> x)
+
+instance ToHttpApiData DeviceLogLevel where
+    toQueryParam = \case
+        LogLevelUnspecified -> "LOG_LEVEL_UNSPECIFIED"
+        None -> "NONE"
+        Error' -> "ERROR"
+        Info -> "INFO"
+        Debug -> "DEBUG"
+
+instance FromJSON DeviceLogLevel where
+    parseJSON = parseJSONText "DeviceLogLevel"
+
+instance ToJSON DeviceLogLevel where
+    toJSON = toJSONText
+
+-- | The certificate format.
+data PublicKeyCertificateFormat
+    = UnspecifiedPublicKeyCertificateFormat
+      -- ^ @UNSPECIFIED_PUBLIC_KEY_CERTIFICATE_FORMAT@
+      -- The format has not been specified. This is an invalid default value and
+      -- must not be used.
+    | X509CertificatePem
+      -- ^ @X509_CERTIFICATE_PEM@
+      -- An X.509v3 certificate
+      -- ([RFC5280](https:\/\/www.ietf.org\/rfc\/rfc5280.txt)), encoded in
+      -- base64, and wrapped by \`-----BEGIN CERTIFICATE-----\` and \`-----END
+      -- CERTIFICATE-----\`.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable PublicKeyCertificateFormat
+
+instance FromHttpApiData PublicKeyCertificateFormat where
+    parseQueryParam = \case
+        "UNSPECIFIED_PUBLIC_KEY_CERTIFICATE_FORMAT" -> Right UnspecifiedPublicKeyCertificateFormat
+        "X509_CERTIFICATE_PEM" -> Right X509CertificatePem
+        x -> Left ("Unable to parse PublicKeyCertificateFormat from: " <> x)
+
+instance ToHttpApiData PublicKeyCertificateFormat where
+    toQueryParam = \case
+        UnspecifiedPublicKeyCertificateFormat -> "UNSPECIFIED_PUBLIC_KEY_CERTIFICATE_FORMAT"
+        X509CertificatePem -> "X509_CERTIFICATE_PEM"
+
+instance FromJSON PublicKeyCertificateFormat where
+    parseJSON = parseJSONText "PublicKeyCertificateFormat"
+
+instance ToJSON PublicKeyCertificateFormat where
+    toJSON = toJSONText
+
+-- | The format of the key.
+data PublicKeyCredentialFormat
+    = UnspecifiedPublicKeyFormat
+      -- ^ @UNSPECIFIED_PUBLIC_KEY_FORMAT@
+      -- The format has not been specified. This is an invalid default value and
+      -- must not be used.
+    | RsaPem
+      -- ^ @RSA_PEM@
+      -- An RSA public key encoded in base64, and wrapped by \`-----BEGIN PUBLIC
+      -- KEY-----\` and \`-----END PUBLIC KEY-----\`. This can be used to verify
+      -- \`RS256\` signatures in JWT tokens ([RFC7518](
+      -- https:\/\/www.ietf.org\/rfc\/rfc7518.txt)).
+    | RsaX509Pem
+      -- ^ @RSA_X509_PEM@
+      -- As RSA_PEM, but wrapped in an X.509v3 certificate ([RFC5280](
+      -- https:\/\/www.ietf.org\/rfc\/rfc5280.txt)), encoded in base64, and
+      -- wrapped by \`-----BEGIN CERTIFICATE-----\` and \`-----END
+      -- CERTIFICATE-----\`.
+    | ES256Pem
+      -- ^ @ES256_PEM@
+      -- Public key for the ECDSA algorithm using P-256 and SHA-256, encoded in
+      -- base64, and wrapped by \`-----BEGIN PUBLIC KEY-----\` and \`-----END
+      -- PUBLIC KEY-----\`. This can be used to verify JWT tokens with the
+      -- \`ES256\` algorithm
+      -- ([RFC7518](https:\/\/www.ietf.org\/rfc\/rfc7518.txt)). This curve is
+      -- defined in [OpenSSL](https:\/\/www.openssl.org\/) as the \`prime256v1\`
+      -- curve.
+    | ES256X509Pem
+      -- ^ @ES256_X509_PEM@
+      -- As ES256_PEM, but wrapped in an X.509v3 certificate ([RFC5280](
+      -- https:\/\/www.ietf.org\/rfc\/rfc5280.txt)), encoded in base64, and
+      -- wrapped by \`-----BEGIN CERTIFICATE-----\` and \`-----END
+      -- CERTIFICATE-----\`.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable PublicKeyCredentialFormat
+
+instance FromHttpApiData PublicKeyCredentialFormat where
+    parseQueryParam = \case
+        "UNSPECIFIED_PUBLIC_KEY_FORMAT" -> Right UnspecifiedPublicKeyFormat
+        "RSA_PEM" -> Right RsaPem
+        "RSA_X509_PEM" -> Right RsaX509Pem
+        "ES256_PEM" -> Right ES256Pem
+        "ES256_X509_PEM" -> Right ES256X509Pem
+        x -> Left ("Unable to parse PublicKeyCredentialFormat from: " <> x)
+
+instance ToHttpApiData PublicKeyCredentialFormat where
+    toQueryParam = \case
+        UnspecifiedPublicKeyFormat -> "UNSPECIFIED_PUBLIC_KEY_FORMAT"
+        RsaPem -> "RSA_PEM"
+        RsaX509Pem -> "RSA_X509_PEM"
+        ES256Pem -> "ES256_PEM"
+        ES256X509Pem -> "ES256_X509_PEM"
+
+instance FromJSON PublicKeyCredentialFormat where
+    parseJSON = parseJSONText "PublicKeyCredentialFormat"
+
+instance ToJSON PublicKeyCredentialFormat where
+    toJSON = toJSONText
+
+-- | **Beta Feature** The default logging verbosity for activity from devices
+-- in this registry. The verbosity level can be overridden by
+-- Device.log_level.
+data DeviceRegistryLogLevel
+    = DRLLLogLevelUnspecified
+      -- ^ @LOG_LEVEL_UNSPECIFIED@
+      -- No logging specified. If not specified, logging will be disabled.
+    | DRLLNone
+      -- ^ @NONE@
+      -- Disables logging.
+    | DRLLError'
+      -- ^ @ERROR@
+      -- Error events will be logged.
+    | DRLLInfo
+      -- ^ @INFO@
+      -- Informational events will be logged, such as connections and
+      -- disconnections.
+    | DRLLDebug
+      -- ^ @DEBUG@
+      -- All events will be logged.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable DeviceRegistryLogLevel
+
+instance FromHttpApiData DeviceRegistryLogLevel where
+    parseQueryParam = \case
+        "LOG_LEVEL_UNSPECIFIED" -> Right DRLLLogLevelUnspecified
+        "NONE" -> Right DRLLNone
+        "ERROR" -> Right DRLLError'
+        "INFO" -> Right DRLLInfo
+        "DEBUG" -> Right DRLLDebug
+        x -> Left ("Unable to parse DeviceRegistryLogLevel from: " <> x)
+
+instance ToHttpApiData DeviceRegistryLogLevel where
+    toQueryParam = \case
+        DRLLLogLevelUnspecified -> "LOG_LEVEL_UNSPECIFIED"
+        DRLLNone -> "NONE"
+        DRLLError' -> "ERROR"
+        DRLLInfo -> "INFO"
+        DRLLDebug -> "DEBUG"
+
+instance FromJSON DeviceRegistryLogLevel where
+    parseJSON = parseJSONText "DeviceRegistryLogLevel"
+
+instance ToJSON DeviceRegistryLogLevel where
+    toJSON = toJSONText
+
+-- | V1 error format.
+data Xgafv
+    = X1
+      -- ^ @1@
+      -- v1 error format
+    | X2
+      -- ^ @2@
+      -- v2 error format
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable Xgafv
+
+instance FromHttpApiData Xgafv where
+    parseQueryParam = \case
+        "1" -> Right X1
+        "2" -> Right X2
+        x -> Left ("Unable to parse Xgafv from: " <> x)
+
+instance ToHttpApiData Xgafv where
+    toQueryParam = \case
+        X1 -> "1"
+        X2 -> "2"
+
+instance FromJSON Xgafv where
+    parseJSON = parseJSONText "Xgafv"
+
+instance ToJSON Xgafv where
+    toJSON = toJSONText
+
+-- | Indicates whether the device is a gateway.
+data GatewayConfigGatewayType
+    = GatewayTypeUnspecified
+      -- ^ @GATEWAY_TYPE_UNSPECIFIED@
+      -- If unspecified, the device is considered a non-gateway device.
+    | Gateway
+      -- ^ @GATEWAY@
+      -- The device is a gateway.
+    | NonGateway
+      -- ^ @NON_GATEWAY@
+      -- The device is not a gateway.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable GatewayConfigGatewayType
+
+instance FromHttpApiData GatewayConfigGatewayType where
+    parseQueryParam = \case
+        "GATEWAY_TYPE_UNSPECIFIED" -> Right GatewayTypeUnspecified
+        "GATEWAY" -> Right Gateway
+        "NON_GATEWAY" -> Right NonGateway
+        x -> Left ("Unable to parse GatewayConfigGatewayType from: " <> x)
+
+instance ToHttpApiData GatewayConfigGatewayType where
+    toQueryParam = \case
+        GatewayTypeUnspecified -> "GATEWAY_TYPE_UNSPECIFIED"
+        Gateway -> "GATEWAY"
+        NonGateway -> "NON_GATEWAY"
+
+instance FromJSON GatewayConfigGatewayType where
+    parseJSON = parseJSONText "GatewayConfigGatewayType"
+
+instance ToJSON GatewayConfigGatewayType where
+    toJSON = toJSONText
+
+-- | Indicates how to authorize and\/or authenticate devices to access the
+-- gateway.
+data GatewayConfigGatewayAuthMethod
+    = GatewayAuthMethodUnspecified
+      -- ^ @GATEWAY_AUTH_METHOD_UNSPECIFIED@
+      -- No authentication\/authorization method specified. No devices are
+      -- allowed to access the gateway.
+    | AssociationOnly
+      -- ^ @ASSOCIATION_ONLY@
+      -- The device is authenticated through the gateway association only. Device
+      -- credentials are ignored even if provided.
+    | DeviceAuthTokenOnly
+      -- ^ @DEVICE_AUTH_TOKEN_ONLY@
+      -- The device is authenticated through its own credentials. Gateway
+      -- association is not checked.
+    | AssociationAndDeviceAuthToken
+      -- ^ @ASSOCIATION_AND_DEVICE_AUTH_TOKEN@
+      -- The device is authenticated through both device credentials and gateway
+      -- association. The device must be bound to the gateway and must provide
+      -- its own credentials.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable GatewayConfigGatewayAuthMethod
+
+instance FromHttpApiData GatewayConfigGatewayAuthMethod where
+    parseQueryParam = \case
+        "GATEWAY_AUTH_METHOD_UNSPECIFIED" -> Right GatewayAuthMethodUnspecified
+        "ASSOCIATION_ONLY" -> Right AssociationOnly
+        "DEVICE_AUTH_TOKEN_ONLY" -> Right DeviceAuthTokenOnly
+        "ASSOCIATION_AND_DEVICE_AUTH_TOKEN" -> Right AssociationAndDeviceAuthToken
+        x -> Left ("Unable to parse GatewayConfigGatewayAuthMethod from: " <> x)
+
+instance ToHttpApiData GatewayConfigGatewayAuthMethod where
+    toQueryParam = \case
+        GatewayAuthMethodUnspecified -> "GATEWAY_AUTH_METHOD_UNSPECIFIED"
+        AssociationOnly -> "ASSOCIATION_ONLY"
+        DeviceAuthTokenOnly -> "DEVICE_AUTH_TOKEN_ONLY"
+        AssociationAndDeviceAuthToken -> "ASSOCIATION_AND_DEVICE_AUTH_TOKEN"
+
+instance FromJSON GatewayConfigGatewayAuthMethod where
+    parseJSON = parseJSONText "GatewayConfigGatewayAuthMethod"
+
+instance ToJSON GatewayConfigGatewayAuthMethod where
+    toJSON = toJSONText
+
+-- | If enabled, allows connections using the MQTT protocol. Otherwise, MQTT
+-- connections to this registry will fail.
+data MqttConfigMqttEnabledState
+    = MqttStateUnspecified
+      -- ^ @MQTT_STATE_UNSPECIFIED@
+      -- No MQTT state specified. If not specified, MQTT will be enabled by
+      -- default.
+    | MqttEnabled
+      -- ^ @MQTT_ENABLED@
+      -- Enables a MQTT connection.
+    | MqttDisabled
+      -- ^ @MQTT_DISABLED@
+      -- Disables a MQTT connection.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable MqttConfigMqttEnabledState
+
+instance FromHttpApiData MqttConfigMqttEnabledState where
+    parseQueryParam = \case
+        "MQTT_STATE_UNSPECIFIED" -> Right MqttStateUnspecified
+        "MQTT_ENABLED" -> Right MqttEnabled
+        "MQTT_DISABLED" -> Right MqttDisabled
+        x -> Left ("Unable to parse MqttConfigMqttEnabledState from: " <> x)
+
+instance ToHttpApiData MqttConfigMqttEnabledState where
+    toQueryParam = \case
+        MqttStateUnspecified -> "MQTT_STATE_UNSPECIFIED"
+        MqttEnabled -> "MQTT_ENABLED"
+        MqttDisabled -> "MQTT_DISABLED"
+
+instance FromJSON MqttConfigMqttEnabledState where
+    parseJSON = parseJSONText "MqttConfigMqttEnabledState"
+
+instance ToJSON MqttConfigMqttEnabledState where
+    toJSON = toJSONText
+
+-- | If enabled, allows devices to use DeviceService via the HTTP protocol.
+-- Otherwise, any requests to DeviceService will fail for this registry.
+data HTTPConfigHTTPEnabledState
+    = HTTPStateUnspecified
+      -- ^ @HTTP_STATE_UNSPECIFIED@
+      -- No HTTP state specified. If not specified, DeviceService will be enabled
+      -- by default.
+    | HTTPEnabled
+      -- ^ @HTTP_ENABLED@
+      -- Enables DeviceService (HTTP) service for the registry.
+    | HTTPDisabled
+      -- ^ @HTTP_DISABLED@
+      -- Disables DeviceService (HTTP) service for the registry.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable HTTPConfigHTTPEnabledState
+
+instance FromHttpApiData HTTPConfigHTTPEnabledState where
+    parseQueryParam = \case
+        "HTTP_STATE_UNSPECIFIED" -> Right HTTPStateUnspecified
+        "HTTP_ENABLED" -> Right HTTPEnabled
+        "HTTP_DISABLED" -> Right HTTPDisabled
+        x -> Left ("Unable to parse HTTPConfigHTTPEnabledState from: " <> x)
+
+instance ToHttpApiData HTTPConfigHTTPEnabledState where
+    toQueryParam = \case
+        HTTPStateUnspecified -> "HTTP_STATE_UNSPECIFIED"
+        HTTPEnabled -> "HTTP_ENABLED"
+        HTTPDisabled -> "HTTP_DISABLED"
+
+instance FromJSON HTTPConfigHTTPEnabledState where
+    parseJSON = parseJSONText "HTTPConfigHTTPEnabledState"
+
+instance ToJSON HTTPConfigHTTPEnabledState where
+    toJSON = toJSONText
diff --git a/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/BindDeviceToGateway.hs b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/BindDeviceToGateway.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/BindDeviceToGateway.hs
@@ -0,0 +1,175 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.CloudIOT.Projects.Locations.Registries.BindDeviceToGateway
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Associates the device with the gateway.
+--
+-- /See:/ <https://cloud.google.com/iot Cloud IoT API Reference> for @cloudiot.projects.locations.registries.bindDeviceToGateway@.
+module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.BindDeviceToGateway
+    (
+    -- * REST Resource
+      ProjectsLocationsRegistriesBindDeviceToGatewayResource
+
+    -- * Creating a Request
+    , projectsLocationsRegistriesBindDeviceToGateway
+    , ProjectsLocationsRegistriesBindDeviceToGateway
+
+    -- * Request Lenses
+    , plrbdtgParent
+    , plrbdtgXgafv
+    , plrbdtgUploadProtocol
+    , plrbdtgAccessToken
+    , plrbdtgUploadType
+    , plrbdtgPayload
+    , plrbdtgCallback
+    ) where
+
+import           Network.Google.CloudIOT.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @cloudiot.projects.locations.registries.bindDeviceToGateway@ method which the
+-- 'ProjectsLocationsRegistriesBindDeviceToGateway' request conforms to.
+type ProjectsLocationsRegistriesBindDeviceToGatewayResource
+     =
+     "v1" :>
+       CaptureMode "parent" "bindDeviceToGateway" Text :>
+         QueryParam "$.xgafv" Xgafv :>
+           QueryParam "upload_protocol" Text :>
+             QueryParam "access_token" Text :>
+               QueryParam "uploadType" Text :>
+                 QueryParam "callback" Text :>
+                   QueryParam "alt" AltJSON :>
+                     ReqBody '[JSON] BindDeviceToGatewayRequest :>
+                       Post '[JSON] BindDeviceToGatewayResponse
+
+-- | Associates the device with the gateway.
+--
+-- /See:/ 'projectsLocationsRegistriesBindDeviceToGateway' smart constructor.
+data ProjectsLocationsRegistriesBindDeviceToGateway = ProjectsLocationsRegistriesBindDeviceToGateway'
+    { _plrbdtgParent         :: !Text
+    , _plrbdtgXgafv          :: !(Maybe Xgafv)
+    , _plrbdtgUploadProtocol :: !(Maybe Text)
+    , _plrbdtgAccessToken    :: !(Maybe Text)
+    , _plrbdtgUploadType     :: !(Maybe Text)
+    , _plrbdtgPayload        :: !BindDeviceToGatewayRequest
+    , _plrbdtgCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ProjectsLocationsRegistriesBindDeviceToGateway' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'plrbdtgParent'
+--
+-- * 'plrbdtgXgafv'
+--
+-- * 'plrbdtgUploadProtocol'
+--
+-- * 'plrbdtgAccessToken'
+--
+-- * 'plrbdtgUploadType'
+--
+-- * 'plrbdtgPayload'
+--
+-- * 'plrbdtgCallback'
+projectsLocationsRegistriesBindDeviceToGateway
+    :: Text -- ^ 'plrbdtgParent'
+    -> BindDeviceToGatewayRequest -- ^ 'plrbdtgPayload'
+    -> ProjectsLocationsRegistriesBindDeviceToGateway
+projectsLocationsRegistriesBindDeviceToGateway pPlrbdtgParent_ pPlrbdtgPayload_ =
+    ProjectsLocationsRegistriesBindDeviceToGateway'
+    { _plrbdtgParent = pPlrbdtgParent_
+    , _plrbdtgXgafv = Nothing
+    , _plrbdtgUploadProtocol = Nothing
+    , _plrbdtgAccessToken = Nothing
+    , _plrbdtgUploadType = Nothing
+    , _plrbdtgPayload = pPlrbdtgPayload_
+    , _plrbdtgCallback = Nothing
+    }
+
+-- | The name of the registry. For example,
+-- \`projects\/example-project\/locations\/us-central1\/registries\/my-registry\`.
+plrbdtgParent :: Lens' ProjectsLocationsRegistriesBindDeviceToGateway Text
+plrbdtgParent
+  = lens _plrbdtgParent
+      (\ s a -> s{_plrbdtgParent = a})
+
+-- | V1 error format.
+plrbdtgXgafv :: Lens' ProjectsLocationsRegistriesBindDeviceToGateway (Maybe Xgafv)
+plrbdtgXgafv
+  = lens _plrbdtgXgafv (\ s a -> s{_plrbdtgXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+plrbdtgUploadProtocol :: Lens' ProjectsLocationsRegistriesBindDeviceToGateway (Maybe Text)
+plrbdtgUploadProtocol
+  = lens _plrbdtgUploadProtocol
+      (\ s a -> s{_plrbdtgUploadProtocol = a})
+
+-- | OAuth access token.
+plrbdtgAccessToken :: Lens' ProjectsLocationsRegistriesBindDeviceToGateway (Maybe Text)
+plrbdtgAccessToken
+  = lens _plrbdtgAccessToken
+      (\ s a -> s{_plrbdtgAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+plrbdtgUploadType :: Lens' ProjectsLocationsRegistriesBindDeviceToGateway (Maybe Text)
+plrbdtgUploadType
+  = lens _plrbdtgUploadType
+      (\ s a -> s{_plrbdtgUploadType = a})
+
+-- | Multipart request metadata.
+plrbdtgPayload :: Lens' ProjectsLocationsRegistriesBindDeviceToGateway BindDeviceToGatewayRequest
+plrbdtgPayload
+  = lens _plrbdtgPayload
+      (\ s a -> s{_plrbdtgPayload = a})
+
+-- | JSONP
+plrbdtgCallback :: Lens' ProjectsLocationsRegistriesBindDeviceToGateway (Maybe Text)
+plrbdtgCallback
+  = lens _plrbdtgCallback
+      (\ s a -> s{_plrbdtgCallback = a})
+
+instance GoogleRequest
+         ProjectsLocationsRegistriesBindDeviceToGateway where
+        type Rs
+               ProjectsLocationsRegistriesBindDeviceToGateway
+             = BindDeviceToGatewayResponse
+        type Scopes
+               ProjectsLocationsRegistriesBindDeviceToGateway
+             =
+             '["https://www.googleapis.com/auth/cloud-platform",
+               "https://www.googleapis.com/auth/cloudiot"]
+        requestClient
+          ProjectsLocationsRegistriesBindDeviceToGateway'{..}
+          = go _plrbdtgParent _plrbdtgXgafv
+              _plrbdtgUploadProtocol
+              _plrbdtgAccessToken
+              _plrbdtgUploadType
+              _plrbdtgCallback
+              (Just AltJSON)
+              _plrbdtgPayload
+              cloudIOTService
+          where go
+                  = buildClient
+                      (Proxy ::
+                         Proxy
+                           ProjectsLocationsRegistriesBindDeviceToGatewayResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Create.hs b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Create.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Create.hs
@@ -0,0 +1,166 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Create
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a device registry that contains devices.
+--
+-- /See:/ <https://cloud.google.com/iot Cloud IoT API Reference> for @cloudiot.projects.locations.registries.create@.
+module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Create
+    (
+    -- * REST Resource
+      ProjectsLocationsRegistriesCreateResource
+
+    -- * Creating a Request
+    , projectsLocationsRegistriesCreate
+    , ProjectsLocationsRegistriesCreate
+
+    -- * Request Lenses
+    , plrcParent
+    , plrcXgafv
+    , plrcUploadProtocol
+    , plrcAccessToken
+    , plrcUploadType
+    , plrcPayload
+    , plrcCallback
+    ) where
+
+import           Network.Google.CloudIOT.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @cloudiot.projects.locations.registries.create@ method which the
+-- 'ProjectsLocationsRegistriesCreate' request conforms to.
+type ProjectsLocationsRegistriesCreateResource =
+     "v1" :>
+       Capture "parent" Text :>
+         "registries" :>
+           QueryParam "$.xgafv" Xgafv :>
+             QueryParam "upload_protocol" Text :>
+               QueryParam "access_token" Text :>
+                 QueryParam "uploadType" Text :>
+                   QueryParam "callback" Text :>
+                     QueryParam "alt" AltJSON :>
+                       ReqBody '[JSON] DeviceRegistry :>
+                         Post '[JSON] DeviceRegistry
+
+-- | Creates a device registry that contains devices.
+--
+-- /See:/ 'projectsLocationsRegistriesCreate' smart constructor.
+data ProjectsLocationsRegistriesCreate = ProjectsLocationsRegistriesCreate'
+    { _plrcParent         :: !Text
+    , _plrcXgafv          :: !(Maybe Xgafv)
+    , _plrcUploadProtocol :: !(Maybe Text)
+    , _plrcAccessToken    :: !(Maybe Text)
+    , _plrcUploadType     :: !(Maybe Text)
+    , _plrcPayload        :: !DeviceRegistry
+    , _plrcCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ProjectsLocationsRegistriesCreate' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'plrcParent'
+--
+-- * 'plrcXgafv'
+--
+-- * 'plrcUploadProtocol'
+--
+-- * 'plrcAccessToken'
+--
+-- * 'plrcUploadType'
+--
+-- * 'plrcPayload'
+--
+-- * 'plrcCallback'
+projectsLocationsRegistriesCreate
+    :: Text -- ^ 'plrcParent'
+    -> DeviceRegistry -- ^ 'plrcPayload'
+    -> ProjectsLocationsRegistriesCreate
+projectsLocationsRegistriesCreate pPlrcParent_ pPlrcPayload_ =
+    ProjectsLocationsRegistriesCreate'
+    { _plrcParent = pPlrcParent_
+    , _plrcXgafv = Nothing
+    , _plrcUploadProtocol = Nothing
+    , _plrcAccessToken = Nothing
+    , _plrcUploadType = Nothing
+    , _plrcPayload = pPlrcPayload_
+    , _plrcCallback = Nothing
+    }
+
+-- | The project and cloud region where this device registry must be created.
+-- For example, \`projects\/example-project\/locations\/us-central1\`.
+plrcParent :: Lens' ProjectsLocationsRegistriesCreate Text
+plrcParent
+  = lens _plrcParent (\ s a -> s{_plrcParent = a})
+
+-- | V1 error format.
+plrcXgafv :: Lens' ProjectsLocationsRegistriesCreate (Maybe Xgafv)
+plrcXgafv
+  = lens _plrcXgafv (\ s a -> s{_plrcXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+plrcUploadProtocol :: Lens' ProjectsLocationsRegistriesCreate (Maybe Text)
+plrcUploadProtocol
+  = lens _plrcUploadProtocol
+      (\ s a -> s{_plrcUploadProtocol = a})
+
+-- | OAuth access token.
+plrcAccessToken :: Lens' ProjectsLocationsRegistriesCreate (Maybe Text)
+plrcAccessToken
+  = lens _plrcAccessToken
+      (\ s a -> s{_plrcAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+plrcUploadType :: Lens' ProjectsLocationsRegistriesCreate (Maybe Text)
+plrcUploadType
+  = lens _plrcUploadType
+      (\ s a -> s{_plrcUploadType = a})
+
+-- | Multipart request metadata.
+plrcPayload :: Lens' ProjectsLocationsRegistriesCreate DeviceRegistry
+plrcPayload
+  = lens _plrcPayload (\ s a -> s{_plrcPayload = a})
+
+-- | JSONP
+plrcCallback :: Lens' ProjectsLocationsRegistriesCreate (Maybe Text)
+plrcCallback
+  = lens _plrcCallback (\ s a -> s{_plrcCallback = a})
+
+instance GoogleRequest
+         ProjectsLocationsRegistriesCreate where
+        type Rs ProjectsLocationsRegistriesCreate =
+             DeviceRegistry
+        type Scopes ProjectsLocationsRegistriesCreate =
+             '["https://www.googleapis.com/auth/cloud-platform",
+               "https://www.googleapis.com/auth/cloudiot"]
+        requestClient ProjectsLocationsRegistriesCreate'{..}
+          = go _plrcParent _plrcXgafv _plrcUploadProtocol
+              _plrcAccessToken
+              _plrcUploadType
+              _plrcCallback
+              (Just AltJSON)
+              _plrcPayload
+              cloudIOTService
+          where go
+                  = buildClient
+                      (Proxy ::
+                         Proxy ProjectsLocationsRegistriesCreateResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Delete.hs b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Delete.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Delete.hs
@@ -0,0 +1,149 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Delete
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes a device registry configuration.
+--
+-- /See:/ <https://cloud.google.com/iot Cloud IoT API Reference> for @cloudiot.projects.locations.registries.delete@.
+module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Delete
+    (
+    -- * REST Resource
+      ProjectsLocationsRegistriesDeleteResource
+
+    -- * Creating a Request
+    , projectsLocationsRegistriesDelete
+    , ProjectsLocationsRegistriesDelete
+
+    -- * Request Lenses
+    , plrdXgafv
+    , plrdUploadProtocol
+    , plrdAccessToken
+    , plrdUploadType
+    , plrdName
+    , plrdCallback
+    ) where
+
+import           Network.Google.CloudIOT.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @cloudiot.projects.locations.registries.delete@ method which the
+-- 'ProjectsLocationsRegistriesDelete' request conforms to.
+type ProjectsLocationsRegistriesDeleteResource =
+     "v1" :>
+       Capture "name" Text :>
+         QueryParam "$.xgafv" Xgafv :>
+           QueryParam "upload_protocol" Text :>
+             QueryParam "access_token" Text :>
+               QueryParam "uploadType" Text :>
+                 QueryParam "callback" Text :>
+                   QueryParam "alt" AltJSON :> Delete '[JSON] Empty
+
+-- | Deletes a device registry configuration.
+--
+-- /See:/ 'projectsLocationsRegistriesDelete' smart constructor.
+data ProjectsLocationsRegistriesDelete = ProjectsLocationsRegistriesDelete'
+    { _plrdXgafv          :: !(Maybe Xgafv)
+    , _plrdUploadProtocol :: !(Maybe Text)
+    , _plrdAccessToken    :: !(Maybe Text)
+    , _plrdUploadType     :: !(Maybe Text)
+    , _plrdName           :: !Text
+    , _plrdCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ProjectsLocationsRegistriesDelete' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'plrdXgafv'
+--
+-- * 'plrdUploadProtocol'
+--
+-- * 'plrdAccessToken'
+--
+-- * 'plrdUploadType'
+--
+-- * 'plrdName'
+--
+-- * 'plrdCallback'
+projectsLocationsRegistriesDelete
+    :: Text -- ^ 'plrdName'
+    -> ProjectsLocationsRegistriesDelete
+projectsLocationsRegistriesDelete pPlrdName_ =
+    ProjectsLocationsRegistriesDelete'
+    { _plrdXgafv = Nothing
+    , _plrdUploadProtocol = Nothing
+    , _plrdAccessToken = Nothing
+    , _plrdUploadType = Nothing
+    , _plrdName = pPlrdName_
+    , _plrdCallback = Nothing
+    }
+
+-- | V1 error format.
+plrdXgafv :: Lens' ProjectsLocationsRegistriesDelete (Maybe Xgafv)
+plrdXgafv
+  = lens _plrdXgafv (\ s a -> s{_plrdXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+plrdUploadProtocol :: Lens' ProjectsLocationsRegistriesDelete (Maybe Text)
+plrdUploadProtocol
+  = lens _plrdUploadProtocol
+      (\ s a -> s{_plrdUploadProtocol = a})
+
+-- | OAuth access token.
+plrdAccessToken :: Lens' ProjectsLocationsRegistriesDelete (Maybe Text)
+plrdAccessToken
+  = lens _plrdAccessToken
+      (\ s a -> s{_plrdAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+plrdUploadType :: Lens' ProjectsLocationsRegistriesDelete (Maybe Text)
+plrdUploadType
+  = lens _plrdUploadType
+      (\ s a -> s{_plrdUploadType = a})
+
+-- | The name of the device registry. For example,
+-- \`projects\/example-project\/locations\/us-central1\/registries\/my-registry\`.
+plrdName :: Lens' ProjectsLocationsRegistriesDelete Text
+plrdName = lens _plrdName (\ s a -> s{_plrdName = a})
+
+-- | JSONP
+plrdCallback :: Lens' ProjectsLocationsRegistriesDelete (Maybe Text)
+plrdCallback
+  = lens _plrdCallback (\ s a -> s{_plrdCallback = a})
+
+instance GoogleRequest
+         ProjectsLocationsRegistriesDelete where
+        type Rs ProjectsLocationsRegistriesDelete = Empty
+        type Scopes ProjectsLocationsRegistriesDelete =
+             '["https://www.googleapis.com/auth/cloud-platform",
+               "https://www.googleapis.com/auth/cloudiot"]
+        requestClient ProjectsLocationsRegistriesDelete'{..}
+          = go _plrdName _plrdXgafv _plrdUploadProtocol
+              _plrdAccessToken
+              _plrdUploadType
+              _plrdCallback
+              (Just AltJSON)
+              cloudIOTService
+          where go
+                  = buildClient
+                      (Proxy ::
+                         Proxy ProjectsLocationsRegistriesDeleteResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Devices/ConfigVersions/List.hs b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Devices/ConfigVersions/List.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Devices/ConfigVersions/List.hs
@@ -0,0 +1,182 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Devices.ConfigVersions.List
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists the last few versions of the device configuration in descending
+-- order (i.e.: newest first).
+--
+-- /See:/ <https://cloud.google.com/iot Cloud IoT API Reference> for @cloudiot.projects.locations.registries.devices.configVersions.list@.
+module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Devices.ConfigVersions.List
+    (
+    -- * REST Resource
+      ProjectsLocationsRegistriesDevicesConfigVersionsListResource
+
+    -- * Creating a Request
+    , projectsLocationsRegistriesDevicesConfigVersionsList
+    , ProjectsLocationsRegistriesDevicesConfigVersionsList
+
+    -- * Request Lenses
+    , plrdcvlXgafv
+    , plrdcvlUploadProtocol
+    , plrdcvlAccessToken
+    , plrdcvlUploadType
+    , plrdcvlNumVersions
+    , plrdcvlName
+    , plrdcvlCallback
+    ) where
+
+import           Network.Google.CloudIOT.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @cloudiot.projects.locations.registries.devices.configVersions.list@ method which the
+-- 'ProjectsLocationsRegistriesDevicesConfigVersionsList' request conforms to.
+type ProjectsLocationsRegistriesDevicesConfigVersionsListResource
+     =
+     "v1" :>
+       Capture "name" Text :>
+         "configVersions" :>
+           QueryParam "$.xgafv" Xgafv :>
+             QueryParam "upload_protocol" Text :>
+               QueryParam "access_token" Text :>
+                 QueryParam "uploadType" Text :>
+                   QueryParam "numVersions" (Textual Int32) :>
+                     QueryParam "callback" Text :>
+                       QueryParam "alt" AltJSON :>
+                         Get '[JSON] ListDeviceConfigVersionsResponse
+
+-- | Lists the last few versions of the device configuration in descending
+-- order (i.e.: newest first).
+--
+-- /See:/ 'projectsLocationsRegistriesDevicesConfigVersionsList' smart constructor.
+data ProjectsLocationsRegistriesDevicesConfigVersionsList = ProjectsLocationsRegistriesDevicesConfigVersionsList'
+    { _plrdcvlXgafv          :: !(Maybe Xgafv)
+    , _plrdcvlUploadProtocol :: !(Maybe Text)
+    , _plrdcvlAccessToken    :: !(Maybe Text)
+    , _plrdcvlUploadType     :: !(Maybe Text)
+    , _plrdcvlNumVersions    :: !(Maybe (Textual Int32))
+    , _plrdcvlName           :: !Text
+    , _plrdcvlCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ProjectsLocationsRegistriesDevicesConfigVersionsList' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'plrdcvlXgafv'
+--
+-- * 'plrdcvlUploadProtocol'
+--
+-- * 'plrdcvlAccessToken'
+--
+-- * 'plrdcvlUploadType'
+--
+-- * 'plrdcvlNumVersions'
+--
+-- * 'plrdcvlName'
+--
+-- * 'plrdcvlCallback'
+projectsLocationsRegistriesDevicesConfigVersionsList
+    :: Text -- ^ 'plrdcvlName'
+    -> ProjectsLocationsRegistriesDevicesConfigVersionsList
+projectsLocationsRegistriesDevicesConfigVersionsList pPlrdcvlName_ =
+    ProjectsLocationsRegistriesDevicesConfigVersionsList'
+    { _plrdcvlXgafv = Nothing
+    , _plrdcvlUploadProtocol = Nothing
+    , _plrdcvlAccessToken = Nothing
+    , _plrdcvlUploadType = Nothing
+    , _plrdcvlNumVersions = Nothing
+    , _plrdcvlName = pPlrdcvlName_
+    , _plrdcvlCallback = Nothing
+    }
+
+-- | V1 error format.
+plrdcvlXgafv :: Lens' ProjectsLocationsRegistriesDevicesConfigVersionsList (Maybe Xgafv)
+plrdcvlXgafv
+  = lens _plrdcvlXgafv (\ s a -> s{_plrdcvlXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+plrdcvlUploadProtocol :: Lens' ProjectsLocationsRegistriesDevicesConfigVersionsList (Maybe Text)
+plrdcvlUploadProtocol
+  = lens _plrdcvlUploadProtocol
+      (\ s a -> s{_plrdcvlUploadProtocol = a})
+
+-- | OAuth access token.
+plrdcvlAccessToken :: Lens' ProjectsLocationsRegistriesDevicesConfigVersionsList (Maybe Text)
+plrdcvlAccessToken
+  = lens _plrdcvlAccessToken
+      (\ s a -> s{_plrdcvlAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+plrdcvlUploadType :: Lens' ProjectsLocationsRegistriesDevicesConfigVersionsList (Maybe Text)
+plrdcvlUploadType
+  = lens _plrdcvlUploadType
+      (\ s a -> s{_plrdcvlUploadType = a})
+
+-- | The number of versions to list. Versions are listed in decreasing order
+-- of the version number. The maximum number of versions retained is 10. If
+-- this value is zero, it will return all the versions available.
+plrdcvlNumVersions :: Lens' ProjectsLocationsRegistriesDevicesConfigVersionsList (Maybe Int32)
+plrdcvlNumVersions
+  = lens _plrdcvlNumVersions
+      (\ s a -> s{_plrdcvlNumVersions = a})
+      . mapping _Coerce
+
+-- | The name of the device. For example,
+-- \`projects\/p0\/locations\/us-central1\/registries\/registry0\/devices\/device0\`
+-- or
+-- \`projects\/p0\/locations\/us-central1\/registries\/registry0\/devices\/{num_id}\`.
+plrdcvlName :: Lens' ProjectsLocationsRegistriesDevicesConfigVersionsList Text
+plrdcvlName
+  = lens _plrdcvlName (\ s a -> s{_plrdcvlName = a})
+
+-- | JSONP
+plrdcvlCallback :: Lens' ProjectsLocationsRegistriesDevicesConfigVersionsList (Maybe Text)
+plrdcvlCallback
+  = lens _plrdcvlCallback
+      (\ s a -> s{_plrdcvlCallback = a})
+
+instance GoogleRequest
+         ProjectsLocationsRegistriesDevicesConfigVersionsList
+         where
+        type Rs
+               ProjectsLocationsRegistriesDevicesConfigVersionsList
+             = ListDeviceConfigVersionsResponse
+        type Scopes
+               ProjectsLocationsRegistriesDevicesConfigVersionsList
+             =
+             '["https://www.googleapis.com/auth/cloud-platform",
+               "https://www.googleapis.com/auth/cloudiot"]
+        requestClient
+          ProjectsLocationsRegistriesDevicesConfigVersionsList'{..}
+          = go _plrdcvlName _plrdcvlXgafv
+              _plrdcvlUploadProtocol
+              _plrdcvlAccessToken
+              _plrdcvlUploadType
+              _plrdcvlNumVersions
+              _plrdcvlCallback
+              (Just AltJSON)
+              cloudIOTService
+          where go
+                  = buildClient
+                      (Proxy ::
+                         Proxy
+                           ProjectsLocationsRegistriesDevicesConfigVersionsListResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Devices/Create.hs b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Devices/Create.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Devices/Create.hs
@@ -0,0 +1,171 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Devices.Create
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a device in a device registry.
+--
+-- /See:/ <https://cloud.google.com/iot Cloud IoT API Reference> for @cloudiot.projects.locations.registries.devices.create@.
+module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Devices.Create
+    (
+    -- * REST Resource
+      ProjectsLocationsRegistriesDevicesCreateResource
+
+    -- * Creating a Request
+    , projectsLocationsRegistriesDevicesCreate
+    , ProjectsLocationsRegistriesDevicesCreate
+
+    -- * Request Lenses
+    , plrdcParent
+    , plrdcXgafv
+    , plrdcUploadProtocol
+    , plrdcAccessToken
+    , plrdcUploadType
+    , plrdcPayload
+    , plrdcCallback
+    ) where
+
+import           Network.Google.CloudIOT.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @cloudiot.projects.locations.registries.devices.create@ method which the
+-- 'ProjectsLocationsRegistriesDevicesCreate' request conforms to.
+type ProjectsLocationsRegistriesDevicesCreateResource
+     =
+     "v1" :>
+       Capture "parent" Text :>
+         "devices" :>
+           QueryParam "$.xgafv" Xgafv :>
+             QueryParam "upload_protocol" Text :>
+               QueryParam "access_token" Text :>
+                 QueryParam "uploadType" Text :>
+                   QueryParam "callback" Text :>
+                     QueryParam "alt" AltJSON :>
+                       ReqBody '[JSON] Device :> Post '[JSON] Device
+
+-- | Creates a device in a device registry.
+--
+-- /See:/ 'projectsLocationsRegistriesDevicesCreate' smart constructor.
+data ProjectsLocationsRegistriesDevicesCreate = ProjectsLocationsRegistriesDevicesCreate'
+    { _plrdcParent         :: !Text
+    , _plrdcXgafv          :: !(Maybe Xgafv)
+    , _plrdcUploadProtocol :: !(Maybe Text)
+    , _plrdcAccessToken    :: !(Maybe Text)
+    , _plrdcUploadType     :: !(Maybe Text)
+    , _plrdcPayload        :: !Device
+    , _plrdcCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ProjectsLocationsRegistriesDevicesCreate' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'plrdcParent'
+--
+-- * 'plrdcXgafv'
+--
+-- * 'plrdcUploadProtocol'
+--
+-- * 'plrdcAccessToken'
+--
+-- * 'plrdcUploadType'
+--
+-- * 'plrdcPayload'
+--
+-- * 'plrdcCallback'
+projectsLocationsRegistriesDevicesCreate
+    :: Text -- ^ 'plrdcParent'
+    -> Device -- ^ 'plrdcPayload'
+    -> ProjectsLocationsRegistriesDevicesCreate
+projectsLocationsRegistriesDevicesCreate pPlrdcParent_ pPlrdcPayload_ =
+    ProjectsLocationsRegistriesDevicesCreate'
+    { _plrdcParent = pPlrdcParent_
+    , _plrdcXgafv = Nothing
+    , _plrdcUploadProtocol = Nothing
+    , _plrdcAccessToken = Nothing
+    , _plrdcUploadType = Nothing
+    , _plrdcPayload = pPlrdcPayload_
+    , _plrdcCallback = Nothing
+    }
+
+-- | The name of the device registry where this device should be created. For
+-- example,
+-- \`projects\/example-project\/locations\/us-central1\/registries\/my-registry\`.
+plrdcParent :: Lens' ProjectsLocationsRegistriesDevicesCreate Text
+plrdcParent
+  = lens _plrdcParent (\ s a -> s{_plrdcParent = a})
+
+-- | V1 error format.
+plrdcXgafv :: Lens' ProjectsLocationsRegistriesDevicesCreate (Maybe Xgafv)
+plrdcXgafv
+  = lens _plrdcXgafv (\ s a -> s{_plrdcXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+plrdcUploadProtocol :: Lens' ProjectsLocationsRegistriesDevicesCreate (Maybe Text)
+plrdcUploadProtocol
+  = lens _plrdcUploadProtocol
+      (\ s a -> s{_plrdcUploadProtocol = a})
+
+-- | OAuth access token.
+plrdcAccessToken :: Lens' ProjectsLocationsRegistriesDevicesCreate (Maybe Text)
+plrdcAccessToken
+  = lens _plrdcAccessToken
+      (\ s a -> s{_plrdcAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+plrdcUploadType :: Lens' ProjectsLocationsRegistriesDevicesCreate (Maybe Text)
+plrdcUploadType
+  = lens _plrdcUploadType
+      (\ s a -> s{_plrdcUploadType = a})
+
+-- | Multipart request metadata.
+plrdcPayload :: Lens' ProjectsLocationsRegistriesDevicesCreate Device
+plrdcPayload
+  = lens _plrdcPayload (\ s a -> s{_plrdcPayload = a})
+
+-- | JSONP
+plrdcCallback :: Lens' ProjectsLocationsRegistriesDevicesCreate (Maybe Text)
+plrdcCallback
+  = lens _plrdcCallback
+      (\ s a -> s{_plrdcCallback = a})
+
+instance GoogleRequest
+         ProjectsLocationsRegistriesDevicesCreate where
+        type Rs ProjectsLocationsRegistriesDevicesCreate =
+             Device
+        type Scopes ProjectsLocationsRegistriesDevicesCreate
+             =
+             '["https://www.googleapis.com/auth/cloud-platform",
+               "https://www.googleapis.com/auth/cloudiot"]
+        requestClient
+          ProjectsLocationsRegistriesDevicesCreate'{..}
+          = go _plrdcParent _plrdcXgafv _plrdcUploadProtocol
+              _plrdcAccessToken
+              _plrdcUploadType
+              _plrdcCallback
+              (Just AltJSON)
+              _plrdcPayload
+              cloudIOTService
+          where go
+                  = buildClient
+                      (Proxy ::
+                         Proxy
+                           ProjectsLocationsRegistriesDevicesCreateResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Devices/Delete.hs b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Devices/Delete.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Devices/Delete.hs
@@ -0,0 +1,158 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Devices.Delete
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes a device.
+--
+-- /See:/ <https://cloud.google.com/iot Cloud IoT API Reference> for @cloudiot.projects.locations.registries.devices.delete@.
+module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Devices.Delete
+    (
+    -- * REST Resource
+      ProjectsLocationsRegistriesDevicesDeleteResource
+
+    -- * Creating a Request
+    , projectsLocationsRegistriesDevicesDelete
+    , ProjectsLocationsRegistriesDevicesDelete
+
+    -- * Request Lenses
+    , plrddXgafv
+    , plrddUploadProtocol
+    , plrddAccessToken
+    , plrddUploadType
+    , plrddName
+    , plrddCallback
+    ) where
+
+import           Network.Google.CloudIOT.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @cloudiot.projects.locations.registries.devices.delete@ method which the
+-- 'ProjectsLocationsRegistriesDevicesDelete' request conforms to.
+type ProjectsLocationsRegistriesDevicesDeleteResource
+     =
+     "v1" :>
+       Capture "name" Text :>
+         QueryParam "$.xgafv" Xgafv :>
+           QueryParam "upload_protocol" Text :>
+             QueryParam "access_token" Text :>
+               QueryParam "uploadType" Text :>
+                 QueryParam "callback" Text :>
+                   QueryParam "alt" AltJSON :> Delete '[JSON] Empty
+
+-- | Deletes a device.
+--
+-- /See:/ 'projectsLocationsRegistriesDevicesDelete' smart constructor.
+data ProjectsLocationsRegistriesDevicesDelete = ProjectsLocationsRegistriesDevicesDelete'
+    { _plrddXgafv          :: !(Maybe Xgafv)
+    , _plrddUploadProtocol :: !(Maybe Text)
+    , _plrddAccessToken    :: !(Maybe Text)
+    , _plrddUploadType     :: !(Maybe Text)
+    , _plrddName           :: !Text
+    , _plrddCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ProjectsLocationsRegistriesDevicesDelete' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'plrddXgafv'
+--
+-- * 'plrddUploadProtocol'
+--
+-- * 'plrddAccessToken'
+--
+-- * 'plrddUploadType'
+--
+-- * 'plrddName'
+--
+-- * 'plrddCallback'
+projectsLocationsRegistriesDevicesDelete
+    :: Text -- ^ 'plrddName'
+    -> ProjectsLocationsRegistriesDevicesDelete
+projectsLocationsRegistriesDevicesDelete pPlrddName_ =
+    ProjectsLocationsRegistriesDevicesDelete'
+    { _plrddXgafv = Nothing
+    , _plrddUploadProtocol = Nothing
+    , _plrddAccessToken = Nothing
+    , _plrddUploadType = Nothing
+    , _plrddName = pPlrddName_
+    , _plrddCallback = Nothing
+    }
+
+-- | V1 error format.
+plrddXgafv :: Lens' ProjectsLocationsRegistriesDevicesDelete (Maybe Xgafv)
+plrddXgafv
+  = lens _plrddXgafv (\ s a -> s{_plrddXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+plrddUploadProtocol :: Lens' ProjectsLocationsRegistriesDevicesDelete (Maybe Text)
+plrddUploadProtocol
+  = lens _plrddUploadProtocol
+      (\ s a -> s{_plrddUploadProtocol = a})
+
+-- | OAuth access token.
+plrddAccessToken :: Lens' ProjectsLocationsRegistriesDevicesDelete (Maybe Text)
+plrddAccessToken
+  = lens _plrddAccessToken
+      (\ s a -> s{_plrddAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+plrddUploadType :: Lens' ProjectsLocationsRegistriesDevicesDelete (Maybe Text)
+plrddUploadType
+  = lens _plrddUploadType
+      (\ s a -> s{_plrddUploadType = a})
+
+-- | The name of the device. For example,
+-- \`projects\/p0\/locations\/us-central1\/registries\/registry0\/devices\/device0\`
+-- or
+-- \`projects\/p0\/locations\/us-central1\/registries\/registry0\/devices\/{num_id}\`.
+plrddName :: Lens' ProjectsLocationsRegistriesDevicesDelete Text
+plrddName
+  = lens _plrddName (\ s a -> s{_plrddName = a})
+
+-- | JSONP
+plrddCallback :: Lens' ProjectsLocationsRegistriesDevicesDelete (Maybe Text)
+plrddCallback
+  = lens _plrddCallback
+      (\ s a -> s{_plrddCallback = a})
+
+instance GoogleRequest
+         ProjectsLocationsRegistriesDevicesDelete where
+        type Rs ProjectsLocationsRegistriesDevicesDelete =
+             Empty
+        type Scopes ProjectsLocationsRegistriesDevicesDelete
+             =
+             '["https://www.googleapis.com/auth/cloud-platform",
+               "https://www.googleapis.com/auth/cloudiot"]
+        requestClient
+          ProjectsLocationsRegistriesDevicesDelete'{..}
+          = go _plrddName _plrddXgafv _plrddUploadProtocol
+              _plrddAccessToken
+              _plrddUploadType
+              _plrddCallback
+              (Just AltJSON)
+              cloudIOTService
+          where go
+                  = buildClient
+                      (Proxy ::
+                         Proxy
+                           ProjectsLocationsRegistriesDevicesDeleteResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Devices/Get.hs b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Devices/Get.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Devices/Get.hs
@@ -0,0 +1,169 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Devices.Get
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets details about a device.
+--
+-- /See:/ <https://cloud.google.com/iot Cloud IoT API Reference> for @cloudiot.projects.locations.registries.devices.get@.
+module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Devices.Get
+    (
+    -- * REST Resource
+      ProjectsLocationsRegistriesDevicesGetResource
+
+    -- * Creating a Request
+    , projectsLocationsRegistriesDevicesGet
+    , ProjectsLocationsRegistriesDevicesGet
+
+    -- * Request Lenses
+    , plrdgXgafv
+    , plrdgUploadProtocol
+    , plrdgAccessToken
+    , plrdgUploadType
+    , plrdgFieldMask
+    , plrdgName
+    , plrdgCallback
+    ) where
+
+import           Network.Google.CloudIOT.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @cloudiot.projects.locations.registries.devices.get@ method which the
+-- 'ProjectsLocationsRegistriesDevicesGet' request conforms to.
+type ProjectsLocationsRegistriesDevicesGetResource =
+     "v1" :>
+       Capture "name" Text :>
+         QueryParam "$.xgafv" Xgafv :>
+           QueryParam "upload_protocol" Text :>
+             QueryParam "access_token" Text :>
+               QueryParam "uploadType" Text :>
+                 QueryParam "fieldMask" GFieldMask :>
+                   QueryParam "callback" Text :>
+                     QueryParam "alt" AltJSON :> Get '[JSON] Device
+
+-- | Gets details about a device.
+--
+-- /See:/ 'projectsLocationsRegistriesDevicesGet' smart constructor.
+data ProjectsLocationsRegistriesDevicesGet = ProjectsLocationsRegistriesDevicesGet'
+    { _plrdgXgafv          :: !(Maybe Xgafv)
+    , _plrdgUploadProtocol :: !(Maybe Text)
+    , _plrdgAccessToken    :: !(Maybe Text)
+    , _plrdgUploadType     :: !(Maybe Text)
+    , _plrdgFieldMask      :: !(Maybe GFieldMask)
+    , _plrdgName           :: !Text
+    , _plrdgCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ProjectsLocationsRegistriesDevicesGet' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'plrdgXgafv'
+--
+-- * 'plrdgUploadProtocol'
+--
+-- * 'plrdgAccessToken'
+--
+-- * 'plrdgUploadType'
+--
+-- * 'plrdgFieldMask'
+--
+-- * 'plrdgName'
+--
+-- * 'plrdgCallback'
+projectsLocationsRegistriesDevicesGet
+    :: Text -- ^ 'plrdgName'
+    -> ProjectsLocationsRegistriesDevicesGet
+projectsLocationsRegistriesDevicesGet pPlrdgName_ =
+    ProjectsLocationsRegistriesDevicesGet'
+    { _plrdgXgafv = Nothing
+    , _plrdgUploadProtocol = Nothing
+    , _plrdgAccessToken = Nothing
+    , _plrdgUploadType = Nothing
+    , _plrdgFieldMask = Nothing
+    , _plrdgName = pPlrdgName_
+    , _plrdgCallback = Nothing
+    }
+
+-- | V1 error format.
+plrdgXgafv :: Lens' ProjectsLocationsRegistriesDevicesGet (Maybe Xgafv)
+plrdgXgafv
+  = lens _plrdgXgafv (\ s a -> s{_plrdgXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+plrdgUploadProtocol :: Lens' ProjectsLocationsRegistriesDevicesGet (Maybe Text)
+plrdgUploadProtocol
+  = lens _plrdgUploadProtocol
+      (\ s a -> s{_plrdgUploadProtocol = a})
+
+-- | OAuth access token.
+plrdgAccessToken :: Lens' ProjectsLocationsRegistriesDevicesGet (Maybe Text)
+plrdgAccessToken
+  = lens _plrdgAccessToken
+      (\ s a -> s{_plrdgAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+plrdgUploadType :: Lens' ProjectsLocationsRegistriesDevicesGet (Maybe Text)
+plrdgUploadType
+  = lens _plrdgUploadType
+      (\ s a -> s{_plrdgUploadType = a})
+
+-- | The fields of the \`Device\` resource to be returned in the response. If
+-- the field mask is unset or empty, all fields are returned.
+plrdgFieldMask :: Lens' ProjectsLocationsRegistriesDevicesGet (Maybe GFieldMask)
+plrdgFieldMask
+  = lens _plrdgFieldMask
+      (\ s a -> s{_plrdgFieldMask = a})
+
+-- | The name of the device. For example,
+-- \`projects\/p0\/locations\/us-central1\/registries\/registry0\/devices\/device0\`
+-- or
+-- \`projects\/p0\/locations\/us-central1\/registries\/registry0\/devices\/{num_id}\`.
+plrdgName :: Lens' ProjectsLocationsRegistriesDevicesGet Text
+plrdgName
+  = lens _plrdgName (\ s a -> s{_plrdgName = a})
+
+-- | JSONP
+plrdgCallback :: Lens' ProjectsLocationsRegistriesDevicesGet (Maybe Text)
+plrdgCallback
+  = lens _plrdgCallback
+      (\ s a -> s{_plrdgCallback = a})
+
+instance GoogleRequest
+         ProjectsLocationsRegistriesDevicesGet where
+        type Rs ProjectsLocationsRegistriesDevicesGet =
+             Device
+        type Scopes ProjectsLocationsRegistriesDevicesGet =
+             '["https://www.googleapis.com/auth/cloud-platform",
+               "https://www.googleapis.com/auth/cloudiot"]
+        requestClient
+          ProjectsLocationsRegistriesDevicesGet'{..}
+          = go _plrdgName _plrdgXgafv _plrdgUploadProtocol
+              _plrdgAccessToken
+              _plrdgUploadType
+              _plrdgFieldMask
+              _plrdgCallback
+              (Just AltJSON)
+              cloudIOTService
+          where go
+                  = buildClient
+                      (Proxy ::
+                         Proxy ProjectsLocationsRegistriesDevicesGetResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Devices/List.hs b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Devices/List.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Devices/List.hs
@@ -0,0 +1,288 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Devices.List
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- List devices in a device registry.
+--
+-- /See:/ <https://cloud.google.com/iot Cloud IoT API Reference> for @cloudiot.projects.locations.registries.devices.list@.
+module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Devices.List
+    (
+    -- * REST Resource
+      ProjectsLocationsRegistriesDevicesListResource
+
+    -- * Creating a Request
+    , projectsLocationsRegistriesDevicesList
+    , ProjectsLocationsRegistriesDevicesList
+
+    -- * Request Lenses
+    , plrdlParent
+    , plrdlXgafv
+    , plrdlUploadProtocol
+    , plrdlAccessToken
+    , plrdlDeviceNumIds
+    , plrdlGatewayListOptionsAssociationsDeviceId
+    , plrdlGatewayListOptionsAssociationsGatewayId
+    , plrdlUploadType
+    , plrdlDeviceIds
+    , plrdlFieldMask
+    , plrdlGatewayListOptionsGatewayType
+    , plrdlPageToken
+    , plrdlPageSize
+    , plrdlCallback
+    ) where
+
+import           Network.Google.CloudIOT.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @cloudiot.projects.locations.registries.devices.list@ method which the
+-- 'ProjectsLocationsRegistriesDevicesList' request conforms to.
+type ProjectsLocationsRegistriesDevicesListResource =
+     "v1" :>
+       Capture "parent" Text :>
+         "devices" :>
+           QueryParam "$.xgafv" Xgafv :>
+             QueryParam "upload_protocol" Text :>
+               QueryParam "access_token" Text :>
+                 QueryParams "deviceNumIds" (Textual Word64) :>
+                   QueryParam "gatewayListOptions.associationsDeviceId"
+                     Text
+                     :>
+                     QueryParam "gatewayListOptions.associationsGatewayId"
+                       Text
+                       :>
+                       QueryParam "uploadType" Text :>
+                         QueryParams "deviceIds" Text :>
+                           QueryParam "fieldMask" GFieldMask :>
+                             QueryParam "gatewayListOptions.gatewayType" Text :>
+                               QueryParam "pageToken" Text :>
+                                 QueryParam "pageSize" (Textual Int32) :>
+                                   QueryParam "callback" Text :>
+                                     QueryParam "alt" AltJSON :>
+                                       Get '[JSON] ListDevicesResponse
+
+-- | List devices in a device registry.
+--
+-- /See:/ 'projectsLocationsRegistriesDevicesList' smart constructor.
+data ProjectsLocationsRegistriesDevicesList = ProjectsLocationsRegistriesDevicesList'
+    { _plrdlParent                                  :: !Text
+    , _plrdlXgafv                                   :: !(Maybe Xgafv)
+    , _plrdlUploadProtocol                          :: !(Maybe Text)
+    , _plrdlAccessToken                             :: !(Maybe Text)
+    , _plrdlDeviceNumIds                            :: !(Maybe [Textual Word64])
+    , _plrdlGatewayListOptionsAssociationsDeviceId  :: !(Maybe Text)
+    , _plrdlGatewayListOptionsAssociationsGatewayId :: !(Maybe Text)
+    , _plrdlUploadType                              :: !(Maybe Text)
+    , _plrdlDeviceIds                               :: !(Maybe [Text])
+    , _plrdlFieldMask                               :: !(Maybe GFieldMask)
+    , _plrdlGatewayListOptionsGatewayType           :: !(Maybe Text)
+    , _plrdlPageToken                               :: !(Maybe Text)
+    , _plrdlPageSize                                :: !(Maybe (Textual Int32))
+    , _plrdlCallback                                :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ProjectsLocationsRegistriesDevicesList' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'plrdlParent'
+--
+-- * 'plrdlXgafv'
+--
+-- * 'plrdlUploadProtocol'
+--
+-- * 'plrdlAccessToken'
+--
+-- * 'plrdlDeviceNumIds'
+--
+-- * 'plrdlGatewayListOptionsAssociationsDeviceId'
+--
+-- * 'plrdlGatewayListOptionsAssociationsGatewayId'
+--
+-- * 'plrdlUploadType'
+--
+-- * 'plrdlDeviceIds'
+--
+-- * 'plrdlFieldMask'
+--
+-- * 'plrdlGatewayListOptionsGatewayType'
+--
+-- * 'plrdlPageToken'
+--
+-- * 'plrdlPageSize'
+--
+-- * 'plrdlCallback'
+projectsLocationsRegistriesDevicesList
+    :: Text -- ^ 'plrdlParent'
+    -> ProjectsLocationsRegistriesDevicesList
+projectsLocationsRegistriesDevicesList pPlrdlParent_ =
+    ProjectsLocationsRegistriesDevicesList'
+    { _plrdlParent = pPlrdlParent_
+    , _plrdlXgafv = Nothing
+    , _plrdlUploadProtocol = Nothing
+    , _plrdlAccessToken = Nothing
+    , _plrdlDeviceNumIds = Nothing
+    , _plrdlGatewayListOptionsAssociationsDeviceId = Nothing
+    , _plrdlGatewayListOptionsAssociationsGatewayId = Nothing
+    , _plrdlUploadType = Nothing
+    , _plrdlDeviceIds = Nothing
+    , _plrdlFieldMask = Nothing
+    , _plrdlGatewayListOptionsGatewayType = Nothing
+    , _plrdlPageToken = Nothing
+    , _plrdlPageSize = Nothing
+    , _plrdlCallback = Nothing
+    }
+
+-- | The device registry path. Required. For example,
+-- \`projects\/my-project\/locations\/us-central1\/registries\/my-registry\`.
+plrdlParent :: Lens' ProjectsLocationsRegistriesDevicesList Text
+plrdlParent
+  = lens _plrdlParent (\ s a -> s{_plrdlParent = a})
+
+-- | V1 error format.
+plrdlXgafv :: Lens' ProjectsLocationsRegistriesDevicesList (Maybe Xgafv)
+plrdlXgafv
+  = lens _plrdlXgafv (\ s a -> s{_plrdlXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+plrdlUploadProtocol :: Lens' ProjectsLocationsRegistriesDevicesList (Maybe Text)
+plrdlUploadProtocol
+  = lens _plrdlUploadProtocol
+      (\ s a -> s{_plrdlUploadProtocol = a})
+
+-- | OAuth access token.
+plrdlAccessToken :: Lens' ProjectsLocationsRegistriesDevicesList (Maybe Text)
+plrdlAccessToken
+  = lens _plrdlAccessToken
+      (\ s a -> s{_plrdlAccessToken = a})
+
+-- | A list of device numeric IDs. If empty, this field is ignored. Maximum
+-- IDs: 10,000.
+plrdlDeviceNumIds :: Lens' ProjectsLocationsRegistriesDevicesList [Word64]
+plrdlDeviceNumIds
+  = lens _plrdlDeviceNumIds
+      (\ s a -> s{_plrdlDeviceNumIds = a})
+      . _Default
+      . _Coerce
+
+-- | If set, returns only the gateways with which the specified device is
+-- associated. The device ID can be numeric (\`num_id\`) or the
+-- user-defined string (\`id\`). For example, if \`456\` is specified,
+-- returns only the gateways to which the device with \`num_id\` 456 is
+-- bound.
+plrdlGatewayListOptionsAssociationsDeviceId :: Lens' ProjectsLocationsRegistriesDevicesList (Maybe Text)
+plrdlGatewayListOptionsAssociationsDeviceId
+  = lens _plrdlGatewayListOptionsAssociationsDeviceId
+      (\ s a ->
+         s{_plrdlGatewayListOptionsAssociationsDeviceId = a})
+
+-- | If set, only devices associated with the specified gateway are returned.
+-- The gateway ID can be numeric (\`num_id\`) or the user-defined string
+-- (\`id\`). For example, if \`123\` is specified, only devices bound to
+-- the gateway with \`num_id\` 123 are returned.
+plrdlGatewayListOptionsAssociationsGatewayId :: Lens' ProjectsLocationsRegistriesDevicesList (Maybe Text)
+plrdlGatewayListOptionsAssociationsGatewayId
+  = lens _plrdlGatewayListOptionsAssociationsGatewayId
+      (\ s a ->
+         s{_plrdlGatewayListOptionsAssociationsGatewayId = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+plrdlUploadType :: Lens' ProjectsLocationsRegistriesDevicesList (Maybe Text)
+plrdlUploadType
+  = lens _plrdlUploadType
+      (\ s a -> s{_plrdlUploadType = a})
+
+-- | A list of device string IDs. For example, \`[\'device0\',
+-- \'device12\']\`. If empty, this field is ignored. Maximum IDs: 10,000
+plrdlDeviceIds :: Lens' ProjectsLocationsRegistriesDevicesList [Text]
+plrdlDeviceIds
+  = lens _plrdlDeviceIds
+      (\ s a -> s{_plrdlDeviceIds = a})
+      . _Default
+      . _Coerce
+
+-- | The fields of the \`Device\` resource to be returned in the response.
+-- The fields \`id\` and \`num_id\` are always returned, along with any
+-- other fields specified.
+plrdlFieldMask :: Lens' ProjectsLocationsRegistriesDevicesList (Maybe GFieldMask)
+plrdlFieldMask
+  = lens _plrdlFieldMask
+      (\ s a -> s{_plrdlFieldMask = a})
+
+-- | If \`GATEWAY\` is specified, only gateways are returned. If
+-- \`NON_GATEWAY\` is specified, only non-gateway devices are returned. If
+-- \`GATEWAY_TYPE_UNSPECIFIED\` is specified, all devices are returned.
+plrdlGatewayListOptionsGatewayType :: Lens' ProjectsLocationsRegistriesDevicesList (Maybe Text)
+plrdlGatewayListOptionsGatewayType
+  = lens _plrdlGatewayListOptionsGatewayType
+      (\ s a -> s{_plrdlGatewayListOptionsGatewayType = a})
+
+-- | The value returned by the last \`ListDevicesResponse\`; indicates that
+-- this is a continuation of a prior \`ListDevices\` call and the system
+-- should return the next page of data.
+plrdlPageToken :: Lens' ProjectsLocationsRegistriesDevicesList (Maybe Text)
+plrdlPageToken
+  = lens _plrdlPageToken
+      (\ s a -> s{_plrdlPageToken = a})
+
+-- | The maximum number of devices to return in the response. If this value
+-- is zero, the service will select a default size. A call may return fewer
+-- objects than requested. A non-empty \`next_page_token\` in the response
+-- indicates that more data is available.
+plrdlPageSize :: Lens' ProjectsLocationsRegistriesDevicesList (Maybe Int32)
+plrdlPageSize
+  = lens _plrdlPageSize
+      (\ s a -> s{_plrdlPageSize = a})
+      . mapping _Coerce
+
+-- | JSONP
+plrdlCallback :: Lens' ProjectsLocationsRegistriesDevicesList (Maybe Text)
+plrdlCallback
+  = lens _plrdlCallback
+      (\ s a -> s{_plrdlCallback = a})
+
+instance GoogleRequest
+         ProjectsLocationsRegistriesDevicesList where
+        type Rs ProjectsLocationsRegistriesDevicesList =
+             ListDevicesResponse
+        type Scopes ProjectsLocationsRegistriesDevicesList =
+             '["https://www.googleapis.com/auth/cloud-platform",
+               "https://www.googleapis.com/auth/cloudiot"]
+        requestClient
+          ProjectsLocationsRegistriesDevicesList'{..}
+          = go _plrdlParent _plrdlXgafv _plrdlUploadProtocol
+              _plrdlAccessToken
+              (_plrdlDeviceNumIds ^. _Default)
+              _plrdlGatewayListOptionsAssociationsDeviceId
+              _plrdlGatewayListOptionsAssociationsGatewayId
+              _plrdlUploadType
+              (_plrdlDeviceIds ^. _Default)
+              _plrdlFieldMask
+              _plrdlGatewayListOptionsGatewayType
+              _plrdlPageToken
+              _plrdlPageSize
+              _plrdlCallback
+              (Just AltJSON)
+              cloudIOTService
+          where go
+                  = buildClient
+                      (Proxy ::
+                         Proxy ProjectsLocationsRegistriesDevicesListResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Devices/ModifyCloudToDeviceConfig.hs b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Devices/ModifyCloudToDeviceConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Devices/ModifyCloudToDeviceConfig.hs
@@ -0,0 +1,184 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Devices.ModifyCloudToDeviceConfig
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Modifies the configuration for the device, which is eventually sent from
+-- the Cloud IoT Core servers. Returns the modified configuration version
+-- and its metadata.
+--
+-- /See:/ <https://cloud.google.com/iot Cloud IoT API Reference> for @cloudiot.projects.locations.registries.devices.modifyCloudToDeviceConfig@.
+module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Devices.ModifyCloudToDeviceConfig
+    (
+    -- * REST Resource
+      ProjectsLocationsRegistriesDevicesModifyCloudToDeviceConfigResource
+
+    -- * Creating a Request
+    , projectsLocationsRegistriesDevicesModifyCloudToDeviceConfig
+    , ProjectsLocationsRegistriesDevicesModifyCloudToDeviceConfig
+
+    -- * Request Lenses
+    , plrdmctdcXgafv
+    , plrdmctdcUploadProtocol
+    , plrdmctdcAccessToken
+    , plrdmctdcUploadType
+    , plrdmctdcPayload
+    , plrdmctdcName
+    , plrdmctdcCallback
+    ) where
+
+import           Network.Google.CloudIOT.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @cloudiot.projects.locations.registries.devices.modifyCloudToDeviceConfig@ method which the
+-- 'ProjectsLocationsRegistriesDevicesModifyCloudToDeviceConfig' request conforms to.
+type ProjectsLocationsRegistriesDevicesModifyCloudToDeviceConfigResource
+     =
+     "v1" :>
+       CaptureMode "name" "modifyCloudToDeviceConfig" Text
+         :>
+         QueryParam "$.xgafv" Xgafv :>
+           QueryParam "upload_protocol" Text :>
+             QueryParam "access_token" Text :>
+               QueryParam "uploadType" Text :>
+                 QueryParam "callback" Text :>
+                   QueryParam "alt" AltJSON :>
+                     ReqBody '[JSON] ModifyCloudToDeviceConfigRequest :>
+                       Post '[JSON] DeviceConfig
+
+-- | Modifies the configuration for the device, which is eventually sent from
+-- the Cloud IoT Core servers. Returns the modified configuration version
+-- and its metadata.
+--
+-- /See:/ 'projectsLocationsRegistriesDevicesModifyCloudToDeviceConfig' smart constructor.
+data ProjectsLocationsRegistriesDevicesModifyCloudToDeviceConfig = ProjectsLocationsRegistriesDevicesModifyCloudToDeviceConfig'
+    { _plrdmctdcXgafv          :: !(Maybe Xgafv)
+    , _plrdmctdcUploadProtocol :: !(Maybe Text)
+    , _plrdmctdcAccessToken    :: !(Maybe Text)
+    , _plrdmctdcUploadType     :: !(Maybe Text)
+    , _plrdmctdcPayload        :: !ModifyCloudToDeviceConfigRequest
+    , _plrdmctdcName           :: !Text
+    , _plrdmctdcCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ProjectsLocationsRegistriesDevicesModifyCloudToDeviceConfig' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'plrdmctdcXgafv'
+--
+-- * 'plrdmctdcUploadProtocol'
+--
+-- * 'plrdmctdcAccessToken'
+--
+-- * 'plrdmctdcUploadType'
+--
+-- * 'plrdmctdcPayload'
+--
+-- * 'plrdmctdcName'
+--
+-- * 'plrdmctdcCallback'
+projectsLocationsRegistriesDevicesModifyCloudToDeviceConfig
+    :: ModifyCloudToDeviceConfigRequest -- ^ 'plrdmctdcPayload'
+    -> Text -- ^ 'plrdmctdcName'
+    -> ProjectsLocationsRegistriesDevicesModifyCloudToDeviceConfig
+projectsLocationsRegistriesDevicesModifyCloudToDeviceConfig pPlrdmctdcPayload_ pPlrdmctdcName_ =
+    ProjectsLocationsRegistriesDevicesModifyCloudToDeviceConfig'
+    { _plrdmctdcXgafv = Nothing
+    , _plrdmctdcUploadProtocol = Nothing
+    , _plrdmctdcAccessToken = Nothing
+    , _plrdmctdcUploadType = Nothing
+    , _plrdmctdcPayload = pPlrdmctdcPayload_
+    , _plrdmctdcName = pPlrdmctdcName_
+    , _plrdmctdcCallback = Nothing
+    }
+
+-- | V1 error format.
+plrdmctdcXgafv :: Lens' ProjectsLocationsRegistriesDevicesModifyCloudToDeviceConfig (Maybe Xgafv)
+plrdmctdcXgafv
+  = lens _plrdmctdcXgafv
+      (\ s a -> s{_plrdmctdcXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+plrdmctdcUploadProtocol :: Lens' ProjectsLocationsRegistriesDevicesModifyCloudToDeviceConfig (Maybe Text)
+plrdmctdcUploadProtocol
+  = lens _plrdmctdcUploadProtocol
+      (\ s a -> s{_plrdmctdcUploadProtocol = a})
+
+-- | OAuth access token.
+plrdmctdcAccessToken :: Lens' ProjectsLocationsRegistriesDevicesModifyCloudToDeviceConfig (Maybe Text)
+plrdmctdcAccessToken
+  = lens _plrdmctdcAccessToken
+      (\ s a -> s{_plrdmctdcAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+plrdmctdcUploadType :: Lens' ProjectsLocationsRegistriesDevicesModifyCloudToDeviceConfig (Maybe Text)
+plrdmctdcUploadType
+  = lens _plrdmctdcUploadType
+      (\ s a -> s{_plrdmctdcUploadType = a})
+
+-- | Multipart request metadata.
+plrdmctdcPayload :: Lens' ProjectsLocationsRegistriesDevicesModifyCloudToDeviceConfig ModifyCloudToDeviceConfigRequest
+plrdmctdcPayload
+  = lens _plrdmctdcPayload
+      (\ s a -> s{_plrdmctdcPayload = a})
+
+-- | The name of the device. For example,
+-- \`projects\/p0\/locations\/us-central1\/registries\/registry0\/devices\/device0\`
+-- or
+-- \`projects\/p0\/locations\/us-central1\/registries\/registry0\/devices\/{num_id}\`.
+plrdmctdcName :: Lens' ProjectsLocationsRegistriesDevicesModifyCloudToDeviceConfig Text
+plrdmctdcName
+  = lens _plrdmctdcName
+      (\ s a -> s{_plrdmctdcName = a})
+
+-- | JSONP
+plrdmctdcCallback :: Lens' ProjectsLocationsRegistriesDevicesModifyCloudToDeviceConfig (Maybe Text)
+plrdmctdcCallback
+  = lens _plrdmctdcCallback
+      (\ s a -> s{_plrdmctdcCallback = a})
+
+instance GoogleRequest
+         ProjectsLocationsRegistriesDevicesModifyCloudToDeviceConfig
+         where
+        type Rs
+               ProjectsLocationsRegistriesDevicesModifyCloudToDeviceConfig
+             = DeviceConfig
+        type Scopes
+               ProjectsLocationsRegistriesDevicesModifyCloudToDeviceConfig
+             =
+             '["https://www.googleapis.com/auth/cloud-platform",
+               "https://www.googleapis.com/auth/cloudiot"]
+        requestClient
+          ProjectsLocationsRegistriesDevicesModifyCloudToDeviceConfig'{..}
+          = go _plrdmctdcName _plrdmctdcXgafv
+              _plrdmctdcUploadProtocol
+              _plrdmctdcAccessToken
+              _plrdmctdcUploadType
+              _plrdmctdcCallback
+              (Just AltJSON)
+              _plrdmctdcPayload
+              cloudIOTService
+          where go
+                  = buildClient
+                      (Proxy ::
+                         Proxy
+                           ProjectsLocationsRegistriesDevicesModifyCloudToDeviceConfigResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Devices/Patch.hs b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Devices/Patch.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Devices/Patch.hs
@@ -0,0 +1,188 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Devices.Patch
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates a device.
+--
+-- /See:/ <https://cloud.google.com/iot Cloud IoT API Reference> for @cloudiot.projects.locations.registries.devices.patch@.
+module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Devices.Patch
+    (
+    -- * REST Resource
+      ProjectsLocationsRegistriesDevicesPatchResource
+
+    -- * Creating a Request
+    , projectsLocationsRegistriesDevicesPatch
+    , ProjectsLocationsRegistriesDevicesPatch
+
+    -- * Request Lenses
+    , plrdpXgafv
+    , plrdpUploadProtocol
+    , plrdpUpdateMask
+    , plrdpAccessToken
+    , plrdpUploadType
+    , plrdpPayload
+    , plrdpName
+    , plrdpCallback
+    ) where
+
+import           Network.Google.CloudIOT.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @cloudiot.projects.locations.registries.devices.patch@ method which the
+-- 'ProjectsLocationsRegistriesDevicesPatch' request conforms to.
+type ProjectsLocationsRegistriesDevicesPatchResource
+     =
+     "v1" :>
+       Capture "name" Text :>
+         QueryParam "$.xgafv" Xgafv :>
+           QueryParam "upload_protocol" Text :>
+             QueryParam "updateMask" GFieldMask :>
+               QueryParam "access_token" Text :>
+                 QueryParam "uploadType" Text :>
+                   QueryParam "callback" Text :>
+                     QueryParam "alt" AltJSON :>
+                       ReqBody '[JSON] Device :> Patch '[JSON] Device
+
+-- | Updates a device.
+--
+-- /See:/ 'projectsLocationsRegistriesDevicesPatch' smart constructor.
+data ProjectsLocationsRegistriesDevicesPatch = ProjectsLocationsRegistriesDevicesPatch'
+    { _plrdpXgafv          :: !(Maybe Xgafv)
+    , _plrdpUploadProtocol :: !(Maybe Text)
+    , _plrdpUpdateMask     :: !(Maybe GFieldMask)
+    , _plrdpAccessToken    :: !(Maybe Text)
+    , _plrdpUploadType     :: !(Maybe Text)
+    , _plrdpPayload        :: !Device
+    , _plrdpName           :: !Text
+    , _plrdpCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ProjectsLocationsRegistriesDevicesPatch' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'plrdpXgafv'
+--
+-- * 'plrdpUploadProtocol'
+--
+-- * 'plrdpUpdateMask'
+--
+-- * 'plrdpAccessToken'
+--
+-- * 'plrdpUploadType'
+--
+-- * 'plrdpPayload'
+--
+-- * 'plrdpName'
+--
+-- * 'plrdpCallback'
+projectsLocationsRegistriesDevicesPatch
+    :: Device -- ^ 'plrdpPayload'
+    -> Text -- ^ 'plrdpName'
+    -> ProjectsLocationsRegistriesDevicesPatch
+projectsLocationsRegistriesDevicesPatch pPlrdpPayload_ pPlrdpName_ =
+    ProjectsLocationsRegistriesDevicesPatch'
+    { _plrdpXgafv = Nothing
+    , _plrdpUploadProtocol = Nothing
+    , _plrdpUpdateMask = Nothing
+    , _plrdpAccessToken = Nothing
+    , _plrdpUploadType = Nothing
+    , _plrdpPayload = pPlrdpPayload_
+    , _plrdpName = pPlrdpName_
+    , _plrdpCallback = Nothing
+    }
+
+-- | V1 error format.
+plrdpXgafv :: Lens' ProjectsLocationsRegistriesDevicesPatch (Maybe Xgafv)
+plrdpXgafv
+  = lens _plrdpXgafv (\ s a -> s{_plrdpXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+plrdpUploadProtocol :: Lens' ProjectsLocationsRegistriesDevicesPatch (Maybe Text)
+plrdpUploadProtocol
+  = lens _plrdpUploadProtocol
+      (\ s a -> s{_plrdpUploadProtocol = a})
+
+-- | Only updates the \`device\` fields indicated by this mask. The field
+-- mask must not be empty, and it must not contain fields that are
+-- immutable or only set by the server. Mutable top-level fields:
+-- \`credentials\`, \`blocked\`, and \`metadata\`
+plrdpUpdateMask :: Lens' ProjectsLocationsRegistriesDevicesPatch (Maybe GFieldMask)
+plrdpUpdateMask
+  = lens _plrdpUpdateMask
+      (\ s a -> s{_plrdpUpdateMask = a})
+
+-- | OAuth access token.
+plrdpAccessToken :: Lens' ProjectsLocationsRegistriesDevicesPatch (Maybe Text)
+plrdpAccessToken
+  = lens _plrdpAccessToken
+      (\ s a -> s{_plrdpAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+plrdpUploadType :: Lens' ProjectsLocationsRegistriesDevicesPatch (Maybe Text)
+plrdpUploadType
+  = lens _plrdpUploadType
+      (\ s a -> s{_plrdpUploadType = a})
+
+-- | Multipart request metadata.
+plrdpPayload :: Lens' ProjectsLocationsRegistriesDevicesPatch Device
+plrdpPayload
+  = lens _plrdpPayload (\ s a -> s{_plrdpPayload = a})
+
+-- | The resource path name. For example,
+-- \`projects\/p1\/locations\/us-central1\/registries\/registry0\/devices\/dev0\`
+-- or
+-- \`projects\/p1\/locations\/us-central1\/registries\/registry0\/devices\/{num_id}\`.
+-- When \`name\` is populated as a response from the service, it always
+-- ends in the device numeric ID.
+plrdpName :: Lens' ProjectsLocationsRegistriesDevicesPatch Text
+plrdpName
+  = lens _plrdpName (\ s a -> s{_plrdpName = a})
+
+-- | JSONP
+plrdpCallback :: Lens' ProjectsLocationsRegistriesDevicesPatch (Maybe Text)
+plrdpCallback
+  = lens _plrdpCallback
+      (\ s a -> s{_plrdpCallback = a})
+
+instance GoogleRequest
+         ProjectsLocationsRegistriesDevicesPatch where
+        type Rs ProjectsLocationsRegistriesDevicesPatch =
+             Device
+        type Scopes ProjectsLocationsRegistriesDevicesPatch =
+             '["https://www.googleapis.com/auth/cloud-platform",
+               "https://www.googleapis.com/auth/cloudiot"]
+        requestClient
+          ProjectsLocationsRegistriesDevicesPatch'{..}
+          = go _plrdpName _plrdpXgafv _plrdpUploadProtocol
+              _plrdpUpdateMask
+              _plrdpAccessToken
+              _plrdpUploadType
+              _plrdpCallback
+              (Just AltJSON)
+              _plrdpPayload
+              cloudIOTService
+          where go
+                  = buildClient
+                      (Proxy ::
+                         Proxy
+                           ProjectsLocationsRegistriesDevicesPatchResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Devices/SendCommandToDevice.hs b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Devices/SendCommandToDevice.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Devices/SendCommandToDevice.hs
@@ -0,0 +1,202 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Devices.SendCommandToDevice
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Sends a command to the specified device. In order for a device to be
+-- able to receive commands, it must: 1) be connected to Cloud IoT Core
+-- using the MQTT protocol, and 2) be subscribed to the group of MQTT
+-- topics specified by \/devices\/{device-id}\/commands\/#. This
+-- subscription will receive commands at the top-level topic
+-- \/devices\/{device-id}\/commands as well as commands for subfolders,
+-- like \/devices\/{device-id}\/commands\/subfolder. Note that subscribing
+-- to specific subfolders is not supported. If the command could not be
+-- delivered to the device, this method will return an error; in
+-- particular, if the device is not subscribed, this method will return
+-- FAILED_PRECONDITION. Otherwise, this method will return OK. If the
+-- subscription is QoS 1, at least once delivery will be guaranteed; for
+-- QoS 0, no acknowledgment will be expected from the device.
+--
+-- /See:/ <https://cloud.google.com/iot Cloud IoT API Reference> for @cloudiot.projects.locations.registries.devices.sendCommandToDevice@.
+module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Devices.SendCommandToDevice
+    (
+    -- * REST Resource
+      ProjectsLocationsRegistriesDevicesSendCommandToDeviceResource
+
+    -- * Creating a Request
+    , projectsLocationsRegistriesDevicesSendCommandToDevice
+    , ProjectsLocationsRegistriesDevicesSendCommandToDevice
+
+    -- * Request Lenses
+    , plrdsctdXgafv
+    , plrdsctdUploadProtocol
+    , plrdsctdAccessToken
+    , plrdsctdUploadType
+    , plrdsctdPayload
+    , plrdsctdName
+    , plrdsctdCallback
+    ) where
+
+import           Network.Google.CloudIOT.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @cloudiot.projects.locations.registries.devices.sendCommandToDevice@ method which the
+-- 'ProjectsLocationsRegistriesDevicesSendCommandToDevice' request conforms to.
+type ProjectsLocationsRegistriesDevicesSendCommandToDeviceResource
+     =
+     "v1" :>
+       CaptureMode "name" "sendCommandToDevice" Text :>
+         QueryParam "$.xgafv" Xgafv :>
+           QueryParam "upload_protocol" Text :>
+             QueryParam "access_token" Text :>
+               QueryParam "uploadType" Text :>
+                 QueryParam "callback" Text :>
+                   QueryParam "alt" AltJSON :>
+                     ReqBody '[JSON] SendCommandToDeviceRequest :>
+                       Post '[JSON] SendCommandToDeviceResponse
+
+-- | Sends a command to the specified device. In order for a device to be
+-- able to receive commands, it must: 1) be connected to Cloud IoT Core
+-- using the MQTT protocol, and 2) be subscribed to the group of MQTT
+-- topics specified by \/devices\/{device-id}\/commands\/#. This
+-- subscription will receive commands at the top-level topic
+-- \/devices\/{device-id}\/commands as well as commands for subfolders,
+-- like \/devices\/{device-id}\/commands\/subfolder. Note that subscribing
+-- to specific subfolders is not supported. If the command could not be
+-- delivered to the device, this method will return an error; in
+-- particular, if the device is not subscribed, this method will return
+-- FAILED_PRECONDITION. Otherwise, this method will return OK. If the
+-- subscription is QoS 1, at least once delivery will be guaranteed; for
+-- QoS 0, no acknowledgment will be expected from the device.
+--
+-- /See:/ 'projectsLocationsRegistriesDevicesSendCommandToDevice' smart constructor.
+data ProjectsLocationsRegistriesDevicesSendCommandToDevice = ProjectsLocationsRegistriesDevicesSendCommandToDevice'
+    { _plrdsctdXgafv          :: !(Maybe Xgafv)
+    , _plrdsctdUploadProtocol :: !(Maybe Text)
+    , _plrdsctdAccessToken    :: !(Maybe Text)
+    , _plrdsctdUploadType     :: !(Maybe Text)
+    , _plrdsctdPayload        :: !SendCommandToDeviceRequest
+    , _plrdsctdName           :: !Text
+    , _plrdsctdCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ProjectsLocationsRegistriesDevicesSendCommandToDevice' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'plrdsctdXgafv'
+--
+-- * 'plrdsctdUploadProtocol'
+--
+-- * 'plrdsctdAccessToken'
+--
+-- * 'plrdsctdUploadType'
+--
+-- * 'plrdsctdPayload'
+--
+-- * 'plrdsctdName'
+--
+-- * 'plrdsctdCallback'
+projectsLocationsRegistriesDevicesSendCommandToDevice
+    :: SendCommandToDeviceRequest -- ^ 'plrdsctdPayload'
+    -> Text -- ^ 'plrdsctdName'
+    -> ProjectsLocationsRegistriesDevicesSendCommandToDevice
+projectsLocationsRegistriesDevicesSendCommandToDevice pPlrdsctdPayload_ pPlrdsctdName_ =
+    ProjectsLocationsRegistriesDevicesSendCommandToDevice'
+    { _plrdsctdXgafv = Nothing
+    , _plrdsctdUploadProtocol = Nothing
+    , _plrdsctdAccessToken = Nothing
+    , _plrdsctdUploadType = Nothing
+    , _plrdsctdPayload = pPlrdsctdPayload_
+    , _plrdsctdName = pPlrdsctdName_
+    , _plrdsctdCallback = Nothing
+    }
+
+-- | V1 error format.
+plrdsctdXgafv :: Lens' ProjectsLocationsRegistriesDevicesSendCommandToDevice (Maybe Xgafv)
+plrdsctdXgafv
+  = lens _plrdsctdXgafv
+      (\ s a -> s{_plrdsctdXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+plrdsctdUploadProtocol :: Lens' ProjectsLocationsRegistriesDevicesSendCommandToDevice (Maybe Text)
+plrdsctdUploadProtocol
+  = lens _plrdsctdUploadProtocol
+      (\ s a -> s{_plrdsctdUploadProtocol = a})
+
+-- | OAuth access token.
+plrdsctdAccessToken :: Lens' ProjectsLocationsRegistriesDevicesSendCommandToDevice (Maybe Text)
+plrdsctdAccessToken
+  = lens _plrdsctdAccessToken
+      (\ s a -> s{_plrdsctdAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+plrdsctdUploadType :: Lens' ProjectsLocationsRegistriesDevicesSendCommandToDevice (Maybe Text)
+plrdsctdUploadType
+  = lens _plrdsctdUploadType
+      (\ s a -> s{_plrdsctdUploadType = a})
+
+-- | Multipart request metadata.
+plrdsctdPayload :: Lens' ProjectsLocationsRegistriesDevicesSendCommandToDevice SendCommandToDeviceRequest
+plrdsctdPayload
+  = lens _plrdsctdPayload
+      (\ s a -> s{_plrdsctdPayload = a})
+
+-- | The name of the device. For example,
+-- \`projects\/p0\/locations\/us-central1\/registries\/registry0\/devices\/device0\`
+-- or
+-- \`projects\/p0\/locations\/us-central1\/registries\/registry0\/devices\/{num_id}\`.
+plrdsctdName :: Lens' ProjectsLocationsRegistriesDevicesSendCommandToDevice Text
+plrdsctdName
+  = lens _plrdsctdName (\ s a -> s{_plrdsctdName = a})
+
+-- | JSONP
+plrdsctdCallback :: Lens' ProjectsLocationsRegistriesDevicesSendCommandToDevice (Maybe Text)
+plrdsctdCallback
+  = lens _plrdsctdCallback
+      (\ s a -> s{_plrdsctdCallback = a})
+
+instance GoogleRequest
+         ProjectsLocationsRegistriesDevicesSendCommandToDevice
+         where
+        type Rs
+               ProjectsLocationsRegistriesDevicesSendCommandToDevice
+             = SendCommandToDeviceResponse
+        type Scopes
+               ProjectsLocationsRegistriesDevicesSendCommandToDevice
+             =
+             '["https://www.googleapis.com/auth/cloud-platform",
+               "https://www.googleapis.com/auth/cloudiot"]
+        requestClient
+          ProjectsLocationsRegistriesDevicesSendCommandToDevice'{..}
+          = go _plrdsctdName _plrdsctdXgafv
+              _plrdsctdUploadProtocol
+              _plrdsctdAccessToken
+              _plrdsctdUploadType
+              _plrdsctdCallback
+              (Just AltJSON)
+              _plrdsctdPayload
+              cloudIOTService
+          where go
+                  = buildClient
+                      (Proxy ::
+                         Proxy
+                           ProjectsLocationsRegistriesDevicesSendCommandToDeviceResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Devices/States/List.hs b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Devices/States/List.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Devices/States/List.hs
@@ -0,0 +1,179 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Devices.States.List
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists the last few versions of the device state in descending order
+-- (i.e.: newest first).
+--
+-- /See:/ <https://cloud.google.com/iot Cloud IoT API Reference> for @cloudiot.projects.locations.registries.devices.states.list@.
+module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Devices.States.List
+    (
+    -- * REST Resource
+      ProjectsLocationsRegistriesDevicesStatesListResource
+
+    -- * Creating a Request
+    , projectsLocationsRegistriesDevicesStatesList
+    , ProjectsLocationsRegistriesDevicesStatesList
+
+    -- * Request Lenses
+    , plrdslXgafv
+    , plrdslUploadProtocol
+    , plrdslAccessToken
+    , plrdslUploadType
+    , plrdslName
+    , plrdslNumStates
+    , plrdslCallback
+    ) where
+
+import           Network.Google.CloudIOT.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @cloudiot.projects.locations.registries.devices.states.list@ method which the
+-- 'ProjectsLocationsRegistriesDevicesStatesList' request conforms to.
+type ProjectsLocationsRegistriesDevicesStatesListResource
+     =
+     "v1" :>
+       Capture "name" Text :>
+         "states" :>
+           QueryParam "$.xgafv" Xgafv :>
+             QueryParam "upload_protocol" Text :>
+               QueryParam "access_token" Text :>
+                 QueryParam "uploadType" Text :>
+                   QueryParam "numStates" (Textual Int32) :>
+                     QueryParam "callback" Text :>
+                       QueryParam "alt" AltJSON :>
+                         Get '[JSON] ListDeviceStatesResponse
+
+-- | Lists the last few versions of the device state in descending order
+-- (i.e.: newest first).
+--
+-- /See:/ 'projectsLocationsRegistriesDevicesStatesList' smart constructor.
+data ProjectsLocationsRegistriesDevicesStatesList = ProjectsLocationsRegistriesDevicesStatesList'
+    { _plrdslXgafv          :: !(Maybe Xgafv)
+    , _plrdslUploadProtocol :: !(Maybe Text)
+    , _plrdslAccessToken    :: !(Maybe Text)
+    , _plrdslUploadType     :: !(Maybe Text)
+    , _plrdslName           :: !Text
+    , _plrdslNumStates      :: !(Maybe (Textual Int32))
+    , _plrdslCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ProjectsLocationsRegistriesDevicesStatesList' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'plrdslXgafv'
+--
+-- * 'plrdslUploadProtocol'
+--
+-- * 'plrdslAccessToken'
+--
+-- * 'plrdslUploadType'
+--
+-- * 'plrdslName'
+--
+-- * 'plrdslNumStates'
+--
+-- * 'plrdslCallback'
+projectsLocationsRegistriesDevicesStatesList
+    :: Text -- ^ 'plrdslName'
+    -> ProjectsLocationsRegistriesDevicesStatesList
+projectsLocationsRegistriesDevicesStatesList pPlrdslName_ =
+    ProjectsLocationsRegistriesDevicesStatesList'
+    { _plrdslXgafv = Nothing
+    , _plrdslUploadProtocol = Nothing
+    , _plrdslAccessToken = Nothing
+    , _plrdslUploadType = Nothing
+    , _plrdslName = pPlrdslName_
+    , _plrdslNumStates = Nothing
+    , _plrdslCallback = Nothing
+    }
+
+-- | V1 error format.
+plrdslXgafv :: Lens' ProjectsLocationsRegistriesDevicesStatesList (Maybe Xgafv)
+plrdslXgafv
+  = lens _plrdslXgafv (\ s a -> s{_plrdslXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+plrdslUploadProtocol :: Lens' ProjectsLocationsRegistriesDevicesStatesList (Maybe Text)
+plrdslUploadProtocol
+  = lens _plrdslUploadProtocol
+      (\ s a -> s{_plrdslUploadProtocol = a})
+
+-- | OAuth access token.
+plrdslAccessToken :: Lens' ProjectsLocationsRegistriesDevicesStatesList (Maybe Text)
+plrdslAccessToken
+  = lens _plrdslAccessToken
+      (\ s a -> s{_plrdslAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+plrdslUploadType :: Lens' ProjectsLocationsRegistriesDevicesStatesList (Maybe Text)
+plrdslUploadType
+  = lens _plrdslUploadType
+      (\ s a -> s{_plrdslUploadType = a})
+
+-- | The name of the device. For example,
+-- \`projects\/p0\/locations\/us-central1\/registries\/registry0\/devices\/device0\`
+-- or
+-- \`projects\/p0\/locations\/us-central1\/registries\/registry0\/devices\/{num_id}\`.
+plrdslName :: Lens' ProjectsLocationsRegistriesDevicesStatesList Text
+plrdslName
+  = lens _plrdslName (\ s a -> s{_plrdslName = a})
+
+-- | The number of states to list. States are listed in descending order of
+-- update time. The maximum number of states retained is 10. If this value
+-- is zero, it will return all the states available.
+plrdslNumStates :: Lens' ProjectsLocationsRegistriesDevicesStatesList (Maybe Int32)
+plrdslNumStates
+  = lens _plrdslNumStates
+      (\ s a -> s{_plrdslNumStates = a})
+      . mapping _Coerce
+
+-- | JSONP
+plrdslCallback :: Lens' ProjectsLocationsRegistriesDevicesStatesList (Maybe Text)
+plrdslCallback
+  = lens _plrdslCallback
+      (\ s a -> s{_plrdslCallback = a})
+
+instance GoogleRequest
+         ProjectsLocationsRegistriesDevicesStatesList where
+        type Rs ProjectsLocationsRegistriesDevicesStatesList
+             = ListDeviceStatesResponse
+        type Scopes
+               ProjectsLocationsRegistriesDevicesStatesList
+             =
+             '["https://www.googleapis.com/auth/cloud-platform",
+               "https://www.googleapis.com/auth/cloudiot"]
+        requestClient
+          ProjectsLocationsRegistriesDevicesStatesList'{..}
+          = go _plrdslName _plrdslXgafv _plrdslUploadProtocol
+              _plrdslAccessToken
+              _plrdslUploadType
+              _plrdslNumStates
+              _plrdslCallback
+              (Just AltJSON)
+              cloudIOTService
+          where go
+                  = buildClient
+                      (Proxy ::
+                         Proxy
+                           ProjectsLocationsRegistriesDevicesStatesListResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Get.hs b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Get.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Get.hs
@@ -0,0 +1,151 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Get
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets a device registry configuration.
+--
+-- /See:/ <https://cloud.google.com/iot Cloud IoT API Reference> for @cloudiot.projects.locations.registries.get@.
+module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Get
+    (
+    -- * REST Resource
+      ProjectsLocationsRegistriesGetResource
+
+    -- * Creating a Request
+    , projectsLocationsRegistriesGet
+    , ProjectsLocationsRegistriesGet
+
+    -- * Request Lenses
+    , plrgXgafv
+    , plrgUploadProtocol
+    , plrgAccessToken
+    , plrgUploadType
+    , plrgName
+    , plrgCallback
+    ) where
+
+import           Network.Google.CloudIOT.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @cloudiot.projects.locations.registries.get@ method which the
+-- 'ProjectsLocationsRegistriesGet' request conforms to.
+type ProjectsLocationsRegistriesGetResource =
+     "v1" :>
+       Capture "name" Text :>
+         QueryParam "$.xgafv" Xgafv :>
+           QueryParam "upload_protocol" Text :>
+             QueryParam "access_token" Text :>
+               QueryParam "uploadType" Text :>
+                 QueryParam "callback" Text :>
+                   QueryParam "alt" AltJSON :>
+                     Get '[JSON] DeviceRegistry
+
+-- | Gets a device registry configuration.
+--
+-- /See:/ 'projectsLocationsRegistriesGet' smart constructor.
+data ProjectsLocationsRegistriesGet = ProjectsLocationsRegistriesGet'
+    { _plrgXgafv          :: !(Maybe Xgafv)
+    , _plrgUploadProtocol :: !(Maybe Text)
+    , _plrgAccessToken    :: !(Maybe Text)
+    , _plrgUploadType     :: !(Maybe Text)
+    , _plrgName           :: !Text
+    , _plrgCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ProjectsLocationsRegistriesGet' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'plrgXgafv'
+--
+-- * 'plrgUploadProtocol'
+--
+-- * 'plrgAccessToken'
+--
+-- * 'plrgUploadType'
+--
+-- * 'plrgName'
+--
+-- * 'plrgCallback'
+projectsLocationsRegistriesGet
+    :: Text -- ^ 'plrgName'
+    -> ProjectsLocationsRegistriesGet
+projectsLocationsRegistriesGet pPlrgName_ =
+    ProjectsLocationsRegistriesGet'
+    { _plrgXgafv = Nothing
+    , _plrgUploadProtocol = Nothing
+    , _plrgAccessToken = Nothing
+    , _plrgUploadType = Nothing
+    , _plrgName = pPlrgName_
+    , _plrgCallback = Nothing
+    }
+
+-- | V1 error format.
+plrgXgafv :: Lens' ProjectsLocationsRegistriesGet (Maybe Xgafv)
+plrgXgafv
+  = lens _plrgXgafv (\ s a -> s{_plrgXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+plrgUploadProtocol :: Lens' ProjectsLocationsRegistriesGet (Maybe Text)
+plrgUploadProtocol
+  = lens _plrgUploadProtocol
+      (\ s a -> s{_plrgUploadProtocol = a})
+
+-- | OAuth access token.
+plrgAccessToken :: Lens' ProjectsLocationsRegistriesGet (Maybe Text)
+plrgAccessToken
+  = lens _plrgAccessToken
+      (\ s a -> s{_plrgAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+plrgUploadType :: Lens' ProjectsLocationsRegistriesGet (Maybe Text)
+plrgUploadType
+  = lens _plrgUploadType
+      (\ s a -> s{_plrgUploadType = a})
+
+-- | The name of the device registry. For example,
+-- \`projects\/example-project\/locations\/us-central1\/registries\/my-registry\`.
+plrgName :: Lens' ProjectsLocationsRegistriesGet Text
+plrgName = lens _plrgName (\ s a -> s{_plrgName = a})
+
+-- | JSONP
+plrgCallback :: Lens' ProjectsLocationsRegistriesGet (Maybe Text)
+plrgCallback
+  = lens _plrgCallback (\ s a -> s{_plrgCallback = a})
+
+instance GoogleRequest ProjectsLocationsRegistriesGet
+         where
+        type Rs ProjectsLocationsRegistriesGet =
+             DeviceRegistry
+        type Scopes ProjectsLocationsRegistriesGet =
+             '["https://www.googleapis.com/auth/cloud-platform",
+               "https://www.googleapis.com/auth/cloudiot"]
+        requestClient ProjectsLocationsRegistriesGet'{..}
+          = go _plrgName _plrgXgafv _plrgUploadProtocol
+              _plrgAccessToken
+              _plrgUploadType
+              _plrgCallback
+              (Just AltJSON)
+              cloudIOTService
+          where go
+                  = buildClient
+                      (Proxy ::
+                         Proxy ProjectsLocationsRegistriesGetResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/GetIAMPolicy.hs b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/GetIAMPolicy.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/GetIAMPolicy.hs
@@ -0,0 +1,174 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.CloudIOT.Projects.Locations.Registries.GetIAMPolicy
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets the access control policy for a resource. Returns an empty policy
+-- if the resource exists and does not have a policy set.
+--
+-- /See:/ <https://cloud.google.com/iot Cloud IoT API Reference> for @cloudiot.projects.locations.registries.getIamPolicy@.
+module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.GetIAMPolicy
+    (
+    -- * REST Resource
+      ProjectsLocationsRegistriesGetIAMPolicyResource
+
+    -- * Creating a Request
+    , projectsLocationsRegistriesGetIAMPolicy
+    , ProjectsLocationsRegistriesGetIAMPolicy
+
+    -- * Request Lenses
+    , plrgipXgafv
+    , plrgipUploadProtocol
+    , plrgipAccessToken
+    , plrgipUploadType
+    , plrgipPayload
+    , plrgipResource
+    , plrgipCallback
+    ) where
+
+import           Network.Google.CloudIOT.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @cloudiot.projects.locations.registries.getIamPolicy@ method which the
+-- 'ProjectsLocationsRegistriesGetIAMPolicy' request conforms to.
+type ProjectsLocationsRegistriesGetIAMPolicyResource
+     =
+     "v1" :>
+       CaptureMode "resource" "getIamPolicy" Text :>
+         QueryParam "$.xgafv" Xgafv :>
+           QueryParam "upload_protocol" Text :>
+             QueryParam "access_token" Text :>
+               QueryParam "uploadType" Text :>
+                 QueryParam "callback" Text :>
+                   QueryParam "alt" AltJSON :>
+                     ReqBody '[JSON] GetIAMPolicyRequest :>
+                       Post '[JSON] Policy
+
+-- | Gets the access control policy for a resource. Returns an empty policy
+-- if the resource exists and does not have a policy set.
+--
+-- /See:/ 'projectsLocationsRegistriesGetIAMPolicy' smart constructor.
+data ProjectsLocationsRegistriesGetIAMPolicy = ProjectsLocationsRegistriesGetIAMPolicy'
+    { _plrgipXgafv          :: !(Maybe Xgafv)
+    , _plrgipUploadProtocol :: !(Maybe Text)
+    , _plrgipAccessToken    :: !(Maybe Text)
+    , _plrgipUploadType     :: !(Maybe Text)
+    , _plrgipPayload        :: !GetIAMPolicyRequest
+    , _plrgipResource       :: !Text
+    , _plrgipCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ProjectsLocationsRegistriesGetIAMPolicy' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'plrgipXgafv'
+--
+-- * 'plrgipUploadProtocol'
+--
+-- * 'plrgipAccessToken'
+--
+-- * 'plrgipUploadType'
+--
+-- * 'plrgipPayload'
+--
+-- * 'plrgipResource'
+--
+-- * 'plrgipCallback'
+projectsLocationsRegistriesGetIAMPolicy
+    :: GetIAMPolicyRequest -- ^ 'plrgipPayload'
+    -> Text -- ^ 'plrgipResource'
+    -> ProjectsLocationsRegistriesGetIAMPolicy
+projectsLocationsRegistriesGetIAMPolicy pPlrgipPayload_ pPlrgipResource_ =
+    ProjectsLocationsRegistriesGetIAMPolicy'
+    { _plrgipXgafv = Nothing
+    , _plrgipUploadProtocol = Nothing
+    , _plrgipAccessToken = Nothing
+    , _plrgipUploadType = Nothing
+    , _plrgipPayload = pPlrgipPayload_
+    , _plrgipResource = pPlrgipResource_
+    , _plrgipCallback = Nothing
+    }
+
+-- | V1 error format.
+plrgipXgafv :: Lens' ProjectsLocationsRegistriesGetIAMPolicy (Maybe Xgafv)
+plrgipXgafv
+  = lens _plrgipXgafv (\ s a -> s{_plrgipXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+plrgipUploadProtocol :: Lens' ProjectsLocationsRegistriesGetIAMPolicy (Maybe Text)
+plrgipUploadProtocol
+  = lens _plrgipUploadProtocol
+      (\ s a -> s{_plrgipUploadProtocol = a})
+
+-- | OAuth access token.
+plrgipAccessToken :: Lens' ProjectsLocationsRegistriesGetIAMPolicy (Maybe Text)
+plrgipAccessToken
+  = lens _plrgipAccessToken
+      (\ s a -> s{_plrgipAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+plrgipUploadType :: Lens' ProjectsLocationsRegistriesGetIAMPolicy (Maybe Text)
+plrgipUploadType
+  = lens _plrgipUploadType
+      (\ s a -> s{_plrgipUploadType = a})
+
+-- | Multipart request metadata.
+plrgipPayload :: Lens' ProjectsLocationsRegistriesGetIAMPolicy GetIAMPolicyRequest
+plrgipPayload
+  = lens _plrgipPayload
+      (\ s a -> s{_plrgipPayload = a})
+
+-- | REQUIRED: The resource for which the policy is being requested. See the
+-- operation documentation for the appropriate value for this field.
+plrgipResource :: Lens' ProjectsLocationsRegistriesGetIAMPolicy Text
+plrgipResource
+  = lens _plrgipResource
+      (\ s a -> s{_plrgipResource = a})
+
+-- | JSONP
+plrgipCallback :: Lens' ProjectsLocationsRegistriesGetIAMPolicy (Maybe Text)
+plrgipCallback
+  = lens _plrgipCallback
+      (\ s a -> s{_plrgipCallback = a})
+
+instance GoogleRequest
+         ProjectsLocationsRegistriesGetIAMPolicy where
+        type Rs ProjectsLocationsRegistriesGetIAMPolicy =
+             Policy
+        type Scopes ProjectsLocationsRegistriesGetIAMPolicy =
+             '["https://www.googleapis.com/auth/cloud-platform",
+               "https://www.googleapis.com/auth/cloudiot"]
+        requestClient
+          ProjectsLocationsRegistriesGetIAMPolicy'{..}
+          = go _plrgipResource _plrgipXgafv
+              _plrgipUploadProtocol
+              _plrgipAccessToken
+              _plrgipUploadType
+              _plrgipCallback
+              (Just AltJSON)
+              _plrgipPayload
+              cloudIOTService
+          where go
+                  = buildClient
+                      (Proxy ::
+                         Proxy
+                           ProjectsLocationsRegistriesGetIAMPolicyResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Groups/BindDeviceToGateway.hs b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Groups/BindDeviceToGateway.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Groups/BindDeviceToGateway.hs
@@ -0,0 +1,177 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.BindDeviceToGateway
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Associates the device with the gateway.
+--
+-- /See:/ <https://cloud.google.com/iot Cloud IoT API Reference> for @cloudiot.projects.locations.registries.groups.bindDeviceToGateway@.
+module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.BindDeviceToGateway
+    (
+    -- * REST Resource
+      ProjectsLocationsRegistriesGroupsBindDeviceToGatewayResource
+
+    -- * Creating a Request
+    , projectsLocationsRegistriesGroupsBindDeviceToGateway
+    , ProjectsLocationsRegistriesGroupsBindDeviceToGateway
+
+    -- * Request Lenses
+    , plrgbdtgParent
+    , plrgbdtgXgafv
+    , plrgbdtgUploadProtocol
+    , plrgbdtgAccessToken
+    , plrgbdtgUploadType
+    , plrgbdtgPayload
+    , plrgbdtgCallback
+    ) where
+
+import           Network.Google.CloudIOT.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @cloudiot.projects.locations.registries.groups.bindDeviceToGateway@ method which the
+-- 'ProjectsLocationsRegistriesGroupsBindDeviceToGateway' request conforms to.
+type ProjectsLocationsRegistriesGroupsBindDeviceToGatewayResource
+     =
+     "v1" :>
+       CaptureMode "parent" "bindDeviceToGateway" Text :>
+         QueryParam "$.xgafv" Xgafv :>
+           QueryParam "upload_protocol" Text :>
+             QueryParam "access_token" Text :>
+               QueryParam "uploadType" Text :>
+                 QueryParam "callback" Text :>
+                   QueryParam "alt" AltJSON :>
+                     ReqBody '[JSON] BindDeviceToGatewayRequest :>
+                       Post '[JSON] BindDeviceToGatewayResponse
+
+-- | Associates the device with the gateway.
+--
+-- /See:/ 'projectsLocationsRegistriesGroupsBindDeviceToGateway' smart constructor.
+data ProjectsLocationsRegistriesGroupsBindDeviceToGateway = ProjectsLocationsRegistriesGroupsBindDeviceToGateway'
+    { _plrgbdtgParent         :: !Text
+    , _plrgbdtgXgafv          :: !(Maybe Xgafv)
+    , _plrgbdtgUploadProtocol :: !(Maybe Text)
+    , _plrgbdtgAccessToken    :: !(Maybe Text)
+    , _plrgbdtgUploadType     :: !(Maybe Text)
+    , _plrgbdtgPayload        :: !BindDeviceToGatewayRequest
+    , _plrgbdtgCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ProjectsLocationsRegistriesGroupsBindDeviceToGateway' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'plrgbdtgParent'
+--
+-- * 'plrgbdtgXgafv'
+--
+-- * 'plrgbdtgUploadProtocol'
+--
+-- * 'plrgbdtgAccessToken'
+--
+-- * 'plrgbdtgUploadType'
+--
+-- * 'plrgbdtgPayload'
+--
+-- * 'plrgbdtgCallback'
+projectsLocationsRegistriesGroupsBindDeviceToGateway
+    :: Text -- ^ 'plrgbdtgParent'
+    -> BindDeviceToGatewayRequest -- ^ 'plrgbdtgPayload'
+    -> ProjectsLocationsRegistriesGroupsBindDeviceToGateway
+projectsLocationsRegistriesGroupsBindDeviceToGateway pPlrgbdtgParent_ pPlrgbdtgPayload_ =
+    ProjectsLocationsRegistriesGroupsBindDeviceToGateway'
+    { _plrgbdtgParent = pPlrgbdtgParent_
+    , _plrgbdtgXgafv = Nothing
+    , _plrgbdtgUploadProtocol = Nothing
+    , _plrgbdtgAccessToken = Nothing
+    , _plrgbdtgUploadType = Nothing
+    , _plrgbdtgPayload = pPlrgbdtgPayload_
+    , _plrgbdtgCallback = Nothing
+    }
+
+-- | The name of the registry. For example,
+-- \`projects\/example-project\/locations\/us-central1\/registries\/my-registry\`.
+plrgbdtgParent :: Lens' ProjectsLocationsRegistriesGroupsBindDeviceToGateway Text
+plrgbdtgParent
+  = lens _plrgbdtgParent
+      (\ s a -> s{_plrgbdtgParent = a})
+
+-- | V1 error format.
+plrgbdtgXgafv :: Lens' ProjectsLocationsRegistriesGroupsBindDeviceToGateway (Maybe Xgafv)
+plrgbdtgXgafv
+  = lens _plrgbdtgXgafv
+      (\ s a -> s{_plrgbdtgXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+plrgbdtgUploadProtocol :: Lens' ProjectsLocationsRegistriesGroupsBindDeviceToGateway (Maybe Text)
+plrgbdtgUploadProtocol
+  = lens _plrgbdtgUploadProtocol
+      (\ s a -> s{_plrgbdtgUploadProtocol = a})
+
+-- | OAuth access token.
+plrgbdtgAccessToken :: Lens' ProjectsLocationsRegistriesGroupsBindDeviceToGateway (Maybe Text)
+plrgbdtgAccessToken
+  = lens _plrgbdtgAccessToken
+      (\ s a -> s{_plrgbdtgAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+plrgbdtgUploadType :: Lens' ProjectsLocationsRegistriesGroupsBindDeviceToGateway (Maybe Text)
+plrgbdtgUploadType
+  = lens _plrgbdtgUploadType
+      (\ s a -> s{_plrgbdtgUploadType = a})
+
+-- | Multipart request metadata.
+plrgbdtgPayload :: Lens' ProjectsLocationsRegistriesGroupsBindDeviceToGateway BindDeviceToGatewayRequest
+plrgbdtgPayload
+  = lens _plrgbdtgPayload
+      (\ s a -> s{_plrgbdtgPayload = a})
+
+-- | JSONP
+plrgbdtgCallback :: Lens' ProjectsLocationsRegistriesGroupsBindDeviceToGateway (Maybe Text)
+plrgbdtgCallback
+  = lens _plrgbdtgCallback
+      (\ s a -> s{_plrgbdtgCallback = a})
+
+instance GoogleRequest
+         ProjectsLocationsRegistriesGroupsBindDeviceToGateway
+         where
+        type Rs
+               ProjectsLocationsRegistriesGroupsBindDeviceToGateway
+             = BindDeviceToGatewayResponse
+        type Scopes
+               ProjectsLocationsRegistriesGroupsBindDeviceToGateway
+             =
+             '["https://www.googleapis.com/auth/cloud-platform",
+               "https://www.googleapis.com/auth/cloudiot"]
+        requestClient
+          ProjectsLocationsRegistriesGroupsBindDeviceToGateway'{..}
+          = go _plrgbdtgParent _plrgbdtgXgafv
+              _plrgbdtgUploadProtocol
+              _plrgbdtgAccessToken
+              _plrgbdtgUploadType
+              _plrgbdtgCallback
+              (Just AltJSON)
+              _plrgbdtgPayload
+              cloudIOTService
+          where go
+                  = buildClient
+                      (Proxy ::
+                         Proxy
+                           ProjectsLocationsRegistriesGroupsBindDeviceToGatewayResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Groups/Devices/ConfigVersions/List.hs b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Groups/Devices/ConfigVersions/List.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Groups/Devices/ConfigVersions/List.hs
@@ -0,0 +1,183 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.Devices.ConfigVersions.List
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists the last few versions of the device configuration in descending
+-- order (i.e.: newest first).
+--
+-- /See:/ <https://cloud.google.com/iot Cloud IoT API Reference> for @cloudiot.projects.locations.registries.groups.devices.configVersions.list@.
+module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.Devices.ConfigVersions.List
+    (
+    -- * REST Resource
+      ProjectsLocationsRegistriesGroupsDevicesConfigVersionsListResource
+
+    -- * Creating a Request
+    , projectsLocationsRegistriesGroupsDevicesConfigVersionsList
+    , ProjectsLocationsRegistriesGroupsDevicesConfigVersionsList
+
+    -- * Request Lenses
+    , plrgdcvlXgafv
+    , plrgdcvlUploadProtocol
+    , plrgdcvlAccessToken
+    , plrgdcvlUploadType
+    , plrgdcvlNumVersions
+    , plrgdcvlName
+    , plrgdcvlCallback
+    ) where
+
+import           Network.Google.CloudIOT.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @cloudiot.projects.locations.registries.groups.devices.configVersions.list@ method which the
+-- 'ProjectsLocationsRegistriesGroupsDevicesConfigVersionsList' request conforms to.
+type ProjectsLocationsRegistriesGroupsDevicesConfigVersionsListResource
+     =
+     "v1" :>
+       Capture "name" Text :>
+         "configVersions" :>
+           QueryParam "$.xgafv" Xgafv :>
+             QueryParam "upload_protocol" Text :>
+               QueryParam "access_token" Text :>
+                 QueryParam "uploadType" Text :>
+                   QueryParam "numVersions" (Textual Int32) :>
+                     QueryParam "callback" Text :>
+                       QueryParam "alt" AltJSON :>
+                         Get '[JSON] ListDeviceConfigVersionsResponse
+
+-- | Lists the last few versions of the device configuration in descending
+-- order (i.e.: newest first).
+--
+-- /See:/ 'projectsLocationsRegistriesGroupsDevicesConfigVersionsList' smart constructor.
+data ProjectsLocationsRegistriesGroupsDevicesConfigVersionsList = ProjectsLocationsRegistriesGroupsDevicesConfigVersionsList'
+    { _plrgdcvlXgafv          :: !(Maybe Xgafv)
+    , _plrgdcvlUploadProtocol :: !(Maybe Text)
+    , _plrgdcvlAccessToken    :: !(Maybe Text)
+    , _plrgdcvlUploadType     :: !(Maybe Text)
+    , _plrgdcvlNumVersions    :: !(Maybe (Textual Int32))
+    , _plrgdcvlName           :: !Text
+    , _plrgdcvlCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ProjectsLocationsRegistriesGroupsDevicesConfigVersionsList' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'plrgdcvlXgafv'
+--
+-- * 'plrgdcvlUploadProtocol'
+--
+-- * 'plrgdcvlAccessToken'
+--
+-- * 'plrgdcvlUploadType'
+--
+-- * 'plrgdcvlNumVersions'
+--
+-- * 'plrgdcvlName'
+--
+-- * 'plrgdcvlCallback'
+projectsLocationsRegistriesGroupsDevicesConfigVersionsList
+    :: Text -- ^ 'plrgdcvlName'
+    -> ProjectsLocationsRegistriesGroupsDevicesConfigVersionsList
+projectsLocationsRegistriesGroupsDevicesConfigVersionsList pPlrgdcvlName_ =
+    ProjectsLocationsRegistriesGroupsDevicesConfigVersionsList'
+    { _plrgdcvlXgafv = Nothing
+    , _plrgdcvlUploadProtocol = Nothing
+    , _plrgdcvlAccessToken = Nothing
+    , _plrgdcvlUploadType = Nothing
+    , _plrgdcvlNumVersions = Nothing
+    , _plrgdcvlName = pPlrgdcvlName_
+    , _plrgdcvlCallback = Nothing
+    }
+
+-- | V1 error format.
+plrgdcvlXgafv :: Lens' ProjectsLocationsRegistriesGroupsDevicesConfigVersionsList (Maybe Xgafv)
+plrgdcvlXgafv
+  = lens _plrgdcvlXgafv
+      (\ s a -> s{_plrgdcvlXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+plrgdcvlUploadProtocol :: Lens' ProjectsLocationsRegistriesGroupsDevicesConfigVersionsList (Maybe Text)
+plrgdcvlUploadProtocol
+  = lens _plrgdcvlUploadProtocol
+      (\ s a -> s{_plrgdcvlUploadProtocol = a})
+
+-- | OAuth access token.
+plrgdcvlAccessToken :: Lens' ProjectsLocationsRegistriesGroupsDevicesConfigVersionsList (Maybe Text)
+plrgdcvlAccessToken
+  = lens _plrgdcvlAccessToken
+      (\ s a -> s{_plrgdcvlAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+plrgdcvlUploadType :: Lens' ProjectsLocationsRegistriesGroupsDevicesConfigVersionsList (Maybe Text)
+plrgdcvlUploadType
+  = lens _plrgdcvlUploadType
+      (\ s a -> s{_plrgdcvlUploadType = a})
+
+-- | The number of versions to list. Versions are listed in decreasing order
+-- of the version number. The maximum number of versions retained is 10. If
+-- this value is zero, it will return all the versions available.
+plrgdcvlNumVersions :: Lens' ProjectsLocationsRegistriesGroupsDevicesConfigVersionsList (Maybe Int32)
+plrgdcvlNumVersions
+  = lens _plrgdcvlNumVersions
+      (\ s a -> s{_plrgdcvlNumVersions = a})
+      . mapping _Coerce
+
+-- | The name of the device. For example,
+-- \`projects\/p0\/locations\/us-central1\/registries\/registry0\/devices\/device0\`
+-- or
+-- \`projects\/p0\/locations\/us-central1\/registries\/registry0\/devices\/{num_id}\`.
+plrgdcvlName :: Lens' ProjectsLocationsRegistriesGroupsDevicesConfigVersionsList Text
+plrgdcvlName
+  = lens _plrgdcvlName (\ s a -> s{_plrgdcvlName = a})
+
+-- | JSONP
+plrgdcvlCallback :: Lens' ProjectsLocationsRegistriesGroupsDevicesConfigVersionsList (Maybe Text)
+plrgdcvlCallback
+  = lens _plrgdcvlCallback
+      (\ s a -> s{_plrgdcvlCallback = a})
+
+instance GoogleRequest
+         ProjectsLocationsRegistriesGroupsDevicesConfigVersionsList
+         where
+        type Rs
+               ProjectsLocationsRegistriesGroupsDevicesConfigVersionsList
+             = ListDeviceConfigVersionsResponse
+        type Scopes
+               ProjectsLocationsRegistriesGroupsDevicesConfigVersionsList
+             =
+             '["https://www.googleapis.com/auth/cloud-platform",
+               "https://www.googleapis.com/auth/cloudiot"]
+        requestClient
+          ProjectsLocationsRegistriesGroupsDevicesConfigVersionsList'{..}
+          = go _plrgdcvlName _plrgdcvlXgafv
+              _plrgdcvlUploadProtocol
+              _plrgdcvlAccessToken
+              _plrgdcvlUploadType
+              _plrgdcvlNumVersions
+              _plrgdcvlCallback
+              (Just AltJSON)
+              cloudIOTService
+          where go
+                  = buildClient
+                      (Proxy ::
+                         Proxy
+                           ProjectsLocationsRegistriesGroupsDevicesConfigVersionsListResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Groups/Devices/Get.hs b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Groups/Devices/Get.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Groups/Devices/Get.hs
@@ -0,0 +1,173 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.Devices.Get
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets details about a device.
+--
+-- /See:/ <https://cloud.google.com/iot Cloud IoT API Reference> for @cloudiot.projects.locations.registries.groups.devices.get@.
+module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.Devices.Get
+    (
+    -- * REST Resource
+      ProjectsLocationsRegistriesGroupsDevicesGetResource
+
+    -- * Creating a Request
+    , projectsLocationsRegistriesGroupsDevicesGet
+    , ProjectsLocationsRegistriesGroupsDevicesGet
+
+    -- * Request Lenses
+    , plrgdgXgafv
+    , plrgdgUploadProtocol
+    , plrgdgAccessToken
+    , plrgdgUploadType
+    , plrgdgFieldMask
+    , plrgdgName
+    , plrgdgCallback
+    ) where
+
+import           Network.Google.CloudIOT.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @cloudiot.projects.locations.registries.groups.devices.get@ method which the
+-- 'ProjectsLocationsRegistriesGroupsDevicesGet' request conforms to.
+type ProjectsLocationsRegistriesGroupsDevicesGetResource
+     =
+     "v1" :>
+       Capture "name" Text :>
+         QueryParam "$.xgafv" Xgafv :>
+           QueryParam "upload_protocol" Text :>
+             QueryParam "access_token" Text :>
+               QueryParam "uploadType" Text :>
+                 QueryParam "fieldMask" GFieldMask :>
+                   QueryParam "callback" Text :>
+                     QueryParam "alt" AltJSON :> Get '[JSON] Device
+
+-- | Gets details about a device.
+--
+-- /See:/ 'projectsLocationsRegistriesGroupsDevicesGet' smart constructor.
+data ProjectsLocationsRegistriesGroupsDevicesGet = ProjectsLocationsRegistriesGroupsDevicesGet'
+    { _plrgdgXgafv          :: !(Maybe Xgafv)
+    , _plrgdgUploadProtocol :: !(Maybe Text)
+    , _plrgdgAccessToken    :: !(Maybe Text)
+    , _plrgdgUploadType     :: !(Maybe Text)
+    , _plrgdgFieldMask      :: !(Maybe GFieldMask)
+    , _plrgdgName           :: !Text
+    , _plrgdgCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ProjectsLocationsRegistriesGroupsDevicesGet' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'plrgdgXgafv'
+--
+-- * 'plrgdgUploadProtocol'
+--
+-- * 'plrgdgAccessToken'
+--
+-- * 'plrgdgUploadType'
+--
+-- * 'plrgdgFieldMask'
+--
+-- * 'plrgdgName'
+--
+-- * 'plrgdgCallback'
+projectsLocationsRegistriesGroupsDevicesGet
+    :: Text -- ^ 'plrgdgName'
+    -> ProjectsLocationsRegistriesGroupsDevicesGet
+projectsLocationsRegistriesGroupsDevicesGet pPlrgdgName_ =
+    ProjectsLocationsRegistriesGroupsDevicesGet'
+    { _plrgdgXgafv = Nothing
+    , _plrgdgUploadProtocol = Nothing
+    , _plrgdgAccessToken = Nothing
+    , _plrgdgUploadType = Nothing
+    , _plrgdgFieldMask = Nothing
+    , _plrgdgName = pPlrgdgName_
+    , _plrgdgCallback = Nothing
+    }
+
+-- | V1 error format.
+plrgdgXgafv :: Lens' ProjectsLocationsRegistriesGroupsDevicesGet (Maybe Xgafv)
+plrgdgXgafv
+  = lens _plrgdgXgafv (\ s a -> s{_plrgdgXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+plrgdgUploadProtocol :: Lens' ProjectsLocationsRegistriesGroupsDevicesGet (Maybe Text)
+plrgdgUploadProtocol
+  = lens _plrgdgUploadProtocol
+      (\ s a -> s{_plrgdgUploadProtocol = a})
+
+-- | OAuth access token.
+plrgdgAccessToken :: Lens' ProjectsLocationsRegistriesGroupsDevicesGet (Maybe Text)
+plrgdgAccessToken
+  = lens _plrgdgAccessToken
+      (\ s a -> s{_plrgdgAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+plrgdgUploadType :: Lens' ProjectsLocationsRegistriesGroupsDevicesGet (Maybe Text)
+plrgdgUploadType
+  = lens _plrgdgUploadType
+      (\ s a -> s{_plrgdgUploadType = a})
+
+-- | The fields of the \`Device\` resource to be returned in the response. If
+-- the field mask is unset or empty, all fields are returned.
+plrgdgFieldMask :: Lens' ProjectsLocationsRegistriesGroupsDevicesGet (Maybe GFieldMask)
+plrgdgFieldMask
+  = lens _plrgdgFieldMask
+      (\ s a -> s{_plrgdgFieldMask = a})
+
+-- | The name of the device. For example,
+-- \`projects\/p0\/locations\/us-central1\/registries\/registry0\/devices\/device0\`
+-- or
+-- \`projects\/p0\/locations\/us-central1\/registries\/registry0\/devices\/{num_id}\`.
+plrgdgName :: Lens' ProjectsLocationsRegistriesGroupsDevicesGet Text
+plrgdgName
+  = lens _plrgdgName (\ s a -> s{_plrgdgName = a})
+
+-- | JSONP
+plrgdgCallback :: Lens' ProjectsLocationsRegistriesGroupsDevicesGet (Maybe Text)
+plrgdgCallback
+  = lens _plrgdgCallback
+      (\ s a -> s{_plrgdgCallback = a})
+
+instance GoogleRequest
+         ProjectsLocationsRegistriesGroupsDevicesGet where
+        type Rs ProjectsLocationsRegistriesGroupsDevicesGet =
+             Device
+        type Scopes
+               ProjectsLocationsRegistriesGroupsDevicesGet
+             =
+             '["https://www.googleapis.com/auth/cloud-platform",
+               "https://www.googleapis.com/auth/cloudiot"]
+        requestClient
+          ProjectsLocationsRegistriesGroupsDevicesGet'{..}
+          = go _plrgdgName _plrgdgXgafv _plrgdgUploadProtocol
+              _plrgdgAccessToken
+              _plrgdgUploadType
+              _plrgdgFieldMask
+              _plrgdgCallback
+              (Just AltJSON)
+              cloudIOTService
+          where go
+                  = buildClient
+                      (Proxy ::
+                         Proxy
+                           ProjectsLocationsRegistriesGroupsDevicesGetResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Groups/Devices/List.hs b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Groups/Devices/List.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Groups/Devices/List.hs
@@ -0,0 +1,294 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.Devices.List
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- List devices in a device registry.
+--
+-- /See:/ <https://cloud.google.com/iot Cloud IoT API Reference> for @cloudiot.projects.locations.registries.groups.devices.list@.
+module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.Devices.List
+    (
+    -- * REST Resource
+      ProjectsLocationsRegistriesGroupsDevicesListResource
+
+    -- * Creating a Request
+    , projectsLocationsRegistriesGroupsDevicesList
+    , ProjectsLocationsRegistriesGroupsDevicesList
+
+    -- * Request Lenses
+    , plrgdlParent
+    , plrgdlXgafv
+    , plrgdlUploadProtocol
+    , plrgdlAccessToken
+    , plrgdlDeviceNumIds
+    , plrgdlGatewayListOptionsAssociationsDeviceId
+    , plrgdlGatewayListOptionsAssociationsGatewayId
+    , plrgdlUploadType
+    , plrgdlDeviceIds
+    , plrgdlFieldMask
+    , plrgdlGatewayListOptionsGatewayType
+    , plrgdlPageToken
+    , plrgdlPageSize
+    , plrgdlCallback
+    ) where
+
+import           Network.Google.CloudIOT.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @cloudiot.projects.locations.registries.groups.devices.list@ method which the
+-- 'ProjectsLocationsRegistriesGroupsDevicesList' request conforms to.
+type ProjectsLocationsRegistriesGroupsDevicesListResource
+     =
+     "v1" :>
+       Capture "parent" Text :>
+         "devices" :>
+           QueryParam "$.xgafv" Xgafv :>
+             QueryParam "upload_protocol" Text :>
+               QueryParam "access_token" Text :>
+                 QueryParams "deviceNumIds" (Textual Word64) :>
+                   QueryParam "gatewayListOptions.associationsDeviceId"
+                     Text
+                     :>
+                     QueryParam "gatewayListOptions.associationsGatewayId"
+                       Text
+                       :>
+                       QueryParam "uploadType" Text :>
+                         QueryParams "deviceIds" Text :>
+                           QueryParam "fieldMask" GFieldMask :>
+                             QueryParam "gatewayListOptions.gatewayType" Text :>
+                               QueryParam "pageToken" Text :>
+                                 QueryParam "pageSize" (Textual Int32) :>
+                                   QueryParam "callback" Text :>
+                                     QueryParam "alt" AltJSON :>
+                                       Get '[JSON] ListDevicesResponse
+
+-- | List devices in a device registry.
+--
+-- /See:/ 'projectsLocationsRegistriesGroupsDevicesList' smart constructor.
+data ProjectsLocationsRegistriesGroupsDevicesList = ProjectsLocationsRegistriesGroupsDevicesList'
+    { _plrgdlParent                                  :: !Text
+    , _plrgdlXgafv                                   :: !(Maybe Xgafv)
+    , _plrgdlUploadProtocol                          :: !(Maybe Text)
+    , _plrgdlAccessToken                             :: !(Maybe Text)
+    , _plrgdlDeviceNumIds                            :: !(Maybe [Textual Word64])
+    , _plrgdlGatewayListOptionsAssociationsDeviceId  :: !(Maybe Text)
+    , _plrgdlGatewayListOptionsAssociationsGatewayId :: !(Maybe Text)
+    , _plrgdlUploadType                              :: !(Maybe Text)
+    , _plrgdlDeviceIds                               :: !(Maybe [Text])
+    , _plrgdlFieldMask                               :: !(Maybe GFieldMask)
+    , _plrgdlGatewayListOptionsGatewayType           :: !(Maybe Text)
+    , _plrgdlPageToken                               :: !(Maybe Text)
+    , _plrgdlPageSize                                :: !(Maybe (Textual Int32))
+    , _plrgdlCallback                                :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ProjectsLocationsRegistriesGroupsDevicesList' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'plrgdlParent'
+--
+-- * 'plrgdlXgafv'
+--
+-- * 'plrgdlUploadProtocol'
+--
+-- * 'plrgdlAccessToken'
+--
+-- * 'plrgdlDeviceNumIds'
+--
+-- * 'plrgdlGatewayListOptionsAssociationsDeviceId'
+--
+-- * 'plrgdlGatewayListOptionsAssociationsGatewayId'
+--
+-- * 'plrgdlUploadType'
+--
+-- * 'plrgdlDeviceIds'
+--
+-- * 'plrgdlFieldMask'
+--
+-- * 'plrgdlGatewayListOptionsGatewayType'
+--
+-- * 'plrgdlPageToken'
+--
+-- * 'plrgdlPageSize'
+--
+-- * 'plrgdlCallback'
+projectsLocationsRegistriesGroupsDevicesList
+    :: Text -- ^ 'plrgdlParent'
+    -> ProjectsLocationsRegistriesGroupsDevicesList
+projectsLocationsRegistriesGroupsDevicesList pPlrgdlParent_ =
+    ProjectsLocationsRegistriesGroupsDevicesList'
+    { _plrgdlParent = pPlrgdlParent_
+    , _plrgdlXgafv = Nothing
+    , _plrgdlUploadProtocol = Nothing
+    , _plrgdlAccessToken = Nothing
+    , _plrgdlDeviceNumIds = Nothing
+    , _plrgdlGatewayListOptionsAssociationsDeviceId = Nothing
+    , _plrgdlGatewayListOptionsAssociationsGatewayId = Nothing
+    , _plrgdlUploadType = Nothing
+    , _plrgdlDeviceIds = Nothing
+    , _plrgdlFieldMask = Nothing
+    , _plrgdlGatewayListOptionsGatewayType = Nothing
+    , _plrgdlPageToken = Nothing
+    , _plrgdlPageSize = Nothing
+    , _plrgdlCallback = Nothing
+    }
+
+-- | The device registry path. Required. For example,
+-- \`projects\/my-project\/locations\/us-central1\/registries\/my-registry\`.
+plrgdlParent :: Lens' ProjectsLocationsRegistriesGroupsDevicesList Text
+plrgdlParent
+  = lens _plrgdlParent (\ s a -> s{_plrgdlParent = a})
+
+-- | V1 error format.
+plrgdlXgafv :: Lens' ProjectsLocationsRegistriesGroupsDevicesList (Maybe Xgafv)
+plrgdlXgafv
+  = lens _plrgdlXgafv (\ s a -> s{_plrgdlXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+plrgdlUploadProtocol :: Lens' ProjectsLocationsRegistriesGroupsDevicesList (Maybe Text)
+plrgdlUploadProtocol
+  = lens _plrgdlUploadProtocol
+      (\ s a -> s{_plrgdlUploadProtocol = a})
+
+-- | OAuth access token.
+plrgdlAccessToken :: Lens' ProjectsLocationsRegistriesGroupsDevicesList (Maybe Text)
+plrgdlAccessToken
+  = lens _plrgdlAccessToken
+      (\ s a -> s{_plrgdlAccessToken = a})
+
+-- | A list of device numeric IDs. If empty, this field is ignored. Maximum
+-- IDs: 10,000.
+plrgdlDeviceNumIds :: Lens' ProjectsLocationsRegistriesGroupsDevicesList [Word64]
+plrgdlDeviceNumIds
+  = lens _plrgdlDeviceNumIds
+      (\ s a -> s{_plrgdlDeviceNumIds = a})
+      . _Default
+      . _Coerce
+
+-- | If set, returns only the gateways with which the specified device is
+-- associated. The device ID can be numeric (\`num_id\`) or the
+-- user-defined string (\`id\`). For example, if \`456\` is specified,
+-- returns only the gateways to which the device with \`num_id\` 456 is
+-- bound.
+plrgdlGatewayListOptionsAssociationsDeviceId :: Lens' ProjectsLocationsRegistriesGroupsDevicesList (Maybe Text)
+plrgdlGatewayListOptionsAssociationsDeviceId
+  = lens _plrgdlGatewayListOptionsAssociationsDeviceId
+      (\ s a ->
+         s{_plrgdlGatewayListOptionsAssociationsDeviceId = a})
+
+-- | If set, only devices associated with the specified gateway are returned.
+-- The gateway ID can be numeric (\`num_id\`) or the user-defined string
+-- (\`id\`). For example, if \`123\` is specified, only devices bound to
+-- the gateway with \`num_id\` 123 are returned.
+plrgdlGatewayListOptionsAssociationsGatewayId :: Lens' ProjectsLocationsRegistriesGroupsDevicesList (Maybe Text)
+plrgdlGatewayListOptionsAssociationsGatewayId
+  = lens _plrgdlGatewayListOptionsAssociationsGatewayId
+      (\ s a ->
+         s{_plrgdlGatewayListOptionsAssociationsGatewayId =
+             a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+plrgdlUploadType :: Lens' ProjectsLocationsRegistriesGroupsDevicesList (Maybe Text)
+plrgdlUploadType
+  = lens _plrgdlUploadType
+      (\ s a -> s{_plrgdlUploadType = a})
+
+-- | A list of device string IDs. For example, \`[\'device0\',
+-- \'device12\']\`. If empty, this field is ignored. Maximum IDs: 10,000
+plrgdlDeviceIds :: Lens' ProjectsLocationsRegistriesGroupsDevicesList [Text]
+plrgdlDeviceIds
+  = lens _plrgdlDeviceIds
+      (\ s a -> s{_plrgdlDeviceIds = a})
+      . _Default
+      . _Coerce
+
+-- | The fields of the \`Device\` resource to be returned in the response.
+-- The fields \`id\` and \`num_id\` are always returned, along with any
+-- other fields specified.
+plrgdlFieldMask :: Lens' ProjectsLocationsRegistriesGroupsDevicesList (Maybe GFieldMask)
+plrgdlFieldMask
+  = lens _plrgdlFieldMask
+      (\ s a -> s{_plrgdlFieldMask = a})
+
+-- | If \`GATEWAY\` is specified, only gateways are returned. If
+-- \`NON_GATEWAY\` is specified, only non-gateway devices are returned. If
+-- \`GATEWAY_TYPE_UNSPECIFIED\` is specified, all devices are returned.
+plrgdlGatewayListOptionsGatewayType :: Lens' ProjectsLocationsRegistriesGroupsDevicesList (Maybe Text)
+plrgdlGatewayListOptionsGatewayType
+  = lens _plrgdlGatewayListOptionsGatewayType
+      (\ s a ->
+         s{_plrgdlGatewayListOptionsGatewayType = a})
+
+-- | The value returned by the last \`ListDevicesResponse\`; indicates that
+-- this is a continuation of a prior \`ListDevices\` call and the system
+-- should return the next page of data.
+plrgdlPageToken :: Lens' ProjectsLocationsRegistriesGroupsDevicesList (Maybe Text)
+plrgdlPageToken
+  = lens _plrgdlPageToken
+      (\ s a -> s{_plrgdlPageToken = a})
+
+-- | The maximum number of devices to return in the response. If this value
+-- is zero, the service will select a default size. A call may return fewer
+-- objects than requested. A non-empty \`next_page_token\` in the response
+-- indicates that more data is available.
+plrgdlPageSize :: Lens' ProjectsLocationsRegistriesGroupsDevicesList (Maybe Int32)
+plrgdlPageSize
+  = lens _plrgdlPageSize
+      (\ s a -> s{_plrgdlPageSize = a})
+      . mapping _Coerce
+
+-- | JSONP
+plrgdlCallback :: Lens' ProjectsLocationsRegistriesGroupsDevicesList (Maybe Text)
+plrgdlCallback
+  = lens _plrgdlCallback
+      (\ s a -> s{_plrgdlCallback = a})
+
+instance GoogleRequest
+         ProjectsLocationsRegistriesGroupsDevicesList where
+        type Rs ProjectsLocationsRegistriesGroupsDevicesList
+             = ListDevicesResponse
+        type Scopes
+               ProjectsLocationsRegistriesGroupsDevicesList
+             =
+             '["https://www.googleapis.com/auth/cloud-platform",
+               "https://www.googleapis.com/auth/cloudiot"]
+        requestClient
+          ProjectsLocationsRegistriesGroupsDevicesList'{..}
+          = go _plrgdlParent _plrgdlXgafv _plrgdlUploadProtocol
+              _plrgdlAccessToken
+              (_plrgdlDeviceNumIds ^. _Default)
+              _plrgdlGatewayListOptionsAssociationsDeviceId
+              _plrgdlGatewayListOptionsAssociationsGatewayId
+              _plrgdlUploadType
+              (_plrgdlDeviceIds ^. _Default)
+              _plrgdlFieldMask
+              _plrgdlGatewayListOptionsGatewayType
+              _plrgdlPageToken
+              _plrgdlPageSize
+              _plrgdlCallback
+              (Just AltJSON)
+              cloudIOTService
+          where go
+                  = buildClient
+                      (Proxy ::
+                         Proxy
+                           ProjectsLocationsRegistriesGroupsDevicesListResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Groups/Devices/ModifyCloudToDeviceConfig.hs b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Groups/Devices/ModifyCloudToDeviceConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Groups/Devices/ModifyCloudToDeviceConfig.hs
@@ -0,0 +1,184 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.Devices.ModifyCloudToDeviceConfig
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Modifies the configuration for the device, which is eventually sent from
+-- the Cloud IoT Core servers. Returns the modified configuration version
+-- and its metadata.
+--
+-- /See:/ <https://cloud.google.com/iot Cloud IoT API Reference> for @cloudiot.projects.locations.registries.groups.devices.modifyCloudToDeviceConfig@.
+module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.Devices.ModifyCloudToDeviceConfig
+    (
+    -- * REST Resource
+      ProjectsLocationsRegistriesGroupsDevicesModifyCloudToDeviceConfigResource
+
+    -- * Creating a Request
+    , projectsLocationsRegistriesGroupsDevicesModifyCloudToDeviceConfig
+    , ProjectsLocationsRegistriesGroupsDevicesModifyCloudToDeviceConfig
+
+    -- * Request Lenses
+    , plrgdmctdcXgafv
+    , plrgdmctdcUploadProtocol
+    , plrgdmctdcAccessToken
+    , plrgdmctdcUploadType
+    , plrgdmctdcPayload
+    , plrgdmctdcName
+    , plrgdmctdcCallback
+    ) where
+
+import           Network.Google.CloudIOT.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @cloudiot.projects.locations.registries.groups.devices.modifyCloudToDeviceConfig@ method which the
+-- 'ProjectsLocationsRegistriesGroupsDevicesModifyCloudToDeviceConfig' request conforms to.
+type ProjectsLocationsRegistriesGroupsDevicesModifyCloudToDeviceConfigResource
+     =
+     "v1" :>
+       CaptureMode "name" "modifyCloudToDeviceConfig" Text
+         :>
+         QueryParam "$.xgafv" Xgafv :>
+           QueryParam "upload_protocol" Text :>
+             QueryParam "access_token" Text :>
+               QueryParam "uploadType" Text :>
+                 QueryParam "callback" Text :>
+                   QueryParam "alt" AltJSON :>
+                     ReqBody '[JSON] ModifyCloudToDeviceConfigRequest :>
+                       Post '[JSON] DeviceConfig
+
+-- | Modifies the configuration for the device, which is eventually sent from
+-- the Cloud IoT Core servers. Returns the modified configuration version
+-- and its metadata.
+--
+-- /See:/ 'projectsLocationsRegistriesGroupsDevicesModifyCloudToDeviceConfig' smart constructor.
+data ProjectsLocationsRegistriesGroupsDevicesModifyCloudToDeviceConfig = ProjectsLocationsRegistriesGroupsDevicesModifyCloudToDeviceConfig'
+    { _plrgdmctdcXgafv          :: !(Maybe Xgafv)
+    , _plrgdmctdcUploadProtocol :: !(Maybe Text)
+    , _plrgdmctdcAccessToken    :: !(Maybe Text)
+    , _plrgdmctdcUploadType     :: !(Maybe Text)
+    , _plrgdmctdcPayload        :: !ModifyCloudToDeviceConfigRequest
+    , _plrgdmctdcName           :: !Text
+    , _plrgdmctdcCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ProjectsLocationsRegistriesGroupsDevicesModifyCloudToDeviceConfig' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'plrgdmctdcXgafv'
+--
+-- * 'plrgdmctdcUploadProtocol'
+--
+-- * 'plrgdmctdcAccessToken'
+--
+-- * 'plrgdmctdcUploadType'
+--
+-- * 'plrgdmctdcPayload'
+--
+-- * 'plrgdmctdcName'
+--
+-- * 'plrgdmctdcCallback'
+projectsLocationsRegistriesGroupsDevicesModifyCloudToDeviceConfig
+    :: ModifyCloudToDeviceConfigRequest -- ^ 'plrgdmctdcPayload'
+    -> Text -- ^ 'plrgdmctdcName'
+    -> ProjectsLocationsRegistriesGroupsDevicesModifyCloudToDeviceConfig
+projectsLocationsRegistriesGroupsDevicesModifyCloudToDeviceConfig pPlrgdmctdcPayload_ pPlrgdmctdcName_ =
+    ProjectsLocationsRegistriesGroupsDevicesModifyCloudToDeviceConfig'
+    { _plrgdmctdcXgafv = Nothing
+    , _plrgdmctdcUploadProtocol = Nothing
+    , _plrgdmctdcAccessToken = Nothing
+    , _plrgdmctdcUploadType = Nothing
+    , _plrgdmctdcPayload = pPlrgdmctdcPayload_
+    , _plrgdmctdcName = pPlrgdmctdcName_
+    , _plrgdmctdcCallback = Nothing
+    }
+
+-- | V1 error format.
+plrgdmctdcXgafv :: Lens' ProjectsLocationsRegistriesGroupsDevicesModifyCloudToDeviceConfig (Maybe Xgafv)
+plrgdmctdcXgafv
+  = lens _plrgdmctdcXgafv
+      (\ s a -> s{_plrgdmctdcXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+plrgdmctdcUploadProtocol :: Lens' ProjectsLocationsRegistriesGroupsDevicesModifyCloudToDeviceConfig (Maybe Text)
+plrgdmctdcUploadProtocol
+  = lens _plrgdmctdcUploadProtocol
+      (\ s a -> s{_plrgdmctdcUploadProtocol = a})
+
+-- | OAuth access token.
+plrgdmctdcAccessToken :: Lens' ProjectsLocationsRegistriesGroupsDevicesModifyCloudToDeviceConfig (Maybe Text)
+plrgdmctdcAccessToken
+  = lens _plrgdmctdcAccessToken
+      (\ s a -> s{_plrgdmctdcAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+plrgdmctdcUploadType :: Lens' ProjectsLocationsRegistriesGroupsDevicesModifyCloudToDeviceConfig (Maybe Text)
+plrgdmctdcUploadType
+  = lens _plrgdmctdcUploadType
+      (\ s a -> s{_plrgdmctdcUploadType = a})
+
+-- | Multipart request metadata.
+plrgdmctdcPayload :: Lens' ProjectsLocationsRegistriesGroupsDevicesModifyCloudToDeviceConfig ModifyCloudToDeviceConfigRequest
+plrgdmctdcPayload
+  = lens _plrgdmctdcPayload
+      (\ s a -> s{_plrgdmctdcPayload = a})
+
+-- | The name of the device. For example,
+-- \`projects\/p0\/locations\/us-central1\/registries\/registry0\/devices\/device0\`
+-- or
+-- \`projects\/p0\/locations\/us-central1\/registries\/registry0\/devices\/{num_id}\`.
+plrgdmctdcName :: Lens' ProjectsLocationsRegistriesGroupsDevicesModifyCloudToDeviceConfig Text
+plrgdmctdcName
+  = lens _plrgdmctdcName
+      (\ s a -> s{_plrgdmctdcName = a})
+
+-- | JSONP
+plrgdmctdcCallback :: Lens' ProjectsLocationsRegistriesGroupsDevicesModifyCloudToDeviceConfig (Maybe Text)
+plrgdmctdcCallback
+  = lens _plrgdmctdcCallback
+      (\ s a -> s{_plrgdmctdcCallback = a})
+
+instance GoogleRequest
+         ProjectsLocationsRegistriesGroupsDevicesModifyCloudToDeviceConfig
+         where
+        type Rs
+               ProjectsLocationsRegistriesGroupsDevicesModifyCloudToDeviceConfig
+             = DeviceConfig
+        type Scopes
+               ProjectsLocationsRegistriesGroupsDevicesModifyCloudToDeviceConfig
+             =
+             '["https://www.googleapis.com/auth/cloud-platform",
+               "https://www.googleapis.com/auth/cloudiot"]
+        requestClient
+          ProjectsLocationsRegistriesGroupsDevicesModifyCloudToDeviceConfig'{..}
+          = go _plrgdmctdcName _plrgdmctdcXgafv
+              _plrgdmctdcUploadProtocol
+              _plrgdmctdcAccessToken
+              _plrgdmctdcUploadType
+              _plrgdmctdcCallback
+              (Just AltJSON)
+              _plrgdmctdcPayload
+              cloudIOTService
+          where go
+                  = buildClient
+                      (Proxy ::
+                         Proxy
+                           ProjectsLocationsRegistriesGroupsDevicesModifyCloudToDeviceConfigResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Groups/Devices/Patch.hs b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Groups/Devices/Patch.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Groups/Devices/Patch.hs
@@ -0,0 +1,191 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.Devices.Patch
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates a device.
+--
+-- /See:/ <https://cloud.google.com/iot Cloud IoT API Reference> for @cloudiot.projects.locations.registries.groups.devices.patch@.
+module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.Devices.Patch
+    (
+    -- * REST Resource
+      ProjectsLocationsRegistriesGroupsDevicesPatchResource
+
+    -- * Creating a Request
+    , projectsLocationsRegistriesGroupsDevicesPatch
+    , ProjectsLocationsRegistriesGroupsDevicesPatch
+
+    -- * Request Lenses
+    , plrgdpXgafv
+    , plrgdpUploadProtocol
+    , plrgdpUpdateMask
+    , plrgdpAccessToken
+    , plrgdpUploadType
+    , plrgdpPayload
+    , plrgdpName
+    , plrgdpCallback
+    ) where
+
+import           Network.Google.CloudIOT.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @cloudiot.projects.locations.registries.groups.devices.patch@ method which the
+-- 'ProjectsLocationsRegistriesGroupsDevicesPatch' request conforms to.
+type ProjectsLocationsRegistriesGroupsDevicesPatchResource
+     =
+     "v1" :>
+       Capture "name" Text :>
+         QueryParam "$.xgafv" Xgafv :>
+           QueryParam "upload_protocol" Text :>
+             QueryParam "updateMask" GFieldMask :>
+               QueryParam "access_token" Text :>
+                 QueryParam "uploadType" Text :>
+                   QueryParam "callback" Text :>
+                     QueryParam "alt" AltJSON :>
+                       ReqBody '[JSON] Device :> Patch '[JSON] Device
+
+-- | Updates a device.
+--
+-- /See:/ 'projectsLocationsRegistriesGroupsDevicesPatch' smart constructor.
+data ProjectsLocationsRegistriesGroupsDevicesPatch = ProjectsLocationsRegistriesGroupsDevicesPatch'
+    { _plrgdpXgafv          :: !(Maybe Xgafv)
+    , _plrgdpUploadProtocol :: !(Maybe Text)
+    , _plrgdpUpdateMask     :: !(Maybe GFieldMask)
+    , _plrgdpAccessToken    :: !(Maybe Text)
+    , _plrgdpUploadType     :: !(Maybe Text)
+    , _plrgdpPayload        :: !Device
+    , _plrgdpName           :: !Text
+    , _plrgdpCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ProjectsLocationsRegistriesGroupsDevicesPatch' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'plrgdpXgafv'
+--
+-- * 'plrgdpUploadProtocol'
+--
+-- * 'plrgdpUpdateMask'
+--
+-- * 'plrgdpAccessToken'
+--
+-- * 'plrgdpUploadType'
+--
+-- * 'plrgdpPayload'
+--
+-- * 'plrgdpName'
+--
+-- * 'plrgdpCallback'
+projectsLocationsRegistriesGroupsDevicesPatch
+    :: Device -- ^ 'plrgdpPayload'
+    -> Text -- ^ 'plrgdpName'
+    -> ProjectsLocationsRegistriesGroupsDevicesPatch
+projectsLocationsRegistriesGroupsDevicesPatch pPlrgdpPayload_ pPlrgdpName_ =
+    ProjectsLocationsRegistriesGroupsDevicesPatch'
+    { _plrgdpXgafv = Nothing
+    , _plrgdpUploadProtocol = Nothing
+    , _plrgdpUpdateMask = Nothing
+    , _plrgdpAccessToken = Nothing
+    , _plrgdpUploadType = Nothing
+    , _plrgdpPayload = pPlrgdpPayload_
+    , _plrgdpName = pPlrgdpName_
+    , _plrgdpCallback = Nothing
+    }
+
+-- | V1 error format.
+plrgdpXgafv :: Lens' ProjectsLocationsRegistriesGroupsDevicesPatch (Maybe Xgafv)
+plrgdpXgafv
+  = lens _plrgdpXgafv (\ s a -> s{_plrgdpXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+plrgdpUploadProtocol :: Lens' ProjectsLocationsRegistriesGroupsDevicesPatch (Maybe Text)
+plrgdpUploadProtocol
+  = lens _plrgdpUploadProtocol
+      (\ s a -> s{_plrgdpUploadProtocol = a})
+
+-- | Only updates the \`device\` fields indicated by this mask. The field
+-- mask must not be empty, and it must not contain fields that are
+-- immutable or only set by the server. Mutable top-level fields:
+-- \`credentials\`, \`blocked\`, and \`metadata\`
+plrgdpUpdateMask :: Lens' ProjectsLocationsRegistriesGroupsDevicesPatch (Maybe GFieldMask)
+plrgdpUpdateMask
+  = lens _plrgdpUpdateMask
+      (\ s a -> s{_plrgdpUpdateMask = a})
+
+-- | OAuth access token.
+plrgdpAccessToken :: Lens' ProjectsLocationsRegistriesGroupsDevicesPatch (Maybe Text)
+plrgdpAccessToken
+  = lens _plrgdpAccessToken
+      (\ s a -> s{_plrgdpAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+plrgdpUploadType :: Lens' ProjectsLocationsRegistriesGroupsDevicesPatch (Maybe Text)
+plrgdpUploadType
+  = lens _plrgdpUploadType
+      (\ s a -> s{_plrgdpUploadType = a})
+
+-- | Multipart request metadata.
+plrgdpPayload :: Lens' ProjectsLocationsRegistriesGroupsDevicesPatch Device
+plrgdpPayload
+  = lens _plrgdpPayload
+      (\ s a -> s{_plrgdpPayload = a})
+
+-- | The resource path name. For example,
+-- \`projects\/p1\/locations\/us-central1\/registries\/registry0\/devices\/dev0\`
+-- or
+-- \`projects\/p1\/locations\/us-central1\/registries\/registry0\/devices\/{num_id}\`.
+-- When \`name\` is populated as a response from the service, it always
+-- ends in the device numeric ID.
+plrgdpName :: Lens' ProjectsLocationsRegistriesGroupsDevicesPatch Text
+plrgdpName
+  = lens _plrgdpName (\ s a -> s{_plrgdpName = a})
+
+-- | JSONP
+plrgdpCallback :: Lens' ProjectsLocationsRegistriesGroupsDevicesPatch (Maybe Text)
+plrgdpCallback
+  = lens _plrgdpCallback
+      (\ s a -> s{_plrgdpCallback = a})
+
+instance GoogleRequest
+         ProjectsLocationsRegistriesGroupsDevicesPatch where
+        type Rs ProjectsLocationsRegistriesGroupsDevicesPatch
+             = Device
+        type Scopes
+               ProjectsLocationsRegistriesGroupsDevicesPatch
+             =
+             '["https://www.googleapis.com/auth/cloud-platform",
+               "https://www.googleapis.com/auth/cloudiot"]
+        requestClient
+          ProjectsLocationsRegistriesGroupsDevicesPatch'{..}
+          = go _plrgdpName _plrgdpXgafv _plrgdpUploadProtocol
+              _plrgdpUpdateMask
+              _plrgdpAccessToken
+              _plrgdpUploadType
+              _plrgdpCallback
+              (Just AltJSON)
+              _plrgdpPayload
+              cloudIOTService
+          where go
+                  = buildClient
+                      (Proxy ::
+                         Proxy
+                           ProjectsLocationsRegistriesGroupsDevicesPatchResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Groups/Devices/SendCommandToDevice.hs b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Groups/Devices/SendCommandToDevice.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Groups/Devices/SendCommandToDevice.hs
@@ -0,0 +1,203 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.Devices.SendCommandToDevice
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Sends a command to the specified device. In order for a device to be
+-- able to receive commands, it must: 1) be connected to Cloud IoT Core
+-- using the MQTT protocol, and 2) be subscribed to the group of MQTT
+-- topics specified by \/devices\/{device-id}\/commands\/#. This
+-- subscription will receive commands at the top-level topic
+-- \/devices\/{device-id}\/commands as well as commands for subfolders,
+-- like \/devices\/{device-id}\/commands\/subfolder. Note that subscribing
+-- to specific subfolders is not supported. If the command could not be
+-- delivered to the device, this method will return an error; in
+-- particular, if the device is not subscribed, this method will return
+-- FAILED_PRECONDITION. Otherwise, this method will return OK. If the
+-- subscription is QoS 1, at least once delivery will be guaranteed; for
+-- QoS 0, no acknowledgment will be expected from the device.
+--
+-- /See:/ <https://cloud.google.com/iot Cloud IoT API Reference> for @cloudiot.projects.locations.registries.groups.devices.sendCommandToDevice@.
+module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.Devices.SendCommandToDevice
+    (
+    -- * REST Resource
+      ProjectsLocationsRegistriesGroupsDevicesSendCommandToDeviceResource
+
+    -- * Creating a Request
+    , projectsLocationsRegistriesGroupsDevicesSendCommandToDevice
+    , ProjectsLocationsRegistriesGroupsDevicesSendCommandToDevice
+
+    -- * Request Lenses
+    , plrgdsctdXgafv
+    , plrgdsctdUploadProtocol
+    , plrgdsctdAccessToken
+    , plrgdsctdUploadType
+    , plrgdsctdPayload
+    , plrgdsctdName
+    , plrgdsctdCallback
+    ) where
+
+import           Network.Google.CloudIOT.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @cloudiot.projects.locations.registries.groups.devices.sendCommandToDevice@ method which the
+-- 'ProjectsLocationsRegistriesGroupsDevicesSendCommandToDevice' request conforms to.
+type ProjectsLocationsRegistriesGroupsDevicesSendCommandToDeviceResource
+     =
+     "v1" :>
+       CaptureMode "name" "sendCommandToDevice" Text :>
+         QueryParam "$.xgafv" Xgafv :>
+           QueryParam "upload_protocol" Text :>
+             QueryParam "access_token" Text :>
+               QueryParam "uploadType" Text :>
+                 QueryParam "callback" Text :>
+                   QueryParam "alt" AltJSON :>
+                     ReqBody '[JSON] SendCommandToDeviceRequest :>
+                       Post '[JSON] SendCommandToDeviceResponse
+
+-- | Sends a command to the specified device. In order for a device to be
+-- able to receive commands, it must: 1) be connected to Cloud IoT Core
+-- using the MQTT protocol, and 2) be subscribed to the group of MQTT
+-- topics specified by \/devices\/{device-id}\/commands\/#. This
+-- subscription will receive commands at the top-level topic
+-- \/devices\/{device-id}\/commands as well as commands for subfolders,
+-- like \/devices\/{device-id}\/commands\/subfolder. Note that subscribing
+-- to specific subfolders is not supported. If the command could not be
+-- delivered to the device, this method will return an error; in
+-- particular, if the device is not subscribed, this method will return
+-- FAILED_PRECONDITION. Otherwise, this method will return OK. If the
+-- subscription is QoS 1, at least once delivery will be guaranteed; for
+-- QoS 0, no acknowledgment will be expected from the device.
+--
+-- /See:/ 'projectsLocationsRegistriesGroupsDevicesSendCommandToDevice' smart constructor.
+data ProjectsLocationsRegistriesGroupsDevicesSendCommandToDevice = ProjectsLocationsRegistriesGroupsDevicesSendCommandToDevice'
+    { _plrgdsctdXgafv          :: !(Maybe Xgafv)
+    , _plrgdsctdUploadProtocol :: !(Maybe Text)
+    , _plrgdsctdAccessToken    :: !(Maybe Text)
+    , _plrgdsctdUploadType     :: !(Maybe Text)
+    , _plrgdsctdPayload        :: !SendCommandToDeviceRequest
+    , _plrgdsctdName           :: !Text
+    , _plrgdsctdCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ProjectsLocationsRegistriesGroupsDevicesSendCommandToDevice' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'plrgdsctdXgafv'
+--
+-- * 'plrgdsctdUploadProtocol'
+--
+-- * 'plrgdsctdAccessToken'
+--
+-- * 'plrgdsctdUploadType'
+--
+-- * 'plrgdsctdPayload'
+--
+-- * 'plrgdsctdName'
+--
+-- * 'plrgdsctdCallback'
+projectsLocationsRegistriesGroupsDevicesSendCommandToDevice
+    :: SendCommandToDeviceRequest -- ^ 'plrgdsctdPayload'
+    -> Text -- ^ 'plrgdsctdName'
+    -> ProjectsLocationsRegistriesGroupsDevicesSendCommandToDevice
+projectsLocationsRegistriesGroupsDevicesSendCommandToDevice pPlrgdsctdPayload_ pPlrgdsctdName_ =
+    ProjectsLocationsRegistriesGroupsDevicesSendCommandToDevice'
+    { _plrgdsctdXgafv = Nothing
+    , _plrgdsctdUploadProtocol = Nothing
+    , _plrgdsctdAccessToken = Nothing
+    , _plrgdsctdUploadType = Nothing
+    , _plrgdsctdPayload = pPlrgdsctdPayload_
+    , _plrgdsctdName = pPlrgdsctdName_
+    , _plrgdsctdCallback = Nothing
+    }
+
+-- | V1 error format.
+plrgdsctdXgafv :: Lens' ProjectsLocationsRegistriesGroupsDevicesSendCommandToDevice (Maybe Xgafv)
+plrgdsctdXgafv
+  = lens _plrgdsctdXgafv
+      (\ s a -> s{_plrgdsctdXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+plrgdsctdUploadProtocol :: Lens' ProjectsLocationsRegistriesGroupsDevicesSendCommandToDevice (Maybe Text)
+plrgdsctdUploadProtocol
+  = lens _plrgdsctdUploadProtocol
+      (\ s a -> s{_plrgdsctdUploadProtocol = a})
+
+-- | OAuth access token.
+plrgdsctdAccessToken :: Lens' ProjectsLocationsRegistriesGroupsDevicesSendCommandToDevice (Maybe Text)
+plrgdsctdAccessToken
+  = lens _plrgdsctdAccessToken
+      (\ s a -> s{_plrgdsctdAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+plrgdsctdUploadType :: Lens' ProjectsLocationsRegistriesGroupsDevicesSendCommandToDevice (Maybe Text)
+plrgdsctdUploadType
+  = lens _plrgdsctdUploadType
+      (\ s a -> s{_plrgdsctdUploadType = a})
+
+-- | Multipart request metadata.
+plrgdsctdPayload :: Lens' ProjectsLocationsRegistriesGroupsDevicesSendCommandToDevice SendCommandToDeviceRequest
+plrgdsctdPayload
+  = lens _plrgdsctdPayload
+      (\ s a -> s{_plrgdsctdPayload = a})
+
+-- | The name of the device. For example,
+-- \`projects\/p0\/locations\/us-central1\/registries\/registry0\/devices\/device0\`
+-- or
+-- \`projects\/p0\/locations\/us-central1\/registries\/registry0\/devices\/{num_id}\`.
+plrgdsctdName :: Lens' ProjectsLocationsRegistriesGroupsDevicesSendCommandToDevice Text
+plrgdsctdName
+  = lens _plrgdsctdName
+      (\ s a -> s{_plrgdsctdName = a})
+
+-- | JSONP
+plrgdsctdCallback :: Lens' ProjectsLocationsRegistriesGroupsDevicesSendCommandToDevice (Maybe Text)
+plrgdsctdCallback
+  = lens _plrgdsctdCallback
+      (\ s a -> s{_plrgdsctdCallback = a})
+
+instance GoogleRequest
+         ProjectsLocationsRegistriesGroupsDevicesSendCommandToDevice
+         where
+        type Rs
+               ProjectsLocationsRegistriesGroupsDevicesSendCommandToDevice
+             = SendCommandToDeviceResponse
+        type Scopes
+               ProjectsLocationsRegistriesGroupsDevicesSendCommandToDevice
+             =
+             '["https://www.googleapis.com/auth/cloud-platform",
+               "https://www.googleapis.com/auth/cloudiot"]
+        requestClient
+          ProjectsLocationsRegistriesGroupsDevicesSendCommandToDevice'{..}
+          = go _plrgdsctdName _plrgdsctdXgafv
+              _plrgdsctdUploadProtocol
+              _plrgdsctdAccessToken
+              _plrgdsctdUploadType
+              _plrgdsctdCallback
+              (Just AltJSON)
+              _plrgdsctdPayload
+              cloudIOTService
+          where go
+                  = buildClient
+                      (Proxy ::
+                         Proxy
+                           ProjectsLocationsRegistriesGroupsDevicesSendCommandToDeviceResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Groups/Devices/States/List.hs b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Groups/Devices/States/List.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Groups/Devices/States/List.hs
@@ -0,0 +1,182 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.Devices.States.List
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists the last few versions of the device state in descending order
+-- (i.e.: newest first).
+--
+-- /See:/ <https://cloud.google.com/iot Cloud IoT API Reference> for @cloudiot.projects.locations.registries.groups.devices.states.list@.
+module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.Devices.States.List
+    (
+    -- * REST Resource
+      ProjectsLocationsRegistriesGroupsDevicesStatesListResource
+
+    -- * Creating a Request
+    , projectsLocationsRegistriesGroupsDevicesStatesList
+    , ProjectsLocationsRegistriesGroupsDevicesStatesList
+
+    -- * Request Lenses
+    , plrgdslXgafv
+    , plrgdslUploadProtocol
+    , plrgdslAccessToken
+    , plrgdslUploadType
+    , plrgdslName
+    , plrgdslNumStates
+    , plrgdslCallback
+    ) where
+
+import           Network.Google.CloudIOT.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @cloudiot.projects.locations.registries.groups.devices.states.list@ method which the
+-- 'ProjectsLocationsRegistriesGroupsDevicesStatesList' request conforms to.
+type ProjectsLocationsRegistriesGroupsDevicesStatesListResource
+     =
+     "v1" :>
+       Capture "name" Text :>
+         "states" :>
+           QueryParam "$.xgafv" Xgafv :>
+             QueryParam "upload_protocol" Text :>
+               QueryParam "access_token" Text :>
+                 QueryParam "uploadType" Text :>
+                   QueryParam "numStates" (Textual Int32) :>
+                     QueryParam "callback" Text :>
+                       QueryParam "alt" AltJSON :>
+                         Get '[JSON] ListDeviceStatesResponse
+
+-- | Lists the last few versions of the device state in descending order
+-- (i.e.: newest first).
+--
+-- /See:/ 'projectsLocationsRegistriesGroupsDevicesStatesList' smart constructor.
+data ProjectsLocationsRegistriesGroupsDevicesStatesList = ProjectsLocationsRegistriesGroupsDevicesStatesList'
+    { _plrgdslXgafv          :: !(Maybe Xgafv)
+    , _plrgdslUploadProtocol :: !(Maybe Text)
+    , _plrgdslAccessToken    :: !(Maybe Text)
+    , _plrgdslUploadType     :: !(Maybe Text)
+    , _plrgdslName           :: !Text
+    , _plrgdslNumStates      :: !(Maybe (Textual Int32))
+    , _plrgdslCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ProjectsLocationsRegistriesGroupsDevicesStatesList' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'plrgdslXgafv'
+--
+-- * 'plrgdslUploadProtocol'
+--
+-- * 'plrgdslAccessToken'
+--
+-- * 'plrgdslUploadType'
+--
+-- * 'plrgdslName'
+--
+-- * 'plrgdslNumStates'
+--
+-- * 'plrgdslCallback'
+projectsLocationsRegistriesGroupsDevicesStatesList
+    :: Text -- ^ 'plrgdslName'
+    -> ProjectsLocationsRegistriesGroupsDevicesStatesList
+projectsLocationsRegistriesGroupsDevicesStatesList pPlrgdslName_ =
+    ProjectsLocationsRegistriesGroupsDevicesStatesList'
+    { _plrgdslXgafv = Nothing
+    , _plrgdslUploadProtocol = Nothing
+    , _plrgdslAccessToken = Nothing
+    , _plrgdslUploadType = Nothing
+    , _plrgdslName = pPlrgdslName_
+    , _plrgdslNumStates = Nothing
+    , _plrgdslCallback = Nothing
+    }
+
+-- | V1 error format.
+plrgdslXgafv :: Lens' ProjectsLocationsRegistriesGroupsDevicesStatesList (Maybe Xgafv)
+plrgdslXgafv
+  = lens _plrgdslXgafv (\ s a -> s{_plrgdslXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+plrgdslUploadProtocol :: Lens' ProjectsLocationsRegistriesGroupsDevicesStatesList (Maybe Text)
+plrgdslUploadProtocol
+  = lens _plrgdslUploadProtocol
+      (\ s a -> s{_plrgdslUploadProtocol = a})
+
+-- | OAuth access token.
+plrgdslAccessToken :: Lens' ProjectsLocationsRegistriesGroupsDevicesStatesList (Maybe Text)
+plrgdslAccessToken
+  = lens _plrgdslAccessToken
+      (\ s a -> s{_plrgdslAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+plrgdslUploadType :: Lens' ProjectsLocationsRegistriesGroupsDevicesStatesList (Maybe Text)
+plrgdslUploadType
+  = lens _plrgdslUploadType
+      (\ s a -> s{_plrgdslUploadType = a})
+
+-- | The name of the device. For example,
+-- \`projects\/p0\/locations\/us-central1\/registries\/registry0\/devices\/device0\`
+-- or
+-- \`projects\/p0\/locations\/us-central1\/registries\/registry0\/devices\/{num_id}\`.
+plrgdslName :: Lens' ProjectsLocationsRegistriesGroupsDevicesStatesList Text
+plrgdslName
+  = lens _plrgdslName (\ s a -> s{_plrgdslName = a})
+
+-- | The number of states to list. States are listed in descending order of
+-- update time. The maximum number of states retained is 10. If this value
+-- is zero, it will return all the states available.
+plrgdslNumStates :: Lens' ProjectsLocationsRegistriesGroupsDevicesStatesList (Maybe Int32)
+plrgdslNumStates
+  = lens _plrgdslNumStates
+      (\ s a -> s{_plrgdslNumStates = a})
+      . mapping _Coerce
+
+-- | JSONP
+plrgdslCallback :: Lens' ProjectsLocationsRegistriesGroupsDevicesStatesList (Maybe Text)
+plrgdslCallback
+  = lens _plrgdslCallback
+      (\ s a -> s{_plrgdslCallback = a})
+
+instance GoogleRequest
+         ProjectsLocationsRegistriesGroupsDevicesStatesList
+         where
+        type Rs
+               ProjectsLocationsRegistriesGroupsDevicesStatesList
+             = ListDeviceStatesResponse
+        type Scopes
+               ProjectsLocationsRegistriesGroupsDevicesStatesList
+             =
+             '["https://www.googleapis.com/auth/cloud-platform",
+               "https://www.googleapis.com/auth/cloudiot"]
+        requestClient
+          ProjectsLocationsRegistriesGroupsDevicesStatesList'{..}
+          = go _plrgdslName _plrgdslXgafv
+              _plrgdslUploadProtocol
+              _plrgdslAccessToken
+              _plrgdslUploadType
+              _plrgdslNumStates
+              _plrgdslCallback
+              (Just AltJSON)
+              cloudIOTService
+          where go
+                  = buildClient
+                      (Proxy ::
+                         Proxy
+                           ProjectsLocationsRegistriesGroupsDevicesStatesListResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Groups/GetIAMPolicy.hs b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Groups/GetIAMPolicy.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Groups/GetIAMPolicy.hs
@@ -0,0 +1,176 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.GetIAMPolicy
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets the access control policy for a resource. Returns an empty policy
+-- if the resource exists and does not have a policy set.
+--
+-- /See:/ <https://cloud.google.com/iot Cloud IoT API Reference> for @cloudiot.projects.locations.registries.groups.getIamPolicy@.
+module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.GetIAMPolicy
+    (
+    -- * REST Resource
+      ProjectsLocationsRegistriesGroupsGetIAMPolicyResource
+
+    -- * Creating a Request
+    , projectsLocationsRegistriesGroupsGetIAMPolicy
+    , ProjectsLocationsRegistriesGroupsGetIAMPolicy
+
+    -- * Request Lenses
+    , plrggipXgafv
+    , plrggipUploadProtocol
+    , plrggipAccessToken
+    , plrggipUploadType
+    , plrggipPayload
+    , plrggipResource
+    , plrggipCallback
+    ) where
+
+import           Network.Google.CloudIOT.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @cloudiot.projects.locations.registries.groups.getIamPolicy@ method which the
+-- 'ProjectsLocationsRegistriesGroupsGetIAMPolicy' request conforms to.
+type ProjectsLocationsRegistriesGroupsGetIAMPolicyResource
+     =
+     "v1" :>
+       CaptureMode "resource" "getIamPolicy" Text :>
+         QueryParam "$.xgafv" Xgafv :>
+           QueryParam "upload_protocol" Text :>
+             QueryParam "access_token" Text :>
+               QueryParam "uploadType" Text :>
+                 QueryParam "callback" Text :>
+                   QueryParam "alt" AltJSON :>
+                     ReqBody '[JSON] GetIAMPolicyRequest :>
+                       Post '[JSON] Policy
+
+-- | Gets the access control policy for a resource. Returns an empty policy
+-- if the resource exists and does not have a policy set.
+--
+-- /See:/ 'projectsLocationsRegistriesGroupsGetIAMPolicy' smart constructor.
+data ProjectsLocationsRegistriesGroupsGetIAMPolicy = ProjectsLocationsRegistriesGroupsGetIAMPolicy'
+    { _plrggipXgafv          :: !(Maybe Xgafv)
+    , _plrggipUploadProtocol :: !(Maybe Text)
+    , _plrggipAccessToken    :: !(Maybe Text)
+    , _plrggipUploadType     :: !(Maybe Text)
+    , _plrggipPayload        :: !GetIAMPolicyRequest
+    , _plrggipResource       :: !Text
+    , _plrggipCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ProjectsLocationsRegistriesGroupsGetIAMPolicy' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'plrggipXgafv'
+--
+-- * 'plrggipUploadProtocol'
+--
+-- * 'plrggipAccessToken'
+--
+-- * 'plrggipUploadType'
+--
+-- * 'plrggipPayload'
+--
+-- * 'plrggipResource'
+--
+-- * 'plrggipCallback'
+projectsLocationsRegistriesGroupsGetIAMPolicy
+    :: GetIAMPolicyRequest -- ^ 'plrggipPayload'
+    -> Text -- ^ 'plrggipResource'
+    -> ProjectsLocationsRegistriesGroupsGetIAMPolicy
+projectsLocationsRegistriesGroupsGetIAMPolicy pPlrggipPayload_ pPlrggipResource_ =
+    ProjectsLocationsRegistriesGroupsGetIAMPolicy'
+    { _plrggipXgafv = Nothing
+    , _plrggipUploadProtocol = Nothing
+    , _plrggipAccessToken = Nothing
+    , _plrggipUploadType = Nothing
+    , _plrggipPayload = pPlrggipPayload_
+    , _plrggipResource = pPlrggipResource_
+    , _plrggipCallback = Nothing
+    }
+
+-- | V1 error format.
+plrggipXgafv :: Lens' ProjectsLocationsRegistriesGroupsGetIAMPolicy (Maybe Xgafv)
+plrggipXgafv
+  = lens _plrggipXgafv (\ s a -> s{_plrggipXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+plrggipUploadProtocol :: Lens' ProjectsLocationsRegistriesGroupsGetIAMPolicy (Maybe Text)
+plrggipUploadProtocol
+  = lens _plrggipUploadProtocol
+      (\ s a -> s{_plrggipUploadProtocol = a})
+
+-- | OAuth access token.
+plrggipAccessToken :: Lens' ProjectsLocationsRegistriesGroupsGetIAMPolicy (Maybe Text)
+plrggipAccessToken
+  = lens _plrggipAccessToken
+      (\ s a -> s{_plrggipAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+plrggipUploadType :: Lens' ProjectsLocationsRegistriesGroupsGetIAMPolicy (Maybe Text)
+plrggipUploadType
+  = lens _plrggipUploadType
+      (\ s a -> s{_plrggipUploadType = a})
+
+-- | Multipart request metadata.
+plrggipPayload :: Lens' ProjectsLocationsRegistriesGroupsGetIAMPolicy GetIAMPolicyRequest
+plrggipPayload
+  = lens _plrggipPayload
+      (\ s a -> s{_plrggipPayload = a})
+
+-- | REQUIRED: The resource for which the policy is being requested. See the
+-- operation documentation for the appropriate value for this field.
+plrggipResource :: Lens' ProjectsLocationsRegistriesGroupsGetIAMPolicy Text
+plrggipResource
+  = lens _plrggipResource
+      (\ s a -> s{_plrggipResource = a})
+
+-- | JSONP
+plrggipCallback :: Lens' ProjectsLocationsRegistriesGroupsGetIAMPolicy (Maybe Text)
+plrggipCallback
+  = lens _plrggipCallback
+      (\ s a -> s{_plrggipCallback = a})
+
+instance GoogleRequest
+         ProjectsLocationsRegistriesGroupsGetIAMPolicy where
+        type Rs ProjectsLocationsRegistriesGroupsGetIAMPolicy
+             = Policy
+        type Scopes
+               ProjectsLocationsRegistriesGroupsGetIAMPolicy
+             =
+             '["https://www.googleapis.com/auth/cloud-platform",
+               "https://www.googleapis.com/auth/cloudiot"]
+        requestClient
+          ProjectsLocationsRegistriesGroupsGetIAMPolicy'{..}
+          = go _plrggipResource _plrggipXgafv
+              _plrggipUploadProtocol
+              _plrggipAccessToken
+              _plrggipUploadType
+              _plrggipCallback
+              (Just AltJSON)
+              _plrggipPayload
+              cloudIOTService
+          where go
+                  = buildClient
+                      (Proxy ::
+                         Proxy
+                           ProjectsLocationsRegistriesGroupsGetIAMPolicyResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Groups/SetIAMPolicy.hs b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Groups/SetIAMPolicy.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Groups/SetIAMPolicy.hs
@@ -0,0 +1,176 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.SetIAMPolicy
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Sets the access control policy on the specified resource. Replaces any
+-- existing policy.
+--
+-- /See:/ <https://cloud.google.com/iot Cloud IoT API Reference> for @cloudiot.projects.locations.registries.groups.setIamPolicy@.
+module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.SetIAMPolicy
+    (
+    -- * REST Resource
+      ProjectsLocationsRegistriesGroupsSetIAMPolicyResource
+
+    -- * Creating a Request
+    , projectsLocationsRegistriesGroupsSetIAMPolicy
+    , ProjectsLocationsRegistriesGroupsSetIAMPolicy
+
+    -- * Request Lenses
+    , plrgsipXgafv
+    , plrgsipUploadProtocol
+    , plrgsipAccessToken
+    , plrgsipUploadType
+    , plrgsipPayload
+    , plrgsipResource
+    , plrgsipCallback
+    ) where
+
+import           Network.Google.CloudIOT.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @cloudiot.projects.locations.registries.groups.setIamPolicy@ method which the
+-- 'ProjectsLocationsRegistriesGroupsSetIAMPolicy' request conforms to.
+type ProjectsLocationsRegistriesGroupsSetIAMPolicyResource
+     =
+     "v1" :>
+       CaptureMode "resource" "setIamPolicy" Text :>
+         QueryParam "$.xgafv" Xgafv :>
+           QueryParam "upload_protocol" Text :>
+             QueryParam "access_token" Text :>
+               QueryParam "uploadType" Text :>
+                 QueryParam "callback" Text :>
+                   QueryParam "alt" AltJSON :>
+                     ReqBody '[JSON] SetIAMPolicyRequest :>
+                       Post '[JSON] Policy
+
+-- | Sets the access control policy on the specified resource. Replaces any
+-- existing policy.
+--
+-- /See:/ 'projectsLocationsRegistriesGroupsSetIAMPolicy' smart constructor.
+data ProjectsLocationsRegistriesGroupsSetIAMPolicy = ProjectsLocationsRegistriesGroupsSetIAMPolicy'
+    { _plrgsipXgafv          :: !(Maybe Xgafv)
+    , _plrgsipUploadProtocol :: !(Maybe Text)
+    , _plrgsipAccessToken    :: !(Maybe Text)
+    , _plrgsipUploadType     :: !(Maybe Text)
+    , _plrgsipPayload        :: !SetIAMPolicyRequest
+    , _plrgsipResource       :: !Text
+    , _plrgsipCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ProjectsLocationsRegistriesGroupsSetIAMPolicy' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'plrgsipXgafv'
+--
+-- * 'plrgsipUploadProtocol'
+--
+-- * 'plrgsipAccessToken'
+--
+-- * 'plrgsipUploadType'
+--
+-- * 'plrgsipPayload'
+--
+-- * 'plrgsipResource'
+--
+-- * 'plrgsipCallback'
+projectsLocationsRegistriesGroupsSetIAMPolicy
+    :: SetIAMPolicyRequest -- ^ 'plrgsipPayload'
+    -> Text -- ^ 'plrgsipResource'
+    -> ProjectsLocationsRegistriesGroupsSetIAMPolicy
+projectsLocationsRegistriesGroupsSetIAMPolicy pPlrgsipPayload_ pPlrgsipResource_ =
+    ProjectsLocationsRegistriesGroupsSetIAMPolicy'
+    { _plrgsipXgafv = Nothing
+    , _plrgsipUploadProtocol = Nothing
+    , _plrgsipAccessToken = Nothing
+    , _plrgsipUploadType = Nothing
+    , _plrgsipPayload = pPlrgsipPayload_
+    , _plrgsipResource = pPlrgsipResource_
+    , _plrgsipCallback = Nothing
+    }
+
+-- | V1 error format.
+plrgsipXgafv :: Lens' ProjectsLocationsRegistriesGroupsSetIAMPolicy (Maybe Xgafv)
+plrgsipXgafv
+  = lens _plrgsipXgafv (\ s a -> s{_plrgsipXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+plrgsipUploadProtocol :: Lens' ProjectsLocationsRegistriesGroupsSetIAMPolicy (Maybe Text)
+plrgsipUploadProtocol
+  = lens _plrgsipUploadProtocol
+      (\ s a -> s{_plrgsipUploadProtocol = a})
+
+-- | OAuth access token.
+plrgsipAccessToken :: Lens' ProjectsLocationsRegistriesGroupsSetIAMPolicy (Maybe Text)
+plrgsipAccessToken
+  = lens _plrgsipAccessToken
+      (\ s a -> s{_plrgsipAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+plrgsipUploadType :: Lens' ProjectsLocationsRegistriesGroupsSetIAMPolicy (Maybe Text)
+plrgsipUploadType
+  = lens _plrgsipUploadType
+      (\ s a -> s{_plrgsipUploadType = a})
+
+-- | Multipart request metadata.
+plrgsipPayload :: Lens' ProjectsLocationsRegistriesGroupsSetIAMPolicy SetIAMPolicyRequest
+plrgsipPayload
+  = lens _plrgsipPayload
+      (\ s a -> s{_plrgsipPayload = a})
+
+-- | REQUIRED: The resource for which the policy is being specified. See the
+-- operation documentation for the appropriate value for this field.
+plrgsipResource :: Lens' ProjectsLocationsRegistriesGroupsSetIAMPolicy Text
+plrgsipResource
+  = lens _plrgsipResource
+      (\ s a -> s{_plrgsipResource = a})
+
+-- | JSONP
+plrgsipCallback :: Lens' ProjectsLocationsRegistriesGroupsSetIAMPolicy (Maybe Text)
+plrgsipCallback
+  = lens _plrgsipCallback
+      (\ s a -> s{_plrgsipCallback = a})
+
+instance GoogleRequest
+         ProjectsLocationsRegistriesGroupsSetIAMPolicy where
+        type Rs ProjectsLocationsRegistriesGroupsSetIAMPolicy
+             = Policy
+        type Scopes
+               ProjectsLocationsRegistriesGroupsSetIAMPolicy
+             =
+             '["https://www.googleapis.com/auth/cloud-platform",
+               "https://www.googleapis.com/auth/cloudiot"]
+        requestClient
+          ProjectsLocationsRegistriesGroupsSetIAMPolicy'{..}
+          = go _plrgsipResource _plrgsipXgafv
+              _plrgsipUploadProtocol
+              _plrgsipAccessToken
+              _plrgsipUploadType
+              _plrgsipCallback
+              (Just AltJSON)
+              _plrgsipPayload
+              cloudIOTService
+          where go
+                  = buildClient
+                      (Proxy ::
+                         Proxy
+                           ProjectsLocationsRegistriesGroupsSetIAMPolicyResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Groups/TestIAMPermissions.hs b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Groups/TestIAMPermissions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Groups/TestIAMPermissions.hs
@@ -0,0 +1,181 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.TestIAMPermissions
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns permissions that a caller has on the specified resource. If the
+-- resource does not exist, this will return an empty set of permissions,
+-- not a NOT_FOUND error.
+--
+-- /See:/ <https://cloud.google.com/iot Cloud IoT API Reference> for @cloudiot.projects.locations.registries.groups.testIamPermissions@.
+module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.TestIAMPermissions
+    (
+    -- * REST Resource
+      ProjectsLocationsRegistriesGroupsTestIAMPermissionsResource
+
+    -- * Creating a Request
+    , projectsLocationsRegistriesGroupsTestIAMPermissions
+    , ProjectsLocationsRegistriesGroupsTestIAMPermissions
+
+    -- * Request Lenses
+    , plrgtipXgafv
+    , plrgtipUploadProtocol
+    , plrgtipAccessToken
+    , plrgtipUploadType
+    , plrgtipPayload
+    , plrgtipResource
+    , plrgtipCallback
+    ) where
+
+import           Network.Google.CloudIOT.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @cloudiot.projects.locations.registries.groups.testIamPermissions@ method which the
+-- 'ProjectsLocationsRegistriesGroupsTestIAMPermissions' request conforms to.
+type ProjectsLocationsRegistriesGroupsTestIAMPermissionsResource
+     =
+     "v1" :>
+       CaptureMode "resource" "testIamPermissions" Text :>
+         QueryParam "$.xgafv" Xgafv :>
+           QueryParam "upload_protocol" Text :>
+             QueryParam "access_token" Text :>
+               QueryParam "uploadType" Text :>
+                 QueryParam "callback" Text :>
+                   QueryParam "alt" AltJSON :>
+                     ReqBody '[JSON] TestIAMPermissionsRequest :>
+                       Post '[JSON] TestIAMPermissionsResponse
+
+-- | Returns permissions that a caller has on the specified resource. If the
+-- resource does not exist, this will return an empty set of permissions,
+-- not a NOT_FOUND error.
+--
+-- /See:/ 'projectsLocationsRegistriesGroupsTestIAMPermissions' smart constructor.
+data ProjectsLocationsRegistriesGroupsTestIAMPermissions = ProjectsLocationsRegistriesGroupsTestIAMPermissions'
+    { _plrgtipXgafv          :: !(Maybe Xgafv)
+    , _plrgtipUploadProtocol :: !(Maybe Text)
+    , _plrgtipAccessToken    :: !(Maybe Text)
+    , _plrgtipUploadType     :: !(Maybe Text)
+    , _plrgtipPayload        :: !TestIAMPermissionsRequest
+    , _plrgtipResource       :: !Text
+    , _plrgtipCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ProjectsLocationsRegistriesGroupsTestIAMPermissions' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'plrgtipXgafv'
+--
+-- * 'plrgtipUploadProtocol'
+--
+-- * 'plrgtipAccessToken'
+--
+-- * 'plrgtipUploadType'
+--
+-- * 'plrgtipPayload'
+--
+-- * 'plrgtipResource'
+--
+-- * 'plrgtipCallback'
+projectsLocationsRegistriesGroupsTestIAMPermissions
+    :: TestIAMPermissionsRequest -- ^ 'plrgtipPayload'
+    -> Text -- ^ 'plrgtipResource'
+    -> ProjectsLocationsRegistriesGroupsTestIAMPermissions
+projectsLocationsRegistriesGroupsTestIAMPermissions pPlrgtipPayload_ pPlrgtipResource_ =
+    ProjectsLocationsRegistriesGroupsTestIAMPermissions'
+    { _plrgtipXgafv = Nothing
+    , _plrgtipUploadProtocol = Nothing
+    , _plrgtipAccessToken = Nothing
+    , _plrgtipUploadType = Nothing
+    , _plrgtipPayload = pPlrgtipPayload_
+    , _plrgtipResource = pPlrgtipResource_
+    , _plrgtipCallback = Nothing
+    }
+
+-- | V1 error format.
+plrgtipXgafv :: Lens' ProjectsLocationsRegistriesGroupsTestIAMPermissions (Maybe Xgafv)
+plrgtipXgafv
+  = lens _plrgtipXgafv (\ s a -> s{_plrgtipXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+plrgtipUploadProtocol :: Lens' ProjectsLocationsRegistriesGroupsTestIAMPermissions (Maybe Text)
+plrgtipUploadProtocol
+  = lens _plrgtipUploadProtocol
+      (\ s a -> s{_plrgtipUploadProtocol = a})
+
+-- | OAuth access token.
+plrgtipAccessToken :: Lens' ProjectsLocationsRegistriesGroupsTestIAMPermissions (Maybe Text)
+plrgtipAccessToken
+  = lens _plrgtipAccessToken
+      (\ s a -> s{_plrgtipAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+plrgtipUploadType :: Lens' ProjectsLocationsRegistriesGroupsTestIAMPermissions (Maybe Text)
+plrgtipUploadType
+  = lens _plrgtipUploadType
+      (\ s a -> s{_plrgtipUploadType = a})
+
+-- | Multipart request metadata.
+plrgtipPayload :: Lens' ProjectsLocationsRegistriesGroupsTestIAMPermissions TestIAMPermissionsRequest
+plrgtipPayload
+  = lens _plrgtipPayload
+      (\ s a -> s{_plrgtipPayload = a})
+
+-- | REQUIRED: The resource for which the policy detail is being requested.
+-- See the operation documentation for the appropriate value for this
+-- field.
+plrgtipResource :: Lens' ProjectsLocationsRegistriesGroupsTestIAMPermissions Text
+plrgtipResource
+  = lens _plrgtipResource
+      (\ s a -> s{_plrgtipResource = a})
+
+-- | JSONP
+plrgtipCallback :: Lens' ProjectsLocationsRegistriesGroupsTestIAMPermissions (Maybe Text)
+plrgtipCallback
+  = lens _plrgtipCallback
+      (\ s a -> s{_plrgtipCallback = a})
+
+instance GoogleRequest
+         ProjectsLocationsRegistriesGroupsTestIAMPermissions
+         where
+        type Rs
+               ProjectsLocationsRegistriesGroupsTestIAMPermissions
+             = TestIAMPermissionsResponse
+        type Scopes
+               ProjectsLocationsRegistriesGroupsTestIAMPermissions
+             =
+             '["https://www.googleapis.com/auth/cloud-platform",
+               "https://www.googleapis.com/auth/cloudiot"]
+        requestClient
+          ProjectsLocationsRegistriesGroupsTestIAMPermissions'{..}
+          = go _plrgtipResource _plrgtipXgafv
+              _plrgtipUploadProtocol
+              _plrgtipAccessToken
+              _plrgtipUploadType
+              _plrgtipCallback
+              (Just AltJSON)
+              _plrgtipPayload
+              cloudIOTService
+          where go
+                  = buildClient
+                      (Proxy ::
+                         Proxy
+                           ProjectsLocationsRegistriesGroupsTestIAMPermissionsResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Groups/UnbindDeviceFromGateway.hs b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Groups/UnbindDeviceFromGateway.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Groups/UnbindDeviceFromGateway.hs
@@ -0,0 +1,178 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.UnbindDeviceFromGateway
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes the association between the device and the gateway.
+--
+-- /See:/ <https://cloud.google.com/iot Cloud IoT API Reference> for @cloudiot.projects.locations.registries.groups.unbindDeviceFromGateway@.
+module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.UnbindDeviceFromGateway
+    (
+    -- * REST Resource
+      ProjectsLocationsRegistriesGroupsUnbindDeviceFromGatewayResource
+
+    -- * Creating a Request
+    , projectsLocationsRegistriesGroupsUnbindDeviceFromGateway
+    , ProjectsLocationsRegistriesGroupsUnbindDeviceFromGateway
+
+    -- * Request Lenses
+    , plrgudfgParent
+    , plrgudfgXgafv
+    , plrgudfgUploadProtocol
+    , plrgudfgAccessToken
+    , plrgudfgUploadType
+    , plrgudfgPayload
+    , plrgudfgCallback
+    ) where
+
+import           Network.Google.CloudIOT.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @cloudiot.projects.locations.registries.groups.unbindDeviceFromGateway@ method which the
+-- 'ProjectsLocationsRegistriesGroupsUnbindDeviceFromGateway' request conforms to.
+type ProjectsLocationsRegistriesGroupsUnbindDeviceFromGatewayResource
+     =
+     "v1" :>
+       CaptureMode "parent" "unbindDeviceFromGateway" Text
+         :>
+         QueryParam "$.xgafv" Xgafv :>
+           QueryParam "upload_protocol" Text :>
+             QueryParam "access_token" Text :>
+               QueryParam "uploadType" Text :>
+                 QueryParam "callback" Text :>
+                   QueryParam "alt" AltJSON :>
+                     ReqBody '[JSON] UnbindDeviceFromGatewayRequest :>
+                       Post '[JSON] UnbindDeviceFromGatewayResponse
+
+-- | Deletes the association between the device and the gateway.
+--
+-- /See:/ 'projectsLocationsRegistriesGroupsUnbindDeviceFromGateway' smart constructor.
+data ProjectsLocationsRegistriesGroupsUnbindDeviceFromGateway = ProjectsLocationsRegistriesGroupsUnbindDeviceFromGateway'
+    { _plrgudfgParent         :: !Text
+    , _plrgudfgXgafv          :: !(Maybe Xgafv)
+    , _plrgudfgUploadProtocol :: !(Maybe Text)
+    , _plrgudfgAccessToken    :: !(Maybe Text)
+    , _plrgudfgUploadType     :: !(Maybe Text)
+    , _plrgudfgPayload        :: !UnbindDeviceFromGatewayRequest
+    , _plrgudfgCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ProjectsLocationsRegistriesGroupsUnbindDeviceFromGateway' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'plrgudfgParent'
+--
+-- * 'plrgudfgXgafv'
+--
+-- * 'plrgudfgUploadProtocol'
+--
+-- * 'plrgudfgAccessToken'
+--
+-- * 'plrgudfgUploadType'
+--
+-- * 'plrgudfgPayload'
+--
+-- * 'plrgudfgCallback'
+projectsLocationsRegistriesGroupsUnbindDeviceFromGateway
+    :: Text -- ^ 'plrgudfgParent'
+    -> UnbindDeviceFromGatewayRequest -- ^ 'plrgudfgPayload'
+    -> ProjectsLocationsRegistriesGroupsUnbindDeviceFromGateway
+projectsLocationsRegistriesGroupsUnbindDeviceFromGateway pPlrgudfgParent_ pPlrgudfgPayload_ =
+    ProjectsLocationsRegistriesGroupsUnbindDeviceFromGateway'
+    { _plrgudfgParent = pPlrgudfgParent_
+    , _plrgudfgXgafv = Nothing
+    , _plrgudfgUploadProtocol = Nothing
+    , _plrgudfgAccessToken = Nothing
+    , _plrgudfgUploadType = Nothing
+    , _plrgudfgPayload = pPlrgudfgPayload_
+    , _plrgudfgCallback = Nothing
+    }
+
+-- | The name of the registry. For example,
+-- \`projects\/example-project\/locations\/us-central1\/registries\/my-registry\`.
+plrgudfgParent :: Lens' ProjectsLocationsRegistriesGroupsUnbindDeviceFromGateway Text
+plrgudfgParent
+  = lens _plrgudfgParent
+      (\ s a -> s{_plrgudfgParent = a})
+
+-- | V1 error format.
+plrgudfgXgafv :: Lens' ProjectsLocationsRegistriesGroupsUnbindDeviceFromGateway (Maybe Xgafv)
+plrgudfgXgafv
+  = lens _plrgudfgXgafv
+      (\ s a -> s{_plrgudfgXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+plrgudfgUploadProtocol :: Lens' ProjectsLocationsRegistriesGroupsUnbindDeviceFromGateway (Maybe Text)
+plrgudfgUploadProtocol
+  = lens _plrgudfgUploadProtocol
+      (\ s a -> s{_plrgudfgUploadProtocol = a})
+
+-- | OAuth access token.
+plrgudfgAccessToken :: Lens' ProjectsLocationsRegistriesGroupsUnbindDeviceFromGateway (Maybe Text)
+plrgudfgAccessToken
+  = lens _plrgudfgAccessToken
+      (\ s a -> s{_plrgudfgAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+plrgudfgUploadType :: Lens' ProjectsLocationsRegistriesGroupsUnbindDeviceFromGateway (Maybe Text)
+plrgudfgUploadType
+  = lens _plrgudfgUploadType
+      (\ s a -> s{_plrgudfgUploadType = a})
+
+-- | Multipart request metadata.
+plrgudfgPayload :: Lens' ProjectsLocationsRegistriesGroupsUnbindDeviceFromGateway UnbindDeviceFromGatewayRequest
+plrgudfgPayload
+  = lens _plrgudfgPayload
+      (\ s a -> s{_plrgudfgPayload = a})
+
+-- | JSONP
+plrgudfgCallback :: Lens' ProjectsLocationsRegistriesGroupsUnbindDeviceFromGateway (Maybe Text)
+plrgudfgCallback
+  = lens _plrgudfgCallback
+      (\ s a -> s{_plrgudfgCallback = a})
+
+instance GoogleRequest
+         ProjectsLocationsRegistriesGroupsUnbindDeviceFromGateway
+         where
+        type Rs
+               ProjectsLocationsRegistriesGroupsUnbindDeviceFromGateway
+             = UnbindDeviceFromGatewayResponse
+        type Scopes
+               ProjectsLocationsRegistriesGroupsUnbindDeviceFromGateway
+             =
+             '["https://www.googleapis.com/auth/cloud-platform",
+               "https://www.googleapis.com/auth/cloudiot"]
+        requestClient
+          ProjectsLocationsRegistriesGroupsUnbindDeviceFromGateway'{..}
+          = go _plrgudfgParent _plrgudfgXgafv
+              _plrgudfgUploadProtocol
+              _plrgudfgAccessToken
+              _plrgudfgUploadType
+              _plrgudfgCallback
+              (Just AltJSON)
+              _plrgudfgPayload
+              cloudIOTService
+          where go
+                  = buildClient
+                      (Proxy ::
+                         Proxy
+                           ProjectsLocationsRegistriesGroupsUnbindDeviceFromGatewayResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/List.hs b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/List.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/List.hs
@@ -0,0 +1,185 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.CloudIOT.Projects.Locations.Registries.List
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists device registries.
+--
+-- /See:/ <https://cloud.google.com/iot Cloud IoT API Reference> for @cloudiot.projects.locations.registries.list@.
+module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.List
+    (
+    -- * REST Resource
+      ProjectsLocationsRegistriesListResource
+
+    -- * Creating a Request
+    , projectsLocationsRegistriesList
+    , ProjectsLocationsRegistriesList
+
+    -- * Request Lenses
+    , plrlParent
+    , plrlXgafv
+    , plrlUploadProtocol
+    , plrlAccessToken
+    , plrlUploadType
+    , plrlPageToken
+    , plrlPageSize
+    , plrlCallback
+    ) where
+
+import           Network.Google.CloudIOT.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @cloudiot.projects.locations.registries.list@ method which the
+-- 'ProjectsLocationsRegistriesList' request conforms to.
+type ProjectsLocationsRegistriesListResource =
+     "v1" :>
+       Capture "parent" Text :>
+         "registries" :>
+           QueryParam "$.xgafv" Xgafv :>
+             QueryParam "upload_protocol" Text :>
+               QueryParam "access_token" Text :>
+                 QueryParam "uploadType" Text :>
+                   QueryParam "pageToken" Text :>
+                     QueryParam "pageSize" (Textual Int32) :>
+                       QueryParam "callback" Text :>
+                         QueryParam "alt" AltJSON :>
+                           Get '[JSON] ListDeviceRegistriesResponse
+
+-- | Lists device registries.
+--
+-- /See:/ 'projectsLocationsRegistriesList' smart constructor.
+data ProjectsLocationsRegistriesList = ProjectsLocationsRegistriesList'
+    { _plrlParent         :: !Text
+    , _plrlXgafv          :: !(Maybe Xgafv)
+    , _plrlUploadProtocol :: !(Maybe Text)
+    , _plrlAccessToken    :: !(Maybe Text)
+    , _plrlUploadType     :: !(Maybe Text)
+    , _plrlPageToken      :: !(Maybe Text)
+    , _plrlPageSize       :: !(Maybe (Textual Int32))
+    , _plrlCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ProjectsLocationsRegistriesList' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'plrlParent'
+--
+-- * 'plrlXgafv'
+--
+-- * 'plrlUploadProtocol'
+--
+-- * 'plrlAccessToken'
+--
+-- * 'plrlUploadType'
+--
+-- * 'plrlPageToken'
+--
+-- * 'plrlPageSize'
+--
+-- * 'plrlCallback'
+projectsLocationsRegistriesList
+    :: Text -- ^ 'plrlParent'
+    -> ProjectsLocationsRegistriesList
+projectsLocationsRegistriesList pPlrlParent_ =
+    ProjectsLocationsRegistriesList'
+    { _plrlParent = pPlrlParent_
+    , _plrlXgafv = Nothing
+    , _plrlUploadProtocol = Nothing
+    , _plrlAccessToken = Nothing
+    , _plrlUploadType = Nothing
+    , _plrlPageToken = Nothing
+    , _plrlPageSize = Nothing
+    , _plrlCallback = Nothing
+    }
+
+-- | The project and cloud region path. For example,
+-- \`projects\/example-project\/locations\/us-central1\`.
+plrlParent :: Lens' ProjectsLocationsRegistriesList Text
+plrlParent
+  = lens _plrlParent (\ s a -> s{_plrlParent = a})
+
+-- | V1 error format.
+plrlXgafv :: Lens' ProjectsLocationsRegistriesList (Maybe Xgafv)
+plrlXgafv
+  = lens _plrlXgafv (\ s a -> s{_plrlXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+plrlUploadProtocol :: Lens' ProjectsLocationsRegistriesList (Maybe Text)
+plrlUploadProtocol
+  = lens _plrlUploadProtocol
+      (\ s a -> s{_plrlUploadProtocol = a})
+
+-- | OAuth access token.
+plrlAccessToken :: Lens' ProjectsLocationsRegistriesList (Maybe Text)
+plrlAccessToken
+  = lens _plrlAccessToken
+      (\ s a -> s{_plrlAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+plrlUploadType :: Lens' ProjectsLocationsRegistriesList (Maybe Text)
+plrlUploadType
+  = lens _plrlUploadType
+      (\ s a -> s{_plrlUploadType = a})
+
+-- | The value returned by the last \`ListDeviceRegistriesResponse\`;
+-- indicates that this is a continuation of a prior
+-- \`ListDeviceRegistries\` call and the system should return the next page
+-- of data.
+plrlPageToken :: Lens' ProjectsLocationsRegistriesList (Maybe Text)
+plrlPageToken
+  = lens _plrlPageToken
+      (\ s a -> s{_plrlPageToken = a})
+
+-- | The maximum number of registries to return in the response. If this
+-- value is zero, the service will select a default size. A call may return
+-- fewer objects than requested. A non-empty \`next_page_token\` in the
+-- response indicates that more data is available.
+plrlPageSize :: Lens' ProjectsLocationsRegistriesList (Maybe Int32)
+plrlPageSize
+  = lens _plrlPageSize (\ s a -> s{_plrlPageSize = a})
+      . mapping _Coerce
+
+-- | JSONP
+plrlCallback :: Lens' ProjectsLocationsRegistriesList (Maybe Text)
+plrlCallback
+  = lens _plrlCallback (\ s a -> s{_plrlCallback = a})
+
+instance GoogleRequest
+         ProjectsLocationsRegistriesList where
+        type Rs ProjectsLocationsRegistriesList =
+             ListDeviceRegistriesResponse
+        type Scopes ProjectsLocationsRegistriesList =
+             '["https://www.googleapis.com/auth/cloud-platform",
+               "https://www.googleapis.com/auth/cloudiot"]
+        requestClient ProjectsLocationsRegistriesList'{..}
+          = go _plrlParent _plrlXgafv _plrlUploadProtocol
+              _plrlAccessToken
+              _plrlUploadType
+              _plrlPageToken
+              _plrlPageSize
+              _plrlCallback
+              (Just AltJSON)
+              cloudIOTService
+          where go
+                  = buildClient
+                      (Proxy ::
+                         Proxy ProjectsLocationsRegistriesListResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Patch.hs b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Patch.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/Patch.hs
@@ -0,0 +1,181 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Patch
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates a device registry configuration.
+--
+-- /See:/ <https://cloud.google.com/iot Cloud IoT API Reference> for @cloudiot.projects.locations.registries.patch@.
+module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Patch
+    (
+    -- * REST Resource
+      ProjectsLocationsRegistriesPatchResource
+
+    -- * Creating a Request
+    , projectsLocationsRegistriesPatch
+    , ProjectsLocationsRegistriesPatch
+
+    -- * Request Lenses
+    , plrpXgafv
+    , plrpUploadProtocol
+    , plrpUpdateMask
+    , plrpAccessToken
+    , plrpUploadType
+    , plrpPayload
+    , plrpName
+    , plrpCallback
+    ) where
+
+import           Network.Google.CloudIOT.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @cloudiot.projects.locations.registries.patch@ method which the
+-- 'ProjectsLocationsRegistriesPatch' request conforms to.
+type ProjectsLocationsRegistriesPatchResource =
+     "v1" :>
+       Capture "name" Text :>
+         QueryParam "$.xgafv" Xgafv :>
+           QueryParam "upload_protocol" Text :>
+             QueryParam "updateMask" GFieldMask :>
+               QueryParam "access_token" Text :>
+                 QueryParam "uploadType" Text :>
+                   QueryParam "callback" Text :>
+                     QueryParam "alt" AltJSON :>
+                       ReqBody '[JSON] DeviceRegistry :>
+                         Patch '[JSON] DeviceRegistry
+
+-- | Updates a device registry configuration.
+--
+-- /See:/ 'projectsLocationsRegistriesPatch' smart constructor.
+data ProjectsLocationsRegistriesPatch = ProjectsLocationsRegistriesPatch'
+    { _plrpXgafv          :: !(Maybe Xgafv)
+    , _plrpUploadProtocol :: !(Maybe Text)
+    , _plrpUpdateMask     :: !(Maybe GFieldMask)
+    , _plrpAccessToken    :: !(Maybe Text)
+    , _plrpUploadType     :: !(Maybe Text)
+    , _plrpPayload        :: !DeviceRegistry
+    , _plrpName           :: !Text
+    , _plrpCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ProjectsLocationsRegistriesPatch' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'plrpXgafv'
+--
+-- * 'plrpUploadProtocol'
+--
+-- * 'plrpUpdateMask'
+--
+-- * 'plrpAccessToken'
+--
+-- * 'plrpUploadType'
+--
+-- * 'plrpPayload'
+--
+-- * 'plrpName'
+--
+-- * 'plrpCallback'
+projectsLocationsRegistriesPatch
+    :: DeviceRegistry -- ^ 'plrpPayload'
+    -> Text -- ^ 'plrpName'
+    -> ProjectsLocationsRegistriesPatch
+projectsLocationsRegistriesPatch pPlrpPayload_ pPlrpName_ =
+    ProjectsLocationsRegistriesPatch'
+    { _plrpXgafv = Nothing
+    , _plrpUploadProtocol = Nothing
+    , _plrpUpdateMask = Nothing
+    , _plrpAccessToken = Nothing
+    , _plrpUploadType = Nothing
+    , _plrpPayload = pPlrpPayload_
+    , _plrpName = pPlrpName_
+    , _plrpCallback = Nothing
+    }
+
+-- | V1 error format.
+plrpXgafv :: Lens' ProjectsLocationsRegistriesPatch (Maybe Xgafv)
+plrpXgafv
+  = lens _plrpXgafv (\ s a -> s{_plrpXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+plrpUploadProtocol :: Lens' ProjectsLocationsRegistriesPatch (Maybe Text)
+plrpUploadProtocol
+  = lens _plrpUploadProtocol
+      (\ s a -> s{_plrpUploadProtocol = a})
+
+-- | Only updates the \`device_registry\` fields indicated by this mask. The
+-- field mask must not be empty, and it must not contain fields that are
+-- immutable or only set by the server. Mutable top-level fields:
+-- \`event_notification_config\`, \`http_config\`, \`mqtt_config\`, and
+-- \`state_notification_config\`.
+plrpUpdateMask :: Lens' ProjectsLocationsRegistriesPatch (Maybe GFieldMask)
+plrpUpdateMask
+  = lens _plrpUpdateMask
+      (\ s a -> s{_plrpUpdateMask = a})
+
+-- | OAuth access token.
+plrpAccessToken :: Lens' ProjectsLocationsRegistriesPatch (Maybe Text)
+plrpAccessToken
+  = lens _plrpAccessToken
+      (\ s a -> s{_plrpAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+plrpUploadType :: Lens' ProjectsLocationsRegistriesPatch (Maybe Text)
+plrpUploadType
+  = lens _plrpUploadType
+      (\ s a -> s{_plrpUploadType = a})
+
+-- | Multipart request metadata.
+plrpPayload :: Lens' ProjectsLocationsRegistriesPatch DeviceRegistry
+plrpPayload
+  = lens _plrpPayload (\ s a -> s{_plrpPayload = a})
+
+-- | The resource path name. For example,
+-- \`projects\/example-project\/locations\/us-central1\/registries\/my-registry\`.
+plrpName :: Lens' ProjectsLocationsRegistriesPatch Text
+plrpName = lens _plrpName (\ s a -> s{_plrpName = a})
+
+-- | JSONP
+plrpCallback :: Lens' ProjectsLocationsRegistriesPatch (Maybe Text)
+plrpCallback
+  = lens _plrpCallback (\ s a -> s{_plrpCallback = a})
+
+instance GoogleRequest
+         ProjectsLocationsRegistriesPatch where
+        type Rs ProjectsLocationsRegistriesPatch =
+             DeviceRegistry
+        type Scopes ProjectsLocationsRegistriesPatch =
+             '["https://www.googleapis.com/auth/cloud-platform",
+               "https://www.googleapis.com/auth/cloudiot"]
+        requestClient ProjectsLocationsRegistriesPatch'{..}
+          = go _plrpName _plrpXgafv _plrpUploadProtocol
+              _plrpUpdateMask
+              _plrpAccessToken
+              _plrpUploadType
+              _plrpCallback
+              (Just AltJSON)
+              _plrpPayload
+              cloudIOTService
+          where go
+                  = buildClient
+                      (Proxy ::
+                         Proxy ProjectsLocationsRegistriesPatchResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/SetIAMPolicy.hs b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/SetIAMPolicy.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/SetIAMPolicy.hs
@@ -0,0 +1,174 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.CloudIOT.Projects.Locations.Registries.SetIAMPolicy
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Sets the access control policy on the specified resource. Replaces any
+-- existing policy.
+--
+-- /See:/ <https://cloud.google.com/iot Cloud IoT API Reference> for @cloudiot.projects.locations.registries.setIamPolicy@.
+module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.SetIAMPolicy
+    (
+    -- * REST Resource
+      ProjectsLocationsRegistriesSetIAMPolicyResource
+
+    -- * Creating a Request
+    , projectsLocationsRegistriesSetIAMPolicy
+    , ProjectsLocationsRegistriesSetIAMPolicy
+
+    -- * Request Lenses
+    , plrsipXgafv
+    , plrsipUploadProtocol
+    , plrsipAccessToken
+    , plrsipUploadType
+    , plrsipPayload
+    , plrsipResource
+    , plrsipCallback
+    ) where
+
+import           Network.Google.CloudIOT.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @cloudiot.projects.locations.registries.setIamPolicy@ method which the
+-- 'ProjectsLocationsRegistriesSetIAMPolicy' request conforms to.
+type ProjectsLocationsRegistriesSetIAMPolicyResource
+     =
+     "v1" :>
+       CaptureMode "resource" "setIamPolicy" Text :>
+         QueryParam "$.xgafv" Xgafv :>
+           QueryParam "upload_protocol" Text :>
+             QueryParam "access_token" Text :>
+               QueryParam "uploadType" Text :>
+                 QueryParam "callback" Text :>
+                   QueryParam "alt" AltJSON :>
+                     ReqBody '[JSON] SetIAMPolicyRequest :>
+                       Post '[JSON] Policy
+
+-- | Sets the access control policy on the specified resource. Replaces any
+-- existing policy.
+--
+-- /See:/ 'projectsLocationsRegistriesSetIAMPolicy' smart constructor.
+data ProjectsLocationsRegistriesSetIAMPolicy = ProjectsLocationsRegistriesSetIAMPolicy'
+    { _plrsipXgafv          :: !(Maybe Xgafv)
+    , _plrsipUploadProtocol :: !(Maybe Text)
+    , _plrsipAccessToken    :: !(Maybe Text)
+    , _plrsipUploadType     :: !(Maybe Text)
+    , _plrsipPayload        :: !SetIAMPolicyRequest
+    , _plrsipResource       :: !Text
+    , _plrsipCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ProjectsLocationsRegistriesSetIAMPolicy' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'plrsipXgafv'
+--
+-- * 'plrsipUploadProtocol'
+--
+-- * 'plrsipAccessToken'
+--
+-- * 'plrsipUploadType'
+--
+-- * 'plrsipPayload'
+--
+-- * 'plrsipResource'
+--
+-- * 'plrsipCallback'
+projectsLocationsRegistriesSetIAMPolicy
+    :: SetIAMPolicyRequest -- ^ 'plrsipPayload'
+    -> Text -- ^ 'plrsipResource'
+    -> ProjectsLocationsRegistriesSetIAMPolicy
+projectsLocationsRegistriesSetIAMPolicy pPlrsipPayload_ pPlrsipResource_ =
+    ProjectsLocationsRegistriesSetIAMPolicy'
+    { _plrsipXgafv = Nothing
+    , _plrsipUploadProtocol = Nothing
+    , _plrsipAccessToken = Nothing
+    , _plrsipUploadType = Nothing
+    , _plrsipPayload = pPlrsipPayload_
+    , _plrsipResource = pPlrsipResource_
+    , _plrsipCallback = Nothing
+    }
+
+-- | V1 error format.
+plrsipXgafv :: Lens' ProjectsLocationsRegistriesSetIAMPolicy (Maybe Xgafv)
+plrsipXgafv
+  = lens _plrsipXgafv (\ s a -> s{_plrsipXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+plrsipUploadProtocol :: Lens' ProjectsLocationsRegistriesSetIAMPolicy (Maybe Text)
+plrsipUploadProtocol
+  = lens _plrsipUploadProtocol
+      (\ s a -> s{_plrsipUploadProtocol = a})
+
+-- | OAuth access token.
+plrsipAccessToken :: Lens' ProjectsLocationsRegistriesSetIAMPolicy (Maybe Text)
+plrsipAccessToken
+  = lens _plrsipAccessToken
+      (\ s a -> s{_plrsipAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+plrsipUploadType :: Lens' ProjectsLocationsRegistriesSetIAMPolicy (Maybe Text)
+plrsipUploadType
+  = lens _plrsipUploadType
+      (\ s a -> s{_plrsipUploadType = a})
+
+-- | Multipart request metadata.
+plrsipPayload :: Lens' ProjectsLocationsRegistriesSetIAMPolicy SetIAMPolicyRequest
+plrsipPayload
+  = lens _plrsipPayload
+      (\ s a -> s{_plrsipPayload = a})
+
+-- | REQUIRED: The resource for which the policy is being specified. See the
+-- operation documentation for the appropriate value for this field.
+plrsipResource :: Lens' ProjectsLocationsRegistriesSetIAMPolicy Text
+plrsipResource
+  = lens _plrsipResource
+      (\ s a -> s{_plrsipResource = a})
+
+-- | JSONP
+plrsipCallback :: Lens' ProjectsLocationsRegistriesSetIAMPolicy (Maybe Text)
+plrsipCallback
+  = lens _plrsipCallback
+      (\ s a -> s{_plrsipCallback = a})
+
+instance GoogleRequest
+         ProjectsLocationsRegistriesSetIAMPolicy where
+        type Rs ProjectsLocationsRegistriesSetIAMPolicy =
+             Policy
+        type Scopes ProjectsLocationsRegistriesSetIAMPolicy =
+             '["https://www.googleapis.com/auth/cloud-platform",
+               "https://www.googleapis.com/auth/cloudiot"]
+        requestClient
+          ProjectsLocationsRegistriesSetIAMPolicy'{..}
+          = go _plrsipResource _plrsipXgafv
+              _plrsipUploadProtocol
+              _plrsipAccessToken
+              _plrsipUploadType
+              _plrsipCallback
+              (Just AltJSON)
+              _plrsipPayload
+              cloudIOTService
+          where go
+                  = buildClient
+                      (Proxy ::
+                         Proxy
+                           ProjectsLocationsRegistriesSetIAMPolicyResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/TestIAMPermissions.hs b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/TestIAMPermissions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/TestIAMPermissions.hs
@@ -0,0 +1,179 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.CloudIOT.Projects.Locations.Registries.TestIAMPermissions
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns permissions that a caller has on the specified resource. If the
+-- resource does not exist, this will return an empty set of permissions,
+-- not a NOT_FOUND error.
+--
+-- /See:/ <https://cloud.google.com/iot Cloud IoT API Reference> for @cloudiot.projects.locations.registries.testIamPermissions@.
+module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.TestIAMPermissions
+    (
+    -- * REST Resource
+      ProjectsLocationsRegistriesTestIAMPermissionsResource
+
+    -- * Creating a Request
+    , projectsLocationsRegistriesTestIAMPermissions
+    , ProjectsLocationsRegistriesTestIAMPermissions
+
+    -- * Request Lenses
+    , plrtipXgafv
+    , plrtipUploadProtocol
+    , plrtipAccessToken
+    , plrtipUploadType
+    , plrtipPayload
+    , plrtipResource
+    , plrtipCallback
+    ) where
+
+import           Network.Google.CloudIOT.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @cloudiot.projects.locations.registries.testIamPermissions@ method which the
+-- 'ProjectsLocationsRegistriesTestIAMPermissions' request conforms to.
+type ProjectsLocationsRegistriesTestIAMPermissionsResource
+     =
+     "v1" :>
+       CaptureMode "resource" "testIamPermissions" Text :>
+         QueryParam "$.xgafv" Xgafv :>
+           QueryParam "upload_protocol" Text :>
+             QueryParam "access_token" Text :>
+               QueryParam "uploadType" Text :>
+                 QueryParam "callback" Text :>
+                   QueryParam "alt" AltJSON :>
+                     ReqBody '[JSON] TestIAMPermissionsRequest :>
+                       Post '[JSON] TestIAMPermissionsResponse
+
+-- | Returns permissions that a caller has on the specified resource. If the
+-- resource does not exist, this will return an empty set of permissions,
+-- not a NOT_FOUND error.
+--
+-- /See:/ 'projectsLocationsRegistriesTestIAMPermissions' smart constructor.
+data ProjectsLocationsRegistriesTestIAMPermissions = ProjectsLocationsRegistriesTestIAMPermissions'
+    { _plrtipXgafv          :: !(Maybe Xgafv)
+    , _plrtipUploadProtocol :: !(Maybe Text)
+    , _plrtipAccessToken    :: !(Maybe Text)
+    , _plrtipUploadType     :: !(Maybe Text)
+    , _plrtipPayload        :: !TestIAMPermissionsRequest
+    , _plrtipResource       :: !Text
+    , _plrtipCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ProjectsLocationsRegistriesTestIAMPermissions' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'plrtipXgafv'
+--
+-- * 'plrtipUploadProtocol'
+--
+-- * 'plrtipAccessToken'
+--
+-- * 'plrtipUploadType'
+--
+-- * 'plrtipPayload'
+--
+-- * 'plrtipResource'
+--
+-- * 'plrtipCallback'
+projectsLocationsRegistriesTestIAMPermissions
+    :: TestIAMPermissionsRequest -- ^ 'plrtipPayload'
+    -> Text -- ^ 'plrtipResource'
+    -> ProjectsLocationsRegistriesTestIAMPermissions
+projectsLocationsRegistriesTestIAMPermissions pPlrtipPayload_ pPlrtipResource_ =
+    ProjectsLocationsRegistriesTestIAMPermissions'
+    { _plrtipXgafv = Nothing
+    , _plrtipUploadProtocol = Nothing
+    , _plrtipAccessToken = Nothing
+    , _plrtipUploadType = Nothing
+    , _plrtipPayload = pPlrtipPayload_
+    , _plrtipResource = pPlrtipResource_
+    , _plrtipCallback = Nothing
+    }
+
+-- | V1 error format.
+plrtipXgafv :: Lens' ProjectsLocationsRegistriesTestIAMPermissions (Maybe Xgafv)
+plrtipXgafv
+  = lens _plrtipXgafv (\ s a -> s{_plrtipXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+plrtipUploadProtocol :: Lens' ProjectsLocationsRegistriesTestIAMPermissions (Maybe Text)
+plrtipUploadProtocol
+  = lens _plrtipUploadProtocol
+      (\ s a -> s{_plrtipUploadProtocol = a})
+
+-- | OAuth access token.
+plrtipAccessToken :: Lens' ProjectsLocationsRegistriesTestIAMPermissions (Maybe Text)
+plrtipAccessToken
+  = lens _plrtipAccessToken
+      (\ s a -> s{_plrtipAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+plrtipUploadType :: Lens' ProjectsLocationsRegistriesTestIAMPermissions (Maybe Text)
+plrtipUploadType
+  = lens _plrtipUploadType
+      (\ s a -> s{_plrtipUploadType = a})
+
+-- | Multipart request metadata.
+plrtipPayload :: Lens' ProjectsLocationsRegistriesTestIAMPermissions TestIAMPermissionsRequest
+plrtipPayload
+  = lens _plrtipPayload
+      (\ s a -> s{_plrtipPayload = a})
+
+-- | REQUIRED: The resource for which the policy detail is being requested.
+-- See the operation documentation for the appropriate value for this
+-- field.
+plrtipResource :: Lens' ProjectsLocationsRegistriesTestIAMPermissions Text
+plrtipResource
+  = lens _plrtipResource
+      (\ s a -> s{_plrtipResource = a})
+
+-- | JSONP
+plrtipCallback :: Lens' ProjectsLocationsRegistriesTestIAMPermissions (Maybe Text)
+plrtipCallback
+  = lens _plrtipCallback
+      (\ s a -> s{_plrtipCallback = a})
+
+instance GoogleRequest
+         ProjectsLocationsRegistriesTestIAMPermissions where
+        type Rs ProjectsLocationsRegistriesTestIAMPermissions
+             = TestIAMPermissionsResponse
+        type Scopes
+               ProjectsLocationsRegistriesTestIAMPermissions
+             =
+             '["https://www.googleapis.com/auth/cloud-platform",
+               "https://www.googleapis.com/auth/cloudiot"]
+        requestClient
+          ProjectsLocationsRegistriesTestIAMPermissions'{..}
+          = go _plrtipResource _plrtipXgafv
+              _plrtipUploadProtocol
+              _plrtipAccessToken
+              _plrtipUploadType
+              _plrtipCallback
+              (Just AltJSON)
+              _plrtipPayload
+              cloudIOTService
+          where go
+                  = buildClient
+                      (Proxy ::
+                         Proxy
+                           ProjectsLocationsRegistriesTestIAMPermissionsResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/UnbindDeviceFromGateway.hs b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/UnbindDeviceFromGateway.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/CloudIOT/Projects/Locations/Registries/UnbindDeviceFromGateway.hs
@@ -0,0 +1,177 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.CloudIOT.Projects.Locations.Registries.UnbindDeviceFromGateway
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes the association between the device and the gateway.
+--
+-- /See:/ <https://cloud.google.com/iot Cloud IoT API Reference> for @cloudiot.projects.locations.registries.unbindDeviceFromGateway@.
+module Network.Google.Resource.CloudIOT.Projects.Locations.Registries.UnbindDeviceFromGateway
+    (
+    -- * REST Resource
+      ProjectsLocationsRegistriesUnbindDeviceFromGatewayResource
+
+    -- * Creating a Request
+    , projectsLocationsRegistriesUnbindDeviceFromGateway
+    , ProjectsLocationsRegistriesUnbindDeviceFromGateway
+
+    -- * Request Lenses
+    , plrudfgParent
+    , plrudfgXgafv
+    , plrudfgUploadProtocol
+    , plrudfgAccessToken
+    , plrudfgUploadType
+    , plrudfgPayload
+    , plrudfgCallback
+    ) where
+
+import           Network.Google.CloudIOT.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @cloudiot.projects.locations.registries.unbindDeviceFromGateway@ method which the
+-- 'ProjectsLocationsRegistriesUnbindDeviceFromGateway' request conforms to.
+type ProjectsLocationsRegistriesUnbindDeviceFromGatewayResource
+     =
+     "v1" :>
+       CaptureMode "parent" "unbindDeviceFromGateway" Text
+         :>
+         QueryParam "$.xgafv" Xgafv :>
+           QueryParam "upload_protocol" Text :>
+             QueryParam "access_token" Text :>
+               QueryParam "uploadType" Text :>
+                 QueryParam "callback" Text :>
+                   QueryParam "alt" AltJSON :>
+                     ReqBody '[JSON] UnbindDeviceFromGatewayRequest :>
+                       Post '[JSON] UnbindDeviceFromGatewayResponse
+
+-- | Deletes the association between the device and the gateway.
+--
+-- /See:/ 'projectsLocationsRegistriesUnbindDeviceFromGateway' smart constructor.
+data ProjectsLocationsRegistriesUnbindDeviceFromGateway = ProjectsLocationsRegistriesUnbindDeviceFromGateway'
+    { _plrudfgParent         :: !Text
+    , _plrudfgXgafv          :: !(Maybe Xgafv)
+    , _plrudfgUploadProtocol :: !(Maybe Text)
+    , _plrudfgAccessToken    :: !(Maybe Text)
+    , _plrudfgUploadType     :: !(Maybe Text)
+    , _plrudfgPayload        :: !UnbindDeviceFromGatewayRequest
+    , _plrudfgCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ProjectsLocationsRegistriesUnbindDeviceFromGateway' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'plrudfgParent'
+--
+-- * 'plrudfgXgafv'
+--
+-- * 'plrudfgUploadProtocol'
+--
+-- * 'plrudfgAccessToken'
+--
+-- * 'plrudfgUploadType'
+--
+-- * 'plrudfgPayload'
+--
+-- * 'plrudfgCallback'
+projectsLocationsRegistriesUnbindDeviceFromGateway
+    :: Text -- ^ 'plrudfgParent'
+    -> UnbindDeviceFromGatewayRequest -- ^ 'plrudfgPayload'
+    -> ProjectsLocationsRegistriesUnbindDeviceFromGateway
+projectsLocationsRegistriesUnbindDeviceFromGateway pPlrudfgParent_ pPlrudfgPayload_ =
+    ProjectsLocationsRegistriesUnbindDeviceFromGateway'
+    { _plrudfgParent = pPlrudfgParent_
+    , _plrudfgXgafv = Nothing
+    , _plrudfgUploadProtocol = Nothing
+    , _plrudfgAccessToken = Nothing
+    , _plrudfgUploadType = Nothing
+    , _plrudfgPayload = pPlrudfgPayload_
+    , _plrudfgCallback = Nothing
+    }
+
+-- | The name of the registry. For example,
+-- \`projects\/example-project\/locations\/us-central1\/registries\/my-registry\`.
+plrudfgParent :: Lens' ProjectsLocationsRegistriesUnbindDeviceFromGateway Text
+plrudfgParent
+  = lens _plrudfgParent
+      (\ s a -> s{_plrudfgParent = a})
+
+-- | V1 error format.
+plrudfgXgafv :: Lens' ProjectsLocationsRegistriesUnbindDeviceFromGateway (Maybe Xgafv)
+plrudfgXgafv
+  = lens _plrudfgXgafv (\ s a -> s{_plrudfgXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+plrudfgUploadProtocol :: Lens' ProjectsLocationsRegistriesUnbindDeviceFromGateway (Maybe Text)
+plrudfgUploadProtocol
+  = lens _plrudfgUploadProtocol
+      (\ s a -> s{_plrudfgUploadProtocol = a})
+
+-- | OAuth access token.
+plrudfgAccessToken :: Lens' ProjectsLocationsRegistriesUnbindDeviceFromGateway (Maybe Text)
+plrudfgAccessToken
+  = lens _plrudfgAccessToken
+      (\ s a -> s{_plrudfgAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+plrudfgUploadType :: Lens' ProjectsLocationsRegistriesUnbindDeviceFromGateway (Maybe Text)
+plrudfgUploadType
+  = lens _plrudfgUploadType
+      (\ s a -> s{_plrudfgUploadType = a})
+
+-- | Multipart request metadata.
+plrudfgPayload :: Lens' ProjectsLocationsRegistriesUnbindDeviceFromGateway UnbindDeviceFromGatewayRequest
+plrudfgPayload
+  = lens _plrudfgPayload
+      (\ s a -> s{_plrudfgPayload = a})
+
+-- | JSONP
+plrudfgCallback :: Lens' ProjectsLocationsRegistriesUnbindDeviceFromGateway (Maybe Text)
+plrudfgCallback
+  = lens _plrudfgCallback
+      (\ s a -> s{_plrudfgCallback = a})
+
+instance GoogleRequest
+         ProjectsLocationsRegistriesUnbindDeviceFromGateway
+         where
+        type Rs
+               ProjectsLocationsRegistriesUnbindDeviceFromGateway
+             = UnbindDeviceFromGatewayResponse
+        type Scopes
+               ProjectsLocationsRegistriesUnbindDeviceFromGateway
+             =
+             '["https://www.googleapis.com/auth/cloud-platform",
+               "https://www.googleapis.com/auth/cloudiot"]
+        requestClient
+          ProjectsLocationsRegistriesUnbindDeviceFromGateway'{..}
+          = go _plrudfgParent _plrudfgXgafv
+              _plrudfgUploadProtocol
+              _plrudfgAccessToken
+              _plrudfgUploadType
+              _plrudfgCallback
+              (Just AltJSON)
+              _plrudfgPayload
+              cloudIOTService
+          where go
+                  = buildClient
+                      (Proxy ::
+                         Proxy
+                           ProjectsLocationsRegistriesUnbindDeviceFromGatewayResource)
+                      mempty
diff --git a/gogol-cloudiot.cabal b/gogol-cloudiot.cabal
new file mode 100644
--- /dev/null
+++ b/gogol-cloudiot.cabal
@@ -0,0 +1,77 @@
+name:                  gogol-cloudiot
+version:               0.4.0
+synopsis:              Google Cloud IoT SDK.
+homepage:              https://github.com/brendanhay/gogol
+bug-reports:           https://github.com/brendanhay/gogol/issues
+license:               OtherLicense
+license-file:          LICENSE
+author:                Brendan Hay
+maintainer:            Brendan Hay <brendan.g.hay@gmail.com>
+copyright:             Copyright (c) 2015-2016 Brendan Hay
+category:              Network, Google, Cloud
+build-type:            Simple
+cabal-version:         >= 1.10
+extra-source-files:    README.md src/.gitkeep
+
+description:
+    Registers and manages IoT (Internet of Things) devices that connect to
+    the Google Cloud Platform.
+    .
+    /Warning:/ This is an experimental prototype/preview release which is still
+    under exploratory development and not intended for public use, caveat emptor!
+    .
+    This library is compatible with version @v1@
+    of the API.
+
+source-repository head
+    type:     git
+    location: git://github.com/brendanhay/gogol.git
+
+library
+    default-language:  Haskell2010
+    hs-source-dirs:    src gen
+
+    ghc-options:       -Wall
+
+    exposed-modules:
+          Network.Google.CloudIOT
+        , Network.Google.CloudIOT.Types
+        , Network.Google.Resource.CloudIOT.Projects.Locations.Registries.BindDeviceToGateway
+        , Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Create
+        , Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Delete
+        , Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Devices.ConfigVersions.List
+        , Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Devices.Create
+        , Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Devices.Delete
+        , Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Devices.Get
+        , Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Devices.List
+        , Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Devices.ModifyCloudToDeviceConfig
+        , Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Devices.Patch
+        , Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Devices.SendCommandToDevice
+        , Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Devices.States.List
+        , Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Get
+        , Network.Google.Resource.CloudIOT.Projects.Locations.Registries.GetIAMPolicy
+        , Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.BindDeviceToGateway
+        , Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.Devices.ConfigVersions.List
+        , Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.Devices.Get
+        , Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.Devices.List
+        , Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.Devices.ModifyCloudToDeviceConfig
+        , Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.Devices.Patch
+        , Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.Devices.SendCommandToDevice
+        , Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.Devices.States.List
+        , Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.GetIAMPolicy
+        , Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.SetIAMPolicy
+        , Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.TestIAMPermissions
+        , Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Groups.UnbindDeviceFromGateway
+        , Network.Google.Resource.CloudIOT.Projects.Locations.Registries.List
+        , Network.Google.Resource.CloudIOT.Projects.Locations.Registries.Patch
+        , Network.Google.Resource.CloudIOT.Projects.Locations.Registries.SetIAMPolicy
+        , Network.Google.Resource.CloudIOT.Projects.Locations.Registries.TestIAMPermissions
+        , Network.Google.Resource.CloudIOT.Projects.Locations.Registries.UnbindDeviceFromGateway
+
+    other-modules:
+          Network.Google.CloudIOT.Types.Product
+        , Network.Google.CloudIOT.Types.Sum
+
+    build-depends:
+          gogol-core == 0.4.0.*
+        , base       >= 4.7 && < 5
diff --git a/src/.gitkeep b/src/.gitkeep
new file mode 100644
--- /dev/null
+++ b/src/.gitkeep
