diff --git a/AWS/EC2/Internal.hs b/AWS/EC2/Internal.hs
--- a/AWS/EC2/Internal.hs
+++ b/AWS/EC2/Internal.hs
@@ -25,6 +25,7 @@
 import qualified Data.Conduit.List as CL
 import Data.XML.Types (Event)
 import Data.Text (Text)
+import Data.Maybe (fromMaybe)
 
 import AWS.Class
 import AWS.Credential
@@ -48,7 +49,7 @@
     -> GLSink Event m o
     -> GLConduit Event m o
 itemConduit tag inner =
-    maybe (()) id <$> elementM tag (listConduit "item" inner)
+    fromMaybe (()) <$> elementM tag (listConduit "item" inner)
 
 itemsSet :: MonadThrow m
     => Text
diff --git a/AWS/EC2/NetworkInterfaceAttribute.hs b/AWS/EC2/NetworkInterfaceAttribute.hs
--- a/AWS/EC2/NetworkInterfaceAttribute.hs
+++ b/AWS/EC2/NetworkInterfaceAttribute.hs
@@ -24,7 +24,7 @@
 describeNetworkInterfaceDescription
     :: (MonadBaseControl IO m, MonadResource m)
     => Text -- ^ The ID of the network interface.
-    -> EC2 m Text
+    -> EC2 m (Maybe Text)
 describeNetworkInterfaceDescription = describeNetworkInterfaceAttribute "description" $
   element "description" $ getT "value"
 
diff --git a/AWS/EC2/Types/Image.hs b/AWS/EC2/Types/Image.hs
--- a/AWS/EC2/Types/Image.hs
+++ b/AWS/EC2/Types/Image.hs
@@ -67,7 +67,7 @@
 
 data EbsBlockDevice = EbsBlockDevice
     { ebsSnapshotId :: Maybe Text
-    , ebsVolumeSize :: Int
+    , ebsVolumeSize :: Maybe Int
     , ebsDeleteOnTermination :: Bool
     , ebsVolumeType :: VolumeType
     }
diff --git a/AWS/ELB/LoadBalancer.hs b/AWS/ELB/LoadBalancer.hs
--- a/AWS/ELB/LoadBalancer.hs
+++ b/AWS/ELB/LoadBalancer.hs
@@ -12,6 +12,14 @@
     , setLoadBalancerListenerSSLCertificate
     , createLoadBalancerListeners
     , deleteLoadBalancerListeners
+    , describeLoadBalancerPolicies
+    , describeLoadBalancerPolicyTypes
+    , createLoadBalancerPolicy
+    , deleteLoadBalancerPolicy
+    , describeInstanceHealth
+    , configureHealthCheck
+    , enableAvailabilityZonesForLoadBalancer
+    , disableAvailabilityZonesForLoadBalancer
     ) where
 
 import Data.Text (Text)
@@ -48,14 +56,7 @@
     <$> members "SecurityGroups" text
     <*> getT "CreatedTime"
     <*> getT "LoadBalancerName"
-    <*> element "HealthCheck"
-        (HealthCheck
-        <$> getT "Interval"
-        <*> getT "Target"
-        <*> getT "HealthyThreshold"
-        <*> getT "Timeout"
-        <*> getT "UnhealthyThreshold"
-        )
+    <*> element "HealthCheck" sinkHealthCheck
     <*> getT "VPCId"
     <*> members "ListenerDescriptions"
         (ListenerDescription
@@ -80,8 +81,8 @@
         <*> members "OtherPolicies" text
         <*> members "LBCookieStickinessPolicies"
             (LBCookieStickinessPolicy
-            <$> getT "CookieExpirationPeriod"
-            <*> getT "PolicyName"
+            <$> getT "PolicyName"
+            <*> getT "CookieExpirationPeriod"
             )
         )
     <*> members "AvailabilityZones" text
@@ -104,6 +105,15 @@
 sinkInstance :: MonadThrow m => GLSink Event m Instance
 sinkInstance = Instance <$> getT "InstanceId"
 
+sinkHealthCheck :: MonadThrow m => GLSink Event m HealthCheck
+sinkHealthCheck =
+    HealthCheck
+    <$> getT "Interval"
+    <*> getT "Target"
+    <*> getT "HealthyThreshold"
+    <*> getT "Timeout"
+    <*> getT "UnhealthyThreshold"
+
 createLoadBalancer
     :: (MonadBaseControl IO m, MonadResource m)
     => Text -- ^ LoadBalancerName
