diff --git a/providers/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/GoogleCloudStorageApi.java b/providers/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/GoogleCloudStorageApi.java
index 5d2691c73f..8bdd0bf53c 100644
--- a/providers/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/GoogleCloudStorageApi.java
+++ b/providers/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/GoogleCloudStorageApi.java
@@ -18,10 +18,23 @@ package org.jclouds.googlecloudstorage;
import java.io.Closeable;
+import javax.ws.rs.Path;
+
+import org.jclouds.googlecloudstorage.features.DefaultObjectAccessControlsApi;
+import org.jclouds.rest.annotations.Delegate;
+
/**
* Provide access to GoogleCloudStorage
*
* @see api doc /a>
*/
public interface GoogleCloudStorageApi extends Closeable {
+
+ /**
+ * Provides access to Default Object Access Control features on bucket
+ */
+ @Delegate
+ @Path("")
+ DefaultObjectAccessControlsApi getDefaultObjectAccessControlsApi();
+
}
diff --git a/providers/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/DefaultObjectAccessControls.java b/providers/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/DefaultObjectAccessControls.java
new file mode 100644
index 0000000000..156c683a31
--- /dev/null
+++ b/providers/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/DefaultObjectAccessControls.java
@@ -0,0 +1,251 @@
+/*
+ * 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.googlecloudstorage.domain;
+
+import static com.google.common.base.Objects.equal;
+import static com.google.common.base.Objects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.beans.ConstructorProperties;
+import java.net.URI;
+
+import org.jclouds.googlecloudstorage.features.ApiResourceRefferences.ObjectRole;
+
+import com.google.common.base.Objects;
+
+/**
+ * Represents a DefaultObjectAccessControls Resource
+ *
+ * @see
+ */
+public class DefaultObjectAccessControls extends Resource {
+
+ protected final String bucket;
+ protected final String entity;
+ protected final ObjectRole role;
+ protected final String email;
+ protected final String entityId;
+ protected final String domain;
+ protected final ProjectTeam projectTeam;
+
+ protected DefaultObjectAccessControls(String id, URI selfLink, String etag, String bucket, String entity,
+ String entityId, ObjectRole role, String email, String domain, ProjectTeam projectTeam) {
+ super(Kind.OBJECT_ACCESS_CONTROL, id, selfLink, etag);
+
+ this.bucket = bucket;
+ this.entity = checkNotNull(entity, "entity");
+ this.entityId = entityId;
+ this.role = checkNotNull(role, "role");
+ this.email = email;
+ this.domain = domain;
+ this.projectTeam = projectTeam;
+ }
+
+ public String getBucket() {
+ return bucket;
+ }
+
+ public String getEntity() {
+ return entity;
+ }
+
+ public ObjectRole getRole() {
+ return role;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public String getDomain() {
+ return domain;
+ }
+
+ public String getEntityId() {
+ return entityId;
+ }
+
+ public ProjectTeam getProjectTeam() {
+ return projectTeam;
+ }
+
+ public static class ProjectTeam {
+
+ public enum Team {
+ owners, editors, viewers;
+ }
+
+ private final String projectId;
+ private final Team team;
+
+ @ConstructorProperties({ "projectId", "team" })
+ public ProjectTeam(String projectId, Team team) {
+ this.projectId = projectId;
+ this.team = team;
+ }
+
+ public String getProjectId() {
+ return projectId;
+ }
+
+ public Team getTeam() {
+ return team;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(projectId, team);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null || getClass() != obj.getClass())
+ return false;
+ ProjectTeam that = ProjectTeam.class.cast(obj);
+ return equal(this.projectId, that.projectId) && equal(this.team, that.team);
+ }
+
+ protected Objects.ToStringHelper string() {
+ return toStringHelper(this).add("projectId", projectId).add("team", team);
+ }
+
+ @Override
+ public String toString() {
+ return string().toString();
+ }
+
+ public static class Builder {
+
+ private String projectId;
+ private Team team;
+
+ public Builder projectId(String projectId) {
+ this.projectId = projectId;
+ return this;
+ }
+
+ public Builder team(Team team) {
+ this.team = team;
+ return this;
+ }
+
+ public ProjectTeam build() {
+ return new ProjectTeam(this.projectId, this.team);
+ }
+
+ public Builder fromProjectTeam(ProjectTeam in) {
+ return this.projectId(in.getProjectId()).team(in.getTeam());
+ }
+ }
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null || getClass() != obj.getClass())
+ return false;
+ DefaultObjectAccessControls that = DefaultObjectAccessControls.class.cast(obj);
+ return equal(this.kind, that.kind) && equal(this.entity, that.entity) && equal(this.role, that.role);
+ }
+
+ protected Objects.ToStringHelper string() {
+ return super.string().omitNullValues().add("bucket", bucket).add("entity", entity).add("entityId", entityId)
+ .add("role", role).add("email", email).add("domain", domain);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(kind, entity);
+ }
+
+ @Override
+ public String toString() {
+ return string().toString();
+ }
+
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ public Builder toBuilder() {
+ return new Builder().fromObjectAccessControls(this);
+ }
+
+ public static final class Builder extends Resource.Builder {
+
+ protected String bucket;
+ protected String entity;
+ protected String entityId;
+ protected ObjectRole role;
+ protected String email;
+ protected String domain;
+ protected ProjectTeam projectTeam;
+
+ public Builder bucket(String bucket) {
+ this.bucket = bucket;
+ return this;
+ }
+
+ public Builder entity(String entity) {
+ this.entity = entity;
+ return this;
+ }
+
+ public Builder entityId(String entityId) {
+ this.entityId = entityId;
+ return this;
+ }
+
+ public Builder role(ObjectRole role) {
+ this.role = role;
+ return this;
+ }
+
+ public Builder email(String email) {
+ this.email = email;
+ return this;
+ }
+
+ public Builder domain(String domain) {
+ this.domain = domain;
+ return this;
+ }
+
+ public Builder projectTeam(ProjectTeam projectTeam) {
+ this.projectTeam = projectTeam;
+ return this;
+ }
+
+ public DefaultObjectAccessControls build() {
+ return new DefaultObjectAccessControls(super.id, super.selfLink, super.etag, bucket, entity, entityId, role,
+ email, domain, projectTeam);
+ }
+
+ public Builder fromObjectAccessControls(DefaultObjectAccessControls in) {
+ return super.fromResource(in).bucket(in.getBucket()).entity(in.getEntity()).entityId(in.getEntityId())
+ .role(in.getRole()).email(in.getEmail()).domain(in.getDomain()).projectTeam(in.getProjectTeam());
+ }
+
+ @Override
+ protected Builder self() {
+ return this;
+ }
+ }
+}
diff --git a/providers/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/DefaultObjectAccessControlsTemplate.java b/providers/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/DefaultObjectAccessControlsTemplate.java
new file mode 100644
index 0000000000..21a945c21b
--- /dev/null
+++ b/providers/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/DefaultObjectAccessControlsTemplate.java
@@ -0,0 +1,65 @@
+/*
+ * 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.googlecloudstorage.domain;
+
+import org.jclouds.googlecloudstorage.features.ApiResourceRefferences.ObjectRole;
+
+/**
+ * Represents a Object Access Control Resource
+ *
+ * @see
+ */
+public class DefaultObjectAccessControlsTemplate {
+
+ protected String entity;
+ protected ObjectRole role;
+
+ public DefaultObjectAccessControlsTemplate role(ObjectRole role) {
+ this.role = role;
+ return this;
+ }
+
+ public DefaultObjectAccessControlsTemplate entity(String entity) {
+ this.entity = entity;
+ return this;
+ }
+
+ public String getEntity() {
+ return entity;
+ }
+
+ public ObjectRole getRole() {
+ return role;
+ }
+
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ public static DefaultObjectAccessControlsTemplate fromObjectAccessControlsTemplate(
+ DefaultObjectAccessControlsTemplate objectAccessControlsTemplate) {
+ return Builder.fromObjectAccessControlsTemplate(objectAccessControlsTemplate);
+ }
+
+ public static class Builder {
+
+ public static DefaultObjectAccessControlsTemplate fromObjectAccessControlsTemplate(
+ DefaultObjectAccessControlsTemplate in) {
+ return new DefaultObjectAccessControlsTemplate().role(in.getRole()).entity(in.getEntity());
+ }
+ }
+}
diff --git a/providers/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/ListDefaultObjectAccessControls.java b/providers/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/ListDefaultObjectAccessControls.java
new file mode 100644
index 0000000000..896d05b582
--- /dev/null
+++ b/providers/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/ListDefaultObjectAccessControls.java
@@ -0,0 +1,113 @@
+/*
+ * 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.googlecloudstorage.domain;
+
+/**
+ * Represents the structure of a response from DefaultObjectAccessControls list operation
+ * @see
+ */
+
+import static com.google.common.base.Objects.equal;
+import static com.google.common.base.Objects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Set;
+
+import org.jclouds.googlecloudstorage.domain.Resource.Kind;
+
+import com.google.common.base.Objects;
+import com.google.common.collect.ImmutableSet;
+
+public class ListDefaultObjectAccessControls {
+
+ protected final Kind kind;
+ protected final Set items;
+
+ protected ListDefaultObjectAccessControls(Kind kind, Set items) {
+
+ this.kind = checkNotNull(kind, "kind");
+ this.items = checkNotNull(items, "items");
+ }
+
+ public Kind getKind() {
+ return kind;
+ }
+
+ public Set getItems() {
+ return items;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null || getClass() != obj.getClass())
+ return false;
+ ListDefaultObjectAccessControls that = ListDefaultObjectAccessControls.class.cast(obj);
+ return equal(this.kind, that.kind) && equal(this.items, that.items);
+
+ }
+
+ protected Objects.ToStringHelper string() {
+ return toStringHelper(this).omitNullValues().add("kind", kind).add("items", items);
+
+ }
+
+ @Override
+ public String toString() {
+ return string().toString();
+ }
+
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ public Builder toBuilder() {
+ return new Builder().fromListDefaultObjectAccessControls(this);
+ }
+
+ public static final class Builder {
+
+ private Kind kind;
+ private ImmutableSet.Builder items = ImmutableSet.builder();
+
+ public Builder kind(Kind kind) {
+ this.kind = kind;
+ return this;
+ }
+
+ public Builder addItems(DefaultObjectAccessControls defaultObjectAccessControls) {
+ this.items.add(defaultObjectAccessControls);
+ return this;
+ }
+
+ public Builder items(Set items) {
+ this.items.addAll(items);
+ return this;
+ }
+
+ public ListDefaultObjectAccessControls build() {
+ return new ListDefaultObjectAccessControls(this.kind, items.build());
+ }
+
+ public Builder fromListDefaultObjectAccessControls(ListDefaultObjectAccessControls in) {
+ return this.kind(in.getKind()).items(in.getItems());
+ }
+ }
+}
+
diff --git a/providers/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/ListPage.java b/providers/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/ListPage.java
new file mode 100644
index 0000000000..c8e9a7f61c
--- /dev/null
+++ b/providers/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/ListPage.java
@@ -0,0 +1,132 @@
+/*
+ * 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.googlecloudstorage.domain;
+
+import static com.google.common.base.Objects.equal;
+import static com.google.common.base.Objects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.beans.ConstructorProperties;
+import java.util.Iterator;
+
+import org.jclouds.collect.IterableWithMarker;
+import org.jclouds.googlecloudstorage.domain.Resource.Kind;
+
+import com.google.common.base.Objects;
+import com.google.common.base.Optional;
+import com.google.common.collect.ImmutableSet;
+
+/**
+ * The collection returned from any listFirstPage()
method.
+ */
+public class ListPage extends IterableWithMarker {
+
+ private final Kind kind;
+ private final String nextPageToken;
+ private final Iterable items;
+
+ @ConstructorProperties({ "kind", "nextPageToken", "items" })
+ protected ListPage(Kind kind, String nextPageToken, Iterable items) {
+
+ this.kind = checkNotNull(kind, "kind");
+ this.nextPageToken = nextPageToken;
+ this.items = items != null ? ImmutableSet.copyOf(items) : ImmutableSet. of();
+ }
+
+ public Kind getKind() {
+ return kind;
+ }
+
+ @Override
+ public Optional