diff --git a/org.springframework.build.aws.maven/pom.xml b/org.springframework.build.aws.maven/pom.xml
index fc3fecd..8fc8b54 100644
--- a/org.springframework.build.aws.maven/pom.xml
+++ b/org.springframework.build.aws.maven/pom.xml
@@ -8,7 +8,7 @@
     <groupId>net.anzix</groupId>
     <artifactId>org.springframework.build.aws.maven</artifactId>
     <packaging>jar</packaging>
-    <name>Amazon Web Services Maven Wagon Support</name>
+    <name>AWS S3/Google DS Maven Wagon Support</name>
     <version>3.1.2-SNAPSHOT</version>
     <description>Standard Maven wagon support for s3:// urls</description>
     <url>http://www.springframework.org</url>
@@ -56,7 +56,7 @@
         <dependency>
             <groupId>net.java.dev.jets3t</groupId>
             <artifactId>jets3t</artifactId>
-            <version>0.7.2</version>
+            <version>0.8.0</version>
         </dependency>
         <dependency>
             <groupId>org.apache.maven.wagon</groupId>
@@ -65,16 +65,5 @@
             <scope>provided</scope>
         </dependency>
     </dependencies>
-    <distributionManagement>
-        <repository>
-            <id>spring-milestone</id>
-            <name>Spring Milestone Repository</name>
-            <url>s3://maven.springframework.org/snapshot</url>
-        </repository>
-        <snapshotRepository>
-            <id>spring-snapshot</id>
-            <name>Spring Snapshot Repository</name>
-            <url>s3://maven.springframework.org/snapshot</url>
-        </snapshotRepository>
-    </distributionManagement>
+  
 </project>
\ No newline at end of file
diff --git a/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/SimpleStorageServiceWagon.java b/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/SimpleStorageServiceWagon.java
index d48a14b..21ece65 100644
--- a/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/SimpleStorageServiceWagon.java
+++ b/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/SimpleStorageServiceWagon.java
@@ -20,11 +20,9 @@
 import org.apache.maven.wagon.authentication.AuthenticationInfo;
 import org.apache.maven.wagon.proxy.ProxyInfoProvider;
 import org.apache.maven.wagon.repository.Repository;
-import org.jets3t.service.S3Service;
 import org.jets3t.service.S3ServiceException;
 import org.jets3t.service.acl.AccessControlList;
 import org.jets3t.service.impl.rest.httpclient.RestS3Service;
-import org.jets3t.service.model.S3Bucket;
 import org.jets3t.service.model.S3Object;
 import org.jets3t.service.security.AWSCredentials;
 