@@ -258,4 +268,160 @@
     params =
         [ "LoadBalancerName" |= lb
         , "LoadBalancerPorts.member" |.#= map toText ports
+        ]
+
+describeLoadBalancerPolicies
+    :: (MonadBaseControl IO m, MonadResource m)
+    => Maybe Text -- ^ The mnemonic name associated with the LoadBalancer.
+    -> [Text] -- ^ The names of LoadBalancer policies you've created or Elastic Load Balancing sample policy names.
+    -> ELB m [PolicyDescription]
+describeLoadBalancerPolicies mlb policies =
+    elbQuery "DescribeLoadBalancerPolicies" params $ members "PolicyDescriptions" sinkPolicyDescription
+  where
+    params =
+        [ "LoadBalancerName" |=? mlb
+        , "PolicyNames.member" |.#= policies
+        ]
+
+sinkPolicyDescription :: MonadThrow m => GLSink Event m PolicyDescription
+sinkPolicyDescription =
+    PolicyDescription
+    <$> getT "PolicyName"
+    <*> getT "PolicyTypeName"
+    <*> members "PolicyAttributeDescriptions" sinkPolicyAttribute
+
+sinkPolicyAttribute :: MonadThrow m => GLSink Event m PolicyAttribute
+sinkPolicyAttribute =
+    PolicyAttribute
+    <$> getT "AttributeName"
+    <*> getT "AttributeValue"
+
+describeLoadBalancerPolicyTypes
+    :: (MonadBaseControl IO m, MonadResource m)
+    => [Text] -- ^ Specifies the name of the policy types.
+    -> ELB m [PolicyType]
+describeLoadBalancerPolicyTypes typeNames =
+    elbQuery "DescribeLoadBalancerPolicyTypes" params $ members "PolicyTypeDescriptions" sinkPolicyType
+  where
+    params = ["PolicyTypeNames.member" |.#= typeNames]
+
+sinkPolicyType :: MonadThrow m => GLSink Event m PolicyType
+sinkPolicyType =
+    PolicyType
+    <$> members "PolicyAttributeTypeDescriptions" sinkPolicyAttributeType
+    <*> getT "PolicyTypeName"
+    <*> getT "Description"
+
+sinkPolicyAttributeType :: MonadThrow m => GLSink Event m PolicyAttributeType
+sinkPolicyAttributeType =
+    PolicyAttributeType
+    <$> getT "AttributeName"
+    <*> getT "AttributeType"
+    <*> getT "DefaultValue"
+    <*> getT "Cardinality"
+    <*> getT "Description"
+
+createLoadBalancerPolicy
+    :: (MonadBaseControl IO m, MonadResource m)
+    => Text -- ^ The name associated with the LoadBalancer for which the policy is being created.
+    -> [PolicyAttribute] -- ^ A list of attributes associated with the policy being created.
+    -> Text -- ^ The name of the LoadBalancer policy being created.
+    -> Text -- ^ The name of the base policy type being used to create this policy.
+    -> ELB m ()
+createLoadBalancerPolicy lb attrs name typeName =
+    elbQuery "CreateLoadBalancerPolicy" params $ getT_ "CreateLoadBalancerPolicyResult"
+  where
+    params =
+        [ "LoadBalancerName" |= lb
+        , "PolicyAttributes.member" |.#. map toAttributeParams attrs
+        , "PolicyName" |= name
+        , "PolicyTypeName" |= typeName
+        ]
+
+toAttributeParams :: PolicyAttribute -> [QueryParam]
+toAttributeParams PolicyAttribute{..} =
+    [ "AttributeName" |= policyAttributeName
+    , "AttributeValue" |= policyAttributeValue
+    ]
+
+deleteLoadBalancerPolicy
+    :: (MonadBaseControl IO m, MonadResource m)
+    => Text -- ^ The mnemonic name associated with the LoadBalancer.
+    -> Text -- ^ The mnemonic name for the policy being deleted.
+    -> ELB m ()
+deleteLoadBalancerPolicy lb policyName =
+    elbQuery "DeleteLoadBalancerPolicy" params $ getT_ "DeleteLoadBalancerPolicyResult"
+  where
+    params =
+        [ "LoadBalancerName" |= lb
+        , "PolicyName" |= policyName
+        ]
+
+describeInstanceHealth
+    :: (MonadBaseControl IO m, MonadResource m)
+    => [Text] -- ^ A list of instance IDs whose states are being queried.
+    -> Text -- ^ The name associated with the LoadBalancer.
+    -> ELB m [InstanceState]
+describeInstanceHealth insts lb =
+    elbQuery "DescribeInstanceHealth" params $ members "InstanceStates" sinkInstanceState
+  where
+    params =
+        [ "Instances.member" |.#. map toInstanceParam insts
+        , "LoadBalancerName" |= lb
+        ]
+
+sinkInstanceState :: MonadThrow m => GLSink Event m InstanceState
+sinkInstanceState =
+    InstanceState
+    <$> getT "Description"
+    <*> getT "InstanceId"
+    <*> getT "State"
+    <*> getT "ReasonCode"
+
+configureHealthCheck
+    :: (MonadBaseControl IO m, MonadResource m)
+    => HealthCheck -- ^ A structure containing the configuration information for the new healthcheck.
+    -> Text -- ^ The mnemonic name associated with the LoadBalancer.
+    -> ELB m HealthCheck
+configureHealthCheck hc lb =
+    elbQuery "ConfigureHealthCheck" params $ element "HealthCheck" sinkHealthCheck
+  where
+    params =
+        [ "HealthCheck" |. toHealthCheckParams hc
+        , "LoadBalancerName" |= lb
+        ]
+
+toHealthCheckParams :: HealthCheck -> [QueryParam]
+toHealthCheckParams HealthCheck{..} =
+    [ "HealthyThreshold" |= toText healthCheckHealthyThreshold
+    , "Interval" |= toText healthCheckInterval
+    , "Target" |= healthCheckTarget
+    , "Timeout" |= toText healthCheckTimeout
+    , "UnhealthyThreshold" |= toText healthCheckUnhealthyThreshold
+    ]
+
+enableAvailabilityZonesForLoadBalancer
+    :: (MonadBaseControl IO m, MonadResource m)
+    => [Text] -- ^ A list of new Availability Zones for the LoadBalancer.
+    -> Text -- ^ The name associated with the LoadBalancer.
+    -> ELB m [Text] -- ^ An updated list of Availability Zones for the LoadBalancer.
+enableAvailabilityZonesForLoadBalancer zones lb =
+    elbQuery "EnableAvailabilityZonesForLoadBalancer" params $ members "AvailabilityZones" text
+  where
+    params =
+        [ "AvailabilityZones.member" |.#= zones
+        , "LoadBalancerName" |= lb
+        ]
+
+disableAvailabilityZonesForLoadBalancer
+    :: (MonadBaseControl IO m, MonadResource m)
+    => [Text] -- ^ A list of Availability Zones to be removed from the LoadBalancer.
+    -> Text -- ^ The name associated with the LoadBalancer.
+    -> ELB m [Text] -- ^ A list of updated Availability Zones for the LoadBalancer.
+disableAvailabilityZonesForLoadBalancer zones lb =
+    elbQuery "DisableAvailabilityZonesForLoadBalancer" params $ members "AvailabilityZones" text
+  where
+    params =
+        [ "AvailabilityZones.member" |.#= zones
+        , "LoadBalancerName" |= lb
         ]
diff --git a/AWS/ELB/Types.hs b/AWS/ELB/Types.hs
--- a/AWS/ELB/Types.hs
+++ b/AWS/ELB/Types.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE TemplateHaskell #-}
 module AWS.ELB.Types
     where
 
@@ -73,8 +74,8 @@
   deriving (Show, Eq)
 
 data LBCookieStickinessPolicy = LBCookieStickinessPolicy
-    { lbCookieStickinessPolicyCookieExpirationPeriod :: Integer
-    , lbCookieStickinessPolicyPolicyName :: Text
+    { lbCookieStickinessPolicyPolicyName :: Text
+    , lbCookieStickinessPolicyCookieExpirationPeriod :: Integer
     }
   deriving (Show, Eq)
 
@@ -83,3 +84,56 @@
     , sourceSecurityGroupGroupName :: Text
     }
   deriving (Show, Eq)
+
+data PolicyDescription = PolicyDescription
+    { policyName :: Text
+    , policyTypeName :: Text
+    , policyAttributes :: [PolicyAttribute]
+    }
+  deriving (Show, Eq)
+
+data PolicyAttribute = PolicyAttribute
+    { policyAttributeName :: Text
+    , policyAttributeValue :: Text
+    }
+  deriving (Show, Eq)
+
+data PolicyType = PolicyType
+    { policyTypeAttributeTypes :: [PolicyAttributeType]
+    , policyTypeTypeName :: Text
+    , policyTypeDescription :: Text
+    }
+  deriving (Show, Eq)
+
+data PolicyAttributeType = PolicyAttributeType
+    { policyAttributeTypeAttributeName :: Text
+    , policyAttributeTypeAttributeType :: Text
+    , policyAttributeTypeDefaultValue :: Maybe Text
+    , policyAttributeTypeCardinality :: PolicyAttributeCardinality
+    , policyAttributeTypeDescription :: Maybe Text
+    }
+  deriving (Show, Eq)
+
+data PolicyAttributeCardinality
+    = PolicyAttributeCardinalityOne
+    | PolicyAttributeCardinalityZeroOrOne
+    | PolicyAttributeCardinalityZeroOrMore
+    | PolicyAttributeCardinalityOneOrMore
+  deriving (Show, Eq, Read)
+
+deriveFromText "PolicyAttributeCardinality" ["ONE", "ZERO_OR_ONE", "ZERO_OR_MORE", "ONE_OR_MORE"]
+
+data InstanceState = InstanceState
+    { instanceStateDescription :: Text
+    , instanceStateInstanceId :: Text
+    , instanceStateState :: InstanceStateState
+    , instanceStateReasonCode :: Maybe Text
+    }
+  deriving (Show, Eq)
+
+data InstanceStateState
+    = InstanceStateInService
+    | InstanceStateOutOfService
+    deriving (Show, Eq, Read)
+
+deriveFromText "InstanceStateState" ["InService", "OutOfService"]
diff --git a/AWS/Lib/Parser.hs b/AWS/Lib/Parser.hs
--- a/AWS/Lib/Parser.hs
+++ b/AWS/Lib/Parser.hs
@@ -28,6 +28,7 @@
 import Control.Applicative
 import Data.Monoid ((<>))
 import Control.Monad.Trans.Class (lift)
+import Data.Maybe (fromMaybe)
 
 import AWS.Class
 import AWS.Lib.FromText
@@ -151,4 +152,5 @@
     => Text
     -> GLSink Event m a
     -> GLSink Event m [a]
-members name f = element name $ listConsumer "member" f
+members name f = 
+    fromMaybe [] <$> elementM name (listConsumer "member" f)
diff --git a/AWS/RDS.hs b/AWS/RDS.hs
--- a/AWS/RDS.hs
+++ b/AWS/RDS.hs
@@ -7,8 +7,14 @@
     , setRegion
       -- * DBInstance
     , module AWS.RDS.DBInstance
+      -- * DBParameterGroup
+    , module AWS.RDS.DBParameterGroup
+      -- * DBSecurityGroup
+    , module AWS.RDS.DBSecurityGroup
       -- * DBSnapshot
     , module AWS.RDS.DBSnapshot
+      -- * DBSubnetGroup
+    , module AWS.RDS.DBSubnetGroup
       -- * Event
     , module AWS.RDS.Event
     ) where
