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-chat
+
+* [Version](#version)
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+
+## Version
+
+`0.3.0`
+
+
+## Description
+
+A client library for the Google Hangouts Chat.
+
+
+## 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-chat` 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/Chat.hs b/gen/Network/Google/Chat.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Chat.hs
@@ -0,0 +1,308 @@
+{-# LANGUAGE DataKinds         #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE TypeOperators     #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+
+-- |
+-- Module      : Network.Google.Chat
+-- 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)
+--
+-- Enables bots to fetch information and perform actions in Hangouts Chat.
+--
+-- /See:/ <https://developers.google.com/hangouts/chat Hangouts Chat API Reference>
+module Network.Google.Chat
+    (
+    -- * Service Configuration
+      chatService
+
+    -- * API Declaration
+    , ChatAPI
+
+    -- * Resources
+
+    -- ** chat.spaces.get
+    , module Network.Google.Resource.Chat.Spaces.Get
+
+    -- ** chat.spaces.list
+    , module Network.Google.Resource.Chat.Spaces.List
+
+    -- ** chat.spaces.members.get
+    , module Network.Google.Resource.Chat.Spaces.Members.Get
+
+    -- ** chat.spaces.members.list
+    , module Network.Google.Resource.Chat.Spaces.Members.List
+
+    -- ** chat.spaces.messages.create
+    , module Network.Google.Resource.Chat.Spaces.Messages.Create
+
+    -- ** chat.spaces.messages.delete
+    , module Network.Google.Resource.Chat.Spaces.Messages.Delete
+
+    -- ** chat.spaces.messages.get
+    , module Network.Google.Resource.Chat.Spaces.Messages.Get
+
+    -- ** chat.spaces.messages.update
+    , module Network.Google.Resource.Chat.Spaces.Messages.Update
+
+    -- * Types
+
+    -- ** Card
+    , Card
+    , card
+    , cCardActions
+    , cName
+    , cHeader
+    , cSections
+
+    -- ** Space
+    , Space
+    , space
+    , sName
+    , sDisplayName
+    , sType
+
+    -- ** KeyValue
+    , KeyValue
+    , keyValue
+    , kvOnClick
+    , kvTopLabel
+    , kvIcon
+    , kvButton
+    , kvContent
+    , kvIconURL
+    , kvContentMultiline
+    , kvBottomLabel
+
+    -- ** WidgetMarkup
+    , WidgetMarkup
+    , widgetMarkup
+    , wmKeyValue
+    , wmImage
+    , wmButtons
+    , wmTextParagraph
+
+    -- ** OnClick
+    , OnClick
+    , onClick
+    , ocAction
+    , ocOpenLink
+
+    -- ** Annotation
+    , Annotation
+    , annotation
+    , aLength
+    , aType
+    , aUserMention
+    , aStartIndex
+
+    -- ** Image
+    , Image
+    , image
+    , iOnClick
+    , iAspectRatio
+    , iImageURL
+
+    -- ** KeyValueIcon
+    , KeyValueIcon (..)
+
+    -- ** ActionParameter
+    , ActionParameter
+    , actionParameter
+    , apValue
+    , apKey
+
+    -- ** Membership
+    , Membership
+    , membership
+    , mState
+    , mName
+    , mMember
+    , mCreateTime
+
+    -- ** ActionResponseType
+    , ActionResponseType (..)
+
+    -- ** Empty
+    , Empty
+    , empty
+
+    -- ** DeprecatedEvent
+    , DeprecatedEvent
+    , deprecatedEvent
+    , deSpace
+    , deToken
+    , deAction
+    , deEventTime
+    , deUser
+    , deConfigCompleteRedirectURL
+    , deType
+    , deMessage
+    , deThreadKey
+
+    -- ** MembershipState
+    , MembershipState (..)
+
+    -- ** CardHeaderImageStyle
+    , CardHeaderImageStyle (..)
+
+    -- ** TextParagraph
+    , TextParagraph
+    , textParagraph
+    , tpText
+
+    -- ** Button
+    , Button
+    , button
+    , bTextButton
+    , bImageButton
+
+    -- ** UserMentionMetadataType
+    , UserMentionMetadataType (..)
+
+    -- ** ListSpacesResponse
+    , ListSpacesResponse
+    , listSpacesResponse
+    , lsrNextPageToken
+    , lsrSpaces
+
+    -- ** User
+    , User
+    , user
+    , uName
+    , uDisplayName
+    , uType
+
+    -- ** SpaceType
+    , SpaceType (..)
+
+    -- ** OpenLink
+    , OpenLink
+    , openLink
+    , olURL
+
+    -- ** AnnotationType
+    , AnnotationType (..)
+
+    -- ** ImageButtonIcon
+    , ImageButtonIcon (..)
+
+    -- ** CardAction
+    , CardAction
+    , cardAction
+    , caOnClick
+    , caActionLabel
+
+    -- ** Xgafv
+    , Xgafv (..)
+
+    -- ** DeprecatedEventType
+    , DeprecatedEventType (..)
+
+    -- ** ActionResponse
+    , ActionResponse
+    , actionResponse
+    , arURL
+    , arType
+
+    -- ** FormAction
+    , FormAction
+    , formAction
+    , faActionMethodName
+    , faParameters
+
+    -- ** ListMembershipsResponse
+    , ListMembershipsResponse
+    , listMembershipsResponse
+    , lmrNextPageToken
+    , lmrMemberships
+
+    -- ** Message
+    , Message
+    , message
+    , mesAnnotations
+    , mesSpace
+    , mesText
+    , mesSender
+    , mesName
+    , mesPreviewText
+    , mesCards
+    , mesActionResponse
+    , mesArgumentText
+    , mesThread
+    , mesFallbackText
+    , mesCreateTime
+
+    -- ** CardHeader
+    , CardHeader
+    , cardHeader
+    , chSubtitle
+    , chImageURL
+    , chTitle
+    , chImageStyle
+
+    -- ** TextButton
+    , TextButton
+    , textButton
+    , tbOnClick
+    , tbText
+
+    -- ** Thread
+    , Thread
+    , thread
+    , tName
+
+    -- ** UserMentionMetadata
+    , UserMentionMetadata
+    , userMentionMetadata
+    , ummUser
+    , ummType
+
+    -- ** ImageButton
+    , ImageButton
+    , imageButton
+    , ibOnClick
+    , ibIcon
+    , ibName
+    , ibIconURL
+
+    -- ** Section
+    , Section
+    , section
+    , sWidgets
+    , sHeader
+
+    -- ** UserType
+    , UserType (..)
+    ) where
+
+import           Network.Google.Chat.Types
+import           Network.Google.Prelude
+import           Network.Google.Resource.Chat.Spaces.Get
+import           Network.Google.Resource.Chat.Spaces.List
+import           Network.Google.Resource.Chat.Spaces.Members.Get
+import           Network.Google.Resource.Chat.Spaces.Members.List
+import           Network.Google.Resource.Chat.Spaces.Messages.Create
+import           Network.Google.Resource.Chat.Spaces.Messages.Delete
+import           Network.Google.Resource.Chat.Spaces.Messages.Get
+import           Network.Google.Resource.Chat.Spaces.Messages.Update
+
+{- $resources
+TODO
+-}
+
+-- | Represents the entirety of the methods and resources available for the Hangouts Chat API service.
+type ChatAPI =
+     SpacesMembersListResource :<|>
+       SpacesMembersGetResource
+       :<|> SpacesMessagesGetResource
+       :<|> SpacesMessagesCreateResource
+       :<|> SpacesMessagesDeleteResource
+       :<|> SpacesMessagesUpdateResource
+       :<|> SpacesListResource
+       :<|> SpacesGetResource
diff --git a/gen/Network/Google/Chat/Types.hs b/gen/Network/Google/Chat/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Chat/Types.hs
@@ -0,0 +1,259 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Network.Google.Chat.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.Chat.Types
+    (
+    -- * Service Configuration
+      chatService
+
+    -- * Card
+    , Card
+    , card
+    , cCardActions
+    , cName
+    , cHeader
+    , cSections
+
+    -- * Space
+    , Space
+    , space
+    , sName
+    , sDisplayName
+    , sType
+
+    -- * KeyValue
+    , KeyValue
+    , keyValue
+    , kvOnClick
+    , kvTopLabel
+    , kvIcon
+    , kvButton
+    , kvContent
+    , kvIconURL
+    , kvContentMultiline
+    , kvBottomLabel
+
+    -- * WidgetMarkup
+    , WidgetMarkup
+    , widgetMarkup
+    , wmKeyValue
+    , wmImage
+    , wmButtons
+    , wmTextParagraph
+
+    -- * OnClick
+    , OnClick
+    , onClick
+    , ocAction
+    , ocOpenLink
+
+    -- * Annotation
+    , Annotation
+    , annotation
+    , aLength
+    , aType
+    , aUserMention
+    , aStartIndex
+
+    -- * Image
+    , Image
+    , image
+    , iOnClick
+    , iAspectRatio
+    , iImageURL
+
+    -- * KeyValueIcon
+    , KeyValueIcon (..)
+
+    -- * ActionParameter
+    , ActionParameter
+    , actionParameter
+    , apValue
+    , apKey
+
+    -- * Membership
+    , Membership
+    , membership
+    , mState
+    , mName
+    , mMember
+    , mCreateTime
+
+    -- * ActionResponseType
+    , ActionResponseType (..)
+
+    -- * Empty
+    , Empty
+    , empty
+
+    -- * DeprecatedEvent
+    , DeprecatedEvent
+    , deprecatedEvent
+    , deSpace
+    , deToken
+    , deAction
+    , deEventTime
+    , deUser
+    , deConfigCompleteRedirectURL
+    , deType
+    , deMessage
+    , deThreadKey
+
+    -- * MembershipState
+    , MembershipState (..)
+
+    -- * CardHeaderImageStyle
+    , CardHeaderImageStyle (..)
+
+    -- * TextParagraph
+    , TextParagraph
+    , textParagraph
+    , tpText
+
+    -- * Button
+    , Button
+    , button
+    , bTextButton
+    , bImageButton
+
+    -- * UserMentionMetadataType
+    , UserMentionMetadataType (..)
+
+    -- * ListSpacesResponse
+    , ListSpacesResponse
+    , listSpacesResponse
+    , lsrNextPageToken
+    , lsrSpaces
+
+    -- * User
+    , User
+    , user
+    , uName
+    , uDisplayName
+    , uType
+
+    -- * SpaceType
+    , SpaceType (..)
+
+    -- * OpenLink
+    , OpenLink
+    , openLink
+    , olURL
+
+    -- * AnnotationType
+    , AnnotationType (..)
+
+    -- * ImageButtonIcon
+    , ImageButtonIcon (..)
+
+    -- * CardAction
+    , CardAction
+    , cardAction
+    , caOnClick
+    , caActionLabel
+
+    -- * Xgafv
+    , Xgafv (..)
+
+    -- * DeprecatedEventType
+    , DeprecatedEventType (..)
+
+    -- * ActionResponse
+    , ActionResponse
+    , actionResponse
+    , arURL
+    , arType
+
+    -- * FormAction
+    , FormAction
+    , formAction
+    , faActionMethodName
+    , faParameters
+
+    -- * ListMembershipsResponse
+    , ListMembershipsResponse
+    , listMembershipsResponse
+    , lmrNextPageToken
+    , lmrMemberships
+
+    -- * Message
+    , Message
+    , message
+    , mesAnnotations
+    , mesSpace
+    , mesText
+    , mesSender
+    , mesName
+    , mesPreviewText
+    , mesCards
+    , mesActionResponse
+    , mesArgumentText
+    , mesThread
+    , mesFallbackText
+    , mesCreateTime
+
+    -- * CardHeader
+    , CardHeader
+    , cardHeader
+    , chSubtitle
+    , chImageURL
+    , chTitle
+    , chImageStyle
+
+    -- * TextButton
+    , TextButton
+    , textButton
+    , tbOnClick
+    , tbText
+
+    -- * Thread
+    , Thread
+    , thread
+    , tName
+
+    -- * UserMentionMetadata
+    , UserMentionMetadata
+    , userMentionMetadata
+    , ummUser
+    , ummType
+
+    -- * ImageButton
+    , ImageButton
+    , imageButton
+    , ibOnClick
+    , ibIcon
+    , ibName
+    , ibIconURL
+
+    -- * Section
+    , Section
+    , section
+    , sWidgets
+    , sHeader
+
+    -- * UserType
+    , UserType (..)
+    ) where
+
+import           Network.Google.Chat.Types.Product
+import           Network.Google.Chat.Types.Sum
+import           Network.Google.Prelude
+
+-- | Default request referring to version 'v1' of the Hangouts Chat API. This contains the host and root path used as a starting point for constructing service requests.
+chatService :: ServiceConfig
+chatService
+  = defaultService (ServiceId "chat:v1")
+      "chat.googleapis.com"
diff --git a/gen/Network/Google/Chat/Types/Product.hs b/gen/Network/Google/Chat/Types/Product.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Chat/Types/Product.hs
@@ -0,0 +1,1688 @@
+{-# 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.Chat.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.Chat.Types.Product where
+
+import           Network.Google.Chat.Types.Sum
+import           Network.Google.Prelude
+
+-- | A card is a UI element that can contain UI widgets such as texts,
+-- images.
+--
+-- /See:/ 'card' smart constructor.
+data Card = Card'
+    { _cCardActions :: !(Maybe [CardAction])
+    , _cName        :: !(Maybe Text)
+    , _cHeader      :: !(Maybe CardHeader)
+    , _cSections    :: !(Maybe [Section])
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Card' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cCardActions'
+--
+-- * 'cName'
+--
+-- * 'cHeader'
+--
+-- * 'cSections'
+card
+    :: Card
+card =
+    Card'
+    { _cCardActions = Nothing
+    , _cName = Nothing
+    , _cHeader = Nothing
+    , _cSections = Nothing
+    }
+
+-- | The actions of this card.
+cCardActions :: Lens' Card [CardAction]
+cCardActions
+  = lens _cCardActions (\ s a -> s{_cCardActions = a})
+      . _Default
+      . _Coerce
+
+-- | Name of the card.
+cName :: Lens' Card (Maybe Text)
+cName = lens _cName (\ s a -> s{_cName = a})
+
+-- | The header of the card. A header usually contains a title and an image.
+cHeader :: Lens' Card (Maybe CardHeader)
+cHeader = lens _cHeader (\ s a -> s{_cHeader = a})
+
+-- | Sections are separated by a line divider.
+cSections :: Lens' Card [Section]
+cSections
+  = lens _cSections (\ s a -> s{_cSections = a}) .
+      _Default
+      . _Coerce
+
+instance FromJSON Card where
+        parseJSON
+          = withObject "Card"
+              (\ o ->
+                 Card' <$>
+                   (o .:? "cardActions" .!= mempty) <*> (o .:? "name")
+                     <*> (o .:? "header")
+                     <*> (o .:? "sections" .!= mempty))
+
+instance ToJSON Card where
+        toJSON Card'{..}
+          = object
+              (catMaybes
+                 [("cardActions" .=) <$> _cCardActions,
+                  ("name" .=) <$> _cName, ("header" .=) <$> _cHeader,
+                  ("sections" .=) <$> _cSections])
+
+-- | A room or DM in Hangouts Chat.
+--
+-- /See:/ 'space' smart constructor.
+data Space = Space'
+    { _sName        :: !(Maybe Text)
+    , _sDisplayName :: !(Maybe Text)
+    , _sType        :: !(Maybe SpaceType)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Space' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sName'
+--
+-- * 'sDisplayName'
+--
+-- * 'sType'
+space
+    :: Space
+space =
+    Space'
+    { _sName = Nothing
+    , _sDisplayName = Nothing
+    , _sType = Nothing
+    }
+
+-- | Resource name of the space, in the form \"spaces\/*\". Example:
+-- spaces\/AAAAMpdlehYs
+sName :: Lens' Space (Maybe Text)
+sName = lens _sName (\ s a -> s{_sName = a})
+
+-- | Output only. The display name (only if the space is a room).
+sDisplayName :: Lens' Space (Maybe Text)
+sDisplayName
+  = lens _sDisplayName (\ s a -> s{_sDisplayName = a})
+
+-- | Output only. The type of a space.
+sType :: Lens' Space (Maybe SpaceType)
+sType = lens _sType (\ s a -> s{_sType = a})
+
+instance FromJSON Space where
+        parseJSON
+          = withObject "Space"
+              (\ o ->
+                 Space' <$>
+                   (o .:? "name") <*> (o .:? "displayName") <*>
+                     (o .:? "type"))
+
+instance ToJSON Space where
+        toJSON Space'{..}
+          = object
+              (catMaybes
+                 [("name" .=) <$> _sName,
+                  ("displayName" .=) <$> _sDisplayName,
+                  ("type" .=) <$> _sType])
+
+-- | A UI element contains a key (label) and a value (content). And this
+-- element may also contain some actions such as onclick button.
+--
+-- /See:/ 'keyValue' smart constructor.
+data KeyValue = KeyValue'
+    { _kvOnClick          :: !(Maybe OnClick)
+    , _kvTopLabel         :: !(Maybe Text)
+    , _kvIcon             :: !(Maybe KeyValueIcon)
+    , _kvButton           :: !(Maybe Button)
+    , _kvContent          :: !(Maybe Text)
+    , _kvIconURL          :: !(Maybe Text)
+    , _kvContentMultiline :: !(Maybe Bool)
+    , _kvBottomLabel      :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'KeyValue' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'kvOnClick'
+--
+-- * 'kvTopLabel'
+--
+-- * 'kvIcon'
+--
+-- * 'kvButton'
+--
+-- * 'kvContent'
+--
+-- * 'kvIconURL'
+--
+-- * 'kvContentMultiline'
+--
+-- * 'kvBottomLabel'
+keyValue
+    :: KeyValue
+keyValue =
+    KeyValue'
+    { _kvOnClick = Nothing
+    , _kvTopLabel = Nothing
+    , _kvIcon = Nothing
+    , _kvButton = Nothing
+    , _kvContent = Nothing
+    , _kvIconURL = Nothing
+    , _kvContentMultiline = Nothing
+    , _kvBottomLabel = Nothing
+    }
+
+-- | The onclick action. Only the top label, bottom label and content region
+-- are clickable.
+kvOnClick :: Lens' KeyValue (Maybe OnClick)
+kvOnClick
+  = lens _kvOnClick (\ s a -> s{_kvOnClick = a})
+
+-- | The text of the top label. Formatted text supported.
+kvTopLabel :: Lens' KeyValue (Maybe Text)
+kvTopLabel
+  = lens _kvTopLabel (\ s a -> s{_kvTopLabel = a})
+
+-- | An enum value that will be replaced by the Chat API with the
+-- corresponding icon image.
+kvIcon :: Lens' KeyValue (Maybe KeyValueIcon)
+kvIcon = lens _kvIcon (\ s a -> s{_kvIcon = a})
+
+-- | A button that can be clicked to trigger an action.
+kvButton :: Lens' KeyValue (Maybe Button)
+kvButton = lens _kvButton (\ s a -> s{_kvButton = a})
+
+-- | The text of the content. Formatted text supported and always required.
+kvContent :: Lens' KeyValue (Maybe Text)
+kvContent
+  = lens _kvContent (\ s a -> s{_kvContent = a})
+
+-- | The icon specified by a URL.
+kvIconURL :: Lens' KeyValue (Maybe Text)
+kvIconURL
+  = lens _kvIconURL (\ s a -> s{_kvIconURL = a})
+
+-- | If the content should be multiline.
+kvContentMultiline :: Lens' KeyValue (Maybe Bool)
+kvContentMultiline
+  = lens _kvContentMultiline
+      (\ s a -> s{_kvContentMultiline = a})
+
+-- | The text of the bottom label. Formatted text supported.
+kvBottomLabel :: Lens' KeyValue (Maybe Text)
+kvBottomLabel
+  = lens _kvBottomLabel
+      (\ s a -> s{_kvBottomLabel = a})
+
+instance FromJSON KeyValue where
+        parseJSON
+          = withObject "KeyValue"
+              (\ o ->
+                 KeyValue' <$>
+                   (o .:? "onClick") <*> (o .:? "topLabel") <*>
+                     (o .:? "icon")
+                     <*> (o .:? "button")
+                     <*> (o .:? "content")
+                     <*> (o .:? "iconUrl")
+                     <*> (o .:? "contentMultiline")
+                     <*> (o .:? "bottomLabel"))
+
+instance ToJSON KeyValue where
+        toJSON KeyValue'{..}
+          = object
+              (catMaybes
+                 [("onClick" .=) <$> _kvOnClick,
+                  ("topLabel" .=) <$> _kvTopLabel,
+                  ("icon" .=) <$> _kvIcon, ("button" .=) <$> _kvButton,
+                  ("content" .=) <$> _kvContent,
+                  ("iconUrl" .=) <$> _kvIconURL,
+                  ("contentMultiline" .=) <$> _kvContentMultiline,
+                  ("bottomLabel" .=) <$> _kvBottomLabel])
+
+-- | A widget is a UI element that presents texts, images, etc.
+--
+-- /See:/ 'widgetMarkup' smart constructor.
+data WidgetMarkup = WidgetMarkup'
+    { _wmKeyValue      :: !(Maybe KeyValue)
+    , _wmImage         :: !(Maybe Image)
+    , _wmButtons       :: !(Maybe [Button])
+    , _wmTextParagraph :: !(Maybe TextParagraph)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'WidgetMarkup' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'wmKeyValue'
+--
+-- * 'wmImage'
+--
+-- * 'wmButtons'
+--
+-- * 'wmTextParagraph'
+widgetMarkup
+    :: WidgetMarkup
+widgetMarkup =
+    WidgetMarkup'
+    { _wmKeyValue = Nothing
+    , _wmImage = Nothing
+    , _wmButtons = Nothing
+    , _wmTextParagraph = Nothing
+    }
+
+-- | Display a key value item in this widget.
+wmKeyValue :: Lens' WidgetMarkup (Maybe KeyValue)
+wmKeyValue
+  = lens _wmKeyValue (\ s a -> s{_wmKeyValue = a})
+
+-- | Display an image in this widget.
+wmImage :: Lens' WidgetMarkup (Maybe Image)
+wmImage = lens _wmImage (\ s a -> s{_wmImage = a})
+
+-- | A list of buttons. Buttons is also oneof data and only one of these
+-- fields should be set.
+wmButtons :: Lens' WidgetMarkup [Button]
+wmButtons
+  = lens _wmButtons (\ s a -> s{_wmButtons = a}) .
+      _Default
+      . _Coerce
+
+-- | Display a text paragraph in this widget.
+wmTextParagraph :: Lens' WidgetMarkup (Maybe TextParagraph)
+wmTextParagraph
+  = lens _wmTextParagraph
+      (\ s a -> s{_wmTextParagraph = a})
+
+instance FromJSON WidgetMarkup where
+        parseJSON
+          = withObject "WidgetMarkup"
+              (\ o ->
+                 WidgetMarkup' <$>
+                   (o .:? "keyValue") <*> (o .:? "image") <*>
+                     (o .:? "buttons" .!= mempty)
+                     <*> (o .:? "textParagraph"))
+
+instance ToJSON WidgetMarkup where
+        toJSON WidgetMarkup'{..}
+          = object
+              (catMaybes
+                 [("keyValue" .=) <$> _wmKeyValue,
+                  ("image" .=) <$> _wmImage,
+                  ("buttons" .=) <$> _wmButtons,
+                  ("textParagraph" .=) <$> _wmTextParagraph])
+
+-- | An onclick action (e.g. open a link).
+--
+-- /See:/ 'onClick' smart constructor.
+data OnClick = OnClick'
+    { _ocAction   :: !(Maybe FormAction)
+    , _ocOpenLink :: !(Maybe OpenLink)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'OnClick' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ocAction'
+--
+-- * 'ocOpenLink'
+onClick
+    :: OnClick
+onClick =
+    OnClick'
+    { _ocAction = Nothing
+    , _ocOpenLink = Nothing
+    }
+
+-- | A form action will be trigger by this onclick if specified.
+ocAction :: Lens' OnClick (Maybe FormAction)
+ocAction = lens _ocAction (\ s a -> s{_ocAction = a})
+
+-- | This onclick triggers an open link action if specified.
+ocOpenLink :: Lens' OnClick (Maybe OpenLink)
+ocOpenLink
+  = lens _ocOpenLink (\ s a -> s{_ocOpenLink = a})
+
+instance FromJSON OnClick where
+        parseJSON
+          = withObject "OnClick"
+              (\ o ->
+                 OnClick' <$> (o .:? "action") <*> (o .:? "openLink"))
+
+instance ToJSON OnClick where
+        toJSON OnClick'{..}
+          = object
+              (catMaybes
+                 [("action" .=) <$> _ocAction,
+                  ("openLink" .=) <$> _ocOpenLink])
+
+-- | Annotations associated with the plain-text body of the message. Example
+-- plain-text message body: \`\`\` Hello \'FooBot how are you!\" \`\`\` The
+-- corresponding annotations metadata: \`\`\` \"annotations\":[{
+-- \"type\":\"USER_MENTION\", \"startIndex\":6, \"length\":7,
+-- \"userMention\": { \"user\": {
+-- \"name\":\"users\/107946847022116401880\", \"displayName\":\"FooBot\",
+-- \"avatarUrl\":\"https:\/\/goo.gl\/aeDtrS\", \"type\":\"BOT\" },
+-- \"type\":\"MENTION\" } }] \`\`\`
+--
+-- /See:/ 'annotation' smart constructor.
+data Annotation = Annotation'
+    { _aLength      :: !(Maybe (Textual Int32))
+    , _aType        :: !(Maybe AnnotationType)
+    , _aUserMention :: !(Maybe UserMentionMetadata)
+    , _aStartIndex  :: !(Maybe (Textual Int32))
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Annotation' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'aLength'
+--
+-- * 'aType'
+--
+-- * 'aUserMention'
+--
+-- * 'aStartIndex'
+annotation
+    :: Annotation
+annotation =
+    Annotation'
+    { _aLength = Nothing
+    , _aType = Nothing
+    , _aUserMention = Nothing
+    , _aStartIndex = Nothing
+    }
+
+-- | Length of the substring in the plain-text message body this annotation
+-- corresponds to.
+aLength :: Lens' Annotation (Maybe Int32)
+aLength
+  = lens _aLength (\ s a -> s{_aLength = a}) .
+      mapping _Coerce
+
+-- | The type of this annotation.
+aType :: Lens' Annotation (Maybe AnnotationType)
+aType = lens _aType (\ s a -> s{_aType = a})
+
+-- | The metadata of user mention.
+aUserMention :: Lens' Annotation (Maybe UserMentionMetadata)
+aUserMention
+  = lens _aUserMention (\ s a -> s{_aUserMention = a})
+
+-- | Start index (0-based, inclusive) in the plain-text message body this
+-- annotation corresponds to.
+aStartIndex :: Lens' Annotation (Maybe Int32)
+aStartIndex
+  = lens _aStartIndex (\ s a -> s{_aStartIndex = a}) .
+      mapping _Coerce
+
+instance FromJSON Annotation where
+        parseJSON
+          = withObject "Annotation"
+              (\ o ->
+                 Annotation' <$>
+                   (o .:? "length") <*> (o .:? "type") <*>
+                     (o .:? "userMention")
+                     <*> (o .:? "startIndex"))
+
+instance ToJSON Annotation where
+        toJSON Annotation'{..}
+          = object
+              (catMaybes
+                 [("length" .=) <$> _aLength, ("type" .=) <$> _aType,
+                  ("userMention" .=) <$> _aUserMention,
+                  ("startIndex" .=) <$> _aStartIndex])
+
+-- | An image that is specified by a URL and can have an onclick action.
+--
+-- /See:/ 'image' smart constructor.
+data Image = Image'
+    { _iOnClick     :: !(Maybe OnClick)
+    , _iAspectRatio :: !(Maybe (Textual Double))
+    , _iImageURL    :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Image' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'iOnClick'
+--
+-- * 'iAspectRatio'
+--
+-- * 'iImageURL'
+image
+    :: Image
+image =
+    Image'
+    { _iOnClick = Nothing
+    , _iAspectRatio = Nothing
+    , _iImageURL = Nothing
+    }
+
+-- | The onclick action.
+iOnClick :: Lens' Image (Maybe OnClick)
+iOnClick = lens _iOnClick (\ s a -> s{_iOnClick = a})
+
+-- | The aspect ratio of this image (width\/height).
+iAspectRatio :: Lens' Image (Maybe Double)
+iAspectRatio
+  = lens _iAspectRatio (\ s a -> s{_iAspectRatio = a})
+      . mapping _Coerce
+
+-- | The URL of the image.
+iImageURL :: Lens' Image (Maybe Text)
+iImageURL
+  = lens _iImageURL (\ s a -> s{_iImageURL = a})
+
+instance FromJSON Image where
+        parseJSON
+          = withObject "Image"
+              (\ o ->
+                 Image' <$>
+                   (o .:? "onClick") <*> (o .:? "aspectRatio") <*>
+                     (o .:? "imageUrl"))
+
+instance ToJSON Image where
+        toJSON Image'{..}
+          = object
+              (catMaybes
+                 [("onClick" .=) <$> _iOnClick,
+                  ("aspectRatio" .=) <$> _iAspectRatio,
+                  ("imageUrl" .=) <$> _iImageURL])
+
+-- | List of string parameters to supply when the action method is invoked.
+-- For example, consider three snooze buttons: snooze now, snooze 1 day,
+-- snooze next week. You might use action method = snooze(), passing the
+-- snooze type and snooze time in the list of string parameters.
+--
+-- /See:/ 'actionParameter' smart constructor.
+data ActionParameter = ActionParameter'
+    { _apValue :: !(Maybe Text)
+    , _apKey   :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ActionParameter' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'apValue'
+--
+-- * 'apKey'
+actionParameter
+    :: ActionParameter
+actionParameter =
+    ActionParameter'
+    { _apValue = Nothing
+    , _apKey = Nothing
+    }
+
+-- | The value of the parameter.
+apValue :: Lens' ActionParameter (Maybe Text)
+apValue = lens _apValue (\ s a -> s{_apValue = a})
+
+-- | The name of the parameter for the action script.
+apKey :: Lens' ActionParameter (Maybe Text)
+apKey = lens _apKey (\ s a -> s{_apKey = a})
+
+instance FromJSON ActionParameter where
+        parseJSON
+          = withObject "ActionParameter"
+              (\ o ->
+                 ActionParameter' <$>
+                   (o .:? "value") <*> (o .:? "key"))
+
+instance ToJSON ActionParameter where
+        toJSON ActionParameter'{..}
+          = object
+              (catMaybes
+                 [("value" .=) <$> _apValue, ("key" .=) <$> _apKey])
+
+-- | Represents a membership relation in Hangouts Chat.
+--
+-- /See:/ 'membership' smart constructor.
+data Membership = Membership'
+    { _mState      :: !(Maybe MembershipState)
+    , _mName       :: !(Maybe Text)
+    , _mMember     :: !(Maybe User)
+    , _mCreateTime :: !(Maybe DateTime')
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Membership' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'mState'
+--
+-- * 'mName'
+--
+-- * 'mMember'
+--
+-- * 'mCreateTime'
+membership
+    :: Membership
+membership =
+    Membership'
+    { _mState = Nothing
+    , _mName = Nothing
+    , _mMember = Nothing
+    , _mCreateTime = Nothing
+    }
+
+-- | State of the membership.
+mState :: Lens' Membership (Maybe MembershipState)
+mState = lens _mState (\ s a -> s{_mState = a})
+
+-- | Resource name of the membership, in the form \"spaces\/*\/members\/*\".
+-- Example: spaces\/AAAAMpdlehY\/members\/105115627578887013105
+mName :: Lens' Membership (Maybe Text)
+mName = lens _mName (\ s a -> s{_mName = a})
+
+-- | Member details.
+mMember :: Lens' Membership (Maybe User)
+mMember = lens _mMember (\ s a -> s{_mMember = a})
+
+-- | The creation time of the membership a.k.a the time at which the member
+-- joined the space, if applicable.
+mCreateTime :: Lens' Membership (Maybe UTCTime)
+mCreateTime
+  = lens _mCreateTime (\ s a -> s{_mCreateTime = a}) .
+      mapping _DateTime
+
+instance FromJSON Membership where
+        parseJSON
+          = withObject "Membership"
+              (\ o ->
+                 Membership' <$>
+                   (o .:? "state") <*> (o .:? "name") <*>
+                     (o .:? "member")
+                     <*> (o .:? "createTime"))
+
+instance ToJSON Membership where
+        toJSON Membership'{..}
+          = object
+              (catMaybes
+                 [("state" .=) <$> _mState, ("name" .=) <$> _mName,
+                  ("member" .=) <$> _mMember,
+                  ("createTime" .=) <$> _mCreateTime])
+
+-- | 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
+
+-- | Hangouts Chat events.
+--
+-- /See:/ 'deprecatedEvent' smart constructor.
+data DeprecatedEvent = DeprecatedEvent'
+    { _deSpace                     :: !(Maybe Space)
+    , _deToken                     :: !(Maybe Text)
+    , _deAction                    :: !(Maybe FormAction)
+    , _deEventTime                 :: !(Maybe DateTime')
+    , _deUser                      :: !(Maybe User)
+    , _deConfigCompleteRedirectURL :: !(Maybe Text)
+    , _deType                      :: !(Maybe DeprecatedEventType)
+    , _deMessage                   :: !(Maybe Message)
+    , _deThreadKey                 :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DeprecatedEvent' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'deSpace'
+--
+-- * 'deToken'
+--
+-- * 'deAction'
+--
+-- * 'deEventTime'
+--
+-- * 'deUser'
+--
+-- * 'deConfigCompleteRedirectURL'
+--
+-- * 'deType'
+--
+-- * 'deMessage'
+--
+-- * 'deThreadKey'
+deprecatedEvent
+    :: DeprecatedEvent
+deprecatedEvent =
+    DeprecatedEvent'
+    { _deSpace = Nothing
+    , _deToken = Nothing
+    , _deAction = Nothing
+    , _deEventTime = Nothing
+    , _deUser = Nothing
+    , _deConfigCompleteRedirectURL = Nothing
+    , _deType = Nothing
+    , _deMessage = Nothing
+    , _deThreadKey = Nothing
+    }
+
+-- | The room or DM in which the event occurred.
+deSpace :: Lens' DeprecatedEvent (Maybe Space)
+deSpace = lens _deSpace (\ s a -> s{_deSpace = a})
+
+-- | A secret value that bots can use to verify if a request is from Google.
+-- The token is randomly generated by Google, remains static, and can be
+-- obtained from the Hangouts Chat API configuration page in the Cloud
+-- Console. Developers can revoke\/regenerate it if needed from the same
+-- page.
+deToken :: Lens' DeprecatedEvent (Maybe Text)
+deToken = lens _deToken (\ s a -> s{_deToken = a})
+
+-- | The form action data associated with an interactive card that was
+-- clicked. Only populated for CARD_CLICKED events. See the [Interactive
+-- Cards guide](\/hangouts\/chat\/how-tos\/cards-onclick) for more
+-- information.
+deAction :: Lens' DeprecatedEvent (Maybe FormAction)
+deAction = lens _deAction (\ s a -> s{_deAction = a})
+
+-- | The timestamp indicating when the event was dispatched.
+deEventTime :: Lens' DeprecatedEvent (Maybe UTCTime)
+deEventTime
+  = lens _deEventTime (\ s a -> s{_deEventTime = a}) .
+      mapping _DateTime
+
+-- | The user that triggered the event.
+deUser :: Lens' DeprecatedEvent (Maybe User)
+deUser = lens _deUser (\ s a -> s{_deUser = a})
+
+-- | The URL the bot should redirect the user to after they have completed an
+-- authorization or configuration flow outside of Hangouts Chat. See the
+-- [Authorizing access to 3p services
+-- guide](\/hangouts\/chat\/how-tos\/auth-3p) for more information.
+deConfigCompleteRedirectURL :: Lens' DeprecatedEvent (Maybe Text)
+deConfigCompleteRedirectURL
+  = lens _deConfigCompleteRedirectURL
+      (\ s a -> s{_deConfigCompleteRedirectURL = a})
+
+-- | The type of the event.
+deType :: Lens' DeprecatedEvent (Maybe DeprecatedEventType)
+deType = lens _deType (\ s a -> s{_deType = a})
+
+-- | The message that triggered the event, if applicable.
+deMessage :: Lens' DeprecatedEvent (Maybe Message)
+deMessage
+  = lens _deMessage (\ s a -> s{_deMessage = a})
+
+-- | The bot-defined key for the thread related to the event. See the
+-- thread_key field of the \`spaces.message.create\` request for more
+-- information.
+deThreadKey :: Lens' DeprecatedEvent (Maybe Text)
+deThreadKey
+  = lens _deThreadKey (\ s a -> s{_deThreadKey = a})
+
+instance FromJSON DeprecatedEvent where
+        parseJSON
+          = withObject "DeprecatedEvent"
+              (\ o ->
+                 DeprecatedEvent' <$>
+                   (o .:? "space") <*> (o .:? "token") <*>
+                     (o .:? "action")
+                     <*> (o .:? "eventTime")
+                     <*> (o .:? "user")
+                     <*> (o .:? "configCompleteRedirectUrl")
+                     <*> (o .:? "type")
+                     <*> (o .:? "message")
+                     <*> (o .:? "threadKey"))
+
+instance ToJSON DeprecatedEvent where
+        toJSON DeprecatedEvent'{..}
+          = object
+              (catMaybes
+                 [("space" .=) <$> _deSpace,
+                  ("token" .=) <$> _deToken,
+                  ("action" .=) <$> _deAction,
+                  ("eventTime" .=) <$> _deEventTime,
+                  ("user" .=) <$> _deUser,
+                  ("configCompleteRedirectUrl" .=) <$>
+                    _deConfigCompleteRedirectURL,
+                  ("type" .=) <$> _deType,
+                  ("message" .=) <$> _deMessage,
+                  ("threadKey" .=) <$> _deThreadKey])
+
+-- | A paragraph of text. Formatted text supported.
+--
+-- /See:/ 'textParagraph' smart constructor.
+newtype TextParagraph = TextParagraph'
+    { _tpText :: Maybe Text
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'TextParagraph' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'tpText'
+textParagraph
+    :: TextParagraph
+textParagraph =
+    TextParagraph'
+    { _tpText = Nothing
+    }
+
+tpText :: Lens' TextParagraph (Maybe Text)
+tpText = lens _tpText (\ s a -> s{_tpText = a})
+
+instance FromJSON TextParagraph where
+        parseJSON
+          = withObject "TextParagraph"
+              (\ o -> TextParagraph' <$> (o .:? "text"))
+
+instance ToJSON TextParagraph where
+        toJSON TextParagraph'{..}
+          = object (catMaybes [("text" .=) <$> _tpText])
+
+-- | A button. Can be a text button or an image button.
+--
+-- /See:/ 'button' smart constructor.
+data Button = Button'
+    { _bTextButton  :: !(Maybe TextButton)
+    , _bImageButton :: !(Maybe ImageButton)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Button' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'bTextButton'
+--
+-- * 'bImageButton'
+button
+    :: Button
+button =
+    Button'
+    { _bTextButton = Nothing
+    , _bImageButton = Nothing
+    }
+
+-- | A button with text and onclick action.
+bTextButton :: Lens' Button (Maybe TextButton)
+bTextButton
+  = lens _bTextButton (\ s a -> s{_bTextButton = a})
+
+-- | A button with image and onclick action.
+bImageButton :: Lens' Button (Maybe ImageButton)
+bImageButton
+  = lens _bImageButton (\ s a -> s{_bImageButton = a})
+
+instance FromJSON Button where
+        parseJSON
+          = withObject "Button"
+              (\ o ->
+                 Button' <$>
+                   (o .:? "textButton") <*> (o .:? "imageButton"))
+
+instance ToJSON Button where
+        toJSON Button'{..}
+          = object
+              (catMaybes
+                 [("textButton" .=) <$> _bTextButton,
+                  ("imageButton" .=) <$> _bImageButton])
+
+--
+-- /See:/ 'listSpacesResponse' smart constructor.
+data ListSpacesResponse = ListSpacesResponse'
+    { _lsrNextPageToken :: !(Maybe Text)
+    , _lsrSpaces        :: !(Maybe [Space])
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ListSpacesResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'lsrNextPageToken'
+--
+-- * 'lsrSpaces'
+listSpacesResponse
+    :: ListSpacesResponse
+listSpacesResponse =
+    ListSpacesResponse'
+    { _lsrNextPageToken = Nothing
+    , _lsrSpaces = Nothing
+    }
+
+-- | Continuation token to retrieve the next page of results. It will be
+-- empty for the last page of results. Tokens expire in an hour. An error
+-- is thrown if an expired token is passed.
+lsrNextPageToken :: Lens' ListSpacesResponse (Maybe Text)
+lsrNextPageToken
+  = lens _lsrNextPageToken
+      (\ s a -> s{_lsrNextPageToken = a})
+
+-- | List of spaces in the requested (or first) page.
+lsrSpaces :: Lens' ListSpacesResponse [Space]
+lsrSpaces
+  = lens _lsrSpaces (\ s a -> s{_lsrSpaces = a}) .
+      _Default
+      . _Coerce
+
+instance FromJSON ListSpacesResponse where
+        parseJSON
+          = withObject "ListSpacesResponse"
+              (\ o ->
+                 ListSpacesResponse' <$>
+                   (o .:? "nextPageToken") <*>
+                     (o .:? "spaces" .!= mempty))
+
+instance ToJSON ListSpacesResponse where
+        toJSON ListSpacesResponse'{..}
+          = object
+              (catMaybes
+                 [("nextPageToken" .=) <$> _lsrNextPageToken,
+                  ("spaces" .=) <$> _lsrSpaces])
+
+-- | A user in Hangouts Chat.
+--
+-- /See:/ 'user' smart constructor.
+data User = User'
+    { _uName        :: !(Maybe Text)
+    , _uDisplayName :: !(Maybe Text)
+    , _uType        :: !(Maybe UserType)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'User' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'uName'
+--
+-- * 'uDisplayName'
+--
+-- * 'uType'
+user
+    :: User
+user =
+    User'
+    { _uName = Nothing
+    , _uDisplayName = Nothing
+    , _uType = Nothing
+    }
+
+-- | Resource name, in the format \"users\/*\".
+uName :: Lens' User (Maybe Text)
+uName = lens _uName (\ s a -> s{_uName = a})
+
+-- | The user\'s display name.
+uDisplayName :: Lens' User (Maybe Text)
+uDisplayName
+  = lens _uDisplayName (\ s a -> s{_uDisplayName = a})
+
+-- | User type.
+uType :: Lens' User (Maybe UserType)
+uType = lens _uType (\ s a -> s{_uType = a})
+
+instance FromJSON User where
+        parseJSON
+          = withObject "User"
+              (\ o ->
+                 User' <$>
+                   (o .:? "name") <*> (o .:? "displayName") <*>
+                     (o .:? "type"))
+
+instance ToJSON User where
+        toJSON User'{..}
+          = object
+              (catMaybes
+                 [("name" .=) <$> _uName,
+                  ("displayName" .=) <$> _uDisplayName,
+                  ("type" .=) <$> _uType])
+
+-- | A link that opens a new window.
+--
+-- /See:/ 'openLink' smart constructor.
+newtype OpenLink = OpenLink'
+    { _olURL :: Maybe Text
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'OpenLink' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'olURL'
+openLink
+    :: OpenLink
+openLink =
+    OpenLink'
+    { _olURL = Nothing
+    }
+
+-- | The URL to open.
+olURL :: Lens' OpenLink (Maybe Text)
+olURL = lens _olURL (\ s a -> s{_olURL = a})
+
+instance FromJSON OpenLink where
+        parseJSON
+          = withObject "OpenLink"
+              (\ o -> OpenLink' <$> (o .:? "url"))
+
+instance ToJSON OpenLink where
+        toJSON OpenLink'{..}
+          = object (catMaybes [("url" .=) <$> _olURL])
+
+-- | A card action is the action associated with the card. For an invoice
+-- card, a typical action would be: delete invoice, email invoice or open
+-- the invoice in browser.
+--
+-- /See:/ 'cardAction' smart constructor.
+data CardAction = CardAction'
+    { _caOnClick     :: !(Maybe OnClick)
+    , _caActionLabel :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CardAction' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'caOnClick'
+--
+-- * 'caActionLabel'
+cardAction
+    :: CardAction
+cardAction =
+    CardAction'
+    { _caOnClick = Nothing
+    , _caActionLabel = Nothing
+    }
+
+-- | The onclick action for this action item.
+caOnClick :: Lens' CardAction (Maybe OnClick)
+caOnClick
+  = lens _caOnClick (\ s a -> s{_caOnClick = a})
+
+-- | The label used to be displayed in the action menu item.
+caActionLabel :: Lens' CardAction (Maybe Text)
+caActionLabel
+  = lens _caActionLabel
+      (\ s a -> s{_caActionLabel = a})
+
+instance FromJSON CardAction where
+        parseJSON
+          = withObject "CardAction"
+              (\ o ->
+                 CardAction' <$>
+                   (o .:? "onClick") <*> (o .:? "actionLabel"))
+
+instance ToJSON CardAction where
+        toJSON CardAction'{..}
+          = object
+              (catMaybes
+                 [("onClick" .=) <$> _caOnClick,
+                  ("actionLabel" .=) <$> _caActionLabel])
+
+-- | Parameters that a bot can use to configure how it\'s response is posted.
+--
+-- /See:/ 'actionResponse' smart constructor.
+data ActionResponse = ActionResponse'
+    { _arURL  :: !(Maybe Text)
+    , _arType :: !(Maybe ActionResponseType)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ActionResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'arURL'
+--
+-- * 'arType'
+actionResponse
+    :: ActionResponse
+actionResponse =
+    ActionResponse'
+    { _arURL = Nothing
+    , _arType = Nothing
+    }
+
+-- | URL for users to auth or config. (Only for REQUEST_CONFIG response
+-- types.)
+arURL :: Lens' ActionResponse (Maybe Text)
+arURL = lens _arURL (\ s a -> s{_arURL = a})
+
+-- | The type of bot response.
+arType :: Lens' ActionResponse (Maybe ActionResponseType)
+arType = lens _arType (\ s a -> s{_arType = a})
+
+instance FromJSON ActionResponse where
+        parseJSON
+          = withObject "ActionResponse"
+              (\ o ->
+                 ActionResponse' <$> (o .:? "url") <*> (o .:? "type"))
+
+instance ToJSON ActionResponse where
+        toJSON ActionResponse'{..}
+          = object
+              (catMaybes
+                 [("url" .=) <$> _arURL, ("type" .=) <$> _arType])
+
+-- | A form action describes the behavior when the form is submitted. For
+-- example, an Apps Script can be invoked to handle the form.
+--
+-- /See:/ 'formAction' smart constructor.
+data FormAction = FormAction'
+    { _faActionMethodName :: !(Maybe Text)
+    , _faParameters       :: !(Maybe [ActionParameter])
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'FormAction' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'faActionMethodName'
+--
+-- * 'faParameters'
+formAction
+    :: FormAction
+formAction =
+    FormAction'
+    { _faActionMethodName = Nothing
+    , _faParameters = Nothing
+    }
+
+-- | Apps Script function to invoke when the containing element is
+-- clicked\/activated.
+faActionMethodName :: Lens' FormAction (Maybe Text)
+faActionMethodName
+  = lens _faActionMethodName
+      (\ s a -> s{_faActionMethodName = a})
+
+-- | List of action parameters.
+faParameters :: Lens' FormAction [ActionParameter]
+faParameters
+  = lens _faParameters (\ s a -> s{_faParameters = a})
+      . _Default
+      . _Coerce
+
+instance FromJSON FormAction where
+        parseJSON
+          = withObject "FormAction"
+              (\ o ->
+                 FormAction' <$>
+                   (o .:? "actionMethodName") <*>
+                     (o .:? "parameters" .!= mempty))
+
+instance ToJSON FormAction where
+        toJSON FormAction'{..}
+          = object
+              (catMaybes
+                 [("actionMethodName" .=) <$> _faActionMethodName,
+                  ("parameters" .=) <$> _faParameters])
+
+--
+-- /See:/ 'listMembershipsResponse' smart constructor.
+data ListMembershipsResponse = ListMembershipsResponse'
+    { _lmrNextPageToken :: !(Maybe Text)
+    , _lmrMemberships   :: !(Maybe [Membership])
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ListMembershipsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'lmrNextPageToken'
+--
+-- * 'lmrMemberships'
+listMembershipsResponse
+    :: ListMembershipsResponse
+listMembershipsResponse =
+    ListMembershipsResponse'
+    { _lmrNextPageToken = Nothing
+    , _lmrMemberships = Nothing
+    }
+
+-- | Continuation token to retrieve the next page of results. It will be
+-- empty for the last page of results.
+lmrNextPageToken :: Lens' ListMembershipsResponse (Maybe Text)
+lmrNextPageToken
+  = lens _lmrNextPageToken
+      (\ s a -> s{_lmrNextPageToken = a})
+
+-- | List of memberships in the requested (or first) page.
+lmrMemberships :: Lens' ListMembershipsResponse [Membership]
+lmrMemberships
+  = lens _lmrMemberships
+      (\ s a -> s{_lmrMemberships = a})
+      . _Default
+      . _Coerce
+
+instance FromJSON ListMembershipsResponse where
+        parseJSON
+          = withObject "ListMembershipsResponse"
+              (\ o ->
+                 ListMembershipsResponse' <$>
+                   (o .:? "nextPageToken") <*>
+                     (o .:? "memberships" .!= mempty))
+
+instance ToJSON ListMembershipsResponse where
+        toJSON ListMembershipsResponse'{..}
+          = object
+              (catMaybes
+                 [("nextPageToken" .=) <$> _lmrNextPageToken,
+                  ("memberships" .=) <$> _lmrMemberships])
+
+-- | A message in Hangouts Chat.
+--
+-- /See:/ 'message' smart constructor.
+data Message = Message'
+    { _mesAnnotations    :: !(Maybe [Annotation])
+    , _mesSpace          :: !(Maybe Space)
+    , _mesText           :: !(Maybe Text)
+    , _mesSender         :: !(Maybe User)
+    , _mesName           :: !(Maybe Text)
+    , _mesPreviewText    :: !(Maybe Text)
+    , _mesCards          :: !(Maybe [Card])
+    , _mesActionResponse :: !(Maybe ActionResponse)
+    , _mesArgumentText   :: !(Maybe Text)
+    , _mesThread         :: !(Maybe Thread)
+    , _mesFallbackText   :: !(Maybe Text)
+    , _mesCreateTime     :: !(Maybe DateTime')
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Message' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'mesAnnotations'
+--
+-- * 'mesSpace'
+--
+-- * 'mesText'
+--
+-- * 'mesSender'
+--
+-- * 'mesName'
+--
+-- * 'mesPreviewText'
+--
+-- * 'mesCards'
+--
+-- * 'mesActionResponse'
+--
+-- * 'mesArgumentText'
+--
+-- * 'mesThread'
+--
+-- * 'mesFallbackText'
+--
+-- * 'mesCreateTime'
+message
+    :: Message
+message =
+    Message'
+    { _mesAnnotations = Nothing
+    , _mesSpace = Nothing
+    , _mesText = Nothing
+    , _mesSender = Nothing
+    , _mesName = Nothing
+    , _mesPreviewText = Nothing
+    , _mesCards = Nothing
+    , _mesActionResponse = Nothing
+    , _mesArgumentText = Nothing
+    , _mesThread = Nothing
+    , _mesFallbackText = Nothing
+    , _mesCreateTime = Nothing
+    }
+
+-- | Output only. Annotations associated with the text in this message.
+mesAnnotations :: Lens' Message [Annotation]
+mesAnnotations
+  = lens _mesAnnotations
+      (\ s a -> s{_mesAnnotations = a})
+      . _Default
+      . _Coerce
+
+-- | The space the message belongs to.
+mesSpace :: Lens' Message (Maybe Space)
+mesSpace = lens _mesSpace (\ s a -> s{_mesSpace = a})
+
+-- | Plain-text body of the message.
+mesText :: Lens' Message (Maybe Text)
+mesText = lens _mesText (\ s a -> s{_mesText = a})
+
+-- | The user who created the message.
+mesSender :: Lens' Message (Maybe User)
+mesSender
+  = lens _mesSender (\ s a -> s{_mesSender = a})
+
+-- | Resource name, in the form \"spaces\/*\/messages\/*\". Example:
+-- spaces\/AAAAMpdlehY\/messages\/UMxbHmzDlr4.UMxbHmzDlr4
+mesName :: Lens' Message (Maybe Text)
+mesName = lens _mesName (\ s a -> s{_mesName = a})
+
+-- | Text for generating preview chips. This text will not be displayed to
+-- the user, but any links to images, web pages, videos, etc. included here
+-- will generate preview chips.
+mesPreviewText :: Lens' Message (Maybe Text)
+mesPreviewText
+  = lens _mesPreviewText
+      (\ s a -> s{_mesPreviewText = a})
+
+-- | Rich, formatted and interactive cards that can be used to display UI
+-- elements such as: formatted texts, buttons, clickable images. Cards are
+-- normally displayed below the plain-text body of the message.
+mesCards :: Lens' Message [Card]
+mesCards
+  = lens _mesCards (\ s a -> s{_mesCards = a}) .
+      _Default
+      . _Coerce
+
+-- | Input only. Parameters that a bot can use to configure how its response
+-- is posted.
+mesActionResponse :: Lens' Message (Maybe ActionResponse)
+mesActionResponse
+  = lens _mesActionResponse
+      (\ s a -> s{_mesActionResponse = a})
+
+-- | Plain-text body of the message with all bot mentions stripped out.
+mesArgumentText :: Lens' Message (Maybe Text)
+mesArgumentText
+  = lens _mesArgumentText
+      (\ s a -> s{_mesArgumentText = a})
+
+-- | The thread the message belongs to.
+mesThread :: Lens' Message (Maybe Thread)
+mesThread
+  = lens _mesThread (\ s a -> s{_mesThread = a})
+
+-- | A plain-text description of the message\'s cards, used when the actual
+-- cards cannot be displayed (e.g. mobile notifications).
+mesFallbackText :: Lens' Message (Maybe Text)
+mesFallbackText
+  = lens _mesFallbackText
+      (\ s a -> s{_mesFallbackText = a})
+
+-- | Output only. The time at which the message was created in Hangouts Chat
+-- server.
+mesCreateTime :: Lens' Message (Maybe UTCTime)
+mesCreateTime
+  = lens _mesCreateTime
+      (\ s a -> s{_mesCreateTime = a})
+      . mapping _DateTime
+
+instance FromJSON Message where
+        parseJSON
+          = withObject "Message"
+              (\ o ->
+                 Message' <$>
+                   (o .:? "annotations" .!= mempty) <*> (o .:? "space")
+                     <*> (o .:? "text")
+                     <*> (o .:? "sender")
+                     <*> (o .:? "name")
+                     <*> (o .:? "previewText")
+                     <*> (o .:? "cards" .!= mempty)
+                     <*> (o .:? "actionResponse")
+                     <*> (o .:? "argumentText")
+                     <*> (o .:? "thread")
+                     <*> (o .:? "fallbackText")
+                     <*> (o .:? "createTime"))
+
+instance ToJSON Message where
+        toJSON Message'{..}
+          = object
+              (catMaybes
+                 [("annotations" .=) <$> _mesAnnotations,
+                  ("space" .=) <$> _mesSpace, ("text" .=) <$> _mesText,
+                  ("sender" .=) <$> _mesSender,
+                  ("name" .=) <$> _mesName,
+                  ("previewText" .=) <$> _mesPreviewText,
+                  ("cards" .=) <$> _mesCards,
+                  ("actionResponse" .=) <$> _mesActionResponse,
+                  ("argumentText" .=) <$> _mesArgumentText,
+                  ("thread" .=) <$> _mesThread,
+                  ("fallbackText" .=) <$> _mesFallbackText,
+                  ("createTime" .=) <$> _mesCreateTime])
+
+--
+-- /See:/ 'cardHeader' smart constructor.
+data CardHeader = CardHeader'
+    { _chSubtitle   :: !(Maybe Text)
+    , _chImageURL   :: !(Maybe Text)
+    , _chTitle      :: !(Maybe Text)
+    , _chImageStyle :: !(Maybe CardHeaderImageStyle)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CardHeader' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'chSubtitle'
+--
+-- * 'chImageURL'
+--
+-- * 'chTitle'
+--
+-- * 'chImageStyle'
+cardHeader
+    :: CardHeader
+cardHeader =
+    CardHeader'
+    { _chSubtitle = Nothing
+    , _chImageURL = Nothing
+    , _chTitle = Nothing
+    , _chImageStyle = Nothing
+    }
+
+-- | The subtitle of the card header.
+chSubtitle :: Lens' CardHeader (Maybe Text)
+chSubtitle
+  = lens _chSubtitle (\ s a -> s{_chSubtitle = a})
+
+-- | The URL of the image in the card header.
+chImageURL :: Lens' CardHeader (Maybe Text)
+chImageURL
+  = lens _chImageURL (\ s a -> s{_chImageURL = a})
+
+-- | The title must be specified. The header has a fixed height: if both a
+-- title and subtitle is specified, each will take up 1 line. If only the
+-- title is specified, it will take up both lines.
+chTitle :: Lens' CardHeader (Maybe Text)
+chTitle = lens _chTitle (\ s a -> s{_chTitle = a})
+
+-- | The image\'s type (e.g. square border or circular border).
+chImageStyle :: Lens' CardHeader (Maybe CardHeaderImageStyle)
+chImageStyle
+  = lens _chImageStyle (\ s a -> s{_chImageStyle = a})
+
+instance FromJSON CardHeader where
+        parseJSON
+          = withObject "CardHeader"
+              (\ o ->
+                 CardHeader' <$>
+                   (o .:? "subtitle") <*> (o .:? "imageUrl") <*>
+                     (o .:? "title")
+                     <*> (o .:? "imageStyle"))
+
+instance ToJSON CardHeader where
+        toJSON CardHeader'{..}
+          = object
+              (catMaybes
+                 [("subtitle" .=) <$> _chSubtitle,
+                  ("imageUrl" .=) <$> _chImageURL,
+                  ("title" .=) <$> _chTitle,
+                  ("imageStyle" .=) <$> _chImageStyle])
+
+-- | A button with text and onclick action.
+--
+-- /See:/ 'textButton' smart constructor.
+data TextButton = TextButton'
+    { _tbOnClick :: !(Maybe OnClick)
+    , _tbText    :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'TextButton' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'tbOnClick'
+--
+-- * 'tbText'
+textButton
+    :: TextButton
+textButton =
+    TextButton'
+    { _tbOnClick = Nothing
+    , _tbText = Nothing
+    }
+
+-- | The onclick action of the button.
+tbOnClick :: Lens' TextButton (Maybe OnClick)
+tbOnClick
+  = lens _tbOnClick (\ s a -> s{_tbOnClick = a})
+
+-- | The text of the button.
+tbText :: Lens' TextButton (Maybe Text)
+tbText = lens _tbText (\ s a -> s{_tbText = a})
+
+instance FromJSON TextButton where
+        parseJSON
+          = withObject "TextButton"
+              (\ o ->
+                 TextButton' <$> (o .:? "onClick") <*> (o .:? "text"))
+
+instance ToJSON TextButton where
+        toJSON TextButton'{..}
+          = object
+              (catMaybes
+                 [("onClick" .=) <$> _tbOnClick,
+                  ("text" .=) <$> _tbText])
+
+-- | A thread in Hangouts Chat.
+--
+-- /See:/ 'thread' smart constructor.
+newtype Thread = Thread'
+    { _tName :: Maybe Text
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Thread' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'tName'
+thread
+    :: Thread
+thread =
+    Thread'
+    { _tName = Nothing
+    }
+
+-- | Resource name, in the form \"spaces\/*\/threads\/*\". Example:
+-- spaces\/AAAAMpdlehY\/threads\/UMxbHmzDlr4
+tName :: Lens' Thread (Maybe Text)
+tName = lens _tName (\ s a -> s{_tName = a})
+
+instance FromJSON Thread where
+        parseJSON
+          = withObject "Thread"
+              (\ o -> Thread' <$> (o .:? "name"))
+
+instance ToJSON Thread where
+        toJSON Thread'{..}
+          = object (catMaybes [("name" .=) <$> _tName])
+
+-- | Annotation metadata for user mentions (\').
+--
+-- /See:/ 'userMentionMetadata' smart constructor.
+data UserMentionMetadata = UserMentionMetadata'
+    { _ummUser :: !(Maybe User)
+    , _ummType :: !(Maybe UserMentionMetadataType)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'UserMentionMetadata' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ummUser'
+--
+-- * 'ummType'
+userMentionMetadata
+    :: UserMentionMetadata
+userMentionMetadata =
+    UserMentionMetadata'
+    { _ummUser = Nothing
+    , _ummType = Nothing
+    }
+
+-- | The user mentioned.
+ummUser :: Lens' UserMentionMetadata (Maybe User)
+ummUser = lens _ummUser (\ s a -> s{_ummUser = a})
+
+-- | The type of user mention.
+ummType :: Lens' UserMentionMetadata (Maybe UserMentionMetadataType)
+ummType = lens _ummType (\ s a -> s{_ummType = a})
+
+instance FromJSON UserMentionMetadata where
+        parseJSON
+          = withObject "UserMentionMetadata"
+              (\ o ->
+                 UserMentionMetadata' <$>
+                   (o .:? "user") <*> (o .:? "type"))
+
+instance ToJSON UserMentionMetadata where
+        toJSON UserMentionMetadata'{..}
+          = object
+              (catMaybes
+                 [("user" .=) <$> _ummUser, ("type" .=) <$> _ummType])
+
+-- | An image button with an onclick action.
+--
+-- /See:/ 'imageButton' smart constructor.
+data ImageButton = ImageButton'
+    { _ibOnClick :: !(Maybe OnClick)
+    , _ibIcon    :: !(Maybe ImageButtonIcon)
+    , _ibName    :: !(Maybe Text)
+    , _ibIconURL :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ImageButton' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ibOnClick'
+--
+-- * 'ibIcon'
+--
+-- * 'ibName'
+--
+-- * 'ibIconURL'
+imageButton
+    :: ImageButton
+imageButton =
+    ImageButton'
+    { _ibOnClick = Nothing
+    , _ibIcon = Nothing
+    , _ibName = Nothing
+    , _ibIconURL = Nothing
+    }
+
+-- | The onclick action.
+ibOnClick :: Lens' ImageButton (Maybe OnClick)
+ibOnClick
+  = lens _ibOnClick (\ s a -> s{_ibOnClick = a})
+
+-- | The icon specified by an enum that indices to an icon provided by Chat
+-- API.
+ibIcon :: Lens' ImageButton (Maybe ImageButtonIcon)
+ibIcon = lens _ibIcon (\ s a -> s{_ibIcon = a})
+
+-- | The name of this image_button which will be used for accessibility.
+-- Default value will be provided if developers don\'t specify.
+ibName :: Lens' ImageButton (Maybe Text)
+ibName = lens _ibName (\ s a -> s{_ibName = a})
+
+-- | The icon specified by a URL.
+ibIconURL :: Lens' ImageButton (Maybe Text)
+ibIconURL
+  = lens _ibIconURL (\ s a -> s{_ibIconURL = a})
+
+instance FromJSON ImageButton where
+        parseJSON
+          = withObject "ImageButton"
+              (\ o ->
+                 ImageButton' <$>
+                   (o .:? "onClick") <*> (o .:? "icon") <*>
+                     (o .:? "name")
+                     <*> (o .:? "iconUrl"))
+
+instance ToJSON ImageButton where
+        toJSON ImageButton'{..}
+          = object
+              (catMaybes
+                 [("onClick" .=) <$> _ibOnClick,
+                  ("icon" .=) <$> _ibIcon, ("name" .=) <$> _ibName,
+                  ("iconUrl" .=) <$> _ibIconURL])
+
+-- | A section contains a collection of widgets that are rendered
+-- (vertically) in the order that they are specified. Across all platforms,
+-- cards have a narrow fixed width, so there is currently no need for
+-- layout properties (e.g. float).
+--
+-- /See:/ 'section' smart constructor.
+data Section = Section'
+    { _sWidgets :: !(Maybe [WidgetMarkup])
+    , _sHeader  :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Section' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sWidgets'
+--
+-- * 'sHeader'
+section
+    :: Section
+section =
+    Section'
+    { _sWidgets = Nothing
+    , _sHeader = Nothing
+    }
+
+-- | A section must contain at least 1 widget.
+sWidgets :: Lens' Section [WidgetMarkup]
+sWidgets
+  = lens _sWidgets (\ s a -> s{_sWidgets = a}) .
+      _Default
+      . _Coerce
+
+-- | The header of the section, text formatted supported.
+sHeader :: Lens' Section (Maybe Text)
+sHeader = lens _sHeader (\ s a -> s{_sHeader = a})
+
+instance FromJSON Section where
+        parseJSON
+          = withObject "Section"
+              (\ o ->
+                 Section' <$>
+                   (o .:? "widgets" .!= mempty) <*> (o .:? "header"))
+
+instance ToJSON Section where
+        toJSON Section'{..}
+          = object
+              (catMaybes
+                 [("widgets" .=) <$> _sWidgets,
+                  ("header" .=) <$> _sHeader])
diff --git a/gen/Network/Google/Chat/Types/Sum.hs b/gen/Network/Google/Chat/Types/Sum.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Chat/Types/Sum.hs
@@ -0,0 +1,625 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE LambdaCase         #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Network.Google.Chat.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.Chat.Types.Sum where
+
+import           Network.Google.Prelude hiding (Bytes)
+
+-- | An enum value that will be replaced by the Chat API with the
+-- corresponding icon image.
+data KeyValueIcon
+    = KVIIconUnspecified
+      -- ^ @ICON_UNSPECIFIED@
+    | KVIAirplane
+      -- ^ @AIRPLANE@
+    | KVIBookmark
+      -- ^ @BOOKMARK@
+    | KVIBus
+      -- ^ @BUS@
+    | KVICar
+      -- ^ @CAR@
+    | KVIClock
+      -- ^ @CLOCK@
+    | KVIConfirmationNumberIcon
+      -- ^ @CONFIRMATION_NUMBER_ICON@
+    | KVIDollar
+      -- ^ @DOLLAR@
+    | KVIDescription
+      -- ^ @DESCRIPTION@
+    | KVIEmail
+      -- ^ @EMAIL@
+    | KVIEventPerformer
+      -- ^ @EVENT_PERFORMER@
+    | KVIEventSeat
+      -- ^ @EVENT_SEAT@
+    | KVIFlightArrival
+      -- ^ @FLIGHT_ARRIVAL@
+    | KVIFlightDeParture
+      -- ^ @FLIGHT_DEPARTURE@
+    | KVIHotel
+      -- ^ @HOTEL@
+    | KVIHotelRoomType
+      -- ^ @HOTEL_ROOM_TYPE@
+    | KVIInvite
+      -- ^ @INVITE@
+    | KVIMapPin
+      -- ^ @MAP_PIN@
+    | KVIMembership
+      -- ^ @MEMBERSHIP@
+    | KVIMultiplePeople
+      -- ^ @MULTIPLE_PEOPLE@
+    | KVIOffer
+      -- ^ @OFFER@
+    | KVIPerson
+      -- ^ @PERSON@
+    | KVIPhone
+      -- ^ @PHONE@
+    | KVIRestaurantIcon
+      -- ^ @RESTAURANT_ICON@
+    | KVIShoppingCart
+      -- ^ @SHOPPING_CART@
+    | KVIStar
+      -- ^ @STAR@
+    | KVIStore
+      -- ^ @STORE@
+    | KVITicket
+      -- ^ @TICKET@
+    | KVITrain
+      -- ^ @TRAIN@
+    | KVIVideoCamera
+      -- ^ @VIDEO_CAMERA@
+    | KVIVideoPlay
+      -- ^ @VIDEO_PLAY@
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable KeyValueIcon
+
+instance FromHttpApiData KeyValueIcon where
+    parseQueryParam = \case
+        "ICON_UNSPECIFIED" -> Right KVIIconUnspecified
+        "AIRPLANE" -> Right KVIAirplane
+        "BOOKMARK" -> Right KVIBookmark
+        "BUS" -> Right KVIBus
+        "CAR" -> Right KVICar
+        "CLOCK" -> Right KVIClock
+        "CONFIRMATION_NUMBER_ICON" -> Right KVIConfirmationNumberIcon
+        "DOLLAR" -> Right KVIDollar
+        "DESCRIPTION" -> Right KVIDescription
+        "EMAIL" -> Right KVIEmail
+        "EVENT_PERFORMER" -> Right KVIEventPerformer
+        "EVENT_SEAT" -> Right KVIEventSeat
+        "FLIGHT_ARRIVAL" -> Right KVIFlightArrival
+        "FLIGHT_DEPARTURE" -> Right KVIFlightDeParture
+        "HOTEL" -> Right KVIHotel
+        "HOTEL_ROOM_TYPE" -> Right KVIHotelRoomType
+        "INVITE" -> Right KVIInvite
+        "MAP_PIN" -> Right KVIMapPin
+        "MEMBERSHIP" -> Right KVIMembership
+        "MULTIPLE_PEOPLE" -> Right KVIMultiplePeople
+        "OFFER" -> Right KVIOffer
+        "PERSON" -> Right KVIPerson
+        "PHONE" -> Right KVIPhone
+        "RESTAURANT_ICON" -> Right KVIRestaurantIcon
+        "SHOPPING_CART" -> Right KVIShoppingCart
+        "STAR" -> Right KVIStar
+        "STORE" -> Right KVIStore
+        "TICKET" -> Right KVITicket
+        "TRAIN" -> Right KVITrain
+        "VIDEO_CAMERA" -> Right KVIVideoCamera
+        "VIDEO_PLAY" -> Right KVIVideoPlay
+        x -> Left ("Unable to parse KeyValueIcon from: " <> x)
+
+instance ToHttpApiData KeyValueIcon where
+    toQueryParam = \case
+        KVIIconUnspecified -> "ICON_UNSPECIFIED"
+        KVIAirplane -> "AIRPLANE"
+        KVIBookmark -> "BOOKMARK"
+        KVIBus -> "BUS"
+        KVICar -> "CAR"
+        KVIClock -> "CLOCK"
+        KVIConfirmationNumberIcon -> "CONFIRMATION_NUMBER_ICON"
+        KVIDollar -> "DOLLAR"
+        KVIDescription -> "DESCRIPTION"
+        KVIEmail -> "EMAIL"
+        KVIEventPerformer -> "EVENT_PERFORMER"
+        KVIEventSeat -> "EVENT_SEAT"
+        KVIFlightArrival -> "FLIGHT_ARRIVAL"
+        KVIFlightDeParture -> "FLIGHT_DEPARTURE"
+        KVIHotel -> "HOTEL"
+        KVIHotelRoomType -> "HOTEL_ROOM_TYPE"
+        KVIInvite -> "INVITE"
+        KVIMapPin -> "MAP_PIN"
+        KVIMembership -> "MEMBERSHIP"
+        KVIMultiplePeople -> "MULTIPLE_PEOPLE"
+        KVIOffer -> "OFFER"
+        KVIPerson -> "PERSON"
+        KVIPhone -> "PHONE"
+        KVIRestaurantIcon -> "RESTAURANT_ICON"
+        KVIShoppingCart -> "SHOPPING_CART"
+        KVIStar -> "STAR"
+        KVIStore -> "STORE"
+        KVITicket -> "TICKET"
+        KVITrain -> "TRAIN"
+        KVIVideoCamera -> "VIDEO_CAMERA"
+        KVIVideoPlay -> "VIDEO_PLAY"
+
+instance FromJSON KeyValueIcon where
+    parseJSON = parseJSONText "KeyValueIcon"
+
+instance ToJSON KeyValueIcon where
+    toJSON = toJSONText
+
+-- | The type of bot response.
+data ActionResponseType
+    = TypeUnspecified
+      -- ^ @TYPE_UNSPECIFIED@
+      -- Default type; will be handled as NEW_MESSAGE.
+    | NewMessage
+      -- ^ @NEW_MESSAGE@
+      -- Post as a new message in the topic.
+    | UpdateMessage
+      -- ^ @UPDATE_MESSAGE@
+      -- Update the bot\'s own message. (Only after CARD_CLICKED events.)
+    | RequestConfig
+      -- ^ @REQUEST_CONFIG@
+      -- Privately ask the user for additional auth or config.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable ActionResponseType
+
+instance FromHttpApiData ActionResponseType where
+    parseQueryParam = \case
+        "TYPE_UNSPECIFIED" -> Right TypeUnspecified
+        "NEW_MESSAGE" -> Right NewMessage
+        "UPDATE_MESSAGE" -> Right UpdateMessage
+        "REQUEST_CONFIG" -> Right RequestConfig
+        x -> Left ("Unable to parse ActionResponseType from: " <> x)
+
+instance ToHttpApiData ActionResponseType where
+    toQueryParam = \case
+        TypeUnspecified -> "TYPE_UNSPECIFIED"
+        NewMessage -> "NEW_MESSAGE"
+        UpdateMessage -> "UPDATE_MESSAGE"
+        RequestConfig -> "REQUEST_CONFIG"
+
+instance FromJSON ActionResponseType where
+    parseJSON = parseJSONText "ActionResponseType"
+
+instance ToJSON ActionResponseType where
+    toJSON = toJSONText
+
+-- | State of the membership.
+data MembershipState
+    = MembershipStateUnspecified
+      -- ^ @MEMBERSHIP_STATE_UNSPECIFIED@
+      -- Default, do not use.
+    | Joined
+      -- ^ @JOINED@
+      -- The user has joined the space.
+    | Invited
+      -- ^ @INVITED@
+      -- The user has been invited, is able to join the space, but currently has
+      -- not joined.
+    | NotAMember
+      -- ^ @NOT_A_MEMBER@
+      -- The user is not a member of the space, has not been invited and is not
+      -- able to join the space.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable MembershipState
+
+instance FromHttpApiData MembershipState where
+    parseQueryParam = \case
+        "MEMBERSHIP_STATE_UNSPECIFIED" -> Right MembershipStateUnspecified
+        "JOINED" -> Right Joined
+        "INVITED" -> Right Invited
+        "NOT_A_MEMBER" -> Right NotAMember
+        x -> Left ("Unable to parse MembershipState from: " <> x)
+
+instance ToHttpApiData MembershipState where
+    toQueryParam = \case
+        MembershipStateUnspecified -> "MEMBERSHIP_STATE_UNSPECIFIED"
+        Joined -> "JOINED"
+        Invited -> "INVITED"
+        NotAMember -> "NOT_A_MEMBER"
+
+instance FromJSON MembershipState where
+    parseJSON = parseJSONText "MembershipState"
+
+instance ToJSON MembershipState where
+    toJSON = toJSONText
+
+-- | The image\'s type (e.g. square border or circular border).
+data CardHeaderImageStyle
+    = CHISImageStyleUnspecified
+      -- ^ @IMAGE_STYLE_UNSPECIFIED@
+    | CHISImage
+      -- ^ @IMAGE@
+      -- Square border.
+    | CHISAvatar
+      -- ^ @AVATAR@
+      -- Circular border.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable CardHeaderImageStyle
+
+instance FromHttpApiData CardHeaderImageStyle where
+    parseQueryParam = \case
+        "IMAGE_STYLE_UNSPECIFIED" -> Right CHISImageStyleUnspecified
+        "IMAGE" -> Right CHISImage
+        "AVATAR" -> Right CHISAvatar
+        x -> Left ("Unable to parse CardHeaderImageStyle from: " <> x)
+
+instance ToHttpApiData CardHeaderImageStyle where
+    toQueryParam = \case
+        CHISImageStyleUnspecified -> "IMAGE_STYLE_UNSPECIFIED"
+        CHISImage -> "IMAGE"
+        CHISAvatar -> "AVATAR"
+
+instance FromJSON CardHeaderImageStyle where
+    parseJSON = parseJSONText "CardHeaderImageStyle"
+
+instance ToJSON CardHeaderImageStyle where
+    toJSON = toJSONText
+
+-- | The type of user mention.
+data UserMentionMetadataType
+    = UMMTTypeUnspecified
+      -- ^ @TYPE_UNSPECIFIED@
+      -- Default value for the enum. DO NOT USE.
+    | UMMTAdd
+      -- ^ @ADD@
+      -- Add user to space.
+    | UMMTMention
+      -- ^ @MENTION@
+      -- Mention user in space.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable UserMentionMetadataType
+
+instance FromHttpApiData UserMentionMetadataType where
+    parseQueryParam = \case
+        "TYPE_UNSPECIFIED" -> Right UMMTTypeUnspecified
+        "ADD" -> Right UMMTAdd
+        "MENTION" -> Right UMMTMention
+        x -> Left ("Unable to parse UserMentionMetadataType from: " <> x)
+
+instance ToHttpApiData UserMentionMetadataType where
+    toQueryParam = \case
+        UMMTTypeUnspecified -> "TYPE_UNSPECIFIED"
+        UMMTAdd -> "ADD"
+        UMMTMention -> "MENTION"
+
+instance FromJSON UserMentionMetadataType where
+    parseJSON = parseJSONText "UserMentionMetadataType"
+
+instance ToJSON UserMentionMetadataType where
+    toJSON = toJSONText
+
+-- | Output only. The type of a space.
+data SpaceType
+    = STTypeUnspecified
+      -- ^ @TYPE_UNSPECIFIED@
+    | STRoom
+      -- ^ @ROOM@
+      -- A chat space where memberships are free to change. Messages in rooms are
+      -- threaded.
+    | STDM
+      -- ^ @DM@
+      -- 1:1 Direct Message between a human and a bot, where all messages are
+      -- flat.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable SpaceType
+
+instance FromHttpApiData SpaceType where
+    parseQueryParam = \case
+        "TYPE_UNSPECIFIED" -> Right STTypeUnspecified
+        "ROOM" -> Right STRoom
+        "DM" -> Right STDM
+        x -> Left ("Unable to parse SpaceType from: " <> x)
+
+instance ToHttpApiData SpaceType where
+    toQueryParam = \case
+        STTypeUnspecified -> "TYPE_UNSPECIFIED"
+        STRoom -> "ROOM"
+        STDM -> "DM"
+
+instance FromJSON SpaceType where
+    parseJSON = parseJSONText "SpaceType"
+
+instance ToJSON SpaceType where
+    toJSON = toJSONText
+
+-- | The type of this annotation.
+data AnnotationType
+    = AnnotationTypeUnspecified
+      -- ^ @ANNOTATION_TYPE_UNSPECIFIED@
+      -- Default value for the enum. DO NOT USE.
+    | UserMention
+      -- ^ @USER_MENTION@
+      -- A user is mentioned.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable AnnotationType
+
+instance FromHttpApiData AnnotationType where
+    parseQueryParam = \case
+        "ANNOTATION_TYPE_UNSPECIFIED" -> Right AnnotationTypeUnspecified
+        "USER_MENTION" -> Right UserMention
+        x -> Left ("Unable to parse AnnotationType from: " <> x)
+
+instance ToHttpApiData AnnotationType where
+    toQueryParam = \case
+        AnnotationTypeUnspecified -> "ANNOTATION_TYPE_UNSPECIFIED"
+        UserMention -> "USER_MENTION"
+
+instance FromJSON AnnotationType where
+    parseJSON = parseJSONText "AnnotationType"
+
+instance ToJSON AnnotationType where
+    toJSON = toJSONText
+
+-- | The icon specified by an enum that indices to an icon provided by Chat
+-- API.
+data ImageButtonIcon
+    = IBIIconUnspecified
+      -- ^ @ICON_UNSPECIFIED@
+    | IBIAirplane
+      -- ^ @AIRPLANE@
+    | IBIBookmark
+      -- ^ @BOOKMARK@
+    | IBIBus
+      -- ^ @BUS@
+    | IBICar
+      -- ^ @CAR@
+    | IBIClock
+      -- ^ @CLOCK@
+    | IBIConfirmationNumberIcon
+      -- ^ @CONFIRMATION_NUMBER_ICON@
+    | IBIDollar
+      -- ^ @DOLLAR@
+    | IBIDescription
+      -- ^ @DESCRIPTION@
+    | IBIEmail
+      -- ^ @EMAIL@
+    | IBIEventPerformer
+      -- ^ @EVENT_PERFORMER@
+    | IBIEventSeat
+      -- ^ @EVENT_SEAT@
+    | IBIFlightArrival
+      -- ^ @FLIGHT_ARRIVAL@
+    | IBIFlightDeParture
+      -- ^ @FLIGHT_DEPARTURE@
+    | IBIHotel
+      -- ^ @HOTEL@
+    | IBIHotelRoomType
+      -- ^ @HOTEL_ROOM_TYPE@
+    | IBIInvite
+      -- ^ @INVITE@
+    | IBIMapPin
+      -- ^ @MAP_PIN@
+    | IBIMembership
+      -- ^ @MEMBERSHIP@
+    | IBIMultiplePeople
+      -- ^ @MULTIPLE_PEOPLE@
+    | IBIOffer
+      -- ^ @OFFER@
+    | IBIPerson
+      -- ^ @PERSON@
+    | IBIPhone
+      -- ^ @PHONE@
+    | IBIRestaurantIcon
+      -- ^ @RESTAURANT_ICON@
+    | IBIShoppingCart
+      -- ^ @SHOPPING_CART@
+    | IBIStar
+      -- ^ @STAR@
+    | IBIStore
+      -- ^ @STORE@
+    | IBITicket
+      -- ^ @TICKET@
+    | IBITrain
+      -- ^ @TRAIN@
+    | IBIVideoCamera
+      -- ^ @VIDEO_CAMERA@
+    | IBIVideoPlay
+      -- ^ @VIDEO_PLAY@
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable ImageButtonIcon
+
+instance FromHttpApiData ImageButtonIcon where
+    parseQueryParam = \case
+        "ICON_UNSPECIFIED" -> Right IBIIconUnspecified
+        "AIRPLANE" -> Right IBIAirplane
+        "BOOKMARK" -> Right IBIBookmark
+        "BUS" -> Right IBIBus
+        "CAR" -> Right IBICar
+        "CLOCK" -> Right IBIClock
+        "CONFIRMATION_NUMBER_ICON" -> Right IBIConfirmationNumberIcon
+        "DOLLAR" -> Right IBIDollar
+        "DESCRIPTION" -> Right IBIDescription
+        "EMAIL" -> Right IBIEmail
+        "EVENT_PERFORMER" -> Right IBIEventPerformer
+        "EVENT_SEAT" -> Right IBIEventSeat
+        "FLIGHT_ARRIVAL" -> Right IBIFlightArrival
+        "FLIGHT_DEPARTURE" -> Right IBIFlightDeParture
+        "HOTEL" -> Right IBIHotel
+        "HOTEL_ROOM_TYPE" -> Right IBIHotelRoomType
+        "INVITE" -> Right IBIInvite
+        "MAP_PIN" -> Right IBIMapPin
+        "MEMBERSHIP" -> Right IBIMembership
+        "MULTIPLE_PEOPLE" -> Right IBIMultiplePeople
+        "OFFER" -> Right IBIOffer
+        "PERSON" -> Right IBIPerson
+        "PHONE" -> Right IBIPhone
+        "RESTAURANT_ICON" -> Right IBIRestaurantIcon
+        "SHOPPING_CART" -> Right IBIShoppingCart
+        "STAR" -> Right IBIStar
+        "STORE" -> Right IBIStore
+        "TICKET" -> Right IBITicket
+        "TRAIN" -> Right IBITrain
+        "VIDEO_CAMERA" -> Right IBIVideoCamera
+        "VIDEO_PLAY" -> Right IBIVideoPlay
+        x -> Left ("Unable to parse ImageButtonIcon from: " <> x)
+
+instance ToHttpApiData ImageButtonIcon where
+    toQueryParam = \case
+        IBIIconUnspecified -> "ICON_UNSPECIFIED"
+        IBIAirplane -> "AIRPLANE"
+        IBIBookmark -> "BOOKMARK"
+        IBIBus -> "BUS"
+        IBICar -> "CAR"
+        IBIClock -> "CLOCK"
+        IBIConfirmationNumberIcon -> "CONFIRMATION_NUMBER_ICON"
+        IBIDollar -> "DOLLAR"
+        IBIDescription -> "DESCRIPTION"
+        IBIEmail -> "EMAIL"
+        IBIEventPerformer -> "EVENT_PERFORMER"
+        IBIEventSeat -> "EVENT_SEAT"
+        IBIFlightArrival -> "FLIGHT_ARRIVAL"
+        IBIFlightDeParture -> "FLIGHT_DEPARTURE"
+        IBIHotel -> "HOTEL"
+        IBIHotelRoomType -> "HOTEL_ROOM_TYPE"
+        IBIInvite -> "INVITE"
+        IBIMapPin -> "MAP_PIN"
+        IBIMembership -> "MEMBERSHIP"
+        IBIMultiplePeople -> "MULTIPLE_PEOPLE"
+        IBIOffer -> "OFFER"
+        IBIPerson -> "PERSON"
+        IBIPhone -> "PHONE"
+        IBIRestaurantIcon -> "RESTAURANT_ICON"
+        IBIShoppingCart -> "SHOPPING_CART"
+        IBIStar -> "STAR"
+        IBIStore -> "STORE"
+        IBITicket -> "TICKET"
+        IBITrain -> "TRAIN"
+        IBIVideoCamera -> "VIDEO_CAMERA"
+        IBIVideoPlay -> "VIDEO_PLAY"
+
+instance FromJSON ImageButtonIcon where
+    parseJSON = parseJSONText "ImageButtonIcon"
+
+instance ToJSON ImageButtonIcon 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
+
+-- | The type of the event.
+data DeprecatedEventType
+    = DETUnspecified
+      -- ^ @UNSPECIFIED@
+      -- Default value for the enum. DO NOT USE.
+    | DETMessage
+      -- ^ @MESSAGE@
+      -- A message was sent in a room or direct message.
+    | DETAddedToSpace
+      -- ^ @ADDED_TO_SPACE@
+      -- The bot was added to a room or DM.
+    | DETRemovedFromSpace
+      -- ^ @REMOVED_FROM_SPACE@
+      -- The bot was removed from a room or DM.
+    | DETCardClicked
+      -- ^ @CARD_CLICKED@
+      -- The bot\'s interactive card was clicked.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable DeprecatedEventType
+
+instance FromHttpApiData DeprecatedEventType where
+    parseQueryParam = \case
+        "UNSPECIFIED" -> Right DETUnspecified
+        "MESSAGE" -> Right DETMessage
+        "ADDED_TO_SPACE" -> Right DETAddedToSpace
+        "REMOVED_FROM_SPACE" -> Right DETRemovedFromSpace
+        "CARD_CLICKED" -> Right DETCardClicked
+        x -> Left ("Unable to parse DeprecatedEventType from: " <> x)
+
+instance ToHttpApiData DeprecatedEventType where
+    toQueryParam = \case
+        DETUnspecified -> "UNSPECIFIED"
+        DETMessage -> "MESSAGE"
+        DETAddedToSpace -> "ADDED_TO_SPACE"
+        DETRemovedFromSpace -> "REMOVED_FROM_SPACE"
+        DETCardClicked -> "CARD_CLICKED"
+
+instance FromJSON DeprecatedEventType where
+    parseJSON = parseJSONText "DeprecatedEventType"
+
+instance ToJSON DeprecatedEventType where
+    toJSON = toJSONText
+
+-- | User type.
+data UserType
+    = UTTypeUnspecified
+      -- ^ @TYPE_UNSPECIFIED@
+      -- Default value for the enum. DO NOT USE.
+    | UTHuman
+      -- ^ @HUMAN@
+      -- Human user.
+    | UTBot
+      -- ^ @BOT@
+      -- Bot user.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable UserType
+
+instance FromHttpApiData UserType where
+    parseQueryParam = \case
+        "TYPE_UNSPECIFIED" -> Right UTTypeUnspecified
+        "HUMAN" -> Right UTHuman
+        "BOT" -> Right UTBot
+        x -> Left ("Unable to parse UserType from: " <> x)
+
+instance ToHttpApiData UserType where
+    toQueryParam = \case
+        UTTypeUnspecified -> "TYPE_UNSPECIFIED"
+        UTHuman -> "HUMAN"
+        UTBot -> "BOT"
+
+instance FromJSON UserType where
+    parseJSON = parseJSONText "UserType"
+
+instance ToJSON UserType where
+    toJSON = toJSONText
diff --git a/gen/Network/Google/Resource/Chat/Spaces/Get.hs b/gen/Network/Google/Resource/Chat/Spaces/Get.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/Chat/Spaces/Get.hs
@@ -0,0 +1,142 @@
+{-# 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.Chat.Spaces.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)
+--
+-- Returns a space.
+--
+-- /See:/ <https://developers.google.com/hangouts/chat Hangouts Chat API Reference> for @chat.spaces.get@.
+module Network.Google.Resource.Chat.Spaces.Get
+    (
+    -- * REST Resource
+      SpacesGetResource
+
+    -- * Creating a Request
+    , spacesGet
+    , SpacesGet
+
+    -- * Request Lenses
+    , sgXgafv
+    , sgUploadProtocol
+    , sgAccessToken
+    , sgUploadType
+    , sgName
+    , sgCallback
+    ) where
+
+import           Network.Google.Chat.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @chat.spaces.get@ method which the
+-- 'SpacesGet' request conforms to.
+type SpacesGetResource =
+     "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] Space
+
+-- | Returns a space.
+--
+-- /See:/ 'spacesGet' smart constructor.
+data SpacesGet = SpacesGet'
+    { _sgXgafv          :: !(Maybe Xgafv)
+    , _sgUploadProtocol :: !(Maybe Text)
+    , _sgAccessToken    :: !(Maybe Text)
+    , _sgUploadType     :: !(Maybe Text)
+    , _sgName           :: !Text
+    , _sgCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SpacesGet' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sgXgafv'
+--
+-- * 'sgUploadProtocol'
+--
+-- * 'sgAccessToken'
+--
+-- * 'sgUploadType'
+--
+-- * 'sgName'
+--
+-- * 'sgCallback'
+spacesGet
+    :: Text -- ^ 'sgName'
+    -> SpacesGet
+spacesGet pSgName_ =
+    SpacesGet'
+    { _sgXgafv = Nothing
+    , _sgUploadProtocol = Nothing
+    , _sgAccessToken = Nothing
+    , _sgUploadType = Nothing
+    , _sgName = pSgName_
+    , _sgCallback = Nothing
+    }
+
+-- | V1 error format.
+sgXgafv :: Lens' SpacesGet (Maybe Xgafv)
+sgXgafv = lens _sgXgafv (\ s a -> s{_sgXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+sgUploadProtocol :: Lens' SpacesGet (Maybe Text)
+sgUploadProtocol
+  = lens _sgUploadProtocol
+      (\ s a -> s{_sgUploadProtocol = a})
+
+-- | OAuth access token.
+sgAccessToken :: Lens' SpacesGet (Maybe Text)
+sgAccessToken
+  = lens _sgAccessToken
+      (\ s a -> s{_sgAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+sgUploadType :: Lens' SpacesGet (Maybe Text)
+sgUploadType
+  = lens _sgUploadType (\ s a -> s{_sgUploadType = a})
+
+-- | Required. Resource name of the space, in the form \"spaces\/*\".
+-- Example: spaces\/AAAAMpdlehY
+sgName :: Lens' SpacesGet Text
+sgName = lens _sgName (\ s a -> s{_sgName = a})
+
+-- | JSONP
+sgCallback :: Lens' SpacesGet (Maybe Text)
+sgCallback
+  = lens _sgCallback (\ s a -> s{_sgCallback = a})
+
+instance GoogleRequest SpacesGet where
+        type Rs SpacesGet = Space
+        type Scopes SpacesGet = '[]
+        requestClient SpacesGet'{..}
+          = go _sgName _sgXgafv _sgUploadProtocol
+              _sgAccessToken
+              _sgUploadType
+              _sgCallback
+              (Just AltJSON)
+              chatService
+          where go
+                  = buildClient (Proxy :: Proxy SpacesGetResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/Chat/Spaces/List.hs b/gen/Network/Google/Resource/Chat/Spaces/List.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/Chat/Spaces/List.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.Chat.Spaces.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 spaces the caller is a member of.
+--
+-- /See:/ <https://developers.google.com/hangouts/chat Hangouts Chat API Reference> for @chat.spaces.list@.
+module Network.Google.Resource.Chat.Spaces.List
+    (
+    -- * REST Resource
+      SpacesListResource
+
+    -- * Creating a Request
+    , spacesList
+    , SpacesList
+
+    -- * Request Lenses
+    , slXgafv
+    , slUploadProtocol
+    , slAccessToken
+    , slUploadType
+    , slPageToken
+    , slPageSize
+    , slCallback
+    ) where
+
+import           Network.Google.Chat.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @chat.spaces.list@ method which the
+-- 'SpacesList' request conforms to.
+type SpacesListResource =
+     "v1" :>
+       "spaces" :>
+         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] ListSpacesResponse
+
+-- | Lists spaces the caller is a member of.
+--
+-- /See:/ 'spacesList' smart constructor.
+data SpacesList = SpacesList'
+    { _slXgafv          :: !(Maybe Xgafv)
+    , _slUploadProtocol :: !(Maybe Text)
+    , _slAccessToken    :: !(Maybe Text)
+    , _slUploadType     :: !(Maybe Text)
+    , _slPageToken      :: !(Maybe Text)
+    , _slPageSize       :: !(Maybe (Textual Int32))
+    , _slCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SpacesList' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'slXgafv'
+--
+-- * 'slUploadProtocol'
+--
+-- * 'slAccessToken'
+--
+-- * 'slUploadType'
+--
+-- * 'slPageToken'
+--
+-- * 'slPageSize'
+--
+-- * 'slCallback'
+spacesList
+    :: SpacesList
+spacesList =
+    SpacesList'
+    { _slXgafv = Nothing
+    , _slUploadProtocol = Nothing
+    , _slAccessToken = Nothing
+    , _slUploadType = Nothing
+    , _slPageToken = Nothing
+    , _slPageSize = Nothing
+    , _slCallback = Nothing
+    }
+
+-- | V1 error format.
+slXgafv :: Lens' SpacesList (Maybe Xgafv)
+slXgafv = lens _slXgafv (\ s a -> s{_slXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+slUploadProtocol :: Lens' SpacesList (Maybe Text)
+slUploadProtocol
+  = lens _slUploadProtocol
+      (\ s a -> s{_slUploadProtocol = a})
+
+-- | OAuth access token.
+slAccessToken :: Lens' SpacesList (Maybe Text)
+slAccessToken
+  = lens _slAccessToken
+      (\ s a -> s{_slAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+slUploadType :: Lens' SpacesList (Maybe Text)
+slUploadType
+  = lens _slUploadType (\ s a -> s{_slUploadType = a})
+
+-- | A token identifying a page of results the server should return.
+slPageToken :: Lens' SpacesList (Maybe Text)
+slPageToken
+  = lens _slPageToken (\ s a -> s{_slPageToken = a})
+
+-- | Requested page size. The value is capped at 1000. Server may return
+-- fewer results than requested. If unspecified, server will default to
+-- 100.
+slPageSize :: Lens' SpacesList (Maybe Int32)
+slPageSize
+  = lens _slPageSize (\ s a -> s{_slPageSize = a}) .
+      mapping _Coerce
+
+-- | JSONP
+slCallback :: Lens' SpacesList (Maybe Text)
+slCallback
+  = lens _slCallback (\ s a -> s{_slCallback = a})
+
+instance GoogleRequest SpacesList where
+        type Rs SpacesList = ListSpacesResponse
+        type Scopes SpacesList = '[]
+        requestClient SpacesList'{..}
+          = go _slXgafv _slUploadProtocol _slAccessToken
+              _slUploadType
+              _slPageToken
+              _slPageSize
+              _slCallback
+              (Just AltJSON)
+              chatService
+          where go
+                  = buildClient (Proxy :: Proxy SpacesListResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/Chat/Spaces/Members/Get.hs b/gen/Network/Google/Resource/Chat/Spaces/Members/Get.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/Chat/Spaces/Members/Get.hs
@@ -0,0 +1,145 @@
+{-# 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.Chat.Spaces.Members.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)
+--
+-- Returns a membership.
+--
+-- /See:/ <https://developers.google.com/hangouts/chat Hangouts Chat API Reference> for @chat.spaces.members.get@.
+module Network.Google.Resource.Chat.Spaces.Members.Get
+    (
+    -- * REST Resource
+      SpacesMembersGetResource
+
+    -- * Creating a Request
+    , spacesMembersGet
+    , SpacesMembersGet
+
+    -- * Request Lenses
+    , spaXgafv
+    , spaUploadProtocol
+    , spaAccessToken
+    , spaUploadType
+    , spaName
+    , spaCallback
+    ) where
+
+import           Network.Google.Chat.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @chat.spaces.members.get@ method which the
+-- 'SpacesMembersGet' request conforms to.
+type SpacesMembersGetResource =
+     "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] Membership
+
+-- | Returns a membership.
+--
+-- /See:/ 'spacesMembersGet' smart constructor.
+data SpacesMembersGet = SpacesMembersGet'
+    { _spaXgafv          :: !(Maybe Xgafv)
+    , _spaUploadProtocol :: !(Maybe Text)
+    , _spaAccessToken    :: !(Maybe Text)
+    , _spaUploadType     :: !(Maybe Text)
+    , _spaName           :: !Text
+    , _spaCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SpacesMembersGet' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'spaXgafv'
+--
+-- * 'spaUploadProtocol'
+--
+-- * 'spaAccessToken'
+--
+-- * 'spaUploadType'
+--
+-- * 'spaName'
+--
+-- * 'spaCallback'
+spacesMembersGet
+    :: Text -- ^ 'spaName'
+    -> SpacesMembersGet
+spacesMembersGet pSpaName_ =
+    SpacesMembersGet'
+    { _spaXgafv = Nothing
+    , _spaUploadProtocol = Nothing
+    , _spaAccessToken = Nothing
+    , _spaUploadType = Nothing
+    , _spaName = pSpaName_
+    , _spaCallback = Nothing
+    }
+
+-- | V1 error format.
+spaXgafv :: Lens' SpacesMembersGet (Maybe Xgafv)
+spaXgafv = lens _spaXgafv (\ s a -> s{_spaXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+spaUploadProtocol :: Lens' SpacesMembersGet (Maybe Text)
+spaUploadProtocol
+  = lens _spaUploadProtocol
+      (\ s a -> s{_spaUploadProtocol = a})
+
+-- | OAuth access token.
+spaAccessToken :: Lens' SpacesMembersGet (Maybe Text)
+spaAccessToken
+  = lens _spaAccessToken
+      (\ s a -> s{_spaAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+spaUploadType :: Lens' SpacesMembersGet (Maybe Text)
+spaUploadType
+  = lens _spaUploadType
+      (\ s a -> s{_spaUploadType = a})
+
+-- | Required. Resource name of the membership to be retrieved, in the form
+-- \"spaces\/*\/members\/*\". Example:
+-- spaces\/AAAAMpdlehY\/members\/105115627578887013105
+spaName :: Lens' SpacesMembersGet Text
+spaName = lens _spaName (\ s a -> s{_spaName = a})
+
+-- | JSONP
+spaCallback :: Lens' SpacesMembersGet (Maybe Text)
+spaCallback
+  = lens _spaCallback (\ s a -> s{_spaCallback = a})
+
+instance GoogleRequest SpacesMembersGet where
+        type Rs SpacesMembersGet = Membership
+        type Scopes SpacesMembersGet = '[]
+        requestClient SpacesMembersGet'{..}
+          = go _spaName _spaXgafv _spaUploadProtocol
+              _spaAccessToken
+              _spaUploadType
+              _spaCallback
+              (Just AltJSON)
+              chatService
+          where go
+                  = buildClient
+                      (Proxy :: Proxy SpacesMembersGetResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/Chat/Spaces/Members/List.hs b/gen/Network/Google/Resource/Chat/Spaces/Members/List.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/Chat/Spaces/Members/List.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.Chat.Spaces.Members.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 human memberships in a space.
+--
+-- /See:/ <https://developers.google.com/hangouts/chat Hangouts Chat API Reference> for @chat.spaces.members.list@.
+module Network.Google.Resource.Chat.Spaces.Members.List
+    (
+    -- * REST Resource
+      SpacesMembersListResource
+
+    -- * Creating a Request
+    , spacesMembersList
+    , SpacesMembersList
+
+    -- * Request Lenses
+    , smlParent
+    , smlXgafv
+    , smlUploadProtocol
+    , smlAccessToken
+    , smlUploadType
+    , smlPageToken
+    , smlPageSize
+    , smlCallback
+    ) where
+
+import           Network.Google.Chat.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @chat.spaces.members.list@ method which the
+-- 'SpacesMembersList' request conforms to.
+type SpacesMembersListResource =
+     "v1" :>
+       Capture "parent" Text :>
+         "members" :>
+           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] ListMembershipsResponse
+
+-- | Lists human memberships in a space.
+--
+-- /See:/ 'spacesMembersList' smart constructor.
+data SpacesMembersList = SpacesMembersList'
+    { _smlParent         :: !Text
+    , _smlXgafv          :: !(Maybe Xgafv)
+    , _smlUploadProtocol :: !(Maybe Text)
+    , _smlAccessToken    :: !(Maybe Text)
+    , _smlUploadType     :: !(Maybe Text)
+    , _smlPageToken      :: !(Maybe Text)
+    , _smlPageSize       :: !(Maybe (Textual Int32))
+    , _smlCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SpacesMembersList' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'smlParent'
+--
+-- * 'smlXgafv'
+--
+-- * 'smlUploadProtocol'
+--
+-- * 'smlAccessToken'
+--
+-- * 'smlUploadType'
+--
+-- * 'smlPageToken'
+--
+-- * 'smlPageSize'
+--
+-- * 'smlCallback'
+spacesMembersList
+    :: Text -- ^ 'smlParent'
+    -> SpacesMembersList
+spacesMembersList pSmlParent_ =
+    SpacesMembersList'
+    { _smlParent = pSmlParent_
+    , _smlXgafv = Nothing
+    , _smlUploadProtocol = Nothing
+    , _smlAccessToken = Nothing
+    , _smlUploadType = Nothing
+    , _smlPageToken = Nothing
+    , _smlPageSize = Nothing
+    , _smlCallback = Nothing
+    }
+
+-- | Required. The resource name of the space for which membership list is to
+-- be fetched, in the form \"spaces\/*\". Example: spaces\/AAAAMpdlehY
+smlParent :: Lens' SpacesMembersList Text
+smlParent
+  = lens _smlParent (\ s a -> s{_smlParent = a})
+
+-- | V1 error format.
+smlXgafv :: Lens' SpacesMembersList (Maybe Xgafv)
+smlXgafv = lens _smlXgafv (\ s a -> s{_smlXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+smlUploadProtocol :: Lens' SpacesMembersList (Maybe Text)
+smlUploadProtocol
+  = lens _smlUploadProtocol
+      (\ s a -> s{_smlUploadProtocol = a})
+
+-- | OAuth access token.
+smlAccessToken :: Lens' SpacesMembersList (Maybe Text)
+smlAccessToken
+  = lens _smlAccessToken
+      (\ s a -> s{_smlAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+smlUploadType :: Lens' SpacesMembersList (Maybe Text)
+smlUploadType
+  = lens _smlUploadType
+      (\ s a -> s{_smlUploadType = a})
+
+-- | A token identifying a page of results the server should return.
+smlPageToken :: Lens' SpacesMembersList (Maybe Text)
+smlPageToken
+  = lens _smlPageToken (\ s a -> s{_smlPageToken = a})
+
+-- | Requested page size. The value is capped at 1000. Server may return
+-- fewer results than requested. If unspecified, server will default to
+-- 100.
+smlPageSize :: Lens' SpacesMembersList (Maybe Int32)
+smlPageSize
+  = lens _smlPageSize (\ s a -> s{_smlPageSize = a}) .
+      mapping _Coerce
+
+-- | JSONP
+smlCallback :: Lens' SpacesMembersList (Maybe Text)
+smlCallback
+  = lens _smlCallback (\ s a -> s{_smlCallback = a})
+
+instance GoogleRequest SpacesMembersList where
+        type Rs SpacesMembersList = ListMembershipsResponse
+        type Scopes SpacesMembersList = '[]
+        requestClient SpacesMembersList'{..}
+          = go _smlParent _smlXgafv _smlUploadProtocol
+              _smlAccessToken
+              _smlUploadType
+              _smlPageToken
+              _smlPageSize
+              _smlCallback
+              (Just AltJSON)
+              chatService
+          where go
+                  = buildClient
+                      (Proxy :: Proxy SpacesMembersListResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/Chat/Spaces/Messages/Create.hs b/gen/Network/Google/Resource/Chat/Spaces/Messages/Create.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/Chat/Spaces/Messages/Create.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.Chat.Spaces.Messages.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 message.
+--
+-- /See:/ <https://developers.google.com/hangouts/chat Hangouts Chat API Reference> for @chat.spaces.messages.create@.
+module Network.Google.Resource.Chat.Spaces.Messages.Create
+    (
+    -- * REST Resource
+      SpacesMessagesCreateResource
+
+    -- * Creating a Request
+    , spacesMessagesCreate
+    , SpacesMessagesCreate
+
+    -- * Request Lenses
+    , smcParent
+    , smcXgafv
+    , smcUploadProtocol
+    , smcAccessToken
+    , smcUploadType
+    , smcPayload
+    , smcCallback
+    , smcThreadKey
+    ) where
+
+import           Network.Google.Chat.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @chat.spaces.messages.create@ method which the
+-- 'SpacesMessagesCreate' request conforms to.
+type SpacesMessagesCreateResource =
+     "v1" :>
+       Capture "parent" Text :>
+         "messages" :>
+           QueryParam "$.xgafv" Xgafv :>
+             QueryParam "upload_protocol" Text :>
+               QueryParam "access_token" Text :>
+                 QueryParam "uploadType" Text :>
+                   QueryParam "callback" Text :>
+                     QueryParam "threadKey" Text :>
+                       QueryParam "alt" AltJSON :>
+                         ReqBody '[JSON] Message :> Post '[JSON] Message
+
+-- | Creates a message.
+--
+-- /See:/ 'spacesMessagesCreate' smart constructor.
+data SpacesMessagesCreate = SpacesMessagesCreate'
+    { _smcParent         :: !Text
+    , _smcXgafv          :: !(Maybe Xgafv)
+    , _smcUploadProtocol :: !(Maybe Text)
+    , _smcAccessToken    :: !(Maybe Text)
+    , _smcUploadType     :: !(Maybe Text)
+    , _smcPayload        :: !Message
+    , _smcCallback       :: !(Maybe Text)
+    , _smcThreadKey      :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SpacesMessagesCreate' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'smcParent'
+--
+-- * 'smcXgafv'
+--
+-- * 'smcUploadProtocol'
+--
+-- * 'smcAccessToken'
+--
+-- * 'smcUploadType'
+--
+-- * 'smcPayload'
+--
+-- * 'smcCallback'
+--
+-- * 'smcThreadKey'
+spacesMessagesCreate
+    :: Text -- ^ 'smcParent'
+    -> Message -- ^ 'smcPayload'
+    -> SpacesMessagesCreate
+spacesMessagesCreate pSmcParent_ pSmcPayload_ =
+    SpacesMessagesCreate'
+    { _smcParent = pSmcParent_
+    , _smcXgafv = Nothing
+    , _smcUploadProtocol = Nothing
+    , _smcAccessToken = Nothing
+    , _smcUploadType = Nothing
+    , _smcPayload = pSmcPayload_
+    , _smcCallback = Nothing
+    , _smcThreadKey = Nothing
+    }
+
+-- | Required. Space resource name, in the form \"spaces\/*\". Example:
+-- spaces\/AAAAMpdlehY
+smcParent :: Lens' SpacesMessagesCreate Text
+smcParent
+  = lens _smcParent (\ s a -> s{_smcParent = a})
+
+-- | V1 error format.
+smcXgafv :: Lens' SpacesMessagesCreate (Maybe Xgafv)
+smcXgafv = lens _smcXgafv (\ s a -> s{_smcXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+smcUploadProtocol :: Lens' SpacesMessagesCreate (Maybe Text)
+smcUploadProtocol
+  = lens _smcUploadProtocol
+      (\ s a -> s{_smcUploadProtocol = a})
+
+-- | OAuth access token.
+smcAccessToken :: Lens' SpacesMessagesCreate (Maybe Text)
+smcAccessToken
+  = lens _smcAccessToken
+      (\ s a -> s{_smcAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+smcUploadType :: Lens' SpacesMessagesCreate (Maybe Text)
+smcUploadType
+  = lens _smcUploadType
+      (\ s a -> s{_smcUploadType = a})
+
+-- | Multipart request metadata.
+smcPayload :: Lens' SpacesMessagesCreate Message
+smcPayload
+  = lens _smcPayload (\ s a -> s{_smcPayload = a})
+
+-- | JSONP
+smcCallback :: Lens' SpacesMessagesCreate (Maybe Text)
+smcCallback
+  = lens _smcCallback (\ s a -> s{_smcCallback = a})
+
+-- | Opaque thread identifier string that can be specified to group messages
+-- into a single thread. If this is the first message with a given thread
+-- identifier, a new thread is created. Subsequent messages with the same
+-- thread identifier will be posted into the same thread. This relieves
+-- bots and webhooks from having to store the Hangouts Chat thread ID of a
+-- thread (created earlier by them) to post further updates to it. Has no
+-- effect if thread field, corresponding to an existing thread, is set in
+-- message.
+smcThreadKey :: Lens' SpacesMessagesCreate (Maybe Text)
+smcThreadKey
+  = lens _smcThreadKey (\ s a -> s{_smcThreadKey = a})
+
+instance GoogleRequest SpacesMessagesCreate where
+        type Rs SpacesMessagesCreate = Message
+        type Scopes SpacesMessagesCreate = '[]
+        requestClient SpacesMessagesCreate'{..}
+          = go _smcParent _smcXgafv _smcUploadProtocol
+              _smcAccessToken
+              _smcUploadType
+              _smcCallback
+              _smcThreadKey
+              (Just AltJSON)
+              _smcPayload
+              chatService
+          where go
+                  = buildClient
+                      (Proxy :: Proxy SpacesMessagesCreateResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/Chat/Spaces/Messages/Delete.hs b/gen/Network/Google/Resource/Chat/Spaces/Messages/Delete.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/Chat/Spaces/Messages/Delete.hs
@@ -0,0 +1,145 @@
+{-# 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.Chat.Spaces.Messages.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 message.
+--
+-- /See:/ <https://developers.google.com/hangouts/chat Hangouts Chat API Reference> for @chat.spaces.messages.delete@.
+module Network.Google.Resource.Chat.Spaces.Messages.Delete
+    (
+    -- * REST Resource
+      SpacesMessagesDeleteResource
+
+    -- * Creating a Request
+    , spacesMessagesDelete
+    , SpacesMessagesDelete
+
+    -- * Request Lenses
+    , smdXgafv
+    , smdUploadProtocol
+    , smdAccessToken
+    , smdUploadType
+    , smdName
+    , smdCallback
+    ) where
+
+import           Network.Google.Chat.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @chat.spaces.messages.delete@ method which the
+-- 'SpacesMessagesDelete' request conforms to.
+type SpacesMessagesDeleteResource =
+     "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 message.
+--
+-- /See:/ 'spacesMessagesDelete' smart constructor.
+data SpacesMessagesDelete = SpacesMessagesDelete'
+    { _smdXgafv          :: !(Maybe Xgafv)
+    , _smdUploadProtocol :: !(Maybe Text)
+    , _smdAccessToken    :: !(Maybe Text)
+    , _smdUploadType     :: !(Maybe Text)
+    , _smdName           :: !Text
+    , _smdCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SpacesMessagesDelete' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'smdXgafv'
+--
+-- * 'smdUploadProtocol'
+--
+-- * 'smdAccessToken'
+--
+-- * 'smdUploadType'
+--
+-- * 'smdName'
+--
+-- * 'smdCallback'
+spacesMessagesDelete
+    :: Text -- ^ 'smdName'
+    -> SpacesMessagesDelete
+spacesMessagesDelete pSmdName_ =
+    SpacesMessagesDelete'
+    { _smdXgafv = Nothing
+    , _smdUploadProtocol = Nothing
+    , _smdAccessToken = Nothing
+    , _smdUploadType = Nothing
+    , _smdName = pSmdName_
+    , _smdCallback = Nothing
+    }
+
+-- | V1 error format.
+smdXgafv :: Lens' SpacesMessagesDelete (Maybe Xgafv)
+smdXgafv = lens _smdXgafv (\ s a -> s{_smdXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+smdUploadProtocol :: Lens' SpacesMessagesDelete (Maybe Text)
+smdUploadProtocol
+  = lens _smdUploadProtocol
+      (\ s a -> s{_smdUploadProtocol = a})
+
+-- | OAuth access token.
+smdAccessToken :: Lens' SpacesMessagesDelete (Maybe Text)
+smdAccessToken
+  = lens _smdAccessToken
+      (\ s a -> s{_smdAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+smdUploadType :: Lens' SpacesMessagesDelete (Maybe Text)
+smdUploadType
+  = lens _smdUploadType
+      (\ s a -> s{_smdUploadType = a})
+
+-- | Required. Resource name of the message to be deleted, in the form
+-- \"spaces\/*\/messages\/*\" Example:
+-- spaces\/AAAAMpdlehY\/messages\/UMxbHmzDlr4.UMxbHmzDlr4
+smdName :: Lens' SpacesMessagesDelete Text
+smdName = lens _smdName (\ s a -> s{_smdName = a})
+
+-- | JSONP
+smdCallback :: Lens' SpacesMessagesDelete (Maybe Text)
+smdCallback
+  = lens _smdCallback (\ s a -> s{_smdCallback = a})
+
+instance GoogleRequest SpacesMessagesDelete where
+        type Rs SpacesMessagesDelete = Empty
+        type Scopes SpacesMessagesDelete = '[]
+        requestClient SpacesMessagesDelete'{..}
+          = go _smdName _smdXgafv _smdUploadProtocol
+              _smdAccessToken
+              _smdUploadType
+              _smdCallback
+              (Just AltJSON)
+              chatService
+          where go
+                  = buildClient
+                      (Proxy :: Proxy SpacesMessagesDeleteResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/Chat/Spaces/Messages/Get.hs b/gen/Network/Google/Resource/Chat/Spaces/Messages/Get.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/Chat/Spaces/Messages/Get.hs
@@ -0,0 +1,145 @@
+{-# 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.Chat.Spaces.Messages.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)
+--
+-- Returns a message.
+--
+-- /See:/ <https://developers.google.com/hangouts/chat Hangouts Chat API Reference> for @chat.spaces.messages.get@.
+module Network.Google.Resource.Chat.Spaces.Messages.Get
+    (
+    -- * REST Resource
+      SpacesMessagesGetResource
+
+    -- * Creating a Request
+    , spacesMessagesGet
+    , SpacesMessagesGet
+
+    -- * Request Lenses
+    , smgXgafv
+    , smgUploadProtocol
+    , smgAccessToken
+    , smgUploadType
+    , smgName
+    , smgCallback
+    ) where
+
+import           Network.Google.Chat.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @chat.spaces.messages.get@ method which the
+-- 'SpacesMessagesGet' request conforms to.
+type SpacesMessagesGetResource =
+     "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] Message
+
+-- | Returns a message.
+--
+-- /See:/ 'spacesMessagesGet' smart constructor.
+data SpacesMessagesGet = SpacesMessagesGet'
+    { _smgXgafv          :: !(Maybe Xgafv)
+    , _smgUploadProtocol :: !(Maybe Text)
+    , _smgAccessToken    :: !(Maybe Text)
+    , _smgUploadType     :: !(Maybe Text)
+    , _smgName           :: !Text
+    , _smgCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SpacesMessagesGet' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'smgXgafv'
+--
+-- * 'smgUploadProtocol'
+--
+-- * 'smgAccessToken'
+--
+-- * 'smgUploadType'
+--
+-- * 'smgName'
+--
+-- * 'smgCallback'
+spacesMessagesGet
+    :: Text -- ^ 'smgName'
+    -> SpacesMessagesGet
+spacesMessagesGet pSmgName_ =
+    SpacesMessagesGet'
+    { _smgXgafv = Nothing
+    , _smgUploadProtocol = Nothing
+    , _smgAccessToken = Nothing
+    , _smgUploadType = Nothing
+    , _smgName = pSmgName_
+    , _smgCallback = Nothing
+    }
+
+-- | V1 error format.
+smgXgafv :: Lens' SpacesMessagesGet (Maybe Xgafv)
+smgXgafv = lens _smgXgafv (\ s a -> s{_smgXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+smgUploadProtocol :: Lens' SpacesMessagesGet (Maybe Text)
+smgUploadProtocol
+  = lens _smgUploadProtocol
+      (\ s a -> s{_smgUploadProtocol = a})
+
+-- | OAuth access token.
+smgAccessToken :: Lens' SpacesMessagesGet (Maybe Text)
+smgAccessToken
+  = lens _smgAccessToken
+      (\ s a -> s{_smgAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+smgUploadType :: Lens' SpacesMessagesGet (Maybe Text)
+smgUploadType
+  = lens _smgUploadType
+      (\ s a -> s{_smgUploadType = a})
+
+-- | Required. Resource name of the message to be retrieved, in the form
+-- \"spaces\/*\/messages\/*\". Example:
+-- spaces\/AAAAMpdlehY\/messages\/UMxbHmzDlr4.UMxbHmzDlr4
+smgName :: Lens' SpacesMessagesGet Text
+smgName = lens _smgName (\ s a -> s{_smgName = a})
+
+-- | JSONP
+smgCallback :: Lens' SpacesMessagesGet (Maybe Text)
+smgCallback
+  = lens _smgCallback (\ s a -> s{_smgCallback = a})
+
+instance GoogleRequest SpacesMessagesGet where
+        type Rs SpacesMessagesGet = Message
+        type Scopes SpacesMessagesGet = '[]
+        requestClient SpacesMessagesGet'{..}
+          = go _smgName _smgXgafv _smgUploadProtocol
+              _smgAccessToken
+              _smgUploadType
+              _smgCallback
+              (Just AltJSON)
+              chatService
+          where go
+                  = buildClient
+                      (Proxy :: Proxy SpacesMessagesGetResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/Chat/Spaces/Messages/Update.hs b/gen/Network/Google/Resource/Chat/Spaces/Messages/Update.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/Chat/Spaces/Messages/Update.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.Chat.Spaces.Messages.Update
+-- 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 message.
+--
+-- /See:/ <https://developers.google.com/hangouts/chat Hangouts Chat API Reference> for @chat.spaces.messages.update@.
+module Network.Google.Resource.Chat.Spaces.Messages.Update
+    (
+    -- * REST Resource
+      SpacesMessagesUpdateResource
+
+    -- * Creating a Request
+    , spacesMessagesUpdate
+    , SpacesMessagesUpdate
+
+    -- * Request Lenses
+    , smuXgafv
+    , smuUploadProtocol
+    , smuUpdateMask
+    , smuAccessToken
+    , smuUploadType
+    , smuPayload
+    , smuName
+    , smuCallback
+    ) where
+
+import           Network.Google.Chat.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @chat.spaces.messages.update@ method which the
+-- 'SpacesMessagesUpdate' request conforms to.
+type SpacesMessagesUpdateResource =
+     "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] Message :> Put '[JSON] Message
+
+-- | Updates a message.
+--
+-- /See:/ 'spacesMessagesUpdate' smart constructor.
+data SpacesMessagesUpdate = SpacesMessagesUpdate'
+    { _smuXgafv          :: !(Maybe Xgafv)
+    , _smuUploadProtocol :: !(Maybe Text)
+    , _smuUpdateMask     :: !(Maybe GFieldMask)
+    , _smuAccessToken    :: !(Maybe Text)
+    , _smuUploadType     :: !(Maybe Text)
+    , _smuPayload        :: !Message
+    , _smuName           :: !Text
+    , _smuCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SpacesMessagesUpdate' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'smuXgafv'
+--
+-- * 'smuUploadProtocol'
+--
+-- * 'smuUpdateMask'
+--
+-- * 'smuAccessToken'
+--
+-- * 'smuUploadType'
+--
+-- * 'smuPayload'
+--
+-- * 'smuName'
+--
+-- * 'smuCallback'
+spacesMessagesUpdate
+    :: Message -- ^ 'smuPayload'
+    -> Text -- ^ 'smuName'
+    -> SpacesMessagesUpdate
+spacesMessagesUpdate pSmuPayload_ pSmuName_ =
+    SpacesMessagesUpdate'
+    { _smuXgafv = Nothing
+    , _smuUploadProtocol = Nothing
+    , _smuUpdateMask = Nothing
+    , _smuAccessToken = Nothing
+    , _smuUploadType = Nothing
+    , _smuPayload = pSmuPayload_
+    , _smuName = pSmuName_
+    , _smuCallback = Nothing
+    }
+
+-- | V1 error format.
+smuXgafv :: Lens' SpacesMessagesUpdate (Maybe Xgafv)
+smuXgafv = lens _smuXgafv (\ s a -> s{_smuXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+smuUploadProtocol :: Lens' SpacesMessagesUpdate (Maybe Text)
+smuUploadProtocol
+  = lens _smuUploadProtocol
+      (\ s a -> s{_smuUploadProtocol = a})
+
+-- | Required. The field paths to be updated. Currently supported field
+-- paths: \"text\", \"cards\".
+smuUpdateMask :: Lens' SpacesMessagesUpdate (Maybe GFieldMask)
+smuUpdateMask
+  = lens _smuUpdateMask
+      (\ s a -> s{_smuUpdateMask = a})
+
+-- | OAuth access token.
+smuAccessToken :: Lens' SpacesMessagesUpdate (Maybe Text)
+smuAccessToken
+  = lens _smuAccessToken
+      (\ s a -> s{_smuAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+smuUploadType :: Lens' SpacesMessagesUpdate (Maybe Text)
+smuUploadType
+  = lens _smuUploadType
+      (\ s a -> s{_smuUploadType = a})
+
+-- | Multipart request metadata.
+smuPayload :: Lens' SpacesMessagesUpdate Message
+smuPayload
+  = lens _smuPayload (\ s a -> s{_smuPayload = a})
+
+-- | Resource name, in the form \"spaces\/*\/messages\/*\". Example:
+-- spaces\/AAAAMpdlehY\/messages\/UMxbHmzDlr4.UMxbHmzDlr4
+smuName :: Lens' SpacesMessagesUpdate Text
+smuName = lens _smuName (\ s a -> s{_smuName = a})
+
+-- | JSONP
+smuCallback :: Lens' SpacesMessagesUpdate (Maybe Text)
+smuCallback
+  = lens _smuCallback (\ s a -> s{_smuCallback = a})
+
+instance GoogleRequest SpacesMessagesUpdate where
+        type Rs SpacesMessagesUpdate = Message
+        type Scopes SpacesMessagesUpdate = '[]
+        requestClient SpacesMessagesUpdate'{..}
+          = go _smuName _smuXgafv _smuUploadProtocol
+              _smuUpdateMask
+              _smuAccessToken
+              _smuUploadType
+              _smuCallback
+              (Just AltJSON)
+              _smuPayload
+              chatService
+          where go
+                  = buildClient
+                      (Proxy :: Proxy SpacesMessagesUpdateResource)
+                      mempty
diff --git a/gogol-chat.cabal b/gogol-chat.cabal
new file mode 100644
--- /dev/null
+++ b/gogol-chat.cabal
@@ -0,0 +1,53 @@
+name:                  gogol-chat
+version:               0.4.0
+synopsis:              Google Hangouts Chat 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:
+    Enables bots to fetch information and perform actions in Hangouts Chat.
+    .
+    /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.Chat
+        , Network.Google.Chat.Types
+        , Network.Google.Resource.Chat.Spaces.Get
+        , Network.Google.Resource.Chat.Spaces.List
+        , Network.Google.Resource.Chat.Spaces.Members.Get
+        , Network.Google.Resource.Chat.Spaces.Members.List
+        , Network.Google.Resource.Chat.Spaces.Messages.Create
+        , Network.Google.Resource.Chat.Spaces.Messages.Delete
+        , Network.Google.Resource.Chat.Spaces.Messages.Get
+        , Network.Google.Resource.Chat.Spaces.Messages.Update
+
+    other-modules:
+          Network.Google.Chat.Types.Product
+        , Network.Google.Chat.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
