Updated Branches:
  refs/heads/master a906f9f4e -> 5f524ee6c

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f524ee6/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/extensions/AWSEC2SecurityGroupExtension.java
----------------------------------------------------------------------
diff --git 
a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/extensions/AWSEC2SecurityGroupExtension.java
 
b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/extensions/AWSEC2SecurityGroupExtension.java
new file mode 100644
index 0000000..c0e21f0
--- /dev/null
+++ 
b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/extensions/AWSEC2SecurityGroupExtension.java
@@ -0,0 +1,177 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.aws.ec2.compute.extensions;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Predicates.equalTo;
+import static com.google.common.base.Predicates.not;
+import static com.google.common.base.Predicates.notNull;
+import static com.google.common.collect.Iterables.concat;
+import static com.google.common.collect.Iterables.filter;
+import static com.google.common.collect.Iterables.getOnlyElement;
+import static com.google.common.collect.Iterables.toArray;
+import static com.google.common.collect.Iterables.transform;
+
+import java.util.NoSuchElementException;
+import java.util.Set;
+import java.util.concurrent.ConcurrentMap;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Provider;
+
+import org.jclouds.Constants;
+import org.jclouds.aws.ec2.AWSEC2Client;
+import org.jclouds.aws.util.AWSUtils;
+import org.jclouds.collect.Memoized;
+import org.jclouds.compute.domain.SecurityGroup;
+import org.jclouds.compute.domain.SecurityGroupBuilder;
+import org.jclouds.compute.extensions.SecurityGroupExtension;
+import org.jclouds.compute.functions.GroupNamingConvention;
+import org.jclouds.compute.functions.GroupNamingConvention.Factory;
+import org.jclouds.domain.Location;
+import org.jclouds.ec2.compute.domain.RegionAndName;
+import org.jclouds.ec2.compute.domain.RegionNameAndIngressRules;
+import org.jclouds.ec2.compute.extensions.EC2SecurityGroupExtension;
+import org.jclouds.ec2.domain.RunningInstance;
+import org.jclouds.ec2.domain.UserIdGroupPair;
+import org.jclouds.location.Region;
+import org.jclouds.net.domain.IpPermission;
+import org.jclouds.net.domain.IpProtocol;
+
+import com.google.common.base.Function;
+import com.google.common.base.Predicate;
+import com.google.common.base.Supplier;
+import com.google.common.cache.LoadingCache;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Multimap;
+import com.google.common.collect.Sets;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.ListeningExecutorService;
+import com.google.common.util.concurrent.UncheckedTimeoutException;
+
+/**
+ * An extension to compute service to allow for the manipulation of {@link 
SecurityGroup}s. Implementation
+ * is optional by providers.
+ * 
+ * @author Andrew Bayer
+ */
+public class AWSEC2SecurityGroupExtension extends EC2SecurityGroupExtension {
+   protected final AWSEC2Client client;
+
+   @Inject
+   public AWSEC2SecurityGroupExtension(AWSEC2Client client,
+                                       @Named(Constants.PROPERTY_USER_THREADS) 
ListeningExecutorService userExecutor,
+                                       @Region Supplier<Set<String>> regions,
+                                       
Function<org.jclouds.ec2.domain.SecurityGroup, SecurityGroup> groupConverter,
+                                       @Memoized Supplier<Set<? extends 
Location>> locations,
+                                       @Named("SECURITY") 
LoadingCache<RegionAndName, String> groupCreator,
+                                       GroupNamingConvention.Factory 
namingConvention) {
+      super(client, userExecutor, regions, groupConverter, locations, 
groupCreator, namingConvention);
+      this.client = checkNotNull(client, "client");
+   }
+
+
+   @Override
+   public SecurityGroup addIpPermission(IpPermission ipPermission, 
SecurityGroup group) {
+
+      String region = 
AWSUtils.getRegionFromLocationOrNull(group.getLocation());
+      String name = group.getName();
+
+      
client.getSecurityGroupServices().authorizeSecurityGroupIngressInRegion(region, 
name, ipPermission);
+
+      return getSecurityGroupById(new RegionAndName(region, 
group.getName()).slashEncode());
+   }
+
+   @Override
+   public SecurityGroup addIpPermission(IpProtocol protocol, int startPort, 
int endPort,
+                                        Multimap<String, String> 
tenantIdGroupNamePairs,
+                                        Iterable<String> ipRanges,
+                                        Iterable<String> groupIds, 
SecurityGroup group) {
+      String region = 
AWSUtils.getRegionFromLocationOrNull(group.getLocation());
+      String name = group.getName();
+
+      IpPermission.Builder builder = IpPermission.builder();
+
+      builder.ipProtocol(protocol);
+      builder.fromPort(startPort);
+      builder.toPort(endPort);
+      
+      if (Iterables.size(ipRanges) > 0) {
+         for (String cidr : ipRanges) {
+            builder.cidrBlock(cidr);
+         }
+      }
+
+      if (tenantIdGroupNamePairs.size() > 0) {
+         for (String userId : tenantIdGroupNamePairs.keySet()) {
+            for (String groupName : tenantIdGroupNamePairs.get(userId)) {
+               builder.tenantIdGroupNamePair(userId, groupName);
+            }
+         }
+      }
+
+      
client.getSecurityGroupServices().authorizeSecurityGroupIngressInRegion(region, 
name, builder.build());
+
+      return getSecurityGroupById(new RegionAndName(region, 
group.getName()).slashEncode());
+   }
+      
+   @Override
+   public SecurityGroup removeIpPermission(IpPermission ipPermission, 
SecurityGroup group) {
+      String region = 
AWSUtils.getRegionFromLocationOrNull(group.getLocation());
+      String name = group.getName();
+
+      
client.getSecurityGroupServices().revokeSecurityGroupIngressInRegion(region, 
name, ipPermission);
+
+      return getSecurityGroupById(new RegionAndName(region, 
group.getName()).slashEncode());
+   }
+
+   @Override
+   public SecurityGroup removeIpPermission(IpProtocol protocol, int startPort, 
int endPort,
+                                           Multimap<String, String> 
tenantIdGroupNamePairs,
+                                           Iterable<String> ipRanges,
+                                           Iterable<String> groupIds, 
SecurityGroup group) {
+      String region = 
AWSUtils.getRegionFromLocationOrNull(group.getLocation());
+      String name = group.getName();
+
+
+      IpPermission.Builder builder = IpPermission.builder();
+
+      builder.ipProtocol(protocol);
+      builder.fromPort(startPort);
+      builder.toPort(endPort);
+      
+      if (Iterables.size(ipRanges) > 0) {
+         for (String cidr : ipRanges) {
+            builder.cidrBlock(cidr);
+         }
+      }
+
+      if (tenantIdGroupNamePairs.size() > 0) {
+         for (String userId : tenantIdGroupNamePairs.keySet()) {
+            for (String groupName : tenantIdGroupNamePairs.get(userId)) {
+               builder.tenantIdGroupNamePair(userId, groupName);
+            }
+         }
+      }
+
+      
client.getSecurityGroupServices().revokeSecurityGroupIngressInRegion(region, 
name, builder.build());
+
+      return getSecurityGroupById(new RegionAndName(region, 
group.getName()).slashEncode());
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f524ee6/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/loaders/AWSEC2CreateSecurityGroupIfNeeded.java
----------------------------------------------------------------------
diff --git 
a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/loaders/AWSEC2CreateSecurityGroupIfNeeded.java
 
b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/loaders/AWSEC2CreateSecurityGroupIfNeeded.java
index ad14efe..6676ef6 100644
--- 
a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/loaders/AWSEC2CreateSecurityGroupIfNeeded.java
+++ 
b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/loaders/AWSEC2CreateSecurityGroupIfNeeded.java
@@ -32,10 +32,10 @@ import org.jclouds.aws.ec2.services.AWSSecurityGroupClient;
 import org.jclouds.compute.reference.ComputeServiceConstants;
 import org.jclouds.ec2.compute.domain.RegionAndName;
 import org.jclouds.ec2.compute.domain.RegionNameAndIngressRules;
-import org.jclouds.ec2.domain.IpPermission;
-import org.jclouds.ec2.domain.IpProtocol;
 import org.jclouds.ec2.domain.UserIdGroupPair;
 import org.jclouds.logging.Logger;
+import org.jclouds.net.domain.IpPermission;
+import org.jclouds.net.domain.IpProtocol;
 
 import com.google.common.base.Predicate;
 import com.google.common.cache.CacheLoader;
@@ -95,7 +95,7 @@ public class AWSEC2CreateSecurityGroupIfNeeded extends 
CacheLoader<RegionAndName
                                .fromPort(range.getKey())
                                .toPort(range.getValue())
                                .ipProtocol(IpProtocol.TCP)
-                               .ipRange("0.0.0.0/0")
+                               .cidrBlock("0.0.0.0/0")
                                .build());
             }
 
