diff --git a/aws-ec2.cabal b/aws-ec2.cabal
--- a/aws-ec2.cabal
+++ b/aws-ec2.cabal
@@ -1,5 +1,5 @@
 name:                aws-ec2
-version:             0.2.2
+version:             0.3
 synopsis:            AWS EC2/VPC, ELB and CloudWatch client library for Haskell
 license-file:        LICENSE
 license:             BSD3
@@ -12,10 +12,12 @@
 homepage:            https://github.com/zalora/aws-ec2
 description:         AWS client library with focus on infrastructure services like EC2 (with VPC), ELB and CloudWatch, extension to <https://github.com/aristidb/aws>.
 
+extra-source-files:  include/config.h
+
 source-repository this
   type: git
   location: https://github.com/zalora/aws-ec2.git
-  tag: 0.2.2
+  tag: 0.3
 
 source-repository head
   type: git
@@ -66,6 +68,9 @@
     , Aws.Ec2.Commands.ImportKeyPair
     , Aws.Ec2.Commands.ModifyVpcAttribute
     , Aws.Ec2.Commands.RunInstances
+    , Aws.Ec2.Commands.StartInstances
+    , Aws.Ec2.Commands.StopInstances
+    , Aws.Ec2.Commands.TerminateInstances
 
     , Aws.Elb
     , Aws.Elb.Core
@@ -79,6 +84,7 @@
     , Aws.Elb.Commands.ModifyLoadBalancerAttributes
     , Aws.Elb.Commands.RegisterInstancesWithLoadBalancer
     , Aws.Elb.Commands.DeregisterInstancesFromLoadBalancer
+    , Aws.Elb.Commands.CreateAppCookieStickinessPolicy
     , Aws.Elb.Commands.CreateLBCookieStickinessPolicy
     , Aws.Elb.Commands.SetLoadBalancerPoliciesOfListener
     , Aws.Elb.Commands.ConfigureHealthCheck
@@ -107,11 +113,12 @@
     , http-conduit
     , conduit-extra
     , xml-conduit
-    , aws >= 0.9.3
+    , aws >= 0.9.4
 
   hs-source-dirs:      src
   default-language:    Haskell2010
-  default-extensions:  OverloadedStrings, TemplateHaskell
+  default-extensions:  OverloadedStrings, TemplateHaskell, CPP
+  cpp-options:         --include=include/config.h
 
 executable put-metric
   main-is: put-metric.hs
@@ -120,9 +127,30 @@
     , bytestring
     , text
     , optparse-applicative
-    , aws >= 0.9.3
+    , aws >= 0.9.4
     , aws-ec2
 
   hs-source-dirs:      cmd
   default-language:    Haskell2010
   default-extensions:  OverloadedStrings
