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,46 @@
+# Amazon Directory Service SDK
+
+* [Version](#version)
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+
+## Version
+
+`1.0.0`
+
+
+## Description
+
+AWS Directory Service
+
+This is the /AWS Directory Service API Reference/. This guide provides
+detailed information about AWS Directory Service operations, data types,
+parameters, and errors.
+
+Documentation is available via [Hackage](http://hackage.haskell.org/package/amazonka-ds)
+and the [AWS API Reference](http://docs.aws.amazon.com/directoryservice/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-ds` 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-ds.cabal b/amazonka-ds.cabal
new file mode 100644
--- /dev/null
+++ b/amazonka-ds.cabal
@@ -0,0 +1,102 @@
+name:                  amazonka-ds
+version:               1.0.0
+synopsis:              Amazon Directory Service 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:
+    AWS Directory Service
+
+    This is the /AWS Directory Service API Reference/. This guide provides
+    detailed information about AWS Directory Service operations, data types,
+    parameters, and errors.
+    .
+    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.DirectoryService" and the <http://docs.aws.amazon.com/directoryservice/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.DirectoryService
+        , Network.AWS.DirectoryService.ConnectDirectory
+        , Network.AWS.DirectoryService.CreateAlias
+        , Network.AWS.DirectoryService.CreateComputer
+        , Network.AWS.DirectoryService.CreateDirectory
+        , Network.AWS.DirectoryService.CreateSnapshot
+        , Network.AWS.DirectoryService.DeleteDirectory
+        , Network.AWS.DirectoryService.DeleteSnapshot
+        , Network.AWS.DirectoryService.DescribeDirectories
+        , Network.AWS.DirectoryService.DescribeSnapshots
+        , Network.AWS.DirectoryService.DisableRadius
+        , Network.AWS.DirectoryService.DisableSSO
+        , Network.AWS.DirectoryService.EnableRadius
+        , Network.AWS.DirectoryService.EnableSSO
+        , Network.AWS.DirectoryService.GetDirectoryLimits
+        , Network.AWS.DirectoryService.GetSnapshotLimits
+        , Network.AWS.DirectoryService.RestoreFromSnapshot
+        , Network.AWS.DirectoryService.Types
+        , Network.AWS.DirectoryService.UpdateRadius
+        , Network.AWS.DirectoryService.Waiters
+
+    other-modules:
+          Network.AWS.DirectoryService.Types.Product
+        , Network.AWS.DirectoryService.Types.Sum
+
+    build-depends:
+          amazonka-core == 1.0.0.*
+        , base          >= 4.7     && < 5
+
+test-suite amazonka-ds-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.DirectoryService
+        , Test.AWS.Gen.DirectoryService
+        , Test.AWS.DirectoryService.Internal
+
+    build-depends:
+          amazonka-core == 1.0.0
+        , amazonka-test == 1.0.0
+        , amazonka-ds == 1.0.0
+        , base
+        , bytestring
+        , lens
+        , tasty
+        , tasty-hunit
+        , text
+        , time
+        , unordered-containers
diff --git a/gen/Network/AWS/DirectoryService.hs b/gen/Network/AWS/DirectoryService.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DirectoryService.hs
@@ -0,0 +1,300 @@
+{-# 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.DirectoryService
+-- 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)
+--
+-- AWS Directory Service
+--
+-- This is the /AWS Directory Service API Reference/. This guide provides
+-- detailed information about AWS Directory Service operations, data types,
+-- parameters, and errors.
+--
+-- /See:/ <http://docs.aws.amazon.com/directoryservice/latest/devguide/welcome.html AWS API Reference>
+module Network.AWS.DirectoryService
+    (
+    -- * Service
+      DirectoryService
+
+    -- * Errors
+    -- $errors
+
+    -- ** AuthenticationFailedException
+    , _AuthenticationFailedException
+
+    -- ** DirectoryUnavailableException
+    , _DirectoryUnavailableException
+
+    -- ** InvalidParameterException
+    , _InvalidParameterException
+
+    -- ** UnsupportedOperationException
+    , _UnsupportedOperationException
+
+    -- ** EntityAlreadyExistsException
+    , _EntityAlreadyExistsException
+
+    -- ** DirectoryLimitExceededException
+    , _DirectoryLimitExceededException
+
+    -- ** EntityDoesNotExistException
+    , _EntityDoesNotExistException
+
+    -- ** InsufficientPermissionsException
+    , _InsufficientPermissionsException
+
+    -- ** InvalidNextTokenException
+    , _InvalidNextTokenException
+
+    -- ** ServiceException
+    , _ServiceException
+
+    -- ** SnapshotLimitExceededException
+    , _SnapshotLimitExceededException
+
+    -- ** ClientException
+    , _ClientException
+
+    -- * Waiters
+    -- $waiters
+
+    -- * Operations
+    -- $operations
+
+    -- ** GetSnapshotLimits
+    , module Network.AWS.DirectoryService.GetSnapshotLimits
+
+    -- ** ConnectDirectory
+    , module Network.AWS.DirectoryService.ConnectDirectory
+
+    -- ** DescribeDirectories
+    , module Network.AWS.DirectoryService.DescribeDirectories
+
+    -- ** CreateAlias
+    , module Network.AWS.DirectoryService.CreateAlias
+
+    -- ** CreateDirectory
+    , module Network.AWS.DirectoryService.CreateDirectory
+
+    -- ** EnableSSO
+    , module Network.AWS.DirectoryService.EnableSSO
+
+    -- ** EnableRadius
+    , module Network.AWS.DirectoryService.EnableRadius
+
+    -- ** DisableRadius
+    , module Network.AWS.DirectoryService.DisableRadius
+
+    -- ** DescribeSnapshots
+    , module Network.AWS.DirectoryService.DescribeSnapshots
+
+    -- ** RestoreFromSnapshot
+    , module Network.AWS.DirectoryService.RestoreFromSnapshot
+
+    -- ** DeleteSnapshot
+    , module Network.AWS.DirectoryService.DeleteSnapshot
+
+    -- ** CreateSnapshot
+    , module Network.AWS.DirectoryService.CreateSnapshot
+
+    -- ** DeleteDirectory
+    , module Network.AWS.DirectoryService.DeleteDirectory
+
+    -- ** DisableSSO
+    , module Network.AWS.DirectoryService.DisableSSO
+
+    -- ** CreateComputer
+    , module Network.AWS.DirectoryService.CreateComputer
+
+    -- ** GetDirectoryLimits
+    , module Network.AWS.DirectoryService.GetDirectoryLimits
+
+    -- ** UpdateRadius
+    , module Network.AWS.DirectoryService.UpdateRadius
+
+    -- * Types
+
+    -- ** DirectorySize
+    , DirectorySize (..)
+
+    -- ** DirectoryStage
+    , DirectoryStage (..)
+
+    -- ** DirectoryType
+    , DirectoryType (..)
+
+    -- ** RadiusAuthenticationProtocol
+    , RadiusAuthenticationProtocol (..)
+
+    -- ** RadiusStatus
+    , RadiusStatus (..)
+
+    -- ** SnapshotStatus
+    , SnapshotStatus (..)
+
+    -- ** SnapshotType
+    , SnapshotType (..)
+
+    -- ** Attribute
+    , Attribute
+    , attribute
+    , aValue
+    , aName
+
+    -- ** Computer
+    , Computer
+    , computer
+    , cComputerId
+    , cComputerAttributes
+    , cComputerName
+
+    -- ** DirectoryConnectSettings
+    , DirectoryConnectSettings
+    , directoryConnectSettings
+    , dcsVPCId
+    , dcsSubnetIds
+    , dcsCustomerDNSIPs
+    , dcsCustomerUserName
+
+    -- ** DirectoryConnectSettingsDescription
+    , DirectoryConnectSettingsDescription
+    , directoryConnectSettingsDescription
+    , dcsdCustomerUserName
+    , dcsdSubnetIds
+    , dcsdVPCId
+    , dcsdConnectIPs
+    , dcsdSecurityGroupId
+    , dcsdAvailabilityZones
+
+    -- ** DirectoryDescription
+    , DirectoryDescription
+    , directoryDescription
+    , ddRadiusStatus
+    , ddDirectoryId
+    , ddStage
+    , ddAccessURL
+    , ddShortName
+    , ddSize
+    , ddRadiusSettings
+    , ddLaunchTime
+    , ddAlias
+    , ddName
+    , ddSSOEnabled
+    , ddStageLastUpdatedDateTime
+    , ddStageReason
+    , ddDNSIPAddrs
+    , ddVPCSettings
+    , ddType
+    , ddConnectSettings
+    , ddDescription
+
+    -- ** DirectoryLimits
+    , DirectoryLimits
+    , directoryLimits
+    , dlConnectedDirectoriesCurrentCount
+    , dlConnectedDirectoriesLimit
+    , dlConnectedDirectoriesLimitReached
+    , dlCloudOnlyDirectoriesLimit
+    , dlCloudOnlyDirectoriesCurrentCount
+    , dlCloudOnlyDirectoriesLimitReached
+
+    -- ** DirectoryVPCSettings
+    , DirectoryVPCSettings
+    , directoryVPCSettings
+    , dvsVPCId
+    , dvsSubnetIds
+
+    -- ** DirectoryVPCSettingsDescription
+    , DirectoryVPCSettingsDescription
+    , directoryVPCSettingsDescription
+    , dvsdSubnetIds
+    , dvsdVPCId
+    , dvsdSecurityGroupId
+    , dvsdAvailabilityZones
+
+    -- ** RadiusSettings
+    , RadiusSettings
+    , radiusSettings
+    , rsDisplayLabel
+    , rsRadiusServers
+    , rsRadiusRetries
+    , rsAuthenticationProtocol
+    , rsUseSameUsername
+    , rsSharedSecret
+    , rsRadiusTimeout
+    , rsRadiusPort
+
+    -- ** Snapshot
+    , Snapshot
+    , snapshot
+    , sDirectoryId
+    , sStatus
+    , sStartTime
+    , sName
+    , sType
+    , sSnapshotId
+
+    -- ** SnapshotLimits
+    , SnapshotLimits
+    , snapshotLimits
+    , slManualSnapshotsLimitReached
+    , slManualSnapshotsCurrentCount
+    , slManualSnapshotsLimit
+    ) where
+
+import           Network.AWS.DirectoryService.ConnectDirectory
+import           Network.AWS.DirectoryService.CreateAlias
+import           Network.AWS.DirectoryService.CreateComputer
+import           Network.AWS.DirectoryService.CreateDirectory
+import           Network.AWS.DirectoryService.CreateSnapshot
+import           Network.AWS.DirectoryService.DeleteDirectory
+import           Network.AWS.DirectoryService.DeleteSnapshot
+import           Network.AWS.DirectoryService.DescribeDirectories
+import           Network.AWS.DirectoryService.DescribeSnapshots
+import           Network.AWS.DirectoryService.DisableRadius
+import           Network.AWS.DirectoryService.DisableSSO
+import           Network.AWS.DirectoryService.EnableRadius
+import           Network.AWS.DirectoryService.EnableSSO
+import           Network.AWS.DirectoryService.GetDirectoryLimits
+import           Network.AWS.DirectoryService.GetSnapshotLimits
+import           Network.AWS.DirectoryService.RestoreFromSnapshot
+import           Network.AWS.DirectoryService.Types
+import           Network.AWS.DirectoryService.UpdateRadius
+import           Network.AWS.DirectoryService.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 'DirectoryService'.
+-}
+
+{- $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/DirectoryService/ConnectDirectory.hs b/gen/Network/AWS/DirectoryService/ConnectDirectory.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DirectoryService/ConnectDirectory.hs
@@ -0,0 +1,184 @@
+{-# 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.DirectoryService.ConnectDirectory
+-- 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 an AD Connector to connect an on-premises directory.
+--
+-- /See:/ <http://docs.aws.amazon.com/directoryservice/latest/devguide/API_ConnectDirectory.html AWS API Reference> for ConnectDirectory.
+module Network.AWS.DirectoryService.ConnectDirectory
+    (
+    -- * Creating a Request
+      connectDirectory
+    , ConnectDirectory
+    -- * Request Lenses
+    , cdShortName
+    , cdDescription
+    , cdName
+    , cdPassword
+    , cdSize
+    , cdConnectSettings
+
+    -- * Destructuring the Response
+    , connectDirectoryResponse
+    , ConnectDirectoryResponse
+    -- * Response Lenses
+    , cdrsDirectoryId
+    , cdrsStatus
+    ) where
+
+import           Network.AWS.DirectoryService.Types
+import           Network.AWS.DirectoryService.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | Contains the inputs for the ConnectDirectory operation.
+--
+-- /See:/ 'connectDirectory' smart constructor.
+data ConnectDirectory = ConnectDirectory'
+    { _cdShortName       :: !(Maybe Text)
+    , _cdDescription     :: !(Maybe Text)
+    , _cdName            :: !Text
+    , _cdPassword        :: !(Sensitive Text)
+    , _cdSize            :: !DirectorySize
+    , _cdConnectSettings :: !DirectoryConnectSettings
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ConnectDirectory' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cdShortName'
+--
+-- * 'cdDescription'
+--
+-- * 'cdName'
+--
+-- * 'cdPassword'
+--
+-- * 'cdSize'
+--
+-- * 'cdConnectSettings'
+connectDirectory
+    :: Text -- ^ 'cdName'
+    -> Text -- ^ 'cdPassword'
+    -> DirectorySize -- ^ 'cdSize'
+    -> DirectoryConnectSettings -- ^ 'cdConnectSettings'
+    -> ConnectDirectory
+connectDirectory pName_ pPassword_ pSize_ pConnectSettings_ =
+    ConnectDirectory'
+    { _cdShortName = Nothing
+    , _cdDescription = Nothing
+    , _cdName = pName_
+    , _cdPassword = _Sensitive # pPassword_
+    , _cdSize = pSize_
+    , _cdConnectSettings = pConnectSettings_
+    }
+
+-- | The NetBIOS name of the on-premises directory, such as 'CORP'.
+cdShortName :: Lens' ConnectDirectory (Maybe Text)
+cdShortName = lens _cdShortName (\ s a -> s{_cdShortName = a});
+
+-- | A textual description for the directory.
+cdDescription :: Lens' ConnectDirectory (Maybe Text)
+cdDescription = lens _cdDescription (\ s a -> s{_cdDescription = a});
+
+-- | The fully-qualified name of the on-premises directory, such as
+-- 'corp.example.com'.
+cdName :: Lens' ConnectDirectory Text
+cdName = lens _cdName (\ s a -> s{_cdName = a});
+
+-- | The password for the on-premises user account.
+cdPassword :: Lens' ConnectDirectory Text
+cdPassword = lens _cdPassword (\ s a -> s{_cdPassword = a}) . _Sensitive;
+
+-- | The size of the directory.
+cdSize :: Lens' ConnectDirectory DirectorySize
+cdSize = lens _cdSize (\ s a -> s{_cdSize = a});
+
+-- | A DirectoryConnectSettings object that contains additional information
+-- for the operation.
+cdConnectSettings :: Lens' ConnectDirectory DirectoryConnectSettings
+cdConnectSettings = lens _cdConnectSettings (\ s a -> s{_cdConnectSettings = a});
+
+instance AWSRequest ConnectDirectory where
+        type Sv ConnectDirectory = DirectoryService
+        type Rs ConnectDirectory = ConnectDirectoryResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 ConnectDirectoryResponse' <$>
+                   (x .?> "DirectoryId") <*> (pure (fromEnum s)))
+
+instance ToHeaders ConnectDirectory where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DirectoryService_20150416.ConnectDirectory" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON ConnectDirectory where
+        toJSON ConnectDirectory'{..}
+          = object
+              ["ShortName" .= _cdShortName,
+               "Description" .= _cdDescription, "Name" .= _cdName,
+               "Password" .= _cdPassword, "Size" .= _cdSize,
+               "ConnectSettings" .= _cdConnectSettings]
+
+instance ToPath ConnectDirectory where
+        toPath = const "/"
+
+instance ToQuery ConnectDirectory where
+        toQuery = const mempty
+
+-- | Contains the results of the ConnectDirectory operation.
+--
+-- /See:/ 'connectDirectoryResponse' smart constructor.
+data ConnectDirectoryResponse = ConnectDirectoryResponse'
+    { _cdrsDirectoryId :: !(Maybe Text)
+    , _cdrsStatus      :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ConnectDirectoryResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cdrsDirectoryId'
+--
+-- * 'cdrsStatus'
+connectDirectoryResponse
+    :: Int -- ^ 'cdrsStatus'
+    -> ConnectDirectoryResponse
+connectDirectoryResponse pStatus_ =
+    ConnectDirectoryResponse'
+    { _cdrsDirectoryId = Nothing
+    , _cdrsStatus = pStatus_
+    }
+
+-- | The identifier of the new directory.
+cdrsDirectoryId :: Lens' ConnectDirectoryResponse (Maybe Text)
+cdrsDirectoryId = lens _cdrsDirectoryId (\ s a -> s{_cdrsDirectoryId = a});
+
+-- | The response status code.
+cdrsStatus :: Lens' ConnectDirectoryResponse Int
+cdrsStatus = lens _cdrsStatus (\ s a -> s{_cdrsStatus = a});
diff --git a/gen/Network/AWS/DirectoryService/CreateAlias.hs b/gen/Network/AWS/DirectoryService/CreateAlias.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DirectoryService/CreateAlias.hs
@@ -0,0 +1,160 @@
+{-# 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.DirectoryService.CreateAlias
+-- 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 an alias for a directory and assigns the alias to the directory.
+-- The alias is used to construct the access URL for the directory, such as
+-- 'http:\/\/\<alias>.awsapps.com'.
+--
+-- After an alias has been created, it cannot be deleted or reused, so this
+-- operation should only be used when absolutely necessary.
+--
+-- /See:/ <http://docs.aws.amazon.com/directoryservice/latest/devguide/API_CreateAlias.html AWS API Reference> for CreateAlias.
+module Network.AWS.DirectoryService.CreateAlias
+    (
+    -- * Creating a Request
+      createAlias
+    , CreateAlias
+    -- * Request Lenses
+    , caDirectoryId
+    , caAlias
+
+    -- * Destructuring the Response
+    , createAliasResponse
+    , CreateAliasResponse
+    -- * Response Lenses
+    , carsDirectoryId
+    , carsAlias
+    , carsStatus
+    ) where
+
+import           Network.AWS.DirectoryService.Types
+import           Network.AWS.DirectoryService.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | Contains the inputs for the CreateAlias operation.
+--
+-- /See:/ 'createAlias' smart constructor.
+data CreateAlias = CreateAlias'
+    { _caDirectoryId :: !Text
+    , _caAlias       :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CreateAlias' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'caDirectoryId'
+--
+-- * 'caAlias'
+createAlias
+    :: Text -- ^ 'caDirectoryId'
+    -> Text -- ^ 'caAlias'
+    -> CreateAlias
+createAlias pDirectoryId_ pAlias_ =
+    CreateAlias'
+    { _caDirectoryId = pDirectoryId_
+    , _caAlias = pAlias_
+    }
+
+-- | The identifier of the directory to create the alias for.
+caDirectoryId :: Lens' CreateAlias Text
+caDirectoryId = lens _caDirectoryId (\ s a -> s{_caDirectoryId = a});
+
+-- | The requested alias.
+--
+-- The alias must be unique amongst all aliases in AWS. This operation will
+-- throw an 'EntityAlreadyExistsException' if this alias already exists.
+caAlias :: Lens' CreateAlias Text
+caAlias = lens _caAlias (\ s a -> s{_caAlias = a});
+
+instance AWSRequest CreateAlias where
+        type Sv CreateAlias = DirectoryService
+        type Rs CreateAlias = CreateAliasResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 CreateAliasResponse' <$>
+                   (x .?> "DirectoryId") <*> (x .?> "Alias") <*>
+                     (pure (fromEnum s)))
+
+instance ToHeaders CreateAlias where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DirectoryService_20150416.CreateAlias" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON CreateAlias where
+        toJSON CreateAlias'{..}
+          = object
+              ["DirectoryId" .= _caDirectoryId,
+               "Alias" .= _caAlias]
+
+instance ToPath CreateAlias where
+        toPath = const "/"
+
+instance ToQuery CreateAlias where
+        toQuery = const mempty
+
+-- | Contains the results of the CreateAlias operation.
+--
+-- /See:/ 'createAliasResponse' smart constructor.
+data CreateAliasResponse = CreateAliasResponse'
+    { _carsDirectoryId :: !(Maybe Text)
+    , _carsAlias       :: !(Maybe Text)
+    , _carsStatus      :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CreateAliasResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'carsDirectoryId'
+--
+-- * 'carsAlias'
+--
+-- * 'carsStatus'
+createAliasResponse
+    :: Int -- ^ 'carsStatus'
+    -> CreateAliasResponse
+createAliasResponse pStatus_ =
+    CreateAliasResponse'
+    { _carsDirectoryId = Nothing
+    , _carsAlias = Nothing
+    , _carsStatus = pStatus_
+    }
+
+-- | The identifier of the directory.
+carsDirectoryId :: Lens' CreateAliasResponse (Maybe Text)
+carsDirectoryId = lens _carsDirectoryId (\ s a -> s{_carsDirectoryId = a});
+
+-- | The alias for the directory.
+carsAlias :: Lens' CreateAliasResponse (Maybe Text)
+carsAlias = lens _carsAlias (\ s a -> s{_carsAlias = a});
+
+-- | The response status code.
+carsStatus :: Lens' CreateAliasResponse Int
+carsStatus = lens _carsStatus (\ s a -> s{_carsStatus = a});
diff --git a/gen/Network/AWS/DirectoryService/CreateComputer.hs b/gen/Network/AWS/DirectoryService/CreateComputer.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DirectoryService/CreateComputer.hs
@@ -0,0 +1,178 @@
+{-# 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.DirectoryService.CreateComputer
+-- 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 computer account in the specified directory, and joins the
+-- computer to the directory.
+--
+-- /See:/ <http://docs.aws.amazon.com/directoryservice/latest/devguide/API_CreateComputer.html AWS API Reference> for CreateComputer.
+module Network.AWS.DirectoryService.CreateComputer
+    (
+    -- * Creating a Request
+      createComputer
+    , CreateComputer
+    -- * Request Lenses
+    , ccComputerAttributes
+    , ccOrganizationalUnitDistinguishedName
+    , ccDirectoryId
+    , ccComputerName
+    , ccPassword
+
+    -- * Destructuring the Response
+    , createComputerResponse
+    , CreateComputerResponse
+    -- * Response Lenses
+    , ccrsComputer
+    , ccrsStatus
+    ) where
+
+import           Network.AWS.DirectoryService.Types
+import           Network.AWS.DirectoryService.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | Contains the inputs for the CreateComputer operation.
+--
+-- /See:/ 'createComputer' smart constructor.
+data CreateComputer = CreateComputer'
+    { _ccComputerAttributes                  :: !(Maybe [Attribute])
+    , _ccOrganizationalUnitDistinguishedName :: !(Maybe Text)
+    , _ccDirectoryId                         :: !Text
+    , _ccComputerName                        :: !Text
+    , _ccPassword                            :: !(Sensitive Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CreateComputer' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ccComputerAttributes'
+--
+-- * 'ccOrganizationalUnitDistinguishedName'
+--
+-- * 'ccDirectoryId'
+--
+-- * 'ccComputerName'
+--
+-- * 'ccPassword'
+createComputer
+    :: Text -- ^ 'ccDirectoryId'
+    -> Text -- ^ 'ccComputerName'
+    -> Text -- ^ 'ccPassword'
+    -> CreateComputer
+createComputer pDirectoryId_ pComputerName_ pPassword_ =
+    CreateComputer'
+    { _ccComputerAttributes = Nothing
+    , _ccOrganizationalUnitDistinguishedName = Nothing
+    , _ccDirectoryId = pDirectoryId_
+    , _ccComputerName = pComputerName_
+    , _ccPassword = _Sensitive # pPassword_
+    }
+
+-- | An array of Attribute objects that contain any LDAP attributes to apply
+-- to the computer account.
+ccComputerAttributes :: Lens' CreateComputer [Attribute]
+ccComputerAttributes = lens _ccComputerAttributes (\ s a -> s{_ccComputerAttributes = a}) . _Default . _Coerce;
+
+-- | The fully-qualified distinguished name of the organizational unit to
+-- place the computer account in.
+ccOrganizationalUnitDistinguishedName :: Lens' CreateComputer (Maybe Text)
+ccOrganizationalUnitDistinguishedName = lens _ccOrganizationalUnitDistinguishedName (\ s a -> s{_ccOrganizationalUnitDistinguishedName = a});
+
+-- | The identifier of the directory to create the computer account in.
+ccDirectoryId :: Lens' CreateComputer Text
+ccDirectoryId = lens _ccDirectoryId (\ s a -> s{_ccDirectoryId = a});
+
+-- | The name of the computer account.
+ccComputerName :: Lens' CreateComputer Text
+ccComputerName = lens _ccComputerName (\ s a -> s{_ccComputerName = a});
+
+-- | A one-time password that is used to join the computer to the directory.
+-- You should generate a random, strong password to use for this parameter.
+ccPassword :: Lens' CreateComputer Text
+ccPassword = lens _ccPassword (\ s a -> s{_ccPassword = a}) . _Sensitive;
+
+instance AWSRequest CreateComputer where
+        type Sv CreateComputer = DirectoryService
+        type Rs CreateComputer = CreateComputerResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 CreateComputerResponse' <$>
+                   (x .?> "Computer") <*> (pure (fromEnum s)))
+
+instance ToHeaders CreateComputer where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DirectoryService_20150416.CreateComputer" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON CreateComputer where
+        toJSON CreateComputer'{..}
+          = object
+              ["ComputerAttributes" .= _ccComputerAttributes,
+               "OrganizationalUnitDistinguishedName" .=
+                 _ccOrganizationalUnitDistinguishedName,
+               "DirectoryId" .= _ccDirectoryId,
+               "ComputerName" .= _ccComputerName,
+               "Password" .= _ccPassword]
+
+instance ToPath CreateComputer where
+        toPath = const "/"
+
+instance ToQuery CreateComputer where
+        toQuery = const mempty
+
+-- | Contains the results for the CreateComputer operation.
+--
+-- /See:/ 'createComputerResponse' smart constructor.
+data CreateComputerResponse = CreateComputerResponse'
+    { _ccrsComputer :: !(Maybe Computer)
+    , _ccrsStatus   :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CreateComputerResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ccrsComputer'
+--
+-- * 'ccrsStatus'
+createComputerResponse
+    :: Int -- ^ 'ccrsStatus'
+    -> CreateComputerResponse
+createComputerResponse pStatus_ =
+    CreateComputerResponse'
+    { _ccrsComputer = Nothing
+    , _ccrsStatus = pStatus_
+    }
+
+-- | A Computer object the represents the computer account.
+ccrsComputer :: Lens' CreateComputerResponse (Maybe Computer)
+ccrsComputer = lens _ccrsComputer (\ s a -> s{_ccrsComputer = a});
+
+-- | The response status code.
+ccrsStatus :: Lens' CreateComputerResponse Int
+ccrsStatus = lens _ccrsStatus (\ s a -> s{_ccrsStatus = a});
diff --git a/gen/Network/AWS/DirectoryService/CreateDirectory.hs b/gen/Network/AWS/DirectoryService/CreateDirectory.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DirectoryService/CreateDirectory.hs
@@ -0,0 +1,184 @@
+{-# 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.DirectoryService.CreateDirectory
+-- 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 Simple AD directory.
+--
+-- /See:/ <http://docs.aws.amazon.com/directoryservice/latest/devguide/API_CreateDirectory.html AWS API Reference> for CreateDirectory.
+module Network.AWS.DirectoryService.CreateDirectory
+    (
+    -- * Creating a Request
+      createDirectory
+    , CreateDirectory
+    -- * Request Lenses
+    , cShortName
+    , cVPCSettings
+    , cDescription
+    , cName
+    , cPassword
+    , cSize
+
+    -- * Destructuring the Response
+    , createDirectoryResponse
+    , CreateDirectoryResponse
+    -- * Response Lenses
+    , crsDirectoryId
+    , crsStatus
+    ) where
+
+import           Network.AWS.DirectoryService.Types
+import           Network.AWS.DirectoryService.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | Contains the inputs for the CreateDirectory operation.
+--
+-- /See:/ 'createDirectory' smart constructor.
+data CreateDirectory = CreateDirectory'
+    { _cShortName   :: !(Maybe Text)
+    , _cVPCSettings :: !(Maybe DirectoryVPCSettings)
+    , _cDescription :: !(Maybe Text)
+    , _cName        :: !Text
+    , _cPassword    :: !(Sensitive Text)
+    , _cSize        :: !DirectorySize
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CreateDirectory' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cShortName'
+--
+-- * 'cVPCSettings'
+--
+-- * 'cDescription'
+--
+-- * 'cName'
+--
+-- * 'cPassword'
+--
+-- * 'cSize'
+createDirectory
+    :: Text -- ^ 'cName'
+    -> Text -- ^ 'cPassword'
+    -> DirectorySize -- ^ 'cSize'
+    -> CreateDirectory
+createDirectory pName_ pPassword_ pSize_ =
+    CreateDirectory'
+    { _cShortName = Nothing
+    , _cVPCSettings = Nothing
+    , _cDescription = Nothing
+    , _cName = pName_
+    , _cPassword = _Sensitive # pPassword_
+    , _cSize = pSize_
+    }
+
+-- | The short name of the directory, such as 'CORP'.
+cShortName :: Lens' CreateDirectory (Maybe Text)
+cShortName = lens _cShortName (\ s a -> s{_cShortName = a});
+
+-- | A DirectoryVpcSettings object that contains additional information for
+-- the operation.
+cVPCSettings :: Lens' CreateDirectory (Maybe DirectoryVPCSettings)
+cVPCSettings = lens _cVPCSettings (\ s a -> s{_cVPCSettings = a});
+
+-- | A textual description for the directory.
+cDescription :: Lens' CreateDirectory (Maybe Text)
+cDescription = lens _cDescription (\ s a -> s{_cDescription = a});
+
+-- | The fully qualified name for the directory, such as 'corp.example.com'.
+cName :: Lens' CreateDirectory Text
+cName = lens _cName (\ s a -> s{_cName = a});
+
+-- | The password for the directory administrator. The directory creation
+-- process creates a directory administrator account with the username
+-- 'Administrator' and this password.
+cPassword :: Lens' CreateDirectory Text
+cPassword = lens _cPassword (\ s a -> s{_cPassword = a}) . _Sensitive;
+
+-- | The size of the directory.
+cSize :: Lens' CreateDirectory DirectorySize
+cSize = lens _cSize (\ s a -> s{_cSize = a});
+
+instance AWSRequest CreateDirectory where
+        type Sv CreateDirectory = DirectoryService
+        type Rs CreateDirectory = CreateDirectoryResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 CreateDirectoryResponse' <$>
+                   (x .?> "DirectoryId") <*> (pure (fromEnum s)))
+
+instance ToHeaders CreateDirectory where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DirectoryService_20150416.CreateDirectory" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON CreateDirectory where
+        toJSON CreateDirectory'{..}
+          = object
+              ["ShortName" .= _cShortName,
+               "VpcSettings" .= _cVPCSettings,
+               "Description" .= _cDescription, "Name" .= _cName,
+               "Password" .= _cPassword, "Size" .= _cSize]
+
+instance ToPath CreateDirectory where
+        toPath = const "/"
+
+instance ToQuery CreateDirectory where
+        toQuery = const mempty
+
+-- | Contains the results of the CreateDirectory operation.
+--
+-- /See:/ 'createDirectoryResponse' smart constructor.
+data CreateDirectoryResponse = CreateDirectoryResponse'
+    { _crsDirectoryId :: !(Maybe Text)
+    , _crsStatus      :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CreateDirectoryResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'crsDirectoryId'
+--
+-- * 'crsStatus'
+createDirectoryResponse
+    :: Int -- ^ 'crsStatus'
+    -> CreateDirectoryResponse
+createDirectoryResponse pStatus_ =
+    CreateDirectoryResponse'
+    { _crsDirectoryId = Nothing
+    , _crsStatus = pStatus_
+    }
+
+-- | The identifier of the directory that was created.
+crsDirectoryId :: Lens' CreateDirectoryResponse (Maybe Text)
+crsDirectoryId = lens _crsDirectoryId (\ s a -> s{_crsDirectoryId = a});
+
+-- | The response status code.
+crsStatus :: Lens' CreateDirectoryResponse Int
+crsStatus = lens _crsStatus (\ s a -> s{_crsStatus = a});
diff --git a/gen/Network/AWS/DirectoryService/CreateSnapshot.hs b/gen/Network/AWS/DirectoryService/CreateSnapshot.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DirectoryService/CreateSnapshot.hs
@@ -0,0 +1,142 @@
+{-# 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.DirectoryService.CreateSnapshot
+-- 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 snapshot of an existing directory.
+--
+-- You cannot take snapshots of extended or connected directories.
+--
+-- /See:/ <http://docs.aws.amazon.com/directoryservice/latest/devguide/API_CreateSnapshot.html AWS API Reference> for CreateSnapshot.
+module Network.AWS.DirectoryService.CreateSnapshot
+    (
+    -- * Creating a Request
+      createSnapshot
+    , CreateSnapshot
+    -- * Request Lenses
+    , csName
+    , csDirectoryId
+
+    -- * Destructuring the Response
+    , createSnapshotResponse
+    , CreateSnapshotResponse
+    -- * Response Lenses
+    , csrsSnapshotId
+    , csrsStatus
+    ) where
+
+import           Network.AWS.DirectoryService.Types
+import           Network.AWS.DirectoryService.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | Contains the inputs for the CreateSnapshot operation.
+--
+-- /See:/ 'createSnapshot' smart constructor.
+data CreateSnapshot = CreateSnapshot'
+    { _csName        :: !(Maybe Text)
+    , _csDirectoryId :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CreateSnapshot' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'csName'
+--
+-- * 'csDirectoryId'
+createSnapshot
+    :: Text -- ^ 'csDirectoryId'
+    -> CreateSnapshot
+createSnapshot pDirectoryId_ =
+    CreateSnapshot'
+    { _csName = Nothing
+    , _csDirectoryId = pDirectoryId_
+    }
+
+-- | The descriptive name to apply to the snapshot.
+csName :: Lens' CreateSnapshot (Maybe Text)
+csName = lens _csName (\ s a -> s{_csName = a});
+
+-- | The identifier of the directory to take a snapshot of.
+csDirectoryId :: Lens' CreateSnapshot Text
+csDirectoryId = lens _csDirectoryId (\ s a -> s{_csDirectoryId = a});
+
+instance AWSRequest CreateSnapshot where
+        type Sv CreateSnapshot = DirectoryService
+        type Rs CreateSnapshot = CreateSnapshotResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 CreateSnapshotResponse' <$>
+                   (x .?> "SnapshotId") <*> (pure (fromEnum s)))
+
+instance ToHeaders CreateSnapshot where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DirectoryService_20150416.CreateSnapshot" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON CreateSnapshot where
+        toJSON CreateSnapshot'{..}
+          = object
+              ["Name" .= _csName, "DirectoryId" .= _csDirectoryId]
+
+instance ToPath CreateSnapshot where
+        toPath = const "/"
+
+instance ToQuery CreateSnapshot where
+        toQuery = const mempty
+
+-- | Contains the results of the CreateSnapshot operation.
+--
+-- /See:/ 'createSnapshotResponse' smart constructor.
+data CreateSnapshotResponse = CreateSnapshotResponse'
+    { _csrsSnapshotId :: !(Maybe Text)
+    , _csrsStatus     :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CreateSnapshotResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'csrsSnapshotId'
+--
+-- * 'csrsStatus'
+createSnapshotResponse
+    :: Int -- ^ 'csrsStatus'
+    -> CreateSnapshotResponse
+createSnapshotResponse pStatus_ =
+    CreateSnapshotResponse'
+    { _csrsSnapshotId = Nothing
+    , _csrsStatus = pStatus_
+    }
+
+-- | The identifier of the snapshot that was created.
+csrsSnapshotId :: Lens' CreateSnapshotResponse (Maybe Text)
+csrsSnapshotId = lens _csrsSnapshotId (\ s a -> s{_csrsSnapshotId = a});
+
+-- | The response status code.
+csrsStatus :: Lens' CreateSnapshotResponse Int
+csrsStatus = lens _csrsStatus (\ s a -> s{_csrsStatus = a});
diff --git a/gen/Network/AWS/DirectoryService/DeleteDirectory.hs b/gen/Network/AWS/DirectoryService/DeleteDirectory.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DirectoryService/DeleteDirectory.hs
@@ -0,0 +1,130 @@
+{-# 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.DirectoryService.DeleteDirectory
+-- 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 an AWS Directory Service directory.
+--
+-- /See:/ <http://docs.aws.amazon.com/directoryservice/latest/devguide/API_DeleteDirectory.html AWS API Reference> for DeleteDirectory.
+module Network.AWS.DirectoryService.DeleteDirectory
+    (
+    -- * Creating a Request
+      deleteDirectory
+    , DeleteDirectory
+    -- * Request Lenses
+    , dDirectoryId
+
+    -- * Destructuring the Response
+    , deleteDirectoryResponse
+    , DeleteDirectoryResponse
+    -- * Response Lenses
+    , drsDirectoryId
+    , drsStatus
+    ) where
+
+import           Network.AWS.DirectoryService.Types
+import           Network.AWS.DirectoryService.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | Contains the inputs for the DeleteDirectory operation.
+--
+-- /See:/ 'deleteDirectory' smart constructor.
+newtype DeleteDirectory = DeleteDirectory'
+    { _dDirectoryId :: Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DeleteDirectory' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dDirectoryId'
+deleteDirectory
+    :: Text -- ^ 'dDirectoryId'
+    -> DeleteDirectory
+deleteDirectory pDirectoryId_ =
+    DeleteDirectory'
+    { _dDirectoryId = pDirectoryId_
+    }
+
+-- | The identifier of the directory to delete.
+dDirectoryId :: Lens' DeleteDirectory Text
+dDirectoryId = lens _dDirectoryId (\ s a -> s{_dDirectoryId = a});
+
+instance AWSRequest DeleteDirectory where
+        type Sv DeleteDirectory = DirectoryService
+        type Rs DeleteDirectory = DeleteDirectoryResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 DeleteDirectoryResponse' <$>
+                   (x .?> "DirectoryId") <*> (pure (fromEnum s)))
+
+instance ToHeaders DeleteDirectory where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DirectoryService_20150416.DeleteDirectory" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON DeleteDirectory where
+        toJSON DeleteDirectory'{..}
+          = object ["DirectoryId" .= _dDirectoryId]
+
+instance ToPath DeleteDirectory where
+        toPath = const "/"
+
+instance ToQuery DeleteDirectory where
+        toQuery = const mempty
+
+-- | Contains the results of the DeleteDirectory operation.
+--
+-- /See:/ 'deleteDirectoryResponse' smart constructor.
+data DeleteDirectoryResponse = DeleteDirectoryResponse'
+    { _drsDirectoryId :: !(Maybe Text)
+    , _drsStatus      :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DeleteDirectoryResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'drsDirectoryId'
+--
+-- * 'drsStatus'
+deleteDirectoryResponse
+    :: Int -- ^ 'drsStatus'
+    -> DeleteDirectoryResponse
+deleteDirectoryResponse pStatus_ =
+    DeleteDirectoryResponse'
+    { _drsDirectoryId = Nothing
+    , _drsStatus = pStatus_
+    }
+
+-- | The directory identifier.
+drsDirectoryId :: Lens' DeleteDirectoryResponse (Maybe Text)
+drsDirectoryId = lens _drsDirectoryId (\ s a -> s{_drsDirectoryId = a});
+
+-- | The response status code.
+drsStatus :: Lens' DeleteDirectoryResponse Int
+drsStatus = lens _drsStatus (\ s a -> s{_drsStatus = a});
diff --git a/gen/Network/AWS/DirectoryService/DeleteSnapshot.hs b/gen/Network/AWS/DirectoryService/DeleteSnapshot.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DirectoryService/DeleteSnapshot.hs
@@ -0,0 +1,130 @@
+{-# 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.DirectoryService.DeleteSnapshot
+-- 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 directory snapshot.
+--
+-- /See:/ <http://docs.aws.amazon.com/directoryservice/latest/devguide/API_DeleteSnapshot.html AWS API Reference> for DeleteSnapshot.
+module Network.AWS.DirectoryService.DeleteSnapshot
+    (
+    -- * Creating a Request
+      deleteSnapshot
+    , DeleteSnapshot
+    -- * Request Lenses
+    , dsSnapshotId
+
+    -- * Destructuring the Response
+    , deleteSnapshotResponse
+    , DeleteSnapshotResponse
+    -- * Response Lenses
+    , dsrsSnapshotId
+    , dsrsStatus
+    ) where
+
+import           Network.AWS.DirectoryService.Types
+import           Network.AWS.DirectoryService.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | Contains the inputs for the DeleteSnapshot operation.
+--
+-- /See:/ 'deleteSnapshot' smart constructor.
+newtype DeleteSnapshot = DeleteSnapshot'
+    { _dsSnapshotId :: Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DeleteSnapshot' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dsSnapshotId'
+deleteSnapshot
+    :: Text -- ^ 'dsSnapshotId'
+    -> DeleteSnapshot
+deleteSnapshot pSnapshotId_ =
+    DeleteSnapshot'
+    { _dsSnapshotId = pSnapshotId_
+    }
+
+-- | The identifier of the directory snapshot to be deleted.
+dsSnapshotId :: Lens' DeleteSnapshot Text
+dsSnapshotId = lens _dsSnapshotId (\ s a -> s{_dsSnapshotId = a});
+
+instance AWSRequest DeleteSnapshot where
+        type Sv DeleteSnapshot = DirectoryService
+        type Rs DeleteSnapshot = DeleteSnapshotResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 DeleteSnapshotResponse' <$>
+                   (x .?> "SnapshotId") <*> (pure (fromEnum s)))
+
+instance ToHeaders DeleteSnapshot where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DirectoryService_20150416.DeleteSnapshot" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON DeleteSnapshot where
+        toJSON DeleteSnapshot'{..}
+          = object ["SnapshotId" .= _dsSnapshotId]
+
+instance ToPath DeleteSnapshot where
+        toPath = const "/"
+
+instance ToQuery DeleteSnapshot where
+        toQuery = const mempty
+
+-- | Contains the results of the DeleteSnapshot operation.
+--
+-- /See:/ 'deleteSnapshotResponse' smart constructor.
+data DeleteSnapshotResponse = DeleteSnapshotResponse'
+    { _dsrsSnapshotId :: !(Maybe Text)
+    , _dsrsStatus     :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DeleteSnapshotResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dsrsSnapshotId'
+--
+-- * 'dsrsStatus'
+deleteSnapshotResponse
+    :: Int -- ^ 'dsrsStatus'
+    -> DeleteSnapshotResponse
+deleteSnapshotResponse pStatus_ =
+    DeleteSnapshotResponse'
+    { _dsrsSnapshotId = Nothing
+    , _dsrsStatus = pStatus_
+    }
+
+-- | The identifier of the directory snapshot that was deleted.
+dsrsSnapshotId :: Lens' DeleteSnapshotResponse (Maybe Text)
+dsrsSnapshotId = lens _dsrsSnapshotId (\ s a -> s{_dsrsSnapshotId = a});
+
+-- | The response status code.
+dsrsStatus :: Lens' DeleteSnapshotResponse Int
+dsrsStatus = lens _dsrsStatus (\ s a -> s{_dsrsStatus = a});
diff --git a/gen/Network/AWS/DirectoryService/DescribeDirectories.hs b/gen/Network/AWS/DirectoryService/DescribeDirectories.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DirectoryService/DescribeDirectories.hs
@@ -0,0 +1,189 @@
+{-# 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.DirectoryService.DescribeDirectories
+-- 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)
+--
+-- Obtains information about the directories that belong to this account.
+--
+-- You can retrieve information about specific directories by passing the
+-- directory identifiers in the /DirectoryIds/ parameter. Otherwise, all
+-- directories that belong to the current account are returned.
+--
+-- This operation supports pagination with the use of the /NextToken/
+-- request and response parameters. If more results are available, the
+-- /DescribeDirectoriesResult.NextToken/ member contains a token that you
+-- pass in the next call to DescribeDirectories to retrieve the next set of
+-- items.
+--
+-- You can also specify a maximum number of return results with the /Limit/
+-- parameter.
+--
+-- /See:/ <http://docs.aws.amazon.com/directoryservice/latest/devguide/API_DescribeDirectories.html AWS API Reference> for DescribeDirectories.
+module Network.AWS.DirectoryService.DescribeDirectories
+    (
+    -- * Creating a Request
+      describeDirectories
+    , DescribeDirectories
+    -- * Request Lenses
+    , ddNextToken
+    , ddDirectoryIds
+    , ddLimit
+
+    -- * Destructuring the Response
+    , describeDirectoriesResponse
+    , DescribeDirectoriesResponse
+    -- * Response Lenses
+    , ddrsDirectoryDescriptions
+    , ddrsNextToken
+    , ddrsStatus
+    ) where
+
+import           Network.AWS.DirectoryService.Types
+import           Network.AWS.DirectoryService.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | Contains the inputs for the DescribeDirectories operation.
+--
+-- /See:/ 'describeDirectories' smart constructor.
+data DescribeDirectories = DescribeDirectories'
+    { _ddNextToken    :: !(Maybe Text)
+    , _ddDirectoryIds :: !(Maybe [Text])
+    , _ddLimit        :: !(Maybe Nat)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DescribeDirectories' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ddNextToken'
+--
+-- * 'ddDirectoryIds'
+--
+-- * 'ddLimit'
+describeDirectories
+    :: DescribeDirectories
+describeDirectories =
+    DescribeDirectories'
+    { _ddNextToken = Nothing
+    , _ddDirectoryIds = Nothing
+    , _ddLimit = Nothing
+    }
+
+-- | The /DescribeDirectoriesResult.NextToken/ value from a previous call to
+-- DescribeDirectories. Pass null if this is the first call.
+ddNextToken :: Lens' DescribeDirectories (Maybe Text)
+ddNextToken = lens _ddNextToken (\ s a -> s{_ddNextToken = a});
+
+-- | A list of identifiers of the directories to obtain the information for.
+-- If this member is null, all directories that belong to the current
+-- account are returned.
+--
+-- An empty list results in an 'InvalidParameterException' being thrown.
+ddDirectoryIds :: Lens' DescribeDirectories [Text]
+ddDirectoryIds = lens _ddDirectoryIds (\ s a -> s{_ddDirectoryIds = a}) . _Default . _Coerce;
+
+-- | The maximum number of items to return. If this value is zero, the
+-- maximum number of items is specified by the limitations of the
+-- operation.
+ddLimit :: Lens' DescribeDirectories (Maybe Natural)
+ddLimit = lens _ddLimit (\ s a -> s{_ddLimit = a}) . mapping _Nat;
+
+instance AWSRequest DescribeDirectories where
+        type Sv DescribeDirectories = DirectoryService
+        type Rs DescribeDirectories =
+             DescribeDirectoriesResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 DescribeDirectoriesResponse' <$>
+                   (x .?> "DirectoryDescriptions" .!@ mempty) <*>
+                     (x .?> "NextToken")
+                     <*> (pure (fromEnum s)))
+
+instance ToHeaders DescribeDirectories where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DirectoryService_20150416.DescribeDirectories" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON DescribeDirectories where
+        toJSON DescribeDirectories'{..}
+          = object
+              ["NextToken" .= _ddNextToken,
+               "DirectoryIds" .= _ddDirectoryIds,
+               "Limit" .= _ddLimit]
+
+instance ToPath DescribeDirectories where
+        toPath = const "/"
+
+instance ToQuery DescribeDirectories where
+        toQuery = const mempty
+
+-- | Contains the results of the DescribeDirectories operation.
+--
+-- /See:/ 'describeDirectoriesResponse' smart constructor.
+data DescribeDirectoriesResponse = DescribeDirectoriesResponse'
+    { _ddrsDirectoryDescriptions :: !(Maybe [DirectoryDescription])
+    , _ddrsNextToken             :: !(Maybe Text)
+    , _ddrsStatus                :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DescribeDirectoriesResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ddrsDirectoryDescriptions'
+--
+-- * 'ddrsNextToken'
+--
+-- * 'ddrsStatus'
+describeDirectoriesResponse
+    :: Int -- ^ 'ddrsStatus'
+    -> DescribeDirectoriesResponse
+describeDirectoriesResponse pStatus_ =
+    DescribeDirectoriesResponse'
+    { _ddrsDirectoryDescriptions = Nothing
+    , _ddrsNextToken = Nothing
+    , _ddrsStatus = pStatus_
+    }
+
+-- | The list of DirectoryDescription objects that were retrieved.
+--
+-- It is possible that this list contains less than the number of items
+-- specified in the /Limit/ member of the request. This occurs if there are
+-- less than the requested number of items left to retrieve, or if the
+-- limitations of the operation have been exceeded.
+ddrsDirectoryDescriptions :: Lens' DescribeDirectoriesResponse [DirectoryDescription]
+ddrsDirectoryDescriptions = lens _ddrsDirectoryDescriptions (\ s a -> s{_ddrsDirectoryDescriptions = a}) . _Default . _Coerce;
+
+-- | If not null, more results are available. Pass this value for the
+-- /NextToken/ parameter in a subsequent call to DescribeDirectories to
+-- retrieve the next set of items.
+ddrsNextToken :: Lens' DescribeDirectoriesResponse (Maybe Text)
+ddrsNextToken = lens _ddrsNextToken (\ s a -> s{_ddrsNextToken = a});
+
+-- | The response status code.
+ddrsStatus :: Lens' DescribeDirectoriesResponse Int
+ddrsStatus = lens _ddrsStatus (\ s a -> s{_ddrsStatus = a});
diff --git a/gen/Network/AWS/DirectoryService/DescribeSnapshots.hs b/gen/Network/AWS/DirectoryService/DescribeSnapshots.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DirectoryService/DescribeSnapshots.hs
@@ -0,0 +1,188 @@
+{-# 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.DirectoryService.DescribeSnapshots
+-- 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)
+--
+-- Obtains information about the directory snapshots that belong to this
+-- account.
+--
+-- This operation supports pagination with the use of the /NextToken/
+-- request and response parameters. If more results are available, the
+-- /DescribeSnapshots.NextToken/ member contains a token that you pass in
+-- the next call to DescribeSnapshots to retrieve the next set of items.
+--
+-- You can also specify a maximum number of return results with the /Limit/
+-- parameter.
+--
+-- /See:/ <http://docs.aws.amazon.com/directoryservice/latest/devguide/API_DescribeSnapshots.html AWS API Reference> for DescribeSnapshots.
+module Network.AWS.DirectoryService.DescribeSnapshots
+    (
+    -- * Creating a Request
+      describeSnapshots
+    , DescribeSnapshots
+    -- * Request Lenses
+    , dsDirectoryId
+    , dsNextToken
+    , dsSnapshotIds
+    , dsLimit
+
+    -- * Destructuring the Response
+    , describeSnapshotsResponse
+    , DescribeSnapshotsResponse
+    -- * Response Lenses
+    , dssrsNextToken
+    , dssrsSnapshots
+    , dssrsStatus
+    ) where
+
+import           Network.AWS.DirectoryService.Types
+import           Network.AWS.DirectoryService.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | Contains the inputs for the DescribeSnapshots operation.
+--
+-- /See:/ 'describeSnapshots' smart constructor.
+data DescribeSnapshots = DescribeSnapshots'
+    { _dsDirectoryId :: !(Maybe Text)
+    , _dsNextToken   :: !(Maybe Text)
+    , _dsSnapshotIds :: !(Maybe [Text])
+    , _dsLimit       :: !(Maybe Nat)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DescribeSnapshots' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dsDirectoryId'
+--
+-- * 'dsNextToken'
+--
+-- * 'dsSnapshotIds'
+--
+-- * 'dsLimit'
+describeSnapshots
+    :: DescribeSnapshots
+describeSnapshots =
+    DescribeSnapshots'
+    { _dsDirectoryId = Nothing
+    , _dsNextToken = Nothing
+    , _dsSnapshotIds = Nothing
+    , _dsLimit = Nothing
+    }
+
+-- | The identifier of the directory to retrieve snapshot information for.
+dsDirectoryId :: Lens' DescribeSnapshots (Maybe Text)
+dsDirectoryId = lens _dsDirectoryId (\ s a -> s{_dsDirectoryId = a});
+
+-- | The /DescribeSnapshotsResult.NextToken/ value from a previous call to
+-- DescribeSnapshots. Pass null if this is the first call.
+dsNextToken :: Lens' DescribeSnapshots (Maybe Text)
+dsNextToken = lens _dsNextToken (\ s a -> s{_dsNextToken = a});
+
+-- | A list of identifiers of the snapshots to obtain the information for. If
+-- this member is null or empty, all snapshots are returned using the
+-- /Limit/ and /NextToken/ members.
+dsSnapshotIds :: Lens' DescribeSnapshots [Text]
+dsSnapshotIds = lens _dsSnapshotIds (\ s a -> s{_dsSnapshotIds = a}) . _Default . _Coerce;
+
+-- | The maximum number of objects to return.
+dsLimit :: Lens' DescribeSnapshots (Maybe Natural)
+dsLimit = lens _dsLimit (\ s a -> s{_dsLimit = a}) . mapping _Nat;
+
+instance AWSRequest DescribeSnapshots where
+        type Sv DescribeSnapshots = DirectoryService
+        type Rs DescribeSnapshots = DescribeSnapshotsResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 DescribeSnapshotsResponse' <$>
+                   (x .?> "NextToken") <*>
+                     (x .?> "Snapshots" .!@ mempty)
+                     <*> (pure (fromEnum s)))
+
+instance ToHeaders DescribeSnapshots where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DirectoryService_20150416.DescribeSnapshots" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON DescribeSnapshots where
+        toJSON DescribeSnapshots'{..}
+          = object
+              ["DirectoryId" .= _dsDirectoryId,
+               "NextToken" .= _dsNextToken,
+               "SnapshotIds" .= _dsSnapshotIds, "Limit" .= _dsLimit]
+
+instance ToPath DescribeSnapshots where
+        toPath = const "/"
+
+instance ToQuery DescribeSnapshots where
+        toQuery = const mempty
+
+-- | Contains the results of the DescribeSnapshots operation.
+--
+-- /See:/ 'describeSnapshotsResponse' smart constructor.
+data DescribeSnapshotsResponse = DescribeSnapshotsResponse'
+    { _dssrsNextToken :: !(Maybe Text)
+    , _dssrsSnapshots :: !(Maybe [Snapshot])
+    , _dssrsStatus    :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DescribeSnapshotsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dssrsNextToken'
+--
+-- * 'dssrsSnapshots'
+--
+-- * 'dssrsStatus'
+describeSnapshotsResponse
+    :: Int -- ^ 'dssrsStatus'
+    -> DescribeSnapshotsResponse
+describeSnapshotsResponse pStatus_ =
+    DescribeSnapshotsResponse'
+    { _dssrsNextToken = Nothing
+    , _dssrsSnapshots = Nothing
+    , _dssrsStatus = pStatus_
+    }
+
+-- | If not null, more results are available. Pass this value in the
+-- /NextToken/ member of a subsequent call to DescribeSnapshots.
+dssrsNextToken :: Lens' DescribeSnapshotsResponse (Maybe Text)
+dssrsNextToken = lens _dssrsNextToken (\ s a -> s{_dssrsNextToken = a});
+
+-- | The list of Snapshot objects that were retrieved.
+--
+-- It is possible that this list contains less than the number of items
+-- specified in the /Limit/ member of the request. This occurs if there are
+-- less than the requested number of items left to retrieve, or if the
+-- limitations of the operation have been exceeded.
+dssrsSnapshots :: Lens' DescribeSnapshotsResponse [Snapshot]
+dssrsSnapshots = lens _dssrsSnapshots (\ s a -> s{_dssrsSnapshots = a}) . _Default . _Coerce;
+
+-- | The response status code.
+dssrsStatus :: Lens' DescribeSnapshotsResponse Int
+dssrsStatus = lens _dssrsStatus (\ s a -> s{_dssrsStatus = a});
diff --git a/gen/Network/AWS/DirectoryService/DisableRadius.hs b/gen/Network/AWS/DirectoryService/DisableRadius.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DirectoryService/DisableRadius.hs
@@ -0,0 +1,121 @@
+{-# 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.DirectoryService.DisableRadius
+-- 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)
+--
+-- Disables multi-factor authentication (MFA) with Remote Authentication
+-- Dial In User Service (RADIUS) for an AD Connector directory.
+--
+-- /See:/ <http://docs.aws.amazon.com/directoryservice/latest/devguide/API_DisableRadius.html AWS API Reference> for DisableRadius.
+module Network.AWS.DirectoryService.DisableRadius
+    (
+    -- * Creating a Request
+      disableRadius
+    , DisableRadius
+    -- * Request Lenses
+    , drDirectoryId
+
+    -- * Destructuring the Response
+    , disableRadiusResponse
+    , DisableRadiusResponse
+    -- * Response Lenses
+    , drrsStatus
+    ) where
+
+import           Network.AWS.DirectoryService.Types
+import           Network.AWS.DirectoryService.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | Contains the inputs for the DisableRadius operation.
+--
+-- /See:/ 'disableRadius' smart constructor.
+newtype DisableRadius = DisableRadius'
+    { _drDirectoryId :: Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DisableRadius' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'drDirectoryId'
+disableRadius
+    :: Text -- ^ 'drDirectoryId'
+    -> DisableRadius
+disableRadius pDirectoryId_ =
+    DisableRadius'
+    { _drDirectoryId = pDirectoryId_
+    }
+
+-- | The identifier of the directory to disable MFA for.
+drDirectoryId :: Lens' DisableRadius Text
+drDirectoryId = lens _drDirectoryId (\ s a -> s{_drDirectoryId = a});
+
+instance AWSRequest DisableRadius where
+        type Sv DisableRadius = DirectoryService
+        type Rs DisableRadius = DisableRadiusResponse
+        request = postJSON
+        response
+          = receiveEmpty
+              (\ s h x ->
+                 DisableRadiusResponse' <$> (pure (fromEnum s)))
+
+instance ToHeaders DisableRadius where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DirectoryService_20150416.DisableRadius" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON DisableRadius where
+        toJSON DisableRadius'{..}
+          = object ["DirectoryId" .= _drDirectoryId]
+
+instance ToPath DisableRadius where
+        toPath = const "/"
+
+instance ToQuery DisableRadius where
+        toQuery = const mempty
+
+-- | Contains the results of the DisableRadius operation.
+--
+-- /See:/ 'disableRadiusResponse' smart constructor.
+newtype DisableRadiusResponse = DisableRadiusResponse'
+    { _drrsStatus :: Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DisableRadiusResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'drrsStatus'
+disableRadiusResponse
+    :: Int -- ^ 'drrsStatus'
+    -> DisableRadiusResponse
+disableRadiusResponse pStatus_ =
+    DisableRadiusResponse'
+    { _drrsStatus = pStatus_
+    }
+
+-- | The response status code.
+drrsStatus :: Lens' DisableRadiusResponse Int
+drrsStatus = lens _drrsStatus (\ s a -> s{_drrsStatus = a});
diff --git a/gen/Network/AWS/DirectoryService/DisableSSO.hs b/gen/Network/AWS/DirectoryService/DisableSSO.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DirectoryService/DisableSSO.hs
@@ -0,0 +1,151 @@
+{-# 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.DirectoryService.DisableSSO
+-- 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)
+--
+-- Disables single-sign on for a directory.
+--
+-- /See:/ <http://docs.aws.amazon.com/directoryservice/latest/devguide/API_DisableSSO.html AWS API Reference> for DisableSSO.
+module Network.AWS.DirectoryService.DisableSSO
+    (
+    -- * Creating a Request
+      disableSSO
+    , DisableSSO
+    -- * Request Lenses
+    , dssoUserName
+    , dssoPassword
+    , dssoDirectoryId
+
+    -- * Destructuring the Response
+    , disableSSOResponse
+    , DisableSSOResponse
+    -- * Response Lenses
+    , dssorsStatus
+    ) where
+
+import           Network.AWS.DirectoryService.Types
+import           Network.AWS.DirectoryService.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | Contains the inputs for the DisableSso operation.
+--
+-- /See:/ 'disableSSO' smart constructor.
+data DisableSSO = DisableSSO'
+    { _dssoUserName    :: !(Maybe Text)
+    , _dssoPassword    :: !(Maybe (Sensitive Text))
+    , _dssoDirectoryId :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DisableSSO' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dssoUserName'
+--
+-- * 'dssoPassword'
+--
+-- * 'dssoDirectoryId'
+disableSSO
+    :: Text -- ^ 'dssoDirectoryId'
+    -> DisableSSO
+disableSSO pDirectoryId_ =
+    DisableSSO'
+    { _dssoUserName = Nothing
+    , _dssoPassword = Nothing
+    , _dssoDirectoryId = pDirectoryId_
+    }
+
+-- | The username of an alternate account to use to disable single-sign on.
+-- This is only used for AD Connector directories. This account must have
+-- privileges to remove a service principle name.
+--
+-- If the AD Connector service account does not have privileges to remove a
+-- service principle name, you can specify an alternate account with the
+-- /UserName/ and /Password/ parameters. These credentials are only used to
+-- disable single sign-on and are not stored by the service. The AD
+-- Connector service account is not changed.
+dssoUserName :: Lens' DisableSSO (Maybe Text)
+dssoUserName = lens _dssoUserName (\ s a -> s{_dssoUserName = a});
+
+-- | The password of an alternate account to use to disable single-sign on.
+-- This is only used for AD Connector directories. See the /UserName/
+-- parameter for more information.
+dssoPassword :: Lens' DisableSSO (Maybe Text)
+dssoPassword = lens _dssoPassword (\ s a -> s{_dssoPassword = a}) . mapping _Sensitive;
+
+-- | The identifier of the directory to disable single-sign on for.
+dssoDirectoryId :: Lens' DisableSSO Text
+dssoDirectoryId = lens _dssoDirectoryId (\ s a -> s{_dssoDirectoryId = a});
+
+instance AWSRequest DisableSSO where
+        type Sv DisableSSO = DirectoryService
+        type Rs DisableSSO = DisableSSOResponse
+        request = postJSON
+        response
+          = receiveEmpty
+              (\ s h x ->
+                 DisableSSOResponse' <$> (pure (fromEnum s)))
+
+instance ToHeaders DisableSSO where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DirectoryService_20150416.DisableSso" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON DisableSSO where
+        toJSON DisableSSO'{..}
+          = object
+              ["UserName" .= _dssoUserName,
+               "Password" .= _dssoPassword,
+               "DirectoryId" .= _dssoDirectoryId]
+
+instance ToPath DisableSSO where
+        toPath = const "/"
+
+instance ToQuery DisableSSO where
+        toQuery = const mempty
+
+-- | Contains the results of the DisableSso operation.
+--
+-- /See:/ 'disableSSOResponse' smart constructor.
+newtype DisableSSOResponse = DisableSSOResponse'
+    { _dssorsStatus :: Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DisableSSOResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dssorsStatus'
+disableSSOResponse
+    :: Int -- ^ 'dssorsStatus'
+    -> DisableSSOResponse
+disableSSOResponse pStatus_ =
+    DisableSSOResponse'
+    { _dssorsStatus = pStatus_
+    }
+
+-- | The response status code.
+dssorsStatus :: Lens' DisableSSOResponse Int
+dssorsStatus = lens _dssorsStatus (\ s a -> s{_dssorsStatus = a});
diff --git a/gen/Network/AWS/DirectoryService/EnableRadius.hs b/gen/Network/AWS/DirectoryService/EnableRadius.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DirectoryService/EnableRadius.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.DirectoryService.EnableRadius
+-- 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)
+--
+-- Enables multi-factor authentication (MFA) with Remote Authentication
+-- Dial In User Service (RADIUS) for an AD Connector directory.
+--
+-- /See:/ <http://docs.aws.amazon.com/directoryservice/latest/devguide/API_EnableRadius.html AWS API Reference> for EnableRadius.
+module Network.AWS.DirectoryService.EnableRadius
+    (
+    -- * Creating a Request
+      enableRadius
+    , EnableRadius
+    -- * Request Lenses
+    , erDirectoryId
+    , erRadiusSettings
+
+    -- * Destructuring the Response
+    , enableRadiusResponse
+    , EnableRadiusResponse
+    -- * Response Lenses
+    , errsStatus
+    ) where
+
+import           Network.AWS.DirectoryService.Types
+import           Network.AWS.DirectoryService.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | Contains the inputs for the EnableRadius operation.
+--
+-- /See:/ 'enableRadius' smart constructor.
+data EnableRadius = EnableRadius'
+    { _erDirectoryId    :: !Text
+    , _erRadiusSettings :: !RadiusSettings
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'EnableRadius' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'erDirectoryId'
+--
+-- * 'erRadiusSettings'
+enableRadius
+    :: Text -- ^ 'erDirectoryId'
+    -> RadiusSettings -- ^ 'erRadiusSettings'
+    -> EnableRadius
+enableRadius pDirectoryId_ pRadiusSettings_ =
+    EnableRadius'
+    { _erDirectoryId = pDirectoryId_
+    , _erRadiusSettings = pRadiusSettings_
+    }
+
+-- | The identifier of the directory to enable MFA for.
+erDirectoryId :: Lens' EnableRadius Text
+erDirectoryId = lens _erDirectoryId (\ s a -> s{_erDirectoryId = a});
+
+-- | A RadiusSettings object that contains information about the RADIUS
+-- server.
+erRadiusSettings :: Lens' EnableRadius RadiusSettings
+erRadiusSettings = lens _erRadiusSettings (\ s a -> s{_erRadiusSettings = a});
+
+instance AWSRequest EnableRadius where
+        type Sv EnableRadius = DirectoryService
+        type Rs EnableRadius = EnableRadiusResponse
+        request = postJSON
+        response
+          = receiveEmpty
+              (\ s h x ->
+                 EnableRadiusResponse' <$> (pure (fromEnum s)))
+
+instance ToHeaders EnableRadius where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DirectoryService_20150416.EnableRadius" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON EnableRadius where
+        toJSON EnableRadius'{..}
+          = object
+              ["DirectoryId" .= _erDirectoryId,
+               "RadiusSettings" .= _erRadiusSettings]
+
+instance ToPath EnableRadius where
+        toPath = const "/"
+
+instance ToQuery EnableRadius where
+        toQuery = const mempty
+
+-- | Contains the results of the EnableRadius operation.
+--
+-- /See:/ 'enableRadiusResponse' smart constructor.
+newtype EnableRadiusResponse = EnableRadiusResponse'
+    { _errsStatus :: Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'EnableRadiusResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'errsStatus'
+enableRadiusResponse
+    :: Int -- ^ 'errsStatus'
+    -> EnableRadiusResponse
+enableRadiusResponse pStatus_ =
+    EnableRadiusResponse'
+    { _errsStatus = pStatus_
+    }
+
+-- | The response status code.
+errsStatus :: Lens' EnableRadiusResponse Int
+errsStatus = lens _errsStatus (\ s a -> s{_errsStatus = a});
diff --git a/gen/Network/AWS/DirectoryService/EnableSSO.hs b/gen/Network/AWS/DirectoryService/EnableSSO.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DirectoryService/EnableSSO.hs
@@ -0,0 +1,151 @@
+{-# 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.DirectoryService.EnableSSO
+-- 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)
+--
+-- Enables single-sign on for a directory.
+--
+-- /See:/ <http://docs.aws.amazon.com/directoryservice/latest/devguide/API_EnableSSO.html AWS API Reference> for EnableSSO.
+module Network.AWS.DirectoryService.EnableSSO
+    (
+    -- * Creating a Request
+      enableSSO
+    , EnableSSO
+    -- * Request Lenses
+    , esUserName
+    , esPassword
+    , esDirectoryId
+
+    -- * Destructuring the Response
+    , enableSSOResponse
+    , EnableSSOResponse
+    -- * Response Lenses
+    , esrsStatus
+    ) where
+
+import           Network.AWS.DirectoryService.Types
+import           Network.AWS.DirectoryService.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | Contains the inputs for the EnableSso operation.
+--
+-- /See:/ 'enableSSO' smart constructor.
+data EnableSSO = EnableSSO'
+    { _esUserName    :: !(Maybe Text)
+    , _esPassword    :: !(Maybe (Sensitive Text))
+    , _esDirectoryId :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'EnableSSO' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'esUserName'
+--
+-- * 'esPassword'
+--
+-- * 'esDirectoryId'
+enableSSO
+    :: Text -- ^ 'esDirectoryId'
+    -> EnableSSO
+enableSSO pDirectoryId_ =
+    EnableSSO'
+    { _esUserName = Nothing
+    , _esPassword = Nothing
+    , _esDirectoryId = pDirectoryId_
+    }
+
+-- | The username of an alternate account to use to enable single-sign on.
+-- This is only used for AD Connector directories. This account must have
+-- privileges to add a service principle name.
+--
+-- If the AD Connector service account does not have privileges to add a
+-- service principle name, you can specify an alternate account with the
+-- /UserName/ and /Password/ parameters. These credentials are only used to
+-- enable single sign-on and are not stored by the service. The AD
+-- Connector service account is not changed.
+esUserName :: Lens' EnableSSO (Maybe Text)
+esUserName = lens _esUserName (\ s a -> s{_esUserName = a});
+
+-- | The password of an alternate account to use to enable single-sign on.
+-- This is only used for AD Connector directories. See the /UserName/
+-- parameter for more information.
+esPassword :: Lens' EnableSSO (Maybe Text)
+esPassword = lens _esPassword (\ s a -> s{_esPassword = a}) . mapping _Sensitive;
+
+-- | The identifier of the directory to enable single-sign on for.
+esDirectoryId :: Lens' EnableSSO Text
+esDirectoryId = lens _esDirectoryId (\ s a -> s{_esDirectoryId = a});
+
+instance AWSRequest EnableSSO where
+        type Sv EnableSSO = DirectoryService
+        type Rs EnableSSO = EnableSSOResponse
+        request = postJSON
+        response
+          = receiveEmpty
+              (\ s h x ->
+                 EnableSSOResponse' <$> (pure (fromEnum s)))
+
+instance ToHeaders EnableSSO where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DirectoryService_20150416.EnableSso" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON EnableSSO where
+        toJSON EnableSSO'{..}
+          = object
+              ["UserName" .= _esUserName,
+               "Password" .= _esPassword,
+               "DirectoryId" .= _esDirectoryId]
+
+instance ToPath EnableSSO where
+        toPath = const "/"
+
+instance ToQuery EnableSSO where
+        toQuery = const mempty
+
+-- | Contains the results of the EnableSso operation.
+--
+-- /See:/ 'enableSSOResponse' smart constructor.
+newtype EnableSSOResponse = EnableSSOResponse'
+    { _esrsStatus :: Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'EnableSSOResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'esrsStatus'
+enableSSOResponse
+    :: Int -- ^ 'esrsStatus'
+    -> EnableSSOResponse
+enableSSOResponse pStatus_ =
+    EnableSSOResponse'
+    { _esrsStatus = pStatus_
+    }
+
+-- | The response status code.
+esrsStatus :: Lens' EnableSSOResponse Int
+esrsStatus = lens _esrsStatus (\ s a -> s{_esrsStatus = a});
diff --git a/gen/Network/AWS/DirectoryService/GetDirectoryLimits.hs b/gen/Network/AWS/DirectoryService/GetDirectoryLimits.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DirectoryService/GetDirectoryLimits.hs
@@ -0,0 +1,118 @@
+{-# 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.DirectoryService.GetDirectoryLimits
+-- 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)
+--
+-- Obtains directory limit information for the current region.
+--
+-- /See:/ <http://docs.aws.amazon.com/directoryservice/latest/devguide/API_GetDirectoryLimits.html AWS API Reference> for GetDirectoryLimits.
+module Network.AWS.DirectoryService.GetDirectoryLimits
+    (
+    -- * Creating a Request
+      getDirectoryLimits
+    , GetDirectoryLimits
+
+    -- * Destructuring the Response
+    , getDirectoryLimitsResponse
+    , GetDirectoryLimitsResponse
+    -- * Response Lenses
+    , gdlrsDirectoryLimits
+    , gdlrsStatus
+    ) where
+
+import           Network.AWS.DirectoryService.Types
+import           Network.AWS.DirectoryService.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | Contains the inputs for the GetDirectoryLimits operation.
+--
+-- /See:/ 'getDirectoryLimits' smart constructor.
+data GetDirectoryLimits =
+    GetDirectoryLimits'
+    deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetDirectoryLimits' with the minimum fields required to make a request.
+--
+getDirectoryLimits
+    :: GetDirectoryLimits
+getDirectoryLimits = GetDirectoryLimits'
+
+instance AWSRequest GetDirectoryLimits where
+        type Sv GetDirectoryLimits = DirectoryService
+        type Rs GetDirectoryLimits =
+             GetDirectoryLimitsResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 GetDirectoryLimitsResponse' <$>
+                   (x .?> "DirectoryLimits") <*> (pure (fromEnum s)))
+
+instance ToHeaders GetDirectoryLimits where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DirectoryService_20150416.GetDirectoryLimits" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON GetDirectoryLimits where
+        toJSON = const (Object mempty)
+
+instance ToPath GetDirectoryLimits where
+        toPath = const "/"
+
+instance ToQuery GetDirectoryLimits where
+        toQuery = const mempty
+
+-- | Contains the results of the GetDirectoryLimits operation.
+--
+-- /See:/ 'getDirectoryLimitsResponse' smart constructor.
+data GetDirectoryLimitsResponse = GetDirectoryLimitsResponse'
+    { _gdlrsDirectoryLimits :: !(Maybe DirectoryLimits)
+    , _gdlrsStatus          :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetDirectoryLimitsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gdlrsDirectoryLimits'
+--
+-- * 'gdlrsStatus'
+getDirectoryLimitsResponse
+    :: Int -- ^ 'gdlrsStatus'
+    -> GetDirectoryLimitsResponse
+getDirectoryLimitsResponse pStatus_ =
+    GetDirectoryLimitsResponse'
+    { _gdlrsDirectoryLimits = Nothing
+    , _gdlrsStatus = pStatus_
+    }
+
+-- | A DirectoryLimits object that contains the directory limits for the
+-- current region.
+gdlrsDirectoryLimits :: Lens' GetDirectoryLimitsResponse (Maybe DirectoryLimits)
+gdlrsDirectoryLimits = lens _gdlrsDirectoryLimits (\ s a -> s{_gdlrsDirectoryLimits = a});
+
+-- | The response status code.
+gdlrsStatus :: Lens' GetDirectoryLimitsResponse Int
+gdlrsStatus = lens _gdlrsStatus (\ s a -> s{_gdlrsStatus = a});
diff --git a/gen/Network/AWS/DirectoryService/GetSnapshotLimits.hs b/gen/Network/AWS/DirectoryService/GetSnapshotLimits.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DirectoryService/GetSnapshotLimits.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.DirectoryService.GetSnapshotLimits
+-- 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)
+--
+-- Obtains the manual snapshot limits for a directory.
+--
+-- /See:/ <http://docs.aws.amazon.com/directoryservice/latest/devguide/API_GetSnapshotLimits.html AWS API Reference> for GetSnapshotLimits.
+module Network.AWS.DirectoryService.GetSnapshotLimits
+    (
+    -- * Creating a Request
+      getSnapshotLimits
+    , GetSnapshotLimits
+    -- * Request Lenses
+    , gslDirectoryId
+
+    -- * Destructuring the Response
+    , getSnapshotLimitsResponse
+    , GetSnapshotLimitsResponse
+    -- * Response Lenses
+    , gslrsSnapshotLimits
+    , gslrsStatus
+    ) where
+
+import           Network.AWS.DirectoryService.Types
+import           Network.AWS.DirectoryService.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | Contains the inputs for the GetSnapshotLimits operation.
+--
+-- /See:/ 'getSnapshotLimits' smart constructor.
+newtype GetSnapshotLimits = GetSnapshotLimits'
+    { _gslDirectoryId :: Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetSnapshotLimits' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gslDirectoryId'
+getSnapshotLimits
+    :: Text -- ^ 'gslDirectoryId'
+    -> GetSnapshotLimits
+getSnapshotLimits pDirectoryId_ =
+    GetSnapshotLimits'
+    { _gslDirectoryId = pDirectoryId_
+    }
+
+-- | Contains the identifier of the directory to obtain the limits for.
+gslDirectoryId :: Lens' GetSnapshotLimits Text
+gslDirectoryId = lens _gslDirectoryId (\ s a -> s{_gslDirectoryId = a});
+
+instance AWSRequest GetSnapshotLimits where
+        type Sv GetSnapshotLimits = DirectoryService
+        type Rs GetSnapshotLimits = GetSnapshotLimitsResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 GetSnapshotLimitsResponse' <$>
+                   (x .?> "SnapshotLimits") <*> (pure (fromEnum s)))
+
+instance ToHeaders GetSnapshotLimits where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DirectoryService_20150416.GetSnapshotLimits" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON GetSnapshotLimits where
+        toJSON GetSnapshotLimits'{..}
+          = object ["DirectoryId" .= _gslDirectoryId]
+
+instance ToPath GetSnapshotLimits where
+        toPath = const "/"
+
+instance ToQuery GetSnapshotLimits where
+        toQuery = const mempty
+
+-- | Contains the results of the GetSnapshotLimits operation.
+--
+-- /See:/ 'getSnapshotLimitsResponse' smart constructor.
+data GetSnapshotLimitsResponse = GetSnapshotLimitsResponse'
+    { _gslrsSnapshotLimits :: !(Maybe SnapshotLimits)
+    , _gslrsStatus         :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GetSnapshotLimitsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gslrsSnapshotLimits'
+--
+-- * 'gslrsStatus'
+getSnapshotLimitsResponse
+    :: Int -- ^ 'gslrsStatus'
+    -> GetSnapshotLimitsResponse
+getSnapshotLimitsResponse pStatus_ =
+    GetSnapshotLimitsResponse'
+    { _gslrsSnapshotLimits = Nothing
+    , _gslrsStatus = pStatus_
+    }
+
+-- | A SnapshotLimits object that contains the manual snapshot limits for the
+-- specified directory.
+gslrsSnapshotLimits :: Lens' GetSnapshotLimitsResponse (Maybe SnapshotLimits)
+gslrsSnapshotLimits = lens _gslrsSnapshotLimits (\ s a -> s{_gslrsSnapshotLimits = a});
+
+-- | The response status code.
+gslrsStatus :: Lens' GetSnapshotLimitsResponse Int
+gslrsStatus = lens _gslrsStatus (\ s a -> s{_gslrsStatus = a});
diff --git a/gen/Network/AWS/DirectoryService/RestoreFromSnapshot.hs b/gen/Network/AWS/DirectoryService/RestoreFromSnapshot.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DirectoryService/RestoreFromSnapshot.hs
@@ -0,0 +1,130 @@
+{-# 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.DirectoryService.RestoreFromSnapshot
+-- 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)
+--
+-- Restores a directory using an existing directory snapshot.
+--
+-- When you restore a directory from a snapshot, any changes made to the
+-- directory after the snapshot date are overwritten.
+--
+-- This action returns as soon as the restore operation is initiated. You
+-- can monitor the progress of the restore operation by calling the
+-- DescribeDirectories operation with the directory identifier. When the
+-- __DirectoryDescription.Stage__ value changes to 'Active', the restore
+-- operation is complete.
+--
+-- /See:/ <http://docs.aws.amazon.com/directoryservice/latest/devguide/API_RestoreFromSnapshot.html AWS API Reference> for RestoreFromSnapshot.
+module Network.AWS.DirectoryService.RestoreFromSnapshot
+    (
+    -- * Creating a Request
+      restoreFromSnapshot
+    , RestoreFromSnapshot
+    -- * Request Lenses
+    , rfsSnapshotId
+
+    -- * Destructuring the Response
+    , restoreFromSnapshotResponse
+    , RestoreFromSnapshotResponse
+    -- * Response Lenses
+    , rfsrsStatus
+    ) where
+
+import           Network.AWS.DirectoryService.Types
+import           Network.AWS.DirectoryService.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | An object representing the inputs for the RestoreFromSnapshot operation.
+--
+-- /See:/ 'restoreFromSnapshot' smart constructor.
+newtype RestoreFromSnapshot = RestoreFromSnapshot'
+    { _rfsSnapshotId :: Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'RestoreFromSnapshot' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'rfsSnapshotId'
+restoreFromSnapshot
+    :: Text -- ^ 'rfsSnapshotId'
+    -> RestoreFromSnapshot
+restoreFromSnapshot pSnapshotId_ =
+    RestoreFromSnapshot'
+    { _rfsSnapshotId = pSnapshotId_
+    }
+
+-- | The identifier of the snapshot to restore from.
+rfsSnapshotId :: Lens' RestoreFromSnapshot Text
+rfsSnapshotId = lens _rfsSnapshotId (\ s a -> s{_rfsSnapshotId = a});
+
+instance AWSRequest RestoreFromSnapshot where
+        type Sv RestoreFromSnapshot = DirectoryService
+        type Rs RestoreFromSnapshot =
+             RestoreFromSnapshotResponse
+        request = postJSON
+        response
+          = receiveEmpty
+              (\ s h x ->
+                 RestoreFromSnapshotResponse' <$> (pure (fromEnum s)))
+
+instance ToHeaders RestoreFromSnapshot where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DirectoryService_20150416.RestoreFromSnapshot" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON RestoreFromSnapshot where
+        toJSON RestoreFromSnapshot'{..}
+          = object ["SnapshotId" .= _rfsSnapshotId]
+
+instance ToPath RestoreFromSnapshot where
+        toPath = const "/"
+
+instance ToQuery RestoreFromSnapshot where
+        toQuery = const mempty
+
+-- | Contains the results of the RestoreFromSnapshot operation.
+--
+-- /See:/ 'restoreFromSnapshotResponse' smart constructor.
+newtype RestoreFromSnapshotResponse = RestoreFromSnapshotResponse'
+    { _rfsrsStatus :: Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'RestoreFromSnapshotResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'rfsrsStatus'
+restoreFromSnapshotResponse
+    :: Int -- ^ 'rfsrsStatus'
+    -> RestoreFromSnapshotResponse
+restoreFromSnapshotResponse pStatus_ =
+    RestoreFromSnapshotResponse'
+    { _rfsrsStatus = pStatus_
+    }
+
+-- | The response status code.
+rfsrsStatus :: Lens' RestoreFromSnapshotResponse Int
+rfsrsStatus = lens _rfsrsStatus (\ s a -> s{_rfsrsStatus = a});
diff --git a/gen/Network/AWS/DirectoryService/Types.hs b/gen/Network/AWS/DirectoryService/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DirectoryService/Types.hs
@@ -0,0 +1,261 @@
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TypeFamilies      #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.DirectoryService.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.DirectoryService.Types
+    (
+    -- * Service
+      DirectoryService
+
+    -- * Errors
+    , _AuthenticationFailedException
+    , _DirectoryUnavailableException
+    , _InvalidParameterException
+    , _UnsupportedOperationException
+    , _EntityAlreadyExistsException
+    , _DirectoryLimitExceededException
+    , _EntityDoesNotExistException
+    , _InsufficientPermissionsException
+    , _InvalidNextTokenException
+    , _ServiceException
+    , _SnapshotLimitExceededException
+    , _ClientException
+
+    -- * DirectorySize
+    , DirectorySize (..)
+
+    -- * DirectoryStage
+    , DirectoryStage (..)
+
+    -- * DirectoryType
+    , DirectoryType (..)
+
+    -- * RadiusAuthenticationProtocol
+    , RadiusAuthenticationProtocol (..)
+
+    -- * RadiusStatus
+    , RadiusStatus (..)
+
+    -- * SnapshotStatus
+    , SnapshotStatus (..)
+
+    -- * SnapshotType
+    , SnapshotType (..)
+
+    -- * Attribute
+    , Attribute
+    , attribute
+    , aValue
+    , aName
+
+    -- * Computer
+    , Computer
+    , computer
+    , cComputerId
+    , cComputerAttributes
+    , cComputerName
+
+    -- * DirectoryConnectSettings
+    , DirectoryConnectSettings
+    , directoryConnectSettings
+    , dcsVPCId
+    , dcsSubnetIds
+    , dcsCustomerDNSIPs
+    , dcsCustomerUserName
+
+    -- * DirectoryConnectSettingsDescription
+    , DirectoryConnectSettingsDescription
+    , directoryConnectSettingsDescription
+    , dcsdCustomerUserName
+    , dcsdSubnetIds
+    , dcsdVPCId
+    , dcsdConnectIPs
+    , dcsdSecurityGroupId
+    , dcsdAvailabilityZones
+
+    -- * DirectoryDescription
+    , DirectoryDescription
+    , directoryDescription
+    , ddRadiusStatus
+    , ddDirectoryId
+    , ddStage
+    , ddAccessURL
+    , ddShortName
+    , ddSize
+    , ddRadiusSettings
+    , ddLaunchTime
+    , ddAlias
+    , ddName
+    , ddSSOEnabled
+    , ddStageLastUpdatedDateTime
+    , ddStageReason
+    , ddDNSIPAddrs
+    , ddVPCSettings
+    , ddType
+    , ddConnectSettings
+    , ddDescription
+
+    -- * DirectoryLimits
+    , DirectoryLimits
+    , directoryLimits
+    , dlConnectedDirectoriesCurrentCount
+    , dlConnectedDirectoriesLimit
+    , dlConnectedDirectoriesLimitReached
+    , dlCloudOnlyDirectoriesLimit
+    , dlCloudOnlyDirectoriesCurrentCount
+    , dlCloudOnlyDirectoriesLimitReached
+
+    -- * DirectoryVPCSettings
+    , DirectoryVPCSettings
+    , directoryVPCSettings
+    , dvsVPCId
+    , dvsSubnetIds
+
+    -- * DirectoryVPCSettingsDescription
+    , DirectoryVPCSettingsDescription
+    , directoryVPCSettingsDescription
+    , dvsdSubnetIds
+    , dvsdVPCId
+    , dvsdSecurityGroupId
+    , dvsdAvailabilityZones
+
+    -- * RadiusSettings
+    , RadiusSettings
+    , radiusSettings
+    , rsDisplayLabel
+    , rsRadiusServers
+    , rsRadiusRetries
+    , rsAuthenticationProtocol
+    , rsUseSameUsername
+    , rsSharedSecret
+    , rsRadiusTimeout
+    , rsRadiusPort
+
+    -- * Snapshot
+    , Snapshot
+    , snapshot
+    , sDirectoryId
+    , sStatus
+    , sStartTime
+    , sName
+    , sType
+    , sSnapshotId
+
+    -- * SnapshotLimits
+    , SnapshotLimits
+    , snapshotLimits
+    , slManualSnapshotsLimitReached
+    , slManualSnapshotsCurrentCount
+    , slManualSnapshotsLimit
+    ) where
+
+import           Network.AWS.DirectoryService.Types.Product
+import           Network.AWS.DirectoryService.Types.Sum
+import           Network.AWS.Prelude
+import           Network.AWS.Sign.V4
+
+-- | Version @2015-04-16@ of the Amazon Directory Service SDK.
+data DirectoryService
+
+instance AWSService DirectoryService where
+    type Sg DirectoryService = V4
+    service = const svc
+      where
+        svc =
+            Service
+            { _svcAbbrev = "DirectoryService"
+            , _svcPrefix = "ds"
+            , _svcVersion = "2015-04-16"
+            , _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
+
+-- | An authentication error occurred.
+_AuthenticationFailedException :: AsError a => Getting (First ServiceError) a ServiceError
+_AuthenticationFailedException =
+    _ServiceError . hasCode "AuthenticationFailedException"
+
+-- | The specified directory is unavailable or could not be found.
+_DirectoryUnavailableException :: AsError a => Getting (First ServiceError) a ServiceError
+_DirectoryUnavailableException =
+    _ServiceError . hasCode "DirectoryUnavailableException"
+
+-- | One or more parameters are not valid.
+_InvalidParameterException :: AsError a => Getting (First ServiceError) a ServiceError
+_InvalidParameterException =
+    _ServiceError . hasCode "InvalidParameterException"
+
+-- | The operation is not supported.
+_UnsupportedOperationException :: AsError a => Getting (First ServiceError) a ServiceError
+_UnsupportedOperationException =
+    _ServiceError . hasCode "UnsupportedOperationException"
+
+-- | The specified entity already exists.
+_EntityAlreadyExistsException :: AsError a => Getting (First ServiceError) a ServiceError
+_EntityAlreadyExistsException =
+    _ServiceError . hasCode "EntityAlreadyExistsException"
+
+-- | The maximum number of directories in the region has been reached. You
+-- can use the GetDirectoryLimits operation to determine your directory
+-- limits in the region.
+_DirectoryLimitExceededException :: AsError a => Getting (First ServiceError) a ServiceError
+_DirectoryLimitExceededException =
+    _ServiceError . hasCode "DirectoryLimitExceededException"
+
+-- | The specified entity could not be found.
+_EntityDoesNotExistException :: AsError a => Getting (First ServiceError) a ServiceError
+_EntityDoesNotExistException =
+    _ServiceError . hasCode "EntityDoesNotExistException"
+
+-- | The account does not have sufficient permission to perform the
+-- operation.
+_InsufficientPermissionsException :: AsError a => Getting (First ServiceError) a ServiceError
+_InsufficientPermissionsException =
+    _ServiceError . hasCode "InsufficientPermissionsException"
+
+-- | The /NextToken/ value is not valid.
+_InvalidNextTokenException :: AsError a => Getting (First ServiceError) a ServiceError
+_InvalidNextTokenException =
+    _ServiceError . hasCode "InvalidNextTokenException"
+
+-- | An exception has occurred in AWS Directory Service.
+_ServiceException :: AsError a => Getting (First ServiceError) a ServiceError
+_ServiceException = _ServiceError . hasCode "ServiceException"
+
+-- | The maximum number of manual snapshots for the directory has been
+-- reached. You can use the GetSnapshotLimits operation to determine the
+-- snapshot limits for a directory.
+_SnapshotLimitExceededException :: AsError a => Getting (First ServiceError) a ServiceError
+_SnapshotLimitExceededException =
+    _ServiceError . hasCode "SnapshotLimitExceededException"
+
+-- | A client exception has occurred.
+_ClientException :: AsError a => Getting (First ServiceError) a ServiceError
+_ClientException = _ServiceError . hasCode "ClientException"
diff --git a/gen/Network/AWS/DirectoryService/Types/Product.hs b/gen/Network/AWS/DirectoryService/Types/Product.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DirectoryService/Types/Product.hs
@@ -0,0 +1,853 @@
+{-# 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.DirectoryService.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.DirectoryService.Types.Product where
+
+import           Network.AWS.DirectoryService.Types.Sum
+import           Network.AWS.Prelude
+
+-- | Represents a named directory attribute.
+--
+-- /See:/ 'attribute' smart constructor.
+data Attribute = Attribute'
+    { _aValue :: !(Maybe Text)
+    , _aName  :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Attribute' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'aValue'
+--
+-- * 'aName'
+attribute
+    :: Attribute
+attribute =
+    Attribute'
+    { _aValue = Nothing
+    , _aName = Nothing
+    }
+
+-- | The value of the attribute.
+aValue :: Lens' Attribute (Maybe Text)
+aValue = lens _aValue (\ s a -> s{_aValue = a});
+
+-- | The name of the attribute.
+aName :: Lens' Attribute (Maybe Text)
+aName = lens _aName (\ s a -> s{_aName = a});
+
+instance FromJSON Attribute where
+        parseJSON
+          = withObject "Attribute"
+              (\ x ->
+                 Attribute' <$> (x .:? "Value") <*> (x .:? "Name"))
+
+instance ToJSON Attribute where
+        toJSON Attribute'{..}
+          = object ["Value" .= _aValue, "Name" .= _aName]
+
+-- | Contains information about a computer account in a directory.
+--
+-- /See:/ 'computer' smart constructor.
+data Computer = Computer'
+    { _cComputerId         :: !(Maybe Text)
+    , _cComputerAttributes :: !(Maybe [Attribute])
+    , _cComputerName       :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Computer' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cComputerId'
+--
+-- * 'cComputerAttributes'
+--
+-- * 'cComputerName'
+computer
+    :: Computer
+computer =
+    Computer'
+    { _cComputerId = Nothing
+    , _cComputerAttributes = Nothing
+    , _cComputerName = Nothing
+    }
+
+-- | The identifier of the computer.
+cComputerId :: Lens' Computer (Maybe Text)
+cComputerId = lens _cComputerId (\ s a -> s{_cComputerId = a});
+
+-- | An array of Attribute objects that contain the LDAP attributes that
+-- belong to the computer account.
+cComputerAttributes :: Lens' Computer [Attribute]
+cComputerAttributes = lens _cComputerAttributes (\ s a -> s{_cComputerAttributes = a}) . _Default . _Coerce;
+
+-- | The computer name.
+cComputerName :: Lens' Computer (Maybe Text)
+cComputerName = lens _cComputerName (\ s a -> s{_cComputerName = a});
+
+instance FromJSON Computer where
+        parseJSON
+          = withObject "Computer"
+              (\ x ->
+                 Computer' <$>
+                   (x .:? "ComputerId") <*>
+                     (x .:? "ComputerAttributes" .!= mempty)
+                     <*> (x .:? "ComputerName"))
+
+-- | Contains information for the ConnectDirectory operation when an AD
+-- Connector directory is being created.
+--
+-- /See:/ 'directoryConnectSettings' smart constructor.
+data DirectoryConnectSettings = DirectoryConnectSettings'
+    { _dcsVPCId            :: !Text
+    , _dcsSubnetIds        :: ![Text]
+    , _dcsCustomerDNSIPs   :: ![Text]
+    , _dcsCustomerUserName :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DirectoryConnectSettings' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dcsVPCId'
+--
+-- * 'dcsSubnetIds'
+--
+-- * 'dcsCustomerDNSIPs'
+--
+-- * 'dcsCustomerUserName'
+directoryConnectSettings
+    :: Text -- ^ 'dcsVPCId'
+    -> Text -- ^ 'dcsCustomerUserName'
+    -> DirectoryConnectSettings
+directoryConnectSettings pVPCId_ pCustomerUserName_ =
+    DirectoryConnectSettings'
+    { _dcsVPCId = pVPCId_
+    , _dcsSubnetIds = mempty
+    , _dcsCustomerDNSIPs = mempty
+    , _dcsCustomerUserName = pCustomerUserName_
+    }
+
+-- | The identifier of the VPC that the AD Connector is created in.
+dcsVPCId :: Lens' DirectoryConnectSettings Text
+dcsVPCId = lens _dcsVPCId (\ s a -> s{_dcsVPCId = a});
+
+-- | A list of subnet identifiers in the VPC that the AD Connector is created
+-- in.
+dcsSubnetIds :: Lens' DirectoryConnectSettings [Text]
+dcsSubnetIds = lens _dcsSubnetIds (\ s a -> s{_dcsSubnetIds = a}) . _Coerce;
+
+-- | A list of one or more IP addresses of DNS servers or domain controllers
+-- in the on-premises directory.
+dcsCustomerDNSIPs :: Lens' DirectoryConnectSettings [Text]
+dcsCustomerDNSIPs = lens _dcsCustomerDNSIPs (\ s a -> s{_dcsCustomerDNSIPs = a}) . _Coerce;
+
+-- | The username of an account in the on-premises directory that is used to
+-- connect to the directory. This account must have the following
+-- privileges:
+--
+-- -   Read users and groups
+-- -   Create computer objects
+-- -   Join computers to the domain
+dcsCustomerUserName :: Lens' DirectoryConnectSettings Text
+dcsCustomerUserName = lens _dcsCustomerUserName (\ s a -> s{_dcsCustomerUserName = a});
+
+instance ToJSON DirectoryConnectSettings where
+        toJSON DirectoryConnectSettings'{..}
+          = object
+              ["VpcId" .= _dcsVPCId, "SubnetIds" .= _dcsSubnetIds,
+               "CustomerDnsIps" .= _dcsCustomerDNSIPs,
+               "CustomerUserName" .= _dcsCustomerUserName]
+
+-- | Contains information about an AD Connector directory.
+--
+-- /See:/ 'directoryConnectSettingsDescription' smart constructor.
+data DirectoryConnectSettingsDescription = DirectoryConnectSettingsDescription'
+    { _dcsdCustomerUserName  :: !(Maybe Text)
+    , _dcsdSubnetIds         :: !(Maybe [Text])
+    , _dcsdVPCId             :: !(Maybe Text)
+    , _dcsdConnectIPs        :: !(Maybe [Text])
+    , _dcsdSecurityGroupId   :: !(Maybe Text)
+    , _dcsdAvailabilityZones :: !(Maybe [Text])
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DirectoryConnectSettingsDescription' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dcsdCustomerUserName'
+--
+-- * 'dcsdSubnetIds'
+--
+-- * 'dcsdVPCId'
+--
+-- * 'dcsdConnectIPs'
+--
+-- * 'dcsdSecurityGroupId'
+--
+-- * 'dcsdAvailabilityZones'
+directoryConnectSettingsDescription
+    :: DirectoryConnectSettingsDescription
+directoryConnectSettingsDescription =
+    DirectoryConnectSettingsDescription'
+    { _dcsdCustomerUserName = Nothing
+    , _dcsdSubnetIds = Nothing
+    , _dcsdVPCId = Nothing
+    , _dcsdConnectIPs = Nothing
+    , _dcsdSecurityGroupId = Nothing
+    , _dcsdAvailabilityZones = Nothing
+    }
+
+-- | The username of the service account in the on-premises directory.
+dcsdCustomerUserName :: Lens' DirectoryConnectSettingsDescription (Maybe Text)
+dcsdCustomerUserName = lens _dcsdCustomerUserName (\ s a -> s{_dcsdCustomerUserName = a});
+
+-- | A list of subnet identifiers in the VPC that the AD connector is in.
+dcsdSubnetIds :: Lens' DirectoryConnectSettingsDescription [Text]
+dcsdSubnetIds = lens _dcsdSubnetIds (\ s a -> s{_dcsdSubnetIds = a}) . _Default . _Coerce;
+
+-- | The identifier of the VPC that the AD Connector is in.
+dcsdVPCId :: Lens' DirectoryConnectSettingsDescription (Maybe Text)
+dcsdVPCId = lens _dcsdVPCId (\ s a -> s{_dcsdVPCId = a});
+
+-- | The IP addresses of the AD Connector servers.
+dcsdConnectIPs :: Lens' DirectoryConnectSettingsDescription [Text]
+dcsdConnectIPs = lens _dcsdConnectIPs (\ s a -> s{_dcsdConnectIPs = a}) . _Default . _Coerce;
+
+-- | The security group identifier for the AD Connector directory.
+dcsdSecurityGroupId :: Lens' DirectoryConnectSettingsDescription (Maybe Text)
+dcsdSecurityGroupId = lens _dcsdSecurityGroupId (\ s a -> s{_dcsdSecurityGroupId = a});
+
+-- | A list of the Availability Zones that the directory is in.
+dcsdAvailabilityZones :: Lens' DirectoryConnectSettingsDescription [Text]
+dcsdAvailabilityZones = lens _dcsdAvailabilityZones (\ s a -> s{_dcsdAvailabilityZones = a}) . _Default . _Coerce;
+
+instance FromJSON DirectoryConnectSettingsDescription
+         where
+        parseJSON
+          = withObject "DirectoryConnectSettingsDescription"
+              (\ x ->
+                 DirectoryConnectSettingsDescription' <$>
+                   (x .:? "CustomerUserName") <*>
+                     (x .:? "SubnetIds" .!= mempty)
+                     <*> (x .:? "VpcId")
+                     <*> (x .:? "ConnectIps" .!= mempty)
+                     <*> (x .:? "SecurityGroupId")
+                     <*> (x .:? "AvailabilityZones" .!= mempty))
+
+-- | Contains information about an AWS Directory Service directory.
+--
+-- /See:/ 'directoryDescription' smart constructor.
+data DirectoryDescription = DirectoryDescription'
+    { _ddRadiusStatus             :: !(Maybe RadiusStatus)
+    , _ddDirectoryId              :: !(Maybe Text)
+    , _ddStage                    :: !(Maybe DirectoryStage)
+    , _ddAccessURL                :: !(Maybe Text)
+    , _ddShortName                :: !(Maybe Text)
+    , _ddSize                     :: !(Maybe DirectorySize)
+    , _ddRadiusSettings           :: !(Maybe RadiusSettings)
+    , _ddLaunchTime               :: !(Maybe POSIX)
+    , _ddAlias                    :: !(Maybe Text)
+    , _ddName                     :: !(Maybe Text)
+    , _ddSSOEnabled               :: !(Maybe Bool)
+    , _ddStageLastUpdatedDateTime :: !(Maybe POSIX)
+    , _ddStageReason              :: !(Maybe Text)
+    , _ddDNSIPAddrs               :: !(Maybe [Text])
+    , _ddVPCSettings              :: !(Maybe DirectoryVPCSettingsDescription)
+    , _ddType                     :: !(Maybe DirectoryType)
+    , _ddConnectSettings          :: !(Maybe DirectoryConnectSettingsDescription)
+    , _ddDescription              :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DirectoryDescription' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ddRadiusStatus'
+--
+-- * 'ddDirectoryId'
+--
+-- * 'ddStage'
+--
+-- * 'ddAccessURL'
+--
+-- * 'ddShortName'
+--
+-- * 'ddSize'
+--
+-- * 'ddRadiusSettings'
+--
+-- * 'ddLaunchTime'
+--
+-- * 'ddAlias'
+--
+-- * 'ddName'
+--
+-- * 'ddSSOEnabled'
+--
+-- * 'ddStageLastUpdatedDateTime'
+--
+-- * 'ddStageReason'
+--
+-- * 'ddDNSIPAddrs'
+--
+-- * 'ddVPCSettings'
+--
+-- * 'ddType'
+--
+-- * 'ddConnectSettings'
+--
+-- * 'ddDescription'
+directoryDescription
+    :: DirectoryDescription
+directoryDescription =
+    DirectoryDescription'
+    { _ddRadiusStatus = Nothing
+    , _ddDirectoryId = Nothing
+    , _ddStage = Nothing
+    , _ddAccessURL = Nothing
+    , _ddShortName = Nothing
+    , _ddSize = Nothing
+    , _ddRadiusSettings = Nothing
+    , _ddLaunchTime = Nothing
+    , _ddAlias = Nothing
+    , _ddName = Nothing
+    , _ddSSOEnabled = Nothing
+    , _ddStageLastUpdatedDateTime = Nothing
+    , _ddStageReason = Nothing
+    , _ddDNSIPAddrs = Nothing
+    , _ddVPCSettings = Nothing
+    , _ddType = Nothing
+    , _ddConnectSettings = Nothing
+    , _ddDescription = Nothing
+    }
+
+-- | The status of the RADIUS MFA server connection.
+ddRadiusStatus :: Lens' DirectoryDescription (Maybe RadiusStatus)
+ddRadiusStatus = lens _ddRadiusStatus (\ s a -> s{_ddRadiusStatus = a});
+
+-- | The directory identifier.
+ddDirectoryId :: Lens' DirectoryDescription (Maybe Text)
+ddDirectoryId = lens _ddDirectoryId (\ s a -> s{_ddDirectoryId = a});
+
+-- | The current stage of the directory.
+ddStage :: Lens' DirectoryDescription (Maybe DirectoryStage)
+ddStage = lens _ddStage (\ s a -> s{_ddStage = a});
+
+-- | The access URL for the directory, such as
+-- 'http:\/\/\<alias>.awsapps.com'.
+ddAccessURL :: Lens' DirectoryDescription (Maybe Text)
+ddAccessURL = lens _ddAccessURL (\ s a -> s{_ddAccessURL = a});
+
+-- | The short name of the directory.
+ddShortName :: Lens' DirectoryDescription (Maybe Text)
+ddShortName = lens _ddShortName (\ s a -> s{_ddShortName = a});
+
+-- | The directory size.
+ddSize :: Lens' DirectoryDescription (Maybe DirectorySize)
+ddSize = lens _ddSize (\ s a -> s{_ddSize = a});
+
+-- | A RadiusSettings object that contains information about the RADIUS
+-- server configured for this directory.
+ddRadiusSettings :: Lens' DirectoryDescription (Maybe RadiusSettings)
+ddRadiusSettings = lens _ddRadiusSettings (\ s a -> s{_ddRadiusSettings = a});
+
+-- | Specifies when the directory was created.
+ddLaunchTime :: Lens' DirectoryDescription (Maybe UTCTime)
+ddLaunchTime = lens _ddLaunchTime (\ s a -> s{_ddLaunchTime = a}) . mapping _Time;
+
+-- | The alias for the directory.
+ddAlias :: Lens' DirectoryDescription (Maybe Text)
+ddAlias = lens _ddAlias (\ s a -> s{_ddAlias = a});
+
+-- | The fully-qualified name of the directory.
+ddName :: Lens' DirectoryDescription (Maybe Text)
+ddName = lens _ddName (\ s a -> s{_ddName = a});
+
+-- | Indicates if single-sign on is enabled for the directory. For more
+-- information, see EnableSso and DisableSso.
+ddSSOEnabled :: Lens' DirectoryDescription (Maybe Bool)
+ddSSOEnabled = lens _ddSSOEnabled (\ s a -> s{_ddSSOEnabled = a});
+
+-- | The date and time that the stage was last updated.
+ddStageLastUpdatedDateTime :: Lens' DirectoryDescription (Maybe UTCTime)
+ddStageLastUpdatedDateTime = lens _ddStageLastUpdatedDateTime (\ s a -> s{_ddStageLastUpdatedDateTime = a}) . mapping _Time;
+
+-- | Additional information about the directory stage.
+ddStageReason :: Lens' DirectoryDescription (Maybe Text)
+ddStageReason = lens _ddStageReason (\ s a -> s{_ddStageReason = a});
+
+-- | The IP addresses of the DNS servers for the directory. For a Simple AD
+-- directory, these are the IP addresses of the Simple AD directory
+-- servers. For an AD Connector directory, these are the IP addresses of
+-- the DNS servers or domain controllers in the on-premises directory that
+-- the AD Connector is connected to.
+ddDNSIPAddrs :: Lens' DirectoryDescription [Text]
+ddDNSIPAddrs = lens _ddDNSIPAddrs (\ s a -> s{_ddDNSIPAddrs = a}) . _Default . _Coerce;
+
+-- | A DirectoryVpcSettingsDescription object that contains additional
+-- information about a Simple AD directory. This member is only present if
+-- the directory is a Simple AD directory.
+ddVPCSettings :: Lens' DirectoryDescription (Maybe DirectoryVPCSettingsDescription)
+ddVPCSettings = lens _ddVPCSettings (\ s a -> s{_ddVPCSettings = a});
+
+-- | The directory size.
+ddType :: Lens' DirectoryDescription (Maybe DirectoryType)
+ddType = lens _ddType (\ s a -> s{_ddType = a});
+
+-- | A DirectoryConnectSettingsDescription object that contains additional
+-- information about an AD Connector directory. This member is only present
+-- if the directory is an AD Connector directory.
+ddConnectSettings :: Lens' DirectoryDescription (Maybe DirectoryConnectSettingsDescription)
+ddConnectSettings = lens _ddConnectSettings (\ s a -> s{_ddConnectSettings = a});
+
+-- | The textual description for the directory.
+ddDescription :: Lens' DirectoryDescription (Maybe Text)
+ddDescription = lens _ddDescription (\ s a -> s{_ddDescription = a});
+
+instance FromJSON DirectoryDescription where
+        parseJSON
+          = withObject "DirectoryDescription"
+              (\ x ->
+                 DirectoryDescription' <$>
+                   (x .:? "RadiusStatus") <*> (x .:? "DirectoryId") <*>
+                     (x .:? "Stage")
+                     <*> (x .:? "AccessUrl")
+                     <*> (x .:? "ShortName")
+                     <*> (x .:? "Size")
+                     <*> (x .:? "RadiusSettings")
+                     <*> (x .:? "LaunchTime")
+                     <*> (x .:? "Alias")
+                     <*> (x .:? "Name")
+                     <*> (x .:? "SsoEnabled")
+                     <*> (x .:? "StageLastUpdatedDateTime")
+                     <*> (x .:? "StageReason")
+                     <*> (x .:? "DnsIpAddrs" .!= mempty)
+                     <*> (x .:? "VpcSettings")
+                     <*> (x .:? "Type")
+                     <*> (x .:? "ConnectSettings")
+                     <*> (x .:? "Description"))
+
+-- | Contains directory limit information for a region.
+--
+-- /See:/ 'directoryLimits' smart constructor.
+data DirectoryLimits = DirectoryLimits'
+    { _dlConnectedDirectoriesCurrentCount :: !(Maybe Nat)
+    , _dlConnectedDirectoriesLimit        :: !(Maybe Nat)
+    , _dlConnectedDirectoriesLimitReached :: !(Maybe Bool)
+    , _dlCloudOnlyDirectoriesLimit        :: !(Maybe Nat)
+    , _dlCloudOnlyDirectoriesCurrentCount :: !(Maybe Nat)
+    , _dlCloudOnlyDirectoriesLimitReached :: !(Maybe Bool)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DirectoryLimits' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dlConnectedDirectoriesCurrentCount'
+--
+-- * 'dlConnectedDirectoriesLimit'
+--
+-- * 'dlConnectedDirectoriesLimitReached'
+--
+-- * 'dlCloudOnlyDirectoriesLimit'
+--
+-- * 'dlCloudOnlyDirectoriesCurrentCount'
+--
+-- * 'dlCloudOnlyDirectoriesLimitReached'
+directoryLimits
+    :: DirectoryLimits
+directoryLimits =
+    DirectoryLimits'
+    { _dlConnectedDirectoriesCurrentCount = Nothing
+    , _dlConnectedDirectoriesLimit = Nothing
+    , _dlConnectedDirectoriesLimitReached = Nothing
+    , _dlCloudOnlyDirectoriesLimit = Nothing
+    , _dlCloudOnlyDirectoriesCurrentCount = Nothing
+    , _dlCloudOnlyDirectoriesLimitReached = Nothing
+    }
+
+-- | The current number of connected directories in the region.
+dlConnectedDirectoriesCurrentCount :: Lens' DirectoryLimits (Maybe Natural)
+dlConnectedDirectoriesCurrentCount = lens _dlConnectedDirectoriesCurrentCount (\ s a -> s{_dlConnectedDirectoriesCurrentCount = a}) . mapping _Nat;
+
+-- | The maximum number of connected directories allowed in the region.
+dlConnectedDirectoriesLimit :: Lens' DirectoryLimits (Maybe Natural)
+dlConnectedDirectoriesLimit = lens _dlConnectedDirectoriesLimit (\ s a -> s{_dlConnectedDirectoriesLimit = a}) . mapping _Nat;
+
+-- | Indicates if the connected directory limit has been reached.
+dlConnectedDirectoriesLimitReached :: Lens' DirectoryLimits (Maybe Bool)
+dlConnectedDirectoriesLimitReached = lens _dlConnectedDirectoriesLimitReached (\ s a -> s{_dlConnectedDirectoriesLimitReached = a});
+
+-- | The maximum number of cloud directories allowed in the region.
+dlCloudOnlyDirectoriesLimit :: Lens' DirectoryLimits (Maybe Natural)
+dlCloudOnlyDirectoriesLimit = lens _dlCloudOnlyDirectoriesLimit (\ s a -> s{_dlCloudOnlyDirectoriesLimit = a}) . mapping _Nat;
+
+-- | The current number of cloud directories in the region.
+dlCloudOnlyDirectoriesCurrentCount :: Lens' DirectoryLimits (Maybe Natural)
+dlCloudOnlyDirectoriesCurrentCount = lens _dlCloudOnlyDirectoriesCurrentCount (\ s a -> s{_dlCloudOnlyDirectoriesCurrentCount = a}) . mapping _Nat;
+
+-- | Indicates if the cloud directory limit has been reached.
+dlCloudOnlyDirectoriesLimitReached :: Lens' DirectoryLimits (Maybe Bool)
+dlCloudOnlyDirectoriesLimitReached = lens _dlCloudOnlyDirectoriesLimitReached (\ s a -> s{_dlCloudOnlyDirectoriesLimitReached = a});
+
+instance FromJSON DirectoryLimits where
+        parseJSON
+          = withObject "DirectoryLimits"
+              (\ x ->
+                 DirectoryLimits' <$>
+                   (x .:? "ConnectedDirectoriesCurrentCount") <*>
+                     (x .:? "ConnectedDirectoriesLimit")
+                     <*> (x .:? "ConnectedDirectoriesLimitReached")
+                     <*> (x .:? "CloudOnlyDirectoriesLimit")
+                     <*> (x .:? "CloudOnlyDirectoriesCurrentCount")
+                     <*> (x .:? "CloudOnlyDirectoriesLimitReached"))
+
+-- | Contains information for the CreateDirectory operation when a Simple AD
+-- directory is being created.
+--
+-- /See:/ 'directoryVPCSettings' smart constructor.
+data DirectoryVPCSettings = DirectoryVPCSettings'
+    { _dvsVPCId     :: !Text
+    , _dvsSubnetIds :: ![Text]
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DirectoryVPCSettings' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dvsVPCId'
+--
+-- * 'dvsSubnetIds'
+directoryVPCSettings
+    :: Text -- ^ 'dvsVPCId'
+    -> DirectoryVPCSettings
+directoryVPCSettings pVPCId_ =
+    DirectoryVPCSettings'
+    { _dvsVPCId = pVPCId_
+    , _dvsSubnetIds = mempty
+    }
+
+-- | The identifier of the VPC to create the Simple AD directory in.
+dvsVPCId :: Lens' DirectoryVPCSettings Text
+dvsVPCId = lens _dvsVPCId (\ s a -> s{_dvsVPCId = a});
+
+-- | The identifiers of the subnets for the directory servers. The two
+-- subnets must be in different Availability Zones. AWS Directory Service
+-- creates a directory server and a DNS server in each of these subnets.
+dvsSubnetIds :: Lens' DirectoryVPCSettings [Text]
+dvsSubnetIds = lens _dvsSubnetIds (\ s a -> s{_dvsSubnetIds = a}) . _Coerce;
+
+instance ToJSON DirectoryVPCSettings where
+        toJSON DirectoryVPCSettings'{..}
+          = object
+              ["VpcId" .= _dvsVPCId, "SubnetIds" .= _dvsSubnetIds]
+
+-- | Contains information about a Simple AD directory.
+--
+-- /See:/ 'directoryVPCSettingsDescription' smart constructor.
+data DirectoryVPCSettingsDescription = DirectoryVPCSettingsDescription'
+    { _dvsdSubnetIds         :: !(Maybe [Text])
+    , _dvsdVPCId             :: !(Maybe Text)
+    , _dvsdSecurityGroupId   :: !(Maybe Text)
+    , _dvsdAvailabilityZones :: !(Maybe [Text])
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DirectoryVPCSettingsDescription' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dvsdSubnetIds'
+--
+-- * 'dvsdVPCId'
+--
+-- * 'dvsdSecurityGroupId'
+--
+-- * 'dvsdAvailabilityZones'
+directoryVPCSettingsDescription
+    :: DirectoryVPCSettingsDescription
+directoryVPCSettingsDescription =
+    DirectoryVPCSettingsDescription'
+    { _dvsdSubnetIds = Nothing
+    , _dvsdVPCId = Nothing
+    , _dvsdSecurityGroupId = Nothing
+    , _dvsdAvailabilityZones = Nothing
+    }
+
+-- | The identifiers of the subnets for the directory servers.
+dvsdSubnetIds :: Lens' DirectoryVPCSettingsDescription [Text]
+dvsdSubnetIds = lens _dvsdSubnetIds (\ s a -> s{_dvsdSubnetIds = a}) . _Default . _Coerce;
+
+-- | The identifier of the VPC that the directory is in.
+dvsdVPCId :: Lens' DirectoryVPCSettingsDescription (Maybe Text)
+dvsdVPCId = lens _dvsdVPCId (\ s a -> s{_dvsdVPCId = a});
+
+-- | The security group identifier for the directory.
+dvsdSecurityGroupId :: Lens' DirectoryVPCSettingsDescription (Maybe Text)
+dvsdSecurityGroupId = lens _dvsdSecurityGroupId (\ s a -> s{_dvsdSecurityGroupId = a});
+
+-- | The list of Availability Zones that the directory is in.
+dvsdAvailabilityZones :: Lens' DirectoryVPCSettingsDescription [Text]
+dvsdAvailabilityZones = lens _dvsdAvailabilityZones (\ s a -> s{_dvsdAvailabilityZones = a}) . _Default . _Coerce;
+
+instance FromJSON DirectoryVPCSettingsDescription
+         where
+        parseJSON
+          = withObject "DirectoryVPCSettingsDescription"
+              (\ x ->
+                 DirectoryVPCSettingsDescription' <$>
+                   (x .:? "SubnetIds" .!= mempty) <*> (x .:? "VpcId")
+                     <*> (x .:? "SecurityGroupId")
+                     <*> (x .:? "AvailabilityZones" .!= mempty))
+
+-- | Contains information about a Remote Authentication Dial In User Service
+-- (RADIUS) server.
+--
+-- /See:/ 'radiusSettings' smart constructor.
+data RadiusSettings = RadiusSettings'
+    { _rsDisplayLabel           :: !(Maybe Text)
+    , _rsRadiusServers          :: !(Maybe [Text])
+    , _rsRadiusRetries          :: !(Maybe Nat)
+    , _rsAuthenticationProtocol :: !(Maybe RadiusAuthenticationProtocol)
+    , _rsUseSameUsername        :: !(Maybe Bool)
+    , _rsSharedSecret           :: !(Maybe (Sensitive Text))
+    , _rsRadiusTimeout          :: !(Maybe Nat)
+    , _rsRadiusPort             :: !(Maybe Nat)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'RadiusSettings' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'rsDisplayLabel'
+--
+-- * 'rsRadiusServers'
+--
+-- * 'rsRadiusRetries'
+--
+-- * 'rsAuthenticationProtocol'
+--
+-- * 'rsUseSameUsername'
+--
+-- * 'rsSharedSecret'
+--
+-- * 'rsRadiusTimeout'
+--
+-- * 'rsRadiusPort'
+radiusSettings
+    :: RadiusSettings
+radiusSettings =
+    RadiusSettings'
+    { _rsDisplayLabel = Nothing
+    , _rsRadiusServers = Nothing
+    , _rsRadiusRetries = Nothing
+    , _rsAuthenticationProtocol = Nothing
+    , _rsUseSameUsername = Nothing
+    , _rsSharedSecret = Nothing
+    , _rsRadiusTimeout = Nothing
+    , _rsRadiusPort = Nothing
+    }
+
+-- | Not currently used.
+rsDisplayLabel :: Lens' RadiusSettings (Maybe Text)
+rsDisplayLabel = lens _rsDisplayLabel (\ s a -> s{_rsDisplayLabel = a});
+
+-- | An array of strings that contains the IP addresses of the RADIUS server
+-- endpoints, or the IP addresses of your RADIUS server load balancer.
+rsRadiusServers :: Lens' RadiusSettings [Text]
+rsRadiusServers = lens _rsRadiusServers (\ s a -> s{_rsRadiusServers = a}) . _Default . _Coerce;
+
+-- | The maximum number of times that communication with the RADIUS server is
+-- attempted.
+rsRadiusRetries :: Lens' RadiusSettings (Maybe Natural)
+rsRadiusRetries = lens _rsRadiusRetries (\ s a -> s{_rsRadiusRetries = a}) . mapping _Nat;
+
+-- | The protocol specified for your RADIUS endpoints.
+rsAuthenticationProtocol :: Lens' RadiusSettings (Maybe RadiusAuthenticationProtocol)
+rsAuthenticationProtocol = lens _rsAuthenticationProtocol (\ s a -> s{_rsAuthenticationProtocol = a});
+
+-- | Not currently used.
+rsUseSameUsername :: Lens' RadiusSettings (Maybe Bool)
+rsUseSameUsername = lens _rsUseSameUsername (\ s a -> s{_rsUseSameUsername = a});
+
+-- | The shared secret code that was specified when your RADIUS endpoints
+-- were created.
+rsSharedSecret :: Lens' RadiusSettings (Maybe Text)
+rsSharedSecret = lens _rsSharedSecret (\ s a -> s{_rsSharedSecret = a}) . mapping _Sensitive;
+
+-- | The amount of time, in seconds, to wait for the RADIUS server to
+-- respond.
+rsRadiusTimeout :: Lens' RadiusSettings (Maybe Natural)
+rsRadiusTimeout = lens _rsRadiusTimeout (\ s a -> s{_rsRadiusTimeout = a}) . mapping _Nat;
+
+-- | The port that your RADIUS server is using for communications. Your
+-- on-premises network must allow inbound traffic over this port from the
+-- AWS Directory Service servers.
+rsRadiusPort :: Lens' RadiusSettings (Maybe Natural)
+rsRadiusPort = lens _rsRadiusPort (\ s a -> s{_rsRadiusPort = a}) . mapping _Nat;
+
+instance FromJSON RadiusSettings where
+        parseJSON
+          = withObject "RadiusSettings"
+              (\ x ->
+                 RadiusSettings' <$>
+                   (x .:? "DisplayLabel") <*>
+                     (x .:? "RadiusServers" .!= mempty)
+                     <*> (x .:? "RadiusRetries")
+                     <*> (x .:? "AuthenticationProtocol")
+                     <*> (x .:? "UseSameUsername")
+                     <*> (x .:? "SharedSecret")
+                     <*> (x .:? "RadiusTimeout")
+                     <*> (x .:? "RadiusPort"))
+
+instance ToJSON RadiusSettings where
+        toJSON RadiusSettings'{..}
+          = object
+              ["DisplayLabel" .= _rsDisplayLabel,
+               "RadiusServers" .= _rsRadiusServers,
+               "RadiusRetries" .= _rsRadiusRetries,
+               "AuthenticationProtocol" .=
+                 _rsAuthenticationProtocol,
+               "UseSameUsername" .= _rsUseSameUsername,
+               "SharedSecret" .= _rsSharedSecret,
+               "RadiusTimeout" .= _rsRadiusTimeout,
+               "RadiusPort" .= _rsRadiusPort]
+
+-- | Describes a directory snapshot.
+--
+-- /See:/ 'snapshot' smart constructor.
+data Snapshot = Snapshot'
+    { _sDirectoryId :: !(Maybe Text)
+    , _sStatus      :: !(Maybe SnapshotStatus)
+    , _sStartTime   :: !(Maybe POSIX)
+    , _sName        :: !(Maybe Text)
+    , _sType        :: !(Maybe SnapshotType)
+    , _sSnapshotId  :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Snapshot' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sDirectoryId'
+--
+-- * 'sStatus'
+--
+-- * 'sStartTime'
+--
+-- * 'sName'
+--
+-- * 'sType'
+--
+-- * 'sSnapshotId'
+snapshot
+    :: Snapshot
+snapshot =
+    Snapshot'
+    { _sDirectoryId = Nothing
+    , _sStatus = Nothing
+    , _sStartTime = Nothing
+    , _sName = Nothing
+    , _sType = Nothing
+    , _sSnapshotId = Nothing
+    }
+
+-- | The directory identifier.
+sDirectoryId :: Lens' Snapshot (Maybe Text)
+sDirectoryId = lens _sDirectoryId (\ s a -> s{_sDirectoryId = a});
+
+-- | The snapshot status.
+sStatus :: Lens' Snapshot (Maybe SnapshotStatus)
+sStatus = lens _sStatus (\ s a -> s{_sStatus = a});
+
+-- | The date and time that the snapshot was taken.
+sStartTime :: Lens' Snapshot (Maybe UTCTime)
+sStartTime = lens _sStartTime (\ s a -> s{_sStartTime = a}) . mapping _Time;
+
+-- | The descriptive name of the snapshot.
+sName :: Lens' Snapshot (Maybe Text)
+sName = lens _sName (\ s a -> s{_sName = a});
+
+-- | The snapshot type.
+sType :: Lens' Snapshot (Maybe SnapshotType)
+sType = lens _sType (\ s a -> s{_sType = a});
+
+-- | The snapshot identifier.
+sSnapshotId :: Lens' Snapshot (Maybe Text)
+sSnapshotId = lens _sSnapshotId (\ s a -> s{_sSnapshotId = a});
+
+instance FromJSON Snapshot where
+        parseJSON
+          = withObject "Snapshot"
+              (\ x ->
+                 Snapshot' <$>
+                   (x .:? "DirectoryId") <*> (x .:? "Status") <*>
+                     (x .:? "StartTime")
+                     <*> (x .:? "Name")
+                     <*> (x .:? "Type")
+                     <*> (x .:? "SnapshotId"))
+
+-- | Contains manual snapshot limit information for a directory.
+--
+-- /See:/ 'snapshotLimits' smart constructor.
+data SnapshotLimits = SnapshotLimits'
+    { _slManualSnapshotsLimitReached :: !(Maybe Bool)
+    , _slManualSnapshotsCurrentCount :: !(Maybe Nat)
+    , _slManualSnapshotsLimit        :: !(Maybe Nat)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SnapshotLimits' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'slManualSnapshotsLimitReached'
+--
+-- * 'slManualSnapshotsCurrentCount'
+--
+-- * 'slManualSnapshotsLimit'
+snapshotLimits
+    :: SnapshotLimits
+snapshotLimits =
+    SnapshotLimits'
+    { _slManualSnapshotsLimitReached = Nothing
+    , _slManualSnapshotsCurrentCount = Nothing
+    , _slManualSnapshotsLimit = Nothing
+    }
+
+-- | Indicates if the manual snapshot limit has been reached.
+slManualSnapshotsLimitReached :: Lens' SnapshotLimits (Maybe Bool)
+slManualSnapshotsLimitReached = lens _slManualSnapshotsLimitReached (\ s a -> s{_slManualSnapshotsLimitReached = a});
+
+-- | The current number of manual snapshots of the directory.
+slManualSnapshotsCurrentCount :: Lens' SnapshotLimits (Maybe Natural)
+slManualSnapshotsCurrentCount = lens _slManualSnapshotsCurrentCount (\ s a -> s{_slManualSnapshotsCurrentCount = a}) . mapping _Nat;
+
+-- | The maximum number of manual snapshots allowed.
+slManualSnapshotsLimit :: Lens' SnapshotLimits (Maybe Natural)
+slManualSnapshotsLimit = lens _slManualSnapshotsLimit (\ s a -> s{_slManualSnapshotsLimit = a}) . mapping _Nat;
+
+instance FromJSON SnapshotLimits where
+        parseJSON
+          = withObject "SnapshotLimits"
+              (\ x ->
+                 SnapshotLimits' <$>
+                   (x .:? "ManualSnapshotsLimitReached") <*>
+                     (x .:? "ManualSnapshotsCurrentCount")
+                     <*> (x .:? "ManualSnapshotsLimit"))
diff --git a/gen/Network/AWS/DirectoryService/Types/Sum.hs b/gen/Network/AWS/DirectoryService/Types/Sum.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DirectoryService/Types/Sum.hs
@@ -0,0 +1,240 @@
+{-# 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.DirectoryService.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.DirectoryService.Types.Sum where
+
+import           Network.AWS.Prelude
+
+data DirectorySize
+    = Large
+    | Small
+    deriving (Eq,Ord,Read,Show,Enum,Data,Typeable,Generic)
+
+instance FromText DirectorySize where
+    parser = takeLowerText >>= \case
+        "large" -> pure Large
+        "small" -> pure Small
+        e -> fromTextError $ "Failure parsing DirectorySize from value: '" <> e
+           <> "'. Accepted values: large, small"
+
+instance ToText DirectorySize where
+    toText = \case
+        Large -> "large"
+        Small -> "small"
+
+instance Hashable     DirectorySize
+instance ToByteString DirectorySize
+instance ToQuery      DirectorySize
+instance ToHeader     DirectorySize
+
+instance ToJSON DirectorySize where
+    toJSON = toJSONText
+
+instance FromJSON DirectorySize where
+    parseJSON = parseJSONText "DirectorySize"
+
+data DirectoryStage
+    = DSActive
+    | DSCreated
+    | DSCreating
+    | DSDeleted
+    | DSDeleting
+    | DSFailed
+    | DSImpaired
+    | DSInoperable
+    | DSRequested
+    | DSRestoreFailed
+    | DSRestoring
+    deriving (Eq,Ord,Read,Show,Enum,Data,Typeable,Generic)
+
+instance FromText DirectoryStage where
+    parser = takeLowerText >>= \case
+        "active" -> pure DSActive
+        "created" -> pure DSCreated
+        "creating" -> pure DSCreating
+        "deleted" -> pure DSDeleted
+        "deleting" -> pure DSDeleting
+        "failed" -> pure DSFailed
+        "impaired" -> pure DSImpaired
+        "inoperable" -> pure DSInoperable
+        "requested" -> pure DSRequested
+        "restorefailed" -> pure DSRestoreFailed
+        "restoring" -> pure DSRestoring
+        e -> fromTextError $ "Failure parsing DirectoryStage from value: '" <> e
+           <> "'. Accepted values: active, created, creating, deleted, deleting, failed, impaired, inoperable, requested, restorefailed, restoring"
+
+instance ToText DirectoryStage where
+    toText = \case
+        DSActive -> "active"
+        DSCreated -> "created"
+        DSCreating -> "creating"
+        DSDeleted -> "deleted"
+        DSDeleting -> "deleting"
+        DSFailed -> "failed"
+        DSImpaired -> "impaired"
+        DSInoperable -> "inoperable"
+        DSRequested -> "requested"
+        DSRestoreFailed -> "restorefailed"
+        DSRestoring -> "restoring"
+
+instance Hashable     DirectoryStage
+instance ToByteString DirectoryStage
+instance ToQuery      DirectoryStage
+instance ToHeader     DirectoryStage
+
+instance FromJSON DirectoryStage where
+    parseJSON = parseJSONText "DirectoryStage"
+
+data DirectoryType
+    = ADConnector
+    | SimpleAD
+    deriving (Eq,Ord,Read,Show,Enum,Data,Typeable,Generic)
+
+instance FromText DirectoryType where
+    parser = takeLowerText >>= \case
+        "adconnector" -> pure ADConnector
+        "simplead" -> pure SimpleAD
+        e -> fromTextError $ "Failure parsing DirectoryType from value: '" <> e
+           <> "'. Accepted values: adconnector, simplead"
+
+instance ToText DirectoryType where
+    toText = \case
+        ADConnector -> "adconnector"
+        SimpleAD -> "simplead"
+
+instance Hashable     DirectoryType
+instance ToByteString DirectoryType
+instance ToQuery      DirectoryType
+instance ToHeader     DirectoryType
+
+instance FromJSON DirectoryType where
+    parseJSON = parseJSONText "DirectoryType"
+
+data RadiusAuthenticationProtocol
+    = Chap
+    | MsCHAPV1
+    | MsCHAPV2
+    | Pap
+    deriving (Eq,Ord,Read,Show,Enum,Data,Typeable,Generic)
+
+instance FromText RadiusAuthenticationProtocol where
+    parser = takeLowerText >>= \case
+        "chap" -> pure Chap
+        "ms-chapv1" -> pure MsCHAPV1
+        "ms-chapv2" -> pure MsCHAPV2
+        "pap" -> pure Pap
+        e -> fromTextError $ "Failure parsing RadiusAuthenticationProtocol from value: '" <> e
+           <> "'. Accepted values: chap, ms-chapv1, ms-chapv2, pap"
+
+instance ToText RadiusAuthenticationProtocol where
+    toText = \case
+        Chap -> "chap"
+        MsCHAPV1 -> "ms-chapv1"
+        MsCHAPV2 -> "ms-chapv2"
+        Pap -> "pap"
+
+instance Hashable     RadiusAuthenticationProtocol
+instance ToByteString RadiusAuthenticationProtocol
+instance ToQuery      RadiusAuthenticationProtocol
+instance ToHeader     RadiusAuthenticationProtocol
+
+instance ToJSON RadiusAuthenticationProtocol where
+    toJSON = toJSONText
+
+instance FromJSON RadiusAuthenticationProtocol where
+    parseJSON = parseJSONText "RadiusAuthenticationProtocol"
+
+data RadiusStatus
+    = Completed
+    | Creating
+    | Failed
+    deriving (Eq,Ord,Read,Show,Enum,Data,Typeable,Generic)
+
+instance FromText RadiusStatus where
+    parser = takeLowerText >>= \case
+        "completed" -> pure Completed
+        "creating" -> pure Creating
+        "failed" -> pure Failed
+        e -> fromTextError $ "Failure parsing RadiusStatus from value: '" <> e
+           <> "'. Accepted values: completed, creating, failed"
+
+instance ToText RadiusStatus where
+    toText = \case
+        Completed -> "completed"
+        Creating -> "creating"
+        Failed -> "failed"
+
+instance Hashable     RadiusStatus
+instance ToByteString RadiusStatus
+instance ToQuery      RadiusStatus
+instance ToHeader     RadiusStatus
+
+instance FromJSON RadiusStatus where
+    parseJSON = parseJSONText "RadiusStatus"
+
+data SnapshotStatus
+    = SSCompleted
+    | SSCreating
+    | SSFailed
+    deriving (Eq,Ord,Read,Show,Enum,Data,Typeable,Generic)
+
+instance FromText SnapshotStatus where
+    parser = takeLowerText >>= \case
+        "completed" -> pure SSCompleted
+        "creating" -> pure SSCreating
+        "failed" -> pure SSFailed
+        e -> fromTextError $ "Failure parsing SnapshotStatus from value: '" <> e
+           <> "'. Accepted values: completed, creating, failed"
+
+instance ToText SnapshotStatus where
+    toText = \case
+        SSCompleted -> "completed"
+        SSCreating -> "creating"
+        SSFailed -> "failed"
+
+instance Hashable     SnapshotStatus
+instance ToByteString SnapshotStatus
+instance ToQuery      SnapshotStatus
+instance ToHeader     SnapshotStatus
+
+instance FromJSON SnapshotStatus where
+    parseJSON = parseJSONText "SnapshotStatus"
+
+data SnapshotType
+    = Auto
+    | Manual
+    deriving (Eq,Ord,Read,Show,Enum,Data,Typeable,Generic)
+
+instance FromText SnapshotType where
+    parser = takeLowerText >>= \case
+        "auto" -> pure Auto
+        "manual" -> pure Manual
+        e -> fromTextError $ "Failure parsing SnapshotType from value: '" <> e
+           <> "'. Accepted values: auto, manual"
+
+instance ToText SnapshotType where
+    toText = \case
+        Auto -> "auto"
+        Manual -> "manual"
+
+instance Hashable     SnapshotType
+instance ToByteString SnapshotType
+instance ToQuery      SnapshotType
+instance ToHeader     SnapshotType
+
+instance FromJSON SnapshotType where
+    parseJSON = parseJSONText "SnapshotType"
diff --git a/gen/Network/AWS/DirectoryService/UpdateRadius.hs b/gen/Network/AWS/DirectoryService/UpdateRadius.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DirectoryService/UpdateRadius.hs
@@ -0,0 +1,135 @@
+{-# 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.DirectoryService.UpdateRadius
+-- 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)
+--
+-- Updates the Remote Authentication Dial In User Service (RADIUS) server
+-- information for an AD Connector directory.
+--
+-- /See:/ <http://docs.aws.amazon.com/directoryservice/latest/devguide/API_UpdateRadius.html AWS API Reference> for UpdateRadius.
+module Network.AWS.DirectoryService.UpdateRadius
+    (
+    -- * Creating a Request
+      updateRadius
+    , UpdateRadius
+    -- * Request Lenses
+    , urDirectoryId
+    , urRadiusSettings
+
+    -- * Destructuring the Response
+    , updateRadiusResponse
+    , UpdateRadiusResponse
+    -- * Response Lenses
+    , urrsStatus
+    ) where
+
+import           Network.AWS.DirectoryService.Types
+import           Network.AWS.DirectoryService.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | Contains the inputs for the UpdateRadius operation.
+--
+-- /See:/ 'updateRadius' smart constructor.
+data UpdateRadius = UpdateRadius'
+    { _urDirectoryId    :: !Text
+    , _urRadiusSettings :: !RadiusSettings
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'UpdateRadius' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'urDirectoryId'
+--
+-- * 'urRadiusSettings'
+updateRadius
+    :: Text -- ^ 'urDirectoryId'
+    -> RadiusSettings -- ^ 'urRadiusSettings'
+    -> UpdateRadius
+updateRadius pDirectoryId_ pRadiusSettings_ =
+    UpdateRadius'
+    { _urDirectoryId = pDirectoryId_
+    , _urRadiusSettings = pRadiusSettings_
+    }
+
+-- | The identifier of the directory to update the RADIUS server information
+-- for.
+urDirectoryId :: Lens' UpdateRadius Text
+urDirectoryId = lens _urDirectoryId (\ s a -> s{_urDirectoryId = a});
+
+-- | A RadiusSettings object that contains information about the RADIUS
+-- server.
+urRadiusSettings :: Lens' UpdateRadius RadiusSettings
+urRadiusSettings = lens _urRadiusSettings (\ s a -> s{_urRadiusSettings = a});
+
+instance AWSRequest UpdateRadius where
+        type Sv UpdateRadius = DirectoryService
+        type Rs UpdateRadius = UpdateRadiusResponse
+        request = postJSON
+        response
+          = receiveEmpty
+              (\ s h x ->
+                 UpdateRadiusResponse' <$> (pure (fromEnum s)))
+
+instance ToHeaders UpdateRadius where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DirectoryService_20150416.UpdateRadius" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON UpdateRadius where
+        toJSON UpdateRadius'{..}
+          = object
+              ["DirectoryId" .= _urDirectoryId,
+               "RadiusSettings" .= _urRadiusSettings]
+
+instance ToPath UpdateRadius where
+        toPath = const "/"
+
+instance ToQuery UpdateRadius where
+        toQuery = const mempty
+
+-- | Contains the results of the UpdateRadius operation.
+--
+-- /See:/ 'updateRadiusResponse' smart constructor.
+newtype UpdateRadiusResponse = UpdateRadiusResponse'
+    { _urrsStatus :: Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'UpdateRadiusResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'urrsStatus'
+updateRadiusResponse
+    :: Int -- ^ 'urrsStatus'
+    -> UpdateRadiusResponse
+updateRadiusResponse pStatus_ =
+    UpdateRadiusResponse'
+    { _urrsStatus = pStatus_
+    }
+
+-- | The response status code.
+urrsStatus :: Lens' UpdateRadiusResponse Int
+urrsStatus = lens _urrsStatus (\ s a -> s{_urrsStatus = a});
diff --git a/gen/Network/AWS/DirectoryService/Waiters.hs b/gen/Network/AWS/DirectoryService/Waiters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DirectoryService/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.DirectoryService.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.DirectoryService.Waiters where
+
+import           Network.AWS.DirectoryService.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.DirectoryService
+import Test.AWS.DirectoryService.Internal
+
+main :: IO ()
+main = defaultMain $ testGroup "DirectoryService"
+    [ testGroup "tests"    tests
+    , testGroup "fixtures" fixtures
+    ]
diff --git a/test/Test/AWS/DirectoryService.hs b/test/Test/AWS/DirectoryService.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/AWS/DirectoryService.hs
@@ -0,0 +1,26 @@
+{-# LANGUAGE OverloadedStrings #-}
+
+-- Module      : Test.AWS.DirectoryService
+-- 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.DirectoryService
+    ( tests
+    , fixtures
+    ) where
+
+import           Network.AWS.DirectoryService
+import           Test.AWS.Gen.DirectoryService
+import           Test.Tasty
+
+tests :: [TestTree]
+tests = []
+
+fixtures :: [TestTree]
+fixtures = []
diff --git a/test/Test/AWS/DirectoryService/Internal.hs b/test/Test/AWS/DirectoryService/Internal.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/AWS/DirectoryService/Internal.hs
@@ -0,0 +1,16 @@
+{-# LANGUAGE OverloadedStrings #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Test.AWS.DirectoryService.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.DirectoryService.Internal where
+
+import Test.AWS.Prelude
diff --git a/test/Test/AWS/Gen/DirectoryService.hs b/test/Test/AWS/Gen/DirectoryService.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/AWS/Gen/DirectoryService.hs
@@ -0,0 +1,328 @@
+{-# 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.DirectoryService
+-- 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.DirectoryService where
+
+import Data.Proxy
+import Test.AWS.Fixture
+import Test.AWS.Prelude
+import Test.Tasty
+import Network.AWS.DirectoryService
+import Test.AWS.DirectoryService.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"
+--         [ testGetSnapshotLimits $
+--             getSnapshotLimits
+--
+--         , testConnectDirectory $
+--             connectDirectory
+--
+--         , testDescribeDirectories $
+--             describeDirectories
+--
+--         , testCreateAlias $
+--             createAlias
+--
+--         , testCreateDirectory $
+--             createDirectory
+--
+--         , testEnableSSO $
+--             enableSSO
+--
+--         , testEnableRadius $
+--             enableRadius
+--
+--         , testDisableRadius $
+--             disableRadius
+--
+--         , testDescribeSnapshots $
+--             describeSnapshots
+--
+--         , testRestoreFromSnapshot $
+--             restoreFromSnapshot
+--
+--         , testDeleteSnapshot $
+--             deleteSnapshot
+--
+--         , testCreateSnapshot $
+--             createSnapshot
+--
+--         , testDeleteDirectory $
+--             deleteDirectory
+--
+--         , testDisableSSO $
+--             disableSSO
+--
+--         , testCreateComputer $
+--             createComputer
+--
+--         , testGetDirectoryLimits $
+--             getDirectoryLimits
+--
+--         , testUpdateRadius $
+--             updateRadius
+--
+--           ]
+
+--     , testGroup "response"
+--         [ testGetSnapshotLimitsResponse $
+--             getSnapshotLimitsResponse
+--
+--         , testConnectDirectoryResponse $
+--             connectDirectoryResponse
+--
+--         , testDescribeDirectoriesResponse $
+--             describeDirectoriesResponse
+--
+--         , testCreateAliasResponse $
+--             createAliasResponse
+--
+--         , testCreateDirectoryResponse $
+--             createDirectoryResponse
+--
+--         , testEnableSSOResponse $
+--             enableSSOResponse
+--
+--         , testEnableRadiusResponse $
+--             enableRadiusResponse
+--
+--         , testDisableRadiusResponse $
+--             disableRadiusResponse
+--
+--         , testDescribeSnapshotsResponse $
+--             describeSnapshotsResponse
+--
+--         , testRestoreFromSnapshotResponse $
+--             restoreFromSnapshotResponse
+--
+--         , testDeleteSnapshotResponse $
+--             deleteSnapshotResponse
+--
+--         , testCreateSnapshotResponse $
+--             createSnapshotResponse
+--
+--         , testDeleteDirectoryResponse $
+--             deleteDirectoryResponse
+--
+--         , testDisableSSOResponse $
+--             disableSSOResponse
+--
+--         , testCreateComputerResponse $
+--             createComputerResponse
+--
+--         , testGetDirectoryLimitsResponse $
+--             getDirectoryLimitsResponse
+--
+--         , testUpdateRadiusResponse $
+--             updateRadiusResponse
+--
+--           ]
+--     ]
+
+-- Requests
+
+testGetSnapshotLimits :: GetSnapshotLimits -> TestTree
+testGetSnapshotLimits = req
+    "GetSnapshotLimits"
+    "fixture/GetSnapshotLimits"
+
+testConnectDirectory :: ConnectDirectory -> TestTree
+testConnectDirectory = req
+    "ConnectDirectory"
+    "fixture/ConnectDirectory"
+
+testDescribeDirectories :: DescribeDirectories -> TestTree
+testDescribeDirectories = req
+    "DescribeDirectories"
+    "fixture/DescribeDirectories"
+
+testCreateAlias :: CreateAlias -> TestTree
+testCreateAlias = req
+    "CreateAlias"
+    "fixture/CreateAlias"
+
+testCreateDirectory :: CreateDirectory -> TestTree
+testCreateDirectory = req
+    "CreateDirectory"
+    "fixture/CreateDirectory"
+
+testEnableSSO :: EnableSSO -> TestTree
+testEnableSSO = req
+    "EnableSSO"
+    "fixture/EnableSSO"
+
+testEnableRadius :: EnableRadius -> TestTree
+testEnableRadius = req
+    "EnableRadius"
+    "fixture/EnableRadius"
+
+testDisableRadius :: DisableRadius -> TestTree
+testDisableRadius = req
+    "DisableRadius"
+    "fixture/DisableRadius"
+
+testDescribeSnapshots :: DescribeSnapshots -> TestTree
+testDescribeSnapshots = req
+    "DescribeSnapshots"
+    "fixture/DescribeSnapshots"
+
+testRestoreFromSnapshot :: RestoreFromSnapshot -> TestTree
+testRestoreFromSnapshot = req
+    "RestoreFromSnapshot"
+    "fixture/RestoreFromSnapshot"
+
+testDeleteSnapshot :: DeleteSnapshot -> TestTree
+testDeleteSnapshot = req
+    "DeleteSnapshot"
+    "fixture/DeleteSnapshot"
+
+testCreateSnapshot :: CreateSnapshot -> TestTree
+testCreateSnapshot = req
+    "CreateSnapshot"
+    "fixture/CreateSnapshot"
+
+testDeleteDirectory :: DeleteDirectory -> TestTree
+testDeleteDirectory = req
+    "DeleteDirectory"
+    "fixture/DeleteDirectory"
+
+testDisableSSO :: DisableSSO -> TestTree
+testDisableSSO = req
+    "DisableSSO"
+    "fixture/DisableSSO"
+
+testCreateComputer :: CreateComputer -> TestTree
+testCreateComputer = req
+    "CreateComputer"
+    "fixture/CreateComputer"
+
+testGetDirectoryLimits :: GetDirectoryLimits -> TestTree
+testGetDirectoryLimits = req
+    "GetDirectoryLimits"
+    "fixture/GetDirectoryLimits"
+
+testUpdateRadius :: UpdateRadius -> TestTree
+testUpdateRadius = req
+    "UpdateRadius"
+    "fixture/UpdateRadius"
+
+-- Responses
+
+testGetSnapshotLimitsResponse :: GetSnapshotLimitsResponse -> TestTree
+testGetSnapshotLimitsResponse = res
+    "GetSnapshotLimitsResponse"
+    "fixture/GetSnapshotLimitsResponse"
+    (Proxy :: Proxy GetSnapshotLimits)
+
+testConnectDirectoryResponse :: ConnectDirectoryResponse -> TestTree
+testConnectDirectoryResponse = res
+    "ConnectDirectoryResponse"
+    "fixture/ConnectDirectoryResponse"
+    (Proxy :: Proxy ConnectDirectory)
+
+testDescribeDirectoriesResponse :: DescribeDirectoriesResponse -> TestTree
+testDescribeDirectoriesResponse = res
+    "DescribeDirectoriesResponse"
+    "fixture/DescribeDirectoriesResponse"
+    (Proxy :: Proxy DescribeDirectories)
+
+testCreateAliasResponse :: CreateAliasResponse -> TestTree
+testCreateAliasResponse = res
+    "CreateAliasResponse"
+    "fixture/CreateAliasResponse"
+    (Proxy :: Proxy CreateAlias)
+
+testCreateDirectoryResponse :: CreateDirectoryResponse -> TestTree
+testCreateDirectoryResponse = res
+    "CreateDirectoryResponse"
+    "fixture/CreateDirectoryResponse"
+    (Proxy :: Proxy CreateDirectory)
+
+testEnableSSOResponse :: EnableSSOResponse -> TestTree
+testEnableSSOResponse = res
+    "EnableSSOResponse"
+    "fixture/EnableSSOResponse"
+    (Proxy :: Proxy EnableSSO)
+
+testEnableRadiusResponse :: EnableRadiusResponse -> TestTree
+testEnableRadiusResponse = res
+    "EnableRadiusResponse"
+    "fixture/EnableRadiusResponse"
+    (Proxy :: Proxy EnableRadius)
+
+testDisableRadiusResponse :: DisableRadiusResponse -> TestTree
+testDisableRadiusResponse = res
+    "DisableRadiusResponse"
+    "fixture/DisableRadiusResponse"
+    (Proxy :: Proxy DisableRadius)
+
+testDescribeSnapshotsResponse :: DescribeSnapshotsResponse -> TestTree
+testDescribeSnapshotsResponse = res
+    "DescribeSnapshotsResponse"
+    "fixture/DescribeSnapshotsResponse"
+    (Proxy :: Proxy DescribeSnapshots)
+
+testRestoreFromSnapshotResponse :: RestoreFromSnapshotResponse -> TestTree
+testRestoreFromSnapshotResponse = res
+    "RestoreFromSnapshotResponse"
+    "fixture/RestoreFromSnapshotResponse"
+    (Proxy :: Proxy RestoreFromSnapshot)
+
+testDeleteSnapshotResponse :: DeleteSnapshotResponse -> TestTree
+testDeleteSnapshotResponse = res
+    "DeleteSnapshotResponse"
+    "fixture/DeleteSnapshotResponse"
+    (Proxy :: Proxy DeleteSnapshot)
+
+testCreateSnapshotResponse :: CreateSnapshotResponse -> TestTree
+testCreateSnapshotResponse = res
+    "CreateSnapshotResponse"
+    "fixture/CreateSnapshotResponse"
+    (Proxy :: Proxy CreateSnapshot)
+
+testDeleteDirectoryResponse :: DeleteDirectoryResponse -> TestTree
+testDeleteDirectoryResponse = res
+    "DeleteDirectoryResponse"
+    "fixture/DeleteDirectoryResponse"
+    (Proxy :: Proxy DeleteDirectory)
+
+testDisableSSOResponse :: DisableSSOResponse -> TestTree
+testDisableSSOResponse = res
+    "DisableSSOResponse"
+    "fixture/DisableSSOResponse"
+    (Proxy :: Proxy DisableSSO)
+
+testCreateComputerResponse :: CreateComputerResponse -> TestTree
+testCreateComputerResponse = res
+    "CreateComputerResponse"
+    "fixture/CreateComputerResponse"
+    (Proxy :: Proxy CreateComputer)
+
+testGetDirectoryLimitsResponse :: GetDirectoryLimitsResponse -> TestTree
+testGetDirectoryLimitsResponse = res
+    "GetDirectoryLimitsResponse"
+    "fixture/GetDirectoryLimitsResponse"
+    (Proxy :: Proxy GetDirectoryLimits)
+
+testUpdateRadiusResponse :: UpdateRadiusResponse -> TestTree
+testUpdateRadiusResponse = res
+    "UpdateRadiusResponse"
+    "fixture/UpdateRadiusResponse"
+    (Proxy :: Proxy UpdateRadius)
