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:24 UTC

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

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f3b8d3f/apis/ec2/src/main/java/org/jclouds/ec2/compute/strategy/EC2RebootNodeStrategy.java
----------------------------------------------------------------------
diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/compute/strategy/EC2RebootNodeStrategy.java b/apis/ec2/src/main/java/org/jclouds/ec2/compute/strategy/EC2RebootNodeStrategy.java
index 8ea07e4..c8cafc0 100644
--- a/apis/ec2/src/main/java/org/jclouds/ec2/compute/strategy/EC2RebootNodeStrategy.java
+++ b/apis/ec2/src/main/java/org/jclouds/ec2/compute/strategy/EC2RebootNodeStrategy.java
@@ -23,8 +23,8 @@ import org.jclouds.aws.util.AWSUtils;
 import org.jclouds.compute.domain.NodeMetadata;
 import org.jclouds.compute.strategy.GetNodeMetadataStrategy;
 import org.jclouds.compute.strategy.RebootNodeStrategy;
-import org.jclouds.ec2.EC2Client;
-import org.jclouds.ec2.services.InstanceClient;
+import org.jclouds.ec2.EC2Api;
+import org.jclouds.ec2.features.InstanceApi;
 
 /**
  * 
@@ -32,12 +32,12 @@ import org.jclouds.ec2.services.InstanceClient;
  */
 @Singleton
 public class EC2RebootNodeStrategy implements RebootNodeStrategy {
-   private final InstanceClient client;
+   private final InstanceApi client;
    private final GetNodeMetadataStrategy getNode;
 
    @Inject
-   protected EC2RebootNodeStrategy(EC2Client client, GetNodeMetadataStrategy getNode) {
-      this.client = client.getInstanceServices();
+   protected EC2RebootNodeStrategy(EC2Api client, GetNodeMetadataStrategy getNode) {
+      this.client = client.getInstanceApi().get();
       this.getNode = getNode;
    }
 

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f3b8d3f/apis/ec2/src/main/java/org/jclouds/ec2/compute/strategy/EC2ResumeNodeStrategy.java
----------------------------------------------------------------------
diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/compute/strategy/EC2ResumeNodeStrategy.java b/apis/ec2/src/main/java/org/jclouds/ec2/compute/strategy/EC2ResumeNodeStrategy.java
index ef6e085..5ecccfc 100644
--- a/apis/ec2/src/main/java/org/jclouds/ec2/compute/strategy/EC2ResumeNodeStrategy.java
+++ b/apis/ec2/src/main/java/org/jclouds/ec2/compute/strategy/EC2ResumeNodeStrategy.java
@@ -23,8 +23,8 @@ import org.jclouds.aws.util.AWSUtils;
 import org.jclouds.compute.domain.NodeMetadata;
 import org.jclouds.compute.strategy.GetNodeMetadataStrategy;
 import org.jclouds.compute.strategy.ResumeNodeStrategy;
-import org.jclouds.ec2.EC2Client;
-import org.jclouds.ec2.services.InstanceClient;
+import org.jclouds.ec2.EC2Api;
+import org.jclouds.ec2.features.InstanceApi;
 
 /**
  * 
@@ -32,12 +32,12 @@ import org.jclouds.ec2.services.InstanceClient;
  */
 @Singleton
 public class EC2ResumeNodeStrategy implements ResumeNodeStrategy {
-   private final InstanceClient client;
+   private final InstanceApi client;
    private final GetNodeMetadataStrategy getNode;
 
    @Inject
-   protected EC2ResumeNodeStrategy(EC2Client client, GetNodeMetadataStrategy getNode) {
-      this.client = client.getInstanceServices();
+   protected EC2ResumeNodeStrategy(EC2Api client, GetNodeMetadataStrategy getNode) {
+      this.client = client.getInstanceApi().get();
       this.getNode = getNode;
    }
 

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f3b8d3f/apis/ec2/src/main/java/org/jclouds/ec2/compute/strategy/EC2SuspendNodeStrategy.java
----------------------------------------------------------------------
diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/compute/strategy/EC2SuspendNodeStrategy.java b/apis/ec2/src/main/java/org/jclouds/ec2/compute/strategy/EC2SuspendNodeStrategy.java
index 5a30f97..cf9edd9 100644
--- a/apis/ec2/src/main/java/org/jclouds/ec2/compute/strategy/EC2SuspendNodeStrategy.java
+++ b/apis/ec2/src/main/java/org/jclouds/ec2/compute/strategy/EC2SuspendNodeStrategy.java
@@ -23,8 +23,8 @@ import org.jclouds.aws.util.AWSUtils;
 import org.jclouds.compute.domain.NodeMetadata;
 import org.jclouds.compute.strategy.GetNodeMetadataStrategy;
 import org.jclouds.compute.strategy.SuspendNodeStrategy;
-import org.jclouds.ec2.EC2Client;
-import org.jclouds.ec2.services.InstanceClient;
+import org.jclouds.ec2.EC2Api;
+import org.jclouds.ec2.features.InstanceApi;
 
 /**
  * 
@@ -32,12 +32,12 @@ import org.jclouds.ec2.services.InstanceClient;
  */
 @Singleton
 public class EC2SuspendNodeStrategy implements SuspendNodeStrategy {
-   private final InstanceClient client;
+   private final InstanceApi client;
    private final GetNodeMetadataStrategy getNode;
 
    @Inject
-   protected EC2SuspendNodeStrategy(EC2Client client, GetNodeMetadataStrategy getNode) {
-      this.client = client.getInstanceServices();
+   protected EC2SuspendNodeStrategy(EC2Api client, GetNodeMetadataStrategy getNode) {
+      this.client = client.getInstanceApi().get();
       this.getNode = getNode;
    }
 

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f3b8d3f/apis/ec2/src/main/java/org/jclouds/ec2/config/BaseEC2HttpApiModule.java
----------------------------------------------------------------------
diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/config/BaseEC2HttpApiModule.java b/apis/ec2/src/main/java/org/jclouds/ec2/config/BaseEC2HttpApiModule.java
new file mode 100644
index 0000000..d976221
--- /dev/null
+++ b/apis/ec2/src/main/java/org/jclouds/ec2/config/BaseEC2HttpApiModule.java
@@ -0,0 +1,78 @@
+/*
+ * 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.ec2.config;
+
+import static org.jclouds.reflect.Reflection2.typeToken;
+import static org.jclouds.rest.config.BinderUtils.bindHttpApi;
+
+import java.util.Map;
+
+import javax.inject.Singleton;
+
+import org.jclouds.aws.config.FormSigningHttpApiModule;
+import org.jclouds.ec2.EC2Api;
+import org.jclouds.ec2.features.SubnetApi;
+import org.jclouds.ec2.features.TagApi;
+import org.jclouds.ec2.features.WindowsApi;
+import org.jclouds.ec2.features.AMIApi;
+import org.jclouds.ec2.features.AvailabilityZoneAndRegionApi;
+import org.jclouds.ec2.features.ElasticBlockStoreApi;
+import org.jclouds.ec2.features.ElasticIPAddressApi;
+import org.jclouds.ec2.features.InstanceApi;
+import org.jclouds.ec2.features.KeyPairApi;
+import org.jclouds.ec2.features.SecurityGroupApi;
+import org.jclouds.ec2.suppliers.DescribeAvailabilityZonesInRegion;
+import org.jclouds.ec2.suppliers.DescribeRegionsForRegionURIs;
+import org.jclouds.location.config.LocationModule;
+import org.jclouds.location.suppliers.RegionIdToURISupplier;
+import org.jclouds.location.suppliers.RegionIdToZoneIdsSupplier;
+import org.jclouds.location.suppliers.RegionIdsSupplier;
+import org.jclouds.location.suppliers.ZoneIdToURISupplier;
+import org.jclouds.location.suppliers.ZoneIdsSupplier;
+import org.jclouds.location.suppliers.derived.RegionIdsFromRegionIdToURIKeySet;
+import org.jclouds.location.suppliers.derived.ZoneIdToURIFromJoinOnRegionIdToURI;
+import org.jclouds.location.suppliers.derived.ZoneIdsFromRegionIdToZoneIdsValues;
+import org.jclouds.rest.ConfiguresHttpApi;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.reflect.TypeToken;
+import com.google.inject.Provides;
+import com.google.inject.Scopes;
+
+/**
+ * Configures the EC2 connection.
+ * 
+ * @author Adrian Cole (EDIT: Nick Terry nterry@familysearch.org)
+ */
+@ConfiguresHttpApi
+public abstract class BaseEC2HttpApiModule<A extends EC2Api> extends
+         FormSigningHttpApiModule<A> {
+
+   protected BaseEC2HttpApiModule(Class<A> api) {
+      super(api);
+   }
+
+   @Override
+   protected void installLocations() {
+      install(new LocationModule());
+      bind(RegionIdToZoneIdsSupplier.class).to(DescribeAvailabilityZonesInRegion.class).in(Scopes.SINGLETON);
+      bind(RegionIdToURISupplier.class).to(DescribeRegionsForRegionURIs.class).in(Scopes.SINGLETON);
+      bind(ZoneIdsSupplier.class).to(ZoneIdsFromRegionIdToZoneIdsValues.class).in(Scopes.SINGLETON);
+      bind(RegionIdsSupplier.class).to(RegionIdsFromRegionIdToURIKeySet.class).in(Scopes.SINGLETON);
+      bind(ZoneIdToURISupplier.class).to(ZoneIdToURIFromJoinOnRegionIdToURI.class).in(Scopes.SINGLETON);
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f3b8d3f/apis/ec2/src/main/java/org/jclouds/ec2/config/EC2HttpApiModule.java
----------------------------------------------------------------------
diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/config/EC2HttpApiModule.java b/apis/ec2/src/main/java/org/jclouds/ec2/config/EC2HttpApiModule.java
new file mode 100644
index 0000000..a7e1d05
--- /dev/null
+++ b/apis/ec2/src/main/java/org/jclouds/ec2/config/EC2HttpApiModule.java
@@ -0,0 +1,67 @@
+/*
+ * 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.ec2.config;
+
+import static org.jclouds.reflect.Reflection2.typeToken;
+import static org.jclouds.rest.config.BinderUtils.bindHttpApi;
+
+import java.util.Map;
+
+import javax.inject.Singleton;
+
+import org.jclouds.aws.config.FormSigningHttpApiModule;
+import org.jclouds.ec2.EC2Api;
+import org.jclouds.ec2.features.SubnetApi;
+import org.jclouds.ec2.features.TagApi;
+import org.jclouds.ec2.features.WindowsApi;
+import org.jclouds.ec2.features.AMIApi;
+import org.jclouds.ec2.features.AvailabilityZoneAndRegionApi;
+import org.jclouds.ec2.features.ElasticBlockStoreApi;
+import org.jclouds.ec2.features.ElasticIPAddressApi;
+import org.jclouds.ec2.features.InstanceApi;
+import org.jclouds.ec2.features.KeyPairApi;
+import org.jclouds.ec2.features.SecurityGroupApi;
+import org.jclouds.ec2.suppliers.DescribeAvailabilityZonesInRegion;
+import org.jclouds.ec2.suppliers.DescribeRegionsForRegionURIs;
+import org.jclouds.location.config.LocationModule;
+import org.jclouds.location.suppliers.RegionIdToURISupplier;
+import org.jclouds.location.suppliers.RegionIdToZoneIdsSupplier;
+import org.jclouds.location.suppliers.RegionIdsSupplier;
+import org.jclouds.location.suppliers.ZoneIdToURISupplier;
+import org.jclouds.location.suppliers.ZoneIdsSupplier;
+import org.jclouds.location.suppliers.derived.RegionIdsFromRegionIdToURIKeySet;
+import org.jclouds.location.suppliers.derived.ZoneIdToURIFromJoinOnRegionIdToURI;
+import org.jclouds.location.suppliers.derived.ZoneIdsFromRegionIdToZoneIdsValues;
+import org.jclouds.rest.ConfiguresHttpApi;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.reflect.TypeToken;
+import com.google.inject.Provides;
+import com.google.inject.Scopes;
+
+/**
+ * Configures the EC2 connection.
+ * 
+ * @author Adrian Cole (EDIT: Nick Terry nterry@familysearch.org)
+ */
+@ConfiguresHttpApi
+public class EC2HttpApiModule extends BaseEC2HttpApiModule<EC2Api> {
+
+   public EC2HttpApiModule() {
+      super(EC2Api.class);
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f3b8d3f/apis/ec2/src/main/java/org/jclouds/ec2/config/EC2RestClientModule.java
----------------------------------------------------------------------
diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/config/EC2RestClientModule.java b/apis/ec2/src/main/java/org/jclouds/ec2/config/EC2RestClientModule.java
deleted file mode 100644
index 589ce99..0000000
--- a/apis/ec2/src/main/java/org/jclouds/ec2/config/EC2RestClientModule.java
+++ /dev/null
@@ -1,134 +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.ec2.config;
-
-import static org.jclouds.reflect.Reflection2.typeToken;
-
-import java.util.Map;
-
-import javax.inject.Singleton;
-
-import org.jclouds.aws.config.WithZonesFormSigningRestClientModule;
-import org.jclouds.ec2.EC2Api;
-import org.jclouds.ec2.EC2AsyncApi;
-import org.jclouds.ec2.EC2AsyncClient;
-import org.jclouds.ec2.EC2Client;
-import org.jclouds.ec2.features.SubnetApi;
-import org.jclouds.ec2.features.SubnetAsyncApi;
-import org.jclouds.ec2.features.TagApi;
-import org.jclouds.ec2.features.TagAsyncApi;
-import org.jclouds.ec2.features.WindowsApi;
-import org.jclouds.ec2.features.WindowsAsyncApi;
-import org.jclouds.ec2.services.AMIAsyncClient;
-import org.jclouds.ec2.services.AMIClient;
-import org.jclouds.ec2.services.AvailabilityZoneAndRegionAsyncClient;
-import org.jclouds.ec2.services.AvailabilityZoneAndRegionClient;
-import org.jclouds.ec2.services.ElasticBlockStoreAsyncClient;
-import org.jclouds.ec2.services.ElasticBlockStoreClient;
-import org.jclouds.ec2.services.ElasticIPAddressAsyncClient;
-import org.jclouds.ec2.services.ElasticIPAddressClient;
-import org.jclouds.ec2.services.InstanceAsyncClient;
-import org.jclouds.ec2.services.InstanceClient;
-import org.jclouds.ec2.services.KeyPairAsyncClient;
-import org.jclouds.ec2.services.KeyPairClient;
-import org.jclouds.ec2.services.SecurityGroupAsyncClient;
-import org.jclouds.ec2.services.SecurityGroupClient;
-import org.jclouds.ec2.services.WindowsAsyncClient;
-import org.jclouds.ec2.services.WindowsClient;
-import org.jclouds.ec2.suppliers.DescribeAvailabilityZonesInRegion;
-import org.jclouds.ec2.suppliers.DescribeRegionsForRegionURIs;
-import org.jclouds.location.config.LocationModule;
-import org.jclouds.location.suppliers.RegionIdToURISupplier;
-import org.jclouds.location.suppliers.RegionIdToZoneIdsSupplier;
-import org.jclouds.location.suppliers.RegionIdsSupplier;
-import org.jclouds.location.suppliers.ZoneIdToURISupplier;
-import org.jclouds.location.suppliers.ZoneIdsSupplier;
-import org.jclouds.location.suppliers.derived.RegionIdsFromRegionIdToURIKeySet;
-import org.jclouds.location.suppliers.derived.ZoneIdToURIFromJoinOnRegionIdToURI;
-import org.jclouds.location.suppliers.derived.ZoneIdsFromRegionIdToZoneIdsValues;
-import org.jclouds.rest.ConfiguresRestClient;
-
-import com.google.common.collect.ImmutableMap;
-import com.google.common.reflect.TypeToken;
-import com.google.inject.Provides;
-import com.google.inject.Scopes;
-
-/**
- * Configures the EC2 connection.
- * 
- * @author Adrian Cole (EDIT: Nick Terry nterry@familysearch.org)
- */
-@ConfiguresRestClient
-// EC2Api not EC2Client so that this can be used for new apps that only depend on EC2Api
-public class EC2RestClientModule<S extends EC2Api, A extends EC2AsyncApi> extends
-         WithZonesFormSigningRestClientModule<S, A> {
-   public static final Map<Class<?>, Class<?>> DELEGATE_MAP = ImmutableMap.<Class<?>, Class<?>> builder()//
-                        .put(AMIClient.class, AMIAsyncClient.class)//
-                        .put(ElasticIPAddressClient.class, ElasticIPAddressAsyncClient.class)//
-                        .put(InstanceClient.class, InstanceAsyncClient.class)//
-                        .put(KeyPairClient.class, KeyPairAsyncClient.class)//
-                        .put(SecurityGroupClient.class, SecurityGroupAsyncClient.class)//
-                        .put(WindowsClient.class, WindowsAsyncClient.class)//
-                        .put(AvailabilityZoneAndRegionClient.class, AvailabilityZoneAndRegionAsyncClient.class)//
-                        .put(ElasticBlockStoreClient.class, ElasticBlockStoreAsyncClient.class)//
-                        .put(WindowsApi.class, WindowsAsyncApi.class)//
-                        .put(TagApi.class, TagAsyncApi.class)//
-                        .put(SubnetApi.class, SubnetAsyncApi.class)//
-                        .build();
-   
-   @SuppressWarnings("unchecked")
-   public EC2RestClientModule() {
-      // retaining top-level type of EC2Client vs EC2Api until we migrate all functionality up
-      super(TypeToken.class.cast(typeToken(EC2Client.class)), TypeToken.class.cast(typeToken(EC2AsyncClient.class)), DELEGATE_MAP);
-   }
-
-   protected EC2RestClientModule(TypeToken<S> syncClientType, TypeToken<A> asyncClientType,
-            Map<Class<?>, Class<?>> sync2Async) {
-      super(syncClientType, asyncClientType, sync2Async);
-   }
-   
-
-   /**
-    * so that we can make bindings to {@link EC2Api directly} until we switch
-    * off {@link @EC2Client}
-    */
-   @Singleton
-   @Provides
-   EC2Api provideEC2Api(EC2Client in) {
-      return in;
-   }
-   
-   /**
-    * so that we can make bindings to {@link EC2AsyncApi directly} until we switch
-    * off {@link @EC2AsyncClient}
-    */
-   @Singleton
-   @Provides
-   EC2AsyncApi provideEC2Api(EC2AsyncClient in) {
-      return in;
-   }
-   
-   @Override
-   protected void installLocations() {
-      install(new LocationModule());
-      bind(RegionIdToZoneIdsSupplier.class).to(DescribeAvailabilityZonesInRegion.class).in(Scopes.SINGLETON);
-      bind(RegionIdToURISupplier.class).to(DescribeRegionsForRegionURIs.class).in(Scopes.SINGLETON);
-      bind(ZoneIdsSupplier.class).to(ZoneIdsFromRegionIdToZoneIdsValues.class).in(Scopes.SINGLETON);
-      bind(RegionIdsSupplier.class).to(RegionIdsFromRegionIdToURIKeySet.class).in(Scopes.SINGLETON);
-      bind(ZoneIdToURISupplier.class).to(ZoneIdToURIFromJoinOnRegionIdToURI.class).in(Scopes.SINGLETON);
-   }
-}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f3b8d3f/apis/ec2/src/main/java/org/jclouds/ec2/features/AMIApi.java
----------------------------------------------------------------------
diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/features/AMIApi.java b/apis/ec2/src/main/java/org/jclouds/ec2/features/AMIApi.java
new file mode 100644
index 0000000..40540aa
--- /dev/null
+++ b/apis/ec2/src/main/java/org/jclouds/ec2/features/AMIApi.java
@@ -0,0 +1,336 @@
+/*
+ * 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.ec2.features;
+
+import static org.jclouds.aws.reference.FormParameters.ACTION;
+
+import java.util.Map;
+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.filters.FormSigner;
+import org.jclouds.ec2.binders.BindUserGroupsToIndexedFormParams;
+import org.jclouds.ec2.binders.BindUserIdsToIndexedFormParams;
+import org.jclouds.ec2.domain.Image;
+import org.jclouds.ec2.domain.Image.EbsBlockDevice;
+import org.jclouds.ec2.domain.Permission;
+import org.jclouds.ec2.options.CreateImageOptions;
+import org.jclouds.ec2.options.DescribeImagesOptions;
+import org.jclouds.ec2.options.RegisterImageBackedByEbsOptions;
+import org.jclouds.ec2.options.RegisterImageOptions;
+import org.jclouds.ec2.xml.BlockDeviceMappingHandler;
+import org.jclouds.ec2.xml.DescribeImagesResponseHandler;
+import org.jclouds.ec2.xml.ImageIdHandler;
+import org.jclouds.ec2.xml.PermissionHandler;
+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 AMI Services.
+ * <p/>
+ * 
+ * @author Adrian Cole
+ */
+@RequestFilters(FormSigner.class)
+@VirtualHost
+public interface AMIApi {
+
+   /**
+    * Returns information about AMIs, AKIs, and ARIs. This includes image type, product codes,
+    * architecture, and kernel and RAM disk IDs. Images available to you include public images,
+    * private images that you own, and private images owned by other users for which you have
+    * explicit launch permissions.
+    * 
+    * @param region
+    *           AMIs are tied to the Region where its files are located within Amazon S3.
+    * @see InstanceApi#describeInstances
+    * @see #describeImageAttribute
+    * @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeImages.html"
+    *      />
+    * @see DescribeImagesOptions
+    */
+   @Named("DescribeImages")
+   @POST
+   @Path("/")
+   @FormParams(keys = ACTION, values = "DescribeImages")
+   @XMLResponseParser(DescribeImagesResponseHandler.class)
+   @Fallback(EmptySetOnNotFoundOr404.class)
+   Set<? extends Image> describeImagesInRegion(
+            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
+            DescribeImagesOptions... options);
+
+   /**
+    * Creates an AMI that uses an Amazon EBS root device from a "running" or "stopped" instance.
+    * 
+    * @param region
+    *           AMIs are tied to the Region where its files are located within Amazon S3.
+    * @param name
+    *           The name of the AMI that was provided during image creation. 3-128 alphanumeric
+    *           characters, parenthesis (()), commas (,), slashes (/), dashes (-), or underscores(_)
+    * @param instanceId
+    *           The ID of the instance.
+    * @return imageId
+    * 
+    * @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeImages.html"
+    *      />
+    * @see CreateImageOptions
+    * @see InstanceApi#runInstances
+    * @see InstanceApi#describeInstances
+    * @see InstanceApi#terminateInstances
+    * @see <a href=
+    *      "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-CreateImage.html"
+    *      />
+    */
+   @Named("CreateImage")
+   @POST
+   @Path("/")
+   @FormParams(keys = ACTION, values = "CreateImage")
+   @XMLResponseParser(ImageIdHandler.class)
+   String createImageInRegion(
+            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
+            @FormParam("Name") String name, @FormParam("InstanceId") String instanceId, CreateImageOptions... options);
+
+   /**
+    * 
+    * Deregisters the specified AMI. Once deregistered, the AMI cannot be used to launch new
+    * instances.
+    * 
+    * @param region
+    *           AMIs are tied to the Region where its files are located within Amazon S3.
+    * @param imageId
+    *           Unique ID of the AMI which was assigned during registration. To register an AMI, use
+    *           RegisterImage. To view the AMI IDs of AMIs that belong to your identity. use
+    *           DescribeImages.
+    * 
+    * @see #describeImages
+    * @see #registerImage
+    * @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DeregisterImage.html"
+    *      />
+    */
+   @Named("DeregisterImage")
+   @POST
+   @Path("/")
+   @FormParams(keys = ACTION, values = "DeregisterImage")
+   void deregisterImageInRegion(
+            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
+            @FormParam("ImageId") String imageId);
+
+   /**
+    * Registers an AMI with Amazon EC2. Images must be registered before they can be launched. To
+    * launch instances, use the {@link InstanceApi#runInstances} operation.
+    * <p/>
+    * Each AMI is associated with an unique ID which is provided by the Amazon EC2 service through
+    * this operation. If needed, you can deregister an AMI at any time.
+    * <p/>
+    * <h3>Note</h3> Any modifications to an AMI backed by Amazon S3 invalidates this registration.
+    * If you make changes to an image, deregister the previous image and register the new image.
+    * 
+    * @param region
+    *           AMIs are tied to the Region where its files are located within Amazon S3.
+    * @param name
+    *           The name of the AMI that was provided during image creation. 3-128 alphanumeric
+    *           characters, parenthesis (()), commas (,), slashes (/), dashes (-), or underscores(_)
+    * @param pathToManifest
+    *           Full path to your AMI manifest in Amazon S3 storage.
+    * @param options
+    *           Options to specify metadata such as architecture or secondary volumes to be
+    *           associated with this image.
+    * @return imageId
+    * 
+    * @see #describeImages
+    * @see #deregisterImage
+    * @see <a href=
+    *      "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-RegisterImage.html"
+    *      />
+    */
+   @Named("RegisterImage")
+   @POST
+   @Path("/")
+   @FormParams(keys = ACTION, values = "RegisterImage")
+   @XMLResponseParser(ImageIdHandler.class)
+   String registerImageFromManifestInRegion(
+            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
+            @FormParam("Name") String imageName, @FormParam("ImageLocation") String pathToManifest,
+            RegisterImageOptions... options);
+
+   /**
+    * Registers an AMI with Amazon EC2. Images must be registered before they can be launched. To
+    * launch instances, use the {@link InstanceApi#runInstances} operation. The root device name
+    * is /dev/sda1
+    * <p/>
+    * Each AMI is associated with an unique ID which is provided by the Amazon EC2 service through
+    * this operation. If needed, you can deregister an AMI at any time.
+    * <p/>
+    * <h3>Note</h3> AMIs backed by Amazon EBS are automatically registered when you create the
+    * image. However, you can use this to register a snapshot of an instance backed by Amazon EBS.
+    * <p/>
+    * Amazon EBS snapshots are not guaranteed to be bootable.
+    * 
+    * @param region
+    *           AMIs are tied to the Region where its files are located within Amazon S3.
+    * @param name
+    *           The name of the AMI that was provided during image creation. 3-128 alphanumeric
+    *           characters, parenthesis (()), commas (,), slashes (/), dashes (-), or underscores(_)
+    * 
+    * @param ebsSnapshotId
+    *           The id of the root snapshot (e.g., snap-6eba6e06).
+    * @param options
+    *           Options to specify metadata such as architecture or secondary volumes to be
+    *           associated with this image.
+    * @return imageId
+    * 
+    * @see #describeImages
+    * @see #deregisterImage
+    * @see <a href=
+    *      "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-RegisterImage.html"
+    *      />
+    */
+   @Named("RegisterImage")
+   @POST
+   @Path("/")
+   @FormParams(keys = { ACTION, "RootDeviceName", "BlockDeviceMapping.0.DeviceName" }, values = { "RegisterImage",
+            "/dev/sda1", "/dev/sda1" })
+   @XMLResponseParser(ImageIdHandler.class)
+   String registerUnixImageBackedByEbsInRegion(
+            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
+            @FormParam("Name") String imageName,
+            @FormParam("BlockDeviceMapping.0.Ebs.SnapshotId") String ebsSnapshotId,
+            RegisterImageBackedByEbsOptions... options);
+
+   /**
+    * Resets the {@code launchPermission}s on an AMI.
+    * 
+    * @param region
+    *           AMIs are tied to the Region where its files are located within Amazon S3.
+    * @param imageId
+    *           ID of the AMI on which the attribute will be reset.
+    * 
+    * @see #addLaunchPermissionsToImage
+    * @see #describeImageAttribute
+    * @see #removeProductCodesFromImage
+    * @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-ResetImageAttribute.html"
+    *      />
+    */
+   @Named("ResetImageAttribute")
+   @POST
+   @Path("/")
+   @FormParams(keys = { ACTION, "Attribute" }, values = { "ResetImageAttribute", "launchPermission" })
+   void resetLaunchPermissionsOnImageInRegion(
+            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
+            @FormParam("ImageId") String imageId);
+
+   /**
+    * Adds {@code launchPermission}s to an AMI.
+    * 
+    * @param region
+    *           AMIs are tied to the Region where its files are located within Amazon S3.
+    * @param userIds
+    *           AWS Access Key ID.
+    * @param userGroups
+    *           Name of the groups. Currently supports \"all.\""
+    * @param imageId
+    *           The AMI ID.
+    * 
+    * @see #removeLaunchPermissionsFromImage
+    * @see #describeImageAttribute
+    * @see #resetImageAttribute
+    * @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-ModifyImageAttribute.html"
+    *      />
+    */
+   @Named("ModifyImageAttribute")
+   @POST
+   @Path("/")
+   @FormParams(keys = { ACTION, "OperationType", "Attribute" }, values = { "ModifyImageAttribute", "add",
+            "launchPermission" })
+   void addLaunchPermissionsToImageInRegion(
+            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
+            @BinderParam(BindUserIdsToIndexedFormParams.class) Iterable<String> userIds,
+            @BinderParam(BindUserGroupsToIndexedFormParams.class) Iterable<String> userGroups,
+            @FormParam("ImageId") String imageId);
+
+   /**
+    * @see AMIApi#removeLaunchPermissionsToImageInRegion
+    */
+   @Named("ModifyImageAttribute")
+   @POST
+   @Path("/")
+   @FormParams(keys = { ACTION, "OperationType", "Attribute" }, values = { "ModifyImageAttribute", "remove",
+            "launchPermission" })
+   void removeLaunchPermissionsFromImageInRegion(
+            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
+            @BinderParam(BindUserIdsToIndexedFormParams.class) Iterable<String> userIds,
+            @BinderParam(BindUserGroupsToIndexedFormParams.class) Iterable<String> userGroups,
+            @FormParam("ImageId") String imageId);
+
+   /**
+    * Returns the {@link Permission}s 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
+    */
+   @Named("DescribeImageAttribute")
+   @POST
+   @Path("/")
+   @FormParams(keys = { ACTION, "Attribute" }, values = { "DescribeImageAttribute", "launchPermission" })
+   @XMLResponseParser(PermissionHandler.class)
+   Permission getLaunchPermissionForImageInRegion(
+            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
+            @FormParam("ImageId") String imageId);
+
+   /**
+    * Returns a map of device name to block device for the 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
+    */
+   @Named("DescribeImageAttribute")
+   @POST
+   @Path("/")
+   @FormParams(keys = { ACTION, "Attribute" }, values = { "DescribeImageAttribute", "blockDeviceMapping" })
+   @XMLResponseParser(BlockDeviceMappingHandler.class)
+   Map<String, EbsBlockDevice> getBlockDeviceMappingsForImageInRegion(
+            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
+            @FormParam("ImageId") String imageId);
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f3b8d3f/apis/ec2/src/main/java/org/jclouds/ec2/features/AvailabilityZoneAndRegionApi.java
----------------------------------------------------------------------
diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/features/AvailabilityZoneAndRegionApi.java b/apis/ec2/src/main/java/org/jclouds/ec2/features/AvailabilityZoneAndRegionApi.java
new file mode 100644
index 0000000..7de7a48
--- /dev/null
+++ b/apis/ec2/src/main/java/org/jclouds/ec2/features/AvailabilityZoneAndRegionApi.java
@@ -0,0 +1,90 @@
+/*
+ * 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.ec2.features;
+
+import static org.jclouds.aws.reference.FormParameters.ACTION;
+
+import java.net.URI;
+import java.util.Map;
+import java.util.Set;
+
+import javax.inject.Named;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+
+import org.jclouds.Fallbacks.EmptySetOnNotFoundOr404;
+import org.jclouds.aws.filters.FormSigner;
+import org.jclouds.ec2.domain.AvailabilityZoneInfo;
+import org.jclouds.ec2.options.DescribeAvailabilityZonesOptions;
+import org.jclouds.ec2.options.DescribeRegionsOptions;
+import org.jclouds.ec2.xml.DescribeAvailabilityZonesResponseHandler;
+import org.jclouds.ec2.xml.DescribeRegionsResponseHandler;
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.location.functions.RegionToEndpointOrProviderIfNull;
+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 Availability Zones and Regions via their REST API.
+ * <p/>
+ * 
+ * @author Adrian Cole
+ */
+@RequestFilters(FormSigner.class)
+@VirtualHost
+public interface AvailabilityZoneAndRegionApi {
+
+   /**
+    * Displays Availability Zones that are currently available to the identity and their states.
+    * 
+    * @see InstanceApi#runInstances
+    * @see #describeRegions
+    * 
+    * @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeAvailabilityZones.html"
+    *      />
+    */
+   @Named("DescribeAvailabilityZones")
+   @POST
+   @Path("/")
+   @FormParams(keys = ACTION, values = "DescribeAvailabilityZones")
+   @XMLResponseParser(DescribeAvailabilityZonesResponseHandler.class)
+   @Fallback(EmptySetOnNotFoundOr404.class)
+   Set<AvailabilityZoneInfo> describeAvailabilityZonesInRegion(
+            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
+            DescribeAvailabilityZonesOptions... options);
+
+   /**
+    * Describes Regions that are currently available to the identity.
+    * 
+    * @see InstanceApi#runInstances
+    * @see #describeAvailabilityZones
+    * 
+    * @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeRegions.html"
+    *      />
+    */
+   @Named("DescribeRegions")
+   @POST
+   @Path("/")
+   @FormParams(keys = ACTION, values = "DescribeRegions")
+   @XMLResponseParser(DescribeRegionsResponseHandler.class)
+   Map<String, URI> describeRegions(DescribeRegionsOptions... options);
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f3b8d3f/apis/ec2/src/main/java/org/jclouds/ec2/features/ElasticBlockStoreApi.java
----------------------------------------------------------------------
diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/features/ElasticBlockStoreApi.java b/apis/ec2/src/main/java/org/jclouds/ec2/features/ElasticBlockStoreApi.java
new file mode 100644
index 0000000..8e56f77
--- /dev/null
+++ b/apis/ec2/src/main/java/org/jclouds/ec2/features/ElasticBlockStoreApi.java
@@ -0,0 +1,545 @@
+/*
+ * 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.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.aws.filters.FormSigner;
+import org.jclouds.ec2.EC2Fallbacks.VoidOnVolumeAvailable;
+import org.jclouds.ec2.binders.BindUserGroupsToIndexedFormParams;
+import org.jclouds.ec2.binders.BindUserIdsToIndexedFormParams;
+import org.jclouds.ec2.binders.BindVolumeIdsToIndexedFormParams;
+import org.jclouds.ec2.domain.Attachment;
+import org.jclouds.ec2.domain.Permission;
+import org.jclouds.ec2.domain.Snapshot;
+import org.jclouds.ec2.domain.Volume;
+import org.jclouds.ec2.options.CreateSnapshotOptions;
+import org.jclouds.ec2.options.DescribeSnapshotsOptions;
+import org.jclouds.ec2.options.DetachVolumeOptions;
+import org.jclouds.ec2.xml.AttachmentHandler;
+import org.jclouds.ec2.xml.CreateVolumeResponseHandler;
+import org.jclouds.ec2.xml.DescribeSnapshotsResponseHandler;
+import org.jclouds.ec2.xml.DescribeVolumesResponseHandler;
+import org.jclouds.ec2.xml.PermissionHandler;
+import org.jclouds.ec2.xml.SnapshotHandler;
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.location.functions.RegionToEndpointOrProviderIfNull;
+import org.jclouds.location.functions.ZoneToEndpoint;
+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 Elastic Block Store services via their REST API.
+ * <p/>
+ * 
+ * @author Adrian Cole
+ */
+@RequestFilters(FormSigner.class)
+@VirtualHost
+public interface ElasticBlockStoreApi {
+
+   /**
+    * Creates a new Amazon EBS volume to which any Amazon EC2 instance can attach within the same
+    * Availability Zone. For more information about Amazon EBS, go to the Amazon Elastic Compute
+    * Cloud Developer Guide or Amazon Elastic Compute Cloud User Guide.
+    * 
+    * @param availabilityZone
+    *           An Amazon EBS volume must be located within the same Availability Zone as the
+    *           instance to which it attaches.
+    * @param snapshotId
+    *           The snapshot from which to create the new volume.
+    * 
+    * @see #describeVolumesInRegion
+    * @see #deleteVolumeInRegion
+    * @see #attachVolumeInRegion
+    * @see #detachVolumeInRegion
+    * @see AvailabilityZoneAndRegionApi#describeAvailabilityZonesInRegion
+    * 
+    * 
+    * @see <a href=
+    *      "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-CreateVolume.html"
+    *      />
+    */
+   @Named("CreateVolume")   
+   @POST
+   @Path("/")
+   @FormParams(keys = ACTION, values = "CreateVolume")
+   @XMLResponseParser(CreateVolumeResponseHandler.class)
+   Volume createVolumeFromSnapshotInAvailabilityZone(
+            @EndpointParam(parser = ZoneToEndpoint.class) @FormParam("AvailabilityZone") String availabilityZone,
+            @FormParam("SnapshotId") String snapshotId);
+
+   /**
+    * Creates a new Amazon EBS volume to which any Amazon EC2 instance can attach within the same
+    * Availability Zone. This is overloaded {@link #createVolumeFromSnapshotInAvailabilityZone},
+    * which creates a volume with a specific size.
+    * For more information about Amazon EBS, go to the Amazon Elastic Compute
+    * Cloud Developer Guide or Amazon Elastic Compute Cloud User Guide.
+    *
+    * @param availabilityZone
+    *           An Amazon EBS volume must be located within the same Availability Zone as the
+    *           instance to which it attaches.
+    * @param size
+    *           Size of volume to be created
+    * @param snapshotId
+    *           The snapshot from which to create the new volume.
+    *
+    * @see #createVolumeFromSnapshotInAvailabilityZone
+    * @see #describeVolumesInRegion
+    * @see #deleteVolumeInRegion
+    * @see #attachVolumeInRegion
+    * @see #detachVolumeInRegion
+    * @see AvailabilityZoneAndRegionApi#describeAvailabilityZonesInRegion
+    *
+    *
+    * @see <a href=
+    *      "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-CreateVolume.html"
+    *      />
+    */
+   @Named("CreateVolume")   
+   @POST
+   @Path("/")
+   @FormParams(keys = ACTION, values = "CreateVolume")
+   @XMLResponseParser(CreateVolumeResponseHandler.class)
+   Volume createVolumeFromSnapshotInAvailabilityZone(
+            @EndpointParam(parser = ZoneToEndpoint.class) @FormParam("AvailabilityZone") String availabilityZone,
+            @FormParam("Size") int size, @FormParam("SnapshotId") String snapshotId);
+
+   /**
+    * Creates a new Amazon EBS volume to which any Amazon EC2 instance can attach within the same
+    * Availability Zone. For more information about Amazon EBS, go to the Amazon Elastic Compute
+    * Cloud Developer Guide or Amazon Elastic Compute Cloud User Guide.
+    * 
+    * @param availabilityZone
+    *           An Amazon EBS volume must be located within the same Availability Zone as the
+    *           instance to which it attaches.
+    * @param size
+    *           The size of the volume, in GiBs (1-1024). Required if you are not creating a volume
+    *           from a snapshot.
+    * 
+    * 
+    * @see #describeVolumesInRegion
+    * @see #deleteVolumeInRegion
+    * @see #attachVolumeInRegion
+    * @see #detachVolumeInRegion
+    * @see AvailabilityZoneAndRegionApi#describeAvailabilityZonesInRegion
+    * @see <a href=
+    *      "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-CreateVolume.html"
+    *      />
+    */
+   @Named("CreateVolume")   
+   @POST
+   @Path("/")
+   @FormParams(keys = ACTION, values = "CreateVolume")
+   @XMLResponseParser(CreateVolumeResponseHandler.class)
+   Volume createVolumeInAvailabilityZone(
+            @EndpointParam(parser = ZoneToEndpoint.class) @FormParam("AvailabilityZone") String availabilityZone,
+            @FormParam("Size") int size);
+
+   /**
+    * Describes the specified Amazon EBS volumes that you own. If you do not specify one or more
+    * volume IDs, Amazon EBS describes all volumes that you own. For more information about Amazon
+    * EBS, go to the Amazon Elastic Compute Cloud Developer Guide or Amazon Elastic Compute Cloud
+    * User Guide.
+    * 
+    * @param region
+    *           region where the volume is defined
+    * @param volumeIds
+    *           The ID of the volume to list. Defaults to describe all volumes that you own.
+    * 
+    * @see #createSnapshotInRegion
+    * @see #describeSnapshotInRegion
+    * @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeVolumes.html"
+    *      />
+    */
+   @POST
+   @Named("DescribeVolumes")   
+   @Path("/")
+   @FormParams(keys = ACTION, values = "DescribeVolumes")
+   @XMLResponseParser(DescribeVolumesResponseHandler.class)
+   Set<Volume> describeVolumesInRegion(
+            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
+            @BinderParam(BindVolumeIdsToIndexedFormParams.class) String... volumeIds);
+
+   /**
+    * Deletes an Amazon EBS volume that you own. For more information about Amazon EBS, go to the
+    * Amazon Elastic Compute Cloud Developer Guide or Amazon Elastic Compute Cloud User Guide.
+    * 
+    * @param region
+    *           region where the volume is defined
+    * @param volumeId
+    *           The ID of the volume to delete. The volume remains in the deleting state for several
+    *           minutes after entering this command.
+    * 
+    * @see #describeVolumesInRegion
+    * @see #createVolumeInRegion
+    * @see #attachVolumeInRegion
+    * @see #detachVolumeInRegion
+    * 
+    * @see <a href=
+    *      "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DeleteVolume.html"
+    *      />
+    */
+   @Named("DeleteVolume")   
+   @POST
+   @Path("/")
+   @FormParams(keys = ACTION, values = "DeleteVolume")
+   void deleteVolumeInRegion(@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
+            @FormParam("VolumeId") String volumeId);
+
+   /**
+    * Attaches an Amazon EBS volume to a running instance and exposes it as the specified device.
+    * <p/>
+    * 
+    * <h3>Note</h3>
+    * 
+    * Windows instances currently support devices xvda through xvdp. Devices xvda and xvdb are
+    * reserved by the operating system, xvdc is assigned to drive C:\, and, depending on the
+    * instance type, devices xvdd through xvde might be reserved by the instance stores. Any device
+    * that is not reserved can be attached to an Amazon EBS volume. For a list of devices that are
+    * reserved by the instance stores, go to the Amazon Elastic Compute Cloud Developer Guide or
+    * Amazon Elastic Compute Cloud User Guide.
+    * 
+    * @param region
+    *           region where the volume is defined
+    * @param volumeId
+    *           The ID of the volume to delete. The volume remains in the deleting state for several
+    *           minutes after entering this command.
+    * @param force
+    *           Forces detachment if the previous detachment attempt did not occur cleanly (logging
+    *           into an instance, unmounting the volume, and detaching normally). This option can
+    *           lead to data loss or a corrupted file system. Use this option only as a last resort
+    *           to detach a volume from a failed instance. The instance will not have an opportunity
+    *           to flush file system caches nor file system meta data. If you use this option, you
+    *           must perform file system check and repair procedures.
+    * 
+    * @param options
+    *           options like force()
+    * 
+    * @see #describeVolumesInRegion
+    * @see #createVolumeInRegion
+    * @see #attachVolumeInRegion
+    * @see #deleteVolumeInRegion
+    * 
+    * @see <a href=
+    *      "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DetachVolume.html"
+    *      />
+    */
+   @Named("DetachVolume")   
+   @POST
+   @Path("/")
+   @FormParams(keys = ACTION, values = "DetachVolume")
+   @Fallback(VoidOnVolumeAvailable.class)
+   void detachVolumeInRegion(@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
+            @FormParam("VolumeId") String volumeId, @FormParam("Force") boolean force, DetachVolumeOptions... options);
+
+   /**
+    * Attaches an Amazon EBS volume to a running instance and exposes it as the specified device.
+    * 
+    * <h3>Note</h3> Windows instances currently support devices xvda through xvdp. Devices xvda and
+    * xvdb are reserved by the operating system, xvdc is assigned to drive C:\, and, depending on
+    * the instance type, devices xvdd through xvde might be reserved by the instance stores. Any
+    * device that is not reserved can be attached to an Amazon EBS volume. For a list of devices
+    * that are reserved by the instance stores, go to the Amazon Elastic Compute Cloud Developer
+    * Guide or Amazon Elastic Compute Cloud User Guide.
+    * 
+    * @param region
+    *           region where the volume is defined
+    * @param volumeId
+    *           The ID of the Amazon EBS volume. The volume and instance must be within the same
+    *           Availability Zone and the instance must be running.
+    * @param instanceId
+    *           The ID of the instance to which the volume attaches. The volume and instance must be
+    *           within the same Availability Zone and the instance must be running.
+    * @param device
+    *           Specifies how the device is exposed to the instance (e.g., /dev/sdh).
+    * 
+    * @see #describeVolumesInRegion
+    * @see #createVolumeInRegion
+    * @see #detachVolumeInRegion
+    * @see #deleteVolumeInRegion
+    * 
+    * @see <a href=
+    *      "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-AttachVolume.html"
+    *      />
+    */
+   @Named("AttachVolume")   
+   @POST
+   @Path("/")
+   @FormParams(keys = ACTION, values = "AttachVolume")
+   @XMLResponseParser(AttachmentHandler.class)
+   Attachment attachVolumeInRegion(
+            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
+            @FormParam("VolumeId") String volumeId, @FormParam("InstanceId") String instanceId,
+            @FormParam("Device") String device);
+
+   /**
+    * Creates a snapshot of an Amazon EBS volume and stores it in Amazon S3. You can use snapshots
+    * for backups, to make identical copies of instance devices, and to save data before shutting
+    * down an instance. For more information about Amazon EBS, go to the Amazon Elastic Compute
+    * Cloud Developer Guide or Amazon Elastic Compute Cloud User Guide.
+    * <p/>
+    * When taking a snapshot of a file system, we recommend unmounting it first. This ensures the
+    * file system metadata is in a consistent state, that the 'mounted indicator' is cleared, and
+    * that all applications using that file system are stopped and in a consistent state. Some file
+    * systems, such as xfs, can freeze and unfreeze activity so a snapshot can be made without
+    * unmounting.
+    * <p/>
+    * For Linux/UNIX, enter the following command from the command line.
+    * 
+    * <pre>
+    * umount - d / dev / sdh
+    * </pre>
+    * <p/>
+    * For Windows, open Disk Management, right-click the volume to unmount, and select Change Drive
+    * Letter and Path. Then, select the mount point to remove and click Remove.
+    * 
+    * @param region
+    *           Snapshots are tied to Regions and can only be used for volumes within the same
+    *           Region.
+    * @param volumeId
+    *           The ID of the Amazon EBS volume of which to take a snapshot.
+    * @param options
+    *           options like passing a description.
+    * @return the Snapshot in progress
+    * 
+    * @see #describeSnapshotsInRegion
+    * @see #deleteSnapshotInRegion
+    * @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-CreateSnapshot.html"
+    *      />
+    */
+   @Named("CreateSnapshot")   
+   @POST
+   @Path("/")
+   @FormParams(keys = ACTION, values = "CreateSnapshot")
+   @XMLResponseParser(SnapshotHandler.class)
+   Snapshot createSnapshotInRegion(
+            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
+            @FormParam("VolumeId") String volumeId, CreateSnapshotOptions... options);
+
+   /**
+    * Returns information about Amazon EBS snapshots available to the user. Information returned
+    * includes volume ID, status, start time, progress, owner ID, volume size, and description.
+    * Snapshots available to the user include public snapshots available for any user to
+    * createVolume, private snapshots owned by the user making the request, and private snapshots
+    * owned by other users for which the user granted explicit create volume permissions.
+    * <p/>
+    * The create volume permissions fall into 3 categories:
+    * <p/>
+    * <table>
+    * <tr>
+    * <td>Permission</td>
+    * <td>Description</td>
+    * </tr>
+    * <tr>
+    * <td>public</td>
+    * <td>The owner of the snapshot granted create volume permissions for the snapshot to the all
+    * group. All users have create volume permissions for these snapshots.</td>
+    * </tr>
+    * <tr>
+    * <td>explicit</td>
+    * <td>The owner of the snapshot granted create volume permissions to a specific user.</td>
+    * </tr>
+    * <tr>
+    * <td>implicit</td>
+    * <td>A user has implicit create volume permissions for all snapshots he or she owns.</td>
+    * </tr>
+    * </table>
+    * <p/>
+    * 
+    * The list of snapshots returned can be modified by specifying snapshot IDs, snapshot owners, or
+    * users with create volume permissions. If no options are specified, Amazon EC2 returns all
+    * snapshots for which the user has create volume permissions.
+    * <p/>
+    * If you specify one or more snapshot IDs, only snapshots that have the specified IDs are
+    * returned. If you specify an invalid snapshot ID, a fault is returned. If you specify a
+    * snapshot ID for which you do not have access, it will not be included in the returned results.
+    * <p/>
+    * If you specify one or more snapshot owners, only snapshots from the specified owners and for
+    * which you have access are returned. The results can include the AWS Account IDs of the
+    * specified owners, amazon for snapshots owned by Amazon or self for snapshots that you own.
+    * <p/>
+    * If you specify a list of restorable users, only users that have create snapshot permissions
+    * for the snapshots are returned. You can specify AWS Account IDs (if you own the snapshot(s)),
+    * self for snapshots for which you own or have explicit permissions, or all for public
+    * snapshots.
+    * 
+    * @param region
+    *           Snapshots are tied to Regions and can only be used for volumes within the same
+    *           Region.
+    * @param options
+    *           specify the snapshot ids or other parameters to clarify the list.
+    * @return matching snapshots.
+    * 
+    * @see #createSnapshotsInRegion
+    * @see #deleteSnapshotInRegion
+    * @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeSnapshots.html"
+    *      />
+    */
+   @Named("DescribeSnapshots")   
+   @POST
+   @Path("/")
+   @FormParams(keys = ACTION, values = "DescribeSnapshots")
+   @XMLResponseParser(DescribeSnapshotsResponseHandler.class)
+   @Fallback(EmptySetOnNotFoundOr404.class)
+   Set<Snapshot> describeSnapshotsInRegion(
+            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
+            DescribeSnapshotsOptions... options);
+
+   /**
+    * Deletes a snapshot of an Amazon EBS volume that you own. For more information, go to the
+    * Amazon Elastic Compute Cloud Developer Guide or Amazon Elastic Compute Cloud User Guide.
+    * 
+    * @param region
+    *           Snapshots are tied to Regions and can only be used for volumes within the same
+    *           Region.
+    * @param snapshotId
+    *           The ID of the Amazon EBS snapshot to delete.
+    * 
+    * @see #createSnapshotInRegion
+    * @see #deleteSnapshotInRegion
+    * @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DeleteSnapshot.html"
+    *      />
+    */
+   @Named("DeleteSnapshot")   
+   @POST
+   @Path("/")
+   @FormParams(keys = ACTION, values = "DeleteSnapshot")
+   void deleteSnapshotInRegion(
+            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
+            @FormParam("SnapshotId") String snapshotId);
+
+   /**
+    * Adds {@code createVolumePermission}s to an EBS snapshot.
+    * 
+    * @param region
+    *           Snapshots are tied to Regions and can only be used for volumes within the same
+    *           Region.
+    * @param userIds
+    *           AWS Access Key ID.
+    * @param userGroups
+    *           Name of the groups. Currently supports \"all.\""
+    * @param snapshotId
+    *           The ID of the Amazon EBS snapshot.
+    * 
+    * @see #removeCreateVolumePermissionsFromSnapshot
+    * @see #describeSnapshotAttribute
+    * @see #resetSnapshotAttribute
+    * @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-ModifySnapshotAttribute.html"
+    *      />
+    */
+   @Named("ModifySnapshotAttribute")   
+   @POST
+   @Path("/")
+   @FormParams(keys = { ACTION, "OperationType", "Attribute" }, values = { "ModifySnapshotAttribute", "add",
+            "createVolumePermission" })
+   void addCreateVolumePermissionsToSnapshotInRegion(
+            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
+            @BinderParam(BindUserIdsToIndexedFormParams.class) Iterable<String> userIds,
+            @BinderParam(BindUserGroupsToIndexedFormParams.class) Iterable<String> userGroups,
+            @FormParam("SnapshotId") String snapshotId);
+
+   /**
+    * Removes {@code createVolumePermission}s from an EBS snapshot.
+    * 
+    * @param region
+    *           Snapshots are tied to Regions and can only be used for volumes within the same
+    *           Region.
+    * @param userIds
+    *           AWS Access Key ID.
+    * @param userGroups
+    *           Name of the groups. Currently supports \"all.\""
+    * @param snapshotId
+    *           The ID of the Amazon EBS snapshot.
+    * 
+    * @see #addCreateVolumePermissionsToSnapshot
+    * @see #describeSnapshotAttribute
+    * @see #resetSnapshotAttribute
+    * @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-ModifySnapshotAttribute.html"
+    *      />
+    */
+   @Named("ModifySnapshotAttribute")   
+   @POST
+   @Path("/")
+   @FormParams(keys = { ACTION, "OperationType", "Attribute" }, values = { "ModifySnapshotAttribute", "remove",
+            "createVolumePermission" })
+   void removeCreateVolumePermissionsFromSnapshotInRegion(
+            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
+            @BinderParam(BindUserIdsToIndexedFormParams.class) Iterable<String> userIds,
+            @BinderParam(BindUserGroupsToIndexedFormParams.class) Iterable<String> userGroups,
+            @FormParam("SnapshotId") String snapshotId);
+
+   /**
+    * Returns the {@link Permission}s of an snapshot.
+    * 
+    * @param region
+    *           AMIs are tied to the Region where its files are located within Amazon S3.
+    * @param snapshotId
+    *           The ID of the AMI for which an attribute will be described
+    * @see #describeSnapshots
+    * @see #modifySnapshotAttribute
+    * @see #resetSnapshotAttribute
+    * @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeSnapshotAttribute.html"
+    *      />
+    * @see DescribeSnapshotsOptions
+    */
+   @Named("DescribeSnapshotAttribute")   
+   @POST
+   @Path("/")
+   @FormParams(keys = { ACTION, "Attribute" }, values = { "DescribeSnapshotAttribute", "createVolumePermission" })
+   @XMLResponseParser(PermissionHandler.class)
+   Permission getCreateVolumePermissionForSnapshotInRegion(
+            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
+            @FormParam("SnapshotId") String snapshotId);
+
+   /**
+    * Resets the {@code createVolumePermission}s on an EBS snapshot.
+    * 
+    * @param region
+    *           Snapshots are tied to Regions and can only be used for volumes within the same
+    *           Region.
+    * @param snapshotId
+    *           The ID of the Amazon EBS snapshot.
+    * 
+    * @see #addCreateVolumePermissionsToSnapshot
+    * @see #describeSnapshotAttribute
+    * @see #removeProductCodesFromSnapshot
+    * @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-ResetSnapshotAttribute.html"
+    *      />
+    */
+   @Named("ResetSnapshotAttribute")   
+   @POST
+   @Path("/")
+   @FormParams(keys = { ACTION, "Attribute" }, values = { "ResetSnapshotAttribute", "createVolumePermission" })
+   void resetCreateVolumePermissionsOnSnapshotInRegion(
+            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
+            @FormParam("SnapshotId") String snapshotId);
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f3b8d3f/apis/ec2/src/main/java/org/jclouds/ec2/features/ElasticIPAddressApi.java
----------------------------------------------------------------------
diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/features/ElasticIPAddressApi.java b/apis/ec2/src/main/java/org/jclouds/ec2/features/ElasticIPAddressApi.java
new file mode 100644
index 0000000..47d93a7
--- /dev/null
+++ b/apis/ec2/src/main/java/org/jclouds/ec2/features/ElasticIPAddressApi.java
@@ -0,0 +1,171 @@
+/*
+ * 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.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.aws.filters.FormSigner;
+import org.jclouds.ec2.binders.BindPublicIpsToIndexedFormParams;
+import org.jclouds.ec2.domain.PublicIpInstanceIdPair;
+import org.jclouds.ec2.xml.AllocateAddressResponseHandler;
+import org.jclouds.ec2.xml.DescribeAddressesResponseHandler;
+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 Elastic IP Addresses via REST API.
+ * <p/>
+ * 
+ * @author Adrian Cole
+ */
+@RequestFilters(FormSigner.class)
+@VirtualHost
+public interface ElasticIPAddressApi {
+
+   /**
+    * Acquires an elastic IP address for use with your identity.
+    * 
+    * @param region
+    *           Elastic IP addresses are tied to a Region and cannot be mapped across Regions.
+    * @see #describeAddresses
+    * @see #releaseAddress
+    * @see #associateAddress
+    * @see #disassociateAddress
+    * @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-AllocateAddress.html"
+    */
+   @Named("AllocateAddress")
+   @POST
+   @Path("/")
+   @XMLResponseParser(AllocateAddressResponseHandler.class)
+   @FormParams(keys = ACTION, values = "AllocateAddress")
+   String allocateAddressInRegion(
+            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region);
+
+   /**
+    * Associates an elastic IP address with an instance. If the IP address is currently assigned to
+    * another instance, the IP address is assigned to the new instance. This is an idempotent
+    * operation. If you enter it more than once, Amazon EC2 does not return an error.
+    * 
+    * @param region
+    *           Elastic IP addresses are tied to a Region and cannot be mapped across Regions.
+    * @param publicIp
+    *           IP address that you are assigning to the instance.
+    * @param instanceId
+    *           The instance to associate with the IP address.
+    * 
+    * @see #allocateAddress
+    * @see #describeAddresses
+    * @see #releaseAddress
+    * @see #disassociateAddress
+    * @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/index.html?ApiReference-query-AssociateAddress.html"
+    */
+   @Named("AssociateAddress")
+   @POST
+   @Path("/")
+   @FormParams(keys = ACTION, values = "AssociateAddress")
+   void associateAddressInRegion(
+            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
+            @FormParam("PublicIp") String publicIp, @FormParam("InstanceId") String instanceId);
+
+   /**
+    * Disassociates the specified elastic IP address from the instance to which it is assigned. This
+    * is an idempotent operation. If you enter it more than once, Amazon EC2 does not return an
+    * error.
+    * 
+    * @param region
+    *           Elastic IP addresses are tied to a Region and cannot be mapped across Regions.
+    * @param publicIp
+    *           IP address that you are assigning to the instance.
+    * 
+    * @see #allocateAddress
+    * @see #describeAddresses
+    * @see #releaseAddress
+    * @see #associateAddress
+    * @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/index.html?ApiReference-query-DisassociateAddress.html"
+    */
+   @Named("DisassociateAddress")
+   @POST
+   @Path("/")
+   @FormParams(keys = ACTION, values = "DisassociateAddress")
+   void disassociateAddressInRegion(
+            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
+            @FormParam("PublicIp") String publicIp);
+
+   /**
+    * Releases an elastic IP address associated with your identity.
+    * 
+    * @param region
+    *           Elastic IP addresses are tied to a Region and cannot be mapped across Regions.
+    * @param publicIp
+    *           The IP address that you are releasing from your identity.
+    * 
+    * @see #allocateAddress
+    * @see #describeAddresses
+    * @see #associateAddress
+    * @see #disassociateAddress
+    * @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/index.html?ApiReference-query-ReleaseAddress.html"
+    */
+   @Named("ReleaseAddress")
+   @POST
+   @Path("/")
+   @FormParams(keys = ACTION, values = "ReleaseAddress")
+   void releaseAddressInRegion(
+            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
+            @FormParam("PublicIp") String publicIp);
+
+   /**
+    * Lists elastic IP addresses assigned to your identity or provides information about a specific
+    * address.
+    * 
+    * @param region
+    *           Elastic IP addresses are tied to a Region and cannot be mapped across Regions.
+    * @param publicIps
+    *           Elastic IP address to describe.
+    * 
+    * @throws AWSResponseException
+    *            if the requested publicIp is not found
+    * @see #allocateAddress
+    * @see #releaseAddress
+    * @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeAddresses.html"
+    *      />
+    */
+   @Named("DescribeAddresses")
+   @POST
+   @Path("/")
+   @FormParams(keys = ACTION, values = "DescribeAddresses")
+   @XMLResponseParser(DescribeAddressesResponseHandler.class)
+   @Fallback(EmptySetOnNotFoundOr404.class)
+   Set<PublicIpInstanceIdPair> describeAddressesInRegion(
+            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
+            @BinderParam(BindPublicIpsToIndexedFormParams.class) String... publicIps);
+
+}