+  ghc-options:         -static
+
+executable run-inst
+  main-is: run-inst.hs
+  build-depends:
+      base
+    , bytestring
+    , text
+    , optparse-applicative
+    , aws >= 0.9.4
+    , aws-ec2
+    , yaml
+    , vector
+    , containers
+    , unordered-containers
+    , aeson
+
+  hs-source-dirs:      cmd
+  default-language:    Haskell2010
+  default-extensions:  OverloadedStrings
+  ghc-options:         -static
diff --git a/cmd/run-inst.hs b/cmd/run-inst.hs
new file mode 100644
--- /dev/null
+++ b/cmd/run-inst.hs
@@ -0,0 +1,153 @@
+{-# LANGUAGE FlexibleContexts, TypeFamilies  #-}
+{-# LANGUAGE OverlappingInstances  #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+
+module Main where
+
+import Control.Monad
+import Options.Applicative
+
+import qualified Data.ByteString.Char8 as B
+import qualified Data.Text as T
+
+import Aws
+import Aws.Query hiding (optional)
+import Aws (Configuration(..), LogLevel(..), defaultLog)
+import Aws.Ec2
+import qualified Data.Yaml as Y
+import qualified Data.HashMap.Strict as M
+import qualified Data.Vector as V
+import Data.Aeson
+
+configuration :: Bool -> IO Configuration
+configuration useMetadata = do
+    cr <- load
+    case cr of
+      Nothing -> error "could not locate aws credentials"
+      Just cr' -> return Configuration { timeInfo = Timestamp
+                                       , credentials = cr'
+                                       , logger = defaultLog Warning
+                                       }
+  where
+    load = if useMetadata then loadCredentialsFromInstanceMetadata
+                          else loadCredentialsDefault
+
+runInst :: String -> String -> String -> Maybe String -> Bool -> Bool -> IO ()
+runInst region imageid instType subnetId publicIp useMetadata = do
+    cfg <- configuration useMetadata
+    val <- Aws.simpleAws cfg (QueryAPIConfiguration $ B.pack region) $
+      RunInstances
+        (T.pack imageid)
+        (1,1)
+        (T.pack instType)
+        []
+        []
+        (T.pack <$> subnetId)
+        False
+        False
+        (Just Stop)
+        False
+        Nothing
+        Nothing
+        Nothing
+        Nothing
+        Nothing
+        Nothing
+        Nothing
+        publicIp
+    B.putStr $ Y.encode val
+    return ()
+
+listInst :: String -> Bool -> IO ()
+listInst region useMetadata = do
+    cfg <- configuration useMetadata
+    inst <- Aws.simpleAws cfg (QueryAPIConfiguration $ B.pack region) $ DescribeInstances []
+    B.putStr $ Y.encode inst
+    return ()
+
+listImg :: String -> Bool -> IO ()
+listImg region useMetadata = do
+    cfg <- configuration useMetadata
+    imageSet <- Aws.simpleAws cfg (QueryAPIConfiguration $ B.pack region) $ DescribeImages []
+    B.putStr $ Y.encode imageSet
+    return ()
+
+listStatus :: String -> String -> Bool -> IO ()
+listStatus region instanceid useMetadata = do
+    cfg <- configuration useMetadata
+    imageSet <- Aws.simpleAws cfg (QueryAPIConfiguration $ B.pack region) $ DescribeInstanceStatus [T.pack instanceid]
+    B.putStr $ Y.encode imageSet
+    return ()
+
+
+termInst :: String -> String -> Bool -> IO ()
+termInst region instanceid useMetadata = do
+    cfg <- configuration useMetadata
+    imageSet <- Aws.simpleAws cfg (QueryAPIConfiguration $ B.pack region) $ TerminateInstances [T.pack instanceid]
+    B.putStr $ Y.encode imageSet
+    return ()
+
+startInst :: String -> String -> Bool -> IO ()
+startInst region instanceid useMetadata = do
+    cfg <- configuration useMetadata
+    imageSet <- Aws.simpleAws cfg (QueryAPIConfiguration $ B.pack region) $ StartInstances [T.pack instanceid]
+    B.putStr $ Y.encode imageSet
+    return ()
+
+stopInst :: String -> String -> Bool -> IO ()
+stopInst region instanceid useMetadata = do
+    cfg <- configuration useMetadata
+    imageSet <- Aws.simpleAws cfg (QueryAPIConfiguration $ B.pack region) $ StopInstances [T.pack instanceid]
+    B.putStr $ Y.encode imageSet
+    return ()
+
+main = join $ customExecParser prefs opts
+  where
+    prefs = ParserPrefs { prefMultiSuffix = ""
+                        , prefDisambiguate = True
+                        , prefShowHelpOnError = True
+                        , prefBacktrack = True
+                        , prefColumns = 80
+                        }
+
+    opts = parser `info` header "AWS Ec2 client"
+
+    parser = subparser (command "runInst" (argsRunInst runInst `info` progDesc "run instance")
+                        <> command "lsInst" (argsListInst listInst `info` progDesc "list all instance")
+                        <> command "lsImg" (argsListImg listImg `info` progDesc "list all image")
+                        <> command "lsStatus" (argsListStatus listStatus `info` progDesc "list status")
+                        <> command "term" (argsInst termInst `info` progDesc "terminate instance")
+                        <> command "start" (argsInst startInst `info` progDesc "start instance")
+                        <> command "stop" (argsInst stopInst `info` progDesc "stop instance")
+                        )
+
+    argsRunInst comm = comm <$> argument str (metavar "<region>")
+                       <*> argument str (metavar "<imageid>")
+                       <*> argument str (metavar "<insttype>")
+                       <*> optional (strOption (short 'n' <>
+                                                long "subnetid" <>
+                                                help "Use subnetId"))
+                       <*> switch (short 'p' <>
+                                   long "public" <>
+                                   help "Use public-ip with subnetId")
+                       <*> switch (short 'm' <>
+                                   long "metadata" <>
+                                   help "Use instance metadata to get authentication info")
+    argsListInst comm = comm <$> argument str (metavar "<region>")
+                       <*> switch (short 'm' <>
+                                   long "metadata" <>
+                                   help "Use instance metadata to get authentication info")
+    argsListImg comm = comm <$> argument str (metavar "<region>")
+                       <*> switch (short 'm' <>
+                                   long "metadata" <>
+                                   help "Use instance metadata to get authentication info")
+    argsListStatus comm = comm <$> argument str (metavar "<region>")
+                          <*> argument str (metavar "<instanceId>")
+                          <*> switch (short 'm' <>
+                                      long "metadata" <>
+                                      help "Use instance metadata to get authentication info")
+    argsInst comm = comm <$> argument str (metavar "<region>")
+                    <*> argument str (metavar "<instanceId>")
+                    <*> switch (short 'm' <>
+                                long "metadata" <>
+                                help "Use instance metadata to get authentication info")
diff --git a/include/config.h b/include/config.h
new file mode 100644
--- /dev/null
+++ b/include/config.h
@@ -0,0 +1,70 @@
+#if __GLASGOW_HASKELL__ >= 780
+#define USE_TH 1
+#else
+#undef USE_TH
+#endif
+
+#ifdef USE_TH
+#define QUERYVALUETRANSACTION(Name,Response) queryValueTransaction ''Name Response
+#define EC2VALUETRANSACTIONDEF(Name,NameStr,Tag,FilterKey) ec2ValueTransactionDef ''Name 'Name Tag FilterKey 
+#define EC2VALUETRANSACTION(Name,Response) ec2ValueTransaction ''Name Response
+#define ELBVALUETRANSACTIONDEF(Name,NameStr,Tag,FilterKey) elbValueTransactionDef ''Name 'Name Tag FilterKey 
+#define ELBVALUETRANSACTION(Name,Response) elbValueTransaction ''Name Response
+
+#else
+#define QUERYVALUETRANSACTION(Name,Response) \
+instance ResponseConsumer Name Value where { \
+  type ResponseMetadata Value = QueryMetadata; \
+  responseConsumer _v \
+    = (queryResponseConsumer \
+       $ (valueConsumer Response id)) }; \
+instance Transaction Name Value
+
+#define EC2VALUETRANSACTIONDEF(Name,NameStr,Tag,FilterKey) \
+instance SignQuery Name where { \
+  type ServiceConfiguration Name = QueryAPIConfiguration; \
+  signQuery (Name arg_arQu) \
+    = (ec2SignQuery \
+       $ ([("Action", qArg NameStr), defVersion] \
+          +++ (enumerate FilterKey arg_arQu qArg))) }; \
+instance ResponseConsumer Name Value where { \
+  type ResponseMetadata Value = QueryMetadata ; \
+  responseConsumer _v \
+    = (queryResponseConsumer \
+       $ (valueConsumerOpt \
+            (XMLValueOptions "item") Tag id)) } ;\
+instance Transaction Name Value
+
+#define EC2VALUETRANSACTION(Name,Response) \
+instance ResponseConsumer Name Value where { \
+  type ResponseMetadata Value = QueryMetadata ; \
+  responseConsumer _v \
+    = (queryResponseConsumer \
+       $ (valueConsumer (Response) id)) } ; \
+instance Transaction Name Value
+
+#define ELBVALUETRANSACTIONDEF(Name,NameStr,Tag,FilterKey) \
+instance SignQuery Name where { \
+  type ServiceConfiguration Name = QueryAPIConfiguration ; \
+  signQuery (Name arg_aHEZ) \
+    = (elbSignQuery \
+       $ ([("Action", qArg NameStr), defVersion] \
+          +++ (enumerate FilterKey arg_aHEZ qArg))) }; \
+instance ResponseConsumer Name Value where { \
+  type ResponseMetadata Value = QueryMetadata ; \
+  responseConsumer _ \
+    = (queryResponseConsumer \
+       $ (valueConsumerOpt \
+            (XMLValueOptions "member") Tag id)) }; \
+instance Transaction Name Value
+
+#define ELBVALUETRANSACTION(Name,Response) \
+instance ResponseConsumer Name Value where { \
+  type ResponseMetadata Value = QueryMetadata ; \
+  responseConsumer _v \
+    = (queryResponseConsumer \
+       $ (valueConsumerOpt \
+            (XMLValueOptions "member") Response id)) }; \
+instance Transaction Name Value
+
+#endif
diff --git a/src/Aws/CloudWatch/Commands/PutMetricData.hs b/src/Aws/CloudWatch/Commands/PutMetricData.hs
--- a/src/Aws/CloudWatch/Commands/PutMetricData.hs
+++ b/src/Aws/CloudWatch/Commands/PutMetricData.hs
@@ -67,4 +67,4 @@
                                                            , ("Namespace", qArg namespace)
                                                            ] +++ enumerateMetrics xs
 