@@ -36,6 +34,12 @@
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import org.jets3t.service.ServiceException;
+import org.jets3t.service.impl.rest.httpclient.GoogleStorageService;
+import org.jets3t.service.impl.rest.httpclient.RestStorageService;
+import org.jets3t.service.model.StorageObject;
+import org.jets3t.service.security.GSCredentials;
+import org.jets3t.service.security.ProviderCredentials;
 
 /**
  * An implementation of the Maven Wagon interface that allows you to access the
@@ -50,9 +54,13 @@
  */
 public class SimpleStorageServiceWagon extends AbstractWagon {
 
-    private S3Service service;
+    private String AMAZON_URL = "s3.amazonaws.com";
 
-    private S3Bucket bucket;
+    private String GOOGLE_URL = "commondatastorage.googleapis.com";
+
+    private RestStorageService service;
+
+    private String bucket;
 
     private String basedir;
 
@@ -63,18 +71,31 @@
     protected void connectToRepository(Repository source, AuthenticationInfo authenticationInfo, ProxyInfoProvider proxyInfoProvider)
             throws AuthenticationException {
         try {
-            service = new RestS3Service(getCredentials(authenticationInfo));
-        } catch (S3ServiceException e) {
+            bucket = source.getUsername();
+            String provider = source.getHost();
+            if (provider == null) {
+                provider = AMAZON_URL;
+            }
+            Credentials c = getCredentials(authenticationInfo);
+            if (AMAZON_URL.equals(provider)) {
+                service = new RestS3Service(new AWSCredentials(c.access, c.secret));
+            } else if (GOOGLE_URL.equals(provider)) {
+                service = new GoogleStorageService(new GSCredentials(c.access,c.secret));
+            } else {
+                throw new IllegalArgumentException("Private Clouds not supported yet. Use s3://bucketname@" + AMAZON_URL + " or s3://bucketname@" + GOOGLE_URL);
+            }
+
+        } catch (ServiceException e) {
             throw new AuthenticationException("Cannot authenticate with current credentials", e);
         }
-        bucket = new S3Bucket(source.getHost());
+        bucket = source.getUsername();
         basedir = getBaseDir(source);
     }
 
     protected boolean doesRemoteResourceExist(String resourceName) {
         try {
             service.getObjectDetails(bucket, basedir + resourceName);
-        } catch (S3ServiceException e) {
+        } catch (ServiceException e) {
             return false;
         }
         return true;
@@ -85,11 +106,11 @@
     }
 
     protected void getResource(String resourceName, File destination, TransferProgress progress)
-            throws ResourceDoesNotExistException, S3ServiceException, IOException {
-        S3Object object;
+            throws ResourceDoesNotExistException, ServiceException, IOException {
+        StorageObject object;
         try {
             object = service.getObject(bucket, basedir + resourceName);
-        } catch (S3ServiceException e) {
+        } catch (ServiceException e) {
             throw new ResourceDoesNotExistException("Resource " + resourceName + " does not exist in the repository", e);
         }
 
@@ -125,21 +146,21 @@
         }
     }
 
-    protected boolean isRemoteResourceNewer(String resourceName, long timestamp) throws S3ServiceException {
-        S3Object object = service.getObjectDetails(bucket, basedir + resourceName);
+    protected boolean isRemoteResourceNewer(String resourceName, long timestamp) throws ServiceException {
+        StorageObject object = service.getObjectDetails(bucket, basedir + resourceName);
         return object.getLastModifiedDate().compareTo(new Date(timestamp)) < 0;
     }
 
     protected List<String> listDirectory(String directory) throws Exception {
-        S3Object[] objects = service.listObjects(bucket, basedir + directory, "");
+        StorageObject[] objects = service.listObjects(bucket, basedir + directory, "");
         List<String> fileNames = new ArrayList<String>(objects.length);
-        for (S3Object object : objects) {
+        for (StorageObject object : objects) {
             fileNames.add(object.getKey());
         }
         return fileNames;
     }
 
-    protected void putResource(File source, String destination, TransferProgress progress) throws S3ServiceException,
+    protected void putResource(File source, String destination, TransferProgress progress) throws ServiceException,
             IOException {
         buildDestinationPath(getDestinationPath(destination));
         S3Object object = new S3Object(basedir + destination);
@@ -168,7 +189,7 @@
         }
     }
 
-    private void buildDestinationPath(String destination) throws S3ServiceException {
+    private void buildDestinationPath(String destination) throws ServiceException {
         S3Object object = new S3Object(basedir + destination + "/");
         object.setAcl(AccessControlList.REST_CANNED_PUBLIC_READ);
         object.setContentLength(0);
@@ -192,18 +213,39 @@
         return sb.toString();
     }
 
-    private AWSCredentials getCredentials(AuthenticationInfo authenticationInfo) throws AuthenticationException {
+    private Credentials getCredentials(AuthenticationInfo authenticationInfo) throws AuthenticationException {
         if (authenticationInfo == null) {
-            return null;
+            String example = "<server>\n"+
+            "   <id>repo_key</id>\n"+
+            "   <username>access_key</username>\n"+
+            "   <password>secret_key</password>\n"+
+            "</server>";
+            throw new AuthenticationException("Missing authentication info. Add a \n"+example+"\n to your settings.xml!");
         }
         String accessKey = authenticationInfo.getUserName();
         String secretKey = authenticationInfo.getPassphrase();
-        if (secretKey == null) {
+        if ("".equals(secretKey)){
+            throw new AuthenticationException("With maven3 you should encrypt the secretKey (see http://maven.apache.org/guides/mini/guide-encryption.html) or use the password field.");
+        } if (secretKey == null) {
             secretKey = authenticationInfo.getPassword();
         }
+
         if (accessKey == null || secretKey == null) {
-            throw new AuthenticationException("S3 requires a username and passphrase to be set");
+            throw new AuthenticationException("S3 requires a username and passphrase to be set.");
         }
-        return new AWSCredentials(accessKey, secretKey);
+        return new Credentials(accessKey, secretKey);
+    }
+
+    private class Credentials {
+
+        public String access;
+
+        public String secret;
+
+        public Credentials(String access, String secret) {
+            this.access = access;
+            this.secret = secret;
+        }
+
     }
 }
