You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by ab...@apache.org on 2013/07/01 21:13:11 UTC

[06/20] JCLOUDS-150 - Removal of async from AWS - specifically EC2

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f3b8d3f/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/features/AWSSecurityGroupApi.java
----------------------------------------------------------------------
diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/features/AWSSecurityGroupApi.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/features/AWSSecurityGroupApi.java
new file mode 100644
index 0000000..d71d544
--- /dev/null
+++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/features/AWSSecurityGroupApi.java
@@ -0,0 +1,125 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.aws.ec2.features;
+
+import static org.jclouds.aws.reference.FormParameters.ACTION;
+
+import java.util.Set;
+
+import javax.inject.Named;
+import javax.ws.rs.FormParam;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+
+import org.jclouds.Fallbacks.EmptySetOnNotFoundOr404;
+import org.jclouds.Fallbacks.VoidOnNotFoundOr404;
+import org.jclouds.aws.ec2.options.CreateSecurityGroupOptions;
+import org.jclouds.aws.ec2.xml.CreateSecurityGroupResponseHandler;
+import org.jclouds.aws.filters.FormSigner;
+import org.jclouds.ec2.binders.BindGroupIdsToIndexedFormParams;
+import org.jclouds.ec2.binders.BindIpPermissionToIndexedFormParams;
+import org.jclouds.ec2.binders.BindIpPermissionsToIndexedFormParams;
+import org.jclouds.ec2.domain.SecurityGroup;
+import org.jclouds.ec2.features.SecurityGroupApi;
+import org.jclouds.ec2.xml.DescribeSecurityGroupsResponseHandler;
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.location.functions.RegionToEndpointOrProviderIfNull;
+import org.jclouds.net.domain.IpPermission;
+import org.jclouds.rest.annotations.BinderParam;
+import org.jclouds.rest.annotations.EndpointParam;
+import org.jclouds.rest.annotations.Fallback;
+import org.jclouds.rest.annotations.FormParams;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.VirtualHost;
+import org.jclouds.rest.annotations.XMLResponseParser;
+
+import com.google.common.annotations.Beta;
+
+/**
+ * Provides access to EC2 SecurityGroup Services via their REST API.
+ * <p/>
+ * 
+ * @author Adrian Cole
+ */
+@RequestFilters(FormSigner.class)
+@VirtualHost
+@Beta
+public interface AWSSecurityGroupApi extends SecurityGroupApi {
+
+   @Named("CreateSecurityGroup")
+   @POST
+   @Path("/")
+   @XMLResponseParser(CreateSecurityGroupResponseHandler.class)
+   @FormParams(keys = ACTION, values = "CreateSecurityGroup")
+   String createSecurityGroupInRegionAndReturnId(
+         @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
+         @FormParam("GroupName") String name, @FormParam("GroupDescription") String description,
+         CreateSecurityGroupOptions... options);
+
+   @Named("AuthorizeSecurityGroupIngress")
+   @POST
+   @Path("/")
+   @FormParams(keys = ACTION, values = "AuthorizeSecurityGroupIngress")
+   void authorizeSecurityGroupIngressInRegion(
+         @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
+         @FormParam("GroupId") String groupId, @BinderParam(BindIpPermissionToIndexedFormParams.class) IpPermission perm);
+
+   @Named("AuthorizeSecurityGroupIngress")
+   @POST
+   @Path("/")
+   @FormParams(keys = ACTION, values = "AuthorizeSecurityGroupIngress")
+   void authorizeSecurityGroupIngressInRegion(
+         @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
+         @FormParam("GroupId") String groupId,
+         @BinderParam(BindIpPermissionsToIndexedFormParams.class) Iterable<IpPermission> perms);
+
+   @Named("RevokeSecurityGroupIngress")
+   @POST
+   @Path("/")
+   @FormParams(keys = ACTION, values = "RevokeSecurityGroupIngress")
+   void revokeSecurityGroupIngressInRegion(
+         @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
+         @FormParam("GroupId") String groupId, @BinderParam(BindIpPermissionToIndexedFormParams.class) IpPermission perm);
+
+   @Named("RevokeSecurityGroupIngress")
+   @POST
+   @Path("/")
+   @FormParams(keys = ACTION, values = "RevokeSecurityGroupIngress")
+   void revokeSecurityGroupIngressInRegion(
+         @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
+         @FormParam("GroupId") String groupId,
+         @BinderParam(BindIpPermissionsToIndexedFormParams.class) Iterable<IpPermission> perms);
+
+   @Named("DeleteSecurityGroup")
+   @POST
+   @Path("/")
+   @FormParams(keys = ACTION, values = "DeleteSecurityGroup")
+   @Fallback(VoidOnNotFoundOr404.class)
+   void deleteSecurityGroupInRegionById(
+            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region, @FormParam("GroupId") String name);
+
+   @Named("DescribeSecurityGroups")
+   @POST
+   @Path("/")
+   @FormParams(keys = ACTION, values = "DescribeSecurityGroups")
+   @XMLResponseParser(DescribeSecurityGroupsResponseHandler.class)
+   @Fallback(EmptySetOnNotFoundOr404.class)
+   Set<SecurityGroup> describeSecurityGroupsInRegionById(
+            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
+            @BinderParam(BindGroupIdsToIndexedFormParams.class) String... securityGroupNames);
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f3b8d3f/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/features/MonitoringApi.java
----------------------------------------------------------------------
diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/features/MonitoringApi.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/features/MonitoringApi.java
new file mode 100644
index 0000000..bb1de8a
--- /dev/null
+++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/features/MonitoringApi.java
@@ -0,0 +1,97 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.aws.ec2.features;
+
+import static org.jclouds.aws.reference.FormParameters.ACTION;
+
+import java.util.Map;
+
+import javax.inject.Named;
+import javax.ws.rs.FormParam;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+
+import org.jclouds.aws.ec2.domain.MonitoringState;
+import org.jclouds.aws.ec2.xml.MonitoringStateHandler;
+import org.jclouds.aws.filters.FormSigner;
+import org.jclouds.ec2.binders.BindInstanceIdsToIndexedFormParams;
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.location.functions.RegionToEndpointOrProviderIfNull;
+import org.jclouds.rest.annotations.BinderParam;
+import org.jclouds.rest.annotations.EndpointParam;
+import org.jclouds.rest.annotations.FormParams;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.VirtualHost;
+import org.jclouds.rest.annotations.XMLResponseParser;
+
+/**
+ * Provides access to EC2 Monitoring Services via their REST API.
+ * <p/>
+ * 
+ * @author Adrian Cole
+ */
+@RequestFilters(FormSigner.class)
+@VirtualHost
+public interface MonitoringApi {
+
+   /**
+    * Enables monitoring for a running instance. For more information, refer to the Amazon
+    * CloudWatch Developer Guide.
+    * 
+    * @param region
+    *           Instances are tied to Availability Zones. However, the instance ID is tied to the
+    *           Region.
+    * @see InstanceApi#runInstances
+    * @see #unmonitorInstances
+    * 
+    * @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-MonitorInstances.html"
+    *      />
+    */
+   @Named("MonitorInstances")
+   @POST
+   @Path("/")
+   @FormParams(keys = ACTION, values = "MonitorInstances")
+   @XMLResponseParser(MonitoringStateHandler.class)
+   Map<String, MonitoringState> monitorInstancesInRegion(
+            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
+            @FormParam("InstanceId.0") String instanceId,
+            @BinderParam(BindInstanceIdsToIndexedFormParams.class) String... instanceIds);
+
+   /**
+    * Disables monitoring for a running instance. For more information, refer to the Amazon
+    * CloudWatch Developer Guide.
+    * 
+    * @param region
+    *           Instances are tied to Availability Zones. However, the instance ID is tied to the
+    *           Region.
+    * 
+    * @see InstanceApi#runInstances
+    * @see #monitorInstances
+    * 
+    * @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-UnmonitorInstances.html"
+    *      />
+    */
+   @Named("UnmonitorInstances")
+   @POST
+   @Path("/")
+   @FormParams(keys = ACTION, values = "UnmonitorInstances")
+   @XMLResponseParser(MonitoringStateHandler.class)
+   Map<String, MonitoringState> unmonitorInstancesInRegion(
+            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
+            @FormParam("InstanceId.0") String instanceId,
+            @BinderParam(BindInstanceIdsToIndexedFormParams.class) String... instanceIds);
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f3b8d3f/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/features/PlacementGroupApi.java
----------------------------------------------------------------------
diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/features/PlacementGroupApi.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/features/PlacementGroupApi.java
new file mode 100644
index 0000000..1acc121
--- /dev/null
+++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/features/PlacementGroupApi.java
@@ -0,0 +1,136 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.aws.ec2.features;
+
+import static org.jclouds.aws.reference.FormParameters.ACTION;
+
+import java.util.Set;
+
+import javax.inject.Named;
+import javax.ws.rs.FormParam;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+
+import org.jclouds.Fallbacks.EmptySetOnNotFoundOr404;
+import org.jclouds.Fallbacks.VoidOnNotFoundOr404;
+import org.jclouds.aws.ec2.domain.PlacementGroup;
+import org.jclouds.aws.ec2.xml.DescribePlacementGroupsResponseHandler;
+import org.jclouds.aws.filters.FormSigner;
+import org.jclouds.ec2.binders.BindGroupNamesToIndexedFormParams;
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.location.functions.RegionToEndpointOrProviderIfNull;
+import org.jclouds.rest.annotations.BinderParam;
+import org.jclouds.rest.annotations.EndpointParam;
+import org.jclouds.rest.annotations.Fallback;
+import org.jclouds.rest.annotations.FormParams;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.VirtualHost;
+import org.jclouds.rest.annotations.XMLResponseParser;
+
+/**
+ * Provides access to EC2 Placement Groups via their REST API.
+ * <p/>
+ * 
+ * @author Adrian Cole
+ */
+@RequestFilters(FormSigner.class)
+@VirtualHost
+public interface PlacementGroupApi {
+
+   /**
+    * Creates a placement group that you launch cluster compute instances into. You must give the
+    * group a name unique within the scope of your account.
+    * 
+    * @param region
+    *           Region to create the placement group in.
+    * @param name
+    *           The name of the placement group..
+    * @param strategy
+    *           The placement group strategy.
+    * @see #describePlacementGroupsInRegion
+    * @see #deletePlacementGroupInRegion
+    * 
+    * @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-CreatePlacementGroup.html"
+    *      />
+    */
+   @Named("CreatePlacementGroup")
+   @POST
+   @Path("/")
+   @FormParams(keys = ACTION, values = "CreatePlacementGroup")
+   void createPlacementGroupInRegion(
+            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
+            @FormParam("GroupName") String name, @FormParam("Strategy") String strategy);
+
+   /**
+    * like {@link #createPlacementGroupInRegion(String,String,String) except that the strategy is default: "cluster".
+    */
+   @Named("CreatePlacementGroup")
+   @POST
+   @Path("/")
+   @FormParams(keys = { ACTION, "Strategy" }, values = { "CreatePlacementGroup", "cluster" })
+   void createPlacementGroupInRegion(
+            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region, @FormParam("GroupName") String name);
+
+   /**
+    * Deletes a placement group from your account. You must terminate all instances in the placement group before deleting it.
+    * 
+    * @param region
+    *           Region to delete the placement from from
+    * @param name
+    *           Name of the security group to delete.
+    * 
+    * @see #describePlacementGroupsInRegion
+    * @see #createPlacementGroupInRegion
+    * 
+    * @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DeletePlacementGroup.html"
+    *      />
+    */
+   @Named("DeletePlacementGroup")
+   @POST
+   @Path("/")
+   @FormParams(keys = ACTION, values = "DeletePlacementGroup")
+   @Fallback(VoidOnNotFoundOr404.class)
+   void deletePlacementGroupInRegion(
+            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region, @FormParam("GroupName") String name);
+
+   /**
+    * 
+    * Returns information about one or more placement groups in your account.
+    * 
+    * @param region
+    *           The bundleTask ID is tied to the Region.
+    * @param groupNames
+    *           The name of the placement group. You can specify more than one in the request, or
+    *           omit the parameter if you want information about all your placement groups. By
+    *           default, all placement groups are described
+    * 
+    * @see #deletePlacementGroupInRegion
+    * @see #createPlacementGroupInRegion
+    * @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribePlacementGroups.html"
+    *      />
+    */
+   @Named("DescribePlacementGroups")
+   @POST
+   @Path("/")
+   @FormParams(keys = ACTION, values = "DescribePlacementGroups")
+   @XMLResponseParser(DescribePlacementGroupsResponseHandler.class)
+   @Fallback(EmptySetOnNotFoundOr404.class)
+   Set<PlacementGroup> describePlacementGroupsInRegion(
+            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
+            @BinderParam(BindGroupNamesToIndexedFormParams.class) String... placementGroupIds);
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f3b8d3f/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/features/SpotInstanceApi.java
----------------------------------------------------------------------
diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/features/SpotInstanceApi.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/features/SpotInstanceApi.java
new file mode 100644
index 0000000..2d728e4
--- /dev/null
+++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/features/SpotInstanceApi.java
@@ -0,0 +1,214 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.aws.ec2.features;
+
+import static org.jclouds.aws.reference.FormParameters.ACTION;
+
+import java.util.Set;
+
+import javax.inject.Named;
+import javax.ws.rs.FormParam;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+
+import org.jclouds.Fallbacks.EmptySetOnNotFoundOr404;
+import org.jclouds.Fallbacks.VoidOnNotFoundOr404;
+import org.jclouds.aws.ec2.binders.BindLaunchSpecificationToFormParams;
+import org.jclouds.aws.ec2.binders.BindSpotInstanceRequestIdsToIndexedFormParams;
+import org.jclouds.aws.ec2.domain.LaunchSpecification;
+import org.jclouds.aws.ec2.domain.Spot;
+import org.jclouds.aws.ec2.domain.SpotInstanceRequest;
+import org.jclouds.aws.ec2.options.DescribeSpotPriceHistoryOptions;
+import org.jclouds.aws.ec2.options.RequestSpotInstancesOptions;
+import org.jclouds.aws.ec2.xml.DescribeSpotPriceHistoryResponseHandler;
+import org.jclouds.aws.ec2.xml.SpotInstanceHandler;
+import org.jclouds.aws.ec2.xml.SpotInstancesHandler;
+import org.jclouds.aws.filters.FormSigner;
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.location.functions.RegionToEndpointOrProviderIfNull;
+import org.jclouds.rest.annotations.BinderParam;
+import org.jclouds.rest.annotations.EndpointParam;
+import org.jclouds.rest.annotations.Fallback;
+import org.jclouds.rest.annotations.FormParams;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.VirtualHost;
+import org.jclouds.rest.annotations.XMLResponseParser;
+
+/**
+ * Provides access to EC2 Spot Instances via their REST API.
+ * <p/>
+ * 
+ * @author Adrian Cole
+ */
+@RequestFilters(FormSigner.class)
+@VirtualHost
+public interface SpotInstanceApi {
+
+   /**
+    * Describes Spot Instance requests. Spot Instances are instances that Amazon EC2 starts on your
+    * behalf when the maximum price that you specify exceeds the current Spot Price. Amazon EC2
+    * periodically sets the Spot Price based on available Spot Instance capacity and current spot
+    * instance requests. For conceptual information about Spot Instances, refer to the Amazon
+    * Elastic Compute Cloud Developer Guide or Amazon Elastic Compute Cloud User Guide.
+    * 
+    * @param region
+    *           Region where the spot instance service is running
+    * @param requestIds
+    *           Specifies the ID of the Spot Instance request.
+    * 
+    * @see #requestSpotInstancesInRegion
+    * @see #cancelSpotInstanceRequestsInRegion
+    * @see #describeSpotPriceHistoryInRegion
+    * @see <a href=
+    *      "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeSpotInstanceRequests.html"
+    *      />
+    * @return TODO
+    */
+   @Named("DescribeSpotInstanceRequests")
+   @POST
+   @Path("/")
+   @FormParams(keys = ACTION, values = "DescribeSpotInstanceRequests")
+   @Fallback(EmptySetOnNotFoundOr404.class)
+   @XMLResponseParser(SpotInstancesHandler.class)
+   Set<SpotInstanceRequest> describeSpotInstanceRequestsInRegion(
+         @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
+         @BinderParam(BindSpotInstanceRequestIdsToIndexedFormParams.class) String... requestIds);
+
+   /**
+    * request a single spot instance
+    * 
+    * @param region
+    *           Region where the spot instance service is running
+    * @param spotPrice
+    *           Specifies the maximum hourly price for any Spot Instance launched to fulfill the
+    *           request.
+    * @param imageId
+    *           The AMI ID.
+    * @param instanceType
+    *           The instance type (ex. m1.small)
+    * @return spot instance request
+    * @see #requestSpotInstancesInRegion
+    */
+   @Named("RequestSpotInstances")
+   @POST
+   @Path("/")
+   @FormParams(keys = ACTION, values = "RequestSpotInstances")
+   @XMLResponseParser(SpotInstanceHandler.class)
+   SpotInstanceRequest requestSpotInstanceInRegion(
+         @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
+         @FormParam("SpotPrice") float spotPrice, @FormParam("LaunchSpecification.ImageId") String imageId,
+         @FormParam("LaunchSpecification.InstanceType") String instanceType);
+
+   /**
+    * Creates a Spot Instance request. Spot Instances are instances that Amazon EC2 starts on your
+    * behalf when the maximum price that you specify exceeds the current Spot Price. Amazon EC2
+    * periodically sets the Spot Price based on available Spot Instance capacity and current spot
+    * instance requests. For conceptual information about Spot Instances, refer to the Amazon
+    * Elastic Compute Cloud Developer Guide or Amazon Elastic Compute Cloud User Guide.
+    * 
+    * @param region
+    *           Region where the spot instance service is running
+    * @param spotPrice
+    *           Specifies the maximum hourly price for any Spot Instance launched to fulfill the
+    *           request.
+    * @param instanceCount
+    *           number of instances to request
+    * @param launchSpec
+    *           includes at least The AMI ID and instance type (ex. m1.small)
+    * @param options
+    *           options including expiration time or grouping
+    * 
+    * @see #describeSpotInstanceRequestsInRegion
+    * @see #cancelSpotInstanceRequestsInRegion
+    * @see #describeSpotPriceHistoryInRegion
+    * @see <a href=
+    *      "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-RequestSpotInstances.html"
+    *      />
+    * @return set of spot instance requests
+    */
+   @Named("RequestSpotInstances")
+   @POST
+   @Path("/")
+   @FormParams(keys = ACTION, values = "RequestSpotInstances")
+   @XMLResponseParser(SpotInstancesHandler.class)
+   Set<SpotInstanceRequest> requestSpotInstancesInRegion(
+         @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
+         @FormParam("SpotPrice") float spotPrice, @FormParam("InstanceCount") int instanceCount,
+         @BinderParam(BindLaunchSpecificationToFormParams.class) LaunchSpecification launchSpec,
+         RequestSpotInstancesOptions... options);
+
+   /**
+    * 
+    * Describes Spot Price history. Spot Instances are instances that Amazon EC2 starts on your
+    * behalf when the maximum price that you specify exceeds the current Spot Price. Amazon EC2
+    * periodically sets the Spot Price based on available Spot Instance capacity and current spot
+    * instance requests. For conceptual information about Spot Instances, refer to the Amazon
+    * Elastic Compute Cloud Developer Guide or Amazon Elastic Compute Cloud User Guide.
+    * 
+    * @param region
+    *           Region where the spot instance service is running
+    * @param options
+    *           options to control the list
+    * 
+    * @see #describeSpotInstanceRequestsInRegion
+    * @see #requestSpotInstancesInRegion
+    * @see #cancelSpotInstanceRequestsInRegion
+    * @see <a href=
+    *      "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeSpotInstanceRequests.html"
+    *      />
+    * @return TODO
+    */
+   @Named("DescribeSpotPriceHistory")
+   @POST
+   @Path("/")
+   @FormParams(keys = ACTION, values = "DescribeSpotPriceHistory")
+   @XMLResponseParser(DescribeSpotPriceHistoryResponseHandler.class)
+   @Fallback(EmptySetOnNotFoundOr404.class)
+   Set<Spot> describeSpotPriceHistoryInRegion(
+         @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
+         DescribeSpotPriceHistoryOptions... options);
+
+   /**
+    * Cancels one or more Spot Instance requests. Spot Instances are instances that Amazon EC2
+    * starts on your behalf when the maximum price that you specify exceeds the current Spot Price.
+    * Amazon EC2 periodically sets the Spot Price based on available Spot Instance capacity and
+    * current spot instance requests. For conceptual information about Spot Instances, refer to the
+    * Amazon Elastic Compute Cloud Developer Guide or Amazon Elastic Compute Cloud User Guide.
+    * 
+    * @param region
+    *           Region where the spot instance service is running
+    * @param requestIds
+    *           Specifies the ID of the Spot Instance request.
+    * 
+    * @see #describeSpotInstanceRequestsInRegion
+    * @see #requestSpotInstancesInRegion
+    * @see #describeSpotPriceHistoryInRegion
+    * @see <a href=
+    *      "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-CancelSpotInstanceRequests.html"
+    *      />
+    * @return TODO
+    */
+   @Named("CancelSpotInstanceRequests")
+   @POST
+   @Path("/")
+   @FormParams(keys = ACTION, values = "CancelSpotInstanceRequests")
+   @Fallback(VoidOnNotFoundOr404.class)
+   void cancelSpotInstanceRequestsInRegion(
+         @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
+         @BinderParam(BindSpotInstanceRequestIdsToIndexedFormParams.class) String... requestIds);
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f3b8d3f/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/functions/CreatePlacementGroupIfNeeded.java
----------------------------------------------------------------------
diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/functions/CreatePlacementGroupIfNeeded.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/functions/CreatePlacementGroupIfNeeded.java
index 86eee54..0143aae 100644
--- a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/functions/CreatePlacementGroupIfNeeded.java
+++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/functions/CreatePlacementGroupIfNeeded.java
@@ -25,7 +25,7 @@ import javax.inject.Named;
 import javax.inject.Singleton;
 
 import org.jclouds.aws.AWSResponseException;
-import org.jclouds.aws.ec2.AWSEC2Client;
+import org.jclouds.aws.ec2.AWSEC2Api;
 import org.jclouds.aws.ec2.domain.PlacementGroup;
 import org.jclouds.aws.ec2.domain.PlacementGroup.State;
 import org.jclouds.compute.reference.ComputeServiceConstants;
@@ -44,13 +44,13 @@ public class CreatePlacementGroupIfNeeded extends CacheLoader<RegionAndName, Str
    @Resource
    @Named(ComputeServiceConstants.COMPUTE_LOGGER)
    protected Logger logger = Logger.NULL;
-   protected final AWSEC2Client ec2Client;
+   protected final AWSEC2Api ec2Api;
    protected final Predicate<PlacementGroup> placementGroupAvailable;
 
    @Inject
-   public CreatePlacementGroupIfNeeded(AWSEC2Client ec2Client,
+   public CreatePlacementGroupIfNeeded(AWSEC2Api ec2Api,
             @Named("AVAILABLE") Predicate<PlacementGroup> placementGroupAvailable) {
-      this.ec2Client = ec2Client;
+      this.ec2Api = ec2Api;
       this.placementGroupAvailable = placementGroupAvailable;
    }
 
@@ -65,7 +65,7 @@ public class CreatePlacementGroupIfNeeded extends CacheLoader<RegionAndName, Str
       checkNotNull(name, "name");
       logger.debug(">> creating placementGroup region(%s) name(%s)", region, name);
       try {
-         ec2Client.getPlacementGroupServices().createPlacementGroupInRegion(region, name);
+         ec2Api.getPlacementGroupApi().get().createPlacementGroupInRegion(region, name);
          logger.debug("<< created placementGroup(%s)", name);
          checkState(placementGroupAvailable.apply(new PlacementGroup(region, name, "cluster", State.PENDING)), String
                   .format("placementGroup region(%s) name(%s) failed to become available", region, name));

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f3b8d3f/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/functions/ImportOrReturnExistingKeypair.java
----------------------------------------------------------------------
diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/functions/ImportOrReturnExistingKeypair.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/functions/ImportOrReturnExistingKeypair.java
index f194cfa..52bef6c 100644
--- a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/functions/ImportOrReturnExistingKeypair.java
+++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/functions/ImportOrReturnExistingKeypair.java
@@ -24,7 +24,7 @@ import javax.inject.Inject;
 import javax.inject.Named;
 import javax.inject.Singleton;
 
-import org.jclouds.aws.ec2.AWSEC2Client;
+import org.jclouds.aws.ec2.AWSEC2Api;
 import org.jclouds.aws.ec2.domain.RegionNameAndPublicKeyMaterial;
 import org.jclouds.compute.reference.ComputeServiceConstants;
 import org.jclouds.ec2.domain.KeyPair;
@@ -43,11 +43,11 @@ public class ImportOrReturnExistingKeypair implements Function<RegionNameAndPubl
    @Resource
    @Named(ComputeServiceConstants.COMPUTE_LOGGER)
    protected Logger logger = Logger.NULL;
-   protected final AWSEC2Client ec2Client;
+   protected final AWSEC2Api ec2Api;
 
    @Inject
-   public ImportOrReturnExistingKeypair(AWSEC2Client ec2Client) {
-      this.ec2Client = ec2Client;
+   public ImportOrReturnExistingKeypair(AWSEC2Api ec2Api) {
+      this.ec2Api = ec2Api;
    }
 
    @Override
@@ -66,12 +66,12 @@ public class ImportOrReturnExistingKeypair implements Function<RegionNameAndPubl
       // as this command is idempotent, it should be ok
       while (keyPair == null)
          try {
-            keyPair = ec2Client.getKeyPairServices().importKeyPairInRegion(region, "jclouds#" + group,
+            keyPair = ec2Api.getKeyPairApi().get().importKeyPairInRegion(region, "jclouds#" + group,
                      publicKeyMaterial);
             keyPair = addFingerprintToKeyPair(publicKeyMaterial, keyPair);
             logger.debug("<< imported keyPair(%s)", keyPair);
          } catch (IllegalStateException e) {
-            keyPair = Iterables.getFirst(ec2Client.getKeyPairServices().describeKeyPairsInRegion(region,
+            keyPair = Iterables.getFirst(ec2Api.getKeyPairApi().get().describeKeyPairsInRegion(region,
                      "jclouds#" + group), null);
             if (keyPair != null) {
                keyPair = addFingerprintToKeyPair(publicKeyMaterial, keyPair);

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f3b8d3f/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/options/AWSRunInstancesOptions.java
----------------------------------------------------------------------
diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/options/AWSRunInstancesOptions.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/options/AWSRunInstancesOptions.java
index 92d4faf..5d06ba5 100644
--- a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/options/AWSRunInstancesOptions.java
+++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/options/AWSRunInstancesOptions.java
@@ -37,7 +37,7 @@ import com.google.common.collect.ImmutableSet;
  * <code>
  * import static org.jclouds.aws.ec2.options.RunInstancesOptions.Builder.*
  * <p/>
- * EC2Client connection = // get connection
+ * EC2Api connection = // get connection
  * Future<ReservationInfo> instances = connection.runInstances(executableBy("123125").imageIds(1000, 1004));
  * <code>
  * 

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f3b8d3f/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/options/CreateSecurityGroupOptions.java
----------------------------------------------------------------------
diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/options/CreateSecurityGroupOptions.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/options/CreateSecurityGroupOptions.java
index be409eb..3a929bf 100644
--- a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/options/CreateSecurityGroupOptions.java
+++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/options/CreateSecurityGroupOptions.java
@@ -30,7 +30,7 @@ import org.jclouds.ec2.options.internal.BaseEC2RequestOptions;
  * <code>
  * import static org.jclouds.aws.ec2.options.CreateSecurityGroupOptions.Builder.*
  * <p/>
- * AWSEC2Client connection = // get connection
+ * AWSEC2Api connection = // get connection
  * group = connection.getAMIServices().createSecurityGroup(vpcId("123125").noReboot());
  * <code>
  * 

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f3b8d3f/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/options/DescribeSpotPriceHistoryOptions.java
----------------------------------------------------------------------
diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/options/DescribeSpotPriceHistoryOptions.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/options/DescribeSpotPriceHistoryOptions.java
index d7cc9b1..228f681 100644
--- a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/options/DescribeSpotPriceHistoryOptions.java
+++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/options/DescribeSpotPriceHistoryOptions.java
@@ -33,7 +33,7 @@ import org.jclouds.ec2.options.internal.BaseEC2RequestOptions;
  * <code>
  * import static org.jclouds.aws.ec2.options.DescribeSpotPriceHistoryOptions.Builder.*
  * <p/>
- * AWSEC2Client client = // get connection
+ * AWSEC2Api client = // get connection
  * history = client.getSpotInstanceServices().describeSpotPriceHistoryInRegion(from(yesterday).instanceType("m1.small"));
  * <code>
  * 

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f3b8d3f/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/options/RequestSpotInstancesOptions.java
----------------------------------------------------------------------
diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/options/RequestSpotInstancesOptions.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/options/RequestSpotInstancesOptions.java
index 9bbe248..7f90269 100644
--- a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/options/RequestSpotInstancesOptions.java
+++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/options/RequestSpotInstancesOptions.java
@@ -34,7 +34,7 @@ import org.jclouds.ec2.options.internal.BaseEC2RequestOptions;
  * <code>
  * import static org.jclouds.aws.ec2.options.RequestSpotInstancesOptions.Builder.*
  * <p/>
- * AWSEC2Client client = // get connection
+ * AWSEC2Api client = // get connection
  * history = client.getSpotInstanceServices().requestSpotInstancesInRegion("us-east-1",validFrom(yesterday).type("m1.small"));
  * <code>
  * 

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f3b8d3f/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/predicates/PlacementGroupAvailable.java
----------------------------------------------------------------------
diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/predicates/PlacementGroupAvailable.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/predicates/PlacementGroupAvailable.java
index 5f9d024..c04b8d5 100644
--- a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/predicates/PlacementGroupAvailable.java
+++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/predicates/PlacementGroupAvailable.java
@@ -21,7 +21,7 @@ import java.util.NoSuchElementException;
 import javax.annotation.Resource;
 import javax.inject.Singleton;
 
-import org.jclouds.aws.ec2.AWSEC2Client;
+import org.jclouds.aws.ec2.AWSEC2Api;
 import org.jclouds.aws.ec2.domain.PlacementGroup;
 import org.jclouds.logging.Logger;
 import org.jclouds.rest.ResourceNotFoundException;
@@ -38,13 +38,13 @@ import com.google.inject.Inject;
 @Singleton
 public class PlacementGroupAvailable implements Predicate<PlacementGroup> {
 
-   private final AWSEC2Client client;
+   private final AWSEC2Api client;
 
    @Resource
    protected Logger logger = Logger.NULL;
 
    @Inject
-   public PlacementGroupAvailable(AWSEC2Client client) {
+   public PlacementGroupAvailable(AWSEC2Api client) {
       this.client = client;
    }
 
@@ -63,7 +63,7 @@ public class PlacementGroupAvailable implements Predicate<PlacementGroup> {
    }
 
    private PlacementGroup refresh(PlacementGroup group) {
-      return Iterables.getOnlyElement(client.getPlacementGroupServices().describePlacementGroupsInRegion(
+      return Iterables.getOnlyElement(client.getPlacementGroupApi().get().describePlacementGroupsInRegion(
                group.getRegion(), group.getName()));
    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f3b8d3f/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/predicates/PlacementGroupDeleted.java
----------------------------------------------------------------------
diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/predicates/PlacementGroupDeleted.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/predicates/PlacementGroupDeleted.java
index ad116f5..b8257eb 100644
--- a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/predicates/PlacementGroupDeleted.java
+++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/predicates/PlacementGroupDeleted.java
@@ -21,7 +21,7 @@ import java.util.NoSuchElementException;
 import javax.annotation.Resource;
 import javax.inject.Singleton;
 
-import org.jclouds.aws.ec2.AWSEC2Client;
+import org.jclouds.aws.ec2.AWSEC2Api;
 import org.jclouds.aws.ec2.domain.PlacementGroup;
 import org.jclouds.logging.Logger;
 
@@ -37,13 +37,13 @@ import com.google.inject.Inject;
 @Singleton
 public class PlacementGroupDeleted implements Predicate<PlacementGroup> {
 
-   private final AWSEC2Client client;
+   private final AWSEC2Api client;
 
    @Resource
    protected Logger logger = Logger.NULL;
 
    @Inject
-   public PlacementGroupDeleted(AWSEC2Client client) {
+   public PlacementGroupDeleted(AWSEC2Api client) {
       this.client = client;
    }
 
@@ -60,7 +60,7 @@ public class PlacementGroupDeleted implements Predicate<PlacementGroup> {
    }
 
    private PlacementGroup refresh(PlacementGroup group) {
-      return Iterables.getOnlyElement(client.getPlacementGroupServices().describePlacementGroupsInRegion(
+      return Iterables.getOnlyElement(client.getPlacementGroupApi().get().describePlacementGroupsInRegion(
                group.getRegion(), group.getName()));
    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f3b8d3f/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/predicates/SpotInstanceRequestActive.java
----------------------------------------------------------------------
diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/predicates/SpotInstanceRequestActive.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/predicates/SpotInstanceRequestActive.java
index 9ec31ae..8395161 100644
--- a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/predicates/SpotInstanceRequestActive.java
+++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/predicates/SpotInstanceRequestActive.java
@@ -21,7 +21,7 @@ import java.util.NoSuchElementException;
 import javax.annotation.Resource;
 import javax.inject.Singleton;
 
-import org.jclouds.aws.ec2.AWSEC2Client;
+import org.jclouds.aws.ec2.AWSEC2Api;
 import org.jclouds.aws.ec2.domain.SpotInstanceRequest;
 import org.jclouds.logging.Logger;
 import org.jclouds.rest.ResourceNotFoundException;
@@ -38,13 +38,13 @@ import com.google.inject.Inject;
 @Singleton
 public class SpotInstanceRequestActive implements Predicate<SpotInstanceRequest> {
 
-   private final AWSEC2Client client;
+   private final AWSEC2Api client;
 
    @Resource
    protected Logger logger = Logger.NULL;
 
    @Inject
-   public SpotInstanceRequestActive(AWSEC2Client client) {
+   public SpotInstanceRequestActive(AWSEC2Api client) {
       this.client = client;
    }
 
@@ -69,7 +69,7 @@ public class SpotInstanceRequestActive implements Predicate<SpotInstanceRequest>
    }
 
    private SpotInstanceRequest refresh(SpotInstanceRequest spot) {
-      return Iterables.getOnlyElement(client.getSpotInstanceServices().describeSpotInstanceRequestsInRegion(
+      return Iterables.getOnlyElement(client.getSpotInstanceApi().get().describeSpotInstanceRequestsInRegion(
                spot.getRegion(), spot.getId()));
    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f3b8d3f/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSAMIAsyncClient.java
----------------------------------------------------------------------
diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSAMIAsyncClient.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSAMIAsyncClient.java
deleted file mode 100644
index 0a1c48b..0000000
--- a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSAMIAsyncClient.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.aws.ec2.services;
-
-import static org.jclouds.aws.reference.FormParameters.ACTION;
-
-import java.util.Set;
-
-import javax.inject.Named;
-import javax.ws.rs.FormParam;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-
-import org.jclouds.aws.ec2.xml.ProductCodesHandler;
-import org.jclouds.aws.filters.FormSigner;
-import org.jclouds.ec2.binders.BindProductCodesToIndexedFormParams;
-import org.jclouds.ec2.services.AMIAsyncClient;
-import org.jclouds.javax.annotation.Nullable;
-import org.jclouds.location.functions.RegionToEndpointOrProviderIfNull;
-import org.jclouds.rest.annotations.BinderParam;
-import org.jclouds.rest.annotations.EndpointParam;
-import org.jclouds.rest.annotations.FormParams;
-import org.jclouds.rest.annotations.RequestFilters;
-import org.jclouds.rest.annotations.VirtualHost;
-import org.jclouds.rest.annotations.XMLResponseParser;
-
-import com.google.common.util.concurrent.ListenableFuture;
-
-/**
- * Provides access to AMI Services.
- * <p/>
- * 
- * @author Adrian Cole
- */
-@RequestFilters(FormSigner.class)
-@VirtualHost
-public interface AWSAMIAsyncClient extends AMIAsyncClient {
-   // TODO make AWSImage as it has product codes...
-
-   /**
-    * @see AMIClient#getProductCodesForImageInRegion
-    */
-   @Named("DescribeImageAttribute")
-   @POST
-   @Path("/")
-   @FormParams(keys = { ACTION, "Attribute" }, values = { "DescribeImageAttribute", "productCodes" })
-   @XMLResponseParser(ProductCodesHandler.class)
-   ListenableFuture<Set<String>> getProductCodesForImageInRegion(
-            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
-            @FormParam("ImageId") String imageId);
-
-   /**
-    * @see AMIClient#addProductCodesToImageInRegion
-    */
-   @Named("ModifyImageAttribute")
-   @POST
-   @Path("/")
-   @FormParams(keys = { ACTION, "OperationType", "Attribute" }, values = { "ModifyImageAttribute", "add",
-            "productCodes" })
-   ListenableFuture<Void> addProductCodesToImageInRegion(
-            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
-            @BinderParam(BindProductCodesToIndexedFormParams.class) Iterable<String> productCodes,
-            @FormParam("ImageId") String imageId);
-
-   /**
-    * @see AMIClient#removeProductCodesToImageInRegion
-    */
-   @Named("ModifyImageAttribute")
-   @POST
-   @Path("/")
-   @FormParams(keys = { ACTION, "OperationType", "Attribute" }, values = { "ModifyImageAttribute", "remove",
-            "productCodes" })
-   ListenableFuture<Void> removeProductCodesFromImageInRegion(
-            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
-            @BinderParam(BindProductCodesToIndexedFormParams.class) Iterable<String> productCodes,
-            @FormParam("ImageId") String imageId);
-}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f3b8d3f/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSAMIClient.java
----------------------------------------------------------------------
diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSAMIClient.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSAMIClient.java
deleted file mode 100644
index 75247ad..0000000
--- a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSAMIClient.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.aws.ec2.services;
-
-import java.util.Set;
-import org.jclouds.ec2.services.AMIClient;
-import org.jclouds.javax.annotation.Nullable;
-
-/**
- * Provides access to EC2 via their REST API.
- * <p/>
- * 
- * @author Adrian Cole
- */
-public interface AWSAMIClient extends AMIClient {
-
-
-   /**
-    * Returns the Product Codes of an image.
-    * 
-    * @param region
-    *           AMIs are tied to the Region where its files are located within Amazon S3.
-    * @param imageId
-    *           The ID of the AMI for which an attribute will be described
-    * @see #describeImages
-    * @see #modifyImageAttribute
-    * @see #resetImageAttribute
-    * @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeImageAttribute.html"
-    *      />
-    * @see DescribeImagesOptions
-    */
-   Set<String> getProductCodesForImageInRegion(@Nullable String region, String imageId);
-
-
-   /**
-    * Adds {@code productCode}s to an AMI.
-    * 
-    * @param region
-    *           AMIs are tied to the Region where its files are located within Amazon S3.
-    * @param productCodes
-    *           Product Codes
-    * @param imageId
-    *           The AMI ID.
-    * 
-    * @see #removeProductCodesFromImage
-    * @see #describeImageAttribute
-    * @see #resetImageAttribute
-    * @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-ModifyImageAttribute.html"
-    *      />
-    */
-   void addProductCodesToImageInRegion(@Nullable String region, Iterable<String> productCodes, String imageId);
-
-   /**
-    * Removes {@code productCode}s from an AMI.
-    * 
-    * @param region
-    *           AMIs are tied to the Region where its files are located within Amazon S3.
-    * @param productCodes
-    *           Product Codes
-    * @param imageId
-    *           The AMI ID.
-    * 
-    * @see #addProductCodesToImage
-    * @see #describeImageAttribute
-    * @see #resetImageAttribute
-    * @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-ModifyImageAttribute.html"
-    *      />
-    */
-   void removeProductCodesFromImageInRegion(@Nullable String region, Iterable<String> productCodes,
-            String imageId);
-}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f3b8d3f/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSInstanceAsyncClient.java
----------------------------------------------------------------------
diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSInstanceAsyncClient.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSInstanceAsyncClient.java
deleted file mode 100644
index de55b01..0000000
--- a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSInstanceAsyncClient.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.aws.ec2.services;
-
-import static org.jclouds.aws.reference.FormParameters.ACTION;
-
-import java.util.Set;
-
-import javax.inject.Named;
-import javax.ws.rs.FormParam;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-
-import org.jclouds.Fallbacks.EmptySetOnNotFoundOr404;
-import org.jclouds.aws.ec2.domain.AWSRunningInstance;
-import org.jclouds.aws.ec2.xml.AWSDescribeInstancesResponseHandler;
-import org.jclouds.aws.ec2.xml.AWSRunInstancesResponseHandler;
-import org.jclouds.aws.filters.FormSigner;
-import org.jclouds.ec2.binders.BindInstanceIdsToIndexedFormParams;
-import org.jclouds.ec2.binders.IfNotNullBindAvailabilityZoneToFormParam;
-import org.jclouds.ec2.domain.Reservation;
-import org.jclouds.ec2.options.RunInstancesOptions;
-import org.jclouds.ec2.services.InstanceAsyncClient;
-import org.jclouds.javax.annotation.Nullable;
-import org.jclouds.location.functions.RegionToEndpointOrProviderIfNull;
-import org.jclouds.rest.annotations.BinderParam;
-import org.jclouds.rest.annotations.EndpointParam;
-import org.jclouds.rest.annotations.Fallback;
-import org.jclouds.rest.annotations.FormParams;
-import org.jclouds.rest.annotations.RequestFilters;
-import org.jclouds.rest.annotations.VirtualHost;
-import org.jclouds.rest.annotations.XMLResponseParser;
-
-import com.google.common.util.concurrent.ListenableFuture;
-
-/**
- * Provides access to EC2 Instance Services via their REST API.
- * <p/>
- * 
- * @author Adrian Cole
- */
-@RequestFilters(FormSigner.class)
-@VirtualHost
-public interface AWSInstanceAsyncClient extends InstanceAsyncClient {
-
-   /**
-    * @see AWSInstanceClient#describeInstancesInRegion
-    */
-   @Named("DescribeInstances")
-   @Override
-   @POST
-   @Path("/")
-   @FormParams(keys = ACTION, values = "DescribeInstances")
-   @XMLResponseParser(AWSDescribeInstancesResponseHandler.class)
-   @Fallback(EmptySetOnNotFoundOr404.class)
-   ListenableFuture<Set<? extends Reservation<? extends AWSRunningInstance>>> describeInstancesInRegion(
-            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
-            @BinderParam(BindInstanceIdsToIndexedFormParams.class) String... instanceIds);
-
-   /**
-    * @see AWSInstanceClient#runInstancesInRegion
-    */
-   @Named("RunInstances")
-   @Override
-   @POST
-   @Path("/")
-   @FormParams(keys = ACTION, values = "RunInstances")
-   @XMLResponseParser(AWSRunInstancesResponseHandler.class)
-   ListenableFuture<Reservation<? extends AWSRunningInstance>> runInstancesInRegion(
-            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
-            @Nullable @BinderParam(IfNotNullBindAvailabilityZoneToFormParam.class) String nullableAvailabilityZone,
-            @FormParam("ImageId") String imageId, @FormParam("MinCount") int minCount,
-            @FormParam("MaxCount") int maxCount, RunInstancesOptions... options);
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f3b8d3f/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSInstanceClient.java
----------------------------------------------------------------------
diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSInstanceClient.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSInstanceClient.java
deleted file mode 100644
index deb911b..0000000
--- a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSInstanceClient.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.aws.ec2.services;
-
-import java.util.Set;
-import org.jclouds.aws.ec2.domain.AWSRunningInstance;
-import org.jclouds.ec2.domain.Reservation;
-import org.jclouds.ec2.options.RunInstancesOptions;
-import org.jclouds.ec2.services.InstanceClient;
-import org.jclouds.javax.annotation.Nullable;
-
-/**
- * Provides access to EC2 via their REST API.
- * <p/>
- * 
- * @author Adrian Cole
- */
-public interface AWSInstanceClient extends InstanceClient {
-
-   @Override
-   Set<? extends Reservation<? extends AWSRunningInstance>> describeInstancesInRegion(@Nullable String region,
-            String... instanceIds);
-
-   @Override
-   Reservation<? extends AWSRunningInstance> runInstancesInRegion(@Nullable String region,
-            @Nullable String nullableAvailabilityZone, String imageId, int minCount, int maxCount,
-            RunInstancesOptions... options);
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f3b8d3f/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSKeyPairAsyncClient.java
----------------------------------------------------------------------
diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSKeyPairAsyncClient.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSKeyPairAsyncClient.java
deleted file mode 100644
index 8cb9abd..0000000
--- a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSKeyPairAsyncClient.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.aws.ec2.services;
-
-import static org.jclouds.aws.reference.FormParameters.ACTION;
-
-import javax.inject.Named;
-import javax.ws.rs.FormParam;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-
-import org.jclouds.aws.filters.FormSigner;
-import org.jclouds.ec2.domain.KeyPair;
-import org.jclouds.ec2.functions.EncodedRSAPublicKeyToBase64;
-import org.jclouds.ec2.services.KeyPairAsyncClient;
-import org.jclouds.ec2.xml.KeyPairResponseHandler;
-import org.jclouds.javax.annotation.Nullable;
-import org.jclouds.location.functions.RegionToEndpointOrProviderIfNull;
-import org.jclouds.rest.annotations.EndpointParam;
-import org.jclouds.rest.annotations.FormParams;
-import org.jclouds.rest.annotations.ParamParser;
-import org.jclouds.rest.annotations.RequestFilters;
-import org.jclouds.rest.annotations.VirtualHost;
-import org.jclouds.rest.annotations.XMLResponseParser;
-
-import com.google.common.util.concurrent.ListenableFuture;
-
-/**
- * @author Adrian Cole
- */
-@RequestFilters(FormSigner.class)
-@VirtualHost
-public interface AWSKeyPairAsyncClient extends KeyPairAsyncClient {
-
-   /**
-    * @see AWSKeyPairClient#importKeyPairInRegion
-    */
-   @Named("ImportKeyPair")
-   @POST
-   @Path("/")
-   @FormParams(keys = ACTION, values = "ImportKeyPair")
-   @XMLResponseParser(KeyPairResponseHandler.class)
-   ListenableFuture<KeyPair> importKeyPairInRegion(
-         @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
-         @FormParam("KeyName") String keyName,
-         @FormParam("PublicKeyMaterial") @ParamParser(EncodedRSAPublicKeyToBase64.class) String publicKeyMaterial);
-}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f3b8d3f/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSKeyPairClient.java
----------------------------------------------------------------------
diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSKeyPairClient.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSKeyPairClient.java
deleted file mode 100644
index 3d23d0b..0000000
--- a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSKeyPairClient.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.aws.ec2.services;
-
-import org.jclouds.ec2.domain.KeyPair;
-import org.jclouds.ec2.services.KeyPairClient;
-import org.jclouds.javax.annotation.Nullable;
-
-/**
- * 
- * @author Adrian Cole
- */
-public interface AWSKeyPairClient extends KeyPairClient {
-
-   /**
-    * Imports the public key from an RSA key pair that you created with a third-party tool. Compare
-    * this with CreateKeyPair, in which AWS creates the key pair and gives the keys to you (AWS
-    * keeps a copy of the public key). With ImportKeyPair, you create the key pair and give AWS just
-    * the public key. The private key is never transferred between you and AWS.
-    * 
-    * <p/>
-    * You can easily create an RSA key pair on Windows and Linux using the ssh-keygen command line
-    * tool (provided with the standard OpenSSH installation). Standard library support for RSA key
-    * pair creation is also available in Java, Ruby, Python, and many other programming languages.
-    * 
-    * <p/>
-    * <h4>Supported Formats</h4>
-    * <ul>
-    * <li>OpenSSH public key format (e.g., the format in ~/.ssh/authorized_keys)</li>
-    * <li>Base64 encoded DER format</li>
-    * <li>SSH public key file format as specified in RFC4716</li>
-    * </ul>
-    * DSA keys are not supported. Make sure your key generator is set up to create RSA keys.
-    * <p/>
-    * Supported lengths: 1024, 2048, and 4096.
-    * <p/>
-    * 
-    * @param region
-    *           region to import the key into
-    * @param keyName
-    *           A unique name for the key pair. Accepts alphanumeric characters, spaces, dashes, and
-    *           underscores.
-    * @param publicKeyMaterial
-    *           The public key
-    * @return imported key including fingerprint
-    */
-   KeyPair importKeyPairInRegion(@Nullable String region, String keyName, String publicKeyMaterial);
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f3b8d3f/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSSecurityGroupAsyncClient.java
----------------------------------------------------------------------
diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSSecurityGroupAsyncClient.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSSecurityGroupAsyncClient.java
deleted file mode 100644
index 25acb03..0000000
--- a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSSecurityGroupAsyncClient.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.aws.ec2.services;
-
-import static org.jclouds.aws.reference.FormParameters.ACTION;
-
-import java.util.Set;
-
-import javax.inject.Named;
-import javax.ws.rs.FormParam;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-
-import org.jclouds.Fallbacks.EmptySetOnNotFoundOr404;
-import org.jclouds.Fallbacks.VoidOnNotFoundOr404;
-import org.jclouds.aws.ec2.options.CreateSecurityGroupOptions;
-import org.jclouds.aws.ec2.xml.CreateSecurityGroupResponseHandler;
-import org.jclouds.aws.filters.FormSigner;
-import org.jclouds.ec2.binders.BindGroupIdsToIndexedFormParams;
-import org.jclouds.ec2.binders.BindIpPermissionToIndexedFormParams;
-import org.jclouds.ec2.binders.BindIpPermissionsToIndexedFormParams;
-import org.jclouds.ec2.domain.SecurityGroup;
-import org.jclouds.ec2.services.SecurityGroupAsyncClient;
-import org.jclouds.ec2.xml.DescribeSecurityGroupsResponseHandler;
-import org.jclouds.javax.annotation.Nullable;
-import org.jclouds.location.functions.RegionToEndpointOrProviderIfNull;
-import org.jclouds.net.domain.IpPermission;
-import org.jclouds.rest.annotations.BinderParam;
-import org.jclouds.rest.annotations.EndpointParam;
-import org.jclouds.rest.annotations.Fallback;
-import org.jclouds.rest.annotations.FormParams;
-import org.jclouds.rest.annotations.RequestFilters;
-import org.jclouds.rest.annotations.VirtualHost;
-import org.jclouds.rest.annotations.XMLResponseParser;
-
-import com.google.common.annotations.Beta;
-import com.google.common.util.concurrent.ListenableFuture;
-
-/**
- * Provides access to EC2 SecurityGroup Services via their REST API.
- * <p/>
- * 
- * @author Adrian Cole
- */
-@RequestFilters(FormSigner.class)
-@VirtualHost
-@Beta
-public interface AWSSecurityGroupAsyncClient extends SecurityGroupAsyncClient {
-   /**
-    * @see AWSSecurityGroupClient#createSecurityGroupInRegion
-    */
-   @Named("CreateSecurityGroup")
-   @POST
-   @Path("/")
-   @XMLResponseParser(CreateSecurityGroupResponseHandler.class)
-   @FormParams(keys = ACTION, values = "CreateSecurityGroup")
-   ListenableFuture<String> createSecurityGroupInRegionAndReturnId(
-         @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
-         @FormParam("GroupName") String name, @FormParam("GroupDescription") String description,
-         CreateSecurityGroupOptions... options);
-
-   /**
-    * @see AWSSecurityGroupClient#authorizeSecurityGroupIngressInRegion(String,
-    *      String,IpPermission)
-    */
-   @Named("AuthorizeSecurityGroupIngress")
-   @POST
-   @Path("/")
-   @FormParams(keys = ACTION, values = "AuthorizeSecurityGroupIngress")
-   ListenableFuture<Void> authorizeSecurityGroupIngressInRegion(
-         @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
-         @FormParam("GroupId") String groupId, @BinderParam(BindIpPermissionToIndexedFormParams.class) IpPermission perm);
-
-   /**
-    * @see AWSSecurityGroupClient#authorizeSecurityGroupIngressInRegion(String,
-    *      String,Iterable)
-    */
-   @Named("AuthorizeSecurityGroupIngress")
-   @POST
-   @Path("/")
-   @FormParams(keys = ACTION, values = "AuthorizeSecurityGroupIngress")
-   ListenableFuture<Void> authorizeSecurityGroupIngressInRegion(
-         @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
-         @FormParam("GroupId") String groupId,
-         @BinderParam(BindIpPermissionsToIndexedFormParams.class) Iterable<IpPermission> perms);
-
-   /**
-    * @see AWSSecurityGroupClient#revokeSecurityGroupIngressInRegion(@Nullable
-    *      Region, String,IpPermission)
-    */
-   @Named("RevokeSecurityGroupIngress")
-   @POST
-   @Path("/")
-   @FormParams(keys = ACTION, values = "RevokeSecurityGroupIngress")
-   ListenableFuture<Void> revokeSecurityGroupIngressInRegion(
-         @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
-         @FormParam("GroupId") String groupId, @BinderParam(BindIpPermissionToIndexedFormParams.class) IpPermission perm);
-
-   /**
-    * @see AWSSecurityGroupClient#revokeSecurityGroupIngressInRegion(@Nullable
-    *      Region, String,Iterable)
-    */
-   @Named("RevokeSecurityGroupIngress")
-   @POST
-   @Path("/")
-   @FormParams(keys = ACTION, values = "RevokeSecurityGroupIngress")
-   ListenableFuture<Void> revokeSecurityGroupIngressInRegion(
-         @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
-         @FormParam("GroupId") String groupId,
-         @BinderParam(BindIpPermissionsToIndexedFormParams.class) Iterable<IpPermission> perms);
-
-   /**
-    * @see AWSSecurityGroupClient#deleteSecurityGroupInRegionById
-    */
-   @Named("DeleteSecurityGroup")
-   @POST
-   @Path("/")
-   @FormParams(keys = ACTION, values = "DeleteSecurityGroup")
-   @Fallback(VoidOnNotFoundOr404.class)
-   ListenableFuture<Void> deleteSecurityGroupInRegionById(
-            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region, @FormParam("GroupId") String name);
-
-   /**
-    * @see AWSSecurityGroupClient#describeSecurityGroupsInRegionById
-    */
-   @Named("DescribeSecurityGroups")
-   @POST
-   @Path("/")
-   @FormParams(keys = ACTION, values = "DescribeSecurityGroups")
-   @XMLResponseParser(DescribeSecurityGroupsResponseHandler.class)
-   @Fallback(EmptySetOnNotFoundOr404.class)
-   ListenableFuture<? extends Set<SecurityGroup>> describeSecurityGroupsInRegionById(
-            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
-            @BinderParam(BindGroupIdsToIndexedFormParams.class) String... securityGroupNames);
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f3b8d3f/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSSecurityGroupClient.java
----------------------------------------------------------------------
diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSSecurityGroupClient.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSSecurityGroupClient.java
deleted file mode 100644
index ac3b301..0000000
--- a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSSecurityGroupClient.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.aws.ec2.services;
-
-import java.util.Set;
-import org.jclouds.aws.ec2.options.CreateSecurityGroupOptions;
-import org.jclouds.ec2.domain.SecurityGroup;
-import org.jclouds.ec2.services.SecurityGroupClient;
-import org.jclouds.javax.annotation.Nullable;
-import org.jclouds.net.domain.IpPermission;
-
-import com.google.common.annotations.Beta;
-
-/**
- * Provides access to EC2 via their REST API.
- * <p/>
- * 
- * @author Adrian Cole
- */
-@Beta
-public interface AWSSecurityGroupClient extends SecurityGroupClient {
-   
-   String createSecurityGroupInRegionAndReturnId(@Nullable String region, String name, String desc,
-         CreateSecurityGroupOptions... options);
-
-   void authorizeSecurityGroupIngressInRegion(@Nullable String region, String groupId, IpPermission perm);
-
-   void authorizeSecurityGroupIngressInRegion(@Nullable String region, String groupId, Iterable<IpPermission> perm);
-
-   void revokeSecurityGroupIngressInRegion(@Nullable String region, String groupId, IpPermission perm);
-
-   void revokeSecurityGroupIngressInRegion(@Nullable String region, String groupId, Iterable<IpPermission> perm);
-
-   Set<SecurityGroup> describeSecurityGroupsInRegionById(@Nullable String region, String... securityGroupIds);
-
-   void deleteSecurityGroupInRegionById(@Nullable String region, String name);
-}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f3b8d3f/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/MonitoringAsyncClient.java
----------------------------------------------------------------------
diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/MonitoringAsyncClient.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/MonitoringAsyncClient.java
deleted file mode 100644
index 61d96b4..0000000
--- a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/MonitoringAsyncClient.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.aws.ec2.services;
-
-import static org.jclouds.aws.reference.FormParameters.ACTION;
-
-import java.util.Map;
-
-import javax.inject.Named;
-import javax.ws.rs.FormParam;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-
-import org.jclouds.aws.ec2.domain.MonitoringState;
-import org.jclouds.aws.ec2.xml.MonitoringStateHandler;
-import org.jclouds.aws.filters.FormSigner;
-import org.jclouds.ec2.binders.BindInstanceIdsToIndexedFormParams;
-import org.jclouds.javax.annotation.Nullable;
-import org.jclouds.location.functions.RegionToEndpointOrProviderIfNull;
-import org.jclouds.rest.annotations.BinderParam;
-import org.jclouds.rest.annotations.EndpointParam;
-import org.jclouds.rest.annotations.FormParams;
-import org.jclouds.rest.annotations.RequestFilters;
-import org.jclouds.rest.annotations.VirtualHost;
-import org.jclouds.rest.annotations.XMLResponseParser;
-
-import com.google.common.util.concurrent.ListenableFuture;
-
-/**
- * Provides access to EC2 Monitoring Services via their REST API.
- * <p/>
- * 
- * @author Adrian Cole
- */
-@RequestFilters(FormSigner.class)
-@VirtualHost
-public interface MonitoringAsyncClient {
-
-   /**
-    * @see Monitoring#monitorInstancesInRegion
-    */
-   @Named("MonitorInstances")
-   @POST
-   @Path("/")
-   @FormParams(keys = ACTION, values = "MonitorInstances")
-   @XMLResponseParser(MonitoringStateHandler.class)
-   ListenableFuture<? extends Map<String, MonitoringState>> monitorInstancesInRegion(
-            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
-            @FormParam("InstanceId.0") String instanceId,
-            @BinderParam(BindInstanceIdsToIndexedFormParams.class) String... instanceIds);
-
-   /**
-    * @see Monitoring#monitorInstancesInRegion
-    */
-   @Named("UnmonitorInstances")
-   @POST
-   @Path("/")
-   @FormParams(keys = ACTION, values = "UnmonitorInstances")
-   @XMLResponseParser(MonitoringStateHandler.class)
-   ListenableFuture<? extends Map<String, MonitoringState>> unmonitorInstancesInRegion(
-            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
-            @FormParam("InstanceId.0") String instanceId,
-            @BinderParam(BindInstanceIdsToIndexedFormParams.class) String... instanceIds);
-}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f3b8d3f/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/MonitoringClient.java
----------------------------------------------------------------------
diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/MonitoringClient.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/MonitoringClient.java
deleted file mode 100644
index 66c44ee..0000000
--- a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/MonitoringClient.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.aws.ec2.services;
-
-import java.util.Map;
-import org.jclouds.aws.ec2.domain.MonitoringState;
-import org.jclouds.javax.annotation.Nullable;
-
-/**
- * Provides monitoring services for EC2. For more information, refer to the Amazon CloudWatch
- * Developer Guide.
- * <p/>
- * 
- * @author Adrian Cole
- */
-public interface MonitoringClient {
-
-   /**
-    * Enables monitoring for a running instance. For more information, refer to the Amazon
-    * CloudWatch Developer Guide.
-    * 
-    * @param region
-    *           Instances are tied to Availability Zones. However, the instance ID is tied to the
-    *           Region.
-    * @see InstanceClient#runInstances
-    * @see #unmonitorInstances
-    * 
-    * @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-MonitorInstances.html"
-    *      />
-    */
-   Map<String, MonitoringState> monitorInstancesInRegion(@Nullable String region, String instanceId,
-            String... instanceIds);
-
-   /**
-    * Disables monitoring for a running instance. For more information, refer to the Amazon
-    * CloudWatch Developer Guide.
-    * 
-    * @param region
-    *           Instances are tied to Availability Zones. However, the instance ID is tied to the
-    *           Region.
-    * 
-    * @see InstanceClient#runInstances
-    * @see #monitorInstances
-    * 
-    * @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-UnmonitorInstances.html"
-    *      />
-    */
-   Map<String, MonitoringState> unmonitorInstancesInRegion(@Nullable String region, String instanceId,
-            String... instanceIds);
-}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f3b8d3f/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/PlacementGroupAsyncClient.java
----------------------------------------------------------------------
diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/PlacementGroupAsyncClient.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/PlacementGroupAsyncClient.java
deleted file mode 100644
index bd79cb4..0000000
--- a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/PlacementGroupAsyncClient.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.aws.ec2.services;
-
-import static org.jclouds.aws.reference.FormParameters.ACTION;
-
-import java.util.Set;
-
-import javax.inject.Named;
-import javax.ws.rs.FormParam;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-
-import org.jclouds.Fallbacks.EmptySetOnNotFoundOr404;
-import org.jclouds.Fallbacks.VoidOnNotFoundOr404;
-import org.jclouds.aws.ec2.domain.PlacementGroup;
-import org.jclouds.aws.ec2.xml.DescribePlacementGroupsResponseHandler;
-import org.jclouds.aws.filters.FormSigner;
-import org.jclouds.ec2.binders.BindGroupNamesToIndexedFormParams;
-import org.jclouds.javax.annotation.Nullable;
-import org.jclouds.location.functions.RegionToEndpointOrProviderIfNull;
-import org.jclouds.rest.annotations.BinderParam;
-import org.jclouds.rest.annotations.EndpointParam;
-import org.jclouds.rest.annotations.Fallback;
-import org.jclouds.rest.annotations.FormParams;
-import org.jclouds.rest.annotations.RequestFilters;
-import org.jclouds.rest.annotations.VirtualHost;
-import org.jclouds.rest.annotations.XMLResponseParser;
-
-import com.google.common.util.concurrent.ListenableFuture;
-
-/**
- * Provides access to EC2 Placement Groups via their REST API.
- * <p/>
- * 
- * @author Adrian Cole
- */
-@RequestFilters(FormSigner.class)
-@VirtualHost
-public interface PlacementGroupAsyncClient {
-
-   /**
-    * @see PlacementGroupClient#createPlacementGroupInRegion(String,String,String)
-    */
-   @Named("CreatePlacementGroup")
-   @POST
-   @Path("/")
-   @FormParams(keys = ACTION, values = "CreatePlacementGroup")
-   ListenableFuture<Void> createPlacementGroupInRegion(
-            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
-            @FormParam("GroupName") String name, @FormParam("Strategy") String strategy);
-
-   /**
-    * @see PlacementGroupClient#createPlacementGroupInRegion(String,String)
-    */
-   @Named("CreatePlacementGroup")
-   @POST
-   @Path("/")
-   @FormParams(keys = { ACTION, "Strategy" }, values = { "CreatePlacementGroup", "cluster" })
-   ListenableFuture<Void> createPlacementGroupInRegion(
-            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region, @FormParam("GroupName") String name);
-
-   /**
-    * @see PlacementGroupClient#deletePlacementGroupInRegion
-    */
-   @Named("DeletePlacementGroup")
-   @POST
-   @Path("/")
-   @FormParams(keys = ACTION, values = "DeletePlacementGroup")
-   @Fallback(VoidOnNotFoundOr404.class)
-   ListenableFuture<Void> deletePlacementGroupInRegion(
-            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region, @FormParam("GroupName") String name);
-
-   /**
-    * @see PlacementGroupClient#describePlacementGroupsInRegion
-    */
-   @Named("DescribePlacementGroups")
-   @POST
-   @Path("/")
-   @FormParams(keys = ACTION, values = "DescribePlacementGroups")
-   @XMLResponseParser(DescribePlacementGroupsResponseHandler.class)
-   @Fallback(EmptySetOnNotFoundOr404.class)
-   ListenableFuture<? extends Set<PlacementGroup>> describePlacementGroupsInRegion(
-            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
-            @BinderParam(BindGroupNamesToIndexedFormParams.class) String... placementGroupIds);
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f3b8d3f/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/PlacementGroupClient.java
----------------------------------------------------------------------
diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/PlacementGroupClient.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/PlacementGroupClient.java
deleted file mode 100644
index 3dfd8cc..0000000
--- a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/PlacementGroupClient.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.aws.ec2.services;
-
-import java.util.Set;
-import org.jclouds.aws.ec2.domain.PlacementGroup;
-import org.jclouds.javax.annotation.Nullable;
-
-/**
- * Provides Placement Group services for EC2. For more information, refer to the Amazon EC2
- * Developer Guide.
- * <p/>
- * 
- * @author Adrian Cole
- */
-public interface PlacementGroupClient {
-
-   /**
-    * Creates a placement group that you launch cluster compute instances into. You must give the
-    * group a name unique within the scope of your account.
-    * 
-    * @param region
-    *           Region to create the placement group in.
-    * @param name
-    *           The name of the placement group..
-    * @param strategy
-    *           The placement group strategy.
-    * @see #describePlacementGroupsInRegion
-    * @see #deletePlacementGroupInRegion
-    * 
-    * @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-CreatePlacementGroup.html"
-    *      />
-    */
-   void createPlacementGroupInRegion(@Nullable String region, String name, String strategy);
-
-   /**
-    * like {@link #createPlacementGroupInRegion(String,String,String) except that the strategy is default: "cluster".
-    */
-   void createPlacementGroupInRegion(@Nullable String region, String name);
-   
-   /**
-    * Deletes a placement group from your account. You must terminate all instances in the placement group before deleting it.
-    * 
-    * @param region
-    *           Region to delete the placement from from
-    * @param name
-    *           Name of the security group to delete.
-    * 
-    * @see #describePlacementGroupsInRegion
-    * @see #createPlacementGroupInRegion
-    * 
-    * @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DeletePlacementGroup.html"
-    *      />
-    */
-   void deletePlacementGroupInRegion(@Nullable String region, String name);
-
-   /**
-    * 
-    * Returns information about one or more placement groups in your account.
-    * 
-    * @param region
-    *           The bundleTask ID is tied to the Region.
-    * @param groupNames
-    *           The name of the placement group. You can specify more than one in the request, or
-    *           omit the parameter if you want information about all your placement groups. By
-    *           default, all placement groups are described
-    * 
-    * @see #deletePlacementGroupInRegion
-    * @see #createPlacementGroupInRegion
-    * @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribePlacementGroups.html"
-    *      />
-    */
-   Set<PlacementGroup> describePlacementGroupsInRegion(@Nullable String region,
-            String... groupNames);
-}