-queryValueTransaction ''PutMetricData "PutMetricDataResponse"
+QUERYVALUETRANSACTION(PutMetricData,"PutMetricDataResponse")
diff --git a/src/Aws/Ec2.hs b/src/Aws/Ec2.hs
--- a/src/Aws/Ec2.hs
+++ b/src/Aws/Ec2.hs
@@ -20,6 +20,9 @@
 , module Aws.Ec2.Commands.DescribeInstances
 , module Aws.Ec2.Commands.DescribeInstanceStatus
 , module Aws.Ec2.Commands.RunInstances
+, module Aws.Ec2.Commands.StartInstances
+, module Aws.Ec2.Commands.StopInstances
+, module Aws.Ec2.Commands.TerminateInstances
 , module Aws.Ec2.Commands.GetConsoleOutput
 
 , module Aws.Ec2.Commands.DescribeVpcs
@@ -60,6 +63,9 @@
 import Aws.Ec2.Commands.DescribeInstances
 import Aws.Ec2.Commands.DescribeInstanceStatus
 import Aws.Ec2.Commands.RunInstances
+import Aws.Ec2.Commands.StartInstances
+import Aws.Ec2.Commands.StopInstances
+import Aws.Ec2.Commands.TerminateInstances
 import Aws.Ec2.Commands.GetConsoleOutput
 
 import Aws.Ec2.Commands.DescribeVpcs
diff --git a/src/Aws/Ec2/Commands/AttachInternetGateway.hs b/src/Aws/Ec2/Commands/AttachInternetGateway.hs
--- a/src/Aws/Ec2/Commands/AttachInternetGateway.hs
+++ b/src/Aws/Ec2/Commands/AttachInternetGateway.hs
@@ -25,4 +25,4 @@
                                            , defVersion
                                            ]
 
-ec2ValueTransaction ''AttachInternetGateway "return"
+EC2VALUETRANSACTION(AttachInternetGateway,"return")
diff --git a/src/Aws/Ec2/Commands/AttachVolume.hs b/src/Aws/Ec2/Commands/AttachVolume.hs
--- a/src/Aws/Ec2/Commands/AttachVolume.hs
+++ b/src/Aws/Ec2/Commands/AttachVolume.hs
@@ -27,4 +27,4 @@
                                               , ("Device", qArg avol_device)
                                               ]
 
-ec2ValueTransaction ''AttachVolume "AttachVolumeResponse"
+EC2VALUETRANSACTION(AttachVolume,"AttachVolumeResponse")
diff --git a/src/Aws/Ec2/Commands/AuthorizeSecurityGroupIngress.hs b/src/Aws/Ec2/Commands/AuthorizeSecurityGroupIngress.hs
--- a/src/Aws/Ec2/Commands/AuthorizeSecurityGroupIngress.hs
+++ b/src/Aws/Ec2/Commands/AuthorizeSecurityGroupIngress.hs
@@ -50,4 +50,4 @@
                                            , defVersion
                                            ] +++ enumeratePermissions asi_permissions
 
-ec2ValueTransaction ''AuthorizeSecurityGroupIngress "AuthorizeSecurityGroupIngressResponse"
+EC2VALUETRANSACTION(AuthorizeSecurityGroupIngress,"AuthorizeSecurityGroupIngressResponse")
diff --git a/src/Aws/Ec2/Commands/CreateInternetGateway.hs b/src/Aws/Ec2/Commands/CreateInternetGateway.hs
--- a/src/Aws/Ec2/Commands/CreateInternetGateway.hs
+++ b/src/Aws/Ec2/Commands/CreateInternetGateway.hs
@@ -20,4 +20,4 @@
                                            , defVersion
                                            ]
 
-ec2ValueTransaction ''CreateInternetGateway "internetGateway"
+EC2VALUETRANSACTION(CreateInternetGateway,"internetGateway")
diff --git a/src/Aws/Ec2/Commands/CreateRoute.hs b/src/Aws/Ec2/Commands/CreateRoute.hs
--- a/src/Aws/Ec2/Commands/CreateRoute.hs
+++ b/src/Aws/Ec2/Commands/CreateRoute.hs
@@ -35,4 +35,4 @@
                                                    NetworkInterfaceId t -> [("NetworkInterfaceId", qArg t)]
                                                    VpcPeeringConnectionId t -> [("VpcPeeringConnectionId", qArg t)]
 
-ec2ValueTransaction ''CreateRoute "return"
+EC2VALUETRANSACTION(CreateRoute,"return")
diff --git a/src/Aws/Ec2/Commands/CreateSecurityGroup.hs b/src/Aws/Ec2/Commands/CreateSecurityGroup.hs
--- a/src/Aws/Ec2/Commands/CreateSecurityGroup.hs
+++ b/src/Aws/Ec2/Commands/CreateSecurityGroup.hs
@@ -25,4 +25,4 @@
                                            , defVersion
                                            ] +++ optionalA "VpcId" csec_vpcId
 
-ec2ValueTransaction ''CreateSecurityGroup "CreateSecurityGroupResponse"
+EC2VALUETRANSACTION(CreateSecurityGroup,"CreateSecurityGroupResponse")
diff --git a/src/Aws/Ec2/Commands/CreateSubnet.hs b/src/Aws/Ec2/Commands/CreateSubnet.hs
--- a/src/Aws/Ec2/Commands/CreateSubnet.hs
+++ b/src/Aws/Ec2/Commands/CreateSubnet.hs
@@ -26,4 +26,4 @@
                                               , ("CidrBlock", qArg csub_cidrBlock)
                                               ] +++ (optionalA "AvailabilityZone" csub_availabilityZone)
 
