diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,373 @@
+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.
+
+Exhibit B - "Incompatible With Secondary Licenses" Notice
+---------------------------------------------------------
+
+  This Source Code Form is "Incompatible With Secondary Licenses", as
+  defined by the Mozilla Public License, v. 2.0.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,42 @@
+# Amazon Elastic File System SDK
+
+* [Version](#version)
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+
+## Version
+
+`1.0.0`
+
+
+## Description
+
+Amazon Elastic File System
+
+Documentation is available via [Hackage](http://hackage.haskell.org/package/amazonka-efs)
+and the [AWS API Reference](http://docs.aws.amazon.com/elasticfilesystem/latest/devguide/welcome.html).
+
+The types from this library are intended to be used with [amazonka](http://hackage.haskell.org/package/amazonka),
+which provides mechanisms for specifying AuthN/AuthZ information and sending requests.
+
+Use of lenses is required for constructing and manipulating types.
+This is due to the amount of nesting of AWS types and transparency regarding
+de/serialisation into more palatable Haskell values.
+The provided lenses should be compatible with any of the major lens libraries
+[lens](http://hackage.haskell.org/package/lens) or [lens-family-core](http://hackage.haskell.org/package/lens-family-core).
+
+## Contribute
+
+For any problems, comments, or feedback please create an issue [here on GitHub](https://github.com/brendanhay/amazonka/issues).
+
+> _Note:_ this library is an auto-generated Haskell package. Please see `amazonka-gen` for more information.
+
+
+## Licence
+
+`amazonka-efs` is released under the [Mozilla Public License Version 2.0](http://www.mozilla.org/MPL/).
+
+Parts of the code are derived from AWS service descriptions, licensed under Apache 2.0.
+Source files subject to this contain an additional licensing clause in their header.
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/amazonka-efs.cabal b/amazonka-efs.cabal
new file mode 100644
--- /dev/null
+++ b/amazonka-efs.cabal
@@ -0,0 +1,92 @@
+name:                  amazonka-efs
+version:               1.0.0
+synopsis:              Amazon Elastic File System SDK.
+homepage:              https://github.com/brendanhay/amazonka
+license:               OtherLicense
+license-file:          LICENSE
+author:                Brendan Hay
+maintainer:            Brendan Hay <brendan.g.hay@gmail.com>
+copyright:             Copyright (c) 2013-2015 Brendan Hay
+category:              Network, AWS, Cloud, Distributed Computing
+build-type:            Simple
+extra-source-files:    README.md
+cabal-version:         >= 1.10
+
+description:
+    Amazon Elastic File System
+    .
+    The types from this library are intended to be used with
+    <http://hackage.haskell.org/package/amazonka amazonka>, which provides
+    mechanisms for specifying AuthN/AuthZ information and sending requests.
+    .
+    Use of lenses is required for constructing and manipulating types.
+    This is due to the amount of nesting of AWS types and transparency regarding
+    de/serialisation into more palatable Haskell values.
+    The provided lenses should be compatible with any of the major lens libraries
+    such as <http://hackage.haskell.org/package/lens lens> or
+    <http://hackage.haskell.org/package/lens-family-core lens-family-core>.
+    .
+    See "Network.AWS.EFS" and the <http://docs.aws.amazon.com/elasticfilesystem/latest/devguide/welcome.html AWS API Reference>
+    to get started.
+
+source-repository head
+    type:     git
+    location: git://github.com/brendanhay/amazonka.git
+
+library
+    default-language:  Haskell2010
+    hs-source-dirs:    src gen
+
+    ghc-options:       -Wall
+
+    exposed-modules:
+          Network.AWS.EFS
+        , Network.AWS.EFS.CreateFileSystem
+        , Network.AWS.EFS.CreateMountTarget
+        , Network.AWS.EFS.CreateTags
+        , Network.AWS.EFS.DeleteFileSystem
+        , Network.AWS.EFS.DeleteMountTarget
+        , Network.AWS.EFS.DeleteTags
+        , Network.AWS.EFS.DescribeFileSystems
+        , Network.AWS.EFS.DescribeMountTargetSecurityGroups
+        , Network.AWS.EFS.DescribeMountTargets
+        , Network.AWS.EFS.DescribeTags
+        , Network.AWS.EFS.ModifyMountTargetSecurityGroups
+        , Network.AWS.EFS.Types
+        , Network.AWS.EFS.Waiters
+
+    other-modules:
+          Network.AWS.EFS.Types.Product
+        , Network.AWS.EFS.Types.Sum
+
+    build-depends:
+          amazonka-core == 1.0.0.*
+        , base          >= 4.7     && < 5
+
+test-suite amazonka-efs-test
+    type:              exitcode-stdio-1.0
+    default-language:  Haskell2010
+    hs-source-dirs:    test
+    main-is:           Main.hs
+
+    ghc-options:       -Wall -threaded
+
+    -- This is not comprehensive if modules have manually been added.
+    -- It exists to ensure cabal 'somewhat' detects test module changes.
+    other-modules:
+          Test.AWS.EFS
+        , Test.AWS.Gen.EFS
+        , Test.AWS.EFS.Internal
+
+    build-depends:
+          amazonka-core == 1.0.0
+        , amazonka-test == 1.0.0
+        , amazonka-efs == 1.0.0
+        , base
+        , bytestring
+        , lens
+        , tasty
+        , tasty-hunit
+        , text
+        , time
+        , unordered-containers
diff --git a/gen/Network/AWS/EFS.hs b/gen/Network/AWS/EFS.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/EFS.hs
@@ -0,0 +1,201 @@
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.EFS
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Amazon Elastic File System
+--
+-- /See:/ <http://docs.aws.amazon.com/elasticfilesystem/latest/devguide/welcome.html AWS API Reference>
+module Network.AWS.EFS
+    (
+    -- * Service
+      EFS
+
+    -- * Errors
+    -- $errors
+
+    -- ** MountTargetNotFound
+    , _MountTargetNotFound
+
+    -- ** SecurityGroupLimitExceeded
+    , _SecurityGroupLimitExceeded
+
+    -- ** MountTargetConflict
+    , _MountTargetConflict
+
+    -- ** UnsupportedAvailabilityZone
+    , _UnsupportedAvailabilityZone
+
+    -- ** SecurityGroupNotFound
+    , _SecurityGroupNotFound
+
+    -- ** FileSystemAlreadyExists
+    , _FileSystemAlreadyExists
+
+    -- ** FileSystemLimitExceeded
+    , _FileSystemLimitExceeded
+
+    -- ** NetworkInterfaceLimitExceeded
+    , _NetworkInterfaceLimitExceeded
+
+    -- ** FileSystemNotFound
+    , _FileSystemNotFound
+
+    -- ** SubnetNotFound
+    , _SubnetNotFound
+
+    -- ** IncorrectFileSystemLifeCycleState
+    , _IncorrectFileSystemLifeCycleState
+
+    -- ** BadRequest
+    , _BadRequest
+
+    -- ** NoFreeAddressesInSubnet
+    , _NoFreeAddressesInSubnet
+
+    -- ** DependencyTimeout
+    , _DependencyTimeout
+
+    -- ** FileSystemInUse
+    , _FileSystemInUse
+
+    -- ** IncorrectMountTargetState
+    , _IncorrectMountTargetState
+
+    -- ** InternalServerError
+    , _InternalServerError
+
+    -- ** IPAddressInUse
+    , _IPAddressInUse
+
+    -- * Waiters
+    -- $waiters
+
+    -- * Operations
+    -- $operations
+
+    -- ** DescribeTags
+    , module Network.AWS.EFS.DescribeTags
+
+    -- ** DescribeMountTargets
+    , module Network.AWS.EFS.DescribeMountTargets
+
+    -- ** DeleteMountTarget
+    , module Network.AWS.EFS.DeleteMountTarget
+
+    -- ** CreateTags
+    , module Network.AWS.EFS.CreateTags
+
+    -- ** DescribeFileSystems
+    , module Network.AWS.EFS.DescribeFileSystems
+
+    -- ** DeleteTags
+    , module Network.AWS.EFS.DeleteTags
+
+    -- ** DescribeMountTargetSecurityGroups
+    , module Network.AWS.EFS.DescribeMountTargetSecurityGroups
+
+    -- ** ModifyMountTargetSecurityGroups
+    , module Network.AWS.EFS.ModifyMountTargetSecurityGroups
+
+    -- ** CreateFileSystem
+    , module Network.AWS.EFS.CreateFileSystem
+
+    -- ** DeleteFileSystem
+    , module Network.AWS.EFS.DeleteFileSystem
+
+    -- ** CreateMountTarget
+    , module Network.AWS.EFS.CreateMountTarget
+
+    -- * Types
+
+    -- ** LifeCycleState
+    , LifeCycleState (..)
+
+    -- ** FileSystemDescription
+    , FileSystemDescription
+    , fileSystemDescription
+    , fsdName
+    , fsdOwnerId
+    , fsdCreationToken
+    , fsdFileSystemId
+    , fsdCreationTime
+    , fsdLifeCycleState
+    , fsdNumberOfMountTargets
+    , fsdSizeInBytes
+
+    -- ** FileSystemSize
+    , FileSystemSize
+    , fileSystemSize
+    , fssTimestamp
+    , fssValue
+
+    -- ** MountTargetDescription
+    , MountTargetDescription
+    , mountTargetDescription
+    , mtdIPAddress
+    , mtdNetworkInterfaceId
+    , mtdOwnerId
+    , mtdMountTargetId
+    , mtdFileSystemId
+    , mtdSubnetId
+    , mtdLifeCycleState
+
+    -- ** Tag
+    , Tag
+    , tag
+    , tagKey
+    , tagValue
+    ) where
+
+import           Network.AWS.EFS.CreateFileSystem
+import           Network.AWS.EFS.CreateMountTarget
+import           Network.AWS.EFS.CreateTags
+import           Network.AWS.EFS.DeleteFileSystem
+import           Network.AWS.EFS.DeleteMountTarget
+import           Network.AWS.EFS.DeleteTags
+import           Network.AWS.EFS.DescribeFileSystems
+import           Network.AWS.EFS.DescribeMountTargets
+import           Network.AWS.EFS.DescribeMountTargetSecurityGroups
+import           Network.AWS.EFS.DescribeTags
+import           Network.AWS.EFS.ModifyMountTargetSecurityGroups
+import           Network.AWS.EFS.Types
+import           Network.AWS.EFS.Waiters
+
+{- $errors
+Error matchers are designed for use with the functions provided by
+<http://hackage.haskell.org/package/lens/docs/Control-Exception-Lens.html Control.Exception.Lens>.
+This allows catching (and rethrowing) service specific errors returned
+by 'EFS'.
+-}
+
+{- $operations
+Some AWS operations return results that are incomplete and require subsequent
+requests in order to obtain the entire result set. The process of sending
+subsequent requests to continue where a previous request left off is called
+pagination. For example, the 'ListObjects' operation of Amazon S3 returns up to
+1000 objects at a time, and you must send subsequent requests with the
+appropriate Marker in order to retrieve the next page of results.
+
+Operations that have an 'AWSPager' instance can transparently perform subsequent
+requests, correctly setting Markers and other request facets to iterate through
+the entire result set of a truncated API operation. Operations which support
+this have an additional note in the documentation.
+
+Many operations have the ability to filter results on the server side. See the
+individual operation parameters for details.
+-}
+
+{- $waiters
+Waiters poll by repeatedly sending a request until some remote success condition
+configured by the 'Wait' specification is fulfilled. The 'Wait' specification
+determines how many attempts should be made, in addition to delay and retry strategies.
+-}
diff --git a/gen/Network/AWS/EFS/CreateFileSystem.hs b/gen/Network/AWS/EFS/CreateFileSystem.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/EFS/CreateFileSystem.hs
@@ -0,0 +1,131 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.EFS.CreateFileSystem
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a new, empty file system. The operation requires a creation
+-- token in the request that Amazon EFS uses to ensure idempotent creation
+-- (calling the operation with same creation token has no effect). If a
+-- file system does not currently exist that is owned by the caller\'s AWS
+-- account with the specified creation token, this operation does the
+-- following:
+--
+-- -   Creates a new, empty file system. The file system will have an
+--     Amazon EFS assigned ID, and an initial lifecycle state \"creating\".
+-- -   Returns with the description of the created file system.
+--
+-- Otherwise, this operation returns a 'FileSystemAlreadyExists' error with
+-- the ID of the existing file system.
+--
+-- For basic use cases, you can use a randomly generated UUID for the
+-- creation token.
+--
+-- The idempotent operation allows you to retry a 'CreateFileSystem' call
+-- without risk of creating an extra file system. This can happen when an
+-- initial call fails in a way that leaves it uncertain whether or not a
+-- file system was actually created. An example might be that a transport
+-- level timeout occurred or your connection was reset. As long as you use
+-- the same creation token, if the initial call had succeeded in creating a
+-- file system, the client can learn of its existence from the
+-- 'FileSystemAlreadyExists' error.
+--
+-- The 'CreateFileSystem' call returns while the file system\'s lifecycle
+-- state is still \"creating\". You can check the file system creation
+-- status by calling the DescribeFileSystems API, which among other things
+-- returns the file system state.
+--
+-- After the file system is fully created, Amazon EFS sets its lifecycle
+-- state to \"available\", at which point you can create one or more mount
+-- targets for the file system (CreateMountTarget) in your VPC. You mount
+-- your Amazon EFS file system on an EC2 instances in your VPC via the
+-- mount target. For more information, see
+-- <http://docs.aws.amazon.com/efs/latest/ug/how-it-works.html Amazon EFS: How it Works>
+--
+-- This operation requires permission for the
+-- 'elasticfilesystem:CreateFileSystem' action.
+--
+-- /See:/ <http://docs.aws.amazon.com/directoryservice/latest/devguide/API_CreateFileSystem.html AWS API Reference> for CreateFileSystem.
+module Network.AWS.EFS.CreateFileSystem
+    (
+    -- * Creating a Request
+      createFileSystem
+    , CreateFileSystem
+    -- * Request Lenses
+    , cfsCreationToken
+
+    -- * Destructuring the Response
+    , fileSystemDescription
+    , FileSystemDescription
+    -- * Response Lenses
+    , fsdName
+    , fsdOwnerId
+    , fsdCreationToken
+    , fsdFileSystemId
+    , fsdCreationTime
+    , fsdLifeCycleState
+    , fsdNumberOfMountTargets
+    , fsdSizeInBytes
+    ) where
+
+import           Network.AWS.EFS.Types
+import           Network.AWS.EFS.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'createFileSystem' smart constructor.
+newtype CreateFileSystem = CreateFileSystem'
+    { _cfsCreationToken :: Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CreateFileSystem' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cfsCreationToken'
+createFileSystem
+    :: Text -- ^ 'cfsCreationToken'
+    -> CreateFileSystem
+createFileSystem pCreationToken_ =
+    CreateFileSystem'
+    { _cfsCreationToken = pCreationToken_
+    }
+
+-- | String of up to 64 ASCII characters. Amazon EFS uses this to ensure
+-- idempotent creation.
+cfsCreationToken :: Lens' CreateFileSystem Text
+cfsCreationToken = lens _cfsCreationToken (\ s a -> s{_cfsCreationToken = a});
+
+instance AWSRequest CreateFileSystem where
+        type Sv CreateFileSystem = EFS
+        type Rs CreateFileSystem = FileSystemDescription
+        request = postJSON
+        response = receiveJSON (\ s h x -> eitherParseJSON x)
+
+instance ToHeaders CreateFileSystem where
+        toHeaders = const mempty
+
+instance ToJSON CreateFileSystem where
+        toJSON CreateFileSystem'{..}
+          = object ["CreationToken" .= _cfsCreationToken]
+
+instance ToPath CreateFileSystem where
+        toPath = const "/2015-02-01/file-systems"
+
+instance ToQuery CreateFileSystem where
+        toQuery = const mempty
diff --git a/gen/Network/AWS/EFS/CreateMountTarget.hs b/gen/Network/AWS/EFS/CreateMountTarget.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/EFS/CreateMountTarget.hs
@@ -0,0 +1,222 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.EFS.CreateMountTarget
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a mount target for a file system. You can then mount the file
+-- system on EC2 instances via the mount target.
+--
+-- You can create one mount target in each Availability Zone in your VPC.
+-- All EC2 instances in a VPC within a given Availability Zone share a
+-- single mount target for a given file system. If you have multiple
+-- subnets in an Availability Zone, you create a mount target in one of the
+-- subnets. EC2 instances do not need to be in the same subnet as the mount
+-- target in order to access their file system. For more information, see
+-- <http://docs.aws.amazon.com/efs/latest/ug/how-it-works.html Amazon EFS: How it Works>.
+--
+-- In the request, you also specify a file system ID for which you are
+-- creating the mount target and the file system\'s lifecycle state must be
+-- \"available\" (see DescribeFileSystems).
+--
+-- In the request, you also provide a subnet ID, which serves several
+-- purposes:
+--
+-- -   It determines the VPC in which Amazon EFS creates the mount target.
+-- -   It determines the Availability Zone in which Amazon EFS creates the
+--     mount target.
+-- -   It determines the IP address range from which Amazon EFS selects the
+--     IP address of the mount target if you don\'t specify an IP address
+--     in the request.
+--
+-- After creating the mount target, Amazon EFS returns a response that
+-- includes, a 'MountTargetId' and an 'IpAddress'. You use this IP address
+-- when mounting the file system in an EC2 instance. You can also use the
+-- mount target\'s DNS name when mounting the file system. The EC2 instance
+-- on which you mount the file system via the mount target can resolve the
+-- mount target\'s DNS name to its IP address. For more information, see
+-- <http://docs.aws.amazon.com/efs/latest/ug/how-it-works.html#how-it-works-implementation How it Works: Implementation Overview>
+--
+-- Note that you can create mount targets for a file system in only one
+-- VPC, and there can be only one mount target per Availability Zone. That
+-- is, if the file system already has one or more mount targets created for
+-- it, the request to add another mount target must meet the following
+-- requirements:
+--
+-- -   The subnet specified in the request must belong to the same VPC as
+--     the subnets of the existing mount targets.
+--
+-- -   The subnet specified in the request must not be in the same
+--     Availability Zone as any of the subnets of the existing mount
+--     targets.
+--
+-- If the request satisfies the requirements, Amazon EFS does the
+-- following:
+--
+-- -   Creates a new mount target in the specified subnet.
+-- -   Also creates a new network interface in the subnet as follows:
+--
+--     -   If the request provides an 'IpAddress', Amazon EFS assigns that
+--         IP address to the network interface. Otherwise, Amazon EFS
+--         assigns a free address in the subnet (in the same way that the
+--         Amazon EC2 'CreateNetworkInterface' call does when a request
+--         does not specify a primary private IP address).
+--     -   If the request provides 'SecurityGroups', this network interface
+--         is associated with those security groups. Otherwise, it belongs
+--         to the default security group for the subnet\'s VPC.
+--     -   Assigns the description
+--         '\"Mount target fsmt-id for file system fs-id\"' where 'fsmt-id'
+--         is the mount target ID, and 'fs-id' is the 'FileSystemId'.
+--     -   Sets the 'requesterManaged' property of the network interface to
+--         \"true\", and the 'requesterId' value to \"EFS\".
+--
+--     Each Amazon EFS mount target has one corresponding requestor-managed
+--     EC2 network interface. After the network interface is created,
+--     Amazon EFS sets the 'NetworkInterfaceId' field in the mount
+--     target\'s description to the network interface ID, and the
+--     'IpAddress' field to its address. If network interface creation
+--     fails, the entire 'CreateMountTarget' operation fails.
+--
+-- The 'CreateMountTarget' call returns only after creating the network
+-- interface, but while the mount target state is still \"creating\". You
+-- can check the mount target creation status by calling the
+-- DescribeFileSystems API, which among other things returns the mount
+-- target state.
+--
+-- We recommend you create a mount target in each of the Availability
+-- Zones. There are cost considerations for using a file system in an
+-- Availability Zone through a mount target created in another Availability
+-- Zone. For more information, go to
+-- <http://aws.amazon.com/efs/ Amazon EFS> product detail page. In
+-- addition, by always using a mount target local to the instance\'s
+-- Availability Zone, you eliminate a partial failure scenario; if the
+-- Availablity Zone in which your mount target is created goes down, then
+-- you won\'t be able to access your file system through that mount target.
+--
+-- This operation requires permission for the following action on the file
+-- system:
+--
+-- -   'elasticfilesystem:CreateMountTarget'
+--
+-- This operation also requires permission for the following Amazon EC2
+-- actions:
+--
+-- -   'ec2:DescribeSubnets'
+-- -   'ec2:DescribeNetworkInterfaces'
+-- -   'ec2:CreateNetworkInterface'
+--
+-- /See:/ <http://docs.aws.amazon.com/directoryservice/latest/devguide/API_CreateMountTarget.html AWS API Reference> for CreateMountTarget.
+module Network.AWS.EFS.CreateMountTarget
+    (
+    -- * Creating a Request
+      createMountTarget
+    , CreateMountTarget
+    -- * Request Lenses
+    , cmtIPAddress
+    , cmtSecurityGroups
+    , cmtFileSystemId
+    , cmtSubnetId
+
+    -- * Destructuring the Response
+    , mountTargetDescription
+    , MountTargetDescription
+    -- * Response Lenses
+    , mtdIPAddress
+    , mtdNetworkInterfaceId
+    , mtdOwnerId
+    , mtdMountTargetId
+    , mtdFileSystemId
+    , mtdSubnetId
+    , mtdLifeCycleState
+    ) where
+
+import           Network.AWS.EFS.Types
+import           Network.AWS.EFS.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'createMountTarget' smart constructor.
+data CreateMountTarget = CreateMountTarget'
+    { _cmtIPAddress      :: !(Maybe Text)
+    , _cmtSecurityGroups :: !(Maybe [Text])
+    , _cmtFileSystemId   :: !Text
+    , _cmtSubnetId       :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CreateMountTarget' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cmtIPAddress'
+--
+-- * 'cmtSecurityGroups'
+--
+-- * 'cmtFileSystemId'
+--
+-- * 'cmtSubnetId'
+createMountTarget
+    :: Text -- ^ 'cmtFileSystemId'
+    -> Text -- ^ 'cmtSubnetId'
+    -> CreateMountTarget
+createMountTarget pFileSystemId_ pSubnetId_ =
+    CreateMountTarget'
+    { _cmtIPAddress = Nothing
+    , _cmtSecurityGroups = Nothing
+    , _cmtFileSystemId = pFileSystemId_
+    , _cmtSubnetId = pSubnetId_
+    }
+
+-- | A valid IPv4 address within the address range of the specified subnet.
+cmtIPAddress :: Lens' CreateMountTarget (Maybe Text)
+cmtIPAddress = lens _cmtIPAddress (\ s a -> s{_cmtIPAddress = a});
+
+-- | Up to 5 VPC security group IDs, of the form \"sg-xxxxxxxx\". These must
+-- be for the same VPC as subnet specified.
+cmtSecurityGroups :: Lens' CreateMountTarget [Text]
+cmtSecurityGroups = lens _cmtSecurityGroups (\ s a -> s{_cmtSecurityGroups = a}) . _Default . _Coerce;
+
+-- | The ID of the file system for which to create the mount target.
+cmtFileSystemId :: Lens' CreateMountTarget Text
+cmtFileSystemId = lens _cmtFileSystemId (\ s a -> s{_cmtFileSystemId = a});
+
+-- | The ID of the subnet to add the mount target in.
+cmtSubnetId :: Lens' CreateMountTarget Text
+cmtSubnetId = lens _cmtSubnetId (\ s a -> s{_cmtSubnetId = a});
+
+instance AWSRequest CreateMountTarget where
+        type Sv CreateMountTarget = EFS
+        type Rs CreateMountTarget = MountTargetDescription
+        request = postJSON
+        response = receiveJSON (\ s h x -> eitherParseJSON x)
+
+instance ToHeaders CreateMountTarget where
+        toHeaders = const mempty
+
+instance ToJSON CreateMountTarget where
+        toJSON CreateMountTarget'{..}
+          = object
+              ["IpAddress" .= _cmtIPAddress,
+               "SecurityGroups" .= _cmtSecurityGroups,
+               "FileSystemId" .= _cmtFileSystemId,
+               "SubnetId" .= _cmtSubnetId]
+
+instance ToPath CreateMountTarget where
+        toPath = const "/2015-02-01/mount-targets"
+
+instance ToQuery CreateMountTarget where
+        toQuery = const mempty
diff --git a/gen/Network/AWS/EFS/CreateTags.hs b/gen/Network/AWS/EFS/CreateTags.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/EFS/CreateTags.hs
@@ -0,0 +1,112 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.EFS.CreateTags
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates or overwrites tags associated with a file system. Each tag is a
+-- key-value pair. If a tag key specified in the request already exists on
+-- the file system, this operation overwrites its value with the value
+-- provided in the request. If you add the \"Name\" tag to your file
+-- system, Amazon EFS returns it in the response to the DescribeFileSystems
+-- API.
+--
+-- This operation requires permission for the
+-- 'elasticfilesystem:CreateTags' action.
+--
+-- /See:/ <http://docs.aws.amazon.com/directoryservice/latest/devguide/API_CreateTags.html AWS API Reference> for CreateTags.
+module Network.AWS.EFS.CreateTags
+    (
+    -- * Creating a Request
+      createTags
+    , CreateTags
+    -- * Request Lenses
+    , ctFileSystemId
+    , ctTags
+
+    -- * Destructuring the Response
+    , createTagsResponse
+    , CreateTagsResponse
+    ) where
+
+import           Network.AWS.EFS.Types
+import           Network.AWS.EFS.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'createTags' smart constructor.
+data CreateTags = CreateTags'
+    { _ctFileSystemId :: !Text
+    , _ctTags         :: ![Tag]
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CreateTags' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ctFileSystemId'
+--
+-- * 'ctTags'
+createTags
+    :: Text -- ^ 'ctFileSystemId'
+    -> CreateTags
+createTags pFileSystemId_ =
+    CreateTags'
+    { _ctFileSystemId = pFileSystemId_
+    , _ctTags = mempty
+    }
+
+-- | String. The ID of the file system whose tags you want to modify. This
+-- operation modifies only the tags and not the file system.
+ctFileSystemId :: Lens' CreateTags Text
+ctFileSystemId = lens _ctFileSystemId (\ s a -> s{_ctFileSystemId = a});
+
+-- | An array of 'Tag' objects to add. Each 'Tag' object is a key-value pair.
+ctTags :: Lens' CreateTags [Tag]
+ctTags = lens _ctTags (\ s a -> s{_ctTags = a}) . _Coerce;
+
+instance AWSRequest CreateTags where
+        type Sv CreateTags = EFS
+        type Rs CreateTags = CreateTagsResponse
+        request = postJSON
+        response = receiveNull CreateTagsResponse'
+
+instance ToHeaders CreateTags where
+        toHeaders = const mempty
+
+instance ToJSON CreateTags where
+        toJSON CreateTags'{..} = object ["Tags" .= _ctTags]
+
+instance ToPath CreateTags where
+        toPath CreateTags'{..}
+          = mconcat
+              ["/2015-02-01/create-tags/", toBS _ctFileSystemId]
+
+instance ToQuery CreateTags where
+        toQuery = const mempty
+
+-- | /See:/ 'createTagsResponse' smart constructor.
+data CreateTagsResponse =
+    CreateTagsResponse'
+    deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CreateTagsResponse' with the minimum fields required to make a request.
+--
+createTagsResponse
+    :: CreateTagsResponse
+createTagsResponse = CreateTagsResponse'
diff --git a/gen/Network/AWS/EFS/DeleteFileSystem.hs b/gen/Network/AWS/EFS/DeleteFileSystem.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/EFS/DeleteFileSystem.hs
@@ -0,0 +1,107 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.EFS.DeleteFileSystem
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes a file system, permanently severing access to its contents. Upon
+-- return, the file system no longer exists and you will not be able to
+-- access any contents of the deleted file system.
+--
+-- You cannot delete a file system that is in use. That is, if the file
+-- system has any mount targets, you must first delete them. For more
+-- information, see DescribeMountTargets and DeleteMountTarget.
+--
+-- The 'DeleteFileSystem' call returns while the file system state is still
+-- \"deleting\". You can check the file system deletion status by calling
+-- the DescribeFileSystems API, which returns a list of file systems in
+-- your account. If you pass file system ID or creation token for the
+-- deleted file system, the DescribeFileSystems will return a 404
+-- \"FileSystemNotFound\" error.
+--
+-- This operation requires permission for the
+-- 'elasticfilesystem:DeleteFileSystem' action.
+--
+-- /See:/ <http://docs.aws.amazon.com/directoryservice/latest/devguide/API_DeleteFileSystem.html AWS API Reference> for DeleteFileSystem.
+module Network.AWS.EFS.DeleteFileSystem
+    (
+    -- * Creating a Request
+      deleteFileSystem
+    , DeleteFileSystem
+    -- * Request Lenses
+    , delFileSystemId
+
+    -- * Destructuring the Response
+    , deleteFileSystemResponse
+    , DeleteFileSystemResponse
+    ) where
+
+import           Network.AWS.EFS.Types
+import           Network.AWS.EFS.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'deleteFileSystem' smart constructor.
+newtype DeleteFileSystem = DeleteFileSystem'
+    { _delFileSystemId :: Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DeleteFileSystem' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'delFileSystemId'
+deleteFileSystem
+    :: Text -- ^ 'delFileSystemId'
+    -> DeleteFileSystem
+deleteFileSystem pFileSystemId_ =
+    DeleteFileSystem'
+    { _delFileSystemId = pFileSystemId_
+    }
+
+-- | The ID of the file system you want to delete.
+delFileSystemId :: Lens' DeleteFileSystem Text
+delFileSystemId = lens _delFileSystemId (\ s a -> s{_delFileSystemId = a});
+
+instance AWSRequest DeleteFileSystem where
+        type Sv DeleteFileSystem = EFS
+        type Rs DeleteFileSystem = DeleteFileSystemResponse
+        request = delete
+        response = receiveNull DeleteFileSystemResponse'
+
+instance ToHeaders DeleteFileSystem where
+        toHeaders = const mempty
+
+instance ToPath DeleteFileSystem where
+        toPath DeleteFileSystem'{..}
+          = mconcat
+              ["/2015-02-01/file-systems/", toBS _delFileSystemId]
+
+instance ToQuery DeleteFileSystem where
+        toQuery = const mempty
+
+-- | /See:/ 'deleteFileSystemResponse' smart constructor.
+data DeleteFileSystemResponse =
+    DeleteFileSystemResponse'
+    deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DeleteFileSystemResponse' with the minimum fields required to make a request.
+--
+deleteFileSystemResponse
+    :: DeleteFileSystemResponse
+deleteFileSystemResponse = DeleteFileSystemResponse'
diff --git a/gen/Network/AWS/EFS/DeleteMountTarget.hs b/gen/Network/AWS/EFS/DeleteMountTarget.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/EFS/DeleteMountTarget.hs
@@ -0,0 +1,117 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.EFS.DeleteMountTarget
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes the specified mount target.
+--
+-- This operation forcibly breaks any mounts of the file system via the
+-- mount target being deleted, which might disrupt instances or
+-- applications using those mounts. To avoid applications getting cut off
+-- abruptly, you might consider unmounting any mounts of the mount target,
+-- if feasible. The operation also deletes the associated network
+-- interface. Uncommitted writes may be lost, but breaking a mount target
+-- using this operation does not corrupt the file system itself. The file
+-- system you created remains. You can mount an EC2 instance in your VPC
+-- using another mount target.
+--
+-- This operation requires permission for the following action on the file
+-- system:
+--
+-- -   'elasticfilesystem:DeleteMountTarget'
+--
+-- The 'DeleteMountTarget' call returns while the mount target state is
+-- still \"deleting\". You can check the mount target deletion by calling
+-- the DescribeMountTargets API, which returns a list of mount target
+-- descriptions for the given file system.
+--
+-- The operation also requires permission for the following Amazon EC2
+-- action on the mount target\'s network interface:
+--
+-- -   'ec2:DeleteNetworkInterface'
+--
+-- /See:/ <http://docs.aws.amazon.com/directoryservice/latest/devguide/API_DeleteMountTarget.html AWS API Reference> for DeleteMountTarget.
+module Network.AWS.EFS.DeleteMountTarget
+    (
+    -- * Creating a Request
+      deleteMountTarget
+    , DeleteMountTarget
+    -- * Request Lenses
+    , dmtMountTargetId
+
+    -- * Destructuring the Response
+    , deleteMountTargetResponse
+    , DeleteMountTargetResponse
+    ) where
+
+import           Network.AWS.EFS.Types
+import           Network.AWS.EFS.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'deleteMountTarget' smart constructor.
+newtype DeleteMountTarget = DeleteMountTarget'
+    { _dmtMountTargetId :: Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DeleteMountTarget' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dmtMountTargetId'
+deleteMountTarget
+    :: Text -- ^ 'dmtMountTargetId'
+    -> DeleteMountTarget
+deleteMountTarget pMountTargetId_ =
+    DeleteMountTarget'
+    { _dmtMountTargetId = pMountTargetId_
+    }
+
+-- | String. The ID of the mount target to delete.
+dmtMountTargetId :: Lens' DeleteMountTarget Text
+dmtMountTargetId = lens _dmtMountTargetId (\ s a -> s{_dmtMountTargetId = a});
+
+instance AWSRequest DeleteMountTarget where
+        type Sv DeleteMountTarget = EFS
+        type Rs DeleteMountTarget = DeleteMountTargetResponse
+        request = delete
+        response = receiveNull DeleteMountTargetResponse'
+
+instance ToHeaders DeleteMountTarget where
+        toHeaders = const mempty
+
+instance ToPath DeleteMountTarget where
+        toPath DeleteMountTarget'{..}
+          = mconcat
+              ["/2015-02-01/mount-targets/",
+               toBS _dmtMountTargetId]
+
+instance ToQuery DeleteMountTarget where
+        toQuery = const mempty
+
+-- | /See:/ 'deleteMountTargetResponse' smart constructor.
+data DeleteMountTargetResponse =
+    DeleteMountTargetResponse'
+    deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DeleteMountTargetResponse' with the minimum fields required to make a request.
+--
+deleteMountTargetResponse
+    :: DeleteMountTargetResponse
+deleteMountTargetResponse = DeleteMountTargetResponse'
diff --git a/gen/Network/AWS/EFS/DeleteTags.hs b/gen/Network/AWS/EFS/DeleteTags.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/EFS/DeleteTags.hs
@@ -0,0 +1,112 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.EFS.DeleteTags
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes the specified tags from a file system. If the 'DeleteTags'
+-- request includes a tag key that does not exist, Amazon EFS ignores it;
+-- it is not an error. For more information about tags and related
+-- restrictions, go to
+-- <http://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/cost-alloc-tags.html Tag Restrictions>
+-- in the /AWS Billing and Cost Management User Guide/.
+--
+-- This operation requires permission for the
+-- 'elasticfilesystem:DeleteTags' action.
+--
+-- /See:/ <http://docs.aws.amazon.com/directoryservice/latest/devguide/API_DeleteTags.html AWS API Reference> for DeleteTags.
+module Network.AWS.EFS.DeleteTags
+    (
+    -- * Creating a Request
+      deleteTags
+    , DeleteTags
+    -- * Request Lenses
+    , dFileSystemId
+    , dTagKeys
+
+    -- * Destructuring the Response
+    , deleteTagsResponse
+    , DeleteTagsResponse
+    ) where
+
+import           Network.AWS.EFS.Types
+import           Network.AWS.EFS.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'deleteTags' smart constructor.
+data DeleteTags = DeleteTags'
+    { _dFileSystemId :: !Text
+    , _dTagKeys      :: ![Text]
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DeleteTags' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dFileSystemId'
+--
+-- * 'dTagKeys'
+deleteTags
+    :: Text -- ^ 'dFileSystemId'
+    -> DeleteTags
+deleteTags pFileSystemId_ =
+    DeleteTags'
+    { _dFileSystemId = pFileSystemId_
+    , _dTagKeys = mempty
+    }
+
+-- | String. The ID of the file system whose tags you want to delete.
+dFileSystemId :: Lens' DeleteTags Text
+dFileSystemId = lens _dFileSystemId (\ s a -> s{_dFileSystemId = a});
+
+-- | A list of tag keys to delete.
+dTagKeys :: Lens' DeleteTags [Text]
+dTagKeys = lens _dTagKeys (\ s a -> s{_dTagKeys = a}) . _Coerce;
+
+instance AWSRequest DeleteTags where
+        type Sv DeleteTags = EFS
+        type Rs DeleteTags = DeleteTagsResponse
+        request = postJSON
+        response = receiveNull DeleteTagsResponse'
+
+instance ToHeaders DeleteTags where
+        toHeaders = const mempty
+
+instance ToJSON DeleteTags where
+        toJSON DeleteTags'{..}
+          = object ["TagKeys" .= _dTagKeys]
+
+instance ToPath DeleteTags where
+        toPath DeleteTags'{..}
+          = mconcat
+              ["/2015-02-01/delete-tags/", toBS _dFileSystemId]
+
+instance ToQuery DeleteTags where
+        toQuery = const mempty
+
+-- | /See:/ 'deleteTagsResponse' smart constructor.
+data DeleteTagsResponse =
+    DeleteTagsResponse'
+    deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DeleteTagsResponse' with the minimum fields required to make a request.
+--
+deleteTagsResponse
+    :: DeleteTagsResponse
+deleteTagsResponse = DeleteTagsResponse'
diff --git a/gen/Network/AWS/EFS/DescribeFileSystems.hs b/gen/Network/AWS/EFS/DescribeFileSystems.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/EFS/DescribeFileSystems.hs
@@ -0,0 +1,204 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.EFS.DescribeFileSystems
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns the description of a specific Amazon EFS file system if either
+-- the file system 'CreationToken' or the 'FileSystemId' is provided;
+-- otherwise, returns descriptions of all file systems owned by the
+-- caller\'s AWS account in the AWS region of the endpoint that you\'re
+-- calling.
+--
+-- When retrieving all file system descriptions, you can optionally specify
+-- the 'MaxItems' parameter to limit the number of descriptions in a
+-- response. If more file system descriptions remain, Amazon EFS returns a
+-- 'NextMarker', an opaque token, in the response. In this case, you should
+-- send a subsequent request with the 'Marker' request parameter set to the
+-- value of 'NextMarker'.
+--
+-- So to retrieve a list of your file system descriptions, the expected
+-- usage of this API is an iterative process of first calling
+-- 'DescribeFileSystems' without the 'Marker' and then continuing to call
+-- it with the 'Marker' parameter set to the value of the 'NextMarker' from
+-- the previous response until the response has no 'NextMarker'.
+--
+-- Note that the implementation may return fewer than 'MaxItems' file
+-- system descriptions while still including a 'NextMarker' value.
+--
+-- The order of file systems returned in the response of one
+-- 'DescribeFileSystems' call, and the order of file systems returned
+-- across the responses of a multi-call iteration, is unspecified.
+--
+-- This operation requires permission for the
+-- 'elasticfilesystem:DescribeFileSystems' action.
+--
+-- /See:/ <http://docs.aws.amazon.com/directoryservice/latest/devguide/API_DescribeFileSystems.html AWS API Reference> for DescribeFileSystems.
+module Network.AWS.EFS.DescribeFileSystems
+    (
+    -- * Creating a Request
+      describeFileSystems
+    , DescribeFileSystems
+    -- * Request Lenses
+    , dfsFileSystemId
+    , dfsMaxItems
+    , dfsCreationToken
+    , dfsMarker
+
+    -- * Destructuring the Response
+    , describeFileSystemsResponse
+    , DescribeFileSystemsResponse
+    -- * Response Lenses
+    , dfsrsFileSystems
+    , dfsrsMarker
+    , dfsrsNextMarker
+    , dfsrsStatus
+    ) where
+
+import           Network.AWS.EFS.Types
+import           Network.AWS.EFS.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'describeFileSystems' smart constructor.
+data DescribeFileSystems = DescribeFileSystems'
+    { _dfsFileSystemId  :: !(Maybe Text)
+    , _dfsMaxItems      :: !(Maybe Nat)
+    , _dfsCreationToken :: !(Maybe Text)
+    , _dfsMarker        :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DescribeFileSystems' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dfsFileSystemId'
+--
+-- * 'dfsMaxItems'
+--
+-- * 'dfsCreationToken'
+--
+-- * 'dfsMarker'
+describeFileSystems
+    :: DescribeFileSystems
+describeFileSystems =
+    DescribeFileSystems'
+    { _dfsFileSystemId = Nothing
+    , _dfsMaxItems = Nothing
+    , _dfsCreationToken = Nothing
+    , _dfsMarker = Nothing
+    }
+
+-- | Optional string. File system ID whose description you want to retrieve.
+dfsFileSystemId :: Lens' DescribeFileSystems (Maybe Text)
+dfsFileSystemId = lens _dfsFileSystemId (\ s a -> s{_dfsFileSystemId = a});
+
+-- | Optional integer. Specifies the maximum number of file systems to return
+-- in the response. This parameter value must be greater than 0. The number
+-- of items Amazon EFS returns will be the minimum of the 'MaxItems'
+-- parameter specified in the request and the service\'s internal maximum
+-- number of items per page.
+dfsMaxItems :: Lens' DescribeFileSystems (Maybe Natural)
+dfsMaxItems = lens _dfsMaxItems (\ s a -> s{_dfsMaxItems = a}) . mapping _Nat;
+
+-- | Optional string. Restricts the list to the file system with this
+-- creation token (you specify a creation token at the time of creating an
+-- Amazon EFS file system).
+dfsCreationToken :: Lens' DescribeFileSystems (Maybe Text)
+dfsCreationToken = lens _dfsCreationToken (\ s a -> s{_dfsCreationToken = a});
+
+-- | Optional string. Opaque pagination token returned from a previous
+-- 'DescribeFileSystems' operation. If present, specifies to continue the
+-- list from where the returning call had left off.
+dfsMarker :: Lens' DescribeFileSystems (Maybe Text)
+dfsMarker = lens _dfsMarker (\ s a -> s{_dfsMarker = a});
+
+instance AWSRequest DescribeFileSystems where
+        type Sv DescribeFileSystems = EFS
+        type Rs DescribeFileSystems =
+             DescribeFileSystemsResponse
+        request = get
+        response
+          = receiveJSON
+              (\ s h x ->
+                 DescribeFileSystemsResponse' <$>
+                   (x .?> "FileSystems" .!@ mempty) <*> (x .?> "Marker")
+                     <*> (x .?> "NextMarker")
+                     <*> (pure (fromEnum s)))
+
+instance ToHeaders DescribeFileSystems where
+        toHeaders = const mempty
+
+instance ToPath DescribeFileSystems where
+        toPath = const "/2015-02-01/file-systems"
+
+instance ToQuery DescribeFileSystems where
+        toQuery DescribeFileSystems'{..}
+          = mconcat
+              ["FileSystemId" =: _dfsFileSystemId,
+               "MaxItems" =: _dfsMaxItems,
+               "CreationToken" =: _dfsCreationToken,
+               "Marker" =: _dfsMarker]
+
+-- | /See:/ 'describeFileSystemsResponse' smart constructor.
+data DescribeFileSystemsResponse = DescribeFileSystemsResponse'
+    { _dfsrsFileSystems :: !(Maybe [FileSystemDescription])
+    , _dfsrsMarker      :: !(Maybe Text)
+    , _dfsrsNextMarker  :: !(Maybe Text)
+    , _dfsrsStatus      :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DescribeFileSystemsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dfsrsFileSystems'
+--
+-- * 'dfsrsMarker'
+--
+-- * 'dfsrsNextMarker'
+--
+-- * 'dfsrsStatus'
+describeFileSystemsResponse
+    :: Int -- ^ 'dfsrsStatus'
+    -> DescribeFileSystemsResponse
+describeFileSystemsResponse pStatus_ =
+    DescribeFileSystemsResponse'
+    { _dfsrsFileSystems = Nothing
+    , _dfsrsMarker = Nothing
+    , _dfsrsNextMarker = Nothing
+    , _dfsrsStatus = pStatus_
+    }
+
+-- | An array of file system descriptions.
+dfsrsFileSystems :: Lens' DescribeFileSystemsResponse [FileSystemDescription]
+dfsrsFileSystems = lens _dfsrsFileSystems (\ s a -> s{_dfsrsFileSystems = a}) . _Default . _Coerce;
+
+-- | A string, present if provided by caller in the request.
+dfsrsMarker :: Lens' DescribeFileSystemsResponse (Maybe Text)
+dfsrsMarker = lens _dfsrsMarker (\ s a -> s{_dfsrsMarker = a});
+
+-- | A string, present if there are more file systems than returned in the
+-- response. You can use the 'NextMarker' in the subsequent request to
+-- fetch the descriptions.
+dfsrsNextMarker :: Lens' DescribeFileSystemsResponse (Maybe Text)
+dfsrsNextMarker = lens _dfsrsNextMarker (\ s a -> s{_dfsrsNextMarker = a});
+
+-- | The response status code.
+dfsrsStatus :: Lens' DescribeFileSystemsResponse Int
+dfsrsStatus = lens _dfsrsStatus (\ s a -> s{_dfsrsStatus = a});
diff --git a/gen/Network/AWS/EFS/DescribeMountTargetSecurityGroups.hs b/gen/Network/AWS/EFS/DescribeMountTargetSecurityGroups.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/EFS/DescribeMountTargetSecurityGroups.hs
@@ -0,0 +1,134 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.EFS.DescribeMountTargetSecurityGroups
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns the security groups currently in effect for a mount target. This
+-- operation requires that the network interface of the mount target has
+-- been created and the life cycle state of the mount target is not
+-- \"deleted\".
+--
+-- This operation requires permissions for the following actions:
+--
+-- -   'elasticfilesystem:DescribeMountTargetSecurityGroups' action on the
+--     mount target\'s file system.
+-- -   'ec2:DescribeNetworkInterfaceAttribute' action on the mount
+--     target\'s network interface.
+--
+-- /See:/ <http://docs.aws.amazon.com/directoryservice/latest/devguide/API_DescribeMountTargetSecurityGroups.html AWS API Reference> for DescribeMountTargetSecurityGroups.
+module Network.AWS.EFS.DescribeMountTargetSecurityGroups
+    (
+    -- * Creating a Request
+      describeMountTargetSecurityGroups
+    , DescribeMountTargetSecurityGroups
+    -- * Request Lenses
+    , dmtsgMountTargetId
+
+    -- * Destructuring the Response
+    , describeMountTargetSecurityGroupsResponse
+    , DescribeMountTargetSecurityGroupsResponse
+    -- * Response Lenses
+    , dmtsgrsStatus
+    , dmtsgrsSecurityGroups
+    ) where
+
+import           Network.AWS.EFS.Types
+import           Network.AWS.EFS.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'describeMountTargetSecurityGroups' smart constructor.
+newtype DescribeMountTargetSecurityGroups = DescribeMountTargetSecurityGroups'
+    { _dmtsgMountTargetId :: Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DescribeMountTargetSecurityGroups' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dmtsgMountTargetId'
+describeMountTargetSecurityGroups
+    :: Text -- ^ 'dmtsgMountTargetId'
+    -> DescribeMountTargetSecurityGroups
+describeMountTargetSecurityGroups pMountTargetId_ =
+    DescribeMountTargetSecurityGroups'
+    { _dmtsgMountTargetId = pMountTargetId_
+    }
+
+-- | The ID of the mount target whose security groups you want to retrieve.
+dmtsgMountTargetId :: Lens' DescribeMountTargetSecurityGroups Text
+dmtsgMountTargetId = lens _dmtsgMountTargetId (\ s a -> s{_dmtsgMountTargetId = a});
+
+instance AWSRequest DescribeMountTargetSecurityGroups
+         where
+        type Sv DescribeMountTargetSecurityGroups = EFS
+        type Rs DescribeMountTargetSecurityGroups =
+             DescribeMountTargetSecurityGroupsResponse
+        request = get
+        response
+          = receiveJSON
+              (\ s h x ->
+                 DescribeMountTargetSecurityGroupsResponse' <$>
+                   (pure (fromEnum s)) <*>
+                     (x .?> "SecurityGroups" .!@ mempty))
+
+instance ToHeaders DescribeMountTargetSecurityGroups
+         where
+        toHeaders = const mempty
+
+instance ToPath DescribeMountTargetSecurityGroups
+         where
+        toPath DescribeMountTargetSecurityGroups'{..}
+          = mconcat
+              ["/2015-02-01/mount-targets/",
+               toBS _dmtsgMountTargetId, "/security-groups"]
+
+instance ToQuery DescribeMountTargetSecurityGroups
+         where
+        toQuery = const mempty
+
+-- | /See:/ 'describeMountTargetSecurityGroupsResponse' smart constructor.
+data DescribeMountTargetSecurityGroupsResponse = DescribeMountTargetSecurityGroupsResponse'
+    { _dmtsgrsStatus         :: !Int
+    , _dmtsgrsSecurityGroups :: ![Text]
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DescribeMountTargetSecurityGroupsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dmtsgrsStatus'
+--
+-- * 'dmtsgrsSecurityGroups'
+describeMountTargetSecurityGroupsResponse
+    :: Int -- ^ 'dmtsgrsStatus'
+    -> DescribeMountTargetSecurityGroupsResponse
+describeMountTargetSecurityGroupsResponse pStatus_ =
+    DescribeMountTargetSecurityGroupsResponse'
+    { _dmtsgrsStatus = pStatus_
+    , _dmtsgrsSecurityGroups = mempty
+    }
+
+-- | The response status code.
+dmtsgrsStatus :: Lens' DescribeMountTargetSecurityGroupsResponse Int
+dmtsgrsStatus = lens _dmtsgrsStatus (\ s a -> s{_dmtsgrsStatus = a});
+
+-- | An array of security groups.
+dmtsgrsSecurityGroups :: Lens' DescribeMountTargetSecurityGroupsResponse [Text]
+dmtsgrsSecurityGroups = lens _dmtsgrsSecurityGroups (\ s a -> s{_dmtsgrsSecurityGroups = a}) . _Coerce;
diff --git a/gen/Network/AWS/EFS/DescribeMountTargets.hs b/gen/Network/AWS/EFS/DescribeMountTargets.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/EFS/DescribeMountTargets.hs
@@ -0,0 +1,170 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.EFS.DescribeMountTargets
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns the descriptions of the current mount targets for a file system.
+-- The order of mount targets returned in the response is unspecified.
+--
+-- This operation requires permission for the
+-- 'elasticfilesystem:DescribeMountTargets' action on the file system
+-- 'FileSystemId'.
+--
+-- /See:/ <http://docs.aws.amazon.com/directoryservice/latest/devguide/API_DescribeMountTargets.html AWS API Reference> for DescribeMountTargets.
+module Network.AWS.EFS.DescribeMountTargets
+    (
+    -- * Creating a Request
+      describeMountTargets
+    , DescribeMountTargets
+    -- * Request Lenses
+    , dmtMaxItems
+    , dmtMarker
+    , dmtFileSystemId
+
+    -- * Destructuring the Response
+    , describeMountTargetsResponse
+    , DescribeMountTargetsResponse
+    -- * Response Lenses
+    , dmtrsMountTargets
+    , dmtrsMarker
+    , dmtrsNextMarker
+    , dmtrsStatus
+    ) where
+
+import           Network.AWS.EFS.Types
+import           Network.AWS.EFS.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'describeMountTargets' smart constructor.
+data DescribeMountTargets = DescribeMountTargets'
+    { _dmtMaxItems     :: !(Maybe Nat)
+    , _dmtMarker       :: !(Maybe Text)
+    , _dmtFileSystemId :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DescribeMountTargets' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dmtMaxItems'
+--
+-- * 'dmtMarker'
+--
+-- * 'dmtFileSystemId'
+describeMountTargets
+    :: Text -- ^ 'dmtFileSystemId'
+    -> DescribeMountTargets
+describeMountTargets pFileSystemId_ =
+    DescribeMountTargets'
+    { _dmtMaxItems = Nothing
+    , _dmtMarker = Nothing
+    , _dmtFileSystemId = pFileSystemId_
+    }
+
+-- | Optional. Maximum number of mount targets to return in the response. It
+-- must be an integer with a value greater than zero.
+dmtMaxItems :: Lens' DescribeMountTargets (Maybe Natural)
+dmtMaxItems = lens _dmtMaxItems (\ s a -> s{_dmtMaxItems = a}) . mapping _Nat;
+
+-- | Optional. String. Opaque pagination token returned from a previous
+-- 'DescribeMountTargets' operation. If present, it specifies to continue
+-- the list from where the previous returning call left off.
+dmtMarker :: Lens' DescribeMountTargets (Maybe Text)
+dmtMarker = lens _dmtMarker (\ s a -> s{_dmtMarker = a});
+
+-- | String. The ID of the file system whose mount targets you want to list.
+dmtFileSystemId :: Lens' DescribeMountTargets Text
+dmtFileSystemId = lens _dmtFileSystemId (\ s a -> s{_dmtFileSystemId = a});
+
+instance AWSRequest DescribeMountTargets where
+        type Sv DescribeMountTargets = EFS
+        type Rs DescribeMountTargets =
+             DescribeMountTargetsResponse
+        request = get
+        response
+          = receiveJSON
+              (\ s h x ->
+                 DescribeMountTargetsResponse' <$>
+                   (x .?> "MountTargets" .!@ mempty) <*>
+                     (x .?> "Marker")
+                     <*> (x .?> "NextMarker")
+                     <*> (pure (fromEnum s)))
+
+instance ToHeaders DescribeMountTargets where
+        toHeaders = const mempty
+
+instance ToPath DescribeMountTargets where
+        toPath = const "/2015-02-01/mount-targets"
+
+instance ToQuery DescribeMountTargets where
+        toQuery DescribeMountTargets'{..}
+          = mconcat
+              ["MaxItems" =: _dmtMaxItems, "Marker" =: _dmtMarker,
+               "FileSystemId" =: _dmtFileSystemId]
+
+-- | /See:/ 'describeMountTargetsResponse' smart constructor.
+data DescribeMountTargetsResponse = DescribeMountTargetsResponse'
+    { _dmtrsMountTargets :: !(Maybe [MountTargetDescription])
+    , _dmtrsMarker       :: !(Maybe Text)
+    , _dmtrsNextMarker   :: !(Maybe Text)
+    , _dmtrsStatus       :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DescribeMountTargetsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dmtrsMountTargets'
+--
+-- * 'dmtrsMarker'
+--
+-- * 'dmtrsNextMarker'
+--
+-- * 'dmtrsStatus'
+describeMountTargetsResponse
+    :: Int -- ^ 'dmtrsStatus'
+    -> DescribeMountTargetsResponse
+describeMountTargetsResponse pStatus_ =
+    DescribeMountTargetsResponse'
+    { _dmtrsMountTargets = Nothing
+    , _dmtrsMarker = Nothing
+    , _dmtrsNextMarker = Nothing
+    , _dmtrsStatus = pStatus_
+    }
+
+-- | Returns the file system\'s mount targets as an array of
+-- 'MountTargetDescription' objects.
+dmtrsMountTargets :: Lens' DescribeMountTargetsResponse [MountTargetDescription]
+dmtrsMountTargets = lens _dmtrsMountTargets (\ s a -> s{_dmtrsMountTargets = a}) . _Default . _Coerce;
+
+-- | If the request included the 'Marker', the response returns that value in
+-- this field.
+dmtrsMarker :: Lens' DescribeMountTargetsResponse (Maybe Text)
+dmtrsMarker = lens _dmtrsMarker (\ s a -> s{_dmtrsMarker = a});
+
+-- | If a value is present, there are more mount targets to return. In a
+-- subsequent request, you can provide 'Marker' in your request with this
+-- value to retrieve the next set of mount targets.
+dmtrsNextMarker :: Lens' DescribeMountTargetsResponse (Maybe Text)
+dmtrsNextMarker = lens _dmtrsNextMarker (\ s a -> s{_dmtrsNextMarker = a});
+
+-- | The response status code.
+dmtrsStatus :: Lens' DescribeMountTargetsResponse Int
+dmtrsStatus = lens _dmtrsStatus (\ s a -> s{_dmtrsStatus = a});
diff --git a/gen/Network/AWS/EFS/DescribeTags.hs b/gen/Network/AWS/EFS/DescribeTags.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/EFS/DescribeTags.hs
@@ -0,0 +1,171 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.EFS.DescribeTags
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns the tags associated with a file system. The order of tags
+-- returned in the response of one 'DescribeTags' call, and the order of
+-- tags returned across the responses of a multi-call iteration (when using
+-- pagination), is unspecified.
+--
+-- This operation requires permission for the
+-- 'elasticfilesystem:DescribeTags' action.
+--
+-- /See:/ <http://docs.aws.amazon.com/directoryservice/latest/devguide/API_DescribeTags.html AWS API Reference> for DescribeTags.
+module Network.AWS.EFS.DescribeTags
+    (
+    -- * Creating a Request
+      describeTags
+    , DescribeTags
+    -- * Request Lenses
+    , dtMaxItems
+    , dtMarker
+    , dtFileSystemId
+
+    -- * Destructuring the Response
+    , describeTagsResponse
+    , DescribeTagsResponse
+    -- * Response Lenses
+    , dtrsMarker
+    , dtrsNextMarker
+    , dtrsStatus
+    , dtrsTags
+    ) where
+
+import           Network.AWS.EFS.Types
+import           Network.AWS.EFS.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'describeTags' smart constructor.
+data DescribeTags = DescribeTags'
+    { _dtMaxItems     :: !(Maybe Nat)
+    , _dtMarker       :: !(Maybe Text)
+    , _dtFileSystemId :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DescribeTags' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dtMaxItems'
+--
+-- * 'dtMarker'
+--
+-- * 'dtFileSystemId'
+describeTags
+    :: Text -- ^ 'dtFileSystemId'
+    -> DescribeTags
+describeTags pFileSystemId_ =
+    DescribeTags'
+    { _dtMaxItems = Nothing
+    , _dtMarker = Nothing
+    , _dtFileSystemId = pFileSystemId_
+    }
+
+-- | Optional. Maximum number of file system tags to return in the response.
+-- It must be an integer with a value greater than zero.
+dtMaxItems :: Lens' DescribeTags (Maybe Natural)
+dtMaxItems = lens _dtMaxItems (\ s a -> s{_dtMaxItems = a}) . mapping _Nat;
+
+-- | Optional. String. Opaque pagination token returned from a previous
+-- 'DescribeTags' operation. If present, it specifies to continue the list
+-- from where the previous call left off.
+dtMarker :: Lens' DescribeTags (Maybe Text)
+dtMarker = lens _dtMarker (\ s a -> s{_dtMarker = a});
+
+-- | The ID of the file system whose tag set you want to retrieve.
+dtFileSystemId :: Lens' DescribeTags Text
+dtFileSystemId = lens _dtFileSystemId (\ s a -> s{_dtFileSystemId = a});
+
+instance AWSRequest DescribeTags where
+        type Sv DescribeTags = EFS
+        type Rs DescribeTags = DescribeTagsResponse
+        request = get
+        response
+          = receiveJSON
+              (\ s h x ->
+                 DescribeTagsResponse' <$>
+                   (x .?> "Marker") <*> (x .?> "NextMarker") <*>
+                     (pure (fromEnum s))
+                     <*> (x .?> "Tags" .!@ mempty))
+
+instance ToHeaders DescribeTags where
+        toHeaders = const mempty
+
+instance ToPath DescribeTags where
+        toPath DescribeTags'{..}
+          = mconcat
+              ["/2015-02-01/tags/", toBS _dtFileSystemId, "/"]
+
+instance ToQuery DescribeTags where
+        toQuery DescribeTags'{..}
+          = mconcat
+              ["MaxItems" =: _dtMaxItems, "Marker" =: _dtMarker]
+
+-- | /See:/ 'describeTagsResponse' smart constructor.
+data DescribeTagsResponse = DescribeTagsResponse'
+    { _dtrsMarker     :: !(Maybe Text)
+    , _dtrsNextMarker :: !(Maybe Text)
+    , _dtrsStatus     :: !Int
+    , _dtrsTags       :: ![Tag]
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DescribeTagsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dtrsMarker'
+--
+-- * 'dtrsNextMarker'
+--
+-- * 'dtrsStatus'
+--
+-- * 'dtrsTags'
+describeTagsResponse
+    :: Int -- ^ 'dtrsStatus'
+    -> DescribeTagsResponse
+describeTagsResponse pStatus_ =
+    DescribeTagsResponse'
+    { _dtrsMarker = Nothing
+    , _dtrsNextMarker = Nothing
+    , _dtrsStatus = pStatus_
+    , _dtrsTags = mempty
+    }
+
+-- | If the request included a 'Marker', the response returns that value in
+-- this field.
+dtrsMarker :: Lens' DescribeTagsResponse (Maybe Text)
+dtrsMarker = lens _dtrsMarker (\ s a -> s{_dtrsMarker = a});
+
+-- | If a value is present, there are more tags to return. In a subsequent
+-- request, you can provide the value of 'NextMarker' as the value of the
+-- 'Marker' parameter in your next request to retrieve the next set of
+-- tags.
+dtrsNextMarker :: Lens' DescribeTagsResponse (Maybe Text)
+dtrsNextMarker = lens _dtrsNextMarker (\ s a -> s{_dtrsNextMarker = a});
+
+-- | The response status code.
+dtrsStatus :: Lens' DescribeTagsResponse Int
+dtrsStatus = lens _dtrsStatus (\ s a -> s{_dtrsStatus = a});
+
+-- | Returns tags associated with the file system as an array of 'Tag'
+-- objects.
+dtrsTags :: Lens' DescribeTagsResponse [Tag]
+dtrsTags = lens _dtrsTags (\ s a -> s{_dtrsTags = a}) . _Coerce;
diff --git a/gen/Network/AWS/EFS/ModifyMountTargetSecurityGroups.hs b/gen/Network/AWS/EFS/ModifyMountTargetSecurityGroups.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/EFS/ModifyMountTargetSecurityGroups.hs
@@ -0,0 +1,127 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.EFS.ModifyMountTargetSecurityGroups
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Modifies the set of security groups in effect for a mount target.
+--
+-- When you create a mount target, Amazon EFS also creates a new network
+-- interface (see CreateMountTarget). This operation replaces the security
+-- groups in effect for the network interface associated with a mount
+-- target, with the 'SecurityGroups' provided in the request. This
+-- operation requires that the network interface of the mount target has
+-- been created and the life cycle state of the mount target is not
+-- \"deleted\".
+--
+-- The operation requires permissions for the following actions:
+--
+-- -   'elasticfilesystem:ModifyMountTargetSecurityGroups' action on the
+--     mount target\'s file system.
+-- -   'ec2:ModifyNetworkInterfaceAttribute' action on the mount target\'s
+--     network interface.
+--
+-- /See:/ <http://docs.aws.amazon.com/directoryservice/latest/devguide/API_ModifyMountTargetSecurityGroups.html AWS API Reference> for ModifyMountTargetSecurityGroups.
+module Network.AWS.EFS.ModifyMountTargetSecurityGroups
+    (
+    -- * Creating a Request
+      modifyMountTargetSecurityGroups
+    , ModifyMountTargetSecurityGroups
+    -- * Request Lenses
+    , mmtsgSecurityGroups
+    , mmtsgMountTargetId
+
+    -- * Destructuring the Response
+    , modifyMountTargetSecurityGroupsResponse
+    , ModifyMountTargetSecurityGroupsResponse
+    ) where
+
+import           Network.AWS.EFS.Types
+import           Network.AWS.EFS.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'modifyMountTargetSecurityGroups' smart constructor.
+data ModifyMountTargetSecurityGroups = ModifyMountTargetSecurityGroups'
+    { _mmtsgSecurityGroups :: !(Maybe [Text])
+    , _mmtsgMountTargetId  :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ModifyMountTargetSecurityGroups' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'mmtsgSecurityGroups'
+--
+-- * 'mmtsgMountTargetId'
+modifyMountTargetSecurityGroups
+    :: Text -- ^ 'mmtsgMountTargetId'
+    -> ModifyMountTargetSecurityGroups
+modifyMountTargetSecurityGroups pMountTargetId_ =
+    ModifyMountTargetSecurityGroups'
+    { _mmtsgSecurityGroups = Nothing
+    , _mmtsgMountTargetId = pMountTargetId_
+    }
+
+-- | An array of up to five VPC security group IDs.
+mmtsgSecurityGroups :: Lens' ModifyMountTargetSecurityGroups [Text]
+mmtsgSecurityGroups = lens _mmtsgSecurityGroups (\ s a -> s{_mmtsgSecurityGroups = a}) . _Default . _Coerce;
+
+-- | The ID of the mount target whose security groups you want to modify.
+mmtsgMountTargetId :: Lens' ModifyMountTargetSecurityGroups Text
+mmtsgMountTargetId = lens _mmtsgMountTargetId (\ s a -> s{_mmtsgMountTargetId = a});
+
+instance AWSRequest ModifyMountTargetSecurityGroups
+         where
+        type Sv ModifyMountTargetSecurityGroups = EFS
+        type Rs ModifyMountTargetSecurityGroups =
+             ModifyMountTargetSecurityGroupsResponse
+        request = putJSON
+        response
+          = receiveNull
+              ModifyMountTargetSecurityGroupsResponse'
+
+instance ToHeaders ModifyMountTargetSecurityGroups
+         where
+        toHeaders = const mempty
+
+instance ToJSON ModifyMountTargetSecurityGroups where
+        toJSON ModifyMountTargetSecurityGroups'{..}
+          = object ["SecurityGroups" .= _mmtsgSecurityGroups]
+
+instance ToPath ModifyMountTargetSecurityGroups where
+        toPath ModifyMountTargetSecurityGroups'{..}
+          = mconcat
+              ["/2015-02-01/mount-targets/",
+               toBS _mmtsgMountTargetId, "/security-groups"]
+
+instance ToQuery ModifyMountTargetSecurityGroups
+         where
+        toQuery = const mempty
+
+-- | /See:/ 'modifyMountTargetSecurityGroupsResponse' smart constructor.
+data ModifyMountTargetSecurityGroupsResponse =
+    ModifyMountTargetSecurityGroupsResponse'
+    deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ModifyMountTargetSecurityGroupsResponse' with the minimum fields required to make a request.
+--
+modifyMountTargetSecurityGroupsResponse
+    :: ModifyMountTargetSecurityGroupsResponse
+modifyMountTargetSecurityGroupsResponse =
+    ModifyMountTargetSecurityGroupsResponse'
diff --git a/gen/Network/AWS/EFS/Types.hs b/gen/Network/AWS/EFS/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/EFS/Types.hs
@@ -0,0 +1,219 @@
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TypeFamilies      #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.EFS.Types
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+module Network.AWS.EFS.Types
+    (
+    -- * Service
+      EFS
+
+    -- * Errors
+    , _MountTargetNotFound
+    , _SecurityGroupLimitExceeded
+    , _MountTargetConflict
+    , _UnsupportedAvailabilityZone
+    , _SecurityGroupNotFound
+    , _FileSystemAlreadyExists
+    , _FileSystemLimitExceeded
+    , _NetworkInterfaceLimitExceeded
+    , _FileSystemNotFound
+    , _SubnetNotFound
+    , _IncorrectFileSystemLifeCycleState
+    , _BadRequest
+    , _NoFreeAddressesInSubnet
+    , _DependencyTimeout
+    , _FileSystemInUse
+    , _IncorrectMountTargetState
+    , _InternalServerError
+    , _IPAddressInUse
+
+    -- * LifeCycleState
+    , LifeCycleState (..)
+
+    -- * FileSystemDescription
+    , FileSystemDescription
+    , fileSystemDescription
+    , fsdName
+    , fsdOwnerId
+    , fsdCreationToken
+    , fsdFileSystemId
+    , fsdCreationTime
+    , fsdLifeCycleState
+    , fsdNumberOfMountTargets
+    , fsdSizeInBytes
+
+    -- * FileSystemSize
+    , FileSystemSize
+    , fileSystemSize
+    , fssTimestamp
+    , fssValue
+
+    -- * MountTargetDescription
+    , MountTargetDescription
+    , mountTargetDescription
+    , mtdIPAddress
+    , mtdNetworkInterfaceId
+    , mtdOwnerId
+    , mtdMountTargetId
+    , mtdFileSystemId
+    , mtdSubnetId
+    , mtdLifeCycleState
+
+    -- * Tag
+    , Tag
+    , tag
+    , tagKey
+    , tagValue
+    ) where
+
+import           Network.AWS.EFS.Types.Product
+import           Network.AWS.EFS.Types.Sum
+import           Network.AWS.Prelude
+import           Network.AWS.Sign.V4
+
+-- | Version @2015-02-01@ of the Amazon Elastic File System SDK.
+data EFS
+
+instance AWSService EFS where
+    type Sg EFS = V4
+    service = const svc
+      where
+        svc =
+            Service
+            { _svcAbbrev = "EFS"
+            , _svcPrefix = "elasticfilesystem"
+            , _svcVersion = "2015-02-01"
+            , _svcEndpoint = defaultEndpoint svc
+            , _svcTimeout = Just 70
+            , _svcStatus = statusSuccess
+            , _svcError = parseJSONError
+            , _svcRetry = retry
+            }
+        retry =
+            Exponential
+            { _retryBase = 5.0e-2
+            , _retryGrowth = 2
+            , _retryAttempts = 5
+            , _retryCheck = check
+            }
+        check e
+          | has (hasCode "ThrottlingException" . hasStatus 400) e =
+              Just "throttling_exception"
+          | has (hasCode "Throttling" . hasStatus 400) e = Just "throttling"
+          | has (hasStatus 503) e = Just "service_unavailable"
+          | has (hasStatus 500) e = Just "general_server_error"
+          | has (hasStatus 509) e = Just "limit_exceeded"
+          | otherwise = Nothing
+
+-- | Returned if there is no mount target with the specified ID is found in
+-- the caller\'s account.
+_MountTargetNotFound :: AsError a => Getting (First ServiceError) a ServiceError
+_MountTargetNotFound =
+    _ServiceError . hasStatus 404 . hasCode "MountTargetNotFound"
+
+-- | Returned if the size of 'SecurityGroups' specified in the request is
+-- greater than five.
+_SecurityGroupLimitExceeded :: AsError a => Getting (First ServiceError) a ServiceError
+_SecurityGroupLimitExceeded =
+    _ServiceError . hasStatus 400 . hasCode "SecurityGroupLimitExceeded"
+
+-- | Returned if the mount target would violate one of the specified
+-- restrictions based on the file system\'s existing mount targets.
+_MountTargetConflict :: AsError a => Getting (First ServiceError) a ServiceError
+_MountTargetConflict =
+    _ServiceError . hasStatus 409 . hasCode "MountTargetConflict"
+
+-- | Prism for UnsupportedAvailabilityZone' errors.
+_UnsupportedAvailabilityZone :: AsError a => Getting (First ServiceError) a ServiceError
+_UnsupportedAvailabilityZone =
+    _ServiceError . hasStatus 400 . hasCode "UnsupportedAvailabilityZone"
+
+-- | Returned if one of the specified security groups does not exist in the
+-- subnet\'s VPC.
+_SecurityGroupNotFound :: AsError a => Getting (First ServiceError) a ServiceError
+_SecurityGroupNotFound =
+    _ServiceError . hasStatus 400 . hasCode "SecurityGroupNotFound"
+
+-- | Returned if the file system you are trying to create already exists,
+-- with the creation token you provided.
+_FileSystemAlreadyExists :: AsError a => Getting (First ServiceError) a ServiceError
+_FileSystemAlreadyExists =
+    _ServiceError . hasStatus 409 . hasCode "FileSystemAlreadyExists"
+
+-- | Returned if the AWS account has already created maximum number of file
+-- systems allowed per account.
+_FileSystemLimitExceeded :: AsError a => Getting (First ServiceError) a ServiceError
+_FileSystemLimitExceeded =
+    _ServiceError . hasStatus 403 . hasCode "FileSystemLimitExceeded"
+
+-- | The calling account has reached the ENI limit for the specific AWS
+-- region. Client should try to delete some ENIs or get its account limit
+-- raised. For more information, go to
+-- <http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Appendix_Limits.html Amazon VPC Limits>
+-- in the Amazon Virtual Private Cloud User Guide (see the Network
+-- interfaces per VPC entry in the table).
+_NetworkInterfaceLimitExceeded :: AsError a => Getting (First ServiceError) a ServiceError
+_NetworkInterfaceLimitExceeded =
+    _ServiceError . hasStatus 409 . hasCode "NetworkInterfaceLimitExceeded"
+
+-- | Returned if the specified 'FileSystemId' does not exist in the
+-- requester\'s AWS account.
+_FileSystemNotFound :: AsError a => Getting (First ServiceError) a ServiceError
+_FileSystemNotFound =
+    _ServiceError . hasStatus 404 . hasCode "FileSystemNotFound"
+
+-- | Returned if there is no subnet with ID 'SubnetId' provided in the
+-- request.
+_SubnetNotFound :: AsError a => Getting (First ServiceError) a ServiceError
+_SubnetNotFound = _ServiceError . hasStatus 400 . hasCode "SubnetNotFound"
+
+-- | Returned if the file system\'s life cycle state is not \"created\".
+_IncorrectFileSystemLifeCycleState :: AsError a => Getting (First ServiceError) a ServiceError
+_IncorrectFileSystemLifeCycleState =
+    _ServiceError . hasStatus 409 . hasCode "IncorrectFileSystemLifeCycleState"
+
+-- | Returned if the request is malformed or contains an error such as an
+-- invalid parameter value or a missing required parameter.
+_BadRequest :: AsError a => Getting (First ServiceError) a ServiceError
+_BadRequest = _ServiceError . hasStatus 400 . hasCode "BadRequest"
+
+-- | Returned if 'IpAddress' was not specified in the request and there are
+-- no free IP addresses in the subnet.
+_NoFreeAddressesInSubnet :: AsError a => Getting (First ServiceError) a ServiceError
+_NoFreeAddressesInSubnet =
+    _ServiceError . hasStatus 409 . hasCode "NoFreeAddressesInSubnet"
+
+-- | The service timed out trying to fulfill the request, and the client
+-- should try the call again.
+_DependencyTimeout :: AsError a => Getting (First ServiceError) a ServiceError
+_DependencyTimeout =
+    _ServiceError . hasStatus 504 . hasCode "DependencyTimeout"
+
+-- | Returned if a file system has mount targets.
+_FileSystemInUse :: AsError a => Getting (First ServiceError) a ServiceError
+_FileSystemInUse = _ServiceError . hasStatus 409 . hasCode "FileSystemInUse"
+
+-- | Returned if the mount target is not in the correct state for the
+-- operation.
+_IncorrectMountTargetState :: AsError a => Getting (First ServiceError) a ServiceError
+_IncorrectMountTargetState =
+    _ServiceError . hasStatus 409 . hasCode "IncorrectMountTargetState"
+
+-- | Returned if an error occurred on the server side.
+_InternalServerError :: AsError a => Getting (First ServiceError) a ServiceError
+_InternalServerError =
+    _ServiceError . hasStatus 500 . hasCode "InternalServerError"
+
+-- | Returned if the request specified an 'IpAddress' that is already in use
+-- in the subnet.
+_IPAddressInUse :: AsError a => Getting (First ServiceError) a ServiceError
+_IPAddressInUse = _ServiceError . hasStatus 409 . hasCode "IpAddressInUse"
diff --git a/gen/Network/AWS/EFS/Types/Product.hs b/gen/Network/AWS/EFS/Types/Product.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/EFS/Types/Product.hs
@@ -0,0 +1,320 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.EFS.Types.Product
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+module Network.AWS.EFS.Types.Product where
+
+import           Network.AWS.EFS.Types.Sum
+import           Network.AWS.Prelude
+
+-- | This object provides description of a file system.
+--
+-- /See:/ 'fileSystemDescription' smart constructor.
+data FileSystemDescription = FileSystemDescription'
+    { _fsdName                 :: !(Maybe Text)
+    , _fsdOwnerId              :: !Text
+    , _fsdCreationToken        :: !Text
+    , _fsdFileSystemId         :: !Text
+    , _fsdCreationTime         :: !POSIX
+    , _fsdLifeCycleState       :: !LifeCycleState
+    , _fsdNumberOfMountTargets :: !Nat
+    , _fsdSizeInBytes          :: !FileSystemSize
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'FileSystemDescription' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'fsdName'
+--
+-- * 'fsdOwnerId'
+--
+-- * 'fsdCreationToken'
+--
+-- * 'fsdFileSystemId'
+--
+-- * 'fsdCreationTime'
+--
+-- * 'fsdLifeCycleState'
+--
+-- * 'fsdNumberOfMountTargets'
+--
+-- * 'fsdSizeInBytes'
+fileSystemDescription
+    :: Text -- ^ 'fsdOwnerId'
+    -> Text -- ^ 'fsdCreationToken'
+    -> Text -- ^ 'fsdFileSystemId'
+    -> UTCTime -- ^ 'fsdCreationTime'
+    -> LifeCycleState -- ^ 'fsdLifeCycleState'
+    -> Natural -- ^ 'fsdNumberOfMountTargets'
+    -> FileSystemSize -- ^ 'fsdSizeInBytes'
+    -> FileSystemDescription
+fileSystemDescription pOwnerId_ pCreationToken_ pFileSystemId_ pCreationTime_ pLifeCycleState_ pNumberOfMountTargets_ pSizeInBytes_ =
+    FileSystemDescription'
+    { _fsdName = Nothing
+    , _fsdOwnerId = pOwnerId_
+    , _fsdCreationToken = pCreationToken_
+    , _fsdFileSystemId = pFileSystemId_
+    , _fsdCreationTime = _Time # pCreationTime_
+    , _fsdLifeCycleState = pLifeCycleState_
+    , _fsdNumberOfMountTargets = _Nat # pNumberOfMountTargets_
+    , _fsdSizeInBytes = pSizeInBytes_
+    }
+
+-- | You can add tags to a file system (see CreateTags) including a \"Name\"
+-- tag. If the file system has a \"Name\" tag, Amazon EFS returns the value
+-- in this field.
+fsdName :: Lens' FileSystemDescription (Maybe Text)
+fsdName = lens _fsdName (\ s a -> s{_fsdName = a});
+
+-- | The AWS account that created the file system. If the file system was
+-- created by an IAM user, the parent account to which the user belongs is
+-- the owner.
+fsdOwnerId :: Lens' FileSystemDescription Text
+fsdOwnerId = lens _fsdOwnerId (\ s a -> s{_fsdOwnerId = a});
+
+-- | Opaque string specified in the request.
+fsdCreationToken :: Lens' FileSystemDescription Text
+fsdCreationToken = lens _fsdCreationToken (\ s a -> s{_fsdCreationToken = a});
+
+-- | The file system ID assigned by Amazon EFS.
+fsdFileSystemId :: Lens' FileSystemDescription Text
+fsdFileSystemId = lens _fsdFileSystemId (\ s a -> s{_fsdFileSystemId = a});
+
+-- | The time at which the file system was created, in seconds, since
+-- 1970-01-01T00:00:00Z.
+fsdCreationTime :: Lens' FileSystemDescription UTCTime
+fsdCreationTime = lens _fsdCreationTime (\ s a -> s{_fsdCreationTime = a}) . _Time;
+
+-- | A predefined string value that indicates the lifecycle phase of the file
+-- system.
+fsdLifeCycleState :: Lens' FileSystemDescription LifeCycleState
+fsdLifeCycleState = lens _fsdLifeCycleState (\ s a -> s{_fsdLifeCycleState = a});
+
+-- | The current number of mount targets (see CreateMountTarget) the file
+-- system has.
+fsdNumberOfMountTargets :: Lens' FileSystemDescription Natural
+fsdNumberOfMountTargets = lens _fsdNumberOfMountTargets (\ s a -> s{_fsdNumberOfMountTargets = a}) . _Nat;
+
+-- | This object provides the latest known metered size of data stored in the
+-- file system, in bytes, in its 'Value' field, and the time at which that
+-- size was determined in its 'Timestamp' field. The 'Timestamp' value is
+-- the integer number of seconds since 1970-01-01T00:00:00Z. Note that the
+-- value does not represent the size of a consistent snapshot of the file
+-- system, but it is eventually consistent when there are no writes to the
+-- file system. That is, the value will represent actual size only if the
+-- file system is not modified for a period longer than a couple of hours.
+-- Otherwise, the value is not the exact size the file system was at any
+-- instant in time.
+fsdSizeInBytes :: Lens' FileSystemDescription FileSystemSize
+fsdSizeInBytes = lens _fsdSizeInBytes (\ s a -> s{_fsdSizeInBytes = a});
+
+instance FromJSON FileSystemDescription where
+        parseJSON
+          = withObject "FileSystemDescription"
+              (\ x ->
+                 FileSystemDescription' <$>
+                   (x .:? "Name") <*> (x .: "OwnerId") <*>
+                     (x .: "CreationToken")
+                     <*> (x .: "FileSystemId")
+                     <*> (x .: "CreationTime")
+                     <*> (x .: "LifeCycleState")
+                     <*> (x .: "NumberOfMountTargets")
+                     <*> (x .: "SizeInBytes"))
+
+-- | This object provides the latest known metered size, in bytes, of data
+-- stored in the file system, in its 'Value' field, and the time at which
+-- that size was determined in its 'Timestamp' field. Note that the value
+-- does not represent the size of a consistent snapshot of the file system,
+-- but it is eventually consistent when there are no writes to the file
+-- system. That is, the value will represent the actual size only if the
+-- file system is not modified for a period longer than a couple of hours.
+-- Otherwise, the value is not necessarily the exact size the file system
+-- was at any instant in time.
+--
+-- /See:/ 'fileSystemSize' smart constructor.
+data FileSystemSize = FileSystemSize'
+    { _fssTimestamp :: !(Maybe POSIX)
+    , _fssValue     :: !Nat
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'FileSystemSize' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'fssTimestamp'
+--
+-- * 'fssValue'
+fileSystemSize
+    :: Natural -- ^ 'fssValue'
+    -> FileSystemSize
+fileSystemSize pValue_ =
+    FileSystemSize'
+    { _fssTimestamp = Nothing
+    , _fssValue = _Nat # pValue_
+    }
+
+-- | The time at which the size of data, returned in the 'Value' field, was
+-- determined. The value is the integer number of seconds since
+-- 1970-01-01T00:00:00Z.
+fssTimestamp :: Lens' FileSystemSize (Maybe UTCTime)
+fssTimestamp = lens _fssTimestamp (\ s a -> s{_fssTimestamp = a}) . mapping _Time;
+
+-- | The latest known metered size, in bytes, of data stored in the file
+-- system.
+fssValue :: Lens' FileSystemSize Natural
+fssValue = lens _fssValue (\ s a -> s{_fssValue = a}) . _Nat;
+
+instance FromJSON FileSystemSize where
+        parseJSON
+          = withObject "FileSystemSize"
+              (\ x ->
+                 FileSystemSize' <$>
+                   (x .:? "Timestamp") <*> (x .: "Value"))
+
+-- | This object provides description of a mount target.
+--
+-- /See:/ 'mountTargetDescription' smart constructor.
+data MountTargetDescription = MountTargetDescription'
+    { _mtdIPAddress          :: !(Maybe Text)
+    , _mtdNetworkInterfaceId :: !(Maybe Text)
+    , _mtdOwnerId            :: !(Maybe Text)
+    , _mtdMountTargetId      :: !Text
+    , _mtdFileSystemId       :: !Text
+    , _mtdSubnetId           :: !Text
+    , _mtdLifeCycleState     :: !LifeCycleState
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'MountTargetDescription' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'mtdIPAddress'
+--
+-- * 'mtdNetworkInterfaceId'
+--
+-- * 'mtdOwnerId'
+--
+-- * 'mtdMountTargetId'
+--
+-- * 'mtdFileSystemId'
+--
+-- * 'mtdSubnetId'
+--
+-- * 'mtdLifeCycleState'
+mountTargetDescription
+    :: Text -- ^ 'mtdMountTargetId'
+    -> Text -- ^ 'mtdFileSystemId'
+    -> Text -- ^ 'mtdSubnetId'
+    -> LifeCycleState -- ^ 'mtdLifeCycleState'
+    -> MountTargetDescription
+mountTargetDescription pMountTargetId_ pFileSystemId_ pSubnetId_ pLifeCycleState_ =
+    MountTargetDescription'
+    { _mtdIPAddress = Nothing
+    , _mtdNetworkInterfaceId = Nothing
+    , _mtdOwnerId = Nothing
+    , _mtdMountTargetId = pMountTargetId_
+    , _mtdFileSystemId = pFileSystemId_
+    , _mtdSubnetId = pSubnetId_
+    , _mtdLifeCycleState = pLifeCycleState_
+    }
+
+-- | The address at which the file system may be mounted via the mount
+-- target.
+mtdIPAddress :: Lens' MountTargetDescription (Maybe Text)
+mtdIPAddress = lens _mtdIPAddress (\ s a -> s{_mtdIPAddress = a});
+
+-- | The ID of the network interface that Amazon EFS created when it created
+-- the mount target.
+mtdNetworkInterfaceId :: Lens' MountTargetDescription (Maybe Text)
+mtdNetworkInterfaceId = lens _mtdNetworkInterfaceId (\ s a -> s{_mtdNetworkInterfaceId = a});
+
+-- | The AWS account ID that owns the resource.
+mtdOwnerId :: Lens' MountTargetDescription (Maybe Text)
+mtdOwnerId = lens _mtdOwnerId (\ s a -> s{_mtdOwnerId = a});
+
+-- | The system-assigned mount target ID.
+mtdMountTargetId :: Lens' MountTargetDescription Text
+mtdMountTargetId = lens _mtdMountTargetId (\ s a -> s{_mtdMountTargetId = a});
+
+-- | The ID of the file system for which the mount target is intended.
+mtdFileSystemId :: Lens' MountTargetDescription Text
+mtdFileSystemId = lens _mtdFileSystemId (\ s a -> s{_mtdFileSystemId = a});
+
+-- | The ID of the subnet that the mount target is in.
+mtdSubnetId :: Lens' MountTargetDescription Text
+mtdSubnetId = lens _mtdSubnetId (\ s a -> s{_mtdSubnetId = a});
+
+-- | The lifecycle state the mount target is in.
+mtdLifeCycleState :: Lens' MountTargetDescription LifeCycleState
+mtdLifeCycleState = lens _mtdLifeCycleState (\ s a -> s{_mtdLifeCycleState = a});
+
+instance FromJSON MountTargetDescription where
+        parseJSON
+          = withObject "MountTargetDescription"
+              (\ x ->
+                 MountTargetDescription' <$>
+                   (x .:? "IpAddress") <*> (x .:? "NetworkInterfaceId")
+                     <*> (x .:? "OwnerId")
+                     <*> (x .: "MountTargetId")
+                     <*> (x .: "FileSystemId")
+                     <*> (x .: "SubnetId")
+                     <*> (x .: "LifeCycleState"))
+
+-- | A tag is a pair of key and value. The allowed characters in keys and
+-- values are letters, whitespace, and numbers, representable in UTF-8, and
+-- the characters \'+\', \'-\', \'=\', \'.\', \'_\', \':\', and \'\/\'.
+--
+-- /See:/ 'tag' smart constructor.
+data Tag = Tag'
+    { _tagKey   :: !Text
+    , _tagValue :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Tag' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'tagKey'
+--
+-- * 'tagValue'
+tag
+    :: Text -- ^ 'tagKey'
+    -> Text -- ^ 'tagValue'
+    -> Tag
+tag pKey_ pValue_ =
+    Tag'
+    { _tagKey = pKey_
+    , _tagValue = pValue_
+    }
+
+-- | Tag key, a string. The key must not start with \"aws:\".
+tagKey :: Lens' Tag Text
+tagKey = lens _tagKey (\ s a -> s{_tagKey = a});
+
+-- | Value of the tag key.
+tagValue :: Lens' Tag Text
+tagValue = lens _tagValue (\ s a -> s{_tagValue = a});
+
+instance FromJSON Tag where
+        parseJSON
+          = withObject "Tag"
+              (\ x -> Tag' <$> (x .: "Key") <*> (x .: "Value"))
+
+instance ToJSON Tag where
+        toJSON Tag'{..}
+          = object ["Key" .= _tagKey, "Value" .= _tagValue]
diff --git a/gen/Network/AWS/EFS/Types/Sum.hs b/gen/Network/AWS/EFS/Types/Sum.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/EFS/Types/Sum.hs
@@ -0,0 +1,51 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE LambdaCase         #-}
+{-# LANGUAGE OverloadedStrings  #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.EFS.Types.Sum
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+module Network.AWS.EFS.Types.Sum where
+
+import           Network.AWS.Prelude
+
+data LifeCycleState
+    = Available
+    | Creating
+    | Deleted
+    | Deleting
+    deriving (Eq,Ord,Read,Show,Enum,Data,Typeable,Generic)
+
+instance FromText LifeCycleState where
+    parser = takeLowerText >>= \case
+        "available" -> pure Available
+        "creating" -> pure Creating
+        "deleted" -> pure Deleted
+        "deleting" -> pure Deleting
+        e -> fromTextError $ "Failure parsing LifeCycleState from value: '" <> e
+           <> "'. Accepted values: available, creating, deleted, deleting"
+
+instance ToText LifeCycleState where
+    toText = \case
+        Available -> "available"
+        Creating -> "creating"
+        Deleted -> "deleted"
+        Deleting -> "deleting"
+
+instance Hashable     LifeCycleState
+instance ToByteString LifeCycleState
+instance ToQuery      LifeCycleState
+instance ToHeader     LifeCycleState
+
+instance FromJSON LifeCycleState where
+    parseJSON = parseJSONText "LifeCycleState"
diff --git a/gen/Network/AWS/EFS/Waiters.hs b/gen/Network/AWS/EFS/Waiters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/EFS/Waiters.hs
@@ -0,0 +1,20 @@
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TypeFamilies      #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.EFS.Waiters
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+module Network.AWS.EFS.Waiters where
+
+import           Network.AWS.EFS.Types
+import           Network.AWS.Prelude
+import           Network.AWS.Waiter
diff --git a/test/Main.hs b/test/Main.hs
new file mode 100644
--- /dev/null
+++ b/test/Main.hs
@@ -0,0 +1,21 @@
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Main
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+module Main (main) where
+
+import Test.Tasty
+import Test.AWS.EFS
+import Test.AWS.EFS.Internal
+
+main :: IO ()
+main = defaultMain $ testGroup "EFS"
+    [ testGroup "tests"    tests
+    , testGroup "fixtures" fixtures
+    ]
diff --git a/test/Test/AWS/EFS.hs b/test/Test/AWS/EFS.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/AWS/EFS.hs
@@ -0,0 +1,26 @@
+{-# LANGUAGE OverloadedStrings #-}
+
+-- Module      : Test.AWS.nEFS
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : This Source Code Form is subject to the terms of
+--               the Mozilla Public License, v. 2.0.
+--               A copy of the MPL can be found in the LICENSE file or
+--               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : experimental
+-- Portability : non-portable (GHC extensions)
+
+module Test.AWS.EFS
+    ( tests
+    , fixtures
+    ) where
+
+import           Network.AWS.EFS
+import           Test.AWS.Gen.EFS
+import           Test.Tasty
+
+tests :: [TestTree]
+tests = []
+
+fixtures :: [TestTree]
+fixtures = []
diff --git a/test/Test/AWS/EFS/Internal.hs b/test/Test/AWS/EFS/Internal.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/AWS/EFS/Internal.hs
@@ -0,0 +1,16 @@
+{-# LANGUAGE OverloadedStrings #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Test.AWS.EFS.Internal
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : This Source Code Form is subject to the terms of
+--               the Mozilla Public License, v. 2.0.
+--               A copy of the MPL can be found in the LICENSE file or
+--               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : experimental
+-- Portability : non-portable (GHC extensions)
+
+module Test.AWS.EFS.Internal where
+
+import Test.AWS.Prelude
diff --git a/test/Test/AWS/Gen/EFS.hs b/test/Test/AWS/Gen/EFS.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/AWS/Gen/EFS.hs
@@ -0,0 +1,226 @@
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-orphans        #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Test.AWS.Gen.EFS
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+module Test.AWS.Gen.EFS where
+
+import Data.Proxy
+import Test.AWS.Fixture
+import Test.AWS.Prelude
+import Test.Tasty
+import Network.AWS.EFS
+import Test.AWS.EFS.Internal
+
+-- Auto-generated: the actual test selection needs to be manually placed into
+-- the top-level so that real test data can be incrementally added.
+--
+-- This commented snippet is what the entire set should look like:
+
+-- fixtures :: TestTree
+-- fixtures =
+--     [ testGroup "request"
+--         [ testDescribeTags $
+--             describeTags
+--
+--         , testDescribeMountTargets $
+--             describeMountTargets
+--
+--         , testDeleteMountTarget $
+--             deleteMountTarget
+--
+--         , testCreateTags $
+--             createTags
+--
+--         , testDescribeFileSystems $
+--             describeFileSystems
+--
+--         , testDeleteTags $
+--             deleteTags
+--
+--         , testDescribeMountTargetSecurityGroups $
+--             describeMountTargetSecurityGroups
+--
+--         , testModifyMountTargetSecurityGroups $
+--             modifyMountTargetSecurityGroups
+--
+--         , testCreateFileSystem $
+--             createFileSystem
+--
+--         , testDeleteFileSystem $
+--             deleteFileSystem
+--
+--         , testCreateMountTarget $
+--             createMountTarget
+--
+--           ]
+
+--     , testGroup "response"
+--         [ testDescribeTagsResponse $
+--             describeTagsResponse
+--
+--         , testDescribeMountTargetsResponse $
+--             describeMountTargetsResponse
+--
+--         , testDeleteMountTargetResponse $
+--             deleteMountTargetResponse
+--
+--         , testCreateTagsResponse $
+--             createTagsResponse
+--
+--         , testDescribeFileSystemsResponse $
+--             describeFileSystemsResponse
+--
+--         , testDeleteTagsResponse $
+--             deleteTagsResponse
+--
+--         , testDescribeMountTargetSecurityGroupsResponse $
+--             describeMountTargetSecurityGroupsResponse
+--
+--         , testModifyMountTargetSecurityGroupsResponse $
+--             modifyMountTargetSecurityGroupsResponse
+--
+--         , testCreateFileSystemResponse $
+--             fileSystemDescription
+--
+--         , testDeleteFileSystemResponse $
+--             deleteFileSystemResponse
+--
+--         , testCreateMountTargetResponse $
+--             mountTargetDescription
+--
+--           ]
+--     ]
+
+-- Requests
+
+testDescribeTags :: DescribeTags -> TestTree
+testDescribeTags = req
+    "DescribeTags"
+    "fixture/DescribeTags"
+
+testDescribeMountTargets :: DescribeMountTargets -> TestTree
+testDescribeMountTargets = req
+    "DescribeMountTargets"
+    "fixture/DescribeMountTargets"
+
+testDeleteMountTarget :: DeleteMountTarget -> TestTree
+testDeleteMountTarget = req
+    "DeleteMountTarget"
+    "fixture/DeleteMountTarget"
+
+testCreateTags :: CreateTags -> TestTree
+testCreateTags = req
+    "CreateTags"
+    "fixture/CreateTags"
+
+testDescribeFileSystems :: DescribeFileSystems -> TestTree
+testDescribeFileSystems = req
+    "DescribeFileSystems"
+    "fixture/DescribeFileSystems"
+
+testDeleteTags :: DeleteTags -> TestTree
+testDeleteTags = req
+    "DeleteTags"
+    "fixture/DeleteTags"
+
+testDescribeMountTargetSecurityGroups :: DescribeMountTargetSecurityGroups -> TestTree
+testDescribeMountTargetSecurityGroups = req
+    "DescribeMountTargetSecurityGroups"
+    "fixture/DescribeMountTargetSecurityGroups"
+
+testModifyMountTargetSecurityGroups :: ModifyMountTargetSecurityGroups -> TestTree
+testModifyMountTargetSecurityGroups = req
+    "ModifyMountTargetSecurityGroups"
+    "fixture/ModifyMountTargetSecurityGroups"
+
+testCreateFileSystem :: CreateFileSystem -> TestTree
+testCreateFileSystem = req
+    "CreateFileSystem"
+    "fixture/CreateFileSystem"
+
+testDeleteFileSystem :: DeleteFileSystem -> TestTree
+testDeleteFileSystem = req
+    "DeleteFileSystem"
+    "fixture/DeleteFileSystem"
+
+testCreateMountTarget :: CreateMountTarget -> TestTree
+testCreateMountTarget = req
+    "CreateMountTarget"
+    "fixture/CreateMountTarget"
+
+-- Responses
+
+testDescribeTagsResponse :: DescribeTagsResponse -> TestTree
+testDescribeTagsResponse = res
+    "DescribeTagsResponse"
+    "fixture/DescribeTagsResponse"
+    (Proxy :: Proxy DescribeTags)
+
+testDescribeMountTargetsResponse :: DescribeMountTargetsResponse -> TestTree
+testDescribeMountTargetsResponse = res
+    "DescribeMountTargetsResponse"
+    "fixture/DescribeMountTargetsResponse"
+    (Proxy :: Proxy DescribeMountTargets)
+
+testDeleteMountTargetResponse :: DeleteMountTargetResponse -> TestTree
+testDeleteMountTargetResponse = res
+    "DeleteMountTargetResponse"
+    "fixture/DeleteMountTargetResponse"
+    (Proxy :: Proxy DeleteMountTarget)
+
+testCreateTagsResponse :: CreateTagsResponse -> TestTree
+testCreateTagsResponse = res
+    "CreateTagsResponse"
+    "fixture/CreateTagsResponse"
+    (Proxy :: Proxy CreateTags)
+
+testDescribeFileSystemsResponse :: DescribeFileSystemsResponse -> TestTree
+testDescribeFileSystemsResponse = res
+    "DescribeFileSystemsResponse"
+    "fixture/DescribeFileSystemsResponse"
+    (Proxy :: Proxy DescribeFileSystems)
+
+testDeleteTagsResponse :: DeleteTagsResponse -> TestTree
+testDeleteTagsResponse = res
+    "DeleteTagsResponse"
+    "fixture/DeleteTagsResponse"
+    (Proxy :: Proxy DeleteTags)
+
+testDescribeMountTargetSecurityGroupsResponse :: DescribeMountTargetSecurityGroupsResponse -> TestTree
+testDescribeMountTargetSecurityGroupsResponse = res
+    "DescribeMountTargetSecurityGroupsResponse"
+    "fixture/DescribeMountTargetSecurityGroupsResponse"
+    (Proxy :: Proxy DescribeMountTargetSecurityGroups)
+
+testModifyMountTargetSecurityGroupsResponse :: ModifyMountTargetSecurityGroupsResponse -> TestTree
+testModifyMountTargetSecurityGroupsResponse = res
+    "ModifyMountTargetSecurityGroupsResponse"
+    "fixture/ModifyMountTargetSecurityGroupsResponse"
+    (Proxy :: Proxy ModifyMountTargetSecurityGroups)
+
+testCreateFileSystemResponse :: FileSystemDescription -> TestTree
+testCreateFileSystemResponse = res
+    "CreateFileSystemResponse"
+    "fixture/CreateFileSystemResponse"
+    (Proxy :: Proxy CreateFileSystem)
+
+testDeleteFileSystemResponse :: DeleteFileSystemResponse -> TestTree
+testDeleteFileSystemResponse = res
+    "DeleteFileSystemResponse"
+    "fixture/DeleteFileSystemResponse"
+    (Proxy :: Proxy DeleteFileSystem)
+
+testCreateMountTargetResponse :: MountTargetDescription -> TestTree
+testCreateMountTargetResponse = res
+    "CreateMountTargetResponse"
+    "fixture/CreateMountTargetResponse"
+    (Proxy :: Proxy CreateMountTarget)
