Merge branch 'master' of github.com:jclouds/jclouds into 1.5.x

* 'master' of github.com:jclouds/jclouds:
  fix covariance/assignability in RestContext<? extends Client> subclasses
  Issue 891: ensure we run apt update when install jdk fails
diff --git a/apis/atmos/src/main/java/org/jclouds/atmos/config/AtmosRestClientModule.java b/apis/atmos/src/main/java/org/jclouds/atmos/config/AtmosRestClientModule.java
index b9d52d4..469922a 100644
--- a/apis/atmos/src/main/java/org/jclouds/atmos/config/AtmosRestClientModule.java
+++ b/apis/atmos/src/main/java/org/jclouds/atmos/config/AtmosRestClientModule.java
@@ -50,9 +50,6 @@
  */
 @ConfiguresRestClient
 public class AtmosRestClientModule extends RestClientModule<AtmosClient, AtmosAsyncClient> {
-   public AtmosRestClientModule() {
-      super(AtmosClient.class, AtmosAsyncClient.class);
-   }
 
    @Override
    protected void configure() {
diff --git a/apis/cloudfiles/src/main/java/org/jclouds/cloudfiles/config/CloudFilesRestClientModule.java b/apis/cloudfiles/src/main/java/org/jclouds/cloudfiles/config/CloudFilesRestClientModule.java
index cdbc74d..bbaffb5 100644
--- a/apis/cloudfiles/src/main/java/org/jclouds/cloudfiles/config/CloudFilesRestClientModule.java
+++ b/apis/cloudfiles/src/main/java/org/jclouds/cloudfiles/config/CloudFilesRestClientModule.java
@@ -54,10 +54,6 @@
 @ConfiguresRestClient
 public class CloudFilesRestClientModule extends RestClientModule<CloudFilesClient, CloudFilesAsyncClient> {
 
-   public CloudFilesRestClientModule() {
-      super(CloudFilesClient.class, CloudFilesAsyncClient.class);
-   }
-
    @Provides
    @Singleton
    CommonSwiftClient provideCommonSwiftClient(CloudFilesClient in) {
diff --git a/apis/cloudloadbalancers/src/main/java/org/jclouds/cloudloadbalancers/config/CloudLoadBalancersRestClientModule.java b/apis/cloudloadbalancers/src/main/java/org/jclouds/cloudloadbalancers/config/CloudLoadBalancersRestClientModule.java
index bd9e8ce..f7bc1f3 100644
--- a/apis/cloudloadbalancers/src/main/java/org/jclouds/cloudloadbalancers/config/CloudLoadBalancersRestClientModule.java
+++ b/apis/cloudloadbalancers/src/main/java/org/jclouds/cloudloadbalancers/config/CloudLoadBalancersRestClientModule.java
@@ -73,7 +73,7 @@
             .build();
 
    public CloudLoadBalancersRestClientModule() {
-      super(CloudLoadBalancersClient.class, CloudLoadBalancersAsyncClient.class, DELEGATE_MAP);
+      super(DELEGATE_MAP);
    }
 
    protected void installLocations() {
diff --git a/apis/cloudservers/src/main/java/org/jclouds/cloudservers/config/CloudServersRestClientModule.java b/apis/cloudservers/src/main/java/org/jclouds/cloudservers/config/CloudServersRestClientModule.java
index 13f267c..bb0399d 100644
--- a/apis/cloudservers/src/main/java/org/jclouds/cloudservers/config/CloudServersRestClientModule.java
+++ b/apis/cloudservers/src/main/java/org/jclouds/cloudservers/config/CloudServersRestClientModule.java
@@ -54,10 +54,6 @@
 @ConfiguresRestClient
 public class CloudServersRestClientModule extends RestClientModule<CloudServersClient, CloudServersAsyncClient> {
 
-   public CloudServersRestClientModule() {
-      super(CloudServersClient.class, CloudServersAsyncClient.class);
-   }
-
    @Override
    protected void configure() {
       bind(DateAdapter.class).to(Iso8601DateAdapter.class);
diff --git a/apis/cloudsigma/src/main/java/org/jclouds/cloudsigma/config/CloudSigmaRestClientModule.java b/apis/cloudsigma/src/main/java/org/jclouds/cloudsigma/config/CloudSigmaRestClientModule.java
index ce17878..a8ca588 100644
--- a/apis/cloudsigma/src/main/java/org/jclouds/cloudsigma/config/CloudSigmaRestClientModule.java
+++ b/apis/cloudsigma/src/main/java/org/jclouds/cloudsigma/config/CloudSigmaRestClientModule.java
@@ -57,10 +57,6 @@
 @ConfiguresRestClient
 public class CloudSigmaRestClientModule extends RestClientModule<CloudSigmaClient, CloudSigmaAsyncClient> {
 
-   public CloudSigmaRestClientModule() {
-      super(CloudSigmaClient.class, CloudSigmaAsyncClient.class);
-   }
-
    @Override
    protected void bindErrorHandlers() {
       bind(HttpErrorHandler.class).annotatedWith(Redirection.class).to(CloudSigmaErrorHandler.class);
diff --git a/apis/cloudstack/src/main/java/org/jclouds/cloudstack/config/CloudStackRestClientModule.java b/apis/cloudstack/src/main/java/org/jclouds/cloudstack/config/CloudStackRestClientModule.java
index a5b63e1..7bf1afd 100644
--- a/apis/cloudstack/src/main/java/org/jclouds/cloudstack/config/CloudStackRestClientModule.java
+++ b/apis/cloudstack/src/main/java/org/jclouds/cloudstack/config/CloudStackRestClientModule.java
@@ -221,7 +221,7 @@
    }
 
    public CloudStackRestClientModule() {
-      super(CloudStackClient.class, CloudStackAsyncClient.class, DELEGATE_MAP);
+      super(DELEGATE_MAP);
    }
 
    @Override
diff --git a/apis/cloudwatch/src/main/java/org/jclouds/cloudwatch/config/CloudWatchRestClientModule.java b/apis/cloudwatch/src/main/java/org/jclouds/cloudwatch/config/CloudWatchRestClientModule.java
index ebede44..7905335 100644
--- a/apis/cloudwatch/src/main/java/org/jclouds/cloudwatch/config/CloudWatchRestClientModule.java
+++ b/apis/cloudwatch/src/main/java/org/jclouds/cloudwatch/config/CloudWatchRestClientModule.java
@@ -30,8 +30,5 @@
  */
 @ConfiguresRestClient
 public class CloudWatchRestClientModule extends FormSigningRestClientModule<CloudWatchClient, CloudWatchAsyncClient> {
-   public CloudWatchRestClientModule() {
-      super(CloudWatchClient.class, CloudWatchAsyncClient.class);
-   }
 
 }
diff --git a/apis/deltacloud/src/main/java/org/jclouds/deltacloud/config/DeltacloudRestClientModule.java b/apis/deltacloud/src/main/java/org/jclouds/deltacloud/config/DeltacloudRestClientModule.java
index 8a1664d..73974a0 100644
--- a/apis/deltacloud/src/main/java/org/jclouds/deltacloud/config/DeltacloudRestClientModule.java
+++ b/apis/deltacloud/src/main/java/org/jclouds/deltacloud/config/DeltacloudRestClientModule.java
@@ -63,10 +63,6 @@
 @ConfiguresRestClient
 public class DeltacloudRestClientModule extends RestClientModule<DeltacloudClient, DeltacloudAsyncClient> {
 
-   public DeltacloudRestClientModule() {
-      super(DeltacloudClient.class, DeltacloudAsyncClient.class);
-   }
-
    @Override
    protected void bindErrorHandlers() {
       bind(HttpErrorHandler.class).annotatedWith(Redirection.class).to(DeltacloudErrorHandler.class);
diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/EC2ApiMetadata.java b/apis/ec2/src/main/java/org/jclouds/ec2/EC2ApiMetadata.java
index b15f956..2964886 100644
--- a/apis/ec2/src/main/java/org/jclouds/ec2/EC2ApiMetadata.java
+++ b/apis/ec2/src/main/java/org/jclouds/ec2/EC2ApiMetadata.java
@@ -62,7 +62,7 @@
    /** The serialVersionUID */
    private static final long serialVersionUID = 4424763314988423886L;
    
-   public static final TypeToken<RestContext<EC2Client, EC2AsyncClient>> CONTEXT_TOKEN = new TypeToken<RestContext<EC2Client, EC2AsyncClient>>() {
+   public static final TypeToken<RestContext<? extends EC2Client, ? extends EC2AsyncClient>> CONTEXT_TOKEN = new TypeToken<RestContext<? extends EC2Client, ? extends EC2AsyncClient>>() {
       private static final long serialVersionUID = -5070937833892503232L;
    };
 
@@ -103,6 +103,7 @@
          .documentation(URI.create("http://docs.amazonwebservices.com/AWSEC2/latest/APIReference"))
          .version(EC2AsyncClient.VERSION)
          .defaultProperties(EC2ApiMetadata.defaultProperties())
+         .context(CONTEXT_TOKEN)
          .wrapper(EC2ComputeServiceContext.class)
          .defaultModules(ImmutableSet.<Class<? extends Module>>of(EC2RestClientModule.class, EC2ResolveImagesModule.class, EC2ComputeServiceContextModule.class));
       }
diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/config/EC2RestClientModule.java b/apis/ec2/src/main/java/org/jclouds/ec2/config/EC2RestClientModule.java
index aad33fa..48047b3 100644
--- a/apis/ec2/src/main/java/org/jclouds/ec2/config/EC2RestClientModule.java
+++ b/apis/ec2/src/main/java/org/jclouds/ec2/config/EC2RestClientModule.java
@@ -49,6 +49,7 @@
 import org.jclouds.rest.ConfiguresRestClient;
 
 import com.google.common.collect.ImmutableMap;
+import com.google.common.reflect.TypeToken;
 import com.google.inject.Scopes;
 
 /**
@@ -59,26 +60,28 @@
 @ConfiguresRestClient
 public class EC2RestClientModule<S extends EC2Client, A extends EC2AsyncClient> extends
          WithZonesFormSigningRestClientModule<S, A> {
-
    public static final Map<Class<?>, Class<?>> DELEGATE_MAP = ImmutableMap.<Class<?>, Class<?>> builder()//
-            .put(AMIClient.class, AMIAsyncClient.class)//
-            .put(ElasticIPAddressClient.class, ElasticIPAddressAsyncClient.class)//
-            .put(InstanceClient.class, InstanceAsyncClient.class)//
-            .put(KeyPairClient.class, KeyPairAsyncClient.class)//
-            .put(SecurityGroupClient.class, SecurityGroupAsyncClient.class)//
-            .put(WindowsClient.class, WindowsAsyncClient.class)//
-            .put(AvailabilityZoneAndRegionClient.class, AvailabilityZoneAndRegionAsyncClient.class)//
-            .put(ElasticBlockStoreClient.class, ElasticBlockStoreAsyncClient.class)//
-            .build();
-
+   .put(AMIClient.class, AMIAsyncClient.class)//
+   .put(ElasticIPAddressClient.class, ElasticIPAddressAsyncClient.class)//
+   .put(InstanceClient.class, InstanceAsyncClient.class)//
+   .put(KeyPairClient.class, KeyPairAsyncClient.class)//
+   .put(SecurityGroupClient.class, SecurityGroupAsyncClient.class)//
+   .put(WindowsClient.class, WindowsAsyncClient.class)//
+   .put(AvailabilityZoneAndRegionClient.class, AvailabilityZoneAndRegionAsyncClient.class)//
+   .put(ElasticBlockStoreClient.class, ElasticBlockStoreAsyncClient.class)//
+   .build();
+   
    @SuppressWarnings("unchecked")
    public EC2RestClientModule() {
-      this((Class) EC2Client.class, (Class) EC2AsyncClient.class, DELEGATE_MAP);
+      super((TypeToken) TypeToken.of(EC2Client.class), (TypeToken) TypeToken.of(EC2AsyncClient.class), DELEGATE_MAP);
    }
 
-   public EC2RestClientModule(Class<S> sync, Class<A> async, Map<Class<?>, Class<?>> delegateMap) {
-      super(sync, async, delegateMap);
+   protected EC2RestClientModule(TypeToken<S> syncClientType, TypeToken<A> asyncClientType,
+            Map<Class<?>, Class<?>> sync2Async) {
+      super(syncClientType, asyncClientType, sync2Async);
    }
+   
+
 
    @Override
    protected void installLocations() {
diff --git a/apis/ec2/src/test/java/org/jclouds/ec2/services/BaseEC2AsyncClientTest.java b/apis/ec2/src/test/java/org/jclouds/ec2/services/BaseEC2AsyncClientTest.java
index 7d3f66c..2890eae 100644
--- a/apis/ec2/src/test/java/org/jclouds/ec2/services/BaseEC2AsyncClientTest.java
+++ b/apis/ec2/src/test/java/org/jclouds/ec2/services/BaseEC2AsyncClientTest.java
@@ -62,13 +62,9 @@
  */
 @Test(groups = "unit")
 public abstract class BaseEC2AsyncClientTest<T> extends BaseAsyncClientTest<T> {
-      @ConfiguresRestClient
+   @ConfiguresRestClient
    protected static class StubEC2RestClientModule extends EC2RestClientModule<EC2Client, EC2AsyncClient> {
 
-      public StubEC2RestClientModule() {
-         super(EC2Client.class, EC2AsyncClient.class, DELEGATE_MAP);
-      }
-
       @Provides
       @Singleton
       LoadingCache<RegionAndName, Image> provide(){
diff --git a/apis/elasticstack/src/main/java/org/jclouds/elasticstack/config/ElasticStackRestClientModule.java b/apis/elasticstack/src/main/java/org/jclouds/elasticstack/config/ElasticStackRestClientModule.java
index 93781f3..38b3a85 100644
--- a/apis/elasticstack/src/main/java/org/jclouds/elasticstack/config/ElasticStackRestClientModule.java
+++ b/apis/elasticstack/src/main/java/org/jclouds/elasticstack/config/ElasticStackRestClientModule.java
@@ -57,10 +57,6 @@
 @ConfiguresRestClient
 public class ElasticStackRestClientModule extends RestClientModule<ElasticStackClient, ElasticStackAsyncClient> {
 
-   public ElasticStackRestClientModule() {
-      super(ElasticStackClient.class, ElasticStackAsyncClient.class);
-   }
-
    @Override
    protected void configure() {
       super.configure();
diff --git a/apis/nova/src/main/java/org/jclouds/openstack/nova/config/NovaRestClientModule.java b/apis/nova/src/main/java/org/jclouds/openstack/nova/config/NovaRestClientModule.java
index e1c3186..d82c9f0 100644
--- a/apis/nova/src/main/java/org/jclouds/openstack/nova/config/NovaRestClientModule.java
+++ b/apis/nova/src/main/java/org/jclouds/openstack/nova/config/NovaRestClientModule.java
@@ -51,7 +51,6 @@
    private final OpenStackAuthenticationModule module;
 
    public NovaRestClientModule(OpenStackAuthenticationModule module) {
-      super(NovaClient.class, NovaAsyncClient.class);
       this.module = module;
    }
 
diff --git a/apis/openstack-nova-ec2/src/main/java/org/jclouds/openstack/nova/ec2/config/NovaEC2RestClientModule.java b/apis/openstack-nova-ec2/src/main/java/org/jclouds/openstack/nova/ec2/config/NovaEC2RestClientModule.java
index 6ea5685..5d6358b 100644
--- a/apis/openstack-nova-ec2/src/main/java/org/jclouds/openstack/nova/ec2/config/NovaEC2RestClientModule.java
+++ b/apis/openstack-nova-ec2/src/main/java/org/jclouds/openstack/nova/ec2/config/NovaEC2RestClientModule.java
@@ -41,10 +41,6 @@
 @ConfiguresRestClient
 public class NovaEC2RestClientModule extends EC2RestClientModule<EC2Client, EC2AsyncClient> {
 
-   public NovaEC2RestClientModule() {
-      super(EC2Client.class, EC2AsyncClient.class, DELEGATE_MAP);
-   }
-
    @Override
    protected void configure() {
       super.configure();
diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v1_1/config/NovaRestClientModule.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v1_1/config/NovaRestClientModule.java
index 32c8513..c9f603d 100644
--- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v1_1/config/NovaRestClientModule.java
+++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v1_1/config/NovaRestClientModule.java
@@ -78,7 +78,7 @@
          .put(KeyPairClient.class, KeyPairAsyncClient.class).build();
 
    public NovaRestClientModule() {
-      super(NovaClient.class, NovaAsyncClient.class, DELEGATE_MAP);
+      super(DELEGATE_MAP);
    }
 
    @Override
diff --git a/apis/s3/src/main/java/org/jclouds/s3/S3ApiMetadata.java b/apis/s3/src/main/java/org/jclouds/s3/S3ApiMetadata.java
index 10f0ce4..ae09127 100644
--- a/apis/s3/src/main/java/org/jclouds/s3/S3ApiMetadata.java
+++ b/apis/s3/src/main/java/org/jclouds/s3/S3ApiMetadata.java
@@ -65,7 +65,7 @@
    /** The serialVersionUID */
    private static final long serialVersionUID = 820062881469203616L;
    
-   public static final TypeToken<RestContext<S3Client, S3AsyncClient>> CONTEXT_TOKEN = new TypeToken<RestContext<S3Client, S3AsyncClient>>() {
+   public static final TypeToken<RestContext<? extends S3Client,? extends  S3AsyncClient>> CONTEXT_TOKEN = new TypeToken<RestContext<? extends S3Client,? extends  S3AsyncClient>>() {
       private static final long serialVersionUID = -5070937833892503232L;
    };
 
@@ -107,6 +107,7 @@
          .documentation(URI.create("http://docs.amazonwebservices.com/AmazonS3/latest/API"))
          .version(S3AsyncClient.VERSION)
          .defaultProperties(S3ApiMetadata.defaultProperties())
+         .context(CONTEXT_TOKEN)
          .wrapper(TypeToken.of(S3BlobStoreContext.class))
          .defaultModules(ImmutableSet.<Class<? extends Module>>of(S3RestClientModule.class, S3BlobStoreContextModule.class));
       }
diff --git a/apis/s3/src/main/java/org/jclouds/s3/config/S3RestClientModule.java b/apis/s3/src/main/java/org/jclouds/s3/config/S3RestClientModule.java
index a1c4450..57978bf 100644
--- a/apis/s3/src/main/java/org/jclouds/s3/config/S3RestClientModule.java
+++ b/apis/s3/src/main/java/org/jclouds/s3/config/S3RestClientModule.java
@@ -46,6 +46,7 @@
 import com.google.common.base.Supplier;
 import com.google.common.base.Suppliers;
 import com.google.common.collect.Maps;
+import com.google.common.reflect.TypeToken;
 import com.google.inject.Provides;
 import com.google.inject.Scopes;
 
@@ -59,11 +60,11 @@
 
    @SuppressWarnings("unchecked")
    public S3RestClientModule() {
-      this((Class) S3Client.class, (Class) S3AsyncClient.class);
+      this((TypeToken) TypeToken.of(S3Client.class), (TypeToken) TypeToken.of(S3AsyncClient.class));
    }
 
-   public S3RestClientModule(Class<S> sync, Class<A> async) {
-      super(sync, async);
+   protected S3RestClientModule(TypeToken<S> syncClientType, TypeToken<A> asyncClientType) {
+      super(syncClientType, asyncClientType);
    }
 
    @Provides
@@ -82,10 +83,10 @@
 
    @Override
    protected void configure() {
+      super.configure();
       install(new S3ObjectModule());
       install(new S3ParserModule());
       bind(RequestAuthorizeSignature.class).in(Scopes.SINGLETON);
-      super.configure();
    }
 
    @Override
diff --git a/apis/s3/src/test/java/org/jclouds/s3/S3AsyncClientTest.java b/apis/s3/src/test/java/org/jclouds/s3/S3AsyncClientTest.java
index 5e54b10..70b8b7c 100644
--- a/apis/s3/src/test/java/org/jclouds/s3/S3AsyncClientTest.java
+++ b/apis/s3/src/test/java/org/jclouds/s3/S3AsyncClientTest.java
@@ -478,13 +478,9 @@
       checkFilters(request);
    }
 
-      @ConfiguresRestClient
+   @ConfiguresRestClient
    private static final class TestS3RestClientModule extends S3RestClientModule<S3Client, S3AsyncClient> {
 
-      public TestS3RestClientModule() {
-         super(S3Client.class, S3AsyncClient.class);
-      }
-
       @Override
       protected String provideTimeStamp(@TimeStamp Supplier<String> cache) {
          return "2009-11-08T15:54:08.897Z";
diff --git a/apis/s3/src/test/java/org/jclouds/s3/blobstore/S3BlobRequestSignerTest.java b/apis/s3/src/test/java/org/jclouds/s3/blobstore/S3BlobRequestSignerTest.java
index edc9b03..b2f8bd5 100644
--- a/apis/s3/src/test/java/org/jclouds/s3/blobstore/S3BlobRequestSignerTest.java
+++ b/apis/s3/src/test/java/org/jclouds/s3/blobstore/S3BlobRequestSignerTest.java
@@ -118,10 +118,6 @@
    @ConfiguresRestClient
    private static final class TestS3RestClientModule extends S3RestClientModule<S3Client, S3AsyncClient> {
 
-      public TestS3RestClientModule() {
-         super(S3Client.class, S3AsyncClient.class);
-      }
-
       @Override
       protected String provideTimeStamp(@TimeStamp Supplier<String> cache) {
          return "Thu, 05 Jun 2008 16:38:19 GMT";
diff --git a/apis/s3/src/test/java/org/jclouds/s3/internal/BaseS3ClientExpectTest.java b/apis/s3/src/test/java/org/jclouds/s3/internal/BaseS3ClientExpectTest.java
index f38e1e4..5fd0cbb 100644
--- a/apis/s3/src/test/java/org/jclouds/s3/internal/BaseS3ClientExpectTest.java
+++ b/apis/s3/src/test/java/org/jclouds/s3/internal/BaseS3ClientExpectTest.java
@@ -40,10 +40,6 @@
       @ConfiguresRestClient
    private static final class TestS3RestClientModule extends S3RestClientModule<S3Client, S3AsyncClient> {
 
-      public TestS3RestClientModule() {
-         super(S3Client.class, S3AsyncClient.class);
-      }
-
       @Override
       protected String provideTimeStamp(@TimeStamp Supplier<String> cache) {
          return CONSTANT_DATE;
diff --git a/apis/swift/src/main/java/org/jclouds/openstack/swift/config/BaseSwiftRestClientModule.java b/apis/swift/src/main/java/org/jclouds/openstack/swift/config/BaseSwiftRestClientModule.java
index 4dd9137..c84c046 100644
--- a/apis/swift/src/main/java/org/jclouds/openstack/swift/config/BaseSwiftRestClientModule.java
+++ b/apis/swift/src/main/java/org/jclouds/openstack/swift/config/BaseSwiftRestClientModule.java
@@ -50,13 +50,11 @@
          RestClientModule<S, A> {
    private final OpenStackAuthenticationModule module;
 
-   public BaseSwiftRestClientModule(Class<S> syncClientType, Class<A> asyncClientType) {
-      this(new OpenStackAuthenticationModule(), syncClientType, asyncClientType);
+   public BaseSwiftRestClientModule() {
+      this(new OpenStackAuthenticationModule());
    }
 
-   public BaseSwiftRestClientModule(OpenStackAuthenticationModule module, Class<S> syncClientType,
-            Class<A> asyncClientType) {
-      super(syncClientType, asyncClientType);
+   public BaseSwiftRestClientModule(OpenStackAuthenticationModule module) {
       this.module = module;
    }
 
diff --git a/apis/swift/src/main/java/org/jclouds/openstack/swift/config/SwiftRestClientModule.java b/apis/swift/src/main/java/org/jclouds/openstack/swift/config/SwiftRestClientModule.java
index a647924..ebbaab3 100644
--- a/apis/swift/src/main/java/org/jclouds/openstack/swift/config/SwiftRestClientModule.java
+++ b/apis/swift/src/main/java/org/jclouds/openstack/swift/config/SwiftRestClientModule.java
@@ -35,10 +35,6 @@
 @ConfiguresRestClient
 public class SwiftRestClientModule extends BaseSwiftRestClientModule<SwiftClient, SwiftAsyncClient> {
 
-   public SwiftRestClientModule() {
-      super(SwiftClient.class, SwiftAsyncClient.class);
-   }
-
    @Provides
    @Singleton
    CommonSwiftClient provideCommonSwiftClient(SwiftClient in) {
diff --git a/apis/swift/src/test/java/org/jclouds/openstack/swift/CommonSwiftClientTest.java b/apis/swift/src/test/java/org/jclouds/openstack/swift/CommonSwiftClientTest.java
index ced9b5f..cc74c18 100644
--- a/apis/swift/src/test/java/org/jclouds/openstack/swift/CommonSwiftClientTest.java
+++ b/apis/swift/src/test/java/org/jclouds/openstack/swift/CommonSwiftClientTest.java
@@ -67,7 +67,7 @@
    protected static class TestSwiftRestClientModule extends
             BaseSwiftRestClientModule<SwiftClient, SwiftAsyncClient> {
       private TestSwiftRestClientModule() {
-         super(new TestOpenStackAuthenticationModule(), SwiftClient.class, SwiftAsyncClient.class);
+         super(new TestOpenStackAuthenticationModule());
       }
       @Provides
       @Singleton
diff --git a/apis/vcloud/src/main/java/org/jclouds/vcloud/config/VCloudRestClientModule.java b/apis/vcloud/src/main/java/org/jclouds/vcloud/config/VCloudRestClientModule.java
index a7131c8..96d82e0 100644
--- a/apis/vcloud/src/main/java/org/jclouds/vcloud/config/VCloudRestClientModule.java
+++ b/apis/vcloud/src/main/java/org/jclouds/vcloud/config/VCloudRestClientModule.java
@@ -144,7 +144,7 @@
             .build();
 
    public VCloudRestClientModule() {
-      super(VCloudClient.class, VCloudAsyncClient.class, DELEGATE_MAP);
+      super(DELEGATE_MAP);
    }
 
    @Provides
diff --git a/apis/walrus/src/main/java/org/jclouds/walrus/config/WalrusRestClientModule.java b/apis/walrus/src/main/java/org/jclouds/walrus/config/WalrusRestClientModule.java
index 9cf9b55..b5c75f3 100644
--- a/apis/walrus/src/main/java/org/jclouds/walrus/config/WalrusRestClientModule.java
+++ b/apis/walrus/src/main/java/org/jclouds/walrus/config/WalrusRestClientModule.java
@@ -26,6 +26,7 @@
 import org.jclouds.s3.config.S3RestClientModule;
 import org.jclouds.walrus.WalrusAsyncClient;
 
+import com.google.common.reflect.TypeToken;
 import com.google.inject.Provides;
 
 /**
@@ -34,9 +35,8 @@
  */
 @ConfiguresRestClient
 public class WalrusRestClientModule extends S3RestClientModule<S3Client, WalrusAsyncClient> {
-
    public WalrusRestClientModule() {
-      super(S3Client.class, WalrusAsyncClient.class);
+      super(TypeToken.of(S3Client.class), TypeToken.of(WalrusAsyncClient.class));
    }
 
    @Provides
diff --git a/common/aws/src/main/java/org/jclouds/aws/config/AWSRestClientModule.java b/common/aws/src/main/java/org/jclouds/aws/config/AWSRestClientModule.java
index 62772ab..7915b4f 100644
--- a/common/aws/src/main/java/org/jclouds/aws/config/AWSRestClientModule.java
+++ b/common/aws/src/main/java/org/jclouds/aws/config/AWSRestClientModule.java
@@ -31,22 +31,32 @@
 import org.jclouds.rest.ConfiguresRestClient;
 import org.jclouds.rest.config.RestClientModule;
 
+import com.google.common.reflect.TypeToken;
+
 
 /**
  * 
  * @author Adrian Cole
  */
 @ConfiguresRestClient
-public class AWSRestClientModule<S, A> extends RestClientModule<S, A> {
+public abstract class AWSRestClientModule<S, A> extends RestClientModule<S, A> {
 
-   public AWSRestClientModule(Class<S> syncClientType, Class<A> asyncClientType, Map<Class<?>, Class<?>> delegates) {
-      super(syncClientType, asyncClientType, delegates);
+   protected AWSRestClientModule(Map<Class<?>, Class<?>> delegates) {
+      super(delegates);
    }
 
-   public AWSRestClientModule(Class<S> syncClientType, Class<A> asyncClientType) {
+   protected AWSRestClientModule() {
+   }
+
+   protected AWSRestClientModule(TypeToken<S> syncClientType, TypeToken<A> asyncClientType) {
       super(syncClientType, asyncClientType);
    }
 
+   protected AWSRestClientModule(TypeToken<S> syncClientType, TypeToken<A> asyncClientType,
+            Map<Class<?>, Class<?>> sync2Async) {
+      super(syncClientType, asyncClientType, sync2Async);
+   }
+   
    @Override
    protected void bindErrorHandlers() {
       bind(HttpErrorHandler.class).annotatedWith(Redirection.class).to(ParseAWSErrorFromXmlContent.class);
diff --git a/common/aws/src/main/java/org/jclouds/aws/config/FormSigningRestClientModule.java b/common/aws/src/main/java/org/jclouds/aws/config/FormSigningRestClientModule.java
index cda15e2..12b90f3 100644
--- a/common/aws/src/main/java/org/jclouds/aws/config/FormSigningRestClientModule.java
+++ b/common/aws/src/main/java/org/jclouds/aws/config/FormSigningRestClientModule.java
@@ -31,6 +31,7 @@
 import org.jclouds.rest.ConfiguresRestClient;
 import org.jclouds.rest.RequestSigner;
 
+import com.google.common.reflect.TypeToken;
 import com.google.inject.Provides;
 
 /**
@@ -38,17 +39,24 @@
  * @author Adrian Cole
  */
 @ConfiguresRestClient
-public class FormSigningRestClientModule<S, A> extends AWSRestClientModule<S, A> {
+public abstract class FormSigningRestClientModule<S, A> extends AWSRestClientModule<S, A> {
 
-   public FormSigningRestClientModule(Class<S> syncClientType, Class<A> asyncClientType,
-         Map<Class<?>, Class<?>> delegates) {
-      super(syncClientType, asyncClientType, delegates);
+   protected FormSigningRestClientModule(Map<Class<?>, Class<?>> delegates) {
+      super(delegates);
    }
 
-   public FormSigningRestClientModule(Class<S> syncClientType, Class<A> asyncClientType) {
+   protected FormSigningRestClientModule() {
+   }
+
+   protected FormSigningRestClientModule(TypeToken<S> syncClientType, TypeToken<A> asyncClientType) {
       super(syncClientType, asyncClientType);
    }
 
+   protected FormSigningRestClientModule(TypeToken<S> syncClientType, TypeToken<A> asyncClientType,
+            Map<Class<?>, Class<?>> sync2Async) {
+      super(syncClientType, asyncClientType, sync2Async);
+   }
+   
    @Provides
    @TimeStamp
    protected String provideTimeStamp(final DateService dateService,
diff --git a/common/aws/src/main/java/org/jclouds/aws/config/WithZonesFormSigningRestClientModule.java b/common/aws/src/main/java/org/jclouds/aws/config/WithZonesFormSigningRestClientModule.java
index de77334..e41fd7a 100644
--- a/common/aws/src/main/java/org/jclouds/aws/config/WithZonesFormSigningRestClientModule.java
+++ b/common/aws/src/main/java/org/jclouds/aws/config/WithZonesFormSigningRestClientModule.java
@@ -23,21 +23,29 @@
 
 import org.jclouds.rest.ConfiguresRestClient;
 
+import com.google.common.reflect.TypeToken;
+
 
 /**
  * 
  * @author Adrian Cole
  */
 @ConfiguresRestClient
-public class WithZonesFormSigningRestClientModule<S, A> extends FormSigningRestClientModule<S, A> {
-
-   public WithZonesFormSigningRestClientModule(Class<S> syncClientType, Class<A> asyncClientType,
-            Map<Class<?>, Class<?>> delegates) {
-      super(syncClientType, asyncClientType, delegates);
+public abstract class WithZonesFormSigningRestClientModule<S, A> extends FormSigningRestClientModule<S, A> {
+   protected WithZonesFormSigningRestClientModule(Map<Class<?>, Class<?>> delegates) {
+      super(delegates);
    }
 
-   public WithZonesFormSigningRestClientModule(Class<S> syncClientType, Class<A> asyncClientType) {
+   protected WithZonesFormSigningRestClientModule() {
+   }
+
+   protected WithZonesFormSigningRestClientModule(TypeToken<S> syncClientType, TypeToken<A> asyncClientType) {
       super(syncClientType, asyncClientType);
    }
 
+   protected WithZonesFormSigningRestClientModule(TypeToken<S> syncClientType, TypeToken<A> asyncClientType,
+            Map<Class<?>, Class<?>> sync2Async) {
+      super(syncClientType, asyncClientType, sync2Async);
+   }
+
 }
\ No newline at end of file
diff --git a/common/azure/src/main/java/org/jclouds/azure/storage/config/AzureStorageRestClientModule.java b/common/azure/src/main/java/org/jclouds/azure/storage/config/AzureStorageRestClientModule.java
index 2a8ed8c..86f871f 100644
--- a/common/azure/src/main/java/org/jclouds/azure/storage/config/AzureStorageRestClientModule.java
+++ b/common/azure/src/main/java/org/jclouds/azure/storage/config/AzureStorageRestClientModule.java
@@ -38,6 +38,7 @@
 
 import com.google.common.base.Supplier;
 import com.google.common.base.Suppliers;
+import com.google.common.reflect.TypeToken;
 import com.google.inject.Provides;
 
 /**
@@ -47,8 +48,11 @@
  */
 @ConfiguresRestClient
 public class AzureStorageRestClientModule<S, A> extends RestClientModule<S, A> {
+   protected AzureStorageRestClientModule() {
 
-   public AzureStorageRestClientModule(Class<S> syncClientType, Class<A> asyncClientType) {
+   }
+
+   public AzureStorageRestClientModule(TypeToken<S> syncClientType, TypeToken<A> asyncClientType) {
       super(syncClientType, asyncClientType);
    }
 
diff --git a/common/azure/src/test/java/org/jclouds/azure/storage/filters/SharedKeyLiteAuthenticationTest.java b/common/azure/src/test/java/org/jclouds/azure/storage/filters/SharedKeyLiteAuthenticationTest.java
index 4f9c8b6..74898ea 100644
--- a/common/azure/src/test/java/org/jclouds/azure/storage/filters/SharedKeyLiteAuthenticationTest.java
+++ b/common/azure/src/test/java/org/jclouds/azure/storage/filters/SharedKeyLiteAuthenticationTest.java
@@ -39,6 +39,7 @@
 import org.testng.annotations.Test;
 
 import com.google.common.collect.ImmutableSet;
+import com.google.common.reflect.TypeToken;
 import com.google.inject.Injector;
 import com.google.inject.Module;
 
@@ -140,8 +141,9 @@
             .credentials(ACCOUNT, "credential")
             .modules(
                   ImmutableSet.<Module> of(new MockModule(), new NullLoggingModule(),
-                        new AzureStorageRestClientModule<IntegrationTestClient, IntegrationTestAsyncClient>(
-                              IntegrationTestClient.class, IntegrationTestAsyncClient.class))).buildInjector();
+                        new AzureStorageRestClientModule<IntegrationTestClient, IntegrationTestAsyncClient>(TypeToken
+                                 .of(IntegrationTestClient.class), TypeToken.of(IntegrationTestAsyncClient.class))))
+               .buildInjector();
       filter = injector.getInstance(SharedKeyLiteAuthentication.class);
    }
 }
\ No newline at end of file
diff --git a/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/config/TerremarkVCloudRestClientModule.java b/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/config/TerremarkVCloudRestClientModule.java
index 3936909..37de990 100644
--- a/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/config/TerremarkVCloudRestClientModule.java
+++ b/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/config/TerremarkVCloudRestClientModule.java
@@ -96,13 +96,11 @@
 
 public class TerremarkVCloudRestClientModule<S, A> extends RestClientModule<S, A> {
 
-   public TerremarkVCloudRestClientModule(Class<S> syncClientType, Class<A> asyncClientType) {
-      super(syncClientType, asyncClientType);
+   public TerremarkVCloudRestClientModule() {
    }
 
-   public TerremarkVCloudRestClientModule(Class<S> syncClientType, Class<A> asyncClientType,
-         Map<Class<?>, Class<?>> delegateMap) {
-      super(syncClientType, asyncClientType, delegateMap);
+   public TerremarkVCloudRestClientModule(Map<Class<?>, Class<?>> delegateMap) {
+      super(delegateMap);
    }
 
    @Override
diff --git a/compute/src/test/resources/initscript_with_java.sh b/compute/src/test/resources/initscript_with_java.sh
index e1f991b..d7bbeed 100644
--- a/compute/src/test/resources/initscript_with_java.sh
+++ b/compute/src/test/resources/initscript_with_java.sh
@@ -84,13 +84,13 @@
    exit 1
 }
 alias apt-get-install="apt-get install -f -y -qq --force-yes"
-alias apt-get-upgrade="(apt-get update -qq&&apt-get upgrade -y -qq)"
+alias apt-get-update="apt-get update -qq"
 
 function ensure_cmd_or_install_package_apt(){
   local cmd=$1
   local pkg=$2
   
-  hash $cmd 2>/dev/null || apt-get-install $pkg || ( apt-get-upgrade && apt-get-install $pkg )
+  hash $cmd 2>/dev/null || apt-get-install $pkg || ( apt-get-update && apt-get-install $pkg )
 }
 
 function ensure_cmd_or_install_package_yum(){
@@ -155,7 +155,7 @@
 function installOpenJDK() {
   if hash apt-get 2>/dev/null; then
     export JAVA_HOME=${JAVA_HOME:-/usr/lib/jvm/java-6-openjdk}
-    test -d $JAVA_HOME || apt-get-install openjdk-6-jdk
+    test -d $JAVA_HOME || apt-get-install openjdk-6-jdk || ( apt-get-update && apt-get-install openjdk-6-jdk )
   elif hash yum 2>/dev/null; then
     export pkg=java-1.6.0-openjdk-devel
     yum --nogpgcheck -y install $pkg &&
diff --git a/compute/src/test/resources/initscript_with_jboss.sh b/compute/src/test/resources/initscript_with_jboss.sh
index e700985..edec50e 100644
--- a/compute/src/test/resources/initscript_with_jboss.sh
+++ b/compute/src/test/resources/initscript_with_jboss.sh
@@ -84,13 +84,13 @@
    exit 1
 }
 alias apt-get-install="apt-get install -f -y -qq --force-yes"
-alias apt-get-upgrade="(apt-get update -qq&&apt-get upgrade -y -qq)"
+alias apt-get-update="apt-get update -qq"
 
 function ensure_cmd_or_install_package_apt(){
   local cmd=$1
   local pkg=$2
   
-  hash $cmd 2>/dev/null || apt-get-install $pkg || ( apt-get-upgrade && apt-get-install $pkg )
+  hash $cmd 2>/dev/null || apt-get-install $pkg || ( apt-get-update && apt-get-install $pkg )
 }
 
 function ensure_cmd_or_install_package_yum(){
@@ -155,7 +155,7 @@
 function installOpenJDK() {
   if hash apt-get 2>/dev/null; then
     export JAVA_HOME=${JAVA_HOME:-/usr/lib/jvm/java-6-openjdk}
-    test -d $JAVA_HOME || apt-get-install openjdk-6-jdk
+    test -d $JAVA_HOME || apt-get-install openjdk-6-jdk || ( apt-get-update && apt-get-install openjdk-6-jdk )
   elif hash yum 2>/dev/null; then
     export pkg=java-1.6.0-openjdk-devel
     yum --nogpgcheck -y install $pkg &&
diff --git a/compute/src/test/resources/runscript.sh b/compute/src/test/resources/runscript.sh
index 082c625..1c45816 100644
--- a/compute/src/test/resources/runscript.sh
+++ b/compute/src/test/resources/runscript.sh
@@ -84,13 +84,13 @@
    exit 1
 }
 alias apt-get-install="apt-get install -f -y -qq --force-yes"
-alias apt-get-upgrade="(apt-get update -qq&&apt-get upgrade -y -qq)"
+alias apt-get-update="apt-get update -qq"
 
 function ensure_cmd_or_install_package_apt(){
   local cmd=$1
   local pkg=$2
   
-  hash $cmd 2>/dev/null || apt-get-install $pkg || ( apt-get-upgrade && apt-get-install $pkg )
+  hash $cmd 2>/dev/null || apt-get-install $pkg || ( apt-get-update && apt-get-install $pkg )
 }
 
 function ensure_cmd_or_install_package_yum(){
@@ -155,7 +155,7 @@
 function installOpenJDK() {
   if hash apt-get 2>/dev/null; then
     export JAVA_HOME=${JAVA_HOME:-/usr/lib/jvm/java-6-openjdk}
-    test -d $JAVA_HOME || apt-get-install openjdk-6-jdk
+    test -d $JAVA_HOME || apt-get-install openjdk-6-jdk || ( apt-get-update && apt-get-install openjdk-6-jdk )
   elif hash yum 2>/dev/null; then
     export pkg=java-1.6.0-openjdk-devel
     yum --nogpgcheck -y install $pkg &&
diff --git a/core/src/main/java/org/jclouds/ContextBuilder.java b/core/src/main/java/org/jclouds/ContextBuilder.java
index b3ed279..b57dd40 100644
--- a/core/src/main/java/org/jclouds/ContextBuilder.java
+++ b/core/src/main/java/org/jclouds/ContextBuilder.java
@@ -68,6 +68,8 @@
 import org.jclouds.rest.config.CredentialStoreModule;
 import org.jclouds.rest.config.RestClientModule;
 import org.jclouds.rest.config.RestModule;
+import org.jclouds.rest.internal.BaseRestApiMetadata;
+import org.jclouds.rest.internal.RestContextImpl;
 import org.nnsoft.guice.rocoto.Rocoto;
 import org.nnsoft.guice.rocoto.configuration.ConfigurationModule;
 
@@ -93,6 +95,7 @@
 import com.google.inject.Provides;
 import com.google.inject.Stage;
 import com.google.inject.TypeLiteral;
+import com.google.inject.util.Types;
 
 /**
  * Creates {@link RestContext} or {@link Injector} instances based on the most commonly requested
@@ -109,6 +112,37 @@
  */
 public final class ContextBuilder {
 
+   static class ResolveRestContextModule extends AbstractModule {
+      private final RestApiMetadata restApiMetadata;
+
+      ResolveRestContextModule(RestApiMetadata restApiMetadata) {
+         this.restApiMetadata = restApiMetadata;
+      }
+
+      @SuppressWarnings("unchecked")
+      @Override
+      protected void configure() {
+         if (restApiMetadata.getContext().getRawType().equals(RestContext.class)) {
+            TypeToken concreteType = BaseRestApiMetadata.contextToken(TypeToken.of(restApiMetadata.getApi()), TypeToken
+                     .of(restApiMetadata.getAsyncApi()));
+            // bind explicit type
+            bind(TypeLiteral.get(concreteType.getType())).to(
+                     (TypeLiteral) TypeLiteral.get(Types.newParameterizedType(RestContextImpl.class, restApiMetadata
+                              .getApi(), restApiMetadata.getAsyncApi())));
+            // bind potentially wildcard type
+            if (!concreteType.equals(restApiMetadata.getContext())) {
+               bind(TypeLiteral.get(restApiMetadata.getContext().getType())).to(
+                        (TypeLiteral) TypeLiteral.get(Types.newParameterizedType(RestContextImpl.class, restApiMetadata
+                                 .getApi(), restApiMetadata.getAsyncApi())));
+            }
+            // bind w/o types
+            bind(TypeLiteral.get(RestContext.class)).to(
+                     (TypeLiteral) TypeLiteral.get(Types.newParameterizedType(RestContextImpl.class, restApiMetadata
+                              .getApi(), restApiMetadata.getAsyncApi())));
+         }
+      }
+   }
+
    private final class BindDefaultContextQualifiedToProvider extends AbstractModule {
       @Override
       protected void configure() {
@@ -301,6 +335,7 @@
       Iterable<Module> defaultModules = ifSpecifiedByUserDontIncludeDefaultRestModule(restModuleSpecifiedByUser);
       Iterables.addAll(modules, defaultModules);
       addClientModuleIfNotPresent(modules);
+      addRestContextBinding();
       addLoggingModuleIfNotPresent(modules);
       addHttpModuleIfNeededAndNotPresent(modules);
       addExecutorServiceIfNotPresent(modules);
@@ -314,6 +349,12 @@
       return returnVal;
    }
 
+   void addRestContextBinding() {
+      if (apiMetadata instanceof RestApiMetadata) {
+         modules.add(new ResolveRestContextModule(RestApiMetadata.class.cast(apiMetadata)));
+      }
+   }
+
    private Iterable<Module> ifSpecifiedByUserDontIncludeDefaultRestModule(boolean restModuleSpecifiedByUser) {
       Iterable<Module> defaultModules = Iterables.transform(apiMetadata.getDefaultModules(),
                new Function<Class<? extends Module>, Module>() {
@@ -384,13 +425,13 @@
    protected void addClientModule(List<Module> modules) {
       // TODO: move this up
       if (apiMetadata instanceof RestApiMetadata) {
-         final RestApiMetadata rest = RestApiMetadata.class.cast(apiMetadata);
-         modules.add(new RestClientModule(rest.getApi(), rest.getAsyncApi()));
+         RestApiMetadata rest = RestApiMetadata.class.cast(apiMetadata);
+         modules.add(new RestClientModule(TypeToken.of(rest.getApi()), TypeToken.of(rest.getAsyncApi())));
       } else {
          modules.add(new RestModule());
       }
    }
-
+   
    @VisibleForTesting
    protected void addEventBusIfNotPresent(List<Module> modules) {
       if (!any(modules, new Predicate<Module>() {
diff --git a/core/src/main/java/org/jclouds/rest/config/RestClientModule.java b/core/src/main/java/org/jclouds/rest/config/RestClientModule.java
index cf0cc4b..a2af4eb 100644
--- a/core/src/main/java/org/jclouds/rest/config/RestClientModule.java
+++ b/core/src/main/java/org/jclouds/rest/config/RestClientModule.java
@@ -21,13 +21,10 @@
 import java.util.Map;
 
 import org.jclouds.rest.ConfiguresRestClient;
-import org.jclouds.rest.RestContext;
-import org.jclouds.rest.internal.RestContextImpl;
+import org.jclouds.util.TypeTokens2;
 
 import com.google.common.collect.ImmutableMap;
-import com.google.inject.Scopes;
-import com.google.inject.TypeLiteral;
-import com.google.inject.util.Types;
+import com.google.common.reflect.TypeToken;
 
 /**
  * 
@@ -35,50 +32,65 @@
  */
 @ConfiguresRestClient
 public class RestClientModule<S, A> extends RestModule {
-   protected final Class<A> asyncClientType;
-   protected final Class<S> syncClientType;
-   
-   public RestClientModule(Class<S> syncClientType, Class<A> asyncClientType,
-         Map<Class<?>, Class<?>> sync2Async) {
+   protected final TypeToken<S> syncClientType;
+   protected final TypeToken<A> asyncClientType;
+
+   /**
+    * Note that this ctor requires that you instantiate w/resolved generic params. For example, via
+    * a subclass of a bound type, or natural instantiation w/resolved type params.
+    */
+   protected RestClientModule(Map<Class<?>, Class<?>> sync2Async) {
       super(sync2Async);
-      this.asyncClientType = asyncClientType;
-      this.syncClientType = syncClientType;
+      this.syncClientType = TypeTokens2.checkBound(new TypeToken<S>(getClass()) {
+         private static final long serialVersionUID = 7519656925453755752L;
+      });
+      this.asyncClientType = TypeTokens2.checkBound(new TypeToken<A>(getClass()) {
+         private static final long serialVersionUID = -4420015967358511548L;
+      });
    }
 
-   public RestClientModule(Class<S> syncClientType, Class<A> asyncClientType) {
-      this(syncClientType, asyncClientType, ImmutableMap
-            .<Class<?>, Class<?>> of(syncClientType, asyncClientType));
+   /**
+    * @see #RestClientModule(Map)
+    */
+   protected RestClientModule() {
+      this(ImmutableMap.<Class<?>, Class<?>> of());
    }
-   
-   @SuppressWarnings( { "unchecked", "rawtypes" })
+
+   /**
+    * @see #RestClientModule(TypeToken, TypeToken, Map)
+    */
+   public RestClientModule(TypeToken<S> syncClientType, TypeToken<A> asyncClientType) {
+      this(syncClientType, asyncClientType, ImmutableMap.<Class<?>, Class<?>> of());
+   }
+
+   /**
+    * only necessary when type params are not resolvable at runtime.
+    */
+   public RestClientModule(TypeToken<S> syncClientType, TypeToken<A> asyncClientType, Map<Class<?>, Class<?>> sync2Async) {
+      super(sync2Async);
+      this.syncClientType = TypeTokens2.checkBound(syncClientType);
+      this.asyncClientType = TypeTokens2.checkBound(asyncClientType);
+   }
+
    @Override
    protected void configure() {
       super.configure();
-      // Ensures the restcontext can be looked up without generic types.
-      bind(new TypeLiteral<RestContext>() {
-      }).to(
-            (TypeLiteral) TypeLiteral.get(Types.newParameterizedType(
-                  RestContextImpl.class, syncClientType, asyncClientType))).in(
-            Scopes.SINGLETON);
-      bind(TypeLiteral.get(Types.newParameterizedType(RestContext.class, syncClientType, asyncClientType))).to(
-               (TypeLiteral) TypeLiteral.get(Types.newParameterizedType(RestContextImpl.class, syncClientType,
-                        asyncClientType))).in(Scopes.SINGLETON);
       bindAsyncClient();
       bindClient();
       bindErrorHandlers();
       bindRetryHandlers();
    }
 
+
+
    /**
     * overrides this to change the default retry handlers for the http engine
     * 
     * ex.
     * 
     * <pre>
-    * bind(HttpRetryHandler.class).annotatedWith(Redirection.class).to(
-    *       AWSRedirectionRetryHandler.class);
-    * bind(HttpRetryHandler.class).annotatedWith(ClientError.class).to(
-    *       AWSClientErrorRetryHandler.class);
+    * bind(HttpRetryHandler.class).annotatedWith(Redirection.class).to(AWSRedirectionRetryHandler.class);
+    * bind(HttpRetryHandler.class).annotatedWith(ClientError.class).to(AWSClientErrorRetryHandler.class);
     * </pre>
     * 
     */
@@ -91,12 +103,9 @@
     * ex.
     * 
     * <pre>
-    * bind(HttpErrorHandler.class).annotatedWith(Redirection.class).to(
-    *       ParseAWSErrorFromXmlContent.class);
-    * bind(HttpErrorHandler.class).annotatedWith(ClientError.class).to(
-    *       ParseAWSErrorFromXmlContent.class);
-    * bind(HttpErrorHandler.class).annotatedWith(ServerError.class).to(
-    *       ParseAWSErrorFromXmlContent.class);
+    * bind(HttpErrorHandler.class).annotatedWith(Redirection.class).to(ParseAWSErrorFromXmlContent.class);
+    * bind(HttpErrorHandler.class).annotatedWith(ClientError.class).to(ParseAWSErrorFromXmlContent.class);
+    * bind(HttpErrorHandler.class).annotatedWith(ServerError.class).to(ParseAWSErrorFromXmlContent.class);
     * </pre>
     * 
     * 
@@ -105,12 +114,11 @@
    }
 
    protected void bindAsyncClient() {
-      BinderUtils.bindAsyncClient(binder(), asyncClientType);
+      BinderUtils.bindAsyncClient(binder(), asyncClientType.getRawType());
    }
 
    protected void bindClient() {
-      BinderUtils.bindClient(binder(), syncClientType, asyncClientType,
-            sync2Async);
+      BinderUtils.bindClient(binder(), syncClientType.getRawType(), asyncClientType.getRawType(), sync2Async);
    }
 
 }
\ No newline at end of file
diff --git a/core/src/main/java/org/jclouds/rest/internal/BaseRestApiMetadata.java b/core/src/main/java/org/jclouds/rest/internal/BaseRestApiMetadata.java
index 2f2478a..1aa9075 100644
--- a/core/src/main/java/org/jclouds/rest/internal/BaseRestApiMetadata.java
+++ b/core/src/main/java/org/jclouds/rest/internal/BaseRestApiMetadata.java
@@ -67,6 +67,14 @@
       return props;
    }
    
+   public static <S, A> TypeToken<RestContext<S, A>> contextToken(TypeToken<S> apiToken, TypeToken<A> asyncApiToken) {
+      return new TypeToken<RestContext<S, A>>() {
+         private static final long serialVersionUID = 1L;
+      }.where(new TypeParameter<S>() {
+      }, apiToken).where(new TypeParameter<A>() {
+      }, asyncApiToken);
+   }
+   
    public static class Builder extends BaseApiMetadata.Builder implements RestApiMetadata.Builder {
       protected Class<?> api;
       protected Class<?> asyncApi;
@@ -80,14 +88,6 @@
          .context(contextToken(TypeToken.of(api), TypeToken.of(asyncApi)))
          .defaultProperties(BaseRestApiMetadata.defaultProperties());
       }
-      
-      protected <S, A> TypeToken<RestContext<S, A>> contextToken(TypeToken<S> apiToken, TypeToken<A> asyncApiToken) {
-         return new TypeToken<RestContext<S, A>>() {
-            private static final long serialVersionUID = 1L;
-         }.where(new TypeParameter<S>() {
-         }, apiToken).where(new TypeParameter<A>() {
-         }, asyncApiToken);
-      }
 
       /**
        * {@inheritDoc}
diff --git a/core/src/main/java/org/jclouds/util/TypeTokens2.java b/core/src/main/java/org/jclouds/util/TypeTokens2.java
new file mode 100644
index 0000000..05dad33
--- /dev/null
+++ b/core/src/main/java/org/jclouds/util/TypeTokens2.java
@@ -0,0 +1,40 @@
+/**
+ * Licensed to jclouds, Inc. (jclouds) under one or more
+ * contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  jclouds 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.util;
+
+import static com.google.common.base.Preconditions.checkState;
+
+import java.lang.reflect.TypeVariable;
+
+import com.google.common.reflect.TypeToken;
+
+/**
+ * 
+ * @author Adrian Cole
+ */
+public class TypeTokens2 {
+   /**
+    * @throws IllegalStateException if the type is an instanceof {@link TypeVariable}
+    */
+   public static <T> TypeToken<T> checkBound(TypeToken<T> type) throws IllegalStateException {
+      checkState(!(type.getType() instanceof TypeVariable<?>),
+               "unbound type variable: %s, use ctor that explicitly assigns this", type);
+      return type;
+   }
+}
diff --git a/core/src/test/java/org/jclouds/http/handlers/BackoffLimitedRetryHandlerTest.java b/core/src/test/java/org/jclouds/http/handlers/BackoffLimitedRetryHandlerTest.java
index 457a812..2c9ac3d 100644
--- a/core/src/test/java/org/jclouds/http/handlers/BackoffLimitedRetryHandlerTest.java
+++ b/core/src/test/java/org/jclouds/http/handlers/BackoffLimitedRetryHandlerTest.java
@@ -54,7 +54,7 @@
 import com.google.inject.TypeLiteral;
 import com.sun.jersey.api.uri.UriBuilderImpl;
 
-@Test(groups = "unit")
+@Test(groups = "unit", testName = "BackoffLimitedRetryHandlerTest")
 public class BackoffLimitedRetryHandlerTest {
 
    BackoffLimitedRetryHandler handler = new BackoffLimitedRetryHandler();
diff --git a/core/src/test/java/org/jclouds/rest/internal/RestAnnotationProcessorTest.java b/core/src/test/java/org/jclouds/rest/internal/RestAnnotationProcessorTest.java
index 1a97fda..bf21b33 100644
--- a/core/src/test/java/org/jclouds/rest/internal/RestAnnotationProcessorTest.java
+++ b/core/src/test/java/org/jclouds/rest/internal/RestAnnotationProcessorTest.java
@@ -176,7 +176,7 @@
    @ConfiguresRestClient
    protected static class CallerModule extends RestClientModule<Caller, AsyncCaller> {
       CallerModule() {
-         super(Caller.class, AsyncCaller.class, ImmutableMap.<Class<?>, Class<?>> of(Callee.class, AsyncCallee.class, Callee2.class, AsyncCallee2.class));
+         super(ImmutableMap.<Class<?>, Class<?>> of(Callee.class, AsyncCallee.class, Callee2.class, AsyncCallee2.class));
       }
 
       @Override
diff --git a/labs/elb/src/main/java/org/jclouds/elb/config/ELBRestClientModule.java b/labs/elb/src/main/java/org/jclouds/elb/config/ELBRestClientModule.java
index 8319a69..cf67ae6 100644
--- a/labs/elb/src/main/java/org/jclouds/elb/config/ELBRestClientModule.java
+++ b/labs/elb/src/main/java/org/jclouds/elb/config/ELBRestClientModule.java
@@ -30,8 +30,5 @@
  */
 @ConfiguresRestClient
 public class ELBRestClientModule extends FormSigningRestClientModule<ELBClient, ELBAsyncClient> {
-   public ELBRestClientModule() {
-      super(ELBClient.class, ELBAsyncClient.class);
-   }
 
 }
diff --git a/labs/glesys/src/main/java/org/jclouds/glesys/config/GleSYSRestClientModule.java b/labs/glesys/src/main/java/org/jclouds/glesys/config/GleSYSRestClientModule.java
index a069b43..aafb715 100644
--- a/labs/glesys/src/main/java/org/jclouds/glesys/config/GleSYSRestClientModule.java
+++ b/labs/glesys/src/main/java/org/jclouds/glesys/config/GleSYSRestClientModule.java
@@ -64,7 +64,7 @@
          .build();
 
    public GleSYSRestClientModule() {
-      super(GleSYSClient.class, GleSYSAsyncClient.class, DELEGATE_MAP);
+      super(DELEGATE_MAP);
    }
 
    @Override
diff --git a/labs/opsource-servers/src/main/java/org/jclouds/opsource/servers/config/OpSourceServersRestClientModule.java b/labs/opsource-servers/src/main/java/org/jclouds/opsource/servers/config/OpSourceServersRestClientModule.java
index 99cd087..1c7aa1a 100644
--- a/labs/opsource-servers/src/main/java/org/jclouds/opsource/servers/config/OpSourceServersRestClientModule.java
+++ b/labs/opsource-servers/src/main/java/org/jclouds/opsource/servers/config/OpSourceServersRestClientModule.java
@@ -56,7 +56,7 @@
          .build();
 
    public OpSourceServersRestClientModule() {
-      super(OpSourceServersClient.class, OpSourceServersAsyncClient.class, DELEGATE_MAP);
+      super(DELEGATE_MAP);
    }
 
    @Override
diff --git a/labs/savvis-symphonyvpdc/src/main/java/org/jclouds/savvis/vpdc/config/VPDCRestClientModule.java b/labs/savvis-symphonyvpdc/src/main/java/org/jclouds/savvis/vpdc/config/VPDCRestClientModule.java
index 98bd9e0..ddae92f 100644
--- a/labs/savvis-symphonyvpdc/src/main/java/org/jclouds/savvis/vpdc/config/VPDCRestClientModule.java
+++ b/labs/savvis-symphonyvpdc/src/main/java/org/jclouds/savvis/vpdc/config/VPDCRestClientModule.java
@@ -147,7 +147,7 @@
             .build();
 
    public VPDCRestClientModule() {
-      super(VPDCClient.class, VPDCAsyncClient.class, DELEGATE_MAP);
+      super(DELEGATE_MAP);
    }
 
    @Singleton
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/config/VCloudDirectorRestClientModule.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/config/VCloudDirectorRestClientModule.java
index f1826f9..c6c4df7 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/config/VCloudDirectorRestClientModule.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/config/VCloudDirectorRestClientModule.java
@@ -152,7 +152,7 @@
    }
    
    public VCloudDirectorRestClientModule() {
-      super(VCloudDirectorClient.class, VCloudDirectorAsyncClient.class, ADMIN_DELEGATE_MAP);
+      super(ADMIN_DELEGATE_MAP);
    }
    
    @Override
diff --git a/labs/virtualbox/src/test/resources/test_guest_additions_installer_init.sh b/labs/virtualbox/src/test/resources/test_guest_additions_installer_init.sh
index 47c37db..cccddd0 100644
--- a/labs/virtualbox/src/test/resources/test_guest_additions_installer_init.sh
+++ b/labs/virtualbox/src/test/resources/test_guest_additions_installer_init.sh
@@ -84,13 +84,13 @@
    exit 1
 }
 alias apt-get-install="apt-get install -f -y -qq --force-yes"
-alias apt-get-upgrade="(apt-get update -qq&&apt-get upgrade -y -qq)"
+alias apt-get-update="apt-get update -qq"
 
 function ensure_cmd_or_install_package_apt(){
   local cmd=$1
   local pkg=$2
   
-  hash $cmd 2>/dev/null || apt-get-install $pkg || ( apt-get-upgrade && apt-get-install $pkg )
+  hash $cmd 2>/dev/null || apt-get-install $pkg || ( apt-get-update && apt-get-install $pkg )
 }
 
 function ensure_cmd_or_install_package_yum(){
diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/AWSEC2ApiMetadata.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/AWSEC2ApiMetadata.java
index e89fe71..8431b17 100644
--- a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/AWSEC2ApiMetadata.java
+++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/AWSEC2ApiMetadata.java
@@ -82,6 +82,7 @@
          .version(AWSEC2AsyncClient.VERSION)
          .name("Amazon-specific EC2 API")
          .wrapper(AWSEC2ComputeServiceContext.class)
+         .context(CONTEXT_TOKEN)
          .defaultProperties(AWSEC2ApiMetadata.defaultProperties())
          .defaultModules(ImmutableSet.<Class<? extends Module>>of(AWSEC2RestClientModule.class, EC2ResolveImagesModule.class, AWSEC2ComputeServiceContextModule.class));
       }
diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/config/AWSEC2RestClientModule.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/config/AWSEC2RestClientModule.java
index 90072be..119e0f1 100644
--- a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/config/AWSEC2RestClientModule.java
+++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/config/AWSEC2RestClientModule.java
@@ -64,6 +64,7 @@
 import org.jclouds.rest.ConfiguresRestClient;
 
 import com.google.common.collect.ImmutableMap;
+import com.google.common.reflect.TypeToken;
 import com.google.inject.Provides;
 
 /**
@@ -90,7 +91,7 @@
          .build();
 
    public AWSEC2RestClientModule() {
-      super(AWSEC2Client.class, AWSEC2AsyncClient.class, DELEGATE_MAP);
+      super(TypeToken.of(AWSEC2Client.class), TypeToken.of(AWSEC2AsyncClient.class), DELEGATE_MAP);
    }
 
    @Singleton
diff --git a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/AWSEC2TemplateBuilderLiveTest.java b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/AWSEC2TemplateBuilderLiveTest.java
index b02b379..55e762f 100644
--- a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/AWSEC2TemplateBuilderLiveTest.java
+++ b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/AWSEC2TemplateBuilderLiveTest.java
@@ -28,11 +28,13 @@
 import java.util.Set;
 
 import org.jclouds.aws.domain.Region;
+import org.jclouds.aws.ec2.AWSEC2ApiMetadata;
 import org.jclouds.aws.ec2.reference.AWSEC2Constants;
 import org.jclouds.compute.ComputeServiceContext;
 import org.jclouds.compute.domain.OsFamily;
 import org.jclouds.compute.domain.OsFamilyVersion64Bit;
 import org.jclouds.compute.domain.Template;
+import org.jclouds.ec2.EC2ApiMetadata;
 import org.jclouds.ec2.compute.EC2TemplateBuilderLiveTest;
 import org.jclouds.ec2.compute.predicates.EC2ImagePredicates;
 import org.jclouds.ec2.domain.InstanceType;
@@ -365,6 +367,12 @@
       assert (defaultTemplate.getImage().getProviderId().startsWith("ami-")) : defaultTemplate;
       assertEquals(defaultTemplate.getImage().getId(), imageId);
    }
+   
+   @Test
+   public void testAssignability() {
+      context.unwrap(EC2ApiMetadata.CONTEXT_TOKEN);
+      context.unwrap(AWSEC2ApiMetadata.CONTEXT_TOKEN);
+   }
 
    @Override
    protected Set<String> getIso3166Codes() {
diff --git a/providers/aws-s3/src/main/java/org/jclouds/aws/s3/AWSS3ApiMetadata.java b/providers/aws-s3/src/main/java/org/jclouds/aws/s3/AWSS3ApiMetadata.java
index 165792f..b05dff5 100644
--- a/providers/aws-s3/src/main/java/org/jclouds/aws/s3/AWSS3ApiMetadata.java
+++ b/providers/aws-s3/src/main/java/org/jclouds/aws/s3/AWSS3ApiMetadata.java
@@ -73,6 +73,7 @@
          id("aws-s3")
          .name("Amazon-specific S3 API")
          .defaultProperties(AWSS3ApiMetadata.defaultProperties())
+         .context(CONTEXT_TOKEN)
          .wrapper(TypeToken.of(AWSS3BlobStoreContext.class))
          .defaultModules(ImmutableSet.<Class<? extends Module>>of(AWSS3RestClientModule.class, AWSS3BlobStoreContextModule.class));
       }
diff --git a/providers/aws-s3/src/main/java/org/jclouds/aws/s3/config/AWSS3RestClientModule.java b/providers/aws-s3/src/main/java/org/jclouds/aws/s3/config/AWSS3RestClientModule.java
index f468441..93e4538 100644
--- a/providers/aws-s3/src/main/java/org/jclouds/aws/s3/config/AWSS3RestClientModule.java
+++ b/providers/aws-s3/src/main/java/org/jclouds/aws/s3/config/AWSS3RestClientModule.java
@@ -41,6 +41,7 @@
 
 import com.google.common.base.Supplier;
 import com.google.common.base.Suppliers;
+import com.google.common.reflect.TypeToken;
 import com.google.inject.Provides;
 
 /**
@@ -50,7 +51,11 @@
  */
 @ConfiguresRestClient
 public class AWSS3RestClientModule extends S3RestClientModule<AWSS3Client, AWSS3AsyncClient> {
-
+   
+   public AWSS3RestClientModule() {
+      super(TypeToken.of(AWSS3Client.class), TypeToken.of(AWSS3AsyncClient.class));
+   }
+   
    @Override
    protected Supplier<String> defaultRegionForBucket(@Region Supplier<String> defaultRegion) {
       return Suppliers.ofInstance(US_STANDARD);
@@ -68,11 +73,7 @@
    protected Supplier<URI> provideBucketURI(@Named(PROPERTY_REGION + "." + US_STANDARD + "." + ENDPOINT) String endpoint){
       return Suppliers.ofInstance(URI.create(endpoint));
    }
-   
-   public AWSS3RestClientModule() {
-      super(AWSS3Client.class, AWSS3AsyncClient.class);
-   }
-
+  
    @Singleton
    @Provides
    S3Client provide(AWSS3Client in) {
diff --git a/providers/azureblob/src/main/java/org/jclouds/azureblob/config/AzureBlobRestClientModule.java b/providers/azureblob/src/main/java/org/jclouds/azureblob/config/AzureBlobRestClientModule.java
index c94667f..a7ab369 100644
--- a/providers/azureblob/src/main/java/org/jclouds/azureblob/config/AzureBlobRestClientModule.java
+++ b/providers/azureblob/src/main/java/org/jclouds/azureblob/config/AzureBlobRestClientModule.java
@@ -36,10 +36,6 @@
 @ConfiguresRestClient
 public class AzureBlobRestClientModule extends AzureStorageRestClientModule<AzureBlobClient, AzureBlobAsyncClient> {
 
-   public AzureBlobRestClientModule() {
-      super(AzureBlobClient.class, AzureBlobAsyncClient.class);
-   }
-
    @Override
    protected void configure() {
       install(new AzureBlobModule());
diff --git a/providers/gogrid/src/main/java/org/jclouds/gogrid/config/GoGridRestClientModule.java b/providers/gogrid/src/main/java/org/jclouds/gogrid/config/GoGridRestClientModule.java
index 8e97f21..3c16eb7 100644
--- a/providers/gogrid/src/main/java/org/jclouds/gogrid/config/GoGridRestClientModule.java
+++ b/providers/gogrid/src/main/java/org/jclouds/gogrid/config/GoGridRestClientModule.java
@@ -71,7 +71,7 @@
          .build();
 
    public GoGridRestClientModule() {
-      super(GoGridClient.class, GoGridAsyncClient.class, DELEGATE_MAP);
+      super(DELEGATE_MAP);
    }
 
    @Provides
diff --git a/providers/hpcloud-objectstorage/src/main/java/org/jclouds/hpcloud/objectstorage/config/HPCloudObjectStorageRestClientModule.java b/providers/hpcloud-objectstorage/src/main/java/org/jclouds/hpcloud/objectstorage/config/HPCloudObjectStorageRestClientModule.java
index a6ab327..1419e37 100644
--- a/providers/hpcloud-objectstorage/src/main/java/org/jclouds/hpcloud/objectstorage/config/HPCloudObjectStorageRestClientModule.java
+++ b/providers/hpcloud-objectstorage/src/main/java/org/jclouds/hpcloud/objectstorage/config/HPCloudObjectStorageRestClientModule.java
@@ -67,7 +67,7 @@
             HPCloudCDNClient.class, HPCloudCDNAsyncClient.class).build();
 
    public HPCloudObjectStorageRestClientModule() {
-      super(HPCloudObjectStorageClient.class, HPCloudObjectStorageAsyncClient.class, DELEGATE_MAP);
+      super(DELEGATE_MAP);
    }
 
    protected void configure() {
diff --git a/providers/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/config/RimuHostingRestClientModule.java b/providers/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/config/RimuHostingRestClientModule.java
index e572fd6..aedde4e 100644
--- a/providers/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/config/RimuHostingRestClientModule.java
+++ b/providers/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/config/RimuHostingRestClientModule.java
@@ -48,10 +48,6 @@
 @ConfiguresRestClient
 public class RimuHostingRestClientModule extends RestClientModule<RimuHostingClient, RimuHostingAsyncClient> {
 
-   public RimuHostingRestClientModule() {
-      super(RimuHostingClient.class, RimuHostingAsyncClient.class);
-   }
-
    @Override
    protected void configure() {
       bind(DateAdapter.class).to(RimuIso8601DateAdapter.class);
diff --git a/providers/slicehost/src/main/java/org/jclouds/slicehost/config/SlicehostRestClientModule.java b/providers/slicehost/src/main/java/org/jclouds/slicehost/config/SlicehostRestClientModule.java
index b1e5ef9..aa91891 100644
--- a/providers/slicehost/src/main/java/org/jclouds/slicehost/config/SlicehostRestClientModule.java
+++ b/providers/slicehost/src/main/java/org/jclouds/slicehost/config/SlicehostRestClientModule.java
@@ -35,10 +35,6 @@
 @ConfiguresRestClient
 public class SlicehostRestClientModule extends RestClientModule<SlicehostClient, SlicehostAsyncClient> {
 
-   public SlicehostRestClientModule() {
-      super(SlicehostClient.class, SlicehostAsyncClient.class);
-   }
-
    @Override
    protected void bindErrorHandlers() {
       bind(HttpErrorHandler.class).annotatedWith(Redirection.class).to(ParseSlicehostErrorFromHttpResponse.class);
diff --git a/providers/softlayer/src/main/java/org/jclouds/softlayer/config/SoftLayerRestClientModule.java b/providers/softlayer/src/main/java/org/jclouds/softlayer/config/SoftLayerRestClientModule.java
index 03e07d1..b2eadbe 100644
--- a/providers/softlayer/src/main/java/org/jclouds/softlayer/config/SoftLayerRestClientModule.java
+++ b/providers/softlayer/src/main/java/org/jclouds/softlayer/config/SoftLayerRestClientModule.java
@@ -62,7 +62,7 @@
             .build();
 
    public SoftLayerRestClientModule() {
-      super(SoftLayerClient.class, SoftLayerAsyncClient.class, DELEGATE_MAP);
+      super(DELEGATE_MAP);
    }
 
    @Override
diff --git a/providers/trmk-ecloud/src/main/java/org/jclouds/trmk/ecloud/config/TerremarkECloudRestClientModule.java b/providers/trmk-ecloud/src/main/java/org/jclouds/trmk/ecloud/config/TerremarkECloudRestClientModule.java
index c777657..d761013 100644
--- a/providers/trmk-ecloud/src/main/java/org/jclouds/trmk/ecloud/config/TerremarkECloudRestClientModule.java
+++ b/providers/trmk-ecloud/src/main/java/org/jclouds/trmk/ecloud/config/TerremarkECloudRestClientModule.java
@@ -61,7 +61,7 @@
          .build();
 
    public TerremarkECloudRestClientModule() {
-      super(TerremarkECloudClient.class, TerremarkECloudAsyncClient.class, DELEGATE_MAP);
+      super(DELEGATE_MAP);
    }
 
    @Provides
diff --git a/providers/trmk-vcloudexpress/src/main/java/org/jclouds/trmk/vcloudexpress/config/TerremarkVCloudExpressRestClientModule.java b/providers/trmk-vcloudexpress/src/main/java/org/jclouds/trmk/vcloudexpress/config/TerremarkVCloudExpressRestClientModule.java
index 6a618b5..7889a33 100644
--- a/providers/trmk-vcloudexpress/src/main/java/org/jclouds/trmk/vcloudexpress/config/TerremarkVCloudExpressRestClientModule.java
+++ b/providers/trmk-vcloudexpress/src/main/java/org/jclouds/trmk/vcloudexpress/config/TerremarkVCloudExpressRestClientModule.java
@@ -39,10 +39,6 @@
 public class TerremarkVCloudExpressRestClientModule extends
       TerremarkVCloudRestClientModule<TerremarkVCloudExpressClient, TerremarkVCloudExpressAsyncClient> {
 
-   public TerremarkVCloudExpressRestClientModule() {
-      super(TerremarkVCloudExpressClient.class, TerremarkVCloudExpressAsyncClient.class);
-   }
-
    @Provides
    @Singleton
    protected TerremarkVCloudAsyncClient provideVCloudAsyncClient(TerremarkVCloudExpressAsyncClient in) {
diff --git a/scriptbuilder/src/main/resources/functions/installOpenJDK.sh b/scriptbuilder/src/main/resources/functions/installOpenJDK.sh
index 2013913..71539db 100644
--- a/scriptbuilder/src/main/resources/functions/installOpenJDK.sh
+++ b/scriptbuilder/src/main/resources/functions/installOpenJDK.sh
@@ -20,7 +20,7 @@
 function installOpenJDK() {
   if hash apt-get 2>/dev/null; then
     export JAVA_HOME=${JAVA_HOME:-/usr/lib/jvm/java-6-openjdk}
-    test -d $JAVA_HOME || apt-get-install openjdk-6-jdk
+    test -d $JAVA_HOME || apt-get-install openjdk-6-jdk || ( apt-get-update && apt-get-install openjdk-6-jdk )
   elif hash yum 2>/dev/null; then
     export pkg=java-1.6.0-openjdk-devel
     yum --nogpgcheck -y install $pkg &&
diff --git a/scriptbuilder/src/main/resources/functions/setupPublicCurl.sh b/scriptbuilder/src/main/resources/functions/setupPublicCurl.sh
index ad72ddb..b0854d7 100644
--- a/scriptbuilder/src/main/resources/functions/setupPublicCurl.sh
+++ b/scriptbuilder/src/main/resources/functions/setupPublicCurl.sh
@@ -1,11 +1,11 @@
 alias apt-get-install="apt-get install -f -y -qq --force-yes"
-alias apt-get-upgrade="(apt-get update -qq&&apt-get upgrade -y -qq)"
+alias apt-get-update="apt-get update -qq"
 
 function ensure_cmd_or_install_package_apt(){
   local cmd=$1
   local pkg=$2
   
-  hash $cmd 2>/dev/null || apt-get-install $pkg || ( apt-get-upgrade && apt-get-install $pkg )
+  hash $cmd 2>/dev/null || apt-get-install $pkg || ( apt-get-update && apt-get-install $pkg )
 }
 
 function ensure_cmd_or_install_package_yum(){
diff --git a/scriptbuilder/src/test/resources/test_install_jdk_scriptbuilder.sh b/scriptbuilder/src/test/resources/test_install_jdk_scriptbuilder.sh
index f3a502a..52c1074 100644
--- a/scriptbuilder/src/test/resources/test_install_jdk_scriptbuilder.sh
+++ b/scriptbuilder/src/test/resources/test_install_jdk_scriptbuilder.sh
@@ -84,13 +84,13 @@
    exit 1
 }
 alias apt-get-install="apt-get install -f -y -qq --force-yes"
-alias apt-get-upgrade="(apt-get update -qq&&apt-get upgrade -y -qq)"
+alias apt-get-update="apt-get update -qq"
 
 function ensure_cmd_or_install_package_apt(){
   local cmd=$1
   local pkg=$2
   
-  hash $cmd 2>/dev/null || apt-get-install $pkg || ( apt-get-upgrade && apt-get-install $pkg )
+  hash $cmd 2>/dev/null || apt-get-install $pkg || ( apt-get-update && apt-get-install $pkg )
 }
 
 function ensure_cmd_or_install_package_yum(){
@@ -155,7 +155,7 @@
 function installOpenJDK() {
   if hash apt-get 2>/dev/null; then
     export JAVA_HOME=${JAVA_HOME:-/usr/lib/jvm/java-6-openjdk}
-    test -d $JAVA_HOME || apt-get-install openjdk-6-jdk
+    test -d $JAVA_HOME || apt-get-install openjdk-6-jdk || ( apt-get-update && apt-get-install openjdk-6-jdk )
   elif hash yum 2>/dev/null; then
     export pkg=java-1.6.0-openjdk-devel
     yum --nogpgcheck -y install $pkg &&