-ec2ValueTransaction ''CreateSubnet "subnet"
+EC2VALUETRANSACTION(CreateSubnet,"subnet")
diff --git a/src/Aws/Ec2/Commands/CreateTags.hs b/src/Aws/Ec2/Commands/CreateTags.hs
--- a/src/Aws/Ec2/Commands/CreateTags.hs
+++ b/src/Aws/Ec2/Commands/CreateTags.hs
@@ -33,4 +33,4 @@
                                            ] +++ enumerate "ResourceId" ct_resources qArg
                                              +++ enumerateTags ct_tags
 
-ec2ValueTransaction ''CreateTags "return"
+EC2VALUETRANSACTION(CreateTags,"return")
diff --git a/src/Aws/Ec2/Commands/CreateVolume.hs b/src/Aws/Ec2/Commands/CreateVolume.hs
--- a/src/Aws/Ec2/Commands/CreateVolume.hs
+++ b/src/Aws/Ec2/Commands/CreateVolume.hs
@@ -24,4 +24,4 @@
                                                 , ("AvailabilityZone", qArg cvol_AvailabilityZone)
                                                 ] ++ queryEbsBlockDevice cvol_ebs
 
-ec2ValueTransaction ''CreateVolume "CreateVolumeResponse"
+EC2VALUETRANSACTION(CreateVolume,"CreateVolumeResponse")
diff --git a/src/Aws/Ec2/Commands/CreateVpc.hs b/src/Aws/Ec2/Commands/CreateVpc.hs
--- a/src/Aws/Ec2/Commands/CreateVpc.hs
+++ b/src/Aws/Ec2/Commands/CreateVpc.hs
@@ -24,4 +24,4 @@
                                            , defVersion
                                            ]
 
-ec2ValueTransaction ''CreateVpc "vpc"
+EC2VALUETRANSACTION(CreateVpc,"vpc")
diff --git a/src/Aws/Ec2/Commands/DescribeAvailabilityZones.hs b/src/Aws/Ec2/Commands/DescribeAvailabilityZones.hs
--- a/src/Aws/Ec2/Commands/DescribeAvailabilityZones.hs
+++ b/src/Aws/Ec2/Commands/DescribeAvailabilityZones.hs
@@ -10,4 +10,4 @@
 data DescribeAvailabilityZones = DescribeAvailabilityZones [Text]
                        deriving (Show)
 
-ec2ValueTransactionDef ''DescribeAvailabilityZones 'DescribeAvailabilityZones "availabilityZoneInfo" "ZoneName"
+EC2VALUETRANSACTIONDEF(DescribeAvailabilityZones,"DescribeAvailabilityZones","availabilityZoneInfo","ZoneName")
diff --git a/src/Aws/Ec2/Commands/DescribeImages.hs b/src/Aws/Ec2/Commands/DescribeImages.hs
--- a/src/Aws/Ec2/Commands/DescribeImages.hs
+++ b/src/Aws/Ec2/Commands/DescribeImages.hs
@@ -20,4 +20,4 @@
                                                         [] -> [("Owner.1", qArg "self")]
                                                         _ -> enumerate "ImageId" di_imageIds qArg
 
-ec2ValueTransaction ''DescribeImages "imagesSet"
+EC2VALUETRANSACTION(DescribeImages,"imagesSet")
diff --git a/src/Aws/Ec2/Commands/DescribeInstanceStatus.hs b/src/Aws/Ec2/Commands/DescribeInstanceStatus.hs
--- a/src/Aws/Ec2/Commands/DescribeInstanceStatus.hs
+++ b/src/Aws/Ec2/Commands/DescribeInstanceStatus.hs
@@ -13,4 +13,4 @@
 data DescribeInstanceStatus = DescribeInstanceStatus { dis_instanceIds :: [Text] }
                        deriving (Show)
 
-ec2ValueTransactionDef ''DescribeInstanceStatus 'DescribeInstanceStatus "instanceStatusSet" "InstanceId"
+EC2VALUETRANSACTIONDEF(DescribeInstanceStatus,"DescribeInstanceStatus","instanceStatusSet","InstanceId")
diff --git a/src/Aws/Ec2/Commands/DescribeInstances.hs b/src/Aws/Ec2/Commands/DescribeInstances.hs
--- a/src/Aws/Ec2/Commands/DescribeInstances.hs
+++ b/src/Aws/Ec2/Commands/DescribeInstances.hs
@@ -20,5 +20,5 @@
                                                 , defVersion
                                                 ] +++ enumerate "InstanceId" di_instanceIds qArg
 
-ec2ValueTransaction ''DescribeInstances "reservationSet"
+EC2VALUETRANSACTION(DescribeInstances,"reservationSet")
 
diff --git a/src/Aws/Ec2/Commands/DescribeKeyPairs.hs b/src/Aws/Ec2/Commands/DescribeKeyPairs.hs
--- a/src/Aws/Ec2/Commands/DescribeKeyPairs.hs
+++ b/src/Aws/Ec2/Commands/DescribeKeyPairs.hs
@@ -10,4 +10,4 @@
 data DescribeKeyPairs = DescribeKeyPairs [Text]
                        deriving (Show)
 
-ec2ValueTransactionDef ''DescribeKeyPairs 'DescribeKeyPairs "keySet" "KeyName"
+EC2VALUETRANSACTIONDEF(DescribeKeyPairs,"DescribeKeyPairs","keySet","KeyName")
diff --git a/src/Aws/Ec2/Commands/DescribeRegions.hs b/src/Aws/Ec2/Commands/DescribeRegions.hs
--- a/src/Aws/Ec2/Commands/DescribeRegions.hs
+++ b/src/Aws/Ec2/Commands/DescribeRegions.hs
@@ -10,4 +10,4 @@
 data DescribeRegions = DescribeRegions [Text]
                        deriving (Show)
 
-ec2ValueTransactionDef ''DescribeRegions 'DescribeRegions "regionInfo" "RegionName"
+EC2VALUETRANSACTIONDEF(DescribeRegions,"DescribeRegions","regionInfo","RegionName")
diff --git a/src/Aws/Ec2/Commands/DescribeRouteTables.hs b/src/Aws/Ec2/Commands/DescribeRouteTables.hs
--- a/src/Aws/Ec2/Commands/DescribeRouteTables.hs
+++ b/src/Aws/Ec2/Commands/DescribeRouteTables.hs
@@ -22,4 +22,4 @@
                                            , ("Filter.1.Value.1", qArg drt_vpcId)
                                            ]
 
