+ * When set to true, this will add new lines and indentation to the output to make it easier for a human to read, at + * the expense of extra data (white space) being output. + *
+ * By default, this is {@code false}.
+ */
+ Builder prettyPrint(Boolean prettyPrint);
+ }
+}
diff --git a/services-custom/s3-event-notifications/src/main/java/software/amazon/awssdk/eventnotifications/s3/model/GlacierEventData.java b/services-custom/s3-event-notifications/src/main/java/software/amazon/awssdk/eventnotifications/s3/model/GlacierEventData.java
new file mode 100644
index 000000000000..0a42b47bc8f2
--- /dev/null
+++ b/services-custom/s3-event-notifications/src/main/java/software/amazon/awssdk/eventnotifications/s3/model/GlacierEventData.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://aws.amazon.com/apache2.0
+ *
+ * or in the "license" file accompanying this file. This file 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 software.amazon.awssdk.eventnotifications.s3.model;
+
+import java.util.Objects;
+import software.amazon.awssdk.annotations.SdkPublicApi;
+import software.amazon.awssdk.utils.ToString;
+
+/**
+ * The GlacierEventData is only visible for s3:ObjectRestore:Completed events.
+ * Contains information related to restoring an archived object. For more information about archive and storage classes, see
+ * Restoring an archived object
+ */
+@SdkPublicApi
+public class GlacierEventData {
+
+ private final RestoreEventData restoreEventData;
+
+ public GlacierEventData(RestoreEventData restoreEventData) {
+ this.restoreEventData = restoreEventData;
+ }
+
+ public RestoreEventData getRestoreEventData() {
+ return restoreEventData;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+
+ GlacierEventData that = (GlacierEventData) o;
+
+ return Objects.equals(restoreEventData, that.restoreEventData);
+ }
+
+ @Override
+ public int hashCode() {
+ return restoreEventData != null ? restoreEventData.hashCode() : 0;
+ }
+
+ @Override
+ public String toString() {
+ return ToString.builder("GlacierEventDataEntity")
+ .add("restoreEventData", restoreEventData)
+ .build();
+ }
+}
diff --git a/services-custom/s3-event-notifications/src/main/java/software/amazon/awssdk/eventnotifications/s3/model/IntelligentTieringEventData.java b/services-custom/s3-event-notifications/src/main/java/software/amazon/awssdk/eventnotifications/s3/model/IntelligentTieringEventData.java
new file mode 100644
index 000000000000..acd12762d53a
--- /dev/null
+++ b/services-custom/s3-event-notifications/src/main/java/software/amazon/awssdk/eventnotifications/s3/model/IntelligentTieringEventData.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://aws.amazon.com/apache2.0
+ *
+ * or in the "license" file accompanying this file. This file 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 software.amazon.awssdk.eventnotifications.s3.model;
+
+
+import java.util.Objects;
+import software.amazon.awssdk.annotations.SdkPublicApi;
+import software.amazon.awssdk.utils.ToString;
+
+/**
+ * The IntelligentTieringEventData key is only visible for S3 Intelligent-Tiering events.
+ */
+@SdkPublicApi
+public class IntelligentTieringEventData {
+
+ private final String destinationAccessTier;
+
+ public IntelligentTieringEventData(String destinationAccessTier) {
+ this.destinationAccessTier = destinationAccessTier;
+ }
+
+ public String getDestinationAccessTier() {
+ return destinationAccessTier;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+
+ IntelligentTieringEventData that = (IntelligentTieringEventData) o;
+
+ return Objects.equals(destinationAccessTier, that.destinationAccessTier);
+ }
+
+ @Override
+ public int hashCode() {
+ return destinationAccessTier != null ? destinationAccessTier.hashCode() : 0;
+ }
+
+ @Override
+ public String toString() {
+ return ToString.builder("IntelligentTieringEventDataEntity")
+ .add("destinationAccessTier", destinationAccessTier)
+ .build();
+ }
+}
diff --git a/services-custom/s3-event-notifications/src/main/java/software/amazon/awssdk/eventnotifications/s3/model/LifecycleEventData.java b/services-custom/s3-event-notifications/src/main/java/software/amazon/awssdk/eventnotifications/s3/model/LifecycleEventData.java
new file mode 100644
index 000000000000..94f0c77bccde
--- /dev/null
+++ b/services-custom/s3-event-notifications/src/main/java/software/amazon/awssdk/eventnotifications/s3/model/LifecycleEventData.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://aws.amazon.com/apache2.0
+ *
+ * or in the "license" file accompanying this file. This file 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 software.amazon.awssdk.eventnotifications.s3.model;
+
+
+import java.util.Objects;
+import software.amazon.awssdk.annotations.SdkPublicApi;
+import software.amazon.awssdk.utils.ToString;
+
+/**
+ * The LifecycleEventData is only visible for S3 Lifecycle transition events.
+ */
+@SdkPublicApi
+public class LifecycleEventData {
+
+ private final TransitionEventData transitionEventData;
+
+ public LifecycleEventData(TransitionEventData transitionEventData) {
+ this.transitionEventData = transitionEventData;
+ }
+
+ public TransitionEventData getTransitionEventData() {
+ return transitionEventData;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+
+ LifecycleEventData that = (LifecycleEventData) o;
+
+ return Objects.equals(transitionEventData, that.transitionEventData);
+ }
+
+ @Override
+ public int hashCode() {
+ return transitionEventData != null ? transitionEventData.hashCode() : 0;
+ }
+
+ @Override
+ public String toString() {
+ return ToString.builder("LifecycleEventDataEntity")
+ .add("transitionEventData", transitionEventData)
+ .build();
+ }
+}
diff --git a/services-custom/s3-event-notifications/src/main/java/software/amazon/awssdk/eventnotifications/s3/model/ReplicationEventData.java b/services-custom/s3-event-notifications/src/main/java/software/amazon/awssdk/eventnotifications/s3/model/ReplicationEventData.java
new file mode 100644
index 000000000000..c193f3506ab6
--- /dev/null
+++ b/services-custom/s3-event-notifications/src/main/java/software/amazon/awssdk/eventnotifications/s3/model/ReplicationEventData.java
@@ -0,0 +1,138 @@
+/*
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://aws.amazon.com/apache2.0
+ *
+ * or in the "license" file accompanying this file. This file 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 software.amazon.awssdk.eventnotifications.s3.model;
+
+
+import java.util.Objects;
+import software.amazon.awssdk.annotations.SdkPublicApi;
+import software.amazon.awssdk.utils.ToString;
+
+/**
+ * The ReplicationEventData is only visible for replication events.
+ */
+@SdkPublicApi
+public class ReplicationEventData {
+
+ private final String replicationRuleId;
+ private final String destinationBucket;
+ private final String s3Operation;
+ private final String requestTime;
+ private final String failureReason;
+ private final String threshold;
+ private final String replicationTime;
+
+ public ReplicationEventData(
+ String replicationRuleId,
+ String destinationBucket,
+ String s3Operation,
+ String requestTime,
+ String failureReason,
+ String threshold,
+ String replicationTime) {
+ this.replicationRuleId = replicationRuleId;
+ this.destinationBucket = destinationBucket;
+ this.s3Operation = s3Operation;
+ this.requestTime = requestTime;
+ this.failureReason = failureReason;
+ this.threshold = threshold;
+ this.replicationTime = replicationTime;
+ }
+
+ public String getReplicationRuleId() {
+ return replicationRuleId;
+ }
+
+ public String getDestinationBucket() {
+ return destinationBucket;
+ }
+
+ public String getS3Operation() {
+ return s3Operation;
+ }
+
+ public String getRequestTime() {
+ return requestTime;
+ }
+
+ public String getFailureReason() {
+ return failureReason;
+ }
+
+ public String getThreshold() {
+ return threshold;
+ }
+
+ public String getReplicationTime() {
+ return replicationTime;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+
+ ReplicationEventData that = (ReplicationEventData) o;
+
+ if (!Objects.equals(replicationRuleId, that.replicationRuleId)) {
+ return false;
+ }
+ if (!Objects.equals(destinationBucket, that.destinationBucket)) {
+ return false;
+ }
+ if (!Objects.equals(s3Operation, that.s3Operation)) {
+ return false;
+ }
+ if (!Objects.equals(requestTime, that.requestTime)) {
+ return false;
+ }
+ if (!Objects.equals(failureReason, that.failureReason)) {
+ return false;
+ }
+ if (!Objects.equals(threshold, that.threshold)) {
+ return false;
+ }
+ return Objects.equals(replicationTime, that.replicationTime);
+ }
+
+ @Override
+ public int hashCode() {
+ int result = replicationRuleId != null ? replicationRuleId.hashCode() : 0;
+ result = 31 * result + (destinationBucket != null ? destinationBucket.hashCode() : 0);
+ result = 31 * result + (s3Operation != null ? s3Operation.hashCode() : 0);
+ result = 31 * result + (requestTime != null ? requestTime.hashCode() : 0);
+ result = 31 * result + (failureReason != null ? failureReason.hashCode() : 0);
+ result = 31 * result + (threshold != null ? threshold.hashCode() : 0);
+ result = 31 * result + (replicationTime != null ? replicationTime.hashCode() : 0);
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return ToString.builder("ReplicationEventData")
+ .add("replicationRuleId", replicationRuleId)
+ .add("destinationBucket", destinationBucket)
+ .add("s3Operation", s3Operation)
+ .add("requestTime", requestTime)
+ .add("failureReason", failureReason)
+ .add("threshold", threshold)
+ .add("replicationTime", replicationTime)
+ .build();
+ }
+}
diff --git a/services-custom/s3-event-notifications/src/main/java/software/amazon/awssdk/eventnotifications/s3/model/RequestParameters.java b/services-custom/s3-event-notifications/src/main/java/software/amazon/awssdk/eventnotifications/s3/model/RequestParameters.java
new file mode 100644
index 000000000000..7bb90f429c50
--- /dev/null
+++ b/services-custom/s3-event-notifications/src/main/java/software/amazon/awssdk/eventnotifications/s3/model/RequestParameters.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://aws.amazon.com/apache2.0
+ *
+ * or in the "license" file accompanying this file. This file 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 software.amazon.awssdk.eventnotifications.s3.model;
+
+
+import java.util.Objects;
+import software.amazon.awssdk.annotations.SdkPublicApi;
+import software.amazon.awssdk.utils.ToString;
+
+@SdkPublicApi
+public class RequestParameters {
+
+ private final String sourceIpAddress;
+
+ public RequestParameters(String sourceIpAddress) {
+ this.sourceIpAddress = sourceIpAddress;
+ }
+
+ public String getSourceIpAddress() {
+ return sourceIpAddress;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+
+ RequestParameters that = (RequestParameters) o;
+
+ return Objects.equals(sourceIpAddress, that.sourceIpAddress);
+ }
+
+ @Override
+ public int hashCode() {
+ return sourceIpAddress != null ? sourceIpAddress.hashCode() : 0;
+ }
+
+ @Override
+ public String toString() {
+ return ToString.builder("RequestParameters")
+ .add("sourceIpAddress", sourceIpAddress)
+ .build();
+ }
+}
diff --git a/services-custom/s3-event-notifications/src/main/java/software/amazon/awssdk/eventnotifications/s3/model/ResponseElements.java b/services-custom/s3-event-notifications/src/main/java/software/amazon/awssdk/eventnotifications/s3/model/ResponseElements.java
new file mode 100644
index 000000000000..b7ec0747dd5a
--- /dev/null
+++ b/services-custom/s3-event-notifications/src/main/java/software/amazon/awssdk/eventnotifications/s3/model/ResponseElements.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://aws.amazon.com/apache2.0
+ *
+ * or in the "license" file accompanying this file. This file 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 software.amazon.awssdk.eventnotifications.s3.model;
+
+import java.util.Objects;
+import software.amazon.awssdk.annotations.SdkPublicApi;
+import software.amazon.awssdk.utils.ToString;
+
+@SdkPublicApi
+public class ResponseElements {
+
+ private final String xAmzId2;
+ private final String xAmzRequestId;
+
+ public ResponseElements(String xAmzId2, String xAmzRequestId) {
+ this.xAmzId2 = xAmzId2;
+ this.xAmzRequestId = xAmzRequestId;
+ }
+
+ public String getXAmzId2() {
+ return xAmzId2;
+ }
+
+ public String getXAmzRequestId() {
+ return xAmzRequestId;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+
+ ResponseElements that = (ResponseElements) o;
+
+ if (!Objects.equals(xAmzId2, that.xAmzId2)) {
+ return false;
+ }
+ return Objects.equals(xAmzRequestId, that.xAmzRequestId);
+ }
+
+ @Override
+ public int hashCode() {
+ int result = xAmzId2 != null ? xAmzId2.hashCode() : 0;
+ result = 31 * result + (xAmzRequestId != null ? xAmzRequestId.hashCode() : 0);
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return ToString.builder("ResponseElements")
+ .add("xAmzId2", xAmzId2)
+ .add("xAmzRequestId", xAmzRequestId)
+ .build();
+ }
+}
diff --git a/services-custom/s3-event-notifications/src/main/java/software/amazon/awssdk/eventnotifications/s3/model/RestoreEventData.java b/services-custom/s3-event-notifications/src/main/java/software/amazon/awssdk/eventnotifications/s3/model/RestoreEventData.java
new file mode 100644
index 000000000000..44ff4f595804
--- /dev/null
+++ b/services-custom/s3-event-notifications/src/main/java/software/amazon/awssdk/eventnotifications/s3/model/RestoreEventData.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://aws.amazon.com/apache2.0
+ *
+ * or in the "license" file accompanying this file. This file 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 software.amazon.awssdk.eventnotifications.s3.model;
+
+import java.time.Instant;
+import java.util.Objects;
+import software.amazon.awssdk.annotations.SdkPublicApi;
+import software.amazon.awssdk.utils.ToString;
+
+/**
+ * The RestoreEventData contains attributes that are related to the restore request.
+ */
+@SdkPublicApi
+public class RestoreEventData {
+
+ private final Instant lifecycleRestorationExpiryTime;
+ private final String lifecycleRestoreStorageClass;
+
+ public RestoreEventData(String lifecycleRestorationExpiryTime, String lifecycleRestoreStorageClass) {
+ this.lifecycleRestorationExpiryTime =
+ lifecycleRestorationExpiryTime != null ? Instant.parse(lifecycleRestorationExpiryTime) : null;
+ this.lifecycleRestoreStorageClass = lifecycleRestoreStorageClass;
+ }
+
+ /**
+ * @return The time, in ISO-8601 format, for example, 1970-01-01T00:00:00.000Z, of Restore Expiry.
+ */
+ public Instant getLifecycleRestorationExpiryTime() {
+ return lifecycleRestorationExpiryTime;
+ }
+
+ /**
+ * @return The source storage class for restore.
+ */
+ public String getLifecycleRestoreStorageClass() {
+ return lifecycleRestoreStorageClass;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+
+ RestoreEventData that = (RestoreEventData) o;
+
+ if (!Objects.equals(lifecycleRestorationExpiryTime, that.lifecycleRestorationExpiryTime)) {
+ return false;
+ }
+ return Objects.equals(lifecycleRestoreStorageClass, that.lifecycleRestoreStorageClass);
+ }
+
+ @Override
+ public int hashCode() {
+ int result = lifecycleRestorationExpiryTime != null ? lifecycleRestorationExpiryTime.hashCode() : 0;
+ result = 31 * result + (lifecycleRestoreStorageClass != null ? lifecycleRestoreStorageClass.hashCode() : 0);
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return ToString.builder("RestoreEventData")
+ .add("lifecycleRestorationExpiryTime", lifecycleRestorationExpiryTime)
+ .add("lifecycleRestoreStorageClass", lifecycleRestoreStorageClass)
+ .build();
+ }
+}
diff --git a/services-custom/s3-event-notifications/src/main/java/software/amazon/awssdk/eventnotifications/s3/model/S3.java b/services-custom/s3-event-notifications/src/main/java/software/amazon/awssdk/eventnotifications/s3/model/S3.java
new file mode 100644
index 000000000000..85c6637a9ea1
--- /dev/null
+++ b/services-custom/s3-event-notifications/src/main/java/software/amazon/awssdk/eventnotifications/s3/model/S3.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://aws.amazon.com/apache2.0
+ *
+ * or in the "license" file accompanying this file. This file 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 software.amazon.awssdk.eventnotifications.s3.model;
+
+import java.util.Objects;
+import software.amazon.awssdk.annotations.SdkPublicApi;
+import software.amazon.awssdk.utils.ToString;
+
+@SdkPublicApi
+public class S3 {
+
+ private final String configurationId;
+ private final S3Bucket bucket;
+ private final S3Object object;
+ private final String s3SchemaVersion;
+
+ public S3(String configurationId, S3Bucket bucket, S3Object object, String s3SchemaVersion) {
+ this.configurationId = configurationId;
+ this.bucket = bucket;
+ this.object = object;
+ this.s3SchemaVersion = s3SchemaVersion;
+ }
+
+ public String getConfigurationId() {
+ return configurationId;
+ }
+
+ public S3Bucket getBucket() {
+ return bucket;
+ }
+
+ public S3Object getObject() {
+ return object;
+ }
+
+ public String getS3SchemaVersion() {
+ return s3SchemaVersion;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+
+ S3 s3 = (S3) o;
+
+ if (!Objects.equals(configurationId, s3.configurationId)) {
+ return false;
+ }
+ if (!Objects.equals(bucket, s3.bucket)) {
+ return false;
+ }
+ if (!Objects.equals(object, s3.object)) {
+ return false;
+ }
+ return Objects.equals(s3SchemaVersion, s3.s3SchemaVersion);
+ }
+
+ @Override
+ public int hashCode() {
+ int result = configurationId != null ? configurationId.hashCode() : 0;
+ result = 31 * result + (bucket != null ? bucket.hashCode() : 0);
+ result = 31 * result + (object != null ? object.hashCode() : 0);
+ result = 31 * result + (s3SchemaVersion != null ? s3SchemaVersion.hashCode() : 0);
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return ToString.builder("S3")
+ .add("configurationId", configurationId)
+ .add("bucket", bucket)
+ .add("object", object)
+ .add("s3SchemaVersion", s3SchemaVersion)
+ .build();
+ }
+}
diff --git a/services-custom/s3-event-notifications/src/main/java/software/amazon/awssdk/eventnotifications/s3/model/S3Bucket.java b/services-custom/s3-event-notifications/src/main/java/software/amazon/awssdk/eventnotifications/s3/model/S3Bucket.java
new file mode 100644
index 000000000000..6d14c790de4b
--- /dev/null
+++ b/services-custom/s3-event-notifications/src/main/java/software/amazon/awssdk/eventnotifications/s3/model/S3Bucket.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://aws.amazon.com/apache2.0
+ *
+ * or in the "license" file accompanying this file. This file 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 software.amazon.awssdk.eventnotifications.s3.model;
+
+
+import java.util.Objects;
+import software.amazon.awssdk.annotations.SdkPublicApi;
+import software.amazon.awssdk.utils.ToString;
+
+@SdkPublicApi
+public class S3Bucket {
+
+ private final String name;
+ private final UserIdentity ownerIdentity;
+ private final String arn;
+
+ public S3Bucket(String name, UserIdentity ownerIdentity, String arn) {
+ this.name = name;
+ this.ownerIdentity = ownerIdentity;
+ this.arn = arn;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public UserIdentity getOwnerIdentity() {
+ return ownerIdentity;
+ }
+
+ public String getArn() {
+ return arn;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+
+ S3Bucket s3Bucket = (S3Bucket) o;
+
+ if (!Objects.equals(name, s3Bucket.name)) {
+ return false;
+ }
+ if (!Objects.equals(ownerIdentity, s3Bucket.ownerIdentity)) {
+ return false;
+ }
+ return Objects.equals(arn, s3Bucket.arn);
+ }
+
+ @Override
+ public int hashCode() {
+ int result = name != null ? name.hashCode() : 0;
+ result = 31 * result + (ownerIdentity != null ? ownerIdentity.hashCode() : 0);
+ result = 31 * result + (arn != null ? arn.hashCode() : 0);
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return ToString.builder("S3Bucket")
+ .add("name", name)
+ .add("ownerIdentity", ownerIdentity)
+ .add("arn", arn)
+ .build();
+ }
+}
diff --git a/services-custom/s3-event-notifications/src/main/java/software/amazon/awssdk/eventnotifications/s3/model/S3EventNotification.java b/services-custom/s3-event-notifications/src/main/java/software/amazon/awssdk/eventnotifications/s3/model/S3EventNotification.java
new file mode 100644
index 000000000000..cc3e36056e54
--- /dev/null
+++ b/services-custom/s3-event-notifications/src/main/java/software/amazon/awssdk/eventnotifications/s3/model/S3EventNotification.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://aws.amazon.com/apache2.0
+ *
+ * or in the "license" file accompanying this file. This file 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 software.amazon.awssdk.eventnotifications.s3.model;
+
+
+import java.io.InputStream;
+import java.util.List;
+import java.util.Objects;
+import software.amazon.awssdk.annotations.SdkPublicApi;
+import software.amazon.awssdk.eventnotifications.s3.internal.S3EventNotificationReader;
+import software.amazon.awssdk.eventnotifications.s3.internal.S3EventNotificationWriter;
+import software.amazon.awssdk.utils.ToString;
+
+/**
+ * A helper class that represents a strongly typed S3 EventNotification item sent to SQS, SNS, or Lambda.
+ */
+@SdkPublicApi
+public class S3EventNotification {
+
+ private final List