diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -8,7 +8,7 @@
 
 ## Version
 
-`1.4.3`
+`1.4.4`
 
 
 ## Description
diff --git a/amazonka-ds.cabal b/amazonka-ds.cabal
--- a/amazonka-ds.cabal
+++ b/amazonka-ds.cabal
@@ -1,5 +1,5 @@
 name:                  amazonka-ds
-version:               1.4.3
+version:               1.4.4
 synopsis:              Amazon Directory Service SDK.
 homepage:              https://github.com/brendanhay/amazonka
 bug-reports:           https://github.com/brendanhay/amazonka/issues
@@ -11,7 +11,7 @@
 category:              Network, AWS, Cloud, Distributed Computing
 build-type:            Simple
 cabal-version:         >= 1.10
-extra-source-files:    README.md fixture/*.yaml fixture/*.proto
+extra-source-files:    README.md fixture/*.yaml fixture/*.proto src/.gitkeep
 description:
     AWS Directory Service
 
@@ -43,6 +43,8 @@
 
     exposed-modules:
           Network.AWS.DirectoryService
+        , Network.AWS.DirectoryService.AddIPRoutes
+        , Network.AWS.DirectoryService.AddTagsToResource
         , Network.AWS.DirectoryService.ConnectDirectory
         , Network.AWS.DirectoryService.CreateAlias
         , Network.AWS.DirectoryService.CreateComputer
@@ -67,7 +69,11 @@
         , Network.AWS.DirectoryService.EnableSSO
         , Network.AWS.DirectoryService.GetDirectoryLimits
         , Network.AWS.DirectoryService.GetSnapshotLimits
+        , Network.AWS.DirectoryService.ListIPRoutes
+        , Network.AWS.DirectoryService.ListTagsForResource
         , Network.AWS.DirectoryService.RegisterEventTopic
+        , Network.AWS.DirectoryService.RemoveIPRoutes
+        , Network.AWS.DirectoryService.RemoveTagsFromResource
         , Network.AWS.DirectoryService.RestoreFromSnapshot
         , Network.AWS.DirectoryService.Types
         , Network.AWS.DirectoryService.UpdateConditionalForwarder
@@ -80,7 +86,7 @@
         , Network.AWS.DirectoryService.Types.Sum
 
     build-depends:
-          amazonka-core == 1.4.3.*
+          amazonka-core == 1.4.4.*
         , base          >= 4.7     && < 5
 
 test-suite amazonka-ds-test
@@ -100,9 +106,9 @@
         , Test.AWS.DirectoryService.Internal
 
     build-depends:
-          amazonka-core == 1.4.3.*
-        , amazonka-test == 1.4.3.*
-        , amazonka-ds == 1.4.3.*
+          amazonka-core == 1.4.4.*
+        , amazonka-test == 1.4.4.*
+        , amazonka-ds == 1.4.4.*
         , base
         , bytestring
         , tasty
diff --git a/fixture/AddIPRoutes.yaml b/fixture/AddIPRoutes.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/AddIPRoutes.yaml
diff --git a/fixture/AddIPRoutesResponse.proto b/fixture/AddIPRoutesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/AddIPRoutesResponse.proto
diff --git a/fixture/AddTagsToResource.yaml b/fixture/AddTagsToResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/AddTagsToResource.yaml
diff --git a/fixture/AddTagsToResourceResponse.proto b/fixture/AddTagsToResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/AddTagsToResourceResponse.proto
diff --git a/fixture/ListIPRoutes.yaml b/fixture/ListIPRoutes.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListIPRoutes.yaml
diff --git a/fixture/ListIPRoutesResponse.proto b/fixture/ListIPRoutesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListIPRoutesResponse.proto
diff --git a/fixture/ListTagsForResource.yaml b/fixture/ListTagsForResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListTagsForResource.yaml
diff --git a/fixture/ListTagsForResourceResponse.proto b/fixture/ListTagsForResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListTagsForResourceResponse.proto
diff --git a/fixture/RemoveIPRoutes.yaml b/fixture/RemoveIPRoutes.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/RemoveIPRoutes.yaml
diff --git a/fixture/RemoveIPRoutesResponse.proto b/fixture/RemoveIPRoutesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/RemoveIPRoutesResponse.proto
diff --git a/fixture/RemoveTagsFromResource.yaml b/fixture/RemoveTagsFromResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/RemoveTagsFromResource.yaml
diff --git a/fixture/RemoveTagsFromResourceResponse.proto b/fixture/RemoveTagsFromResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/RemoveTagsFromResourceResponse.proto
diff --git a/gen/Network/AWS/DirectoryService.hs b/gen/Network/AWS/DirectoryService.hs
--- a/gen/Network/AWS/DirectoryService.hs
+++ b/gen/Network/AWS/DirectoryService.hs
@@ -40,6 +40,9 @@
     -- ** DirectoryLimitExceededException
     , _DirectoryLimitExceededException
 
+    -- ** IPRouteLimitExceededException
+    , _IPRouteLimitExceededException
+
     -- ** EntityDoesNotExistException
     , _EntityDoesNotExistException
 
@@ -55,6 +58,9 @@
     -- ** SnapshotLimitExceededException
     , _SnapshotLimitExceededException
 
+    -- ** TagLimitExceededException
+    , _TagLimitExceededException
+
     -- ** ClientException
     , _ClientException
 
@@ -82,6 +88,12 @@
     -- ** DescribeDirectories
     , module Network.AWS.DirectoryService.DescribeDirectories
 
+    -- ** AddIPRoutes
+    , module Network.AWS.DirectoryService.AddIPRoutes
+
+    -- ** ListTagsForResource
+    , module Network.AWS.DirectoryService.ListTagsForResource
+
     -- ** DescribeTrusts
     , module Network.AWS.DirectoryService.DescribeTrusts
 
@@ -97,6 +109,9 @@
     -- ** CreateDirectory
     , module Network.AWS.DirectoryService.CreateDirectory
 
+    -- ** RemoveTagsFromResource
+    , module Network.AWS.DirectoryService.RemoveTagsFromResource
+
     -- ** DescribeEventTopics
     , module Network.AWS.DirectoryService.DescribeEventTopics
 
@@ -112,6 +127,12 @@
     -- ** EnableRadius
     , module Network.AWS.DirectoryService.EnableRadius
 
+    -- ** ListIPRoutes
+    , module Network.AWS.DirectoryService.ListIPRoutes
+
+    -- ** AddTagsToResource
+    , module Network.AWS.DirectoryService.AddTagsToResource
+
     -- ** DisableRadius
     , module Network.AWS.DirectoryService.DisableRadius
 
@@ -121,6 +142,9 @@
     -- ** DescribeSnapshots
     , module Network.AWS.DirectoryService.DescribeSnapshots
 
+    -- ** RemoveIPRoutes
+    , module Network.AWS.DirectoryService.RemoveIPRoutes
+
     -- ** DeleteSnapshot
     , module Network.AWS.DirectoryService.DeleteSnapshot
 
@@ -162,6 +186,9 @@
     -- ** DirectoryType
     , DirectoryType (..)
 
+    -- ** IPRouteStatusMsg
+    , IPRouteStatusMsg (..)
+
     -- ** RadiusAuthenticationProtocol
     , RadiusAuthenticationProtocol (..)
 
@@ -285,6 +312,22 @@
     , etTopicARN
     , etCreatedDateTime
 
+    -- ** IPRoute
+    , IPRoute
+    , ipRoute
+    , irCIdRIP
+    , irDescription
+
+    -- ** IPRouteInfo
+    , IPRouteInfo
+    , ipRouteInfo
+    , iriDirectoryId
+    , iriIPRouteStatusReason
+    , iriAddedDateTime
+    , iriCIdRIP
+    , iriIPRouteStatusMsg
+    , iriDescription
+
     -- ** RadiusSettings
     , RadiusSettings
     , radiusSettings
@@ -314,6 +357,12 @@
     , slManualSnapshotsCurrentCount
     , slManualSnapshotsLimit
 
+    -- ** Tag
+    , Tag
+    , tag
+    , tagKey
+    , tagValue
+
     -- ** Trust
     , Trust
     , trust
@@ -329,6 +378,8 @@
     , tCreatedDateTime
     ) where
 
+import           Network.AWS.DirectoryService.AddIPRoutes
+import           Network.AWS.DirectoryService.AddTagsToResource
 import           Network.AWS.DirectoryService.ConnectDirectory
 import           Network.AWS.DirectoryService.CreateAlias
 import           Network.AWS.DirectoryService.CreateComputer
@@ -353,7 +404,11 @@
 import           Network.AWS.DirectoryService.EnableSSO
 import           Network.AWS.DirectoryService.GetDirectoryLimits
 import           Network.AWS.DirectoryService.GetSnapshotLimits
+import           Network.AWS.DirectoryService.ListIPRoutes
+import           Network.AWS.DirectoryService.ListTagsForResource
 import           Network.AWS.DirectoryService.RegisterEventTopic
+import           Network.AWS.DirectoryService.RemoveIPRoutes
+import           Network.AWS.DirectoryService.RemoveTagsFromResource
 import           Network.AWS.DirectoryService.RestoreFromSnapshot
 import           Network.AWS.DirectoryService.Types
 import           Network.AWS.DirectoryService.UpdateConditionalForwarder
diff --git a/gen/Network/AWS/DirectoryService/AddIPRoutes.hs b/gen/Network/AWS/DirectoryService/AddIPRoutes.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DirectoryService/AddIPRoutes.hs
@@ -0,0 +1,185 @@
+{-# 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.AddIPRoutes
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- If the DNS server for your on-premises domain uses a publicly addressable IP address, you must add a CIDR address block to correctly route traffic to and from your Microsoft AD on Amazon Web Services. /AddIpRoutes/ adds this address block. You can also use /AddIpRoutes/ to facilitate routing traffic that uses public IP ranges from your Microsoft AD on AWS to a peer VPC.
+module Network.AWS.DirectoryService.AddIPRoutes
+    (
+    -- * Creating a Request
+      addIPRoutes
+    , AddIPRoutes
+    -- * Request Lenses
+    , airUpdateSecurityGroupForDirectoryControllers
+    , airDirectoryId
+    , airIPRoutes
+
+    -- * Destructuring the Response
+    , addIPRoutesResponse
+    , AddIPRoutesResponse
+    -- * Response Lenses
+    , airrsResponseStatus
+    ) where
+
+import           Network.AWS.DirectoryService.Types
+import           Network.AWS.DirectoryService.Types.Product
+import           Network.AWS.Lens
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'addIPRoutes' smart constructor.
+data AddIPRoutes = AddIPRoutes'
+    { _airUpdateSecurityGroupForDirectoryControllers :: !(Maybe Bool)
+    , _airDirectoryId                                :: !Text
+    , _airIPRoutes                                   :: ![IPRoute]
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'AddIPRoutes' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'airUpdateSecurityGroupForDirectoryControllers'
+--
+-- * 'airDirectoryId'
+--
+-- * 'airIPRoutes'
+addIPRoutes
+    :: Text -- ^ 'airDirectoryId'
+    -> AddIPRoutes
+addIPRoutes pDirectoryId_ =
+    AddIPRoutes'
+    { _airUpdateSecurityGroupForDirectoryControllers = Nothing
+    , _airDirectoryId = pDirectoryId_
+    , _airIPRoutes = mempty
+    }
+
+-- | If set to true, updates the inbound and outbound rules of the security group that has the description: \"AWS created security group for /directory ID/ directory controllers.\" Following are the new rules:
+--
+-- Inbound:
+--
+-- -   Type: Custom UDP Rule, Protocol: UDP, Range: 88, Source: 0.0.0.0\/0
+--
+-- -   Type: Custom UDP Rule, Protocol: UDP, Range: 123, Source: 0.0.0.0\/0
+--
+-- -   Type: Custom UDP Rule, Protocol: UDP, Range: 138, Source: 0.0.0.0\/0
+--
+-- -   Type: Custom UDP Rule, Protocol: UDP, Range: 389, Source: 0.0.0.0\/0
+--
+-- -   Type: Custom UDP Rule, Protocol: UDP, Range: 464, Source: 0.0.0.0\/0
+--
+-- -   Type: Custom UDP Rule, Protocol: UDP, Range: 445, Source: 0.0.0.0\/0
+--
+-- -   Type: Custom TCP Rule, Protocol: TCP, Range: 88, Source: 0.0.0.0\/0
+--
+-- -   Type: Custom TCP Rule, Protocol: TCP, Range: 135, Source: 0.0.0.0\/0
+--
+-- -   Type: Custom TCP Rule, Protocol: TCP, Range: 445, Source: 0.0.0.0\/0
+--
+-- -   Type: Custom TCP Rule, Protocol: TCP, Range: 464, Source: 0.0.0.0\/0
+--
+-- -   Type: Custom TCP Rule, Protocol: TCP, Range: 636, Source: 0.0.0.0\/0
+--
+-- -   Type: Custom TCP Rule, Protocol: TCP, Range: 1024-65535, Source: 0.0.0.0\/0
+--
+-- -   Type: Custom TCP Rule, Protocol: TCP, Range: 3268-33269, Source: 0.0.0.0\/0
+--
+-- -   Type: DNS (UDP), Protocol: UDP, Range: 53, Source: 0.0.0.0\/0
+--
+-- -   Type: DNS (TCP), Protocol: TCP, Range: 53, Source: 0.0.0.0\/0
+--
+-- -   Type: LDAP, Protocol: TCP, Range: 389, Source: 0.0.0.0\/0
+--
+-- -   Type: All ICMP, Protocol: All, Range: N\/A, Source: 0.0.0.0\/0
+--
+-- Outbound:
+--
+-- -   Type: All traffic, Protocol: All, Range: All, Destination: 0.0.0.0\/0
+--
+-- These security rules impact an internal network interface that is not exposed publicly.
+airUpdateSecurityGroupForDirectoryControllers :: Lens' AddIPRoutes (Maybe Bool)
+airUpdateSecurityGroupForDirectoryControllers = lens _airUpdateSecurityGroupForDirectoryControllers (\ s a -> s{_airUpdateSecurityGroupForDirectoryControllers = a});
+
+-- | Identifier (ID) of the directory to which to add the address block.
+airDirectoryId :: Lens' AddIPRoutes Text
+airDirectoryId = lens _airDirectoryId (\ s a -> s{_airDirectoryId = a});
+
+-- | IP address blocks, using CIDR format, of the traffic to route. This is often the IP address block of the DNS server used for your on-premises domain.
+airIPRoutes :: Lens' AddIPRoutes [IPRoute]
+airIPRoutes = lens _airIPRoutes (\ s a -> s{_airIPRoutes = a}) . _Coerce;
+
+instance AWSRequest AddIPRoutes where
+        type Rs AddIPRoutes = AddIPRoutesResponse
+        request = postJSON directoryService
+        response
+          = receiveEmpty
+              (\ s h x ->
+                 AddIPRoutesResponse' <$> (pure (fromEnum s)))
+
+instance Hashable AddIPRoutes
+
+instance NFData AddIPRoutes
+
+instance ToHeaders AddIPRoutes where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DirectoryService_20150416.AddIpRoutes" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON AddIPRoutes where
+        toJSON AddIPRoutes'{..}
+          = object
+              (catMaybes
+                 [("UpdateSecurityGroupForDirectoryControllers" .=)
+                    <$> _airUpdateSecurityGroupForDirectoryControllers,
+                  Just ("DirectoryId" .= _airDirectoryId),
+                  Just ("IpRoutes" .= _airIPRoutes)])
+
+instance ToPath AddIPRoutes where
+        toPath = const "/"
+
+instance ToQuery AddIPRoutes where
+        toQuery = const mempty
+
+-- | /See:/ 'addIPRoutesResponse' smart constructor.
+newtype AddIPRoutesResponse = AddIPRoutesResponse'
+    { _airrsResponseStatus :: Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'AddIPRoutesResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'airrsResponseStatus'
+addIPRoutesResponse
+    :: Int -- ^ 'airrsResponseStatus'
+    -> AddIPRoutesResponse
+addIPRoutesResponse pResponseStatus_ =
+    AddIPRoutesResponse'
+    { _airrsResponseStatus = pResponseStatus_
+    }
+
+-- | The response status code.
+airrsResponseStatus :: Lens' AddIPRoutesResponse Int
+airrsResponseStatus = lens _airrsResponseStatus (\ s a -> s{_airrsResponseStatus = a});
+
+instance NFData AddIPRoutesResponse
diff --git a/gen/Network/AWS/DirectoryService/AddTagsToResource.hs b/gen/Network/AWS/DirectoryService/AddTagsToResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DirectoryService/AddTagsToResource.hs
@@ -0,0 +1,132 @@
+{-# 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.AddTagsToResource
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Adds or overwrites one or more tags for the specified Amazon Directory Services directory. Each directory can have a maximum of 10 tags. Each tag consists of a key and optional value. Tag keys must be unique to each resource.
+module Network.AWS.DirectoryService.AddTagsToResource
+    (
+    -- * Creating a Request
+      addTagsToResource
+    , AddTagsToResource
+    -- * Request Lenses
+    , attrResourceId
+    , attrTags
+
+    -- * Destructuring the Response
+    , addTagsToResourceResponse
+    , AddTagsToResourceResponse
+    -- * Response Lenses
+    , attrrsResponseStatus
+    ) where
+
+import           Network.AWS.DirectoryService.Types
+import           Network.AWS.DirectoryService.Types.Product
+import           Network.AWS.Lens
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'addTagsToResource' smart constructor.
+data AddTagsToResource = AddTagsToResource'
+    { _attrResourceId :: !Text
+    , _attrTags       :: ![Tag]
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'AddTagsToResource' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'attrResourceId'
+--
+-- * 'attrTags'
+addTagsToResource
+    :: Text -- ^ 'attrResourceId'
+    -> AddTagsToResource
+addTagsToResource pResourceId_ =
+    AddTagsToResource'
+    { _attrResourceId = pResourceId_
+    , _attrTags = mempty
+    }
+
+-- | Identifier (ID) for the directory to which to add the tag.
+attrResourceId :: Lens' AddTagsToResource Text
+attrResourceId = lens _attrResourceId (\ s a -> s{_attrResourceId = a});
+
+-- | The tags to be assigned to the Amazon Directory Services directory.
+attrTags :: Lens' AddTagsToResource [Tag]
+attrTags = lens _attrTags (\ s a -> s{_attrTags = a}) . _Coerce;
+
+instance AWSRequest AddTagsToResource where
+        type Rs AddTagsToResource = AddTagsToResourceResponse
+        request = postJSON directoryService
+        response
+          = receiveEmpty
+              (\ s h x ->
+                 AddTagsToResourceResponse' <$> (pure (fromEnum s)))
+
+instance Hashable AddTagsToResource
+
+instance NFData AddTagsToResource
+
+instance ToHeaders AddTagsToResource where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DirectoryService_20150416.AddTagsToResource" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON AddTagsToResource where
+        toJSON AddTagsToResource'{..}
+          = object
+              (catMaybes
+                 [Just ("ResourceId" .= _attrResourceId),
+                  Just ("Tags" .= _attrTags)])
+
+instance ToPath AddTagsToResource where
+        toPath = const "/"
+
+instance ToQuery AddTagsToResource where
+        toQuery = const mempty
+
+-- | /See:/ 'addTagsToResourceResponse' smart constructor.
+newtype AddTagsToResourceResponse = AddTagsToResourceResponse'
+    { _attrrsResponseStatus :: Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'AddTagsToResourceResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'attrrsResponseStatus'
+addTagsToResourceResponse
+    :: Int -- ^ 'attrrsResponseStatus'
+    -> AddTagsToResourceResponse
+addTagsToResourceResponse pResponseStatus_ =
+    AddTagsToResourceResponse'
+    { _attrrsResponseStatus = pResponseStatus_
+    }
+
+-- | The response status code.
+attrrsResponseStatus :: Lens' AddTagsToResourceResponse Int
+attrrsResponseStatus = lens _attrrsResponseStatus (\ s a -> s{_attrrsResponseStatus = a});
+
+instance NFData AddTagsToResourceResponse
diff --git a/gen/Network/AWS/DirectoryService/CreateAlias.hs b/gen/Network/AWS/DirectoryService/CreateAlias.hs
--- a/gen/Network/AWS/DirectoryService/CreateAlias.hs
+++ b/gen/Network/AWS/DirectoryService/CreateAlias.hs
@@ -18,7 +18,7 @@
 -- 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:\/\/&#x3C;alias&#x3E;.awsapps.com'.
+-- 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.
 module Network.AWS.DirectoryService.CreateAlias
diff --git a/gen/Network/AWS/DirectoryService/CreateConditionalForwarder.hs b/gen/Network/AWS/DirectoryService/CreateConditionalForwarder.hs
--- a/gen/Network/AWS/DirectoryService/CreateConditionalForwarder.hs
+++ b/gen/Network/AWS/DirectoryService/CreateConditionalForwarder.hs
@@ -122,7 +122,9 @@
 instance ToQuery CreateConditionalForwarder where
         toQuery = const mempty
 
--- | /See:/ 'createConditionalForwarderResponse' smart constructor.
+-- | The result of a CreateConditinalForwarder request.
+--
+-- /See:/ 'createConditionalForwarderResponse' smart constructor.
 newtype CreateConditionalForwarderResponse = CreateConditionalForwarderResponse'
     { _ccfrsResponseStatus :: Int
     } deriving (Eq,Read,Show,Data,Typeable,Generic)
diff --git a/gen/Network/AWS/DirectoryService/CreateMicrosoftAD.hs b/gen/Network/AWS/DirectoryService/CreateMicrosoftAD.hs
--- a/gen/Network/AWS/DirectoryService/CreateMicrosoftAD.hs
+++ b/gen/Network/AWS/DirectoryService/CreateMicrosoftAD.hs
@@ -143,7 +143,9 @@
 instance ToQuery CreateMicrosoftAD where
         toQuery = const mempty
 
--- | /See:/ 'createMicrosoftADResponse' smart constructor.
+-- | Result of a CreateMicrosoftAD request.
+--
+-- /See:/ 'createMicrosoftADResponse' smart constructor.
 data CreateMicrosoftADResponse = CreateMicrosoftADResponse'
     { _cmadrsDirectoryId    :: !(Maybe Text)
     , _cmadrsResponseStatus :: !Int
diff --git a/gen/Network/AWS/DirectoryService/CreateTrust.hs b/gen/Network/AWS/DirectoryService/CreateTrust.hs
--- a/gen/Network/AWS/DirectoryService/CreateTrust.hs
+++ b/gen/Network/AWS/DirectoryService/CreateTrust.hs
@@ -94,7 +94,7 @@
     , _ctTrustDirection = pTrustDirection_
     }
 
--- | Undocumented member.
+-- | The IP addresses of the remote DNS server associated with RemoteDomainName.
 ctConditionalForwarderIPAddrs :: Lens' CreateTrust [Text]
 ctConditionalForwarderIPAddrs = lens _ctConditionalForwarderIPAddrs (\ s a -> s{_ctConditionalForwarderIPAddrs = a}) . _Default . _Coerce;
 
@@ -159,7 +159,9 @@
 instance ToQuery CreateTrust where
         toQuery = const mempty
 
--- | /See:/ 'createTrustResponse' smart constructor.
+-- | The result of a CreateTrust request.
+--
+-- /See:/ 'createTrustResponse' smart constructor.
 data CreateTrustResponse = CreateTrustResponse'
     { _ctrsTrustId        :: !(Maybe Text)
     , _ctrsResponseStatus :: !Int
diff --git a/gen/Network/AWS/DirectoryService/DeleteConditionalForwarder.hs b/gen/Network/AWS/DirectoryService/DeleteConditionalForwarder.hs
--- a/gen/Network/AWS/DirectoryService/DeleteConditionalForwarder.hs
+++ b/gen/Network/AWS/DirectoryService/DeleteConditionalForwarder.hs
@@ -42,7 +42,9 @@
 import           Network.AWS.Request
 import           Network.AWS.Response
 
--- | /See:/ 'deleteConditionalForwarder' smart constructor.
+-- | Deletes a conditional forwarder.
+--
+-- /See:/ 'deleteConditionalForwarder' smart constructor.
 data DeleteConditionalForwarder = DeleteConditionalForwarder'
     { _delDirectoryId      :: !Text
     , _delRemoteDomainName :: !Text
@@ -110,7 +112,9 @@
 instance ToQuery DeleteConditionalForwarder where
         toQuery = const mempty
 
--- | /See:/ 'deleteConditionalForwarderResponse' smart constructor.
+-- | The result of a DeleteConditionalForwarder request.
+--
+-- /See:/ 'deleteConditionalForwarderResponse' smart constructor.
 newtype DeleteConditionalForwarderResponse = DeleteConditionalForwarderResponse'
     { _drsResponseStatus :: Int
     } deriving (Eq,Read,Show,Data,Typeable,Generic)
diff --git a/gen/Network/AWS/DirectoryService/DeleteTrust.hs b/gen/Network/AWS/DirectoryService/DeleteTrust.hs
--- a/gen/Network/AWS/DirectoryService/DeleteTrust.hs
+++ b/gen/Network/AWS/DirectoryService/DeleteTrust.hs
@@ -67,7 +67,7 @@
     , _dtTrustId = pTrustId_
     }
 
--- | Undocumented member.
+-- | Delete a conditional forwarder as part of a DeleteTrustRequest.
 dtDeleteAssociatedConditionalForwarder :: Lens' DeleteTrust (Maybe Bool)
 dtDeleteAssociatedConditionalForwarder = lens _dtDeleteAssociatedConditionalForwarder (\ s a -> s{_dtDeleteAssociatedConditionalForwarder = a});
 
@@ -112,7 +112,9 @@
 instance ToQuery DeleteTrust where
         toQuery = const mempty
 
--- | /See:/ 'deleteTrustResponse' smart constructor.
+-- | The result of a DeleteTrust request.
+--
+-- /See:/ 'deleteTrustResponse' smart constructor.
 data DeleteTrustResponse = DeleteTrustResponse'
     { _dttrsTrustId        :: !(Maybe Text)
     , _dttrsResponseStatus :: !Int
diff --git a/gen/Network/AWS/DirectoryService/DeregisterEventTopic.hs b/gen/Network/AWS/DirectoryService/DeregisterEventTopic.hs
--- a/gen/Network/AWS/DirectoryService/DeregisterEventTopic.hs
+++ b/gen/Network/AWS/DirectoryService/DeregisterEventTopic.hs
@@ -112,7 +112,9 @@
 instance ToQuery DeregisterEventTopic where
         toQuery = const mempty
 
--- | /See:/ 'deregisterEventTopicResponse' smart constructor.
+-- | The result of a DeregisterEventTopic request.
+--
+-- /See:/ 'deregisterEventTopicResponse' smart constructor.
 newtype DeregisterEventTopicResponse = DeregisterEventTopicResponse'
     { _derrsResponseStatus :: Int
     } deriving (Eq,Read,Show,Data,Typeable,Generic)
diff --git a/gen/Network/AWS/DirectoryService/DescribeConditionalForwarders.hs b/gen/Network/AWS/DirectoryService/DescribeConditionalForwarders.hs
--- a/gen/Network/AWS/DirectoryService/DescribeConditionalForwarders.hs
+++ b/gen/Network/AWS/DirectoryService/DescribeConditionalForwarders.hs
@@ -45,7 +45,9 @@
 import           Network.AWS.Request
 import           Network.AWS.Response
 
--- | /See:/ 'describeConditionalForwarders' smart constructor.
+-- | Describes a conditional forwarder.
+--
+-- /See:/ 'describeConditionalForwarders' smart constructor.
 data DescribeConditionalForwarders = DescribeConditionalForwarders'
     { _dcfRemoteDomainNames :: !(Maybe [Text])
     , _dcfDirectoryId       :: !Text
@@ -115,7 +117,9 @@
 instance ToQuery DescribeConditionalForwarders where
         toQuery = const mempty
 
--- | /See:/ 'describeConditionalForwardersResponse' smart constructor.
+-- | The result of a DescribeConditionalForwarder request.
+--
+-- /See:/ 'describeConditionalForwardersResponse' smart constructor.
 data DescribeConditionalForwardersResponse = DescribeConditionalForwardersResponse'
     { _dcfrsConditionalForwarders :: !(Maybe [ConditionalForwarder])
     , _dcfrsResponseStatus        :: !Int
diff --git a/gen/Network/AWS/DirectoryService/DescribeEventTopics.hs b/gen/Network/AWS/DirectoryService/DescribeEventTopics.hs
--- a/gen/Network/AWS/DirectoryService/DescribeEventTopics.hs
+++ b/gen/Network/AWS/DirectoryService/DescribeEventTopics.hs
@@ -45,7 +45,9 @@
 import           Network.AWS.Request
 import           Network.AWS.Response
 
--- | /See:/ 'describeEventTopics' smart constructor.
+-- | Describes event topics.
+--
+-- /See:/ 'describeEventTopics' smart constructor.
 data DescribeEventTopics = DescribeEventTopics'
     { _dDirectoryId :: !(Maybe Text)
     , _dTopicNames  :: !(Maybe [Text])
@@ -114,7 +116,9 @@
 instance ToQuery DescribeEventTopics where
         toQuery = const mempty
 
--- | /See:/ 'describeEventTopicsResponse' smart constructor.
+-- | The result of a DescribeEventTopic request.
+--
+-- /See:/ 'describeEventTopicsResponse' smart constructor.
 data DescribeEventTopicsResponse = DescribeEventTopicsResponse'
     { _detrsEventTopics    :: !(Maybe [EventTopic])
     , _detrsResponseStatus :: !Int
diff --git a/gen/Network/AWS/DirectoryService/DescribeTrusts.hs b/gen/Network/AWS/DirectoryService/DescribeTrusts.hs
--- a/gen/Network/AWS/DirectoryService/DescribeTrusts.hs
+++ b/gen/Network/AWS/DirectoryService/DescribeTrusts.hs
@@ -136,7 +136,9 @@
 instance ToQuery DescribeTrusts where
         toQuery = const mempty
 
--- | /See:/ 'describeTrustsResponse' smart constructor.
+-- | The result of a DescribeTrust request.
+--
+-- /See:/ 'describeTrustsResponse' smart constructor.
 data DescribeTrustsResponse = DescribeTrustsResponse'
     { _dtrsNextToken      :: !(Maybe Text)
     , _dtrsTrusts         :: !(Maybe [Trust])
diff --git a/gen/Network/AWS/DirectoryService/ListIPRoutes.hs b/gen/Network/AWS/DirectoryService/ListIPRoutes.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DirectoryService/ListIPRoutes.hs
@@ -0,0 +1,163 @@
+{-# 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.ListIPRoutes
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists the address blocks that you have added to a directory.
+module Network.AWS.DirectoryService.ListIPRoutes
+    (
+    -- * Creating a Request
+      listIPRoutes
+    , ListIPRoutes
+    -- * Request Lenses
+    , lirNextToken
+    , lirLimit
+    , lirDirectoryId
+
+    -- * Destructuring the Response
+    , listIPRoutesResponse
+    , ListIPRoutesResponse
+    -- * Response Lenses
+    , lirrsIPRoutesInfo
+    , lirrsNextToken
+    , lirrsResponseStatus
+    ) where
+
+import           Network.AWS.DirectoryService.Types
+import           Network.AWS.DirectoryService.Types.Product
+import           Network.AWS.Lens
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'listIPRoutes' smart constructor.
+data ListIPRoutes = ListIPRoutes'
+    { _lirNextToken   :: !(Maybe Text)
+    , _lirLimit       :: !(Maybe Nat)
+    , _lirDirectoryId :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ListIPRoutes' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'lirNextToken'
+--
+-- * 'lirLimit'
+--
+-- * 'lirDirectoryId'
+listIPRoutes
+    :: Text -- ^ 'lirDirectoryId'
+    -> ListIPRoutes
+listIPRoutes pDirectoryId_ =
+    ListIPRoutes'
+    { _lirNextToken = Nothing
+    , _lirLimit = Nothing
+    , _lirDirectoryId = pDirectoryId_
+    }
+
+-- | The /ListIpRoutes.NextToken/ value from a previous call to < ListIpRoutes>. Pass null if this is the first call.
+lirNextToken :: Lens' ListIPRoutes (Maybe Text)
+lirNextToken = lens _lirNextToken (\ s a -> s{_lirNextToken = a});
+
+-- | Maximum number of items to return. If this value is zero, the maximum number of items is specified by the limitations of the operation.
+lirLimit :: Lens' ListIPRoutes (Maybe Natural)
+lirLimit = lens _lirLimit (\ s a -> s{_lirLimit = a}) . mapping _Nat;
+
+-- | Identifier (ID) of the directory for which you want to retrieve the IP addresses.
+lirDirectoryId :: Lens' ListIPRoutes Text
+lirDirectoryId = lens _lirDirectoryId (\ s a -> s{_lirDirectoryId = a});
+
+instance AWSRequest ListIPRoutes where
+        type Rs ListIPRoutes = ListIPRoutesResponse
+        request = postJSON directoryService
+        response
+          = receiveJSON
+              (\ s h x ->
+                 ListIPRoutesResponse' <$>
+                   (x .?> "IpRoutesInfo" .!@ mempty) <*>
+                     (x .?> "NextToken")
+                     <*> (pure (fromEnum s)))
+
+instance Hashable ListIPRoutes
+
+instance NFData ListIPRoutes
+
+instance ToHeaders ListIPRoutes where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DirectoryService_20150416.ListIpRoutes" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON ListIPRoutes where
+        toJSON ListIPRoutes'{..}
+          = object
+              (catMaybes
+                 [("NextToken" .=) <$> _lirNextToken,
+                  ("Limit" .=) <$> _lirLimit,
+                  Just ("DirectoryId" .= _lirDirectoryId)])
+
+instance ToPath ListIPRoutes where
+        toPath = const "/"
+
+instance ToQuery ListIPRoutes where
+        toQuery = const mempty
+
+-- | /See:/ 'listIPRoutesResponse' smart constructor.
+data ListIPRoutesResponse = ListIPRoutesResponse'
+    { _lirrsIPRoutesInfo   :: !(Maybe [IPRouteInfo])
+    , _lirrsNextToken      :: !(Maybe Text)
+    , _lirrsResponseStatus :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ListIPRoutesResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'lirrsIPRoutesInfo'
+--
+-- * 'lirrsNextToken'
+--
+-- * 'lirrsResponseStatus'
+listIPRoutesResponse
+    :: Int -- ^ 'lirrsResponseStatus'
+    -> ListIPRoutesResponse
+listIPRoutesResponse pResponseStatus_ =
+    ListIPRoutesResponse'
+    { _lirrsIPRoutesInfo = Nothing
+    , _lirrsNextToken = Nothing
+    , _lirrsResponseStatus = pResponseStatus_
+    }
+
+-- | A list of < IpRoute>s.
+lirrsIPRoutesInfo :: Lens' ListIPRoutesResponse [IPRouteInfo]
+lirrsIPRoutesInfo = lens _lirrsIPRoutesInfo (\ s a -> s{_lirrsIPRoutesInfo = a}) . _Default . _Coerce;
+
+-- | If not null, more results are available. Pass this value for the /NextToken/ parameter in a subsequent call to < ListIpRoutes> to retrieve the next set of items.
+lirrsNextToken :: Lens' ListIPRoutesResponse (Maybe Text)
+lirrsNextToken = lens _lirrsNextToken (\ s a -> s{_lirrsNextToken = a});
+
+-- | The response status code.
+lirrsResponseStatus :: Lens' ListIPRoutesResponse Int
+lirrsResponseStatus = lens _lirrsResponseStatus (\ s a -> s{_lirrsResponseStatus = a});
+
+instance NFData ListIPRoutesResponse
diff --git a/gen/Network/AWS/DirectoryService/ListTagsForResource.hs b/gen/Network/AWS/DirectoryService/ListTagsForResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DirectoryService/ListTagsForResource.hs
@@ -0,0 +1,163 @@
+{-# 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.ListTagsForResource
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists all tags on an Amazon Directory Services directory.
+module Network.AWS.DirectoryService.ListTagsForResource
+    (
+    -- * Creating a Request
+      listTagsForResource
+    , ListTagsForResource
+    -- * Request Lenses
+    , ltfrNextToken
+    , ltfrLimit
+    , ltfrResourceId
+
+    -- * Destructuring the Response
+    , listTagsForResourceResponse
+    , ListTagsForResourceResponse
+    -- * Response Lenses
+    , ltfrrsNextToken
+    , ltfrrsTags
+    , ltfrrsResponseStatus
+    ) where
+
+import           Network.AWS.DirectoryService.Types
+import           Network.AWS.DirectoryService.Types.Product
+import           Network.AWS.Lens
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'listTagsForResource' smart constructor.
+data ListTagsForResource = ListTagsForResource'
+    { _ltfrNextToken  :: !(Maybe Text)
+    , _ltfrLimit      :: !(Maybe Nat)
+    , _ltfrResourceId :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ListTagsForResource' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ltfrNextToken'
+--
+-- * 'ltfrLimit'
+--
+-- * 'ltfrResourceId'
+listTagsForResource
+    :: Text -- ^ 'ltfrResourceId'
+    -> ListTagsForResource
+listTagsForResource pResourceId_ =
+    ListTagsForResource'
+    { _ltfrNextToken = Nothing
+    , _ltfrLimit = Nothing
+    , _ltfrResourceId = pResourceId_
+    }
+
+-- | Reserved for future use.
+ltfrNextToken :: Lens' ListTagsForResource (Maybe Text)
+ltfrNextToken = lens _ltfrNextToken (\ s a -> s{_ltfrNextToken = a});
+
+-- | Reserved for future use.
+ltfrLimit :: Lens' ListTagsForResource (Maybe Natural)
+ltfrLimit = lens _ltfrLimit (\ s a -> s{_ltfrLimit = a}) . mapping _Nat;
+
+-- | Identifier (ID) of the directory for which you want to retrieve tags.
+ltfrResourceId :: Lens' ListTagsForResource Text
+ltfrResourceId = lens _ltfrResourceId (\ s a -> s{_ltfrResourceId = a});
+
+instance AWSRequest ListTagsForResource where
+        type Rs ListTagsForResource =
+             ListTagsForResourceResponse
+        request = postJSON directoryService
+        response
+          = receiveJSON
+              (\ s h x ->
+                 ListTagsForResourceResponse' <$>
+                   (x .?> "NextToken") <*> (x .?> "Tags" .!@ mempty) <*>
+                     (pure (fromEnum s)))
+
+instance Hashable ListTagsForResource
+
+instance NFData ListTagsForResource
+
+instance ToHeaders ListTagsForResource where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DirectoryService_20150416.ListTagsForResource" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON ListTagsForResource where
+        toJSON ListTagsForResource'{..}
+          = object
+              (catMaybes
+                 [("NextToken" .=) <$> _ltfrNextToken,
+                  ("Limit" .=) <$> _ltfrLimit,
+                  Just ("ResourceId" .= _ltfrResourceId)])
+
+instance ToPath ListTagsForResource where
+        toPath = const "/"
+
+instance ToQuery ListTagsForResource where
+        toQuery = const mempty
+
+-- | /See:/ 'listTagsForResourceResponse' smart constructor.
+data ListTagsForResourceResponse = ListTagsForResourceResponse'
+    { _ltfrrsNextToken      :: !(Maybe Text)
+    , _ltfrrsTags           :: !(Maybe [Tag])
+    , _ltfrrsResponseStatus :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ListTagsForResourceResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ltfrrsNextToken'
+--
+-- * 'ltfrrsTags'
+--
+-- * 'ltfrrsResponseStatus'
+listTagsForResourceResponse
+    :: Int -- ^ 'ltfrrsResponseStatus'
+    -> ListTagsForResourceResponse
+listTagsForResourceResponse pResponseStatus_ =
+    ListTagsForResourceResponse'
+    { _ltfrrsNextToken = Nothing
+    , _ltfrrsTags = Nothing
+    , _ltfrrsResponseStatus = pResponseStatus_
+    }
+
+-- | Reserved for future use.
+ltfrrsNextToken :: Lens' ListTagsForResourceResponse (Maybe Text)
+ltfrrsNextToken = lens _ltfrrsNextToken (\ s a -> s{_ltfrrsNextToken = a});
+
+-- | List of tags returned by the ListTagsForResource operation.
+ltfrrsTags :: Lens' ListTagsForResourceResponse [Tag]
+ltfrrsTags = lens _ltfrrsTags (\ s a -> s{_ltfrrsTags = a}) . _Default . _Coerce;
+
+-- | The response status code.
+ltfrrsResponseStatus :: Lens' ListTagsForResourceResponse Int
+ltfrrsResponseStatus = lens _ltfrrsResponseStatus (\ s a -> s{_ltfrrsResponseStatus = a});
+
+instance NFData ListTagsForResourceResponse
diff --git a/gen/Network/AWS/DirectoryService/RegisterEventTopic.hs b/gen/Network/AWS/DirectoryService/RegisterEventTopic.hs
--- a/gen/Network/AWS/DirectoryService/RegisterEventTopic.hs
+++ b/gen/Network/AWS/DirectoryService/RegisterEventTopic.hs
@@ -42,7 +42,9 @@
 import           Network.AWS.Request
 import           Network.AWS.Response
 
--- | /See:/ 'registerEventTopic' smart constructor.
+-- | Registers a new event topic.
+--
+-- /See:/ 'registerEventTopic' smart constructor.
 data RegisterEventTopic = RegisterEventTopic'
     { _retDirectoryId :: !Text
     , _retTopicName   :: !Text
@@ -109,7 +111,9 @@
 instance ToQuery RegisterEventTopic where
         toQuery = const mempty
 
--- | /See:/ 'registerEventTopicResponse' smart constructor.
+-- | The result of a RegisterEventTopic request.
+--
+-- /See:/ 'registerEventTopicResponse' smart constructor.
 newtype RegisterEventTopicResponse = RegisterEventTopicResponse'
     { _retrsResponseStatus :: Int
     } deriving (Eq,Read,Show,Data,Typeable,Generic)
diff --git a/gen/Network/AWS/DirectoryService/RemoveIPRoutes.hs b/gen/Network/AWS/DirectoryService/RemoveIPRoutes.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DirectoryService/RemoveIPRoutes.hs
@@ -0,0 +1,132 @@
+{-# 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.RemoveIPRoutes
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Removes IP address blocks from a directory.
+module Network.AWS.DirectoryService.RemoveIPRoutes
+    (
+    -- * Creating a Request
+      removeIPRoutes
+    , RemoveIPRoutes
+    -- * Request Lenses
+    , rirDirectoryId
+    , rirCIdRIPs
+
+    -- * Destructuring the Response
+    , removeIPRoutesResponse
+    , RemoveIPRoutesResponse
+    -- * Response Lenses
+    , rirrsResponseStatus
+    ) where
+
+import           Network.AWS.DirectoryService.Types
+import           Network.AWS.DirectoryService.Types.Product
+import           Network.AWS.Lens
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'removeIPRoutes' smart constructor.
+data RemoveIPRoutes = RemoveIPRoutes'
+    { _rirDirectoryId :: !Text
+    , _rirCIdRIPs     :: ![Text]
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'RemoveIPRoutes' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'rirDirectoryId'
+--
+-- * 'rirCIdRIPs'
+removeIPRoutes
+    :: Text -- ^ 'rirDirectoryId'
+    -> RemoveIPRoutes
+removeIPRoutes pDirectoryId_ =
+    RemoveIPRoutes'
+    { _rirDirectoryId = pDirectoryId_
+    , _rirCIdRIPs = mempty
+    }
+
+-- | Identifier (ID) of the directory from which you want to remove the IP addresses.
+rirDirectoryId :: Lens' RemoveIPRoutes Text
+rirDirectoryId = lens _rirDirectoryId (\ s a -> s{_rirDirectoryId = a});
+
+-- | IP address blocks that you want to remove.
+rirCIdRIPs :: Lens' RemoveIPRoutes [Text]
+rirCIdRIPs = lens _rirCIdRIPs (\ s a -> s{_rirCIdRIPs = a}) . _Coerce;
+
+instance AWSRequest RemoveIPRoutes where
+        type Rs RemoveIPRoutes = RemoveIPRoutesResponse
+        request = postJSON directoryService
+        response
+          = receiveEmpty
+              (\ s h x ->
+                 RemoveIPRoutesResponse' <$> (pure (fromEnum s)))
+
+instance Hashable RemoveIPRoutes
+
+instance NFData RemoveIPRoutes
+
+instance ToHeaders RemoveIPRoutes where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DirectoryService_20150416.RemoveIpRoutes" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON RemoveIPRoutes where
+        toJSON RemoveIPRoutes'{..}
+          = object
+              (catMaybes
+                 [Just ("DirectoryId" .= _rirDirectoryId),
+                  Just ("CidrIps" .= _rirCIdRIPs)])
+
+instance ToPath RemoveIPRoutes where
+        toPath = const "/"
+
+instance ToQuery RemoveIPRoutes where
+        toQuery = const mempty
+
+-- | /See:/ 'removeIPRoutesResponse' smart constructor.
+newtype RemoveIPRoutesResponse = RemoveIPRoutesResponse'
+    { _rirrsResponseStatus :: Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'RemoveIPRoutesResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'rirrsResponseStatus'
+removeIPRoutesResponse
+    :: Int -- ^ 'rirrsResponseStatus'
+    -> RemoveIPRoutesResponse
+removeIPRoutesResponse pResponseStatus_ =
+    RemoveIPRoutesResponse'
+    { _rirrsResponseStatus = pResponseStatus_
+    }
+
+-- | The response status code.
+rirrsResponseStatus :: Lens' RemoveIPRoutesResponse Int
+rirrsResponseStatus = lens _rirrsResponseStatus (\ s a -> s{_rirrsResponseStatus = a});
+
+instance NFData RemoveIPRoutesResponse
diff --git a/gen/Network/AWS/DirectoryService/RemoveTagsFromResource.hs b/gen/Network/AWS/DirectoryService/RemoveTagsFromResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DirectoryService/RemoveTagsFromResource.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.RemoveTagsFromResource
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Removes tags from an Amazon Directory Services directory.
+module Network.AWS.DirectoryService.RemoveTagsFromResource
+    (
+    -- * Creating a Request
+      removeTagsFromResource
+    , RemoveTagsFromResource
+    -- * Request Lenses
+    , rtfrResourceId
+    , rtfrTagKeys
+
+    -- * Destructuring the Response
+    , removeTagsFromResourceResponse
+    , RemoveTagsFromResourceResponse
+    -- * Response Lenses
+    , rtfrrsResponseStatus
+    ) where
+
+import           Network.AWS.DirectoryService.Types
+import           Network.AWS.DirectoryService.Types.Product
+import           Network.AWS.Lens
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | /See:/ 'removeTagsFromResource' smart constructor.
+data RemoveTagsFromResource = RemoveTagsFromResource'
+    { _rtfrResourceId :: !Text
+    , _rtfrTagKeys    :: ![Text]
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'RemoveTagsFromResource' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'rtfrResourceId'
+--
+-- * 'rtfrTagKeys'
+removeTagsFromResource
+    :: Text -- ^ 'rtfrResourceId'
+    -> RemoveTagsFromResource
+removeTagsFromResource pResourceId_ =
+    RemoveTagsFromResource'
+    { _rtfrResourceId = pResourceId_
+    , _rtfrTagKeys = mempty
+    }
+
+-- | Identifier (ID) of the directory from which to remove the tag.
+rtfrResourceId :: Lens' RemoveTagsFromResource Text
+rtfrResourceId = lens _rtfrResourceId (\ s a -> s{_rtfrResourceId = a});
+
+-- | The tag key (name) of the tag to be removed.
+rtfrTagKeys :: Lens' RemoveTagsFromResource [Text]
+rtfrTagKeys = lens _rtfrTagKeys (\ s a -> s{_rtfrTagKeys = a}) . _Coerce;
+
+instance AWSRequest RemoveTagsFromResource where
+        type Rs RemoveTagsFromResource =
+             RemoveTagsFromResourceResponse
+        request = postJSON directoryService
+        response
+          = receiveEmpty
+              (\ s h x ->
+                 RemoveTagsFromResourceResponse' <$>
+                   (pure (fromEnum s)))
+
+instance Hashable RemoveTagsFromResource
+
+instance NFData RemoveTagsFromResource
+
+instance ToHeaders RemoveTagsFromResource where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("DirectoryService_20150416.RemoveTagsFromResource"
+                       :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON RemoveTagsFromResource where
+        toJSON RemoveTagsFromResource'{..}
+          = object
+              (catMaybes
+                 [Just ("ResourceId" .= _rtfrResourceId),
+                  Just ("TagKeys" .= _rtfrTagKeys)])
+
+instance ToPath RemoveTagsFromResource where
+        toPath = const "/"
+
+instance ToQuery RemoveTagsFromResource where
+        toQuery = const mempty
+
+-- | /See:/ 'removeTagsFromResourceResponse' smart constructor.
+newtype RemoveTagsFromResourceResponse = RemoveTagsFromResourceResponse'
+    { _rtfrrsResponseStatus :: Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'RemoveTagsFromResourceResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'rtfrrsResponseStatus'
+removeTagsFromResourceResponse
+    :: Int -- ^ 'rtfrrsResponseStatus'
+    -> RemoveTagsFromResourceResponse
+removeTagsFromResourceResponse pResponseStatus_ =
+    RemoveTagsFromResourceResponse'
+    { _rtfrrsResponseStatus = pResponseStatus_
+    }
+
+-- | The response status code.
+rtfrrsResponseStatus :: Lens' RemoveTagsFromResourceResponse Int
+rtfrrsResponseStatus = lens _rtfrrsResponseStatus (\ s a -> s{_rtfrrsResponseStatus = a});
+
+instance NFData RemoveTagsFromResourceResponse
diff --git a/gen/Network/AWS/DirectoryService/Types.hs b/gen/Network/AWS/DirectoryService/Types.hs
--- a/gen/Network/AWS/DirectoryService/Types.hs
+++ b/gen/Network/AWS/DirectoryService/Types.hs
@@ -22,11 +22,13 @@
     , _UnsupportedOperationException
     , _EntityAlreadyExistsException
     , _DirectoryLimitExceededException
+    , _IPRouteLimitExceededException
     , _EntityDoesNotExistException
     , _InsufficientPermissionsException
     , _InvalidNextTokenException
     , _ServiceException
     , _SnapshotLimitExceededException
+    , _TagLimitExceededException
     , _ClientException
 
     -- * DirectorySize
@@ -38,6 +40,9 @@
     -- * DirectoryType
     , DirectoryType (..)
 
+    -- * IPRouteStatusMsg
+    , IPRouteStatusMsg (..)
+
     -- * RadiusAuthenticationProtocol
     , RadiusAuthenticationProtocol (..)
 
@@ -161,6 +166,22 @@
     , etTopicARN
     , etCreatedDateTime
 
+    -- * IPRoute
+    , IPRoute
+    , ipRoute
+    , irCIdRIP
+    , irDescription
+
+    -- * IPRouteInfo
+    , IPRouteInfo
+    , ipRouteInfo
+    , iriDirectoryId
+    , iriIPRouteStatusReason
+    , iriAddedDateTime
+    , iriCIdRIP
+    , iriIPRouteStatusMsg
+    , iriDescription
+
     -- * RadiusSettings
     , RadiusSettings
     , radiusSettings
@@ -190,6 +211,12 @@
     , slManualSnapshotsCurrentCount
     , slManualSnapshotsLimit
 
+    -- * Tag
+    , Tag
+    , tag
+    , tagKey
+    , tagValue
+
     -- * Trust
     , Trust
     , trust
@@ -275,6 +302,11 @@
 _DirectoryLimitExceededException =
     _ServiceError . hasCode "DirectoryLimitExceededException"
 
+-- | The maximum allowed number of IP addresses was exceeded. The default limit is 100 IP address blocks.
+_IPRouteLimitExceededException :: AsError a => Getting (First ServiceError) a ServiceError
+_IPRouteLimitExceededException =
+    _ServiceError . hasCode "IpRouteLimitExceededException"
+
 -- | The specified entity could not be found.
 _EntityDoesNotExistException :: AsError a => Getting (First ServiceError) a ServiceError
 _EntityDoesNotExistException =
@@ -298,6 +330,11 @@
 _SnapshotLimitExceededException :: AsError a => Getting (First ServiceError) a ServiceError
 _SnapshotLimitExceededException =
     _ServiceError . hasCode "SnapshotLimitExceededException"
+
+-- | The maximum allowed number of tags was exceeded.
+_TagLimitExceededException :: AsError a => Getting (First ServiceError) a ServiceError
+_TagLimitExceededException =
+    _ServiceError . hasCode "TagLimitExceededException"
 
 -- | A client exception has occurred.
 _ClientException :: AsError a => Getting (First ServiceError) a ServiceError
diff --git a/gen/Network/AWS/DirectoryService/Types/Product.hs b/gen/Network/AWS/DirectoryService/Types/Product.hs
--- a/gen/Network/AWS/DirectoryService/Types/Product.hs
+++ b/gen/Network/AWS/DirectoryService/Types/Product.hs
@@ -220,8 +220,11 @@
 -- | 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});
 
@@ -417,7 +420,7 @@
 ddDirectoryId :: Lens' DirectoryDescription (Maybe Text)
 ddDirectoryId = lens _ddDirectoryId (\ s a -> s{_ddDirectoryId = a});
 
--- | The access URL for the directory, such as 'http:\/\/&#x3C;alias&#x3E;.awsapps.com'. If no alias has been created for the directory, '&#x3C;alias&#x3E;' is the directory identifier, such as 'd-XXXXXXXXXX'.
+-- | The access URL for the directory, such as 'http:\/\/\<alias>.awsapps.com'. If no alias has been created for the directory, '\<alias>' is the directory identifier, such as 'd-XXXXXXXXXX'.
 ddAccessURL :: Lens' DirectoryDescription (Maybe Text)
 ddAccessURL = lens _ddAccessURL (\ s a -> s{_ddAccessURL = a});
 
@@ -783,6 +786,127 @@
 
 instance NFData EventTopic
 
+-- | IP address block. This is often the address block of the DNS server used for your on-premises domain.
+--
+-- /See:/ 'ipRoute' smart constructor.
+data IPRoute = IPRoute'
+    { _irCIdRIP      :: !(Maybe Text)
+    , _irDescription :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'IPRoute' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'irCIdRIP'
+--
+-- * 'irDescription'
+ipRoute
+    :: IPRoute
+ipRoute =
+    IPRoute'
+    { _irCIdRIP = Nothing
+    , _irDescription = Nothing
+    }
+
+-- | IP address block using CIDR format, for example 10.0.0.0\/24. This is often the address block of the DNS server used for your on-premises domain. For a single IP address use a CIDR address block with \/32. For example 10.0.0.0\/32.
+irCIdRIP :: Lens' IPRoute (Maybe Text)
+irCIdRIP = lens _irCIdRIP (\ s a -> s{_irCIdRIP = a});
+
+-- | Description of the address block.
+irDescription :: Lens' IPRoute (Maybe Text)
+irDescription = lens _irDescription (\ s a -> s{_irDescription = a});
+
+instance Hashable IPRoute
+
+instance NFData IPRoute
+
+instance ToJSON IPRoute where
+        toJSON IPRoute'{..}
+          = object
+              (catMaybes
+                 [("CidrIp" .=) <$> _irCIdRIP,
+                  ("Description" .=) <$> _irDescription])
+
+-- | Information about one or more IP address blocks.
+--
+-- /See:/ 'ipRouteInfo' smart constructor.
+data IPRouteInfo = IPRouteInfo'
+    { _iriDirectoryId         :: !(Maybe Text)
+    , _iriIPRouteStatusReason :: !(Maybe Text)
+    , _iriAddedDateTime       :: !(Maybe POSIX)
+    , _iriCIdRIP              :: !(Maybe Text)
+    , _iriIPRouteStatusMsg    :: !(Maybe IPRouteStatusMsg)
+    , _iriDescription         :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'IPRouteInfo' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'iriDirectoryId'
+--
+-- * 'iriIPRouteStatusReason'
+--
+-- * 'iriAddedDateTime'
+--
+-- * 'iriCIdRIP'
+--
+-- * 'iriIPRouteStatusMsg'
+--
+-- * 'iriDescription'
+ipRouteInfo
+    :: IPRouteInfo
+ipRouteInfo =
+    IPRouteInfo'
+    { _iriDirectoryId = Nothing
+    , _iriIPRouteStatusReason = Nothing
+    , _iriAddedDateTime = Nothing
+    , _iriCIdRIP = Nothing
+    , _iriIPRouteStatusMsg = Nothing
+    , _iriDescription = Nothing
+    }
+
+-- | Identifier (ID) of the directory associated with the IP addresses.
+iriDirectoryId :: Lens' IPRouteInfo (Maybe Text)
+iriDirectoryId = lens _iriDirectoryId (\ s a -> s{_iriDirectoryId = a});
+
+-- | The reason for the IpRouteStatusMsg.
+iriIPRouteStatusReason :: Lens' IPRouteInfo (Maybe Text)
+iriIPRouteStatusReason = lens _iriIPRouteStatusReason (\ s a -> s{_iriIPRouteStatusReason = a});
+
+-- | The date and time the address block was added to the directory.
+iriAddedDateTime :: Lens' IPRouteInfo (Maybe UTCTime)
+iriAddedDateTime = lens _iriAddedDateTime (\ s a -> s{_iriAddedDateTime = a}) . mapping _Time;
+
+-- | IP address block in the < IpRoute>.
+iriCIdRIP :: Lens' IPRouteInfo (Maybe Text)
+iriCIdRIP = lens _iriCIdRIP (\ s a -> s{_iriCIdRIP = a});
+
+-- | The status of the IP address block.
+iriIPRouteStatusMsg :: Lens' IPRouteInfo (Maybe IPRouteStatusMsg)
+iriIPRouteStatusMsg = lens _iriIPRouteStatusMsg (\ s a -> s{_iriIPRouteStatusMsg = a});
+
+-- | Description of the < IpRouteInfo>.
+iriDescription :: Lens' IPRouteInfo (Maybe Text)
+iriDescription = lens _iriDescription (\ s a -> s{_iriDescription = a});
+
+instance FromJSON IPRouteInfo where
+        parseJSON
+          = withObject "IPRouteInfo"
+              (\ x ->
+                 IPRouteInfo' <$>
+                   (x .:? "DirectoryId") <*>
+                     (x .:? "IpRouteStatusReason")
+                     <*> (x .:? "AddedDateTime")
+                     <*> (x .:? "CidrIp")
+                     <*> (x .:? "IpRouteStatusMsg")
+                     <*> (x .:? "Description"))
+
+instance Hashable IPRouteInfo
+
+instance NFData IPRouteInfo
+
 -- | Contains information about a Remote Authentication Dial In User Service (RADIUS) server.
 --
 -- /See:/ 'radiusSettings' smart constructor.
@@ -850,7 +974,7 @@
 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.
+-- | Not currently used.
 rsSharedSecret :: Lens' RadiusSettings (Maybe Text)
 rsSharedSecret = lens _rsSharedSecret (\ s a -> s{_rsSharedSecret = a}) . mapping _Sensitive;
 
@@ -1022,6 +1146,55 @@
 instance Hashable SnapshotLimits
 
 instance NFData SnapshotLimits
+
+-- | Metadata assigned to an Amazon Directory Services directory consisting of a key-value pair.
+--
+-- /See:/ 'tag' smart constructor.
+data Tag = Tag'
+    { _tagKey   :: !Text
+    , _tagValue :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Tag' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'tagKey'
+--
+-- * 'tagValue'
+tag
+    :: Text -- ^ 'tagKey'
+    -> Text -- ^ 'tagValue'
+    -> Tag
+tag pKey_ pValue_ =
+    Tag'
+    { _tagKey = pKey_
+    , _tagValue = pValue_
+    }
+
+-- | Required name of the tag. The string value can be Unicode characters and cannot be prefixed with \"aws:\". The string can contain only the set of Unicode letters, digits, white-space, \'_\', \'.\', \'\/\', \'=\', \'+\', \'-\' (Java regex: \"^([\\\\p{L}\\\\p{Z}\\\\p{N}_.:\/=+\\\\-]*)>\").
+tagKey :: Lens' Tag Text
+tagKey = lens _tagKey (\ s a -> s{_tagKey = a});
+
+-- | The optional value of the tag. The string value can be Unicode characters. The string can contain only the set of Unicode letters, digits, white-space, \'_\', \'.\', \'\/\', \'=\', \'+\', \'-\' (Java regex: \"^([\\\\p{L}\\\\p{Z}\\\\p{N}_.:\/=+\\\\-]*)>\").
+tagValue :: Lens' Tag Text
+tagValue = lens _tagValue (\ s a -> s{_tagValue = a});
+
+instance FromJSON Tag where
+        parseJSON
+          = withObject "Tag"
+              (\ x -> Tag' <$> (x .: "Key") <*> (x .: "Value"))
+
+instance Hashable Tag
+
+instance NFData Tag
+
+instance ToJSON Tag where
+        toJSON Tag'{..}
+          = object
+              (catMaybes
+                 [Just ("Key" .= _tagKey),
+                  Just ("Value" .= _tagValue)])
 
 -- | Describes a trust relationship between an Microsoft AD in the AWS cloud and an external domain.
 --
diff --git a/gen/Network/AWS/DirectoryService/Types/Sum.hs b/gen/Network/AWS/DirectoryService/Types/Sum.hs
--- a/gen/Network/AWS/DirectoryService/Types/Sum.hs
+++ b/gen/Network/AWS/DirectoryService/Types/Sum.hs
@@ -29,7 +29,7 @@
         "large" -> pure Large
         "small" -> pure Small
         e -> fromTextError $ "Failure parsing DirectorySize from value: '" <> e
-           <> "'. Accepted values: Large, Small"
+           <> "'. Accepted values: large, small"
 
 instance ToText DirectorySize where
     toText = \case
@@ -76,7 +76,7 @@
         "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"
+           <> "'. Accepted values: active, created, creating, deleted, deleting, failed, impaired, inoperable, requested, restorefailed, restoring"
 
 instance ToText DirectoryStage where
     toText = \case
@@ -113,7 +113,7 @@
         "microsoftad" -> pure MicrosoftAD
         "simplead" -> pure SimpleAD
         e -> fromTextError $ "Failure parsing DirectoryType from value: '" <> e
-           <> "'. Accepted values: ADConnector, MicrosoftAD, SimpleAD"
+           <> "'. Accepted values: adconnector, microsoftad, simplead"
 
 instance ToText DirectoryType where
     toText = \case
@@ -130,6 +130,44 @@
 instance FromJSON DirectoryType where
     parseJSON = parseJSONText "DirectoryType"
 
+data IPRouteStatusMsg
+    = AddFailed
+    | Added
+    | Adding
+    | RemoveFailed
+    | Removed
+    | Removing
+    deriving (Eq,Ord,Read,Show,Enum,Bounded,Data,Typeable,Generic)
+
+instance FromText IPRouteStatusMsg where
+    parser = takeLowerText >>= \case
+        "addfailed" -> pure AddFailed
+        "added" -> pure Added
+        "adding" -> pure Adding
+        "removefailed" -> pure RemoveFailed
+        "removed" -> pure Removed
+        "removing" -> pure Removing
+        e -> fromTextError $ "Failure parsing IPRouteStatusMsg from value: '" <> e
+           <> "'. Accepted values: addfailed, added, adding, removefailed, removed, removing"
+
+instance ToText IPRouteStatusMsg where
+    toText = \case
+        AddFailed -> "AddFailed"
+        Added -> "Added"
+        Adding -> "Adding"
+        RemoveFailed -> "RemoveFailed"
+        Removed -> "Removed"
+        Removing -> "Removing"
+
+instance Hashable     IPRouteStatusMsg
+instance NFData       IPRouteStatusMsg
+instance ToByteString IPRouteStatusMsg
+instance ToQuery      IPRouteStatusMsg
+instance ToHeader     IPRouteStatusMsg
+
+instance FromJSON IPRouteStatusMsg where
+    parseJSON = parseJSONText "IPRouteStatusMsg"
+
 data RadiusAuthenticationProtocol
     = Chap
     | MsCHAPV1
@@ -144,7 +182,7 @@
         "ms-chapv2" -> pure MsCHAPV2
         "pap" -> pure Pap
         e -> fromTextError $ "Failure parsing RadiusAuthenticationProtocol from value: '" <> e
-           <> "'. Accepted values: CHAP, MS-CHAPv1, MS-CHAPv2, PAP"
+           <> "'. Accepted values: chap, ms-chapv1, ms-chapv2, pap"
 
 instance ToText RadiusAuthenticationProtocol where
     toText = \case
@@ -177,7 +215,7 @@
         "creating" -> pure Creating
         "failed" -> pure Failed
         e -> fromTextError $ "Failure parsing RadiusStatus from value: '" <> e
-           <> "'. Accepted values: Completed, Creating, Failed"
+           <> "'. Accepted values: completed, creating, failed"
 
 instance ToText RadiusStatus where
     toText = \case
@@ -202,7 +240,7 @@
     parser = takeLowerText >>= \case
         "domain" -> pure Domain
         e -> fromTextError $ "Failure parsing ReplicationScope from value: '" <> e
-           <> "'. Accepted values: Domain"
+           <> "'. Accepted values: domain"
 
 instance ToText ReplicationScope where
     toText = \case
@@ -229,7 +267,7 @@
         "creating" -> pure SSCreating
         "failed" -> pure SSFailed
         e -> fromTextError $ "Failure parsing SnapshotStatus from value: '" <> e
-           <> "'. Accepted values: Completed, Creating, Failed"
+           <> "'. Accepted values: completed, creating, failed"
 
 instance ToText SnapshotStatus where
     toText = \case
@@ -256,7 +294,7 @@
         "auto" -> pure Auto
         "manual" -> pure Manual
         e -> fromTextError $ "Failure parsing SnapshotType from value: '" <> e
-           <> "'. Accepted values: Auto, Manual"
+           <> "'. Accepted values: auto, manual"
 
 instance ToText SnapshotType where
     toText = \case
@@ -286,7 +324,7 @@
         "registered" -> pure TRegistered
         "topic not found" -> pure TTopicNotFound
         e -> fromTextError $ "Failure parsing TopicStatus from value: '" <> e
-           <> "'. Accepted values: Deleted, Failed, Registered, Topic not found"
+           <> "'. Accepted values: deleted, failed, registered, topic not found"
 
 instance ToText TopicStatus where
     toText = \case
@@ -316,7 +354,7 @@
         "one-way: outgoing" -> pure OneWayOutgoing
         "two-way" -> pure TwoWay
         e -> fromTextError $ "Failure parsing TrustDirection from value: '" <> e
-           <> "'. Accepted values: One-Way: Incoming, One-Way: Outgoing, Two-Way"
+           <> "'. Accepted values: one-way: incoming, one-way: outgoing, two-way"
 
 instance ToText TrustDirection where
     toText = \case
@@ -358,7 +396,7 @@
         "verifyfailed" -> pure TSVerifyFailed
         "verifying" -> pure TSVerifying
         e -> fromTextError $ "Failure parsing TrustState from value: '" <> e
-           <> "'. Accepted values: Created, Creating, Deleted, Deleting, Failed, Verified, VerifyFailed, Verifying"
+           <> "'. Accepted values: created, creating, deleted, deleting, failed, verified, verifyfailed, verifying"
 
 instance ToText TrustState where
     toText = \case
@@ -388,7 +426,7 @@
     parser = takeLowerText >>= \case
         "forest" -> pure Forest
         e -> fromTextError $ "Failure parsing TrustType from value: '" <> e
-           <> "'. Accepted values: Forest"
+           <> "'. Accepted values: forest"
 
 instance ToText TrustType where
     toText = \case
diff --git a/gen/Network/AWS/DirectoryService/UpdateConditionalForwarder.hs b/gen/Network/AWS/DirectoryService/UpdateConditionalForwarder.hs
--- a/gen/Network/AWS/DirectoryService/UpdateConditionalForwarder.hs
+++ b/gen/Network/AWS/DirectoryService/UpdateConditionalForwarder.hs
@@ -43,7 +43,9 @@
 import           Network.AWS.Request
 import           Network.AWS.Response
 
--- | /See:/ 'updateConditionalForwarder' smart constructor.
+-- | Updates a conditional forwarder.
+--
+-- /See:/ 'updateConditionalForwarder' smart constructor.
 data UpdateConditionalForwarder = UpdateConditionalForwarder'
     { _ucfDirectoryId      :: !Text
     , _ucfRemoteDomainName :: !Text
@@ -120,7 +122,9 @@
 instance ToQuery UpdateConditionalForwarder where
         toQuery = const mempty
 
--- | /See:/ 'updateConditionalForwarderResponse' smart constructor.
+-- | The result of an UpdateConditionalForwarder request.
+--
+-- /See:/ 'updateConditionalForwarderResponse' smart constructor.
 newtype UpdateConditionalForwarderResponse = UpdateConditionalForwarderResponse'
     { _ucfrsResponseStatus :: Int
     } deriving (Eq,Read,Show,Data,Typeable,Generic)
diff --git a/gen/Network/AWS/DirectoryService/VerifyTrust.hs b/gen/Network/AWS/DirectoryService/VerifyTrust.hs
--- a/gen/Network/AWS/DirectoryService/VerifyTrust.hs
+++ b/gen/Network/AWS/DirectoryService/VerifyTrust.hs
@@ -101,7 +101,9 @@
 instance ToQuery VerifyTrust where
         toQuery = const mempty
 
--- | /See:/ 'verifyTrustResponse' smart constructor.
+-- | Result of a VerifyTrust request.
+--
+-- /See:/ 'verifyTrustResponse' smart constructor.
 data VerifyTrustResponse = VerifyTrustResponse'
     { _vtrsTrustId        :: !(Maybe Text)
     , _vtrsResponseStatus :: !Int
diff --git a/src/.gitkeep b/src/.gitkeep
new file mode 100644
--- /dev/null
+++ b/src/.gitkeep
diff --git a/test/Test/AWS/Gen/DirectoryService.hs b/test/Test/AWS/Gen/DirectoryService.hs
--- a/test/Test/AWS/Gen/DirectoryService.hs
+++ b/test/Test/AWS/Gen/DirectoryService.hs
@@ -46,6 +46,12 @@
 --         , requestDescribeDirectories $
 --             describeDirectories
 --
+--         , requestAddIPRoutes $
+--             addIPRoutes
+--
+--         , requestListTagsForResource $
+--             listTagsForResource
+--
 --         , requestDescribeTrusts $
 --             describeTrusts
 --
@@ -61,6 +67,9 @@
 --         , requestCreateDirectory $
 --             createDirectory
 --
+--         , requestRemoveTagsFromResource $
+--             removeTagsFromResource
+--
 --         , requestDescribeEventTopics $
 --             describeEventTopics
 --
@@ -76,6 +85,12 @@
 --         , requestEnableRadius $
 --             enableRadius
 --
+--         , requestListIPRoutes $
+--             listIPRoutes
+--
+--         , requestAddTagsToResource $
+--             addTagsToResource
+--
 --         , requestDisableRadius $
 --             disableRadius
 --
@@ -85,6 +100,9 @@
 --         , requestDescribeSnapshots $
 --             describeSnapshots
 --
+--         , requestRemoveIPRoutes $
+--             removeIPRoutes
+--
 --         , requestDeleteSnapshot $
 --             deleteSnapshot
 --
@@ -136,6 +154,12 @@
 --         , responseDescribeDirectories $
 --             describeDirectoriesResponse
 --
+--         , responseAddIPRoutes $
+--             addIPRoutesResponse
+--
+--         , responseListTagsForResource $
+--             listTagsForResourceResponse
+--
 --         , responseDescribeTrusts $
 --             describeTrustsResponse
 --
@@ -151,6 +175,9 @@
 --         , responseCreateDirectory $
 --             createDirectoryResponse
 --
+--         , responseRemoveTagsFromResource $
+--             removeTagsFromResourceResponse
+--
 --         , responseDescribeEventTopics $
 --             describeEventTopicsResponse
 --
@@ -166,6 +193,12 @@
 --         , responseEnableRadius $
 --             enableRadiusResponse
 --
+--         , responseListIPRoutes $
+--             listIPRoutesResponse
+--
+--         , responseAddTagsToResource $
+--             addTagsToResourceResponse
+--
 --         , responseDisableRadius $
 --             disableRadiusResponse
 --
@@ -175,6 +208,9 @@
 --         , responseDescribeSnapshots $
 --             describeSnapshotsResponse
 --
+--         , responseRemoveIPRoutes $
+--             removeIPRoutesResponse
+--
 --         , responseDeleteSnapshot $
 --             deleteSnapshotResponse
 --
@@ -240,6 +276,16 @@
     "DescribeDirectories"
     "fixture/DescribeDirectories.yaml"
 
+requestAddIPRoutes :: AddIPRoutes -> TestTree
+requestAddIPRoutes = req
+    "AddIPRoutes"
+    "fixture/AddIPRoutes.yaml"
+
+requestListTagsForResource :: ListTagsForResource -> TestTree
+requestListTagsForResource = req
+    "ListTagsForResource"
+    "fixture/ListTagsForResource.yaml"
+
 requestDescribeTrusts :: DescribeTrusts -> TestTree
 requestDescribeTrusts = req
     "DescribeTrusts"
@@ -265,6 +311,11 @@
     "CreateDirectory"
     "fixture/CreateDirectory.yaml"
 
+requestRemoveTagsFromResource :: RemoveTagsFromResource -> TestTree
+requestRemoveTagsFromResource = req
+    "RemoveTagsFromResource"
+    "fixture/RemoveTagsFromResource.yaml"
+
 requestDescribeEventTopics :: DescribeEventTopics -> TestTree
 requestDescribeEventTopics = req
     "DescribeEventTopics"
@@ -290,6 +341,16 @@
     "EnableRadius"
     "fixture/EnableRadius.yaml"
 
+requestListIPRoutes :: ListIPRoutes -> TestTree
+requestListIPRoutes = req
+    "ListIPRoutes"
+    "fixture/ListIPRoutes.yaml"
+
+requestAddTagsToResource :: AddTagsToResource -> TestTree
+requestAddTagsToResource = req
+    "AddTagsToResource"
+    "fixture/AddTagsToResource.yaml"
+
 requestDisableRadius :: DisableRadius -> TestTree
 requestDisableRadius = req
     "DisableRadius"
@@ -305,6 +366,11 @@
     "DescribeSnapshots"
     "fixture/DescribeSnapshots.yaml"
 
+requestRemoveIPRoutes :: RemoveIPRoutes -> TestTree
+requestRemoveIPRoutes = req
+    "RemoveIPRoutes"
+    "fixture/RemoveIPRoutes.yaml"
+
 requestDeleteSnapshot :: DeleteSnapshot -> TestTree
 requestDeleteSnapshot = req
     "DeleteSnapshot"
@@ -399,6 +465,20 @@
     directoryService
     (Proxy :: Proxy DescribeDirectories)
 
+responseAddIPRoutes :: AddIPRoutesResponse -> TestTree
+responseAddIPRoutes = res
+    "AddIPRoutesResponse"
+    "fixture/AddIPRoutesResponse.proto"
+    directoryService
+    (Proxy :: Proxy AddIPRoutes)
+
+responseListTagsForResource :: ListTagsForResourceResponse -> TestTree
+responseListTagsForResource = res
+    "ListTagsForResourceResponse"
+    "fixture/ListTagsForResourceResponse.proto"
+    directoryService
+    (Proxy :: Proxy ListTagsForResource)
+
 responseDescribeTrusts :: DescribeTrustsResponse -> TestTree
 responseDescribeTrusts = res
     "DescribeTrustsResponse"
@@ -434,6 +514,13 @@
     directoryService
     (Proxy :: Proxy CreateDirectory)
 
+responseRemoveTagsFromResource :: RemoveTagsFromResourceResponse -> TestTree
+responseRemoveTagsFromResource = res
+    "RemoveTagsFromResourceResponse"
+    "fixture/RemoveTagsFromResourceResponse.proto"
+    directoryService
+    (Proxy :: Proxy RemoveTagsFromResource)
+
 responseDescribeEventTopics :: DescribeEventTopicsResponse -> TestTree
 responseDescribeEventTopics = res
     "DescribeEventTopicsResponse"
@@ -469,6 +556,20 @@
     directoryService
     (Proxy :: Proxy EnableRadius)
 
+responseListIPRoutes :: ListIPRoutesResponse -> TestTree
+responseListIPRoutes = res
+    "ListIPRoutesResponse"
+    "fixture/ListIPRoutesResponse.proto"
+    directoryService
+    (Proxy :: Proxy ListIPRoutes)
+
+responseAddTagsToResource :: AddTagsToResourceResponse -> TestTree
+responseAddTagsToResource = res
+    "AddTagsToResourceResponse"
+    "fixture/AddTagsToResourceResponse.proto"
+    directoryService
+    (Proxy :: Proxy AddTagsToResource)
+
 responseDisableRadius :: DisableRadiusResponse -> TestTree
 responseDisableRadius = res
     "DisableRadiusResponse"
@@ -489,6 +590,13 @@
     "fixture/DescribeSnapshotsResponse.proto"
     directoryService
     (Proxy :: Proxy DescribeSnapshots)
+
+responseRemoveIPRoutes :: RemoveIPRoutesResponse -> TestTree
+responseRemoveIPRoutes = res
+    "RemoveIPRoutesResponse"
+    "fixture/RemoveIPRoutesResponse.proto"
+    directoryService
+    (Proxy :: Proxy RemoveIPRoutes)
 
 responseDeleteSnapshot :: DeleteSnapshotResponse -> TestTree
 responseDeleteSnapshot = res