-ec2ValueTransaction ''DescribeRouteTables "routeTableSet"
+EC2VALUETRANSACTION(DescribeRouteTables,"routeTableSet")
diff --git a/src/Aws/Ec2/Commands/DescribeSecurityGroups.hs b/src/Aws/Ec2/Commands/DescribeSecurityGroups.hs
--- a/src/Aws/Ec2/Commands/DescribeSecurityGroups.hs
+++ b/src/Aws/Ec2/Commands/DescribeSecurityGroups.hs
@@ -27,4 +27,4 @@
                                                         [] -> []
                                                         _ -> ("Filter.1.Name", qArg "group-name"):(enumerate "Filter.1.Value" sg_names qArg)
 
-ec2ValueTransaction ''DescribeSecurityGroups "securityGroupInfo"
+EC2VALUETRANSACTION(DescribeSecurityGroups,"securityGroupInfo")
diff --git a/src/Aws/Ec2/Commands/DescribeSubnets.hs b/src/Aws/Ec2/Commands/DescribeSubnets.hs
--- a/src/Aws/Ec2/Commands/DescribeSubnets.hs
+++ b/src/Aws/Ec2/Commands/DescribeSubnets.hs
@@ -10,4 +10,4 @@
 data DescribeSubnets = DescribeSubnets [Text]
                        deriving (Show)
 
-ec2ValueTransactionDef ''DescribeSubnets 'DescribeSubnets "subnetSet" "SubnetId"
+EC2VALUETRANSACTIONDEF(DescribeSubnets,"DescribeSubnets","subnetSet","SubnetId")
diff --git a/src/Aws/Ec2/Commands/DescribeTags.hs b/src/Aws/Ec2/Commands/DescribeTags.hs
--- a/src/Aws/Ec2/Commands/DescribeTags.hs
+++ b/src/Aws/Ec2/Commands/DescribeTags.hs
@@ -10,4 +10,4 @@
 data DescribeTags = DescribeTags [Text]
                        deriving (Show)
 
-ec2ValueTransactionDef ''DescribeTags 'DescribeTags "tagSet" "" -- search not implemented
+EC2VALUETRANSACTIONDEF(DescribeTags,"DescribeTags","tagSet","") -- search not implemented
diff --git a/src/Aws/Ec2/Commands/DescribeVolumeStatus.hs b/src/Aws/Ec2/Commands/DescribeVolumeStatus.hs
--- a/src/Aws/Ec2/Commands/DescribeVolumeStatus.hs
+++ b/src/Aws/Ec2/Commands/DescribeVolumeStatus.hs
@@ -10,4 +10,4 @@
 data DescribeVolumeStatus = DescribeVolumeStatus [Text]
                        deriving (Show)
 
-ec2ValueTransactionDef ''DescribeVolumeStatus 'DescribeVolumeStatus "volumeStatusSet" "VolumeId"
+EC2VALUETRANSACTIONDEF(DescribeVolumeStatus,"DescribeVolumeStatus","volumeStatusSet","VolumeId")
diff --git a/src/Aws/Ec2/Commands/DescribeVolumes.hs b/src/Aws/Ec2/Commands/DescribeVolumes.hs
--- a/src/Aws/Ec2/Commands/DescribeVolumes.hs
+++ b/src/Aws/Ec2/Commands/DescribeVolumes.hs
@@ -10,4 +10,4 @@
 data DescribeVolumes = DescribeVolumes [Text]
                        deriving (Show)
 
-ec2ValueTransactionDef ''DescribeVolumes 'DescribeVolumes "volumeSet" "VolumeId"
+EC2VALUETRANSACTIONDEF(DescribeVolumes,"DescribeVolumes","volumeSet","VolumeId")
diff --git a/src/Aws/Ec2/Commands/DescribeVpcs.hs b/src/Aws/Ec2/Commands/DescribeVpcs.hs
--- a/src/Aws/Ec2/Commands/DescribeVpcs.hs
+++ b/src/Aws/Ec2/Commands/DescribeVpcs.hs
@@ -10,4 +10,4 @@
 data DescribeVpcs = DescribeVpcs { dvpc_vpcIds :: [Text] }
                        deriving (Show)
 
-ec2ValueTransactionDef ''DescribeVpcs 'DescribeVpcs "vpcSet" "VpcId"
+EC2VALUETRANSACTIONDEF(DescribeVpcs,"DescribeVpcs","vpcSet","VpcId")
diff --git a/src/Aws/Ec2/Commands/GetConsoleOutput.hs b/src/Aws/Ec2/Commands/GetConsoleOutput.hs
--- a/src/Aws/Ec2/Commands/GetConsoleOutput.hs
+++ b/src/Aws/Ec2/Commands/GetConsoleOutput.hs
@@ -29,4 +29,4 @@
                                                   , ("InstanceId", qArg gco_instanceId)
                                                   ]
 
-ec2ValueTransaction ''GetConsoleOutput "GetConsoleOutputResponse"
+EC2VALUETRANSACTION(GetConsoleOutput,"GetConsoleOutputResponse")
diff --git a/src/Aws/Ec2/Commands/ImportKeyPair.hs b/src/Aws/Ec2/Commands/ImportKeyPair.hs
--- a/src/Aws/Ec2/Commands/ImportKeyPair.hs
+++ b/src/Aws/Ec2/Commands/ImportKeyPair.hs
@@ -25,4 +25,4 @@
                                            , ("PublicKeyMaterial", qArg ikp_publicKeyMaterial)
                                            ]
 
-ec2ValueTransaction ''ImportKeyPair "ImportKeyPairResponse"
+EC2VALUETRANSACTION(ImportKeyPair,"ImportKeyPairResponse")
diff --git a/src/Aws/Ec2/Commands/ModifyVpcAttribute.hs b/src/Aws/Ec2/Commands/ModifyVpcAttribute.hs
--- a/src/Aws/Ec2/Commands/ModifyVpcAttribute.hs
+++ b/src/Aws/Ec2/Commands/ModifyVpcAttribute.hs
@@ -28,4 +28,4 @@
                                                    EnableDnsSupport es -> [("EnableDnsSupport.Value", qShow es)]
                                                    EnableDnsHostnames eh -> [("EnableDnsHostnames.Value", qShow eh)]
 