@@ -104,13 +104,13 @@ public class AWSEC2CreateSecurityGroupIfNeeded extends 
CacheLoader<RegionAndName
                             .fromPort(0)
                             .toPort(65535)
                             .ipProtocol(IpProtocol.TCP)
-                            .userIdGroupPair(myOwnerId, name)
+                            .tenantIdGroupNamePair(myOwnerId, name)
                             .build());
             permissions.add(IpPermission.builder()
                             .fromPort(0)
                             .toPort(65535)
                             .ipProtocol(IpProtocol.UDP)
-                            .userIdGroupPair(myOwnerId, name)
+                            .tenantIdGroupNamePair(myOwnerId, name)
                             .build());
          }
 

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f524ee6/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSSecurityGroupAsyncClient.java
----------------------------------------------------------------------
diff --git 
a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSSecurityGroupAsyncClient.java
 
b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSSecurityGroupAsyncClient.java
index 75a6f9b..25acb03 100644
--- 
a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSSecurityGroupAsyncClient.java
+++ 
b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSSecurityGroupAsyncClient.java
@@ -33,12 +33,12 @@ import org.jclouds.aws.filters.FormSigner;
 import org.jclouds.ec2.binders.BindGroupIdsToIndexedFormParams;
 import org.jclouds.ec2.binders.BindIpPermissionToIndexedFormParams;
 import org.jclouds.ec2.binders.BindIpPermissionsToIndexedFormParams;
-import org.jclouds.ec2.domain.IpPermission;
 import org.jclouds.ec2.domain.SecurityGroup;
 import org.jclouds.ec2.services.SecurityGroupAsyncClient;
 import org.jclouds.ec2.xml.DescribeSecurityGroupsResponseHandler;
 import org.jclouds.javax.annotation.Nullable;
 import org.jclouds.location.functions.RegionToEndpointOrProviderIfNull;
