diff --git a/AWS/Class.hs b/AWS/Class.hs
--- a/AWS/Class.hs
+++ b/AWS/Class.hs
@@ -9,7 +9,7 @@
 module AWS.Class
     ( AWS
     , runAWS
-    , runAWS'
+    , runAWSwithManager
     , AWSException(..)
     , AWSContext(..)
     , getLastRequestId
@@ -105,15 +105,15 @@
     -> m a
 runAWS ctx cred app = do
     mgr <- liftIO $ HTTP.newManager HTTP.def
-    runAWS' mgr ctx cred app
+    runAWSwithManager mgr ctx cred app
 
-runAWS' :: Monad m
+runAWSwithManager :: Monad m
     => HTTP.Manager
     -> (HTTP.Manager -> c)
     -> Credential
     -> AWS c m a
     -> m a
-runAWS' mgr ctx cred app =
+runAWSwithManager mgr ctx cred app =
     R.runReaderT
         (S.evalStateT (runAWST app) $ ctx mgr)
         cred
diff --git a/AWS/CloudWatch.hs b/AWS/CloudWatch.hs
--- a/AWS/CloudWatch.hs
+++ b/AWS/CloudWatch.hs
@@ -4,11 +4,12 @@
     ( -- * CloudWatch Environment
       CloudWatch
     , runCloudWatch
-    , runCloudWatch'
+    , runCloudWatchwithManager
     , setRegion
     , apiVersion
       -- * Metric
     , module AWS.CloudWatch.Metric
+    , module AWS.CloudWatch.Alarm
     ) where
 
 import Data.Text (Text)
@@ -24,6 +25,7 @@
 import AWS
 import AWS.CloudWatch.Internal
 import AWS.CloudWatch.Metric
+import AWS.CloudWatch.Alarm
 
 initialCloudWatchContext :: HTTP.Manager -> AWSContext
 initialCloudWatchContext mgr = AWSContext
@@ -35,9 +37,10 @@
 runCloudWatch :: MonadIO m => Credential -> CloudWatch m a -> m a
 runCloudWatch = runAWS initialCloudWatchContext
 
-runCloudWatch' :: Monad m
+runCloudWatchwithManager :: Monad m
     => HTTP.Manager -> Credential -> CloudWatch m a -> m a
-runCloudWatch' mgr = runAWS' mgr initialCloudWatchContext
+runCloudWatchwithManager mgr =
+    runAWSwithManager mgr initialCloudWatchContext
 
 setRegion
     :: (MonadBaseControl IO m, MonadResource m)
diff --git a/AWS/CloudWatch/Alarm.hs b/AWS/CloudWatch/Alarm.hs
new file mode 100644
--- /dev/null
+++ b/AWS/CloudWatch/Alarm.hs
@@ -0,0 +1,195 @@
+{-# LANGUAGE FlexibleContexts, RecordWildCards #-}
+module AWS.CloudWatch.Alarm
+    ( describeAlarms
+    , describeAlarmsForMetric
+    , putMetricAlarm
+    , deleteAlarms
+    , describeAlarmHistory
+    , enableAlarmActions
+    , disableAlarmActions
+    , setAlarmState
+    ) where
+
+import Control.Applicative
+import Data.Conduit
+import Data.Text (Text)
+import Data.Time (UTCTime)
+import Data.XML.Types (Event)
+
+import AWS.CloudWatch.Internal
+import AWS.CloudWatch.Types
+import AWS.Lib.Parser (getT, getT_, members, text)
+import AWS.Lib.Query
+import AWS.Util (toText, boolToText, timeToText)
+
+describeAlarms
+    :: (MonadBaseControl IO m, MonadResource m)
+    => Maybe Text -- ^ The action name prefix.
+    -> AlarmNameSpec -- ^ The alarm name prefix or a list of alarm names to retrieve information for.
+    -> Maybe Int -- ^ The maximum number of alarm descriptions to retrieve.
+    -> Maybe Text -- ^ The token returned by a previous call to indicate that there is more data available.
+    -> Maybe StateValue -- ^ The state value to be used in matching alarms.
+    -> CloudWatch m ([MetricAlarm], Maybe Text) -- ^ A list of information for the specified alarms and NextToken.
+describeAlarms prefix spec maxRecords nextToken state =
+    cloudWatchQuery "DescribeAlarms" params $
+        (,) <$> members "MetricAlarms" sinkMetricAlarm <*> getT "NextToken"
+  where
+    params =
+        [ "ActionPrefix" |=? prefix
+        , specParam spec
+        , "MaxRecords" |=? toText <$> maxRecords
+        , "NextToken" |=? nextToken
+        , "StateValue" |=? stringifyStateValue <$> state
+        ]
+    specParam AlarmSpecNothing = nothingParam
+    specParam (AlarmSpecNamePrefix p) = "AlarmNamePrefix" |= p
+    specParam (AlarmSpecNames ns) = "AlarmNames.member" |.#= ns
+
+stringifyStateValue :: StateValue -> Text
+stringifyStateValue StateValueOk = "OK"
+stringifyStateValue StateValueAlarm = "ALARM"
+stringifyStateValue StateValueInsufficientData = "INSUFFICIENT_DATA"
+
+sinkMetricAlarm :: MonadThrow m => GLSink Event m MetricAlarm
+sinkMetricAlarm =
+    MetricAlarm
+    <$> getT "AlarmDescription"
+    <*> getT "StateUpdatedTimestamp"
+    <*> members "InsufficientDataActions" text
+    <*> getT "StateReasonData"
+    <*> getT "AlarmArn"
+    <*> getT "AlarmConfigurationUpdatedTimestamp"
+    <*> getT "AlarmName"
+    <*> getT "StateValue"
+    <*> getT "Period"
+    <*> members "OKActions" text
+    <*> getT "ActionsEnabled"
+    <*> getT "Namespace"
+    <*> getT "Threshold"
+    <*> getT "EvaluationPeriods"
+    <*> getT "Statistic"
+    <*> members "AlarmActions" text
+    <*> getT "Unit"
+    <*> getT "StateReason"
+    <*> members "Dimensions" sinkDimension
+    <*> getT "ComparisonOperator"
+    <*> getT "MetricName"
+
+describeAlarmsForMetric
+    :: (MonadBaseControl IO m, MonadResource m)
+    => [Dimension] -- ^ The list of dimensions associated with the metric.
+    -> Text -- ^ The name of the metric.
+    -> Text -- ^ The namespace of the metric.
+    -> Int -- ^ The period in seconds over which the statistic is applied.
+    -> Statistic -- ^ The statistic for the metric.
+    -> Maybe Text -- ^  The unit for the metric.
+    -> CloudWatch m [MetricAlarm]
+describeAlarmsForMetric dims name ns period stat unit =
+    cloudWatchQuery "DescribeAlarmsForMetric" params $ members "MetricAlarms" sinkMetricAlarm
+  where
+    params =
+        [ "Dimensions.member" |.#. map fromDimension dims
+        , "MetricName" |= name
+        , "Namespace" |= ns
+        , "Period" |= toText period
+        , "Statistic" |= stringifyStatistic stat
+        , "Unit" |=? unit
+        ]
+
+putMetricAlarm
+    :: (MonadBaseControl IO m, MonadResource m)
+    => PutMetricAlarmRequest
+    -> CloudWatch m ()
+putMetricAlarm PutMetricAlarmRequest{..} =
+    cloudWatchQuery "PutMetricAlarm" params $ getT_ "PutMetricAlarmResult"
+  where
+    params =
+        [ "ActionsEnabled" |=? boolToText <$> putMetricAlarmActionsEnabled
+        , "AlarmActions.member" |.#= putMetricAlarmAlarmActions
+        , "AlarmDescription" |=? putMetricAlarmAlarmDescription
+        , "AlarmName" |= putMetricAlarmAlarmName
+        , "ComparisonOperator" |= toText putMetricAlarmComparisonOperator
+        , "Dimensions.member" |.#. map fromDimension putMetricAlarmDimensions
+        , "EvaluationPeriods" |= toText putMetricAlarmEvaluationPeriods
+        , "InsufficientDataActions.member" |.#= putMetricAlarmInsufficientDataActions
+        , "MetricName" |= putMetricAlarmMetricName
+        , "Namespace" |= putMetricAlarmNamespace
+        , "OKActions.member" |.#= putMetricAlarmOKActions
+        , "Period" |= toText putMetricAlarmPeriod
+        , "Statistic" |= stringifyStatistic putMetricAlarmStatistic
+        , "Threshold" |= toText putMetricAlarmThreshold
+        , "Unit" |=? putMetricAlarmUnit
+        ]
+
+deleteAlarms
+    :: (MonadBaseControl IO m, MonadResource m)
+    => [Text] -- ^ A list of alarms to be deleted.
+    -> CloudWatch m ()
+deleteAlarms names = cloudWatchQuery "DeleteAlarms" ["AlarmNames.member" |.#= names] $ return ()
+
+describeAlarmHistory
+    :: (MonadBaseControl IO m, MonadResource m)
+    => Maybe Text -- ^ The name of the alarm.
+    -> Maybe UTCTime -- ^ The ending date to retrieve alarm history.
+    -> Maybe HistoryType -- ^ The type of alarm histories to retrieve.
+    -> Maybe Int -- ^ The maximum number of alarm history records to retrieve.
+    -> Maybe Text -- ^ The token returned by a previous call to indicate that there is more data available.
+    -> Maybe UTCTime -- ^ The starting date to retrieve alarm history.
+    -> CloudWatch m ([AlarmHistory], Maybe Text)
+describeAlarmHistory alarm endDate type_ maxRecords nextToken startDate =
+    cloudWatchQuery "DescribeAlarmHistory" params $
+        (,) <$> members "AlarmHistoryItems" sinkAlarmHistory <*> getT "NextToken"
+  where
+    params =
+        [ "AlarmName" |=? alarm
+        , "EndDate" |=? timeToText <$> endDate
+        , "HistoryItemType" |=? stringifyHistoryType <$> type_
+        , "MaxRecords" |=? toText <$> maxRecords
+        , "NextToken" |=? nextToken
+        , "StartDate" |=? timeToText <$> startDate
+        ]
+
+stringifyHistoryType :: HistoryType -> Text
+stringifyHistoryType HistoryTypeConfigurationUpdate = "ConfigurationUpdate"
+stringifyHistoryType HistoryTypeStateUpdate = "StateUpdate"
+stringifyHistoryType HistoryTypeAction = "Action"
+
+sinkAlarmHistory :: MonadThrow m => GLSink Event m AlarmHistory
+sinkAlarmHistory =
+    AlarmHistory
+    <$> getT "Timestamp"
+    <*> getT "HistoryItemType"
+    <*> getT "AlarmName"
+    <*> getT "HistoryData"
+    <*> getT "HistorySummary"
+
+enableAlarmActions
+    :: (MonadBaseControl IO m, MonadResource m)
+    => [Text] -- ^ The names of the alarms to enable actions for.
+    -> CloudWatch m ()
+enableAlarmActions alarms =
+    cloudWatchQuery "EnableAlarmActions" ["AlarmNames.member" |.#= alarms] $ return ()
+
+disableAlarmActions
+    :: (MonadBaseControl IO m, MonadResource m)
+    => [Text] -- ^ The names of the alarms to enable actions for.
+    -> CloudWatch m ()
+disableAlarmActions alarms =
+    cloudWatchQuery "DisableAlarmActions" ["AlarmNames.member" |.#= alarms] $ return ()
+
+setAlarmState
+    :: (MonadBaseControl IO m, MonadResource m)
+    => Text -- ^ The name for the alarm.
+    -> Text -- ^ The reason that this alarm is set to this specific state (in human-readable text format) 
+    -> Text -- ^ The reason that this alarm is set to this specific state (in machine-readable JSON format)
+    -> StateValue -- ^ The value of the state.
+    -> CloudWatch m ()
+setAlarmState alarm reason dat state =
+    cloudWatchQuery "SetAlarmState" params $ return ()
+  where
+    params =
+        [ "AlarmName" |= alarm
+        , "StateReason" |= reason
+        , "StateReasonData" |= dat
+        , "StateValue" |= stringifyStateValue state
+        ]
diff --git a/AWS/CloudWatch/Internal.hs b/AWS/CloudWatch/Internal.hs
--- a/AWS/CloudWatch/Internal.hs
+++ b/AWS/CloudWatch/Internal.hs
@@ -1,8 +1,9 @@
-{-# LANGUAGE FlexibleContexts, RankNTypes #-}
+{-# LANGUAGE FlexibleContexts, RankNTypes, RecordWildCards #-}
 
 module AWS.CloudWatch.Internal
     where
 
+import Control.Applicative
 import Data.ByteString (ByteString)
 import Data.Text (Text)
 import Data.Conduit
@@ -12,7 +13,9 @@
 import AWS.Class
 import AWS.Lib.Query
 import AWS.Lib.Parser
+import AWS.CloudWatch.Types
 
+-- | Ver.2010-08-01
 apiVersion :: ByteString
 apiVersion = "2010-08-01"
 
@@ -31,3 +34,19 @@
     -> GLSink Event m a
     -> GLSink Event m [a]
 elements name f = element (name <> "s") $ listConsumer name f
+
+sinkDimension :: MonadThrow m => GLSink Event m Dimension
+sinkDimension = Dimension <$> getT "Name" <*> getT "Value"
+
+fromDimension :: Dimension -> [QueryParam]
+fromDimension Dimension{..} =
+    [ "Name" |= dimensionName
+    , "Value" |= dimensionValue
+    ]
+
+stringifyStatistic :: Statistic -> Text
+stringifyStatistic StatisticAverage     = "Average"
+stringifyStatistic StatisticSum         = "Sum"
+stringifyStatistic StatisticSampleCount = "SampleCount"
+stringifyStatistic StatisticMaximum     = "Maximum"
+stringifyStatistic StatisticMinimum     = "Minimum"
diff --git a/AWS/CloudWatch/Metric.hs b/AWS/CloudWatch/Metric.hs
--- a/AWS/CloudWatch/Metric.hs
+++ b/AWS/CloudWatch/Metric.hs
@@ -1,13 +1,15 @@
-{-# LANGUAGE FlexibleContexts, RankNTypes #-}
+{-# LANGUAGE FlexibleContexts, RankNTypes, RecordWildCards #-}
 
 module AWS.CloudWatch.Metric
     ( listMetrics
     , getMetricStatistics
+    , putMetricData
     ) where
 
 import Data.Text (Text)
 import Data.Time (UTCTime)
 import Data.Conduit
+import Data.XML.Types (Event)
 import Control.Applicative
 
 import AWS.Util
@@ -31,15 +33,9 @@
     -> Maybe Text -- ^ MetricName
     -> Maybe Text -- ^ Namespace
     -> Maybe Text -- ^ NextToken
-    -> CloudWatch m [Metric]
+    -> CloudWatch m ([Metric], Maybe Text)
 listMetrics ds mn ns nt = cloudWatchQuery "ListMetrics" params $
-    members "Metrics" $ Metric
-        <$> members "Dimensions" (Dimension
-            <$> getT "Name"
-            <*> getT "Value"
-            )
-        <*> getT "MetricName"
-        <*> getT "Namespace"
+    (,) <$> members "Metrics" sinkMetric <*> getT "NextToken"
   where
     params =
         [ dimensionFiltersParam ds
@@ -48,6 +44,13 @@
         , "NextToken" |=? nt
         ]
 
+sinkMetric :: MonadThrow m => GLSink Event m Metric
+sinkMetric =
+    Metric
+    <$> members "Dimensions" sinkDimension
+    <*> getT "MetricName"
+    <*> getT "Namespace"
+
 getMetricStatistics
     :: (MonadBaseControl IO m, MonadResource m)
     => [DimensionFilter]
@@ -79,11 +82,40 @@
         , "MetricName" |= mn
         , "Namespace" |= ns
         , "Period" |= toText pe
-        , "Statistics" |.+ "member" |.#= map s sts
+        , "Statistics" |.+ "member" |.#= map stringifyStatistic sts
         , "Unit" |=? unit
         ]
-    s StatisticAverage     = "Average"
-    s StatisticSum         = "Sum"
-    s StatisticSampleCount = "SampleCount"
-    s StatisticMaximum     = "Maximum"
-    s StatisticMinimum     = "Minimum"
+
+putMetricData
+    :: (MonadBaseControl IO m, MonadResource m)
+    => [MetricDatum] -- ^ A list of data describing the metric.
+    -> Text -- ^ The namespace for the metric data.
+    -> CloudWatch m ()
+putMetricData dats ns =
+    cloudWatchQuery "PutMetricData" params $ return ()
+  where
+    params =
+        [ "MetricData.member" |.#. map fromMetricDatum dats
+        , "Namespace" |= ns
+        ]
+
+fromMetricDatum :: MetricDatum -> [QueryParam]
+fromMetricDatum MetricDatum{..} =
+    [ "Dimensions.member" |.#. map fromDimension metricDatumDimensions
+    , "MetricName" |= metricDatumMetricName
+    , metricDatumValueParam metricDatumValue
+    , "Timestamp" |=? timeToText <$> metricDatumTimestamp
+    , "Unit" |=? metricDatumUnit
+    ]
+
+metricDatumValueParam :: MetricDatumValue -> QueryParam
+metricDatumValueParam (MetricDatumValue v) = "Value" |= toText v
+metricDatumValueParam (MetricDatumStatisticValues s) = "StatisticValues" |. fromStatisticSet s
+
+fromStatisticSet :: StatisticSet -> [QueryParam]
+fromStatisticSet StatisticSet{..} =
+    [ "Maximum" |= toText statisticSetMaximum
+    , "Minimum" |= toText statisticSetMinimum
+    , "SampleCount" |= toText statisticSetSampleCount
+    , "Sum" |= toText statisticSetSum
+    ]
diff --git a/AWS/CloudWatch/Types.hs b/AWS/CloudWatch/Types.hs
--- a/AWS/CloudWatch/Types.hs
+++ b/AWS/CloudWatch/Types.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE TemplateHaskell #-}
 module AWS.CloudWatch.Types
     where
 
@@ -35,7 +36,8 @@
     | StatisticSampleCount
     | StatisticMaximum
     | StatisticMinimum
-  deriving (Show, Eq)
+  deriving (Show, Eq, Read)
+deriveFromText "Statistic" ["Average", "Sum", "SampleCount", "Maximum", "Minimum"]
 
 allStatistics :: [Statistic]
 allStatistics =
@@ -45,3 +47,111 @@
     , StatisticMaximum
     , StatisticMinimum
     ]
+
+data AlarmNameSpec
+    = AlarmSpecNothing
+    | AlarmSpecNamePrefix Text
+    | AlarmSpecNames [Text]
+  deriving (Show, Eq)
+
+data StateValue
+    = StateValueOk
+    | StateValueAlarm
+    | StateValueInsufficientData
+  deriving (Show, Eq, Read)
+deriveFromText "StateValue" ["OK", "ALARM", "INSUFFICIENT_DATA"]
+
+data ComparisonOperator
+    = GreaterThanOrEqualToThreshold
+    | GreaterThanThreshold
+    | LessThanThreshold
+    | LessThanOrEqualToThreshold
+  deriving (Show, Eq, Read)
+deriveFromText "ComparisonOperator"
+    [ "GreaterThanOrEqualToThreshold"
+    , "GreaterThanThreshold"
+    , "LessThanThreshold"
+    , "LessThanOrEqualToThreshold"
+    ]
+
+data MetricAlarm = MetricAlarm
+    { metricAlarmAlarmDescription :: Maybe Text
+    , metricAlarmStateUpdatedTimestamp :: UTCTime
+    , metricAlarmInsufficientDataActions :: [Text]
+    , metricAlarmStateReasonData :: Maybe Text
+    , metricAlarmAlarmArn :: Text
+    , metricAlarmConfigurationUpdatedTimestamp :: UTCTime
+    , metricAlarmAlarmName :: Text
+    , metricAlarmStateValue :: StateValue
+    , metricAlarmPeriod :: Int
+    , metricAlarmOKActions :: [Text]
+    , metricAlarmActionsEnabled :: Bool
+    , metricAlarmNamespace :: Text
+    , metricAlarmThreshold :: Double
+    , metricAlarmEvaluationPeriods :: Int
+    , metricAlarmStatistic :: Statistic
+    , metricAlarmAlarmActions :: [Text]
+    , metricAlarmUnit :: Maybe Text
+    , metricAlarmStateReason :: Maybe Text
+    , metricAlarmDimensions :: [Dimension]
+    , metricAlarmComparisonOperator :: ComparisonOperator
+    , metricAlarmMetricName :: Text
+    }
+  deriving (Show, Eq)
+
+data PutMetricAlarmRequest = PutMetricAlarmRequest
+    { putMetricAlarmActionsEnabled :: Maybe Bool
+    , putMetricAlarmAlarmActions :: [Text]
+    , putMetricAlarmAlarmDescription :: Maybe Text
+    , putMetricAlarmAlarmName :: Text
+    , putMetricAlarmComparisonOperator :: ComparisonOperator
+    , putMetricAlarmDimensions :: [Dimension]
+    , putMetricAlarmEvaluationPeriods :: Int
+    , putMetricAlarmInsufficientDataActions :: [Text]
+    , putMetricAlarmMetricName :: Text
+    , putMetricAlarmNamespace :: Text
+    , putMetricAlarmOKActions :: [Text]
+    , putMetricAlarmPeriod :: Int
+    , putMetricAlarmStatistic :: Statistic
+    , putMetricAlarmThreshold :: Double
+    , putMetricAlarmUnit :: Maybe Text
+    }
+  deriving (Show, Eq)
+
+data AlarmHistory = AlarmHistory
+    { alarmHistoryTimestamp :: UTCTime
+    , alarmHistoryHistoryItemType :: HistoryType
+    , alarmHistoryAlarmName :: Text
+    , alarmHistoryHistoryData :: Text
+    , alarmHistoryHistorySummary :: Text
+    }
+  deriving (Show, Eq)
+
+data HistoryType
+    = HistoryTypeConfigurationUpdate
+    | HistoryTypeStateUpdate
+    | HistoryTypeAction
+  deriving (Show, Eq, Read)
+deriveFromText "HistoryType" ["ConfigurationUpdate", "StateUpdate", "Action"]
+
+data MetricDatum = MetricDatum
+    { metricDatumDimensions :: [Dimension]
+    , metricDatumMetricName :: Text
+    , metricDatumTimestamp :: Maybe UTCTime
+    , metricDatumUnit :: Maybe Text
+    , metricDatumValue :: MetricDatumValue
+    }
+  deriving (Show, Eq)
+
+data MetricDatumValue
+    = MetricDatumValue Double
+    | MetricDatumStatisticValues StatisticSet
+  deriving (Show, Eq)
+
+data StatisticSet = StatisticSet
+    { statisticSetMaximum :: Double
+    , statisticSetMinimum :: Double
+    , statisticSetSampleCount :: Double
+    , statisticSetSum :: Double
+    }
+  deriving (Show, Eq)
diff --git a/AWS/EC2.hs b/AWS/EC2.hs
--- a/AWS/EC2.hs
+++ b/AWS/EC2.hs
@@ -5,8 +5,10 @@
     ( -- * EC2 Environment
       EC2
     , runEC2
+    , runEC2withManager
     , setRegion
     , setEndpoint
+    , apiVersion
       -- * Instances
     , module AWS.EC2.Instance
       -- * Images
@@ -27,6 +29,7 @@
       -- * Placements
     , module AWS.EC2.Region
     , module AWS.EC2.AvailabilityZone
+    , module AWS.EC2.PlacementGroup
       -- * Tags
     , module AWS.EC2.Tag
       -- * VPC
@@ -35,7 +38,6 @@
     , module AWS.EC2.Acl
     , module AWS.EC2.RouteTable
     , module AWS.EC2.Route
-    , module AWS.EC2.PlacementGroup
       -- * Tasks
     , module AWS.EC2.ConversionTask
     ) where
@@ -50,6 +52,7 @@
 import AWS.EC2.Internal
 import AWS.EC2.Types
 import qualified AWS.EC2.Util as Util
+import AWS.EC2.Query (apiVersion)
 
 import AWS.EC2.Image
 import AWS.EC2.Region
diff --git a/AWS/EC2/Acl.hs b/AWS/EC2/Acl.hs
--- a/AWS/EC2/Acl.hs
+++ b/AWS/EC2/Acl.hs
@@ -111,7 +111,7 @@
         , "RuleAction" |=
             ruleToText (networkAclEntryRequestRuleAction req)
         , "CidrBlock" |=
-            networkAclEntryRequestCidrBlock req
+            toText (networkAclEntryRequestCidrBlock req)
         , "Egress" |=
             boolToText (networkAclEntryRequestEgress req)
         , "Icmp" |.? icmpParams <$> networkAclEntryRequestIcmp req
diff --git a/AWS/EC2/Internal.hs b/AWS/EC2/Internal.hs
--- a/AWS/EC2/Internal.hs
+++ b/AWS/EC2/Internal.hs
@@ -6,7 +6,7 @@
     , EC2
     , initialEC2Context
     , runEC2
-    , runEC2'
+    , runEC2withManager
     , itemConduit
     , itemsSet
     , resourceTagSink
@@ -45,9 +45,10 @@
 runEC2 :: MonadIO m => Credential -> AWS AWSContext m a -> m a
 runEC2 = runAWS initialEC2Context
 
-runEC2' :: Monad m
+runEC2withManager :: Monad m
     => HTTP.Manager -> Credential -> AWS AWSContext m a -> m a
-runEC2' mgr = runAWS' mgr initialEC2Context
+runEC2withManager mgr =
+    runAWSwithManager mgr initialEC2Context
 
 itemConduit :: MonadThrow m
     => Text
diff --git a/AWS/EC2/Query.hs b/AWS/EC2/Query.hs
--- a/AWS/EC2/Query.hs
+++ b/AWS/EC2/Query.hs
@@ -4,9 +4,6 @@
     ( ec2Query
     , ec2QuerySource
     , ec2QuerySource'
-#ifdef DEBUG
-    , ec2QueryDebug
-#endif
     , ec2Delete
     , module AWS.Lib.Query
     , apiVersion
@@ -20,25 +17,18 @@
 import qualified Data.Conduit.List as CL
 import qualified Text.XML.Stream.Parse as XmlP
 import Control.Monad.Trans.Class (lift)
-import Control.Monad.IO.Class (MonadIO)
 import qualified Control.Monad.State as State
 import qualified Control.Monad.Reader as Reader
 import Control.Exception.Lifted as E
 import Data.Text (Text)
 import Control.Applicative
-import Data.Conduit.Internal as CI
 
 import AWS.Class
 import AWS.EC2.Internal
 import AWS.Lib.Parser hiding (sinkError)
 import AWS.Lib.Query
 
-#ifdef DEBUG
-import Debug.Trace
-import Control.Monad.IO.Class (liftIO)
-import qualified Data.Conduit.Binary as CB
-#endif
-
+-- | Ver.2012-12-01
 apiVersion :: ByteString
 apiVersion = "2012-12-01"
 
@@ -77,14 +67,6 @@
 ec2QuerySource action params cond = do
     ec2QuerySource' action params Nothing cond
 
-($=+) :: MonadIO m
-    => ResumableSource m a
-    -> Conduit a m b
-    -> m (ResumableSource m b)
-a $=+ b = do
-    (sa, fa) <- unwrapResumable a
-    return $ CI.ResumableSource (sa $= b) fa
-
 ec2QuerySource'
     :: (MonadResource m, MonadBaseControl IO m)
     => ByteString
@@ -106,15 +88,6 @@
 
 nextToken :: MonadThrow m => Conduit Event m o
 nextToken = getT "nextToken" >>= maybe (return ()) (E.throw . NextToken)
-
-#ifdef DEBUG
-ec2QueryDebug
-    :: (MonadResource m, MonadBaseControl IO m)
-    => ByteString
-    -> [QueryParam]
-    -> EC2 m a
-ec2QueryDebug = debugQuery apiVersion
-#endif
 
 ec2Delete
     :: (MonadResource m, MonadBaseControl IO m)
diff --git a/AWS/EC2/Types/Acl.hs b/AWS/EC2/Types/Acl.hs
--- a/AWS/EC2/Types/Acl.hs
+++ b/AWS/EC2/Types/Acl.hs
@@ -41,7 +41,7 @@
     , networkAclEntryProtocol :: Int
     , networkAclEntryRuleAction :: NetworkAclRuleAction
     , networkAclEntryEgress :: Bool
-    , networkAclEntryCidrBlock :: Text
+    , networkAclEntryCidrBlock :: AddrRange IPv4
     , networkAclEntryIcmpTypeCode :: Maybe IcmpTypeCode
     , networkAclEntryPortRange :: Maybe PortRange
     }
@@ -54,7 +54,7 @@
       -- ^ Protocol Number <http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xml>
     , networkAclEntryRequestRuleAction :: NetworkAclRuleAction
     , networkAclEntryRequestEgress :: Bool
-    , networkAclEntryRequestCidrBlock :: Text
+    , networkAclEntryRequestCidrBlock :: AddrRange IPv4
     , networkAclEntryRequestIcmp :: Maybe IcmpTypeCode
     , networkAclEntryRequestPortRange :: Maybe PortRange
     }
diff --git a/AWS/ELB.hs b/AWS/ELB.hs
--- a/AWS/ELB.hs
+++ b/AWS/ELB.hs
@@ -4,7 +4,7 @@
     ( -- * ELB Environment
       ELB
     , runELB
-    , runELB'
+    , runELBwithManager
     , setRegion
     , apiVersion
       -- * LoadBalancer
@@ -35,9 +35,9 @@
 runELB :: MonadIO m => Credential -> ELB m a -> m a
 runELB = runAWS initialELBContext
 
-runELB' :: Monad m
+runELBwithManager :: Monad m
     => HTTP.Manager -> Credential -> ELB m a -> m a
-runELB' mgr = runAWS' mgr initialELBContext
+runELBwithManager mgr = runAWSwithManager mgr initialELBContext
 
 setRegion
     :: (MonadBaseControl IO m, MonadResource m)
diff --git a/AWS/ELB/Internal.hs b/AWS/ELB/Internal.hs
--- a/AWS/ELB/Internal.hs
+++ b/AWS/ELB/Internal.hs
@@ -10,6 +10,7 @@
 import AWS.Class
 import AWS.Lib.Query
 
+-- | Ver.2012-06-01
 apiVersion :: ByteString
 apiVersion = "2012-06-01"
 
diff --git a/AWS/Lib/Parser.hs b/AWS/Lib/Parser.hs
--- a/AWS/Lib/Parser.hs
+++ b/AWS/Lib/Parser.hs
@@ -120,8 +120,12 @@
 sinkResponse action sink = do
     sinkEventBeginDocument
     element (action <> "Response") $ (,)
-        <$> element (action <> "Result") sink -- XXX: parse Marker
+        <$> sinkResult
         <*> sinkResponseMetadata
+  where
+    sinkResult =
+        elementM (action <> "Result") sink -- XXX: parse Marker. This marker may not occur (e.g., PutMetricAlarm).
+        >>= maybe sink return
 
 sinkResponseMetadata
     :: MonadThrow m
diff --git a/AWS/Lib/Query.hs b/AWS/Lib/Query.hs
--- a/AWS/Lib/Query.hs
+++ b/AWS/Lib/Query.hs
@@ -12,11 +12,9 @@
     , (|=), (|.)
     , (|=?), (|.?)
     , (|.#=), (|.#.)
+    , ($=+)
     , requestQuery
     , commonQuery
-#ifdef DEBUG
-    , debugQuery
-#endif
     , textToBS
     ) where
 
@@ -31,6 +29,7 @@
 import Data.Monoid
 import Data.XML.Types (Event(..))
 import Data.Conduit
+import qualified Data.Conduit.Internal as CI
 import qualified Network.HTTP.Conduit as HTTP
 import qualified Text.XML.Stream.Parse as XmlP
 import Data.Time (UTCTime, formatTime, getCurrentTime)
@@ -53,7 +52,7 @@
 import AWS.EC2.Types (Filter)
 
 #ifdef DEBUG
-import qualified Data.Conduit.Binary as CB
+import qualified System.IO as IO
 #endif
 
 data QueryParam
@@ -206,6 +205,14 @@
 clientError status rsrc errSink =
     rsrc $$+- XmlP.parseBytes XmlP.def =$ errSink status
 
+($=+) :: MonadIO m
+    => ResumableSource m a
+    -> Conduit a m b
+    -> m (ResumableSource m b)
+a $=+ b = do
+    (sa, fa) <- unwrapResumable a
+    return $ CI.ResumableSource (sa $= b) fa
+
 requestQuery
     :: (MonadResource m, MonadBaseControl IO m)
     => Credential
@@ -221,16 +228,46 @@
     time <- liftIO getCurrentTime
     let url = mkUrl ep cred time action params ver
     request <- liftIO $ HTTP.parseUrl (BSC.unpack url)
-    let req = request { HTTP.checkStatus = checkStatus' }
+    let req = request
+            { HTTP.checkStatus = checkStatus'
+            , HTTP.responseTimeout = Just 30000000
+            }
     response <- HTTP.http req mgr
     let body = HTTP.responseBody response
     let st = H.statusCode $ HTTP.responseStatus response
     if st < 400
+#ifdef DEBUG
+        then body $=+ conduitLog "aws-sdk.log" url
+        else do
+            body' <- body $=+ conduitLog "aws-sdk-error.log" url
+            clientError st body' $ errSink action
+            fail "not reached"
+#else
         then return body
         else do
             clientError st body $ errSink action
             fail "not reached"
+#endif
 
+#ifdef DEBUG
+conduitLog :: MonadResource m => FilePath -> ByteString -> GInfConduit ByteString m ByteString
+conduitLog path url = bracketP (E.try $ IO.openBinaryFile path IO.AppendMode) release go
+  where
+    release :: Either SomeException IO.Handle -> IO ()
+    release (Left _) = return ()
+    release (Right h) = do
+        liftIO $ BSC.hPutStrLn h ""
+        IO.hClose h
+
+    go :: MonadResource m => Either SomeException IO.Handle -> GInfConduit ByteString m ByteString
+    go (Left _) = awaitForever yield
+    go (Right h) = do
+        liftIO $ do
+            time <- getCurrentTime
+            BSC.hPutStrLn h $ "[" <> awsTimeFormat time <> "] " <> url
+        awaitForever $ \bs -> liftIO (BS.hPut h bs) >> yield bs
+#endif
+
 commonQuery
     :: (MonadBaseControl IO m, MonadResource m)
     => ByteString -- ^ apiVersion
@@ -246,25 +283,3 @@
         XmlP.parseBytes XmlP.def =$ sinkResponse (bsToText action) sink
     State.put ctx { lastRequestId = Just rid }
     return res
-
-#ifdef DEBUG
-debugQuery
-    :: (MonadBaseControl IO m, MonadResource m)
-    => ByteString -- ^ apiVersion
-    -> ByteString -- ^ Action
-    -> [QueryParam]
-    -> AWS AWSContext m a
-debugQuery ver action params = do
-    ctx <- State.get
-    cred <- Reader.ask
-    let mgr = manager ctx
-    let ep = endpoint ctx
-    time <- liftIO getCurrentTime
-    let url = mkUrl ep cred time action params ver
-    liftIO $ print url
-    request <- liftIO $ HTTP.parseUrl (BSC.unpack url)
-    let req = request { HTTP.checkStatus = checkStatus' }
-    response <- lift $ HTTP.http req mgr
-    lift $ HTTP.responseBody response $$+- CB.sinkFile "debug.txt"
-    fail "debug"
-#endif
diff --git a/AWS/RDS.hs b/AWS/RDS.hs
--- a/AWS/RDS.hs
+++ b/AWS/RDS.hs
@@ -4,7 +4,7 @@
     ( -- * RDS Environment
       RDS
     , runRDS
-    , runRDS'
+    , runRDSwithManager
     , setRegion
       -- * DBInstance
     , module AWS.RDS.DBInstance
@@ -49,9 +49,9 @@
 runRDS :: MonadIO m => Credential -> RDS m a -> m a
 runRDS = runAWS initialRDSContext
 
-runRDS' :: Monad m
+runRDSwithManager :: Monad m
     => HTTP.Manager -> Credential -> RDS m a -> m a
-runRDS' mgr = runAWS' mgr initialRDSContext
+runRDSwithManager mgr = runAWSwithManager mgr initialRDSContext
 
 setRegion
     :: (MonadBaseControl IO m, MonadResource m)
diff --git a/AWS/RDS/DBInstance.hs b/AWS/RDS/DBInstance.hs
--- a/AWS/RDS/DBInstance.hs
+++ b/AWS/RDS/DBInstance.hs
@@ -1,7 +1,10 @@
-{-# LANGUAGE FlexibleContexts, RankNTypes #-}
+{-# LANGUAGE FlexibleContexts, RankNTypes, RecordWildCards #-}
 
 module AWS.RDS.DBInstance
     ( describeDBInstances
+    , createDBInstance
+    , deleteDBInstance
+    , createDBInstanceReadReplica
     ) where
 
 import Data.Text (Text)
@@ -24,7 +27,8 @@
     -> Maybe Text -- ^ Marker
     -> RDS m [DBInstance]
 describeDBInstances dbid maxRecords marker =
-    rdsQuery "DescribeDBInstances" params sinkDBInstances
+    rdsQuery "DescribeDBInstances" params $
+        elements "DBInstance" sinkDBInstance
   where
     params =
         [ "DBInstanceIdentifier" |=? dbid
@@ -32,11 +36,10 @@
         , "Marker" |=? marker
         ]
 
-sinkDBInstances
+sinkDBInstance
     :: MonadThrow m
-    => GLSink Event m [DBInstance]
-sinkDBInstances = elements "DBInstance" $
-    DBInstance
+    => GLSink Event m DBInstance
+sinkDBInstance = DBInstance
     <$> getT "Iops"
     <*> getT "BackupRetentionPeriod"
     <*> getT "DBInstanceStatus"
@@ -97,9 +100,105 @@
         , f PMVMultiAZ "MultiAZ"
         , f PMVAllocatedStorage "AllocatedStorage"
         , f PMVEngineVersion "EngineVersion"
+        , f PMVDBInstanceIdentifier "DBInstanceIdentifier"
         , f PMVDBInstanceClass "DBInstanceClass"
         , f PMVBackupRetentionPeriod "BackupRetentionPeriod"
         , f PMVPort "Port"
         ]
   where
     f c name = fmap c <$> getT name
+
+createDBInstance
+    :: (MonadBaseControl IO m, MonadResource m)
+    => CreateDBInstanceRequest -- ^ data type of CreateDBInstance
+    -> RDS m DBInstance
+createDBInstance CreateDBInstanceRequest{..} =
+    rdsQuery "CreateDBInstance" params $
+        element "DBInstance" sinkDBInstance
+  where
+    params =
+        [ "AllocatedStorage" |=
+            toText createDBInstanceAllocatedStorage
+        , "AutoMinorVersionUpgrade" |=?
+            boolToText <$> createDBInstanceAutoMinorVersionUpgrade
+        , "AvailabilityZone" |=?
+            createDBInstanceAvailabilityZone
+        , "BackupRetentionPeriod" |=?
+            toText <$> createDBInstanceBackupRetentionPeriod
+        , "CharacterSetName" |=?
+            createDBInstanceCharacterSetName
+        , "DBInstanceClass" |=
+            toText createDBInstanceDBInstanceClass
+        , "DBInstanceIdentifier" |=
+            createDBInstanceDBInstanceIdentifier
+        , "DBName" |=? createDBInstanceDBName
+        , "DBParameterGroupName" |=?
+            createDBInstanceDBParameterGroupName
+        , "DBSecurityGroups.member" |.#=
+            createDBInstanceDBSecurityGroups
+        , "DBSubnetGroupName" |=?
+            createDBInstanceDBSubnetGroupName
+        , "Engine" |= toText createDBInstanceEngine
+        , "EngineVersion" |=? createDBInstanceEngineVersion
+        , "Iops" |=? toText <$> createDBInstanceIops
+        , "LicenseModel" |=?
+            toText <$> createDBInstanceLicenseModel
+        , "MasterUserPassword" |= createDBInstanceMasterUserPassword
+        , "MasterUsername" |= createDBInstanceMasterUsername
+        , "MultiAZ" |=? boolToText <$> createDBInstanceMultiAZ
+        , "OptionGroupName" |=? createDBInstanceOptionGroupName
+        , "Port" |=? toText <$> createDBInstancePort
+        , "PreferredBackupWindow" |=?
+            createDBInstancePreferredBackupWindow
+        , "PreferredMaintenanceWindow" |=?
+            createDBInstancePreferredMaintenanceWindow
+        , "PubliclyAccessible" |=?
+            boolToText <$> createDBInstancePubliclyAccessible
+        , "VpcSecurityGroupIds" |.#=
+            createDBInstanceVpcSecurityGroupIds
+        ]
+
+deleteDBInstance
+    :: (MonadBaseControl IO m, MonadResource m)
+    => Text -- ^ DBInstanceIdentifier
+    -> FinalSnapshot -- ^ FinalSnapshot
+    -> RDS m DBInstance
+deleteDBInstance dbiid final =
+    rdsQuery "DeleteDBInstance" params $
+        element "DBInstance" sinkDBInstance
+  where
+    params =
+        [ "DBInstanceIdentifier" |= dbiid
+        ] ++ finalSnapshotParams final
+    finalSnapshotParams SkipFinalSnapshot =
+        [ "SkipFinalSnapshot" |= boolToText True ]
+    finalSnapshotParams (FinalSnapshotIdentifier sid) =
+        [ "SkipFinalSnapshot" |= boolToText False
+        , "FinalSnapshotIdentifier" |= sid
+        ]
+
+createDBInstanceReadReplica
+    :: (MonadBaseControl IO m, MonadResource m)
+    => CreateReadReplicaRequest
+    -> RDS m DBInstance
+createDBInstanceReadReplica CreateReadReplicaRequest{..} =
+    rdsQuery "CreateDBInstanceReadReplica" params $
+        element "DBInstance" sinkDBInstance
+  where
+    params =
+        [ "AutoMinorVersionUpgrade" |=?
+            boolToText <$> createReadReplicaAutoMinorVersionUpgrade
+        , "AvailabilityZone" |=?
+            createReadReplicaAvailabilityZone
+        , "DBInstanceClass" |=
+            toText createReadReplicaDBInstanceClass
+        , "DBInstanceIdentifier" |=
+            createReadReplicaDBInstanceIdentifier
+        , "Iops" |=? toText <$> createReadReplicaIops
+        , "OptionGroupName" |=? createReadReplicaOptionGroupName
+        , "Port" |=? toText <$> createReadReplicaPort
+        , "PubliclyAccessible" |=?
+            boolToText <$> createReadReplicaPubliclyAccessible
+        , "SourceDBInstanceIdentifier" |=
+            createReadReplicaSourceDBInstanceIdentifier
+        ]
diff --git a/AWS/RDS/DBParameterGroup.hs b/AWS/RDS/DBParameterGroup.hs
--- a/AWS/RDS/DBParameterGroup.hs
+++ b/AWS/RDS/DBParameterGroup.hs
@@ -2,6 +2,8 @@
 
 module AWS.RDS.DBParameterGroup
     ( describeDBParameterGroups
+    , createDBParameterGroup
+    , deleteDBParameterGroup
     ) where
 
 import Control.Applicative ((<$>), (<*>))
@@ -9,9 +11,9 @@
 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.Lib.Parser (getT, element)
+import AWS.Lib.Query ((|=), (|=?))
+import AWS.RDS.Internal (RDS, rdsQuery, rdsQueryOnlyMetadata, elements)
 import AWS.RDS.Types hiding (Event)
 import AWS.Util (toText)
 
@@ -38,3 +40,27 @@
     <$> getT "DBParameterGroupFamily"
     <*> getT "Description"
     <*> getT "DBParameterGroupName"
+
+createDBParameterGroup
+    :: (MonadBaseControl IO m, MonadResource m)
+    => Text -- ^ DBParameterGroupFamily
+    -> Text -- ^ DBParameterGroupName
+    -> Text -- ^ Description
+    -> RDS m DBParameterGroup
+createDBParameterGroup family name desc =
+    rdsQuery "CreateDBParameterGroup" params $
+        element "DBParameterGroup" dbParameterGroupSink
+  where
+    params =
+        [ "DBParameterGroupFamily" |= family
+        , "DBParameterGroupName" |= name
+        , "Description" |= desc
+        ]
+
+deleteDBParameterGroup
+    :: (MonadBaseControl IO m, MonadResource m)
+    => Text -- ^ DBParameterGroupName
+    -> RDS m ()
+deleteDBParameterGroup name =
+    rdsQueryOnlyMetadata "DeleteDBParameterGroup"
+        ["DBParameterGroupName" |= name]
diff --git a/AWS/RDS/DBSecurityGroup.hs b/AWS/RDS/DBSecurityGroup.hs
--- a/AWS/RDS/DBSecurityGroup.hs
+++ b/AWS/RDS/DBSecurityGroup.hs
@@ -2,6 +2,8 @@
 
 module AWS.RDS.DBSecurityGroup
     ( describeDBSecurityGroups
+    , createDBSecurityGroup
+    , deleteDBSecurityGroup
     ) where
 
 import Control.Applicative ((<$>), (<*>))
@@ -9,9 +11,9 @@
 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.Lib.Parser (getT, element)
+import AWS.Lib.Query ((|=), (|=?))
+import AWS.RDS.Internal (RDS, rdsQuery, rdsQueryOnlyMetadata, elements)
 import AWS.RDS.Types hiding (Event)
 import AWS.Util (toText)
 
@@ -38,8 +40,8 @@
     <$> elements "EC2SecurityGroup" (
         EC2SecurityGroup
         <$> getT "Status"
-        <*> getT "EC2SecurityGroupOwnerId"
         <*> getT "EC2SecurityGroupName"
+        <*> getT "EC2SecurityGroupOwnerId"
         <*> getT "EC2SecurityGroupId"
         )
     <*> getT "DBSecurityGroupDescription"
@@ -51,3 +53,25 @@
     <*> getT "VpcId"
     <*> getT "OwnerId"
     <*> getT "DBSecurityGroupName"
+
+createDBSecurityGroup
+    :: (MonadBaseControl IO m, MonadResource m)
+    => Text -- ^ DBSecurityGroupName
+    -> Text -- ^ DBSecurityGroupDescription
+    -> RDS m DBSecurityGroup
+createDBSecurityGroup name desc =
+    rdsQuery "CreateDBSecurityGroup" params $
+        element "DBSecurityGroup" dbSecurityGroupSink
+  where
+    params =
+        [ "DBSecurityGroupName" |= name
+        , "DBSecurityGroupDescription" |= desc
+        ]
+
+deleteDBSecurityGroup
+    :: (MonadBaseControl IO m, MonadResource m)
+    => Text -- ^ DBSecurityGroupName
+    -> RDS m ()
+deleteDBSecurityGroup name =
+    rdsQueryOnlyMetadata "DeleteDBSecurityGroup"
+        ["DBSecurityGroupName" |= name]
diff --git a/AWS/RDS/DBSubnetGroup.hs b/AWS/RDS/DBSubnetGroup.hs
--- a/AWS/RDS/DBSubnetGroup.hs
+++ b/AWS/RDS/DBSubnetGroup.hs
@@ -2,13 +2,16 @@
 
 module AWS.RDS.DBSubnetGroup
     ( describeDBSubnetGroups
+    , createDBSubnetGroup
+    , deleteDBSubnetGroup
     ) where
 
 import Control.Applicative ((<$>))
 import Data.Conduit
 import Data.Text (Text)
 
-import AWS.Lib.Query ((|=?))
+import AWS.Lib.Parser (element)
+import AWS.Lib.Query ((|=), (|=?), (|.#=))
 import AWS.RDS.Internal
 import AWS.RDS.Types (DBSubnetGroup)
 import AWS.Util (toText)
@@ -28,3 +31,27 @@
         , "Marker" |=? marker
         , "MaxRecords" |=? toText <$> maxRecords
         ]
+
+createDBSubnetGroup
+    :: (MonadBaseControl IO m, MonadResource m)
+    => Text -- ^ DBSubnetGroupName
+    -> [Text] -- ^ SubnetIds
+    -> Text -- ^ DBSubnetGroupDescription
+    -> RDS m DBSubnetGroup
+createDBSubnetGroup name ids desc =
+    rdsQuery "CreateDBSubnetGroup" params $
+        element "DBSubnetGroup" dbSubnetGroupSink
+  where
+    params =
+        [ "DBSubnetGroupName" |= name
+        , "SubnetIds.member" |.#= ids
+        , "DBSubnetGroupDescription" |= desc
+        ]
+
+deleteDBSubnetGroup
+    :: (MonadBaseControl IO m, MonadResource m)
+    => Text -- ^ DBSubnetGroupName
+    -> RDS m ()
+deleteDBSubnetGroup name =
+    rdsQueryOnlyMetadata "DeleteDBSubnetGroup"
+        ["DBSubnetGroupName" |= name]
diff --git a/AWS/RDS/Internal.hs b/AWS/RDS/Internal.hs
--- a/AWS/RDS/Internal.hs
+++ b/AWS/RDS/Internal.hs
@@ -4,27 +4,31 @@
     ( apiVersion
     , RDS
     , rdsQuery
+    , rdsQueryOnlyMetadata
     , elements
     , elements'
-#ifdef DEBUG
-    , rdsQueryDebug
-#endif
     , dbSubnetGroupSink
     ) where
 
 import Control.Applicative ((<$>), (<*>))
+import qualified Control.Monad.Reader as Reader
+import qualified Control.Monad.State as State
+import Control.Monad.Trans.Class (lift)
 import Data.ByteString (ByteString)
 import Data.Text (Text)
 import Data.Conduit
 import Data.Monoid ((<>))
 import Data.XML.Types (Event(..))
 import Data.Maybe (fromMaybe)
+import qualified Text.XML.Stream.Parse as XmlP
 
 import AWS.Class
 import AWS.Lib.Query
 import AWS.Lib.Parser
 import AWS.RDS.Types (DBSubnetGroup(..), Subnet(..), AvailabilityZone(..))
+import AWS.Util
 
+-- | Ver.2013-01-10
 apiVersion :: ByteString
 apiVersion = "2013-01-10"
 
@@ -38,6 +42,29 @@
     -> RDS m a
 rdsQuery = commonQuery apiVersion
 
+rdsQueryOnlyMetadata
+    :: (MonadBaseControl IO m, MonadResource m)
+    => ByteString
+    -> [QueryParam]
+    -> RDS m ()
+rdsQueryOnlyMetadata action params = do
+    ctx <- State.get
+    cred <- Reader.ask
+    rs <- lift $ requestQuery cred ctx action params apiVersion sinkError
+    rid <- lift $ rs $$+-
+        XmlP.parseBytes XmlP.def =$
+            sinkResponseOnlyMetadata (bsToText action)
+    State.put ctx { lastRequestId = Just rid }
+    return ()
+
+sinkResponseOnlyMetadata
+    :: MonadThrow m
+    => Text
+    -> GLSink Event m RequestId
+sinkResponseOnlyMetadata action = do
+    sinkEventBeginDocument
+    element (action <> "Response") $ sinkResponseMetadata
+
 elements :: MonadThrow m
     => Text
     -> GLSink Event m a
@@ -51,15 +78,6 @@
     -> GLSink Event m [a]
 elements' setName itemName inner =
     fromMaybe [] <$> elementM setName (listConsumer itemName inner)
-
-#ifdef DEBUG
-rdsQueryDebug
-    :: (MonadResource m, MonadBaseControl IO m)
-    => ByteString
-    -> [QueryParam]
-    -> RDS m a
-rdsQueryDebug = debugQuery apiVersion
-#endif
 
 dbSubnetGroupSink
     :: MonadThrow m
diff --git a/AWS/RDS/Types/DBInstance.hs b/AWS/RDS/Types/DBInstance.hs
--- a/AWS/RDS/Types/DBInstance.hs
+++ b/AWS/RDS/Types/DBInstance.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE TemplateHaskell #-}
+
 module AWS.RDS.Types.DBInstance
     ( DBInstance(..)
     , VpcSecurityGroupMembership(..)
@@ -6,9 +8,15 @@
     , Endpoint(..)
     , OptionGroupMembership(..)
     , PendingModifiedValue(..)
+    , CreateDBInstanceRequest(..)
+    , DBInstanceClass(..)
+    , Engine(..)
+    , LicenseModel(..)
+    , FinalSnapshot(..)
+    , CreateReadReplicaRequest(..)
     ) where
 
-import AWS.Lib.FromText (Text, UTCTime)
+import AWS.Lib.FromText (Text, UTCTime, deriveFromText)
 import AWS.RDS.Types.DBSubnetGroup (DBSubnetGroup)
 
 data DBInstance = DBInstance
@@ -21,13 +29,13 @@
     , dbiPreferredBackupWindow :: Text
     , dbiPreferredMaintenanceWindow :: Text
     , dbiOptionGroupMembership :: Maybe OptionGroupMembership
-    , dbiAvailabilityZone :: Text
+    , dbiAvailabilityZone :: Maybe Text
     , dbiLatestRestorableTime :: Maybe UTCTime
     , dbiReadReplicaDBInstanceIdentifiers :: [Text]
-    , dbiEngine :: Text
+    , dbiEngine :: Engine
     , dbiPendingModifiedValues :: [PendingModifiedValue]
     , dbiCharacterSetName :: Maybe Text
-    , dbiLicenseModel :: Text
+    , dbiLicenseModel :: LicenseModel
     , dbiSubnetGroup :: Maybe DBSubnetGroup
     , dbiDBParameterGroups :: [DBParameterGroupStatus]
     , dbiEndpoint :: Maybe Endpoint
@@ -39,7 +47,7 @@
     , dbiDBName :: Maybe Text
     , dbiInstanceCreateTime :: Maybe UTCTime
     , dbiAllocatedStorage :: Int -- ^ storage size in gigabytes
-    , dbiDBInstanceClass :: Text
+    , dbiDBInstanceClass :: DBInstanceClass
     , dbiMasterUsername :: Text
     }
   deriving (Show, Eq)
@@ -83,4 +91,117 @@
     | PMVMasterUserPassword Text
     | PMVMultiAZ Bool
     | PMVPort Int
+    | PMVDBInstanceIdentifier Text
   deriving (Show, Eq)
+
+data CreateDBInstanceRequest = CreateDBInstanceRequest
+    { createDBInstanceAllocatedStorage :: Int
+    , createDBInstanceAutoMinorVersionUpgrade :: Maybe Bool
+    , createDBInstanceAvailabilityZone :: Maybe Text
+    , createDBInstanceBackupRetentionPeriod :: Maybe Int
+    , createDBInstanceCharacterSetName :: Maybe Text
+    , createDBInstanceDBInstanceClass :: DBInstanceClass
+    , createDBInstanceDBInstanceIdentifier :: Text
+    , createDBInstanceDBName :: Maybe Text
+    , createDBInstanceDBParameterGroupName :: Maybe Text
+    , createDBInstanceDBSecurityGroups :: [Text]
+    , createDBInstanceDBSubnetGroupName :: Maybe Text
+    , createDBInstanceEngine :: Engine
+    , createDBInstanceEngineVersion :: Maybe Text
+    , createDBInstanceIops :: Maybe Int
+    , createDBInstanceLicenseModel :: Maybe LicenseModel
+    , createDBInstanceMasterUserPassword :: Text
+    , createDBInstanceMasterUsername :: Text
+    , createDBInstanceMultiAZ :: Maybe Bool
+    , createDBInstanceOptionGroupName :: Maybe Text
+    , createDBInstancePort :: Maybe Int
+    , createDBInstancePreferredBackupWindow :: Maybe Text
+    , createDBInstancePreferredMaintenanceWindow :: Maybe Text
+    , createDBInstancePubliclyAccessible :: Maybe Bool
+    , createDBInstanceVpcSecurityGroupIds :: [Text]
+    }
+  deriving (Show, Eq)
+
+data DBInstanceClass
+    = DBt1micro
+    | DBm1small
+    | DBm1medium
+    | DBm1large
+    | DBm1xlarge
+    | DBm2xlarge
+    | DBm22xlarge
+    | DBm24xlarge
+  deriving (Read, Eq)
+
+instance Show DBInstanceClass where
+    show DBt1micro = "db.t1.micro"
+    show DBm1small = "db.m1.small"
+    show DBm1medium = "db.m1.medium"
+    show DBm1large = "db.m1.large"
+    show DBm1xlarge = "db.m1.xlarge"
+    show DBm2xlarge = "db.m2.xlarge"
+    show DBm22xlarge = "db.m2.2xlarge"
+    show DBm24xlarge = "db.m2.4xlarge"
+
+data Engine
+    = EngineMySQL
+    | EngineOracleSE1
+    | EngineOracleSE
+    | EngineOracleEE
+    | EngineSqlServerEE
+    | EngineSqlServerSE
+    | EngineSqlServerEX
+    | EngineSqlServerWeb
+  deriving (Read, Eq)
+
+instance Show Engine where
+    show EngineMySQL = "MySQL"
+    show EngineOracleSE1 = "oracle-se1"
+    show EngineOracleSE = "oracle-se"
+    show EngineOracleEE = "oracle-ee"
+    show EngineSqlServerEE = "sqlserver-ee"
+    show EngineSqlServerSE = "sqlserver-se"
+    show EngineSqlServerEX = "sqlserver-ex"
+    show EngineSqlServerWeb = "sqlserver-web"
+
+data LicenseModel
+    = LicenseIncluded
+    | BringYourOwnLicense
+    | GeneralPublicLicense
+  deriving (Read, Eq)
+
+instance Show LicenseModel where
+    show LicenseIncluded = "license-included"
+    show BringYourOwnLicense = "bring-your-own-license"
+    show GeneralPublicLicense = "general-public-license"
+
+data FinalSnapshot
+    = FinalSnapshotIdentifier Text
+    | SkipFinalSnapshot
+
+data CreateReadReplicaRequest = CreateReadReplicaRequest
+    { createReadReplicaAutoMinorVersionUpgrade :: Maybe Bool
+    , createReadReplicaAvailabilityZone :: Maybe Text
+    , createReadReplicaDBInstanceClass :: DBInstanceClass
+    , createReadReplicaDBInstanceIdentifier :: Text
+    , createReadReplicaIops :: Maybe Int
+    , createReadReplicaOptionGroupName :: Maybe Text
+    , createReadReplicaPort :: Maybe Int
+    , createReadReplicaPubliclyAccessible :: Maybe Bool
+    , createReadReplicaSourceDBInstanceIdentifier :: Text
+    }
+  deriving (Show, Eq)
+
+deriveFromText "DBInstanceClass"
+    [ "db.t1.micro", "db.m1.small", "db.m1.medium"
+    , "db.m1.large", "db.m1.xlarge", "db.m2.xlarge"
+    , "db.m2.2xlarge", "db.m2.4xlarge"
+    ]
+deriveFromText "Engine"
+    [ "mysql", "oracle-se1", "oracle-se"
+    , "oracle-ee", "sqlserver-ee", "sqlserver-se"
+    , "sqlserver-ex", "sqlserver-web"
+    ]
+deriveFromText "LicenseModel"
+    [ "license-included", "bring-your-own-license", "general-public-license"
+    ]
diff --git a/AWS/RDS/Types/DBSecurityGroup.hs b/AWS/RDS/Types/DBSecurityGroup.hs
--- a/AWS/RDS/Types/DBSecurityGroup.hs
+++ b/AWS/RDS/Types/DBSecurityGroup.hs
@@ -22,8 +22,8 @@
 
 data EC2SecurityGroup = EC2SecurityGroup
     { ec2SecurityGroupStatus :: EC2SecurityGroupStatus
-    , ec2SecurityGroupOwnerId :: Maybe Text
     , ec2SecurityGroupName :: Text
+    , ec2SecurityGroupOwnerId :: Maybe Text
     , ec2SecurityGroupId :: Maybe Text
     }
   deriving (Show, Eq)
diff --git a/Tests/Main.hs b/Tests/Main.hs
deleted file mode 100644
--- a/Tests/Main.hs
+++ /dev/null
@@ -1,43 +0,0 @@
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE NoMonomorphismRestriction #-}
-{-# OPTIONS_GHC -fno-warn-orphans #-}
-
-module Main where
-
-import AWSTests.EC2Tests
-import AWSTests.RDSTests
-import AWSTests.ELBTests
-
-main :: IO ()
-main = do
-    -- EC2 Tests
-    runInstanceTests
-    runVpcTests
-    runAddressTests
-    runSnapshotTests
-    runImageTests
-    runSubnetsTests
-    runVolumeTests
-    runSecurityGroupTests
-    runRouteTests
-    runRouteTableTests
-    runRegionTests
-    runInstanceTests
-    runAvailabilityZoneTests
-    runTagTests
-    runKeyPairTests
-    runNetworkInterfaceTests
-    runNetworkInterfaceAttributeTests
-    runPlacementGroupTests
-    runConversionTaskTests
-
-    -- RDS Tests
-    runDBInstanceTests
-    runDBParameterGroupTests
-    runDBSecurityGroupTests
-    runDBSnapshotTests
-    runDBSubnetGroupTests
-    runEventTests
-
-    -- ELB Tests
-    runLoadBalancerTests
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.10.0
+version:             0.11.0
 synopsis:            AWS SDK for Haskell
 description: AWS (Amazon Web Services) sdk for Haskell.
              .
@@ -22,9 +22,12 @@
 build-type:          Simple
 cabal-version:       >=1.8
 
+flag debug
+    description: enable debug logging
+    default: False
+
 library
   exposed-modules:   AWS
-                   , AWS.Types
                    , AWS.EC2
                    , AWS.EC2.Types
                    , AWS.EC2.Util
@@ -36,7 +39,9 @@
                    , AWS.ELB.Types
                    , AWS.CloudWatch
                    , AWS.CloudWatch.Types
-  other-modules:     AWS.Util , AWS.Credential
+  other-modules:     AWS.Util
+                   , AWS.Credential
+                   , AWS.Types
                    , AWS.Class
                    , AWS.EC2.Internal
                    , AWS.EC2.Address
@@ -99,8 +104,12 @@
                    , AWS.ELB.LoadBalancer
                    , AWS.CloudWatch.Internal
                    , AWS.CloudWatch.Metric
+                   , AWS.CloudWatch.Alarm
   ghc-options:       -Wall
                      -fno-warn-unused-do-bind
+  if flag(debug)
+      cpp-options: -DDEBUG
+
   extensions: OverloadedStrings
   build-depends:     base >= 4 && < 5
                    , containers
@@ -132,7 +141,7 @@
 test-suite test
     type:              exitcode-stdio-1.0
     main-is:           Main.hs
-    hs-source-dirs:    Tests
+    hs-source-dirs:    tests
     ghc-options:       -Wall
                        -threaded
                        -fno-warn-unused-do-bind
@@ -151,6 +160,7 @@
                  , lifted-base
                  , iproute
                  , tls
+                 , time
 
 source-repository head
     type:            git
diff --git a/tests/Main.hs b/tests/Main.hs
new file mode 100644
--- /dev/null
+++ b/tests/Main.hs
@@ -0,0 +1,49 @@
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE NoMonomorphismRestriction #-}
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+
+module Main where
+
+import AWSTests.EC2Tests
+import AWSTests.RDSTests
+import AWSTests.ELBTests
+import AWSTests.CloudWatchTests
+
+main :: IO ()
+main = do
+    -- EC2 Tests
+    runInstanceTests
+    runVpcTests
+    runAddressTests
+    runSnapshotTests
+    runImageTests
+    runSubnetsTests
+    runVolumeTests
+    runSecurityGroupTests
+    runRouteTests
+    runRouteTableTests
+    runRegionTests
+    runInstanceTests
+    runAvailabilityZoneTests
+    runTagTests
+    runKeyPairTests
+    runNetworkInterfaceTests
+    runNetworkInterfaceAttributeTests
+    runPlacementGroupTests
+    runConversionTaskTests
+    runAclTests
+
+    -- RDS Tests
+    runDBInstanceTests
+    runDBParameterGroupTests
+    runDBSecurityGroupTests
+    runDBSnapshotTests
+    runDBSubnetGroupTests
+    runEventTests
+
+    -- ELB Tests
+    runLoadBalancerTests
+
+    -- CloudWatch Tests
+    runAlarmTests
+    runMetricTests