-ec2ValueTransaction ''ModifyVpcAttribute "return"
+EC2VALUETRANSACTION(ModifyVpcAttribute,"return")
diff --git a/src/Aws/Ec2/Commands/RunInstances.hs b/src/Aws/Ec2/Commands/RunInstances.hs
--- a/src/Aws/Ec2/Commands/RunInstances.hs
+++ b/src/Aws/Ec2/Commands/RunInstances.hs
@@ -38,6 +38,7 @@
                   , run_clientToken :: Maybe Text
                   , run_iamInstanceProfileARN :: Maybe Text
                   , run_availabilityZone :: Maybe Text
+                  , run_associatePublicIpAddress :: Bool
                   -- , run_placement :: Maybe Placement
                   -- also missing: NetworkInterface
                   } deriving (Show)
@@ -84,8 +85,8 @@
                          Nothing -> enumerate "SecurityGroupId" run_securityGroupIds qArg
                          Just subnetId -> [ ("NetworkInterface.0.DeviceIndex", qShow 0)
                                           , ("NetworkInterface.0.SubnetId", qArg subnetId)
-                                          , ("NetworkInterface.0.AssociatePublicIpAddress", qShow True)
+                                          , ("NetworkInterface.0.AssociatePublicIpAddress", qShow run_associatePublicIpAddress)
                                           ] +++ enumerate "NetworkInterface.0.SecurityGroupId" run_securityGroupIds qArg
 
-ec2ValueTransaction ''RunInstances "RunInstancesResponse"
+EC2VALUETRANSACTION(RunInstances,"RunInstancesResponse")
 
