diff --git a/AWS.hs b/AWS.hs
--- a/AWS.hs
+++ b/AWS.hs
@@ -32,6 +32,8 @@
 module AWS
     ( -- * Credentials
       Credential
+    , AccessKey
+    , SecretAccessKey
     , newCredential
     , loadCredential
     , loadCredentialFromFile
diff --git a/AWS/Class.hs b/AWS/Class.hs
--- a/AWS/Class.hs
+++ b/AWS/Class.hs
@@ -47,7 +47,7 @@
         { errorAction :: ByteString
         , errorStatus :: Int
         , errorCode :: Text
-        , errorMessage :: Text
+        , errorMessage :: Maybe Text
         , errorRequestId :: Text
         } -- ^ This error is caused by client requests.
     | ResponseParseError Text
diff --git a/AWS/CloudWatch/Types.hs b/AWS/CloudWatch/Types.hs
--- a/AWS/CloudWatch/Types.hs
+++ b/AWS/CloudWatch/Types.hs
@@ -1,8 +1,7 @@
 module AWS.CloudWatch.Types
     where
 
-import Data.Text (Text)
-import Data.Time (UTCTime)
+import AWS.Lib.FromText
 
 data Metric = Metric
     { metricDimensions :: [Dimension]
diff --git a/AWS/EC2.hs b/AWS/EC2.hs
--- a/AWS/EC2.hs
+++ b/AWS/EC2.hs
@@ -36,6 +36,8 @@
     , module AWS.EC2.RouteTable
     , module AWS.EC2.Route
     , module AWS.EC2.PlacementGroup
+      -- * Tasks
+    , module AWS.EC2.ConversionTask
     ) where
 
 import Data.Conduit
@@ -67,6 +69,7 @@
 import AWS.EC2.NetworkInterface
 import AWS.EC2.NetworkInterfaceAttribute
 import AWS.EC2.PlacementGroup
+import AWS.EC2.ConversionTask
 
 -- | set endpoint to EC2 context by giving the EC2 region.
 setRegion
diff --git a/AWS/EC2/ConversionTask.hs b/AWS/EC2/ConversionTask.hs
new file mode 100644
--- /dev/null
+++ b/AWS/EC2/ConversionTask.hs
@@ -0,0 +1,158 @@
+{-# LANGUAGE FlexibleContexts, RecordWildCards #-}
+module AWS.EC2.ConversionTask
+    ( describeConversionTasks
+    , cancelConversionTask
+    , importVolume
+    , importInstance
+    ) where
+
+import Control.Applicative ((<$>), (<*>))
+import Data.Conduit
+import Data.Text (Text)
+import Data.XML.Types (Event)
+
+import AWS.EC2.Internal
+import AWS.EC2.Query
+import AWS.EC2.Types
+import AWS.Lib.Parser
+import AWS.Util (toText)
+
+describeConversionTasks
+    :: (MonadResource m, MonadBaseControl IO m)
+    => [Text] -- ^ ConversionTaskIds
+    -> EC2 m (ResumableSource m ConversionTask)
+describeConversionTasks ctids =
+    ec2QuerySource "DescribeConversionTasks" params $
+        itemConduit "conversionTasks" conversionTaskSink
+  where
+    params =
+        [ "ConversionTaskId" |.#= ctids
+        ]
+
+conversionTaskSink
+    :: MonadThrow m
+    => GLSink Event m ConversionTask
+conversionTaskSink = ConversionTask
+    <$> getT "conversionTaskId"
+    <*> getT "expirationTime"
+    <*> elementM "importVolume" (
+        ImportVolumeTaskDetails
+        <$> getT "bytesConverted"
+        <*> getT "availabilityZone"
+        <*> getT "description"
+        <*> element "image" diskImageDescriptionSink
+        <*> element "volume" diskImageVolumeDescriptionSink
+        )
+    <*> elementM "importInstance" (
+        ImportInstanceTaskDetails
+        <$> itemsSet "volumes" (
+            ImportInstanceTaskDetailItem
+            <$> getT "bytesConverted"
+            <*> getT "availabilityZone"
+            <*> element "image" diskImageDescriptionSink
+            <*> getT "description"
+            <*> element "volume" diskImageVolumeDescriptionSink
+            <*> getT "status"
+            <*> getT "statusMessage"
+            )
+        <*> getT "instanceId"
+        <*> getT "platform"
+        <*> getT "description"
+        )
+    <*> getT "state"
+    <*> getT "statusMessage"
+
+diskImageDescriptionSink
+    :: MonadThrow m
+    => GLSink Event m DiskImageDescription
+diskImageDescriptionSink = DiskImageDescription
+    <$> getT "format"
+    <*> getT "size"
+    <*> getT "importManifestUrl"
+    <*> getT "checksum"
+
+diskImageVolumeDescriptionSink
+    :: MonadThrow m
+    => GLSink Event m DiskImageVolumeDescription
+diskImageVolumeDescriptionSink = DiskImageVolumeDescription
+    <$> getT "size"
+    <*> getT "id"
+
+cancelConversionTask
+    :: (MonadResource m, MonadBaseControl IO m)
+    => Text -- ^ ConversionTaskId
+    -> EC2 m Bool
+cancelConversionTask =
+    ec2Delete "CancelConversionTask" "ConversionTaskId"
+
+importVolume
+    :: (MonadResource m, MonadBaseControl IO m)
+    => Text -- ^ AvailabilityZone
+    -> ImportVolumeRequestImage -- ^ Image
+    -> Maybe Text -- ^ Description
+    -> Int -- ^ Volume Size
+    -> EC2 m ConversionTask
+importVolume zone image desc size =
+    ec2Query "ImportVolume" params $
+        element "conversionTask" conversionTaskSink
+  where
+    params =
+        [ "AvailabilityZone" |= zone
+        , "Image" |. imageParams image
+        , "Description" |=? desc
+        , "Volume" |.+ "Size" |= toText size
+        ]
+    imageParams img =
+        [ "Format" |= importVolumeRequestImageFormat img
+        , "Bytes" |= toText (importVolumeRequestImageBytes img)
+        , "ImportManifestUrl" |= importVolumeRequestImageImportManifestUrl img
+        ]
+
+importInstance
+    :: (MonadResource m, MonadBaseControl IO m)
+    => Maybe Text -- ^ Description
+    -> LaunchSpecification -- ^ LaunchSpecification
+    -> [DiskImage] -- ^ DiskImages
+    -> Platform -- ^ Platform
+    -> EC2 m ConversionTask
+importInstance desc ls images platform =
+    ec2Query "ImportInstance" params $
+        element "conversionTask" conversionTaskSink
+  where
+    params =
+        [ "Description" |=? desc
+        , "LaunchSpecification" |. launchSpecificationParams ls
+        , "DiskImage" |.#. diskImageParams <$> images
+        , "Platform" |= platformText platform
+        ]
+    launchSpecificationParams (LaunchSpecification{..}) =
+        [ "Architecture" |=
+            architectureText launchSpecificationArchitecture
+        , "GroupName" |.#= launchSpecificationGroupNames
+        , "UserData" |=? launchSpecificationUserData
+        , "InstanceType" |= launchSpecificationInstanceType
+        , "Placement" |.+ "AvailabilityZone" |=?
+            launchSpecificationPlacementAvailabilityZone
+        , "Monitoring" |.+ "Enabled" |=?
+            toText <$> launchSpecificationMonitoringEnabled
+        , "SubnetId" |=? launchSpecificationSubnetId
+        , "InstanceInitiatedShutdownBehavior" |=?
+            shutdownBehaviorText <$> launchSpecificationInstanceInitiatedShutdownBehavior
+        , "PrivateIpAddress" |=?
+            toText <$> launchSpecificationPrivateIpAddress
+        ]
+    diskImageParams (DiskImage{..}) =
+        [ "Image" |.
+            [ "Format" |= diskImageFormat
+            , "Bytes" |= toText diskImageBytes
+            , "ImportManifestUrl" |= diskImageImportManifestUrl
+            , "Description" |=? diskImageDescripsion
+            ]
+        , "Volume" |.+ "Size" |= toText diskImageVolumeSize
+        ]
+    shutdownBehaviorText ShutdownBehaviorStop = "stop"
+    shutdownBehaviorText ShutdownBehaviorTerminate = "terminate"
+    platformText PlatformWindows = "Windows"
+    platformText PlatformOther = error "Valid value is `Windows'"
+    architectureText I386 = "i386"
+    architectureText X86_64 = "x86_64"
diff --git a/AWS/EC2/Query.hs b/AWS/EC2/Query.hs
--- a/AWS/EC2/Query.hs
+++ b/AWS/EC2/Query.hs
@@ -43,7 +43,7 @@
 apiVersion = "2012-12-01"
 
 sinkRequestId :: MonadThrow m
-    => GLSink Event m Text
+    => GLSink Event m (Maybe Text)
 sinkRequestId = do
     await -- EventBeginDocument
     await -- EventBeginElement DescribeImagesResponse
@@ -99,7 +99,7 @@
         response <- requestQuery cred ctx action params' apiVersion sinkError
         res <- response $=+ XmlP.parseBytes XmlP.def
         res $$++ sinkRequestId
-    State.put ctx{lastRequestId = Just rid}
+    State.put ctx{lastRequestId = rid}
     lift $ src1 $=+ (cond >> nextToken)
   where
     params' = ("NextToken" |=? token) : params
diff --git a/AWS/EC2/Types.hs b/AWS/EC2/Types.hs
--- a/AWS/EC2/Types.hs
+++ b/AWS/EC2/Types.hs
@@ -1,1413 +1,60 @@
-{-# LANGUAGE TemplateHaskell #-}
-module AWS.EC2.Types
-    ( Address(..)
-    , AddressDomain(..)
-    , AllocateAddress(..)
-    , AMIAttribute(..)
-    , AMIAttributeDescription(..)
-    , Architecture(..)
-    , AssociateAddressRequest(..)
-    , Attachment(..)
-    , AttachmentState(..)
-    , AttachmentSetItemResponse(..)
-    , AttachmentSetItemResponseStatus(..)
-    , AvailabilityZone(..)
-    , AvailabilityZoneMessage
-    , BlockDeviceMapping(..)
-    , BlockDeviceMappingParam(..)
-    , ConsoleOutput(..)
-    , CreateRouteRequest(..)
-    , CreateSubnetRequest(..)
-    , CreateVolumePermission(..)
-    , CreateVolumePermissionItem(..)
-    , CreateVolumeRequest(..)
-    , CreateVpnGatewayType(..)
-    , CustomerGateway(..)
-    , CustomerGatewayState(..)
-    , DhcpConfiguration(..)
-    , DhcpOptions(..)
-    , DhcpValue(..)
-    , DisassociateAddressRequest(..)
-    , EbsBlockDevice(..)
-    , EbsInstanceBlockDevice(..)
-    , EbsSource(..)
-    , EC2Return(..)
-    , Filter
-    , Group(..)
-    , Hypervisor(..)
-    , IamInstanceProfile(..)
-    , IcmpTypeCode(..)
-    , Image(..)
-    , ImageState(..)
-    , ImageType(..)
-    , Instance(..)
-    , InstanceAttribute(..)
-    , InstanceAttributeRequest(..)
-    , InstanceBlockDeviceMapping(..)
-    , InstanceLifecycle(..)
-    , InstanceMonitoringState(..)
-    , InstanceNetworkInterface(..)
-    , InstanceNetworkInterfaceAssociation(..)
-    , InstanceNetworkInterfaceAttachment(..)
-    , InstancePrivateIpAddress(..)
-    , InstanceState(..)
-    , InstanceStateChange(..)
-    , InstanceStatus(..)
-    , InstanceStatusEvent(..)
-    , InstanceStatusEventCode(..)
-    , InstanceStatusType(..)
-    , InstanceStatusTypeStatus(..)
-    , InstanceStatusDetail(..)
-    , InstanceStatusDetailName
-    , InstanceStatusDetailStatus
-    , IpPermission(..)
-    , KeyPair(..)
-    , ModifyInstanceAttributeRequest(..)
-    , MonitorInstancesResponse(..)
-    , LaunchPermission(..)
-    , LaunchPermissionItem(..)
-    , NetworkAcl(..)
-    , NetworkAclAssociation(..)
-    , NetworkAclEntry(..)
-    , NetworkAclEntryRequest(..)
-    , NetworkAclRuleAction(..)
-    , NetworkInterface(..)
-    , NetworkInterfaceAssociation(..)
-    , NetworkInterfaceAttachment(..)
-    , NetworkInterfaceParam(..)
-    , NetworkInterfacePrivateIpAddress(..)
-    , NetworkInterfaceStatus(..)
-    , PasswordData(..)
-    , Placement(..)
-    , PlacementGroup(..)
-    , PlacementGroupState(..)
-    , PlacementGroupStrategy(..)
-    , Platform(..)
-    , PortRange(..)
-    , ProductCode(..)
-    , ProductCodeItem(..)
-    , ProductCodeType(..)
-    , Region(..)
-    , RegisterImageRequest(..)
-    , Reservation(..)
-    , ResetInstanceAttributeRequest(..)
-    , ResetSnapshotAttributeRequest(..)
-    , ResourceTag(..)
-    , RootDeviceType(..)
-    , Route(..)
-    , RouteTable(..)
-    , RouteTableAssociation(..)
-    , RouteState(..)
-    , RouteOrigin(..)
-    , RunInstancesRequest(..)
-    , SecondaryPrivateIpAddressParam(..)
-    , SecurityGroup(..)
-    , SecurityGroupRequest(..)
-    , ShutdownBehavior(..)
-    , Snapshot(..)
-    , SnapshotAttribute(..)
-    , SnapshotAttributeRequest(..)
-    , SnapshotStatus(..)
-    , StateReason(..)
-    , Subnet(..)
-    , SubnetState(..)
-    , Tag(..)
-    , UserIdGroupPair(..)
-    , VirtualizationType(..)
-    , Volume(..)
-    , VolumeAttribute(..)
-    , VolumeAttributeRequest(..)
-    , VolumeType(..)
-    , VolumeState(..)
-    , VolumeStatus(..)
-    , VolumeStatusAction(..)
-    , VolumeStatusEvent(..)
-    , VolumeStatusDetail(..)
-    , VolumeStatusInfo(..)
-    , VolumeStatusInfoStatus(..)
-    , Vpc(..)
-    , VpcState(..)
-    , VpnConnection(..)
-    , VpnConnectionOptionsRequest(..)
-    , VpnConnectionState(..)
-    , VpnGateway(..)
-    , VpnGatewayState(..)
-    , VpnStaticRoute(..)
-    , VpnStaticRouteSource(..)
-    , VpnStaticRouteState(..)
-    , VpnTunnelTelemetry(..)
-    , VpnTunnelTelemetryStatus(..)
-    , InternetGateway(..)
-    , InternetGatewayAttachment(..)
-    , InternetGatewayAttachmentState(..)
-    ) where
-
-import Data.IP (IPv4, AddrRange)
-import Data.Text (Text)
-import Data.ByteString (ByteString)
-import Data.Time (UTCTime)
-
-import AWS.Class
-import AWS.Lib.FromText
-
-data Image = Image
-    { imageId :: Text
-    , imageLocation :: Text
-    , imageImageState :: ImageState
-    , imageOwnerId :: Text
-    , imageIsPublic :: Bool
-    , imageProductCodes :: [ProductCode]
-    , imageArchitecture :: Text
-    , imageImageType :: ImageType
-    , imageKernelId :: Maybe Text
-    , imageRamdiskId :: Maybe Text
-    , imagePlatform :: Platform
-    , imageStateReason :: Maybe StateReason
-    , imageViridianEnabled :: Maybe Bool
-    , imageOwnerAlias :: Maybe Text
-    , imageName :: Maybe Text
-    , imageDescription :: Maybe Text
-    , imageBillingProducts :: [Text]
-    , imageRootDeviceType :: RootDeviceType
-    , imageRootDeviceName :: Maybe Text
-    , imageBlockDeviceMappings :: [BlockDeviceMapping]
-    , imageVirtualizationType :: VirtualizationType
-    , imageTagSet :: [ResourceTag]
-    , imageHypervisor :: Hypervisor
-    }
-  deriving (Show, Read, Eq)
-
-data AMIAttribute
-    = AMIDescription
-    | AMIKernel
-    | AMIRamdisk
-    | AMILaunchPermission
-    | AMIProductCodes
-    | AMIBlockDeviceMapping
-  deriving (Show, Read, Eq)
-
-data AMIAttributeDescription = AMIAttributeDescription
-    { amiAttributeDescriptionImageId :: Text
-    , amiAttributeDescriptionLaunchPermission :: [LaunchPermissionItem]
-    , amiAttributeDescriptionProductCodes :: [ProductCodeItem]
-    , amiAttributeDescriptionKernel :: Maybe Text
-    , amiAttributeDescriptionRamdisk :: Maybe Text
-    , amiAttributeDescriptionDescription :: Maybe Text
-    , amiAttributeDescriptionBlockDeviceMapping :: [BlockDeviceMapping]
-    }
-  deriving (Show, Read, Eq)
-
-data LaunchPermission = LaunchPermission
-    { launchPermissionAdd :: [LaunchPermissionItem]
-    , launchPermissionRemove :: [LaunchPermissionItem]
-    }
-  deriving (Show, Read, Eq)
-
-data LaunchPermissionItem = LaunchPermissionItem
-    { launchPermissionItemGroup :: Text
-    , launchPermissionUserId :: Text
-    }
-  deriving (Show, Read, Eq)
-
-data ImageState
-    = ImageStateAvailable
-    | ImageStatePending
-    | ImageStateFailed
-  deriving (Show, Read, Eq)
-
-data ProductCode = ProductCode
-    { productCodeCode :: Text
-    , productCodeType :: ProductCodeType
-    }
-  deriving (Show, Read, Eq)
-
-data ProductCodeItem = ProductCodeItem
-    { productCodeItemProductCode :: Text
-    }
-  deriving (Show, Read, Eq)
-
-data ProductCodeType
-    = ProductCodeDevpay
-    | ProductCodeMarketplace
-  deriving (Show, Read, Eq)
-
-data ImageType
-    = ImageTypeMachine
-    | ImageTypeKernel
-    | ImageTypeRamDisk
-  deriving (Show, Read, Eq)
-
-data Platform
-    = PlatformWindows
-    | PlatformOther
-  deriving (Show, Read, Eq)
-
-data StateReason = StateReason
-    { stateReasonCode :: Text
-    , stateReasonMessage :: Text
-    }
-  deriving (Show, Read, Eq)
-
-data RootDeviceType
-    = RootDeviceTypeEBS
-    | RootDeviceTypeInstanceStore
-  deriving (Show, Read, Eq)
-
-data BlockDeviceMapping = BlockDeviceMapping
-    { blockDeviceMappingDeviceName :: Text
-    , blockDeviceMappingVirtualName :: Maybe Text
-    , blockDeviceMappingEbs :: Maybe EbsBlockDevice
-    }
-  deriving (Show, Read, Eq)
-
-data EbsBlockDevice = EbsBlockDevice
-    { ebsSnapshotId :: Maybe Text
-    , ebsVolumeSize :: Int
-    , ebsDeleteOnTermination :: Bool
-    , ebsVolumeType :: VolumeType
-    }
-  deriving (Show, Read, Eq)
-
-data VolumeType
-    = VolumeTypeStandard
-    | VolumeTypeIO1 Int
-  deriving (Show, Read, Eq)
-
-data VirtualizationType
-    = VirtualizationTypeParavirtual
-    | VirtualizationTypeHVM
-  deriving (Show, Read, Eq)
-
-data ResourceTag = ResourceTag
-    { resourceTagKey :: Text
-    , resourceTagValue :: Maybe Text
-    }
-  deriving (Show, Read, Eq)
-
-data Hypervisor
-    = HypervisorOVM
-    | HypervisorXen
-  deriving (Show, Read, Eq)
-
-data Region = Region
-    { regionName :: Text
-    , regionEndpoint :: Text
-    }
-  deriving (Show, Read, Eq)
-
-data AvailabilityZone = AvailabilityZone
-    { zoneName :: Text
-    , zoneState :: Text
-    , zoneRegionName :: Text
-    , zoneMessageSet :: [AvailabilityZoneMessage]
-    }
-  deriving (Show, Read, Eq)
-
-type AvailabilityZoneMessage = Text
-
-data Reservation = Reservation
-    { reservationId :: Text
-    , reservationOwnerId :: Text
-    , reservationGroupSet :: [Group]
-    , reservationInstanceSet :: [Instance]
-    , reservationRequesterId :: Maybe Text
-    }
-  deriving (Show, Read, Eq)
-
-data Instance = Instance
-    { instanceId :: Text
-    , instanceImageId :: Text
-    , instanceState :: InstanceState
-    , instancePrivateDnsName :: Maybe Text
-    , instanceDnsName :: Maybe Text
-    , instanceReason :: Maybe Text
-    , instanceKeyName :: Maybe Text
-    , instanceAmiLaunchIndex :: Text
-    , instanceProductCodes :: [ProductCode]
-    , instanceType :: Text
-    , instanceLaunchTime :: UTCTime
-    , instancePlacement :: Placement
-    , instanceKernelId :: Maybe Text
-    , instanceRamdiskId :: Maybe Text
-    , instancePlatform :: Maybe Text
-    , instanceMonitoring :: InstanceMonitoringState
-    , instanceSubnetId :: Maybe Text
-    , instanceVpcId :: Maybe Text
-    , instancePrivateIpAddress :: Maybe IPv4
-    , instanceIpAddress :: Maybe IPv4
-    , instanceSourceDestCheck :: Maybe Bool
-    , instancevpcGroupSet :: [Group]
-    , instanceStateReason :: Maybe StateReason
-    , instanceArchitecture :: Architecture
-    , instanceRootDeviceType :: RootDeviceType
-    , instanceRootDeviceName :: Maybe Text
-    , instanceBlockDeviceMappings :: [InstanceBlockDeviceMapping]
-    , instanceInstanceLifecycle :: Maybe InstanceLifecycle
-    , instanceSpotInstanceRequestId :: Maybe Text
-    , instanceVirtualizationType :: VirtualizationType
-    , instanceClientToken :: Maybe Text
-    , instanceTagSet :: [ResourceTag]
-    , instanceHypervisor :: Hypervisor
-    , instanceNetworkInterfaceSet :: [InstanceNetworkInterface]
-    , instanceIamInstanceProfile :: Maybe IamInstanceProfile
-    , instanceEbsOptimized :: Bool -- default: false
-    }
-  deriving (Show, Read, Eq)
-
-data InstanceStatus = InstanceStatus
-    { instanceStatusInstanceId :: Text
-    , instanceStatusAvailabilityZone :: Text
-    , instanceStatusEventsSet :: [InstanceStatusEvent]
-    , instanceStatusInstanceState :: InstanceState
-    , instanceStatusSystemStatus :: InstanceStatusType
-    , instanceStatusInstanceStatus :: InstanceStatusType
-    }
-  deriving (Show, Read, Eq)
-
-data InstanceStatusEvent = InstanceStatusEvent
-    { instanceStatusEventCode :: InstanceStatusEventCode
-    , instanceStatusEventDescription :: Text
-    , instanceStatusEventNotBefore :: Maybe UTCTime
-    , instanceStatusEventNotAfter :: Maybe UTCTime
-    }
-  deriving (Show, Read, Eq)
-
-data InstanceStatusEventCode
-    = InstanceStatusEventCodeInstanceReboot
-    | InstanceStatusEventCodeInstanceStop
-    | InstanceStatusEventCodeSystemReboot
-    | InstanceStatusEventCodeInstanceRetirement
-  deriving (Show, Read, Eq)
-
-data InstanceStatusType = InstanceStatusType
-    { instanceStatusTypeStatus :: InstanceStatusTypeStatus
-    , instanceStatusTypeDetails :: [InstanceStatusDetail]
-    }
-  deriving (Show, Read, Eq)
-
-data InstanceStatusTypeStatus
-    = InstanceStatusTypeStatusOK
-    | InstanceStatusTypeStatusImpaired
-    | InstanceStatusTypeStatusInsufficientData
-    | InstanceStatusTypeStatusNotApplicable
-  deriving (Show, Read, Eq)
-
-data InstanceStatusDetail = InstanceStatusDetail
-    { instanceStatusDetailName :: InstanceStatusDetailName
-    , instanceStatusDetailStatus :: InstanceStatusDetailStatus
-    , instanceStatusDetailImpairedSince :: Maybe UTCTime
-    }
-  deriving (Show, Read, Eq)
-
-type InstanceStatusDetailName = Text
-
-type InstanceStatusDetailStatus = Text
-
-data Group = Group
-    { groupId :: Text
-    , groupName :: Text
-    }
-  deriving (Show, Read, Eq)
-
-data InstanceState
-    = InstanceStatePending
-    | InstanceStateRunning
-    | InstanceStateShuttingDown
-    | InstanceStateTerminated
-    | InstanceStateStopping
-    | InstanceStateStopped
-    | InstanceStateUnknown Int
-  deriving (Show, Read, Eq)
-
-data Placement = Placement
-    { placementAvailabilityZone :: Text
-    , placementGroupName :: Maybe Text
-    , placementTenancy :: Text
-    }
-  deriving (Show, Read, Eq)
-
-data PlacementGroup = PlacementGroup
-    { placementGroupGroupName :: Text
-    , placementGroupStrategy :: PlacementGroupStrategy
-    , placementGroupState :: PlacementGroupState
-    }
-  deriving (Show, Read, Eq)
-
-data PlacementGroupState
-    = PlacementGroupStatePending
-    | PlacementGroupStateAvailable
-    | PlacementGroupStateDeleting
-    | PlacementGroupStateDeleted
-  deriving (Show, Read, Eq)
-
-data PlacementGroupStrategy
-    = PlacementGroupStrategyCluster
-  deriving (Show, Read, Eq)
-
-data InstanceMonitoringState
-    = MonitoringDisabled
-    | MonitoringEnabled
-    | MonitoringPending
-    | MonitoringDisabling
-  deriving (Show, Read, Eq)
-
-data Architecture = I386 | X86_64 deriving (Show, Read, Eq)
-
-data InstanceBlockDeviceMapping = InstanceBlockDeviceMapping
-    { instanceBlockDeviceMappingDeviceName :: Text
-    , instanceBlockDeviceMappingEbs :: EbsInstanceBlockDevice
-    }
-  deriving (Show, Read, Eq)
-
-data EbsInstanceBlockDevice = EbsInstanceBlockDevice
-    { ebsInstanceBlockDeviceVolumeId :: Text
-    , ebsInstanceBlockDeviceState :: AttachmentSetItemResponseStatus
-    , ebsInstanceBlockDeviceAttachTime :: UTCTime
-    , ebsInstanceBlockDeviceDeleteOnTermination :: Bool
-    }
-  deriving (Show, Read, Eq)
-
-data InstanceLifecycle
-    = LifecycleSpot
-    | LifecycleNone
-  deriving (Show, Read, Eq)
-
-data InstanceNetworkInterface = InstanceNetworkInterface
-    { instanceNetworkInterfaceId :: Text
-    , instanceNetworkInterfaceSubnetId :: Maybe Text
-    , instanceNetworkInterfaceVpcId :: Maybe Text
-    , instanceNetworkInterfaceDescription :: Maybe Text
-    , instanceNetworkInterfaceOwnerId :: Text
-    , instanceNetworkInterfaceStatus :: Text
-    , instanceNetworkInterfaceMacAddress :: Maybe Text
-    , instanceNetworkInterfacePrivateIpAddress :: Maybe IPv4
-    , instanceNetworkInterfacePrivateDnsName :: Maybe Text
-    , instanceNetworkInterfaceSourceDestCheck :: Maybe Bool
-    , instanceNetworkInterfaceGroupSet :: [Group]
-    , instanceNetworkInterfaceAttachment
-        :: InstanceNetworkInterfaceAttachment
-    , instanceNetworkInterfaceAssociation
-        :: Maybe InstanceNetworkInterfaceAssociation
-    , instanceNetworkInterfacePrivateIpAddressesSet
-        :: [InstancePrivateIpAddress]
-    }
-  deriving (Show, Read, Eq)
-
-data InstanceNetworkInterfaceAttachment = InstanceNetworkInterfaceAttachment
-    { instanceNetworkInterfaceAttachmentId :: Text
-    , instanceNetworkInterfaceAttachmentDeviceIndex :: Int
-    , instanceNetworkInterfaceAttachmentStatus :: Text
-    , instanceNetworkInterfaceAttachmentAttachTime :: UTCTime
-    , instanceNetworkInterfaceAttachmentDeleteOnTermination
-        :: Bool
-    }
-  deriving (Show, Read, Eq)
-
-data InstanceNetworkInterfaceAssociation
-    = InstanceNetworkInterfaceAssociation
-    { instanceNetworkInterfaceAssociationPublicIp :: IPv4
-    , instanceNetworkInterfaceAssociationPublicDnsName
-        :: Maybe Text
-    , instanceNetworkInterfaceAssociationIpOwnerId :: Text
-    }
-  deriving (Show, Read, Eq)
-
-data InstancePrivateIpAddress = InstancePrivateIpAddress
-    { instancePrivateIpAddressAddress :: IPv4
-    , instancePrivateIpAddressDnsName :: Maybe Text
-    , instancePrivateIpAddressPrimary :: Bool
-    , instancePrivateIpAddressAssociation
-        :: Maybe InstanceNetworkInterfaceAssociation
-    }
-  deriving (Show, Read, Eq)
-
-data IamInstanceProfile = IamInstanceProfile
-    { iamInstanceProfileArn :: Text
-    , iamInstanceProfileId :: Text
-    }
-  deriving (Show, Read, Eq)
-
-data ShutdownBehavior
-    = ShutdownBehaviorStop
-    | ShutdownBehaviorTerminate
-  deriving (Show, Read, Eq)
-
-data InstanceAttribute
-    = 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, Read, Eq)
-
-data Address = Address
-    { addressPublicIp :: IPv4
-    , addressAllocationId :: Maybe Text
-    , addressDomain :: AddressDomain
-    , addressInstanceId :: Maybe Text
-    , addressAssociationId :: Maybe Text
-    , addressNetworkInterfaceId :: Maybe Text
-    , addressNetworkInterfaceOwnerId :: Maybe Text
-    , addressPrivateIpAddress :: Maybe IPv4
-    }
-  deriving (Show, Read, Eq)
-
-data AddressDomain = AddressDomainStandard | AddressDomainVPC
-  deriving (Show, Read, Eq)
-
-data AllocateAddress = AllocateAddress
-    { allocateAddressPublicIp :: IPv4
-    , allocateAddressDomain :: AddressDomain
-    , allocateAddressAllocationId :: Maybe Text
-    }
-  deriving (Show, Read, Eq)
-
-data EC2Return = EC2Success | EC2Error Text
-  deriving (Show, Read, Eq)
-
-data Tag = Tag
-    { tagResourceId :: Text
-    , tagResourceType :: Text
-    , tagKey :: Text
-    , tagValue :: Maybe Text
-    }
-  deriving (Show, Read, Eq)
-
-data InstanceStateChange = InstanceStateChange
-    { instanceStateChangeInstanceId :: Text
-    , instanceStateChangeCurrentState :: InstanceState
-    , instanceStateChangePreviousState :: InstanceState
-    }
-  deriving (Show, Read, Eq)
-
-data ConsoleOutput = ConsoleOutput
-    { consoleOutputInstanceId :: Text
-    , consoleOutputTimestamp :: UTCTime
-        -- ^ The time the data was last updated.
-    , consoleOutputOutput :: Text
-    }
-  deriving (Show, Read, Eq)
-
-data PasswordData = PasswordData
-    { passwordDataInstanceId :: Text
-    , passwordDataTimestamp :: UTCTime
-      -- ^ The time the data was last updated.
-    , passwordDataPasswordData :: Text
-    }
-  deriving (Show, Read, Eq)
-
-data MonitorInstancesResponse = MonitorInstancesResponse
-    { monitorInstancesResponseInstanceId :: Text
-    , monitorInstancesResponseInstanceMonitoringState
-        :: InstanceMonitoringState
-    }
-  deriving (Show, Read, Eq)
-
-data Snapshot = Snapshot
-    { snapshotId :: Text
-    , snapshotVolumeId :: Maybe Text
-    , snapshotStatus :: SnapshotStatus
-    , snapshotStartTime :: UTCTime
-    , snapshotProgress :: Maybe Text
-    , snapshotOwnerId :: Text
-    , snapshotVolumeSize :: Int
-    , snapshotDescription :: Maybe Text
-    , snapshotOwnerAlias :: Maybe Text
-    , snapshotTagSet :: [ResourceTag]
-    }
-  deriving (Show, Read, Eq)
-
-data SnapshotStatus
-    = SnapshotPending
-    | SnapshotCompleted
-    | SnapshotError
-  deriving (Show, Read, Eq)
-
-data SnapshotAttributeRequest
-    = SnapshotAttributeRequestCreateVolumePermission
-    | SnapshotAttributeRequestProductCodes
-  deriving (Show, Read, Eq)
-
-data ResetSnapshotAttributeRequest
-    = ResetSnapshotAttributeRequestCreateVolumePermission
-  deriving (Show, Read, Eq)
-
-data SnapshotAttribute = SnapshotAttribute
-    { snapshotAttributeSnapshotId :: Text
-    , snapshotAttributeCreateVolumePermissionItems
-        :: [CreateVolumePermissionItem]
-    , snapshotAttributeProductCodes :: [ProductCode]
-    }
-  deriving (Show, Read, Eq)
-
-data CreateVolumePermission = CreateVolumePermission
-    { createVolumePermissionAdd :: [CreateVolumePermissionItem]
-    , createVolumePermissionRemove :: [CreateVolumePermissionItem]
-    }
-  deriving (Show, Read, Eq)
-
-data CreateVolumePermissionItem = CreateVolumePermissionItem
-    { createVolumePermissionItemUserId :: Maybe Text
-    , createVolumePermissionItemGroup :: Maybe Text
-    }
-  deriving (Show, Read, Eq)
-
-data Volume = Volume
-    { volumeId :: Text
-    , volumeSize :: Int
-    , volumeSnapshotId :: Maybe Text
-    , volumeAvailabilityZone :: Text
-    , volumeStatus :: VolumeState
-    , volumeCreateTime :: UTCTime
-    , volumeAttachmentSet :: [AttachmentSetItemResponse]
-    , volumeTagSet :: [ResourceTag]
-    , volumeVolumeType :: VolumeType
-    }
-  deriving (Show, Read, Eq)
-
-data VolumeState
-    = VolumeStateCreating
-    | VolumeStateAvailable
-    | VolumeStateInUse
-    | VolumeStateDeleting
-    | VolumeStateDeleted
-    | VolumeStateError
-  deriving (Show, Read, Eq)
-
-data AttachmentSetItemResponse = AttachmentSetItemResponse
-    { attachmentSetItemResponseVolumeId :: Text
-    , attachmentSetItemResponseInstanceId :: Text
-    , attachmentSetItemResponseDevice :: Text
-    , attachmentSetItemResponseStatus
-        :: AttachmentSetItemResponseStatus
-    , attachmentSetItemResponseAttachTime :: UTCTime
-    , attachmentSetItemResponseDeleteOnTermination :: Maybe Bool
-    }
-  deriving (Show, Read, Eq)
-
-data AttachmentSetItemResponseStatus
-    = AttachmentSetItemResponseStatusAttaching
-    | AttachmentSetItemResponseStatusAttached
-    | AttachmentSetItemResponseStatusDetaching
-    | AttachmentSetItemResponseStatusDetached
-  deriving (Show, Read, Eq)
-
-data KeyPair = KeyPair
-    { keyPairName :: Text
-    , keyPairFingerprint :: Text
-    }
-  deriving (Show, Read, Eq)
-
-data SecurityGroup = SecurityGroup
-    { securityGroupOwnerId :: Text
-    , securityGroupId :: Text
-    , securityGroupName :: Text
-    , securityGroupDescription :: Text
-    , securityGroupVpcId :: Maybe Text
-    , securityGroupIpPermissions :: [IpPermission]
-    , securityGroupIpPermissionsEgress :: [IpPermission]
-    , securityGroupTagSet :: [ResourceTag]
-    }
-  deriving (Show, Read, Eq)
-
-data IpPermission = IpPermission
-    { ipPermissionIpProtocol :: Text
-    , ipPermissionFromPort :: Maybe Int
-    , ipPermissionToPort :: Maybe Int
-    , ipPermissionGroups :: [UserIdGroupPair]
-    , ipPermissionIpRanges :: [AddrRange IPv4]
-    }
-  deriving (Show, Read, Eq)
-
-data UserIdGroupPair = UserIdGroupPair
-    { userIdGroupPairUserId :: Maybe Text
-    , userIdGroupPairGroupId :: Text
-    , userIdGroupPairGroupName :: Maybe Text
-    }
-  deriving (Show, Read, Eq)
-
-data BlockDeviceMappingParam
-    = BlockDeviceMappingParamEbs
-        { blockDeviceMappingParamEbsDeviceName :: Text
-        , blockDeviceMappingParamEbsNoDevice :: Maybe Bool
-        , blockDeviceMappingParamEbsSource :: EbsSource
-        , blockDeviceMappingParamEbsDeleteOnTermination
-            :: Maybe Bool
-        , blockDeviceMappingParamEbsVolumeType :: Maybe VolumeType
-        }
-    | BlockDeviceMappingParamInstanceStore
-        { blockDeviceMappingParamInstanceStoreDeviceName :: Text
-        , blockDeviceMappingParamInstanceStoreNoDevice
-            :: Maybe Bool
-        , blockDeviceMappingParamInstanceStoreVirtualName
-            :: Maybe Text
-        }
-  deriving (Show, Read, Eq)
-
-data EbsSource
-    = EbsSourceSnapshotId Text
-    | EbsSourceVolumeSize Int
-  deriving (Show, Read, Eq)
-
-data NetworkInterfaceParam
-    = NetworkInterfaceParamCreate
-        { networkInterfaceParamCreateDeviceIndex :: Int
-        , networkInterfaceParamCreateSubnetId :: Text
-        , networkInterfaceParamCreateDescription :: Text
-        , networkInterfaceParamCreatePrivateIpAddress
-            :: Maybe IPv4
-        , networkInterfaceParamCreatePrivateIpAddresses
-            :: SecondaryPrivateIpAddressParam
-        , networkInterfaceParamCreateSecurityGroupIds :: [Text]
-        , networkInterfaceParamCreateDeleteOnTermination :: Bool
-        }
-    | NetworkInterfaceParamAttach
-        { networkInterfaceParamAttachInterfaceId :: Text
-        , networkInterfaceParamAttachDeviceIndex :: Int
-        , networkInterfaceParamAttachDeleteOnTermination :: Bool
-        }
-  deriving (Show, Read, Eq)
-
-data SecondaryPrivateIpAddressParam
-    = SecondaryPrivateIpAddressParamNothing
-    | SecondaryPrivateIpAddressParamCount Int
-    | SecondaryPrivateIpAddressParamSpecified
-      { secondaryPrivateIpAddressParamSpecifiedAddresses :: [IPv4]
-      , secondaryPrivateIpAddressParamSpecifiedPrimary
-        :: Maybe Int
-      }
-  deriving (Show, Read, Eq)
-
-data VpnConnection = VpnConnection
-    { vpnConnectionId :: Text
-    , vpnConnectionState :: VpnConnectionState
-    , vpnConnectionCustomerGatewayConfiguration :: Maybe Text
-    , vpnConnectionType :: Maybe Text
-    , vpnConnectionCustomerGatewayId :: Text
-    , vpnConnectionVpnGatewayId :: Text
-    , vpnConnectionTagSet :: [ResourceTag]
-    , vpnConnectionVgwTelemetry :: [VpnTunnelTelemetry]
-    , vpnConnectionOptions :: Maybe VpnConnectionOptionsRequest
-    , vpnConnectionRoutes :: Maybe VpnStaticRoute
-    }
-  deriving (Show, Read, Eq)
-
-data VpnConnectionState
-    = VpnConnectionStatePending
-    | VpnConnectionStateAvailable
-    | VpnConnectionStateDeleting
-    | VpnConnectionStateDeleted
-  deriving (Show, Read, Eq)
-
-data VpnTunnelTelemetry = VpnTunnelTelemetry
-    { vpnTunnelTelemetryOutsideIpAddress :: IPv4
-    , vpnTunnelTelemetryStatus :: VpnTunnelTelemetryStatus
-    , vpnTunnelTelemetryLastStatusChange :: UTCTime
-    , vpnTunnelTelemetryStatusMessage :: Text
-    , vpnTunnelTelemetryAcceptRouteCount :: Int
-    }
-  deriving (Show, Read, Eq)
-
-data VpnTunnelTelemetryStatus
-    = VpnTunnelTelemetryStatusUp
-    | VpnTunnelTelemetryStatusDown
-  deriving (Show, Read, Eq)
-
-data VpnConnectionOptionsRequest = VpnConnectionOptionsRequest
-    { vpnConnectionOptionsRequestStaticRoutesOnly :: Bool
-    }
-  deriving (Show, Read, Eq)
-
-data VpnStaticRoute = VpnStaticRoute
-    { vpnStaticRouteDestinationCidrBlock :: Text
-    , vpnStaticRouteSource :: VpnStaticRouteSource
-    , vpnStaticRouteState :: VpnStaticRouteState
-    }
-  deriving (Show, Read, Eq)
-
-data VpnStaticRouteSource = VpnStaticRouteSourceStatic
-  deriving (Show, Read, Eq)
-
-data VpnStaticRouteState
-    = VpnStaticRouteStatePending
-    | VpnStaticRouteStateAvailable
-    | VpnStaticRouteStateDeleting
-    | VpnStaticRouteStateDeleted
-  deriving (Show, Read, Eq)
-
-data RunInstancesRequest = RunInstancesRequest
-    { runInstancesRequestImageId :: Text -- ^ Required
-    , runInstancesRequestMinCount :: Int -- ^ Required
-    , runInstancesRequestMaxCount :: Int -- ^ Required
-    , runInstancesRequestKeyName :: Maybe Text
-    , runInstancesRequestSecurityGroupIds :: [Text]
-      -- ^ SecurityGroupIds (Required for VPC; optional for EC2)
-    , runInstancesRequestSecurityGroups :: [Text]
-      -- ^ SecurityGroups (Only for EC2; either id or name is accepted)
-    , runInstancesRequestUserData :: Maybe ByteString
-      -- ^ UserData (Base64-encoded MIME user data)
-    , 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 IPv4
-    , runInstancesRequestClientToken :: Maybe Text
-    , runInstancesRequestNetworkInterfaces
-        :: [NetworkInterfaceParam]
-    , runInstancesRequestIamInstanceProfile
-        :: Maybe IamInstanceProfile
-    , runInstancesRequestEbsOptimized :: Maybe Bool
-    }
-  deriving (Show, Read, Eq)
-
-data InstanceAttributeRequest
-    = InstanceAttributeRequestInstanceType
-    | InstanceAttributeRequestKernelId
-    | InstanceAttributeRequestRamdiskId
-    | InstanceAttributeRequestUserData
-    | InstanceAttributeRequestDisableApiTermination
-    | InstanceAttributeRequestShutdownBehavior
-    | InstanceAttributeRequestRootDeviceName
-    | InstanceAttributeRequestBlockDeviceMapping
-    | InstanceAttributeRequestSourceDestCheck
-    | InstanceAttributeRequestGroupSet
-    | InstanceAttributeRequestProductCodes
-    | InstanceAttributeRequestEbsOptimized
-  deriving (Show, Eq, Ord)
-
-data ResetInstanceAttributeRequest
-    = ResetInstanceAttributeRequestKernel
-    | ResetInstanceAttributeRequestRamdisk
-    | ResetInstanceAttributeRequestSourceDestCheck
-  deriving (Show, Read, Eq)
-
-data ModifyInstanceAttributeRequest
-    = ModifyInstanceAttributeRequestInstanceType Text
-    | ModifyInstanceAttributeRequestKernelId Text
-    | ModifyInstanceAttributeRequestRamdiskId Text
-    | ModifyInstanceAttributeRequestUserData Text
-    | ModifyInstanceAttributeRequestDisableApiTermination Bool
-    | ModifyInstanceAttributeRequestShutdownBehavior
-        ShutdownBehavior
-    | ModifyInstanceAttributeRequestRootDeviceName Text
-    | ModifyInstanceAttributeRequestBlockDeviceMapping
-        [BlockDeviceMappingParam]
-    | ModifyInstanceAttributeRequestSourceDestCheck Bool
-    | ModifyInstanceAttributeRequestGroupSet [Text]
-    | ModifyInstanceAttributeRequestEbsOptimized Bool
-  deriving (Show, Read, Eq)
-
-data RegisterImageRequest = RegisterImageRequest
-    { registerImageRequestName :: Text
-    , registerImageRequestImageLocation :: Maybe Text
-    , registerImageRequestDescription :: Maybe Text
-    , registerImageRequestArchitecture :: Maybe Text
-    , registerImageRequestKernelId :: Maybe Text
-    , registerImageRequestRamdiskId :: Maybe Text
-    , registerImageRequestRootDeviceName :: Maybe Text
-    , registerImageRequestBlockDeviceMappings
-        :: [BlockDeviceMappingParam]
-    }
-  deriving (Show, Read, Eq)
-
-data CreateVolumeRequest
-    = CreateNewVolume
-        { createNewVolumeSize :: Int
-        , createNewVolumeAvailabilityZone :: Text
-        , createNewVolumeVolumeType :: Maybe VolumeType
-        }
-    | CreateFromSnapshot
-        { createFromSnapshotSnapshotId :: Text
-        , createFromSnapshotAvailabilityZone :: Text
-        , createFromSnapshotSize :: Maybe Int
-        , createFromSnapshotVolumeType :: Maybe VolumeType
-        }
-  deriving (Show, Read, Eq)
-
-data AssociateAddressRequest
-    = AssociateAddressRequestEc2
-        { associateAddressRequestEc2PublicIp :: IPv4
-        , associateAddressRequestEc2InstanceId :: Text
-        }
-    | AssociateAddressRequestVpc
-        { associateAddressRequestVpcAllocationId :: Text
-        , associateAddressRequestVpcInstanceId :: Maybe Text
-        , associateAddressRequestVpcNetworkInterfaceId
-            :: Maybe Text
-        , associateAddressRequestVpcPrivateIpAddress :: Maybe IPv4
-        , associateAddressRequestVpcAllowReassociation
-            :: Maybe Bool
-        }
-  deriving (Show, Read, Eq)
-
-data DisassociateAddressRequest
-    = DisassociateAddressRequestEc2 IPv4 -- ^ PublicIp for EC2
-    | DisassociateAddressRequestVpc IPv4
-      -- ^ AssociationId for VPC
-  deriving (Show, Read, Eq)
-
-data SecurityGroupRequest
-    = SecurityGroupRequestGroupId Text
-    | SecurityGroupRequestGroupName Text
-  deriving (Show, Read, Eq)
-
-data Subnet = Subnet
-    { subnetId :: Text
-    , subnetState :: SubnetState
-    , subnetVpicId :: Text
-    , subnetCidrBlock :: AddrRange IPv4
-    , subnetAvailableIpAddressCount :: Int
-    , subnetAvailabilityZone :: Text
-    , subnetDefaultForAz :: Maybe Bool
-    , subnetMapPublicIpOnLaunch :: Maybe Bool
-    , subnetTagSet :: [ResourceTag]
-    }
-  deriving (Show, Read, Eq)
-
-data SubnetState = SubnetStatePending | SubnetStateAvailable
-  deriving (Show, Read, Eq)
-
-data CreateSubnetRequest = CreateSubnetRequest
-    { createSubnetRequestVpcId :: Text
-    , createSubnetRequestCidrBlock :: AddrRange IPv4
-    , createSubnetRequestAvailabilityZone :: Maybe Text
-    }
-  deriving (Show, Read, Eq)
-
-data VolumeStatus = VolumeStatus
-    { volumeStatusVolumeId :: Text
-    , volumeStatusAvailabilityZone :: Text
-    , volumeStatusVolumeStatus :: VolumeStatusInfo
-    , volumeStatusEventSet :: [VolumeStatusEvent]
-    , volumeStatusActionSet :: [VolumeStatusAction]
-    }
-  deriving (Show, Read, Eq)
-
-data VolumeStatusInfo = VolumeStatusInfo
-    { volumeStatusInfoStatus :: VolumeStatusInfoStatus
-    , volumeStatusInfoDetails :: [VolumeStatusDetail]
-    }
-  deriving (Show, Read, Eq)
-
-data VolumeStatusInfoStatus
-    = VolumeStatusInfoStatusOK
-    | VolumeStatusInfoStatusImpaired
-    | VolumeStatusInfoStatusInsufficientData
-  deriving (Show, Read, Eq)
-
-data VolumeStatusDetail = VolumeStatusDetail
-    { volumeStatusDetailName :: Text
-    , volumeStatusDetailStatus :: Text
-    }
-  deriving (Show, Read, Eq)
-
-data VolumeStatusEvent = VolumeStatusEvent
-    { volumeStatusEventType :: Text
-    , volumeStatusEventId :: Text
-    , volumeStatusEventDescription :: Text
-    , volumeStatusEventNotBefore :: Maybe UTCTime
-    , volumeStatusEventNotAfter :: Maybe UTCTime
-    }
-  deriving (Show, Read, Eq)
-
-data VolumeStatusAction = VolumeStatusAction
-    { volumeStatusActionCode :: Text
-    , volumeStatusActionEventType :: Text
-    , volumeStatusActionEventId :: Text
-    , volumeStatusActionDescription :: Text
-    }
-  deriving (Show, Read, Eq)
-
-data VolumeAttribute
-    = VolumeAttributeAutoEnableIO Bool
-    | VolumeAttributeProductCodes [ProductCode]
-  deriving (Show, Read, Eq)
-
-data VolumeAttributeRequest
-    = VolumeAttributeRequestAutoEnableIO
-    | VolumeAttributeRequestProductCodes
-  deriving (Show, Read, Eq)
-
-data NetworkAcl = NetworkAcl
-    { networkAclId :: Text
-    , networkAclVpcId :: Text
-    , networkAclDefault :: Bool
-    , networkAclEntrySet :: [NetworkAclEntry]
-    , networkAclAssociationSet :: [NetworkAclAssociation]
-    , networkAclTagSet :: [ResourceTag]
-    }
-  deriving (Show, Read, Eq)
-
-data NetworkAclEntry = NetworkAclEntry
-    { networkAclEntryRuleNumber :: Int
-    , networkAclEntryProtocol :: Int
-    , networkAclEntryRuleAction :: NetworkAclRuleAction
-    , networkAclEntryEgress :: Bool
-    , networkAclEntryCidrBlock :: Text
-    , networkAclEntryIcmpTypeCode :: Maybe IcmpTypeCode
-    , networkAclEntryPortRange :: Maybe PortRange
-    }
-  deriving (Show, Read, Eq)
-
-data NetworkAclRuleAction
-    = NetworkAclRuleActionAllow
-    | NetworkAclRuleActionDeny
-  deriving (Show, Read, Eq)
-
-data IcmpTypeCode = IcmpTypeCode
-    { icmpTypeCodeCode :: Int
-    , icmpTypeCodeType :: Int
-    }
-  deriving (Show, Read, Eq)
-
-data PortRange = PortRange
-    { portRangeFrom :: Int
-    , portRangeTo :: Int
-    }
-  deriving (Show, Read, Eq)
-
-data NetworkAclAssociation = NetworkAclAssociation
-    { networkAclAssociationId :: Text
-    , networkAclAssociationNetworkAclId :: Text
-    , networkAclAssociationSubnetId :: Text
-    }
-  deriving (Show, Read, Eq)
-
-data NetworkAclEntryRequest = NetworkAclEntryRequest
-    { networkAclEntryRequestNetworkAclId :: Text
-    , networkAclEntryRequestRuleNumber :: Int
-    , networkAclEntryRequestProtocol :: Int
-      -- ^ Protocol Number <http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xml>
-    , networkAclEntryRequestRuleAction :: NetworkAclRuleAction
-    , networkAclEntryRequestEgress :: Bool
-    , networkAclEntryRequestCidrBlock :: Text
-    , networkAclEntryRequestIcmp :: Maybe IcmpTypeCode
-    , networkAclEntryRequestPortRange :: Maybe PortRange
-    }
-  deriving (Show, Read, Eq)
-
-data RouteTable = RouteTable
-    { routeTableId :: Text
-    , routeTableVpcId :: Text
-    , routeTableRouteSet :: [Route]
-    , routeTableAssociationSet :: [RouteTableAssociation]
-    , routeTablePropagatingVgw :: Maybe PropagatingVgw
-    , routeTableTagSet :: [ResourceTag]
-    }
-  deriving (Show, Read, Eq)
-
-data Route = Route
-    { routeDestinationCidrBlock :: Text
-    , routeGatewayId :: Maybe Text
-    , routeInstanceId :: Maybe Text
-    , routeInstanceOwnerId :: Maybe Text
-    , routeNetworkInterfaceId :: Maybe Text
-    , routeState :: RouteState
-    , routeOrigin :: Maybe RouteOrigin
-    }
-  deriving (Show, Read, Eq)
-
-data RouteState = RouteStateActive | RouteStateBlackhole
-  deriving (Show, Read, Eq)
-
-data RouteOrigin
-    = RouteOriginCreateRouteTable
-    | RouteOriginCreateRoute
-    | RouteOriginTableEnableVgwRoutePropagation
-  deriving (Show, Read, Eq)
-
-data RouteTableAssociation = RouteTableAssociation
-    { routeTableAssociationId :: Text
-    , routeTableAssociationRouteTableId :: Text
-    , routeTableAssociationSubnetId :: Maybe Text
-    , routeTableAssociationMain :: Maybe Bool
-    }
-  deriving (Show, Read, Eq)
-
-data CreateRouteRequest
-    = CreateRouteToGateway
-        { createRouteTableId :: Text
-        , createRouteDestinationCidrBlock :: AddrRange IPv4
-        , createRouteGatewayId :: Text
-        }
-    | CreateRouteToInstance
-        { createRouteTableId :: Text
-        , createRouteDestinationCidrBlock :: AddrRange IPv4
-        , createRouteInstanceId :: Text
-        }
-    | CreateRouteToNetworkInterface
-        { createRouteTableId :: Text
-        , createRouteDestinationCidrBlock :: AddrRange IPv4
-        , createRouteNetworkInterfaceId :: Text
-        }
-  deriving (Show, Read, Eq)
-
-type PropagatingVgw = Text
-
-data Vpc = Vpc
-    { vpcId :: Text
-    , vpcState :: VpcState
-    , vpcCidrBlock :: AddrRange IPv4
-    , vpcDhcpOptionsId :: Text
-    , vpcTagSet :: [ResourceTag]
-    , vpcInstanceTenancy :: Text
-    , vpcIsDefault :: Maybe Text
-    }
-  deriving (Show, Read, Eq)
-
-data VpcState = VpcStatePending | VpcStateAvailable
-  deriving (Show, Read, Eq)
-
-data VpnGateway = VpnGateway
-    { vpnGatewayId :: Text
-    , vpnGatewayState :: VpnGatewayState
-    , vpnGatewayType :: Text
-    , vpnGatewayAvailabilityZone :: Maybe Text
-    , vpnGatewayAttachments :: [Attachment]
-    , vpnGatewayTagSet :: [ResourceTag]
-    }
-  deriving (Show, Read, Eq)
-
-data VpnGatewayState
-    = VpnGatewayStatePending
-    | VpnGatewayStateAvailable
-    | VpnGatewayStateDeleting
-    | VpnGatewayStateDeleted
-  deriving (Show, Read, Eq)
-
-data Attachment = Attachment
-    { attachmentVpcId :: Text
-    , attachmentState :: AttachmentState
-    }
-  deriving (Show, Read, Eq)
-
-data AttachmentState
-    = AttachmentStateAttaching
-    | AttachmentStateAttached
-    | AttachmentStateDetaching
-    | AttachmentStateDetached
-  deriving (Show, Read, Eq)
-
-data CreateVpnGatewayType = CreateVpnGatewayTypeIpsec1
-
-data CustomerGateway = CustomerGateway
-    { customerGatewayId :: Text
-    , customerGatewayState :: CustomerGatewayState
-    , customerGatewayType :: Text
-    , customerGatewayIpAddress :: IPv4
-    , customerGatewayBgpAsn :: Int
-    , customerGatewayTagSet :: [ResourceTag]
-    }
-  deriving (Show, Read, Eq)
-
-data CustomerGatewayState
-    = CustomerGatewayStatePending
-    | CustomerGatewayStateAvailable
-    | CustomerGatewayStateDeleting
-    | CustomerGatewayStateDeleted
-  deriving (Show, Read, Eq)
-
-data InternetGateway = InternetGateway
-    { internetGatewayInternetGatewayId :: Text
-    , internetGatewayAttachmentSet :: [InternetGatewayAttachment]
-    , internetGatewayTagSet :: [ResourceTag]
-    }
-  deriving (Show, Read, Eq)
-
-data InternetGatewayAttachment = InternetGatewayAttachment
-    { internetGatewayAttachmentVpcId :: Text
-    , internetGatewayAttachmentState :: InternetGatewayAttachmentState
-    }
-  deriving (Show, Read, Eq)
-
-data InternetGatewayAttachmentState
-    = InternetGatewayAttachmentStateAttaching
-    | InternetGatewayAttachmentStateAttached
-    | InternetGatewayAttachmentStateDetaching
-    | InternetGatewayAttachmentStateDetached
-    | InternetGatewayAttachmentStateAvailable
-  deriving (Show, Read, Eq)
-
-data DhcpOptions = DhcpOptions
-    { dhcpOptionsId :: Text
-    , dhcpOptionsDhcpConfigurationSet :: [DhcpConfiguration]
-    , dhcpOptionsTagSet :: [ResourceTag]
-    }
-  deriving (Show, Read, Eq)
-
-data DhcpConfiguration = DhcpConfiguration
-    { dhcpConfigurationKey :: Text
-    , dhcpConfigurationDhcpValueSet :: [DhcpValue]
-    }
-  deriving (Show, Read, Eq)
-
-data DhcpValue = DhcpValue
-    { dhcpValueValue :: Text
-    }
-  deriving (Show, Read, Eq)
-
-data NetworkInterface = NetworkInterface
-    { networkInterfaceId :: Text
-    , networkInterfaceSubnetId :: Text
-    , networkInterfaceVpcId :: Text
-    , networkInterfaceAvailabilityZone :: Text
-    , networkInterfaceDescription :: Maybe Text
-    , networkInterfaceOwnerId :: Text
-    , networkInterfaceRequesterId :: Maybe Text
-    , networkInterfaceRequesterManaged :: Text
-    , networkInterfaceStatus :: NetworkInterfaceStatus
-    , networkInterfaceMacAddress :: Text
-    , networkInterfacePrivateIpAddress :: IPv4
-    , networkInterfacePrivateDnsName :: Maybe Text
-    , networkInterfaceSourceDestCheck :: Bool
-    , networkInterfaceGroupSet :: [Group]
-    , networkInterfaceAttachment
-        :: Maybe NetworkInterfaceAttachment
-    , networkInterfaceAssociation
-        :: Maybe NetworkInterfaceAssociation
-    , networkInterfaceTagSet :: [ResourceTag]
-    , networkInterfacePrivateIpAddressesSet
-        :: [NetworkInterfacePrivateIpAddress]
-    }
-  deriving (Show, Read, Eq)
-
-type Filter = (Text, [Text])
-
-data NetworkInterfaceStatus
-    = NetworkInterfaceStatusAvailable
-    | NetworkInterfaceStatusInUse
-    | NetworkInterfaceStatusPending
-  deriving (Show, Read, Eq)
-
-data NetworkInterfaceAttachment = NetworkInterfaceAttachment
-    { networkInterfaceAttachmentId :: Text
-    , networkInterfaceAttachmentInstanceId :: Maybe Text
-    , networkInterfaceAttachmentInstanceOwnerId :: Text
-    , networkInterfaceAttachmentDeviceIndex :: Int
-    , networkInterfaceAttachmentStatus :: Text
-    , networkInterfaceAttachmentAttachTime :: UTCTime
-    , networkInterfaceAttachmentDeleteOnTermination :: Bool
-    }
-  deriving (Show, Read, Eq)
-
-data NetworkInterfaceAssociation = NetworkInterfaceAssociation
-    { networkInterfaceAssociationAttachmentId :: Maybe Text
-    , networkInterfaceAssociationInstanceId :: Maybe Text
-    , networkInterfaceAssociationPublicIp :: IPv4
-    , networkInterfaceAssociationPublicDnsName :: Maybe Text
-    , networkInterfaceAssociationIpOwnerId :: Text
-    , networkInterfaceAssociationId :: Text
-    }
-  deriving (Show, Read, Eq)
-
-data NetworkInterfacePrivateIpAddress
-    = NetworkInterfacePrivateIpAddress
-    { networkInterfacePrivateIpAddressPrivateIpAddress :: IPv4
-    , networkInterfacePrivateIpAddressDnsName :: Maybe Text
-    , networkInterfacePrivateIpAddressPrimary :: Bool
-    , networkInterfacePrivateIpAddressAssociation
-        :: Maybe NetworkInterfaceAssociation
-    }
-  deriving (Show, Read, Eq)
-
-instance FromText Platform
-  where
-    fromMaybeText _name Nothing  = return PlatformOther
-    fromMaybeText _name (Just t)
-        | t == "windows" = return PlatformWindows
-        | otherwise      = return PlatformOther
-
-instance FromText AddressDomain
-  where
-    fromMaybeText _name Nothing  = return AddressDomainStandard
-    fromMaybeText _name (Just t)
-        | t == "standard" = return AddressDomainStandard
-        | t == "vpc"      = return AddressDomainVPC
-        | otherwise       = monadThrow $ TextConversionException t
-
-instance FromText EC2Return
-  where
-    fromTextMay t
-        | t == "true" = Just EC2Success
-        | otherwise   = Just $ EC2Error t
-
-instance FromText InstanceLifecycle
-  where
-    fromMaybeText _name Nothing  = return LifecycleNone
-    fromMaybeText _name (Just t)
-        | t == "spot" = return LifecycleSpot
-        | otherwise   = monadThrow $ TextConversionException t
-
-deriveFromText "ImageState" ["available", "pending", "failed"]
-deriveFromText "ProductCodeType" ["devpay", "marketplace"]
-deriveFromText "ImageType" ["machine", "kernel", "ramdisk"]
-deriveFromText "RootDeviceType" ["ebs", "instance-store"]
-deriveFromText "VirtualizationType" ["paravirtual", "hvm"]
-deriveFromText "Hypervisor" ["ovm", "xen"]
-deriveFromText "InstanceStatusEventCode"
-    [ "instance-reboot"
-    , "instance-stop"
-    , "system-reboot"
-    , "instance-retirement"
-    ]
-deriveFromText "InstanceStatusTypeStatus"
-    ["ok", "impaired", "insufficient-data", "not-applicable"]
-deriveFromText "InstanceMonitoringState"
-    ["disabled", "enabled", "pending", "disabling"]
-deriveFromText "Architecture" ["i386", "x86_64"]
-deriveFromText "SnapshotStatus" ["pending", "completed", "error"]
-deriveFromText "VolumeState"
-    [ "creating"
-    , "available"
-    , "in-use"
-    , "deleting"
-    , "deleted"
-    , "error"
-    ]
-deriveFromText "AttachmentSetItemResponseStatus"
-    ["attaching", "attached", "detaching", "detached"]
-deriveFromText "ShutdownBehavior" ["stop", "terminate"]
-deriveFromText "VpnConnectionState"
-    ["pending", "available", "deleting", "deleted"]
-deriveFromText "VpnTunnelTelemetryStatus" ["UP", "DOWN"]
-deriveFromText "VpnStaticRouteSource" ["Static"]
-deriveFromText "VpnStaticRouteState"
-    ["pending", "available", "deleting", "deleted"]
-deriveFromText "SubnetState" ["pending", "available"]
-deriveFromText "VolumeStatusInfoStatus"
-    ["ok", "impaired", "insufficient-data"]
-deriveFromText "NetworkAclRuleAction" ["allow", "deny"]
-deriveFromText "RouteState" ["active", "blackhole"]
-deriveFromText "RouteOrigin"
-    [ "CreateRouteTable"
-    , "CreateRoute"
-    , "EnableVgwRoutePropagation"
-    ]
-deriveFromText "VpcState" ["pending", "available"]
-deriveFromText "VpnGatewayState"
-    ["pending", "available", "deleting", "deleted"]
-deriveFromText "AttachmentState"
-    ["attaching", "attached", "detaching", "detached"]
-deriveFromText "CustomerGatewayState"
-    ["pending", "available", "deleting", "deleted"]
-deriveFromText "InternetGatewayAttachmentState"
-    ["attaching", "attached", "detaching", "detached", "available"]
-deriveFromText "NetworkInterfaceStatus" ["available", "in-use", "pending"]
-deriveFromText "PlacementGroupState" ["pending", "available", "deleting", "deleted"]
-deriveFromText "PlacementGroupStrategy" ["cluster"]
+module AWS.EC2.Types
+    ( -- * Common
+      module AWS.EC2.Types.Common
+      -- * Acl
+    , module AWS.EC2.Types.Acl
+      -- * Address
+    , module AWS.EC2.Types.Address
+      -- * AvailabiliryZone
+    , module AWS.EC2.Types.AvailabilityZone
+      -- * ConversionTask
+    , module AWS.EC2.Types.ConversionTask
+      -- * Image
+    , module AWS.EC2.Types.Image
+      -- * Instance
+    , module AWS.EC2.Types.Instance
+      -- * KeyPair
+    , module AWS.EC2.Types.KeyPair
+      -- * NetworkInterface
+    , module AWS.EC2.Types.NetworkInterface
+      -- * PlacementGroup
+    , module AWS.EC2.Types.PlacementGroup
+      -- * Region
+    , module AWS.EC2.Types.Region
+      -- * Route
+    , module AWS.EC2.Types.Route
+      -- * RouteTable
+    , module AWS.EC2.Types.RouteTable
+      -- * SecurityGroup
+    , module AWS.EC2.Types.SecurityGroup
+      -- * Snapshot
+    , module AWS.EC2.Types.Snapshot
+      -- * Subnets
+    , module AWS.EC2.Types.Subnets
+      -- * Tag
+    , module AWS.EC2.Types.Tag
+      -- * VPC
+    , module AWS.EC2.Types.VPC
+      -- * Volume
+    , module AWS.EC2.Types.Volume
+    ) where
+
+import AWS.EC2.Types.Acl
+import AWS.EC2.Types.Address
+import AWS.EC2.Types.AvailabilityZone
+import AWS.EC2.Types.ConversionTask
+import AWS.EC2.Types.Common
+import AWS.EC2.Types.Image
+import AWS.EC2.Types.Instance
+import AWS.EC2.Types.KeyPair
+import AWS.EC2.Types.NetworkInterface
+import AWS.EC2.Types.PlacementGroup
+import AWS.EC2.Types.Region
+import AWS.EC2.Types.Route
+import AWS.EC2.Types.RouteTable
+import AWS.EC2.Types.SecurityGroup
+import AWS.EC2.Types.Snapshot
+import AWS.EC2.Types.Subnets
+import AWS.EC2.Types.Tag
+import AWS.EC2.Types.VPC
+import AWS.EC2.Types.Volume
diff --git a/AWS/EC2/Types/Acl.hs b/AWS/EC2/Types/Acl.hs
new file mode 100644
--- /dev/null
+++ b/AWS/EC2/Types/Acl.hs
@@ -0,0 +1,74 @@
+{-# LANGUAGE TemplateHaskell #-}
+
+module AWS.EC2.Types.Acl
+    ( IcmpTypeCode(..)
+    , NetworkAcl(..)
+    , NetworkAclAssociation(..)
+    , NetworkAclEntry(..)
+    , NetworkAclEntryRequest(..)
+    , NetworkAclRuleAction(..)
+    , PortRange(..)
+    ) where
+
+import AWS.EC2.Types.Common (ResourceTag)
+import AWS.Lib.FromText
+
+data IcmpTypeCode = IcmpTypeCode
+    { icmpTypeCodeCode :: Int
+    , icmpTypeCodeType :: Int
+    }
+  deriving (Show, Read, Eq)
+
+data NetworkAcl = NetworkAcl
+    { networkAclId :: Text
+    , networkAclVpcId :: Text
+    , networkAclDefault :: Bool
+    , networkAclEntrySet :: [NetworkAclEntry]
+    , networkAclAssociationSet :: [NetworkAclAssociation]
+    , networkAclTagSet :: [ResourceTag]
+    }
+  deriving (Show, Read, Eq)
+
+data NetworkAclAssociation = NetworkAclAssociation
+    { networkAclAssociationId :: Text
+    , networkAclAssociationNetworkAclId :: Text
+    , networkAclAssociationSubnetId :: Text
+    }
+  deriving (Show, Read, Eq)
+
+data NetworkAclEntry = NetworkAclEntry
+    { networkAclEntryRuleNumber :: Int
+    , networkAclEntryProtocol :: Int
+    , networkAclEntryRuleAction :: NetworkAclRuleAction
+    , networkAclEntryEgress :: Bool
+    , networkAclEntryCidrBlock :: Text
+    , networkAclEntryIcmpTypeCode :: Maybe IcmpTypeCode
+    , networkAclEntryPortRange :: Maybe PortRange
+    }
+  deriving (Show, Read, Eq)
+
+data NetworkAclEntryRequest = NetworkAclEntryRequest
+    { networkAclEntryRequestNetworkAclId :: Text
+    , networkAclEntryRequestRuleNumber :: Int
+    , networkAclEntryRequestProtocol :: Int
+      -- ^ Protocol Number <http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xml>
+    , networkAclEntryRequestRuleAction :: NetworkAclRuleAction
+    , networkAclEntryRequestEgress :: Bool
+    , networkAclEntryRequestCidrBlock :: Text
+    , networkAclEntryRequestIcmp :: Maybe IcmpTypeCode
+    , networkAclEntryRequestPortRange :: Maybe PortRange
+    }
+  deriving (Show, Read, Eq)
+
+data NetworkAclRuleAction
+    = NetworkAclRuleActionAllow
+    | NetworkAclRuleActionDeny
+  deriving (Show, Read, Eq)
+
+data PortRange = PortRange
+    { portRangeFrom :: Int
+    , portRangeTo :: Int
+    }
+  deriving (Show, Read, Eq)
+
+deriveFromText "NetworkAclRuleAction" ["allow", "deny"]
diff --git a/AWS/EC2/Types/Address.hs b/AWS/EC2/Types/Address.hs
new file mode 100644
--- /dev/null
+++ b/AWS/EC2/Types/Address.hs
@@ -0,0 +1,65 @@
+{-# LANGUAGE TemplateHaskell #-}
+
+module AWS.EC2.Types.Address
+    ( Address(..)
+    , AddressDomain(..)
+    , AllocateAddress(..)
+    , AssociateAddressRequest(..)
+    , DisassociateAddressRequest(..)
+    ) where
+
+import AWS.Lib.FromText
+
+data Address = Address
+    { addressPublicIp :: IPv4
+    , addressAllocationId :: Maybe Text
+    , addressDomain :: AddressDomain
+    , addressInstanceId :: Maybe Text
+    , addressAssociationId :: Maybe Text
+    , addressNetworkInterfaceId :: Maybe Text
+    , addressNetworkInterfaceOwnerId :: Maybe Text
+    , addressPrivateIpAddress :: Maybe IPv4
+    }
+  deriving (Show, Read, Eq)
+
+data AddressDomain
+    = AddressDomainStandard
+    | AddressDomainVPC
+  deriving (Show, Read, Eq)
+
+instance FromText AddressDomain
+  where
+    fromMaybeText _name Nothing  = return AddressDomainStandard
+    fromMaybeText _name (Just t)
+        | t == "standard" = return AddressDomainStandard
+        | t == "vpc"      = return AddressDomainVPC
+        | otherwise       = monadThrow $ TextConversionException t
+
+data AllocateAddress = AllocateAddress
+    { allocateAddressPublicIp :: IPv4
+    , allocateAddressDomain :: AddressDomain
+    , allocateAddressAllocationId :: Maybe Text
+    }
+  deriving (Show, Read, Eq)
+
+data AssociateAddressRequest
+    = AssociateAddressRequestEc2
+        { associateAddressRequestEc2PublicIp :: IPv4
+        , associateAddressRequestEc2InstanceId :: Text
+        }
+    | AssociateAddressRequestVpc
+        { associateAddressRequestVpcAllocationId :: Text
+        , associateAddressRequestVpcInstanceId :: Maybe Text
+        , associateAddressRequestVpcNetworkInterfaceId
+            :: Maybe Text
+        , associateAddressRequestVpcPrivateIpAddress :: Maybe IPv4
+        , associateAddressRequestVpcAllowReassociation
+            :: Maybe Bool
+        }
+  deriving (Show, Read, Eq)
+
+data DisassociateAddressRequest
+    = DisassociateAddressRequestEc2 IPv4 -- ^ PublicIp for EC2
+    | DisassociateAddressRequestVpc IPv4
+      -- ^ AssociationId for VPC
+  deriving (Show, Read, Eq)
diff --git a/AWS/EC2/Types/AvailabilityZone.hs b/AWS/EC2/Types/AvailabilityZone.hs
new file mode 100644
--- /dev/null
+++ b/AWS/EC2/Types/AvailabilityZone.hs
@@ -0,0 +1,16 @@
+module AWS.EC2.Types.AvailabilityZone
+    ( AvailabilityZone(..)
+    , AvailabilityZoneMessage
+    ) where
+
+import AWS.Lib.FromText
+
+data AvailabilityZone = AvailabilityZone
+    { zoneName :: Text
+    , zoneState :: Text
+    , zoneRegionName :: Text
+    , zoneMessageSet :: [AvailabilityZoneMessage]
+    }
+  deriving (Show, Read, Eq)
+
+type AvailabilityZoneMessage = Text
diff --git a/AWS/EC2/Types/Common.hs b/AWS/EC2/Types/Common.hs
new file mode 100644
--- /dev/null
+++ b/AWS/EC2/Types/Common.hs
@@ -0,0 +1,114 @@
+{-# LANGUAGE TemplateHaskell #-}
+
+module AWS.EC2.Types.Common
+    ( Architecture(..)
+    , Filter
+    , EC2Return(..)
+    , Group(..)
+    , Hypervisor(..)
+    , Placement(..)
+    , Platform(..)
+    , ProductCode(..)
+    , ProductCodeType(..)
+    , ResourceTag(..)
+    , RootDeviceType(..)
+    , ShutdownBehavior(..)
+    , StateReason(..)
+    , VirtualizationType(..)
+    ) where
+
+import AWS.Lib.FromText
+
+data Architecture
+    = I386
+    | X86_64
+  deriving (Show, Read, Eq)
+
+data EC2Return
+    = EC2Success
+    | EC2Error Text
+  deriving (Show, Read, Eq)
+
+instance FromText EC2Return
+  where
+    fromTextMay t
+        | t == "true" = Just EC2Success
+        | otherwise   = Just $ EC2Error t
+
+type Filter = (Text, [Text])
+
+data Group = Group
+    { groupId :: Text
+    , groupName :: Text
+    }
+  deriving (Show, Read, Eq)
+
+data Hypervisor
+    = HypervisorOVM
+    | HypervisorXen
+  deriving (Show, Read, Eq)
+
+deriveFromText "Hypervisor" ["ovm", "xen"]
+
+data Placement = Placement
+    { placementAvailabilityZone :: Text
+    , placementGroupName :: Maybe Text
+    , placementTenancy :: Text
+    }
+  deriving (Show, Read, Eq)
+
+data Platform
+    = PlatformWindows
+    | PlatformOther
+  deriving (Show, Read, Eq)
+
+instance FromText Platform
+  where
+    fromMaybeText _name Nothing  = return PlatformOther
+    fromMaybeText _name (Just t)
+        | t == "windows" = return PlatformWindows
+        | otherwise      = return PlatformOther
+
+data ProductCode = ProductCode
+    { productCodeCode :: Text
+    , productCodeType :: ProductCodeType
+    }
+  deriving (Show, Read, Eq)
+
+data ProductCodeType
+    = ProductCodeDevpay
+    | ProductCodeMarketplace
+  deriving (Show, Read, Eq)
+
+data ResourceTag = ResourceTag
+    { resourceTagKey :: Text
+    , resourceTagValue :: Maybe Text
+    }
+  deriving (Show, Read, Eq)
+
+data RootDeviceType
+    = RootDeviceTypeEBS
+    | RootDeviceTypeInstanceStore
+  deriving (Show, Read, Eq)
+
+data ShutdownBehavior
+    = ShutdownBehaviorStop
+    | ShutdownBehaviorTerminate
+  deriving (Show, Read, Eq)
+
+data StateReason = StateReason
+    { stateReasonCode :: Text
+    , stateReasonMessage :: Text
+    }
+  deriving (Show, Read, Eq)
+
+data VirtualizationType
+    = VirtualizationTypeParavirtual
+    | VirtualizationTypeHVM
+  deriving (Show, Read, Eq)
+
+deriveFromText "Architecture" ["i386", "x86_64"]
+deriveFromText "ProductCodeType" ["devpay", "marketplace"]
+deriveFromText "RootDeviceType" ["ebs", "instance-store"]
+deriveFromText "ShutdownBehavior" ["stop", "terminate"]
+deriveFromText "VirtualizationType" ["paravirtual", "hvm"]
diff --git a/AWS/EC2/Types/ConversionTask.hs b/AWS/EC2/Types/ConversionTask.hs
new file mode 100644
--- /dev/null
+++ b/AWS/EC2/Types/ConversionTask.hs
@@ -0,0 +1,109 @@
+{-# LANGUAGE TemplateHaskell #-}
+
+module AWS.EC2.Types.ConversionTask
+    ( ConversionTask(..)
+    , ConversionTaskState(..)
+    , DiskImage(..)
+    , DiskImageDescription(..)
+    , DiskImageVolumeDescription(..)
+    , ImportInstanceTaskDetailItem(..)
+    , ImportInstanceTaskDetails(..)
+    , ImportVolumeRequestImage(..)
+    , ImportVolumeTaskDetails(..)
+    , LaunchSpecification(..)
+    ) where
+
+import AWS.EC2.Types.Common (Architecture, ShutdownBehavior)
+import AWS.Lib.FromText
+
+data ConversionTask = ConversionTask
+    { conversionTaskId :: Text
+    , conversionTaskExpirationTime :: Text
+    , conversionTaskImportVolume :: Maybe ImportVolumeTaskDetails
+    , conversionTaskImportInstance :: Maybe ImportInstanceTaskDetails
+    , conversionTaskState :: ConversionTaskState
+    , conversionTaskStatusMessage :: Text
+    }
+  deriving (Show, Read, Eq)
+
+data ConversionTaskState
+    = ConversionTaskActive
+    | ConversionTaskCancelling
+    | ConversionTaskCancelled
+    | ConversionTaskCompleted
+  deriving (Show, Read, Eq)
+
+data DiskImage = DiskImage
+    { diskImageFormat :: Text
+    , diskImageBytes :: Int
+    , diskImageImportManifestUrl :: Text
+    , diskImageDescripsion :: Maybe Text
+    , diskImageVolumeSize :: Int
+    }
+  deriving (Show, Read, Eq)
+
+data DiskImageDescription = DiskImageDescription
+    { diskImageDescriptionFormat :: Text
+    , diskImageDescriptionSize :: Int
+    , diskImageDescriptionImportManifestUrl :: Text
+    , diskImageDescriptionChecksum :: Maybe Text
+    }
+  deriving (Show, Read, Eq)
+
+data DiskImageVolumeDescription = DiskImageVolumeDescription
+    { diskImageVolumeDescriptionSize :: Int
+    , diskImageVolumeDescriptionId :: Maybe Text
+    }
+  deriving (Show, Read, Eq)
+
+data ImportInstanceTaskDetailItem = ImportInstanceTaskDetailItem
+    { importInstanceTaskDetailItemBytesConverted :: Int
+    , importInstanceTaskDetailItemAvailabilityZone :: Text
+    , importInstanceTaskDetailItemImage :: DiskImageDescription
+    , importInstanceTaskDetailItemDescription :: Maybe Text
+    , importInstanceTaskDetailItemVolume :: DiskImageVolumeDescription
+    , importInstanceTaskDetailItemStatus :: Text
+    , importInstanceTaskDetailItemStatusMessage :: Maybe Text
+    }
+  deriving (Show, Read, Eq)
+
+data ImportInstanceTaskDetails = ImportInstanceTaskDetails
+    { importInstanceTaskDetailsVolumes :: [ImportInstanceTaskDetailItem]
+    , importInstanceTaskDetailsInstanceId :: Text
+    , importInstanceTaskDetailsPlatform :: Maybe Text
+    , importInstanceTaskDetailsDescription :: Maybe Text
+    }
+  deriving (Show, Read, Eq)
+
+data ImportVolumeRequestImage = ImportVolumeRequestImage
+    { importVolumeRequestImageFormat :: Text
+    , importVolumeRequestImageBytes :: Int
+    , importVolumeRequestImageImportManifestUrl :: Text
+    }
+  deriving (Show, Read, Eq)
+
+data ImportVolumeTaskDetails = ImportVolumeTaskDetails
+    { importVolumeTaskDetailsBytesConverted :: Int
+    , importVolumeTaskDetailsAvailabilityZone :: Text
+    , importVolumeTaskDetailsDescription :: Maybe Text
+    , importVolumeTaskDetailsImage :: DiskImageDescription
+    , importVolumeTaskDetailsVolume :: DiskImageVolumeDescription
+    }
+  deriving (Show, Read, Eq)
+
+data LaunchSpecification = LaunchSpecification
+    { launchSpecificationArchitecture :: Architecture
+    , launchSpecificationGroupNames :: [Text]
+    , launchSpecificationUserData :: Maybe Text
+    , launchSpecificationInstanceType :: Text
+    , launchSpecificationPlacementAvailabilityZone :: Maybe Text
+    , launchSpecificationMonitoringEnabled :: Maybe Bool
+    , launchSpecificationSubnetId :: Maybe Text
+    , launchSpecificationInstanceInitiatedShutdownBehavior
+        :: Maybe ShutdownBehavior
+    , launchSpecificationPrivateIpAddress :: Maybe IPv4
+    }
+  deriving (Show, Read, Eq)
+
+deriveFromText "ConversionTaskState"
+    ["active", "cancelling", "cancelled", "completed"]
diff --git a/AWS/EC2/Types/Image.hs b/AWS/EC2/Types/Image.hs
new file mode 100644
--- /dev/null
+++ b/AWS/EC2/Types/Image.hs
@@ -0,0 +1,151 @@
+{-# LANGUAGE TemplateHaskell #-}
+
+module AWS.EC2.Types.Image
+    ( AMIAttribute(..)
+    , AMIAttributeDescription(..)
+    , BlockDeviceMapping(..)
+    , BlockDeviceMappingParam(..)
+    , EbsBlockDevice(..)
+    , EbsSource(..)
+    , Image(..)
+    , ImageState(..)
+    , ImageType(..)
+    , LaunchPermission(..)
+    , LaunchPermissionItem(..)
+    , ProductCodeItem(..)
+    , RegisterImageRequest(..)
+    ) where
+
+import AWS.EC2.Types.Common
+import AWS.EC2.Types.Volume (VolumeType)
+import AWS.Lib.FromText
+
+data AMIAttribute
+    = AMIDescription
+    | AMIKernel
+    | AMIRamdisk
+    | AMILaunchPermission
+    | AMIProductCodes
+    | AMIBlockDeviceMapping
+  deriving (Show, Read, Eq)
+
+data AMIAttributeDescription = AMIAttributeDescription
+    { amiAttributeDescriptionImageId :: Text
+    , amiAttributeDescriptionLaunchPermission :: [LaunchPermissionItem]
+    , amiAttributeDescriptionProductCodes :: [ProductCodeItem]
+    , amiAttributeDescriptionKernel :: Maybe Text
+    , amiAttributeDescriptionRamdisk :: Maybe Text
+    , amiAttributeDescriptionDescription :: Maybe Text
+    , amiAttributeDescriptionBlockDeviceMapping :: [BlockDeviceMapping]
+    }
+  deriving (Show, Read, Eq)
+
+data BlockDeviceMapping = BlockDeviceMapping
+    { blockDeviceMappingDeviceName :: Text
+    , blockDeviceMappingVirtualName :: Maybe Text
+    , blockDeviceMappingEbs :: Maybe EbsBlockDevice
+    }
+  deriving (Show, Read, Eq)
+
+data BlockDeviceMappingParam
+    = BlockDeviceMappingParamEbs
+        { blockDeviceMappingParamEbsDeviceName :: Text
+        , blockDeviceMappingParamEbsNoDevice :: Maybe Bool
+        , blockDeviceMappingParamEbsSource :: EbsSource
+        , blockDeviceMappingParamEbsDeleteOnTermination
+            :: Maybe Bool
+        , blockDeviceMappingParamEbsVolumeType :: Maybe VolumeType
+        }
+    | BlockDeviceMappingParamInstanceStore
+        { blockDeviceMappingParamInstanceStoreDeviceName :: Text
+        , blockDeviceMappingParamInstanceStoreNoDevice
+            :: Maybe Bool
+        , blockDeviceMappingParamInstanceStoreVirtualName
+            :: Maybe Text
+        }
+  deriving (Show, Read, Eq)
+
+data EbsBlockDevice = EbsBlockDevice
+    { ebsSnapshotId :: Maybe Text
+    , ebsVolumeSize :: Int
+    , ebsDeleteOnTermination :: Bool
+    , ebsVolumeType :: VolumeType
+    }
+  deriving (Show, Read, Eq)
+
+data EbsSource
+    = EbsSourceSnapshotId Text
+    | EbsSourceVolumeSize Int
+  deriving (Show, Read, Eq)
+
+data Image = Image
+    { imageId :: Text
+    , imageLocation :: Text
+    , imageImageState :: ImageState
+    , imageOwnerId :: Text
+    , imageIsPublic :: Bool
+    , imageProductCodes :: [ProductCode]
+    , imageArchitecture :: Text
+    , imageImageType :: ImageType
+    , imageKernelId :: Maybe Text
+    , imageRamdiskId :: Maybe Text
+    , imagePlatform :: Platform
+    , imageStateReason :: Maybe StateReason
+    , imageViridianEnabled :: Maybe Bool
+    , imageOwnerAlias :: Maybe Text
+    , imageName :: Maybe Text
+    , imageDescription :: Maybe Text
+    , imageBillingProducts :: [Text]
+    , imageRootDeviceType :: RootDeviceType
+    , imageRootDeviceName :: Maybe Text
+    , imageBlockDeviceMappings :: [BlockDeviceMapping]
+    , imageVirtualizationType :: VirtualizationType
+    , imageTagSet :: [ResourceTag]
+    , imageHypervisor :: Hypervisor
+    }
+  deriving (Show, Read, Eq)
+
+data ImageState
+    = ImageStateAvailable
+    | ImageStatePending
+    | ImageStateFailed
+  deriving (Show, Read, Eq)
+
+data ImageType
+    = ImageTypeMachine
+    | ImageTypeKernel
+    | ImageTypeRamDisk
+  deriving (Show, Read, Eq)
+
+data LaunchPermission = LaunchPermission
+    { launchPermissionAdd :: [LaunchPermissionItem]
+    , launchPermissionRemove :: [LaunchPermissionItem]
+    }
+  deriving (Show, Read, Eq)
+
+data LaunchPermissionItem = LaunchPermissionItem
+    { launchPermissionItemGroup :: Text
+    , launchPermissionUserId :: Text
+    }
+  deriving (Show, Read, Eq)
+
+data ProductCodeItem = ProductCodeItem
+    { productCodeItemProductCode :: Text
+    }
+  deriving (Show, Read, Eq)
+
+data RegisterImageRequest = RegisterImageRequest
+    { registerImageRequestName :: Text
+    , registerImageRequestImageLocation :: Maybe Text
+    , registerImageRequestDescription :: Maybe Text
+    , registerImageRequestArchitecture :: Maybe Text
+    , registerImageRequestKernelId :: Maybe Text
+    , registerImageRequestRamdiskId :: Maybe Text
+    , registerImageRequestRootDeviceName :: Maybe Text
+    , registerImageRequestBlockDeviceMappings
+        :: [BlockDeviceMappingParam]
+    }
+  deriving (Show, Read, Eq)
+
+deriveFromText "ImageState" ["available", "pending", "failed"]
+deriveFromText "ImageType" ["machine", "kernel", "ramdisk"]
diff --git a/AWS/EC2/Types/Instance.hs b/AWS/EC2/Types/Instance.hs
new file mode 100644
--- /dev/null
+++ b/AWS/EC2/Types/Instance.hs
@@ -0,0 +1,366 @@
+{-# LANGUAGE TemplateHaskell #-}
+
+module AWS.EC2.Types.Instance
+    ( ConsoleOutput(..)
+    , EbsInstanceBlockDevice(..)
+    , IamInstanceProfile(..)
+    , Instance(..)
+    , InstanceAttribute(..)
+    , InstanceAttributeRequest(..)
+    , InstanceBlockDeviceMapping(..)
+    , InstanceLifecycle(..)
+    , InstanceMonitoringState(..)
+    , InstanceNetworkInterface(..)
+    , InstanceNetworkInterfaceAssociation(..)
+    , InstanceNetworkInterfaceAttachment(..)
+    , InstancePrivateIpAddress(..)
+    , InstanceState(..)
+    , InstanceStateChange(..)
+    , InstanceStatus(..)
+    , InstanceStatusDetail(..)
+    , InstanceStatusDetailName
+    , InstanceStatusDetailStatus
+    , InstanceStatusEvent(..)
+    , InstanceStatusEventCode(..)
+    , InstanceStatusType(..)
+    , InstanceStatusTypeStatus(..)
+    , ModifyInstanceAttributeRequest(..)
+    , MonitorInstancesResponse(..)
+    , PasswordData(..)
+    , Reservation(..)
+    , ResetInstanceAttributeRequest(..)
+    , RunInstancesRequest(..)
+    ) where
+
+import Data.ByteString (ByteString)
+
+import AWS.Class
+import AWS.EC2.Types.Common
+import AWS.EC2.Types.Image (BlockDeviceMappingParam)
+import AWS.EC2.Types.NetworkInterface (NetworkInterfaceParam)
+import AWS.EC2.Types.Volume (AttachmentSetItemResponseStatus)
+import AWS.Lib.FromText
+
+data ConsoleOutput = ConsoleOutput
+    { consoleOutputInstanceId :: Text
+    , consoleOutputTimestamp :: UTCTime
+        -- ^ The time the data was last updated.
+    , consoleOutputOutput :: Text
+    }
+  deriving (Show, Read, Eq)
+
+data EbsInstanceBlockDevice = EbsInstanceBlockDevice
+    { ebsInstanceBlockDeviceVolumeId :: Text
+    , ebsInstanceBlockDeviceState :: AttachmentSetItemResponseStatus
+    , ebsInstanceBlockDeviceAttachTime :: UTCTime
+    , ebsInstanceBlockDeviceDeleteOnTermination :: Bool
+    }
+  deriving (Show, Read, Eq)
+
+data IamInstanceProfile = IamInstanceProfile
+    { iamInstanceProfileArn :: Text
+    , iamInstanceProfileId :: Text
+    }
+  deriving (Show, Read, Eq)
+
+data Instance = Instance
+    { instanceId :: Text
+    , instanceImageId :: Text
+    , instanceState :: InstanceState
+    , instancePrivateDnsName :: Maybe Text
+    , instanceDnsName :: Maybe Text
+    , instanceReason :: Maybe Text
+    , instanceKeyName :: Maybe Text
+    , instanceAmiLaunchIndex :: Text
+    , instanceProductCodes :: [ProductCode]
+    , instanceType :: Text
+    , instanceLaunchTime :: UTCTime
+    , instancePlacement :: Placement
+    , instanceKernelId :: Maybe Text
+    , instanceRamdiskId :: Maybe Text
+    , instancePlatform :: Maybe Text
+    , instanceMonitoring :: InstanceMonitoringState
+    , instanceSubnetId :: Maybe Text
+    , instanceVpcId :: Maybe Text
+    , instancePrivateIpAddress :: Maybe IPv4
+    , instanceIpAddress :: Maybe IPv4
+    , instanceSourceDestCheck :: Maybe Bool
+    , instancevpcGroupSet :: [Group]
+    , instanceStateReason :: Maybe StateReason
+    , instanceArchitecture :: Architecture
+    , instanceRootDeviceType :: RootDeviceType
+    , instanceRootDeviceName :: Maybe Text
+    , instanceBlockDeviceMappings :: [InstanceBlockDeviceMapping]
+    , instanceInstanceLifecycle :: Maybe InstanceLifecycle
+    , instanceSpotInstanceRequestId :: Maybe Text
+    , instanceVirtualizationType :: VirtualizationType
+    , instanceClientToken :: Maybe Text
+    , instanceTagSet :: [ResourceTag]
+    , instanceHypervisor :: Hypervisor
+    , instanceNetworkInterfaceSet :: [InstanceNetworkInterface]
+    , instanceIamInstanceProfile :: Maybe IamInstanceProfile
+    , instanceEbsOptimized :: Bool -- default: false
+    }
+  deriving (Show, Read, Eq)
+
+data InstanceAttribute
+    = 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, Read, Eq)
+
+data InstanceAttributeRequest
+    = InstanceAttributeRequestInstanceType
+    | InstanceAttributeRequestKernelId
+    | InstanceAttributeRequestRamdiskId
+    | InstanceAttributeRequestUserData
+    | InstanceAttributeRequestDisableApiTermination
+    | InstanceAttributeRequestShutdownBehavior
+    | InstanceAttributeRequestRootDeviceName
+    | InstanceAttributeRequestBlockDeviceMapping
+    | InstanceAttributeRequestSourceDestCheck
+    | InstanceAttributeRequestGroupSet
+    | InstanceAttributeRequestProductCodes
+    | InstanceAttributeRequestEbsOptimized
+  deriving (Show, Eq, Ord)
+
+data InstanceBlockDeviceMapping = InstanceBlockDeviceMapping
+    { instanceBlockDeviceMappingDeviceName :: Text
+    , instanceBlockDeviceMappingEbs :: EbsInstanceBlockDevice
+    }
+  deriving (Show, Read, Eq)
+
+data InstanceLifecycle
+    = LifecycleSpot
+    | LifecycleNone
+  deriving (Show, Read, Eq)
+
+instance FromText InstanceLifecycle
+  where
+    fromMaybeText _name Nothing  = return LifecycleNone
+    fromMaybeText _name (Just t)
+        | t == "spot" = return LifecycleSpot
+        | otherwise   = monadThrow $ TextConversionException t
+
+data InstanceMonitoringState
+    = MonitoringDisabled
+    | MonitoringEnabled
+    | MonitoringPending
+    | MonitoringDisabling
+  deriving (Show, Read, Eq)
+
+data InstanceNetworkInterface = InstanceNetworkInterface
+    { instanceNetworkInterfaceId :: Text
+    , instanceNetworkInterfaceSubnetId :: Maybe Text
+    , instanceNetworkInterfaceVpcId :: Maybe Text
+    , instanceNetworkInterfaceDescription :: Maybe Text
+    , instanceNetworkInterfaceOwnerId :: Text
+    , instanceNetworkInterfaceStatus :: Text
+    , instanceNetworkInterfaceMacAddress :: Maybe Text
+    , instanceNetworkInterfacePrivateIpAddress :: Maybe IPv4
+    , instanceNetworkInterfacePrivateDnsName :: Maybe Text
+    , instanceNetworkInterfaceSourceDestCheck :: Maybe Bool
+    , instanceNetworkInterfaceGroupSet :: [Group]
+    , instanceNetworkInterfaceAttachment
+        :: InstanceNetworkInterfaceAttachment
+    , instanceNetworkInterfaceAssociation
+        :: Maybe InstanceNetworkInterfaceAssociation
+    , instanceNetworkInterfacePrivateIpAddressesSet
+        :: [InstancePrivateIpAddress]
+    }
+  deriving (Show, Read, Eq)
+
+data InstanceNetworkInterfaceAssociation
+    = InstanceNetworkInterfaceAssociation
+    { instanceNetworkInterfaceAssociationPublicIp :: IPv4
+    , instanceNetworkInterfaceAssociationPublicDnsName
+        :: Maybe Text
+    , instanceNetworkInterfaceAssociationIpOwnerId :: Text
+    }
+  deriving (Show, Read, Eq)
+
+data InstanceNetworkInterfaceAttachment = InstanceNetworkInterfaceAttachment
+    { instanceNetworkInterfaceAttachmentId :: Text
+    , instanceNetworkInterfaceAttachmentDeviceIndex :: Int
+    , instanceNetworkInterfaceAttachmentStatus :: Text
+    , instanceNetworkInterfaceAttachmentAttachTime :: UTCTime
+    , instanceNetworkInterfaceAttachmentDeleteOnTermination
+        :: Bool
+    }
+  deriving (Show, Read, Eq)
+
+data InstancePrivateIpAddress = InstancePrivateIpAddress
+    { instancePrivateIpAddressAddress :: IPv4
+    , instancePrivateIpAddressDnsName :: Maybe Text
+    , instancePrivateIpAddressPrimary :: Bool
+    , instancePrivateIpAddressAssociation
+        :: Maybe InstanceNetworkInterfaceAssociation
+    }
+  deriving (Show, Read, Eq)
+
+data InstanceState
+    = InstanceStatePending
+    | InstanceStateRunning
+    | InstanceStateShuttingDown
+    | InstanceStateTerminated
+    | InstanceStateStopping
+    | InstanceStateStopped
+    | InstanceStateUnknown Int
+  deriving (Show, Read, Eq)
+
+data InstanceStateChange = InstanceStateChange
+    { instanceStateChangeInstanceId :: Text
+    , instanceStateChangeCurrentState :: InstanceState
+    , instanceStateChangePreviousState :: InstanceState
+    }
+  deriving (Show, Read, Eq)
+
+data InstanceStatus = InstanceStatus
+    { instanceStatusInstanceId :: Text
+    , instanceStatusAvailabilityZone :: Text
+    , instanceStatusEventsSet :: [InstanceStatusEvent]
+    , instanceStatusInstanceState :: InstanceState
+    , instanceStatusSystemStatus :: InstanceStatusType
+    , instanceStatusInstanceStatus :: InstanceStatusType
+    }
+  deriving (Show, Read, Eq)
+
+data InstanceStatusDetail = InstanceStatusDetail
+    { instanceStatusDetailName :: InstanceStatusDetailName
+    , instanceStatusDetailStatus :: InstanceStatusDetailStatus
+    , instanceStatusDetailImpairedSince :: Maybe UTCTime
+    }
+  deriving (Show, Read, Eq)
+
+type InstanceStatusDetailName = Text
+
+type InstanceStatusDetailStatus = Text
+
+data InstanceStatusEvent = InstanceStatusEvent
+    { instanceStatusEventCode :: InstanceStatusEventCode
+    , instanceStatusEventDescription :: Text
+    , instanceStatusEventNotBefore :: Maybe UTCTime
+    , instanceStatusEventNotAfter :: Maybe UTCTime
+    }
+  deriving (Show, Read, Eq)
+
+data InstanceStatusEventCode
+    = InstanceStatusEventCodeInstanceReboot
+    | InstanceStatusEventCodeInstanceStop
+    | InstanceStatusEventCodeSystemReboot
+    | InstanceStatusEventCodeInstanceRetirement
+  deriving (Show, Read, Eq)
+
+data InstanceStatusType = InstanceStatusType
+    { instanceStatusTypeStatus :: InstanceStatusTypeStatus
+    , instanceStatusTypeDetails :: [InstanceStatusDetail]
+    }
+  deriving (Show, Read, Eq)
+
+data InstanceStatusTypeStatus
+    = InstanceStatusTypeStatusOK
+    | InstanceStatusTypeStatusImpaired
+    | InstanceStatusTypeStatusInsufficientData
+    | InstanceStatusTypeStatusNotApplicable
+  deriving (Show, Read, Eq)
+
+data ModifyInstanceAttributeRequest
+    = ModifyInstanceAttributeRequestInstanceType Text
+    | ModifyInstanceAttributeRequestKernelId Text
+    | ModifyInstanceAttributeRequestRamdiskId Text
+    | ModifyInstanceAttributeRequestUserData Text
+    | ModifyInstanceAttributeRequestDisableApiTermination Bool
+    | ModifyInstanceAttributeRequestShutdownBehavior
+        ShutdownBehavior
+    | ModifyInstanceAttributeRequestRootDeviceName Text
+    | ModifyInstanceAttributeRequestBlockDeviceMapping
+        [BlockDeviceMappingParam]
+    | ModifyInstanceAttributeRequestSourceDestCheck Bool
+    | ModifyInstanceAttributeRequestGroupSet [Text]
+    | ModifyInstanceAttributeRequestEbsOptimized Bool
+  deriving (Show, Read, Eq)
+
+
+data MonitorInstancesResponse = MonitorInstancesResponse
+    { monitorInstancesResponseInstanceId :: Text
+    , monitorInstancesResponseInstanceMonitoringState
+        :: InstanceMonitoringState
+    }
+  deriving (Show, Read, Eq)
+
+data PasswordData = PasswordData
+    { passwordDataInstanceId :: Text
+    , passwordDataTimestamp :: UTCTime
+      -- ^ The time the data was last updated.
+    , passwordDataPasswordData :: Text
+    }
+  deriving (Show, Read, Eq)
+
+data Reservation = Reservation
+    { reservationId :: Text
+    , reservationOwnerId :: Text
+    , reservationGroupSet :: [Group]
+    , reservationInstanceSet :: [Instance]
+    , reservationRequesterId :: Maybe Text
+    }
+  deriving (Show, Read, Eq)
+
+data ResetInstanceAttributeRequest
+    = ResetInstanceAttributeRequestKernel
+    | ResetInstanceAttributeRequestRamdisk
+    | ResetInstanceAttributeRequestSourceDestCheck
+  deriving (Show, Read, Eq)
+
+data RunInstancesRequest = RunInstancesRequest
+    { runInstancesRequestImageId :: Text -- ^ Required
+    , runInstancesRequestMinCount :: Int -- ^ Required
+    , runInstancesRequestMaxCount :: Int -- ^ Required
+    , runInstancesRequestKeyName :: Maybe Text
+    , runInstancesRequestSecurityGroupIds :: [Text]
+      -- ^ SecurityGroupIds (Required for VPC; optional for EC2)
+    , runInstancesRequestSecurityGroups :: [Text]
+      -- ^ SecurityGroups (Only for EC2; either id or name is accepted)
+    , runInstancesRequestUserData :: Maybe ByteString
+      -- ^ UserData (Base64-encoded MIME user data)
+    , 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 IPv4
+    , runInstancesRequestClientToken :: Maybe Text
+    , runInstancesRequestNetworkInterfaces
+        :: [NetworkInterfaceParam]
+    , runInstancesRequestIamInstanceProfile
+        :: Maybe IamInstanceProfile
+    , runInstancesRequestEbsOptimized :: Maybe Bool
+    }
+  deriving (Show, Read, Eq)
+
+deriveFromText "InstanceMonitoringState"
+    ["disabled", "enabled", "pending", "disabling"]
+deriveFromText "InstanceStatusEventCode"
+    [ "instance-reboot"
+    , "instance-stop"
+    , "system-reboot"
+    , "instance-retirement"
+    ]
+deriveFromText "InstanceStatusTypeStatus"
+    ["ok", "impaired", "insufficient-data", "not-applicable"]
diff --git a/AWS/EC2/Types/KeyPair.hs b/AWS/EC2/Types/KeyPair.hs
new file mode 100644
--- /dev/null
+++ b/AWS/EC2/Types/KeyPair.hs
@@ -0,0 +1,11 @@
+module AWS.EC2.Types.KeyPair
+    ( KeyPair(..)
+    ) where
+
+import AWS.Lib.FromText
+
+data KeyPair = KeyPair
+    { keyPairName :: Text
+    , keyPairFingerprint :: Text
+    }
+  deriving (Show, Read, Eq)
diff --git a/AWS/EC2/Types/NetworkInterface.hs b/AWS/EC2/Types/NetworkInterface.hs
new file mode 100644
--- /dev/null
+++ b/AWS/EC2/Types/NetworkInterface.hs
@@ -0,0 +1,108 @@
+{-# LANGUAGE TemplateHaskell #-}
+
+module AWS.EC2.Types.NetworkInterface
+    ( NetworkInterface(..)
+    , NetworkInterfaceAssociation(..)
+    , NetworkInterfaceAttachment(..)
+    , NetworkInterfaceParam(..)
+    , NetworkInterfacePrivateIpAddress(..)
+    , NetworkInterfaceStatus(..)
+    , SecondaryPrivateIpAddressParam(..)
+    ) where
+
+import AWS.EC2.Types.Common (Group, ResourceTag)
+import AWS.Lib.FromText
+
+data NetworkInterface = NetworkInterface
+    { networkInterfaceId :: Text
+    , networkInterfaceSubnetId :: Text
+    , networkInterfaceVpcId :: Text
+    , networkInterfaceAvailabilityZone :: Text
+    , networkInterfaceDescription :: Maybe Text
+    , networkInterfaceOwnerId :: Text
+    , networkInterfaceRequesterId :: Maybe Text
+    , networkInterfaceRequesterManaged :: Text
+    , networkInterfaceStatus :: NetworkInterfaceStatus
+    , networkInterfaceMacAddress :: Text
+    , networkInterfacePrivateIpAddress :: IPv4
+    , networkInterfacePrivateDnsName :: Maybe Text
+    , networkInterfaceSourceDestCheck :: Bool
+    , networkInterfaceGroupSet :: [Group]
+    , networkInterfaceAttachment
+        :: Maybe NetworkInterfaceAttachment
+    , networkInterfaceAssociation
+        :: Maybe NetworkInterfaceAssociation
+    , networkInterfaceTagSet :: [ResourceTag]
+    , networkInterfacePrivateIpAddressesSet
+        :: [NetworkInterfacePrivateIpAddress]
+    }
+  deriving (Show, Read, Eq)
+
+data NetworkInterfaceAssociation = NetworkInterfaceAssociation
+    { networkInterfaceAssociationAttachmentId :: Maybe Text
+    , networkInterfaceAssociationInstanceId :: Maybe Text
+    , networkInterfaceAssociationPublicIp :: IPv4
+    , networkInterfaceAssociationPublicDnsName :: Maybe Text
+    , networkInterfaceAssociationIpOwnerId :: Text
+    , networkInterfaceAssociationId :: Maybe Text
+    }
+  deriving (Show, Read, Eq)
+
+data NetworkInterfaceAttachment = NetworkInterfaceAttachment
+    { networkInterfaceAttachmentId :: Text
+    , networkInterfaceAttachmentInstanceId :: Maybe Text
+    , networkInterfaceAttachmentInstanceOwnerId :: Text
+    , networkInterfaceAttachmentDeviceIndex :: Int
+    , networkInterfaceAttachmentStatus :: Text
+    , networkInterfaceAttachmentAttachTime :: UTCTime
+    , networkInterfaceAttachmentDeleteOnTermination :: Bool
+    }
+  deriving (Show, Read, Eq)
+
+data NetworkInterfaceParam
+    = NetworkInterfaceParamCreate
+        { networkInterfaceParamCreateDeviceIndex :: Int
+        , networkInterfaceParamCreateSubnetId :: Text
+        , networkInterfaceParamCreateDescription :: Text
+        , networkInterfaceParamCreatePrivateIpAddress
+            :: Maybe IPv4
+        , networkInterfaceParamCreatePrivateIpAddresses
+            :: SecondaryPrivateIpAddressParam
+        , networkInterfaceParamCreateSecurityGroupIds :: [Text]
+        , networkInterfaceParamCreateDeleteOnTermination :: Bool
+        }
+    | NetworkInterfaceParamAttach
+        { networkInterfaceParamAttachInterfaceId :: Text
+        , networkInterfaceParamAttachDeviceIndex :: Int
+        , networkInterfaceParamAttachDeleteOnTermination :: Bool
+        }
+  deriving (Show, Read, Eq)
+
+data NetworkInterfacePrivateIpAddress
+    = NetworkInterfacePrivateIpAddress
+    { networkInterfacePrivateIpAddressPrivateIpAddress :: IPv4
+    , networkInterfacePrivateIpAddressDnsName :: Maybe Text
+    , networkInterfacePrivateIpAddressPrimary :: Bool
+    , networkInterfacePrivateIpAddressAssociation
+        :: Maybe NetworkInterfaceAssociation
+    }
+  deriving (Show, Read, Eq)
+
+data NetworkInterfaceStatus
+    = NetworkInterfaceStatusAvailable
+    | NetworkInterfaceStatusInUse
+    | NetworkInterfaceStatusPending
+  deriving (Show, Read, Eq)
+
+data SecondaryPrivateIpAddressParam
+    = SecondaryPrivateIpAddressParamNothing
+    | SecondaryPrivateIpAddressParamCount Int
+    | SecondaryPrivateIpAddressParamSpecified
+      { secondaryPrivateIpAddressParamSpecifiedAddresses :: [IPv4]
+      , secondaryPrivateIpAddressParamSpecifiedPrimary
+        :: Maybe Int
+      }
+  deriving (Show, Read, Eq)
+
+deriveFromText "NetworkInterfaceStatus"
+    ["available", "in-use", "pending"]
diff --git a/AWS/EC2/Types/PlacementGroup.hs b/AWS/EC2/Types/PlacementGroup.hs
new file mode 100644
--- /dev/null
+++ b/AWS/EC2/Types/PlacementGroup.hs
@@ -0,0 +1,31 @@
+{-# LANGUAGE TemplateHaskell #-}
+
+module AWS.EC2.Types.PlacementGroup
+    ( PlacementGroup(..)
+    , PlacementGroupState(..)
+    , PlacementGroupStrategy(..)
+    ) where
+
+import AWS.Lib.FromText
+
+data PlacementGroup = PlacementGroup
+    { placementGroupGroupName :: Text
+    , placementGroupStrategy :: PlacementGroupStrategy
+    , placementGroupState :: PlacementGroupState
+    }
+  deriving (Show, Read, Eq)
+
+data PlacementGroupState
+    = PlacementGroupStatePending
+    | PlacementGroupStateAvailable
+    | PlacementGroupStateDeleting
+    | PlacementGroupStateDeleted
+  deriving (Show, Read, Eq)
+
+data PlacementGroupStrategy
+    = PlacementGroupStrategyCluster
+  deriving (Show, Read, Eq)
+
+deriveFromText "PlacementGroupState"
+    ["pending", "available", "deleting", "deleted"]
+deriveFromText "PlacementGroupStrategy" ["cluster"]
diff --git a/AWS/EC2/Types/Region.hs b/AWS/EC2/Types/Region.hs
new file mode 100644
--- /dev/null
+++ b/AWS/EC2/Types/Region.hs
@@ -0,0 +1,11 @@
+module AWS.EC2.Types.Region
+    ( Region(..)
+    ) where
+
+import AWS.Lib.FromText
+
+data Region = Region
+    { regionName :: Text
+    , regionEndpoint :: Text
+    }
+  deriving (Show, Read, Eq)
diff --git a/AWS/EC2/Types/Route.hs b/AWS/EC2/Types/Route.hs
new file mode 100644
--- /dev/null
+++ b/AWS/EC2/Types/Route.hs
@@ -0,0 +1,23 @@
+module AWS.EC2.Types.Route
+    ( CreateRouteRequest(..)
+    ) where
+
+import AWS.Lib.FromText
+
+data CreateRouteRequest
+    = CreateRouteToGateway
+        { createRouteTableId :: Text
+        , createRouteDestinationCidrBlock :: AddrRange IPv4
+        , createRouteGatewayId :: Text
+        }
+    | CreateRouteToInstance
+        { createRouteTableId :: Text
+        , createRouteDestinationCidrBlock :: AddrRange IPv4
+        , createRouteInstanceId :: Text
+        }
+    | CreateRouteToNetworkInterface
+        { createRouteTableId :: Text
+        , createRouteDestinationCidrBlock :: AddrRange IPv4
+        , createRouteNetworkInterfaceId :: Text
+        }
+  deriving (Show, Read, Eq)
diff --git a/AWS/EC2/Types/RouteTable.hs b/AWS/EC2/Types/RouteTable.hs
new file mode 100644
--- /dev/null
+++ b/AWS/EC2/Types/RouteTable.hs
@@ -0,0 +1,63 @@
+{-# LANGUAGE TemplateHaskell #-}
+
+module AWS.EC2.Types.RouteTable
+    ( PropagatingVgw
+    , Route(..)
+    , RouteOrigin(..)
+    , RouteState(..)
+    , RouteTable(..)
+    , RouteTableAssociation(..)
+    ) where
+
+import AWS.EC2.Types.Common (ResourceTag)
+import AWS.Lib.FromText
+
+type PropagatingVgw = Text
+
+data Route = Route
+    { routeDestinationCidrBlock :: Text
+    , routeGatewayId :: Maybe Text
+    , routeInstanceId :: Maybe Text
+    , routeInstanceOwnerId :: Maybe Text
+    , routeNetworkInterfaceId :: Maybe Text
+    , routeState :: RouteState
+    , routeOrigin :: Maybe RouteOrigin
+    }
+  deriving (Show, Read, Eq)
+
+data RouteOrigin
+    = RouteOriginCreateRouteTable
+    | RouteOriginCreateRoute
+    | RouteOriginTableEnableVgwRoutePropagation
+  deriving (Show, Read, Eq)
+
+data RouteState
+    = RouteStateActive
+    | RouteStateBlackhole
+  deriving (Show, Read, Eq)
+
+data RouteTable = RouteTable
+    { routeTableId :: Text
+    , routeTableVpcId :: Text
+    , routeTableRouteSet :: [Route]
+    , routeTableAssociationSet :: [RouteTableAssociation]
+    , routeTablePropagatingVgw :: Maybe PropagatingVgw
+    , routeTableTagSet :: [ResourceTag]
+    }
+  deriving (Show, Read, Eq)
+
+data RouteTableAssociation = RouteTableAssociation
+    { routeTableAssociationId :: Text
+    , routeTableAssociationRouteTableId :: Text
+    , routeTableAssociationSubnetId :: Maybe Text
+    , routeTableAssociationMain :: Maybe Bool
+    }
+  deriving (Show, Read, Eq)
+
+deriveFromText "RouteOrigin"
+    [ "CreateRouteTable"
+    , "CreateRoute"
+    , "EnableVgwRoutePropagation"
+    ]
+
+deriveFromText "RouteState" ["active", "blackhole"]
diff --git a/AWS/EC2/Types/SecurityGroup.hs b/AWS/EC2/Types/SecurityGroup.hs
new file mode 100644
--- /dev/null
+++ b/AWS/EC2/Types/SecurityGroup.hs
@@ -0,0 +1,42 @@
+module AWS.EC2.Types.SecurityGroup
+    ( IpPermission(..)
+    , SecurityGroup(..)
+    , SecurityGroupRequest(..)
+    , UserIdGroupPair(..)
+    ) where
+
+import AWS.Lib.FromText
+import AWS.EC2.Types.Common (ResourceTag)
+
+data IpPermission = IpPermission
+    { ipPermissionIpProtocol :: Text
+    , ipPermissionFromPort :: Maybe Int
+    , ipPermissionToPort :: Maybe Int
+    , ipPermissionGroups :: [UserIdGroupPair]
+    , ipPermissionIpRanges :: [AddrRange IPv4]
+    }
+  deriving (Show, Read, Eq)
+
+data SecurityGroup = SecurityGroup
+    { securityGroupOwnerId :: Text
+    , securityGroupId :: Text
+    , securityGroupName :: Text
+    , securityGroupDescription :: Text
+    , securityGroupVpcId :: Maybe Text
+    , securityGroupIpPermissions :: [IpPermission]
+    , securityGroupIpPermissionsEgress :: [IpPermission]
+    , securityGroupTagSet :: [ResourceTag]
+    }
+  deriving (Show, Read, Eq)
+
+data SecurityGroupRequest
+    = SecurityGroupRequestGroupId Text
+    | SecurityGroupRequestGroupName Text
+  deriving (Show, Read, Eq)
+
+data UserIdGroupPair = UserIdGroupPair
+    { userIdGroupPairUserId :: Maybe Text
+    , userIdGroupPairGroupId :: Text
+    , userIdGroupPairGroupName :: Maybe Text
+    }
+  deriving (Show, Read, Eq)
diff --git a/AWS/EC2/Types/Snapshot.hs b/AWS/EC2/Types/Snapshot.hs
new file mode 100644
--- /dev/null
+++ b/AWS/EC2/Types/Snapshot.hs
@@ -0,0 +1,65 @@
+{-# LANGUAGE TemplateHaskell #-}
+
+module AWS.EC2.Types.Snapshot
+    ( CreateVolumePermission(..)
+    , CreateVolumePermissionItem(..)
+    , ResetSnapshotAttributeRequest(..)
+    , Snapshot(..)
+    , SnapshotAttribute(..)
+    , SnapshotAttributeRequest(..)
+    , SnapshotStatus(..)
+    ) where
+
+import AWS.EC2.Types.Common (ProductCode, ResourceTag)
+import AWS.Lib.FromText
+
+data CreateVolumePermission = CreateVolumePermission
+    { createVolumePermissionAdd :: [CreateVolumePermissionItem]
+    , createVolumePermissionRemove :: [CreateVolumePermissionItem]
+    }
+  deriving (Show, Read, Eq)
+
+data CreateVolumePermissionItem = CreateVolumePermissionItem
+    { createVolumePermissionItemUserId :: Maybe Text
+    , createVolumePermissionItemGroup :: Maybe Text
+    }
+  deriving (Show, Read, Eq)
+
+data ResetSnapshotAttributeRequest
+    = ResetSnapshotAttributeRequestCreateVolumePermission
+  deriving (Show, Read, Eq)
+
+data Snapshot = Snapshot
+    { snapshotId :: Text
+    , snapshotVolumeId :: Maybe Text
+    , snapshotStatus :: SnapshotStatus
+    , snapshotStartTime :: UTCTime
+    , snapshotProgress :: Maybe Text
+    , snapshotOwnerId :: Text
+    , snapshotVolumeSize :: Int
+    , snapshotDescription :: Maybe Text
+    , snapshotOwnerAlias :: Maybe Text
+    , snapshotTagSet :: [ResourceTag]
+    }
+  deriving (Show, Read, Eq)
+
+data SnapshotAttribute = SnapshotAttribute
+    { snapshotAttributeSnapshotId :: Text
+    , snapshotAttributeCreateVolumePermissionItems
+        :: [CreateVolumePermissionItem]
+    , snapshotAttributeProductCodes :: [ProductCode]
+    }
+  deriving (Show, Read, Eq)
+
+data SnapshotAttributeRequest
+    = SnapshotAttributeRequestCreateVolumePermission
+    | SnapshotAttributeRequestProductCodes
+  deriving (Show, Read, Eq)
+
+data SnapshotStatus
+    = SnapshotPending
+    | SnapshotCompleted
+    | SnapshotError
+  deriving (Show, Read, Eq)
+
+deriveFromText "SnapshotStatus" ["pending", "completed", "error"]
diff --git a/AWS/EC2/Types/Subnets.hs b/AWS/EC2/Types/Subnets.hs
new file mode 100644
--- /dev/null
+++ b/AWS/EC2/Types/Subnets.hs
@@ -0,0 +1,37 @@
+{-# LANGUAGE TemplateHaskell #-}
+
+module AWS.EC2.Types.Subnets
+    ( CreateSubnetRequest(..)
+    , Subnet(..)
+    , SubnetState
+    ) where
+
+import AWS.EC2.Types.Common (ResourceTag)
+import AWS.Lib.FromText
+
+data CreateSubnetRequest = CreateSubnetRequest
+    { createSubnetRequestVpcId :: Text
+    , createSubnetRequestCidrBlock :: AddrRange IPv4
+    , createSubnetRequestAvailabilityZone :: Maybe Text
+    }
+  deriving (Show, Read, Eq)
+
+data Subnet = Subnet
+    { subnetId :: Text
+    , subnetState :: SubnetState
+    , subnetVpicId :: Text
+    , subnetCidrBlock :: AddrRange IPv4
+    , subnetAvailableIpAddressCount :: Int
+    , subnetAvailabilityZone :: Text
+    , subnetDefaultForAz :: Maybe Bool
+    , subnetMapPublicIpOnLaunch :: Maybe Bool
+    , subnetTagSet :: [ResourceTag]
+    }
+  deriving (Show, Read, Eq)
+
+data SubnetState
+    = SubnetStatePending
+    | SubnetStateAvailable
+  deriving (Show, Read, Eq)
+
+deriveFromText "SubnetState" ["pending", "available"]
diff --git a/AWS/EC2/Types/Tag.hs b/AWS/EC2/Types/Tag.hs
new file mode 100644
--- /dev/null
+++ b/AWS/EC2/Types/Tag.hs
@@ -0,0 +1,13 @@
+module AWS.EC2.Types.Tag
+    ( Tag(..)
+    ) where
+
+import AWS.Lib.FromText
+
+data Tag = Tag
+    { tagResourceId :: Text
+    , tagResourceType :: Text
+    , tagKey :: Text
+    , tagValue :: Maybe Text
+    }
+  deriving (Show, Read, Eq)
diff --git a/AWS/EC2/Types/VPC.hs b/AWS/EC2/Types/VPC.hs
new file mode 100644
--- /dev/null
+++ b/AWS/EC2/Types/VPC.hs
@@ -0,0 +1,206 @@
+{-# LANGUAGE TemplateHaskell #-}
+
+module AWS.EC2.Types.VPC
+    ( Attachment(..)
+    , AttachmentState(..)
+    , CreateVpnGatewayType(..)
+    , CustomerGateway(..)
+    , CustomerGatewayState(..)
+    , DhcpConfiguration(..)
+    , DhcpOptions(..)
+    , DhcpValue(..)
+    , InternetGateway(..)
+    , InternetGatewayAttachment(..)
+    , InternetGatewayAttachmentState(..)
+    , Vpc(..)
+    , VpcState(..)
+    , VpnConnection(..)
+    , VpnConnectionOptionsRequest(..)
+    , VpnConnectionState(..)
+    , VpnGateway(..)
+    , VpnGatewayState(..)
+    , VpnStaticRoute(..)
+    , VpnStaticRouteSource(..)
+    , VpnStaticRouteState(..)
+    , VpnTunnelTelemetry(..)
+    ) where
+
+import AWS.EC2.Types.Common (ResourceTag)
+import AWS.Lib.FromText
+
+data Attachment = Attachment
+    { attachmentVpcId :: Text
+    , attachmentState :: AttachmentState
+    }
+  deriving (Show, Read, Eq)
+
+data AttachmentState
+    = AttachmentStateAttaching
+    | AttachmentStateAttached
+    | AttachmentStateDetaching
+    | AttachmentStateDetached
+  deriving (Show, Read, Eq)
+
+data CreateVpnGatewayType = CreateVpnGatewayTypeIpsec1
+
+data CustomerGateway = CustomerGateway
+    { customerGatewayId :: Text
+    , customerGatewayState :: CustomerGatewayState
+    , customerGatewayType :: Text
+    , customerGatewayIpAddress :: IPv4
+    , customerGatewayBgpAsn :: Int
+    , customerGatewayTagSet :: [ResourceTag]
+    }
+  deriving (Show, Read, Eq)
+
+data CustomerGatewayState
+    = CustomerGatewayStatePending
+    | CustomerGatewayStateAvailable
+    | CustomerGatewayStateDeleting
+    | CustomerGatewayStateDeleted
+  deriving (Show, Read, Eq)
+
+data DhcpOptions = DhcpOptions
+    { dhcpOptionsId :: Text
+    , dhcpOptionsDhcpConfigurationSet :: [DhcpConfiguration]
+    , dhcpOptionsTagSet :: [ResourceTag]
+    }
+  deriving (Show, Read, Eq)
+
+data DhcpConfiguration = DhcpConfiguration
+    { dhcpConfigurationKey :: Text
+    , dhcpConfigurationDhcpValueSet :: [DhcpValue]
+    }
+  deriving (Show, Read, Eq)
+
+data DhcpValue = DhcpValue
+    { dhcpValueValue :: Text
+    }
+  deriving (Show, Read, Eq)
+
+data InternetGateway = InternetGateway
+    { internetGatewayInternetGatewayId :: Text
+    , internetGatewayAttachmentSet :: [InternetGatewayAttachment]
+    , internetGatewayTagSet :: [ResourceTag]
+    }
+  deriving (Show, Read, Eq)
+
+data InternetGatewayAttachment = InternetGatewayAttachment
+    { internetGatewayAttachmentVpcId :: Text
+    , internetGatewayAttachmentState :: InternetGatewayAttachmentState
+    }
+  deriving (Show, Read, Eq)
+
+data InternetGatewayAttachmentState
+    = InternetGatewayAttachmentStateAttaching
+    | InternetGatewayAttachmentStateAttached
+    | InternetGatewayAttachmentStateDetaching
+    | InternetGatewayAttachmentStateDetached
+    | InternetGatewayAttachmentStateAvailable
+  deriving (Show, Read, Eq)
+
+data Vpc = Vpc
+    { vpcId :: Text
+    , vpcState :: VpcState
+    , vpcCidrBlock :: AddrRange IPv4
+    , vpcDhcpOptionsId :: Text
+    , vpcTagSet :: [ResourceTag]
+    , vpcInstanceTenancy :: Text
+    , vpcIsDefault :: Maybe Text
+    }
+  deriving (Show, Read, Eq)
+
+data VpcState
+    = VpcStatePending
+    | VpcStateAvailable
+  deriving (Show, Read, Eq)
+
+data VpnConnection = VpnConnection
+    { vpnConnectionId :: Text
+    , vpnConnectionState :: VpnConnectionState
+    , vpnConnectionCustomerGatewayConfiguration :: Maybe Text
+    , vpnConnectionType :: Maybe Text
+    , vpnConnectionCustomerGatewayId :: Text
+    , vpnConnectionVpnGatewayId :: Text
+    , vpnConnectionTagSet :: [ResourceTag]
+    , vpnConnectionVgwTelemetry :: [VpnTunnelTelemetry]
+    , vpnConnectionOptions :: Maybe VpnConnectionOptionsRequest
+    , vpnConnectionRoutes :: Maybe VpnStaticRoute
+    }
+  deriving (Show, Read, Eq)
+
+data VpnConnectionOptionsRequest = VpnConnectionOptionsRequest
+    { vpnConnectionOptionsRequestStaticRoutesOnly :: Bool
+    }
+  deriving (Show, Read, Eq)
+
+data VpnConnectionState
+    = VpnConnectionStatePending
+    | VpnConnectionStateAvailable
+    | VpnConnectionStateDeleting
+    | VpnConnectionStateDeleted
+  deriving (Show, Read, Eq)
+
+data VpnGateway = VpnGateway
+    { vpnGatewayId :: Text
+    , vpnGatewayState :: VpnGatewayState
+    , vpnGatewayType :: Text
+    , vpnGatewayAvailabilityZone :: Maybe Text
+    , vpnGatewayAttachments :: [Attachment]
+    , vpnGatewayTagSet :: [ResourceTag]
+    }
+  deriving (Show, Read, Eq)
+
+data VpnGatewayState
+    = VpnGatewayStatePending
+    | VpnGatewayStateAvailable
+    | VpnGatewayStateDeleting
+    | VpnGatewayStateDeleted
+  deriving (Show, Read, Eq)
+
+data VpnStaticRoute = VpnStaticRoute
+    { vpnStaticRouteDestinationCidrBlock :: Text
+    , vpnStaticRouteSource :: VpnStaticRouteSource
+    , vpnStaticRouteState :: VpnStaticRouteState
+    }
+  deriving (Show, Read, Eq)
+
+data VpnStaticRouteSource = VpnStaticRouteSourceStatic
+  deriving (Show, Read, Eq)
+
+data VpnStaticRouteState
+    = VpnStaticRouteStatePending
+    | VpnStaticRouteStateAvailable
+    | VpnStaticRouteStateDeleting
+    | VpnStaticRouteStateDeleted
+  deriving (Show, Read, Eq)
+
+data VpnTunnelTelemetry = VpnTunnelTelemetry
+    { vpnTunnelTelemetryOutsideIpAddress :: IPv4
+    , vpnTunnelTelemetryStatus :: VpnTunnelTelemetryStatus
+    , vpnTunnelTelemetryLastStatusChange :: UTCTime
+    , vpnTunnelTelemetryStatusMessage :: Text
+    , vpnTunnelTelemetryAcceptRouteCount :: Int
+    }
+  deriving (Show, Read, Eq)
+
+data VpnTunnelTelemetryStatus
+    = VpnTunnelTelemetryStatusUp
+    | VpnTunnelTelemetryStatusDown
+  deriving (Show, Read, Eq)
+
+deriveFromText "AttachmentState"
+    ["attaching", "attached", "detaching", "detached"]
+deriveFromText "CustomerGatewayState"
+    ["pending", "available", "deleting", "deleted"]
+deriveFromText "InternetGatewayAttachmentState"
+    ["attaching", "attached", "detaching", "detached", "available"]
+deriveFromText "VpcState" ["pending", "available"]
+deriveFromText "VpnConnectionState"
+    ["pending", "available", "deleting", "deleted"]
+deriveFromText "VpnGatewayState"
+    ["pending", "available", "deleting", "deleted"]
+deriveFromText "VpnStaticRouteSource" ["Static"]
+deriveFromText "VpnStaticRouteState"
+    ["pending", "available", "deleting", "deleted"]
+deriveFromText "VpnTunnelTelemetryStatus" ["UP", "DOWN"]
diff --git a/AWS/EC2/Types/Volume.hs b/AWS/EC2/Types/Volume.hs
new file mode 100644
--- /dev/null
+++ b/AWS/EC2/Types/Volume.hs
@@ -0,0 +1,147 @@
+{-# LANGUAGE TemplateHaskell #-}
+
+module AWS.EC2.Types.Volume
+    ( AttachmentSetItemResponse(..)
+    , AttachmentSetItemResponseStatus(..)
+    , CreateVolumeRequest(..)
+    , Volume(..)
+    , VolumeAttribute(..)
+    , VolumeAttributeRequest(..)
+    , VolumeState(..)
+    , VolumeStatus(..)
+    , VolumeStatusAction(..)
+    , VolumeStatusDetail(..)
+    , VolumeStatusEvent(..)
+    , VolumeStatusInfo(..)
+    , VolumeStatusInfoStatus(..)
+    , VolumeType(..)
+    ) where
+
+import AWS.EC2.Types.Common (ProductCode, ResourceTag)
+import AWS.Lib.FromText
+
+data AttachmentSetItemResponse = AttachmentSetItemResponse
+    { attachmentSetItemResponseVolumeId :: Text
+    , attachmentSetItemResponseInstanceId :: Text
+    , attachmentSetItemResponseDevice :: Text
+    , attachmentSetItemResponseStatus
+        :: AttachmentSetItemResponseStatus
+    , attachmentSetItemResponseAttachTime :: UTCTime
+    , attachmentSetItemResponseDeleteOnTermination :: Maybe Bool
+    }
+  deriving (Show, Read, Eq)
+
+data AttachmentSetItemResponseStatus
+    = AttachmentSetItemResponseStatusAttaching
+    | AttachmentSetItemResponseStatusAttached
+    | AttachmentSetItemResponseStatusDetaching
+    | AttachmentSetItemResponseStatusDetached
+  deriving (Show, Read, Eq)
+
+data CreateVolumeRequest
+    = CreateNewVolume
+        { createNewVolumeSize :: Int
+        , createNewVolumeAvailabilityZone :: Text
+        , createNewVolumeVolumeType :: Maybe VolumeType
+        }
+    | CreateFromSnapshot
+        { createFromSnapshotSnapshotId :: Text
+        , createFromSnapshotAvailabilityZone :: Text
+        , createFromSnapshotSize :: Maybe Int
+        , createFromSnapshotVolumeType :: Maybe VolumeType
+        }
+  deriving (Show, Read, Eq)
+
+data Volume = Volume
+    { volumeId :: Text
+    , volumeSize :: Int
+    , volumeSnapshotId :: Maybe Text
+    , volumeAvailabilityZone :: Text
+    , volumeStatus :: VolumeState
+    , volumeCreateTime :: UTCTime
+    , volumeAttachmentSet :: [AttachmentSetItemResponse]
+    , volumeTagSet :: [ResourceTag]
+    , volumeVolumeType :: VolumeType
+    }
+  deriving (Show, Read, Eq)
+
+data VolumeAttribute
+    = VolumeAttributeAutoEnableIO Bool
+    | VolumeAttributeProductCodes [ProductCode]
+  deriving (Show, Read, Eq)
+
+data VolumeAttributeRequest
+    = VolumeAttributeRequestAutoEnableIO
+    | VolumeAttributeRequestProductCodes
+  deriving (Show, Read, Eq)
+
+data VolumeState
+    = VolumeStateCreating
+    | VolumeStateAvailable
+    | VolumeStateInUse
+    | VolumeStateDeleting
+    | VolumeStateDeleted
+    | VolumeStateError
+  deriving (Show, Read, Eq)
+
+data VolumeStatus = VolumeStatus
+    { volumeStatusVolumeId :: Text
+    , volumeStatusAvailabilityZone :: Text
+    , volumeStatusVolumeStatus :: VolumeStatusInfo
+    , volumeStatusEventSet :: [VolumeStatusEvent]
+    , volumeStatusActionSet :: [VolumeStatusAction]
+    }
+  deriving (Show, Read, Eq)
+
+data VolumeStatusAction = VolumeStatusAction
+    { volumeStatusActionCode :: Text
+    , volumeStatusActionEventType :: Text
+    , volumeStatusActionEventId :: Text
+    , volumeStatusActionDescription :: Text
+    }
+  deriving (Show, Read, Eq)
+
+data VolumeStatusDetail = VolumeStatusDetail
+    { volumeStatusDetailName :: Text
+    , volumeStatusDetailStatus :: Text
+    }
+  deriving (Show, Read, Eq)
+
+data VolumeStatusEvent = VolumeStatusEvent
+    { volumeStatusEventType :: Text
+    , volumeStatusEventId :: Text
+    , volumeStatusEventDescription :: Text
+    , volumeStatusEventNotBefore :: Maybe UTCTime
+    , volumeStatusEventNotAfter :: Maybe UTCTime
+    }
+  deriving (Show, Read, Eq)
+
+data VolumeStatusInfo = VolumeStatusInfo
+    { volumeStatusInfoStatus :: VolumeStatusInfoStatus
+    , volumeStatusInfoDetails :: [VolumeStatusDetail]
+    }
+  deriving (Show, Read, Eq)
+
+data VolumeStatusInfoStatus
+    = VolumeStatusInfoStatusOK
+    | VolumeStatusInfoStatusImpaired
+    | VolumeStatusInfoStatusInsufficientData
+  deriving (Show, Read, Eq)
+
+data VolumeType
+    = VolumeTypeStandard
+    | VolumeTypeIO1 Int
+  deriving (Show, Read, Eq)
+
+deriveFromText "AttachmentSetItemResponseStatus"
+    ["attaching", "attached", "detaching", "detached"]
+deriveFromText "VolumeState"
+    [ "creating"
+    , "available"
+    , "in-use"
+    , "deleting"
+    , "deleted"
+    , "error"
+    ]
+deriveFromText "VolumeStatusInfoStatus"
+    ["ok", "impaired", "insufficient-data"]
diff --git a/AWS/ELB/LoadBalancer.hs b/AWS/ELB/LoadBalancer.hs
--- a/AWS/ELB/LoadBalancer.hs
+++ b/AWS/ELB/LoadBalancer.hs
@@ -1,9 +1,17 @@
-{-# LANGUAGE FlexibleContexts, RankNTypes #-}
+{-# LANGUAGE FlexibleContexts, RankNTypes, RecordWildCards #-}
 
 module AWS.ELB.LoadBalancer
     ( describeLoadBalancers
     , createLoadBalancer
     , deleteLoadBalancer
+    , attachLoadBalancerToSubnets
+    , detachLoadBalancerFromSubnets
+    , applySecurityGroupsToLoadBalancer
+    , registerInstancesWithLoadBalancer
+    , deregisterInstancesFromLoadBalancer
+    , setLoadBalancerListenerSSLCertificate
+    , createLoadBalancerListeners
+    , deleteLoadBalancerListeners
     ) where
 
 import Data.Text (Text)
@@ -61,8 +69,7 @@
             <*> getT "InstancePort"
             )
         )
-    <*> members "Instances"
-        (Instance <$> getT "InstanceId")
+    <*> members "Instances" sinkInstance
     <*> element "Policies"
         (Policies
         <$> members "AppCookieStickinessPolicies"
@@ -94,6 +101,9 @@
         )
     <*> members "Subnets" text
 
+sinkInstance :: MonadThrow m => GLSink Event m Instance
+sinkInstance = Instance <$> getT "InstanceId"
+
 createLoadBalancer
     :: (MonadBaseControl IO m, MonadResource m)
     => Text -- ^ LoadBalancerName
@@ -131,3 +141,121 @@
     getT_ "DeleteLoadBalancerResult"
   where
     params = ["LoadBalancerName" |= name]
+
+attachLoadBalancerToSubnets
+    :: (MonadBaseControl IO m, MonadResource m)
+    => Text -- ^ The name associated with the LoadBalancer.
+    -> [Text] -- ^ A list of subnet IDs to add for the LoadBalancer.
+    -> ELB m [Text] -- ^ A list of subnet IDs added for the LoadBalancer.
+attachLoadBalancerToSubnets name subnets =
+    elbQuery "AttachLoadBalancerToSubnets" params $ members "Subnets" text
+  where
+    params =
+        [ "LoadBalancerName" |= name
+        , "Subnets.member" |.#= subnets
+        ]
+
+detachLoadBalancerFromSubnets
+    :: (MonadBaseControl IO m, MonadResource m)
+    => Text -- ^ The name associated with the LoadBalancer to be detached.
+    -> [Text] -- ^ A list of subnet IDs to remove from the set of configured subnets for the LoadBalancer.
+    -> ELB m [Text] -- ^ A list of subnet IDs removed from the configured set of subnets for the LoadBalancer.
+detachLoadBalancerFromSubnets name subnets =
+    elbQuery "DetachLoadBalancerFromSubnets" params $ members "Subnets" text
+  where
+    params =
+        [ "LoadBalancerName" |= name
+        , "Subnets.member" |.#= subnets
+        ]
+
+applySecurityGroupsToLoadBalancer
+    :: (MonadBaseControl IO m, MonadResource m)
+    => Text -- ^ The name associated with the LoadBalancer.
+    -> [Text] -- ^ A list of security group IDs to associate with your LoadBalancer in VPC.
+    -> ELB m [Text] -- ^ A list of security group IDs associated with your LoadBalancer.
+applySecurityGroupsToLoadBalancer name sgs =
+    elbQuery "ApplySecurityGroupsToLoadBalancer" params $ members "SecurityGroups" text
+  where
+    params =
+        [ "LoadBalancerName" |= name
+        , "SecurityGroups.member" |.#= sgs
+        ]
+
+registerInstancesWithLoadBalancer
+    :: (MonadBaseControl IO m, MonadResource m)
+    => [Text] -- ^ A list of instance IDs that should be registered with the LoadBalancer.
+    -> Text -- ^ The name associated with the LoadBalancer.
+    -> ELB m [Instance]
+registerInstancesWithLoadBalancer insts name =
+    elbQuery "RegisterInstancesWithLoadBalancer" params $ members "Instances" sinkInstance
+  where
+    params =
+        [ "Instances.member" |.#. map toInstanceParam insts
+        , "LoadBalancerName" |= name
+        ]
+
+toInstanceParam :: Text -> [QueryParam]
+toInstanceParam inst = ["InstanceId" |= inst ]
+
+deregisterInstancesFromLoadBalancer
+    :: (MonadBaseControl IO m, MonadResource m)
+    => [Text] -- ^ A list of EC2 instance IDs consisting of all instances to be deregistered.
+    -> Text -- ^ A list of EC2 instance IDs consisting of all instances to be deregistered.
+    -> ELB m [Instance]
+deregisterInstancesFromLoadBalancer insts name =
+    elbQuery "DeregisterInstancesFromLoadBalancer" params $ members "Instances" sinkInstance
+  where
+    params =
+        [ "Instances.member" |.#. map toInstanceParam insts
+        , "LoadBalancerName" |= name
+        ]
+
+setLoadBalancerListenerSSLCertificate
+    :: (MonadBaseControl IO m, MonadResource m)
+    => Text -- ^ The name of the the LoadBalancer.
+    -> Int -- ^ The port that uses the specified SSL certificate.
+    -> Text -- ^ The ID of the SSL certificate chain to use.
+    -> ELB m ()
+setLoadBalancerListenerSSLCertificate lb port cert =
+    elbQuery "SetLoadBalancerListenerSSLCertificate" params $ getT_ "SetLoadBalancerListenerSSLCertificateResult"
+  where
+    params =
+        [ "LoadBalancerName" |= lb
+        , "LoadBalancerPort" |= toText port
+        , "SSLCertificateId" |= cert
+        ]
+
+createLoadBalancerListeners
+    :: (MonadBaseControl IO m, MonadResource m)
+    => [Listener] -- ^ A list of Listeners
+    -> Text -- ^ The name of the LoadBalancer.
+    -> ELB m ()
+createLoadBalancerListeners listeners lb =
+    elbQuery "CreateLoadBalancerListeners" params $ getT_ "CreateLoadBalancerListenersResult"
+  where
+    params =
+        [ "Listeners.member" |.#. map toListenerParam listeners
+        , "LoadBalancerName" |= lb
+        ]
+
+toListenerParam :: Listener -> [QueryParam]
+toListenerParam Listener{..} =
+    [ "Protocol" |= listenerProtocol
+    , "LoadBalancerPort" |= toText listenerLoadBalancerPort
+    , "InstanceProtocol" |= listenerInstanceProtocol
+    , "SSLCertificateId" |=? listenerSSLCertificateId
+    , "InstancePort" |= toText listenerInstancePort
+    ]
+
+deleteLoadBalancerListeners
+    :: (MonadBaseControl IO m, MonadResource m)
+    => Text -- ^ The mnemonic name associated with the LoadBalancer.
+    -> [Int] -- ^ The client port number(s) of the LoadBalancerListener(s) to be removed.
+    -> ELB m ()
+deleteLoadBalancerListeners lb ports =
+    elbQuery "DeleteLoadBalancerListeners" params $ getT_ "DeleteLoadBalancerListenersResult"
+  where
+    params =
+        [ "LoadBalancerName" |= lb
+        , "LoadBalancerPorts.member" |.#= map toText ports
+        ]
diff --git a/AWS/ELB/Types.hs b/AWS/ELB/Types.hs
--- a/AWS/ELB/Types.hs
+++ b/AWS/ELB/Types.hs
@@ -1,8 +1,7 @@
 module AWS.ELB.Types
     where
 
-import Data.Text (Text)
-import Data.Time (UTCTime)
+import AWS.Lib.FromText
 
 data LoadBalancer = LoadBalancer
     { loadBalancerSecurityGroups :: [Text]
diff --git a/AWS/Lib/FromText.hs b/AWS/Lib/FromText.hs
--- a/AWS/Lib/FromText.hs
+++ b/AWS/Lib/FromText.hs
@@ -1,7 +1,16 @@
 {-# LANGUAGE RankNTypes, OverloadedStrings, TemplateHaskell, FlexibleInstances #-}
 
 module AWS.Lib.FromText
-    where
+    ( FromText(..)
+    , deriveFromText
+    -- re-exports
+    , monadThrow
+    , IPv4
+    , AddrRange
+    , Text
+    , UTCTime
+    , AWSException(..)
+    ) where
 
 import Control.Applicative ((<$>))
 import Control.Monad
diff --git a/AWS/Lib/Parser.hs b/AWS/Lib/Parser.hs
--- a/AWS/Lib/Parser.hs
+++ b/AWS/Lib/Parser.hs
@@ -21,7 +21,6 @@
     ) where
 
 import Data.XML.Types (Event(..), Name(..))
-import Data.Text (Text)
 import Data.ByteString (ByteString)
 import Data.Conduit
 import qualified Data.Conduit.List as CL
diff --git a/AWS/RDS.hs b/AWS/RDS.hs
--- a/AWS/RDS.hs
+++ b/AWS/RDS.hs
@@ -9,6 +9,8 @@
     , module AWS.RDS.DBInstance
       -- * DBSnapshot
     , module AWS.RDS.DBSnapshot
+      -- * Event
+    , module AWS.RDS.Event
     ) where
 
 import Data.Text (Text)
@@ -25,6 +27,7 @@
 import AWS.RDS.Internal
 import AWS.RDS.DBInstance
 import AWS.RDS.DBSnapshot
+import AWS.RDS.Event
 
 initialRDSContext :: HTTP.Manager -> AWSContext
 initialRDSContext mgr = AWSContext
diff --git a/AWS/RDS/DBInstance.hs b/AWS/RDS/DBInstance.hs
--- a/AWS/RDS/DBInstance.hs
+++ b/AWS/RDS/DBInstance.hs
@@ -14,7 +14,7 @@
 import AWS.Lib.Query
 import AWS.Lib.Parser
 
-import AWS.RDS.Types
+import AWS.RDS.Types hiding (Event)
 import AWS.RDS.Internal
 
 describeDBInstances
@@ -39,8 +39,13 @@
     DBInstance
     <$> getT "Iops"
     <*> getT "BackupRetentionPeriod"
-    <*> getT "MultiAZ"
     <*> getT "DBInstanceStatus"
+    <*> getT "MultiAZ"
+    <*> elements' "VpcSecurityGroups" "VpcSecurityGroupMembership"
+        (VpcSecurityGroupMembership
+        <$> getT "Status"
+        <*> getT "VpcSecurityGroupId"
+        )
     <*> getT "DBInstanceIdentifier"
     <*> getT "PreferredBackupWindow"
     <*> getT "PreferredMaintenanceWindow"
@@ -85,13 +90,14 @@
         )
     <*> getT "EngineVersion"
     <*> getT "ReadReplicaSourceDBInstanceIdentifier"
+    <*> getT "PubliclyAccessible"
     <*> elements "DBSecurityGroup"
         (DBSecurityGroupMembership
         <$> getT "Status"
         <*> getT "DBSecurityGroupName"
         )
-    <*> getT "DBName"
     <*> getT "AutoMinorVersionUpgrade"
+    <*> getT "DBName"
     <*> getT "InstanceCreateTime"
     <*> getT "AllocatedStorage"
     <*> getT "DBInstanceClass"
diff --git a/AWS/RDS/DBSnapshot.hs b/AWS/RDS/DBSnapshot.hs
--- a/AWS/RDS/DBSnapshot.hs
+++ b/AWS/RDS/DBSnapshot.hs
@@ -15,7 +15,7 @@
 import AWS.Lib.Query
 import AWS.Lib.Parser
 
-import AWS.RDS.Types
+import AWS.RDS.Types hiding (Event)
 import AWS.RDS.Internal
 
 describeDBSnapshots
diff --git a/AWS/RDS/Event.hs b/AWS/RDS/Event.hs
new file mode 100644
--- /dev/null
+++ b/AWS/RDS/Event.hs
@@ -0,0 +1,58 @@
+{-# LANGUAGE FlexibleContexts #-}
+module AWS.RDS.Event
+    ( describeEvents
+    ) where
+
+import Control.Applicative ((<$>), (<*>))
+import Data.Conduit
+import Data.Text (Text)
+import Data.Time (UTCTime)
+import qualified Data.XML.Types as XML
+
+import AWS.Lib.Parser
+import AWS.Lib.Query
+import AWS.RDS.Internal
+import AWS.RDS.Types
+import AWS.Util (toText)
+
+describeEvents
+    :: (MonadBaseControl IO m, MonadResource m)
+    => Maybe Text -- ^ SourceIdentifier
+    -> Maybe SourceType -- ^ SourceType
+    -> Maybe Int -- ^ Duration
+    -> Maybe UTCTime -- ^ StartTime
+    -> Maybe UTCTime -- ^ EndTime
+    -> [Text] -- ^ EventCategories.member
+    -> Maybe Text -- ^ Marker
+    -> Maybe Int -- ^ MaxRecords
+    -> RDS m [Event]
+describeEvents sid stype d start end categories marker maxRecords =
+    rdsQuery "DescribeEvents" params $
+        elements "Event" eventSink
+  where
+    params =
+        [ "SourceIdentifier" |=? sid
+        , "SourceType" |=? sourceTypeToText <$> stype
+        , "Duration" |=? toText <$> d
+        , "StartTime" |=? toText <$> start
+        , "EndTime" |=? toText <$> end
+        , "EventCategories" |.+ "member" |.#= categories
+        , "Marker" |=? marker
+        , "MaxRecords" |=? toText <$> maxRecords
+        ]
+
+sourceTypeToText :: SourceType -> Text
+sourceTypeToText SourceTypeDBInstance = "db-instance"
+sourceTypeToText SourceTypeDBParameterGroup = "db-parameter-group"
+sourceTypeToText SourceTypeDBSecurityGroup = "db-security-group"
+sourceTypeToText SourceTypeDBSnapshot = "db-snapshot"
+
+eventSink
+    :: MonadThrow m
+    => GLSink XML.Event m Event
+eventSink = Event
+    <$> getT "Message"
+    <*> getT "SourceType"
+    <*> listConsumer "EventCategories" (getT "EventCategory")
+    <*> getT "Date"
+    <*> getT "SourceIdentifier"
diff --git a/AWS/RDS/Internal.hs b/AWS/RDS/Internal.hs
--- a/AWS/RDS/Internal.hs
+++ b/AWS/RDS/Internal.hs
@@ -13,16 +13,8 @@
 import AWS.Lib.Query
 import AWS.Lib.Parser
 
-#ifdef DEBUG
-import Control.Monad.IO.Class (liftIO)
-import qualified Control.Monad.Reader as Reader
-import qualified Control.Monad.State as State
-import Control.Monad.Trans.Class (lift)
-import qualified Data.Conduit.Binary as CB
-#endif
-
 apiVersion :: ByteString
-apiVersion = "2012-09-17"
+apiVersion = "2013-01-10"
 
 type RDS m a = AWS AWSContext m a
 
@@ -38,20 +30,20 @@
     => Text
     -> GLSink Event m a
     -> GLSink Event m [a]
-elements name f = element (name <> "s") $ listConsumer name f
+elements name = elements' (name <> "s") name
 
+elements' :: MonadThrow m
+    => Text
+    -> Text
+    -> GLSink Event m a
+    -> GLSink Event m [a]
+elements' setName itemName = element setName . listConsumer itemName
+
 #ifdef DEBUG
 rdsQueryDebug
     :: (MonadResource m, MonadBaseControl IO m)
     => ByteString
     -> [QueryParam]
     -> RDS m a
-rdsQueryDebug action params = do
-    cred <- Reader.ask
-    ctx <- State.get
-    lift $ do
-        liftIO $ mapM_ putStrLn $ showUnitParams params
-        response <- requestQuery cred ctx action params apiVersion sinkError
-        (res, _) <- unwrapResumable response
-        res $$ CB.sinkFile "debug.txt" >>= fail "debug"
+rdsQueryDebug = debugQuery apiVersion
 #endif
diff --git a/AWS/RDS/Types.hs b/AWS/RDS/Types.hs
--- a/AWS/RDS/Types.hs
+++ b/AWS/RDS/Types.hs
@@ -1,14 +1,15 @@
+{-# LANGUAGE TemplateHaskell #-}
 module AWS.RDS.Types
     where
 
-import Data.Text (Text)
-import Data.Time (UTCTime)
+import AWS.Lib.FromText
 
 data DBInstance = DBInstance
     { dbiIops :: Maybe Int
     , dbiBackupRetentionPeriod :: Int
-    , dbiMultiAZ :: Bool
     , dbiDBInstanceStatus :: Text
+    , dbiMultiAZ :: Bool
+    , dbiVpcSecurityGroups :: [VpcSecurityGroupMembership]
     , dbiDBInstanceIdentifier :: Text
     , dbiPreferredBackupWindow :: Text
     , dbiPreferredMaintenanceWindow :: Text
@@ -25,9 +26,10 @@
     , dbiEndpoint :: Maybe Endpoint
     , dbiEngineVersion :: Text
     , dbiReadReplicaSourceDBInstanceIdentifier :: Maybe Text
+    , dbiPubliclyAccessible :: Bool
     , dbiSecurityGroups :: [DBSecurityGroupMembership]
-    , dbiDBName :: Maybe Text
     , dbiAutoMinorVersionUpgrade :: Bool
+    , dbiDBName :: Maybe Text
     , dbiInstanceCreateTime :: Maybe UTCTime
     , dbiAllocatedStorage :: Int -- ^ storage size in gigabytes
     , dbiDBInstanceClass :: Text
@@ -35,6 +37,12 @@
     }
   deriving (Show, Eq)
 
+data VpcSecurityGroupMembership = VpcSecurityGroupMembership
+    { vpcSecurityGroupMembershipStatus :: Text
+    , vpcSecurityGroupMembershipVpcSecurityGroupId :: Text
+    }
+  deriving (Show, Eq)
+
 data DBParameterGroupStatus = DBParameterGroupStatus
     { dbpgsParameterApplyStatus :: Text
     , dbpgsDBParameterGroupName :: Text
@@ -110,3 +118,21 @@
     , dbsMasterUsername :: Text
     }
   deriving (Show, Eq)
+
+data Event = Event
+    { eventMessage :: Text
+    , eventSourceType :: SourceType
+    , eventEventCategories :: [Text]
+    , eventDate :: UTCTime
+    , eventSourceIdentifier :: Text
+    }
+  deriving (Show, Eq)
+
+data SourceType
+    = SourceTypeDBInstance
+    | SourceTypeDBParameterGroup
+    | SourceTypeDBSecurityGroup
+    | SourceTypeDBSnapshot
+  deriving (Show, Read, Eq)
+
+deriveFromText "SourceType" ["db-instance", "db-parameter-group", "db-security-group", "db-snapshot"]
diff --git a/Tests/Main.hs b/Tests/Main.hs
--- a/Tests/Main.hs
+++ b/Tests/Main.hs
@@ -29,10 +29,12 @@
     runNetworkInterfaceTests
     runNetworkInterfaceAttributeTests
     runPlacementGroupTests
+    runConversionTaskTests
 
     -- RDS Tests
     runDBInstanceTests
     runDBSnapshotTests
+    runEventTests
 
     -- ELB Tests
     runLoadBalancerTests
diff --git a/aws-sdk.cabal b/aws-sdk.cabal
--- a/aws-sdk.cabal
+++ b/aws-sdk.cabal
@@ -1,5 +1,5 @@
 name:                aws-sdk
-version:             0.9.2.1
+version:             0.9.3.0
 synopsis:            AWS SDK for Haskell
 description: AWS (Amazon Web Services) sdk for Haskell.
              .
@@ -36,6 +36,7 @@
                    , AWS.EC2.Internal
                    , AWS.EC2.Address
                    , AWS.EC2.AvailabilityZone
+                   , AWS.EC2.ConversionTask
                    , AWS.EC2.Image
                    , AWS.EC2.Instance
                    , AWS.EC2.Volume
@@ -54,12 +55,32 @@
                    , AWS.EC2.Tag
                    , AWS.EC2.Params
                    , AWS.EC2.PlacementGroup
+                   , AWS.EC2.Types.Acl
+                   , AWS.EC2.Types.Address
+                   , AWS.EC2.Types.AvailabilityZone
+                   , AWS.EC2.Types.ConversionTask
+                   , AWS.EC2.Types.Common
+                   , AWS.EC2.Types.Image
+                   , AWS.EC2.Types.Instance
+                   , AWS.EC2.Types.KeyPair
+                   , AWS.EC2.Types.NetworkInterface
+                   , AWS.EC2.Types.PlacementGroup
+                   , AWS.EC2.Types.Region
+                   , AWS.EC2.Types.Route
+                   , AWS.EC2.Types.RouteTable
+                   , AWS.EC2.Types.SecurityGroup
+                   , AWS.EC2.Types.Snapshot
+                   , AWS.EC2.Types.Subnets
+                   , AWS.EC2.Types.Tag
+                   , AWS.EC2.Types.VPC
+                   , AWS.EC2.Types.Volume
                    , AWS.Lib.FromText
                    , AWS.Lib.Parser
                    , AWS.Lib.Query
                    , AWS.RDS.Internal
                    , AWS.RDS.DBInstance
                    , AWS.RDS.DBSnapshot
+                   , AWS.RDS.Event
                    , AWS.ELB.Internal
                    , AWS.ELB.LoadBalancer
                    , AWS.CloudWatch.Internal