@@ -26,7 +32,10 @@
 import AWS
 import AWS.RDS.Internal
 import AWS.RDS.DBInstance
+import AWS.RDS.DBParameterGroup
+import AWS.RDS.DBSecurityGroup
 import AWS.RDS.DBSnapshot
+import AWS.RDS.DBSubnetGroup
 import AWS.RDS.Event
 
 initialRDSContext :: HTTP.Manager -> AWSContext
diff --git a/AWS/RDS/DBInstance.hs b/AWS/RDS/DBInstance.hs
--- a/AWS/RDS/DBInstance.hs
+++ b/AWS/RDS/DBInstance.hs
@@ -61,23 +61,7 @@
     <*> sinkPendingModifiedValues
     <*> getT "CharacterSetName"
     <*> getT "LicenseModel"
-    <*> elementM "DBSubnetGroup"
-        (DBSubnetGroup
-        <$> getT "VpcId"
-        <*> getT "SubnetGroupStatus"
-        <*> getT "DBSubnetGroupDescription"
-        <*> getT "DBSubnetGroupName"
-        <*> elements "Subnet"
-            (Subnet
-            <$> getT "SubnetStatus"
-            <*> getT "SubnetIdentifier"
-            <*> element "SubnetAvailabilityZone"
-                (AvailabilityZone
-                <$> getT "Name"
-                <*> getT "ProvisionedIopsCapable"
-                )
-            )
-        )
+    <*> elementM "DBSubnetGroup" dbSubnetGroupSink
     <*> elements "DBParameterGroup"
         (DBParameterGroupStatus
         <$> getT "ParameterApplyStatus"
diff --git a/AWS/RDS/DBParameterGroup.hs b/AWS/RDS/DBParameterGroup.hs
new file mode 100644
--- /dev/null
+++ b/AWS/RDS/DBParameterGroup.hs
@@ -0,0 +1,40 @@
+{-# LANGUAGE FlexibleContexts #-}
+
+module AWS.RDS.DBParameterGroup
+    ( describeDBParameterGroups
+    ) where
+
+import Control.Applicative ((<$>), (<*>))
+import Data.Conduit (GLSink, MonadBaseControl, MonadResource, MonadThrow)
+import Data.Text (Text)
+import Data.XML.Types (Event)
+
+import AWS.Lib.Parser (getT)
+import AWS.Lib.Query ((|=?))
+import AWS.RDS.Internal (RDS, rdsQuery, elements)
+import AWS.RDS.Types hiding (Event)
+import AWS.Util (toText)
+
+describeDBParameterGroups
+    :: (MonadBaseControl IO m, MonadResource m)
+    => Maybe Text -- ^ DBParameterGroupName
+    -> Maybe Text -- ^ Marker
+    -> Maybe Int -- ^ MaxRecords
+    -> RDS m [DBParameterGroup]
+describeDBParameterGroups name marker maxRecords =
+    rdsQuery "DescribeDBParameterGroups" params $
+        elements "DBParameterGroup" dbParameterGroupSink
+  where
+    params =
+        [ "DBParameterGroupName" |=? name
+        , "Marker" |=? marker
+        , "MaxRecords" |=? toText <$> maxRecords
+        ]
+
+dbParameterGroupSink
+    :: MonadThrow m
+    => GLSink Event m DBParameterGroup
+dbParameterGroupSink = DBParameterGroup
+    <$> getT "DBParameterGroupFamily"
+    <*> getT "Description"
+    <*> getT "DBParameterGroupName"
diff --git a/AWS/RDS/DBSecurityGroup.hs b/AWS/RDS/DBSecurityGroup.hs
new file mode 100644
--- /dev/null
+++ b/AWS/RDS/DBSecurityGroup.hs
@@ -0,0 +1,53 @@
+{-# LANGUAGE FlexibleContexts #-}
+
+module AWS.RDS.DBSecurityGroup
+    ( describeDBSecurityGroups
+    ) where
+
+import Control.Applicative ((<$>), (<*>))
+import Data.Conduit (GLSink, MonadBaseControl, MonadResource, MonadThrow)
+import Data.Text (Text)
+import Data.XML.Types (Event)
+
+import AWS.Lib.Parser (getT)
+import AWS.Lib.Query ((|=?))
+import AWS.RDS.Internal (RDS, rdsQuery, elements)
+import AWS.RDS.Types hiding (Event)
+import AWS.Util (toText)
+
+describeDBSecurityGroups
+    :: (MonadBaseControl IO m, MonadResource m)
+    => Maybe Text -- ^ DBSecurityGroupName
+    -> Maybe Text -- ^ Marker
+    -> Maybe Int -- ^ MaxRecords
+    -> RDS m [DBSecurityGroup]
+describeDBSecurityGroups name marker maxRecords =
+    rdsQuery "DescribeDBSecurityGroups" params $
+        elements "DBSecurityGroup" dbSecurityGroupSink
+  where
+    params =
+        [ "DBSecurityGroupName" |=? name
+        , "Marker" |=? marker
+        , "MaxRecords" |=? toText <$> maxRecords
+        ]
+
+dbSecurityGroupSink
+    :: MonadThrow m
+    => GLSink Event m DBSecurityGroup
+dbSecurityGroupSink = DBSecurityGroup
+    <$> elements "EC2SecurityGroup" (
+        EC2SecurityGroup
+        <$> getT "Status"
+        <*> getT "EC2SecurityGroupOwnerId"
+        <*> getT "EC2SecurityGroupName"
+        <*> getT "EC2SecurityGroupId"
+        )
+    <*> getT "DBSecurityGroupDescription"
+    <*> elements "IPRange" (
+        IPRange
+        <$> getT "CIDRIP"
+        <*> getT "Status"
+        )
+    <*> getT "VpcId"
+    <*> getT "OwnerId"
+    <*> getT "DBSecurityGroupName"
diff --git a/AWS/RDS/DBSubnetGroup.hs b/AWS/RDS/DBSubnetGroup.hs
new file mode 100644
--- /dev/null
+++ b/AWS/RDS/DBSubnetGroup.hs
@@ -0,0 +1,30 @@
+{-# LANGUAGE FlexibleContexts #-}
+
+module AWS.RDS.DBSubnetGroup
+    ( describeDBSubnetGroups
+    ) where
+
+import Control.Applicative ((<$>))
+import Data.Conduit
+import Data.Text (Text)
+
+import AWS.Lib.Query ((|=?))
+import AWS.RDS.Internal
+import AWS.RDS.Types (DBSubnetGroup)
+import AWS.Util (toText)
+
+describeDBSubnetGroups
+    :: (MonadBaseControl IO m, MonadResource m)
+    => Maybe Text -- ^ DBSubnetGroupName
+    -> Maybe Text -- ^ Marker
+    -> Maybe Int -- ^ MaxRecords
+    -> RDS m [DBSubnetGroup]
+describeDBSubnetGroups name marker maxRecords =
+    rdsQuery "DescribeDBSubnetGroups" params $
+        elements "DBSubnetGroup" dbSubnetGroupSink
+  where
+    params =
+        [ "DBSubnetGroupName" |=? name
+        , "Marker" |=? marker
+        , "MaxRecords" |=? toText <$> maxRecords
+        ]
diff --git a/AWS/RDS/Internal.hs b/AWS/RDS/Internal.hs
--- a/AWS/RDS/Internal.hs
+++ b/AWS/RDS/Internal.hs
@@ -1,17 +1,29 @@
 {-# LANGUAGE FlexibleContexts, RankNTypes, CPP #-}
 
 module AWS.RDS.Internal
-    where
+    ( apiVersion
+    , RDS
+    , rdsQuery
+    , elements
+    , elements'
+#ifdef DEBUG
+    , rdsQueryDebug
+#endif
+    , dbSubnetGroupSink
+    ) where
 
+import Control.Applicative ((<$>), (<*>))
 import Data.ByteString (ByteString)
 import Data.Text (Text)
 import Data.Conduit
 import Data.Monoid ((<>))
 import Data.XML.Types (Event(..))
+import Data.Maybe (fromMaybe)
 
 import AWS.Class
 import AWS.Lib.Query
 import AWS.Lib.Parser
+import AWS.RDS.Types (DBSubnetGroup(..), Subnet(..), AvailabilityZone(..))
 
 apiVersion :: ByteString
 apiVersion = "2013-01-10"
@@ -32,12 +44,13 @@
     -> GLSink Event m [a]
 elements name = elements' (name <> "s") name
 
-elements' :: MonadThrow m
+elements' :: forall m a . MonadThrow m
     => Text
     -> Text
     -> GLSink Event m a
     -> GLSink Event m [a]
-elements' setName itemName = element setName . listConsumer itemName
+elements' setName itemName inner =
+    fromMaybe [] <$> elementM setName (listConsumer itemName inner)
 
 #ifdef DEBUG
 rdsQueryDebug
@@ -47,3 +60,22 @@
     -> RDS m a
 rdsQueryDebug = debugQuery apiVersion
 #endif
+
+dbSubnetGroupSink
+    :: MonadThrow m
+    => GLSink Event m DBSubnetGroup
+dbSubnetGroupSink = DBSubnetGroup
+    <$> getT "VpcId"
+    <*> getT "SubnetGroupStatus"
+    <*> getT "DBSubnetGroupDescription"
+    <*> getT "DBSubnetGroupName"
+    <*> elements "Subnet" (
+        Subnet
+        <$> getT "SubnetStatus"
+        <*> getT "SubnetIdentifier"
+        <*> element "SubnetAvailabilityZone" (
+            AvailabilityZone
+            <$> getT "Name"
+            <*> getT "ProvisionedIopsCapable"
+            )
+        )
diff --git a/AWS/RDS/Types.hs b/AWS/RDS/Types.hs
--- a/AWS/RDS/Types.hs
+++ b/AWS/RDS/Types.hs
@@ -1,138 +1,21 @@
-{-# LANGUAGE TemplateHaskell #-}
 module AWS.RDS.Types
-    where
-
-import AWS.Lib.FromText
-
-data DBInstance = DBInstance
-    { dbiIops :: Maybe Int
-    , dbiBackupRetentionPeriod :: Int
-    , dbiDBInstanceStatus :: Text
-    , dbiMultiAZ :: Bool
-    , dbiVpcSecurityGroups :: [VpcSecurityGroupMembership]
-    , dbiDBInstanceIdentifier :: Text
-    , dbiPreferredBackupWindow :: Text
-    , dbiPreferredMaintenanceWindow :: Text
-    , dbiOptionGroupMembership :: Maybe OptionGroupMembership
-    , dbiAvailabilityZone :: Text
-    , dbiLatestRestorableTime :: Maybe UTCTime
-    , dbiReadReplicaDBInstanceIdentifiers :: [Text]
-    , dbiEngine :: Text
-    , dbiPendingModifiedValues :: [PendingModifiedValue]
-    , dbiCharacterSetName :: Maybe Text
-    , dbiLicenseModel :: Text
-    , dbiSubnetGroup :: Maybe DBSubnetGroup
-    , dbiDBParameterGroups :: [DBParameterGroupStatus]
-    , dbiEndpoint :: Maybe Endpoint
-    , dbiEngineVersion :: Text
-    , dbiReadReplicaSourceDBInstanceIdentifier :: Maybe Text
-    , dbiPubliclyAccessible :: Bool
-    , dbiSecurityGroups :: [DBSecurityGroupMembership]
-    , dbiAutoMinorVersionUpgrade :: Bool
-    , dbiDBName :: Maybe Text
-    , dbiInstanceCreateTime :: Maybe UTCTime
-    , dbiAllocatedStorage :: Int -- ^ storage size in gigabytes
-    , dbiDBInstanceClass :: Text
-    , dbiMasterUsername :: Text
-    }
-  deriving (Show, Eq)
-
-data VpcSecurityGroupMembership = VpcSecurityGroupMembership
-    { vpcSecurityGroupMembershipStatus :: Text
-    , vpcSecurityGroupMembershipVpcSecurityGroupId :: Text
-    }
-  deriving (Show, Eq)
-
-data DBParameterGroupStatus = DBParameterGroupStatus
-    { dbpgsParameterApplyStatus :: Text
-    , dbpgsDBParameterGroupName :: Text
-    }
-  deriving (Show, Eq)
-
-data DBSecurityGroupMembership = DBSecurityGroupMembership
-    { dbsgmStatus :: Text
-    , dbsgmDBSecurityGroupName :: Text
-    }
-  deriving (Show, Eq)
-
-data DBSubnetGroup = DBSubnetGroup
-    { dbsngVpcId :: Text
-    , dbsngSubnetGroupStatus :: Text
-    , dbsngDBSubnetGroupDescription :: Text
-    , dbsngDBSubnetGroupName :: Text
-    , dbsngSubnets :: [Subnet]
-    }
-  deriving (Show, Eq)
-
-data Subnet = Subnet
-    { subnetStatus :: Text
-    , subnetIdentifier :: Text
-    , subnetAvailabilityZone :: AvailabilityZone
-    }
-  deriving (Show, Eq)
-
-data AvailabilityZone = AvailabilityZone
-    { azName :: Text
-    , azProvisionedIopsCapable :: Bool
-    }
-  deriving (Show, Eq)
-
-data Endpoint = Endpoint
-    { epPort :: Int
-    , epAddress :: Text
-    }
-  deriving (Show, Eq)
-
-data OptionGroupMembership = OptionGroupMembership
-    { ogmOptionGroupName :: Text
-    , ogmStatus :: Text
-    }
-  deriving (Show, Eq)
-
-data PendingModifiedValue
-    = PMVAllocatedStorage Int
-    | PMVBackupRetentionPeriod Int
-    | PMVDBInstanceClass Text
-    | PMVEngineVersion Text
-    | PMVIops Int
-    | PMVMasterUserPassword Text
-    | PMVMultiAZ Bool
-    | PMVPort Int
-  deriving (Show, Eq)
-
-data DBSnapshot = DBSnapshot
-    { dbsPort :: Int
-    , dbsIops :: Maybe Int
-    , dbsEngine :: Text
-    , dbsStatus :: Text
-    , dbsSnapshotType :: Text
-    , dbsLicenseModel :: Text
-    , dbsDBInstanceIdentifier :: Text
-    , dbsEngineVersion :: Text
-    , dbsDBSnapshotIdentifier :: Text
-    , dbsSnapshotCreateTime :: Maybe UTCTime
-    , dbsVpcId :: Maybe Text
-    , dbsAvailabilityZone :: Text
-    , dbsInstanceCreateTime :: UTCTime
-    , dbsAllocatedStorage :: Int
-    , dbsMasterUsername :: Text
-    }
-  deriving (Show, Eq)
-
-data Event = Event
-    { eventMessage :: Text
-    , eventSourceType :: SourceType
-    , eventEventCategories :: [Text]
-    , eventDate :: UTCTime
-    , eventSourceIdentifier :: Text
-    }
-  deriving (Show, Eq)
-
-data SourceType
-    = SourceTypeDBInstance
-    | SourceTypeDBParameterGroup
-    | SourceTypeDBSecurityGroup
-    | SourceTypeDBSnapshot
-  deriving (Show, Read, Eq)
+    ( -- * DBInstance
+      module AWS.RDS.Types.DBInstance
+      -- * DBParameterGroup
+    , module AWS.RDS.Types.DBParameterGroup
+      -- * DBSecurityGroup
+    , module AWS.RDS.Types.DBSecurityGroup
+      -- * DBSnapshot
+    , module AWS.RDS.Types.DBSnapshot
+      -- * DBSubnetGroup
+    , module AWS.RDS.Types.DBSubnetGroup
+      -- * Event
+    , module AWS.RDS.Types.Event
+    ) where
 
-deriveFromText "SourceType" ["db-instance", "db-parameter-group", "db-security-group", "db-snapshot"]
+import AWS.RDS.Types.DBInstance
+import AWS.RDS.Types.DBParameterGroup
+import AWS.RDS.Types.DBSecurityGroup
+import AWS.RDS.Types.DBSnapshot
+import AWS.RDS.Types.DBSubnetGroup
+import AWS.RDS.Types.Event
diff --git a/AWS/RDS/Types/DBInstance.hs b/AWS/RDS/Types/DBInstance.hs
new file mode 100644
--- /dev/null
+++ b/AWS/RDS/Types/DBInstance.hs
@@ -0,0 +1,86 @@
+module AWS.RDS.Types.DBInstance
+    ( DBInstance(..)
+    , VpcSecurityGroupMembership(..)
+    , DBParameterGroupStatus(..)
+    , DBSecurityGroupMembership(..)
+    , Endpoint(..)
+    , OptionGroupMembership(..)
+    , PendingModifiedValue(..)
+    ) where
+
+import AWS.Lib.FromText (Text, UTCTime)
+import AWS.RDS.Types.DBSubnetGroup (DBSubnetGroup)
+
+data DBInstance = DBInstance
+    { dbiIops :: Maybe Int
+    , dbiBackupRetentionPeriod :: Int
+    , dbiDBInstanceStatus :: Maybe Text
+    , dbiMultiAZ :: Bool
+    , dbiVpcSecurityGroups :: [VpcSecurityGroupMembership]
+    , dbiDBInstanceIdentifier :: Text
+    , dbiPreferredBackupWindow :: Text
+    , dbiPreferredMaintenanceWindow :: Text
+    , dbiOptionGroupMembership :: Maybe OptionGroupMembership
+    , dbiAvailabilityZone :: Text
+    , dbiLatestRestorableTime :: Maybe UTCTime
+    , dbiReadReplicaDBInstanceIdentifiers :: [Text]
+    , dbiEngine :: Text
+    , dbiPendingModifiedValues :: [PendingModifiedValue]
+    , dbiCharacterSetName :: Maybe Text
+    , dbiLicenseModel :: Text
+    , dbiSubnetGroup :: Maybe DBSubnetGroup
+    , dbiDBParameterGroups :: [DBParameterGroupStatus]
+    , dbiEndpoint :: Maybe Endpoint
+    , dbiEngineVersion :: Text
+    , dbiReadReplicaSourceDBInstanceIdentifier :: Maybe Text
+    , dbiPubliclyAccessible :: Bool
+    , dbiSecurityGroups :: [DBSecurityGroupMembership]
+    , dbiAutoMinorVersionUpgrade :: Bool
+    , dbiDBName :: Maybe Text
+    , dbiInstanceCreateTime :: Maybe UTCTime
+    , dbiAllocatedStorage :: Int -- ^ storage size in gigabytes
+    , dbiDBInstanceClass :: Text
+    , dbiMasterUsername :: Text
+    }
+  deriving (Show, Eq)
+
+data VpcSecurityGroupMembership = VpcSecurityGroupMembership
+    { vpcSecurityGroupMembershipStatus :: Text
+    , vpcSecurityGroupMembershipVpcSecurityGroupId :: Text
+    }
+  deriving (Show, Eq)
+
+data DBParameterGroupStatus = DBParameterGroupStatus
+    { dbpgsParameterApplyStatus :: Text
+    , dbpgsDBParameterGroupName :: Text
+    }
+  deriving (Show, Eq)
+
+data DBSecurityGroupMembership = DBSecurityGroupMembership
+    { dbsgmStatus :: Text
+    , dbsgmDBSecurityGroupName :: Text
+    }
+  deriving (Show, Eq)
+
+data Endpoint = Endpoint
+    { epPort :: Int
+    , epAddress :: Text
+    }
+  deriving (Show, Eq)
+
+data OptionGroupMembership = OptionGroupMembership
+    { ogmOptionGroupName :: Text
+    , ogmStatus :: Text
+    }
+  deriving (Show, Eq)
+
+data PendingModifiedValue
+    = PMVAllocatedStorage Int
+    | PMVBackupRetentionPeriod Int
+    | PMVDBInstanceClass Text
+    | PMVEngineVersion Text
+    | PMVIops Int
+    | PMVMasterUserPassword Text
+    | PMVMultiAZ Bool
+    | PMVPort Int
+  deriving (Show, Eq)
diff --git a/AWS/RDS/Types/DBParameterGroup.hs b/AWS/RDS/Types/DBParameterGroup.hs
new file mode 100644
--- /dev/null
+++ b/AWS/RDS/Types/DBParameterGroup.hs
@@ -0,0 +1,12 @@
+module AWS.RDS.Types.DBParameterGroup
+    ( DBParameterGroup(..)
+    ) where
+
+import AWS.Lib.FromText (Text)
+
+data DBParameterGroup = DBParameterGroup
+    { dbpgDBParameterGroupFamily :: Text
+    , dbpgDescription :: Text
+    , dbpgDBParameterGroupName :: Text
+    }
+  deriving (Show, Eq)
diff --git a/AWS/RDS/Types/DBSecurityGroup.hs b/AWS/RDS/Types/DBSecurityGroup.hs
new file mode 100644
--- /dev/null
+++ b/AWS/RDS/Types/DBSecurityGroup.hs
@@ -0,0 +1,54 @@
+{-# LANGUAGE TemplateHaskell #-}
+
+module AWS.RDS.Types.DBSecurityGroup
+    ( DBSecurityGroup(..)
+    , EC2SecurityGroup(..)
+    , EC2SecurityGroupStatus(..)
+    , IPRange(..)
+    , IPRangeStatus(..)
+    ) where
+
+import AWS.Lib.FromText (deriveFromText, AddrRange, IPv4, Text)
+
+data DBSecurityGroup = DBSecurityGroup
+    { dbsgEC2SecurityGroups :: [EC2SecurityGroup]
+    , dbsgDBSecurityGroupDescription :: Text
+    , dbsgIPRanges :: [IPRange]
+    , dbsgVpcId :: Maybe Text
+    , dbsgOwnerId :: Text
+    , dbsgDBSecurityGroupName :: Text
+    }
+  deriving (Show, Eq)
+
+data EC2SecurityGroup = EC2SecurityGroup
+    { ec2SecurityGroupStatus :: EC2SecurityGroupStatus
+    , ec2SecurityGroupOwnerId :: Maybe Text
+    , ec2SecurityGroupName :: Text
+    , ec2SecurityGroupId :: Maybe Text
+    }
+  deriving (Show, Eq)
+
+data EC2SecurityGroupStatus
+    = EC2SecurityGroupStatusAuthorizing
+    | EC2SecurityGroupStatusAuthorized
+    | EC2SecurityGroupStatusRevoking
+    | EC2SecurityGroupStatusRevoked
+  deriving (Show, Read, Eq)
+
+data IPRange = IPRange
+    { ipRangeCidrIp :: AddrRange IPv4
+    , ipRangeStatus :: IPRangeStatus
+    }
+  deriving (Show, Eq)
+
+data IPRangeStatus
+    = IPRangeStatusAuthorizing
+    | IPRangeStatusAuthorized
+    | IPRangeStatusRevoking
+    | IPRangeStatusRevoked
+  deriving (Show, Read, Eq)
+
+deriveFromText "EC2SecurityGroupStatus"
+    ["authorizing", "authorized", "revoking", "revoked"]
+deriveFromText "IPRangeStatus"
+    ["authorizing", "authorized", "revoking", "revoked"]
diff --git a/AWS/RDS/Types/DBSnapshot.hs b/AWS/RDS/Types/DBSnapshot.hs
new file mode 100644
--- /dev/null
+++ b/AWS/RDS/Types/DBSnapshot.hs
@@ -0,0 +1,24 @@
+module AWS.RDS.Types.DBSnapshot
+    ( DBSnapshot(..)
+    ) where
+
+import AWS.Lib.FromText (Text, UTCTime)
+
+data DBSnapshot = DBSnapshot
+    { dbsPort :: Int
+    , dbsIops :: Maybe Int
+    , dbsEngine :: Text
+    , dbsStatus :: Text
+    , dbsSnapshotType :: Text
+    , dbsLicenseModel :: Text
+    , dbsDBInstanceIdentifier :: Text
+    , dbsEngineVersion :: Text
+    , dbsDBSnapshotIdentifier :: Text
+    , dbsSnapshotCreateTime :: Maybe UTCTime
+    , dbsVpcId :: Maybe Text
+    , dbsAvailabilityZone :: Text
+    , dbsInstanceCreateTime :: UTCTime
+    , dbsAllocatedStorage :: Int
+    , dbsMasterUsername :: Text
+    }
+  deriving (Show, Eq)
diff --git a/AWS/RDS/Types/DBSubnetGroup.hs b/AWS/RDS/Types/DBSubnetGroup.hs
new file mode 100644
--- /dev/null
+++ b/AWS/RDS/Types/DBSubnetGroup.hs
@@ -0,0 +1,29 @@
+module AWS.RDS.Types.DBSubnetGroup
+    ( DBSubnetGroup(..)
+    , Subnet(..)
+    , AvailabilityZone(..)
+    ) where
+
+import AWS.Lib.FromText (Text)
+
+data DBSubnetGroup = DBSubnetGroup
+    { dbsngVpcId :: Text
+    , dbsngSubnetGroupStatus :: Text
+    , dbsngDBSubnetGroupDescription :: Text
+    , dbsngDBSubnetGroupName :: Text
+    , dbsngSubnets :: [Subnet]
+    }
+  deriving (Show, Eq)
+
+data Subnet = Subnet
+    { subnetStatus :: Text
+    , subnetIdentifier :: Text
+    , subnetAvailabilityZone :: AvailabilityZone
+    }
+  deriving (Show, Eq)
+
+data AvailabilityZone = AvailabilityZone
+    { azName :: Text
+    , azProvisionedIopsCapable :: Bool
+    }
+  deriving (Show, Eq)
diff --git a/AWS/RDS/Types/Event.hs b/AWS/RDS/Types/Event.hs
new file mode 100644
--- /dev/null
+++ b/AWS/RDS/Types/Event.hs
@@ -0,0 +1,26 @@
+{-# LANGUAGE TemplateHaskell #-}
+
+module AWS.RDS.Types.Event
+    ( Event(..)
+    , SourceType(..)
+    ) where
+
+import AWS.Lib.FromText (deriveFromText, Text, UTCTime)
+
+data Event = Event
+    { eventMessage :: Text
+    , eventSourceType :: SourceType
+    , eventEventCategories :: [Text]
+    , eventDate :: UTCTime
+    , eventSourceIdentifier :: Text
+    }
+  deriving (Show, Eq)
+
+data SourceType
+    = SourceTypeDBInstance
+    | SourceTypeDBParameterGroup
+    | SourceTypeDBSecurityGroup
+    | SourceTypeDBSnapshot
+  deriving (Show, Read, Eq)
+
+deriveFromText "SourceType" ["db-instance", "db-parameter-group", "db-security-group", "db-snapshot"]
diff --git a/Tests/Main.hs b/Tests/Main.hs
--- a/Tests/Main.hs
+++ b/Tests/Main.hs
@@ -33,7 +33,10 @@
 
     -- RDS Tests
     runDBInstanceTests
+    runDBParameterGroupTests
+    runDBSecurityGroupTests
     runDBSnapshotTests
+    runDBSubnetGroupTests
     runEventTests
 
     -- ELB Tests
diff --git a/aws-sdk.cabal b/aws-sdk.cabal
--- a/aws-sdk.cabal
+++ b/aws-sdk.cabal
@@ -1,5 +1,5 @@
 name:                aws-sdk
-version:             0.9.3.0
+version:             0.9.4
 synopsis:            AWS SDK for Haskell
 description: AWS (Amazon Web Services) sdk for Haskell.
              .
@@ -10,6 +10,11 @@
 license:             BSD3
 license-file:        LICENSE
 author:              Yusuke Nomura <yunomu@gmail.com>
+                   , Seizan Shimazaki <seizans@gmail.com>
+                   , Daisuke Matsumoto <dai@daimatz.net>
+                   , amkkun <amkkun@gmail.com>
+                   , eagletmt <eagletmt@gmail.com>
+                   , HATATANI Shinta <gamaguchi@gmail.com>
 maintainer:          Yusuke Nomura <yunomu@gmail.com>
 homepage:            http://worksap-ate.github.com/aws-sdk
 copyright:           AWS SDK for Haskell Developers
@@ -79,8 +84,17 @@
                    , AWS.Lib.Query
                    , AWS.RDS.Internal
                    , AWS.RDS.DBInstance
+                   , AWS.RDS.DBParameterGroup
+                   , AWS.RDS.DBSecurityGroup
                    , AWS.RDS.DBSnapshot
+                   , AWS.RDS.DBSubnetGroup
                    , AWS.RDS.Event
+                   , AWS.RDS.Types.DBInstance
+                   , AWS.RDS.Types.DBParameterGroup
+                   , AWS.RDS.Types.DBSecurityGroup
+                   , AWS.RDS.Types.DBSnapshot
+                   , AWS.RDS.Types.DBSubnetGroup
+                   , AWS.RDS.Types.Event
                    , AWS.ELB.Internal
                    , AWS.ELB.LoadBalancer
                    , AWS.CloudWatch.Internal
@@ -111,7 +125,7 @@
                    , lifted-base
                    , transformers-base
                    , strptime
-                   , template-haskell
+                   , template-haskell == 2.7.0.0
                    , parallel
                    , iproute >= 1.2.9
 
@@ -136,6 +150,7 @@
                  , HUnit
                  , lifted-base
                  , iproute
+                 , tls
 
 source-repository head
     type:            git