+import org.jclouds.net.domain.IpPermission;
 import org.jclouds.rest.annotations.BinderParam;
 import org.jclouds.rest.annotations.EndpointParam;
 import org.jclouds.rest.annotations.Fallback;

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f524ee6/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSSecurityGroupClient.java
----------------------------------------------------------------------
diff --git 
a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSSecurityGroupClient.java
 
b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSSecurityGroupClient.java
index 383b0fd..ac3b301 100644
--- 
a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSSecurityGroupClient.java
+++ 
b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSSecurityGroupClient.java
@@ -18,10 +18,10 @@ package org.jclouds.aws.ec2.services;
 
 import java.util.Set;
 import org.jclouds.aws.ec2.options.CreateSecurityGroupOptions;
-import org.jclouds.ec2.domain.IpPermission;
 import org.jclouds.ec2.domain.SecurityGroup;
 import org.jclouds.ec2.services.SecurityGroupClient;
 import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.net.domain.IpPermission;
 
 import com.google.common.annotations.Beta;
 

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f524ee6/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/AWSEC2ComputeServiceLiveTest.java
----------------------------------------------------------------------
diff --git 
a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/AWSEC2ComputeServiceLiveTest.java
 
b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/AWSEC2ComputeServiceLiveTest.java
index 7ee0e9d..ae39523 100644
--- 
a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/AWSEC2ComputeServiceLiveTest.java
+++ 
b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/AWSEC2ComputeServiceLiveTest.java
@@ -48,11 +48,11 @@ import org.jclouds.compute.predicates.NodePredicates;
 import org.jclouds.domain.LoginCredentials;
 import org.jclouds.ec2.EC2Client;
 import org.jclouds.ec2.compute.EC2ComputeServiceLiveTest;
-import org.jclouds.ec2.domain.IpProtocol;
 import org.jclouds.ec2.domain.KeyPair;
 import org.jclouds.ec2.domain.SecurityGroup;
 import org.jclouds.ec2.services.InstanceClient;
 import org.jclouds.ec2.services.KeyPairClient;
+import org.jclouds.net.domain.IpProtocol;
 import org.jclouds.scriptbuilder.domain.Statements;
 import org.testng.annotations.Test;
 

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f524ee6/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/extensions/AWSEC2SecurityGroupExtensionExpectTest.java
----------------------------------------------------------------------
diff --git 
a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/extensions/AWSEC2SecurityGroupExtensionExpectTest.java
 
