diff --git a/AWS.hs b/AWS.hs
--- a/AWS.hs
+++ b/AWS.hs
@@ -32,8 +32,9 @@
 module AWS
     ( -- * Credentials
       Credential
-    , loadCredential
     , newCredential
+    , loadCredential
+    , loadCredentialFromFile
       -- * Environment
     , AWS
     , AWSException(..)
diff --git a/AWS/CloudWatch.hs b/AWS/CloudWatch.hs
new file mode 100644
--- /dev/null
+++ b/AWS/CloudWatch.hs
@@ -0,0 +1,46 @@
+{-# LANGUAGE FlexibleContexts, RankNTypes #-}
+
+module AWS.CloudWatch
+    ( -- * CloudWatch Environment
+      CloudWatch
+    , runCloudWatch
+    , setRegion
+    , apiVersion
+      -- * Metric
+    , module AWS.CloudWatch.Metric
+    ) where
+
+import Data.Text (Text)
+import Data.Conduit
+import Control.Monad.Trans.Control (MonadBaseControl)
+import Control.Monad.IO.Class (MonadIO)
+import qualified Control.Monad.State as State
+import qualified Network.HTTP.Conduit as HTTP
+import Data.Monoid ((<>))
+
+import AWS.Class
+import AWS.Util
+
+import AWS
+import AWS.CloudWatch.Internal
+import AWS.CloudWatch.Metric
+
+initialCloudWatchContext :: HTTP.Manager -> AWSContext
+initialCloudWatchContext mgr = AWSContext
+    { manager = mgr
+    , endpoint = "monitoring.amazonaws.com"
+    , lastRequestId = Nothing
+    }
+
+runCloudWatch :: MonadIO m => Credential -> CloudWatch m a -> m a
+runCloudWatch = runAWS initialCloudWatchContext
+
+setRegion
+    :: (MonadBaseControl IO m, MonadResource m)
+    => Text -> CloudWatch m ()
+setRegion region = do
+    ctx <- State.get
+    State.put
+        ctx { endpoint =
+            "monitoring." <> textToBS region <> ".amazonaws.com"
+            }
diff --git a/AWS/CloudWatch/Internal.hs b/AWS/CloudWatch/Internal.hs
new file mode 100644
--- /dev/null
+++ b/AWS/CloudWatch/Internal.hs
@@ -0,0 +1,34 @@
+{-# LANGUAGE FlexibleContexts, RankNTypes #-}
+
+module AWS.CloudWatch.Internal
+    where
+
+import Data.ByteString (ByteString)
+import Data.Text (Text)
+import Data.Conduit
+import Control.Monad.Trans.Control (MonadBaseControl)
+import Data.Monoid ((<>))
+import Data.XML.Types (Event(..))
+
+import AWS.Class
+import AWS.Lib.Query
+import AWS.Lib.Parser
+
+apiVersion :: ByteString
+apiVersion = "2010-08-01"
+
+type CloudWatch m a = AWS AWSContext m a
+
+cloudWatchQuery
+    :: (MonadBaseControl IO m, MonadResource m)
+    => ByteString -- ^ Action
+    -> [QueryParam]
+    -> GLSink Event m a
+    -> CloudWatch m a
+cloudWatchQuery = commonQuery apiVersion
+
+elements :: MonadThrow m
+    => Text
+    -> GLSink Event m a
+    -> GLSink Event m [a]
+elements name f = element (name <> "s") $ listConsumer name f
diff --git a/AWS/CloudWatch/Metric.hs b/AWS/CloudWatch/Metric.hs
new file mode 100644
--- /dev/null
+++ b/AWS/CloudWatch/Metric.hs
@@ -0,0 +1,86 @@
+{-# LANGUAGE FlexibleContexts, RankNTypes #-}
+
+module AWS.CloudWatch.Metric
+    ( listMetrics
+    , getMetricStatistics
+    ) where
+
+import Data.Text (Text)
+import Data.Time (UTCTime)
+import Data.Conduit
+import Control.Monad.Trans.Control (MonadBaseControl)
+import Control.Applicative
+
+import AWS.Util
+import AWS.CloudWatch.Internal
+import AWS.Lib.Query
+import AWS.Lib.Parser
+import AWS.CloudWatch.Types
+
+dimensionFilterParams :: [DimensionFilter] -> QueryParam
+dimensionFilterParams filters =
+    StructArrayParams "Dimensions.member" $ map f filters
+  where
+    f (k, v) = [("Name", k), ("Value", v)]
+
+listMetrics
+    :: (MonadBaseControl IO m, MonadResource m)
+    => [DimensionFilter] -- ^ Dimensions
+    -> Maybe Text -- ^ MetricName
+    -> Maybe Text -- ^ Namespace
+    -> Maybe Text -- ^ NextToken
+    -> CloudWatch m [Metric]
+listMetrics ds mn ns nt = cloudWatchQuery "ListMetrics" params $
+    members "Metrics" $ Metric
+        <$> members "Dimensions" (Dimension
+            <$> getT "Name"
+            <*> getT "Value"
+            )
+        <*> getT "MetricName"
+        <*> getT "Namespace"
+  where
+    params =
+        dimensionFilterParams ds :
+        maybeParams
+        [ ("MetricName", mn)
+        , ("Namespace", ns)
+        , ("NextToken", nt)
+        ]
+
+getMetricStatistics
+    :: (MonadBaseControl IO m, MonadResource m)
+    => [DimensionFilter]
+    -> UTCTime -- ^ StartTime
+    -> UTCTime -- ^ EndTime
+    -> Text -- ^ MetricName
+    -> Text -- ^ Namespace
+    -> Int -- ^ Period
+    -> [Statistic] -- ^ Statistics
+    -> Maybe Text -- ^ Unit
+    -> CloudWatch m ([Datapoint], Text) -- ^ Datapoints and Label
+getMetricStatistics ds start end mn ns pe sts unit =
+    cloudWatchQuery "GetMetricStatistics" params $ (,)
+        <$> members "Datapoints" (Datapoint
+            <$> getF "Timestamp" textToTime
+            <*> getM "SampleCount" (textToDouble <$>)
+            <*> getT "Unit"
+            <*> getM "Minimum" (textToDouble <$>)
+            <*> getM "Maximum" (textToDouble <$>)
+            <*> getM "Sum" (textToDouble <$>)
+            <*> getM "Average" (textToDouble <$>)
+            )
+        <*> getT "Label"
+  where
+    params = dimensionFilterParams ds :
+        [ ValueParam "StartTime" $ timeToText start
+        , ValueParam "EndTime" $ timeToText end
+        , ValueParam "MetricName" mn
+        , ValueParam "Namespace" ns
+        , ValueParam "Period" $ toText pe
+        , ArrayParams "Statistics.member" $ map s sts
+        ] ++ maybeParams [("Unit", unit)]
+    s StatisticAverage     = "Average"
+    s StatisticSum         = "Sum"
+    s StatisticSampleCount = "SampleCount"
+    s StatisticMaximum     = "Maximum"
+    s StatisticMinimum     = "Minimum"
diff --git a/AWS/CloudWatch/Types.hs b/AWS/CloudWatch/Types.hs
new file mode 100644
--- /dev/null
+++ b/AWS/CloudWatch/Types.hs
@@ -0,0 +1,48 @@
+module AWS.CloudWatch.Types
+    where
+
+import Data.Text (Text)
+import Data.Time (UTCTime)
+
+data Metric = Metric
+    { metricDimensions :: [Dimension]
+    , metricName :: Text
+    , metricNameSpace :: Text
+    }
+  deriving (Show, Eq)
+
+data Dimension = Dimension
+    { dimensionName :: Text
+    , dimensionValue :: Text
+    }
+  deriving (Show, Eq)
+
+type DimensionFilter = (Text, Text)
+
+data Datapoint = Datapoint
+    { datapointTimestamp :: UTCTime
+    , datapointSampleCount :: Maybe Double
+    , datapointUnit :: Text
+    , datapointMinimum :: Maybe Double
+    , datapointMaximum :: Maybe Double
+    , datapointSum :: Maybe Double
+    , datapointAverage :: Maybe Double
+    }
+  deriving (Show, Eq)
+
+data Statistic
+    = StatisticAverage
+    | StatisticSum
+    | StatisticSampleCount
+    | StatisticMaximum
+    | StatisticMinimum
+  deriving (Show, Eq)
+
+allStatistics :: [Statistic]
+allStatistics =
+    [ StatisticAverage
+    , StatisticSum
+    , StatisticSampleCount
+    , StatisticMaximum
+    , StatisticMinimum
+    ]
diff --git a/AWS/EC2/Address.hs b/AWS/EC2/Address.hs
--- a/AWS/EC2/Address.hs
+++ b/AWS/EC2/Address.hs
@@ -45,7 +45,7 @@
     addressSet = itemConduit "addressesSet" $ Address
         <$> getT "publicIp"
         <*> getMT "allocationId"
-        <*> getM "domain" addressDomain
+        <*> getM "domain" addressDomain'
         <*> getMT "instanceId"
         <*> getMT "associationId"
         <*> getMT "networkInterfaceId"
@@ -58,12 +58,12 @@
 allocateAddress
     :: (MonadResource m, MonadBaseControl IO m)
     => Bool -- ^ is VPC?
-    -> EC2 m AllocateAddressResponse
+    -> EC2 m AllocateAddress
 allocateAddress isVpc = do
     ec2Query "AllocateAddress" params $
-        AllocateAddressResponse
+        AllocateAddress
         <$> getT "publicIp"
-        <*> getM "domain" addressDomain
+        <*> getM "domain" addressDomain'
         <*> getMT "allocationId"
   where
     params = if isVpc then [ValueParam "Domain" "vpc"] else []
@@ -99,11 +99,12 @@
 
 associateAddressParam
     :: AssociateAddressRequest -> [QueryParam]
-associateAddressParam (AAEC2Instance ip iid) =
+associateAddressParam (AssociateAddressRequestEc2 ip iid) =
     [ ValueParam "PublicIp" ip
     , ValueParam "InstanceId" iid
     ]
-associateAddressParam (AAVPCInstance aid iid nid pip ar) =
+associateAddressParam
+    (AssociateAddressRequestVpc aid iid nid pip ar) =
     [ ValueParam "AllocationId" aid ]
     ++ maybeParams
         [ ("InstanceId", iid)
@@ -120,5 +121,7 @@
     ec2Query "DisassociateAddress" (p param)
         $ getF "return" textToBool
   where
-    p (DAEC2 pip) = [ValueParam "PublicIp" pip]
-    p (DAVPC aid) = [ValueParam "AssociationId" aid]
+    p (DisassociateAddressRequestEc2 pip)
+        = [ValueParam "PublicIp" pip]
+    p (DisassociateAddressRequestVpc aid)
+        = [ValueParam "AssociationId" aid]
diff --git a/AWS/EC2/Convert.hs b/AWS/EC2/Convert.hs
--- a/AWS/EC2/Convert.hs
+++ b/AWS/EC2/Convert.hs
@@ -9,59 +9,83 @@
 import AWS.Lib.Convert
 import AWS.EC2.Types
 
-mkConvertFunc "imageState" ''ImageState ["available", "pending", "failed"]
+mkConvertFunc
+    "imageState"
+    ''ImageState
+    ["available", "pending", "failed"]
 
-mkConvertFunc "productCodeType" ''ProductCodeType ["devpay", "marketplace"]
+mkConvertFunc
+    "productCodeType'"
+    ''ProductCodeType
+    ["devpay", "marketplace"]
 
-mkConvertFunc "imageType" ''ImageType ["machine", "kernel", "ramdisk"]
+mkConvertFunc
+    "imageType"
+    ''ImageType
+    ["machine", "kernel", "ramdisk"]
 
 platform :: Maybe Text -> Platform
-platform Nothing   = Other
+platform Nothing   = PlatformOther
 platform (Just t)
-    | t == "windows" = Windows
-    | otherwise      = Other
+    | t == "windows" = PlatformWindows
+    | otherwise      = PlatformOther
 
-mkConvertFunc "rootDeviceType" ''RootDeviceType ["ebs", "instance-store"]
+mkConvertFunc
+    "rootDeviceType"
+    ''RootDeviceType
+    ["ebs", "instance-store"]
 
 volumeType :: Text -> Maybe Int -> VolumeType
-volumeType t Nothing  | t == "standard" = Standard
-volumeType t (Just i) | t == "io1"      = IO1 i
+volumeType t Nothing  | t == "standard" = VolumeTypeStandard
+volumeType t (Just i) | t == "io1"      = VolumeTypeIO1 i
 volumeType t _ = err "volume type" t
 
-mkConvertFunc "virtualizationType" ''VirtualizationType ["paravirtual", "hvm"]
+mkConvertFunc
+    "virtualizationType"
+    ''VirtualizationType ["paravirtual", "hvm"]
 
 mkConvertFunc "hypervisor" ''Hypervisor ["ovm", "xen"]
 
-mkConvertFunc "instanceStatusEventCode"
-                  ''InstanceStatusEventCode
-                  ["instance-reboot", "instance-stop", "system-reboot", "instance-retirement"]
+mkConvertFunc
+    "instanceStatusEventCode'"
+    ''InstanceStatusEventCode
+    [ "instance-reboot"
+    , "instance-stop"
+    , "system-reboot"
+    , "instance-retirement"
+    ]
 
-mkConvertFunc "instanceStatusTypeStatus"
-                  ''InstanceStatusTypeStatus
-                  ["ok", "impaired", "insufficient-data", "not-applicable"]
+mkConvertFunc
+    "instanceStatusTypeStatus'"
+    ''InstanceStatusTypeStatus
+    ["ok", "impaired", "insufficient-data", "not-applicable"]
 
 instanceStateCodes :: [(Int, InstanceState)]
 instanceStateCodes =
-    [ (0, Pending)
-    , (16, Running)
-    , (32, ShuttingDown)
-    , (48, Terminated)
-    , (64, Stopping)
-    , (80, Stopped)
+    [ (0, InstanceStatePending)
+    , (16, InstanceStateRunning)
+    , (32, InstanceStateShuttingDown)
+    , (48, InstanceStateTerminated)
+    , (64, InstanceStateStopping)
+    , (80, InstanceStateStopped)
     ]
 
 codeToState :: Int -> InstanceState
-codeToState code = case lookup code instanceStateCodes of
-    Nothing -> UnknownState code
-    Just st -> st
+codeToState code = maybe
+    (InstanceStateUnknown code)
+    id
+    (lookup code instanceStateCodes)
 
-mkConvertFunc "instanceMonitoringState" ''InstanceMonitoringState ["disabled", "enabled", "pending"]
+mkConvertFunc
+    "instanceMonitoringState"
+    ''InstanceMonitoringState
+    ["disabled", "enabled", "pending"]
 
 mkConvertFunc "architecture" ''Architecture ["i386", "x86_64"]
 
-addressDomain :: Maybe Text -> AddressDomain
-addressDomain Nothing = AddressDomainStandard
-addressDomain (Just t)
+addressDomain' :: Maybe Text -> AddressDomain
+addressDomain' Nothing = AddressDomainStandard
+addressDomain' (Just t)
     | t == "standard" = AddressDomainStandard
     | t == "vpc"      = AddressDomainVPC
     | otherwise       = err "address domain" t
@@ -71,25 +95,50 @@
     | t == "true" = EC2Success
     | otherwise   = EC2Error t
 
-mkConvertFunc "snapshotStatus" ''SnapshotStatus ["pending", "completed", "error"]
+mkConvertFunc
+    "snapshotStatus'"
+    ''SnapshotStatus
+    ["pending", "completed", "error"]
 
-mkConvertFunc "volumeStatus"
-                  ''VolumeState
-                  ["creating", "available", "in-use", "deleting", "deleted", "error"]
+mkConvertFunc
+    "volumeStatus'"
+    ''VolumeState
+    [ "creating"
+    , "available"
+    , "in-use"
+    , "deleting"
+    , "deleted"
+    , "error"]
 
-mkConvertFunc "attachmentSetItemResponseStatus"
-                  ''AttachmentSetItemResponseStatus
-                  ["attaching", "attached", "detaching", "detached"]
+mkConvertFunc
+    "attachmentSetItemResponseStatus'"
+    ''AttachmentSetItemResponseStatus
+    ["attaching", "attached", "detaching", "detached"]
 
-mkConvertFunc "shutdownBehavior" ''ShutdownBehavior ["stop", "terminate"]
+mkConvertFunc
+    "shutdownBehavior"
+    ''ShutdownBehavior
+    ["stop", "terminate"]
 
-mkConvertFunc "vpnConnectionState" ''VpnConnectionState ["pending", "available", "deleting", "deleted"]
+mkConvertFunc
+    "vpnConnectionState'"
+    ''VpnConnectionState
+    ["pending", "available", "deleting", "deleted"]
 
-mkConvertFunc "vpnTunnelTelemetryStatus" ''VpnTunnelTelemetryStatus ["UP", "DOWN"]
+mkConvertFunc
+    "vpnTunnelTelemetryStatus'"
+    ''VpnTunnelTelemetryStatus
+    ["UP", "DOWN"]
 
-mkConvertFunc "vpnStaticRouteSource" ''VpnStaticRouteSource ["Static"]
+mkConvertFunc
+    "vpnStaticRouteSource'"
+    ''VpnStaticRouteSource
+    ["Static"]
 
-mkConvertFunc "vpnStaticRouteState" ''VpnStaticRouteState ["pending", "available", "deleting", "deleted"]
+mkConvertFunc
+    "vpnStaticRouteState'"
+    ''VpnStaticRouteState
+    ["pending", "available", "deleting", "deleted"]
 
 instanceLifecycle :: Maybe Text -> InstanceLifecycle
 instanceLifecycle Nothing = LifecycleNone
@@ -97,22 +146,55 @@
     | t == "spot"   = LifecycleSpot
     | otherwise     = err "lifecycle" t
 
-mkConvertFunc "subnetState" ''SubnetState ["pending", "available"]
+mkConvertFunc
+    "subnetState'"
+    ''SubnetState
+    ["pending", "available"]
 
-mkConvertFunc "volumeStatusInfoStatus" ''VolumeStatusInfoStatus ["ok", "impaired", "insufficient-data"]
+mkConvertFunc
+    "volumeStatusInfoStatus'"
+    ''VolumeStatusInfoStatus
+    ["ok", "impaired", "insufficient-data"]
 
-mkConvertFunc "networkAclRuleAction" ''NetworkAclRuleAction ["allow", "deny"]
+mkConvertFunc
+    "networkAclRuleAction"
+    ''NetworkAclRuleAction
+    ["allow", "deny"]
 
-mkConvertFunc "routeState" ''RouteState ["active", "blackhole"]
+mkConvertFunc
+    "routeState'"
+    ''RouteState
+    ["active", "blackhole"]
 
-mkConvertFunc "routeOrigin" ''RouteOrigin ["CreateRouteTable", "CreateRoute", "EnableVgwRoutePropagation"]
+mkConvertFunc
+    "routeOrigin'"
+    ''RouteOrigin
+    [ "CreateRouteTable"
+    , "CreateRoute"
+    , "EnableVgwRoutePropagation"
+    ]
 
-mkConvertFunc "vpcState'" ''VpcState ["pending", "available"]
+mkConvertFunc
+    "vpcState'"
+    ''VpcState
+    ["pending", "available"]
 
-mkConvertFunc "vpnGatewayState'" ''VpnGatewayState ["pending", "available", "deleting", "deleted"]
+mkConvertFunc
+    "vpnGatewayState'"
+    ''VpnGatewayState
+    ["pending", "available", "deleting", "deleted"]
 
-mkConvertFunc "attachmentState'" ''AttachmentState ["attaching", "attached", "detaching", "detached"]
+mkConvertFunc
+    "attachmentState'"
+    ''AttachmentState
+    ["attaching", "attached", "detaching", "detached"]
 
-mkConvertFunc "customerGatewayState'" ''CustomerGatewayState ["pending", "available", "deleting", "deleted"]
+mkConvertFunc
+    "customerGatewayState'"
+    ''CustomerGatewayState
+    ["pending", "available", "deleting", "deleted"]
 
-mkConvertFunc "internetGatewayAttachmentState'" ''InternetGatewayAttachmentState ["attaching", "attached", "detaching", "detached", "available"]
+mkConvertFunc
+    "internetGatewayAttachmentState'"
+    ''InternetGatewayAttachmentState
+    ["attaching", "attached", "detaching", "detached", "available"]
diff --git a/AWS/EC2/Image.hs b/AWS/EC2/Image.hs
--- a/AWS/EC2/Image.hs
+++ b/AWS/EC2/Image.hs
@@ -5,14 +5,17 @@
     , createImage
     , registerImage
     , deregisterImage
+    , describeImageAttribute
     ) where
 
 import Data.Text (Text)
+import qualified Data.Text as T
 
 import Data.XML.Types (Event)
 import Data.Conduit
 import Control.Monad.Trans.Control (MonadBaseControl)
 import Control.Applicative
+import Control.Monad (join)
 
 import AWS.EC2.Convert
 import AWS.EC2.Internal
@@ -62,22 +65,25 @@
     <*> itemsSet "billingProducts" (getT "billingProduct")
     <*> getF "rootDeviceType" rootDeviceType
     <*> getMT "rootDeviceName"
-    <*> itemsSet "blockDeviceMapping" (
-        BlockDeviceMapping
-        <$> getT "deviceName"
-        <*> getMT "virtualName"
-        <*> elementM "ebs" (
-            EbsBlockDevice
-            <$> getMT "snapshotId"
-            <*> getF "volumeSize" textToInt
-            <*> getF "deleteOnTermination" textToBool
-            <*> volumeTypeSink
-            )
-        )
+    <*> blockDeviceMappingSink
     <*> getF "virtualizationType" virtualizationType
     <*> resourceTagSink
     <*> getF "hypervisor" hypervisor
 
+blockDeviceMappingSink :: MonadThrow m => GLSink Event m [BlockDeviceMapping]
+blockDeviceMappingSink = itemsSet "blockDeviceMapping" (
+    BlockDeviceMapping
+    <$> getT "deviceName"
+    <*> getMT "virtualName"
+    <*> elementM "ebs" (
+        EbsBlockDevice
+        <$> getMT "snapshotId"
+        <*> getF "volumeSize" textToInt
+        <*> getF "deleteOnTermination" textToBool
+        <*> volumeTypeSink
+        )
+    )
+
 createImage
     :: (MonadResource m, MonadBaseControl IO m)
     => Text -- ^ InstanceId
@@ -104,15 +110,22 @@
 registerImage req =
     ec2Query "RegisterImage" params $ getT "imageId"
   where
-    params = [ValueParam "Name" $ rirName req]
-        ++ [blockDeviceMappingParams $ rirBlockDeviceMappings req]
+    params = [ValueParam "Name" $ registerImageRequestName req]
+        ++ [blockDeviceMappingParams
+            $ registerImageRequestBlockDeviceMappings req]
         ++ maybeParams
-            [ ("ImageLocation", rirImageLocation req)
-            , ("Description", rirDescription req)
-            , ("Architecture", rirArchitecture req)
-            , ("KernelId", rirKernelId req)
-            , ("RamdiskId", rirRamdiskId req)
-            , ("RootDeviceName", rirRootDeviceName req)
+            [ ("ImageLocation"
+              , registerImageRequestImageLocation req
+              )
+            , ("Description", registerImageRequestDescription req)
+            , ("Architecture"
+              , registerImageRequestArchitecture req
+              )
+            , ("KernelId", registerImageRequestKernelId req)
+            , ("RamdiskId", registerImageRequestRamdiskId req)
+            , ("RootDeviceName"
+              , registerImageRequestRootDeviceName req
+              )
             ]
 
 deregisterImage
@@ -123,3 +136,36 @@
     ec2Query "DeregisterImage" params returnBool
   where
     params = [ValueParam "ImageId" iid]
+
+describeImageAttribute
+    :: (MonadResource m, MonadBaseControl IO m)
+    => Text -- ^ ImageId
+    -> AMIAttribute -- ^ Attribute
+    -> EC2 m AMIAttributeDescription
+describeImageAttribute iid attr =
+    ec2Query "DescribeImageAttribute" params $ AMIAttributeDescription
+        <$> getT "imageId"
+        <*> itemsSet "launchPermission"
+            (LaunchPermissionItem
+            <$> getT "group"
+            <*> getT "userId")
+        <*> itemsSet "productCodes"
+            (ProductCodeItem
+            <$> getT "productCode")
+        <*> getMMT "kernel"
+        <*> getMMT "ramdisk"
+        <*> getMMT "description"
+        <*> blockDeviceMappingSink
+  where
+    getMMT name = join <$> elementM name (getMT "value")
+    params = [ ValueParam "ImageId" iid
+             , ValueParam "Attribute" param
+             ]
+    param :: Text
+    param | attr == AMIDescription        = "description"
+          | attr == AMIKernel             = "kernel"
+          | attr == AMIRamdisk            = "ramdisk"
+          | attr == AMILaunchPermission   = "launchPermission"
+          | attr == AMIProductCodes       = "productCodes"
+          | attr == AMIBlockDeviceMapping = "blockDeviceMapping"
+          | otherwise                     = err "AMIAttribute" $ T.pack $ show attr
diff --git a/AWS/EC2/Instance.hs b/AWS/EC2/Instance.hs
--- a/AWS/EC2/Instance.hs
+++ b/AWS/EC2/Instance.hs
@@ -120,9 +120,9 @@
     InstanceBlockDeviceMapping
     <$> getT "deviceName"
     <*> element "ebs" (
-        InstanceEbsBlockDevice
+        EbsInstanceBlockDevice
         <$> getT "volumeId"
-        <*> getF "status" attachmentSetItemResponseStatus
+        <*> getF "status" attachmentSetItemResponseStatus'
         <*> getF "attachTime" textToTime
         <*> getF "deleteOnTermination" textToBool
         )
@@ -201,7 +201,7 @@
         <*> getT "availabilityZone"
         <*> itemsSet "eventsSet" (
             InstanceStatusEvent
-            <$> getF "code" instanceStatusEventCode
+            <$> getF "code" instanceStatusEventCode'
             <*> getT "description"
             <*> getM "notBefore" (textToTime <$>)
             <*> getM "notAfter" (textToTime <$>)
@@ -214,7 +214,7 @@
     => Text -> GLSink Event m InstanceStatusType
 instanceStatusTypeSink name = element name $
     InstanceStatusType
-    <$> getF "status" instanceStatusTypeStatus
+    <$> getF "status" instanceStatusTypeStatus'
     <*> itemsSet "details" (
         InstanceStatusDetail
         <$> getT "name"
@@ -295,35 +295,65 @@
     ec2Query "RunInstances" params reservationSink
   where
     params =
-        [ ValueParam "ImageId" $ riImageId param
-        , ValueParam "MinCount" $ toText $ riMinCount param
-        , ValueParam "MaxCount" $ toText $ riMaxCount param
-        , ArrayParams "SecurityGroupId" $ riSecurityGroupIds param
-        , ArrayParams "SecurityGroup" $ riSecurityGroups param
-        , blockDeviceMappingParams $ riBlockDeviceMappings param
+        [ ValueParam "ImageId" $ runInstancesRequestImageId param
+        , ValueParam "MinCount"
+            $ toText $ runInstancesRequestMinCount param
+        , ValueParam "MaxCount"
+            $ toText $ runInstancesRequestMaxCount param
+        , ArrayParams "SecurityGroupId"
+            $ runInstancesRequestSecurityGroupIds param
+        , ArrayParams "SecurityGroup"
+            $ runInstancesRequestSecurityGroups param
+        , blockDeviceMappingParams
+            $ runInstancesRequestBlockDeviceMappings param
         ] ++ maybeParams
-            [ ("KeyName", riKeyName param)
-            , ("UserData", bsToText <$> riUserData param)
-            , ("InstanceType", riInstanceType param)
-            , ("Placement.AvailabilityZone",
-               riAvailabilityZone param)
-            , ("Placement.GroupName", riPlacementGroup param)
-            , ("Placement.Tenancy", riTenancy param)
-            , ("KernelId", riKernelId param)
-            , ("RamdiskId", riRamdiskId param)
-            , ("Monitoring.Enabled",
-               boolToText <$> riMonitoringEnabled param)
-            , ("SubnetId", riSubnetId param)
-            , ("DisableApiTermination",
-               boolToText <$> riDisableApiTermination param)
-            , ("InstanceInitiatedShutdownBehavior",
-               sbToText <$> riShutdownBehavior param)
-            , ("ClientToken", riClientToken param)
-            , ("IamInstanceProfile.Arn",
-               iipArn <$> riIamInstanceProfile param)
-            , ("IamInstanceProfile.Name",
-               iipId <$> riIamInstanceProfile param)
-            , ("EbsOptimized", boolToText <$> riEbsOptimized param)
+            [ ("KeyName", runInstancesRequestKeyName param)
+            , ("UserData"
+              , bsToText <$> runInstancesRequestUserData param
+              )
+            , ("InstanceType"
+              , runInstancesRequestInstanceType param
+              )
+            , ("Placement.AvailabilityZone"
+              , runInstancesRequestAvailabilityZone param
+              )
+            , ("Placement.GroupName"
+              , runInstancesRequestPlacementGroup param
+              )
+            , ("Placement.Tenancy"
+              , runInstancesRequestTenancy param
+              )
+            , ("KernelId", runInstancesRequestKernelId param)
+            , ("RamdiskId", runInstancesRequestRamdiskId param)
+            , ("Monitoring.Enabled"
+              , boolToText
+                <$> runInstancesRequestMonitoringEnabled param
+              )
+            , ("SubnetId", runInstancesRequestSubnetId param)
+            , ("DisableApiTermination"
+              , boolToText
+                <$> runInstancesRequestDisableApiTermination param
+              )
+            , ("InstanceInitiatedShutdownBehavior"
+              , sbToText
+                <$> runInstancesRequestShutdownBehavior param
+              )
+            , ("PrivateIpAddress"
+              , runInstancesRequestPrivateIpAddress param
+              )
+            , ("ClientToken", runInstancesRequestClientToken param)
+            , ("IamInstanceProfile.Arn"
+              , iamInstanceProfileArn
+                <$> runInstancesRequestIamInstanceProfile param
+              )
+            , ("IamInstanceProfile.Name"
+              , iamInstanceProfileId
+                <$> runInstancesRequestIamInstanceProfile param
+              )
+            , ("EbsOptimized"
+              , boolToText
+                <$> runInstancesRequestEbsOptimized param
+              )
             ]
 
 -- | RunInstances parameter utility
@@ -334,34 +364,33 @@
     -> RunInstancesRequest
 defaultRunInstancesRequest iid minCount maxCount
     = RunInstancesRequest
-    { riImageId = iid
-    , riMinCount = minCount
-    , riMaxCount = maxCount
-    , riKeyName = Nothing
-    , riSecurityGroupIds = []
-    , riSecurityGroups = []
-    , riUserData = Nothing
-    , riInstanceType = Nothing
-    , riAvailabilityZone = Nothing
-    , riPlacementGroup = Nothing
-    , riTenancy = Nothing
-    , riKernelId = Nothing
-    , riRamdiskId = Nothing
-    , riBlockDeviceMappings = []
-    , riMonitoringEnabled = Nothing
-    , riSubnetId = Nothing
-    , riDisableApiTermination = Nothing
-    , riShutdownBehavior = Nothing
-    , riPrivateIpAddresses = []
-    , riClientToken = Nothing
-    , riNetworkInterface = []
-    , riIamInstanceProfile = Nothing
-    , riEbsOptimized = Nothing
-    }
+        iid
+        minCount
+        maxCount
+        Nothing
+        []
+        []
+        Nothing
+        Nothing
+        Nothing
+        Nothing
+        Nothing
+        Nothing
+        Nothing
+        []
+        Nothing
+        Nothing
+        Nothing
+        Nothing
+        Nothing
+        Nothing
+        []
+        Nothing
+        Nothing
 
 sbToText :: ShutdownBehavior -> Text
-sbToText SBStop      = "stop"
-sbToText SBTerminate = "terminate"
+sbToText ShutdownBehaviorStop      = "stop"
+sbToText ShutdownBehaviorTerminate = "terminate"
 
 ------------------------------------------------------------
 -- GetConsoleOutput
@@ -405,48 +434,53 @@
         [ ValueParam "InstanceId" iid
         , ValueParam "Attribute" str
         ]
-    f IARBlockDeviceMapping = instanceBlockDeviceMappingsSink
-        >>= return . IABlockDeviceMapping
-    f IARProductCodes =
-        productCodeSink >>= return . IAProductCodes
-    f IARGroupSet =
-        (itemsSet str $ getT "groupId") >>= return . IAGroupSet
+    f InstanceAttributeRequestBlockDeviceMapping = instanceBlockDeviceMappingsSink
+        >>= return . InstanceAttributeBlockDeviceMapping
+    f InstanceAttributeRequestProductCodes =
+        productCodeSink >>= return . InstanceAttributeProductCodes
+    f InstanceAttributeRequestGroupSet =
+        (itemsSet str $ getT "groupId")
+        >>= return . InstanceAttributeGroupSet
     f req = valueSink str (fromJust $ Map.lookup req h)
     h = Map.fromList
-        [ (IARInstanceType, IAInstanceType . fromJust)
-        , (IARKernelId, IAKernelId)
-        , (IARRamdiskId, IARamdiskId)
-        , (IARUserData, IAUserData)
-        , (IARDisableApiTermination,
-           IADisableApiTermination . textToBool . fromJust)
-        , (IARShutdownBehavior,
-           IAShutdownBehavior . shutdownBehavior . fromJust)
-        , (IARRootDeviceName, IARootDeviceName)
-        , (IARSourceDestCheck,
-           IASourceDestCheck . (textToBool <$>))
-        , (IAREbsOptimized, IAEbsOptimized . textToBool . fromJust)
+        [ (InstanceAttributeRequestInstanceType,
+           InstanceAttributeInstanceType . fromJust)
+        , (InstanceAttributeRequestKernelId, InstanceAttributeKernelId)
+        , (InstanceAttributeRequestRamdiskId, InstanceAttributeRamdiskId)
+        , (InstanceAttributeRequestUserData, InstanceAttributeUserData)
+        , (InstanceAttributeRequestDisableApiTermination,
+           InstanceAttributeDisableApiTermination
+           . textToBool . fromJust)
+        , (InstanceAttributeRequestShutdownBehavior,
+           InstanceAttributeShutdownBehavior
+           . shutdownBehavior . fromJust)
+        , (InstanceAttributeRequestRootDeviceName, InstanceAttributeRootDeviceName)
+        , (InstanceAttributeRequestSourceDestCheck,
+           InstanceAttributeSourceDestCheck . (textToBool <$>))
+        , (InstanceAttributeRequestEbsOptimized,
+           InstanceAttributeEbsOptimized . textToBool . fromJust)
         ]
     valueSink name val =
         (element name $ getMT "value") >>= return . val
 
 iar :: InstanceAttributeRequest -> Text
-iar IARInstanceType          = "instanceType"
-iar IARKernelId              = "kernel"
-iar IARRamdiskId             = "ramdisk"
-iar IARUserData              = "userData"
-iar IARDisableApiTermination = "disableApiTermination"
-iar IARShutdownBehavior      = "instanceInitiatedShutdownBehavior"
-iar IARRootDeviceName        = "rootDeviceName"
-iar IARBlockDeviceMapping    = "blockDeviceMapping"
-iar IARSourceDestCheck       = "sourceDestCheck"
-iar IARGroupSet              = "groupSet"
-iar IARProductCodes          = "productCodes"
-iar IAREbsOptimized          = "ebsOptimized"
+iar InstanceAttributeRequestInstanceType          = "instanceType"
+iar InstanceAttributeRequestKernelId              = "kernel"
+iar InstanceAttributeRequestRamdiskId             = "ramdisk"
+iar InstanceAttributeRequestUserData              = "userData"
+iar InstanceAttributeRequestDisableApiTermination = "disableApiTermination"
+iar InstanceAttributeRequestShutdownBehavior      = "instanceInitiatedShutdownBehavior"
+iar InstanceAttributeRequestRootDeviceName        = "rootDeviceName"
+iar InstanceAttributeRequestBlockDeviceMapping    = "blockDeviceMapping"
+iar InstanceAttributeRequestSourceDestCheck       = "sourceDestCheck"
+iar InstanceAttributeRequestGroupSet              = "groupSet"
+iar InstanceAttributeRequestProductCodes          = "productCodes"
+iar InstanceAttributeRequestEbsOptimized          = "ebsOptimized"
 
 riap :: ResetInstanceAttributeRequest -> Text
-riap RIAPKernel          = "kernel"
-riap RIAPRamdisk         = "ramdisk"
-riap RIAPSourceDestCheck = "sourceDestCheck"
+riap ResetInstanceAttributeRequestKernel          = "kernel"
+riap ResetInstanceAttributeRequestRamdisk         = "ramdisk"
+riap ResetInstanceAttributeRequestSourceDestCheck = "sourceDestCheck"
 
 resetInstanceAttribute
     :: (MonadResource m, MonadBaseControl IO m)
@@ -473,26 +507,26 @@
     params = ValueParam "InstanceId" iid:concatMap miap attrs
 
 miap :: ModifyInstanceAttributeRequest -> [QueryParam]
-miap (MIAPInstanceType a) =
+miap (ModifyInstanceAttributeRequestInstanceType a) =
     [ValueParam "InstanceType.Value" a]
-miap (MIAPKernelId a) =
+miap (ModifyInstanceAttributeRequestKernelId a) =
     [ValueParam "Kernel.Value"  a]
-miap (MIAPRamdiskId a) =
+miap (ModifyInstanceAttributeRequestRamdiskId a) =
     [ValueParam "Ramdisk.Value" a]
-miap (MIAPUserData a) =
+miap (ModifyInstanceAttributeRequestUserData a) =
     [ValueParam "UserData.Value" a]
-miap (MIAPDisableApiTermination a) =
+miap (ModifyInstanceAttributeRequestDisableApiTermination a) =
     [ValueParam "DisableApiTermination.Value" $ toText a]
-miap (MIAPShutdownBehavior a) =
+miap (ModifyInstanceAttributeRequestShutdownBehavior a) =
     [ValueParam "InstanceInitiatedShutdownBehavior.Value"
      $ sbToText a]
-miap (MIAPRootDeviceName a) =
+miap (ModifyInstanceAttributeRequestRootDeviceName a) =
     [ValueParam "RootDeviceName" a]
-miap (MIAPBlockDeviceMapping a) =
+miap (ModifyInstanceAttributeRequestBlockDeviceMapping a) =
     [blockDeviceMappingParams a]
-miap (MIAPSourceDestCheck a) =
+miap (ModifyInstanceAttributeRequestSourceDestCheck a) =
     [ValueParam "SourceDestCheck.Value" $ toText a]
-miap (MIAPGroupSet a) =
+miap (ModifyInstanceAttributeRequestGroupSet a) =
     [ArrayParams "GroupId" a]
-miap (MIAPEbsOptimized a) =
+miap (ModifyInstanceAttributeRequestEbsOptimized a) =
     [ValueParam "EbsOptimized" $ toText a]
diff --git a/AWS/EC2/Internal.hs b/AWS/EC2/Internal.hs
--- a/AWS/EC2/Internal.hs
+++ b/AWS/EC2/Internal.hs
@@ -56,7 +56,7 @@
 productCodeSink = itemsSet "productCodes" $
     ProductCode
     <$> getT "productCode"
-    <*> getF "type" productCodeType
+    <*> getF "type" productCodeType'
 
 stateReasonSink :: MonadThrow m
     => GLSink Event m (Maybe StateReason)
diff --git a/AWS/EC2/KeyPair.hs b/AWS/EC2/KeyPair.hs
--- a/AWS/EC2/KeyPair.hs
+++ b/AWS/EC2/KeyPair.hs
@@ -18,7 +18,6 @@
 import AWS.EC2.Types
 import AWS.EC2.Query
 import AWS.Lib.Parser
-import AWS.Util
 
 describeKeyPairs
     :: (MonadResource m, MonadBaseControl IO m)
diff --git a/AWS/EC2/Params.hs b/AWS/EC2/Params.hs
--- a/AWS/EC2/Params.hs
+++ b/AWS/EC2/Params.hs
@@ -12,7 +12,7 @@
 blockDeviceMappingParams =
     StructArrayParams "BlockDeviceMapping" . map kvs
   where
-    kvs (BlockDeviceMappingParamEBS name dev src dot vtype) = 
+    kvs (BlockDeviceMappingParamEbs name dev src dot vtype) = 
         [ ("DeviceName", name)
         , ebsSource src
         ] ++ vtparam vtype ++ (uncurry f =<<
@@ -25,14 +25,15 @@
             , ("VirtualName", vname)
             ])
 
-    ebsSource (EbsSnapshotId sid) = ("Ebs.SnapshotId", sid)
-    ebsSource (EbsVolumeSize size) =
+    ebsSource (EbsSourceSnapshotId sid) = ("Ebs.SnapshotId", sid)
+    ebsSource (EbsSourceVolumeSize size) =
         ("Ebs.VolumeSize", T.pack $ show size)
 
     f n = maybe [] (\a -> [(n, a)])
     vtparam Nothing = []
-    vtparam (Just Standard) = [("Ebs.VolumeType", "standard")]
-    vtparam (Just (IO1 iops)) =
+    vtparam (Just VolumeTypeStandard) =
+        [("Ebs.VolumeType", "standard")]
+    vtparam (Just (VolumeTypeIO1 iops)) =
         [ ("Ebs.VolumeType", "io1")
         , ("Ebs.Iops", T.pack $ show iops)
         ]
diff --git a/AWS/EC2/Query.hs b/AWS/EC2/Query.hs
--- a/AWS/EC2/Query.hs
+++ b/AWS/EC2/Query.hs
@@ -9,6 +9,7 @@
 #endif
     , ec2Delete
     , module AWS.Lib.Query
+    , apiVersion
     ) where
 
 import           Data.ByteString (ByteString)
@@ -38,8 +39,8 @@
 import qualified Data.Conduit.Binary as CB
 #endif
 
-ec2Version :: ByteString
-ec2Version = "2012-10-01"
+apiVersion :: ByteString
+apiVersion = "2012-10-01"
 
 sinkRequestId :: MonadThrow m
     => GLSink Event m Text
@@ -95,7 +96,7 @@
     cred <- Reader.ask
     ctx <- State.get
     (src1, rid) <- lift $ do
-        response <- requestQuery cred ctx action params' ec2Version sinkError
+        response <- requestQuery cred ctx action params' apiVersion sinkError
         res <- response $=+ XmlP.parseBytes XmlP.def
         res $$++ sinkRequestId
     State.put ctx{lastRequestId = Just rid}
@@ -117,7 +118,7 @@
     cred <- Reader.ask
     ctx <- State.get
     lift $ do
-        response <- requestQuery cred ctx action params ec2Version sinkError
+        response <- requestQuery cred ctx action params apiVersion sinkError
         (res, _) <- unwrapResumable response
         res $$ CB.sinkFile "debug.txt" >>= fail "debug"
 #endif
diff --git a/AWS/EC2/RouteTable.hs b/AWS/EC2/RouteTable.hs
--- a/AWS/EC2/RouteTable.hs
+++ b/AWS/EC2/RouteTable.hs
@@ -57,8 +57,8 @@
     <*> getMT "instanceId"
     <*> getMT "instanceOwnerId"
     <*> getMT "networkInterfaceId"
-    <*> getF "state" routeState
-    <*> getM "origin" (routeOrigin <$>)
+    <*> getF "state" routeState'
+    <*> getM "origin" (routeOrigin' <$>)
 
 routeTableAssociationSink :: MonadThrow m
     => GLSink Event m [RouteTableAssociation]
diff --git a/AWS/EC2/SecurityGroup.hs b/AWS/EC2/SecurityGroup.hs
--- a/AWS/EC2/SecurityGroup.hs
+++ b/AWS/EC2/SecurityGroup.hs
@@ -87,8 +87,8 @@
         $ getF "return" textToBool
 
 p :: SecurityGroupRequest -> QueryParam
-p (GroupId t)   = ValueParam "GroupId" t
-p (GroupName t) = ValueParam "GroupName" t
+p (SecurityGroupRequestGroupId t)   = ValueParam "GroupId" t
+p (SecurityGroupRequestGroupName t) = ValueParam "GroupName" t
 
 -- | not tested
 authorizeSecurityGroupIngress
@@ -107,7 +107,7 @@
     -> EC2 m Bool
 authorizeSecurityGroupEgress gid =
     securityGroupQuery "AuthorizeSecurityGroupEgress"
-        $ GroupId gid
+        $ SecurityGroupRequestGroupId gid
 
 -- | not tested
 revokeSecurityGroupIngress
@@ -126,7 +126,7 @@
     -> EC2 m Bool
 revokeSecurityGroupEgress gid =
     securityGroupQuery "RevokeSecurityGroupEgress"
-        $ GroupId gid
+        $ SecurityGroupRequestGroupId gid
 
 securityGroupQuery
     :: (MonadResource m, MonadBaseControl IO m)
@@ -145,23 +145,29 @@
 
 ipPermissionParam :: Int -> IpPermission -> [QueryParam]
 ipPermissionParam num ipp =
-    [ValueParam (pre <> ".IpProtocol") $ ippIpProtocol ipp]
+    [ValueParam (pre <> ".IpProtocol") $
+        ipPermissionIpProtocol ipp]
     ++ (uncurry (mk pre) =<<
-        [ (".FromPort", toText <$> ippFromPort ipp)
-        , (".ToPort", toText <$> ippToPort ipp)
+        [ (".FromPort", toText <$> ipPermissionFromPort ipp)
+        , (".ToPort", toText <$> ipPermissionToPort ipp)
         ])
-    ++ map (uncurry ipr) (zip intstr $ ippIpRanges ipp)
-    ++ concatMap (uncurry grp) (zip intstr $ ippGroups ipp)
+    ++ map
+        (uncurry ipr)
+        (zip intstr $ ipPermissionIpRanges ipp)
+    ++ concatMap
+        (uncurry grp)
+        (zip intstr $ ipPermissionGroups ipp)
   where
     pre = "IpPermissions." <> toText num
     mk h name = maybe [] (\a -> [ValueParam (h <> name) a])
     grph n = pre <> ".Groups." <> toText n
     grp n g = 
-        [ ValueParam (grph n <> ".GroupId") $ uigpGroupId g
+        [ ValueParam (grph n <> ".GroupId") $
+            userIdGroupPairGroupId g
         ] ++ (uncurry (mk (grph n)) =<<
-            [ (".UserId", uigpUserId g)
-            , (".GroupName", uigpGroupName g)
+            [ (".UserId", userIdGroupPairUserId g)
+            , (".GroupName", userIdGroupPairGroupName g)
             ])
     ipr n r = ValueParam
         (pre <> ".IPRanges." <> toText n <> ".CidrIp")
-        $ iprCidrIp r
+        $ ipRangeCidrIp r
diff --git a/AWS/EC2/Snapshot.hs b/AWS/EC2/Snapshot.hs
--- a/AWS/EC2/Snapshot.hs
+++ b/AWS/EC2/Snapshot.hs
@@ -43,7 +43,7 @@
 snapshotSink = Snapshot
         <$> getT "snapshotId"
         <*> getT "volumeId"
-        <*> getF "status" snapshotStatus
+        <*> getF "status" snapshotStatus'
         <*> getF "startTime" textToTime
         <*> getT "progress"
         <*> getT "ownerId"
diff --git a/AWS/EC2/Subnets.hs b/AWS/EC2/Subnets.hs
--- a/AWS/EC2/Subnets.hs
+++ b/AWS/EC2/Subnets.hs
@@ -40,7 +40,7 @@
     => GLSink Event m Subnet
 subnetSink = Subnet
     <$> getT "subnetId"
-    <*> getF "state" subnetState
+    <*> getF "state" subnetState'
     <*> getT "vpcId"
     <*> getT "cidrBlock"
     <*> getF "availableIpAddressCount" textToInt
diff --git a/AWS/EC2/Tag.hs b/AWS/EC2/Tag.hs
--- a/AWS/EC2/Tag.hs
+++ b/AWS/EC2/Tag.hs
@@ -35,7 +35,7 @@
 createTags
     :: (MonadResource m, MonadBaseControl IO m)
     => [Text] -- ^ ResourceId (instance-id, image-id,..)
-    -> [(Text, Text)]
+    -> [(Text, Text)] -- ^ (Key, Value)
     -> EC2 m Bool
 createTags rids kvs =
     ec2Query "CreateTags" params returnBool
@@ -61,7 +61,7 @@
         ++ concatMap (uncurry tagParam) (zip ([1..]::[Int]) tags)
     tagParam n tag =
         [ ValueParam ("Tag." <> toText n <> ".Key")
-         $ resourceKey tag ]
+         $ resourceTagKey tag ]
         ++ maybe []
             (\a -> [ValueParam ("Tag." <> toText n <> ".Value") a])
-            (resourceValue tag)
+            (resourceTagValue tag)
diff --git a/AWS/EC2/Types.hs b/AWS/EC2/Types.hs
--- a/AWS/EC2/Types.hs
+++ b/AWS/EC2/Types.hs
@@ -1,7 +1,9 @@
 module AWS.EC2.Types
     ( Address(..)
     , AddressDomain(..)
-    , AllocateAddressResponse(..)
+    , AllocateAddress(..)
+    , AMIAttribute(..)
+    , AMIAttributeDescription(..)
     , Architecture(..)
     , AssociateAddressRequest(..)
     , Attachment(..)
@@ -20,6 +22,7 @@
     , CustomerGatewayState(..)
     , DisassociateAddressRequest(..)
     , EbsBlockDevice(..)
+    , EbsInstanceBlockDevice(..)
     , EbsSource(..)
     , EC2Return(..)
     , Group(..)
@@ -33,7 +36,6 @@
     , InstanceAttribute(..)
     , InstanceAttributeRequest(..)
     , InstanceBlockDeviceMapping(..)
-    , InstanceEbsBlockDevice(..)
     , InstanceLifecycle(..)
     , InstanceMonitoringState(..)
     , InstanceNetworkInterface(..)
@@ -52,6 +54,7 @@
     , IpRange(..)
     , KeyPair(..)
     , ModifyInstanceAttributeRequest(..)
+    , LaunchPermissionItem(..)
     , NetworkAcl(..)
     , NetworkAclAssociation(..)
     , NetworkAclEntry(..)
@@ -65,6 +68,7 @@
     , Platform(..)
     , PortRange(..)
     , ProductCode(..)
+    , ProductCodeItem(..)
     , ProductCodeType(..)
     , Region(..)
     , RegisterImageRequest(..)
@@ -117,7 +121,6 @@
     , InternetGatewayAttachmentState(..)
     ) where
 
-import Data.Default (Default(..))
 import Data.Text (Text)
 import Data.ByteString (ByteString)
 import Data.Time (UTCTime)
@@ -127,12 +130,12 @@
     , imageLocation :: Text
     , imageImageState :: ImageState
     , imageOwnerId :: Text
-    , isPublic :: Bool
+    , imageIsPublic :: Bool
     , imageProductCodes :: [ProductCode]
     , imageArchitecture :: Text
     , imageImageType :: ImageType
-    , kernelId :: Maybe Text
-    , ramdiskId :: Maybe Text
+    , imageKernelId :: Maybe Text
+    , imageRamdiskId :: Maybe Text
     , imagePlatform :: Platform
     , imageStateReason :: Maybe StateReason
     , imageViridianEnabled :: Maybe Bool
@@ -142,38 +145,72 @@
     , imageBillingProducts :: [Text]
     , imageRootDeviceType :: RootDeviceType
     , imageRootDeviceName :: Maybe Text
-    , blockDeviceMappings :: [BlockDeviceMapping]
+    , imageBlockDeviceMappings :: [BlockDeviceMapping]
     , imageVirtualizationType :: VirtualizationType
     , imageTagSet :: [ResourceTag]
     , imageHypervisor :: Hypervisor
     }
   deriving (Show, Eq)
 
+data AMIAttribute
+    = AMIDescription
+    | AMIKernel
+    | AMIRamdisk
+    | AMILaunchPermission
+    | AMIProductCodes
+    | AMIBlockDeviceMapping
+  deriving (Show, Eq)
+
+data AMIAttributeDescription = AMIAttributeDescription
+    { amiAttributeDescriptionImageId :: Text
+    , amiAttributeDescriptionLaunchPermission :: [LaunchPermissionItem]
+    , amiAttributeDescriptionProductCodes :: [ProductCodeItem]
+    , amiAttributeDescriptionKernel :: Maybe Text
+    , amiAttributeDescriptionRamdisk :: Maybe Text
+    , amiAttributeDescriptionDescription :: Maybe Text
+    , amiAttributeDescriptionBlockDeviceMapping :: [BlockDeviceMapping]
+    }
+  deriving (Show, Eq)
+
+data LaunchPermissionItem = LaunchPermissionItem
+    { launchPermissionItemGroup :: Text
+    , launchPermissionUserId :: Text
+    }
+  deriving (Show, Eq)
+
 data ImageState
-    = ImageAvailable
-    | ImagePending
-    | ImageFailed
+    = ImageStateAvailable
+    | ImageStatePending
+    | ImageStateFailed
   deriving (Show, Eq)
 
 data ProductCode = ProductCode
-    { pcCode :: Text
-    , pcType :: ProductCodeType
+    { productCodeCode :: Text
+    , productCodeType :: ProductCodeType
     }
   deriving (Show, Eq)
 
-data ProductCodeType = Devpay
-                     | Marketplace
+data ProductCodeItem = ProductCodeItem
+    { productCodeItemProductCode :: Text
+    }
   deriving (Show, Eq)
 
-data ImageType = Machine
-               | Kernel
-               | RamDisk
+data ProductCodeType
+    = ProductCodeDevpay
+    | ProductCodeMarketplace
   deriving (Show, Eq)
 
-data Platform = Windows
-              | Other
+data ImageType
+    = ImageTypeMachine
+    | ImageTypeKernel
+    | ImageTypeRamDisk
   deriving (Show, Eq)
 
+data Platform
+    = PlatformWindows
+    | PlatformOther
+  deriving (Show, Eq)
+
 data StateReason = StateReason
     { stateReasonCode :: Text
     , stateReasonMessage :: Text
@@ -181,14 +218,14 @@
   deriving (Show, Eq)
 
 data RootDeviceType
-    = EBS
-    | InstanceStore
+    = RootDeviceTypeEBS
+    | RootDeviceTypeInstanceStore
   deriving (Show, Eq)
 
 data BlockDeviceMapping = BlockDeviceMapping
-    { deviceName :: Text
-    , virtualName :: Maybe Text
-    , ebs :: Maybe EbsBlockDevice
+    { blockDeviceMappingDeviceName :: Text
+    , blockDeviceMappingVirtualName :: Maybe Text
+    , blockDeviceMappingEbs :: Maybe EbsBlockDevice
     }
   deriving (Show, Eq)
 
@@ -200,26 +237,25 @@
     }
   deriving (Show, Eq)
 
-data VolumeType = Standard
-                | IO1 Int
+data VolumeType
+    = VolumeTypeStandard
+    | VolumeTypeIO1 Int
   deriving (Show, Eq)
 
-instance Default VolumeType
-  where
-    def = Standard
-
-data VirtualizationType = Paravirtual
-                        | HVM
+data VirtualizationType
+    = VirtualizationTypeParavirtual
+    | VirtualizationTypeHVM
   deriving (Show, Eq)
 
 data ResourceTag = ResourceTag
-    { resourceKey :: Text
-    , resourceValue :: Maybe Text
+    { resourceTagKey :: Text
+    , resourceTagValue :: Maybe Text
     }
   deriving (Show, Eq)
 
-data Hypervisor = OVM
-                | Xen
+data Hypervisor
+    = HypervisorOVM
+    | HypervisorXen
   deriving (Show, Eq)
 
 data Region = Region
@@ -232,7 +268,7 @@
     { zoneName :: Text
     , zoneState :: Text
     , zoneRegionName :: Text
-    , messageSet :: [AvailabilityZoneMessage]
+    , zoneMessageSet :: [AvailabilityZoneMessage]
     }
   deriving (Show, Eq)
 
@@ -240,10 +276,10 @@
 
 data Reservation = Reservation
     { reservationId :: Text
-    , ownerId :: Text
-    , groupSet :: [Group]
-    , instanceSet :: [Instance]
-    , requesterId :: Maybe Text
+    , reservationOwnerId :: Text
+    , reservationGroupSet :: [Group]
+    , reservationInstanceSet :: [Instance]
+    , reservationRequesterId :: Maybe Text
     }
   deriving (Show, Eq)
 
@@ -251,84 +287,84 @@
     { instanceId :: Text
     , instanceImageId :: Text
     , instanceState :: InstanceState
-    , privateDnsName :: Text
-    , dnsName :: Text
-    , reason :: Text
+    , instancePrivateDnsName :: Text
+    , instanceDnsName :: Text
+    , instanceReason :: Text
     , instanceKeyName :: Maybe Text
-    , amiLaunchIndex :: Text
+    , instanceAmiLaunchIndex :: Text
     , instanceProductCodes :: [ProductCode]
     , instanceType :: Text
-    , launchTime :: UTCTime
+    , instanceLaunchTime :: UTCTime
     , instancePlacement :: Placement
     , instanceKernelId :: Maybe Text
     , instanceRamdiskId :: Maybe Text
     , instancePlatform :: Maybe Text
     , instanceMonitoring :: InstanceMonitoringState
-    , subnetId :: Maybe Text
+    , instanceSubnetId :: Maybe Text
     , instanceVpcId :: Maybe Text
-    , privateIpAddress :: Maybe Text
-    , ipAddress :: Maybe Text
-    , sourceDestCheck :: Maybe Bool
-    , vpcGroupSet :: [Group]
+    , instancePrivateIpAddress :: Maybe Text
+    , instanceIpAddress :: Maybe Text
+    , instanceSourceDestCheck :: Maybe Bool
+    , instancevpcGroupSet :: [Group]
     , instanceStateReason :: Maybe StateReason
     , instanceArchitecture :: Architecture
     , instanceRootDeviceType :: RootDeviceType
     , instanceRootDeviceName :: Maybe Text
     , instanceBlockDeviceMappings :: [InstanceBlockDeviceMapping]
     , instanceInstanceLifecycle :: InstanceLifecycle
-    , spotInstanceRequestId :: Maybe Text
+    , instanceSpotInstanceRequestId :: Maybe Text
     , instanceVirtualizationType :: VirtualizationType
-    , clientToken :: Text
+    , instanceClientToken :: Text
     , instanceTagSet :: [ResourceTag]
     , instanceHypervisor :: Hypervisor
     , instanceNetworkInterfaceSet :: [InstanceNetworkInterface]
     , instanceIamInstanceProfile :: Maybe IamInstanceProfile
-    , ebsOptimized :: Bool -- default: false
+    , instanceEbsOptimized :: Bool -- default: false
     }
   deriving (Show, Eq)
 
 data InstanceStatus = InstanceStatus
-    { isInstanceId :: Text
-    , isAvailabilityZone :: Text
-    , isEventsSet :: [InstanceStatusEvent]
-    , isInstanceState :: InstanceState
-    , isSystemStatus :: InstanceStatusType
-    , isInstanceStatus :: InstanceStatusType
+    { instanceStatusInstanceId :: Text
+    , instanceStatusAvailabilityZone :: Text
+    , instanceStatusEventsSet :: [InstanceStatusEvent]
+    , instanceStatusInstanceState :: InstanceState
+    , instanceStatusSystemStatus :: InstanceStatusType
+    , instanceStatusInstanceStatus :: InstanceStatusType
     }
   deriving (Show, Eq)
 
 data InstanceStatusEvent = InstanceStatusEvent
-    { iseCode :: InstanceStatusEventCode
-    , iseDescription :: Text
-    , iseNotBefore :: Maybe UTCTime
-    , iseNotAfter :: Maybe UTCTime
+    { instanceStatusEventCode :: InstanceStatusEventCode
+    , instanceStatusEventDescription :: Text
+    , instanceStatusEventNotBefore :: Maybe UTCTime
+    , instanceStatusEventNotAfter :: Maybe UTCTime
     }
   deriving (Show, Eq)
 
 data InstanceStatusEventCode
-    = InstanceReboot
-    | InstanceStop
-    | SystemReboot
-    | InstanceRetirement
+    = InstanceStatusEventCodeInstanceReboot
+    | InstanceStatusEventCodeInstanceStop
+    | InstanceStatusEventCodeSystemReboot
+    | InstanceStatusEventCodeInstanceRetirement
   deriving (Show, Eq)
 
 data InstanceStatusType = InstanceStatusType
-    { isdStatus :: InstanceStatusTypeStatus
-    , isdDetails :: [InstanceStatusDetail]
+    { instanceStatusTypeStatus :: InstanceStatusTypeStatus
+    , instanceStatusTypeDetails :: [InstanceStatusDetail]
     }
   deriving (Show, Eq)
 
 data InstanceStatusTypeStatus
-    = InstanceStatusOK
-    | InstanceStatusImpaired
-    | InstanceStatusInsufficientData
-    | InstanceStatusNotApplicable
+    = InstanceStatusTypeStatusOK
+    | InstanceStatusTypeStatusImpaired
+    | InstanceStatusTypeStatusInsufficientData
+    | InstanceStatusTypeStatusNotApplicable
   deriving (Show, Eq)
 
 data InstanceStatusDetail = InstanceStatusDetail
-    { isddName :: InstanceStatusDetailName
-    , isddStatus :: InstanceStatusDetailStatus
-    , isddImpairedSince :: Maybe UTCTime
+    { instanceStatusDetailName :: InstanceStatusDetailName
+    , instanceStatusDetailStatus :: InstanceStatusDetailStatus
+    , instanceStatusDetailImpairedSince :: Maybe UTCTime
     }
   deriving (Show, Eq)
 
@@ -343,19 +379,19 @@
   deriving (Show, Eq)
 
 data InstanceState
-    = Pending
-    | Running
-    | ShuttingDown
-    | Terminated
-    | Stopping
-    | Stopped
-    | UnknownState Int
+    = InstanceStatePending
+    | InstanceStateRunning
+    | InstanceStateShuttingDown
+    | InstanceStateTerminated
+    | InstanceStateStopping
+    | InstanceStateStopped
+    | InstanceStateUnknown Int
   deriving (Show, Eq)
 
 data Placement = Placement
     { placementAvailabilityZone :: Text
     , placementGroupName :: Text
-    , tenancy :: Text
+    , placementTenancy :: Text
     }
   deriving (Show, Eq)
 
@@ -368,106 +404,111 @@
 data Architecture = I386 | X86_64 deriving (Show, Eq)
 
 data InstanceBlockDeviceMapping = InstanceBlockDeviceMapping
-    { instanceDeviceName :: Text
-    , instanceEbs :: InstanceEbsBlockDevice
+    { instanceBlockDeviceMappingDeviceName :: Text
+    , instanceBlockDeviceMappingEbs :: EbsInstanceBlockDevice
     }
   deriving (Show, Eq)
 
-data InstanceEbsBlockDevice = InstanceEbsBlockDevice
-    { instanceEbsVolumeId :: Text
-    , instanceEbsState :: AttachmentSetItemResponseStatus
-    , instanceEbsAttachTime :: UTCTime
-    , instanceEbsDeleteOnTermination :: Bool
+data EbsInstanceBlockDevice = EbsInstanceBlockDevice
+    { ebsInstanceBlockDeviceVolumeId :: Text
+    , ebsInstanceBlockDeviceState :: AttachmentSetItemResponseStatus
+    , ebsInstanceBlockDeviceAttachTime :: UTCTime
+    , ebsInstanceBlockDeviceDeleteOnTermination :: Bool
     }
   deriving (Show, Eq)
 
-data InstanceLifecycle = LifecycleSpot | LifecycleNone
+data InstanceLifecycle
+    = LifecycleSpot
+    | LifecycleNone
   deriving (Show, Eq)
 
 data InstanceNetworkInterface = InstanceNetworkInterface
     { instanceNetworkInterfaceId :: Text
-    , iniSubnetId :: Text
-    , iniVpcId :: Text
-    , iniDescription :: Text
-    , iniOwnerId :: Text
-    , iniStatus :: Text
-    , iniPrivateIpAddress :: Text
-    , iniPrivateDnsName :: Maybe Text
-    , iniSourceDestCheck :: Bool
-    , iniGroupSet :: [Group]
-    , iniAttachment :: NetworkInterfaceAttachment
-    , iniAssociation :: Maybe NetworkInterfaceAssociation
-    , iniPrivateIpAddressSet :: [InstancePrivateIpAddress]
+    , instanceNetworkInterfaceSubnetId :: Text
+    , instanceNetworkInterfaceVpcId :: Text
+    , instanceNetworkInterfaceDescription :: Text
+    , instanceNetworkInterfaceOwnerId :: Text
+    , instanceNetworkInterfaceStatus :: Text
+    , instanceNetworkInterfacePrivateIpAddress :: Text
+    , instanceNetworkInterfacePrivateDnsName :: Maybe Text
+    , instanceNetworkInterfaceSourceDestCheck :: Bool
+    , instanceNetworkInterfaceGroupSet :: [Group]
+    , instanceNetworkInterfaceAttachment
+        :: NetworkInterfaceAttachment
+    , instanceNetworkInterfaceAssociation
+        :: Maybe NetworkInterfaceAssociation
+    , instanceNetworkInterfacePrivateIpAddressSet
+        :: [InstancePrivateIpAddress]
     }
   deriving (Show, Eq)
 
 data NetworkInterfaceAttachment = NetworkInterfaceAttachment
-    { niatAttachmentId :: Text
-    , niatDeviceIndex :: Int
-    , niatStatus :: Text
-    , niatAttachTime :: UTCTime
-    , niatDeleteOnTermination :: Bool
+    { networkInterfaceAttachmentId :: Text
+    , networkInterfaceAttachmentDeviceIndex :: Int
+    , networkInterfaceAttachmentStatus :: Text
+    , networkInterfaceAttachmentAttachTime :: UTCTime
+    , networkInterfaceAttachmentDeleteOnTermination :: Bool
     }
   deriving (Show, Eq)
 
 data NetworkInterfaceAssociation = NetworkInterfaceAssociation
-    { niasPublicIp :: Text
-    , niasIpOwnerId :: Text
+    { networkInterfaceAssociationPublicIp :: Text
+    , networkInterfaceAssociationIpOwnerId :: Text
     }
   deriving (Show, Eq)
 
 data InstancePrivateIpAddress = InstancePrivateIpAddress
-    { iPrivateIpAddress :: Text
-    , iPrimary :: Bool
-    , iAssociation :: Maybe NetworkInterfaceAssociation
+    { instancePrivateIpAddressAddress :: Text
+    , instancePrivateIpAddressPrimary :: Bool
+    , instancePrivateIpAddressAssociation :: Maybe NetworkInterfaceAssociation
     }
   deriving (Show, Eq)
 
 data IamInstanceProfile = IamInstanceProfile
-    { iipArn :: Text
-    , iipId :: Text
+    { iamInstanceProfileArn :: Text
+    , iamInstanceProfileId :: Text
     }
   deriving (Show, Eq)
 
 data ShutdownBehavior
-    = SBStop
-    | SBTerminate
+    = ShutdownBehaviorStop
+    | ShutdownBehaviorTerminate
   deriving (Show, Eq)
 
 data InstanceAttribute
-    = IAInstanceType Text
-    | IAKernelId (Maybe Text)
-    | IARamdiskId (Maybe Text)
-    | IAUserData (Maybe Text)
-    | IADisableApiTermination Bool
-    | IAShutdownBehavior ShutdownBehavior
-    | IARootDeviceName (Maybe Text)
-    | IABlockDeviceMapping [InstanceBlockDeviceMapping]
-    | IASourceDestCheck (Maybe Bool)
-    | IAGroupSet [Text]
-    | IAProductCodes [ProductCode]
-    | IAEbsOptimized Bool
+    = InstanceAttributeInstanceType Text
+    | InstanceAttributeKernelId (Maybe Text)
+    | InstanceAttributeRamdiskId (Maybe Text)
+    | InstanceAttributeUserData (Maybe Text)
+    | InstanceAttributeDisableApiTermination Bool
+    | InstanceAttributeShutdownBehavior ShutdownBehavior
+    | InstanceAttributeRootDeviceName (Maybe Text)
+    | InstanceAttributeBlockDeviceMapping [InstanceBlockDeviceMapping]
+    | InstanceAttributeSourceDestCheck (Maybe Bool)
+    | InstanceAttributeGroupSet [Text]
+    | InstanceAttributeProductCodes [ProductCode]
+    | InstanceAttributeEbsOptimized Bool
   deriving (Show, Eq)
 
 data Address = Address
-    { addrPublicIp :: Text
-    , addrAllocationId :: Maybe Text
-    , addrDomain :: AddressDomain
-    , addrInstanceId :: Maybe Text
-    , addrAssociationId :: Maybe Text
-    , addrNetworkInterfaceId :: Maybe Text
-    , addrNetworkInterfaceOwnerId :: Maybe Text
-    , addrPrivateIpAddress :: Maybe Text
+    { addressPublicIp :: Text
+    , addressAllocationId :: Maybe Text
+    , addressDomain :: AddressDomain
+    , addressInstanceId :: Maybe Text
+    , addressAssociationId :: Maybe Text
+    , addressNetworkInterfaceId :: Maybe Text
+    , addressNetworkInterfaceOwnerId :: Maybe Text
+    , addressPrivateIpAddress :: Maybe Text
     }
   deriving (Show, Eq)
 
 data AddressDomain = AddressDomainStandard | AddressDomainVPC
   deriving (Show, Eq)
 
-data AllocateAddressResponse = AllocateAddressResponse
-    { alaPublicIp :: Text
-    , alaDomain :: AddressDomain
-    , alaAllocationId :: Maybe Text
+data AllocateAddress = AllocateAddress
+    { allocateAddressPublicIp :: Text
+    , allocateAddressDomain :: AddressDomain
+    , allocateAddressAllocationId :: Maybe Text
     }
   deriving (Show, Eq)
 
@@ -483,395 +524,416 @@
   deriving (Show, Eq)
 
 data InstanceStateChange = InstanceStateChange
-    { iscInstanceId :: Text
-    , iscCurrentState :: InstanceState
-    , iscPreviousState :: InstanceState
+    { instanceStateChangeInstanceId :: Text
+    , instanceStateChangeCurrentState :: InstanceState
+    , instanceStateChangePreviousState :: InstanceState
     }
   deriving (Show, Eq)
 
 data ConsoleOutput = ConsoleOutput
-    { coInstanceId :: Text
-    , coTimestamp :: UTCTime -- ^ The time the data was last updated.
-    , coOutput :: Text
+    { consoleOutputInstanceId :: Text
+    , consoleOutputTimestamp :: UTCTime
+        -- ^ The time the data was last updated.
+    , consoleOutputOutput :: Text
     }
   deriving (Show, Eq)
 
 data PasswordData = PasswordData
-    { pdInstanceId :: Text
-    , pdTimestamp :: UTCTime -- ^ The time the data was last updated.
-    , pdPasswordData :: Text
+    { passwordDataInstanceId :: Text
+    , passwordDataTimestamp :: UTCTime
+      -- ^ The time the data was last updated.
+    , passwordDataPasswordData :: Text
     }
   deriving (Show, Eq)
 
 data Snapshot = Snapshot
     { snapshotId :: Text
-    , ssVolumeId :: Text
-    , ssStatus :: SnapshotStatus
-    , ssStartTime :: UTCTime
-    , ssProgress :: Text
-    , ssOwnerId :: Text
-    , ssVolumeSize :: Int
-    , ssDescription :: Text
-    , ssOwnerAlias :: Maybe Text
-    , ssTagSet :: [ResourceTag]
+    , snapshotVolumeId :: Text
+    , snapshotStatus :: SnapshotStatus
+    , snapshotStartTime :: UTCTime
+    , snapshotProgress :: Text
+    , snapshotOwnerId :: Text
+    , snapshotVolumeSize :: Int
+    , snapshotDescription :: Text
+    , snapshotOwnerAlias :: Maybe Text
+    , snapshotTagSet :: [ResourceTag]
     }
   deriving (Show, Eq)
 
-data SnapshotStatus = SSPending | SSCompleted | SSError
+data SnapshotStatus
+    = SnapshotPending
+    | SnapshotCompleted
+    | SnapshotError
   deriving (Show, Eq)
 
 data Volume = Volume
     { volumeId :: Text
-    , volSize :: Int
-    , volSnapshotId :: Maybe Text
-    , volAvailabilityZone :: Text
-    , volStatus :: VolumeState
-    , volCreateTime :: UTCTime
-    , volAttachmentSet :: [AttachmentSetItemResponse]
-    , volTagSet :: [ResourceTag]
-    , volVolumeType :: VolumeType
+    , volumeSize :: Int
+    , volumeSnapshotId :: Maybe Text
+    , volumeAvailabilityZone :: Text
+    , volumeStatus :: VolumeState
+    , volumeCreateTime :: UTCTime
+    , volumeAttachmentSet :: [AttachmentSetItemResponse]
+    , volumeTagSet :: [ResourceTag]
+    , volumeVolumeType :: VolumeType
     }
   deriving (Show, Eq)
 
 data VolumeState
-    = VolCreating
-    | VolAvailable
-    | VolInUse
-    | VolDeleting
-    | VolDeleted
-    | VolError
+    = VolumeStateCreating
+    | VolumeStateAvailable
+    | VolumeStateInUse
+    | VolumeStateDeleting
+    | VolumeStateDeleted
+    | VolumeStateError
   deriving (Show, Eq)
 
 data AttachmentSetItemResponse = AttachmentSetItemResponse
-    { asirVolumeId :: Text
-    , asirInstanceId :: Text
-    , asirDevice :: Text
-    , asirStatus :: AttachmentSetItemResponseStatus
-    , asirAttachTime :: UTCTime
-    , asirDeleteOnTermination :: Maybe Bool
+    { attachmentSetItemResponseVolumeId :: Text
+    , attachmentSetItemResponseInstanceId :: Text
+    , attachmentSetItemResponseDevice :: Text
+    , attachmentSetItemResponseStatus
+        :: AttachmentSetItemResponseStatus
+    , attachmentSetItemResponseAttachTime :: UTCTime
+    , attachmentSetItemResponseDeleteOnTermination :: Maybe Bool
     }
   deriving (Show, Eq)
 
 data AttachmentSetItemResponseStatus
-    = AsirAttaching
-    | AsirAttached
-    | AsirDetaching
-    | AsirDetached
+    = AttachmentSetItemResponseStatusAttaching
+    | AttachmentSetItemResponseStatusAttached
+    | AttachmentSetItemResponseStatusDetaching
+    | AttachmentSetItemResponseStatusDetached
   deriving (Show, Eq)
 
 data KeyPair = KeyPair
-    { keyName :: Text
-    , keyFingerprint :: Text
+    { keyPairName :: Text
+    , keyPairFingerprint :: Text
     }
   deriving (Show, Eq)
 
 data SecurityGroup = SecurityGroup
-    { sgOwnerId :: Text
-    , sgGroupId :: Text
-    , sgGroupName :: Text
-    , sgGroupDescription :: Text
-    , sgVpcId :: Maybe Text
-    , sgIpPermissions :: [IpPermission]
-    , sgIpPermissionsEgress :: [IpPermission]
-    , sgTagSet :: [ResourceTag]
+    { securityGroupOwnerId :: Text
+    , securityGroupId :: Text
+    , securityGroupName :: Text
+    , securityGroupDescription :: Text
+    , securityGroupVpcId :: Maybe Text
+    , securityGroupIpPermissions :: [IpPermission]
+    , securityGroupIpPermissionsEgress :: [IpPermission]
+    , securityGroupTagSet :: [ResourceTag]
     }
   deriving (Show, Eq)
 
 data IpPermission = IpPermission
-    { ippIpProtocol :: Text
-    , ippFromPort :: Maybe Int
-    , ippToPort :: Maybe Int
-    , ippGroups :: [UserIdGroupPair]
-    , ippIpRanges :: [IpRange]
+    { ipPermissionIpProtocol :: Text
+    , ipPermissionFromPort :: Maybe Int
+    , ipPermissionToPort :: Maybe Int
+    , ipPermissionGroups :: [UserIdGroupPair]
+    , ipPermissionIpRanges :: [IpRange]
     }
   deriving (Show, Eq)
 
 data UserIdGroupPair = UserIdGroupPair
-    { uigpUserId :: Maybe Text
-    , uigpGroupId :: Text
-    , uigpGroupName :: Maybe Text
+    { userIdGroupPairUserId :: Maybe Text
+    , userIdGroupPairGroupId :: Text
+    , userIdGroupPairGroupName :: Maybe Text
     }
   deriving (Show, Eq)
 
 data IpRange = IpRange
-    { iprCidrIp :: Text
+    { ipRangeCidrIp :: Text
     }
   deriving (Show, Eq)
 
 data BlockDeviceMappingParam
-    = BlockDeviceMappingParamEBS
-        { bdmpEbsDeviceName :: Text
-        , bdmpEbsNoDevice :: Maybe Bool
-        , bdmpEbsSource :: EbsSource
-        , bdmpEbsDeleteOnTermination :: Maybe Bool
-        , bdmpEbsVolumeType :: Maybe VolumeType
+    = BlockDeviceMappingParamEbs
+        { blockDeviceMappingParamEbsDeviceName :: Text
+        , blockDeviceMappingParamEbsNoDevice :: Maybe Bool
+        , blockDeviceMappingParamEbsSource :: EbsSource
+        , blockDeviceMappingParamEbsDeleteOnTermination
+            :: Maybe Bool
+        , blockDeviceMappingParamEbsVolumeType :: Maybe VolumeType
         }
     | BlockDeviceMappingParamInstanceStore
-        { bdmpIsDeviceName :: Text
-        , bdmpIsNoDevice :: Maybe Bool
-        , bdmpIsVirtualName :: Maybe Text
+        { blockDeviceMappingParamInstanceStoreDeviceName :: Text
+        , blockDeviceMappingParamInstanceStoreNoDevice
+            :: Maybe Bool
+        , blockDeviceMappingParamInstanceStoreVirtualName
+            :: Maybe Text
         }
   deriving (Show, Eq)
 
 data EbsSource
-    = EbsSnapshotId Text
-    | EbsVolumeSize Int
+    = EbsSourceSnapshotId Text
+    | EbsSourceVolumeSize Int
   deriving (Show, Eq)
 
 data NetworkInterfaceParam = NetworkInterfaceParam
-    { nipInterfaceId :: Maybe Text
-    , nipDeviceIndex :: Maybe Text
-    , nipSubnetId :: Maybe Text
-    , nipDescription :: Maybe Text
-    , nipPrivateIpAddresses :: [Text]
-    , nipSecurityGroupIds :: [Text]
-    , nipDeleteOnTermination :: Maybe Bool
+    { networkInterfaceParamInterfaceId :: Maybe Text
+    , networkInterfaceParamDeviceIndex :: Maybe Text
+    , networkInterfaceParamSubnetId :: Maybe Text
+    , networkInterfaceParamDescription :: Maybe Text
+    , networkInterfaceParamPrivateIpAddresses :: [Text]
+    , networkInterfaceParamSecurityGroupIds :: [Text]
+    , networkInterfaceParamDeleteOnTermination :: Maybe Bool
     }
   deriving (Show, Eq)
 
 data VpnConnection = VpnConnection
     { vpnConnectionId :: Text
-    , vcState :: VpnConnectionState
-    , vcCustomerGatewayConfiguration :: Text
-    , vcType :: Text
-    , vcCustomerGatewayId :: Text
-    , vcVpnGatewayId :: Text
-    , vcTagSet :: [ResourceTag]
-    , vcVgwTelemetry :: [VpnTunnelTelemetry]
-    , vcOptions :: Maybe VpnConnectionOptionsRequest
-    , vcRoutes :: Maybe VpnStaticRoute
+    , vpnConnectionState :: VpnConnectionState
+    , vpnConnectionCustomerGatewayConfiguration :: Text
+    , vpnConnectionType :: Text
+    , vpnConnectionCustomerGatewayId :: Text
+    , vpnConnectionVpnGatewayId :: Text
+    , vpnConnectionTagSet :: [ResourceTag]
+    , vpnConnectionVgwTelemetry :: [VpnTunnelTelemetry]
+    , vpnConnectionOptions :: Maybe VpnConnectionOptionsRequest
+    , vpnConnectionRoutes :: Maybe VpnStaticRoute
     }
   deriving (Show, Eq)
 
 data VpnConnectionState
-    = VCSPending
-    | VCSAvailable
-    | VCSDeleting
-    | VCSDeleted
+    = VpnConnectionStatePending
+    | VpnConnectionStateAvailable
+    | VpnConnectionStateDeleting
+    | VpnConnectionStateDeleted
   deriving (Show, Eq)
 
 data VpnTunnelTelemetry = VpnTunnelTelemetry
-    { vttOutsideIpAddress :: Text
-    , vttStatus :: VpnTunnelTelemetryStatus
-    , vttLastStatusChange :: UTCTime
-    , vttStatusMessage :: Text
-    , vttAcceptRouteCount :: Int
+    { vpnTunnelTelemetryOutsideIpAddress :: Text
+    , vpnTunnelTelemetryStatus :: VpnTunnelTelemetryStatus
+    , vpnTunnelTelemetryLastStatusChange :: UTCTime
+    , vpnTunnelTelemetryStatusMessage :: Text
+    , vpnTunnelTelemetryAcceptRouteCount :: Int
     }
   deriving (Show, Eq)
 
 data VpnTunnelTelemetryStatus
-    = VTTSUp
-    | VTTSDown
+    = VpnTunnelTelemetryStatusUp
+    | VpnTunnelTelemetryStatusDown
   deriving (Show, Eq)
 
 data VpnConnectionOptionsRequest = VpnConnectionOptionsRequest
-    { staticRoutesOnly :: Bool
+    { vpnConnectionOptionsRequestStaticRoutesOnly :: Bool
     }
   deriving (Show, Eq)
 
 data VpnStaticRoute = VpnStaticRoute
-    { vsrDestinationCidrBlock :: Text
-    , vsrSource :: VpnStaticRouteSource
-    , vsrState :: VpnStaticRouteState
+    { vpnStaticRouteDestinationCidrBlock :: Text
+    , vpnStaticRouteSource :: VpnStaticRouteSource
+    , vpnStaticRouteState :: VpnStaticRouteState
     }
   deriving (Show, Eq)
 
-data VpnStaticRouteSource = VSRStatic
+data VpnStaticRouteSource = VpnStaticRouteSourceStatic
   deriving (Show, Eq)
 
 data VpnStaticRouteState
-    = VSRSPending
-    | VSRSAvailable
-    | VSRSDeleting
-    | VSRSDeleted
+    = VpnStaticRouteStatePending
+    | VpnStaticRouteStateAvailable
+    | VpnStaticRouteStateDeleting
+    | VpnStaticRouteStateDeleted
   deriving (Show, Eq)
 
 data RunInstancesRequest = RunInstancesRequest
-    { riImageId :: Text -- ^ Required
-    , riMinCount :: Int -- ^ Required
-    , riMaxCount :: Int -- ^ Required
-    , riKeyName :: Maybe Text
-    , riSecurityGroupIds :: [Text]
+    { runInstancesRequestImageId :: Text -- ^ Required
+    , runInstancesRequestMinCount :: Int -- ^ Required
+    , runInstancesRequestMaxCount :: Int -- ^ Required
+    , runInstancesRequestKeyName :: Maybe Text
+    , runInstancesRequestSecurityGroupIds :: [Text]
       -- ^ SecurityGroupIds (Required for VPC; optional for EC2)
-    , riSecurityGroups :: [Text]
+    , runInstancesRequestSecurityGroups :: [Text]
       -- ^ SecurityGroups (Only for EC2; either id or name is accepted)
-    , riUserData :: Maybe ByteString
+    , runInstancesRequestUserData :: Maybe ByteString
       -- ^ UserData (Base64-encoded MIME user data)
-    , riInstanceType :: Maybe Text
-    , riAvailabilityZone :: Maybe Text
-    , riPlacementGroup :: Maybe Text
-    , riTenancy :: Maybe Text
-    , riKernelId :: Maybe Text
-    , riRamdiskId :: Maybe Text
-    , riBlockDeviceMappings :: [BlockDeviceMappingParam]
-    , riMonitoringEnabled :: Maybe Bool
-    , riSubnetId :: Maybe Text
-    , riDisableApiTermination :: Maybe Bool
-    , riShutdownBehavior :: Maybe ShutdownBehavior
-    , riPrivateIpAddresses :: [Text] -- ^ XXX: not implemented
-    , riClientToken :: Maybe Text
-    , riNetworkInterface :: [NetworkInterfaceParam] -- ^ XXX: not implemented
-    , riIamInstanceProfile :: Maybe IamInstanceProfile
-    , riEbsOptimized :: Maybe Bool
+    , runInstancesRequestInstanceType :: Maybe Text
+    , runInstancesRequestAvailabilityZone :: Maybe Text
+    , runInstancesRequestPlacementGroup :: Maybe Text
+    , runInstancesRequestTenancy :: Maybe Text
+    , runInstancesRequestKernelId :: Maybe Text
+    , runInstancesRequestRamdiskId :: Maybe Text
+    , runInstancesRequestBlockDeviceMappings
+        :: [BlockDeviceMappingParam]
+    , runInstancesRequestMonitoringEnabled :: Maybe Bool
+    , runInstancesRequestSubnetId :: Maybe Text
+    , runInstancesRequestDisableApiTermination :: Maybe Bool
+    , runInstancesRequestShutdownBehavior
+        :: Maybe ShutdownBehavior
+    , runInstancesRequestPrivateIpAddress :: Maybe Text
+    , runInstancesRequestClientToken :: Maybe Text
+    , runInstancesRequestNetworkInterface
+        :: [NetworkInterfaceParam] -- ^ XXX: not implemented
+    , runInstancesRequestIamInstanceProfile
+        :: Maybe IamInstanceProfile
+    , runInstancesRequestEbsOptimized :: Maybe Bool
     }
   deriving (Show, Eq)
 
 data InstanceAttributeRequest
-    = IARInstanceType
-    | IARKernelId
-    | IARRamdiskId
-    | IARUserData
-    | IARDisableApiTermination
-    | IARShutdownBehavior
-    | IARRootDeviceName
-    | IARBlockDeviceMapping
-    | IARSourceDestCheck
-    | IARGroupSet
-    | IARProductCodes
-    | IAREbsOptimized
+    = InstanceAttributeRequestInstanceType
+    | InstanceAttributeRequestKernelId
+    | InstanceAttributeRequestRamdiskId
+    | InstanceAttributeRequestUserData
+    | InstanceAttributeRequestDisableApiTermination
+    | InstanceAttributeRequestShutdownBehavior
+    | InstanceAttributeRequestRootDeviceName
+    | InstanceAttributeRequestBlockDeviceMapping
+    | InstanceAttributeRequestSourceDestCheck
+    | InstanceAttributeRequestGroupSet
+    | InstanceAttributeRequestProductCodes
+    | InstanceAttributeRequestEbsOptimized
   deriving (Show, Eq, Ord)
 
 data ResetInstanceAttributeRequest
-    = RIAPKernel
-    | RIAPRamdisk
-    | RIAPSourceDestCheck
+    = ResetInstanceAttributeRequestKernel
+    | ResetInstanceAttributeRequestRamdisk
+    | ResetInstanceAttributeRequestSourceDestCheck
   deriving (Show, Eq)
 
 data ModifyInstanceAttributeRequest
-    = MIAPInstanceType Text
-    | MIAPKernelId Text
-    | MIAPRamdiskId Text
-    | MIAPUserData Text
-    | MIAPDisableApiTermination Bool
-    | MIAPShutdownBehavior ShutdownBehavior
-    | MIAPRootDeviceName Text
-    | MIAPBlockDeviceMapping [BlockDeviceMappingParam]
-    | MIAPSourceDestCheck Bool
-    | MIAPGroupSet [Text]
-    | MIAPEbsOptimized Bool
+    = ModifyInstanceAttributeRequestInstanceType Text
+    | ModifyInstanceAttributeRequestKernelId Text
+    | ModifyInstanceAttributeRequestRamdiskId Text
+    | ModifyInstanceAttributeRequestUserData Text
+    | ModifyInstanceAttributeRequestDisableApiTermination Bool
+    | ModifyInstanceAttributeRequestShutdownBehavior
+        ShutdownBehavior
+    | ModifyInstanceAttributeRequestRootDeviceName Text
+    | ModifyInstanceAttributeRequestBlockDeviceMapping
+        [BlockDeviceMappingParam]
+    | ModifyInstanceAttributeRequestSourceDestCheck Bool
+    | ModifyInstanceAttributeRequestGroupSet [Text]
+    | ModifyInstanceAttributeRequestEbsOptimized Bool
   deriving (Show, Eq)
 
 data RegisterImageRequest = RegisterImageRequest
-    { rirName :: Text
-    , rirImageLocation :: Maybe Text
-    , rirDescription :: Maybe Text
-    , rirArchitecture :: Maybe Text
-    , rirKernelId :: Maybe Text
-    , rirRamdiskId :: Maybe Text
-    , rirRootDeviceName :: Maybe Text
-    , rirBlockDeviceMappings :: [BlockDeviceMappingParam]
+    { registerImageRequestName :: Text
+    , registerImageRequestImageLocation :: Maybe Text
+    , registerImageRequestDescription :: Maybe Text
+    , registerImageRequestArchitecture :: Maybe Text
+    , registerImageRequestKernelId :: Maybe Text
+    , registerImageRequestRamdiskId :: Maybe Text
+    , registerImageRequestRootDeviceName :: Maybe Text
+    , registerImageRequestBlockDeviceMappings
+        :: [BlockDeviceMappingParam]
     }
   deriving (Show, Eq)
 
 data CreateVolumeRequest
     = CreateNewVolume
-        { cnvSize :: Int
-        , cnvAvailabilityZone :: Text
-        , cnvVolumeType :: Maybe VolumeType
+        { createNewVolumeSize :: Int
+        , createNewVolumeAvailabilityZone :: Text
+        , createNewVolumeVolumeType :: Maybe VolumeType
         }
     | CreateFromSnapshot
-        { cfsSnapshotId :: Text
-        , cfsAvailabilityZone :: Text
-        , cfsSize :: Maybe Int
-        , cfsVolumeType :: Maybe VolumeType
+        { createFromSnapshotSnapshotId :: Text
+        , createFromSnapshotAvailabilityZone :: Text
+        , createFromSnapshotSize :: Maybe Int
+        , createFromSnapshotVolumeType :: Maybe VolumeType
         }
   deriving (Show, Eq)
 
 data AssociateAddressRequest
-    = AAEC2Instance
-        { aaec2PublicIp :: Text
-        , aaec2InstanceId :: Text
+    = AssociateAddressRequestEc2
+        { associateAddressRequestEc2PublicIp :: Text
+        , associateAddressRequestEc2InstanceId :: Text
         }
-    | AAVPCInstance
-        { aavpcAllocationId :: Text
-        , aavpcInstanceId :: Maybe Text
-        , aavpcNetworkInterfaceId :: Maybe Text
-        , aavpcPrivateIpAddress :: Maybe Text
-        , aavpcAllowReassociation :: Maybe Bool
+    | AssociateAddressRequestVpc
+        { associateAddressRequestVpcAllocationId :: Text
+        , associateAddressRequestVpcInstanceId :: Maybe Text
+        , associateAddressRequestVpcNetworkInterfaceId
+            :: Maybe Text
+        , associateAddressRequestVpcPrivateIpAddress :: Maybe Text
+        , associateAddressRequestVpcAllowReassociation
+            :: Maybe Bool
         }
   deriving (Show, Eq)
 
 data DisassociateAddressRequest
-    = DAEC2 Text -- ^ PublicIp for EC2
-    | DAVPC Text -- ^ AssociationId for VPC
+    = DisassociateAddressRequestEc2 Text -- ^ PublicIp for EC2
+    | DisassociateAddressRequestVpc Text
+      -- ^ AssociationId for VPC
   deriving (Show, Eq)
 
-data SecurityGroupRequest = GroupId Text | GroupName Text
+data SecurityGroupRequest
+    = SecurityGroupRequestGroupId Text
+    | SecurityGroupRequestGroupName Text
   deriving (Show, Eq)
 
 data Subnet = Subnet
-    { snSubnetId :: Text
-    , snState :: SubnetState
-    , snVpicId :: Text
-    , snCidrBlock :: Text
-    , snAvailableIpAddressCount :: Int
-    , snCAvailabilityZone :: Text
-    , snTagSet :: [ResourceTag]
+    { subnetId :: Text
+    , subnetState :: SubnetState
+    , subnetVpicId :: Text
+    , subnetCidrBlock :: Text
+    , subnetAvailableIpAddressCount :: Int
+    , subnetAvailabilityZone :: Text
+    , subnetTagSet :: [ResourceTag]
     }
   deriving (Show, Eq)
 
-data SubnetState = SubnetPending | SubnetAvailable
+data SubnetState = SubnetStatePending | SubnetStateAvailable
   deriving (Show, Eq)
 
 data CreateSubnetRequest = CreateSubnetRequest
-    { csrVpcId :: Text
-    , csrCidrBlock :: Text
-    , csrAvailabilityZone :: Maybe Text
+    { createSubnetRequestVpcId :: Text
+    , createSubnetRequestCidrBlock :: Text
+    , createSubnetRequestAvailabilityZone :: Maybe Text
     }
   deriving (Show, Eq)
 
 data VolumeStatus = VolumeStatus
-    { vstVolumeId :: Text
-    , vstAvailabilityZone :: Text
-    , vstVolumeStatus :: VolumeStatusInfo
-    , vstEventSet :: [VolumeStatusEvent]
-    , vstActionSet :: [VolumeStatusAction]
+    { volumeStatusVolumeId :: Text
+    , volumeStatusAvailabilityZone :: Text
+    , volumeStatusVolumeStatus :: VolumeStatusInfo
+    , volumeStatusEventSet :: [VolumeStatusEvent]
+    , volumeStatusActionSet :: [VolumeStatusAction]
     }
   deriving (Show, Eq)
 
 data VolumeStatusInfo = VolumeStatusInfo
-    { vsiStatus :: VolumeStatusInfoStatus
-    , vsiDetails :: [VolumeStatusDetail]
+    { volumeStatusInfoStatus :: VolumeStatusInfoStatus
+    , volumeStatusInfoDetails :: [VolumeStatusDetail]
     }
   deriving (Show, Eq)
 
 data VolumeStatusInfoStatus
-    = VSIOK
-    | VSIImpaired
-    | VSIInsufficientData
+    = VolumeStatusInfoStatusOK
+    | VolumeStatusInfoStatusImpaired
+    | VolumeStatusInfoStatusInsufficientData
   deriving (Show, Eq)
 
 data VolumeStatusDetail = VolumeStatusDetail
-    { vsdName :: Text
-    , vsdStatus :: Text
+    { volumeStatusDetailName :: Text
+    , volumeStatusDetailStatus :: Text
     }
   deriving (Show, Eq)
 
 data VolumeStatusEvent = VolumeStatusEvent
-    { vseEventType :: Text
-    , vseEventId :: Text
-    , vseDescription :: Text
-    , vseNotBefore :: Maybe UTCTime
-    , vseNotAfter :: Maybe UTCTime
+    { volumeStatusEventType :: Text
+    , volumeStatusEventId :: Text
+    , volumeStatusEventDescription :: Text
+    , volumeStatusEventNotBefore :: Maybe UTCTime
+    , volumeStatusEventNotAfter :: Maybe UTCTime
     }
   deriving (Show, Eq)
 
 data VolumeStatusAction = VolumeStatusAction
-    { vsaCode :: Text
-    , vsaEventType :: Text
-    , vsaEventId :: Text
-    , vsaDescription :: Text
+    { volumeStatusActionCode :: Text
+    , volumeStatusActionEventType :: Text
+    , volumeStatusActionEventId :: Text
+    , volumeStatusActionDescription :: Text
     }
   deriving (Show, Eq)
 
 data VolumeAttribute
-    = VAAutoEnableIO Bool
-    | VAProductCodes [ProductCode]
+    = VolumeAttributeAutoEnableIO Bool
+    | VolumeAttributeProductCodes [ProductCode]
   deriving (Show, Eq)
 
 data VolumeAttributeRequest
-    = VARAutoEnableIO
-    | VARProductCodes
+    = VolumeAttributeRequestAutoEnableIO
+    | VolumeAttributeRequestProductCodes
   deriving (Show, Eq)
 
 data NetworkAcl = NetworkAcl
@@ -922,7 +984,8 @@
 data NetworkAclEntryRequest = NetworkAclEntryRequest
     { networkAclEntryRequestNetworkAclId :: Text
     , networkAclEntryRequestRuleNumber :: Int
-    , networkAclEntryRequestProtocol :: Int -- ^ Protocol Number <http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xml>
+    , networkAclEntryRequestProtocol :: Int
+      -- ^ Protocol Number <http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xml>
     , networkAclEntryRequestRuleAction :: NetworkAclRuleAction
     , networkAclEntryRequestEgress :: Bool
     , networkAclEntryRequestCidrBlock :: Text
@@ -932,23 +995,23 @@
   deriving (Show, Eq)
 
 data RouteTable = RouteTable
-    { rtRouteTableId :: Text
-    , rtVpcId :: Text
-    , rtRouteSet :: [Route]
-    , rtAssociationSet :: [RouteTableAssociation]
-    , rtPropagatingVgw :: Maybe PropagatingVgw
-    , rtTagSet :: [ResourceTag]
+    { routeTableId :: Text
+    , routeTableVpcId :: Text
+    , routeTableRouteSet :: [Route]
+    , routeTableAssociationSet :: [RouteTableAssociation]
+    , routeTablePropagatingVgw :: Maybe PropagatingVgw
+    , routeTableTagSet :: [ResourceTag]
     }
   deriving (Show, Eq)
 
 data Route = Route
-    { rDestinationCidrBlock :: Text
-    , rGatewayId :: Maybe Text
-    , rInstanceId :: Maybe Text
-    , rInstanceOwnerId :: Maybe Text
-    , rNetworkInterfaceId :: Maybe Text
-    , rState :: RouteState
-    , rOrigin :: Maybe RouteOrigin
+    { routeDestinationCidrBlock :: Text
+    , routeGatewayId :: Maybe Text
+    , routeInstanceId :: Maybe Text
+    , routeInstanceOwnerId :: Maybe Text
+    , routeNetworkInterfaceId :: Maybe Text
+    , routeState :: RouteState
+    , routeOrigin :: Maybe RouteOrigin
     }
   deriving (Show, Eq)
 
@@ -962,10 +1025,10 @@
   deriving (Show, Eq)
 
 data RouteTableAssociation = RouteTableAssociation
-    { rtaRouteTableAssociationId :: Text
-    , rtaRouteTableId :: Text
-    , rtaSubnetId :: Maybe Text
-    , rtaMain :: Maybe Bool
+    { routeTableAssociationId :: Text
+    , routeTableAssociationRouteTableId :: Text
+    , routeTableAssociationSubnetId :: Maybe Text
+    , routeTableAssociationMain :: Maybe Bool
     }
   deriving (Show, Eq)
 
@@ -1022,7 +1085,7 @@
     , customerGatewayType :: Text
     , customerGatewayIpAddress :: Text
     , customerGatewayBgpAsn :: Int
-    , customerGateway :: [ResourceTag]
+    , customerGatewayTagSet :: [ResourceTag]
     }
   deriving (Show, Eq)
 
diff --git a/AWS/EC2/Util.hs b/AWS/EC2/Util.hs
--- a/AWS/EC2/Util.hs
+++ b/AWS/EC2/Util.hs
@@ -7,6 +7,7 @@
     , eachp
     , wait
     , count
+    , findTag
     ) where
 
 import Data.Conduit
@@ -20,8 +21,10 @@
 import qualified Data.Text as T
 import Control.Applicative
 import Control.Parallel (par)
+import Data.List (find)
 
 import AWS.EC2.Internal
+import AWS.EC2.Types (ResourceTag(resourceTagKey))
 
 list
     :: Monad m
@@ -100,3 +103,11 @@
             else do
                 liftIO $ CC.threadDelay 5
                 wait f g rid
+
+findTag
+    :: Text -- ^ resourceKey
+    -> [ResourceTag] -- ^ TagSet
+    -> Maybe ResourceTag
+findTag key tags = find f tags
+  where
+    f t = resourceTagKey t == key
diff --git a/AWS/EC2/VPC.hs b/AWS/EC2/VPC.hs
--- a/AWS/EC2/VPC.hs
+++ b/AWS/EC2/VPC.hs
@@ -133,7 +133,7 @@
     <$> do
         a <- getT "vpnConnectionId"
         traceShow a $ return a
-    <*> getF "state" vpnConnectionState
+    <*> getF "state" vpnConnectionState'
     <*> getT "customerGatewayConfiguration"
     <*> getT "type"
     <*> getT "customerGatewayId"
@@ -142,7 +142,7 @@
     <*> itemsSet "vgwTelemetry"
         (VpnTunnelTelemetry
         <$> getT "outsideIpAddress"
-        <*> getF "status" vpnTunnelTelemetryStatus
+        <*> getF "status" vpnTunnelTelemetryStatus'
         <*> getF "lastStatusChange" textToTime
         <*> getT "statusMessage"
         <*> getF "acceptedRouteCount" textToInt
@@ -154,8 +154,8 @@
     <*> elementM "routes"
         (VpnStaticRoute
         <$> getT "destinationCidrBlock"
-        <*> getF "source" vpnStaticRouteSource
-        <*> getF "state" vpnStaticRouteState
+        <*> getF "source" vpnStaticRouteSource'
+        <*> getF "state" vpnStaticRouteState'
         )
 
 ------------------------------------------------------------
diff --git a/AWS/EC2/Volume.hs b/AWS/EC2/Volume.hs
--- a/AWS/EC2/Volume.hs
+++ b/AWS/EC2/Volume.hs
@@ -10,6 +10,7 @@
     , describeVolumeAttribute
     , modifyVolumeAttribute
     ) where
+
 import Data.Text (Text)
 
 import Data.XML.Types (Event)
@@ -45,7 +46,7 @@
     <*> getF "size" textToInt
     <*> getMT "snapshotId"
     <*> getT "availabilityZone"
-    <*> getF "status" volumeStatus
+    <*> getF "status" volumeStatus'
     <*> getF "createTime" textToTime
     <*> itemsSet "attachmentSet" attachmentSink
     <*> resourceTagSink
@@ -56,13 +57,14 @@
     <$> getT "volumeId"
     <*> getT "instanceId"
     <*> getT "device"
-    <*> getF "status" attachmentSetItemResponseStatus
+    <*> getF "status" attachmentSetItemResponseStatus'
     <*> getF "attachTime" textToTime
     <*> getM "deleteOnTermination" (textToBool <$>)
 
 volumeTypeParam :: VolumeType -> [QueryParam]
-volumeTypeParam Standard = [ValueParam "VolumeType" "standard"]
-volumeTypeParam (IO1 iops) =
+volumeTypeParam VolumeTypeStandard =
+    [ValueParam "VolumeType" "standard"]
+volumeTypeParam (VolumeTypeIO1 iops) =
     [ ValueParam "VolumeType" "io1"
     , ValueParam "Iops" $ toText iops
     ]
@@ -147,7 +149,7 @@
     <$> getT "volumeId"
     <*> getT "availabilityZone"
     <*> element "volumeStatus" (VolumeStatusInfo
-        <$> getF "status" volumeStatusInfoStatus
+        <$> getF "status" volumeStatusInfoStatus'
         <*> itemsSet "details" (VolumeStatusDetail
             <$> getT "name"
             <*> getT "status"
@@ -204,14 +206,17 @@
         [ ValueParam "VolumeId" vid
         , ValueParam "Attribute" $ s attr
         ]
-    s VARAutoEnableIO = "autoEnableIO"
-    s VARProductCodes = "productCodes"
+    s VolumeAttributeRequestAutoEnableIO = "autoEnableIO"
+    s VolumeAttributeRequestProductCodes = "productCodes"
 
 volumeAttributeSink
     :: MonadThrow m
     => VolumeAttributeRequest
     -> GLSink Event m VolumeAttribute
-volumeAttributeSink VARAutoEnableIO =
-    VAAutoEnableIO <$> getF "autoEnableIO" textToBool
-volumeAttributeSink VARProductCodes =
-    VAProductCodes <$> productCodeSink
+volumeAttributeSink VolumeAttributeRequestAutoEnableIO
+    = VolumeAttributeAutoEnableIO
+    <$> element "autoEnableIO"
+        (getF "value" textToBool)
+volumeAttributeSink VolumeAttributeRequestProductCodes
+    = VolumeAttributeProductCodes
+    <$> productCodeSink
diff --git a/AWS/ELB/Internal.hs b/AWS/ELB/Internal.hs
--- a/AWS/ELB/Internal.hs
+++ b/AWS/ELB/Internal.hs
@@ -4,14 +4,12 @@
     where
 
 import Data.ByteString (ByteString)
-import Data.Text (Text)
 import Data.Conduit
 import Control.Monad.Trans.Control (MonadBaseControl)
 import Data.XML.Types (Event(..))
 
 import AWS.Class
 import AWS.Lib.Query
-import AWS.Lib.Parser
 
 apiVersion :: ByteString
 apiVersion = "2012-06-01"
@@ -25,9 +23,3 @@
     -> GLSink Event m a
     -> AWS AWSContext m a
 elbQuery = commonQuery apiVersion
-
-members :: MonadThrow m
-    => Text
-    -> GLSink Event m a
-    -> GLSink Event m [a]
-members name f = element name $ listConsumer "member" f
diff --git a/AWS/Lib/Parser.hs b/AWS/Lib/Parser.hs
--- a/AWS/Lib/Parser.hs
+++ b/AWS/Lib/Parser.hs
@@ -103,7 +103,7 @@
     => Text
     -> Pipe Event Event o u m a
     -> Pipe Event Event o u m a
-element name inner = XML.force "parse error" $ elementM name inner
+element name inner = XML.force ("parse error:" ++ T.unpack name) $ elementM name inner
 
 tagContentM :: MonadThrow m
     => Text
@@ -153,3 +153,9 @@
         <*> getT "Message"
     rid <- getT "RequestId"
     lift $ monadThrow $ ClientError status c m rid
+
+members :: MonadThrow m
+    => Text
+    -> GLSink Event m a
+    -> GLSink Event m [a]
+members name f = element name $ listConsumer "member" f
diff --git a/AWS/Lib/Query.hs b/AWS/Lib/Query.hs
--- a/AWS/Lib/Query.hs
+++ b/AWS/Lib/Query.hs
@@ -1,11 +1,15 @@
-{-# LANGUAGE FlexibleContexts, RankNTypes #-}
+{-# LANGUAGE FlexibleContexts, RankNTypes, CPP #-}
 
+#define DEBUG
 module AWS.Lib.Query
     ( requestQuery
     , QueryParam(..)
     , Filter
     , maybeParams
     , commonQuery
+#ifdef DEBUG
+    , debugQuery
+#endif
     ) where
 
 import           Data.ByteString (ByteString)
@@ -32,13 +36,16 @@
 import Data.Text (Text)
 import qualified Control.Monad.State as State
 import qualified Control.Monad.Reader as Reader
---import qualified Data.Conduit.Binary as CB
 
 import AWS.Class
 import AWS.Util
 import AWS.Credential
 import AWS.Lib.Parser
 
+#ifdef DEBUG
+import qualified Data.Conduit.Binary as CB
+#endif
+
 type Filter = (Text, [Text])
 
 data QueryParam
@@ -86,7 +93,6 @@
 toArrayParams (ArrayParams name params) = Map.fromList 
     [ (textToBS name <> "." <> bsShow i, textToBS param)
     | (i, param) <- zip ([1..]::[Int]) params
-
     ]
 toArrayParams (FilterParams kvs) =
     Map.fromList . concat . map f1 $ zip ([1..]::[Int]) kvs
@@ -100,7 +106,7 @@
     Map.singleton (textToBS k) (textToBS v)
 toArrayParams (StructArrayParams name vss) = Map.fromList l
   where
-    bsName = textToBS name
+    bsName =  textToBS name
     struct n (k, v) = (n <> "." <> textToBS k, textToBS v)
     l = mconcat
         [ map (struct (bsName <> "." <> bsShow i)) kvs
@@ -160,7 +166,6 @@
     let req = request { HTTP.checkStatus = checkStatus' }
     response <- HTTP.http req mgr
     let body = HTTP.responseBody response
---    body $$+- CB.sinkFile "debug.txt" >> fail "debug"
     let st = H.statusCode $ HTTP.responseStatus response
     if st < 400
         then return body
@@ -184,8 +189,29 @@
     ctx <- State.get
     cred <- Reader.ask
     rs <- lift $ requestQuery cred ctx action params apiVersion sinkError
---    lift $ rs $$+- CB.sinkFile "debug.txt" >> fail "debug"
     (res, rid) <- lift $ rs $$+-
         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/Util.hs b/AWS/Util.hs
--- a/AWS/Util.hs
+++ b/AWS/Util.hs
@@ -10,6 +10,7 @@
 import Data.Time (UTCTime)
 import qualified Data.Time as Time
 import qualified Data.Time.Parse as TP
+import System.Locale (defaultTimeLocale)
 
 toS :: BSL.ByteString -> ByteString
 toS = BS.concat . BSL.toChunks
@@ -35,12 +36,25 @@
     fst
     (TR.signed TR.decimal t)
 
+textToDouble :: Fractional a => Text -> a
+textToDouble t = either
+    (const $ error "not double value")
+    fst
+    (TR.signed TR.rational t)
+
 textToTime :: Text -> UTCTime
 textToTime
     = Time.localTimeToUTC Time.utc
     . maybe (error "time format error.") fst
     . TP.strptime fmt
     . T.unpack
+  where
+    fmt = "%FT%T"
+
+timeToText :: UTCTime -> Text
+timeToText
+    = T.pack
+    . Time.formatTime defaultTimeLocale fmt
   where
     fmt = "%FT%T"
 
diff --git a/Tests/Main.hs b/Tests/Main.hs
new file mode 100644
--- /dev/null
+++ b/Tests/Main.hs
@@ -0,0 +1,24 @@
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE NoMonomorphismRestriction #-}
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+
+module Main where
+
+import AWSTests.EC2Tests
+
+main :: IO ()
+main = do
+    runInstanceTests
+    runVpcTests
+    runAddressTests
+    runSnapshotTests
+    runImageTests
+    runSubnetsTests
+    runVolumeTests
+    runSecurityGroupTests
+    runRouteTableTests
+    runRegionTests
+    runInstanceTests
+    runAvailabilityZoneTests
+    runTagTests
+    runKeyPairTests
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.6.0.0
+version:             0.7.0.0
 synopsis:            AWS SDK for Haskell
 description:         An AWS(Amazon Web Services) liblary for Haskell.
 license:             BSD3
@@ -23,6 +23,8 @@
                    , AWS.RDS.Types
                    , AWS.ELB
                    , AWS.ELB.Types
+                   , AWS.CloudWatch
+                   , AWS.CloudWatch.Types
   other-modules:     AWS.Util , AWS.Credential
                    , AWS.Class
                    , AWS.EC2.Internal
@@ -50,6 +52,8 @@
                    , AWS.RDS.DBInstance
                    , AWS.ELB.Internal
                    , AWS.ELB.LoadBalancer
+                   , AWS.CloudWatch.Internal
+                   , AWS.CloudWatch.Metric
   ghc-options:       -Wall
                      -fno-warn-unused-do-bind
   extensions: OverloadedStrings
@@ -81,13 +85,21 @@
 
 test-suite test
     type:              exitcode-stdio-1.0
-    main-is:           main.hs
-    hs-source-dirs:    tests
+    main-is:           Main.hs
+    hs-source-dirs:    Tests
     ghc-options:       -Wall -threaded
-
+    extensions: OverloadedStrings
     build-depends: base
+                 , aws-sdk
+                 , conduit
+                 , text
+                 , monad-control
+                 , transformers
+                 , http-conduit
                  , hspec
                  , QuickCheck
+                 , hspec
+                 , HUnit
 
 source-repository head
     type:            git
diff --git a/tests/main.hs b/tests/main.hs
deleted file mode 100644
--- a/tests/main.hs
+++ /dev/null
@@ -1,21 +0,0 @@
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE NoMonomorphismRestriction #-}
-{-# OPTIONS_GHC -fno-warn-orphans #-}
-
-module Main where
-
-import Test.Hspec (hspec)
-
-import PropExample
-import SpecExample
-
-main :: IO ()
-main = do
-    propTest
-    specTest
-
-specTest :: IO ()
-specTest = hspec normalSpecs
-
-propTest :: IO ()
-propTest = hspec propSpecs
