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-photoslibrary
+
+* [Version](#version)
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+
+## Version
+
+`0.3.0`
+
+
+## Description
+
+A client library for the Google Photos Library.
+
+
+## Contribute
+
+For any problems, comments, or feedback please create an issue [here on GitHub](https://github.com/brendanhay/gogol/issues).
+
+> _Note:_ this library is an auto-generated Haskell package. Please see `gogol-gen` for more information.
+
+
+## Licence
+
+`gogol-photoslibrary` 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/PhotosLibrary.hs b/gen/Network/Google/PhotosLibrary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/PhotosLibrary.hs
@@ -0,0 +1,363 @@
+{-# LANGUAGE DataKinds         #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE TypeOperators     #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+
+-- |
+-- Module      : Network.Google.PhotosLibrary
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Manage photos, videos, and albums in Google Photos
+--
+-- /See:/ <https://developers.google.com/photos/ Photos Library API Reference>
+module Network.Google.PhotosLibrary
+    (
+    -- * Service Configuration
+      photosLibraryService
+
+    -- * OAuth Scopes
+    , photosLibraryReadOnlyScope
+    , photosLibraryScope
+    , drivePhotosReadOnlyScope
+    , photosLibrarySharingScope
+    , photosLibraryAppendOnlyScope
+    , photosLibraryReadOnlyAppcreatedDataScope
+
+    -- * API Declaration
+    , PhotosLibraryAPI
+
+    -- * Resources
+
+    -- ** photoslibrary.albums.addEnrichment
+    , module Network.Google.Resource.PhotosLibrary.Albums.AddEnrichment
+
+    -- ** photoslibrary.albums.create
+    , module Network.Google.Resource.PhotosLibrary.Albums.Create
+
+    -- ** photoslibrary.albums.get
+    , module Network.Google.Resource.PhotosLibrary.Albums.Get
+
+    -- ** photoslibrary.albums.list
+    , module Network.Google.Resource.PhotosLibrary.Albums.List
+
+    -- ** photoslibrary.albums.share
+    , module Network.Google.Resource.PhotosLibrary.Albums.Share
+
+    -- ** photoslibrary.mediaItems.batchCreate
+    , module Network.Google.Resource.PhotosLibrary.MediaItems.BatchCreate
+
+    -- ** photoslibrary.mediaItems.get
+    , module Network.Google.Resource.PhotosLibrary.MediaItems.Get
+
+    -- ** photoslibrary.mediaItems.search
+    , module Network.Google.Resource.PhotosLibrary.MediaItems.Search
+
+    -- ** photoslibrary.sharedAlbums.join
+    , module Network.Google.Resource.PhotosLibrary.SharedAlbums.Join
+
+    -- ** photoslibrary.sharedAlbums.list
+    , module Network.Google.Resource.PhotosLibrary.SharedAlbums.List
+
+    -- * Types
+
+    -- ** LatLng
+    , LatLng
+    , latLng
+    , llLatitude
+    , llLongitude
+
+    -- ** LocationEnrichment
+    , LocationEnrichment
+    , locationEnrichment
+    , leLocation
+
+    -- ** DateFilter
+    , DateFilter
+    , dateFilter
+    , dfDates
+    , dfRanges
+
+    -- ** Photo
+    , Photo
+    , photo
+    , pFocalLength
+    , pCameraMake
+    , pExposureTime
+    , pCameraModel
+    , pIsoEquivalent
+    , pApertureFNumber
+
+    -- ** TextEnrichment
+    , TextEnrichment
+    , textEnrichment
+    , teText
+
+    -- ** Status
+    , Status
+    , status
+    , sDetails
+    , sCode
+    , sMessage
+
+    -- ** AddEnrichmentToAlbumResponse
+    , AddEnrichmentToAlbumResponse
+    , addEnrichmentToAlbumResponse
+    , aetarEnrichmentItem
+
+    -- ** SearchMediaItemsResponse
+    , SearchMediaItemsResponse
+    , searchMediaItemsResponse
+    , smirNextPageToken
+    , smirMediaItems
+
+    -- ** JoinSharedAlbumResponse
+    , JoinSharedAlbumResponse
+    , joinSharedAlbumResponse
+
+    -- ** CreateAlbumRequest
+    , CreateAlbumRequest
+    , createAlbumRequest
+    , carAlbum
+
+    -- ** Location
+    , Location
+    , location
+    , lLatlng
+    , lLocationName
+
+    -- ** VideoStatus
+    , VideoStatus (..)
+
+    -- ** NewEnrichmentItem
+    , NewEnrichmentItem
+    , newEnrichmentItem
+    , neiLocationEnrichment
+    , neiTextEnrichment
+    , neiMapEnrichment
+
+    -- ** ShareInfo
+    , ShareInfo
+    , shareInfo
+    , siShareableURL
+    , siShareToken
+    , siSharedAlbumOptions
+
+    -- ** BatchCreateMediaItemsRequest
+    , BatchCreateMediaItemsRequest
+    , batchCreateMediaItemsRequest
+    , bcmirAlbumId
+    , bcmirNewMediaItems
+    , bcmirAlbumPosition
+
+    -- ** Filters
+    , Filters
+    , filters
+    , fDateFilter
+    , fIncludeArchivedMedia
+    , fMediaTypeFilter
+    , fContentFilter
+
+    -- ** StatusDetailsItem
+    , StatusDetailsItem
+    , statusDetailsItem
+    , sdiAddtional
+
+    -- ** DateRange
+    , DateRange
+    , dateRange
+    , drEndDate
+    , drStartDate
+
+    -- ** SharedAlbumOptions
+    , SharedAlbumOptions
+    , sharedAlbumOptions
+    , saoIsCollaborative
+    , saoIsCommentable
+
+    -- ** MediaMetadata
+    , MediaMetadata
+    , mediaMetadata
+    , mmCreationTime
+    , mmPhoto
+    , mmHeight
+    , mmWidth
+    , mmVideo
+
+    -- ** ShareAlbumResponse
+    , ShareAlbumResponse
+    , shareAlbumResponse
+    , sarShareInfo
+
+    -- ** Video
+    , Video
+    , video
+    , vStatus
+    , vCameraMake
+    , vCameraModel
+    , vFps
+
+    -- ** MediaItem
+    , MediaItem
+    , mediaItem
+    , miProductURL
+    , miBaseURL
+    , miMediaMetadata
+    , miMimeType
+    , miId
+    , miContributorInfo
+    , miDescription
+
+    -- ** Date
+    , Date
+    , date
+    , dDay
+    , dYear
+    , dMonth
+
+    -- ** EnrichmentItem
+    , EnrichmentItem
+    , enrichmentItem
+    , eiId
+
+    -- ** ListSharedAlbumsResponse
+    , ListSharedAlbumsResponse
+    , listSharedAlbumsResponse
+    , lsarNextPageToken
+    , lsarSharedAlbums
+
+    -- ** MediaTypeFilter
+    , MediaTypeFilter
+    , mediaTypeFilter
+    , mtfMediaTypes
+
+    -- ** NewMediaItemResult
+    , NewMediaItemResult
+    , newMediaItemResult
+    , nmirStatus
+    , nmirUploadToken
+    , nmirMediaItem
+
+    -- ** Album
+    , Album
+    , album
+    , aIsWriteable
+    , aProductURL
+    , aShareInfo
+    , aCoverPhotoBaseURL
+    , aId
+    , aTotalMediaItems
+    , aTitle
+
+    -- ** SimpleMediaItem
+    , SimpleMediaItem
+    , simpleMediaItem
+    , smiUploadToken
+
+    -- ** AlbumPositionPosition
+    , AlbumPositionPosition (..)
+
+    -- ** Xgafv
+    , Xgafv (..)
+
+    -- ** ContributorInfo
+    , ContributorInfo
+    , contributorInfo
+    , ciProFilePictureBaseURL
+    , ciDisplayName
+
+    -- ** ListAlbumsResponse
+    , ListAlbumsResponse
+    , listAlbumsResponse
+    , larNextPageToken
+    , larAlbums
+
+    -- ** MapEnrichment
+    , MapEnrichment
+    , mapEnrichment
+    , meDestination
+    , meOrigin
+
+    -- ** SearchMediaItemsRequest
+    , SearchMediaItemsRequest
+    , searchMediaItemsRequest
+    , smirAlbumId
+    , smirFilters
+    , smirPageToken
+    , smirPageSize
+
+    -- ** NewMediaItem
+    , NewMediaItem
+    , newMediaItem
+    , nmiSimpleMediaItem
+    , nmiDescription
+
+    -- ** AddEnrichmentToAlbumRequest
+    , AddEnrichmentToAlbumRequest
+    , addEnrichmentToAlbumRequest
+    , aetarNewEnrichmentItem
+    , aetarAlbumPosition
+
+    -- ** JoinSharedAlbumRequest
+    , JoinSharedAlbumRequest
+    , joinSharedAlbumRequest
+    , jsarShareToken
+
+    -- ** ShareAlbumRequest
+    , ShareAlbumRequest
+    , shareAlbumRequest
+    , sarSharedAlbumOptions
+
+    -- ** AlbumPosition
+    , AlbumPosition
+    , albumPosition
+    , apRelativeMediaItemId
+    , apRelativeEnrichmentItemId
+    , apPosition
+
+    -- ** ContentFilter
+    , ContentFilter
+    , contentFilter
+    , cfIncludedContentCategories
+    , cfExcludedContentCategories
+
+    -- ** BatchCreateMediaItemsResponse
+    , BatchCreateMediaItemsResponse
+    , batchCreateMediaItemsResponse
+    , bcmirNewMediaItemResults
+    ) where
+
+import           Network.Google.PhotosLibrary.Types
+import           Network.Google.Prelude
+import           Network.Google.Resource.PhotosLibrary.Albums.AddEnrichment
+import           Network.Google.Resource.PhotosLibrary.Albums.Create
+import           Network.Google.Resource.PhotosLibrary.Albums.Get
+import           Network.Google.Resource.PhotosLibrary.Albums.List
+import           Network.Google.Resource.PhotosLibrary.Albums.Share
+import           Network.Google.Resource.PhotosLibrary.MediaItems.BatchCreate
+import           Network.Google.Resource.PhotosLibrary.MediaItems.Get
+import           Network.Google.Resource.PhotosLibrary.MediaItems.Search
+import           Network.Google.Resource.PhotosLibrary.SharedAlbums.Join
+import           Network.Google.Resource.PhotosLibrary.SharedAlbums.List
+
+{- $resources
+TODO
+-}
+
+-- | Represents the entirety of the methods and resources available for the Photos Library API service.
+type PhotosLibraryAPI =
+     MediaItemsGetResource :<|>
+       MediaItemsBatchCreateResource
+       :<|> MediaItemsSearchResource
+       :<|> AlbumsListResource
+       :<|> AlbumsShareResource
+       :<|> AlbumsAddEnrichmentResource
+       :<|> AlbumsGetResource
+       :<|> AlbumsCreateResource
+       :<|> SharedAlbumsListResource
+       :<|> SharedAlbumsJoinResource
diff --git a/gen/Network/Google/PhotosLibrary/Types.hs b/gen/Network/Google/PhotosLibrary/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/PhotosLibrary/Types.hs
@@ -0,0 +1,328 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Network.Google.PhotosLibrary.Types
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+module Network.Google.PhotosLibrary.Types
+    (
+    -- * Service Configuration
+      photosLibraryService
+
+    -- * OAuth Scopes
+    , photosLibraryReadOnlyScope
+    , photosLibraryScope
+    , drivePhotosReadOnlyScope
+    , photosLibrarySharingScope
+    , photosLibraryAppendOnlyScope
+    , photosLibraryReadOnlyAppcreatedDataScope
+
+    -- * LatLng
+    , LatLng
+    , latLng
+    , llLatitude
+    , llLongitude
+
+    -- * LocationEnrichment
+    , LocationEnrichment
+    , locationEnrichment
+    , leLocation
+
+    -- * DateFilter
+    , DateFilter
+    , dateFilter
+    , dfDates
+    , dfRanges
+
+    -- * Photo
+    , Photo
+    , photo
+    , pFocalLength
+    , pCameraMake
+    , pExposureTime
+    , pCameraModel
+    , pIsoEquivalent
+    , pApertureFNumber
+
+    -- * TextEnrichment
+    , TextEnrichment
+    , textEnrichment
+    , teText
+
+    -- * Status
+    , Status
+    , status
+    , sDetails
+    , sCode
+    , sMessage
+
+    -- * AddEnrichmentToAlbumResponse
+    , AddEnrichmentToAlbumResponse
+    , addEnrichmentToAlbumResponse
+    , aetarEnrichmentItem
+
+    -- * SearchMediaItemsResponse
+    , SearchMediaItemsResponse
+    , searchMediaItemsResponse
+    , smirNextPageToken
+    , smirMediaItems
+
+    -- * JoinSharedAlbumResponse
+    , JoinSharedAlbumResponse
+    , joinSharedAlbumResponse
+
+    -- * CreateAlbumRequest
+    , CreateAlbumRequest
+    , createAlbumRequest
+    , carAlbum
+
+    -- * Location
+    , Location
+    , location
+    , lLatlng
+    , lLocationName
+
+    -- * VideoStatus
+    , VideoStatus (..)
+
+    -- * NewEnrichmentItem
+    , NewEnrichmentItem
+    , newEnrichmentItem
+    , neiLocationEnrichment
+    , neiTextEnrichment
+    , neiMapEnrichment
+
+    -- * ShareInfo
+    , ShareInfo
+    , shareInfo
+    , siShareableURL
+    , siShareToken
+    , siSharedAlbumOptions
+
+    -- * BatchCreateMediaItemsRequest
+    , BatchCreateMediaItemsRequest
+    , batchCreateMediaItemsRequest
+    , bcmirAlbumId
+    , bcmirNewMediaItems
+    , bcmirAlbumPosition
+
+    -- * Filters
+    , Filters
+    , filters
+    , fDateFilter
+    , fIncludeArchivedMedia
+    , fMediaTypeFilter
+    , fContentFilter
+
+    -- * StatusDetailsItem
+    , StatusDetailsItem
+    , statusDetailsItem
+    , sdiAddtional
+
+    -- * DateRange
+    , DateRange
+    , dateRange
+    , drEndDate
+    , drStartDate
+
+    -- * SharedAlbumOptions
+    , SharedAlbumOptions
+    , sharedAlbumOptions
+    , saoIsCollaborative
+    , saoIsCommentable
+
+    -- * MediaMetadata
+    , MediaMetadata
+    , mediaMetadata
+    , mmCreationTime
+    , mmPhoto
+    , mmHeight
+    , mmWidth
+    , mmVideo
+
+    -- * ShareAlbumResponse
+    , ShareAlbumResponse
+    , shareAlbumResponse
+    , sarShareInfo
+
+    -- * Video
+    , Video
+    , video
+    , vStatus
+    , vCameraMake
+    , vCameraModel
+    , vFps
+
+    -- * MediaItem
+    , MediaItem
+    , mediaItem
+    , miProductURL
+    , miBaseURL
+    , miMediaMetadata
+    , miMimeType
+    , miId
+    , miContributorInfo
+    , miDescription
+
+    -- * Date
+    , Date
+    , date
+    , dDay
+    , dYear
+    , dMonth
+
+    -- * EnrichmentItem
+    , EnrichmentItem
+    , enrichmentItem
+    , eiId
+
+    -- * ListSharedAlbumsResponse
+    , ListSharedAlbumsResponse
+    , listSharedAlbumsResponse
+    , lsarNextPageToken
+    , lsarSharedAlbums
+
+    -- * MediaTypeFilter
+    , MediaTypeFilter
+    , mediaTypeFilter
+    , mtfMediaTypes
+
+    -- * NewMediaItemResult
+    , NewMediaItemResult
+    , newMediaItemResult
+    , nmirStatus
+    , nmirUploadToken
+    , nmirMediaItem
+
+    -- * Album
+    , Album
+    , album
+    , aIsWriteable
+    , aProductURL
+    , aShareInfo
+    , aCoverPhotoBaseURL
+    , aId
+    , aTotalMediaItems
+    , aTitle
+
+    -- * SimpleMediaItem
+    , SimpleMediaItem
+    , simpleMediaItem
+    , smiUploadToken
+
+    -- * AlbumPositionPosition
+    , AlbumPositionPosition (..)
+
+    -- * Xgafv
+    , Xgafv (..)
+
+    -- * ContributorInfo
+    , ContributorInfo
+    , contributorInfo
+    , ciProFilePictureBaseURL
+    , ciDisplayName
+
+    -- * ListAlbumsResponse
+    , ListAlbumsResponse
+    , listAlbumsResponse
+    , larNextPageToken
+    , larAlbums
+
+    -- * MapEnrichment
+    , MapEnrichment
+    , mapEnrichment
+    , meDestination
+    , meOrigin
+
+    -- * SearchMediaItemsRequest
+    , SearchMediaItemsRequest
+    , searchMediaItemsRequest
+    , smirAlbumId
+    , smirFilters
+    , smirPageToken
+    , smirPageSize
+
+    -- * NewMediaItem
+    , NewMediaItem
+    , newMediaItem
+    , nmiSimpleMediaItem
+    , nmiDescription
+
+    -- * AddEnrichmentToAlbumRequest
+    , AddEnrichmentToAlbumRequest
+    , addEnrichmentToAlbumRequest
+    , aetarNewEnrichmentItem
+    , aetarAlbumPosition
+
+    -- * JoinSharedAlbumRequest
+    , JoinSharedAlbumRequest
+    , joinSharedAlbumRequest
+    , jsarShareToken
+
+    -- * ShareAlbumRequest
+    , ShareAlbumRequest
+    , shareAlbumRequest
+    , sarSharedAlbumOptions
+
+    -- * AlbumPosition
+    , AlbumPosition
+    , albumPosition
+    , apRelativeMediaItemId
+    , apRelativeEnrichmentItemId
+    , apPosition
+
+    -- * ContentFilter
+    , ContentFilter
+    , contentFilter
+    , cfIncludedContentCategories
+    , cfExcludedContentCategories
+
+    -- * BatchCreateMediaItemsResponse
+    , BatchCreateMediaItemsResponse
+    , batchCreateMediaItemsResponse
+    , bcmirNewMediaItemResults
+    ) where
+
+import           Network.Google.PhotosLibrary.Types.Product
+import           Network.Google.PhotosLibrary.Types.Sum
+import           Network.Google.Prelude
+
+-- | Default request referring to version 'v1' of the Photos Library API. This contains the host and root path used as a starting point for constructing service requests.
+photosLibraryService :: ServiceConfig
+photosLibraryService
+  = defaultService (ServiceId "photoslibrary:v1")
+      "photoslibrary.googleapis.com"
+
+-- | View your Google Photos library
+photosLibraryReadOnlyScope :: Proxy '["https://www.googleapis.com/auth/photoslibrary.readonly"]
+photosLibraryReadOnlyScope = Proxy;
+
+-- | View and manage your Google Photos library
+photosLibraryScope :: Proxy '["https://www.googleapis.com/auth/photoslibrary"]
+photosLibraryScope = Proxy;
+
+-- | View the photos, videos and albums in your Google Photos
+drivePhotosReadOnlyScope :: Proxy '["https://www.googleapis.com/auth/drive.photos.readonly"]
+drivePhotosReadOnlyScope = Proxy;
+
+-- | Manage and add to shared albums on your behalf
+photosLibrarySharingScope :: Proxy '["https://www.googleapis.com/auth/photoslibrary.sharing"]
+photosLibrarySharingScope = Proxy;
+
+-- | Add to your Google Photos library
+photosLibraryAppendOnlyScope :: Proxy '["https://www.googleapis.com/auth/photoslibrary.appendonly"]
+photosLibraryAppendOnlyScope = Proxy;
+
+-- | Manage photos added by this app
+photosLibraryReadOnlyAppcreatedDataScope :: Proxy '["https://www.googleapis.com/auth/photoslibrary.readonly.appcreateddata"]
+photosLibraryReadOnlyAppcreatedDataScope = Proxy;
diff --git a/gen/Network/Google/PhotosLibrary/Types/Product.hs b/gen/Network/Google/PhotosLibrary/Types/Product.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/PhotosLibrary/Types/Product.hs
@@ -0,0 +1,2287 @@
+{-# 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.PhotosLibrary.Types.Product
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+module Network.Google.PhotosLibrary.Types.Product where
+
+import           Network.Google.PhotosLibrary.Types.Sum
+import           Network.Google.Prelude
+
+-- | An object representing a latitude\/longitude pair. This is expressed as
+-- a pair of doubles representing degrees latitude and degrees longitude.
+-- Unless specified otherwise, this must conform to the
+-- <http://www.unoosa.org/pdf/icg/2012/template/WGS_84.pdf WGS84 standard>.
+-- Values must be within normalized ranges.
+--
+-- /See:/ 'latLng' smart constructor.
+data LatLng = LatLng'
+    { _llLatitude  :: !(Maybe (Textual Double))
+    , _llLongitude :: !(Maybe (Textual Double))
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'LatLng' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'llLatitude'
+--
+-- * 'llLongitude'
+latLng
+    :: LatLng
+latLng =
+    LatLng'
+    { _llLatitude = Nothing
+    , _llLongitude = Nothing
+    }
+
+-- | The latitude in degrees. It must be in the range [-90.0, +90.0].
+llLatitude :: Lens' LatLng (Maybe Double)
+llLatitude
+  = lens _llLatitude (\ s a -> s{_llLatitude = a}) .
+      mapping _Coerce
+
+-- | The longitude in degrees. It must be in the range [-180.0, +180.0].
+llLongitude :: Lens' LatLng (Maybe Double)
+llLongitude
+  = lens _llLongitude (\ s a -> s{_llLongitude = a}) .
+      mapping _Coerce
+
+instance FromJSON LatLng where
+        parseJSON
+          = withObject "LatLng"
+              (\ o ->
+                 LatLng' <$>
+                   (o .:? "latitude") <*> (o .:? "longitude"))
+
+instance ToJSON LatLng where
+        toJSON LatLng'{..}
+          = object
+              (catMaybes
+                 [("latitude" .=) <$> _llLatitude,
+                  ("longitude" .=) <$> _llLongitude])
+
+-- | An enrichment containing a single location.
+--
+-- /See:/ 'locationEnrichment' smart constructor.
+newtype LocationEnrichment = LocationEnrichment'
+    { _leLocation :: Maybe Location
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'LocationEnrichment' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'leLocation'
+locationEnrichment
+    :: LocationEnrichment
+locationEnrichment =
+    LocationEnrichment'
+    { _leLocation = Nothing
+    }
+
+-- | Location for this enrichment item.
+leLocation :: Lens' LocationEnrichment (Maybe Location)
+leLocation
+  = lens _leLocation (\ s a -> s{_leLocation = a})
+
+instance FromJSON LocationEnrichment where
+        parseJSON
+          = withObject "LocationEnrichment"
+              (\ o -> LocationEnrichment' <$> (o .:? "location"))
+
+instance ToJSON LocationEnrichment where
+        toJSON LocationEnrichment'{..}
+          = object
+              (catMaybes [("location" .=) <$> _leLocation])
+
+-- | This filter defines the allowed dates or date ranges for the media
+-- returned. It is possible to pick a set of specific dates and a set of
+-- date ranges.
+--
+-- /See:/ 'dateFilter' smart constructor.
+data DateFilter = DateFilter'
+    { _dfDates  :: !(Maybe [Date])
+    , _dfRanges :: !(Maybe [DateRange])
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DateFilter' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dfDates'
+--
+-- * 'dfRanges'
+dateFilter
+    :: DateFilter
+dateFilter =
+    DateFilter'
+    { _dfDates = Nothing
+    , _dfRanges = Nothing
+    }
+
+-- | List of dates that the media items must have been created on. There is a
+-- maximum of 5 dates that can be included per request.
+dfDates :: Lens' DateFilter [Date]
+dfDates
+  = lens _dfDates (\ s a -> s{_dfDates = a}) . _Default
+      . _Coerce
+
+-- | List of dates ranges that the media items must have been created in.
+-- There is a maximum of 5 dates ranges that can be included per request.
+dfRanges :: Lens' DateFilter [DateRange]
+dfRanges
+  = lens _dfRanges (\ s a -> s{_dfRanges = a}) .
+      _Default
+      . _Coerce
+
+instance FromJSON DateFilter where
+        parseJSON
+          = withObject "DateFilter"
+              (\ o ->
+                 DateFilter' <$>
+                   (o .:? "dates" .!= mempty) <*>
+                     (o .:? "ranges" .!= mempty))
+
+instance ToJSON DateFilter where
+        toJSON DateFilter'{..}
+          = object
+              (catMaybes
+                 [("dates" .=) <$> _dfDates,
+                  ("ranges" .=) <$> _dfRanges])
+
+-- | Metadata that is specific to a photo, for example, ISO, focal length and
+-- exposure time. Some of these fields may be null or not included.
+--
+-- /See:/ 'photo' smart constructor.
+data Photo = Photo'
+    { _pFocalLength     :: !(Maybe (Textual Double))
+    , _pCameraMake      :: !(Maybe Text)
+    , _pExposureTime    :: !(Maybe GDuration)
+    , _pCameraModel     :: !(Maybe Text)
+    , _pIsoEquivalent   :: !(Maybe (Textual Int32))
+    , _pApertureFNumber :: !(Maybe (Textual Double))
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Photo' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'pFocalLength'
+--
+-- * 'pCameraMake'
+--
+-- * 'pExposureTime'
+--
+-- * 'pCameraModel'
+--
+-- * 'pIsoEquivalent'
+--
+-- * 'pApertureFNumber'
+photo
+    :: Photo
+photo =
+    Photo'
+    { _pFocalLength = Nothing
+    , _pCameraMake = Nothing
+    , _pExposureTime = Nothing
+    , _pCameraModel = Nothing
+    , _pIsoEquivalent = Nothing
+    , _pApertureFNumber = Nothing
+    }
+
+-- | Focal length of the photo.
+pFocalLength :: Lens' Photo (Maybe Double)
+pFocalLength
+  = lens _pFocalLength (\ s a -> s{_pFocalLength = a})
+      . mapping _Coerce
+
+-- | Brand of the camera which took the photo.
+pCameraMake :: Lens' Photo (Maybe Text)
+pCameraMake
+  = lens _pCameraMake (\ s a -> s{_pCameraMake = a})
+
+-- | Exposure time of the photo.
+pExposureTime :: Lens' Photo (Maybe Scientific)
+pExposureTime
+  = lens _pExposureTime
+      (\ s a -> s{_pExposureTime = a})
+      . mapping _GDuration
+
+-- | Model of the camera which took the photo.
+pCameraModel :: Lens' Photo (Maybe Text)
+pCameraModel
+  = lens _pCameraModel (\ s a -> s{_pCameraModel = a})
+
+-- | ISO of the photo.
+pIsoEquivalent :: Lens' Photo (Maybe Int32)
+pIsoEquivalent
+  = lens _pIsoEquivalent
+      (\ s a -> s{_pIsoEquivalent = a})
+      . mapping _Coerce
+
+-- | Apeture f number of the photo.
+pApertureFNumber :: Lens' Photo (Maybe Double)
+pApertureFNumber
+  = lens _pApertureFNumber
+      (\ s a -> s{_pApertureFNumber = a})
+      . mapping _Coerce
+
+instance FromJSON Photo where
+        parseJSON
+          = withObject "Photo"
+              (\ o ->
+                 Photo' <$>
+                   (o .:? "focalLength") <*> (o .:? "cameraMake") <*>
+                     (o .:? "exposureTime")
+                     <*> (o .:? "cameraModel")
+                     <*> (o .:? "isoEquivalent")
+                     <*> (o .:? "apertureFNumber"))
+
+instance ToJSON Photo where
+        toJSON Photo'{..}
+          = object
+              (catMaybes
+                 [("focalLength" .=) <$> _pFocalLength,
+                  ("cameraMake" .=) <$> _pCameraMake,
+                  ("exposureTime" .=) <$> _pExposureTime,
+                  ("cameraModel" .=) <$> _pCameraModel,
+                  ("isoEquivalent" .=) <$> _pIsoEquivalent,
+                  ("apertureFNumber" .=) <$> _pApertureFNumber])
+
+-- | An enrichment containing text.
+--
+-- /See:/ 'textEnrichment' smart constructor.
+newtype TextEnrichment = TextEnrichment'
+    { _teText :: Maybe Text
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'TextEnrichment' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'teText'
+textEnrichment
+    :: TextEnrichment
+textEnrichment =
+    TextEnrichment'
+    { _teText = Nothing
+    }
+
+-- | Text for this text enrichment item.
+teText :: Lens' TextEnrichment (Maybe Text)
+teText = lens _teText (\ s a -> s{_teText = a})
+
+instance FromJSON TextEnrichment where
+        parseJSON
+          = withObject "TextEnrichment"
+              (\ o -> TextEnrichment' <$> (o .:? "text"))
+
+instance ToJSON TextEnrichment where
+        toJSON TextEnrichment'{..}
+          = object (catMaybes [("text" .=) <$> _teText])
+
+-- | The \`Status\` type defines a logical error model that is suitable for
+-- different programming environments, including REST APIs and RPC APIs. It
+-- is used by [gRPC](https:\/\/github.com\/grpc). The error model is
+-- designed to be: - Simple to use and understand for most users - Flexible
+-- enough to meet unexpected needs # Overview The \`Status\` message
+-- contains three pieces of data: error code, error message, and error
+-- details. The error code should be an enum value of google.rpc.Code, but
+-- it may accept additional error codes if needed. The error message should
+-- be a developer-facing English message that helps developers *understand*
+-- and *resolve* the error. If a localized user-facing error message is
+-- needed, put the localized message in the error details or localize it in
+-- the client. The optional error details may contain arbitrary information
+-- about the error. There is a predefined set of error detail types in the
+-- package \`google.rpc\` that can be used for common error conditions. #
+-- Language mapping The \`Status\` message is the logical representation of
+-- the error model, but it is not necessarily the actual wire format. When
+-- the \`Status\` message is exposed in different client libraries and
+-- different wire protocols, it can be mapped differently. For example, it
+-- will likely be mapped to some exceptions in Java, but more likely mapped
+-- to some error codes in C. # Other uses The error model and the
+-- \`Status\` message can be used in a variety of environments, either with
+-- or without APIs, to provide a consistent developer experience across
+-- different environments. Example uses of this error model include: -
+-- Partial errors. If a service needs to return partial errors to the
+-- client, it may embed the \`Status\` in the normal response to indicate
+-- the partial errors. - Workflow errors. A typical workflow has multiple
+-- steps. Each step may have a \`Status\` message for error reporting. -
+-- Batch operations. If a client uses batch request and batch response, the
+-- \`Status\` message should be used directly inside batch response, one
+-- for each error sub-response. - Asynchronous operations. If an API call
+-- embeds asynchronous operation results in its response, the status of
+-- those operations should be represented directly using the \`Status\`
+-- message. - Logging. If some API errors are stored in logs, the message
+-- \`Status\` could be used directly after any stripping needed for
+-- security\/privacy reasons.
+--
+-- /See:/ 'status' smart constructor.
+data Status = Status'
+    { _sDetails :: !(Maybe [StatusDetailsItem])
+    , _sCode    :: !(Maybe (Textual Int32))
+    , _sMessage :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Status' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sDetails'
+--
+-- * 'sCode'
+--
+-- * 'sMessage'
+status
+    :: Status
+status =
+    Status'
+    { _sDetails = Nothing
+    , _sCode = Nothing
+    , _sMessage = Nothing
+    }
+
+-- | A list of messages that carry the error details. There is a common set
+-- of message types for APIs to use.
+sDetails :: Lens' Status [StatusDetailsItem]
+sDetails
+  = lens _sDetails (\ s a -> s{_sDetails = a}) .
+      _Default
+      . _Coerce
+
+-- | The status code, which should be an enum value of google.rpc.Code.
+sCode :: Lens' Status (Maybe Int32)
+sCode
+  = lens _sCode (\ s a -> s{_sCode = a}) .
+      mapping _Coerce
+
+-- | A developer-facing error message, which should be in English. Any
+-- user-facing error message should be localized and sent in the
+-- google.rpc.Status.details field, or localized by the client.
+sMessage :: Lens' Status (Maybe Text)
+sMessage = lens _sMessage (\ s a -> s{_sMessage = a})
+
+instance FromJSON Status where
+        parseJSON
+          = withObject "Status"
+              (\ o ->
+                 Status' <$>
+                   (o .:? "details" .!= mempty) <*> (o .:? "code") <*>
+                     (o .:? "message"))
+
+instance ToJSON Status where
+        toJSON Status'{..}
+          = object
+              (catMaybes
+                 [("details" .=) <$> _sDetails,
+                  ("code" .=) <$> _sCode,
+                  ("message" .=) <$> _sMessage])
+
+--
+-- /See:/ 'addEnrichmentToAlbumResponse' smart constructor.
+newtype AddEnrichmentToAlbumResponse = AddEnrichmentToAlbumResponse'
+    { _aetarEnrichmentItem :: Maybe EnrichmentItem
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'AddEnrichmentToAlbumResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'aetarEnrichmentItem'
+addEnrichmentToAlbumResponse
+    :: AddEnrichmentToAlbumResponse
+addEnrichmentToAlbumResponse =
+    AddEnrichmentToAlbumResponse'
+    { _aetarEnrichmentItem = Nothing
+    }
+
+-- | [Output only] Enrichment which was added.
+aetarEnrichmentItem :: Lens' AddEnrichmentToAlbumResponse (Maybe EnrichmentItem)
+aetarEnrichmentItem
+  = lens _aetarEnrichmentItem
+      (\ s a -> s{_aetarEnrichmentItem = a})
+
+instance FromJSON AddEnrichmentToAlbumResponse where
+        parseJSON
+          = withObject "AddEnrichmentToAlbumResponse"
+              (\ o ->
+                 AddEnrichmentToAlbumResponse' <$>
+                   (o .:? "enrichmentItem"))
+
+instance ToJSON AddEnrichmentToAlbumResponse where
+        toJSON AddEnrichmentToAlbumResponse'{..}
+          = object
+              (catMaybes
+                 [("enrichmentItem" .=) <$> _aetarEnrichmentItem])
+
+--
+-- /See:/ 'searchMediaItemsResponse' smart constructor.
+data SearchMediaItemsResponse = SearchMediaItemsResponse'
+    { _smirNextPageToken :: !(Maybe Text)
+    , _smirMediaItems    :: !(Maybe [MediaItem])
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SearchMediaItemsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'smirNextPageToken'
+--
+-- * 'smirMediaItems'
+searchMediaItemsResponse
+    :: SearchMediaItemsResponse
+searchMediaItemsResponse =
+    SearchMediaItemsResponse'
+    { _smirNextPageToken = Nothing
+    , _smirMediaItems = Nothing
+    }
+
+-- | [Output only] Token to use to get the next set of media items. Its
+-- presence is the only reliable indicator of more media items being
+-- available in the next request.
+smirNextPageToken :: Lens' SearchMediaItemsResponse (Maybe Text)
+smirNextPageToken
+  = lens _smirNextPageToken
+      (\ s a -> s{_smirNextPageToken = a})
+
+-- | [Output only] List of media items that match the search parameters.
+smirMediaItems :: Lens' SearchMediaItemsResponse [MediaItem]
+smirMediaItems
+  = lens _smirMediaItems
+      (\ s a -> s{_smirMediaItems = a})
+      . _Default
+      . _Coerce
+
+instance FromJSON SearchMediaItemsResponse where
+        parseJSON
+          = withObject "SearchMediaItemsResponse"
+              (\ o ->
+                 SearchMediaItemsResponse' <$>
+                   (o .:? "nextPageToken") <*>
+                     (o .:? "mediaItems" .!= mempty))
+
+instance ToJSON SearchMediaItemsResponse where
+        toJSON SearchMediaItemsResponse'{..}
+          = object
+              (catMaybes
+                 [("nextPageToken" .=) <$> _smirNextPageToken,
+                  ("mediaItems" .=) <$> _smirMediaItems])
+
+-- | Response to successfully joining the shared album on behalf of the user.
+--
+-- /See:/ 'joinSharedAlbumResponse' smart constructor.
+data JoinSharedAlbumResponse =
+    JoinSharedAlbumResponse'
+    deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'JoinSharedAlbumResponse' with the minimum fields required to make a request.
+--
+joinSharedAlbumResponse
+    :: JoinSharedAlbumResponse
+joinSharedAlbumResponse = JoinSharedAlbumResponse'
+
+instance FromJSON JoinSharedAlbumResponse where
+        parseJSON
+          = withObject "JoinSharedAlbumResponse"
+              (\ o -> pure JoinSharedAlbumResponse')
+
+instance ToJSON JoinSharedAlbumResponse where
+        toJSON = const emptyObject
+
+-- | Request to create an album in Google Photos.
+--
+-- /See:/ 'createAlbumRequest' smart constructor.
+newtype CreateAlbumRequest = CreateAlbumRequest'
+    { _carAlbum :: Maybe Album
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CreateAlbumRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'carAlbum'
+createAlbumRequest
+    :: CreateAlbumRequest
+createAlbumRequest =
+    CreateAlbumRequest'
+    { _carAlbum = Nothing
+    }
+
+-- | The album to be created.
+carAlbum :: Lens' CreateAlbumRequest (Maybe Album)
+carAlbum = lens _carAlbum (\ s a -> s{_carAlbum = a})
+
+instance FromJSON CreateAlbumRequest where
+        parseJSON
+          = withObject "CreateAlbumRequest"
+              (\ o -> CreateAlbumRequest' <$> (o .:? "album"))
+
+instance ToJSON CreateAlbumRequest where
+        toJSON CreateAlbumRequest'{..}
+          = object (catMaybes [("album" .=) <$> _carAlbum])
+
+-- | Represents a physical location.
+--
+-- /See:/ 'location' smart constructor.
+data Location = Location'
+    { _lLatlng       :: !(Maybe LatLng)
+    , _lLocationName :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Location' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'lLatlng'
+--
+-- * 'lLocationName'
+location
+    :: Location
+location =
+    Location'
+    { _lLatlng = Nothing
+    , _lLocationName = Nothing
+    }
+
+-- | Position of the location on the map.
+lLatlng :: Lens' Location (Maybe LatLng)
+lLatlng = lens _lLatlng (\ s a -> s{_lLatlng = a})
+
+-- | Name of the location to be displayed.
+lLocationName :: Lens' Location (Maybe Text)
+lLocationName
+  = lens _lLocationName
+      (\ s a -> s{_lLocationName = a})
+
+instance FromJSON Location where
+        parseJSON
+          = withObject "Location"
+              (\ o ->
+                 Location' <$>
+                   (o .:? "latlng") <*> (o .:? "locationName"))
+
+instance ToJSON Location where
+        toJSON Location'{..}
+          = object
+              (catMaybes
+                 [("latlng" .=) <$> _lLatlng,
+                  ("locationName" .=) <$> _lLocationName])
+
+-- | A new enrichment item to be added to an album, used by the
+-- AddEnrichmentToAlbum call.
+--
+-- /See:/ 'newEnrichmentItem' smart constructor.
+data NewEnrichmentItem = NewEnrichmentItem'
+    { _neiLocationEnrichment :: !(Maybe LocationEnrichment)
+    , _neiTextEnrichment     :: !(Maybe TextEnrichment)
+    , _neiMapEnrichment      :: !(Maybe MapEnrichment)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'NewEnrichmentItem' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'neiLocationEnrichment'
+--
+-- * 'neiTextEnrichment'
+--
+-- * 'neiMapEnrichment'
+newEnrichmentItem
+    :: NewEnrichmentItem
+newEnrichmentItem =
+    NewEnrichmentItem'
+    { _neiLocationEnrichment = Nothing
+    , _neiTextEnrichment = Nothing
+    , _neiMapEnrichment = Nothing
+    }
+
+-- | Location to be added to the album.
+neiLocationEnrichment :: Lens' NewEnrichmentItem (Maybe LocationEnrichment)
+neiLocationEnrichment
+  = lens _neiLocationEnrichment
+      (\ s a -> s{_neiLocationEnrichment = a})
+
+-- | Text to be added to the album.
+neiTextEnrichment :: Lens' NewEnrichmentItem (Maybe TextEnrichment)
+neiTextEnrichment
+  = lens _neiTextEnrichment
+      (\ s a -> s{_neiTextEnrichment = a})
+
+-- | Map to be added to the album.
+neiMapEnrichment :: Lens' NewEnrichmentItem (Maybe MapEnrichment)
+neiMapEnrichment
+  = lens _neiMapEnrichment
+      (\ s a -> s{_neiMapEnrichment = a})
+
+instance FromJSON NewEnrichmentItem where
+        parseJSON
+          = withObject "NewEnrichmentItem"
+              (\ o ->
+                 NewEnrichmentItem' <$>
+                   (o .:? "locationEnrichment") <*>
+                     (o .:? "textEnrichment")
+                     <*> (o .:? "mapEnrichment"))
+
+instance ToJSON NewEnrichmentItem where
+        toJSON NewEnrichmentItem'{..}
+          = object
+              (catMaybes
+                 [("locationEnrichment" .=) <$>
+                    _neiLocationEnrichment,
+                  ("textEnrichment" .=) <$> _neiTextEnrichment,
+                  ("mapEnrichment" .=) <$> _neiMapEnrichment])
+
+-- | Information about albums that are shared. Note that this information is
+-- only included if the album was created by you and you have the sharing
+-- scope.
+--
+-- /See:/ 'shareInfo' smart constructor.
+data ShareInfo = ShareInfo'
+    { _siShareableURL       :: !(Maybe Text)
+    , _siShareToken         :: !(Maybe Text)
+    , _siSharedAlbumOptions :: !(Maybe SharedAlbumOptions)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ShareInfo' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'siShareableURL'
+--
+-- * 'siShareToken'
+--
+-- * 'siSharedAlbumOptions'
+shareInfo
+    :: ShareInfo
+shareInfo =
+    ShareInfo'
+    { _siShareableURL = Nothing
+    , _siShareToken = Nothing
+    , _siSharedAlbumOptions = Nothing
+    }
+
+-- | A link to the album that\'s now shared on the Google Photos website and
+-- app. Anyone with the link can access this shared album and see all of
+-- the items present in the album.
+siShareableURL :: Lens' ShareInfo (Maybe Text)
+siShareableURL
+  = lens _siShareableURL
+      (\ s a -> s{_siShareableURL = a})
+
+-- | A token which can be used to join this shared album on behalf of other
+-- users via the API.
+siShareToken :: Lens' ShareInfo (Maybe Text)
+siShareToken
+  = lens _siShareToken (\ s a -> s{_siShareToken = a})
+
+-- | Options set for the shared album.
+siSharedAlbumOptions :: Lens' ShareInfo (Maybe SharedAlbumOptions)
+siSharedAlbumOptions
+  = lens _siSharedAlbumOptions
+      (\ s a -> s{_siSharedAlbumOptions = a})
+
+instance FromJSON ShareInfo where
+        parseJSON
+          = withObject "ShareInfo"
+              (\ o ->
+                 ShareInfo' <$>
+                   (o .:? "shareableUrl") <*> (o .:? "shareToken") <*>
+                     (o .:? "sharedAlbumOptions"))
+
+instance ToJSON ShareInfo where
+        toJSON ShareInfo'{..}
+          = object
+              (catMaybes
+                 [("shareableUrl" .=) <$> _siShareableURL,
+                  ("shareToken" .=) <$> _siShareToken,
+                  ("sharedAlbumOptions" .=) <$> _siSharedAlbumOptions])
+
+-- | Request to create one or more media items in a user\'s Google Photos
+-- library. If an 'albumid' is specified, the media items are also added to
+-- that album. 'albumPosition' is optional and can only be specified if an
+-- 'albumId' is set.
+--
+-- /See:/ 'batchCreateMediaItemsRequest' smart constructor.
+data BatchCreateMediaItemsRequest = BatchCreateMediaItemsRequest'
+    { _bcmirAlbumId       :: !(Maybe Text)
+    , _bcmirNewMediaItems :: !(Maybe [NewMediaItem])
+    , _bcmirAlbumPosition :: !(Maybe AlbumPosition)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'BatchCreateMediaItemsRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'bcmirAlbumId'
+--
+-- * 'bcmirNewMediaItems'
+--
+-- * 'bcmirAlbumPosition'
+batchCreateMediaItemsRequest
+    :: BatchCreateMediaItemsRequest
+batchCreateMediaItemsRequest =
+    BatchCreateMediaItemsRequest'
+    { _bcmirAlbumId = Nothing
+    , _bcmirNewMediaItems = Nothing
+    , _bcmirAlbumPosition = Nothing
+    }
+
+-- | Identifier of the album where the media item(s) will be added. They will
+-- also be added to the user\'s library. This is an optional field.
+bcmirAlbumId :: Lens' BatchCreateMediaItemsRequest (Maybe Text)
+bcmirAlbumId
+  = lens _bcmirAlbumId (\ s a -> s{_bcmirAlbumId = a})
+
+-- | List of media items to be created.
+bcmirNewMediaItems :: Lens' BatchCreateMediaItemsRequest [NewMediaItem]
+bcmirNewMediaItems
+  = lens _bcmirNewMediaItems
+      (\ s a -> s{_bcmirNewMediaItems = a})
+      . _Default
+      . _Coerce
+
+-- | Position in the album where the media item(s) will be added. If not
+-- specified, the media item(s) will be added to the end of the album (as
+-- per the default value which is LAST_IN_ALBUM). The request will fail if
+-- this field is present but no album_id is specified.
+bcmirAlbumPosition :: Lens' BatchCreateMediaItemsRequest (Maybe AlbumPosition)
+bcmirAlbumPosition
+  = lens _bcmirAlbumPosition
+      (\ s a -> s{_bcmirAlbumPosition = a})
+
+instance FromJSON BatchCreateMediaItemsRequest where
+        parseJSON
+          = withObject "BatchCreateMediaItemsRequest"
+              (\ o ->
+                 BatchCreateMediaItemsRequest' <$>
+                   (o .:? "albumId") <*>
+                     (o .:? "newMediaItems" .!= mempty)
+                     <*> (o .:? "albumPosition"))
+
+instance ToJSON BatchCreateMediaItemsRequest where
+        toJSON BatchCreateMediaItemsRequest'{..}
+          = object
+              (catMaybes
+                 [("albumId" .=) <$> _bcmirAlbumId,
+                  ("newMediaItems" .=) <$> _bcmirNewMediaItems,
+                  ("albumPosition" .=) <$> _bcmirAlbumPosition])
+
+-- | Filters that can be applied to a media item search. If multiple filter
+-- options are specified, they are treated as AND with each other.
+--
+-- /See:/ 'filters' smart constructor.
+data Filters = Filters'
+    { _fDateFilter           :: !(Maybe DateFilter)
+    , _fIncludeArchivedMedia :: !(Maybe Bool)
+    , _fMediaTypeFilter      :: !(Maybe MediaTypeFilter)
+    , _fContentFilter        :: !(Maybe ContentFilter)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Filters' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'fDateFilter'
+--
+-- * 'fIncludeArchivedMedia'
+--
+-- * 'fMediaTypeFilter'
+--
+-- * 'fContentFilter'
+filters
+    :: Filters
+filters =
+    Filters'
+    { _fDateFilter = Nothing
+    , _fIncludeArchivedMedia = Nothing
+    , _fMediaTypeFilter = Nothing
+    , _fContentFilter = Nothing
+    }
+
+-- | Filters the media items based on their creation date.
+fDateFilter :: Lens' Filters (Maybe DateFilter)
+fDateFilter
+  = lens _fDateFilter (\ s a -> s{_fDateFilter = a})
+
+-- | If set, the results will include media items that the user has archived.
+-- Defaults to false (archived media items are not included).
+fIncludeArchivedMedia :: Lens' Filters (Maybe Bool)
+fIncludeArchivedMedia
+  = lens _fIncludeArchivedMedia
+      (\ s a -> s{_fIncludeArchivedMedia = a})
+
+-- | Filters the media items based on the type of media.
+fMediaTypeFilter :: Lens' Filters (Maybe MediaTypeFilter)
+fMediaTypeFilter
+  = lens _fMediaTypeFilter
+      (\ s a -> s{_fMediaTypeFilter = a})
+
+-- | Filters the media items based on their content.
+fContentFilter :: Lens' Filters (Maybe ContentFilter)
+fContentFilter
+  = lens _fContentFilter
+      (\ s a -> s{_fContentFilter = a})
+
+instance FromJSON Filters where
+        parseJSON
+          = withObject "Filters"
+              (\ o ->
+                 Filters' <$>
+                   (o .:? "dateFilter") <*>
+                     (o .:? "includeArchivedMedia")
+                     <*> (o .:? "mediaTypeFilter")
+                     <*> (o .:? "contentFilter"))
+
+instance ToJSON Filters where
+        toJSON Filters'{..}
+          = object
+              (catMaybes
+                 [("dateFilter" .=) <$> _fDateFilter,
+                  ("includeArchivedMedia" .=) <$>
+                    _fIncludeArchivedMedia,
+                  ("mediaTypeFilter" .=) <$> _fMediaTypeFilter,
+                  ("contentFilter" .=) <$> _fContentFilter])
+
+--
+-- /See:/ 'statusDetailsItem' smart constructor.
+newtype StatusDetailsItem = StatusDetailsItem'
+    { _sdiAddtional :: HashMap Text JSONValue
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'StatusDetailsItem' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sdiAddtional'
+statusDetailsItem
+    :: HashMap Text JSONValue -- ^ 'sdiAddtional'
+    -> StatusDetailsItem
+statusDetailsItem pSdiAddtional_ =
+    StatusDetailsItem'
+    { _sdiAddtional = _Coerce # pSdiAddtional_
+    }
+
+-- | Properties of the object. Contains field \'type with type URL.
+sdiAddtional :: Lens' StatusDetailsItem (HashMap Text JSONValue)
+sdiAddtional
+  = lens _sdiAddtional (\ s a -> s{_sdiAddtional = a})
+      . _Coerce
+
+instance FromJSON StatusDetailsItem where
+        parseJSON
+          = withObject "StatusDetailsItem"
+              (\ o -> StatusDetailsItem' <$> (parseJSONObject o))
+
+instance ToJSON StatusDetailsItem where
+        toJSON = toJSON . _sdiAddtional
+
+-- | Defines a range of dates. Both dates must be of the same format (see
+-- Date definition for more).
+--
+-- /See:/ 'dateRange' smart constructor.
+data DateRange = DateRange'
+    { _drEndDate   :: !(Maybe Date)
+    , _drStartDate :: !(Maybe Date)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DateRange' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'drEndDate'
+--
+-- * 'drStartDate'
+dateRange
+    :: DateRange
+dateRange =
+    DateRange'
+    { _drEndDate = Nothing
+    , _drStartDate = Nothing
+    }
+
+-- | The end date (included as part of the range) in the same format as the
+-- start date.
+drEndDate :: Lens' DateRange (Maybe Date)
+drEndDate
+  = lens _drEndDate (\ s a -> s{_drEndDate = a})
+
+-- | The start date (included as part of the range) in one of the formats
+-- described.
+drStartDate :: Lens' DateRange (Maybe Date)
+drStartDate
+  = lens _drStartDate (\ s a -> s{_drStartDate = a})
+
+instance FromJSON DateRange where
+        parseJSON
+          = withObject "DateRange"
+              (\ o ->
+                 DateRange' <$>
+                   (o .:? "endDate") <*> (o .:? "startDate"))
+
+instance ToJSON DateRange where
+        toJSON DateRange'{..}
+          = object
+              (catMaybes
+                 [("endDate" .=) <$> _drEndDate,
+                  ("startDate" .=) <$> _drStartDate])
+
+-- | Options that control the sharing of an album.
+--
+-- /See:/ 'sharedAlbumOptions' smart constructor.
+data SharedAlbumOptions = SharedAlbumOptions'
+    { _saoIsCollaborative :: !(Maybe Bool)
+    , _saoIsCommentable   :: !(Maybe Bool)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SharedAlbumOptions' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'saoIsCollaborative'
+--
+-- * 'saoIsCommentable'
+sharedAlbumOptions
+    :: SharedAlbumOptions
+sharedAlbumOptions =
+    SharedAlbumOptions'
+    { _saoIsCollaborative = Nothing
+    , _saoIsCommentable = Nothing
+    }
+
+-- | True if the shared album allows collaborators (users who have joined the
+-- album) to add media items to it. Defaults to false.
+saoIsCollaborative :: Lens' SharedAlbumOptions (Maybe Bool)
+saoIsCollaborative
+  = lens _saoIsCollaborative
+      (\ s a -> s{_saoIsCollaborative = a})
+
+-- | True if the shared album allows the owner and the collaborators (users
+-- who have joined the album) to add comments to the album. Defaults to
+-- false.
+saoIsCommentable :: Lens' SharedAlbumOptions (Maybe Bool)
+saoIsCommentable
+  = lens _saoIsCommentable
+      (\ s a -> s{_saoIsCommentable = a})
+
+instance FromJSON SharedAlbumOptions where
+        parseJSON
+          = withObject "SharedAlbumOptions"
+              (\ o ->
+                 SharedAlbumOptions' <$>
+                   (o .:? "isCollaborative") <*>
+                     (o .:? "isCommentable"))
+
+instance ToJSON SharedAlbumOptions where
+        toJSON SharedAlbumOptions'{..}
+          = object
+              (catMaybes
+                 [("isCollaborative" .=) <$> _saoIsCollaborative,
+                  ("isCommentable" .=) <$> _saoIsCommentable])
+
+-- | Metadata for a media item.
+--
+-- /See:/ 'mediaMetadata' smart constructor.
+data MediaMetadata = MediaMetadata'
+    { _mmCreationTime :: !(Maybe DateTime')
+    , _mmPhoto        :: !(Maybe Photo)
+    , _mmHeight       :: !(Maybe (Textual Int64))
+    , _mmWidth        :: !(Maybe (Textual Int64))
+    , _mmVideo        :: !(Maybe Video)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'MediaMetadata' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'mmCreationTime'
+--
+-- * 'mmPhoto'
+--
+-- * 'mmHeight'
+--
+-- * 'mmWidth'
+--
+-- * 'mmVideo'
+mediaMetadata
+    :: MediaMetadata
+mediaMetadata =
+    MediaMetadata'
+    { _mmCreationTime = Nothing
+    , _mmPhoto = Nothing
+    , _mmHeight = Nothing
+    , _mmWidth = Nothing
+    , _mmVideo = Nothing
+    }
+
+-- | Time when the media item was first created (not when it was uploaded to
+-- Google Photos).
+mmCreationTime :: Lens' MediaMetadata (Maybe UTCTime)
+mmCreationTime
+  = lens _mmCreationTime
+      (\ s a -> s{_mmCreationTime = a})
+      . mapping _DateTime
+
+-- | Metadata for a photo media type.
+mmPhoto :: Lens' MediaMetadata (Maybe Photo)
+mmPhoto = lens _mmPhoto (\ s a -> s{_mmPhoto = a})
+
+-- | Original height (in pixels) of the media item.
+mmHeight :: Lens' MediaMetadata (Maybe Int64)
+mmHeight
+  = lens _mmHeight (\ s a -> s{_mmHeight = a}) .
+      mapping _Coerce
+
+-- | Original width (in pixels) of the media item.
+mmWidth :: Lens' MediaMetadata (Maybe Int64)
+mmWidth
+  = lens _mmWidth (\ s a -> s{_mmWidth = a}) .
+      mapping _Coerce
+
+-- | Metadata for a video media type.
+mmVideo :: Lens' MediaMetadata (Maybe Video)
+mmVideo = lens _mmVideo (\ s a -> s{_mmVideo = a})
+
+instance FromJSON MediaMetadata where
+        parseJSON
+          = withObject "MediaMetadata"
+              (\ o ->
+                 MediaMetadata' <$>
+                   (o .:? "creationTime") <*> (o .:? "photo") <*>
+                     (o .:? "height")
+                     <*> (o .:? "width")
+                     <*> (o .:? "video"))
+
+instance ToJSON MediaMetadata where
+        toJSON MediaMetadata'{..}
+          = object
+              (catMaybes
+                 [("creationTime" .=) <$> _mmCreationTime,
+                  ("photo" .=) <$> _mmPhoto,
+                  ("height" .=) <$> _mmHeight,
+                  ("width" .=) <$> _mmWidth,
+                  ("video" .=) <$> _mmVideo])
+
+--
+-- /See:/ 'shareAlbumResponse' smart constructor.
+newtype ShareAlbumResponse = ShareAlbumResponse'
+    { _sarShareInfo :: Maybe ShareInfo
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ShareAlbumResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sarShareInfo'
+shareAlbumResponse
+    :: ShareAlbumResponse
+shareAlbumResponse =
+    ShareAlbumResponse'
+    { _sarShareInfo = Nothing
+    }
+
+-- | [Output only] Information about the shared album.
+sarShareInfo :: Lens' ShareAlbumResponse (Maybe ShareInfo)
+sarShareInfo
+  = lens _sarShareInfo (\ s a -> s{_sarShareInfo = a})
+
+instance FromJSON ShareAlbumResponse where
+        parseJSON
+          = withObject "ShareAlbumResponse"
+              (\ o -> ShareAlbumResponse' <$> (o .:? "shareInfo"))
+
+instance ToJSON ShareAlbumResponse where
+        toJSON ShareAlbumResponse'{..}
+          = object
+              (catMaybes [("shareInfo" .=) <$> _sarShareInfo])
+
+-- | Metadata that is specific to a video, for example, fps and processing
+-- status. Some of these fields may be null or not included.
+--
+-- /See:/ 'video' smart constructor.
+data Video = Video'
+    { _vStatus      :: !(Maybe VideoStatus)
+    , _vCameraMake  :: !(Maybe Text)
+    , _vCameraModel :: !(Maybe Text)
+    , _vFps         :: !(Maybe (Textual Double))
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Video' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'vStatus'
+--
+-- * 'vCameraMake'
+--
+-- * 'vCameraModel'
+--
+-- * 'vFps'
+video
+    :: Video
+video =
+    Video'
+    { _vStatus = Nothing
+    , _vCameraMake = Nothing
+    , _vCameraModel = Nothing
+    , _vFps = Nothing
+    }
+
+-- | Processing status of the video.
+vStatus :: Lens' Video (Maybe VideoStatus)
+vStatus = lens _vStatus (\ s a -> s{_vStatus = a})
+
+-- | Brand of the camera which took the video.
+vCameraMake :: Lens' Video (Maybe Text)
+vCameraMake
+  = lens _vCameraMake (\ s a -> s{_vCameraMake = a})
+
+-- | Model of the camera which took the video.
+vCameraModel :: Lens' Video (Maybe Text)
+vCameraModel
+  = lens _vCameraModel (\ s a -> s{_vCameraModel = a})
+
+-- | Frame rate of the video.
+vFps :: Lens' Video (Maybe Double)
+vFps
+  = lens _vFps (\ s a -> s{_vFps = a}) .
+      mapping _Coerce
+
+instance FromJSON Video where
+        parseJSON
+          = withObject "Video"
+              (\ o ->
+                 Video' <$>
+                   (o .:? "status") <*> (o .:? "cameraMake") <*>
+                     (o .:? "cameraModel")
+                     <*> (o .:? "fps"))
+
+instance ToJSON Video where
+        toJSON Video'{..}
+          = object
+              (catMaybes
+                 [("status" .=) <$> _vStatus,
+                  ("cameraMake" .=) <$> _vCameraMake,
+                  ("cameraModel" .=) <$> _vCameraModel,
+                  ("fps" .=) <$> _vFps])
+
+-- | Representation of a media item (e.g. photo, video etc.) in Google
+-- Photos.
+--
+-- /See:/ 'mediaItem' smart constructor.
+data MediaItem = MediaItem'
+    { _miProductURL      :: !(Maybe Text)
+    , _miBaseURL         :: !(Maybe Text)
+    , _miMediaMetadata   :: !(Maybe MediaMetadata)
+    , _miMimeType        :: !(Maybe Text)
+    , _miId              :: !(Maybe Text)
+    , _miContributorInfo :: !(Maybe ContributorInfo)
+    , _miDescription     :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'MediaItem' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'miProductURL'
+--
+-- * 'miBaseURL'
+--
+-- * 'miMediaMetadata'
+--
+-- * 'miMimeType'
+--
+-- * 'miId'
+--
+-- * 'miContributorInfo'
+--
+-- * 'miDescription'
+mediaItem
+    :: MediaItem
+mediaItem =
+    MediaItem'
+    { _miProductURL = Nothing
+    , _miBaseURL = Nothing
+    , _miMediaMetadata = Nothing
+    , _miMimeType = Nothing
+    , _miId = Nothing
+    , _miContributorInfo = Nothing
+    , _miDescription = Nothing
+    }
+
+-- | Google Photos URL for the media item. This link will only be available
+-- to the user if they\'re signed in.
+miProductURL :: Lens' MediaItem (Maybe Text)
+miProductURL
+  = lens _miProductURL (\ s a -> s{_miProductURL = a})
+
+-- | A URL to the media item\'s bytes. This should not be used as is. For
+-- example, \'=w2048-h1024\' will set the dimensions of a media item of
+-- type photo to have a width of 2048 px and height of 1024 px.
+miBaseURL :: Lens' MediaItem (Maybe Text)
+miBaseURL
+  = lens _miBaseURL (\ s a -> s{_miBaseURL = a})
+
+-- | Metadata related to the media item, for example the height, width or
+-- creation time.
+miMediaMetadata :: Lens' MediaItem (Maybe MediaMetadata)
+miMediaMetadata
+  = lens _miMediaMetadata
+      (\ s a -> s{_miMediaMetadata = a})
+
+-- | MIME type of the media item.
+miMimeType :: Lens' MediaItem (Maybe Text)
+miMimeType
+  = lens _miMimeType (\ s a -> s{_miMimeType = a})
+
+-- | Identifier for the media item. This is a persistent identifier that can
+-- be used between sessions to identify this media item.
+miId :: Lens' MediaItem (Maybe Text)
+miId = lens _miId (\ s a -> s{_miId = a})
+
+-- | Information about the user who created this media item.
+miContributorInfo :: Lens' MediaItem (Maybe ContributorInfo)
+miContributorInfo
+  = lens _miContributorInfo
+      (\ s a -> s{_miContributorInfo = a})
+
+-- | Description of the media item. This is shown to the user in the item\'s
+-- info section in the Google Photos app.
+miDescription :: Lens' MediaItem (Maybe Text)
+miDescription
+  = lens _miDescription
+      (\ s a -> s{_miDescription = a})
+
+instance FromJSON MediaItem where
+        parseJSON
+          = withObject "MediaItem"
+              (\ o ->
+                 MediaItem' <$>
+                   (o .:? "productUrl") <*> (o .:? "baseUrl") <*>
+                     (o .:? "mediaMetadata")
+                     <*> (o .:? "mimeType")
+                     <*> (o .:? "id")
+                     <*> (o .:? "contributorInfo")
+                     <*> (o .:? "description"))
+
+instance ToJSON MediaItem where
+        toJSON MediaItem'{..}
+          = object
+              (catMaybes
+                 [("productUrl" .=) <$> _miProductURL,
+                  ("baseUrl" .=) <$> _miBaseURL,
+                  ("mediaMetadata" .=) <$> _miMediaMetadata,
+                  ("mimeType" .=) <$> _miMimeType, ("id" .=) <$> _miId,
+                  ("contributorInfo" .=) <$> _miContributorInfo,
+                  ("description" .=) <$> _miDescription])
+
+-- | Represents a whole calendar date. The day may be 0 to represent a year
+-- and month where the day is not significant, e.g. a whole calendar month.
+-- The month may be 0 to represent a a day and a year where the month is
+-- not signficant, e.g. when you want to specify the same day in every
+-- month of a year or a specific year. The year may be 0 to represent a
+-- month and day independent of year, e.g. anniversary date.
+--
+-- /See:/ 'date' smart constructor.
+data Date = Date'
+    { _dDay   :: !(Maybe (Textual Int32))
+    , _dYear  :: !(Maybe (Textual Int32))
+    , _dMonth :: !(Maybe (Textual Int32))
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Date' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dDay'
+--
+-- * 'dYear'
+--
+-- * 'dMonth'
+date
+    :: Date
+date =
+    Date'
+    { _dDay = Nothing
+    , _dYear = Nothing
+    , _dMonth = Nothing
+    }
+
+-- | Day of month. Must be from 1 to 31 and valid for the year and month, or
+-- 0 if specifying a year\/month where the day is not significant.
+dDay :: Lens' Date (Maybe Int32)
+dDay
+  = lens _dDay (\ s a -> s{_dDay = a}) .
+      mapping _Coerce
+
+-- | Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+-- a year.
+dYear :: Lens' Date (Maybe Int32)
+dYear
+  = lens _dYear (\ s a -> s{_dYear = a}) .
+      mapping _Coerce
+
+-- | Month of year. Must be from 1 to 12, or 0 if specifying a date without a
+-- month.
+dMonth :: Lens' Date (Maybe Int32)
+dMonth
+  = lens _dMonth (\ s a -> s{_dMonth = a}) .
+      mapping _Coerce
+
+instance FromJSON Date where
+        parseJSON
+          = withObject "Date"
+              (\ o ->
+                 Date' <$>
+                   (o .:? "day") <*> (o .:? "year") <*> (o .:? "month"))
+
+instance ToJSON Date where
+        toJSON Date'{..}
+          = object
+              (catMaybes
+                 [("day" .=) <$> _dDay, ("year" .=) <$> _dYear,
+                  ("month" .=) <$> _dMonth])
+
+-- | An enrichment item.
+--
+-- /See:/ 'enrichmentItem' smart constructor.
+newtype EnrichmentItem = EnrichmentItem'
+    { _eiId :: Maybe Text
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'EnrichmentItem' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'eiId'
+enrichmentItem
+    :: EnrichmentItem
+enrichmentItem =
+    EnrichmentItem'
+    { _eiId = Nothing
+    }
+
+-- | Identifier of the enrichment item.
+eiId :: Lens' EnrichmentItem (Maybe Text)
+eiId = lens _eiId (\ s a -> s{_eiId = a})
+
+instance FromJSON EnrichmentItem where
+        parseJSON
+          = withObject "EnrichmentItem"
+              (\ o -> EnrichmentItem' <$> (o .:? "id"))
+
+instance ToJSON EnrichmentItem where
+        toJSON EnrichmentItem'{..}
+          = object (catMaybes [("id" .=) <$> _eiId])
+
+--
+-- /See:/ 'listSharedAlbumsResponse' smart constructor.
+data ListSharedAlbumsResponse = ListSharedAlbumsResponse'
+    { _lsarNextPageToken :: !(Maybe Text)
+    , _lsarSharedAlbums  :: !(Maybe [Album])
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ListSharedAlbumsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'lsarNextPageToken'
+--
+-- * 'lsarSharedAlbums'
+listSharedAlbumsResponse
+    :: ListSharedAlbumsResponse
+listSharedAlbumsResponse =
+    ListSharedAlbumsResponse'
+    { _lsarNextPageToken = Nothing
+    , _lsarSharedAlbums = Nothing
+    }
+
+-- | [Output only] Token to use to get the next set of shared albums.
+-- Populated if there are more shared albums to retrieve for this request.
+lsarNextPageToken :: Lens' ListSharedAlbumsResponse (Maybe Text)
+lsarNextPageToken
+  = lens _lsarNextPageToken
+      (\ s a -> s{_lsarNextPageToken = a})
+
+-- | [Output only] List of shared albums that were requested.
+lsarSharedAlbums :: Lens' ListSharedAlbumsResponse [Album]
+lsarSharedAlbums
+  = lens _lsarSharedAlbums
+      (\ s a -> s{_lsarSharedAlbums = a})
+      . _Default
+      . _Coerce
+
+instance FromJSON ListSharedAlbumsResponse where
+        parseJSON
+          = withObject "ListSharedAlbumsResponse"
+              (\ o ->
+                 ListSharedAlbumsResponse' <$>
+                   (o .:? "nextPageToken") <*>
+                     (o .:? "sharedAlbums" .!= mempty))
+
+instance ToJSON ListSharedAlbumsResponse where
+        toJSON ListSharedAlbumsResponse'{..}
+          = object
+              (catMaybes
+                 [("nextPageToken" .=) <$> _lsarNextPageToken,
+                  ("sharedAlbums" .=) <$> _lsarSharedAlbums])
+
+-- | This filter defines the type of media items to be returned, for example
+-- videos or photos. All the specified media types are treated as an OR
+-- with each other.
+--
+-- /See:/ 'mediaTypeFilter' smart constructor.
+newtype MediaTypeFilter = MediaTypeFilter'
+    { _mtfMediaTypes :: Maybe [Text]
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'MediaTypeFilter' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'mtfMediaTypes'
+mediaTypeFilter
+    :: MediaTypeFilter
+mediaTypeFilter =
+    MediaTypeFilter'
+    { _mtfMediaTypes = Nothing
+    }
+
+-- | The types of media items to be included. This field should only be
+-- populated with one media type, multiple media types will result in an
+-- error response.
+mtfMediaTypes :: Lens' MediaTypeFilter [Text]
+mtfMediaTypes
+  = lens _mtfMediaTypes
+      (\ s a -> s{_mtfMediaTypes = a})
+      . _Default
+      . _Coerce
+
+instance FromJSON MediaTypeFilter where
+        parseJSON
+          = withObject "MediaTypeFilter"
+              (\ o ->
+                 MediaTypeFilter' <$> (o .:? "mediaTypes" .!= mempty))
+
+instance ToJSON MediaTypeFilter where
+        toJSON MediaTypeFilter'{..}
+          = object
+              (catMaybes [("mediaTypes" .=) <$> _mtfMediaTypes])
+
+-- | Result of creating a new media item.
+--
+-- /See:/ 'newMediaItemResult' smart constructor.
+data NewMediaItemResult = NewMediaItemResult'
+    { _nmirStatus      :: !(Maybe Status)
+    , _nmirUploadToken :: !(Maybe Text)
+    , _nmirMediaItem   :: !(Maybe MediaItem)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'NewMediaItemResult' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'nmirStatus'
+--
+-- * 'nmirUploadToken'
+--
+-- * 'nmirMediaItem'
+newMediaItemResult
+    :: NewMediaItemResult
+newMediaItemResult =
+    NewMediaItemResult'
+    { _nmirStatus = Nothing
+    , _nmirUploadToken = Nothing
+    , _nmirMediaItem = Nothing
+    }
+
+-- | If an error occurred during the creation of this media item, this field
+-- will be populated with information related to the error. Details of this
+-- status can be found down below.
+nmirStatus :: Lens' NewMediaItemResult (Maybe Status)
+nmirStatus
+  = lens _nmirStatus (\ s a -> s{_nmirStatus = a})
+
+-- | The upload token used to create this new media item.
+nmirUploadToken :: Lens' NewMediaItemResult (Maybe Text)
+nmirUploadToken
+  = lens _nmirUploadToken
+      (\ s a -> s{_nmirUploadToken = a})
+
+-- | Media item created with the upload token. It is populated if no errors
+-- occurred and the media item was created successfully.
+nmirMediaItem :: Lens' NewMediaItemResult (Maybe MediaItem)
+nmirMediaItem
+  = lens _nmirMediaItem
+      (\ s a -> s{_nmirMediaItem = a})
+
+instance FromJSON NewMediaItemResult where
+        parseJSON
+          = withObject "NewMediaItemResult"
+              (\ o ->
+                 NewMediaItemResult' <$>
+                   (o .:? "status") <*> (o .:? "uploadToken") <*>
+                     (o .:? "mediaItem"))
+
+instance ToJSON NewMediaItemResult where
+        toJSON NewMediaItemResult'{..}
+          = object
+              (catMaybes
+                 [("status" .=) <$> _nmirStatus,
+                  ("uploadToken" .=) <$> _nmirUploadToken,
+                  ("mediaItem" .=) <$> _nmirMediaItem])
+
+-- | Representation of an album in Google Photos. Albums are a container for
+-- media items. They contain an additional shareInfo property if they have
+-- been shared by the application.
+--
+-- /See:/ 'album' smart constructor.
+data Album = Album'
+    { _aIsWriteable       :: !(Maybe Bool)
+    , _aProductURL        :: !(Maybe Text)
+    , _aShareInfo         :: !(Maybe ShareInfo)
+    , _aCoverPhotoBaseURL :: !(Maybe Text)
+    , _aId                :: !(Maybe Text)
+    , _aTotalMediaItems   :: !(Maybe (Textual Int64))
+    , _aTitle             :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Album' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'aIsWriteable'
+--
+-- * 'aProductURL'
+--
+-- * 'aShareInfo'
+--
+-- * 'aCoverPhotoBaseURL'
+--
+-- * 'aId'
+--
+-- * 'aTotalMediaItems'
+--
+-- * 'aTitle'
+album
+    :: Album
+album =
+    Album'
+    { _aIsWriteable = Nothing
+    , _aProductURL = Nothing
+    , _aShareInfo = Nothing
+    , _aCoverPhotoBaseURL = Nothing
+    , _aId = Nothing
+    , _aTotalMediaItems = Nothing
+    , _aTitle = Nothing
+    }
+
+-- | [Output only] True if media items can be created in the album. This
+-- field is based on the scopes granted and permissions of the album. If
+-- the scopes are changed or permissions of the album are changed, this
+-- field will be updated.
+aIsWriteable :: Lens' Album (Maybe Bool)
+aIsWriteable
+  = lens _aIsWriteable (\ s a -> s{_aIsWriteable = a})
+
+-- | [Output only] Google Photos URL for the album. The user needs to be
+-- signed in to their Google Photos account to access this link.
+aProductURL :: Lens' Album (Maybe Text)
+aProductURL
+  = lens _aProductURL (\ s a -> s{_aProductURL = a})
+
+-- | [Output only] Information related to shared albums. This field is only
+-- populated if the album is a shared album, the developer created the
+-- album and the user has granted photoslibrary.sharing scope.
+aShareInfo :: Lens' Album (Maybe ShareInfo)
+aShareInfo
+  = lens _aShareInfo (\ s a -> s{_aShareInfo = a})
+
+-- | [Output only] A URL to the cover photo\'s bytes. This should not be used
+-- as is. Parameters should be appended to this URL before use. For
+-- example, \'=w2048-h1024\' will set the dimensions of the cover photo to
+-- have a width of 2048 px and height of 1024 px.
+aCoverPhotoBaseURL :: Lens' Album (Maybe Text)
+aCoverPhotoBaseURL
+  = lens _aCoverPhotoBaseURL
+      (\ s a -> s{_aCoverPhotoBaseURL = a})
+
+-- | [Ouput only] Identifier for the album. This is a persistent identifier
+-- that can be used between sessions to identify this album.
+aId :: Lens' Album (Maybe Text)
+aId = lens _aId (\ s a -> s{_aId = a})
+
+-- | [Output only] The number of media items in the album
+aTotalMediaItems :: Lens' Album (Maybe Int64)
+aTotalMediaItems
+  = lens _aTotalMediaItems
+      (\ s a -> s{_aTotalMediaItems = a})
+      . mapping _Coerce
+
+-- | Name of the album displayed to the user in their Google Photos account.
+-- This string should not be more than 500 characters.
+aTitle :: Lens' Album (Maybe Text)
+aTitle = lens _aTitle (\ s a -> s{_aTitle = a})
+
+instance FromJSON Album where
+        parseJSON
+          = withObject "Album"
+              (\ o ->
+                 Album' <$>
+                   (o .:? "isWriteable") <*> (o .:? "productUrl") <*>
+                     (o .:? "shareInfo")
+                     <*> (o .:? "coverPhotoBaseUrl")
+                     <*> (o .:? "id")
+                     <*> (o .:? "totalMediaItems")
+                     <*> (o .:? "title"))
+
+instance ToJSON Album where
+        toJSON Album'{..}
+          = object
+              (catMaybes
+                 [("isWriteable" .=) <$> _aIsWriteable,
+                  ("productUrl" .=) <$> _aProductURL,
+                  ("shareInfo" .=) <$> _aShareInfo,
+                  ("coverPhotoBaseUrl" .=) <$> _aCoverPhotoBaseURL,
+                  ("id" .=) <$> _aId,
+                  ("totalMediaItems" .=) <$> _aTotalMediaItems,
+                  ("title" .=) <$> _aTitle])
+
+-- | A simple media item to be created in Google Photos via an upload token.
+--
+-- /See:/ 'simpleMediaItem' smart constructor.
+newtype SimpleMediaItem = SimpleMediaItem'
+    { _smiUploadToken :: Maybe Text
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SimpleMediaItem' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'smiUploadToken'
+simpleMediaItem
+    :: SimpleMediaItem
+simpleMediaItem =
+    SimpleMediaItem'
+    { _smiUploadToken = Nothing
+    }
+
+-- | Token identifying the media bytes which have been uploaded to Google.
+smiUploadToken :: Lens' SimpleMediaItem (Maybe Text)
+smiUploadToken
+  = lens _smiUploadToken
+      (\ s a -> s{_smiUploadToken = a})
+
+instance FromJSON SimpleMediaItem where
+        parseJSON
+          = withObject "SimpleMediaItem"
+              (\ o -> SimpleMediaItem' <$> (o .:? "uploadToken"))
+
+instance ToJSON SimpleMediaItem where
+        toJSON SimpleMediaItem'{..}
+          = object
+              (catMaybes [("uploadToken" .=) <$> _smiUploadToken])
+
+-- | Information about a user who contributed the media item. Note that this
+-- information is only included if the album containing the media item is
+-- shared, was created by you and you have the sharing scope.
+--
+-- /See:/ 'contributorInfo' smart constructor.
+data ContributorInfo = ContributorInfo'
+    { _ciProFilePictureBaseURL :: !(Maybe Text)
+    , _ciDisplayName           :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ContributorInfo' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ciProFilePictureBaseURL'
+--
+-- * 'ciDisplayName'
+contributorInfo
+    :: ContributorInfo
+contributorInfo =
+    ContributorInfo'
+    { _ciProFilePictureBaseURL = Nothing
+    , _ciDisplayName = Nothing
+    }
+
+-- | URL to the profile picture of the contributor.
+ciProFilePictureBaseURL :: Lens' ContributorInfo (Maybe Text)
+ciProFilePictureBaseURL
+  = lens _ciProFilePictureBaseURL
+      (\ s a -> s{_ciProFilePictureBaseURL = a})
+
+-- | Display name of the contributor.
+ciDisplayName :: Lens' ContributorInfo (Maybe Text)
+ciDisplayName
+  = lens _ciDisplayName
+      (\ s a -> s{_ciDisplayName = a})
+
+instance FromJSON ContributorInfo where
+        parseJSON
+          = withObject "ContributorInfo"
+              (\ o ->
+                 ContributorInfo' <$>
+                   (o .:? "profilePictureBaseUrl") <*>
+                     (o .:? "displayName"))
+
+instance ToJSON ContributorInfo where
+        toJSON ContributorInfo'{..}
+          = object
+              (catMaybes
+                 [("profilePictureBaseUrl" .=) <$>
+                    _ciProFilePictureBaseURL,
+                  ("displayName" .=) <$> _ciDisplayName])
+
+--
+-- /See:/ 'listAlbumsResponse' smart constructor.
+data ListAlbumsResponse = ListAlbumsResponse'
+    { _larNextPageToken :: !(Maybe Text)
+    , _larAlbums        :: !(Maybe [Album])
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ListAlbumsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'larNextPageToken'
+--
+-- * 'larAlbums'
+listAlbumsResponse
+    :: ListAlbumsResponse
+listAlbumsResponse =
+    ListAlbumsResponse'
+    { _larNextPageToken = Nothing
+    , _larAlbums = Nothing
+    }
+
+-- | [Output only] Token to use to get the next set of albums. Populated if
+-- there are more albums to retrieve for this request.
+larNextPageToken :: Lens' ListAlbumsResponse (Maybe Text)
+larNextPageToken
+  = lens _larNextPageToken
+      (\ s a -> s{_larNextPageToken = a})
+
+-- | [Output only] List of albums that were created by the user.
+larAlbums :: Lens' ListAlbumsResponse [Album]
+larAlbums
+  = lens _larAlbums (\ s a -> s{_larAlbums = a}) .
+      _Default
+      . _Coerce
+
+instance FromJSON ListAlbumsResponse where
+        parseJSON
+          = withObject "ListAlbumsResponse"
+              (\ o ->
+                 ListAlbumsResponse' <$>
+                   (o .:? "nextPageToken") <*>
+                     (o .:? "albums" .!= mempty))
+
+instance ToJSON ListAlbumsResponse where
+        toJSON ListAlbumsResponse'{..}
+          = object
+              (catMaybes
+                 [("nextPageToken" .=) <$> _larNextPageToken,
+                  ("albums" .=) <$> _larAlbums])
+
+-- | An enrichment containing a map, showing origin and destination
+-- locations.
+--
+-- /See:/ 'mapEnrichment' smart constructor.
+data MapEnrichment = MapEnrichment'
+    { _meDestination :: !(Maybe Location)
+    , _meOrigin      :: !(Maybe Location)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'MapEnrichment' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'meDestination'
+--
+-- * 'meOrigin'
+mapEnrichment
+    :: MapEnrichment
+mapEnrichment =
+    MapEnrichment'
+    { _meDestination = Nothing
+    , _meOrigin = Nothing
+    }
+
+-- | Destination location for this enrichemt item.
+meDestination :: Lens' MapEnrichment (Maybe Location)
+meDestination
+  = lens _meDestination
+      (\ s a -> s{_meDestination = a})
+
+-- | Origin location for this enrichment item.
+meOrigin :: Lens' MapEnrichment (Maybe Location)
+meOrigin = lens _meOrigin (\ s a -> s{_meOrigin = a})
+
+instance FromJSON MapEnrichment where
+        parseJSON
+          = withObject "MapEnrichment"
+              (\ o ->
+                 MapEnrichment' <$>
+                   (o .:? "destination") <*> (o .:? "origin"))
+
+instance ToJSON MapEnrichment where
+        toJSON MapEnrichment'{..}
+          = object
+              (catMaybes
+                 [("destination" .=) <$> _meDestination,
+                  ("origin" .=) <$> _meOrigin])
+
+-- | Request to search for media items in a user\'s library. If the album id
+-- is specified, this call will return the list of media items in the
+-- album. If neither filters nor album id are specified, this call will
+-- return all media items in a user\'s Google Photos library. If filters
+-- are specified, this call will return all media items in the user\'s
+-- library which fulfills the criteria based upon the filters. Filters and
+-- album id must not both be set, as this will result in an invalid
+-- request.
+--
+-- /See:/ 'searchMediaItemsRequest' smart constructor.
+data SearchMediaItemsRequest = SearchMediaItemsRequest'
+    { _smirAlbumId   :: !(Maybe Text)
+    , _smirFilters   :: !(Maybe Filters)
+    , _smirPageToken :: !(Maybe Text)
+    , _smirPageSize  :: !(Maybe (Textual Int32))
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SearchMediaItemsRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'smirAlbumId'
+--
+-- * 'smirFilters'
+--
+-- * 'smirPageToken'
+--
+-- * 'smirPageSize'
+searchMediaItemsRequest
+    :: SearchMediaItemsRequest
+searchMediaItemsRequest =
+    SearchMediaItemsRequest'
+    { _smirAlbumId = Nothing
+    , _smirFilters = Nothing
+    , _smirPageToken = Nothing
+    , _smirPageSize = Nothing
+    }
+
+-- | Identifier of an album. If populated will list all media items in
+-- specified album. Cannot be set in conjunction with any filters.
+smirAlbumId :: Lens' SearchMediaItemsRequest (Maybe Text)
+smirAlbumId
+  = lens _smirAlbumId (\ s a -> s{_smirAlbumId = a})
+
+-- | Filters to apply to the request. Cannot be set in conjuction with an
+-- albumId.
+smirFilters :: Lens' SearchMediaItemsRequest (Maybe Filters)
+smirFilters
+  = lens _smirFilters (\ s a -> s{_smirFilters = a})
+
+-- | A continuation token to get the next page of the results. Adding this to
+-- the request will return the rows after the pageToken. The pageToken
+-- should be the value returned in the nextPageToken parameter in the
+-- response to the searchMediaItems request.
+smirPageToken :: Lens' SearchMediaItemsRequest (Maybe Text)
+smirPageToken
+  = lens _smirPageToken
+      (\ s a -> s{_smirPageToken = a})
+
+-- | Maximum number of media items to return in the response. The default
+-- number of media items to return at a time is 100. The maximum page size
+-- is 500.
+smirPageSize :: Lens' SearchMediaItemsRequest (Maybe Int32)
+smirPageSize
+  = lens _smirPageSize (\ s a -> s{_smirPageSize = a})
+      . mapping _Coerce
+
+instance FromJSON SearchMediaItemsRequest where
+        parseJSON
+          = withObject "SearchMediaItemsRequest"
+              (\ o ->
+                 SearchMediaItemsRequest' <$>
+                   (o .:? "albumId") <*> (o .:? "filters") <*>
+                     (o .:? "pageToken")
+                     <*> (o .:? "pageSize"))
+
+instance ToJSON SearchMediaItemsRequest where
+        toJSON SearchMediaItemsRequest'{..}
+          = object
+              (catMaybes
+                 [("albumId" .=) <$> _smirAlbumId,
+                  ("filters" .=) <$> _smirFilters,
+                  ("pageToken" .=) <$> _smirPageToken,
+                  ("pageSize" .=) <$> _smirPageSize])
+
+-- | New media item that will be created in a user\'s Google Photos account.
+--
+-- /See:/ 'newMediaItem' smart constructor.
+data NewMediaItem = NewMediaItem'
+    { _nmiSimpleMediaItem :: !(Maybe SimpleMediaItem)
+    , _nmiDescription     :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'NewMediaItem' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'nmiSimpleMediaItem'
+--
+-- * 'nmiDescription'
+newMediaItem
+    :: NewMediaItem
+newMediaItem =
+    NewMediaItem'
+    { _nmiSimpleMediaItem = Nothing
+    , _nmiDescription = Nothing
+    }
+
+-- | A new media item that has been uploaded via the included uploadToken.
+nmiSimpleMediaItem :: Lens' NewMediaItem (Maybe SimpleMediaItem)
+nmiSimpleMediaItem
+  = lens _nmiSimpleMediaItem
+      (\ s a -> s{_nmiSimpleMediaItem = a})
+
+-- | Description of the media item. This will be shown to the user in the
+-- item\'s info section in the Google Photos app. This string should not be
+-- more than 1000 characters.
+nmiDescription :: Lens' NewMediaItem (Maybe Text)
+nmiDescription
+  = lens _nmiDescription
+      (\ s a -> s{_nmiDescription = a})
+
+instance FromJSON NewMediaItem where
+        parseJSON
+          = withObject "NewMediaItem"
+              (\ o ->
+                 NewMediaItem' <$>
+                   (o .:? "simpleMediaItem") <*> (o .:? "description"))
+
+instance ToJSON NewMediaItem where
+        toJSON NewMediaItem'{..}
+          = object
+              (catMaybes
+                 [("simpleMediaItem" .=) <$> _nmiSimpleMediaItem,
+                  ("description" .=) <$> _nmiDescription])
+
+-- | Request to add an enrichment to a specific album at a specific position.
+--
+-- /See:/ 'addEnrichmentToAlbumRequest' smart constructor.
+data AddEnrichmentToAlbumRequest = AddEnrichmentToAlbumRequest'
+    { _aetarNewEnrichmentItem :: !(Maybe NewEnrichmentItem)
+    , _aetarAlbumPosition     :: !(Maybe AlbumPosition)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'AddEnrichmentToAlbumRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'aetarNewEnrichmentItem'
+--
+-- * 'aetarAlbumPosition'
+addEnrichmentToAlbumRequest
+    :: AddEnrichmentToAlbumRequest
+addEnrichmentToAlbumRequest =
+    AddEnrichmentToAlbumRequest'
+    { _aetarNewEnrichmentItem = Nothing
+    , _aetarAlbumPosition = Nothing
+    }
+
+-- | The enrichment to be added.
+aetarNewEnrichmentItem :: Lens' AddEnrichmentToAlbumRequest (Maybe NewEnrichmentItem)
+aetarNewEnrichmentItem
+  = lens _aetarNewEnrichmentItem
+      (\ s a -> s{_aetarNewEnrichmentItem = a})
+
+-- | The position where the enrichment will be inserted.
+aetarAlbumPosition :: Lens' AddEnrichmentToAlbumRequest (Maybe AlbumPosition)
+aetarAlbumPosition
+  = lens _aetarAlbumPosition
+      (\ s a -> s{_aetarAlbumPosition = a})
+
+instance FromJSON AddEnrichmentToAlbumRequest where
+        parseJSON
+          = withObject "AddEnrichmentToAlbumRequest"
+              (\ o ->
+                 AddEnrichmentToAlbumRequest' <$>
+                   (o .:? "newEnrichmentItem") <*>
+                     (o .:? "albumPosition"))
+
+instance ToJSON AddEnrichmentToAlbumRequest where
+        toJSON AddEnrichmentToAlbumRequest'{..}
+          = object
+              (catMaybes
+                 [("newEnrichmentItem" .=) <$>
+                    _aetarNewEnrichmentItem,
+                  ("albumPosition" .=) <$> _aetarAlbumPosition])
+
+-- | Request to join a shared album on behalf of the user. This uses a
+-- shareToken which can be acquired via the shareAlbum or listSharedAlbums
+-- calls.
+--
+-- /See:/ 'joinSharedAlbumRequest' smart constructor.
+newtype JoinSharedAlbumRequest = JoinSharedAlbumRequest'
+    { _jsarShareToken :: Maybe Text
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'JoinSharedAlbumRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'jsarShareToken'
+joinSharedAlbumRequest
+    :: JoinSharedAlbumRequest
+joinSharedAlbumRequest =
+    JoinSharedAlbumRequest'
+    { _jsarShareToken = Nothing
+    }
+
+-- | Token indicating the shared album to join on behalf of the user.
+jsarShareToken :: Lens' JoinSharedAlbumRequest (Maybe Text)
+jsarShareToken
+  = lens _jsarShareToken
+      (\ s a -> s{_jsarShareToken = a})
+
+instance FromJSON JoinSharedAlbumRequest where
+        parseJSON
+          = withObject "JoinSharedAlbumRequest"
+              (\ o ->
+                 JoinSharedAlbumRequest' <$> (o .:? "shareToken"))
+
+instance ToJSON JoinSharedAlbumRequest where
+        toJSON JoinSharedAlbumRequest'{..}
+          = object
+              (catMaybes [("shareToken" .=) <$> _jsarShareToken])
+
+-- | Request to make an album shared in Google Photos.
+--
+-- /See:/ 'shareAlbumRequest' smart constructor.
+newtype ShareAlbumRequest = ShareAlbumRequest'
+    { _sarSharedAlbumOptions :: Maybe SharedAlbumOptions
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ShareAlbumRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sarSharedAlbumOptions'
+shareAlbumRequest
+    :: ShareAlbumRequest
+shareAlbumRequest =
+    ShareAlbumRequest'
+    { _sarSharedAlbumOptions = Nothing
+    }
+
+-- | Options to be set when converting the album to a shared album.
+sarSharedAlbumOptions :: Lens' ShareAlbumRequest (Maybe SharedAlbumOptions)
+sarSharedAlbumOptions
+  = lens _sarSharedAlbumOptions
+      (\ s a -> s{_sarSharedAlbumOptions = a})
+
+instance FromJSON ShareAlbumRequest where
+        parseJSON
+          = withObject "ShareAlbumRequest"
+              (\ o ->
+                 ShareAlbumRequest' <$> (o .:? "sharedAlbumOptions"))
+
+instance ToJSON ShareAlbumRequest where
+        toJSON ShareAlbumRequest'{..}
+          = object
+              (catMaybes
+                 [("sharedAlbumOptions" .=) <$>
+                    _sarSharedAlbumOptions])
+
+-- | Specifies a position in an album.
+--
+-- /See:/ 'albumPosition' smart constructor.
+data AlbumPosition = AlbumPosition'
+    { _apRelativeMediaItemId      :: !(Maybe Text)
+    , _apRelativeEnrichmentItemId :: !(Maybe Text)
+    , _apPosition                 :: !(Maybe AlbumPositionPosition)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'AlbumPosition' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'apRelativeMediaItemId'
+--
+-- * 'apRelativeEnrichmentItemId'
+--
+-- * 'apPosition'
+albumPosition
+    :: AlbumPosition
+albumPosition =
+    AlbumPosition'
+    { _apRelativeMediaItemId = Nothing
+    , _apRelativeEnrichmentItemId = Nothing
+    , _apPosition = Nothing
+    }
+
+-- | The media item to which the position is relative to. Only used when
+-- position type is AFTER_MEDIA_ITEM.
+apRelativeMediaItemId :: Lens' AlbumPosition (Maybe Text)
+apRelativeMediaItemId
+  = lens _apRelativeMediaItemId
+      (\ s a -> s{_apRelativeMediaItemId = a})
+
+-- | The enrichment item to which the position is relative to. Only used when
+-- position type is AFTER_ENRICHMENT_ITEM.
+apRelativeEnrichmentItemId :: Lens' AlbumPosition (Maybe Text)
+apRelativeEnrichmentItemId
+  = lens _apRelativeEnrichmentItemId
+      (\ s a -> s{_apRelativeEnrichmentItemId = a})
+
+-- | Type of position, for a media or enrichment item.
+apPosition :: Lens' AlbumPosition (Maybe AlbumPositionPosition)
+apPosition
+  = lens _apPosition (\ s a -> s{_apPosition = a})
+
+instance FromJSON AlbumPosition where
+        parseJSON
+          = withObject "AlbumPosition"
+              (\ o ->
+                 AlbumPosition' <$>
+                   (o .:? "relativeMediaItemId") <*>
+                     (o .:? "relativeEnrichmentItemId")
+                     <*> (o .:? "position"))
+
+instance ToJSON AlbumPosition where
+        toJSON AlbumPosition'{..}
+          = object
+              (catMaybes
+                 [("relativeMediaItemId" .=) <$>
+                    _apRelativeMediaItemId,
+                  ("relativeEnrichmentItemId" .=) <$>
+                    _apRelativeEnrichmentItemId,
+                  ("position" .=) <$> _apPosition])
+
+-- | This filter is used to define which results to return based on the
+-- contents of the media item. It is possible to specify a list of
+-- categories to include, and\/or a list of categories to exclude. Within
+-- each list, the categories are combined with an OR. For example, if the
+-- content filter looks like: included_content_categories: [c1, c2, c3] It
+-- would get media items that contain (c1 OR c2 OR c3). And if the content
+-- filter looks like: excluded_content_categories: [c1, c2, c3] It would
+-- get media items that contain NOT (c1 OR c2 OR c3). You can also include
+-- some categories while excluding others, as in this proto:
+-- included_content_categories: [c1, c2], excluded_content_category: [c3,
+-- c4] It would get media items that contain (c1 OR c2) AND NOT (c3 OR c4).
+-- A category that appears in 'includedContentategories' must not appear in
+-- 'excludedContentCategories'.
+--
+-- /See:/ 'contentFilter' smart constructor.
+data ContentFilter = ContentFilter'
+    { _cfIncludedContentCategories :: !(Maybe [Text])
+    , _cfExcludedContentCategories :: !(Maybe [Text])
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ContentFilter' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cfIncludedContentCategories'
+--
+-- * 'cfExcludedContentCategories'
+contentFilter
+    :: ContentFilter
+contentFilter =
+    ContentFilter'
+    { _cfIncludedContentCategories = Nothing
+    , _cfExcludedContentCategories = Nothing
+    }
+
+-- | The set of categories that must be present in the media items in the
+-- result. The items in the set are ORed. There is a maximum of 10
+-- includedContentCategories per request.
+cfIncludedContentCategories :: Lens' ContentFilter [Text]
+cfIncludedContentCategories
+  = lens _cfIncludedContentCategories
+      (\ s a -> s{_cfIncludedContentCategories = a})
+      . _Default
+      . _Coerce
+
+-- | The set of categories that must NOT be present in the media items in the
+-- result. The items in the set are ORed. There is a maximum of 10
+-- excludedContentCategories per request.
+cfExcludedContentCategories :: Lens' ContentFilter [Text]
+cfExcludedContentCategories
+  = lens _cfExcludedContentCategories
+      (\ s a -> s{_cfExcludedContentCategories = a})
+      . _Default
+      . _Coerce
+
+instance FromJSON ContentFilter where
+        parseJSON
+          = withObject "ContentFilter"
+              (\ o ->
+                 ContentFilter' <$>
+                   (o .:? "includedContentCategories" .!= mempty) <*>
+                     (o .:? "excludedContentCategories" .!= mempty))
+
+instance ToJSON ContentFilter where
+        toJSON ContentFilter'{..}
+          = object
+              (catMaybes
+                 [("includedContentCategories" .=) <$>
+                    _cfIncludedContentCategories,
+                  ("excludedContentCategories" .=) <$>
+                    _cfExcludedContentCategories])
+
+--
+-- /See:/ 'batchCreateMediaItemsResponse' smart constructor.
+newtype BatchCreateMediaItemsResponse = BatchCreateMediaItemsResponse'
+    { _bcmirNewMediaItemResults :: Maybe [NewMediaItemResult]
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'BatchCreateMediaItemsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'bcmirNewMediaItemResults'
+batchCreateMediaItemsResponse
+    :: BatchCreateMediaItemsResponse
+batchCreateMediaItemsResponse =
+    BatchCreateMediaItemsResponse'
+    { _bcmirNewMediaItemResults = Nothing
+    }
+
+-- | [Output only] List of media items which were created.
+bcmirNewMediaItemResults :: Lens' BatchCreateMediaItemsResponse [NewMediaItemResult]
+bcmirNewMediaItemResults
+  = lens _bcmirNewMediaItemResults
+      (\ s a -> s{_bcmirNewMediaItemResults = a})
+      . _Default
+      . _Coerce
+
+instance FromJSON BatchCreateMediaItemsResponse where
+        parseJSON
+          = withObject "BatchCreateMediaItemsResponse"
+              (\ o ->
+                 BatchCreateMediaItemsResponse' <$>
+                   (o .:? "newMediaItemResults" .!= mempty))
+
+instance ToJSON BatchCreateMediaItemsResponse where
+        toJSON BatchCreateMediaItemsResponse'{..}
+          = object
+              (catMaybes
+                 [("newMediaItemResults" .=) <$>
+                    _bcmirNewMediaItemResults])
diff --git a/gen/Network/Google/PhotosLibrary/Types/Sum.hs b/gen/Network/Google/PhotosLibrary/Types/Sum.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/PhotosLibrary/Types/Sum.hs
@@ -0,0 +1,132 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE LambdaCase         #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Network.Google.PhotosLibrary.Types.Sum
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+module Network.Google.PhotosLibrary.Types.Sum where
+
+import           Network.Google.Prelude hiding (Bytes)
+
+-- | Processing status of the video.
+data VideoStatus
+    = Unspecified
+      -- ^ @UNSPECIFIED@
+      -- Video processing status is unknown.
+    | Processing
+      -- ^ @PROCESSING@
+      -- Video is currently being processed. The user will see an icon for this
+      -- video in the Google Photos app, however, it will not be playable yet.
+    | Ready
+      -- ^ @READY@
+      -- Video is now ready for viewing.
+    | Failed
+      -- ^ @FAILED@
+      -- Something has gone wrong and the video has failed to process.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable VideoStatus
+
+instance FromHttpApiData VideoStatus where
+    parseQueryParam = \case
+        "UNSPECIFIED" -> Right Unspecified
+        "PROCESSING" -> Right Processing
+        "READY" -> Right Ready
+        "FAILED" -> Right Failed
+        x -> Left ("Unable to parse VideoStatus from: " <> x)
+
+instance ToHttpApiData VideoStatus where
+    toQueryParam = \case
+        Unspecified -> "UNSPECIFIED"
+        Processing -> "PROCESSING"
+        Ready -> "READY"
+        Failed -> "FAILED"
+
+instance FromJSON VideoStatus where
+    parseJSON = parseJSONText "VideoStatus"
+
+instance ToJSON VideoStatus where
+    toJSON = toJSONText
+
+-- | Type of position, for a media or enrichment item.
+data AlbumPositionPosition
+    = PositionTypeUnspecified
+      -- ^ @POSITION_TYPE_UNSPECIFIED@
+      -- Default value if this enum is not set.
+    | FirstInAlbum
+      -- ^ @FIRST_IN_ALBUM@
+      -- At the beginning of the album.
+    | LastInAlbum
+      -- ^ @LAST_IN_ALBUM@
+      -- At the end of the album.
+    | AfterMediaItem
+      -- ^ @AFTER_MEDIA_ITEM@
+      -- After a media item.
+    | AfterEnrichmentItem
+      -- ^ @AFTER_ENRICHMENT_ITEM@
+      -- After an enrichment item.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable AlbumPositionPosition
+
+instance FromHttpApiData AlbumPositionPosition where
+    parseQueryParam = \case
+        "POSITION_TYPE_UNSPECIFIED" -> Right PositionTypeUnspecified
+        "FIRST_IN_ALBUM" -> Right FirstInAlbum
+        "LAST_IN_ALBUM" -> Right LastInAlbum
+        "AFTER_MEDIA_ITEM" -> Right AfterMediaItem
+        "AFTER_ENRICHMENT_ITEM" -> Right AfterEnrichmentItem
+        x -> Left ("Unable to parse AlbumPositionPosition from: " <> x)
+
+instance ToHttpApiData AlbumPositionPosition where
+    toQueryParam = \case
+        PositionTypeUnspecified -> "POSITION_TYPE_UNSPECIFIED"
+        FirstInAlbum -> "FIRST_IN_ALBUM"
+        LastInAlbum -> "LAST_IN_ALBUM"
+        AfterMediaItem -> "AFTER_MEDIA_ITEM"
+        AfterEnrichmentItem -> "AFTER_ENRICHMENT_ITEM"
+
+instance FromJSON AlbumPositionPosition where
+    parseJSON = parseJSONText "AlbumPositionPosition"
+
+instance ToJSON AlbumPositionPosition where
+    toJSON = toJSONText
+
+-- | V1 error format.
+data Xgafv
+    = X1
+      -- ^ @1@
+      -- v1 error format
+    | X2
+      -- ^ @2@
+      -- v2 error format
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable Xgafv
+
+instance FromHttpApiData Xgafv where
+    parseQueryParam = \case
+        "1" -> Right X1
+        "2" -> Right X2
+        x -> Left ("Unable to parse Xgafv from: " <> x)
+
+instance ToHttpApiData Xgafv where
+    toQueryParam = \case
+        X1 -> "1"
+        X2 -> "2"
+
+instance FromJSON Xgafv where
+    parseJSON = parseJSONText "Xgafv"
+
+instance ToJSON Xgafv where
+    toJSON = toJSONText
diff --git a/gen/Network/Google/Resource/PhotosLibrary/Albums/AddEnrichment.hs b/gen/Network/Google/Resource/PhotosLibrary/Albums/AddEnrichment.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/PhotosLibrary/Albums/AddEnrichment.hs
@@ -0,0 +1,187 @@
+{-# 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.PhotosLibrary.Albums.AddEnrichment
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Adds an enrichment to a specified position in a defined album.
+--
+-- /See:/ <https://developers.google.com/photos/ Photos Library API Reference> for @photoslibrary.albums.addEnrichment@.
+module Network.Google.Resource.PhotosLibrary.Albums.AddEnrichment
+    (
+    -- * REST Resource
+      AlbumsAddEnrichmentResource
+
+    -- * Creating a Request
+    , albumsAddEnrichment
+    , AlbumsAddEnrichment
+
+    -- * Request Lenses
+    , aaeXgafv
+    , aaeAlbumId
+    , aaeUploadProtocol
+    , aaePp
+    , aaeAccessToken
+    , aaeUploadType
+    , aaePayload
+    , aaeBearerToken
+    , aaeCallback
+    ) where
+
+import           Network.Google.PhotosLibrary.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @photoslibrary.albums.addEnrichment@ method which the
+-- 'AlbumsAddEnrichment' request conforms to.
+type AlbumsAddEnrichmentResource =
+     "v1" :>
+       "albums" :>
+         CaptureMode "albumId" "addEnrichment" Text :>
+           QueryParam "$.xgafv" Xgafv :>
+             QueryParam "upload_protocol" Text :>
+               QueryParam "pp" Bool :>
+                 QueryParam "access_token" Text :>
+                   QueryParam "uploadType" Text :>
+                     QueryParam "bearer_token" Text :>
+                       QueryParam "callback" Text :>
+                         QueryParam "alt" AltJSON :>
+                           ReqBody '[JSON] AddEnrichmentToAlbumRequest :>
+                             Post '[JSON] AddEnrichmentToAlbumResponse
+
+-- | Adds an enrichment to a specified position in a defined album.
+--
+-- /See:/ 'albumsAddEnrichment' smart constructor.
+data AlbumsAddEnrichment = AlbumsAddEnrichment'
+    { _aaeXgafv          :: !(Maybe Xgafv)
+    , _aaeAlbumId        :: !Text
+    , _aaeUploadProtocol :: !(Maybe Text)
+    , _aaePp             :: !Bool
+    , _aaeAccessToken    :: !(Maybe Text)
+    , _aaeUploadType     :: !(Maybe Text)
+    , _aaePayload        :: !AddEnrichmentToAlbumRequest
+    , _aaeBearerToken    :: !(Maybe Text)
+    , _aaeCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'AlbumsAddEnrichment' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'aaeXgafv'
+--
+-- * 'aaeAlbumId'
+--
+-- * 'aaeUploadProtocol'
+--
+-- * 'aaePp'
+--
+-- * 'aaeAccessToken'
+--
+-- * 'aaeUploadType'
+--
+-- * 'aaePayload'
+--
+-- * 'aaeBearerToken'
+--
+-- * 'aaeCallback'
+albumsAddEnrichment
+    :: Text -- ^ 'aaeAlbumId'
+    -> AddEnrichmentToAlbumRequest -- ^ 'aaePayload'
+    -> AlbumsAddEnrichment
+albumsAddEnrichment pAaeAlbumId_ pAaePayload_ =
+    AlbumsAddEnrichment'
+    { _aaeXgafv = Nothing
+    , _aaeAlbumId = pAaeAlbumId_
+    , _aaeUploadProtocol = Nothing
+    , _aaePp = True
+    , _aaeAccessToken = Nothing
+    , _aaeUploadType = Nothing
+    , _aaePayload = pAaePayload_
+    , _aaeBearerToken = Nothing
+    , _aaeCallback = Nothing
+    }
+
+-- | V1 error format.
+aaeXgafv :: Lens' AlbumsAddEnrichment (Maybe Xgafv)
+aaeXgafv = lens _aaeXgafv (\ s a -> s{_aaeXgafv = a})
+
+-- | Identifier of the album where the enrichment will be added.
+aaeAlbumId :: Lens' AlbumsAddEnrichment Text
+aaeAlbumId
+  = lens _aaeAlbumId (\ s a -> s{_aaeAlbumId = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+aaeUploadProtocol :: Lens' AlbumsAddEnrichment (Maybe Text)
+aaeUploadProtocol
+  = lens _aaeUploadProtocol
+      (\ s a -> s{_aaeUploadProtocol = a})
+
+-- | Pretty-print response.
+aaePp :: Lens' AlbumsAddEnrichment Bool
+aaePp = lens _aaePp (\ s a -> s{_aaePp = a})
+
+-- | OAuth access token.
+aaeAccessToken :: Lens' AlbumsAddEnrichment (Maybe Text)
+aaeAccessToken
+  = lens _aaeAccessToken
+      (\ s a -> s{_aaeAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+aaeUploadType :: Lens' AlbumsAddEnrichment (Maybe Text)
+aaeUploadType
+  = lens _aaeUploadType
+      (\ s a -> s{_aaeUploadType = a})
+
+-- | Multipart request metadata.
+aaePayload :: Lens' AlbumsAddEnrichment AddEnrichmentToAlbumRequest
+aaePayload
+  = lens _aaePayload (\ s a -> s{_aaePayload = a})
+
+-- | OAuth bearer token.
+aaeBearerToken :: Lens' AlbumsAddEnrichment (Maybe Text)
+aaeBearerToken
+  = lens _aaeBearerToken
+      (\ s a -> s{_aaeBearerToken = a})
+
+-- | JSONP
+aaeCallback :: Lens' AlbumsAddEnrichment (Maybe Text)
+aaeCallback
+  = lens _aaeCallback (\ s a -> s{_aaeCallback = a})
+
+instance GoogleRequest AlbumsAddEnrichment where
+        type Rs AlbumsAddEnrichment =
+             AddEnrichmentToAlbumResponse
+        type Scopes AlbumsAddEnrichment =
+             '["https://www.googleapis.com/auth/photoslibrary",
+               "https://www.googleapis.com/auth/photoslibrary.appendonly",
+               "https://www.googleapis.com/auth/photoslibrary.sharing"]
+        requestClient AlbumsAddEnrichment'{..}
+          = go _aaeAlbumId _aaeXgafv _aaeUploadProtocol
+              (Just _aaePp)
+              _aaeAccessToken
+              _aaeUploadType
+              _aaeBearerToken
+              _aaeCallback
+              (Just AltJSON)
+              _aaePayload
+              photosLibraryService
+          where go
+                  = buildClient
+                      (Proxy :: Proxy AlbumsAddEnrichmentResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/PhotosLibrary/Albums/Create.hs b/gen/Network/Google/Resource/PhotosLibrary/Albums/Create.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/PhotosLibrary/Albums/Create.hs
@@ -0,0 +1,171 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.PhotosLibrary.Albums.Create
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates an album in a user\'s Google Photos library.
+--
+-- /See:/ <https://developers.google.com/photos/ Photos Library API Reference> for @photoslibrary.albums.create@.
+module Network.Google.Resource.PhotosLibrary.Albums.Create
+    (
+    -- * REST Resource
+      AlbumsCreateResource
+
+    -- * Creating a Request
+    , albumsCreate
+    , AlbumsCreate
+
+    -- * Request Lenses
+    , acXgafv
+    , acUploadProtocol
+    , acPp
+    , acAccessToken
+    , acUploadType
+    , acPayload
+    , acBearerToken
+    , acCallback
+    ) where
+
+import           Network.Google.PhotosLibrary.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @photoslibrary.albums.create@ method which the
+-- 'AlbumsCreate' request conforms to.
+type AlbumsCreateResource =
+     "v1" :>
+       "albums" :>
+         QueryParam "$.xgafv" Xgafv :>
+           QueryParam "upload_protocol" Text :>
+             QueryParam "pp" Bool :>
+               QueryParam "access_token" Text :>
+                 QueryParam "uploadType" Text :>
+                   QueryParam "bearer_token" Text :>
+                     QueryParam "callback" Text :>
+                       QueryParam "alt" AltJSON :>
+                         ReqBody '[JSON] CreateAlbumRequest :>
+                           Post '[JSON] Album
+
+-- | Creates an album in a user\'s Google Photos library.
+--
+-- /See:/ 'albumsCreate' smart constructor.
+data AlbumsCreate = AlbumsCreate'
+    { _acXgafv          :: !(Maybe Xgafv)
+    , _acUploadProtocol :: !(Maybe Text)
+    , _acPp             :: !Bool
+    , _acAccessToken    :: !(Maybe Text)
+    , _acUploadType     :: !(Maybe Text)
+    , _acPayload        :: !CreateAlbumRequest
+    , _acBearerToken    :: !(Maybe Text)
+    , _acCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'AlbumsCreate' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'acXgafv'
+--
+-- * 'acUploadProtocol'
+--
+-- * 'acPp'
+--
+-- * 'acAccessToken'
+--
+-- * 'acUploadType'
+--
+-- * 'acPayload'
+--
+-- * 'acBearerToken'
+--
+-- * 'acCallback'
+albumsCreate
+    :: CreateAlbumRequest -- ^ 'acPayload'
+    -> AlbumsCreate
+albumsCreate pAcPayload_ =
+    AlbumsCreate'
+    { _acXgafv = Nothing
+    , _acUploadProtocol = Nothing
+    , _acPp = True
+    , _acAccessToken = Nothing
+    , _acUploadType = Nothing
+    , _acPayload = pAcPayload_
+    , _acBearerToken = Nothing
+    , _acCallback = Nothing
+    }
+
+-- | V1 error format.
+acXgafv :: Lens' AlbumsCreate (Maybe Xgafv)
+acXgafv = lens _acXgafv (\ s a -> s{_acXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+acUploadProtocol :: Lens' AlbumsCreate (Maybe Text)
+acUploadProtocol
+  = lens _acUploadProtocol
+      (\ s a -> s{_acUploadProtocol = a})
+
+-- | Pretty-print response.
+acPp :: Lens' AlbumsCreate Bool
+acPp = lens _acPp (\ s a -> s{_acPp = a})
+
+-- | OAuth access token.
+acAccessToken :: Lens' AlbumsCreate (Maybe Text)
+acAccessToken
+  = lens _acAccessToken
+      (\ s a -> s{_acAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+acUploadType :: Lens' AlbumsCreate (Maybe Text)
+acUploadType
+  = lens _acUploadType (\ s a -> s{_acUploadType = a})
+
+-- | Multipart request metadata.
+acPayload :: Lens' AlbumsCreate CreateAlbumRequest
+acPayload
+  = lens _acPayload (\ s a -> s{_acPayload = a})
+
+-- | OAuth bearer token.
+acBearerToken :: Lens' AlbumsCreate (Maybe Text)
+acBearerToken
+  = lens _acBearerToken
+      (\ s a -> s{_acBearerToken = a})
+
+-- | JSONP
+acCallback :: Lens' AlbumsCreate (Maybe Text)
+acCallback
+  = lens _acCallback (\ s a -> s{_acCallback = a})
+
+instance GoogleRequest AlbumsCreate where
+        type Rs AlbumsCreate = Album
+        type Scopes AlbumsCreate =
+             '["https://www.googleapis.com/auth/photoslibrary",
+               "https://www.googleapis.com/auth/photoslibrary.appendonly",
+               "https://www.googleapis.com/auth/photoslibrary.sharing"]
+        requestClient AlbumsCreate'{..}
+          = go _acXgafv _acUploadProtocol (Just _acPp)
+              _acAccessToken
+              _acUploadType
+              _acBearerToken
+              _acCallback
+              (Just AltJSON)
+              _acPayload
+              photosLibraryService
+          where go
+                  = buildClient (Proxy :: Proxy AlbumsCreateResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/PhotosLibrary/Albums/Get.hs b/gen/Network/Google/Resource/PhotosLibrary/Albums/Get.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/PhotosLibrary/Albums/Get.hs
@@ -0,0 +1,171 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.PhotosLibrary.Albums.Get
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns the album specified by the given album id.
+--
+-- /See:/ <https://developers.google.com/photos/ Photos Library API Reference> for @photoslibrary.albums.get@.
+module Network.Google.Resource.PhotosLibrary.Albums.Get
+    (
+    -- * REST Resource
+      AlbumsGetResource
+
+    -- * Creating a Request
+    , albumsGet
+    , AlbumsGet
+
+    -- * Request Lenses
+    , agXgafv
+    , agAlbumId
+    , agUploadProtocol
+    , agPp
+    , agAccessToken
+    , agUploadType
+    , agBearerToken
+    , agCallback
+    ) where
+
+import           Network.Google.PhotosLibrary.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @photoslibrary.albums.get@ method which the
+-- 'AlbumsGet' request conforms to.
+type AlbumsGetResource =
+     "v1" :>
+       "albums" :>
+         Capture "albumId" Text :>
+           QueryParam "$.xgafv" Xgafv :>
+             QueryParam "upload_protocol" Text :>
+               QueryParam "pp" Bool :>
+                 QueryParam "access_token" Text :>
+                   QueryParam "uploadType" Text :>
+                     QueryParam "bearer_token" Text :>
+                       QueryParam "callback" Text :>
+                         QueryParam "alt" AltJSON :> Get '[JSON] Album
+
+-- | Returns the album specified by the given album id.
+--
+-- /See:/ 'albumsGet' smart constructor.
+data AlbumsGet = AlbumsGet'
+    { _agXgafv          :: !(Maybe Xgafv)
+    , _agAlbumId        :: !Text
+    , _agUploadProtocol :: !(Maybe Text)
+    , _agPp             :: !Bool
+    , _agAccessToken    :: !(Maybe Text)
+    , _agUploadType     :: !(Maybe Text)
+    , _agBearerToken    :: !(Maybe Text)
+    , _agCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'AlbumsGet' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'agXgafv'
+--
+-- * 'agAlbumId'
+--
+-- * 'agUploadProtocol'
+--
+-- * 'agPp'
+--
+-- * 'agAccessToken'
+--
+-- * 'agUploadType'
+--
+-- * 'agBearerToken'
+--
+-- * 'agCallback'
+albumsGet
+    :: Text -- ^ 'agAlbumId'
+    -> AlbumsGet
+albumsGet pAgAlbumId_ =
+    AlbumsGet'
+    { _agXgafv = Nothing
+    , _agAlbumId = pAgAlbumId_
+    , _agUploadProtocol = Nothing
+    , _agPp = True
+    , _agAccessToken = Nothing
+    , _agUploadType = Nothing
+    , _agBearerToken = Nothing
+    , _agCallback = Nothing
+    }
+
+-- | V1 error format.
+agXgafv :: Lens' AlbumsGet (Maybe Xgafv)
+agXgafv = lens _agXgafv (\ s a -> s{_agXgafv = a})
+
+-- | Identifier of the album to be requested.
+agAlbumId :: Lens' AlbumsGet Text
+agAlbumId
+  = lens _agAlbumId (\ s a -> s{_agAlbumId = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+agUploadProtocol :: Lens' AlbumsGet (Maybe Text)
+agUploadProtocol
+  = lens _agUploadProtocol
+      (\ s a -> s{_agUploadProtocol = a})
+
+-- | Pretty-print response.
+agPp :: Lens' AlbumsGet Bool
+agPp = lens _agPp (\ s a -> s{_agPp = a})
+
+-- | OAuth access token.
+agAccessToken :: Lens' AlbumsGet (Maybe Text)
+agAccessToken
+  = lens _agAccessToken
+      (\ s a -> s{_agAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+agUploadType :: Lens' AlbumsGet (Maybe Text)
+agUploadType
+  = lens _agUploadType (\ s a -> s{_agUploadType = a})
+
+-- | OAuth bearer token.
+agBearerToken :: Lens' AlbumsGet (Maybe Text)
+agBearerToken
+  = lens _agBearerToken
+      (\ s a -> s{_agBearerToken = a})
+
+-- | JSONP
+agCallback :: Lens' AlbumsGet (Maybe Text)
+agCallback
+  = lens _agCallback (\ s a -> s{_agCallback = a})
+
+instance GoogleRequest AlbumsGet where
+        type Rs AlbumsGet = Album
+        type Scopes AlbumsGet =
+             '["https://www.googleapis.com/auth/drive.photos.readonly",
+               "https://www.googleapis.com/auth/photoslibrary",
+               "https://www.googleapis.com/auth/photoslibrary.readonly",
+               "https://www.googleapis.com/auth/photoslibrary.readonly.appcreateddata"]
+        requestClient AlbumsGet'{..}
+          = go _agAlbumId _agXgafv _agUploadProtocol
+              (Just _agPp)
+              _agAccessToken
+              _agUploadType
+              _agBearerToken
+              _agCallback
+              (Just AltJSON)
+              photosLibraryService
+          where go
+                  = buildClient (Proxy :: Proxy AlbumsGetResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/PhotosLibrary/Albums/List.hs b/gen/Network/Google/Resource/PhotosLibrary/Albums/List.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/PhotosLibrary/Albums/List.hs
@@ -0,0 +1,190 @@
+{-# 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.PhotosLibrary.Albums.List
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists all albums shown to a user in the \'Albums\' tab of the Google
+-- Photos app.
+--
+-- /See:/ <https://developers.google.com/photos/ Photos Library API Reference> for @photoslibrary.albums.list@.
+module Network.Google.Resource.PhotosLibrary.Albums.List
+    (
+    -- * REST Resource
+      AlbumsListResource
+
+    -- * Creating a Request
+    , albumsList
+    , AlbumsList
+
+    -- * Request Lenses
+    , alXgafv
+    , alUploadProtocol
+    , alPp
+    , alAccessToken
+    , alUploadType
+    , alBearerToken
+    , alPageToken
+    , alPageSize
+    , alCallback
+    ) where
+
+import           Network.Google.PhotosLibrary.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @photoslibrary.albums.list@ method which the
+-- 'AlbumsList' request conforms to.
+type AlbumsListResource =
+     "v1" :>
+       "albums" :>
+         QueryParam "$.xgafv" Xgafv :>
+           QueryParam "upload_protocol" Text :>
+             QueryParam "pp" Bool :>
+               QueryParam "access_token" Text :>
+                 QueryParam "uploadType" Text :>
+                   QueryParam "bearer_token" Text :>
+                     QueryParam "pageToken" Text :>
+                       QueryParam "pageSize" (Textual Int32) :>
+                         QueryParam "callback" Text :>
+                           QueryParam "alt" AltJSON :>
+                             Get '[JSON] ListAlbumsResponse
+
+-- | Lists all albums shown to a user in the \'Albums\' tab of the Google
+-- Photos app.
+--
+-- /See:/ 'albumsList' smart constructor.
+data AlbumsList = AlbumsList'
+    { _alXgafv          :: !(Maybe Xgafv)
+    , _alUploadProtocol :: !(Maybe Text)
+    , _alPp             :: !Bool
+    , _alAccessToken    :: !(Maybe Text)
+    , _alUploadType     :: !(Maybe Text)
+    , _alBearerToken    :: !(Maybe Text)
+    , _alPageToken      :: !(Maybe Text)
+    , _alPageSize       :: !(Maybe (Textual Int32))
+    , _alCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'AlbumsList' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'alXgafv'
+--
+-- * 'alUploadProtocol'
+--
+-- * 'alPp'
+--
+-- * 'alAccessToken'
+--
+-- * 'alUploadType'
+--
+-- * 'alBearerToken'
+--
+-- * 'alPageToken'
+--
+-- * 'alPageSize'
+--
+-- * 'alCallback'
+albumsList
+    :: AlbumsList
+albumsList =
+    AlbumsList'
+    { _alXgafv = Nothing
+    , _alUploadProtocol = Nothing
+    , _alPp = True
+    , _alAccessToken = Nothing
+    , _alUploadType = Nothing
+    , _alBearerToken = Nothing
+    , _alPageToken = Nothing
+    , _alPageSize = Nothing
+    , _alCallback = Nothing
+    }
+
+-- | V1 error format.
+alXgafv :: Lens' AlbumsList (Maybe Xgafv)
+alXgafv = lens _alXgafv (\ s a -> s{_alXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+alUploadProtocol :: Lens' AlbumsList (Maybe Text)
+alUploadProtocol
+  = lens _alUploadProtocol
+      (\ s a -> s{_alUploadProtocol = a})
+
+-- | Pretty-print response.
+alPp :: Lens' AlbumsList Bool
+alPp = lens _alPp (\ s a -> s{_alPp = a})
+
+-- | OAuth access token.
+alAccessToken :: Lens' AlbumsList (Maybe Text)
+alAccessToken
+  = lens _alAccessToken
+      (\ s a -> s{_alAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+alUploadType :: Lens' AlbumsList (Maybe Text)
+alUploadType
+  = lens _alUploadType (\ s a -> s{_alUploadType = a})
+
+-- | OAuth bearer token.
+alBearerToken :: Lens' AlbumsList (Maybe Text)
+alBearerToken
+  = lens _alBearerToken
+      (\ s a -> s{_alBearerToken = a})
+
+-- | A continuation token to get the next page of the results. Adding this to
+-- the request will return the rows after the pageToken. The pageToken
+-- should be the value returned in the nextPageToken parameter in the
+-- response to the listAlbums request.
+alPageToken :: Lens' AlbumsList (Maybe Text)
+alPageToken
+  = lens _alPageToken (\ s a -> s{_alPageToken = a})
+
+-- | Maximum number of albums to return in the response. The default number
+-- of albums to return at a time is 20. The maximum page size is 50.
+alPageSize :: Lens' AlbumsList (Maybe Int32)
+alPageSize
+  = lens _alPageSize (\ s a -> s{_alPageSize = a}) .
+      mapping _Coerce
+
+-- | JSONP
+alCallback :: Lens' AlbumsList (Maybe Text)
+alCallback
+  = lens _alCallback (\ s a -> s{_alCallback = a})
+
+instance GoogleRequest AlbumsList where
+        type Rs AlbumsList = ListAlbumsResponse
+        type Scopes AlbumsList =
+             '["https://www.googleapis.com/auth/drive.photos.readonly",
+               "https://www.googleapis.com/auth/photoslibrary",
+               "https://www.googleapis.com/auth/photoslibrary.readonly",
+               "https://www.googleapis.com/auth/photoslibrary.readonly.appcreateddata"]
+        requestClient AlbumsList'{..}
+          = go _alXgafv _alUploadProtocol (Just _alPp)
+              _alAccessToken
+              _alUploadType
+              _alBearerToken
+              _alPageToken
+              _alPageSize
+              _alCallback
+              (Just AltJSON)
+              photosLibraryService
+          where go
+                  = buildClient (Proxy :: Proxy AlbumsListResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/PhotosLibrary/Albums/Share.hs b/gen/Network/Google/Resource/PhotosLibrary/Albums/Share.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/PhotosLibrary/Albums/Share.hs
@@ -0,0 +1,187 @@
+{-# 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.PhotosLibrary.Albums.Share
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Marks an album as \'shared\' and accessible to other users. This action
+-- can only be performed on albums which were created by the developer via
+-- the API.
+--
+-- /See:/ <https://developers.google.com/photos/ Photos Library API Reference> for @photoslibrary.albums.share@.
+module Network.Google.Resource.PhotosLibrary.Albums.Share
+    (
+    -- * REST Resource
+      AlbumsShareResource
+
+    -- * Creating a Request
+    , albumsShare
+    , AlbumsShare
+
+    -- * Request Lenses
+    , asXgafv
+    , asAlbumId
+    , asUploadProtocol
+    , asPp
+    , asAccessToken
+    , asUploadType
+    , asPayload
+    , asBearerToken
+    , asCallback
+    ) where
+
+import           Network.Google.PhotosLibrary.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @photoslibrary.albums.share@ method which the
+-- 'AlbumsShare' request conforms to.
+type AlbumsShareResource =
+     "v1" :>
+       "albums" :>
+         CaptureMode "albumId" "share" Text :>
+           QueryParam "$.xgafv" Xgafv :>
+             QueryParam "upload_protocol" Text :>
+               QueryParam "pp" Bool :>
+                 QueryParam "access_token" Text :>
+                   QueryParam "uploadType" Text :>
+                     QueryParam "bearer_token" Text :>
+                       QueryParam "callback" Text :>
+                         QueryParam "alt" AltJSON :>
+                           ReqBody '[JSON] ShareAlbumRequest :>
+                             Post '[JSON] ShareAlbumResponse
+
+-- | Marks an album as \'shared\' and accessible to other users. This action
+-- can only be performed on albums which were created by the developer via
+-- the API.
+--
+-- /See:/ 'albumsShare' smart constructor.
+data AlbumsShare = AlbumsShare'
+    { _asXgafv          :: !(Maybe Xgafv)
+    , _asAlbumId        :: !Text
+    , _asUploadProtocol :: !(Maybe Text)
+    , _asPp             :: !Bool
+    , _asAccessToken    :: !(Maybe Text)
+    , _asUploadType     :: !(Maybe Text)
+    , _asPayload        :: !ShareAlbumRequest
+    , _asBearerToken    :: !(Maybe Text)
+    , _asCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'AlbumsShare' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'asXgafv'
+--
+-- * 'asAlbumId'
+--
+-- * 'asUploadProtocol'
+--
+-- * 'asPp'
+--
+-- * 'asAccessToken'
+--
+-- * 'asUploadType'
+--
+-- * 'asPayload'
+--
+-- * 'asBearerToken'
+--
+-- * 'asCallback'
+albumsShare
+    :: Text -- ^ 'asAlbumId'
+    -> ShareAlbumRequest -- ^ 'asPayload'
+    -> AlbumsShare
+albumsShare pAsAlbumId_ pAsPayload_ =
+    AlbumsShare'
+    { _asXgafv = Nothing
+    , _asAlbumId = pAsAlbumId_
+    , _asUploadProtocol = Nothing
+    , _asPp = True
+    , _asAccessToken = Nothing
+    , _asUploadType = Nothing
+    , _asPayload = pAsPayload_
+    , _asBearerToken = Nothing
+    , _asCallback = Nothing
+    }
+
+-- | V1 error format.
+asXgafv :: Lens' AlbumsShare (Maybe Xgafv)
+asXgafv = lens _asXgafv (\ s a -> s{_asXgafv = a})
+
+-- | Identifier of the album to be shared. This album id must belong to an
+-- album created by the developer. .
+asAlbumId :: Lens' AlbumsShare Text
+asAlbumId
+  = lens _asAlbumId (\ s a -> s{_asAlbumId = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+asUploadProtocol :: Lens' AlbumsShare (Maybe Text)
+asUploadProtocol
+  = lens _asUploadProtocol
+      (\ s a -> s{_asUploadProtocol = a})
+
+-- | Pretty-print response.
+asPp :: Lens' AlbumsShare Bool
+asPp = lens _asPp (\ s a -> s{_asPp = a})
+
+-- | OAuth access token.
+asAccessToken :: Lens' AlbumsShare (Maybe Text)
+asAccessToken
+  = lens _asAccessToken
+      (\ s a -> s{_asAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+asUploadType :: Lens' AlbumsShare (Maybe Text)
+asUploadType
+  = lens _asUploadType (\ s a -> s{_asUploadType = a})
+
+-- | Multipart request metadata.
+asPayload :: Lens' AlbumsShare ShareAlbumRequest
+asPayload
+  = lens _asPayload (\ s a -> s{_asPayload = a})
+
+-- | OAuth bearer token.
+asBearerToken :: Lens' AlbumsShare (Maybe Text)
+asBearerToken
+  = lens _asBearerToken
+      (\ s a -> s{_asBearerToken = a})
+
+-- | JSONP
+asCallback :: Lens' AlbumsShare (Maybe Text)
+asCallback
+  = lens _asCallback (\ s a -> s{_asCallback = a})
+
+instance GoogleRequest AlbumsShare where
+        type Rs AlbumsShare = ShareAlbumResponse
+        type Scopes AlbumsShare =
+             '["https://www.googleapis.com/auth/photoslibrary.sharing"]
+        requestClient AlbumsShare'{..}
+          = go _asAlbumId _asXgafv _asUploadProtocol
+              (Just _asPp)
+              _asAccessToken
+              _asUploadType
+              _asBearerToken
+              _asCallback
+              (Just AltJSON)
+              _asPayload
+              photosLibraryService
+          where go
+                  = buildClient (Proxy :: Proxy AlbumsShareResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/PhotosLibrary/MediaItems/BatchCreate.hs b/gen/Network/Google/Resource/PhotosLibrary/MediaItems/BatchCreate.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/PhotosLibrary/MediaItems/BatchCreate.hs
@@ -0,0 +1,185 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.PhotosLibrary.MediaItems.BatchCreate
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates one or more media items in a user\'s Google Photos library. If
+-- an album id is specified, the media item(s) are also added to the album.
+-- By default the media item(s) will be added to the end of the library or
+-- album. If an album id and position are both defined, then the media
+-- items will be added to the album at the specified position. If multiple
+-- media items are given, they will be inserted at the specified position.
+--
+-- /See:/ <https://developers.google.com/photos/ Photos Library API Reference> for @photoslibrary.mediaItems.batchCreate@.
+module Network.Google.Resource.PhotosLibrary.MediaItems.BatchCreate
+    (
+    -- * REST Resource
+      MediaItemsBatchCreateResource
+
+    -- * Creating a Request
+    , mediaItemsBatchCreate
+    , MediaItemsBatchCreate
+
+    -- * Request Lenses
+    , mibcXgafv
+    , mibcUploadProtocol
+    , mibcPp
+    , mibcAccessToken
+    , mibcUploadType
+    , mibcPayload
+    , mibcBearerToken
+    , mibcCallback
+    ) where
+
+import           Network.Google.PhotosLibrary.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @photoslibrary.mediaItems.batchCreate@ method which the
+-- 'MediaItemsBatchCreate' request conforms to.
+type MediaItemsBatchCreateResource =
+     "v1" :>
+       "mediaItems:batchCreate" :>
+         QueryParam "$.xgafv" Xgafv :>
+           QueryParam "upload_protocol" Text :>
+             QueryParam "pp" Bool :>
+               QueryParam "access_token" Text :>
+                 QueryParam "uploadType" Text :>
+                   QueryParam "bearer_token" Text :>
+                     QueryParam "callback" Text :>
+                       QueryParam "alt" AltJSON :>
+                         ReqBody '[JSON] BatchCreateMediaItemsRequest :>
+                           Post '[JSON] BatchCreateMediaItemsResponse
+
+-- | Creates one or more media items in a user\'s Google Photos library. If
+-- an album id is specified, the media item(s) are also added to the album.
+-- By default the media item(s) will be added to the end of the library or
+-- album. If an album id and position are both defined, then the media
+-- items will be added to the album at the specified position. If multiple
+-- media items are given, they will be inserted at the specified position.
+--
+-- /See:/ 'mediaItemsBatchCreate' smart constructor.
+data MediaItemsBatchCreate = MediaItemsBatchCreate'
+    { _mibcXgafv          :: !(Maybe Xgafv)
+    , _mibcUploadProtocol :: !(Maybe Text)
+    , _mibcPp             :: !Bool
+    , _mibcAccessToken    :: !(Maybe Text)
+    , _mibcUploadType     :: !(Maybe Text)
+    , _mibcPayload        :: !BatchCreateMediaItemsRequest
+    , _mibcBearerToken    :: !(Maybe Text)
+    , _mibcCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'MediaItemsBatchCreate' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'mibcXgafv'
+--
+-- * 'mibcUploadProtocol'
+--
+-- * 'mibcPp'
+--
+-- * 'mibcAccessToken'
+--
+-- * 'mibcUploadType'
+--
+-- * 'mibcPayload'
+--
+-- * 'mibcBearerToken'
+--
+-- * 'mibcCallback'
+mediaItemsBatchCreate
+    :: BatchCreateMediaItemsRequest -- ^ 'mibcPayload'
+    -> MediaItemsBatchCreate
+mediaItemsBatchCreate pMibcPayload_ =
+    MediaItemsBatchCreate'
+    { _mibcXgafv = Nothing
+    , _mibcUploadProtocol = Nothing
+    , _mibcPp = True
+    , _mibcAccessToken = Nothing
+    , _mibcUploadType = Nothing
+    , _mibcPayload = pMibcPayload_
+    , _mibcBearerToken = Nothing
+    , _mibcCallback = Nothing
+    }
+
+-- | V1 error format.
+mibcXgafv :: Lens' MediaItemsBatchCreate (Maybe Xgafv)
+mibcXgafv
+  = lens _mibcXgafv (\ s a -> s{_mibcXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+mibcUploadProtocol :: Lens' MediaItemsBatchCreate (Maybe Text)
+mibcUploadProtocol
+  = lens _mibcUploadProtocol
+      (\ s a -> s{_mibcUploadProtocol = a})
+
+-- | Pretty-print response.
+mibcPp :: Lens' MediaItemsBatchCreate Bool
+mibcPp = lens _mibcPp (\ s a -> s{_mibcPp = a})
+
+-- | OAuth access token.
+mibcAccessToken :: Lens' MediaItemsBatchCreate (Maybe Text)
+mibcAccessToken
+  = lens _mibcAccessToken
+      (\ s a -> s{_mibcAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+mibcUploadType :: Lens' MediaItemsBatchCreate (Maybe Text)
+mibcUploadType
+  = lens _mibcUploadType
+      (\ s a -> s{_mibcUploadType = a})
+
+-- | Multipart request metadata.
+mibcPayload :: Lens' MediaItemsBatchCreate BatchCreateMediaItemsRequest
+mibcPayload
+  = lens _mibcPayload (\ s a -> s{_mibcPayload = a})
+
+-- | OAuth bearer token.
+mibcBearerToken :: Lens' MediaItemsBatchCreate (Maybe Text)
+mibcBearerToken
+  = lens _mibcBearerToken
+      (\ s a -> s{_mibcBearerToken = a})
+
+-- | JSONP
+mibcCallback :: Lens' MediaItemsBatchCreate (Maybe Text)
+mibcCallback
+  = lens _mibcCallback (\ s a -> s{_mibcCallback = a})
+
+instance GoogleRequest MediaItemsBatchCreate where
+        type Rs MediaItemsBatchCreate =
+             BatchCreateMediaItemsResponse
+        type Scopes MediaItemsBatchCreate =
+             '["https://www.googleapis.com/auth/photoslibrary",
+               "https://www.googleapis.com/auth/photoslibrary.appendonly",
+               "https://www.googleapis.com/auth/photoslibrary.sharing"]
+        requestClient MediaItemsBatchCreate'{..}
+          = go _mibcXgafv _mibcUploadProtocol (Just _mibcPp)
+              _mibcAccessToken
+              _mibcUploadType
+              _mibcBearerToken
+              _mibcCallback
+              (Just AltJSON)
+              _mibcPayload
+              photosLibraryService
+          where go
+                  = buildClient
+                      (Proxy :: Proxy MediaItemsBatchCreateResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/PhotosLibrary/MediaItems/Get.hs b/gen/Network/Google/Resource/PhotosLibrary/MediaItems/Get.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/PhotosLibrary/MediaItems/Get.hs
@@ -0,0 +1,173 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.PhotosLibrary.MediaItems.Get
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns the media item specified based on a given media item id.
+--
+-- /See:/ <https://developers.google.com/photos/ Photos Library API Reference> for @photoslibrary.mediaItems.get@.
+module Network.Google.Resource.PhotosLibrary.MediaItems.Get
+    (
+    -- * REST Resource
+      MediaItemsGetResource
+
+    -- * Creating a Request
+    , mediaItemsGet
+    , MediaItemsGet
+
+    -- * Request Lenses
+    , migXgafv
+    , migUploadProtocol
+    , migPp
+    , migAccessToken
+    , migUploadType
+    , migMediaItemId
+    , migBearerToken
+    , migCallback
+    ) where
+
+import           Network.Google.PhotosLibrary.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @photoslibrary.mediaItems.get@ method which the
+-- 'MediaItemsGet' request conforms to.
+type MediaItemsGetResource =
+     "v1" :>
+       "mediaItems" :>
+         Capture "mediaItemId" Text :>
+           QueryParam "$.xgafv" Xgafv :>
+             QueryParam "upload_protocol" Text :>
+               QueryParam "pp" Bool :>
+                 QueryParam "access_token" Text :>
+                   QueryParam "uploadType" Text :>
+                     QueryParam "bearer_token" Text :>
+                       QueryParam "callback" Text :>
+                         QueryParam "alt" AltJSON :> Get '[JSON] MediaItem
+
+-- | Returns the media item specified based on a given media item id.
+--
+-- /See:/ 'mediaItemsGet' smart constructor.
+data MediaItemsGet = MediaItemsGet'
+    { _migXgafv          :: !(Maybe Xgafv)
+    , _migUploadProtocol :: !(Maybe Text)
+    , _migPp             :: !Bool
+    , _migAccessToken    :: !(Maybe Text)
+    , _migUploadType     :: !(Maybe Text)
+    , _migMediaItemId    :: !Text
+    , _migBearerToken    :: !(Maybe Text)
+    , _migCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'MediaItemsGet' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'migXgafv'
+--
+-- * 'migUploadProtocol'
+--
+-- * 'migPp'
+--
+-- * 'migAccessToken'
+--
+-- * 'migUploadType'
+--
+-- * 'migMediaItemId'
+--
+-- * 'migBearerToken'
+--
+-- * 'migCallback'
+mediaItemsGet
+    :: Text -- ^ 'migMediaItemId'
+    -> MediaItemsGet
+mediaItemsGet pMigMediaItemId_ =
+    MediaItemsGet'
+    { _migXgafv = Nothing
+    , _migUploadProtocol = Nothing
+    , _migPp = True
+    , _migAccessToken = Nothing
+    , _migUploadType = Nothing
+    , _migMediaItemId = pMigMediaItemId_
+    , _migBearerToken = Nothing
+    , _migCallback = Nothing
+    }
+
+-- | V1 error format.
+migXgafv :: Lens' MediaItemsGet (Maybe Xgafv)
+migXgafv = lens _migXgafv (\ s a -> s{_migXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+migUploadProtocol :: Lens' MediaItemsGet (Maybe Text)
+migUploadProtocol
+  = lens _migUploadProtocol
+      (\ s a -> s{_migUploadProtocol = a})
+
+-- | Pretty-print response.
+migPp :: Lens' MediaItemsGet Bool
+migPp = lens _migPp (\ s a -> s{_migPp = a})
+
+-- | OAuth access token.
+migAccessToken :: Lens' MediaItemsGet (Maybe Text)
+migAccessToken
+  = lens _migAccessToken
+      (\ s a -> s{_migAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+migUploadType :: Lens' MediaItemsGet (Maybe Text)
+migUploadType
+  = lens _migUploadType
+      (\ s a -> s{_migUploadType = a})
+
+-- | Identifier of media item to be requested.
+migMediaItemId :: Lens' MediaItemsGet Text
+migMediaItemId
+  = lens _migMediaItemId
+      (\ s a -> s{_migMediaItemId = a})
+
+-- | OAuth bearer token.
+migBearerToken :: Lens' MediaItemsGet (Maybe Text)
+migBearerToken
+  = lens _migBearerToken
+      (\ s a -> s{_migBearerToken = a})
+
+-- | JSONP
+migCallback :: Lens' MediaItemsGet (Maybe Text)
+migCallback
+  = lens _migCallback (\ s a -> s{_migCallback = a})
+
+instance GoogleRequest MediaItemsGet where
+        type Rs MediaItemsGet = MediaItem
+        type Scopes MediaItemsGet =
+             '["https://www.googleapis.com/auth/drive.photos.readonly",
+               "https://www.googleapis.com/auth/photoslibrary",
+               "https://www.googleapis.com/auth/photoslibrary.readonly",
+               "https://www.googleapis.com/auth/photoslibrary.readonly.appcreateddata"]
+        requestClient MediaItemsGet'{..}
+          = go _migMediaItemId _migXgafv _migUploadProtocol
+              (Just _migPp)
+              _migAccessToken
+              _migUploadType
+              _migBearerToken
+              _migCallback
+              (Just AltJSON)
+              photosLibraryService
+          where go
+                  = buildClient (Proxy :: Proxy MediaItemsGetResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/PhotosLibrary/MediaItems/Search.hs b/gen/Network/Google/Resource/PhotosLibrary/MediaItems/Search.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/PhotosLibrary/MediaItems/Search.hs
@@ -0,0 +1,184 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.PhotosLibrary.MediaItems.Search
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Searches for media items in a user\'s Google Photos library. If no
+-- filters are set, then all media items in the user\'s library will be
+-- returned. If an album is set, all media items in the specified album
+-- will be returned. If filters are specified, anything that matches the
+-- filters from the user\'s library will be listed. If an album and filters
+-- are set, then this will result in an error.
+--
+-- /See:/ <https://developers.google.com/photos/ Photos Library API Reference> for @photoslibrary.mediaItems.search@.
+module Network.Google.Resource.PhotosLibrary.MediaItems.Search
+    (
+    -- * REST Resource
+      MediaItemsSearchResource
+
+    -- * Creating a Request
+    , mediaItemsSearch
+    , MediaItemsSearch
+
+    -- * Request Lenses
+    , misXgafv
+    , misUploadProtocol
+    , misPp
+    , misAccessToken
+    , misUploadType
+    , misPayload
+    , misBearerToken
+    , misCallback
+    ) where
+
+import           Network.Google.PhotosLibrary.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @photoslibrary.mediaItems.search@ method which the
+-- 'MediaItemsSearch' request conforms to.
+type MediaItemsSearchResource =
+     "v1" :>
+       "mediaItems:search" :>
+         QueryParam "$.xgafv" Xgafv :>
+           QueryParam "upload_protocol" Text :>
+             QueryParam "pp" Bool :>
+               QueryParam "access_token" Text :>
+                 QueryParam "uploadType" Text :>
+                   QueryParam "bearer_token" Text :>
+                     QueryParam "callback" Text :>
+                       QueryParam "alt" AltJSON :>
+                         ReqBody '[JSON] SearchMediaItemsRequest :>
+                           Post '[JSON] SearchMediaItemsResponse
+
+-- | Searches for media items in a user\'s Google Photos library. If no
+-- filters are set, then all media items in the user\'s library will be
+-- returned. If an album is set, all media items in the specified album
+-- will be returned. If filters are specified, anything that matches the
+-- filters from the user\'s library will be listed. If an album and filters
+-- are set, then this will result in an error.
+--
+-- /See:/ 'mediaItemsSearch' smart constructor.
+data MediaItemsSearch = MediaItemsSearch'
+    { _misXgafv          :: !(Maybe Xgafv)
+    , _misUploadProtocol :: !(Maybe Text)
+    , _misPp             :: !Bool
+    , _misAccessToken    :: !(Maybe Text)
+    , _misUploadType     :: !(Maybe Text)
+    , _misPayload        :: !SearchMediaItemsRequest
+    , _misBearerToken    :: !(Maybe Text)
+    , _misCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'MediaItemsSearch' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'misXgafv'
+--
+-- * 'misUploadProtocol'
+--
+-- * 'misPp'
+--
+-- * 'misAccessToken'
+--
+-- * 'misUploadType'
+--
+-- * 'misPayload'
+--
+-- * 'misBearerToken'
+--
+-- * 'misCallback'
+mediaItemsSearch
+    :: SearchMediaItemsRequest -- ^ 'misPayload'
+    -> MediaItemsSearch
+mediaItemsSearch pMisPayload_ =
+    MediaItemsSearch'
+    { _misXgafv = Nothing
+    , _misUploadProtocol = Nothing
+    , _misPp = True
+    , _misAccessToken = Nothing
+    , _misUploadType = Nothing
+    , _misPayload = pMisPayload_
+    , _misBearerToken = Nothing
+    , _misCallback = Nothing
+    }
+
+-- | V1 error format.
+misXgafv :: Lens' MediaItemsSearch (Maybe Xgafv)
+misXgafv = lens _misXgafv (\ s a -> s{_misXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+misUploadProtocol :: Lens' MediaItemsSearch (Maybe Text)
+misUploadProtocol
+  = lens _misUploadProtocol
+      (\ s a -> s{_misUploadProtocol = a})
+
+-- | Pretty-print response.
+misPp :: Lens' MediaItemsSearch Bool
+misPp = lens _misPp (\ s a -> s{_misPp = a})
+
+-- | OAuth access token.
+misAccessToken :: Lens' MediaItemsSearch (Maybe Text)
+misAccessToken
+  = lens _misAccessToken
+      (\ s a -> s{_misAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+misUploadType :: Lens' MediaItemsSearch (Maybe Text)
+misUploadType
+  = lens _misUploadType
+      (\ s a -> s{_misUploadType = a})
+
+-- | Multipart request metadata.
+misPayload :: Lens' MediaItemsSearch SearchMediaItemsRequest
+misPayload
+  = lens _misPayload (\ s a -> s{_misPayload = a})
+
+-- | OAuth bearer token.
+misBearerToken :: Lens' MediaItemsSearch (Maybe Text)
+misBearerToken
+  = lens _misBearerToken
+      (\ s a -> s{_misBearerToken = a})
+
+-- | JSONP
+misCallback :: Lens' MediaItemsSearch (Maybe Text)
+misCallback
+  = lens _misCallback (\ s a -> s{_misCallback = a})
+
+instance GoogleRequest MediaItemsSearch where
+        type Rs MediaItemsSearch = SearchMediaItemsResponse
+        type Scopes MediaItemsSearch =
+             '["https://www.googleapis.com/auth/drive.photos.readonly",
+               "https://www.googleapis.com/auth/photoslibrary",
+               "https://www.googleapis.com/auth/photoslibrary.readonly",
+               "https://www.googleapis.com/auth/photoslibrary.readonly.appcreateddata"]
+        requestClient MediaItemsSearch'{..}
+          = go _misXgafv _misUploadProtocol (Just _misPp)
+              _misAccessToken
+              _misUploadType
+              _misBearerToken
+              _misCallback
+              (Just AltJSON)
+              _misPayload
+              photosLibraryService
+          where go
+                  = buildClient
+                      (Proxy :: Proxy MediaItemsSearchResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/PhotosLibrary/SharedAlbums/Join.hs b/gen/Network/Google/Resource/PhotosLibrary/SharedAlbums/Join.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/PhotosLibrary/SharedAlbums/Join.hs
@@ -0,0 +1,171 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.PhotosLibrary.SharedAlbums.Join
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Joins a shared album on behalf of the Google Photos user.
+--
+-- /See:/ <https://developers.google.com/photos/ Photos Library API Reference> for @photoslibrary.sharedAlbums.join@.
+module Network.Google.Resource.PhotosLibrary.SharedAlbums.Join
+    (
+    -- * REST Resource
+      SharedAlbumsJoinResource
+
+    -- * Creating a Request
+    , sharedAlbumsJoin
+    , SharedAlbumsJoin
+
+    -- * Request Lenses
+    , sajXgafv
+    , sajUploadProtocol
+    , sajPp
+    , sajAccessToken
+    , sajUploadType
+    , sajPayload
+    , sajBearerToken
+    , sajCallback
+    ) where
+
+import           Network.Google.PhotosLibrary.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @photoslibrary.sharedAlbums.join@ method which the
+-- 'SharedAlbumsJoin' request conforms to.
+type SharedAlbumsJoinResource =
+     "v1" :>
+       "sharedAlbums:join" :>
+         QueryParam "$.xgafv" Xgafv :>
+           QueryParam "upload_protocol" Text :>
+             QueryParam "pp" Bool :>
+               QueryParam "access_token" Text :>
+                 QueryParam "uploadType" Text :>
+                   QueryParam "bearer_token" Text :>
+                     QueryParam "callback" Text :>
+                       QueryParam "alt" AltJSON :>
+                         ReqBody '[JSON] JoinSharedAlbumRequest :>
+                           Post '[JSON] JoinSharedAlbumResponse
+
+-- | Joins a shared album on behalf of the Google Photos user.
+--
+-- /See:/ 'sharedAlbumsJoin' smart constructor.
+data SharedAlbumsJoin = SharedAlbumsJoin'
+    { _sajXgafv          :: !(Maybe Xgafv)
+    , _sajUploadProtocol :: !(Maybe Text)
+    , _sajPp             :: !Bool
+    , _sajAccessToken    :: !(Maybe Text)
+    , _sajUploadType     :: !(Maybe Text)
+    , _sajPayload        :: !JoinSharedAlbumRequest
+    , _sajBearerToken    :: !(Maybe Text)
+    , _sajCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SharedAlbumsJoin' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sajXgafv'
+--
+-- * 'sajUploadProtocol'
+--
+-- * 'sajPp'
+--
+-- * 'sajAccessToken'
+--
+-- * 'sajUploadType'
+--
+-- * 'sajPayload'
+--
+-- * 'sajBearerToken'
+--
+-- * 'sajCallback'
+sharedAlbumsJoin
+    :: JoinSharedAlbumRequest -- ^ 'sajPayload'
+    -> SharedAlbumsJoin
+sharedAlbumsJoin pSajPayload_ =
+    SharedAlbumsJoin'
+    { _sajXgafv = Nothing
+    , _sajUploadProtocol = Nothing
+    , _sajPp = True
+    , _sajAccessToken = Nothing
+    , _sajUploadType = Nothing
+    , _sajPayload = pSajPayload_
+    , _sajBearerToken = Nothing
+    , _sajCallback = Nothing
+    }
+
+-- | V1 error format.
+sajXgafv :: Lens' SharedAlbumsJoin (Maybe Xgafv)
+sajXgafv = lens _sajXgafv (\ s a -> s{_sajXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+sajUploadProtocol :: Lens' SharedAlbumsJoin (Maybe Text)
+sajUploadProtocol
+  = lens _sajUploadProtocol
+      (\ s a -> s{_sajUploadProtocol = a})
+
+-- | Pretty-print response.
+sajPp :: Lens' SharedAlbumsJoin Bool
+sajPp = lens _sajPp (\ s a -> s{_sajPp = a})
+
+-- | OAuth access token.
+sajAccessToken :: Lens' SharedAlbumsJoin (Maybe Text)
+sajAccessToken
+  = lens _sajAccessToken
+      (\ s a -> s{_sajAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+sajUploadType :: Lens' SharedAlbumsJoin (Maybe Text)
+sajUploadType
+  = lens _sajUploadType
+      (\ s a -> s{_sajUploadType = a})
+
+-- | Multipart request metadata.
+sajPayload :: Lens' SharedAlbumsJoin JoinSharedAlbumRequest
+sajPayload
+  = lens _sajPayload (\ s a -> s{_sajPayload = a})
+
+-- | OAuth bearer token.
+sajBearerToken :: Lens' SharedAlbumsJoin (Maybe Text)
+sajBearerToken
+  = lens _sajBearerToken
+      (\ s a -> s{_sajBearerToken = a})
+
+-- | JSONP
+sajCallback :: Lens' SharedAlbumsJoin (Maybe Text)
+sajCallback
+  = lens _sajCallback (\ s a -> s{_sajCallback = a})
+
+instance GoogleRequest SharedAlbumsJoin where
+        type Rs SharedAlbumsJoin = JoinSharedAlbumResponse
+        type Scopes SharedAlbumsJoin =
+             '["https://www.googleapis.com/auth/photoslibrary.sharing"]
+        requestClient SharedAlbumsJoin'{..}
+          = go _sajXgafv _sajUploadProtocol (Just _sajPp)
+              _sajAccessToken
+              _sajUploadType
+              _sajBearerToken
+              _sajCallback
+              (Just AltJSON)
+              _sajPayload
+              photosLibraryService
+          where go
+                  = buildClient
+                      (Proxy :: Proxy SharedAlbumsJoinResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/PhotosLibrary/SharedAlbums/List.hs b/gen/Network/Google/Resource/PhotosLibrary/SharedAlbums/List.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/PhotosLibrary/SharedAlbums/List.hs
@@ -0,0 +1,192 @@
+{-# 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.PhotosLibrary.SharedAlbums.List
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists all shared albums shown to a user in the \'Sharing\' tab of the
+-- Google Photos app.
+--
+-- /See:/ <https://developers.google.com/photos/ Photos Library API Reference> for @photoslibrary.sharedAlbums.list@.
+module Network.Google.Resource.PhotosLibrary.SharedAlbums.List
+    (
+    -- * REST Resource
+      SharedAlbumsListResource
+
+    -- * Creating a Request
+    , sharedAlbumsList
+    , SharedAlbumsList
+
+    -- * Request Lenses
+    , salXgafv
+    , salUploadProtocol
+    , salPp
+    , salAccessToken
+    , salUploadType
+    , salBearerToken
+    , salPageToken
+    , salPageSize
+    , salCallback
+    ) where
+
+import           Network.Google.PhotosLibrary.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @photoslibrary.sharedAlbums.list@ method which the
+-- 'SharedAlbumsList' request conforms to.
+type SharedAlbumsListResource =
+     "v1" :>
+       "sharedAlbums" :>
+         QueryParam "$.xgafv" Xgafv :>
+           QueryParam "upload_protocol" Text :>
+             QueryParam "pp" Bool :>
+               QueryParam "access_token" Text :>
+                 QueryParam "uploadType" Text :>
+                   QueryParam "bearer_token" Text :>
+                     QueryParam "pageToken" Text :>
+                       QueryParam "pageSize" (Textual Int32) :>
+                         QueryParam "callback" Text :>
+                           QueryParam "alt" AltJSON :>
+                             Get '[JSON] ListSharedAlbumsResponse
+
+-- | Lists all shared albums shown to a user in the \'Sharing\' tab of the
+-- Google Photos app.
+--
+-- /See:/ 'sharedAlbumsList' smart constructor.
+data SharedAlbumsList = SharedAlbumsList'
+    { _salXgafv          :: !(Maybe Xgafv)
+    , _salUploadProtocol :: !(Maybe Text)
+    , _salPp             :: !Bool
+    , _salAccessToken    :: !(Maybe Text)
+    , _salUploadType     :: !(Maybe Text)
+    , _salBearerToken    :: !(Maybe Text)
+    , _salPageToken      :: !(Maybe Text)
+    , _salPageSize       :: !(Maybe (Textual Int32))
+    , _salCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SharedAlbumsList' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'salXgafv'
+--
+-- * 'salUploadProtocol'
+--
+-- * 'salPp'
+--
+-- * 'salAccessToken'
+--
+-- * 'salUploadType'
+--
+-- * 'salBearerToken'
+--
+-- * 'salPageToken'
+--
+-- * 'salPageSize'
+--
+-- * 'salCallback'
+sharedAlbumsList
+    :: SharedAlbumsList
+sharedAlbumsList =
+    SharedAlbumsList'
+    { _salXgafv = Nothing
+    , _salUploadProtocol = Nothing
+    , _salPp = True
+    , _salAccessToken = Nothing
+    , _salUploadType = Nothing
+    , _salBearerToken = Nothing
+    , _salPageToken = Nothing
+    , _salPageSize = Nothing
+    , _salCallback = Nothing
+    }
+
+-- | V1 error format.
+salXgafv :: Lens' SharedAlbumsList (Maybe Xgafv)
+salXgafv = lens _salXgafv (\ s a -> s{_salXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+salUploadProtocol :: Lens' SharedAlbumsList (Maybe Text)
+salUploadProtocol
+  = lens _salUploadProtocol
+      (\ s a -> s{_salUploadProtocol = a})
+
+-- | Pretty-print response.
+salPp :: Lens' SharedAlbumsList Bool
+salPp = lens _salPp (\ s a -> s{_salPp = a})
+
+-- | OAuth access token.
+salAccessToken :: Lens' SharedAlbumsList (Maybe Text)
+salAccessToken
+  = lens _salAccessToken
+      (\ s a -> s{_salAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+salUploadType :: Lens' SharedAlbumsList (Maybe Text)
+salUploadType
+  = lens _salUploadType
+      (\ s a -> s{_salUploadType = a})
+
+-- | OAuth bearer token.
+salBearerToken :: Lens' SharedAlbumsList (Maybe Text)
+salBearerToken
+  = lens _salBearerToken
+      (\ s a -> s{_salBearerToken = a})
+
+-- | A continuation token to get the next page of the results. Adding this to
+-- the request will return the rows after the pageToken. The pageToken
+-- should be the value returned in the nextPageToken parameter in the
+-- response to the listSharedAlbums request.
+salPageToken :: Lens' SharedAlbumsList (Maybe Text)
+salPageToken
+  = lens _salPageToken (\ s a -> s{_salPageToken = a})
+
+-- | Maximum number of albums to return in the response. The default number
+-- of albums to return at a time is 20. The maximum page size is 50.
+salPageSize :: Lens' SharedAlbumsList (Maybe Int32)
+salPageSize
+  = lens _salPageSize (\ s a -> s{_salPageSize = a}) .
+      mapping _Coerce
+
+-- | JSONP
+salCallback :: Lens' SharedAlbumsList (Maybe Text)
+salCallback
+  = lens _salCallback (\ s a -> s{_salCallback = a})
+
+instance GoogleRequest SharedAlbumsList where
+        type Rs SharedAlbumsList = ListSharedAlbumsResponse
+        type Scopes SharedAlbumsList =
+             '["https://www.googleapis.com/auth/drive.photos.readonly",
+               "https://www.googleapis.com/auth/photoslibrary",
+               "https://www.googleapis.com/auth/photoslibrary.readonly",
+               "https://www.googleapis.com/auth/photoslibrary.readonly.appcreateddata"]
+        requestClient SharedAlbumsList'{..}
+          = go _salXgafv _salUploadProtocol (Just _salPp)
+              _salAccessToken
+              _salUploadType
+              _salBearerToken
+              _salPageToken
+              _salPageSize
+              _salCallback
+              (Just AltJSON)
+              photosLibraryService
+          where go
+                  = buildClient
+                      (Proxy :: Proxy SharedAlbumsListResource)
+                      mempty
diff --git a/gogol-photoslibrary.cabal b/gogol-photoslibrary.cabal
new file mode 100644
--- /dev/null
+++ b/gogol-photoslibrary.cabal
@@ -0,0 +1,55 @@
+name:                  gogol-photoslibrary
+version:               0.4.0
+synopsis:              Google Photos Library SDK.
+homepage:              https://github.com/brendanhay/gogol
+bug-reports:           https://github.com/brendanhay/gogol/issues
+license:               OtherLicense
+license-file:          LICENSE
+author:                Brendan Hay
+maintainer:            Brendan Hay <brendan.g.hay@gmail.com>
+copyright:             Copyright (c) 2015-2016 Brendan Hay
+category:              Network, Google, Cloud
+build-type:            Simple
+cabal-version:         >= 1.10
+extra-source-files:    README.md src/.gitkeep
+
+description:
+    Manage photos, videos, and albums in Google Photos
+    .
+    /Warning:/ This is an experimental prototype/preview release which is still
+    under exploratory development and not intended for public use, caveat emptor!
+    .
+    This library is compatible with version @v1@
+    of the API.
+
+source-repository head
+    type:     git
+    location: git://github.com/brendanhay/gogol.git
+
+library
+    default-language:  Haskell2010
+    hs-source-dirs:    src gen
+
+    ghc-options:       -Wall
+
+    exposed-modules:
+          Network.Google.PhotosLibrary
+        , Network.Google.PhotosLibrary.Types
+        , Network.Google.Resource.PhotosLibrary.Albums.AddEnrichment
+        , Network.Google.Resource.PhotosLibrary.Albums.Create
+        , Network.Google.Resource.PhotosLibrary.Albums.Get
+        , Network.Google.Resource.PhotosLibrary.Albums.List
+        , Network.Google.Resource.PhotosLibrary.Albums.Share
+        , Network.Google.Resource.PhotosLibrary.MediaItems.BatchCreate
+        , Network.Google.Resource.PhotosLibrary.MediaItems.Get
+        , Network.Google.Resource.PhotosLibrary.MediaItems.Search
+        , Network.Google.Resource.PhotosLibrary.SharedAlbums.Join
+        , Network.Google.Resource.PhotosLibrary.SharedAlbums.List
+
+    other-modules:
+          Network.Google.PhotosLibrary.Types.Product
+        , Network.Google.PhotosLibrary.Types.Sum
+
+    build-depends:
+          gogol-core == 0.4.0.*
+        , base       >= 4.7 && < 5
diff --git a/src/.gitkeep b/src/.gitkeep
new file mode 100644
--- /dev/null
+++ b/src/.gitkeep