b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/extensions/AWSEC2SecurityGroupExtensionExpectTest.java
new file mode 100644
index 0000000..4bae7c3
--- /dev/null
+++ 
b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/extensions/AWSEC2SecurityGroupExtensionExpectTest.java
@@ -0,0 +1,367 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.aws.ec2.compute.extensions;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+
+import java.util.Set;
+
+import javax.ws.rs.core.MediaType;
+
+import org.jclouds.aws.ec2.compute.internal.BaseAWSEC2ComputeServiceExpectTest;
+import org.jclouds.compute.domain.SecurityGroup;
+import org.jclouds.compute.domain.SecurityGroupBuilder;
+import org.jclouds.compute.extensions.SecurityGroupExtension;
+import org.jclouds.domain.Location;
+import org.jclouds.domain.LocationBuilder;
+import org.jclouds.domain.LocationScope;
+import org.jclouds.ec2.compute.domain.RegionAndName;
+import org.jclouds.http.HttpRequest;
+import org.jclouds.http.HttpResponse;
+import org.jclouds.net.domain.IpPermission;
+import org.jclouds.net.domain.IpProtocol;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableMap.Builder;
+import com.google.common.collect.ImmutableMultimap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.LinkedHashMultimap;
+import com.google.common.collect.Multimap;
+import com.google.common.collect.Sets;
+import com.google.common.util.concurrent.Futures;
+
+/**
+ * 
+ * @author Andrew Bayer
+ */
+@Test(groups = "unit", testName = "AWSEC2SecurityGroupExtensionExpectTest")
+public class AWSEC2SecurityGroupExtensionExpectTest extends 
BaseAWSEC2ComputeServiceExpectTest {
+
+   public void testAddIpPermissionCidrFromIpPermission() {
+      HttpRequest describeSecurityGroupsSingleRequest = 
+         formSigner.filter(HttpRequest.builder()
+                           .method("POST")
+                           .endpoint("https://ec2."; + region + 
".amazonaws.com/")
+                           .addHeader("Host", "ec2." + region + 
".amazonaws.com")
+                           .addFormParam("Action", "DescribeSecurityGroups")
+                           .addFormParam("GroupName.1", 
"jclouds#some-group").build());
+      
+      HttpResponse describeSecurityGroupsSingleResponse = 
+         HttpResponse.builder().statusCode(200)
+         .payload(payloadFromResourceWithContentType(
+                                                     
"/describe_securitygroups_extension_cidr.xml", 
MediaType.APPLICATION_XML)).build();
+      
+
+      HttpRequest authorizeSecurityGroupIngressRequestRange = 
+               formSigner.filter(HttpRequest.builder()
+                                 .method("POST")
+                                 .endpoint("https://ec2."; + region + 
".amazonaws.com/")
+                                 .addHeader("Host", "ec2." + region + 
".amazonaws.com")
+                                 .addFormParam("Action", 
"AuthorizeSecurityGroupIngress")
+                                 .addFormParam("GroupId", "jclouds#some-group")
+                                 .addFormParam("IpPermissions.0.FromPort", 
"22")
+                                 .addFormParam("IpPermissions.0.IpProtocol", 
"tcp")
+                                 
.addFormParam("IpPermissions.0.IpRanges.0.CidrIp", "0.0.0.0/0")
+                                 .addFormParam("IpPermissions.0.ToPort", "40")
+                                 .build());
+                                 
+      Builder<HttpRequest, HttpResponse> requestResponseMap = 
ImmutableMap.<HttpRequest, HttpResponse> builder();
+      requestResponseMap.put(describeRegionsRequest, describeRegionsResponse);
+      requestResponseMap.put(describeAvailabilityZonesRequest, 
describeAvailabilityZonesResponse);
+      requestResponseMap.put(describeSecurityGroupsSingleRequest, 
describeSecurityGroupsSingleResponse);
+      requestResponseMap.put(createKeyPairRequest, createKeyPairResponse);
+      requestResponseMap.put(createSecurityGroupRequest, 
createSecurityGroupResponse);
+
+      requestResponseMap.put(authorizeSecurityGroupIngressRequestRange, 
authorizeSecurityGroupIngressResponse);
+
+      IpPermission.Builder builder = IpPermission.builder();
+
+      builder.ipProtocol(IpProtocol.TCP);
+      builder.fromPort(22);
+      builder.toPort(40);
+      builder.cidrBlock("0.0.0.0/0");
+
+      IpPermission perm = builder.build();
+
+      SecurityGroupExtension extension = 
requestsSendResponses(requestResponseMap.build()).getSecurityGroupExtension().get();
+
+      SecurityGroupBuilder groupBuilder = new SecurityGroupBuilder();
+      groupBuilder.id("jclouds#some-group");
+      groupBuilder.providerId("sg-3c6ef654");
+      groupBuilder.name("jclouds#some-group");
+      groupBuilder.location(new LocationBuilder()
+                            .scope(LocationScope.REGION)
+                            .id(region)
+                            .description("region")
+                            .build());
+      
+      SecurityGroup origGroup = groupBuilder.build();
+
+      SecurityGroup newGroup = extension.addIpPermission(perm, origGroup);
+
+      assertEquals(1, newGroup.getIpPermissions().size());
+
+      IpPermission newPerm = 
Iterables.getOnlyElement(newGroup.getIpPermissions());
+
+      assertNotNull(newPerm);
+      assertEquals(IpProtocol.TCP, newPerm.getIpProtocol());
+      assertEquals(22, newPerm.getFromPort());
+      assertEquals(40, newPerm.getToPort());
+      assertEquals(1, newPerm.getCidrBlocks().size());
+      assertTrue(newPerm.getCidrBlocks().contains("0.0.0.0/0"));
+   }
+
+   public void testAddIpPermissionCidrFromParams() {
+      HttpRequest describeSecurityGroupsSingleRequest = 
+         formSigner.filter(HttpRequest.builder()
+                           .method("POST")
+                           .endpoint("https://ec2."; + region + 
".amazonaws.com/")
+                           .addHeader("Host", "ec2." + region + 
".amazonaws.com")
+                           .addFormParam("Action", "DescribeSecurityGroups")
+                           .addFormParam("GroupName.1", 
"jclouds#some-group").build());
+      
+      HttpResponse describeSecurityGroupsSingleResponse = 
+         HttpResponse.builder().statusCode(200)
+         .payload(payloadFromResourceWithContentType(
+                                                     
"/describe_securitygroups_extension_cidr.xml", 
MediaType.APPLICATION_XML)).build();
+      
+
+      HttpRequest authorizeSecurityGroupIngressRequestRange = 
+               formSigner.filter(HttpRequest.builder()
+                                 .method("POST")
+                                 .endpoint("https://ec2."; + region + 
".amazonaws.com/")
+                                 .addHeader("Host", "ec2." + region + 
".amazonaws.com")
+                                 .addFormParam("Action", 
"AuthorizeSecurityGroupIngress")
+                                 .addFormParam("GroupId", "jclouds#some-group")
+                                 .addFormParam("IpPermissions.0.FromPort", 
"22")
+                                 .addFormParam("IpPermissions.0.IpProtocol", 
"tcp")
+                                 
.addFormParam("IpPermissions.0.IpRanges.0.CidrIp", "0.0.0.0/0")
+                                 .addFormParam("IpPermissions.0.ToPort", "40")
+                                 .build());
+      
+      Builder<HttpRequest, HttpResponse> requestResponseMap = 
ImmutableMap.<HttpRequest, HttpResponse> builder();
+      requestResponseMap.put(describeRegionsRequest, describeRegionsResponse);
+      requestResponseMap.put(describeAvailabilityZonesRequest, 
describeAvailabilityZonesResponse);
+      requestResponseMap.put(describeSecurityGroupsSingleRequest, 
describeSecurityGroupsSingleResponse);
+      requestResponseMap.put(createKeyPairRequest, createKeyPairResponse);
+      requestResponseMap.put(createSecurityGroupRequest, 
createSecurityGroupResponse);
+
+      requestResponseMap.put(authorizeSecurityGroupIngressRequestRange, 
authorizeSecurityGroupIngressResponse);
+
+      SecurityGroupExtension extension = 
requestsSendResponses(requestResponseMap.build()).getSecurityGroupExtension().get();
+
+      SecurityGroupBuilder groupBuilder = new SecurityGroupBuilder();
+      groupBuilder.id("jclouds#some-group");
+      groupBuilder.providerId("sg-3c6ef654");
+      groupBuilder.name("jclouds#some-group");
+      groupBuilder.location(new LocationBuilder()
+                            .scope(LocationScope.REGION)
+                            .id(region)
+                            .description("region")
+                            .build());
+      
+      SecurityGroup origGroup = groupBuilder.build();
+
+      SecurityGroup newGroup = extension.addIpPermission(IpProtocol.TCP,
+                                                         22,
+                                                         40,
+                                                         emptyMultimap(),
+                                                         
ImmutableSet.of("0.0.0.0/0"),
+                                                         emptyStringSet(),
+                                                         origGroup);
+
+      assertEquals(1, newGroup.getIpPermissions().size());
+
+      IpPermission newPerm = 
Iterables.getOnlyElement(newGroup.getIpPermissions());
+
+      assertNotNull(newPerm);
+      assertEquals(IpProtocol.TCP, newPerm.getIpProtocol());
+      assertEquals(22, newPerm.getFromPort());
+      assertEquals(40, newPerm.getToPort());
+      assertEquals(1, newPerm.getCidrBlocks().size());
+      assertTrue(newPerm.getCidrBlocks().contains("0.0.0.0/0"));
+   }
+
+   public void testAddIpPermissionGroupFromIpPermission() {
+      HttpRequest describeSecurityGroupsSingleRequest = 
+         formSigner.filter(HttpRequest.builder()
+                           .method("POST")
+                           .endpoint("https://ec2."; + region + 
".amazonaws.com/")
+                           .addHeader("Host", "ec2." + region + 
".amazonaws.com")
+                           .addFormParam("Action", "DescribeSecurityGroups")
+                           .addFormParam("GroupName.1", 
"jclouds#some-group").build());
+      
+      HttpResponse describeSecurityGroupsSingleResponse = 
+         HttpResponse.builder().statusCode(200)
+         .payload(payloadFromResourceWithContentType(
+                                                     
"/describe_securitygroups_extension_group.xml", 
MediaType.APPLICATION_XML)).build();
+      
+
+      HttpRequest authorizeSecurityGroupIngressRequestGroupTenant = 
+               formSigner.filter(HttpRequest.builder()
+                                 .method("POST")
+                                 .endpoint("https://ec2."; + region + 
".amazonaws.com/")
+                                 .addHeader("Host", "ec2." + region + 
".amazonaws.com")
+                                 .addFormParam("Action", 
"AuthorizeSecurityGroupIngress")
+                                 .addFormParam("GroupId", "jclouds#some-group")
+                                 .addFormParam("IpPermissions.0.FromPort", 
"22")
+                                 
.addFormParam("IpPermissions.0.Groups.0.GroupName", "jclouds#some-group")
+                                 
.addFormParam("IpPermissions.0.Groups.0.UserId", "993194456877")
+                                 .addFormParam("IpPermissions.0.IpProtocol", 
"tcp")
+                                 .addFormParam("IpPermissions.0.ToPort", "40")
+                                 .build());
+
+      Builder<HttpRequest, HttpResponse> requestResponseMap = 
ImmutableMap.<HttpRequest, HttpResponse> builder();
+      requestResponseMap.put(describeRegionsRequest, describeRegionsResponse);
+      requestResponseMap.put(describeAvailabilityZonesRequest, 
describeAvailabilityZonesResponse);
+      requestResponseMap.put(describeSecurityGroupsSingleRequest, 
describeSecurityGroupsSingleResponse);
+      requestResponseMap.put(createKeyPairRequest, createKeyPairResponse);
+      requestResponseMap.put(createSecurityGroupRequest, 
createSecurityGroupResponse);
+
+      requestResponseMap.put(authorizeSecurityGroupIngressRequestGroupTenant, 
authorizeSecurityGroupIngressResponse);
+
+      IpPermission.Builder builder = IpPermission.builder();
+
+      builder.ipProtocol(IpProtocol.TCP);
+      builder.fromPort(22);
+      builder.toPort(40);
+      builder.tenantIdGroupNamePair("993194456877", "jclouds#some-group");
+
+      IpPermission perm = builder.build();
+
+      SecurityGroupExtension extension = 
requestsSendResponses(requestResponseMap.build()).getSecurityGroupExtension().get();
+
+      SecurityGroupBuilder groupBuilder = new SecurityGroupBuilder();
+      groupBuilder.id("jclouds#some-group");
+      groupBuilder.providerId("sg-3c6ef654");
+      groupBuilder.name("jclouds#some-group");
+      groupBuilder.location(new LocationBuilder()
+                            .scope(LocationScope.REGION)
+                            .id(region)
+                            .description("region")
+                            .build());
+      groupBuilder.ownerId("993194456877");
+      
+      SecurityGroup origGroup = groupBuilder.build();
+
+      SecurityGroup newGroup = extension.addIpPermission(perm, origGroup);
+
+      assertEquals(1, newGroup.getIpPermissions().size());
+
+      IpPermission newPerm = 
Iterables.getOnlyElement(newGroup.getIpPermissions());
+
+      assertNotNull(newPerm);
+      assertEquals(IpProtocol.TCP, newPerm.getIpProtocol());
+      assertEquals(22, newPerm.getFromPort());
+      assertEquals(40, newPerm.getToPort());
+      assertEquals(0, newPerm.getCidrBlocks().size());
+      assertEquals(1, newPerm.getTenantIdGroupNamePairs().size());
+      
assertTrue(newPerm.getTenantIdGroupNamePairs().keySet().contains(origGroup.getOwnerId()));
+      
assertTrue(newPerm.getTenantIdGroupNamePairs().values().contains(origGroup.getName()));
+   }
+
+
+   public void testAddIpPermissionGroupFromParams() {
+      HttpRequest describeSecurityGroupsSingleRequest = 
+         formSigner.filter(HttpRequest.builder()
+                           .method("POST")
+                           .endpoint("https://ec2."; + region + 
".amazonaws.com/")
+                           .addHeader("Host", "ec2." + region + 
".amazonaws.com")
+                           .addFormParam("Action", "DescribeSecurityGroups")
+                           .addFormParam("GroupName.1", 
"jclouds#some-group").build());
+      
+      HttpResponse describeSecurityGroupsSingleResponse = 
+         HttpResponse.builder().statusCode(200)
+         .payload(payloadFromResourceWithContentType(
+                                                     
"/describe_securitygroups_extension_group.xml", 
MediaType.APPLICATION_XML)).build();
+
+
+      HttpRequest authorizeSecurityGroupIngressRequestGroupTenant = 
+               formSigner.filter(HttpRequest.builder()
+                                 .method("POST")
+                                 .endpoint("https://ec2."; + region + 
".amazonaws.com/")
+                                 .addHeader("Host", "ec2." + region + 
".amazonaws.com")
+                                 .addFormParam("Action", 
"AuthorizeSecurityGroupIngress")
+                                 .addFormParam("GroupId", "jclouds#some-group")
+                                 .addFormParam("IpPermissions.0.FromPort", 
"22")
+                                 
.addFormParam("IpPermissions.0.Groups.0.GroupName", "jclouds#some-group")
+                                 
.addFormParam("IpPermissions.0.Groups.0.UserId", "993194456877")
+                                 .addFormParam("IpPermissions.0.IpProtocol", 
"tcp")
+                                 .addFormParam("IpPermissions.0.ToPort", "40")
+                                 .build());
+
+      Builder<HttpRequest, HttpResponse> requestResponseMap = 
ImmutableMap.<HttpRequest, HttpResponse> builder();
+      requestResponseMap.put(describeRegionsRequest, describeRegionsResponse);
+      requestResponseMap.put(describeAvailabilityZonesRequest, 
describeAvailabilityZonesResponse);
+      requestResponseMap.put(describeSecurityGroupsSingleRequest, 
describeSecurityGroupsSingleResponse);
+      requestResponseMap.put(createKeyPairRequest, createKeyPairResponse);
+      requestResponseMap.put(createSecurityGroupRequest, 
createSecurityGroupResponse);
+
+      requestResponseMap.put(authorizeSecurityGroupIngressRequestGroupTenant, 
authorizeSecurityGroupIngressResponse);
+
+      SecurityGroupExtension extension = 
requestsSendResponses(requestResponseMap.build()).getSecurityGroupExtension().get();
+
+      SecurityGroupBuilder groupBuilder = new SecurityGroupBuilder();
+      groupBuilder.id("jclouds#some-group");
+      groupBuilder.providerId("sg-3c6ef654");
+      groupBuilder.name("jclouds#some-group");
+      groupBuilder.ownerId("993194456877");
+      groupBuilder.location(new LocationBuilder()
+                            .scope(LocationScope.REGION)
+                            .id(region)
+                            .description("region")
+                            .build());
+      
+      SecurityGroup origGroup = groupBuilder.build();
+
+      ImmutableMultimap.Builder<String, String> permBuilder = 
ImmutableMultimap.builder();
+      permBuilder.put(origGroup.getOwnerId(), origGroup.getName());
+      
+      SecurityGroup newGroup = extension.addIpPermission(IpProtocol.TCP,
+                                                         22,
+                                                         40,
+                                                         permBuilder.build(),
+                                                         emptyStringSet(),
+                                                         emptyStringSet(),
+                                                         origGroup);
+
+      assertEquals(1, newGroup.getIpPermissions().size());
+
+      IpPermission newPerm = 
Iterables.getOnlyElement(newGroup.getIpPermissions());
+
+      assertNotNull(newPerm);
+      assertEquals(IpProtocol.TCP, newPerm.getIpProtocol());
+      assertEquals(22, newPerm.getFromPort());
+      assertEquals(40, newPerm.getToPort());
+      assertEquals(0, newPerm.getCidrBlocks().size());
+      assertEquals(1, newPerm.getTenantIdGroupNamePairs().size());
+      
assertTrue(newPerm.getTenantIdGroupNamePairs().keySet().contains(origGroup.getOwnerId()));
+      
assertTrue(newPerm.getTenantIdGroupNamePairs().values().contains(origGroup.getName()));
+   }
+
+   private Multimap<String, String> emptyMultimap() {
+      return LinkedHashMultimap.create();
+   }
+
+   private Set<String> emptyStringSet() {
+      return Sets.newLinkedHashSet();
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f524ee6/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/extensions/AWSEC2SecurityGroupExtensionLiveTest.java
----------------------------------------------------------------------
diff --git 
a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/extensions/AWSEC2SecurityGroupExtensionLiveTest.java
 
b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/extensions/AWSEC2SecurityGroupExtensionLiveTest.java
new file mode 100644
index 0000000..9de4f24
--- /dev/null
+++ 
b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/extensions/AWSEC2SecurityGroupExtensionLiveTest.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.aws.ec2.compute.extensions;
+
+import static com.google.common.collect.Iterables.transform;
+
+import org.jclouds.compute.extensions.SecurityGroupExtension;
+import 
org.jclouds.compute.extensions.internal.BaseSecurityGroupExtensionLiveTest;
+import org.testng.annotations.Test;
+
+import com.google.inject.Module;
+
+/**
+ * Live test for aws-ec2 {@link SecurityGroupExtension} implementation
+ * 
+ * @author Andrew Bayer
+ * 
+ */
+@Test(groups = "live", singleThreaded = true, testName = 
"AWSEC2SecurityGroupExtensionLiveTest")
+public class AWSEC2SecurityGroupExtensionLiveTest extends 
BaseSecurityGroupExtensionLiveTest {
+
+   public AWSEC2SecurityGroupExtensionLiveTest() {
+      provider = "aws-ec2";
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f524ee6/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/loaders/AWSEC2CreateSecurityGroupIfNeededTest.java
----------------------------------------------------------------------
diff --git 
a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/loaders/AWSEC2CreateSecurityGroupIfNeededTest.java
 
b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/loaders/AWSEC2CreateSecurityGroupIfNeededTest.java
index db3093c..269a8f0 100644
--- 
a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/loaders/AWSEC2CreateSecurityGroupIfNeededTest.java
+++ 
b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/loaders/AWSEC2CreateSecurityGroupIfNeededTest.java
@@ -30,10 +30,10 @@ import java.util.concurrent.ExecutionException;
 import org.jclouds.aws.ec2.services.AWSSecurityGroupClient;
 import org.jclouds.ec2.compute.domain.RegionAndName;
 import org.jclouds.ec2.compute.domain.RegionNameAndIngressRules;
-import org.jclouds.ec2.domain.IpPermission;
-import org.jclouds.ec2.domain.IpProtocol;
 import org.jclouds.ec2.domain.SecurityGroup;
 import org.jclouds.ec2.domain.UserIdGroupPair;
+import org.jclouds.net.domain.IpPermission;
+import org.jclouds.net.domain.IpProtocol;
 import org.testng.annotations.Test;
 
 import com.google.common.base.Predicate;
@@ -63,20 +63,20 @@ public class AWSEC2CreateSecurityGroupIfNeededTest {
                       .fromPort(22)
                       .toPort(22)
                       .ipProtocol(IpProtocol.TCP)
-                      .ipRange("0.0.0.0/0")
+                      .cidrBlock("0.0.0.0/0")
                       .build());
 
       permissions.add(IpPermission.builder()
                       .fromPort(0)
                       .toPort(65535)
                       .ipProtocol(IpProtocol.TCP)
-                      .userIdGroupPair("ownerId", "group")
+                      .tenantIdGroupNamePair("ownerId", "group")
                       .build());
       permissions.add(IpPermission.builder()
                       .fromPort(0)
                       .toPort(65535)
                       .ipProtocol(IpProtocol.UDP)
-                      .userIdGroupPair("ownerId", "group")
+                      .tenantIdGroupNamePair("ownerId", "group")
                       .build());
       
       client.createSecurityGroupInRegion("region", "group", "group");

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f524ee6/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/parse/DescribeSecurityGroupsResponseTest.java
----------------------------------------------------------------------
diff --git 
a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/parse/DescribeSecurityGroupsResponseTest.java
 
b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/parse/DescribeSecurityGroupsResponseTest.java
index 40e49dd..8f948f5 100644
--- 
a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/parse/DescribeSecurityGroupsResponseTest.java
+++ 
b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/parse/DescribeSecurityGroupsResponseTest.java
@@ -25,12 +25,12 @@ import static org.testng.Assert.assertEquals;
 import java.io.InputStream;
 import java.util.Set;
 
-import org.jclouds.ec2.domain.IpPermission;
-import org.jclouds.ec2.domain.IpProtocol;
 import org.jclouds.ec2.domain.SecurityGroup;
 import org.jclouds.ec2.xml.BaseEC2HandlerTest;
 import org.jclouds.ec2.xml.DescribeSecurityGroupsResponseHandler;
 import org.jclouds.http.functions.ParseSax;
+import org.jclouds.net.domain.IpPermission;
+import org.jclouds.net.domain.IpProtocol;
 import org.jclouds.reflect.Invocation;
 import org.jclouds.rest.internal.GeneratedHttpRequest;
 import org.testng.annotations.Test;
@@ -69,7 +69,7 @@ public class DescribeSecurityGroupsResponseTest extends 
BaseEC2HandlerTest {
 //                                          .vpcId("vpc-99999999")
                                           .ipPermission(IpPermission.builder()
                                                                     
.ipProtocol(IpProtocol.ALL)
-                                                                    
.userIdGroupPair("123123123123","sg-11111111").build())
+                                                                    
.tenantIdGroupNamePair("123123123123","sg-11111111").build())
 //                                          
.ipPermissionEgress(IpPermission.builder()
 //                                                                    
.ipProtocol(IpProtocol.ALL)
 //                                                                    
.ipRange("0.0.0.0/0").build())

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f524ee6/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/AWSSecurityGroupAsyncClientTest.java
----------------------------------------------------------------------
diff --git 
a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/AWSSecurityGroupAsyncClientTest.java
 
b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/AWSSecurityGroupAsyncClientTest.java
index 2ad3467..9ebead5 100644
--- 
a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/AWSSecurityGroupAsyncClientTest.java
+++ 
b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/AWSSecurityGroupAsyncClientTest.java
@@ -22,13 +22,13 @@ import java.io.IOException;
 
 import org.jclouds.Fallbacks.EmptySetOnNotFoundOr404;
 import org.jclouds.Fallbacks.VoidOnNotFoundOr404;
-import org.jclouds.ec2.domain.IpPermission;
-import org.jclouds.ec2.domain.IpProtocol;
 import org.jclouds.ec2.util.IpPermissions;
 import org.jclouds.ec2.xml.DescribeSecurityGroupsResponseHandler;
 import org.jclouds.http.HttpRequest;
 import org.jclouds.http.functions.ParseSax;
 import org.jclouds.http.functions.ReleasePayloadAndReturn;
+import org.jclouds.net.domain.IpPermission;
+import org.jclouds.net.domain.IpProtocol;
 import org.jclouds.rest.internal.GeneratedHttpRequest;
 import org.testng.annotations.Test;
 

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f524ee6/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/AWSSecurityGroupClientLiveTest.java
----------------------------------------------------------------------
diff --git 
a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/AWSSecurityGroupClientLiveTest.java
 
b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/AWSSecurityGroupClientLiveTest.java
index 0ec81dd..76c7e91 100644
--- 
a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/AWSSecurityGroupClientLiveTest.java
+++ 
b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/AWSSecurityGroupClientLiveTest.java
@@ -21,11 +21,11 @@ import static org.testng.Assert.assertNotNull;
 
 import java.util.Set;
 
-import org.jclouds.ec2.domain.IpPermission;
-import org.jclouds.ec2.domain.IpProtocol;
 import org.jclouds.ec2.domain.SecurityGroup;
 import org.jclouds.ec2.services.SecurityGroupClientLiveTest;
 import org.jclouds.ec2.util.IpPermissions;
+import org.jclouds.net.domain.IpPermission;
+import org.jclouds.net.domain.IpProtocol;
 import org.testng.annotations.Test;
 
 import com.google.common.base.Predicate;
@@ -69,7 +69,7 @@ public class AWSSecurityGroupClientLiveTest extends 
SecurityGroupClientLiveTest
          assertEventually(new GroupHasPermission(client, group2Name, new 
Predicate<IpPermission>() {
             @Override
             public boolean apply(IpPermission arg0) {
-               return 
arg0.getUserIdGroupPairs().equals(ImmutableMultimap.of(group.getOwnerId(), 
group1Name))
+               return 
arg0.getTenantIdGroupNamePairs().equals(ImmutableMultimap.of(group.getOwnerId(),
 group1Name))
                      && arg0.getFromPort() == 80 && arg0.getToPort() == 80 && 
arg0.getIpProtocol() == IpProtocol.TCP;
             }
          }));

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5f524ee6/providers/gogrid/src/main/java/org/jclouds/gogrid/compute/GoGridComputeService.java
----------------------------------------------------------------------
diff --git 
a/providers/gogrid/src/main/java/org/jclouds/gogrid/compute/GoGridComputeService.java
 
b/providers/gogrid/src/main/java/org/jclouds/gogrid/compute/GoGridComputeService.java
index 3f5935c..8e34a5e 100644
--- 
a/providers/gogrid/src/main/java/org/jclouds/gogrid/compute/GoGridComputeService.java
+++ 
b/providers/gogrid/src/main/java/org/jclouds/gogrid/compute/GoGridComputeService.java
@@ -37,6 +37,7 @@ import org.jclouds.compute.domain.Image;
 import org.jclouds.compute.domain.NodeMetadata;
 import org.jclouds.compute.domain.TemplateBuilder;
 import org.jclouds.compute.extensions.ImageExtension;
+import org.jclouds.compute.extensions.SecurityGroupExtension;
 import org.jclouds.compute.internal.BaseComputeService;
 import org.jclouds.compute.internal.PersistNodeCredentials;
 import org.jclouds.compute.options.TemplateOptions;
@@ -81,12 +82,12 @@ public class GoGridComputeService extends 
BaseComputeService {
             InitializeRunScriptOnNodeOrPlaceInBadMap.Factory 
initScriptRunnerFactory, InitAdminAccess initAdminAccess,
             RunScriptOnNode.Factory runScriptOnNodeFactory, 
PersistNodeCredentials persistNodeCredentials,
             Timeouts timeouts, @Named(Constants.PROPERTY_USER_THREADS) 
ListeningExecutorService userExecutor,
-            Optional<ImageExtension> imageExtension) {
+            Optional<ImageExtension> imageExtension, 
Optional<SecurityGroupExtension> securityGroupExtension) {
       super(context, credentialStore, images, hardwareProfiles, locations, 
listNodesStrategy, getImageStrategy,
                getNodeMetadataStrategy, runNodesAndAddToSetStrategy, 
rebootNodeStrategy, destroyNodeStrategy,
                resumeNodeStrategy, suspendNodeStrategy, 
templateBuilderProvider, templateOptionsProvider, nodeRunning,
                nodeTerminated, nodeSuspended, initScriptRunnerFactory, 
initAdminAccess, runScriptOnNodeFactory,
-               persistNodeCredentials, timeouts, userExecutor, imageExtension);
+               persistNodeCredentials, timeouts, userExecutor, imageExtension, 
securityGroupExtension);
    }
 
    /**

Reply via email to