http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/predicates/VolumeAvailable.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/predicates/VolumeAvailable.java
 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/predicates/VolumeAvailable.java
new file mode 100644
index 0000000..051531c
--- /dev/null
+++ 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/predicates/VolumeAvailable.java
@@ -0,0 +1,55 @@
+/*
+ * 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.predicates;
+
+import javax.annotation.Resource;
+import javax.inject.Singleton;
+
+import org.jclouds.ec2.domain.Volume;
+import org.jclouds.ec2.features.ElasticBlockStoreApi;
+import org.jclouds.logging.Logger;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+import com.google.inject.Inject;
+
+/**
+ * 
+ * Tests to see if a volume is completed.
+ */
+@Singleton
+public class VolumeAvailable implements Predicate<Volume> {
+
+   private final ElasticBlockStoreApi client;
+   @Resource
+   protected Logger logger = Logger.NULL;
+
+   @Inject
+   public VolumeAvailable(ElasticBlockStoreApi client) {
+      this.client = client;
+   }
+
+   public boolean apply(Volume volume) {
+      logger.trace("looking for status on volume %s", volume.getId());
+      volume = 
Iterables.getOnlyElement(client.describeVolumesInRegion(volume.getRegion(), 
volume
+               .getId()));
+      logger.trace("%s: looking for status %s: currently: %s", volume, 
Volume.Status.AVAILABLE,
+               volume.getStatus());
+      return volume.getStatus() == Volume.Status.AVAILABLE;
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/predicates/VolumeDetached.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/predicates/VolumeDetached.java
 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/predicates/VolumeDetached.java
new file mode 100644
index 0000000..55995bb
--- /dev/null
+++ 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/predicates/VolumeDetached.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.predicates;
+
+import static com.google.common.collect.Iterables.getLast;
+
+import javax.annotation.Resource;
+
+import org.jclouds.ec2.domain.Attachment;
+import org.jclouds.ec2.domain.Volume;
+import org.jclouds.ec2.features.ElasticBlockStoreApi;
+import org.jclouds.logging.Logger;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+/**
+ * Tests to see if a volume is detached.
+ */
+@Singleton
+public class VolumeDetached implements Predicate<Attachment> {
+
+   private final ElasticBlockStoreApi client;
+   @Resource
+   protected Logger logger = Logger.NULL;
+
+   @Inject
+   public VolumeDetached(ElasticBlockStoreApi client) {
+      this.client = client;
+   }
+
+   public boolean apply(Attachment attachment) {
+      logger.trace("looking for volume %s", attachment.getVolumeId());
+      Volume volume = 
Iterables.getOnlyElement(client.describeVolumesInRegion(attachment
+              .getRegion(), attachment.getVolumeId()));
+
+      /*If attachment size is 0 volume is detached for sure.*/
+      if (volume.getAttachments().size() == 0) {
+         return true;
+      }
+
+      /* But if attachment size is > 0, then the attachment could be in any 
state.
+         * So we need to check if the status is DETACHED (return true) or not 
(return false).
+         */
+      Attachment lastAttachment = getLast(volume.getAttachments());
+      logger.trace("%s: looking for status %s: currently: %s", lastAttachment,
+              Attachment.Status.DETACHED, lastAttachment.getStatus());
+      return lastAttachment.getStatus() == Attachment.Status.DETACHED;
+   }
+}
+

http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/reference/EC2Constants.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/reference/EC2Constants.java
 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/reference/EC2Constants.java
new file mode 100644
index 0000000..a30c627
--- /dev/null
+++ 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/reference/EC2Constants.java
@@ -0,0 +1,50 @@
+/*
+ * 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.reference;
+
+
+/**
+ * Configuration properties and constants used in EC2 connections.
+ */
+public class EC2Constants {
+   /**
+    * Listing the universe of amis is extremely expensive. set this to a comma 
separated value of
+    * the ami owners you wish to use in {@link ComputeService}
+    */
+   public static final String PROPERTY_EC2_AMI_OWNERS = 
"jclouds.ec2.ami-owners";
+
+   /**
+    * Eventual consistency delay for retrieving a security group after it is 
created (in ms)
+    */
+   public static final String PROPERTY_EC2_TIMEOUT_SECURITYGROUP_PRESENT = 
"jclouds.ec2.timeout.securitygroup-present";
+
+   /**
+    * Whenever a node is created, automatically allocate and assign an elastic 
ip address, also
+    * deallocate when the node is destroyed.
+    */
+   public static final String PROPERTY_EC2_AUTO_ALLOCATE_ELASTIC_IPS = 
"jclouds.ec2.auto-allocate-elastic-ips";
+   
+   /**
+    * If this property is set to true(default), jclouds generate a name for 
each instance based on the group. ex.
+    * i-ef34ae2 becomes hadoop-ef34ae2. Note that this depends on {@link 
EC2Api#getTagApi} returning present.
+    */
+   public static final String PROPERTY_EC2_GENERATE_INSTANCE_NAMES = 
"jclouds.ec2.generate-instance-names";
+
+   protected EC2Constants() {
+      throw new AssertionError("intentionally unimplemented");
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/suppliers/DescribeAvailabilityZonesInRegion.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/suppliers/DescribeAvailabilityZonesInRegion.java
 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/suppliers/DescribeAvailabilityZonesInRegion.java
new file mode 100644
index 0000000..f97e962
--- /dev/null
+++ 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/suppliers/DescribeAvailabilityZonesInRegion.java
@@ -0,0 +1,92 @@
+/*
+ * 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.suppliers;
+
+import java.util.Map;
+import java.util.Set;
+
+import javax.annotation.Resource;
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.ec2.EC2Api;
+import org.jclouds.ec2.domain.AvailabilityZoneInfo;
+import org.jclouds.ec2.features.AvailabilityZoneAndRegionApi;
+import org.jclouds.http.HttpResponseException;
+import org.jclouds.location.Region;
+import org.jclouds.location.suppliers.RegionIdToZoneIdsSupplier;
+import org.jclouds.logging.Logger;
+import org.jclouds.util.Suppliers2;
+
+import com.google.common.base.Function;
+import com.google.common.base.Supplier;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableMap.Builder;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Maps;
+
+@Singleton
+public class DescribeAvailabilityZonesInRegion implements 
RegionIdToZoneIdsSupplier {
+   @Resource
+   protected Logger logger = Logger.NULL;
+
+   private final AvailabilityZoneAndRegionApi client;
+   private final Supplier<Set<String>> regions;
+
+   @Inject
+   public DescribeAvailabilityZonesInRegion(EC2Api client, @Region 
Supplier<Set<String>> regions) {
+      this.client = client.getAvailabilityZoneAndRegionApi().get();
+      this.regions = regions;
+   }
+
+   @Override
+   public Map<String, Supplier<Set<String>>> get() {
+      Builder<String, Set<String>> map = ImmutableMap.builder();
+      HttpResponseException exception = null;
+      // TODO: this should be parallel
+      for (String region : regions.get()) {
+         try {
+            ImmutableSet<String> zones = 
ImmutableSet.copyOf(Iterables.transform(client
+                     .describeAvailabilityZonesInRegion(region), new 
Function<AvailabilityZoneInfo, String>() {
+
+               @Override
+               public String apply(AvailabilityZoneInfo arg0) {
+                  return arg0.getZone();
+               }
+
+            }));
+            if (zones.size() > 0)
+               map.put(region, zones);
+         } catch (HttpResponseException e) {
+            // TODO: this should be in retry handler, not here.
+            if (e.getMessage().contains("Unable to tunnel through proxy")) {
+               exception = e;
+               logger.error(e, "Could not describe availability zones in 
Region: %s", region);
+            } else {
+               throw e;
+            }
+         }
+      }
+      ImmutableMap<String, Set<String>> result = map.build();
+      if (result.isEmpty() && exception != null) {
+         throw exception;
+      }
+      return Maps.transformValues(result, Suppliers2.<Set<String>> 
ofInstanceFunction());
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/suppliers/DescribeRegionsForRegionURIs.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/suppliers/DescribeRegionsForRegionURIs.java
 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/suppliers/DescribeRegionsForRegionURIs.java
new file mode 100644
index 0000000..d8d7a51
--- /dev/null
+++ 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/suppliers/DescribeRegionsForRegionURIs.java
@@ -0,0 +1,50 @@
+/*
+ * 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.suppliers;
+
+import java.net.URI;
+import java.util.Map;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.ec2.EC2Api;
+import org.jclouds.ec2.features.AvailabilityZoneAndRegionApi;
+import org.jclouds.location.Region;
+import org.jclouds.location.suppliers.RegionIdToURISupplier;
+import org.jclouds.util.Suppliers2;
+
+import com.google.common.base.Supplier;
+import com.google.common.collect.Maps;
+
+@Singleton
+public class DescribeRegionsForRegionURIs implements RegionIdToURISupplier {
+   private final AvailabilityZoneAndRegionApi client;
+
+   @Inject
+   public DescribeRegionsForRegionURIs(EC2Api client) {
+      this.client = client.getAvailabilityZoneAndRegionApi().get();
+   }
+
+   @Singleton
+   @Region
+   @Override
+   public Map<String, Supplier<URI>> get() {
+      Map<String, URI> regionToUris = client.describeRegions();
+      return Maps.transformValues(regionToUris, Suppliers2.<URI> 
ofInstanceFunction());
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/util/IpPermissions.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/util/IpPermissions.java
 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/util/IpPermissions.java
new file mode 100644
index 0000000..99e2524
--- /dev/null
+++ 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/util/IpPermissions.java
@@ -0,0 +1,195 @@
+/*
+ * 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.util;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.jclouds.net.domain.IpPermission;
+import org.jclouds.net.domain.IpProtocol;
+import org.jclouds.util.Maps2;
+
+import com.google.common.annotations.Beta;
+import com.google.common.base.Function;
+import com.google.common.collect.ImmutableMultimap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Multimap;
+import com.google.common.collect.Multimaps;
+
+/**
+ *
+ * Shortcut to create ingress rules
+ */
+public class IpPermissions extends IpPermission {
+
+   protected IpPermissions(IpProtocol ipProtocol, int fromPort, int toPort,
+         Multimap<String, String> userIdGroupPairs, Iterable<String> groupIds, 
Iterable<String> ipRanges) {
+      super(ipProtocol, fromPort, toPort, userIdGroupPairs, groupIds, 
userIdGroupPairs.size() == 0 ? ipRanges
+            : ImmutableSet.<String> of());
+   }
+
+   /**
+    * don't rely on this being here.. it will move
+    */
+   @Beta
+   public static Multimap<String, String> buildFormParametersForIndex(final 
int index, IpPermission permission) {
+      Map<String, String> headers = Maps.newLinkedHashMap();
+      headers.put("IpPermissions.%d.IpProtocol", 
permission.getIpProtocol().toString());
+      headers.put("IpPermissions.%d.FromPort", permission.getFromPort() + "");
+      headers.put("IpPermissions.%d.ToPort", permission.getToPort() + "");
+      String prefix = "IpPermissions.%d.IpRanges.";
+      int i = 0;
+      for (String cidrIp : checkNotNull(permission.getCidrBlocks(), 
"cidrIps")) {
+         headers.put(prefix + i++ + ".CidrIp", cidrIp);
+      }
+      prefix = "IpPermissions.%d.Groups.";
+      i = 0;
+      for (String groupId : checkNotNull(permission.getGroupIds(), 
"groupIds")) {
+         headers.put(prefix + i++ + ".GroupId", groupId);
+      }
+      prefix = "IpPermissions.%d.Groups.";
+      i = 0;
+      for (Entry<String, String> tenantIdGroupNamePair : 
checkNotNull(permission.getTenantIdGroupNamePairs(),
+            "tenantIdGroupNamePairs").entries()) {
+         headers.put(prefix + i + ".UserId", tenantIdGroupNamePair.getKey());
+         headers.put(prefix + i + ".GroupId", 
tenantIdGroupNamePair.getValue());
+         i++;
+      }
+      prefix = "IpPermissions.%d.IpRanges.";
+      i = 0;
+      for (String cidrIp : checkNotNull(permission.getCidrBlocks(), 
"cidrIps")) {
+         headers.put(prefix + i++ + ".CidrIp", cidrIp);
+      }
+      return Multimaps.forMap(Maps2.transformKeys(headers, new 
Function<String, String>() {
+
+         @Override
+         public String apply(String arg0) {
+            return String.format(arg0, index);
+         }
+
+      }));
+   }
+
+   public static ICMPTypeSelection permitICMP() {
+      return new ICMPTypeSelection();
+   }
+
+   public static ToSourceSelection permitAnyProtocol() {
+      return new ToSourceSelection(IpProtocol.ALL, 1, 65535);
+   }
+
+   public static PortSelection permit(IpProtocol protocol) {
+      return new PortSelection(checkNotNull(protocol, "protocol"));
+   }
+
+   public static class ICMPTypeSelection extends ToSourceSelection {
+
+      ICMPTypeSelection() {
+         super(IpProtocol.ICMP, -1, -1);
+      }
+
+      /**
+       * @param type ex. 8 for ECHO (i.e. Ping)
+       * @see <a 
href="http://www.iana.org/assignments/icmp-parameters/icmp-parameters.xml";> 
ICMP Types</a>
+       */
+      public AndCodeSelection type(int type) {
+         return new AndCodeSelection(type);
+      }
+   }
+
+   public static class AndCodeSelection extends ToSourceSelection {
+      AndCodeSelection(int type) {
+         super(IpProtocol.ICMP, type, -1);
+      }
+
+      public ToSourceSelection andCode(int code) {
+         return new ToSourceSelection(getIpProtocol(), getFromPort(), code);
+      }
+
+   }
+
+   public static class PortSelection extends ToSourceSelection {
+
+      PortSelection(IpProtocol ipProtocol) {
+         super(ipProtocol, ipProtocol == IpProtocol.ICMP ? -1 : 1, ipProtocol 
== IpProtocol.ICMP ? -1 : 65535);
+      }
+
+      public ToPortSelection fromPort(int port) {
+         return new ToPortSelection(getIpProtocol(), port);
+      }
+
+      public ToSourceSelection port(int port) {
+         return new ToSourceSelection(getIpProtocol(), port, port);
+      }
+   }
+
+   public static class ToPortSelection extends ToSourceSelection {
+
+      ToPortSelection(IpProtocol ipProtocol, int fromPort) {
+         super(ipProtocol, fromPort, ipProtocol == IpProtocol.ICMP ? -1 : 
65535);
+      }
+
+      public ToSourceSelection to(int port) {
+         return new ToSourceSelection(getIpProtocol(), getFromPort(), port);
+      }
+   }
+
+   public static class ToVPCSourceSelection extends IpPermissions {
+
+      protected ToVPCSourceSelection(IpProtocol ipProtocol, int fromPort, int 
toPort) {
+         super(ipProtocol, fromPort, toPort, ImmutableMultimap.<String, 
String> of(), ImmutableSet.<String> of(),
+               ImmutableSet.of("0.0.0.0/0"));
+      }
+
+      public IpPermissions originatingFromSecurityGroupId(String groupId) {
+         return toVPCSecurityGroups(ImmutableSet.of(checkNotNull(groupId, 
"groupId")));
+      }
+
+      public IpPermissions toVPCSecurityGroups(Iterable<String> groupIds) {
+         return new IpPermissions(getIpProtocol(), getFromPort(), getToPort(), 
getTenantIdGroupNamePairs(), groupIds,
+               ImmutableSet.<String> of());
+      }
+   }
+
+   public static class ToSourceSelection extends ToVPCSourceSelection {
+      ToSourceSelection(IpProtocol ipProtocol, int fromPort, int toPort) {
+         super(ipProtocol, fromPort, toPort);
+      }
+
+      public IpPermissions originatingFromCidrBlock(String cidrIp) {
+         return originatingFromCidrBlocks(ImmutableSet.of(checkNotNull(cidrIp, 
"cidrIp")));
+      }
+
+      public IpPermissions originatingFromCidrBlocks(Iterable<String> cidrIps) 
{
+         return new IpPermissions(getIpProtocol(), getFromPort(), getToPort(),
+               ImmutableMultimap.<String, String> of(), ImmutableSet.<String> 
of(), cidrIps);
+      }
+
+      public IpPermissions originatingFromUserAndSecurityGroup(String userId, 
String groupName) {
+         return toEC2SecurityGroups(ImmutableMultimap.of(checkNotNull(userId, 
"userId"),
+               checkNotNull(groupName, "groupName")));
+      }
+
+      public IpPermissions toEC2SecurityGroups(Multimap<String, String> 
tenantIdGroupNamePairs) {
+         return new IpPermissions(getIpProtocol(), getFromPort(), getToPort(), 
tenantIdGroupNamePairs, getGroupIds(),
+               ImmutableSet.<String> of());
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/util/SubnetFilterBuilder.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/util/SubnetFilterBuilder.java
 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/util/SubnetFilterBuilder.java
new file mode 100644
index 0000000..e1a23b3
--- /dev/null
+++ 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/util/SubnetFilterBuilder.java
@@ -0,0 +1,249 @@
+/*
+ * 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.util;
+
+import java.util.Comparator;
+import java.util.Map.Entry;
+
+import org.jclouds.ec2.domain.Subnet;
+
+import com.google.common.annotations.Beta;
+import com.google.common.collect.ImmutableMultimap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Multimap;
+
+/**
+ * You can specify filters so that the response includes information for only
+ * certain subnets. For example, you can use a filter to specify that you're
+ * interested in the subnets in the available state. You can specify multiple
+ * values for a filter. The response includes information for a subnet only if
+ * it matches at least one of the filter values that you specified.
+ *
+ * You can specify multiple filters; for example, specify subnets that are in a
+ * specific VPC and are in the available state. The response includes
+ * information for a subnet only if it matches all the filters that you
+ * specified. If there's no match, no special message is returned, the response
+ * is simply empty.
+ * 
+ * <h4>Wildcards</h4> You can use wildcards with the filter values: {@code *}
+ * matches zero or more characters, and ? matches exactly one character. You 
can
+ * escape special characters using a backslash before the character. For
+ * example, a value of {@code \*amazon\?\\} searches for the literal string
+ * {@code *amazon?\}.
+ * 
+ * @see SubnetApi
+ */
+public class SubnetFilterBuilder extends ImmutableMultimap.Builder<String, 
String> {
+
+    private static final String AVAILABILITY_ZONE = "availability-zone";
+    private static final String AVAILABLE_IP_ADDRESS_COUNT = 
"available-ip-address-count";
+    private static final String CIDR = "cidr";
+    private static final String STATE = "state";
+    private static final String SUBNET_ID = "subnet-id";
+    private static final String TAG_KEY = "tag-key";
+    private static final String TAG_VALUE = "tag-value";
+    private static final String TAG_ARBITRARY_BASE = "tag:";
+    private static final String VPC_ID = "vpc-id";
+
+    public SubnetFilterBuilder availabilityZone(String availabilityZone) {
+        return put(AVAILABILITY_ZONE, availabilityZone);
+    }
+
+    public SubnetFilterBuilder availabilityZones(String... availabilityZones) {
+        return putAll(AVAILABILITY_ZONE, availabilityZones);
+    }
+
+    public SubnetFilterBuilder availabilityZones(Iterable<String> 
availabilityZones) {
+        return putAll(AVAILABILITY_ZONE, availabilityZones);
+    }
+
+    public SubnetFilterBuilder anyAvailabilityZone() {
+        return putAll(AVAILABILITY_ZONE, ImmutableSet.<String> of());
+    }
+
+    public SubnetFilterBuilder availableIpAddressCount(String 
availableIpAddressCount) {
+        return put(AVAILABLE_IP_ADDRESS_COUNT, availableIpAddressCount);
+    }
+
+    public SubnetFilterBuilder availableIpAddressCounts(String... 
availableIpAddressCounts) {
+        return putAll(AVAILABLE_IP_ADDRESS_COUNT, availableIpAddressCounts);
+    }
+
+    public SubnetFilterBuilder availableIpAddressCounts(Iterable<String> 
availableIpAddressCounts) {
+        return putAll(AVAILABLE_IP_ADDRESS_COUNT, availableIpAddressCounts);
+    }
+
+    public SubnetFilterBuilder anyAvailableIpAddressCount() {
+        return putAll(AVAILABLE_IP_ADDRESS_COUNT, ImmutableSet.<String> of());
+    }
+
+    public SubnetFilterBuilder cidr(String cidr) {
+        return put(CIDR, cidr);
+    }
+
+    public SubnetFilterBuilder cidrs(String... cidrs) {
+        return putAll(CIDR, cidrs);
+    }
+
+    public SubnetFilterBuilder cidrs(Iterable<String> cidrs) {
+        return putAll(CIDR, cidrs);
+    }
+
+    public SubnetFilterBuilder anyCidr() {
+        return putAll(CIDR, ImmutableSet.<String> of());
+    }
+
+    public SubnetFilterBuilder state(String state) {
+        return put(STATE, state);
+    }
+
+    public SubnetFilterBuilder states(String... states) {
+        return putAll(STATE, states);
+    }
+
+    public SubnetFilterBuilder states(Iterable<String> states) {
+        return putAll(STATE, states);
+    }
+
+    public SubnetFilterBuilder anyState() {
+        return putAll(STATE, ImmutableSet.<String> of());
+    }
+
+    public SubnetFilterBuilder available() {
+        return put(STATE, Subnet.State.AVAILABLE.value());
+    }
+
+    public SubnetFilterBuilder pending() {
+        return put(STATE, Subnet.State.PENDING.value());
+    }
+
+    public SubnetFilterBuilder subnetId(String subnetId) {
+        return put(SUBNET_ID, subnetId);
+    }
+
+    public SubnetFilterBuilder subnetIds(String... subnetIds) {
+        return putAll(SUBNET_ID, subnetIds);
+    }
+
+    public SubnetFilterBuilder subnetIds(Iterable<String> subnetIds) {
+        return putAll(SUBNET_ID, subnetIds);
+    }
+
+    public SubnetFilterBuilder anySubnetId() {
+        return putAll(SUBNET_ID, ImmutableSet.<String> of());
+    }
+
+    public SubnetFilterBuilder tagKey(String tagKey) {
+        return put(TAG_KEY, tagKey);
+    }
+
+    public SubnetFilterBuilder tagKeys(String... tagKeys) {
+        return putAll(TAG_KEY, tagKeys);
+    }
+
+    public SubnetFilterBuilder tagKeys(Iterable<String> tagKeys) {
+        return putAll(TAG_KEY, tagKeys);
+    }
+
+    public SubnetFilterBuilder anyTagKey() {
+        return putAll(TAG_KEY, ImmutableSet.<String> of());
+    }
+
+    public SubnetFilterBuilder tagValue(String tagValue) {
+        return put(TAG_VALUE, tagValue);
+    }
+
+    public SubnetFilterBuilder tagValues(String... tagValues) {
+        return putAll(TAG_VALUE, tagValues);
+    }
+
+    public SubnetFilterBuilder tagValues(Iterable<String> tagValues) {
+        return putAll(TAG_VALUE, tagValues);
+    }
+
+    public SubnetFilterBuilder anyTagValue() {
+        return putAll(TAG_VALUE, ImmutableSet.<String> of());
+    }
+
+    public SubnetFilterBuilder vpcId(String vpcId) {
+        return put(VPC_ID, vpcId);
+    }
+
+    public SubnetFilterBuilder vpcIds(String... vpcIds) {
+        return putAll(VPC_ID, vpcIds);
+    }
+
+    public SubnetFilterBuilder vpcIds(Iterable<String> vpcIds) {
+        return putAll(VPC_ID, vpcIds);
+    }
+
+    public SubnetFilterBuilder anyVpcId() {
+        return putAll(VPC_ID, ImmutableSet.<String> of());
+    }
+
+    public SubnetFilterBuilder arbitraryTag(String arbitraryTagKey, String 
arbitraryTagValue) {
+        return put(TAG_ARBITRARY_BASE + arbitraryTagKey, arbitraryTagValue);
+    }
+
+    public SubnetFilterBuilder arbitraryTag(String arbitraryTagKey, String... 
arbitraryTagValues) {
+        return putAll(TAG_ARBITRARY_BASE + arbitraryTagKey, 
arbitraryTagValues);
+    }
+
+    public SubnetFilterBuilder arbitraryTag(String arbitraryTagKey, 
Iterable<String> arbitraryTagValues) {
+        return putAll(TAG_ARBITRARY_BASE + arbitraryTagKey, 
arbitraryTagValues);
+    }
+
+
+    // to set correct return val in chain
+
+    @Override
+    public SubnetFilterBuilder put(String key, String value) {
+        return SubnetFilterBuilder.class.cast(super.put(key, value));
+    }
+
+    @Override
+    public SubnetFilterBuilder put(Entry<? extends String, ? extends String> 
entry) {
+        return SubnetFilterBuilder.class.cast(super.put(entry));
+    }
+
+    @Override
+    public SubnetFilterBuilder putAll(String key, Iterable<? extends String> 
values) {
+        return SubnetFilterBuilder.class.cast(super.putAll(key, values));
+    }
+
+    @Override
+    public SubnetFilterBuilder putAll(String key, String... values) {
+        return SubnetFilterBuilder.class.cast(super.putAll(key, values));
+    }
+
+    @Override
+    public SubnetFilterBuilder putAll(Multimap<? extends String, ? extends 
String> multimap) {
+        return SubnetFilterBuilder.class.cast(super.putAll(multimap));
+    }
+
+    @Override
+    @Beta
+    public SubnetFilterBuilder orderKeysBy(Comparator<? super String> 
keyComparator) {
+        return 
SubnetFilterBuilder.class.cast(super.orderKeysBy(keyComparator));
+    }
+
+    @Override
+    @Beta
+    public SubnetFilterBuilder orderValuesBy(Comparator<? super String> 
valueComparator) {
+        return 
SubnetFilterBuilder.class.cast(super.orderValuesBy(valueComparator));
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/util/TagFilterBuilder.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/util/TagFilterBuilder.java
 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/util/TagFilterBuilder.java
new file mode 100644
index 0000000..f0b5715
--- /dev/null
+++ 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/util/TagFilterBuilder.java
@@ -0,0 +1,222 @@
+/*
+ * 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.util;
+
+import java.util.Comparator;
+import java.util.Map.Entry;
+
+import org.jclouds.ec2.domain.Tag;
+
+import com.google.common.annotations.Beta;
+import com.google.common.collect.ImmutableMultimap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Multimap;
+
+/**
+ * You can use filters to limit the results when describing tags. For example,
+ * you could get only the tags for a particular resource type. You can specify
+ * multiple values for a filter. A tag must match at least one of the specified
+ * values for it to be included in the results.
+ * 
+ * You can specify multiple filters (for example, limit the results to a
+ * specific resource type, and get only tags with values that contain the 
string
+ * database). The result includes information for a particular tag only if it
+ * matches all your filters. If there's no match, no special message is
+ * returned; the response is simply empty.
+ * 
+ * <h4>Wildcards</h4> You can use wildcards with the filter values: {@code *}
+ * matches zero or more characters, and ? matches exactly one character. You 
can
+ * escape special characters using a backslash before the character. For
+ * example, a value of {@code \*amazon\?\\} searches for the literal string
+ * {@code *amazon?\}.
+ * 
+ * @see TagApi
+ */
+public class TagFilterBuilder extends ImmutableMultimap.Builder<String, 
String> {
+
+   private static final String KEY = "key";
+   private static final String VALUE = "value";
+   private static final String RESOURCE_ID = "resource-id";
+   private static final String RESOURCE_TYPE = "resource-type";
+
+   public TagFilterBuilder key(String key) {
+      return put(KEY, key);
+   }
+
+   public TagFilterBuilder keys(String... keys) {
+      return putAll(KEY, keys);
+   }
+
+   public TagFilterBuilder keys(Iterable<String> keys) {
+      return putAll(KEY, keys);
+   }
+
+   public TagFilterBuilder anyKey() {
+      return putAll(KEY, ImmutableSet.<String> of());
+   }
+
+   public TagFilterBuilder value(String value) {
+      return put(VALUE, value);
+   }
+
+   public TagFilterBuilder values(String... values) {
+      return putAll(VALUE, ImmutableSet.<String> copyOf(values));
+   }
+
+   public TagFilterBuilder values(Iterable<String> values) {
+      return putAll(VALUE, ImmutableSet.<String> copyOf(values));
+   }
+
+   public TagFilterBuilder anyValue() {
+      return putAll(VALUE, ImmutableSet.<String> of());
+   }
+
+   public TagFilterBuilder resourceId(String resourceId) {
+      return put(RESOURCE_ID, resourceId);
+   }
+
+   public TagFilterBuilder resourceIds(String... resourceIds) {
+      return putAll(RESOURCE_ID, resourceIds);
+   }
+
+   public TagFilterBuilder resourceIds(Iterable<String> resourceIds) {
+      return putAll(RESOURCE_ID, resourceIds);
+   }
+
+   public TagFilterBuilder anyResourceId() {
+      return putAll(RESOURCE_ID, ImmutableSet.<String> of());
+   }
+
+   public TagFilterBuilder resourceType(String resourceType) {
+      return put(RESOURCE_TYPE, resourceType);
+   }
+
+   public TagFilterBuilder resourceTypes(String... resourceTypes) {
+      return putAll(RESOURCE_TYPE, resourceTypes);
+   }
+
+   public TagFilterBuilder resourceTypes(Iterable<String> resourceTypes) {
+      return putAll(RESOURCE_TYPE, resourceTypes);
+   }
+
+   public TagFilterBuilder anyResourceType() {
+      return putAll(RESOURCE_TYPE, ImmutableSet.<String> of());
+   }
+
+   public TagFilterBuilder customerGateway() {
+      return put(RESOURCE_TYPE, Tag.ResourceType.CUSTOMER_GATEWAY);
+   }
+
+   public TagFilterBuilder dhcpOptions() {
+      return put(RESOURCE_TYPE, Tag.ResourceType.DHCP_OPTIONS);
+   }
+
+   public TagFilterBuilder image() {
+      return put(RESOURCE_TYPE, Tag.ResourceType.IMAGE);
+   }
+
+   public TagFilterBuilder instance() {
+      return put(RESOURCE_TYPE, Tag.ResourceType.INSTANCE);
+   }
+
+   public TagFilterBuilder internetGateway() {
+      return put(RESOURCE_TYPE, Tag.ResourceType.INTERNET_GATEWAY);
+   }
+
+   public TagFilterBuilder networkAcl() {
+      return put(RESOURCE_TYPE, Tag.ResourceType.NETWORK_ACL);
+   }
+
+   public TagFilterBuilder reservedInstance() {
+      return put(RESOURCE_TYPE, Tag.ResourceType.RESERVED_INSTANCES);
+   }
+
+   public TagFilterBuilder routeTable() {
+      return put(RESOURCE_TYPE, Tag.ResourceType.ROUTE_TABLE);
+   }
+
+   public TagFilterBuilder securityGroup() {
+      return put(RESOURCE_TYPE, Tag.ResourceType.SECURITY_GROUP);
+   }
+
+   public TagFilterBuilder snapshot() {
+      return put(RESOURCE_TYPE, Tag.ResourceType.SNAPSHOT);
+   }
+
+   public TagFilterBuilder instancesRequest() {
+      return put(RESOURCE_TYPE, Tag.ResourceType.SPOT_INSTANCES_REQUEST);
+   }
+
+   public TagFilterBuilder subnet() {
+      return put(RESOURCE_TYPE, Tag.ResourceType.SUBNET);
+   }
+
+   public TagFilterBuilder volume() {
+      return put(RESOURCE_TYPE, Tag.ResourceType.VOLUME);
+   }
+
+   public TagFilterBuilder vpc() {
+      return put(RESOURCE_TYPE, Tag.ResourceType.VPC);
+   }
+
+   public TagFilterBuilder vpnConnection() {
+      return put(RESOURCE_TYPE, Tag.ResourceType.VPN_CONNECTION);
+   }
+
+   public TagFilterBuilder vpnGateway() {
+      return put(RESOURCE_TYPE, Tag.ResourceType.VPN_GATEWAY);
+   }
+
+   // to set correct return val in chain
+
+   @Override
+   public TagFilterBuilder put(String key, String value) {
+      return TagFilterBuilder.class.cast(super.put(key, value));
+   }
+
+   @Override
+   public TagFilterBuilder put(Entry<? extends String, ? extends String> 
entry) {
+      return TagFilterBuilder.class.cast(super.put(entry));
+   }
+
+   @Override
+   public TagFilterBuilder putAll(String key, Iterable<? extends String> 
values) {
+      return TagFilterBuilder.class.cast(super.putAll(key, values));
+   }
+
+   @Override
+   public TagFilterBuilder putAll(String key, String... values) {
+      return TagFilterBuilder.class.cast(super.putAll(key, values));
+   }
+
+   @Override
+   public TagFilterBuilder putAll(Multimap<? extends String, ? extends String> 
multimap) {
+      return TagFilterBuilder.class.cast(super.putAll(multimap));
+   }
+
+   @Override
+   @Beta
+   public TagFilterBuilder orderKeysBy(Comparator<? super String> 
keyComparator) {
+      return TagFilterBuilder.class.cast(super.orderKeysBy(keyComparator));
+   }
+
+   @Override
+   @Beta
+   public TagFilterBuilder orderValuesBy(Comparator<? super String> 
valueComparator) {
+      return TagFilterBuilder.class.cast(super.orderValuesBy(valueComparator));
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/util/Tags.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/util/Tags.java
 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/util/Tags.java
new file mode 100644
index 0000000..066f92c
--- /dev/null
+++ 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/util/Tags.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.ec2.util;
+
+import static com.google.common.collect.Multimaps.index;
+
+import java.util.Map;
+
+import org.jclouds.ec2.domain.Tag;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Maps;
+
+public class Tags {
+   private Tags() {
+   }
+
+   /**
+    * maps the input on {@link Tag#getResourceId()} with a value of a map of 
its {@link Tag#getKey()} to
+    * {@link Tag#getValue()}
+    */
+   public static Map<String, Map<String, String>> 
resourceToTagsAsMap(Iterable<Tag> tags) {
+      return Maps.transformValues(index(tags, resourceIdFunction()).asMap(),
+            new Function<Iterable<Tag>, Map<String, String>>() {
+               @Override
+               public Map<String, String> apply(Iterable<Tag> in) {
+                  return Maps.transformValues(Maps.uniqueIndex(in, 
keyFunction()), valueFunction());
+               }
+            });
+   }
+
+   public static enum ValueFunction implements Function<Tag, String> {
+      INSTANCE;
+      @Override
+      public String apply(Tag in) {
+         return in.getValue().or("");
+      }
+
+      @Override
+      public String toString() {
+         return "getValue()";
+      }
+   }
+
+   public static Function<Tag, String> valueFunction() {
+      return ValueFunction.INSTANCE;
+   }
+
+   public static enum KeyFunction implements Function<Tag, String> {
+      INSTANCE;
+      @Override
+      public String apply(Tag in) {
+         return in.getKey();
+      }
+
+      @Override
+      public String toString() {
+         return "getKey()";
+      }
+   }
+
+   public static Function<Tag, String> keyFunction() {
+      return KeyFunction.INSTANCE;
+   }
+
+   public static enum ResourceIdFunction implements Function<Tag, String> {
+      INSTANCE;
+      @Override
+      public String apply(Tag in) {
+         return in.getResourceId();
+      }
+
+      @Override
+      public String toString() {
+         return "getResourceId()";
+      }
+   }
+
+   public static Function<Tag, String> resourceIdFunction() {
+      return ResourceIdFunction.INSTANCE;
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/xml/AllocateAddressResponseHandler.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/xml/AllocateAddressResponseHandler.java
 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/xml/AllocateAddressResponseHandler.java
new file mode 100644
index 0000000..ec50f44
--- /dev/null
+++ 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/xml/AllocateAddressResponseHandler.java
@@ -0,0 +1,53 @@
+/*
+ * 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.xml;
+
+import javax.annotation.Resource;
+
+import org.jclouds.http.functions.ParseSax.HandlerWithResult;
+import org.jclouds.logging.Logger;
+
+public class AllocateAddressResponseHandler extends HandlerWithResult<String> {
+
+   @Resource
+   protected Logger logger = Logger.NULL;
+
+   private String ipAddress;
+   private StringBuilder currentText = new StringBuilder();
+
+   protected String currentOrNull() {
+      String returnVal = currentText.toString().trim();
+      return returnVal.equals("") ? null : returnVal;
+   }
+
+   public void endElement(String uri, String name, String qName) {
+      if (qName.equals("publicIp")) {
+         ipAddress = currentOrNull();
+      }
+      currentText = new StringBuilder();
+   }
+
+   public void characters(char ch[], int start, int length) {
+      currentText.append(ch, start, length);
+   }
+
+   @Override
+   public String getResult() {
+      return ipAddress;
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/xml/AttachmentHandler.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/xml/AttachmentHandler.java
 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/xml/AttachmentHandler.java
new file mode 100644
index 0000000..af532fa
--- /dev/null
+++ 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/xml/AttachmentHandler.java
@@ -0,0 +1,82 @@
+/*
+ * 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.xml;
+
+import java.util.Date;
+
+import javax.annotation.Resource;
+import javax.inject.Inject;
+
+import org.jclouds.aws.util.AWSUtils;
+import org.jclouds.date.DateCodec;
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.ec2.domain.Attachment;
+import org.jclouds.http.functions.ParseSax;
+import org.jclouds.location.Region;
+import org.jclouds.logging.Logger;
+
+import com.google.common.base.Supplier;
+
+public class AttachmentHandler extends 
ParseSax.HandlerForGeneratedRequestWithResult<Attachment> {
+
+   @Resource
+   protected Logger logger = Logger.NULL;
+
+   protected final DateCodec dateCodec;
+   protected final Supplier<String> defaultRegion;
+
+   @Inject
+   AttachmentHandler(DateCodecFactory dateCodecFactory, @Region 
Supplier<String> defaultRegion) {
+      this.dateCodec = dateCodecFactory.iso8601();
+      this.defaultRegion = defaultRegion;
+   }
+
+   private StringBuilder currentText = new StringBuilder();
+   private String volumeId;
+   private String instanceId;
+   private String device;
+   private Attachment.Status attachmentStatus;
+   private Date attachTime;
+
+   public Attachment getResult() {
+      String region = AWSUtils.findRegionInArgsOrNull(getRequest());
+      if (region == null)
+         region = defaultRegion.get();
+      return new Attachment(region, volumeId, instanceId, device, 
attachmentStatus, attachTime);
+   }
+
+   public void endElement(String uri, String name, String qName) {
+      if (qName.equals("volumeId")) {
+         volumeId = currentText.toString().trim();
+      } else if (qName.equals("volumeId")) {
+         volumeId = currentText.toString().trim();
+      } else if (qName.equals("status")) {
+         attachmentStatus = 
Attachment.Status.fromValue(currentText.toString().trim());
+      } else if (qName.equals("instanceId")) {
+         instanceId = currentText.toString().trim();
+      } else if (qName.equals("device")) {
+         device = currentText.toString().trim();
+      } else if (qName.equals("attachTime")) {
+         attachTime = dateCodec.toDate(currentText.toString().trim());
+      }
+      currentText = new StringBuilder();
+   }
+
+   public void characters(char ch[], int start, int length) {
+      currentText.append(ch, start, length);
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/xml/BaseReservationHandler.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/xml/BaseReservationHandler.java
 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/xml/BaseReservationHandler.java
new file mode 100644
index 0000000..969d8ac
--- /dev/null
+++ 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/xml/BaseReservationHandler.java
@@ -0,0 +1,213 @@
+/*
+ * 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.xml;
+
+import static org.jclouds.util.SaxUtils.currentOrNull;
+import static org.jclouds.util.SaxUtils.equalsOrSuffix;
+
+import java.util.Date;
+import java.util.Set;
+
+import javax.inject.Inject;
+
+import org.jclouds.aws.util.AWSUtils;
+import org.jclouds.date.DateCodec;
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.ec2.domain.Attachment;
+import org.jclouds.ec2.domain.BlockDevice;
+import org.jclouds.ec2.domain.InstanceState;
+import org.jclouds.ec2.domain.Reservation;
+import org.jclouds.ec2.domain.RootDeviceType;
+import org.jclouds.ec2.domain.RunningInstance;
+import org.jclouds.ec2.domain.RunningInstance.Builder;
+import 
org.jclouds.http.functions.ParseSax.HandlerForGeneratedRequestWithResult;
+import org.jclouds.location.Region;
+import org.xml.sax.Attributes;
+
+import com.google.common.base.Supplier;
+import com.google.common.collect.Sets;
+
+public abstract class BaseReservationHandler<T> extends 
HandlerForGeneratedRequestWithResult<T> {
+
+   protected final DateCodec dateCodec;
+   protected final Supplier<String> defaultRegion;
+
+   @Inject
+   public BaseReservationHandler(DateCodecFactory dateCodecFactory, @Region 
Supplier<String> defaultRegion) {
+      this.dateCodec = dateCodecFactory.iso8601();
+      this.defaultRegion = defaultRegion;
+   }
+
+   protected Builder<?> builder = newBuilder();
+
+   protected Builder<?> newBuilder() {
+      return RunningInstance.builder();
+   }
+
+   protected void inItem() {
+      if (endOfInstanceItem()) {
+         refineBuilderBeforeAddingInstance();
+         instances.add(builder.build());
+         builder = newBuilder();
+      }
+   }
+
+   protected StringBuilder currentText = new StringBuilder();
+   protected int itemDepth;
+   protected boolean inInstancesSet;
+   protected boolean inProductCodes;
+   protected boolean inGroupSet;
+
+   // attachments
+   private String volumeId;
+   private Attachment.Status attachmentStatus;
+   private Date attachTime;
+   private boolean deleteOnTermination;
+   private String deviceName;
+
+   // reservation stuff
+   private Set<String> groupNames = Sets.newLinkedHashSet();
+   private String ownerId;
+   private String requesterId;
+   private String reservationId;
+
+   private Set<RunningInstance> instances = Sets.newLinkedHashSet();
+
+
+   public void startElement(String uri, String name, String qName, Attributes 
attrs) {
+      if (equalsOrSuffix(qName, "item")) {
+         itemDepth++;
+      } else if (equalsOrSuffix(qName, "instancesSet")) {
+         inInstancesSet = true;
+      } else if (equalsOrSuffix(qName, "productCodes")) {
+         inProductCodes = true;
+      } else if (equalsOrSuffix(qName, "groupSet")) {
+         inGroupSet = true;
+      } 
+   }
+
+   public void endElement(String uri, String name, String qName) {
+      if (equalsOrSuffix(qName, "item")) {
+         inItem();
+         itemDepth--;
+      } else if (equalsOrSuffix(qName, "instancesSet")) {
+         inInstancesSet = false;
+      } else if (equalsOrSuffix(qName, "productCodes")) {
+         inProductCodes = false;
+      } else if (equalsOrSuffix(qName, "groupSet")) {
+         inGroupSet = false;
+      } else if (equalsOrSuffix(qName, "groupId")) {
+         groupNames.add(currentOrNull(currentText));
+      } else if (equalsOrSuffix(qName, "ownerId")) {
+         ownerId = currentOrNull(currentText);
+      } else if (equalsOrSuffix(qName, "requesterId")) {
+         requesterId = currentOrNull(currentText);
+      } else if (equalsOrSuffix(qName, "reservationId")) {
+         reservationId = currentOrNull(currentText);
+      } else if (equalsOrSuffix(qName, "amiLaunchIndex")) {
+         builder.amiLaunchIndex(currentOrNull(currentText));
+      } else if (equalsOrSuffix(qName, "dnsName")) {
+         builder.dnsName(currentOrNull(currentText));
+      } else if (equalsOrSuffix(qName, "imageId")) {
+         builder.imageId(currentOrNull(currentText));
+      } else if (equalsOrSuffix(qName, "instanceId")) {
+         builder.instanceId(currentOrNull(currentText));
+      } else if (equalsOrSuffix(qName, "name")) {
+         String rawState = currentOrNull(currentText);
+         if (rawState != null) {
+            builder.rawState(rawState);
+            builder.instanceState(InstanceState.fromValue(rawState));
+         }
+      } else if (equalsOrSuffix(qName, "instanceType")) {
+         builder.instanceType(currentOrNull(currentText));
+      } else if (equalsOrSuffix(qName, "ipAddress")) {
+         builder.ipAddress(currentOrNull(currentText));
+      } else if (equalsOrSuffix(qName, "kernelId")) {
+         builder.kernelId(currentOrNull(currentText));
+      } else if (equalsOrSuffix(qName, "keyName")) {
+         builder.keyName(currentOrNull(currentText));
+      } else if (equalsOrSuffix(qName, "launchTime")) {
+         builder.launchTime(dateCodec.toDate(currentOrNull(currentText)));
+      } else if (equalsOrSuffix(qName, "availabilityZone")) {
+         builder.availabilityZone(currentOrNull(currentText));
+      } else if (equalsOrSuffix(qName, "virtualizationType")) {
+         builder.virtualizationType(currentOrNull(currentText));
+      } else if (equalsOrSuffix(qName, "platform")) {
+         builder.platform(currentOrNull(currentText));
+      } else if (equalsOrSuffix(qName, "privateDnsName")) {
+         builder.privateDnsName(currentOrNull(currentText));
+      } else if (equalsOrSuffix(qName, "privateIpAddress")) {
+         builder.privateIpAddress(currentOrNull(currentText));
+      } else if (equalsOrSuffix(qName, "ramdiskId")) {
+         builder.ramdiskId(currentOrNull(currentText));
+      } else if (equalsOrSuffix(qName, "reason")) {
+         builder.reason(currentOrNull(currentText));
+      } else if (equalsOrSuffix(qName, "rootDeviceType")) {
+         
builder.rootDeviceType(RootDeviceType.fromValue(currentOrNull(currentText)));
+      } else if (equalsOrSuffix(qName, "rootDeviceName")) {
+         builder.rootDeviceName(currentOrNull(currentText));
+      } else if (equalsOrSuffix(qName, "deviceName")) {
+         deviceName = currentOrNull(currentText);
+      } else if (equalsOrSuffix(qName, "volumeId")) {
+         volumeId = currentOrNull(currentText);
+      } else if (equalsOrSuffix(qName, "status")) {
+         attachmentStatus = 
Attachment.Status.fromValue(currentText.toString().trim());
+      } else if (equalsOrSuffix(qName, "attachTime")) {
+         attachTime = dateCodec.toDate(currentOrNull(currentText));
+      } else if (equalsOrSuffix(qName, "deleteOnTermination")) {
+         deleteOnTermination = 
Boolean.parseBoolean(currentText.toString().trim());
+      } else if (equalsOrSuffix(qName, "ebs")) {
+         builder.device(deviceName, new BlockDevice(volumeId, 
attachmentStatus, attachTime, deleteOnTermination));
+         this.deviceName = null;
+         this.volumeId = null;
+         this.attachmentStatus = null;
+         this.attachTime = null;
+         this.deleteOnTermination = true;
+      }
+      currentText = new StringBuilder();
+   }
+
+
+   protected void refineBuilderBeforeAddingInstance() {
+      String region = getRequest() != null ? 
AWSUtils.findRegionInArgsOrNull(getRequest()) : null;
+      builder.region((region == null) ? defaultRegion.get() : region);
+      builder.groupNames(groupNames);
+   }
+
+   protected boolean endOfInstanceItem() {
+      return itemDepth <= 2 && inInstancesSet && !inProductCodes && 
!inGroupSet;
+   }
+
+   public void characters(char ch[], int start, int length) {
+      currentText.append(ch, start, length);
+   }
+
+   protected Reservation<? extends RunningInstance> newReservation() {
+      String region = getRequest() != null ? 
AWSUtils.findRegionInArgsOrNull(getRequest()) : null;
+      if (region == null)
+         region = defaultRegion.get();
+      Reservation<? extends RunningInstance> info = new 
Reservation<RunningInstance>(region, groupNames, instances,
+            ownerId, requesterId, reservationId);
+      this.groupNames = Sets.newLinkedHashSet();
+      this.instances = Sets.newLinkedHashSet();
+      this.ownerId = null;
+      this.requesterId = null;
+      this.reservationId = null;
+      return info;
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/xml/BlockDeviceMappingHandler.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/xml/BlockDeviceMappingHandler.java
 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/xml/BlockDeviceMappingHandler.java
new file mode 100644
index 0000000..962a53e
--- /dev/null
+++ 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/xml/BlockDeviceMappingHandler.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.xml;
+
+import java.util.Date;
+import java.util.Map;
+
+import org.jclouds.date.DateCodec;
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.ec2.domain.Attachment;
+import org.jclouds.ec2.domain.BlockDevice;
+import org.jclouds.http.functions.ParseSax;
+
+import com.google.common.collect.Maps;
+import com.google.inject.Inject;
+
+public class BlockDeviceMappingHandler extends
+         ParseSax.HandlerWithResult<Map<String, BlockDevice>> {
+   private StringBuilder currentText = new StringBuilder();
+
+   private Map<String, BlockDevice> ebsBlockDevices = Maps.newHashMap();
+   private String deviceName;
+   private String volumeId;
+   private boolean deleteOnTermination = true;// correct default is true.
+   private Attachment.Status attachmentStatus;
+   private Date attachTime;
+
+   protected final DateCodec dateCodec;
+
+   @Inject 
+   public BlockDeviceMappingHandler(DateCodecFactory dateCodecFactory) {
+      this.dateCodec = dateCodecFactory.iso8601();
+   }
+
+   public Map<String, BlockDevice> getResult() {
+      return ebsBlockDevices;
+   }
+
+   public void endElement(String uri, String name, String qName) {
+      if (qName.equals("deviceName")) {
+         deviceName = currentText.toString().trim();
+      } else if (qName.equals("volumeId")) {
+         volumeId = currentText.toString().trim();
+      } else if (qName.equals("deleteOnTermination")) {
+         deleteOnTermination = 
Boolean.parseBoolean(currentText.toString().trim());
+      } else if (qName.equals("status")) {
+         attachmentStatus = 
Attachment.Status.fromValue(currentText.toString().trim());
+      } else if (qName.equals("attachTime")) {
+         attachTime = dateCodec.toDate(currentText.toString().trim());
+      } else if (qName.equals("item")) {
+         ebsBlockDevices.put(deviceName, new BlockDevice(volumeId, 
attachmentStatus, attachTime, deleteOnTermination));
+          this.volumeId = null;
+          this.deviceName = null;
+          this.deleteOnTermination = true;
+          this.attachmentStatus = null;
+          this.attachTime = null;
+      }
+      currentText = new StringBuilder();
+   }
+
+   public void characters(char ch[], int start, int length) {
+      currentText.append(ch, start, length);
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/xml/BooleanValueHandler.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/xml/BooleanValueHandler.java
 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/xml/BooleanValueHandler.java
new file mode 100644
index 0000000..b043864
--- /dev/null
+++ 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/xml/BooleanValueHandler.java
@@ -0,0 +1,45 @@
+/*
+ * 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.xml;
+
+import org.jclouds.http.functions.ParseSax;
+
+/**
+ * 
+ * @see <a 
href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/index.html?ApiReference-query-DescribeInstanceAttribute.html";
+ *      />
+ */
+public class BooleanValueHandler extends ParseSax.HandlerWithResult<Boolean> {
+
+   private StringBuilder currentText = new StringBuilder();
+   private boolean value;
+
+   public Boolean getResult() {
+      return value;
+   }
+
+   public void endElement(String uri, String name, String qName) {
+      if (qName.equalsIgnoreCase("value")) {
+         this.value = Boolean.parseBoolean(currentText.toString().trim());
+      }
+      currentText = new StringBuilder();
+   }
+
+   public void characters(char ch[], int start, int length) {
+      currentText.append(ch, start, length);
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/xml/BundleTaskHandler.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/xml/BundleTaskHandler.java
 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/xml/BundleTaskHandler.java
new file mode 100644
index 0000000..48419af
--- /dev/null
+++ 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/xml/BundleTaskHandler.java
@@ -0,0 +1,107 @@
+/*
+ * 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.xml;
+
+import java.util.Date;
+
+import javax.inject.Inject;
+
+import org.jclouds.aws.util.AWSUtils;
+import org.jclouds.date.DateCodec;
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.ec2.domain.BundleTask;
+import org.jclouds.http.functions.ParseSax;
+import org.jclouds.location.Region;
+
+import com.google.common.base.Supplier;
+
+public class BundleTaskHandler extends 
ParseSax.HandlerForGeneratedRequestWithResult<BundleTask> {
+   protected final DateCodec dateCodec;
+   protected final Supplier<String> defaultRegion;
+
+   @Inject
+   protected BundleTaskHandler(DateCodecFactory dateCodecFactory, @Region 
Supplier<String> defaultRegion) {
+      this.dateCodec = dateCodecFactory.iso8601();
+      this.defaultRegion = defaultRegion;
+   }
+
+   private StringBuilder currentText = new StringBuilder();
+
+   private String bundleId;
+   private String code;
+   private String message;
+   private String instanceId;
+   private int progress = 0;
+   private Date startTime;
+   private String state;
+   private String bucket;
+   private String prefix;
+   private Date updateTime;
+
+   public BundleTask getResult() {
+      String region = AWSUtils.findRegionInArgsOrNull(getRequest());
+      if (region == null)
+         region = defaultRegion.get();
+      BundleTask.Error error = null;
+      if (code != null)
+         error = new BundleTask.Error(code, message);
+      BundleTask returnVal = new BundleTask(region, bundleId, error, 
instanceId, progress, startTime,
+            state, bucket, prefix, updateTime);
+      this.bundleId = null;
+      this.code = null;
+      this.message = null;
+      this.instanceId = null;
+      this.progress = 0;
+      this.startTime = null;
+      this.state = null;
+      this.bucket = null;
+      this.prefix = null;
+      this.updateTime = null;
+      return returnVal;
+   }
+
+   public void endElement(String uri, String name, String qName) {
+      if (qName.equals("bundleId")) {
+         bundleId = currentText.toString().trim();
+      } else if (qName.equals("code")) {
+         code = currentText.toString().trim();
+      } else if (qName.equals("message")) {
+         message = currentText.toString().trim();
+      } else if (qName.equals("instanceId")) {
+         instanceId = currentText.toString().trim();
+      } else if (qName.equals("progress")) {
+         String temp = currentText.toString().trim();
+         temp = temp.substring(0, temp.length() - 1);
+         progress = Integer.parseInt(temp);
+      } else if (qName.equals("startTime")) {
+         startTime = dateCodec.toDate(currentText.toString().trim());
+      } else if (qName.equals("state")) {
+         state = currentText.toString().trim();
+      } else if (qName.equals("bucket")) {
+         bucket = currentText.toString().trim();
+      } else if (qName.equals("prefix")) {
+         prefix = currentText.toString().trim();
+      } else if (qName.equals("updateTime")) {
+         updateTime = dateCodec.toDate(currentText.toString().trim());
+      }
+      currentText = new StringBuilder();
+   }
+
+   public void characters(char ch[], int start, int length) {
+      currentText.append(ch, start, length);
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/xml/CreateVolumeResponseHandler.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/xml/CreateVolumeResponseHandler.java
 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/xml/CreateVolumeResponseHandler.java
new file mode 100644
index 0000000..af910a7
--- /dev/null
+++ 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/xml/CreateVolumeResponseHandler.java
@@ -0,0 +1,207 @@
+/*
+ * 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.xml;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import javax.inject.Inject;
+import java.util.Date;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import com.google.common.base.Supplier;
+import com.google.common.base.Suppliers;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+import org.jclouds.aws.util.AWSUtils;
+import org.jclouds.date.DateCodec;
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.ec2.domain.Attachment;
+import org.jclouds.ec2.domain.Volume;
+import org.jclouds.http.HttpRequest;
+import org.jclouds.http.functions.ParseSax;
+import org.jclouds.location.Region;
+import org.jclouds.location.Zone;
+import org.jclouds.rest.internal.GeneratedHttpRequest;
+import org.xml.sax.Attributes;
+
+public class CreateVolumeResponseHandler extends 
ParseSax.HandlerForGeneratedRequestWithResult<Volume> {
+   protected final DateCodec dateCodec;
+   protected final Supplier<String> defaultRegion;
+   protected final Supplier<Map<String, Supplier<Set<String>>>> 
regionToZonesSupplier;
+   protected final Supplier<Set<String>> zonesSupplier;
+
+   @Inject
+   protected CreateVolumeResponseHandler(DateCodecFactory dateCodecFactory, 
@Region Supplier<String> defaultRegion,
+            @Zone Supplier<Map<String, Supplier<Set<String>>>> 
regionToZonesSupplier,
+            @Zone Supplier<Set<String>> zonesSupplier) {
+      this.dateCodec = dateCodecFactory.iso8601();
+      this.defaultRegion = defaultRegion;
+      this.regionToZonesSupplier = regionToZonesSupplier;
+      this.zonesSupplier = zonesSupplier;
+   }
+
+   protected StringBuilder currentText = new StringBuilder();
+   
+   protected String id;
+   protected int size;
+   protected String snapshotId;
+   protected String availabilityZone;
+   protected Volume.Status volumeStatus;
+   protected Date createTime;
+   protected Set<Attachment> attachments = Sets.newLinkedHashSet();
+
+   protected String volumeId;
+   protected String instanceId;
+   protected String device;
+   protected Attachment.Status attachmentStatus;
+   protected Date attachTime;
+   protected String volumeType;
+   protected Integer iops;
+   protected boolean encrypted;
+
+   protected boolean inAttachmentSet;
+
+   protected String region;
+
+   public Volume getResult() {
+      return newVolume();
+   }
+
+   public void startElement(String uri, String name, String qName, Attributes 
attrs) {
+      if (qName.equals("attachmentSet")) {
+         inAttachmentSet = true;
+      }
+   }
+
+   public void endElement(String uri, String name, String qName) {
+      if (qName.equals("volumeId")) {
+         if (inAttachmentSet) {
+            volumeId = currentText.toString().trim();
+         } else {
+            id = currentText.toString().trim();
+         }
+      } else if (qName.equals("size")) {
+         size = Integer.parseInt(currentText.toString().trim());
+      } else if (qName.equals("availabilityZone")) {
+         availabilityZone = currentText.toString().trim();
+      } else if (qName.equals("volumeId")) {
+         if (inAttachmentSet) {
+            volumeId = currentText.toString().trim();
+         } else {
+            id = currentText.toString().trim();
+         }
+      } else if (qName.equals("status")) {
+         if (inAttachmentSet) {
+            attachmentStatus = 
Attachment.Status.fromValue(currentText.toString().trim());
+         } else {
+            volumeStatus = 
Volume.Status.fromValue(currentText.toString().trim());
+         }
+      } else if (qName.equals("createTime")) {
+         createTime = dateCodec.toDate(currentText.toString().trim());
+      } else if (qName.equals("attachmentSet")) {
+         inAttachmentSet = false;
+      } else if (qName.equals("instanceId")) {
+         instanceId = currentText.toString().trim();
+      } else if (qName.equals("snapshotId")) {
+         snapshotId = currentText.toString().trim();
+         if (snapshotId.equals(""))
+            snapshotId = null;
+      } else if (qName.equals("device")) {
+         device = currentText.toString().trim();
+      } else if (qName.equals("attachTime")) {
+         attachTime = dateCodec.toDate(currentText.toString().trim());
+      } else if (qName.equals("volumeType")) {
+         volumeType = currentText.toString().trim();
+         if (volumeType.equals(""))
+            volumeType = null;
+      } else if (qName.equals("iops")) {
+         iops = Integer.parseInt(currentText.toString().trim());
+      } else if (qName.equals("encrypted")) {
+         encrypted = Boolean.parseBoolean(currentText.toString().trim());
+      } else if (qName.equals("item")) {
+         if (inAttachmentSet) {
+            attachments.add(new Attachment(region, volumeId, instanceId, 
device, attachmentStatus, attachTime));
+            volumeId = null;
+            instanceId = null;
+            device = null;
+            attachmentStatus = null;
+            attachTime = null;
+         }
+
+      }
+      currentText = new StringBuilder();
+   }
+
+   private Volume newVolume() {
+      Volume volume = new Volume(region, id, size, snapshotId, 
availabilityZone, volumeStatus, createTime,
+              volumeType, iops, encrypted, attachments);
+      id = null;
+      size = 0;
+      snapshotId = null;
+      availabilityZone = null;
+      volumeStatus = null;
+      createTime = null;
+      attachments = Sets.newLinkedHashSet();
+      volumeType = null;
+      iops = null;
+      encrypted = false;
+      return volume;
+   }
+
+   public void characters(char ch[], int start, int length) {
+      currentText.append(ch, start, length);
+   }
+
+   @Override
+   public CreateVolumeResponseHandler setContext(HttpRequest request) {
+      super.setContext(request);
+      region = AWSUtils.findRegionInArgsOrNull(getRequest());
+      if (region == null) {
+         Set<String> zones = zonesSupplier.get();
+         String zone = findAvailabilityZoneInArgsOrNull(getRequest(), zones);
+         if (zone != null) {
+            Map<String, Set<String>> regionToZones = 
Maps.transformValues(regionToZonesSupplier.get(), Suppliers
+                     .<Set<String>> supplierFunction());
+            for (Entry<String, Set<String>> entry : regionToZones.entrySet()) {
+               if (entry.getValue().contains(zone)) {
+                  region = entry.getKey();
+                  break;
+               }
+
+            }
+            checkNotNull(regionToZones, String.format("zone %s not in %s", 
zone, regionToZones));
+         } else {
+            region = defaultRegion.get();
+         }
+      }
+      return this;
+   }
+
+   public static String findAvailabilityZoneInArgsOrNull(GeneratedHttpRequest 
gRequest, Set<String> zones) {
+      for (Object arg : gRequest.getInvocation().getArgs()) {
+         if (arg instanceof String) {
+            String zone = (String) arg;
+            if (zones.contains(zone))
+               return zone;
+         }
+      }
+      return null;
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/xml/DescribeAddressesResponseHandler.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/xml/DescribeAddressesResponseHandler.java
 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/xml/DescribeAddressesResponseHandler.java
new file mode 100644
index 0000000..dd0a1e1
--- /dev/null
+++ 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/xml/DescribeAddressesResponseHandler.java
@@ -0,0 +1,76 @@
+/*
+ * 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.xml;
+
+import java.util.Set;
+
+import javax.annotation.Resource;
+import javax.inject.Inject;
+
+import org.jclouds.aws.util.AWSUtils;
+import org.jclouds.ec2.domain.PublicIpInstanceIdPair;
+import 
org.jclouds.http.functions.ParseSax.HandlerForGeneratedRequestWithResult;
+import org.jclouds.location.Region;
+import org.jclouds.logging.Logger;
+
+import com.google.common.base.Supplier;
+import com.google.common.collect.Sets;
+
+public class DescribeAddressesResponseHandler extends
+         HandlerForGeneratedRequestWithResult<Set<PublicIpInstanceIdPair>> {
+
+   @Resource
+   protected Logger logger = Logger.NULL;
+   private Set<PublicIpInstanceIdPair> pairs = Sets.newLinkedHashSet();
+   private String ipAddress;
+   private StringBuilder currentText = new StringBuilder();
+   @Inject
+   @Region
+   Supplier<String> defaultRegion;
+   private String instanceId;
+
+   protected String currentOrNull() {
+      String returnVal = currentText.toString().trim();
+      return returnVal.equals("") ? null : returnVal;
+   }
+
+   public void endElement(String uri, String name, String qName) {
+      if (qName.equals("publicIp")) {
+         ipAddress = currentOrNull();
+      } else if (qName.equals("instanceId")) {
+         instanceId = currentOrNull();
+      } else if (qName.equals("item")) {
+         String region = AWSUtils.findRegionInArgsOrNull(getRequest());
+         if (region == null)
+            region = defaultRegion.get();
+         pairs.add(new PublicIpInstanceIdPair(region, ipAddress, instanceId));
+         ipAddress = null;
+         instanceId = null;
+      }
+      currentText = new StringBuilder();
+   }
+
+   public void characters(char ch[], int start, int length) {
+      currentText.append(ch, start, length);
+   }
+
+   @Override
+   public Set<PublicIpInstanceIdPair> getResult() {
+      return pairs;
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/xml/DescribeAvailabilityZonesResponseHandler.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/xml/DescribeAvailabilityZonesResponseHandler.java
 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/xml/DescribeAvailabilityZonesResponseHandler.java
new file mode 100644
index 0000000..4039794
--- /dev/null
+++ 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/xml/DescribeAvailabilityZonesResponseHandler.java
@@ -0,0 +1,100 @@
+/*
+ * 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.xml;
+
+import java.util.Set;
+
+import javax.annotation.Resource;
+import javax.inject.Inject;
+
+import org.jclouds.ec2.domain.AvailabilityZoneInfo;
+import org.jclouds.http.functions.ParseSax;
+import org.jclouds.location.Region;
+import org.jclouds.logging.Logger;
+import org.xml.sax.Attributes;
+
+import com.google.common.base.Supplier;
+import com.google.common.collect.Sets;
+
+public class DescribeAvailabilityZonesResponseHandler extends 
ParseSax.HandlerWithResult<Set<AvailabilityZoneInfo>> {
+   private StringBuilder currentText = new StringBuilder();
+   private final Supplier<String> defaultRegion;
+
+   private Set<AvailabilityZoneInfo> availabilityZones = 
Sets.newLinkedHashSet();
+   private String zone;
+   @Resource
+   protected Logger logger = Logger.NULL;
+   private String region;
+   private String zoneState;
+   private boolean inMessageSet;
+   private Set<String> messages = Sets.newHashSet();
+
+   /**
+    * clones like {@code openstack-nova-ec2}, which don't support multiple 
regions don't return region in the XML
+    * output.
+    */
+   @Inject
+   DescribeAvailabilityZonesResponseHandler(@Region Supplier<String> 
defaultRegion) {
+      this.defaultRegion = defaultRegion;
+   }
+
+   @Override
+   public void startDocument() {
+      region = defaultRegion.get();
+   }
+
+   public Set<AvailabilityZoneInfo> getResult() {
+      return availabilityZones;
+   }
+
+   public void startElement(String uri, String name, String qName, Attributes 
attrs) {
+      if (qName.equals("messageSet")) {
+         inMessageSet = true;
+      }
+   }
+
+   public void endElement(String uri, String name, String qName) {
+      if (qName.equals("zoneName")) {
+         zone = currentText.toString().trim();
+      } else if (qName.equals("regionName")) {
+         try {
+            region = currentText.toString().trim();
+         } catch (IllegalArgumentException e) {
+            logger.warn(e, "unsupported region: %s", 
currentText.toString().trim());
+            region = "UNKNOWN";
+         }
+      } else if (qName.equals("zoneState")) {
+         zoneState = currentText.toString().trim();
+      } else if (qName.equals("message")) {
+         messages.add(currentText.toString().trim());
+      } else if (qName.equals("messageSet")) {
+         inMessageSet = false;
+      } else if (qName.equals("item") && !inMessageSet) {
+         availabilityZones.add(new AvailabilityZoneInfo(zone, zoneState, 
region, messages));
+         this.zone = null;
+         this.region = defaultRegion.get();
+         this.zoneState = null;
+         this.messages = Sets.newHashSet();
+      }
+      currentText = new StringBuilder();
+   }
+
+   public void characters(char ch[], int start, int length) {
+      currentText.append(ch, start, length);
+   }
+
+}

Reply via email to