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-datastore
+
+* [Version](#version)
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+
+## Version
+
+`0.0.1`
+
+
+## Description
+
+A client library for the Google Cloud Datastore.
+
+
+## Contribute
+
+For any problems, comments, or feedback please create an issue [here on GitHub](https://github.com/brendanhay/amazonka/issues).
+
+> _Note:_ this library is an auto-generated Haskell package. Please see `amazonka-gen` for more information.
+
+
+## Licence
+
+`gogol-datastore` 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/Datastore.hs b/gen/Network/Google/Datastore.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Datastore.hs
@@ -0,0 +1,343 @@
+{-# LANGUAGE DataKinds         #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE TypeOperators     #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+
+-- |
+-- Module      : Network.Google.Datastore
+-- Copyright   : (c) 2015 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)
+--
+-- API for accessing Google Cloud Datastore.
+--
+-- /See:/ <https://developers.google.com/datastore/ Google Cloud Datastore API Reference>
+module Network.Google.Datastore
+    (
+    -- * Service Configuration
+      datastoreService
+
+    -- * API Declaration
+    , DatastoreAPI
+
+    -- * Resources
+
+    -- ** datastore.datasets.allocateIds
+    , module Network.Google.Resource.Datastore.DataSets.AllocateIds
+
+    -- ** datastore.datasets.beginTransaction
+    , module Network.Google.Resource.Datastore.DataSets.BeginTransaction
+
+    -- ** datastore.datasets.commit
+    , module Network.Google.Resource.Datastore.DataSets.Commit
+
+    -- ** datastore.datasets.lookup
+    , module Network.Google.Resource.Datastore.DataSets.Lookup
+
+    -- ** datastore.datasets.rollback
+    , module Network.Google.Resource.Datastore.DataSets.Rollback
+
+    -- ** datastore.datasets.runQuery
+    , module Network.Google.Resource.Datastore.DataSets.RunQuery
+
+    -- * Types
+
+    -- ** PropertyOrderDirection
+    , PropertyOrderDirection (..)
+
+    -- ** RollbackRequest
+    , RollbackRequest
+    , rollbackRequest
+    , rrTransaction
+
+    -- ** Property
+    , Property
+    , property
+    , pKeyValue
+    , pBlobKeyValue
+    , pDateTimeValue
+    , pIntegerValue
+    , pEntityValue
+    , pDoubleValue
+    , pStringValue
+    , pListValue
+    , pIndexed
+    , pBooleanValue
+    , pMeaning
+    , pBlobValue
+
+    -- ** PartitionId
+    , PartitionId
+    , partitionId
+    , piNamespace
+    , piDataSetId
+
+    -- ** QueryResultBatch
+    , QueryResultBatch
+    , queryResultBatch
+    , qrbSkippedResults
+    , qrbEntityResultType
+    , qrbEntityResults
+    , qrbMoreResults
+    , qrbEndCursor
+
+    -- ** EntityProperties
+    , EntityProperties
+    , entityProperties
+    , epAddtional
+
+    -- ** BeginTransactionRequest
+    , BeginTransactionRequest
+    , beginTransactionRequest
+    , btrIsolationLevel
+
+    -- ** RunQueryRequest
+    , RunQueryRequest
+    , runQueryRequest
+    , rqrPartitionId
+    , rqrGqlQuery
+    , rqrQuery
+    , rqrReadOptions
+
+    -- ** AllocateIdsRequest
+    , AllocateIdsRequest
+    , allocateIdsRequest
+    , airKeys
+
+    -- ** QueryResultBatchEntityResultType
+    , QueryResultBatchEntityResultType (..)
+
+    -- ** CompositeFilter
+    , CompositeFilter
+    , compositeFilter
+    , cfOperator
+    , cfFilters
+
+    -- ** CompositeFilterOperator
+    , CompositeFilterOperator (..)
+
+    -- ** QueryResultBatchMoreResults
+    , QueryResultBatchMoreResults (..)
+
+    -- ** BeginTransactionResponse
+    , BeginTransactionResponse
+    , beginTransactionResponse
+    , btrTransaction
+    , btrHeader
+
+    -- ** MutationResult
+    , MutationResult
+    , mutationResult
+    , mrInsertAutoIdKeys
+    , mrIndexUpdates
+
+    -- ** AllocateIdsResponse
+    , AllocateIdsResponse
+    , allocateIdsResponse
+    , aKeys
+    , aHeader
+
+    -- ** GqlQuery
+    , GqlQuery
+    , gqlQuery
+    , gqAllowLiteral
+    , gqNumberArgs
+    , gqQueryString
+    , gqNameArgs
+
+    -- ** RunQueryResponse
+    , RunQueryResponse
+    , runQueryResponse
+    , rqrBatch
+    , rqrHeader
+
+    -- ** Value
+    , Value
+    , value
+    , vKeyValue
+    , vBlobKeyValue
+    , vDateTimeValue
+    , vIntegerValue
+    , vEntityValue
+    , vDoubleValue
+    , vStringValue
+    , vListValue
+    , vIndexed
+    , vBooleanValue
+    , vMeaning
+    , vBlobValue
+
+    -- ** LookupRequest
+    , LookupRequest
+    , lookupRequest
+    , lrKeys
+    , lrReadOptions
+
+    -- ** ReadOptionsReadConsistency
+    , ReadOptionsReadConsistency (..)
+
+    -- ** Mutation
+    , Mutation
+    , mutation
+    , mInsert
+    , mForce
+    , mInsertAutoId
+    , mUpsert
+    , mDelete
+    , mUpdate
+
+    -- ** ResponseHeader
+    , ResponseHeader
+    , responseHeader
+    , rhKind
+
+    -- ** KeyPathElement
+    , KeyPathElement
+    , keyPathElement
+    , kpeKind
+    , kpeName
+    , kpeId
+
+    -- ** PropertyReference
+    , PropertyReference
+    , propertyReference
+    , prName
+
+    -- ** GqlQueryArg
+    , GqlQueryArg
+    , gqlQueryArg
+    , gqaCursor
+    , gqaValue
+    , gqaName
+
+    -- ** Key
+    , Key
+    , key
+    , kPartitionId
+    , kPath
+
+    -- ** PropertyFilterOperator
+    , PropertyFilterOperator (..)
+
+    -- ** PropertyFilter
+    , PropertyFilter
+    , propertyFilter
+    , pfProperty
+    , pfOperator
+    , pfValue
+
+    -- ** Query
+    , Query
+    , query
+    , qGroupBy
+    , qStartCursor
+    , qOffSet
+    , qEndCursor
+    , qLimit
+    , qProjection
+    , qFilter
+    , qKinds
+    , qOrder
+
+    -- ** EntityResult
+    , EntityResult
+    , entityResult
+    , erEntity
+
+    -- ** CommitResponse
+    , CommitResponse
+    , commitResponse
+    , crMutationResult
+    , crHeader
+
+    -- ** KindExpression
+    , KindExpression
+    , kindExpression
+    , keName
+
+    -- ** ReadOptions
+    , ReadOptions
+    , readOptions
+    , roReadConsistency
+    , roTransaction
+
+    -- ** RollbackResponse
+    , RollbackResponse
+    , rollbackResponse
+    , rrHeader
+
+    -- ** PropertyExpression
+    , PropertyExpression
+    , propertyExpression
+    , peProperty
+    , peAggregationFunction
+
+    -- ** Filter
+    , Filter
+    , filter'
+    , fCompositeFilter
+    , fPropertyFilter
+
+    -- ** BeginTransactionRequestIsolationLevel
+    , BeginTransactionRequestIsolationLevel (..)
+
+    -- ** CommitRequest
+    , CommitRequest
+    , commitRequest
+    , crMode
+    , crMutation
+    , crTransaction
+    , crIgnoreReadOnly
+
+    -- ** CommitRequestMode
+    , CommitRequestMode (..)
+
+    -- ** PropertyExpressionAggregationFunction
+    , PropertyExpressionAggregationFunction (..)
+
+    -- ** Entity
+    , Entity
+    , entity
+    , eKey
+    , eProperties
+
+    -- ** LookupResponse
+    , LookupResponse
+    , lookupResponse
+    , lrDeferred
+    , lrFound
+    , lrMissing
+    , lrHeader
+
+    -- ** PropertyOrder
+    , PropertyOrder
+    , propertyOrder
+    , poProperty
+    , poDirection
+    ) where
+
+import           Network.Google.Datastore.Types
+import           Network.Google.Prelude
+import           Network.Google.Resource.Datastore.DataSets.AllocateIds
+import           Network.Google.Resource.Datastore.DataSets.BeginTransaction
+import           Network.Google.Resource.Datastore.DataSets.Commit
+import           Network.Google.Resource.Datastore.DataSets.Lookup
+import           Network.Google.Resource.Datastore.DataSets.Rollback
+import           Network.Google.Resource.Datastore.DataSets.RunQuery
+
+{- $resources
+TODO
+-}
+
+-- | Represents the entirety of the methods and resources available for the Google Cloud Datastore API service.
+type DatastoreAPI =
+     DataSetsBeginTransactionResource :<|>
+       DataSetsAllocateIdsResource
+       :<|> DataSetsRunQueryResource
+       :<|> DataSetsRollbackResource
+       :<|> DataSetsLookupResource
+       :<|> DataSetsCommitResource
diff --git a/gen/Network/Google/Datastore/Types.hs b/gen/Network/Google/Datastore/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Datastore/Types.hs
@@ -0,0 +1,320 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Network.Google.Datastore.Types
+-- Copyright   : (c) 2015 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.Datastore.Types
+    (
+    -- * Service Configuration
+      datastoreService
+
+    -- * OAuth Scopes
+    , userinfoEmailScope
+    , cloudPlatformScope
+    , datastoreScope
+
+    -- * PropertyOrderDirection
+    , PropertyOrderDirection (..)
+
+    -- * RollbackRequest
+    , RollbackRequest
+    , rollbackRequest
+    , rrTransaction
+
+    -- * Property
+    , Property
+    , property
+    , pKeyValue
+    , pBlobKeyValue
+    , pDateTimeValue
+    , pIntegerValue
+    , pEntityValue
+    , pDoubleValue
+    , pStringValue
+    , pListValue
+    , pIndexed
+    , pBooleanValue
+    , pMeaning
+    , pBlobValue
+
+    -- * PartitionId
+    , PartitionId
+    , partitionId
+    , piNamespace
+    , piDataSetId
+
+    -- * QueryResultBatch
+    , QueryResultBatch
+    , queryResultBatch
+    , qrbSkippedResults
+    , qrbEntityResultType
+    , qrbEntityResults
+    , qrbMoreResults
+    , qrbEndCursor
+
+    -- * EntityProperties
+    , EntityProperties
+    , entityProperties
+    , epAddtional
+
+    -- * BeginTransactionRequest
+    , BeginTransactionRequest
+    , beginTransactionRequest
+    , btrIsolationLevel
+
+    -- * RunQueryRequest
+    , RunQueryRequest
+    , runQueryRequest
+    , rqrPartitionId
+    , rqrGqlQuery
+    , rqrQuery
+    , rqrReadOptions
+
+    -- * AllocateIdsRequest
+    , AllocateIdsRequest
+    , allocateIdsRequest
+    , airKeys
+
+    -- * QueryResultBatchEntityResultType
+    , QueryResultBatchEntityResultType (..)
+
+    -- * CompositeFilter
+    , CompositeFilter
+    , compositeFilter
+    , cfOperator
+    , cfFilters
+
+    -- * CompositeFilterOperator
+    , CompositeFilterOperator (..)
+
+    -- * QueryResultBatchMoreResults
+    , QueryResultBatchMoreResults (..)
+
+    -- * BeginTransactionResponse
+    , BeginTransactionResponse
+    , beginTransactionResponse
+    , btrTransaction
+    , btrHeader
+
+    -- * MutationResult
+    , MutationResult
+    , mutationResult
+    , mrInsertAutoIdKeys
+    , mrIndexUpdates
+
+    -- * AllocateIdsResponse
+    , AllocateIdsResponse
+    , allocateIdsResponse
+    , aKeys
+    , aHeader
+
+    -- * GqlQuery
+    , GqlQuery
+    , gqlQuery
+    , gqAllowLiteral
+    , gqNumberArgs
+    , gqQueryString
+    , gqNameArgs
+
+    -- * RunQueryResponse
+    , RunQueryResponse
+    , runQueryResponse
+    , rqrBatch
+    , rqrHeader
+
+    -- * Value
+    , Value
+    , value
+    , vKeyValue
+    , vBlobKeyValue
+    , vDateTimeValue
+    , vIntegerValue
+    , vEntityValue
+    , vDoubleValue
+    , vStringValue
+    , vListValue
+    , vIndexed
+    , vBooleanValue
+    , vMeaning
+    , vBlobValue
+
+    -- * LookupRequest
+    , LookupRequest
+    , lookupRequest
+    , lrKeys
+    , lrReadOptions
+
+    -- * ReadOptionsReadConsistency
+    , ReadOptionsReadConsistency (..)
+
+    -- * Mutation
+    , Mutation
+    , mutation
+    , mInsert
+    , mForce
+    , mInsertAutoId
+    , mUpsert
+    , mDelete
+    , mUpdate
+
+    -- * ResponseHeader
+    , ResponseHeader
+    , responseHeader
+    , rhKind
+
+    -- * KeyPathElement
+    , KeyPathElement
+    , keyPathElement
+    , kpeKind
+    , kpeName
+    , kpeId
+
+    -- * PropertyReference
+    , PropertyReference
+    , propertyReference
+    , prName
+
+    -- * GqlQueryArg
+    , GqlQueryArg
+    , gqlQueryArg
+    , gqaCursor
+    , gqaValue
+    , gqaName
+
+    -- * Key
+    , Key
+    , key
+    , kPartitionId
+    , kPath
+
+    -- * PropertyFilterOperator
+    , PropertyFilterOperator (..)
+
+    -- * PropertyFilter
+    , PropertyFilter
+    , propertyFilter
+    , pfProperty
+    , pfOperator
+    , pfValue
+
+    -- * Query
+    , Query
+    , query
+    , qGroupBy
+    , qStartCursor
+    , qOffSet
+    , qEndCursor
+    , qLimit
+    , qProjection
+    , qFilter
+    , qKinds
+    , qOrder
+
+    -- * EntityResult
+    , EntityResult
+    , entityResult
+    , erEntity
+
+    -- * CommitResponse
+    , CommitResponse
+    , commitResponse
+    , crMutationResult
+    , crHeader
+
+    -- * KindExpression
+    , KindExpression
+    , kindExpression
+    , keName
+
+    -- * ReadOptions
+    , ReadOptions
+    , readOptions
+    , roReadConsistency
+    , roTransaction
+
+    -- * RollbackResponse
+    , RollbackResponse
+    , rollbackResponse
+    , rrHeader
+
+    -- * PropertyExpression
+    , PropertyExpression
+    , propertyExpression
+    , peProperty
+    , peAggregationFunction
+
+    -- * Filter
+    , Filter
+    , filter'
+    , fCompositeFilter
+    , fPropertyFilter
+
+    -- * BeginTransactionRequestIsolationLevel
+    , BeginTransactionRequestIsolationLevel (..)
+
+    -- * CommitRequest
+    , CommitRequest
+    , commitRequest
+    , crMode
+    , crMutation
+    , crTransaction
+    , crIgnoreReadOnly
+
+    -- * CommitRequestMode
+    , CommitRequestMode (..)
+
+    -- * PropertyExpressionAggregationFunction
+    , PropertyExpressionAggregationFunction (..)
+
+    -- * Entity
+    , Entity
+    , entity
+    , eKey
+    , eProperties
+
+    -- * LookupResponse
+    , LookupResponse
+    , lookupResponse
+    , lrDeferred
+    , lrFound
+    , lrMissing
+    , lrHeader
+
+    -- * PropertyOrder
+    , PropertyOrder
+    , propertyOrder
+    , poProperty
+    , poDirection
+    ) where
+
+import           Network.Google.Datastore.Types.Product
+import           Network.Google.Datastore.Types.Sum
+import           Network.Google.Prelude
+
+-- | Default request referring to version 'v1beta2' of the Google Cloud Datastore API. This contains the host and root path used as a starting point for constructing service requests.
+datastoreService :: Service
+datastoreService
+  = defaultService (ServiceId "datastore:v1beta2")
+      "www.googleapis.com"
+
+-- | View your email address
+userinfoEmailScope :: OAuthScope
+userinfoEmailScope = "https://www.googleapis.com/auth/userinfo.email";
+
+-- | View and manage your data across Google Cloud Platform services
+cloudPlatformScope :: OAuthScope
+cloudPlatformScope = "https://www.googleapis.com/auth/cloud-platform";
+
+-- | View and manage your Google Cloud Datastore data
+datastoreScope :: OAuthScope
+datastoreScope = "https://www.googleapis.com/auth/datastore";
diff --git a/gen/Network/Google/Datastore/Types/Product.hs b/gen/Network/Google/Datastore/Types/Product.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Datastore/Types/Product.hs
@@ -0,0 +1,2191 @@
+{-# 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.Datastore.Types.Product
+-- Copyright   : (c) 2015 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.Datastore.Types.Product where
+
+import           Network.Google.Datastore.Types.Sum
+import           Network.Google.Prelude
+
+--
+-- /See:/ 'rollbackRequest' smart constructor.
+newtype RollbackRequest = RollbackRequest
+    { _rrTransaction :: Maybe (Textual Word8)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'RollbackRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'rrTransaction'
+rollbackRequest
+    :: RollbackRequest
+rollbackRequest =
+    RollbackRequest
+    { _rrTransaction = Nothing
+    }
+
+-- | The transaction identifier, returned by a call to beginTransaction.
+rrTransaction :: Lens' RollbackRequest (Maybe Word8)
+rrTransaction
+  = lens _rrTransaction
+      (\ s a -> s{_rrTransaction = a})
+      . mapping _Coerce
+
+instance FromJSON RollbackRequest where
+        parseJSON
+          = withObject "RollbackRequest"
+              (\ o -> RollbackRequest <$> (o .:? "transaction"))
+
+instance ToJSON RollbackRequest where
+        toJSON RollbackRequest{..}
+          = object
+              (catMaybes [("transaction" .=) <$> _rrTransaction])
+
+-- | An entity property.
+--
+-- /See:/ 'property' smart constructor.
+data Property = Property
+    { _pKeyValue      :: !(Maybe Key)
+    , _pBlobKeyValue  :: !(Maybe Text)
+    , _pDateTimeValue :: !(Maybe DateTime')
+    , _pIntegerValue  :: !(Maybe (Textual Int64))
+    , _pEntityValue   :: !(Maybe Entity)
+    , _pDoubleValue   :: !(Maybe (Textual Double))
+    , _pStringValue   :: !(Maybe Text)
+    , _pListValue     :: !(Maybe [Value])
+    , _pIndexed       :: !(Maybe Bool)
+    , _pBooleanValue  :: !(Maybe Bool)
+    , _pMeaning       :: !(Maybe (Textual Int32))
+    , _pBlobValue     :: !(Maybe (Textual Word8))
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Property' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'pKeyValue'
+--
+-- * 'pBlobKeyValue'
+--
+-- * 'pDateTimeValue'
+--
+-- * 'pIntegerValue'
+--
+-- * 'pEntityValue'
+--
+-- * 'pDoubleValue'
+--
+-- * 'pStringValue'
+--
+-- * 'pListValue'
+--
+-- * 'pIndexed'
+--
+-- * 'pBooleanValue'
+--
+-- * 'pMeaning'
+--
+-- * 'pBlobValue'
+property
+    :: Property
+property =
+    Property
+    { _pKeyValue = Nothing
+    , _pBlobKeyValue = Nothing
+    , _pDateTimeValue = Nothing
+    , _pIntegerValue = Nothing
+    , _pEntityValue = Nothing
+    , _pDoubleValue = Nothing
+    , _pStringValue = Nothing
+    , _pListValue = Nothing
+    , _pIndexed = Nothing
+    , _pBooleanValue = Nothing
+    , _pMeaning = Nothing
+    , _pBlobValue = Nothing
+    }
+
+-- | A key value.
+pKeyValue :: Lens' Property (Maybe Key)
+pKeyValue
+  = lens _pKeyValue (\ s a -> s{_pKeyValue = a})
+
+-- | A blob key value.
+pBlobKeyValue :: Lens' Property (Maybe Text)
+pBlobKeyValue
+  = lens _pBlobKeyValue
+      (\ s a -> s{_pBlobKeyValue = a})
+
+-- | A timestamp value.
+pDateTimeValue :: Lens' Property (Maybe UTCTime)
+pDateTimeValue
+  = lens _pDateTimeValue
+      (\ s a -> s{_pDateTimeValue = a})
+      . mapping _DateTime
+
+-- | An integer value.
+pIntegerValue :: Lens' Property (Maybe Int64)
+pIntegerValue
+  = lens _pIntegerValue
+      (\ s a -> s{_pIntegerValue = a})
+      . mapping _Coerce
+
+-- | An entity value. May have no key. May have a key with an incomplete key
+-- path. May have a reserved\/read-only key.
+pEntityValue :: Lens' Property (Maybe Entity)
+pEntityValue
+  = lens _pEntityValue (\ s a -> s{_pEntityValue = a})
+
+-- | A double value.
+pDoubleValue :: Lens' Property (Maybe Double)
+pDoubleValue
+  = lens _pDoubleValue (\ s a -> s{_pDoubleValue = a})
+      . mapping _Coerce
+
+-- | A UTF-8 encoded string value. When indexed is true, may have at most 500
+-- characters.
+pStringValue :: Lens' Property (Maybe Text)
+pStringValue
+  = lens _pStringValue (\ s a -> s{_pStringValue = a})
+
+-- | A list value. Cannot contain another list value. A Value instance that
+-- sets field list_value must not set field meaning or field indexed.
+pListValue :: Lens' Property [Value]
+pListValue
+  = lens _pListValue (\ s a -> s{_pListValue = a}) .
+      _Default
+      . _Coerce
+
+-- | If the value should be indexed. The indexed property may be set for a
+-- null value. When indexed is true, stringValue is limited to 500
+-- characters and the blob value is limited to 500 bytes. Input values by
+-- default have indexed set to true; however, you can explicitly set
+-- indexed to true if you want. (An output value never has indexed
+-- explicitly set to true.) If a value is itself an entity, it cannot have
+-- indexed set to true.
+pIndexed :: Lens' Property (Maybe Bool)
+pIndexed = lens _pIndexed (\ s a -> s{_pIndexed = a})
+
+-- | A boolean value.
+pBooleanValue :: Lens' Property (Maybe Bool)
+pBooleanValue
+  = lens _pBooleanValue
+      (\ s a -> s{_pBooleanValue = a})
+
+-- | The meaning field is reserved and should not be used.
+pMeaning :: Lens' Property (Maybe Int32)
+pMeaning
+  = lens _pMeaning (\ s a -> s{_pMeaning = a}) .
+      mapping _Coerce
+
+-- | A blob value. May be a maximum of 1,000,000 bytes. When indexed is true,
+-- may have at most 500 bytes.
+pBlobValue :: Lens' Property (Maybe Word8)
+pBlobValue
+  = lens _pBlobValue (\ s a -> s{_pBlobValue = a}) .
+      mapping _Coerce
+
+instance FromJSON Property where
+        parseJSON
+          = withObject "Property"
+              (\ o ->
+                 Property <$>
+                   (o .:? "keyValue") <*> (o .:? "blobKeyValue") <*>
+                     (o .:? "dateTimeValue")
+                     <*> (o .:? "integerValue")
+                     <*> (o .:? "entityValue")
+                     <*> (o .:? "doubleValue")
+                     <*> (o .:? "stringValue")
+                     <*> (o .:? "listValue" .!= mempty)
+                     <*> (o .:? "indexed")
+                     <*> (o .:? "booleanValue")
+                     <*> (o .:? "meaning")
+                     <*> (o .:? "blobValue"))
+
+instance ToJSON Property where
+        toJSON Property{..}
+          = object
+              (catMaybes
+                 [("keyValue" .=) <$> _pKeyValue,
+                  ("blobKeyValue" .=) <$> _pBlobKeyValue,
+                  ("dateTimeValue" .=) <$> _pDateTimeValue,
+                  ("integerValue" .=) <$> _pIntegerValue,
+                  ("entityValue" .=) <$> _pEntityValue,
+                  ("doubleValue" .=) <$> _pDoubleValue,
+                  ("stringValue" .=) <$> _pStringValue,
+                  ("listValue" .=) <$> _pListValue,
+                  ("indexed" .=) <$> _pIndexed,
+                  ("booleanValue" .=) <$> _pBooleanValue,
+                  ("meaning" .=) <$> _pMeaning,
+                  ("blobValue" .=) <$> _pBlobValue])
+
+-- | An identifier for a particular subset of entities. Entities are
+-- partitioned into various subsets, each used by different datasets and
+-- different namespaces within a dataset and so forth.
+--
+-- /See:/ 'partitionId' smart constructor.
+data PartitionId = PartitionId
+    { _piNamespace :: !(Maybe Text)
+    , _piDataSetId :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'PartitionId' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'piNamespace'
+--
+-- * 'piDataSetId'
+partitionId
+    :: PartitionId
+partitionId =
+    PartitionId
+    { _piNamespace = Nothing
+    , _piDataSetId = Nothing
+    }
+
+-- | The namespace.
+piNamespace :: Lens' PartitionId (Maybe Text)
+piNamespace
+  = lens _piNamespace (\ s a -> s{_piNamespace = a})
+
+-- | The dataset ID.
+piDataSetId :: Lens' PartitionId (Maybe Text)
+piDataSetId
+  = lens _piDataSetId (\ s a -> s{_piDataSetId = a})
+
+instance FromJSON PartitionId where
+        parseJSON
+          = withObject "PartitionId"
+              (\ o ->
+                 PartitionId <$>
+                   (o .:? "namespace") <*> (o .:? "datasetId"))
+
+instance ToJSON PartitionId where
+        toJSON PartitionId{..}
+          = object
+              (catMaybes
+                 [("namespace" .=) <$> _piNamespace,
+                  ("datasetId" .=) <$> _piDataSetId])
+
+-- | A batch of results produced by a query.
+--
+-- /See:/ 'queryResultBatch' smart constructor.
+data QueryResultBatch = QueryResultBatch
+    { _qrbSkippedResults   :: !(Maybe (Textual Int32))
+    , _qrbEntityResultType :: !(Maybe QueryResultBatchEntityResultType)
+    , _qrbEntityResults    :: !(Maybe [EntityResult])
+    , _qrbMoreResults      :: !(Maybe QueryResultBatchMoreResults)
+    , _qrbEndCursor        :: !(Maybe (Textual Word8))
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'QueryResultBatch' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'qrbSkippedResults'
+--
+-- * 'qrbEntityResultType'
+--
+-- * 'qrbEntityResults'
+--
+-- * 'qrbMoreResults'
+--
+-- * 'qrbEndCursor'
+queryResultBatch
+    :: QueryResultBatch
+queryResultBatch =
+    QueryResultBatch
+    { _qrbSkippedResults = Nothing
+    , _qrbEntityResultType = Nothing
+    , _qrbEntityResults = Nothing
+    , _qrbMoreResults = Nothing
+    , _qrbEndCursor = Nothing
+    }
+
+-- | The number of results skipped because of Query.offset.
+qrbSkippedResults :: Lens' QueryResultBatch (Maybe Int32)
+qrbSkippedResults
+  = lens _qrbSkippedResults
+      (\ s a -> s{_qrbSkippedResults = a})
+      . mapping _Coerce
+
+-- | The result type for every entity in entityResults. full for full
+-- entities, projection for entities with only projected properties,
+-- keyOnly for entities with only a key.
+qrbEntityResultType :: Lens' QueryResultBatch (Maybe QueryResultBatchEntityResultType)
+qrbEntityResultType
+  = lens _qrbEntityResultType
+      (\ s a -> s{_qrbEntityResultType = a})
+
+-- | The results for this batch.
+qrbEntityResults :: Lens' QueryResultBatch [EntityResult]
+qrbEntityResults
+  = lens _qrbEntityResults
+      (\ s a -> s{_qrbEntityResults = a})
+      . _Default
+      . _Coerce
+
+-- | The state of the query after the current batch. One of notFinished,
+-- moreResultsAfterLimit, noMoreResults.
+qrbMoreResults :: Lens' QueryResultBatch (Maybe QueryResultBatchMoreResults)
+qrbMoreResults
+  = lens _qrbMoreResults
+      (\ s a -> s{_qrbMoreResults = a})
+
+-- | A cursor that points to the position after the last result in the batch.
+-- May be absent. TODO(arfuller): Once all plans produce cursors update
+-- documentation here.
+qrbEndCursor :: Lens' QueryResultBatch (Maybe Word8)
+qrbEndCursor
+  = lens _qrbEndCursor (\ s a -> s{_qrbEndCursor = a})
+      . mapping _Coerce
+
+instance FromJSON QueryResultBatch where
+        parseJSON
+          = withObject "QueryResultBatch"
+              (\ o ->
+                 QueryResultBatch <$>
+                   (o .:? "skippedResults") <*>
+                     (o .:? "entityResultType")
+                     <*> (o .:? "entityResults" .!= mempty)
+                     <*> (o .:? "moreResults")
+                     <*> (o .:? "endCursor"))
+
+instance ToJSON QueryResultBatch where
+        toJSON QueryResultBatch{..}
+          = object
+              (catMaybes
+                 [("skippedResults" .=) <$> _qrbSkippedResults,
+                  ("entityResultType" .=) <$> _qrbEntityResultType,
+                  ("entityResults" .=) <$> _qrbEntityResults,
+                  ("moreResults" .=) <$> _qrbMoreResults,
+                  ("endCursor" .=) <$> _qrbEndCursor])
+
+-- | The entity\'s properties.
+--
+-- /See:/ 'entityProperties' smart constructor.
+newtype EntityProperties = EntityProperties
+    { _epAddtional :: HashMap Text Property
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'EntityProperties' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'epAddtional'
+entityProperties
+    :: HashMap Text Property -- ^ 'epAddtional'
+    -> EntityProperties
+entityProperties pEpAddtional_ =
+    EntityProperties
+    { _epAddtional = _Coerce # pEpAddtional_
+    }
+
+-- | The name of the property. A property name matching regex \"__.*__\" is
+-- reserved. A reserved property name is forbidden in certain documented
+-- contexts. The name must not contain more than 500 characters. Cannot be
+-- \"\".
+epAddtional :: Lens' EntityProperties (HashMap Text Property)
+epAddtional
+  = lens _epAddtional (\ s a -> s{_epAddtional = a}) .
+      _Coerce
+
+instance FromJSON EntityProperties where
+        parseJSON
+          = withObject "EntityProperties"
+              (\ o -> EntityProperties <$> (parseJSONObject o))
+
+instance ToJSON EntityProperties where
+        toJSON = toJSON . _epAddtional
+
+--
+-- /See:/ 'beginTransactionRequest' smart constructor.
+newtype BeginTransactionRequest = BeginTransactionRequest
+    { _btrIsolationLevel :: Maybe BeginTransactionRequestIsolationLevel
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'BeginTransactionRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'btrIsolationLevel'
+beginTransactionRequest
+    :: BeginTransactionRequest
+beginTransactionRequest =
+    BeginTransactionRequest
+    { _btrIsolationLevel = Nothing
+    }
+
+-- | The transaction isolation level. Either snapshot or serializable. The
+-- default isolation level is snapshot isolation, which means that another
+-- transaction may not concurrently modify the data that is modified by
+-- this transaction. Optionally, a transaction can request to be made
+-- serializable which means that another transaction cannot concurrently
+-- modify the data that is read or modified by this transaction.
+btrIsolationLevel :: Lens' BeginTransactionRequest (Maybe BeginTransactionRequestIsolationLevel)
+btrIsolationLevel
+  = lens _btrIsolationLevel
+      (\ s a -> s{_btrIsolationLevel = a})
+
+instance FromJSON BeginTransactionRequest where
+        parseJSON
+          = withObject "BeginTransactionRequest"
+              (\ o ->
+                 BeginTransactionRequest <$> (o .:? "isolationLevel"))
+
+instance ToJSON BeginTransactionRequest where
+        toJSON BeginTransactionRequest{..}
+          = object
+              (catMaybes
+                 [("isolationLevel" .=) <$> _btrIsolationLevel])
+
+--
+-- /See:/ 'runQueryRequest' smart constructor.
+data RunQueryRequest = RunQueryRequest
+    { _rqrPartitionId :: !(Maybe PartitionId)
+    , _rqrGqlQuery    :: !(Maybe GqlQuery)
+    , _rqrQuery       :: !(Maybe Query)
+    , _rqrReadOptions :: !(Maybe ReadOptions)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'RunQueryRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'rqrPartitionId'
+--
+-- * 'rqrGqlQuery'
+--
+-- * 'rqrQuery'
+--
+-- * 'rqrReadOptions'
+runQueryRequest
+    :: RunQueryRequest
+runQueryRequest =
+    RunQueryRequest
+    { _rqrPartitionId = Nothing
+    , _rqrGqlQuery = Nothing
+    , _rqrQuery = Nothing
+    , _rqrReadOptions = Nothing
+    }
+
+-- | Entities are partitioned into subsets, identified by a dataset (usually
+-- implicitly specified by the project) and namespace ID. Queries are
+-- scoped to a single partition. This partition ID is normalized with the
+-- standard default context partition ID, but all other partition IDs in
+-- RunQueryRequest are normalized with this partition ID as the context
+-- partition ID.
+rqrPartitionId :: Lens' RunQueryRequest (Maybe PartitionId)
+rqrPartitionId
+  = lens _rqrPartitionId
+      (\ s a -> s{_rqrPartitionId = a})
+
+-- | The GQL query to run. Either this field or field query must be set, but
+-- not both.
+rqrGqlQuery :: Lens' RunQueryRequest (Maybe GqlQuery)
+rqrGqlQuery
+  = lens _rqrGqlQuery (\ s a -> s{_rqrGqlQuery = a})
+
+-- | The query to run. Either this field or field gql_query must be set, but
+-- not both.
+rqrQuery :: Lens' RunQueryRequest (Maybe Query)
+rqrQuery = lens _rqrQuery (\ s a -> s{_rqrQuery = a})
+
+-- | The options for this query.
+rqrReadOptions :: Lens' RunQueryRequest (Maybe ReadOptions)
+rqrReadOptions
+  = lens _rqrReadOptions
+      (\ s a -> s{_rqrReadOptions = a})
+
+instance FromJSON RunQueryRequest where
+        parseJSON
+          = withObject "RunQueryRequest"
+              (\ o ->
+                 RunQueryRequest <$>
+                   (o .:? "partitionId") <*> (o .:? "gqlQuery") <*>
+                     (o .:? "query")
+                     <*> (o .:? "readOptions"))
+
+instance ToJSON RunQueryRequest where
+        toJSON RunQueryRequest{..}
+          = object
+              (catMaybes
+                 [("partitionId" .=) <$> _rqrPartitionId,
+                  ("gqlQuery" .=) <$> _rqrGqlQuery,
+                  ("query" .=) <$> _rqrQuery,
+                  ("readOptions" .=) <$> _rqrReadOptions])
+
+--
+-- /See:/ 'allocateIdsRequest' smart constructor.
+newtype AllocateIdsRequest = AllocateIdsRequest
+    { _airKeys :: Maybe [Key]
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'AllocateIdsRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'airKeys'
+allocateIdsRequest
+    :: AllocateIdsRequest
+allocateIdsRequest =
+    AllocateIdsRequest
+    { _airKeys = Nothing
+    }
+
+-- | A list of keys with incomplete key paths to allocate IDs for. No key may
+-- be reserved\/read-only.
+airKeys :: Lens' AllocateIdsRequest [Key]
+airKeys
+  = lens _airKeys (\ s a -> s{_airKeys = a}) . _Default
+      . _Coerce
+
+instance FromJSON AllocateIdsRequest where
+        parseJSON
+          = withObject "AllocateIdsRequest"
+              (\ o ->
+                 AllocateIdsRequest <$> (o .:? "keys" .!= mempty))
+
+instance ToJSON AllocateIdsRequest where
+        toJSON AllocateIdsRequest{..}
+          = object (catMaybes [("keys" .=) <$> _airKeys])
+
+-- | A filter that merges the multiple other filters using the given
+-- operation.
+--
+-- /See:/ 'compositeFilter' smart constructor.
+data CompositeFilter = CompositeFilter
+    { _cfOperator :: !(Maybe CompositeFilterOperator)
+    , _cfFilters  :: !(Maybe [Filter])
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CompositeFilter' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cfOperator'
+--
+-- * 'cfFilters'
+compositeFilter
+    :: CompositeFilter
+compositeFilter =
+    CompositeFilter
+    { _cfOperator = Nothing
+    , _cfFilters = Nothing
+    }
+
+-- | The operator for combining multiple filters. Only \"and\" is currently
+-- supported.
+cfOperator :: Lens' CompositeFilter (Maybe CompositeFilterOperator)
+cfOperator
+  = lens _cfOperator (\ s a -> s{_cfOperator = a})
+
+-- | The list of filters to combine. Must contain at least one filter.
+cfFilters :: Lens' CompositeFilter [Filter]
+cfFilters
+  = lens _cfFilters (\ s a -> s{_cfFilters = a}) .
+      _Default
+      . _Coerce
+
+instance FromJSON CompositeFilter where
+        parseJSON
+          = withObject "CompositeFilter"
+              (\ o ->
+                 CompositeFilter <$>
+                   (o .:? "operator") <*> (o .:? "filters" .!= mempty))
+
+instance ToJSON CompositeFilter where
+        toJSON CompositeFilter{..}
+          = object
+              (catMaybes
+                 [("operator" .=) <$> _cfOperator,
+                  ("filters" .=) <$> _cfFilters])
+
+--
+-- /See:/ 'beginTransactionResponse' smart constructor.
+data BeginTransactionResponse = BeginTransactionResponse
+    { _btrTransaction :: !(Maybe (Textual Word8))
+    , _btrHeader      :: !(Maybe ResponseHeader)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'BeginTransactionResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'btrTransaction'
+--
+-- * 'btrHeader'
+beginTransactionResponse
+    :: BeginTransactionResponse
+beginTransactionResponse =
+    BeginTransactionResponse
+    { _btrTransaction = Nothing
+    , _btrHeader = Nothing
+    }
+
+-- | The transaction identifier (always present).
+btrTransaction :: Lens' BeginTransactionResponse (Maybe Word8)
+btrTransaction
+  = lens _btrTransaction
+      (\ s a -> s{_btrTransaction = a})
+      . mapping _Coerce
+
+btrHeader :: Lens' BeginTransactionResponse (Maybe ResponseHeader)
+btrHeader
+  = lens _btrHeader (\ s a -> s{_btrHeader = a})
+
+instance FromJSON BeginTransactionResponse where
+        parseJSON
+          = withObject "BeginTransactionResponse"
+              (\ o ->
+                 BeginTransactionResponse <$>
+                   (o .:? "transaction") <*> (o .:? "header"))
+
+instance ToJSON BeginTransactionResponse where
+        toJSON BeginTransactionResponse{..}
+          = object
+              (catMaybes
+                 [("transaction" .=) <$> _btrTransaction,
+                  ("header" .=) <$> _btrHeader])
+
+--
+-- /See:/ 'mutationResult' smart constructor.
+data MutationResult = MutationResult
+    { _mrInsertAutoIdKeys :: !(Maybe [Key])
+    , _mrIndexUpdates     :: !(Maybe (Textual Int32))
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'MutationResult' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'mrInsertAutoIdKeys'
+--
+-- * 'mrIndexUpdates'
+mutationResult
+    :: MutationResult
+mutationResult =
+    MutationResult
+    { _mrInsertAutoIdKeys = Nothing
+    , _mrIndexUpdates = Nothing
+    }
+
+-- | Keys for insertAutoId entities. One per entity from the request, in the
+-- same order.
+mrInsertAutoIdKeys :: Lens' MutationResult [Key]
+mrInsertAutoIdKeys
+  = lens _mrInsertAutoIdKeys
+      (\ s a -> s{_mrInsertAutoIdKeys = a})
+      . _Default
+      . _Coerce
+
+-- | Number of index writes.
+mrIndexUpdates :: Lens' MutationResult (Maybe Int32)
+mrIndexUpdates
+  = lens _mrIndexUpdates
+      (\ s a -> s{_mrIndexUpdates = a})
+      . mapping _Coerce
+
+instance FromJSON MutationResult where
+        parseJSON
+          = withObject "MutationResult"
+              (\ o ->
+                 MutationResult <$>
+                   (o .:? "insertAutoIdKeys" .!= mempty) <*>
+                     (o .:? "indexUpdates"))
+
+instance ToJSON MutationResult where
+        toJSON MutationResult{..}
+          = object
+              (catMaybes
+                 [("insertAutoIdKeys" .=) <$> _mrInsertAutoIdKeys,
+                  ("indexUpdates" .=) <$> _mrIndexUpdates])
+
+--
+-- /See:/ 'allocateIdsResponse' smart constructor.
+data AllocateIdsResponse = AllocateIdsResponse
+    { _aKeys   :: !(Maybe [Key])
+    , _aHeader :: !(Maybe ResponseHeader)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'AllocateIdsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'aKeys'
+--
+-- * 'aHeader'
+allocateIdsResponse
+    :: AllocateIdsResponse
+allocateIdsResponse =
+    AllocateIdsResponse
+    { _aKeys = Nothing
+    , _aHeader = Nothing
+    }
+
+-- | The keys specified in the request (in the same order), each with its key
+-- path completed with a newly allocated ID.
+aKeys :: Lens' AllocateIdsResponse [Key]
+aKeys
+  = lens _aKeys (\ s a -> s{_aKeys = a}) . _Default .
+      _Coerce
+
+aHeader :: Lens' AllocateIdsResponse (Maybe ResponseHeader)
+aHeader = lens _aHeader (\ s a -> s{_aHeader = a})
+
+instance FromJSON AllocateIdsResponse where
+        parseJSON
+          = withObject "AllocateIdsResponse"
+              (\ o ->
+                 AllocateIdsResponse <$>
+                   (o .:? "keys" .!= mempty) <*> (o .:? "header"))
+
+instance ToJSON AllocateIdsResponse where
+        toJSON AllocateIdsResponse{..}
+          = object
+              (catMaybes
+                 [("keys" .=) <$> _aKeys, ("header" .=) <$> _aHeader])
+
+-- | A GQL query.
+--
+-- /See:/ 'gqlQuery' smart constructor.
+data GqlQuery = GqlQuery
+    { _gqAllowLiteral :: !(Maybe Bool)
+    , _gqNumberArgs   :: !(Maybe [GqlQueryArg])
+    , _gqQueryString  :: !(Maybe Text)
+    , _gqNameArgs     :: !(Maybe [GqlQueryArg])
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GqlQuery' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gqAllowLiteral'
+--
+-- * 'gqNumberArgs'
+--
+-- * 'gqQueryString'
+--
+-- * 'gqNameArgs'
+gqlQuery
+    :: GqlQuery
+gqlQuery =
+    GqlQuery
+    { _gqAllowLiteral = Nothing
+    , _gqNumberArgs = Nothing
+    , _gqQueryString = Nothing
+    , _gqNameArgs = Nothing
+    }
+
+-- | When false, the query string must not contain a literal.
+gqAllowLiteral :: Lens' GqlQuery (Maybe Bool)
+gqAllowLiteral
+  = lens _gqAllowLiteral
+      (\ s a -> s{_gqAllowLiteral = a})
+
+-- | Numbered binding site \'1 references the first numbered argument,
+-- effectively using 1-based indexing, rather than the usual 0. A numbered
+-- argument must NOT set field GqlQueryArg.name. For each binding site
+-- numbered i in query_string, there must be an ith numbered argument. The
+-- inverse must also be true.
+gqNumberArgs :: Lens' GqlQuery [GqlQueryArg]
+gqNumberArgs
+  = lens _gqNumberArgs (\ s a -> s{_gqNumberArgs = a})
+      . _Default
+      . _Coerce
+
+-- | The query string.
+gqQueryString :: Lens' GqlQuery (Maybe Text)
+gqQueryString
+  = lens _gqQueryString
+      (\ s a -> s{_gqQueryString = a})
+
+-- | A named argument must set field GqlQueryArg.name. No two named arguments
+-- may have the same name. For each non-reserved named binding site in the
+-- query string, there must be a named argument with that name, but not
+-- necessarily the inverse.
+gqNameArgs :: Lens' GqlQuery [GqlQueryArg]
+gqNameArgs
+  = lens _gqNameArgs (\ s a -> s{_gqNameArgs = a}) .
+      _Default
+      . _Coerce
+
+instance FromJSON GqlQuery where
+        parseJSON
+          = withObject "GqlQuery"
+              (\ o ->
+                 GqlQuery <$>
+                   (o .:? "allowLiteral") <*>
+                     (o .:? "numberArgs" .!= mempty)
+                     <*> (o .:? "queryString")
+                     <*> (o .:? "nameArgs" .!= mempty))
+
+instance ToJSON GqlQuery where
+        toJSON GqlQuery{..}
+          = object
+              (catMaybes
+                 [("allowLiteral" .=) <$> _gqAllowLiteral,
+                  ("numberArgs" .=) <$> _gqNumberArgs,
+                  ("queryString" .=) <$> _gqQueryString,
+                  ("nameArgs" .=) <$> _gqNameArgs])
+
+--
+-- /See:/ 'runQueryResponse' smart constructor.
+data RunQueryResponse = RunQueryResponse
+    { _rqrBatch  :: !(Maybe QueryResultBatch)
+    , _rqrHeader :: !(Maybe ResponseHeader)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'RunQueryResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'rqrBatch'
+--
+-- * 'rqrHeader'
+runQueryResponse
+    :: RunQueryResponse
+runQueryResponse =
+    RunQueryResponse
+    { _rqrBatch = Nothing
+    , _rqrHeader = Nothing
+    }
+
+-- | A batch of query results (always present).
+rqrBatch :: Lens' RunQueryResponse (Maybe QueryResultBatch)
+rqrBatch = lens _rqrBatch (\ s a -> s{_rqrBatch = a})
+
+rqrHeader :: Lens' RunQueryResponse (Maybe ResponseHeader)
+rqrHeader
+  = lens _rqrHeader (\ s a -> s{_rqrHeader = a})
+
+instance FromJSON RunQueryResponse where
+        parseJSON
+          = withObject "RunQueryResponse"
+              (\ o ->
+                 RunQueryResponse <$>
+                   (o .:? "batch") <*> (o .:? "header"))
+
+instance ToJSON RunQueryResponse where
+        toJSON RunQueryResponse{..}
+          = object
+              (catMaybes
+                 [("batch" .=) <$> _rqrBatch,
+                  ("header" .=) <$> _rqrHeader])
+
+-- | A message that can hold any of the supported value types and associated
+-- metadata.
+--
+-- /See:/ 'value' smart constructor.
+data Value = Value
+    { _vKeyValue      :: !(Maybe Key)
+    , _vBlobKeyValue  :: !(Maybe Text)
+    , _vDateTimeValue :: !(Maybe DateTime')
+    , _vIntegerValue  :: !(Maybe (Textual Int64))
+    , _vEntityValue   :: !(Maybe Entity)
+    , _vDoubleValue   :: !(Maybe (Textual Double))
+    , _vStringValue   :: !(Maybe Text)
+    , _vListValue     :: !(Maybe [Value])
+    , _vIndexed       :: !(Maybe Bool)
+    , _vBooleanValue  :: !(Maybe Bool)
+    , _vMeaning       :: !(Maybe (Textual Int32))
+    , _vBlobValue     :: !(Maybe (Textual Word8))
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Value' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'vKeyValue'
+--
+-- * 'vBlobKeyValue'
+--
+-- * 'vDateTimeValue'
+--
+-- * 'vIntegerValue'
+--
+-- * 'vEntityValue'
+--
+-- * 'vDoubleValue'
+--
+-- * 'vStringValue'
+--
+-- * 'vListValue'
+--
+-- * 'vIndexed'
+--
+-- * 'vBooleanValue'
+--
+-- * 'vMeaning'
+--
+-- * 'vBlobValue'
+value
+    :: Value
+value =
+    Value
+    { _vKeyValue = Nothing
+    , _vBlobKeyValue = Nothing
+    , _vDateTimeValue = Nothing
+    , _vIntegerValue = Nothing
+    , _vEntityValue = Nothing
+    , _vDoubleValue = Nothing
+    , _vStringValue = Nothing
+    , _vListValue = Nothing
+    , _vIndexed = Nothing
+    , _vBooleanValue = Nothing
+    , _vMeaning = Nothing
+    , _vBlobValue = Nothing
+    }
+
+-- | A key value.
+vKeyValue :: Lens' Value (Maybe Key)
+vKeyValue
+  = lens _vKeyValue (\ s a -> s{_vKeyValue = a})
+
+-- | A blob key value.
+vBlobKeyValue :: Lens' Value (Maybe Text)
+vBlobKeyValue
+  = lens _vBlobKeyValue
+      (\ s a -> s{_vBlobKeyValue = a})
+
+-- | A timestamp value.
+vDateTimeValue :: Lens' Value (Maybe UTCTime)
+vDateTimeValue
+  = lens _vDateTimeValue
+      (\ s a -> s{_vDateTimeValue = a})
+      . mapping _DateTime
+
+-- | An integer value.
+vIntegerValue :: Lens' Value (Maybe Int64)
+vIntegerValue
+  = lens _vIntegerValue
+      (\ s a -> s{_vIntegerValue = a})
+      . mapping _Coerce
+
+-- | An entity value. May have no key. May have a key with an incomplete key
+-- path. May have a reserved\/read-only key.
+vEntityValue :: Lens' Value (Maybe Entity)
+vEntityValue
+  = lens _vEntityValue (\ s a -> s{_vEntityValue = a})
+
+-- | A double value.
+vDoubleValue :: Lens' Value (Maybe Double)
+vDoubleValue
+  = lens _vDoubleValue (\ s a -> s{_vDoubleValue = a})
+      . mapping _Coerce
+
+-- | A UTF-8 encoded string value. When indexed is true, may have at most 500
+-- characters.
+vStringValue :: Lens' Value (Maybe Text)
+vStringValue
+  = lens _vStringValue (\ s a -> s{_vStringValue = a})
+
+-- | A list value. Cannot contain another list value. A Value instance that
+-- sets field list_value must not set field meaning or field indexed.
+vListValue :: Lens' Value [Value]
+vListValue
+  = lens _vListValue (\ s a -> s{_vListValue = a}) .
+      _Default
+      . _Coerce
+
+-- | If the value should be indexed. The indexed property may be set for a
+-- null value. When indexed is true, stringValue is limited to 500
+-- characters and the blob value is limited to 500 bytes. Input values by
+-- default have indexed set to true; however, you can explicitly set
+-- indexed to true if you want. (An output value never has indexed
+-- explicitly set to true.) If a value is itself an entity, it cannot have
+-- indexed set to true.
+vIndexed :: Lens' Value (Maybe Bool)
+vIndexed = lens _vIndexed (\ s a -> s{_vIndexed = a})
+
+-- | A boolean value.
+vBooleanValue :: Lens' Value (Maybe Bool)
+vBooleanValue
+  = lens _vBooleanValue
+      (\ s a -> s{_vBooleanValue = a})
+
+-- | The meaning field is reserved and should not be used.
+vMeaning :: Lens' Value (Maybe Int32)
+vMeaning
+  = lens _vMeaning (\ s a -> s{_vMeaning = a}) .
+      mapping _Coerce
+
+-- | A blob value. May be a maximum of 1,000,000 bytes. When indexed is true,
+-- may have at most 500 bytes.
+vBlobValue :: Lens' Value (Maybe Word8)
+vBlobValue
+  = lens _vBlobValue (\ s a -> s{_vBlobValue = a}) .
+      mapping _Coerce
+
+instance FromJSON Value where
+        parseJSON
+          = withObject "Value"
+              (\ o ->
+                 Value <$>
+                   (o .:? "keyValue") <*> (o .:? "blobKeyValue") <*>
+                     (o .:? "dateTimeValue")
+                     <*> (o .:? "integerValue")
+                     <*> (o .:? "entityValue")
+                     <*> (o .:? "doubleValue")
+                     <*> (o .:? "stringValue")
+                     <*> (o .:? "listValue" .!= mempty)
+                     <*> (o .:? "indexed")
+                     <*> (o .:? "booleanValue")
+                     <*> (o .:? "meaning")
+                     <*> (o .:? "blobValue"))
+
+instance ToJSON Value where
+        toJSON Value{..}
+          = object
+              (catMaybes
+                 [("keyValue" .=) <$> _vKeyValue,
+                  ("blobKeyValue" .=) <$> _vBlobKeyValue,
+                  ("dateTimeValue" .=) <$> _vDateTimeValue,
+                  ("integerValue" .=) <$> _vIntegerValue,
+                  ("entityValue" .=) <$> _vEntityValue,
+                  ("doubleValue" .=) <$> _vDoubleValue,
+                  ("stringValue" .=) <$> _vStringValue,
+                  ("listValue" .=) <$> _vListValue,
+                  ("indexed" .=) <$> _vIndexed,
+                  ("booleanValue" .=) <$> _vBooleanValue,
+                  ("meaning" .=) <$> _vMeaning,
+                  ("blobValue" .=) <$> _vBlobValue])
+
+--
+-- /See:/ 'lookupRequest' smart constructor.
+data LookupRequest = LookupRequest
+    { _lrKeys        :: !(Maybe [Key])
+    , _lrReadOptions :: !(Maybe ReadOptions)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'LookupRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'lrKeys'
+--
+-- * 'lrReadOptions'
+lookupRequest
+    :: LookupRequest
+lookupRequest =
+    LookupRequest
+    { _lrKeys = Nothing
+    , _lrReadOptions = Nothing
+    }
+
+-- | Keys of entities to look up from the datastore.
+lrKeys :: Lens' LookupRequest [Key]
+lrKeys
+  = lens _lrKeys (\ s a -> s{_lrKeys = a}) . _Default .
+      _Coerce
+
+-- | Options for this lookup request. Optional.
+lrReadOptions :: Lens' LookupRequest (Maybe ReadOptions)
+lrReadOptions
+  = lens _lrReadOptions
+      (\ s a -> s{_lrReadOptions = a})
+
+instance FromJSON LookupRequest where
+        parseJSON
+          = withObject "LookupRequest"
+              (\ o ->
+                 LookupRequest <$>
+                   (o .:? "keys" .!= mempty) <*> (o .:? "readOptions"))
+
+instance ToJSON LookupRequest where
+        toJSON LookupRequest{..}
+          = object
+              (catMaybes
+                 [("keys" .=) <$> _lrKeys,
+                  ("readOptions" .=) <$> _lrReadOptions])
+
+-- | A set of changes to apply.
+--
+-- /See:/ 'mutation' smart constructor.
+data Mutation = Mutation
+    { _mInsert       :: !(Maybe [Entity])
+    , _mForce        :: !(Maybe Bool)
+    , _mInsertAutoId :: !(Maybe [Entity])
+    , _mUpsert       :: !(Maybe [Entity])
+    , _mDelete       :: !(Maybe [Key])
+    , _mUpdate       :: !(Maybe [Entity])
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Mutation' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'mInsert'
+--
+-- * 'mForce'
+--
+-- * 'mInsertAutoId'
+--
+-- * 'mUpsert'
+--
+-- * 'mDelete'
+--
+-- * 'mUpdate'
+mutation
+    :: Mutation
+mutation =
+    Mutation
+    { _mInsert = Nothing
+    , _mForce = Nothing
+    , _mInsertAutoId = Nothing
+    , _mUpsert = Nothing
+    , _mDelete = Nothing
+    , _mUpdate = Nothing
+    }
+
+-- | Entities to insert. Each inserted entity\'s key must have a complete
+-- path and must not be reserved\/read-only.
+mInsert :: Lens' Mutation [Entity]
+mInsert
+  = lens _mInsert (\ s a -> s{_mInsert = a}) . _Default
+      . _Coerce
+
+-- | Ignore a user specified read-only period. Optional.
+mForce :: Lens' Mutation (Maybe Bool)
+mForce = lens _mForce (\ s a -> s{_mForce = a})
+
+-- | Insert entities with a newly allocated ID. Each inserted entity\'s key
+-- must omit the final identifier in its path and must not be
+-- reserved\/read-only.
+mInsertAutoId :: Lens' Mutation [Entity]
+mInsertAutoId
+  = lens _mInsertAutoId
+      (\ s a -> s{_mInsertAutoId = a})
+      . _Default
+      . _Coerce
+
+-- | Entities to upsert. Each upserted entity\'s key must have a complete
+-- path and must not be reserved\/read-only.
+mUpsert :: Lens' Mutation [Entity]
+mUpsert
+  = lens _mUpsert (\ s a -> s{_mUpsert = a}) . _Default
+      . _Coerce
+
+-- | Keys of entities to delete. Each key must have a complete key path and
+-- must not be reserved\/read-only.
+mDelete :: Lens' Mutation [Key]
+mDelete
+  = lens _mDelete (\ s a -> s{_mDelete = a}) . _Default
+      . _Coerce
+
+-- | Entities to update. Each updated entity\'s key must have a complete path
+-- and must not be reserved\/read-only.
+mUpdate :: Lens' Mutation [Entity]
+mUpdate
+  = lens _mUpdate (\ s a -> s{_mUpdate = a}) . _Default
+      . _Coerce
+
+instance FromJSON Mutation where
+        parseJSON
+          = withObject "Mutation"
+              (\ o ->
+                 Mutation <$>
+                   (o .:? "insert" .!= mempty) <*> (o .:? "force") <*>
+                     (o .:? "insertAutoId" .!= mempty)
+                     <*> (o .:? "upsert" .!= mempty)
+                     <*> (o .:? "delete" .!= mempty)
+                     <*> (o .:? "update" .!= mempty))
+
+instance ToJSON Mutation where
+        toJSON Mutation{..}
+          = object
+              (catMaybes
+                 [("insert" .=) <$> _mInsert,
+                  ("force" .=) <$> _mForce,
+                  ("insertAutoId" .=) <$> _mInsertAutoId,
+                  ("upsert" .=) <$> _mUpsert,
+                  ("delete" .=) <$> _mDelete,
+                  ("update" .=) <$> _mUpdate])
+
+--
+-- /See:/ 'responseHeader' smart constructor.
+newtype ResponseHeader = ResponseHeader
+    { _rhKind :: Text
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ResponseHeader' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'rhKind'
+responseHeader
+    :: ResponseHeader
+responseHeader =
+    ResponseHeader
+    { _rhKind = "datastore#responseHeader"
+    }
+
+-- | Identifies what kind of resource this is. Value: the fixed string
+-- \"datastore#responseHeader\".
+rhKind :: Lens' ResponseHeader Text
+rhKind = lens _rhKind (\ s a -> s{_rhKind = a})
+
+instance FromJSON ResponseHeader where
+        parseJSON
+          = withObject "ResponseHeader"
+              (\ o ->
+                 ResponseHeader <$>
+                   (o .:? "kind" .!= "datastore#responseHeader"))
+
+instance ToJSON ResponseHeader where
+        toJSON ResponseHeader{..}
+          = object (catMaybes [Just ("kind" .= _rhKind)])
+
+-- | A (kind, ID\/name) pair used to construct a key path. At most one of
+-- name or ID may be set. If either is set, the element is complete. If
+-- neither is set, the element is incomplete.
+--
+-- /See:/ 'keyPathElement' smart constructor.
+data KeyPathElement = KeyPathElement
+    { _kpeKind :: !(Maybe Text)
+    , _kpeName :: !(Maybe Text)
+    , _kpeId   :: !(Maybe (Textual Int64))
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'KeyPathElement' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'kpeKind'
+--
+-- * 'kpeName'
+--
+-- * 'kpeId'
+keyPathElement
+    :: KeyPathElement
+keyPathElement =
+    KeyPathElement
+    { _kpeKind = Nothing
+    , _kpeName = Nothing
+    , _kpeId = Nothing
+    }
+
+-- | The kind of the entity. A kind matching regex \"__.*__\" is
+-- reserved\/read-only. A kind must not contain more than 500 characters.
+-- Cannot be \"\".
+kpeKind :: Lens' KeyPathElement (Maybe Text)
+kpeKind = lens _kpeKind (\ s a -> s{_kpeKind = a})
+
+-- | The name of the entity. A name matching regex \"__.*__\" is
+-- reserved\/read-only. A name must not be more than 500 characters. Cannot
+-- be \"\".
+kpeName :: Lens' KeyPathElement (Maybe Text)
+kpeName = lens _kpeName (\ s a -> s{_kpeName = a})
+
+-- | The ID of the entity. Never equal to zero. Values less than zero are
+-- discouraged and will not be supported in the future.
+kpeId :: Lens' KeyPathElement (Maybe Int64)
+kpeId
+  = lens _kpeId (\ s a -> s{_kpeId = a}) .
+      mapping _Coerce
+
+instance FromJSON KeyPathElement where
+        parseJSON
+          = withObject "KeyPathElement"
+              (\ o ->
+                 KeyPathElement <$>
+                   (o .:? "kind") <*> (o .:? "name") <*> (o .:? "id"))
+
+instance ToJSON KeyPathElement where
+        toJSON KeyPathElement{..}
+          = object
+              (catMaybes
+                 [("kind" .=) <$> _kpeKind, ("name" .=) <$> _kpeName,
+                  ("id" .=) <$> _kpeId])
+
+-- | A reference to a property relative to the kind expressions.
+--
+-- /See:/ 'propertyReference' smart constructor.
+newtype PropertyReference = PropertyReference
+    { _prName :: Maybe Text
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'PropertyReference' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'prName'
+propertyReference
+    :: PropertyReference
+propertyReference =
+    PropertyReference
+    { _prName = Nothing
+    }
+
+-- | The name of the property.
+prName :: Lens' PropertyReference (Maybe Text)
+prName = lens _prName (\ s a -> s{_prName = a})
+
+instance FromJSON PropertyReference where
+        parseJSON
+          = withObject "PropertyReference"
+              (\ o -> PropertyReference <$> (o .:? "name"))
+
+instance ToJSON PropertyReference where
+        toJSON PropertyReference{..}
+          = object (catMaybes [("name" .=) <$> _prName])
+
+-- | A binding argument for a GQL query.
+--
+-- /See:/ 'gqlQueryArg' smart constructor.
+data GqlQueryArg = GqlQueryArg
+    { _gqaCursor :: !(Maybe (Textual Word8))
+    , _gqaValue  :: !(Maybe Value)
+    , _gqaName   :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GqlQueryArg' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gqaCursor'
+--
+-- * 'gqaValue'
+--
+-- * 'gqaName'
+gqlQueryArg
+    :: GqlQueryArg
+gqlQueryArg =
+    GqlQueryArg
+    { _gqaCursor = Nothing
+    , _gqaValue = Nothing
+    , _gqaName = Nothing
+    }
+
+gqaCursor :: Lens' GqlQueryArg (Maybe Word8)
+gqaCursor
+  = lens _gqaCursor (\ s a -> s{_gqaCursor = a}) .
+      mapping _Coerce
+
+gqaValue :: Lens' GqlQueryArg (Maybe Value)
+gqaValue = lens _gqaValue (\ s a -> s{_gqaValue = a})
+
+-- | Must match regex \"[A-Za-z_$][A-Za-z_$0-9]*\". Must not match regex
+-- \"__.*__\". Must not be \"\".
+gqaName :: Lens' GqlQueryArg (Maybe Text)
+gqaName = lens _gqaName (\ s a -> s{_gqaName = a})
+
+instance FromJSON GqlQueryArg where
+        parseJSON
+          = withObject "GqlQueryArg"
+              (\ o ->
+                 GqlQueryArg <$>
+                   (o .:? "cursor") <*> (o .:? "value") <*>
+                     (o .:? "name"))
+
+instance ToJSON GqlQueryArg where
+        toJSON GqlQueryArg{..}
+          = object
+              (catMaybes
+                 [("cursor" .=) <$> _gqaCursor,
+                  ("value" .=) <$> _gqaValue,
+                  ("name" .=) <$> _gqaName])
+
+-- | A unique identifier for an entity.
+--
+-- /See:/ 'key' smart constructor.
+data Key = Key
+    { _kPartitionId :: !(Maybe PartitionId)
+    , _kPath        :: !(Maybe [KeyPathElement])
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Key' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'kPartitionId'
+--
+-- * 'kPath'
+key
+    :: Key
+key =
+    Key
+    { _kPartitionId = Nothing
+    , _kPath = Nothing
+    }
+
+-- | Entities are partitioned into subsets, currently identified by a dataset
+-- (usually implicitly specified by the project) and namespace ID. Queries
+-- are scoped to a single partition.
+kPartitionId :: Lens' Key (Maybe PartitionId)
+kPartitionId
+  = lens _kPartitionId (\ s a -> s{_kPartitionId = a})
+
+-- | The entity path. An entity path consists of one or more elements
+-- composed of a kind and a string or numerical identifier, which identify
+-- entities. The first element identifies a root entity, the second element
+-- identifies a child of the root entity, the third element a child of the
+-- second entity, and so forth. The entities identified by all prefixes of
+-- the path are called the element\'s ancestors. An entity path is always
+-- fully complete: ALL of the entity\'s ancestors are required to be in the
+-- path along with the entity identifier itself. The only exception is that
+-- in some documented cases, the identifier in the last path element (for
+-- the entity) itself may be omitted. A path can never be empty. The path
+-- can have at most 100 elements.
+kPath :: Lens' Key [KeyPathElement]
+kPath
+  = lens _kPath (\ s a -> s{_kPath = a}) . _Default .
+      _Coerce
+
+instance FromJSON Key where
+        parseJSON
+          = withObject "Key"
+              (\ o ->
+                 Key <$>
+                   (o .:? "partitionId") <*> (o .:? "path" .!= mempty))
+
+instance ToJSON Key where
+        toJSON Key{..}
+          = object
+              (catMaybes
+                 [("partitionId" .=) <$> _kPartitionId,
+                  ("path" .=) <$> _kPath])
+
+-- | A filter on a specific property.
+--
+-- /See:/ 'propertyFilter' smart constructor.
+data PropertyFilter = PropertyFilter
+    { _pfProperty :: !(Maybe PropertyReference)
+    , _pfOperator :: !(Maybe PropertyFilterOperator)
+    , _pfValue    :: !(Maybe Value)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'PropertyFilter' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'pfProperty'
+--
+-- * 'pfOperator'
+--
+-- * 'pfValue'
+propertyFilter
+    :: PropertyFilter
+propertyFilter =
+    PropertyFilter
+    { _pfProperty = Nothing
+    , _pfOperator = Nothing
+    , _pfValue = Nothing
+    }
+
+-- | The property to filter by.
+pfProperty :: Lens' PropertyFilter (Maybe PropertyReference)
+pfProperty
+  = lens _pfProperty (\ s a -> s{_pfProperty = a})
+
+-- | The operator to filter by. One of lessThan, lessThanOrEqual,
+-- greaterThan, greaterThanOrEqual, equal, or hasAncestor.
+pfOperator :: Lens' PropertyFilter (Maybe PropertyFilterOperator)
+pfOperator
+  = lens _pfOperator (\ s a -> s{_pfOperator = a})
+
+-- | The value to compare the property to.
+pfValue :: Lens' PropertyFilter (Maybe Value)
+pfValue = lens _pfValue (\ s a -> s{_pfValue = a})
+
+instance FromJSON PropertyFilter where
+        parseJSON
+          = withObject "PropertyFilter"
+              (\ o ->
+                 PropertyFilter <$>
+                   (o .:? "property") <*> (o .:? "operator") <*>
+                     (o .:? "value"))
+
+instance ToJSON PropertyFilter where
+        toJSON PropertyFilter{..}
+          = object
+              (catMaybes
+                 [("property" .=) <$> _pfProperty,
+                  ("operator" .=) <$> _pfOperator,
+                  ("value" .=) <$> _pfValue])
+
+-- | A query.
+--
+-- /See:/ 'query' smart constructor.
+data Query = Query
+    { _qGroupBy     :: !(Maybe [PropertyReference])
+    , _qStartCursor :: !(Maybe (Textual Word8))
+    , _qOffSet      :: !(Maybe (Textual Int32))
+    , _qEndCursor   :: !(Maybe (Textual Word8))
+    , _qLimit       :: !(Maybe (Textual Int32))
+    , _qProjection  :: !(Maybe [PropertyExpression])
+    , _qFilter      :: !(Maybe Filter)
+    , _qKinds       :: !(Maybe [KindExpression])
+    , _qOrder       :: !(Maybe [PropertyOrder])
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Query' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'qGroupBy'
+--
+-- * 'qStartCursor'
+--
+-- * 'qOffSet'
+--
+-- * 'qEndCursor'
+--
+-- * 'qLimit'
+--
+-- * 'qProjection'
+--
+-- * 'qFilter'
+--
+-- * 'qKinds'
+--
+-- * 'qOrder'
+query
+    :: Query
+query =
+    Query
+    { _qGroupBy = Nothing
+    , _qStartCursor = Nothing
+    , _qOffSet = Nothing
+    , _qEndCursor = Nothing
+    , _qLimit = Nothing
+    , _qProjection = Nothing
+    , _qFilter = Nothing
+    , _qKinds = Nothing
+    , _qOrder = Nothing
+    }
+
+-- | The properties to group by (if empty, no grouping is applied to the
+-- result set).
+qGroupBy :: Lens' Query [PropertyReference]
+qGroupBy
+  = lens _qGroupBy (\ s a -> s{_qGroupBy = a}) .
+      _Default
+      . _Coerce
+
+-- | A starting point for the query results. Optional. Query cursors are
+-- returned in query result batches.
+qStartCursor :: Lens' Query (Maybe Word8)
+qStartCursor
+  = lens _qStartCursor (\ s a -> s{_qStartCursor = a})
+      . mapping _Coerce
+
+-- | The number of results to skip. Applies before limit, but after all other
+-- constraints (optional, defaults to 0).
+qOffSet :: Lens' Query (Maybe Int32)
+qOffSet
+  = lens _qOffSet (\ s a -> s{_qOffSet = a}) .
+      mapping _Coerce
+
+-- | An ending point for the query results. Optional. Query cursors are
+-- returned in query result batches.
+qEndCursor :: Lens' Query (Maybe Word8)
+qEndCursor
+  = lens _qEndCursor (\ s a -> s{_qEndCursor = a}) .
+      mapping _Coerce
+
+-- | The maximum number of results to return. Applies after all other
+-- constraints. Optional.
+qLimit :: Lens' Query (Maybe Int32)
+qLimit
+  = lens _qLimit (\ s a -> s{_qLimit = a}) .
+      mapping _Coerce
+
+-- | The projection to return. If not set the entire entity is returned.
+qProjection :: Lens' Query [PropertyExpression]
+qProjection
+  = lens _qProjection (\ s a -> s{_qProjection = a}) .
+      _Default
+      . _Coerce
+
+-- | The filter to apply (optional).
+qFilter :: Lens' Query (Maybe Filter)
+qFilter = lens _qFilter (\ s a -> s{_qFilter = a})
+
+-- | The kinds to query (if empty, returns entities from all kinds).
+qKinds :: Lens' Query [KindExpression]
+qKinds
+  = lens _qKinds (\ s a -> s{_qKinds = a}) . _Default .
+      _Coerce
+
+-- | The order to apply to the query results (if empty, order is
+-- unspecified).
+qOrder :: Lens' Query [PropertyOrder]
+qOrder
+  = lens _qOrder (\ s a -> s{_qOrder = a}) . _Default .
+      _Coerce
+
+instance FromJSON Query where
+        parseJSON
+          = withObject "Query"
+              (\ o ->
+                 Query <$>
+                   (o .:? "groupBy" .!= mempty) <*>
+                     (o .:? "startCursor")
+                     <*> (o .:? "offset")
+                     <*> (o .:? "endCursor")
+                     <*> (o .:? "limit")
+                     <*> (o .:? "projection" .!= mempty)
+                     <*> (o .:? "filter")
+                     <*> (o .:? "kinds" .!= mempty)
+                     <*> (o .:? "order" .!= mempty))
+
+instance ToJSON Query where
+        toJSON Query{..}
+          = object
+              (catMaybes
+                 [("groupBy" .=) <$> _qGroupBy,
+                  ("startCursor" .=) <$> _qStartCursor,
+                  ("offset" .=) <$> _qOffSet,
+                  ("endCursor" .=) <$> _qEndCursor,
+                  ("limit" .=) <$> _qLimit,
+                  ("projection" .=) <$> _qProjection,
+                  ("filter" .=) <$> _qFilter, ("kinds" .=) <$> _qKinds,
+                  ("order" .=) <$> _qOrder])
+
+-- | The result of fetching an entity from the datastore.
+--
+-- /See:/ 'entityResult' smart constructor.
+newtype EntityResult = EntityResult
+    { _erEntity :: Maybe Entity
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'EntityResult' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'erEntity'
+entityResult
+    :: EntityResult
+entityResult =
+    EntityResult
+    { _erEntity = Nothing
+    }
+
+-- | The resulting entity.
+erEntity :: Lens' EntityResult (Maybe Entity)
+erEntity = lens _erEntity (\ s a -> s{_erEntity = a})
+
+instance FromJSON EntityResult where
+        parseJSON
+          = withObject "EntityResult"
+              (\ o -> EntityResult <$> (o .:? "entity"))
+
+instance ToJSON EntityResult where
+        toJSON EntityResult{..}
+          = object (catMaybes [("entity" .=) <$> _erEntity])
+
+--
+-- /See:/ 'commitResponse' smart constructor.
+data CommitResponse = CommitResponse
+    { _crMutationResult :: !(Maybe MutationResult)
+    , _crHeader         :: !(Maybe ResponseHeader)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CommitResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'crMutationResult'
+--
+-- * 'crHeader'
+commitResponse
+    :: CommitResponse
+commitResponse =
+    CommitResponse
+    { _crMutationResult = Nothing
+    , _crHeader = Nothing
+    }
+
+-- | The result of performing the mutation (if any).
+crMutationResult :: Lens' CommitResponse (Maybe MutationResult)
+crMutationResult
+  = lens _crMutationResult
+      (\ s a -> s{_crMutationResult = a})
+
+crHeader :: Lens' CommitResponse (Maybe ResponseHeader)
+crHeader = lens _crHeader (\ s a -> s{_crHeader = a})
+
+instance FromJSON CommitResponse where
+        parseJSON
+          = withObject "CommitResponse"
+              (\ o ->
+                 CommitResponse <$>
+                   (o .:? "mutationResult") <*> (o .:? "header"))
+
+instance ToJSON CommitResponse where
+        toJSON CommitResponse{..}
+          = object
+              (catMaybes
+                 [("mutationResult" .=) <$> _crMutationResult,
+                  ("header" .=) <$> _crHeader])
+
+-- | A representation of a kind.
+--
+-- /See:/ 'kindExpression' smart constructor.
+newtype KindExpression = KindExpression
+    { _keName :: Maybe Text
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'KindExpression' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'keName'
+kindExpression
+    :: KindExpression
+kindExpression =
+    KindExpression
+    { _keName = Nothing
+    }
+
+-- | The name of the kind.
+keName :: Lens' KindExpression (Maybe Text)
+keName = lens _keName (\ s a -> s{_keName = a})
+
+instance FromJSON KindExpression where
+        parseJSON
+          = withObject "KindExpression"
+              (\ o -> KindExpression <$> (o .:? "name"))
+
+instance ToJSON KindExpression where
+        toJSON KindExpression{..}
+          = object (catMaybes [("name" .=) <$> _keName])
+
+--
+-- /See:/ 'readOptions' smart constructor.
+data ReadOptions = ReadOptions
+    { _roReadConsistency :: !(Maybe ReadOptionsReadConsistency)
+    , _roTransaction     :: !(Maybe (Textual Word8))
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ReadOptions' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'roReadConsistency'
+--
+-- * 'roTransaction'
+readOptions
+    :: ReadOptions
+readOptions =
+    ReadOptions
+    { _roReadConsistency = Nothing
+    , _roTransaction = Nothing
+    }
+
+-- | The read consistency to use. One of default, strong, or eventual. Cannot
+-- be set when transaction is set. Lookup and ancestor queries default to
+-- strong, global queries default to eventual and cannot be set to strong.
+-- Optional. Default is default.
+roReadConsistency :: Lens' ReadOptions (Maybe ReadOptionsReadConsistency)
+roReadConsistency
+  = lens _roReadConsistency
+      (\ s a -> s{_roReadConsistency = a})
+
+-- | The transaction to use. Optional.
+roTransaction :: Lens' ReadOptions (Maybe Word8)
+roTransaction
+  = lens _roTransaction
+      (\ s a -> s{_roTransaction = a})
+      . mapping _Coerce
+
+instance FromJSON ReadOptions where
+        parseJSON
+          = withObject "ReadOptions"
+              (\ o ->
+                 ReadOptions <$>
+                   (o .:? "readConsistency") <*> (o .:? "transaction"))
+
+instance ToJSON ReadOptions where
+        toJSON ReadOptions{..}
+          = object
+              (catMaybes
+                 [("readConsistency" .=) <$> _roReadConsistency,
+                  ("transaction" .=) <$> _roTransaction])
+
+--
+-- /See:/ 'rollbackResponse' smart constructor.
+newtype RollbackResponse = RollbackResponse
+    { _rrHeader :: Maybe ResponseHeader
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'RollbackResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'rrHeader'
+rollbackResponse
+    :: RollbackResponse
+rollbackResponse =
+    RollbackResponse
+    { _rrHeader = Nothing
+    }
+
+rrHeader :: Lens' RollbackResponse (Maybe ResponseHeader)
+rrHeader = lens _rrHeader (\ s a -> s{_rrHeader = a})
+
+instance FromJSON RollbackResponse where
+        parseJSON
+          = withObject "RollbackResponse"
+              (\ o -> RollbackResponse <$> (o .:? "header"))
+
+instance ToJSON RollbackResponse where
+        toJSON RollbackResponse{..}
+          = object (catMaybes [("header" .=) <$> _rrHeader])
+
+-- | A representation of a property in a projection.
+--
+-- /See:/ 'propertyExpression' smart constructor.
+data PropertyExpression = PropertyExpression
+    { _peProperty            :: !(Maybe PropertyReference)
+    , _peAggregationFunction :: !(Maybe PropertyExpressionAggregationFunction)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'PropertyExpression' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'peProperty'
+--
+-- * 'peAggregationFunction'
+propertyExpression
+    :: PropertyExpression
+propertyExpression =
+    PropertyExpression
+    { _peProperty = Nothing
+    , _peAggregationFunction = Nothing
+    }
+
+-- | The property to project.
+peProperty :: Lens' PropertyExpression (Maybe PropertyReference)
+peProperty
+  = lens _peProperty (\ s a -> s{_peProperty = a})
+
+-- | The aggregation function to apply to the property. Optional. Can only be
+-- used when grouping by at least one property. Must then be set on all
+-- properties in the projection that are not being grouped by. Aggregation
+-- functions: first selects the first result as determined by the query\'s
+-- order.
+peAggregationFunction :: Lens' PropertyExpression (Maybe PropertyExpressionAggregationFunction)
+peAggregationFunction
+  = lens _peAggregationFunction
+      (\ s a -> s{_peAggregationFunction = a})
+
+instance FromJSON PropertyExpression where
+        parseJSON
+          = withObject "PropertyExpression"
+              (\ o ->
+                 PropertyExpression <$>
+                   (o .:? "property") <*> (o .:? "aggregationFunction"))
+
+instance ToJSON PropertyExpression where
+        toJSON PropertyExpression{..}
+          = object
+              (catMaybes
+                 [("property" .=) <$> _peProperty,
+                  ("aggregationFunction" .=) <$>
+                    _peAggregationFunction])
+
+-- | A holder for any type of filter. Exactly one field should be specified.
+--
+-- /See:/ 'filter'' smart constructor.
+data Filter = Filter
+    { _fCompositeFilter :: !(Maybe CompositeFilter)
+    , _fPropertyFilter  :: !(Maybe PropertyFilter)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Filter' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'fCompositeFilter'
+--
+-- * 'fPropertyFilter'
+filter'
+    :: Filter
+filter' =
+    Filter
+    { _fCompositeFilter = Nothing
+    , _fPropertyFilter = Nothing
+    }
+
+-- | A composite filter.
+fCompositeFilter :: Lens' Filter (Maybe CompositeFilter)
+fCompositeFilter
+  = lens _fCompositeFilter
+      (\ s a -> s{_fCompositeFilter = a})
+
+-- | A filter on a property.
+fPropertyFilter :: Lens' Filter (Maybe PropertyFilter)
+fPropertyFilter
+  = lens _fPropertyFilter
+      (\ s a -> s{_fPropertyFilter = a})
+
+instance FromJSON Filter where
+        parseJSON
+          = withObject "Filter"
+              (\ o ->
+                 Filter <$>
+                   (o .:? "compositeFilter") <*>
+                     (o .:? "propertyFilter"))
+
+instance ToJSON Filter where
+        toJSON Filter{..}
+          = object
+              (catMaybes
+                 [("compositeFilter" .=) <$> _fCompositeFilter,
+                  ("propertyFilter" .=) <$> _fPropertyFilter])
+
+--
+-- /See:/ 'commitRequest' smart constructor.
+data CommitRequest = CommitRequest
+    { _crMode           :: !(Maybe CommitRequestMode)
+    , _crMutation       :: !(Maybe Mutation)
+    , _crTransaction    :: !(Maybe (Textual Word8))
+    , _crIgnoreReadOnly :: !(Maybe Bool)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CommitRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'crMode'
+--
+-- * 'crMutation'
+--
+-- * 'crTransaction'
+--
+-- * 'crIgnoreReadOnly'
+commitRequest
+    :: CommitRequest
+commitRequest =
+    CommitRequest
+    { _crMode = Nothing
+    , _crMutation = Nothing
+    , _crTransaction = Nothing
+    , _crIgnoreReadOnly = Nothing
+    }
+
+-- | The type of commit to perform. Either TRANSACTIONAL or
+-- NON_TRANSACTIONAL.
+crMode :: Lens' CommitRequest (Maybe CommitRequestMode)
+crMode = lens _crMode (\ s a -> s{_crMode = a})
+
+-- | The mutation to perform. Optional.
+crMutation :: Lens' CommitRequest (Maybe Mutation)
+crMutation
+  = lens _crMutation (\ s a -> s{_crMutation = a})
+
+-- | The transaction identifier, returned by a call to beginTransaction. Must
+-- be set when mode is TRANSACTIONAL.
+crTransaction :: Lens' CommitRequest (Maybe Word8)
+crTransaction
+  = lens _crTransaction
+      (\ s a -> s{_crTransaction = a})
+      . mapping _Coerce
+
+crIgnoreReadOnly :: Lens' CommitRequest (Maybe Bool)
+crIgnoreReadOnly
+  = lens _crIgnoreReadOnly
+      (\ s a -> s{_crIgnoreReadOnly = a})
+
+instance FromJSON CommitRequest where
+        parseJSON
+          = withObject "CommitRequest"
+              (\ o ->
+                 CommitRequest <$>
+                   (o .:? "mode") <*> (o .:? "mutation") <*>
+                     (o .:? "transaction")
+                     <*> (o .:? "ignoreReadOnly"))
+
+instance ToJSON CommitRequest where
+        toJSON CommitRequest{..}
+          = object
+              (catMaybes
+                 [("mode" .=) <$> _crMode,
+                  ("mutation" .=) <$> _crMutation,
+                  ("transaction" .=) <$> _crTransaction,
+                  ("ignoreReadOnly" .=) <$> _crIgnoreReadOnly])
+
+-- | An entity.
+--
+-- /See:/ 'entity' smart constructor.
+data Entity = Entity
+    { _eKey        :: !(Maybe Key)
+    , _eProperties :: !(Maybe EntityProperties)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Entity' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'eKey'
+--
+-- * 'eProperties'
+entity
+    :: Entity
+entity =
+    Entity
+    { _eKey = Nothing
+    , _eProperties = Nothing
+    }
+
+-- | The entity\'s key. An entity must have a key, unless otherwise
+-- documented (for example, an entity in Value.entityValue may have no
+-- key). An entity\'s kind is its key\'s path\'s last element\'s kind, or
+-- null if it has no key.
+eKey :: Lens' Entity (Maybe Key)
+eKey = lens _eKey (\ s a -> s{_eKey = a})
+
+-- | The entity\'s properties.
+eProperties :: Lens' Entity (Maybe EntityProperties)
+eProperties
+  = lens _eProperties (\ s a -> s{_eProperties = a})
+
+instance FromJSON Entity where
+        parseJSON
+          = withObject "Entity"
+              (\ o ->
+                 Entity <$> (o .:? "key") <*> (o .:? "properties"))
+
+instance ToJSON Entity where
+        toJSON Entity{..}
+          = object
+              (catMaybes
+                 [("key" .=) <$> _eKey,
+                  ("properties" .=) <$> _eProperties])
+
+--
+-- /See:/ 'lookupResponse' smart constructor.
+data LookupResponse = LookupResponse
+    { _lrDeferred :: !(Maybe [Key])
+    , _lrFound    :: !(Maybe [EntityResult])
+    , _lrMissing  :: !(Maybe [EntityResult])
+    , _lrHeader   :: !(Maybe ResponseHeader)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'LookupResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'lrDeferred'
+--
+-- * 'lrFound'
+--
+-- * 'lrMissing'
+--
+-- * 'lrHeader'
+lookupResponse
+    :: LookupResponse
+lookupResponse =
+    LookupResponse
+    { _lrDeferred = Nothing
+    , _lrFound = Nothing
+    , _lrMissing = Nothing
+    , _lrHeader = Nothing
+    }
+
+-- | A list of keys that were not looked up due to resource constraints.
+lrDeferred :: Lens' LookupResponse [Key]
+lrDeferred
+  = lens _lrDeferred (\ s a -> s{_lrDeferred = a}) .
+      _Default
+      . _Coerce
+
+-- | Entities found.
+lrFound :: Lens' LookupResponse [EntityResult]
+lrFound
+  = lens _lrFound (\ s a -> s{_lrFound = a}) . _Default
+      . _Coerce
+
+-- | Entities not found, with only the key populated.
+lrMissing :: Lens' LookupResponse [EntityResult]
+lrMissing
+  = lens _lrMissing (\ s a -> s{_lrMissing = a}) .
+      _Default
+      . _Coerce
+
+lrHeader :: Lens' LookupResponse (Maybe ResponseHeader)
+lrHeader = lens _lrHeader (\ s a -> s{_lrHeader = a})
+
+instance FromJSON LookupResponse where
+        parseJSON
+          = withObject "LookupResponse"
+              (\ o ->
+                 LookupResponse <$>
+                   (o .:? "deferred" .!= mempty) <*>
+                     (o .:? "found" .!= mempty)
+                     <*> (o .:? "missing" .!= mempty)
+                     <*> (o .:? "header"))
+
+instance ToJSON LookupResponse where
+        toJSON LookupResponse{..}
+          = object
+              (catMaybes
+                 [("deferred" .=) <$> _lrDeferred,
+                  ("found" .=) <$> _lrFound,
+                  ("missing" .=) <$> _lrMissing,
+                  ("header" .=) <$> _lrHeader])
+
+-- | The desired order for a specific property.
+--
+-- /See:/ 'propertyOrder' smart constructor.
+data PropertyOrder = PropertyOrder
+    { _poProperty  :: !(Maybe PropertyReference)
+    , _poDirection :: !(Maybe PropertyOrderDirection)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'PropertyOrder' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'poProperty'
+--
+-- * 'poDirection'
+propertyOrder
+    :: PropertyOrder
+propertyOrder =
+    PropertyOrder
+    { _poProperty = Nothing
+    , _poDirection = Nothing
+    }
+
+-- | The property to order by.
+poProperty :: Lens' PropertyOrder (Maybe PropertyReference)
+poProperty
+  = lens _poProperty (\ s a -> s{_poProperty = a})
+
+-- | The direction to order by. One of ascending or descending. Optional,
+-- defaults to ascending.
+poDirection :: Lens' PropertyOrder (Maybe PropertyOrderDirection)
+poDirection
+  = lens _poDirection (\ s a -> s{_poDirection = a})
+
+instance FromJSON PropertyOrder where
+        parseJSON
+          = withObject "PropertyOrder"
+              (\ o ->
+                 PropertyOrder <$>
+                   (o .:? "property") <*> (o .:? "direction"))
+
+instance ToJSON PropertyOrder where
+        toJSON PropertyOrder{..}
+          = object
+              (catMaybes
+                 [("property" .=) <$> _poProperty,
+                  ("direction" .=) <$> _poDirection])
diff --git a/gen/Network/Google/Datastore/Types/Sum.hs b/gen/Network/Google/Datastore/Types/Sum.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Datastore/Types/Sum.hs
@@ -0,0 +1,301 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE LambdaCase         #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Network.Google.Datastore.Types.Sum
+-- Copyright   : (c) 2015 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.Datastore.Types.Sum where
+
+import           Network.Google.Prelude
+
+-- | The direction to order by. One of ascending or descending. Optional,
+-- defaults to ascending.
+data PropertyOrderDirection
+    = Ascending
+      -- ^ @ASCENDING@
+    | Descending
+      -- ^ @DESCENDING@
+      deriving (Eq,Ord,Enum,Read,Show,Data,Typeable,Generic)
+
+instance Hashable PropertyOrderDirection
+
+instance FromText PropertyOrderDirection where
+    fromText = \case
+        "ASCENDING" -> Just Ascending
+        "DESCENDING" -> Just Descending
+        _ -> Nothing
+
+instance ToText PropertyOrderDirection where
+    toText = \case
+        Ascending -> "ASCENDING"
+        Descending -> "DESCENDING"
+
+instance FromJSON PropertyOrderDirection where
+    parseJSON = parseJSONText "PropertyOrderDirection"
+
+instance ToJSON PropertyOrderDirection where
+    toJSON = toJSONText
+
+-- | The result type for every entity in entityResults. full for full
+-- entities, projection for entities with only projected properties,
+-- keyOnly for entities with only a key.
+data QueryResultBatchEntityResultType
+    = Full
+      -- ^ @FULL@
+    | KeyOnly
+      -- ^ @KEY_ONLY@
+    | Projection
+      -- ^ @PROJECTION@
+      deriving (Eq,Ord,Enum,Read,Show,Data,Typeable,Generic)
+
+instance Hashable QueryResultBatchEntityResultType
+
+instance FromText QueryResultBatchEntityResultType where
+    fromText = \case
+        "FULL" -> Just Full
+        "KEY_ONLY" -> Just KeyOnly
+        "PROJECTION" -> Just Projection
+        _ -> Nothing
+
+instance ToText QueryResultBatchEntityResultType where
+    toText = \case
+        Full -> "FULL"
+        KeyOnly -> "KEY_ONLY"
+        Projection -> "PROJECTION"
+
+instance FromJSON QueryResultBatchEntityResultType where
+    parseJSON = parseJSONText "QueryResultBatchEntityResultType"
+
+instance ToJSON QueryResultBatchEntityResultType where
+    toJSON = toJSONText
+
+-- | The operator for combining multiple filters. Only \"and\" is currently
+-- supported.
+data CompositeFilterOperator
+    = And
+      -- ^ @AND@
+      deriving (Eq,Ord,Enum,Read,Show,Data,Typeable,Generic)
+
+instance Hashable CompositeFilterOperator
+
+instance FromText CompositeFilterOperator where
+    fromText = \case
+        "AND" -> Just And
+        _ -> Nothing
+
+instance ToText CompositeFilterOperator where
+    toText = \case
+        And -> "AND"
+
+instance FromJSON CompositeFilterOperator where
+    parseJSON = parseJSONText "CompositeFilterOperator"
+
+instance ToJSON CompositeFilterOperator where
+    toJSON = toJSONText
+
+-- | The state of the query after the current batch. One of notFinished,
+-- moreResultsAfterLimit, noMoreResults.
+data QueryResultBatchMoreResults
+    = MoreResultsAfterLimit
+      -- ^ @MORE_RESULTS_AFTER_LIMIT@
+    | NotFinished
+      -- ^ @NOT_FINISHED@
+    | NoMoreResults
+      -- ^ @NO_MORE_RESULTS@
+      deriving (Eq,Ord,Enum,Read,Show,Data,Typeable,Generic)
+
+instance Hashable QueryResultBatchMoreResults
+
+instance FromText QueryResultBatchMoreResults where
+    fromText = \case
+        "MORE_RESULTS_AFTER_LIMIT" -> Just MoreResultsAfterLimit
+        "NOT_FINISHED" -> Just NotFinished
+        "NO_MORE_RESULTS" -> Just NoMoreResults
+        _ -> Nothing
+
+instance ToText QueryResultBatchMoreResults where
+    toText = \case
+        MoreResultsAfterLimit -> "MORE_RESULTS_AFTER_LIMIT"
+        NotFinished -> "NOT_FINISHED"
+        NoMoreResults -> "NO_MORE_RESULTS"
+
+instance FromJSON QueryResultBatchMoreResults where
+    parseJSON = parseJSONText "QueryResultBatchMoreResults"
+
+instance ToJSON QueryResultBatchMoreResults where
+    toJSON = toJSONText
+
+-- | The read consistency to use. One of default, strong, or eventual. Cannot
+-- be set when transaction is set. Lookup and ancestor queries default to
+-- strong, global queries default to eventual and cannot be set to strong.
+-- Optional. Default is default.
+data ReadOptionsReadConsistency
+    = Default
+      -- ^ @DEFAULT@
+    | Eventual
+      -- ^ @EVENTUAL@
+    | Strong
+      -- ^ @STRONG@
+      deriving (Eq,Ord,Enum,Read,Show,Data,Typeable,Generic)
+
+instance Hashable ReadOptionsReadConsistency
+
+instance FromText ReadOptionsReadConsistency where
+    fromText = \case
+        "DEFAULT" -> Just Default
+        "EVENTUAL" -> Just Eventual
+        "STRONG" -> Just Strong
+        _ -> Nothing
+
+instance ToText ReadOptionsReadConsistency where
+    toText = \case
+        Default -> "DEFAULT"
+        Eventual -> "EVENTUAL"
+        Strong -> "STRONG"
+
+instance FromJSON ReadOptionsReadConsistency where
+    parseJSON = parseJSONText "ReadOptionsReadConsistency"
+
+instance ToJSON ReadOptionsReadConsistency where
+    toJSON = toJSONText
+
+-- | The operator to filter by. One of lessThan, lessThanOrEqual,
+-- greaterThan, greaterThanOrEqual, equal, or hasAncestor.
+data PropertyFilterOperator
+    = Equal
+      -- ^ @EQUAL@
+    | GreaterThan
+      -- ^ @GREATER_THAN@
+    | GreaterThanOrEqual
+      -- ^ @GREATER_THAN_OR_EQUAL@
+    | HasAncestor
+      -- ^ @HAS_ANCESTOR@
+    | LessThan
+      -- ^ @LESS_THAN@
+    | LessThanOrEqual
+      -- ^ @LESS_THAN_OR_EQUAL@
+      deriving (Eq,Ord,Enum,Read,Show,Data,Typeable,Generic)
+
+instance Hashable PropertyFilterOperator
+
+instance FromText PropertyFilterOperator where
+    fromText = \case
+        "EQUAL" -> Just Equal
+        "GREATER_THAN" -> Just GreaterThan
+        "GREATER_THAN_OR_EQUAL" -> Just GreaterThanOrEqual
+        "HAS_ANCESTOR" -> Just HasAncestor
+        "LESS_THAN" -> Just LessThan
+        "LESS_THAN_OR_EQUAL" -> Just LessThanOrEqual
+        _ -> Nothing
+
+instance ToText PropertyFilterOperator where
+    toText = \case
+        Equal -> "EQUAL"
+        GreaterThan -> "GREATER_THAN"
+        GreaterThanOrEqual -> "GREATER_THAN_OR_EQUAL"
+        HasAncestor -> "HAS_ANCESTOR"
+        LessThan -> "LESS_THAN"
+        LessThanOrEqual -> "LESS_THAN_OR_EQUAL"
+
+instance FromJSON PropertyFilterOperator where
+    parseJSON = parseJSONText "PropertyFilterOperator"
+
+instance ToJSON PropertyFilterOperator where
+    toJSON = toJSONText
+
+-- | The transaction isolation level. Either snapshot or serializable. The
+-- default isolation level is snapshot isolation, which means that another
+-- transaction may not concurrently modify the data that is modified by
+-- this transaction. Optionally, a transaction can request to be made
+-- serializable which means that another transaction cannot concurrently
+-- modify the data that is read or modified by this transaction.
+data BeginTransactionRequestIsolationLevel
+    = Serializable
+      -- ^ @SERIALIZABLE@
+    | Snapshot
+      -- ^ @SNAPSHOT@
+      deriving (Eq,Ord,Enum,Read,Show,Data,Typeable,Generic)
+
+instance Hashable BeginTransactionRequestIsolationLevel
+
+instance FromText BeginTransactionRequestIsolationLevel where
+    fromText = \case
+        "SERIALIZABLE" -> Just Serializable
+        "SNAPSHOT" -> Just Snapshot
+        _ -> Nothing
+
+instance ToText BeginTransactionRequestIsolationLevel where
+    toText = \case
+        Serializable -> "SERIALIZABLE"
+        Snapshot -> "SNAPSHOT"
+
+instance FromJSON BeginTransactionRequestIsolationLevel where
+    parseJSON = parseJSONText "BeginTransactionRequestIsolationLevel"
+
+instance ToJSON BeginTransactionRequestIsolationLevel where
+    toJSON = toJSONText
+
+-- | The type of commit to perform. Either TRANSACTIONAL or
+-- NON_TRANSACTIONAL.
+data CommitRequestMode
+    = NonTransactional
+      -- ^ @NON_TRANSACTIONAL@
+    | Transactional
+      -- ^ @TRANSACTIONAL@
+      deriving (Eq,Ord,Enum,Read,Show,Data,Typeable,Generic)
+
+instance Hashable CommitRequestMode
+
+instance FromText CommitRequestMode where
+    fromText = \case
+        "NON_TRANSACTIONAL" -> Just NonTransactional
+        "TRANSACTIONAL" -> Just Transactional
+        _ -> Nothing
+
+instance ToText CommitRequestMode where
+    toText = \case
+        NonTransactional -> "NON_TRANSACTIONAL"
+        Transactional -> "TRANSACTIONAL"
+
+instance FromJSON CommitRequestMode where
+    parseJSON = parseJSONText "CommitRequestMode"
+
+instance ToJSON CommitRequestMode where
+    toJSON = toJSONText
+
+-- | The aggregation function to apply to the property. Optional. Can only be
+-- used when grouping by at least one property. Must then be set on all
+-- properties in the projection that are not being grouped by. Aggregation
+-- functions: first selects the first result as determined by the query\'s
+-- order.
+data PropertyExpressionAggregationFunction
+    = First
+      -- ^ @FIRST@
+      deriving (Eq,Ord,Enum,Read,Show,Data,Typeable,Generic)
+
+instance Hashable PropertyExpressionAggregationFunction
+
+instance FromText PropertyExpressionAggregationFunction where
+    fromText = \case
+        "FIRST" -> Just First
+        _ -> Nothing
+
+instance ToText PropertyExpressionAggregationFunction where
+    toText = \case
+        First -> "FIRST"
+
+instance FromJSON PropertyExpressionAggregationFunction where
+    parseJSON = parseJSONText "PropertyExpressionAggregationFunction"
+
+instance ToJSON PropertyExpressionAggregationFunction where
+    toJSON = toJSONText
diff --git a/gen/Network/Google/Resource/Datastore/DataSets/AllocateIds.hs b/gen/Network/Google/Resource/Datastore/DataSets/AllocateIds.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/Datastore/DataSets/AllocateIds.hs
@@ -0,0 +1,101 @@
+{-# 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.Datastore.DataSets.AllocateIds
+-- Copyright   : (c) 2015 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)
+--
+-- Allocate IDs for incomplete keys (useful for referencing an entity
+-- before it is inserted).
+--
+-- /See:/ <https://developers.google.com/datastore/ Google Cloud Datastore API Reference> for @datastore.datasets.allocateIds@.
+module Network.Google.Resource.Datastore.DataSets.AllocateIds
+    (
+    -- * REST Resource
+      DataSetsAllocateIdsResource
+
+    -- * Creating a Request
+    , dataSetsAllocateIds
+    , DataSetsAllocateIds
+
+    -- * Request Lenses
+    , dsaiPayload
+    , dsaiDataSetId
+    ) where
+
+import           Network.Google.Datastore.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @datastore.datasets.allocateIds@ method which the
+-- 'DataSetsAllocateIds' request conforms to.
+type DataSetsAllocateIdsResource =
+     "datastore" :>
+       "v1beta2" :>
+         "datasets" :>
+           Capture "datasetId" Text :>
+             "allocateIds" :>
+               QueryParam "alt" AltJSON :>
+                 ReqBody '[JSON] AllocateIdsRequest :>
+                   Post '[JSON] AllocateIdsResponse
+
+-- | Allocate IDs for incomplete keys (useful for referencing an entity
+-- before it is inserted).
+--
+-- /See:/ 'dataSetsAllocateIds' smart constructor.
+data DataSetsAllocateIds = DataSetsAllocateIds
+    { _dsaiPayload   :: !AllocateIdsRequest
+    , _dsaiDataSetId :: !Text
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DataSetsAllocateIds' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dsaiPayload'
+--
+-- * 'dsaiDataSetId'
+dataSetsAllocateIds
+    :: AllocateIdsRequest -- ^ 'dsaiPayload'
+    -> Text -- ^ 'dsaiDataSetId'
+    -> DataSetsAllocateIds
+dataSetsAllocateIds pDsaiPayload_ pDsaiDataSetId_ =
+    DataSetsAllocateIds
+    { _dsaiPayload = pDsaiPayload_
+    , _dsaiDataSetId = pDsaiDataSetId_
+    }
+
+-- | Multipart request metadata.
+dsaiPayload :: Lens' DataSetsAllocateIds AllocateIdsRequest
+dsaiPayload
+  = lens _dsaiPayload (\ s a -> s{_dsaiPayload = a})
+
+-- | Identifies the dataset.
+dsaiDataSetId :: Lens' DataSetsAllocateIds Text
+dsaiDataSetId
+  = lens _dsaiDataSetId
+      (\ s a -> s{_dsaiDataSetId = a})
+
+instance GoogleRequest DataSetsAllocateIds where
+        type Rs DataSetsAllocateIds = AllocateIdsResponse
+        requestClient DataSetsAllocateIds{..}
+          = go _dsaiDataSetId (Just AltJSON) _dsaiPayload
+              datastoreService
+          where go
+                  = buildClient
+                      (Proxy :: Proxy DataSetsAllocateIdsResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/Datastore/DataSets/BeginTransaction.hs b/gen/Network/Google/Resource/Datastore/DataSets/BeginTransaction.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/Datastore/DataSets/BeginTransaction.hs
@@ -0,0 +1,100 @@
+{-# 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.Datastore.DataSets.BeginTransaction
+-- Copyright   : (c) 2015 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)
+--
+-- Begin a new transaction.
+--
+-- /See:/ <https://developers.google.com/datastore/ Google Cloud Datastore API Reference> for @datastore.datasets.beginTransaction@.
+module Network.Google.Resource.Datastore.DataSets.BeginTransaction
+    (
+    -- * REST Resource
+      DataSetsBeginTransactionResource
+
+    -- * Creating a Request
+    , dataSetsBeginTransaction
+    , DataSetsBeginTransaction
+
+    -- * Request Lenses
+    , dsbtPayload
+    , dsbtDataSetId
+    ) where
+
+import           Network.Google.Datastore.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @datastore.datasets.beginTransaction@ method which the
+-- 'DataSetsBeginTransaction' request conforms to.
+type DataSetsBeginTransactionResource =
+     "datastore" :>
+       "v1beta2" :>
+         "datasets" :>
+           Capture "datasetId" Text :>
+             "beginTransaction" :>
+               QueryParam "alt" AltJSON :>
+                 ReqBody '[JSON] BeginTransactionRequest :>
+                   Post '[JSON] BeginTransactionResponse
+
+-- | Begin a new transaction.
+--
+-- /See:/ 'dataSetsBeginTransaction' smart constructor.
+data DataSetsBeginTransaction = DataSetsBeginTransaction
+    { _dsbtPayload   :: !BeginTransactionRequest
+    , _dsbtDataSetId :: !Text
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DataSetsBeginTransaction' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dsbtPayload'
+--
+-- * 'dsbtDataSetId'
+dataSetsBeginTransaction
+    :: BeginTransactionRequest -- ^ 'dsbtPayload'
+    -> Text -- ^ 'dsbtDataSetId'
+    -> DataSetsBeginTransaction
+dataSetsBeginTransaction pDsbtPayload_ pDsbtDataSetId_ =
+    DataSetsBeginTransaction
+    { _dsbtPayload = pDsbtPayload_
+    , _dsbtDataSetId = pDsbtDataSetId_
+    }
+
+-- | Multipart request metadata.
+dsbtPayload :: Lens' DataSetsBeginTransaction BeginTransactionRequest
+dsbtPayload
+  = lens _dsbtPayload (\ s a -> s{_dsbtPayload = a})
+
+-- | Identifies the dataset.
+dsbtDataSetId :: Lens' DataSetsBeginTransaction Text
+dsbtDataSetId
+  = lens _dsbtDataSetId
+      (\ s a -> s{_dsbtDataSetId = a})
+
+instance GoogleRequest DataSetsBeginTransaction where
+        type Rs DataSetsBeginTransaction =
+             BeginTransactionResponse
+        requestClient DataSetsBeginTransaction{..}
+          = go _dsbtDataSetId (Just AltJSON) _dsbtPayload
+              datastoreService
+          where go
+                  = buildClient
+                      (Proxy :: Proxy DataSetsBeginTransactionResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/Datastore/DataSets/Commit.hs b/gen/Network/Google/Resource/Datastore/DataSets/Commit.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/Datastore/DataSets/Commit.hs
@@ -0,0 +1,99 @@
+{-# 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.Datastore.DataSets.Commit
+-- Copyright   : (c) 2015 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)
+--
+-- Commit a transaction, optionally creating, deleting or modifying some
+-- entities.
+--
+-- /See:/ <https://developers.google.com/datastore/ Google Cloud Datastore API Reference> for @datastore.datasets.commit@.
+module Network.Google.Resource.Datastore.DataSets.Commit
+    (
+    -- * REST Resource
+      DataSetsCommitResource
+
+    -- * Creating a Request
+    , dataSetsCommit
+    , DataSetsCommit
+
+    -- * Request Lenses
+    , dscPayload
+    , dscDataSetId
+    ) where
+
+import           Network.Google.Datastore.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @datastore.datasets.commit@ method which the
+-- 'DataSetsCommit' request conforms to.
+type DataSetsCommitResource =
+     "datastore" :>
+       "v1beta2" :>
+         "datasets" :>
+           Capture "datasetId" Text :>
+             "commit" :>
+               QueryParam "alt" AltJSON :>
+                 ReqBody '[JSON] CommitRequest :>
+                   Post '[JSON] CommitResponse
+
+-- | Commit a transaction, optionally creating, deleting or modifying some
+-- entities.
+--
+-- /See:/ 'dataSetsCommit' smart constructor.
+data DataSetsCommit = DataSetsCommit
+    { _dscPayload   :: !CommitRequest
+    , _dscDataSetId :: !Text
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DataSetsCommit' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dscPayload'
+--
+-- * 'dscDataSetId'
+dataSetsCommit
+    :: CommitRequest -- ^ 'dscPayload'
+    -> Text -- ^ 'dscDataSetId'
+    -> DataSetsCommit
+dataSetsCommit pDscPayload_ pDscDataSetId_ =
+    DataSetsCommit
+    { _dscPayload = pDscPayload_
+    , _dscDataSetId = pDscDataSetId_
+    }
+
+-- | Multipart request metadata.
+dscPayload :: Lens' DataSetsCommit CommitRequest
+dscPayload
+  = lens _dscPayload (\ s a -> s{_dscPayload = a})
+
+-- | Identifies the dataset.
+dscDataSetId :: Lens' DataSetsCommit Text
+dscDataSetId
+  = lens _dscDataSetId (\ s a -> s{_dscDataSetId = a})
+
+instance GoogleRequest DataSetsCommit where
+        type Rs DataSetsCommit = CommitResponse
+        requestClient DataSetsCommit{..}
+          = go _dscDataSetId (Just AltJSON) _dscPayload
+              datastoreService
+          where go
+                  = buildClient (Proxy :: Proxy DataSetsCommitResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/Datastore/DataSets/Lookup.hs b/gen/Network/Google/Resource/Datastore/DataSets/Lookup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/Datastore/DataSets/Lookup.hs
@@ -0,0 +1,97 @@
+{-# 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.Datastore.DataSets.Lookup
+-- Copyright   : (c) 2015 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)
+--
+-- Look up some entities by key.
+--
+-- /See:/ <https://developers.google.com/datastore/ Google Cloud Datastore API Reference> for @datastore.datasets.lookup@.
+module Network.Google.Resource.Datastore.DataSets.Lookup
+    (
+    -- * REST Resource
+      DataSetsLookupResource
+
+    -- * Creating a Request
+    , dataSetsLookup
+    , DataSetsLookup
+
+    -- * Request Lenses
+    , dslPayload
+    , dslDataSetId
+    ) where
+
+import           Network.Google.Datastore.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @datastore.datasets.lookup@ method which the
+-- 'DataSetsLookup' request conforms to.
+type DataSetsLookupResource =
+     "datastore" :>
+       "v1beta2" :>
+         "datasets" :>
+           Capture "datasetId" Text :>
+             "lookup" :>
+               QueryParam "alt" AltJSON :>
+                 ReqBody '[JSON] LookupRequest :>
+                   Post '[JSON] LookupResponse
+
+-- | Look up some entities by key.
+--
+-- /See:/ 'dataSetsLookup' smart constructor.
+data DataSetsLookup = DataSetsLookup
+    { _dslPayload   :: !LookupRequest
+    , _dslDataSetId :: !Text
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DataSetsLookup' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dslPayload'
+--
+-- * 'dslDataSetId'
+dataSetsLookup
+    :: LookupRequest -- ^ 'dslPayload'
+    -> Text -- ^ 'dslDataSetId'
+    -> DataSetsLookup
+dataSetsLookup pDslPayload_ pDslDataSetId_ =
+    DataSetsLookup
+    { _dslPayload = pDslPayload_
+    , _dslDataSetId = pDslDataSetId_
+    }
+
+-- | Multipart request metadata.
+dslPayload :: Lens' DataSetsLookup LookupRequest
+dslPayload
+  = lens _dslPayload (\ s a -> s{_dslPayload = a})
+
+-- | Identifies the dataset.
+dslDataSetId :: Lens' DataSetsLookup Text
+dslDataSetId
+  = lens _dslDataSetId (\ s a -> s{_dslDataSetId = a})
+
+instance GoogleRequest DataSetsLookup where
+        type Rs DataSetsLookup = LookupResponse
+        requestClient DataSetsLookup{..}
+          = go _dslDataSetId (Just AltJSON) _dslPayload
+              datastoreService
+          where go
+                  = buildClient (Proxy :: Proxy DataSetsLookupResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/Datastore/DataSets/Rollback.hs b/gen/Network/Google/Resource/Datastore/DataSets/Rollback.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/Datastore/DataSets/Rollback.hs
@@ -0,0 +1,98 @@
+{-# 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.Datastore.DataSets.Rollback
+-- Copyright   : (c) 2015 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)
+--
+-- Roll back a transaction.
+--
+-- /See:/ <https://developers.google.com/datastore/ Google Cloud Datastore API Reference> for @datastore.datasets.rollback@.
+module Network.Google.Resource.Datastore.DataSets.Rollback
+    (
+    -- * REST Resource
+      DataSetsRollbackResource
+
+    -- * Creating a Request
+    , dataSetsRollback
+    , DataSetsRollback
+
+    -- * Request Lenses
+    , dsrPayload
+    , dsrDataSetId
+    ) where
+
+import           Network.Google.Datastore.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @datastore.datasets.rollback@ method which the
+-- 'DataSetsRollback' request conforms to.
+type DataSetsRollbackResource =
+     "datastore" :>
+       "v1beta2" :>
+         "datasets" :>
+           Capture "datasetId" Text :>
+             "rollback" :>
+               QueryParam "alt" AltJSON :>
+                 ReqBody '[JSON] RollbackRequest :>
+                   Post '[JSON] RollbackResponse
+
+-- | Roll back a transaction.
+--
+-- /See:/ 'dataSetsRollback' smart constructor.
+data DataSetsRollback = DataSetsRollback
+    { _dsrPayload   :: !RollbackRequest
+    , _dsrDataSetId :: !Text
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DataSetsRollback' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dsrPayload'
+--
+-- * 'dsrDataSetId'
+dataSetsRollback
+    :: RollbackRequest -- ^ 'dsrPayload'
+    -> Text -- ^ 'dsrDataSetId'
+    -> DataSetsRollback
+dataSetsRollback pDsrPayload_ pDsrDataSetId_ =
+    DataSetsRollback
+    { _dsrPayload = pDsrPayload_
+    , _dsrDataSetId = pDsrDataSetId_
+    }
+
+-- | Multipart request metadata.
+dsrPayload :: Lens' DataSetsRollback RollbackRequest
+dsrPayload
+  = lens _dsrPayload (\ s a -> s{_dsrPayload = a})
+
+-- | Identifies the dataset.
+dsrDataSetId :: Lens' DataSetsRollback Text
+dsrDataSetId
+  = lens _dsrDataSetId (\ s a -> s{_dsrDataSetId = a})
+
+instance GoogleRequest DataSetsRollback where
+        type Rs DataSetsRollback = RollbackResponse
+        requestClient DataSetsRollback{..}
+          = go _dsrDataSetId (Just AltJSON) _dsrPayload
+              datastoreService
+          where go
+                  = buildClient
+                      (Proxy :: Proxy DataSetsRollbackResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/Datastore/DataSets/RunQuery.hs b/gen/Network/Google/Resource/Datastore/DataSets/RunQuery.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/Datastore/DataSets/RunQuery.hs
@@ -0,0 +1,99 @@
+{-# 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.Datastore.DataSets.RunQuery
+-- Copyright   : (c) 2015 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)
+--
+-- Query for entities.
+--
+-- /See:/ <https://developers.google.com/datastore/ Google Cloud Datastore API Reference> for @datastore.datasets.runQuery@.
+module Network.Google.Resource.Datastore.DataSets.RunQuery
+    (
+    -- * REST Resource
+      DataSetsRunQueryResource
+
+    -- * Creating a Request
+    , dataSetsRunQuery
+    , DataSetsRunQuery
+
+    -- * Request Lenses
+    , dsrqPayload
+    , dsrqDataSetId
+    ) where
+
+import           Network.Google.Datastore.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @datastore.datasets.runQuery@ method which the
+-- 'DataSetsRunQuery' request conforms to.
+type DataSetsRunQueryResource =
+     "datastore" :>
+       "v1beta2" :>
+         "datasets" :>
+           Capture "datasetId" Text :>
+             "runQuery" :>
+               QueryParam "alt" AltJSON :>
+                 ReqBody '[JSON] RunQueryRequest :>
+                   Post '[JSON] RunQueryResponse
+
+-- | Query for entities.
+--
+-- /See:/ 'dataSetsRunQuery' smart constructor.
+data DataSetsRunQuery = DataSetsRunQuery
+    { _dsrqPayload   :: !RunQueryRequest
+    , _dsrqDataSetId :: !Text
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DataSetsRunQuery' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dsrqPayload'
+--
+-- * 'dsrqDataSetId'
+dataSetsRunQuery
+    :: RunQueryRequest -- ^ 'dsrqPayload'
+    -> Text -- ^ 'dsrqDataSetId'
+    -> DataSetsRunQuery
+dataSetsRunQuery pDsrqPayload_ pDsrqDataSetId_ =
+    DataSetsRunQuery
+    { _dsrqPayload = pDsrqPayload_
+    , _dsrqDataSetId = pDsrqDataSetId_
+    }
+
+-- | Multipart request metadata.
+dsrqPayload :: Lens' DataSetsRunQuery RunQueryRequest
+dsrqPayload
+  = lens _dsrqPayload (\ s a -> s{_dsrqPayload = a})
+
+-- | Identifies the dataset.
+dsrqDataSetId :: Lens' DataSetsRunQuery Text
+dsrqDataSetId
+  = lens _dsrqDataSetId
+      (\ s a -> s{_dsrqDataSetId = a})
+
+instance GoogleRequest DataSetsRunQuery where
+        type Rs DataSetsRunQuery = RunQueryResponse
+        requestClient DataSetsRunQuery{..}
+          = go _dsrqDataSetId (Just AltJSON) _dsrqPayload
+              datastoreService
+          where go
+                  = buildClient
+                      (Proxy :: Proxy DataSetsRunQueryResource)
+                      mempty
diff --git a/gogol-datastore.cabal b/gogol-datastore.cabal
new file mode 100644
--- /dev/null
+++ b/gogol-datastore.cabal
@@ -0,0 +1,51 @@
+name:                  gogol-datastore
+version:               0.0.1
+synopsis:              Google Cloud Datastore 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 Brendan Hay
+category:              Network, Google, Cloud
+build-type:            Simple
+cabal-version:         >= 1.10
+extra-source-files:    README.md
+
+description:
+    API for accessing Google Cloud Datastore.
+    .
+    /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 @v1beta2@
+    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.Datastore
+        , Network.Google.Datastore.Types
+        , Network.Google.Resource.Datastore.DataSets.AllocateIds
+        , Network.Google.Resource.Datastore.DataSets.BeginTransaction
+        , Network.Google.Resource.Datastore.DataSets.Commit
+        , Network.Google.Resource.Datastore.DataSets.Lookup
+        , Network.Google.Resource.Datastore.DataSets.Rollback
+        , Network.Google.Resource.Datastore.DataSets.RunQuery
+
+    other-modules:
+          Network.Google.Datastore.Types.Product
+        , Network.Google.Datastore.Types.Sum
+
+    build-depends:
+          gogol-core == 0.0.1.*
+        , base       >= 4.7 && < 5