diff --git a/src/Aws/Ec2/Commands/StartInstances.hs b/src/Aws/Ec2/Commands/StartInstances.hs
new file mode 100644
--- /dev/null
+++ b/src/Aws/Ec2/Commands/StartInstances.hs
@@ -0,0 +1,37 @@
+{-# LANGUAGE TypeFamilies
+           , MultiParamTypeClasses
+           , FlexibleInstances
+           , OverloadedStrings
+           , RecordWildCards
+           , TemplateHaskell
+           , LambdaCase
+           #-}
+
+module Aws.Ec2.Commands.StartInstances where
+
+import Data.Text ()
+import Data.ByteString.Char8 (pack)
+import qualified Network.HTTP.Types as HTTP
+import Data.Monoid
+import Aws.Ec2.TH
+
+-- http://docs.aws.amazon.com/AWSEC2/latest/APIReference/ApiReference-query-StartInstances.html
+data StartInstances = StartInstances
+                  { start_instanceIds :: [Text]
+                  } deriving (Show)
+
+instance SignQuery StartInstances where
+    type ServiceConfiguration StartInstances = EC2Configuration
+    signQuery StartInstances{..} = ec2SignQuery $
+                                  main
+                                  +++ enumerateInstances (zip [1..] start_instanceIds)
+        where
+          main :: HTTP.Query
+          main = [ ("Action", qArg "StartInstances")
+                 , defVersion
+                 ]
+          enumerateInstances :: [(Int,Text)] -> HTTP.Query
+          enumerateInstances [] = []
+          enumerateInstances ((i,x):xs) = [("InstanceId." <> pack (show i), qArg x)] +++ enumerateInstances xs
+
+EC2VALUETRANSACTION(StartInstances,"StartInstancesResponse")
diff --git a/src/Aws/Ec2/Commands/StopInstances.hs b/src/Aws/Ec2/Commands/StopInstances.hs
new file mode 100644
--- /dev/null
+++ b/src/Aws/Ec2/Commands/StopInstances.hs
@@ -0,0 +1,38 @@
+{-# LANGUAGE TypeFamilies
+           , MultiParamTypeClasses
+           , FlexibleInstances
+           , OverloadedStrings
+           , RecordWildCards
+           , TemplateHaskell
+           , LambdaCase
+           #-}
+
+module Aws.Ec2.Commands.StopInstances where
+
+import Data.Text ()
+import Data.ByteString.Char8 (pack)
+import qualified Network.HTTP.Types as HTTP
+import Data.Monoid
+import Aws.Ec2.TH
+
+-- http://docs.aws.amazon.com/AWSEC2/latest/APIReference/ApiReference-query-StopInstances.html
+data StopInstances = StopInstances
+                  { stop_instanceIds :: [Text]
+                  } deriving (Show)
+
+instance SignQuery StopInstances where
+    type ServiceConfiguration StopInstances = EC2Configuration
+    signQuery StopInstances{..} = ec2SignQuery $
+                                  main
+                                  +++ enumerateInstances (zip [1..] stop_instanceIds)
+        where
+          main :: HTTP.Query
+          main = [ ("Action", qArg "StopInstances")
+                 , defVersion
+                 ]
+          enumerateInstances :: [(Int,Text)] -> HTTP.Query
+          enumerateInstances [] = []
+          enumerateInstances ((i,x):xs) = [("InstanceId." <> pack (show i), qArg x)] +++ enumerateInstances xs
+
+
+EC2VALUETRANSACTION(StopInstances,"StopInstancesResponse")
diff --git a/src/Aws/Ec2/Commands/TerminateInstances.hs b/src/Aws/Ec2/Commands/TerminateInstances.hs
new file mode 100644
--- /dev/null
+++ b/src/Aws/Ec2/Commands/TerminateInstances.hs
@@ -0,0 +1,38 @@
+{-# LANGUAGE TypeFamilies
+           , MultiParamTypeClasses
+           , FlexibleInstances
+           , OverloadedStrings
+           , RecordWildCards
+           , TemplateHaskell
+           , LambdaCase
+           #-}
+
+module Aws.Ec2.Commands.TerminateInstances where
+
+import Data.Text ()
+import Data.ByteString.Char8 (pack)
+import qualified Network.HTTP.Types as HTTP
+import Data.Monoid
+import Aws.Ec2.TH
+
+-- http://docs.aws.amazon.com/AWSEC2/latest/APIReference/ApiReference-query-TerminateInstances.html
+data TerminateInstances = TerminateInstances
+                  { term_instanceIds :: [Text]
+                  } deriving (Show)
+
+instance SignQuery TerminateInstances where
+    type ServiceConfiguration TerminateInstances = EC2Configuration
+    signQuery TerminateInstances{..} = ec2SignQuery $
+                                  main
+                                  +++ enumerateInstances (zip [1..] term_instanceIds)
+        where
+          main :: HTTP.Query
+          main = [ ("Action", qArg "TerminateInstances")
+                 , defVersion
+                 ]
+          enumerateInstances :: [(Int,Text)] -> HTTP.Query
+          enumerateInstances [] = []
+          enumerateInstances ((i,x):xs) = [("InstanceId." <> pack (show i), qArg x)] +++ enumerateInstances xs
+
+
+EC2VALUETRANSACTION(TerminateInstances,"TerminateInstancesResponse")
diff --git a/src/Aws/Ec2/TH.hs b/src/Aws/Ec2/TH.hs
--- a/src/Aws/Ec2/TH.hs
+++ b/src/Aws/Ec2/TH.hs
@@ -13,8 +13,10 @@
 , Text
 , UTCTime
 , FromJSON
+#ifdef USE_TH
 , ec2ValueTransactionDef
 , ec2ValueTransaction
+#endif
 ) where
 
 import Data.Text (Text)
@@ -27,6 +29,8 @@
 import Aws.Query
 import Aws.Query.TH
 
+#ifdef USE_TH
 ec2ValueTransactionDef ty cons tag filterKey = queryValueTransactionDef ty cons tag 'ec2SignQuery 'defVersion "item" filterKey
 
 ec2ValueTransaction = queryValueTransaction
+#endif
diff --git a/src/Aws/Elb/Commands/ConfigureHealthCheck.hs b/src/Aws/Elb/Commands/ConfigureHealthCheck.hs
--- a/src/Aws/Elb/Commands/ConfigureHealthCheck.hs
+++ b/src/Aws/Elb/Commands/ConfigureHealthCheck.hs
@@ -46,4 +46,4 @@
                                                     , ("HealthCheck.Timeout", qShow hc_timeout)
                                                     ]
 
-elbValueTransaction ''ConfigureHealthCheck "ConfigureHealthCheckResult"
+ELBVALUETRANSACTION(ConfigureHealthCheck,"ConfigureHealthCheckResult")
diff --git a/src/Aws/Elb/Commands/CreateAppCookieStickinessPolicy.hs b/src/Aws/Elb/Commands/CreateAppCookieStickinessPolicy.hs
new file mode 100644
--- /dev/null
+++ b/src/Aws/Elb/Commands/CreateAppCookieStickinessPolicy.hs
@@ -0,0 +1,29 @@
+{-# LANGUAGE TypeFamilies
+           , MultiParamTypeClasses
+           , FlexibleInstances
+           , OverloadedStrings
+           , TemplateHaskell
+           , RecordWildCards
+           #-}
+
+module Aws.Elb.Commands.CreateAppCookieStickinessPolicy where
+
+import Aws.Elb.TH
+
+data CreateAppCookieStickinessPolicy = CreateAppCookieStickinessPolicy
+                        { cacsp_loadBalancerName :: Text
+                        , cacsp_cookieName :: Text
+                        , cacsp_policyName :: Text
+                        } deriving (Show)
+
+instance SignQuery CreateAppCookieStickinessPolicy where
+    type ServiceConfiguration CreateAppCookieStickinessPolicy = QueryAPIConfiguration
+    signQuery CreateAppCookieStickinessPolicy{..} = elbSignQuery $
+                                                    [ ("Action", qArg "CreateAppCookieStickinessPolicy")
+                                                    , defVersion
+                                                    , ("LoadBalancerName", qArg cacsp_loadBalancerName)
+                                                    , ("PolicyName", qArg cacsp_policyName)
+                                                    , ("CookieName", qArg cacsp_cookieName)
+                                                    ]
+
+ELBVALUETRANSACTION(CreateAppCookieStickinessPolicy,"CreateAppCookieStickinessPolicyResult")
diff --git a/src/Aws/Elb/Commands/CreateLBCookieStickinessPolicy.hs b/src/Aws/Elb/Commands/CreateLBCookieStickinessPolicy.hs
--- a/src/Aws/Elb/Commands/CreateLBCookieStickinessPolicy.hs
+++ b/src/Aws/Elb/Commands/CreateLBCookieStickinessPolicy.hs
@@ -25,4 +25,4 @@
                                                     , ("PolicyName", qArg clbcsp_policyName)
                                                     ] +++ optional "CookieExpirationPeriod" clbcsp_cookieExpirationPeriod qShow
 
-elbValueTransaction ''CreateLBCookieStickinessPolicy "CreateLBCookieStickinessPolicyResult"
+ELBVALUETRANSACTION(CreateLBCookieStickinessPolicy,"CreateLBCookieStickinessPolicyResult")
diff --git a/src/Aws/Elb/Commands/CreateLoadBalancer.hs b/src/Aws/Elb/Commands/CreateLoadBalancer.hs
--- a/src/Aws/Elb/Commands/CreateLoadBalancer.hs
+++ b/src/Aws/Elb/Commands/CreateLoadBalancer.hs
@@ -56,4 +56,4 @@
                                                             _ -> []
 
 
-elbValueTransaction ''CreateLoadBalancer "CreateLoadBalancerResult"
+ELBVALUETRANSACTION(CreateLoadBalancer,"CreateLoadBalancerResult")
diff --git a/src/Aws/Elb/Commands/DeregisterInstancesFromLoadBalancer.hs b/src/Aws/Elb/Commands/DeregisterInstancesFromLoadBalancer.hs
--- a/src/Aws/Elb/Commands/DeregisterInstancesFromLoadBalancer.hs
+++ b/src/Aws/Elb/Commands/DeregisterInstancesFromLoadBalancer.hs
@@ -25,4 +25,4 @@
                                                     , ("LoadBalancerName", qArg dilb_name)
                                                     ] +++ enumerateInstanceIds dilb_instanceIds
 
-elbValueTransaction ''DeregisterInstancesFromLoadBalancer "DeregisterInstancesFromLoadBalancerResult"
+ELBVALUETRANSACTION(DeregisterInstancesFromLoadBalancer,"DeregisterInstancesFromLoadBalancerResult")
diff --git a/src/Aws/Elb/Commands/DescribeInstanceHealth.hs b/src/Aws/Elb/Commands/DescribeInstanceHealth.hs
--- a/src/Aws/Elb/Commands/DescribeInstanceHealth.hs
+++ b/src/Aws/Elb/Commands/DescribeInstanceHealth.hs
@@ -19,4 +19,4 @@
                                                            , ("LoadBalancerName", qArg lb)
                                                            ]
 
-elbValueTransaction ''DescribeInstanceHealth "DescribeInstanceHealthResult"
+ELBVALUETRANSACTION(DescribeInstanceHealth,"DescribeInstanceHealthResult")
diff --git a/src/Aws/Elb/Commands/DescribeLoadBalancerPolicies.hs b/src/Aws/Elb/Commands/DescribeLoadBalancerPolicies.hs
--- a/src/Aws/Elb/Commands/DescribeLoadBalancerPolicies.hs
+++ b/src/Aws/Elb/Commands/DescribeLoadBalancerPolicies.hs
@@ -19,4 +19,4 @@
                                                                  , ("LoadBalancerName", qArg lb)
                                                                  ]
 
-elbValueTransaction ''DescribeLoadBalancerPolicies "DescribeLoadBalancerPoliciesResult"
+ELBVALUETRANSACTION(DescribeLoadBalancerPolicies,"DescribeLoadBalancerPoliciesResult")
diff --git a/src/Aws/Elb/Commands/DescribeLoadBalancers.hs b/src/Aws/Elb/Commands/DescribeLoadBalancers.hs
--- a/src/Aws/Elb/Commands/DescribeLoadBalancers.hs
+++ b/src/Aws/Elb/Commands/DescribeLoadBalancers.hs
@@ -12,4 +12,4 @@
 
 data DescribeLoadBalancers = DescribeLoadBalancers [Text]
 
-elbValueTransactionDef ''DescribeLoadBalancers 'DescribeLoadBalancers "LoadBalancerDescriptions" "LoadBalancerNames.member"
+ELBVALUETRANSACTIONDEF(DescribeLoadBalancers,"DescribeLoadBalancers","LoadBalancerDescriptions","LoadBalancerNames.member")
diff --git a/src/Aws/Elb/Commands/ModifyLoadBalancerAttributes.hs b/src/Aws/Elb/Commands/ModifyLoadBalancerAttributes.hs
--- a/src/Aws/Elb/Commands/ModifyLoadBalancerAttributes.hs
+++ b/src/Aws/Elb/Commands/ModifyLoadBalancerAttributes.hs
@@ -53,4 +53,4 @@
                                                     , ("LoadBalancerName", qArg mlba_name)
                                                     ] +++ concatMap attributeQuery mlba_attributes
 
-elbValueTransaction ''ModifyLoadBalancerAttributes "ModifyLoadBalancerAttributesResult"
+ELBVALUETRANSACTION(ModifyLoadBalancerAttributes,"ModifyLoadBalancerAttributesResult")
diff --git a/src/Aws/Elb/Commands/RegisterInstancesWithLoadBalancer.hs b/src/Aws/Elb/Commands/RegisterInstancesWithLoadBalancer.hs
--- a/src/Aws/Elb/Commands/RegisterInstancesWithLoadBalancer.hs
+++ b/src/Aws/Elb/Commands/RegisterInstancesWithLoadBalancer.hs
@@ -25,4 +25,4 @@
                                                     , ("LoadBalancerName", qArg rilb_name)
                                                     ] +++ enumerateInstanceIds rilb_instanceIds
 
-elbValueTransaction ''RegisterInstancesWithLoadBalancer "RegisterInstancesWithLoadBalancerResult"
+ELBVALUETRANSACTION(RegisterInstancesWithLoadBalancer,"RegisterInstancesWithLoadBalancerResult")
diff --git a/src/Aws/Elb/Commands/SetLoadBalancerPoliciesOfListener.hs b/src/Aws/Elb/Commands/SetLoadBalancerPoliciesOfListener.hs
--- a/src/Aws/Elb/Commands/SetLoadBalancerPoliciesOfListener.hs
+++ b/src/Aws/Elb/Commands/SetLoadBalancerPoliciesOfListener.hs
@@ -25,4 +25,4 @@
                                                     , ("LoadBalancerPort", qShow spl_loadBalancerPort)
                                                     ] +++ enumerate "PolicyNames.member" spl_policyNames qArg
 
-elbValueTransaction ''SetLoadBalancerPoliciesOfListener "SetLoadBalancerPoliciesOfListenerResult"
+ELBVALUETRANSACTION(SetLoadBalancerPoliciesOfListener,"SetLoadBalancerPoliciesOfListenerResult")
diff --git a/src/Aws/Elb/TH.hs b/src/Aws/Elb/TH.hs
--- a/src/Aws/Elb/TH.hs
+++ b/src/Aws/Elb/TH.hs
@@ -11,8 +11,10 @@
 , module Aws.Query
 , Text
 , FromJSON
+#ifdef USE_TH
 , elbValueTransaction
 , elbValueTransactionDef
+#endif
 ) where
 
 import Language.Haskell.TH
@@ -27,6 +29,7 @@
 import Aws.Query.TH
 import Aws.Elb.Core
 
+#ifdef USE_TH
 elbValueTransaction :: Name -> String -> DecsQ
 elbValueTransaction ty tag = [d|
                   instance ResponseConsumer $(conT ty) Value where
@@ -37,3 +40,4 @@
                   |]
 
 elbValueTransactionDef ty cons tag filterKey = queryValueTransactionDef ty cons tag 'elbSignQuery 'defVersion "member" filterKey
+#endif
diff --git a/src/Aws/Query/TH.hs b/src/Aws/Query/TH.hs
--- a/src/Aws/Query/TH.hs
+++ b/src/Aws/Query/TH.hs
@@ -14,8 +14,10 @@
 , Text
 , UTCTime
 , FromJSON
+#ifdef USE_TH
 , queryValueTransactionDef
 , queryValueTransaction
+#endif
 ) where
 
 import Language.Haskell.TH
@@ -29,6 +31,7 @@
 import Aws.Core
 import Aws.Query
 
+#ifdef USE_TH
 queryValueTransactionDef :: Name -> Name -> String -> Name -> Name -> String -> String -> DecsQ
 queryValueTransactionDef ty cons tag signF version item filterKey = do
                 arg <- newName "arg"
@@ -54,3 +57,4 @@
 
                   instance Transaction $(conT ty) Value
                   |]
+#endif
