diff --git a/sdk/communication/azure-communication-messages/CHANGELOG.md b/sdk/communication/azure-communication-messages/CHANGELOG.md index 58465d9ab42f3..e0585c127188e 100644 --- a/sdk/communication/azure-communication-messages/CHANGELOG.md +++ b/sdk/communication/azure-communication-messages/CHANGELOG.md @@ -1,19 +1,16 @@ # Release History -## 1.2.0-beta.1 (Unreleased) +## 1.2.0-beta.1 (2025-01-15) ### Features Added - -### Breaking Changes - -### Bugs Fixed - -### Other Changes +- Added Interactive Message. +- Added Reaction Message. +- Added Sticker Message. ## 1.1.0 (2024-10-23) ### Features Added -- Added ImageNotificationContent to send image messgae. +- Added ImageNotificationContent to send image message. - Added DocumentNotificationContent to send document message. - Added VideoNotificationContent to send video message. - Added AudioNotificationContent to send audio message. diff --git a/sdk/communication/azure-communication-messages/assets.json b/sdk/communication/azure-communication-messages/assets.json index 99d7da0bd362f..53b52dceaf2b6 100644 --- a/sdk/communication/azure-communication-messages/assets.json +++ b/sdk/communication/azure-communication-messages/assets.json @@ -2,5 +2,5 @@ "AssetsRepo" : "Azure/azure-sdk-assets", "AssetsRepoPrefixPath" : "java", "TagPrefix" : "java/communication/azure-communication-messages", - "Tag" : "java/communication/azure-communication-messages_d7c7441f3b" + "Tag" : "java/communication/azure-communication-messages_b6d2e1239f" } diff --git a/sdk/communication/azure-communication-messages/customization/src/main/java/MessagesSdkCustomization.java b/sdk/communication/azure-communication-messages/customization/src/main/java/MessagesSdkCustomization.java index cb534b0d5ec97..af713de649aed 100644 --- a/sdk/communication/azure-communication-messages/customization/src/main/java/MessagesSdkCustomization.java +++ b/sdk/communication/azure-communication-messages/customization/src/main/java/MessagesSdkCustomization.java @@ -8,6 +8,8 @@ import com.github.javaparser.ast.Modifier; import com.github.javaparser.ast.Node; import com.github.javaparser.ast.NodeList; +import com.github.javaparser.ast.body.MethodDeclaration; +import com.github.javaparser.ast.body.Parameter; import com.github.javaparser.ast.stmt.BlockStmt; import com.github.javaparser.ast.type.ClassOrInterfaceType; import com.github.javaparser.javadoc.Javadoc; @@ -15,6 +17,10 @@ import com.github.javaparser.javadoc.description.JavadocSnippet; import org.slf4j.Logger; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + public class MessagesSdkCustomization extends Customization { @Override @@ -32,13 +38,24 @@ public void customize(LibraryCustomization libraryCustomization, Logger logger) customizeMessageTemplateLocation(modelsPackage); customizeMessageTemplateItemModel(modelsPackage); + //Handle Interactive message content models + updateModelClassModifierToAbstract(modelsPackage, "MessageContent"); + updateModelClassModifierToAbstract(modelsPackage, "ActionBindings"); + updateJavaDocForMethodFromJson(modelsPackage, "ActionBindings"); + updateJavaDocForMethodFromJson(modelsPackage, "MessageContent"); + customizeInteractiveMessage(modelsPackage); + PackageCustomization channelsModelsPackage = libraryCustomization.getPackage( "com.azure.communication.messages.models.channels"); updateWhatsAppMessageTemplateItemWithBinaryDataContent(channelsModelsPackage); - AddDeprecateAnnotationToMediaNotificationContent(modelsPackage); + addDeprecateAnnotationToMediaNotificationContent(modelsPackage); + + addDeprecateAnnotationForImageV0CommunicationKind(modelsPackage); - AddDeprecateAnnotationForImageV0CommunicationKind(modelsPackage); + customizeActionGroup(modelsPackage); + customizeActionGroupContent(modelsPackage); + customizeButtonSetContent(modelsPackage); } private void updateModelClassModifierToAbstract(PackageCustomization modelsPackage, String className) { @@ -174,6 +191,45 @@ private void customizeMessageTemplateLocation(PackageCustomization modelsPackage }); } + private void customizeInteractiveMessage(PackageCustomization modelsPackage) { + modelsPackage.getClass("InteractiveMessage").customizeAst(ast -> { + ast.getClassByName("InteractiveMessage").ifPresent(clazz -> { + clazz.addMethod("getHeader", Modifier.Keyword.PUBLIC) + .setType(clazz.getMethodsByName("getHeaderProperty").get(0).getType()) + .setBody(clazz.getMethodsByName("getHeaderProperty").get(0).getBody().get()) + .setJavadocComment(clazz.getMethodsByName("getHeaderProperty").get(0).getJavadocComment().get()); + + clazz.getMethodsByName("getHeaderProperty").forEach(Node::remove); + + MethodDeclaration setHeaderMethodDeclaration = clazz.getMethodsByName("setHeaderProperty").get(0); + List parameters = setHeaderMethodDeclaration + .getParameters() + .stream() + .map(p -> p.setName("header")) + .collect(Collectors.toList()); + String methodBodyContent = setHeaderMethodDeclaration + .getBody() + .get() + .toString() + .replace("headerProperty;", "header;"); + + String docComment = setHeaderMethodDeclaration + .getJavadocComment() + .get() + .getContent() + .replace("headerProperty", "header"); + + clazz.addMethod("setHeader", Modifier.Keyword.PUBLIC) + .setParameters(new NodeList(parameters)) + .setType(setHeaderMethodDeclaration.getType()) + .setBody(StaticJavaParser.parseBlock(methodBodyContent)) + .setJavadocComment(new Javadoc(JavadocDescription.parseText(docComment))); + + clazz.getMethodsByName("setHeaderProperty").forEach(Node::remove); + }); + }); + } + private void updateWhatsAppMessageTemplateItemWithBinaryDataContent(PackageCustomization channelsModelsPackage) { channelsModelsPackage.getClass("WhatsAppMessageTemplateItem").customizeAst(ast -> { // ast.addImport("com.azure.core.util.BinaryData"); @@ -206,7 +262,7 @@ private void removeJsonKnownDiscriminatorMethod(PackageCustomization modelPackag }); } - private void AddDeprecateAnnotationToMediaNotificationContent(PackageCustomization modelsPackage) { + private void addDeprecateAnnotationToMediaNotificationContent(PackageCustomization modelsPackage) { modelsPackage.getClass("MediaNotificationContent").customizeAst(ast -> { ast.getClassByName("MediaNotificationContent").ifPresent(clazz -> { clazz.addAnnotation(Deprecated.class); @@ -222,7 +278,7 @@ private void AddDeprecateAnnotationToMediaNotificationContent(PackageCustomizati }); } - private void AddDeprecateAnnotationForImageV0CommunicationKind(PackageCustomization modelsPackage) { + private void addDeprecateAnnotationForImageV0CommunicationKind(PackageCustomization modelsPackage) { modelsPackage.getClass("CommunicationMessageKind").customizeAst(ast -> { ast.getClassByName("CommunicationMessageKind") .flatMap(clazz -> clazz.getFieldByName("IMAGE_V0")) @@ -240,4 +296,72 @@ private void AddDeprecateAnnotationForImageV0CommunicationKind(PackageCustomiza }); }); } + + private void updateJavaDocForMethodFromJson(PackageCustomization modelPackage, String className) { + String originalDocText = String.format("@throws IOException If an error occurs while reading the %s.", className); + modelPackage.getClass(className).customizeAst(ast -> { + ast.getClassByName(className).ifPresent( clazz -> { + String fromJsonDoc = clazz.getMethodsByName("fromJson") + .get(0).getJavadoc().get().toText() + .replace(originalDocText, + "@throws IllegalStateException If the deserialized JSON object was missing any required properties.\n" + + originalDocText); + clazz.getMethodsByName("fromJson").get(0).setJavadocComment(fromJsonDoc); + }); + }); + } + + private void customizeActionGroup(PackageCustomization modelsPackage) { + modelsPackage.getClass("ActionGroup").customizeAst(ast -> { + ast.getClassByName("ActionGroup") + .flatMap(clazz -> clazz.getConstructorByParameterTypes(String.class, List.class)) + .ifPresent(c -> { + String body = c.getBody().toString().replace("this.items = items;", + "this.items = new ArrayList<>(items);"); + c.setBody(StaticJavaParser.parseBlock(body)); + }); + + ast.getClassByName("ActionGroup").ifPresent(clazz -> { + String getItemsBody = clazz.getMethodsByName("getItems").get(0).getBody().get().toString() + .replace("return this.items;", "return new ArrayList<>(this.items);"); + clazz.getMethodsByName("getItems").get(0).setBody(StaticJavaParser.parseBlock(getItemsBody)); + }); + }); + } + + private void customizeActionGroupContent(PackageCustomization modelsPackage) { + modelsPackage.getClass("ActionGroupContent").customizeAst(ast -> { + ast.getClassByName("ActionGroupContent") + .flatMap(clazz -> clazz.getConstructorByParameterTypes(String.class, List.class)) + .ifPresent(c -> { + String body = c.getBody().toString().replace("this.groups = groups;", + "this.groups = new ArrayList<>(groups);"); + c.setBody(StaticJavaParser.parseBlock(body)); + }); + + ast.getClassByName("ActionGroupContent").ifPresent(clazz -> { + String getItemsBody = clazz.getMethodsByName("getGroups").get(0).getBody().get().toString() + .replace("return this.groups;", "return new ArrayList<>(this.groups);"); + clazz.getMethodsByName("getGroups").get(0).setBody(StaticJavaParser.parseBlock(getItemsBody)); + }); + }); + } + + private void customizeButtonSetContent(PackageCustomization modelsPackage) { + modelsPackage.getClass("ButtonSetContent").customizeAst(ast -> { + ast.getClassByName("ButtonSetContent") + .flatMap(clazz -> clazz.getConstructorByParameterTypes(List.class)) + .ifPresent(c -> { + String body = c.getBody().toString().replace("this.buttons = buttons;", + "this.buttons = new ArrayList<>(buttons);"); + c.setBody(StaticJavaParser.parseBlock(body)); + }); + + ast.getClassByName("ButtonSetContent").ifPresent(clazz -> { + String getItemsBody = clazz.getMethodsByName("getButtons").get(0).getBody().get().toString() + .replace("return this.buttons;", "return new ArrayList<>(this.buttons);"); + clazz.getMethodsByName("getButtons").get(0).setBody(StaticJavaParser.parseBlock(getItemsBody)); + }); + }); + } } diff --git a/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/MessagesServiceVersion.java b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/MessagesServiceVersion.java index 8673e42220368..462bb0b338344 100644 --- a/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/MessagesServiceVersion.java +++ b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/MessagesServiceVersion.java @@ -18,7 +18,12 @@ public enum MessagesServiceVersion implements ServiceVersion { /** * Enum value 2024-08-30. */ - V2024_08_30("2024-08-30"); + V2024_08_30("2024-08-30"), + + /** + * Enum value 2025-01-15-preview. + */ + V2025_01_15_PREVIEW("2025-01-15-preview"); private final String version; @@ -40,6 +45,6 @@ public String getVersion() { * @return The latest {@link MessagesServiceVersion}. */ public static MessagesServiceVersion getLatest() { - return V2024_08_30; + return V2025_01_15_PREVIEW; } } diff --git a/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/NotificationMessagesAsyncClient.java b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/NotificationMessagesAsyncClient.java index 435f82449d3b1..655037080cdaf 100644 --- a/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/NotificationMessagesAsyncClient.java +++ b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/NotificationMessagesAsyncClient.java @@ -55,7 +55,7 @@ public final class NotificationMessagesAsyncClient { *
      * {@code
      * {
-     *     kind: String(text/image/image_v0/document/video/audio/template) (Required)
+     *     kind: String(text/image/image_v0/document/video/audio/template/sticker/reaction/interactive) (Required)
      *     channelRegistrationId: String (Required)
      *     to (Required): [
      *         String (Required)
diff --git a/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/NotificationMessagesClient.java b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/NotificationMessagesClient.java
index 59266523b678f..1d4c46e92ef1d 100644
--- a/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/NotificationMessagesClient.java
+++ b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/NotificationMessagesClient.java
@@ -53,7 +53,7 @@ public final class NotificationMessagesClient {
      * 
      * {@code
      * {
-     *     kind: String(text/image/image_v0/document/video/audio/template) (Required)
+     *     kind: String(text/image/image_v0/document/video/audio/template/sticker/reaction/interactive) (Required)
      *     channelRegistrationId: String (Required)
      *     to (Required): [
      *         String (Required)
diff --git a/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/implementation/NotificationMessagesClientImpl.java b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/implementation/NotificationMessagesClientImpl.java
index a9176df99148d..3d7f4d8bdabb0 100644
--- a/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/implementation/NotificationMessagesClientImpl.java
+++ b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/implementation/NotificationMessagesClientImpl.java
@@ -212,7 +212,7 @@ Response downloadMediaSync(@HostParam("endpoint") String endpoint,
      * 
      * {@code
      * {
-     *     kind: String(text/image/image_v0/document/video/audio/template) (Required)
+     *     kind: String(text/image/image_v0/document/video/audio/template/sticker/reaction/interactive) (Required)
      *     channelRegistrationId: String (Required)
      *     to (Required): [
      *         String (Required)
@@ -284,7 +284,7 @@ public Mono> sendWithResponseAsync(BinaryData notificationC
      * 
      * {@code
      * {
-     *     kind: String(text/image/image_v0/document/video/audio/template) (Required)
+     *     kind: String(text/image/image_v0/document/video/audio/template/sticker/reaction/interactive) (Required)
      *     channelRegistrationId: String (Required)
      *     to (Required): [
      *         String (Required)
diff --git a/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/ActionBindings.java b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/ActionBindings.java
new file mode 100644
index 0000000000000..e11152962e27e
--- /dev/null
+++ b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/ActionBindings.java
@@ -0,0 +1,96 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+// Code generated by Microsoft (R) TypeSpec Code Generator.
+package com.azure.communication.messages.models;
+
+import com.azure.communication.messages.models.channels.WhatsAppButtonActionBindings;
+import com.azure.communication.messages.models.channels.WhatsAppListActionBindings;
+import com.azure.communication.messages.models.channels.WhatsAppUrlActionBindings;
+import com.azure.core.annotation.Generated;
+import com.azure.core.annotation.Immutable;
+import com.azure.json.JsonReader;
+import com.azure.json.JsonSerializable;
+import com.azure.json.JsonToken;
+import com.azure.json.JsonWriter;
+import java.io.IOException;
+
+/**
+ * Binding actions to the interactive message.
+ */
+@Immutable
+public abstract class ActionBindings implements JsonSerializable {
+
+    /*
+     * Kind of the MessageActionBinding.
+     */
+    @Generated
+    private MessageActionBindingKind kind = MessageActionBindingKind.fromString("ActionBindings");
+
+    /**
+     * Creates an instance of ActionBindings class.
+     */
+    @Generated
+    protected ActionBindings() {
+    }
+
+    /**
+     * Get the kind property: Kind of the MessageActionBinding.
+     *
+     * @return the kind value.
+     */
+    @Generated
+    public MessageActionBindingKind getKind() {
+        return this.kind;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Generated
+    @Override
+    public JsonWriter toJson(JsonWriter jsonWriter) throws IOException {
+        jsonWriter.writeStartObject();
+        jsonWriter.writeStringField("kind", this.kind == null ? null : this.kind.toString());
+        return jsonWriter.writeEndObject();
+    }
+
+    /**
+     * Reads an instance of ActionBindings from the JsonReader.
+     *
+     * @param jsonReader The JsonReader being read.
+     * @return An instance of ActionBindings if the JsonReader was pointing to an instance of it, or null if it was
+     * pointing to JSON null.
+     * @throws IllegalStateException If the deserialized JSON object was missing any required properties.
+     * @throws IOException If an error occurs while reading the ActionBindings.
+     */
+    @Generated
+    public static ActionBindings fromJson(JsonReader jsonReader) throws IOException {
+        return jsonReader.readObject(reader -> {
+            String discriminatorValue = null;
+            try (JsonReader readerToUse = reader.bufferObject()) {
+                // Prepare for reading
+                readerToUse.nextToken();
+                while (readerToUse.nextToken() != JsonToken.END_OBJECT) {
+                    String fieldName = readerToUse.getFieldName();
+                    readerToUse.nextToken();
+                    if ("kind".equals(fieldName)) {
+                        discriminatorValue = readerToUse.getString();
+                        break;
+                    } else {
+                        readerToUse.skipChildren();
+                    }
+                }
+                // Use the discriminator value to determine which subtype should be deserialized.
+                if ("whatsAppListAction".equals(discriminatorValue)) {
+                    return WhatsAppListActionBindings.fromJson(readerToUse.reset());
+                } else if ("whatsAppButtonAction".equals(discriminatorValue)) {
+                    return WhatsAppButtonActionBindings.fromJson(readerToUse.reset());
+                } else if ("whatsAppUrlAction".equals(discriminatorValue)) {
+                    return WhatsAppUrlActionBindings.fromJson(readerToUse.reset());
+                } else {
+                    throw new IllegalStateException("Invalid Kind value - " + discriminatorValue);
+                }
+            }
+        });
+    }
+}
diff --git a/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/ActionGroup.java b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/ActionGroup.java
new file mode 100644
index 0000000000000..74f4f2309fd5f
--- /dev/null
+++ b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/ActionGroup.java
@@ -0,0 +1,106 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+// Code generated by Microsoft (R) TypeSpec Code Generator.
+package com.azure.communication.messages.models;
+
+import com.azure.core.annotation.Generated;
+import com.azure.core.annotation.Immutable;
+import com.azure.json.JsonReader;
+import com.azure.json.JsonSerializable;
+import com.azure.json.JsonToken;
+import com.azure.json.JsonWriter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * The Action Group content.
+ */
+@Immutable
+public final class ActionGroup implements JsonSerializable {
+
+    /*
+     * Title of the ActionGroup.
+     */
+    @Generated
+    private final String title;
+
+    /*
+     * Array of items in ActionGroup.
+     */
+    @Generated
+    private final List items;
+
+    /**
+     * Creates an instance of ActionGroup class.
+     *
+     * @param title the title value to set.
+     * @param items the items value to set.
+     */
+    @Generated
+    public ActionGroup(String title, List items) {
+        this.title = title;
+        this.items = new ArrayList<>(items);
+    }
+
+    /**
+     * Get the title property: Title of the ActionGroup.
+     *
+     * @return the title value.
+     */
+    @Generated
+    public String getTitle() {
+        return this.title;
+    }
+
+    /**
+     * Get the items property: Array of items in ActionGroup.
+     *
+     * @return the items value.
+     */
+    @Generated
+    public List getItems() {
+        return new ArrayList<>(this.items);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Generated
+    @Override
+    public JsonWriter toJson(JsonWriter jsonWriter) throws IOException {
+        jsonWriter.writeStartObject();
+        jsonWriter.writeStringField("title", this.title);
+        jsonWriter.writeArrayField("items", this.items, (writer, element) -> writer.writeJson(element));
+        return jsonWriter.writeEndObject();
+    }
+
+    /**
+     * Reads an instance of ActionGroup from the JsonReader.
+     *
+     * @param jsonReader The JsonReader being read.
+     * @return An instance of ActionGroup if the JsonReader was pointing to an instance of it, or null if it was
+     * pointing to JSON null.
+     * @throws IllegalStateException If the deserialized JSON object was missing any required properties.
+     * @throws IOException If an error occurs while reading the ActionGroup.
+     */
+    @Generated
+    public static ActionGroup fromJson(JsonReader jsonReader) throws IOException {
+        return jsonReader.readObject(reader -> {
+            String title = null;
+            List items = null;
+            while (reader.nextToken() != JsonToken.END_OBJECT) {
+                String fieldName = reader.getFieldName();
+                reader.nextToken();
+                if ("title".equals(fieldName)) {
+                    title = reader.getString();
+                } else if ("items".equals(fieldName)) {
+                    items = reader.readArray(reader1 -> ActionGroupItem.fromJson(reader1));
+                } else {
+                    reader.skipChildren();
+                }
+            }
+            return new ActionGroup(title, items);
+        });
+    }
+}
diff --git a/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/ActionGroupContent.java b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/ActionGroupContent.java
new file mode 100644
index 0000000000000..ec8825ce37ee7
--- /dev/null
+++ b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/ActionGroupContent.java
@@ -0,0 +1,128 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+// Code generated by Microsoft (R) TypeSpec Code Generator.
+package com.azure.communication.messages.models;
+
+import com.azure.core.annotation.Generated;
+import com.azure.core.annotation.Immutable;
+import com.azure.json.JsonReader;
+import com.azure.json.JsonToken;
+import com.azure.json.JsonWriter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * The action content of type ActionGroup.
+ */
+@Immutable
+public final class ActionGroupContent extends MessageContent {
+
+    /*
+     * Kind of MessageContent.
+     */
+    @Generated
+    private MessageContentKind kind = MessageContentKind.GROUP;
+
+    /*
+     * Title of the actionGroup content.
+     */
+    @Generated
+    private final String title;
+
+    /*
+     * Set or group of actions.
+     */
+    @Generated
+    private final List groups;
+
+    /**
+     * Creates an instance of ActionGroupContent class.
+     *
+     * @param title the title value to set.
+     * @param groups the groups value to set.
+     */
+    @Generated
+    public ActionGroupContent(String title, List groups) {
+        this.title = title;
+        this.groups = new ArrayList<>(groups);
+    }
+
+    /**
+     * Get the kind property: Kind of MessageContent.
+     *
+     * @return the kind value.
+     */
+    @Generated
+    @Override
+    public MessageContentKind getKind() {
+        return this.kind;
+    }
+
+    /**
+     * Get the title property: Title of the actionGroup content.
+     *
+     * @return the title value.
+     */
+    @Generated
+    public String getTitle() {
+        return this.title;
+    }
+
+    /**
+     * Get the groups property: Set or group of actions.
+     *
+     * @return the groups value.
+     */
+    @Generated
+    public List getGroups() {
+        return new ArrayList<>(this.groups);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Generated
+    @Override
+    public JsonWriter toJson(JsonWriter jsonWriter) throws IOException {
+        jsonWriter.writeStartObject();
+        jsonWriter.writeStringField("title", this.title);
+        jsonWriter.writeArrayField("groups", this.groups, (writer, element) -> writer.writeJson(element));
+        jsonWriter.writeStringField("kind", this.kind == null ? null : this.kind.toString());
+        return jsonWriter.writeEndObject();
+    }
+
+    /**
+     * Reads an instance of ActionGroupContent from the JsonReader.
+     *
+     * @param jsonReader The JsonReader being read.
+     * @return An instance of ActionGroupContent if the JsonReader was pointing to an instance of it, or null if it was
+     * pointing to JSON null.
+     * @throws IllegalStateException If the deserialized JSON object was missing any required properties.
+     * @throws IOException If an error occurs while reading the ActionGroupContent.
+     */
+    @Generated
+    public static ActionGroupContent fromJson(JsonReader jsonReader) throws IOException {
+        return jsonReader.readObject(reader -> {
+            String title = null;
+            List groups = null;
+            MessageContentKind kind = MessageContentKind.GROUP;
+            while (reader.nextToken() != JsonToken.END_OBJECT) {
+                String fieldName = reader.getFieldName();
+                reader.nextToken();
+                if ("title".equals(fieldName)) {
+                    title = reader.getString();
+                } else if ("groups".equals(fieldName)) {
+                    groups = reader.readArray(reader1 -> ActionGroup.fromJson(reader1));
+                } else if ("kind".equals(fieldName)) {
+                    kind = MessageContentKind.fromString(reader.getString());
+                } else {
+                    reader.skipChildren();
+                }
+            }
+            ActionGroupContent deserializedActionGroupContent = new ActionGroupContent(title, groups);
+            deserializedActionGroupContent.kind = kind;
+            return deserializedActionGroupContent;
+        });
+    }
+}
diff --git a/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/ActionGroupItem.java b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/ActionGroupItem.java
new file mode 100644
index 0000000000000..9fa292486f2df
--- /dev/null
+++ b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/ActionGroupItem.java
@@ -0,0 +1,126 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+// Code generated by Microsoft (R) TypeSpec Code Generator.
+package com.azure.communication.messages.models;
+
+import com.azure.core.annotation.Generated;
+import com.azure.core.annotation.Immutable;
+import com.azure.json.JsonReader;
+import com.azure.json.JsonSerializable;
+import com.azure.json.JsonToken;
+import com.azure.json.JsonWriter;
+import java.io.IOException;
+
+/**
+ * The Action group item in the content.
+ */
+@Immutable
+public final class ActionGroupItem implements JsonSerializable {
+
+    /*
+     * Id of the Item.
+     */
+    @Generated
+    private final String id;
+
+    /*
+     * Title of the Item.
+     */
+    @Generated
+    private final String title;
+
+    /*
+     * Description of the Item.
+     */
+    @Generated
+    private final String description;
+
+    /**
+     * Creates an instance of ActionGroupItem class.
+     *
+     * @param id the id value to set.
+     * @param title the title value to set.
+     * @param description the description value to set.
+     */
+    @Generated
+    public ActionGroupItem(String id, String title, String description) {
+        this.id = id;
+        this.title = title;
+        this.description = description;
+    }
+
+    /**
+     * Get the id property: Id of the Item.
+     *
+     * @return the id value.
+     */
+    @Generated
+    public String getId() {
+        return this.id;
+    }
+
+    /**
+     * Get the title property: Title of the Item.
+     *
+     * @return the title value.
+     */
+    @Generated
+    public String getTitle() {
+        return this.title;
+    }
+
+    /**
+     * Get the description property: Description of the Item.
+     *
+     * @return the description value.
+     */
+    @Generated
+    public String getDescription() {
+        return this.description;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Generated
+    @Override
+    public JsonWriter toJson(JsonWriter jsonWriter) throws IOException {
+        jsonWriter.writeStartObject();
+        jsonWriter.writeStringField("id", this.id);
+        jsonWriter.writeStringField("title", this.title);
+        jsonWriter.writeStringField("description", this.description);
+        return jsonWriter.writeEndObject();
+    }
+
+    /**
+     * Reads an instance of ActionGroupItem from the JsonReader.
+     *
+     * @param jsonReader The JsonReader being read.
+     * @return An instance of ActionGroupItem if the JsonReader was pointing to an instance of it, or null if it was
+     * pointing to JSON null.
+     * @throws IllegalStateException If the deserialized JSON object was missing any required properties.
+     * @throws IOException If an error occurs while reading the ActionGroupItem.
+     */
+    @Generated
+    public static ActionGroupItem fromJson(JsonReader jsonReader) throws IOException {
+        return jsonReader.readObject(reader -> {
+            String id = null;
+            String title = null;
+            String description = null;
+            while (reader.nextToken() != JsonToken.END_OBJECT) {
+                String fieldName = reader.getFieldName();
+                reader.nextToken();
+                if ("id".equals(fieldName)) {
+                    id = reader.getString();
+                } else if ("title".equals(fieldName)) {
+                    title = reader.getString();
+                } else if ("description".equals(fieldName)) {
+                    description = reader.getString();
+                } else {
+                    reader.skipChildren();
+                }
+            }
+            return new ActionGroupItem(id, title, description);
+        });
+    }
+}
diff --git a/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/ButtonContent.java b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/ButtonContent.java
new file mode 100644
index 0000000000000..a548f12070f86
--- /dev/null
+++ b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/ButtonContent.java
@@ -0,0 +1,104 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+// Code generated by Microsoft (R) TypeSpec Code Generator.
+package com.azure.communication.messages.models;
+
+import com.azure.core.annotation.Generated;
+import com.azure.core.annotation.Immutable;
+import com.azure.json.JsonReader;
+import com.azure.json.JsonSerializable;
+import com.azure.json.JsonToken;
+import com.azure.json.JsonWriter;
+import java.io.IOException;
+
+/**
+ * The message content of type Button information.
+ */
+@Immutable
+public final class ButtonContent implements JsonSerializable {
+
+    /*
+     * Unique Id of the button content.
+     */
+    @Generated
+    private final String id;
+
+    /*
+     * Title of the button content.
+     */
+    @Generated
+    private final String title;
+
+    /**
+     * Creates an instance of ButtonContent class.
+     *
+     * @param id the id value to set.
+     * @param title the title value to set.
+     */
+    @Generated
+    public ButtonContent(String id, String title) {
+        this.id = id;
+        this.title = title;
+    }
+
+    /**
+     * Get the id property: Unique Id of the button content.
+     *
+     * @return the id value.
+     */
+    @Generated
+    public String getId() {
+        return this.id;
+    }
+
+    /**
+     * Get the title property: Title of the button content.
+     *
+     * @return the title value.
+     */
+    @Generated
+    public String getTitle() {
+        return this.title;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Generated
+    @Override
+    public JsonWriter toJson(JsonWriter jsonWriter) throws IOException {
+        jsonWriter.writeStartObject();
+        jsonWriter.writeStringField("id", this.id);
+        jsonWriter.writeStringField("title", this.title);
+        return jsonWriter.writeEndObject();
+    }
+
+    /**
+     * Reads an instance of ButtonContent from the JsonReader.
+     *
+     * @param jsonReader The JsonReader being read.
+     * @return An instance of ButtonContent if the JsonReader was pointing to an instance of it, or null if it was
+     * pointing to JSON null.
+     * @throws IllegalStateException If the deserialized JSON object was missing any required properties.
+     * @throws IOException If an error occurs while reading the ButtonContent.
+     */
+    @Generated
+    public static ButtonContent fromJson(JsonReader jsonReader) throws IOException {
+        return jsonReader.readObject(reader -> {
+            String id = null;
+            String title = null;
+            while (reader.nextToken() != JsonToken.END_OBJECT) {
+                String fieldName = reader.getFieldName();
+                reader.nextToken();
+                if ("id".equals(fieldName)) {
+                    id = reader.getString();
+                } else if ("title".equals(fieldName)) {
+                    title = reader.getString();
+                } else {
+                    reader.skipChildren();
+                }
+            }
+            return new ButtonContent(id, title);
+        });
+    }
+}
diff --git a/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/ButtonSetContent.java b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/ButtonSetContent.java
new file mode 100644
index 0000000000000..9e5dfc65ed4c1
--- /dev/null
+++ b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/ButtonSetContent.java
@@ -0,0 +1,106 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+// Code generated by Microsoft (R) TypeSpec Code Generator.
+package com.azure.communication.messages.models;
+
+import com.azure.core.annotation.Generated;
+import com.azure.core.annotation.Immutable;
+import com.azure.json.JsonReader;
+import com.azure.json.JsonToken;
+import com.azure.json.JsonWriter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * The message content of type ButtonSet/ List of buttons information.
+ */
+@Immutable
+public final class ButtonSetContent extends MessageContent {
+
+    /*
+     * Kind of MessageContent.
+     */
+    @Generated
+    private MessageContentKind kind = MessageContentKind.BUTTON_SET;
+
+    /*
+     * Unique Id of the button content.
+     */
+    @Generated
+    private final List buttons;
+
+    /**
+     * Creates an instance of ButtonSetContent class.
+     *
+     * @param buttons the buttons value to set.
+     */
+    @Generated
+    public ButtonSetContent(List buttons) {
+        this.buttons = new ArrayList<>(buttons);
+    }
+
+    /**
+     * Get the kind property: Kind of MessageContent.
+     *
+     * @return the kind value.
+     */
+    @Generated
+    @Override
+    public MessageContentKind getKind() {
+        return this.kind;
+    }
+
+    /**
+     * Get the buttons property: Unique Id of the button content.
+     *
+     * @return the buttons value.
+     */
+    @Generated
+    public List getButtons() {
+        return new ArrayList<>(this.buttons);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Generated
+    @Override
+    public JsonWriter toJson(JsonWriter jsonWriter) throws IOException {
+        jsonWriter.writeStartObject();
+        jsonWriter.writeArrayField("buttons", this.buttons, (writer, element) -> writer.writeJson(element));
+        jsonWriter.writeStringField("kind", this.kind == null ? null : this.kind.toString());
+        return jsonWriter.writeEndObject();
+    }
+
+    /**
+     * Reads an instance of ButtonSetContent from the JsonReader.
+     *
+     * @param jsonReader The JsonReader being read.
+     * @return An instance of ButtonSetContent if the JsonReader was pointing to an instance of it, or null if it was
+     * pointing to JSON null.
+     * @throws IllegalStateException If the deserialized JSON object was missing any required properties.
+     * @throws IOException If an error occurs while reading the ButtonSetContent.
+     */
+    @Generated
+    public static ButtonSetContent fromJson(JsonReader jsonReader) throws IOException {
+        return jsonReader.readObject(reader -> {
+            List buttons = null;
+            MessageContentKind kind = MessageContentKind.BUTTON_SET;
+            while (reader.nextToken() != JsonToken.END_OBJECT) {
+                String fieldName = reader.getFieldName();
+                reader.nextToken();
+                if ("buttons".equals(fieldName)) {
+                    buttons = reader.readArray(reader1 -> ButtonContent.fromJson(reader1));
+                } else if ("kind".equals(fieldName)) {
+                    kind = MessageContentKind.fromString(reader.getString());
+                } else {
+                    reader.skipChildren();
+                }
+            }
+            ButtonSetContent deserializedButtonSetContent = new ButtonSetContent(buttons);
+            deserializedButtonSetContent.kind = kind;
+            return deserializedButtonSetContent;
+        });
+    }
+}
diff --git a/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/CommunicationMessageKind.java b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/CommunicationMessageKind.java
index b07ef3e8bcbf9..6decf5ae41130 100644
--- a/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/CommunicationMessageKind.java
+++ b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/CommunicationMessageKind.java
@@ -85,4 +85,22 @@ public static Collection values() {
     @Generated
     @Deprecated()
     public static final CommunicationMessageKind IMAGE_V0 = fromString("image_v0");
+
+    /**
+     * Sticker message type.
+     */
+    @Generated
+    public static final CommunicationMessageKind STICKER = fromString("sticker");
+
+    /**
+     * Reaction message type.
+     */
+    @Generated
+    public static final CommunicationMessageKind REACTION = fromString("reaction");
+
+    /**
+     * Interactive Actionable message type.
+     */
+    @Generated
+    public static final CommunicationMessageKind INTERACTIVE = fromString("interactive");
 }
diff --git a/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/DocumentMessageContent.java b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/DocumentMessageContent.java
new file mode 100644
index 0000000000000..e0bcd4e1ba484
--- /dev/null
+++ b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/DocumentMessageContent.java
@@ -0,0 +1,104 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+// Code generated by Microsoft (R) TypeSpec Code Generator.
+package com.azure.communication.messages.models;
+
+import com.azure.core.annotation.Generated;
+import com.azure.core.annotation.Immutable;
+import com.azure.json.JsonReader;
+import com.azure.json.JsonToken;
+import com.azure.json.JsonWriter;
+import java.io.IOException;
+
+/**
+ * The message content of type document information.
+ */
+@Immutable
+public final class DocumentMessageContent extends MessageContent {
+
+    /*
+     * Kind of MessageContent.
+     */
+    @Generated
+    private MessageContentKind kind = MessageContentKind.DOCUMENT;
+
+    /*
+     * MediaUri of the media content.
+     */
+    @Generated
+    private final String mediaUrl;
+
+    /**
+     * Creates an instance of DocumentMessageContent class.
+     *
+     * @param mediaUrl the mediaUrl value to set.
+     */
+    @Generated
+    public DocumentMessageContent(String mediaUrl) {
+        this.mediaUrl = mediaUrl;
+    }
+
+    /**
+     * Get the kind property: Kind of MessageContent.
+     *
+     * @return the kind value.
+     */
+    @Generated
+    @Override
+    public MessageContentKind getKind() {
+        return this.kind;
+    }
+
+    /**
+     * Get the mediaUrl property: MediaUri of the media content.
+     *
+     * @return the mediaUrl value.
+     */
+    @Generated
+    public String getMediaUrl() {
+        return this.mediaUrl;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Generated
+    @Override
+    public JsonWriter toJson(JsonWriter jsonWriter) throws IOException {
+        jsonWriter.writeStartObject();
+        jsonWriter.writeStringField("mediaUri", this.mediaUrl);
+        jsonWriter.writeStringField("kind", this.kind == null ? null : this.kind.toString());
+        return jsonWriter.writeEndObject();
+    }
+
+    /**
+     * Reads an instance of DocumentMessageContent from the JsonReader.
+     *
+     * @param jsonReader The JsonReader being read.
+     * @return An instance of DocumentMessageContent if the JsonReader was pointing to an instance of it, or null if it
+     * was pointing to JSON null.
+     * @throws IllegalStateException If the deserialized JSON object was missing any required properties.
+     * @throws IOException If an error occurs while reading the DocumentMessageContent.
+     */
+    @Generated
+    public static DocumentMessageContent fromJson(JsonReader jsonReader) throws IOException {
+        return jsonReader.readObject(reader -> {
+            String mediaUrl = null;
+            MessageContentKind kind = MessageContentKind.DOCUMENT;
+            while (reader.nextToken() != JsonToken.END_OBJECT) {
+                String fieldName = reader.getFieldName();
+                reader.nextToken();
+                if ("mediaUri".equals(fieldName)) {
+                    mediaUrl = reader.getString();
+                } else if ("kind".equals(fieldName)) {
+                    kind = MessageContentKind.fromString(reader.getString());
+                } else {
+                    reader.skipChildren();
+                }
+            }
+            DocumentMessageContent deserializedDocumentMessageContent = new DocumentMessageContent(mediaUrl);
+            deserializedDocumentMessageContent.kind = kind;
+            return deserializedDocumentMessageContent;
+        });
+    }
+}
diff --git a/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/ImageMessageContent.java b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/ImageMessageContent.java
new file mode 100644
index 0000000000000..11a8a50887533
--- /dev/null
+++ b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/ImageMessageContent.java
@@ -0,0 +1,104 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+// Code generated by Microsoft (R) TypeSpec Code Generator.
+package com.azure.communication.messages.models;
+
+import com.azure.core.annotation.Generated;
+import com.azure.core.annotation.Immutable;
+import com.azure.json.JsonReader;
+import com.azure.json.JsonToken;
+import com.azure.json.JsonWriter;
+import java.io.IOException;
+
+/**
+ * The message content of type image information.
+ */
+@Immutable
+public final class ImageMessageContent extends MessageContent {
+
+    /*
+     * Kind of MessageContent.
+     */
+    @Generated
+    private MessageContentKind kind = MessageContentKind.IMAGE;
+
+    /*
+     * MediaUri of the media content.
+     */
+    @Generated
+    private final String mediaUrl;
+
+    /**
+     * Creates an instance of ImageMessageContent class.
+     *
+     * @param mediaUrl the mediaUrl value to set.
+     */
+    @Generated
+    public ImageMessageContent(String mediaUrl) {
+        this.mediaUrl = mediaUrl;
+    }
+
+    /**
+     * Get the kind property: Kind of MessageContent.
+     *
+     * @return the kind value.
+     */
+    @Generated
+    @Override
+    public MessageContentKind getKind() {
+        return this.kind;
+    }
+
+    /**
+     * Get the mediaUrl property: MediaUri of the media content.
+     *
+     * @return the mediaUrl value.
+     */
+    @Generated
+    public String getMediaUrl() {
+        return this.mediaUrl;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Generated
+    @Override
+    public JsonWriter toJson(JsonWriter jsonWriter) throws IOException {
+        jsonWriter.writeStartObject();
+        jsonWriter.writeStringField("mediaUri", this.mediaUrl);
+        jsonWriter.writeStringField("kind", this.kind == null ? null : this.kind.toString());
+        return jsonWriter.writeEndObject();
+    }
+
+    /**
+     * Reads an instance of ImageMessageContent from the JsonReader.
+     *
+     * @param jsonReader The JsonReader being read.
+     * @return An instance of ImageMessageContent if the JsonReader was pointing to an instance of it, or null if it was
+     * pointing to JSON null.
+     * @throws IllegalStateException If the deserialized JSON object was missing any required properties.
+     * @throws IOException If an error occurs while reading the ImageMessageContent.
+     */
+    @Generated
+    public static ImageMessageContent fromJson(JsonReader jsonReader) throws IOException {
+        return jsonReader.readObject(reader -> {
+            String mediaUrl = null;
+            MessageContentKind kind = MessageContentKind.IMAGE;
+            while (reader.nextToken() != JsonToken.END_OBJECT) {
+                String fieldName = reader.getFieldName();
+                reader.nextToken();
+                if ("mediaUri".equals(fieldName)) {
+                    mediaUrl = reader.getString();
+                } else if ("kind".equals(fieldName)) {
+                    kind = MessageContentKind.fromString(reader.getString());
+                } else {
+                    reader.skipChildren();
+                }
+            }
+            ImageMessageContent deserializedImageMessageContent = new ImageMessageContent(mediaUrl);
+            deserializedImageMessageContent.kind = kind;
+            return deserializedImageMessageContent;
+        });
+    }
+}
diff --git a/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/InteractiveMessage.java b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/InteractiveMessage.java
new file mode 100644
index 0000000000000..1a66a31647f13
--- /dev/null
+++ b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/InteractiveMessage.java
@@ -0,0 +1,170 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+// Code generated by Microsoft (R) TypeSpec Code Generator.
+package com.azure.communication.messages.models;
+
+import com.azure.core.annotation.Fluent;
+import com.azure.core.annotation.Generated;
+import com.azure.json.JsonReader;
+import com.azure.json.JsonSerializable;
+import com.azure.json.JsonToken;
+import com.azure.json.JsonWriter;
+import java.io.IOException;
+
+/**
+ * The Interactive message content to which user can read and respond.
+ */
+@Fluent
+public final class InteractiveMessage implements JsonSerializable {
+
+    /*
+     * Gets or Sets Header content. Supports the following types:text, images etc.
+     */
+    @Generated
+    private MessageContent headerProperty;
+
+    /*
+     * Gets or Sets Message body content. Emojis, markdown, and links are supported.
+     */
+    @Generated
+    private final TextMessageContent body;
+
+    /*
+     * Gets or Sets Message footer content. Emojis, markdown, and links are supported.
+     */
+    @Generated
+    private TextMessageContent footer;
+
+    /*
+     * The binding object to get or set Action which describes options user have to respond to message.
+     */
+    @Generated
+    private final ActionBindings action;
+
+    /**
+     * Creates an instance of InteractiveMessage class.
+     *
+     * @param body the body value to set.
+     * @param action the action value to set.
+     */
+    @Generated
+    public InteractiveMessage(TextMessageContent body, ActionBindings action) {
+        this.body = body;
+        this.action = action;
+    }
+
+    /**
+     * Get the body property: Gets or Sets Message body content. Emojis, markdown, and links are supported.
+     *
+     * @return the body value.
+     */
+    @Generated
+    public TextMessageContent getBody() {
+        return this.body;
+    }
+
+    /**
+     * Get the footer property: Gets or Sets Message footer content. Emojis, markdown, and links are supported.
+     *
+     * @return the footer value.
+     */
+    @Generated
+    public TextMessageContent getFooter() {
+        return this.footer;
+    }
+
+    /**
+     * Set the footer property: Gets or Sets Message footer content. Emojis, markdown, and links are supported.
+     *
+     * @param footer the footer value to set.
+     * @return the InteractiveMessage object itself.
+     */
+    @Generated
+    public InteractiveMessage setFooter(TextMessageContent footer) {
+        this.footer = footer;
+        return this;
+    }
+
+    /**
+     * Get the action property: The binding object to get or set Action which describes options user have to respond to
+     * message.
+     *
+     * @return the action value.
+     */
+    @Generated
+    public ActionBindings getAction() {
+        return this.action;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Generated
+    @Override
+    public JsonWriter toJson(JsonWriter jsonWriter) throws IOException {
+        jsonWriter.writeStartObject();
+        jsonWriter.writeJsonField("body", this.body);
+        jsonWriter.writeJsonField("action", this.action);
+        jsonWriter.writeJsonField("header", this.headerProperty);
+        jsonWriter.writeJsonField("footer", this.footer);
+        return jsonWriter.writeEndObject();
+    }
+
+    /**
+     * Reads an instance of InteractiveMessage from the JsonReader.
+     *
+     * @param jsonReader The JsonReader being read.
+     * @return An instance of InteractiveMessage if the JsonReader was pointing to an instance of it, or null if it was
+     * pointing to JSON null.
+     * @throws IllegalStateException If the deserialized JSON object was missing any required properties.
+     * @throws IOException If an error occurs while reading the InteractiveMessage.
+     */
+    @Generated
+    public static InteractiveMessage fromJson(JsonReader jsonReader) throws IOException {
+        return jsonReader.readObject(reader -> {
+            TextMessageContent body = null;
+            ActionBindings action = null;
+            MessageContent headerProperty = null;
+            TextMessageContent footer = null;
+            while (reader.nextToken() != JsonToken.END_OBJECT) {
+                String fieldName = reader.getFieldName();
+                reader.nextToken();
+                if ("body".equals(fieldName)) {
+                    body = TextMessageContent.fromJson(reader);
+                } else if ("action".equals(fieldName)) {
+                    action = ActionBindings.fromJson(reader);
+                } else if ("header".equals(fieldName)) {
+                    headerProperty = MessageContent.fromJson(reader);
+                } else if ("footer".equals(fieldName)) {
+                    footer = TextMessageContent.fromJson(reader);
+                } else {
+                    reader.skipChildren();
+                }
+            }
+            InteractiveMessage deserializedInteractiveMessage = new InteractiveMessage(body, action);
+            deserializedInteractiveMessage.headerProperty = headerProperty;
+            deserializedInteractiveMessage.footer = footer;
+            return deserializedInteractiveMessage;
+        });
+    }
+
+    /**
+     * Get the headerProperty property: Gets or Sets Header content. Supports the following types:text, images etc.
+     *
+     * @return the headerProperty value.
+     */
+    public MessageContent getHeader() {
+        return this.headerProperty;
+    }
+
+    /**
+     * Set the header property: Gets or Sets Header content. Supports the following types:text, images etc.
+     *
+     * @param header the header value to set.
+     * @return the InteractiveMessage object itself.
+     */
+    public InteractiveMessage setHeader(MessageContent header) {
+        this.headerProperty = header;
+        return this;
+    }
+}
diff --git a/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/InteractiveNotificationContent.java b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/InteractiveNotificationContent.java
new file mode 100644
index 0000000000000..728bc397b88b3
--- /dev/null
+++ b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/InteractiveNotificationContent.java
@@ -0,0 +1,118 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+// Code generated by Microsoft (R) TypeSpec Code Generator.
+package com.azure.communication.messages.models;
+
+import com.azure.core.annotation.Generated;
+import com.azure.core.annotation.Immutable;
+import com.azure.json.JsonReader;
+import com.azure.json.JsonToken;
+import com.azure.json.JsonWriter;
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * A request to send an Interactive message notification.
+ */
+@Immutable
+public final class InteractiveNotificationContent extends NotificationContent {
+
+    /*
+     * The type discriminator describing a notification type.
+     */
+    @Generated
+    private CommunicationMessageKind kind = CommunicationMessageKind.INTERACTIVE;
+
+    /*
+     * The interactive message content.
+     */
+    @Generated
+    private final InteractiveMessage interactiveMessage;
+
+    /**
+     * Creates an instance of InteractiveNotificationContent class.
+     *
+     * @param channelRegistrationId the channelRegistrationId value to set.
+     * @param to the to value to set.
+     * @param interactiveMessage the interactiveMessage value to set.
+     */
+    @Generated
+    public InteractiveNotificationContent(String channelRegistrationId, List to,
+        InteractiveMessage interactiveMessage) {
+        super(channelRegistrationId, to);
+        this.interactiveMessage = interactiveMessage;
+    }
+
+    /**
+     * Get the kind property: The type discriminator describing a notification type.
+     *
+     * @return the kind value.
+     */
+    @Generated
+    @Override
+    public CommunicationMessageKind getKind() {
+        return this.kind;
+    }
+
+    /**
+     * Get the interactiveMessage property: The interactive message content.
+     *
+     * @return the interactiveMessage value.
+     */
+    @Generated
+    public InteractiveMessage getInteractiveMessage() {
+        return this.interactiveMessage;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Generated
+    @Override
+    public JsonWriter toJson(JsonWriter jsonWriter) throws IOException {
+        jsonWriter.writeStartObject();
+        jsonWriter.writeStringField("channelRegistrationId", getChannelRegistrationId());
+        jsonWriter.writeArrayField("to", getTo(), (writer, element) -> writer.writeString(element));
+        jsonWriter.writeJsonField("interactiveMessage", this.interactiveMessage);
+        jsonWriter.writeStringField("kind", this.kind == null ? null : this.kind.toString());
+        return jsonWriter.writeEndObject();
+    }
+
+    /**
+     * Reads an instance of InteractiveNotificationContent from the JsonReader.
+     *
+     * @param jsonReader The JsonReader being read.
+     * @return An instance of InteractiveNotificationContent if the JsonReader was pointing to an instance of it, or
+     * null if it was pointing to JSON null.
+     * @throws IllegalStateException If the deserialized JSON object was missing any required properties.
+     * @throws IOException If an error occurs while reading the InteractiveNotificationContent.
+     */
+    @Generated
+    public static InteractiveNotificationContent fromJson(JsonReader jsonReader) throws IOException {
+        return jsonReader.readObject(reader -> {
+            String channelRegistrationId = null;
+            List to = null;
+            InteractiveMessage interactiveMessage = null;
+            CommunicationMessageKind kind = CommunicationMessageKind.INTERACTIVE;
+            while (reader.nextToken() != JsonToken.END_OBJECT) {
+                String fieldName = reader.getFieldName();
+                reader.nextToken();
+                if ("channelRegistrationId".equals(fieldName)) {
+                    channelRegistrationId = reader.getString();
+                } else if ("to".equals(fieldName)) {
+                    to = reader.readArray(reader1 -> reader1.getString());
+                } else if ("interactiveMessage".equals(fieldName)) {
+                    interactiveMessage = InteractiveMessage.fromJson(reader);
+                } else if ("kind".equals(fieldName)) {
+                    kind = CommunicationMessageKind.fromString(reader.getString());
+                } else {
+                    reader.skipChildren();
+                }
+            }
+            InteractiveNotificationContent deserializedInteractiveNotificationContent
+                = new InteractiveNotificationContent(channelRegistrationId, to, interactiveMessage);
+            deserializedInteractiveNotificationContent.kind = kind;
+            return deserializedInteractiveNotificationContent;
+        });
+    }
+}
diff --git a/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/LinkContent.java b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/LinkContent.java
new file mode 100644
index 0000000000000..9d7e2cbff8e63
--- /dev/null
+++ b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/LinkContent.java
@@ -0,0 +1,126 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+// Code generated by Microsoft (R) TypeSpec Code Generator.
+package com.azure.communication.messages.models;
+
+import com.azure.core.annotation.Generated;
+import com.azure.core.annotation.Immutable;
+import com.azure.json.JsonReader;
+import com.azure.json.JsonToken;
+import com.azure.json.JsonWriter;
+import java.io.IOException;
+
+/**
+ * The message content of type Url information.
+ */
+@Immutable
+public final class LinkContent extends MessageContent {
+
+    /*
+     * Kind of MessageContent.
+     */
+    @Generated
+    private MessageContentKind kind = MessageContentKind.URL;
+
+    /*
+     * Title of the url content.
+     */
+    @Generated
+    private final String title;
+
+    /*
+     * The url in the content.
+     */
+    @Generated
+    private final String url;
+
+    /**
+     * Creates an instance of LinkContent class.
+     *
+     * @param title the title value to set.
+     * @param url the url value to set.
+     */
+    @Generated
+    public LinkContent(String title, String url) {
+        this.title = title;
+        this.url = url;
+    }
+
+    /**
+     * Get the kind property: Kind of MessageContent.
+     *
+     * @return the kind value.
+     */
+    @Generated
+    @Override
+    public MessageContentKind getKind() {
+        return this.kind;
+    }
+
+    /**
+     * Get the title property: Title of the url content.
+     *
+     * @return the title value.
+     */
+    @Generated
+    public String getTitle() {
+        return this.title;
+    }
+
+    /**
+     * Get the url property: The url in the content.
+     *
+     * @return the url value.
+     */
+    @Generated
+    public String getUrl() {
+        return this.url;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Generated
+    @Override
+    public JsonWriter toJson(JsonWriter jsonWriter) throws IOException {
+        jsonWriter.writeStartObject();
+        jsonWriter.writeStringField("title", this.title);
+        jsonWriter.writeStringField("url", this.url);
+        jsonWriter.writeStringField("kind", this.kind == null ? null : this.kind.toString());
+        return jsonWriter.writeEndObject();
+    }
+
+    /**
+     * Reads an instance of LinkContent from the JsonReader.
+     *
+     * @param jsonReader The JsonReader being read.
+     * @return An instance of LinkContent if the JsonReader was pointing to an instance of it, or null if it was
+     * pointing to JSON null.
+     * @throws IllegalStateException If the deserialized JSON object was missing any required properties.
+     * @throws IOException If an error occurs while reading the LinkContent.
+     */
+    @Generated
+    public static LinkContent fromJson(JsonReader jsonReader) throws IOException {
+        return jsonReader.readObject(reader -> {
+            String title = null;
+            String url = null;
+            MessageContentKind kind = MessageContentKind.URL;
+            while (reader.nextToken() != JsonToken.END_OBJECT) {
+                String fieldName = reader.getFieldName();
+                reader.nextToken();
+                if ("title".equals(fieldName)) {
+                    title = reader.getString();
+                } else if ("url".equals(fieldName)) {
+                    url = reader.getString();
+                } else if ("kind".equals(fieldName)) {
+                    kind = MessageContentKind.fromString(reader.getString());
+                } else {
+                    reader.skipChildren();
+                }
+            }
+            LinkContent deserializedLinkContent = new LinkContent(title, url);
+            deserializedLinkContent.kind = kind;
+            return deserializedLinkContent;
+        });
+    }
+}
diff --git a/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/MessageActionBindingKind.java b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/MessageActionBindingKind.java
new file mode 100644
index 0000000000000..343f058f887ad
--- /dev/null
+++ b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/MessageActionBindingKind.java
@@ -0,0 +1,63 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+// Code generated by Microsoft (R) TypeSpec Code Generator.
+package com.azure.communication.messages.models;
+
+import com.azure.core.annotation.Generated;
+import com.azure.core.util.ExpandableStringEnum;
+import java.util.Collection;
+
+/**
+ * The Kind of interactive message channel action binding like WhatsAppListAction.
+ */
+public final class MessageActionBindingKind extends ExpandableStringEnum {
+
+    /**
+     * The WhatsApp List action binding kind.
+     */
+    @Generated
+    public static final MessageActionBindingKind WHATS_APP_LIST_ACTION = fromString("whatsAppListAction");
+
+    /**
+     * The WhatsApp Button action binding kind.
+     */
+    @Generated
+    public static final MessageActionBindingKind WHATS_APP_BUTTON_ACTION = fromString("whatsAppButtonAction");
+
+    /**
+     * The WhatsApp Url action binding kind.
+     */
+    @Generated
+    public static final MessageActionBindingKind WHATS_APP_URL_ACTION = fromString("whatsAppUrlAction");
+
+    /**
+     * Creates a new instance of MessageActionBindingKind value.
+     *
+     * @deprecated Use the {@link #fromString(String)} factory method.
+     */
+    @Generated
+    @Deprecated
+    public MessageActionBindingKind() {
+    }
+
+    /**
+     * Creates or finds a MessageActionBindingKind from its string representation.
+     *
+     * @param name a name to look for.
+     * @return the corresponding MessageActionBindingKind.
+     */
+    @Generated
+    public static MessageActionBindingKind fromString(String name) {
+        return fromString(name, MessageActionBindingKind.class);
+    }
+
+    /**
+     * Gets known MessageActionBindingKind values.
+     *
+     * @return known MessageActionBindingKind values.
+     */
+    @Generated
+    public static Collection values() {
+        return values(MessageActionBindingKind.class);
+    }
+}
diff --git a/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/MessageContent.java b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/MessageContent.java
new file mode 100644
index 0000000000000..55eab96b6f6df
--- /dev/null
+++ b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/MessageContent.java
@@ -0,0 +1,101 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+// Code generated by Microsoft (R) TypeSpec Code Generator.
+package com.azure.communication.messages.models;
+
+import com.azure.core.annotation.Generated;
+import com.azure.core.annotation.Immutable;
+import com.azure.json.JsonReader;
+import com.azure.json.JsonSerializable;
+import com.azure.json.JsonToken;
+import com.azure.json.JsonWriter;
+import java.io.IOException;
+
+/**
+ * The message content object used to create interactive messages components.
+ */
+@Immutable
+public abstract class MessageContent implements JsonSerializable {
+
+    /*
+     * Kind of MessageContent.
+     */
+    @Generated
+    private MessageContentKind kind = MessageContentKind.fromString("MessageContent");
+
+    /**
+     * Creates an instance of MessageContent class.
+     */
+    @Generated
+    protected MessageContent() {
+    }
+
+    /**
+     * Get the kind property: Kind of MessageContent.
+     *
+     * @return the kind value.
+     */
+    @Generated
+    public MessageContentKind getKind() {
+        return this.kind;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Generated
+    @Override
+    public JsonWriter toJson(JsonWriter jsonWriter) throws IOException {
+        jsonWriter.writeStartObject();
+        jsonWriter.writeStringField("kind", this.kind == null ? null : this.kind.toString());
+        return jsonWriter.writeEndObject();
+    }
+
+    /**
+     * Reads an instance of MessageContent from the JsonReader.
+     *
+     * @param jsonReader The JsonReader being read.
+     * @return An instance of MessageContent if the JsonReader was pointing to an instance of it, or null if it was
+     * pointing to JSON null.
+     * @throws IllegalStateException If the deserialized JSON object was missing any required properties.
+     * @throws IOException If an error occurs while reading the MessageContent.
+     */
+    @Generated
+    public static MessageContent fromJson(JsonReader jsonReader) throws IOException {
+        return jsonReader.readObject(reader -> {
+            String discriminatorValue = null;
+            try (JsonReader readerToUse = reader.bufferObject()) {
+                // Prepare for reading
+                readerToUse.nextToken();
+                while (readerToUse.nextToken() != JsonToken.END_OBJECT) {
+                    String fieldName = readerToUse.getFieldName();
+                    readerToUse.nextToken();
+                    if ("kind".equals(fieldName)) {
+                        discriminatorValue = readerToUse.getString();
+                        break;
+                    } else {
+                        readerToUse.skipChildren();
+                    }
+                }
+                // Use the discriminator value to determine which subtype should be deserialized.
+                if ("text".equals(discriminatorValue)) {
+                    return TextMessageContent.fromJson(readerToUse.reset());
+                } else if ("document".equals(discriminatorValue)) {
+                    return DocumentMessageContent.fromJson(readerToUse.reset());
+                } else if ("image".equals(discriminatorValue)) {
+                    return ImageMessageContent.fromJson(readerToUse.reset());
+                } else if ("video".equals(discriminatorValue)) {
+                    return VideoMessageContent.fromJson(readerToUse.reset());
+                } else if ("buttonSet".equals(discriminatorValue)) {
+                    return ButtonSetContent.fromJson(readerToUse.reset());
+                } else if ("url".equals(discriminatorValue)) {
+                    return LinkContent.fromJson(readerToUse.reset());
+                } else if ("group".equals(discriminatorValue)) {
+                    return ActionGroupContent.fromJson(readerToUse.reset());
+                } else {
+                    throw new IllegalStateException("Invalid Kind value - " + discriminatorValue);
+                }
+            }
+        });
+    }
+}
diff --git a/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/MessageContentKind.java b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/MessageContentKind.java
new file mode 100644
index 0000000000000..763a4efb1cff4
--- /dev/null
+++ b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/MessageContentKind.java
@@ -0,0 +1,87 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+// Code generated by Microsoft (R) TypeSpec Code Generator.
+package com.azure.communication.messages.models;
+
+import com.azure.core.annotation.Generated;
+import com.azure.core.util.ExpandableStringEnum;
+import java.util.Collection;
+
+/**
+ * The kind of Interactive message content.
+ */
+public final class MessageContentKind extends ExpandableStringEnum {
+
+    /**
+     * The text content type.
+     */
+    @Generated
+    public static final MessageContentKind TEXT = fromString("text");
+
+    /**
+     * The image content type.
+     */
+    @Generated
+    public static final MessageContentKind IMAGE = fromString("image");
+
+    /**
+     * The video content type.
+     */
+    @Generated
+    public static final MessageContentKind VIDEO = fromString("video");
+
+    /**
+     * The document content type.
+     */
+    @Generated
+    public static final MessageContentKind DOCUMENT = fromString("document");
+
+    /**
+     * The ActionSet content type.
+     */
+    @Generated
+    public static final MessageContentKind GROUP = fromString("group");
+
+    /**
+     * The ButtonSet content type.
+     */
+    @Generated
+    public static final MessageContentKind BUTTON_SET = fromString("buttonSet");
+
+    /**
+     * The Url content type.
+     */
+    @Generated
+    public static final MessageContentKind URL = fromString("url");
+
+    /**
+     * Creates a new instance of MessageContentKind value.
+     *
+     * @deprecated Use the {@link #fromString(String)} factory method.
+     */
+    @Generated
+    @Deprecated
+    public MessageContentKind() {
+    }
+
+    /**
+     * Creates or finds a MessageContentKind from its string representation.
+     *
+     * @param name a name to look for.
+     * @return the corresponding MessageContentKind.
+     */
+    @Generated
+    public static MessageContentKind fromString(String name) {
+        return fromString(name, MessageContentKind.class);
+    }
+
+    /**
+     * Gets known MessageContentKind values.
+     *
+     * @return known MessageContentKind values.
+     */
+    @Generated
+    public static Collection values() {
+        return values(MessageContentKind.class);
+    }
+}
diff --git a/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/NotificationContent.java b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/NotificationContent.java
index cd28761960e12..7f082a0b79387 100644
--- a/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/NotificationContent.java
+++ b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/NotificationContent.java
@@ -130,6 +130,12 @@ public static NotificationContent fromJson(JsonReader jsonReader) throws IOExcep
                     return VideoNotificationContent.fromJson(readerToUse.reset());
                 } else if ("audio".equals(discriminatorValue)) {
                     return AudioNotificationContent.fromJson(readerToUse.reset());
+                } else if ("reaction".equals(discriminatorValue)) {
+                    return ReactionNotificationContent.fromJson(readerToUse.reset());
+                } else if ("sticker".equals(discriminatorValue)) {
+                    return StickerNotificationContent.fromJson(readerToUse.reset());
+                } else if ("interactive".equals(discriminatorValue)) {
+                    return InteractiveNotificationContent.fromJson(readerToUse.reset());
                 } else if ("template".equals(discriminatorValue)) {
                     return TemplateNotificationContent.fromJson(readerToUse.reset());
                 } else {
diff --git a/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/ReactionNotificationContent.java b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/ReactionNotificationContent.java
new file mode 100644
index 0000000000000..99f5ec1bae198
--- /dev/null
+++ b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/ReactionNotificationContent.java
@@ -0,0 +1,139 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+// Code generated by Microsoft (R) TypeSpec Code Generator.
+package com.azure.communication.messages.models;
+
+import com.azure.core.annotation.Generated;
+import com.azure.core.annotation.Immutable;
+import com.azure.json.JsonReader;
+import com.azure.json.JsonToken;
+import com.azure.json.JsonWriter;
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * A request to send a Reaction notification.
+ */
+@Immutable
+public final class ReactionNotificationContent extends NotificationContent {
+
+    /*
+     * The type discriminator describing a notification type.
+     */
+    @Generated
+    private CommunicationMessageKind kind = CommunicationMessageKind.REACTION;
+
+    /*
+     * emoji content like \uD83D\uDE00.
+     */
+    @Generated
+    private final String emoji;
+
+    /*
+     * ID of the previous message you want to reply to.
+     */
+    @Generated
+    private final String messageId;
+
+    /**
+     * Creates an instance of ReactionNotificationContent class.
+     *
+     * @param channelRegistrationId the channelRegistrationId value to set.
+     * @param to the to value to set.
+     * @param emoji the emoji value to set.
+     * @param messageId the messageId value to set.
+     */
+    @Generated
+    public ReactionNotificationContent(String channelRegistrationId, List to, String emoji, String messageId) {
+        super(channelRegistrationId, to);
+        this.emoji = emoji;
+        this.messageId = messageId;
+    }
+
+    /**
+     * Get the kind property: The type discriminator describing a notification type.
+     *
+     * @return the kind value.
+     */
+    @Generated
+    @Override
+    public CommunicationMessageKind getKind() {
+        return this.kind;
+    }
+
+    /**
+     * Get the emoji property: emoji content like \uD83D\uDE00.
+     *
+     * @return the emoji value.
+     */
+    @Generated
+    public String getEmoji() {
+        return this.emoji;
+    }
+
+    /**
+     * Get the messageId property: ID of the previous message you want to reply to.
+     *
+     * @return the messageId value.
+     */
+    @Generated
+    public String getMessageId() {
+        return this.messageId;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Generated
+    @Override
+    public JsonWriter toJson(JsonWriter jsonWriter) throws IOException {
+        jsonWriter.writeStartObject();
+        jsonWriter.writeStringField("channelRegistrationId", getChannelRegistrationId());
+        jsonWriter.writeArrayField("to", getTo(), (writer, element) -> writer.writeString(element));
+        jsonWriter.writeStringField("emoji", this.emoji);
+        jsonWriter.writeStringField("messageId", this.messageId);
+        jsonWriter.writeStringField("kind", this.kind == null ? null : this.kind.toString());
+        return jsonWriter.writeEndObject();
+    }
+
+    /**
+     * Reads an instance of ReactionNotificationContent from the JsonReader.
+     *
+     * @param jsonReader The JsonReader being read.
+     * @return An instance of ReactionNotificationContent if the JsonReader was pointing to an instance of it, or null
+     * if it was pointing to JSON null.
+     * @throws IllegalStateException If the deserialized JSON object was missing any required properties.
+     * @throws IOException If an error occurs while reading the ReactionNotificationContent.
+     */
+    @Generated
+    public static ReactionNotificationContent fromJson(JsonReader jsonReader) throws IOException {
+        return jsonReader.readObject(reader -> {
+            String channelRegistrationId = null;
+            List to = null;
+            String emoji = null;
+            String messageId = null;
+            CommunicationMessageKind kind = CommunicationMessageKind.REACTION;
+            while (reader.nextToken() != JsonToken.END_OBJECT) {
+                String fieldName = reader.getFieldName();
+                reader.nextToken();
+                if ("channelRegistrationId".equals(fieldName)) {
+                    channelRegistrationId = reader.getString();
+                } else if ("to".equals(fieldName)) {
+                    to = reader.readArray(reader1 -> reader1.getString());
+                } else if ("emoji".equals(fieldName)) {
+                    emoji = reader.getString();
+                } else if ("messageId".equals(fieldName)) {
+                    messageId = reader.getString();
+                } else if ("kind".equals(fieldName)) {
+                    kind = CommunicationMessageKind.fromString(reader.getString());
+                } else {
+                    reader.skipChildren();
+                }
+            }
+            ReactionNotificationContent deserializedReactionNotificationContent
+                = new ReactionNotificationContent(channelRegistrationId, to, emoji, messageId);
+            deserializedReactionNotificationContent.kind = kind;
+            return deserializedReactionNotificationContent;
+        });
+    }
+}
diff --git a/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/StickerNotificationContent.java b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/StickerNotificationContent.java
new file mode 100644
index 0000000000000..d404b4eb3fb71
--- /dev/null
+++ b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/StickerNotificationContent.java
@@ -0,0 +1,118 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+// Code generated by Microsoft (R) TypeSpec Code Generator.
+package com.azure.communication.messages.models;
+
+import com.azure.core.annotation.Generated;
+import com.azure.core.annotation.Immutable;
+import com.azure.json.JsonReader;
+import com.azure.json.JsonToken;
+import com.azure.json.JsonWriter;
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * A request to send a Sticker notification.
+ */
+@Immutable
+public final class StickerNotificationContent extends NotificationContent {
+
+    /*
+     * The type discriminator describing a notification type.
+     */
+    @Generated
+    private CommunicationMessageKind kind = CommunicationMessageKind.STICKER;
+
+    /*
+     * A media url for the file. Required if the type is one of the supported media types, e.g. image
+     */
+    @Generated
+    private final String mediaUrl;
+
+    /**
+     * Creates an instance of StickerNotificationContent class.
+     *
+     * @param channelRegistrationId the channelRegistrationId value to set.
+     * @param to the to value to set.
+     * @param mediaUrl the mediaUrl value to set.
+     */
+    @Generated
+    public StickerNotificationContent(String channelRegistrationId, List to, String mediaUrl) {
+        super(channelRegistrationId, to);
+        this.mediaUrl = mediaUrl;
+    }
+
+    /**
+     * Get the kind property: The type discriminator describing a notification type.
+     *
+     * @return the kind value.
+     */
+    @Generated
+    @Override
+    public CommunicationMessageKind getKind() {
+        return this.kind;
+    }
+
+    /**
+     * Get the mediaUrl property: A media url for the file. Required if the type is one of the supported media types,
+     * e.g. image.
+     *
+     * @return the mediaUrl value.
+     */
+    @Generated
+    public String getMediaUrl() {
+        return this.mediaUrl;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Generated
+    @Override
+    public JsonWriter toJson(JsonWriter jsonWriter) throws IOException {
+        jsonWriter.writeStartObject();
+        jsonWriter.writeStringField("channelRegistrationId", getChannelRegistrationId());
+        jsonWriter.writeArrayField("to", getTo(), (writer, element) -> writer.writeString(element));
+        jsonWriter.writeStringField("mediaUri", this.mediaUrl);
+        jsonWriter.writeStringField("kind", this.kind == null ? null : this.kind.toString());
+        return jsonWriter.writeEndObject();
+    }
+
+    /**
+     * Reads an instance of StickerNotificationContent from the JsonReader.
+     *
+     * @param jsonReader The JsonReader being read.
+     * @return An instance of StickerNotificationContent if the JsonReader was pointing to an instance of it, or null if
+     * it was pointing to JSON null.
+     * @throws IllegalStateException If the deserialized JSON object was missing any required properties.
+     * @throws IOException If an error occurs while reading the StickerNotificationContent.
+     */
+    @Generated
+    public static StickerNotificationContent fromJson(JsonReader jsonReader) throws IOException {
+        return jsonReader.readObject(reader -> {
+            String channelRegistrationId = null;
+            List to = null;
+            String mediaUrl = null;
+            CommunicationMessageKind kind = CommunicationMessageKind.STICKER;
+            while (reader.nextToken() != JsonToken.END_OBJECT) {
+                String fieldName = reader.getFieldName();
+                reader.nextToken();
+                if ("channelRegistrationId".equals(fieldName)) {
+                    channelRegistrationId = reader.getString();
+                } else if ("to".equals(fieldName)) {
+                    to = reader.readArray(reader1 -> reader1.getString());
+                } else if ("mediaUri".equals(fieldName)) {
+                    mediaUrl = reader.getString();
+                } else if ("kind".equals(fieldName)) {
+                    kind = CommunicationMessageKind.fromString(reader.getString());
+                } else {
+                    reader.skipChildren();
+                }
+            }
+            StickerNotificationContent deserializedStickerNotificationContent
+                = new StickerNotificationContent(channelRegistrationId, to, mediaUrl);
+            deserializedStickerNotificationContent.kind = kind;
+            return deserializedStickerNotificationContent;
+        });
+    }
+}
diff --git a/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/TextMessageContent.java b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/TextMessageContent.java
new file mode 100644
index 0000000000000..31dbc6fc15a7d
--- /dev/null
+++ b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/TextMessageContent.java
@@ -0,0 +1,104 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+// Code generated by Microsoft (R) TypeSpec Code Generator.
+package com.azure.communication.messages.models;
+
+import com.azure.core.annotation.Generated;
+import com.azure.core.annotation.Immutable;
+import com.azure.json.JsonReader;
+import com.azure.json.JsonToken;
+import com.azure.json.JsonWriter;
+import java.io.IOException;
+
+/**
+ * The message content of type text information.
+ */
+@Immutable
+public final class TextMessageContent extends MessageContent {
+
+    /*
+     * Kind of MessageContent.
+     */
+    @Generated
+    private MessageContentKind kind = MessageContentKind.TEXT;
+
+    /*
+     * The text value.
+     */
+    @Generated
+    private final String text;
+
+    /**
+     * Creates an instance of TextMessageContent class.
+     *
+     * @param text the text value to set.
+     */
+    @Generated
+    public TextMessageContent(String text) {
+        this.text = text;
+    }
+
+    /**
+     * Get the kind property: Kind of MessageContent.
+     *
+     * @return the kind value.
+     */
+    @Generated
+    @Override
+    public MessageContentKind getKind() {
+        return this.kind;
+    }
+
+    /**
+     * Get the text property: The text value.
+     *
+     * @return the text value.
+     */
+    @Generated
+    public String getText() {
+        return this.text;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Generated
+    @Override
+    public JsonWriter toJson(JsonWriter jsonWriter) throws IOException {
+        jsonWriter.writeStartObject();
+        jsonWriter.writeStringField("text", this.text);
+        jsonWriter.writeStringField("kind", this.kind == null ? null : this.kind.toString());
+        return jsonWriter.writeEndObject();
+    }
+
+    /**
+     * Reads an instance of TextMessageContent from the JsonReader.
+     *
+     * @param jsonReader The JsonReader being read.
+     * @return An instance of TextMessageContent if the JsonReader was pointing to an instance of it, or null if it was
+     * pointing to JSON null.
+     * @throws IllegalStateException If the deserialized JSON object was missing any required properties.
+     * @throws IOException If an error occurs while reading the TextMessageContent.
+     */
+    @Generated
+    public static TextMessageContent fromJson(JsonReader jsonReader) throws IOException {
+        return jsonReader.readObject(reader -> {
+            String text = null;
+            MessageContentKind kind = MessageContentKind.TEXT;
+            while (reader.nextToken() != JsonToken.END_OBJECT) {
+                String fieldName = reader.getFieldName();
+                reader.nextToken();
+                if ("text".equals(fieldName)) {
+                    text = reader.getString();
+                } else if ("kind".equals(fieldName)) {
+                    kind = MessageContentKind.fromString(reader.getString());
+                } else {
+                    reader.skipChildren();
+                }
+            }
+            TextMessageContent deserializedTextMessageContent = new TextMessageContent(text);
+            deserializedTextMessageContent.kind = kind;
+            return deserializedTextMessageContent;
+        });
+    }
+}
diff --git a/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/VideoMessageContent.java b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/VideoMessageContent.java
new file mode 100644
index 0000000000000..736d485818892
--- /dev/null
+++ b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/VideoMessageContent.java
@@ -0,0 +1,104 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+// Code generated by Microsoft (R) TypeSpec Code Generator.
+package com.azure.communication.messages.models;
+
+import com.azure.core.annotation.Generated;
+import com.azure.core.annotation.Immutable;
+import com.azure.json.JsonReader;
+import com.azure.json.JsonToken;
+import com.azure.json.JsonWriter;
+import java.io.IOException;
+
+/**
+ * The message content of type video information.
+ */
+@Immutable
+public final class VideoMessageContent extends MessageContent {
+
+    /*
+     * Kind of MessageContent.
+     */
+    @Generated
+    private MessageContentKind kind = MessageContentKind.VIDEO;
+
+    /*
+     * MediaUri of the media content.
+     */
+    @Generated
+    private final String mediaUrl;
+
+    /**
+     * Creates an instance of VideoMessageContent class.
+     *
+     * @param mediaUrl the mediaUrl value to set.
+     */
+    @Generated
+    public VideoMessageContent(String mediaUrl) {
+        this.mediaUrl = mediaUrl;
+    }
+
+    /**
+     * Get the kind property: Kind of MessageContent.
+     *
+     * @return the kind value.
+     */
+    @Generated
+    @Override
+    public MessageContentKind getKind() {
+        return this.kind;
+    }
+
+    /**
+     * Get the mediaUrl property: MediaUri of the media content.
+     *
+     * @return the mediaUrl value.
+     */
+    @Generated
+    public String getMediaUrl() {
+        return this.mediaUrl;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Generated
+    @Override
+    public JsonWriter toJson(JsonWriter jsonWriter) throws IOException {
+        jsonWriter.writeStartObject();
+        jsonWriter.writeStringField("mediaUri", this.mediaUrl);
+        jsonWriter.writeStringField("kind", this.kind == null ? null : this.kind.toString());
+        return jsonWriter.writeEndObject();
+    }
+
+    /**
+     * Reads an instance of VideoMessageContent from the JsonReader.
+     *
+     * @param jsonReader The JsonReader being read.
+     * @return An instance of VideoMessageContent if the JsonReader was pointing to an instance of it, or null if it was
+     * pointing to JSON null.
+     * @throws IllegalStateException If the deserialized JSON object was missing any required properties.
+     * @throws IOException If an error occurs while reading the VideoMessageContent.
+     */
+    @Generated
+    public static VideoMessageContent fromJson(JsonReader jsonReader) throws IOException {
+        return jsonReader.readObject(reader -> {
+            String mediaUrl = null;
+            MessageContentKind kind = MessageContentKind.VIDEO;
+            while (reader.nextToken() != JsonToken.END_OBJECT) {
+                String fieldName = reader.getFieldName();
+                reader.nextToken();
+                if ("mediaUri".equals(fieldName)) {
+                    mediaUrl = reader.getString();
+                } else if ("kind".equals(fieldName)) {
+                    kind = MessageContentKind.fromString(reader.getString());
+                } else {
+                    reader.skipChildren();
+                }
+            }
+            VideoMessageContent deserializedVideoMessageContent = new VideoMessageContent(mediaUrl);
+            deserializedVideoMessageContent.kind = kind;
+            return deserializedVideoMessageContent;
+        });
+    }
+}
diff --git a/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/channels/WhatsAppButtonActionBindings.java b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/channels/WhatsAppButtonActionBindings.java
new file mode 100644
index 0000000000000..ede678fd1e871
--- /dev/null
+++ b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/channels/WhatsAppButtonActionBindings.java
@@ -0,0 +1,108 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+// Code generated by Microsoft (R) TypeSpec Code Generator.
+package com.azure.communication.messages.models.channels;
+
+import com.azure.communication.messages.models.ActionBindings;
+import com.azure.communication.messages.models.ButtonSetContent;
+import com.azure.communication.messages.models.MessageActionBindingKind;
+import com.azure.core.annotation.Generated;
+import com.azure.core.annotation.Immutable;
+import com.azure.json.JsonReader;
+import com.azure.json.JsonToken;
+import com.azure.json.JsonWriter;
+import java.io.IOException;
+
+/**
+ * WhatsApp Binding actions to the interactive message.
+ */
+@Immutable
+public final class WhatsAppButtonActionBindings extends ActionBindings {
+
+    /*
+     * Kind of the MessageActionBinding.
+     */
+    @Generated
+    private MessageActionBindingKind kind = MessageActionBindingKind.WHATS_APP_BUTTON_ACTION;
+
+    /*
+     * Action content of Interactive message.
+     */
+    @Generated
+    private final ButtonSetContent content;
+
+    /**
+     * Creates an instance of WhatsAppButtonActionBindings class.
+     *
+     * @param content the content value to set.
+     */
+    @Generated
+    public WhatsAppButtonActionBindings(ButtonSetContent content) {
+        this.content = content;
+    }
+
+    /**
+     * Get the kind property: Kind of the MessageActionBinding.
+     *
+     * @return the kind value.
+     */
+    @Generated
+    @Override
+    public MessageActionBindingKind getKind() {
+        return this.kind;
+    }
+
+    /**
+     * Get the content property: Action content of Interactive message.
+     *
+     * @return the content value.
+     */
+    @Generated
+    public ButtonSetContent getContent() {
+        return this.content;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Generated
+    @Override
+    public JsonWriter toJson(JsonWriter jsonWriter) throws IOException {
+        jsonWriter.writeStartObject();
+        jsonWriter.writeJsonField("content", this.content);
+        jsonWriter.writeStringField("kind", this.kind == null ? null : this.kind.toString());
+        return jsonWriter.writeEndObject();
+    }
+
+    /**
+     * Reads an instance of WhatsAppButtonActionBindings from the JsonReader.
+     *
+     * @param jsonReader The JsonReader being read.
+     * @return An instance of WhatsAppButtonActionBindings if the JsonReader was pointing to an instance of it, or null
+     * if it was pointing to JSON null.
+     * @throws IllegalStateException If the deserialized JSON object was missing any required properties.
+     * @throws IOException If an error occurs while reading the WhatsAppButtonActionBindings.
+     */
+    @Generated
+    public static WhatsAppButtonActionBindings fromJson(JsonReader jsonReader) throws IOException {
+        return jsonReader.readObject(reader -> {
+            ButtonSetContent content = null;
+            MessageActionBindingKind kind = MessageActionBindingKind.WHATS_APP_BUTTON_ACTION;
+            while (reader.nextToken() != JsonToken.END_OBJECT) {
+                String fieldName = reader.getFieldName();
+                reader.nextToken();
+                if ("content".equals(fieldName)) {
+                    content = ButtonSetContent.fromJson(reader);
+                } else if ("kind".equals(fieldName)) {
+                    kind = MessageActionBindingKind.fromString(reader.getString());
+                } else {
+                    reader.skipChildren();
+                }
+            }
+            WhatsAppButtonActionBindings deserializedWhatsAppButtonActionBindings
+                = new WhatsAppButtonActionBindings(content);
+            deserializedWhatsAppButtonActionBindings.kind = kind;
+            return deserializedWhatsAppButtonActionBindings;
+        });
+    }
+}
diff --git a/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/channels/WhatsAppListActionBindings.java b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/channels/WhatsAppListActionBindings.java
new file mode 100644
index 0000000000000..37c144bdb88a4
--- /dev/null
+++ b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/channels/WhatsAppListActionBindings.java
@@ -0,0 +1,107 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+// Code generated by Microsoft (R) TypeSpec Code Generator.
+package com.azure.communication.messages.models.channels;
+
+import com.azure.communication.messages.models.ActionBindings;
+import com.azure.communication.messages.models.ActionGroupContent;
+import com.azure.communication.messages.models.MessageActionBindingKind;
+import com.azure.core.annotation.Generated;
+import com.azure.core.annotation.Immutable;
+import com.azure.json.JsonReader;
+import com.azure.json.JsonToken;
+import com.azure.json.JsonWriter;
+import java.io.IOException;
+
+/**
+ * WhatsApp List Binding actions to the interactive message.
+ */
+@Immutable
+public final class WhatsAppListActionBindings extends ActionBindings {
+
+    /*
+     * Kind of the MessageActionBinding.
+     */
+    @Generated
+    private MessageActionBindingKind kind = MessageActionBindingKind.WHATS_APP_LIST_ACTION;
+
+    /*
+     * Action content of Interactive message.
+     */
+    @Generated
+    private final ActionGroupContent content;
+
+    /**
+     * Creates an instance of WhatsAppListActionBindings class.
+     *
+     * @param content the content value to set.
+     */
+    @Generated
+    public WhatsAppListActionBindings(ActionGroupContent content) {
+        this.content = content;
+    }
+
+    /**
+     * Get the kind property: Kind of the MessageActionBinding.
+     *
+     * @return the kind value.
+     */
+    @Generated
+    @Override
+    public MessageActionBindingKind getKind() {
+        return this.kind;
+    }
+
+    /**
+     * Get the content property: Action content of Interactive message.
+     *
+     * @return the content value.
+     */
+    @Generated
+    public ActionGroupContent getContent() {
+        return this.content;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Generated
+    @Override
+    public JsonWriter toJson(JsonWriter jsonWriter) throws IOException {
+        jsonWriter.writeStartObject();
+        jsonWriter.writeJsonField("content", this.content);
+        jsonWriter.writeStringField("kind", this.kind == null ? null : this.kind.toString());
+        return jsonWriter.writeEndObject();
+    }
+
+    /**
+     * Reads an instance of WhatsAppListActionBindings from the JsonReader.
+     *
+     * @param jsonReader The JsonReader being read.
+     * @return An instance of WhatsAppListActionBindings if the JsonReader was pointing to an instance of it, or null if
+     * it was pointing to JSON null.
+     * @throws IllegalStateException If the deserialized JSON object was missing any required properties.
+     * @throws IOException If an error occurs while reading the WhatsAppListActionBindings.
+     */
+    @Generated
+    public static WhatsAppListActionBindings fromJson(JsonReader jsonReader) throws IOException {
+        return jsonReader.readObject(reader -> {
+            ActionGroupContent content = null;
+            MessageActionBindingKind kind = MessageActionBindingKind.WHATS_APP_LIST_ACTION;
+            while (reader.nextToken() != JsonToken.END_OBJECT) {
+                String fieldName = reader.getFieldName();
+                reader.nextToken();
+                if ("content".equals(fieldName)) {
+                    content = ActionGroupContent.fromJson(reader);
+                } else if ("kind".equals(fieldName)) {
+                    kind = MessageActionBindingKind.fromString(reader.getString());
+                } else {
+                    reader.skipChildren();
+                }
+            }
+            WhatsAppListActionBindings deserializedWhatsAppListActionBindings = new WhatsAppListActionBindings(content);
+            deserializedWhatsAppListActionBindings.kind = kind;
+            return deserializedWhatsAppListActionBindings;
+        });
+    }
+}
diff --git a/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/channels/WhatsAppUrlActionBindings.java b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/channels/WhatsAppUrlActionBindings.java
new file mode 100644
index 0000000000000..2541539415992
--- /dev/null
+++ b/sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/models/channels/WhatsAppUrlActionBindings.java
@@ -0,0 +1,107 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+// Code generated by Microsoft (R) TypeSpec Code Generator.
+package com.azure.communication.messages.models.channels;
+
+import com.azure.communication.messages.models.ActionBindings;
+import com.azure.communication.messages.models.LinkContent;
+import com.azure.communication.messages.models.MessageActionBindingKind;
+import com.azure.core.annotation.Generated;
+import com.azure.core.annotation.Immutable;
+import com.azure.json.JsonReader;
+import com.azure.json.JsonToken;
+import com.azure.json.JsonWriter;
+import java.io.IOException;
+
+/**
+ * WhatsApp Binding actions to the interactive message.
+ */
+@Immutable
+public final class WhatsAppUrlActionBindings extends ActionBindings {
+
+    /*
+     * Kind of the MessageActionBinding.
+     */
+    @Generated
+    private MessageActionBindingKind kind = MessageActionBindingKind.WHATS_APP_URL_ACTION;
+
+    /*
+     * Action content of Interactive message.
+     */
+    @Generated
+    private final LinkContent content;
+
+    /**
+     * Creates an instance of WhatsAppUrlActionBindings class.
+     *
+     * @param content the content value to set.
+     */
+    @Generated
+    public WhatsAppUrlActionBindings(LinkContent content) {
+        this.content = content;
+    }
+
+    /**
+     * Get the kind property: Kind of the MessageActionBinding.
+     *
+     * @return the kind value.
+     */
+    @Generated
+    @Override
+    public MessageActionBindingKind getKind() {
+        return this.kind;
+    }
+
+    /**
+     * Get the content property: Action content of Interactive message.
+     *
+     * @return the content value.
+     */
+    @Generated
+    public LinkContent getContent() {
+        return this.content;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Generated
+    @Override
+    public JsonWriter toJson(JsonWriter jsonWriter) throws IOException {
+        jsonWriter.writeStartObject();
+        jsonWriter.writeJsonField("content", this.content);
+        jsonWriter.writeStringField("kind", this.kind == null ? null : this.kind.toString());
+        return jsonWriter.writeEndObject();
+    }
+
+    /**
+     * Reads an instance of WhatsAppUrlActionBindings from the JsonReader.
+     *
+     * @param jsonReader The JsonReader being read.
+     * @return An instance of WhatsAppUrlActionBindings if the JsonReader was pointing to an instance of it, or null if
+     * it was pointing to JSON null.
+     * @throws IllegalStateException If the deserialized JSON object was missing any required properties.
+     * @throws IOException If an error occurs while reading the WhatsAppUrlActionBindings.
+     */
+    @Generated
+    public static WhatsAppUrlActionBindings fromJson(JsonReader jsonReader) throws IOException {
+        return jsonReader.readObject(reader -> {
+            LinkContent content = null;
+            MessageActionBindingKind kind = MessageActionBindingKind.WHATS_APP_URL_ACTION;
+            while (reader.nextToken() != JsonToken.END_OBJECT) {
+                String fieldName = reader.getFieldName();
+                reader.nextToken();
+                if ("content".equals(fieldName)) {
+                    content = LinkContent.fromJson(reader);
+                } else if ("kind".equals(fieldName)) {
+                    kind = MessageActionBindingKind.fromString(reader.getString());
+                } else {
+                    reader.skipChildren();
+                }
+            }
+            WhatsAppUrlActionBindings deserializedWhatsAppUrlActionBindings = new WhatsAppUrlActionBindings(content);
+            deserializedWhatsAppUrlActionBindings.kind = kind;
+            return deserializedWhatsAppUrlActionBindings;
+        });
+    }
+}
diff --git a/sdk/communication/azure-communication-messages/src/main/resources/META-INF/azure-communication-messages_apiview_properties.json b/sdk/communication/azure-communication-messages/src/main/resources/META-INF/azure-communication-messages_apiview_properties.json
index 47302ac76e22f..2e3d0e8156de2 100644
--- a/sdk/communication/azure-communication-messages/src/main/resources/META-INF/azure-communication-messages_apiview_properties.json
+++ b/sdk/communication/azure-communication-messages/src/main/resources/META-INF/azure-communication-messages_apiview_properties.json
@@ -17,12 +17,26 @@
     "com.azure.communication.messages.NotificationMessagesClient.send": "Azure.Communication.MessagesService.NotificationMessagesClient.send",
     "com.azure.communication.messages.NotificationMessagesClient.sendWithResponse": "Azure.Communication.MessagesService.NotificationMessagesClient.send",
     "com.azure.communication.messages.NotificationMessagesClientBuilder": "ClientForAcsMessages.NotificationMessagesClient",
+    "com.azure.communication.messages.models.ActionBindings": "Azure.Communication.MessagesService.ActionBindings",
+    "com.azure.communication.messages.models.ActionGroup": "Azure.Communication.MessagesService.ActionGroup",
+    "com.azure.communication.messages.models.ActionGroupContent": "Azure.Communication.MessagesService.ActionGroupContent",
+    "com.azure.communication.messages.models.ActionGroupItem": "Azure.Communication.MessagesService.ActionGroupItem",
     "com.azure.communication.messages.models.AudioNotificationContent": "Azure.Communication.MessagesService.AudioNotificationContent",
+    "com.azure.communication.messages.models.ButtonContent": "Azure.Communication.MessagesService.ButtonContent",
+    "com.azure.communication.messages.models.ButtonSetContent": "Azure.Communication.MessagesService.ButtonSetContent",
     "com.azure.communication.messages.models.CommunicationMessageKind": "Azure.Communication.MessagesService.CommunicationMessageKind",
     "com.azure.communication.messages.models.CommunicationMessagesChannel": "Azure.Communication.MessagesService.CommunicationMessagesChannel",
+    "com.azure.communication.messages.models.DocumentMessageContent": "Azure.Communication.MessagesService.DocumentMessageContent",
     "com.azure.communication.messages.models.DocumentNotificationContent": "Azure.Communication.MessagesService.DocumentNotificationContent",
+    "com.azure.communication.messages.models.ImageMessageContent": "Azure.Communication.MessagesService.ImageMessageContent",
     "com.azure.communication.messages.models.ImageNotificationContent": "Azure.Communication.MessagesService.ImageNotificationContent",
+    "com.azure.communication.messages.models.InteractiveMessage": "Azure.Communication.MessagesService.InteractiveMessage",
+    "com.azure.communication.messages.models.InteractiveNotificationContent": "Azure.Communication.MessagesService.InteractiveNotificationContent",
+    "com.azure.communication.messages.models.LinkContent": "Azure.Communication.MessagesService.LinkContent",
     "com.azure.communication.messages.models.MediaNotificationContent": "Azure.Communication.MessagesService.MediaNotificationContent",
+    "com.azure.communication.messages.models.MessageActionBindingKind": "Azure.Communication.MessagesService.MessageActionBindingKind",
+    "com.azure.communication.messages.models.MessageContent": "Azure.Communication.MessagesService.MessageContent",
+    "com.azure.communication.messages.models.MessageContentKind": "Azure.Communication.MessagesService.MessageContentKind",
     "com.azure.communication.messages.models.MessageReceipt": "Azure.Communication.MessagesService.MessageReceipt",
     "com.azure.communication.messages.models.MessageTemplate": "Azure.Communication.MessagesService.MessageTemplate",
     "com.azure.communication.messages.models.MessageTemplateBindings": "Azure.Communication.MessagesService.MessageTemplateBindings",
@@ -38,14 +52,21 @@
     "com.azure.communication.messages.models.MessageTemplateValueKind": "Azure.Communication.MessagesService.MessageTemplateValueKind",
     "com.azure.communication.messages.models.MessageTemplateVideo": "Azure.Communication.MessagesService.MessageTemplateVideo",
     "com.azure.communication.messages.models.NotificationContent": "Azure.Communication.MessagesService.NotificationContent",
+    "com.azure.communication.messages.models.ReactionNotificationContent": "Azure.Communication.MessagesService.ReactionNotificationContent",
     "com.azure.communication.messages.models.SendMessageResult": "Azure.Communication.MessagesService.SendMessageResult",
+    "com.azure.communication.messages.models.StickerNotificationContent": "Azure.Communication.MessagesService.StickerNotificationContent",
     "com.azure.communication.messages.models.TemplateNotificationContent": "Azure.Communication.MessagesService.TemplateNotificationContent",
+    "com.azure.communication.messages.models.TextMessageContent": "Azure.Communication.MessagesService.TextMessageContent",
     "com.azure.communication.messages.models.TextNotificationContent": "Azure.Communication.MessagesService.TextNotificationContent",
+    "com.azure.communication.messages.models.VideoMessageContent": "Azure.Communication.MessagesService.VideoMessageContent",
     "com.azure.communication.messages.models.VideoNotificationContent": "Azure.Communication.MessagesService.VideoNotificationContent",
+    "com.azure.communication.messages.models.channels.WhatsAppButtonActionBindings": "Azure.Communication.MessagesService.WhatsAppButtonActionBindings",
+    "com.azure.communication.messages.models.channels.WhatsAppListActionBindings": "Azure.Communication.MessagesService.WhatsAppListActionBindings",
     "com.azure.communication.messages.models.channels.WhatsAppMessageButtonSubType": "Azure.Communication.MessagesService.WhatsAppMessageButtonSubType",
     "com.azure.communication.messages.models.channels.WhatsAppMessageTemplateBindings": "Azure.Communication.MessagesService.WhatsAppMessageTemplateBindings",
     "com.azure.communication.messages.models.channels.WhatsAppMessageTemplateBindingsButton": "Azure.Communication.MessagesService.WhatsAppMessageTemplateBindingsButton",
     "com.azure.communication.messages.models.channels.WhatsAppMessageTemplateBindingsComponent": "Azure.Communication.MessagesService.WhatsAppMessageTemplateBindingsComponent",
-    "com.azure.communication.messages.models.channels.WhatsAppMessageTemplateItem": "Azure.Communication.MessagesService.WhatsAppMessageTemplateItem"
+    "com.azure.communication.messages.models.channels.WhatsAppMessageTemplateItem": "Azure.Communication.MessagesService.WhatsAppMessageTemplateItem",
+    "com.azure.communication.messages.models.channels.WhatsAppUrlActionBindings": "Azure.Communication.MessagesService.WhatsAppUrlActionBindings"
   }
 }
diff --git a/sdk/communication/azure-communication-messages/src/samples/java/com/azure/communication/messages/NotificationMessageSample.java b/sdk/communication/azure-communication-messages/src/samples/java/com/azure/communication/messages/NotificationMessageSample.java
index 748149927ce85..f4e21e28c29f9 100644
--- a/sdk/communication/azure-communication-messages/src/samples/java/com/azure/communication/messages/NotificationMessageSample.java
+++ b/sdk/communication/azure-communication-messages/src/samples/java/com/azure/communication/messages/NotificationMessageSample.java
@@ -3,9 +3,18 @@
 
 package com.azure.communication.messages;
 
+import com.azure.communication.messages.models.ActionGroup;
+import com.azure.communication.messages.models.ActionGroupContent;
+import com.azure.communication.messages.models.ActionGroupItem;
 import com.azure.communication.messages.models.AudioNotificationContent;
+import com.azure.communication.messages.models.ButtonContent;
+import com.azure.communication.messages.models.ButtonSetContent;
+import com.azure.communication.messages.models.DocumentMessageContent;
 import com.azure.communication.messages.models.DocumentNotificationContent;
+import com.azure.communication.messages.models.ImageMessageContent;
 import com.azure.communication.messages.models.ImageNotificationContent;
+import com.azure.communication.messages.models.InteractiveMessage;
+import com.azure.communication.messages.models.InteractiveNotificationContent;
 import com.azure.communication.messages.models.MessageTemplate;
 import com.azure.communication.messages.models.MessageTemplateBindings;
 import com.azure.communication.messages.models.MessageTemplateDocument;
@@ -14,14 +23,21 @@
 import com.azure.communication.messages.models.MessageTemplateText;
 import com.azure.communication.messages.models.MessageTemplateValue;
 import com.azure.communication.messages.models.MessageTemplateVideo;
+import com.azure.communication.messages.models.LinkContent;
+import com.azure.communication.messages.models.StickerNotificationContent;
+import com.azure.communication.messages.models.TextMessageContent;
 import com.azure.communication.messages.models.TextNotificationContent;
 import com.azure.communication.messages.models.TemplateNotificationContent;
+import com.azure.communication.messages.models.VideoMessageContent;
 import com.azure.communication.messages.models.VideoNotificationContent;
 import com.azure.communication.messages.models.SendMessageResult;
+import com.azure.communication.messages.models.channels.WhatsAppButtonActionBindings;
 import com.azure.communication.messages.models.channels.WhatsAppMessageButtonSubType;
 import com.azure.communication.messages.models.channels.WhatsAppMessageTemplateBindings;
 import com.azure.communication.messages.models.channels.WhatsAppMessageTemplateBindingsButton;
 import com.azure.communication.messages.models.channels.WhatsAppMessageTemplateBindingsComponent;
+import com.azure.communication.messages.models.channels.WhatsAppListActionBindings;
+import com.azure.communication.messages.models.channels.WhatsAppUrlActionBindings;
 import com.azure.core.credential.AzureKeyCredential;
 import com.azure.core.credential.TokenCredential;
 import com.azure.identity.DefaultAzureCredentialBuilder;
@@ -38,7 +54,8 @@ public class NotificationMessageSample {
 
     public static void main(String[] args) {
         TO_LIST.add(RECIPIENT_IDENTIFIER);
-        sendTemplateMessageWithDocument();
+        //sendTemplateMessageWithDocument();
+        sendStickerMessage();
     }
 
     /*
@@ -391,6 +408,144 @@ public void sendDocumentMessage() {
         result.getReceipts().forEach(r -> System.out.println("Message sent to:" + r.getTo() + " and message id:" + r.getMessageId()));
     }
 
+    /*
+     * This sample shows how to send sticker message with below details
+     * Supported sticker type - (.webp)
+     * Note: Business cannot initiate conversation with media message.
+     * */
+    public static void sendStickerMessage() {
+        //Update the Media URL
+        String mediaUrl = "https://www.gstatic.com/webp/gallery/1.sm.webp";
+        NotificationMessagesClient client = createClientWithConnectionString();
+        SendMessageResult result = client.send(
+            new StickerNotificationContent(CHANNEL_ID, TO_LIST, mediaUrl));
+
+        result.getReceipts().forEach(r -> System.out.println("Message sent to:" + r.getTo() + " and message id:" + r.getMessageId()));
+    }
+
+    /*
+     * This sample shows how to send interactive message with Button Action
+     * Note: Business cannot initiate conversation with interactive message.
+     * */
+    public static void sendInteractiveMessageWithButtonAction() {
+        NotificationMessagesClient client = createClientWithConnectionString();
+        List buttonActions =  new ArrayList<>();
+        buttonActions.add(new ButtonContent("no",  "No"));
+        buttonActions.add(new ButtonContent("yes",  "Yes"));
+        ButtonSetContent buttonSet = new ButtonSetContent(buttonActions);
+        InteractiveMessage interactiveMessage = new InteractiveMessage(
+            new TextMessageContent("Do you want to proceed?"), new WhatsAppButtonActionBindings(buttonSet));
+        SendMessageResult result = client.send(
+            new InteractiveNotificationContent(CHANNEL_ID,  TO_LIST, interactiveMessage));
+
+        result.getReceipts().forEach(r -> System.out.println("Message sent to:" + r.getTo() + " and message id:" + r.getMessageId()));
+    }
+
+    /*
+     * This sample shows how to send button action interactive message with image header
+     * Note: Business cannot initiate conversation with interactive message.
+     * */
+    public static void sendInteractiveMessageWithButtonActionWithImageHeader() {
+        NotificationMessagesClient client = createClientWithConnectionString();
+        List buttonActions =  new ArrayList<>();
+        buttonActions.add(new ButtonContent("no",  "No"));
+        buttonActions.add(new ButtonContent("yes",  "Yes"));
+        ButtonSetContent buttonSet = new ButtonSetContent(buttonActions);
+        InteractiveMessage interactiveMessage = new InteractiveMessage(
+            new TextMessageContent("Do you want to proceed?"), new WhatsAppButtonActionBindings(buttonSet));
+        interactiveMessage.setHeader(new ImageMessageContent("https://wallpapercave.com/wp/wp2163723.jpg"));
+        SendMessageResult result = client.send(
+            new InteractiveNotificationContent(CHANNEL_ID,  TO_LIST, interactiveMessage));
+
+        result.getReceipts().forEach(r -> System.out.println("Message sent to:" + r.getTo() + " and message id:" + r.getMessageId()));
+    }
+
+    /*
+     * This sample shows how to send button action interactive message with document header
+     * Note: Business cannot initiate conversation with interactive message.
+     * */
+    public static void sendInteractiveMessageWithButtonActionWithDocumentHeader() {
+        NotificationMessagesClient client = createClientWithConnectionString();
+        List buttonActions =  new ArrayList<>();
+        buttonActions.add(new ButtonContent("no",  "No"));
+        buttonActions.add(new ButtonContent("yes",  "Yes"));
+        ButtonSetContent buttonSet = new ButtonSetContent(buttonActions);
+        InteractiveMessage interactiveMessage = new InteractiveMessage(
+            new TextMessageContent("Do you want to proceed?"), new WhatsAppButtonActionBindings(buttonSet));
+        interactiveMessage.setHeader(new DocumentMessageContent("https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf"));
+        SendMessageResult result = client.send(
+            new InteractiveNotificationContent(CHANNEL_ID,  TO_LIST, interactiveMessage));
+
+        result.getReceipts().forEach(r -> System.out.println("Message sent to:" + r.getTo() + " and message id:" + r.getMessageId()));
+    }
+
+    /*
+     * This sample shows how to send button action interactive message with video header
+     * Note: Business cannot initiate conversation with interactive message.
+     * */
+    public static void sendInteractiveMessageWithButtonActionWithVideoHeader() {
+        NotificationMessagesClient client = createClientWithConnectionString();
+        List buttonActions =  new ArrayList<>();
+        buttonActions.add(new ButtonContent("no",  "No"));
+        buttonActions.add(new ButtonContent("yes",  "Yes"));
+        ButtonSetContent buttonSet = new ButtonSetContent(buttonActions);
+        InteractiveMessage interactiveMessage = new InteractiveMessage(
+            new TextMessageContent("Do you like it?"), new WhatsAppButtonActionBindings(buttonSet));
+        interactiveMessage.setHeader(new VideoMessageContent("https://sample-videos.com/audio/mp3/wave.mp3"));
+        SendMessageResult result = client.send(
+            new InteractiveNotificationContent(CHANNEL_ID,  TO_LIST, interactiveMessage));
+
+        result.getReceipts().forEach(r -> System.out.println("Message sent to:" + r.getTo() + " and message id:" + r.getMessageId()));
+    }
+
+    /*
+     * This sample shows how to send list action interactive message
+     * Note: Business cannot initiate conversation with interactive message.
+     * */
+    public static void sendInteractiveMessageWithListAction() {
+        List group1 = new ArrayList<>();
+        group1.add(new ActionGroupItem("priority_express", "Priority Mail Express", "Delivered on same day!"));
+        group1.add(new ActionGroupItem("priority_mail", "Priority Mail", "Delivered in 1-2 days"));
+
+        List group2 = new ArrayList<>();
+        group2.add(new ActionGroupItem("usps_ground_advantage", "USPS Ground Advantage", "Delivered in 2-5 days"));
+        group2.add(new ActionGroupItem("media_mail", "Media Mail", "Delivered in 5-8 days"));
+
+        List options = new ArrayList<>();
+        options.add(new ActionGroup("Express Delivery", group1));
+        options.add(new ActionGroup("Normal Delivery", group2));
+
+        ActionGroupContent actionGroupContent = new ActionGroupContent("Shipping Options", options);
+        InteractiveMessage interactiveMessage = new InteractiveMessage(
+            new TextMessageContent("Which shipping option do you want?"), new WhatsAppListActionBindings(actionGroupContent));
+        interactiveMessage.setFooter(new TextMessageContent("Eagle Logistic"));
+        interactiveMessage.setHeader(new TextMessageContent("Shipping Options"));
+
+        NotificationMessagesClient client = createClientWithConnectionString();
+        SendMessageResult result = client.send(
+            new InteractiveNotificationContent(CHANNEL_ID,  TO_LIST, interactiveMessage));
+
+        result.getReceipts().forEach(r -> System.out.println("Message sent to:" + r.getTo() + " and message id:" + r.getMessageId()));
+
+    }
+
+    /*
+     * This sample shows how to send url action interactive message
+     * Note: Business cannot initiate conversation with interactive message.
+     * */
+    public static void sendInteractiveMessageWithUrlAction() {
+        LinkContent urlAction = new LinkContent("Rocket is the best!", "https://wallpapercave.com/wp/wp2163723.jpg");
+        InteractiveMessage interactiveMessage = new InteractiveMessage(
+            new TextMessageContent("The best Guardian of Galaxy"), new WhatsAppUrlActionBindings(urlAction));
+        interactiveMessage.setFooter(new TextMessageContent("Intergalactic New Ltd"));
+
+        NotificationMessagesClient client = createClientWithConnectionString();
+        SendMessageResult result = client.send(
+            new InteractiveNotificationContent(CHANNEL_ID,  TO_LIST, interactiveMessage));
+
+        result.getReceipts().forEach(r -> System.out.println("Message sent to:" + r.getTo() + " and message id:" + r.getMessageId()));
+    }
+
     private static NotificationMessagesClient createClientWithConnectionString() {
         return new NotificationMessagesClientBuilder()
             .connectionString(CONNECTION_STRING)
diff --git a/sdk/communication/azure-communication-messages/src/samples/java/com/azure/communication/messages/ReadmeSamples.java b/sdk/communication/azure-communication-messages/src/samples/java/com/azure/communication/messages/ReadmeSamples.java
index 29d9a33c754cf..7be8c8dec1187 100644
--- a/sdk/communication/azure-communication-messages/src/samples/java/com/azure/communication/messages/ReadmeSamples.java
+++ b/sdk/communication/azure-communication-messages/src/samples/java/com/azure/communication/messages/ReadmeSamples.java
@@ -4,21 +4,37 @@
 
 package com.azure.communication.messages;
 
+import com.azure.communication.messages.models.ActionGroup;
+import com.azure.communication.messages.models.ActionGroupContent;
+import com.azure.communication.messages.models.ActionGroupItem;
 import com.azure.communication.messages.models.AudioNotificationContent;
+import com.azure.communication.messages.models.ButtonContent;
+import com.azure.communication.messages.models.ButtonSetContent;
+import com.azure.communication.messages.models.DocumentMessageContent;
 import com.azure.communication.messages.models.DocumentNotificationContent;
+import com.azure.communication.messages.models.ImageMessageContent;
 import com.azure.communication.messages.models.ImageNotificationContent;
+import com.azure.communication.messages.models.InteractiveMessage;
+import com.azure.communication.messages.models.InteractiveNotificationContent;
 import com.azure.communication.messages.models.MessageTemplate;
 import com.azure.communication.messages.models.MessageTemplateBindings;
 import com.azure.communication.messages.models.MessageTemplateItem;
 import com.azure.communication.messages.models.MessageTemplateText;
 import com.azure.communication.messages.models.MessageTemplateValue;
-import com.azure.communication.messages.models.SendMessageResult;
-import com.azure.communication.messages.models.TemplateNotificationContent;
+import com.azure.communication.messages.models.LinkContent;
+import com.azure.communication.messages.models.StickerNotificationContent;
+import com.azure.communication.messages.models.TextMessageContent;
 import com.azure.communication.messages.models.TextNotificationContent;
+import com.azure.communication.messages.models.TemplateNotificationContent;
+import com.azure.communication.messages.models.VideoMessageContent;
 import com.azure.communication.messages.models.VideoNotificationContent;
+import com.azure.communication.messages.models.SendMessageResult;
+import com.azure.communication.messages.models.channels.WhatsAppButtonActionBindings;
 import com.azure.communication.messages.models.channels.WhatsAppMessageTemplateBindings;
 import com.azure.communication.messages.models.channels.WhatsAppMessageTemplateBindingsComponent;
 import com.azure.communication.messages.models.channels.WhatsAppMessageTemplateItem;
+import com.azure.communication.messages.models.channels.WhatsAppListActionBindings;
+import com.azure.communication.messages.models.channels.WhatsAppUrlActionBindings;
 import com.azure.core.credential.AzureKeyCredential;
 import com.azure.core.credential.TokenCredential;
 import com.azure.core.http.rest.PagedIterable;
@@ -239,6 +255,187 @@ public void sendDocumentMessage() {
     }
     // END: readme-sample-sendDocumentMessage
 
+    // BEGIN: readme-sample-sendStickerMessage
+    /*
+     * This sample shows how to send sticker message with below details
+     * Supported sticker type - (.webp)
+     * Note: Business cannot initiate conversation with media message.
+     * */
+    public static void sendStickerMessage() {
+        //Update the Media URL
+        String mediaUrl = "https://www.gstatic.com/webp/gallery/1.sm.webp";
+        List recipients = new ArrayList<>();
+        recipients.add("");
+        NotificationMessagesClient client = new NotificationMessagesClientBuilder()
+            .connectionString("")
+            .buildClient();
+        SendMessageResult result = client.send(
+            new StickerNotificationContent("", recipients, mediaUrl));
+
+        result.getReceipts().forEach(r -> System.out.println("Message sent to:" + r.getTo() + " and message id:" + r.getMessageId()));
+    }
+    // END: readme-sample-sendStickerMessage
+
+    // BEGIN: readme-sample-sendInteractiveMessageWithButtonAction
+    /*
+     * This sample shows how to send interactive message with Button Action
+     * Note: Business cannot initiate conversation with interactive message.
+     * */
+    public void sendInteractiveMessageWithButtonAction() {
+        List recipients = new ArrayList<>();
+        recipients.add("");
+        NotificationMessagesClient client = new NotificationMessagesClientBuilder()
+            .connectionString("")
+            .buildClient();
+        List buttonActions =  new ArrayList<>();
+        buttonActions.add(new ButtonContent("no",  "No"));
+        buttonActions.add(new ButtonContent("yes",  "Yes"));
+        ButtonSetContent buttonSet = new ButtonSetContent(buttonActions);
+        InteractiveMessage interactiveMessage = new InteractiveMessage(
+            new TextMessageContent("Do you want to proceed?"), new WhatsAppButtonActionBindings(buttonSet));
+        SendMessageResult result = client.send(
+            new InteractiveNotificationContent("",  recipients, interactiveMessage));
+
+        result.getReceipts().forEach(r -> System.out.println("Message sent to:" + r.getTo() + " and message id:" + r.getMessageId()));
+    }
+    // END: readme-sample-sendInteractiveMessageWithButtonAction
+
+    // BEGIN: readme-sample-sendInteractiveMessageWithButtonActionWithImageHeader
+    /*
+     * This sample shows how to send button action interactive message with image header
+     * Note: Business cannot initiate conversation with interactive message.
+     * */
+    public void sendInteractiveMessageWithButtonActionWithImageHeader() {
+        List recipients = new ArrayList<>();
+        recipients.add("");
+        NotificationMessagesClient client = new NotificationMessagesClientBuilder()
+            .connectionString("")
+            .buildClient();
+        List buttonActions =  new ArrayList<>();
+        buttonActions.add(new ButtonContent("no",  "No"));
+        buttonActions.add(new ButtonContent("yes",  "Yes"));
+        ButtonSetContent buttonSet = new ButtonSetContent(buttonActions);
+        InteractiveMessage interactiveMessage = new InteractiveMessage(
+            new TextMessageContent("Do you want to proceed?"), new WhatsAppButtonActionBindings(buttonSet));
+        interactiveMessage.setHeader(new ImageMessageContent("https://wallpapercave.com/wp/wp2163723.jpg"));
+        SendMessageResult result = client.send(
+            new InteractiveNotificationContent("",  recipients, interactiveMessage));
+
+        result.getReceipts().forEach(r -> System.out.println("Message sent to:" + r.getTo() + " and message id:" + r.getMessageId()));
+    }
+    // END: readme-sample-sendInteractiveMessageWithButtonActionWithImageHeader
+
+    // BEGIN: readme-sample-sendInteractiveMessageWithButtonActionWithDocumentHeader
+    /*
+     * This sample shows how to send button action interactive message with document header
+     * Note: Business cannot initiate conversation with interactive message.
+     * */
+    public static void sendInteractiveMessageWithButtonActionWithDocumentHeader() {
+        List recipients = new ArrayList<>();
+        recipients.add("");
+        NotificationMessagesClient client = new NotificationMessagesClientBuilder()
+            .connectionString("")
+            .buildClient();
+        List buttonActions =  new ArrayList<>();
+        buttonActions.add(new ButtonContent("no",  "No"));
+        buttonActions.add(new ButtonContent("yes",  "Yes"));
+        ButtonSetContent buttonSet = new ButtonSetContent(buttonActions);
+        InteractiveMessage interactiveMessage = new InteractiveMessage(
+            new TextMessageContent("Do you want to proceed?"), new WhatsAppButtonActionBindings(buttonSet));
+        interactiveMessage.setHeader(new DocumentMessageContent("https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf"));
+        SendMessageResult result = client.send(
+            new InteractiveNotificationContent("",  recipients, interactiveMessage));
+
+        result.getReceipts().forEach(r -> System.out.println("Message sent to:" + r.getTo() + " and message id:" + r.getMessageId()));
+    }
+    // END: readme-sample-sendInteractiveMessageWithButtonActionWithDocumentHeader
+
+
+    // BEGIN: readme-sample-sendInteractiveMessageWithButtonActionWithVideoHeader
+    /*
+     * This sample shows how to send button action interactive message with video header
+     * Note: Business cannot initiate conversation with interactive message.
+     * */
+    public static void sendInteractiveMessageWithButtonActionWithVideoHeader() {
+        List recipients = new ArrayList<>();
+        recipients.add("");
+        NotificationMessagesClient client = new NotificationMessagesClientBuilder()
+            .connectionString("")
+            .buildClient();
+        List buttonActions =  new ArrayList<>();
+        buttonActions.add(new ButtonContent("no",  "No"));
+        buttonActions.add(new ButtonContent("yes",  "Yes"));
+        ButtonSetContent buttonSet = new ButtonSetContent(buttonActions);
+        InteractiveMessage interactiveMessage = new InteractiveMessage(
+            new TextMessageContent("Do you like it?"), new WhatsAppButtonActionBindings(buttonSet));
+        interactiveMessage.setHeader(new VideoMessageContent("https://sample-videos.com/audio/mp3/wave.mp3"));
+        SendMessageResult result = client.send(
+            new InteractiveNotificationContent("",  recipients, interactiveMessage));
+
+        result.getReceipts().forEach(r -> System.out.println("Message sent to:" + r.getTo() + " and message id:" + r.getMessageId()));
+    }
+    // END: readme-sample-sendInteractiveMessageWithButtonActionWithVideoHeader
+
+    // BEGIN: readme-sample-sendInteractiveMessageWithListAction
+    /*
+     * This sample shows how to send list action interactive message
+     * Note: Business cannot initiate conversation with interactive message.
+     * */
+    public static void sendInteractiveMessageWithListAction() {
+        List group1 = new ArrayList<>();
+        group1.add(new ActionGroupItem("priority_express", "Priority Mail Express", "Delivered on same day!"));
+        group1.add(new ActionGroupItem("priority_mail", "Priority Mail", "Delivered in 1-2 days"));
+
+        List group2 = new ArrayList<>();
+        group2.add(new ActionGroupItem("usps_ground_advantage", "USPS Ground Advantage", "Delivered in 2-5 days"));
+        group2.add(new ActionGroupItem("media_mail", "Media Mail", "Delivered in 5-8 days"));
+
+        List options = new ArrayList<>();
+        options.add(new ActionGroup("Express Delivery", group1));
+        options.add(new ActionGroup("Normal Delivery", group2));
+
+        ActionGroupContent actionGroupContent = new ActionGroupContent("Shipping Options", options);
+        InteractiveMessage interactiveMessage = new InteractiveMessage(
+            new TextMessageContent("Which shipping option do you want?"), new WhatsAppListActionBindings(actionGroupContent));
+        interactiveMessage.setFooter(new TextMessageContent("Eagle Logistic"));
+        interactiveMessage.setHeader(new TextMessageContent("Shipping Options"));
+
+        List recipients = new ArrayList<>();
+        recipients.add("");
+        NotificationMessagesClient client = new NotificationMessagesClientBuilder()
+            .connectionString("")
+            .buildClient();
+        SendMessageResult result = client.send(
+            new InteractiveNotificationContent("",  recipients, interactiveMessage));
+
+        result.getReceipts().forEach(r -> System.out.println("Message sent to:" + r.getTo() + " and message id:" + r.getMessageId()));
+
+    }
+    // END: readme-sample-sendInteractiveMessageWithListAction
+
+    // BEGIN: readme-sample-sendInteractiveMessageWithUrlAction
+    /*
+     * This sample shows how to send url action interactive message
+     * Note: Business cannot initiate conversation with interactive message.
+     * */
+    public static void sendInteractiveMessageWithUrlAction() {
+        LinkContent urlAction = new LinkContent("Rocket is the best!", "https://wallpapercave.com/wp/wp2163723.jpg");
+        InteractiveMessage interactiveMessage = new InteractiveMessage(
+            new TextMessageContent("The best Guardian of Galaxy"), new WhatsAppUrlActionBindings(urlAction));
+        interactiveMessage.setFooter(new TextMessageContent("Intergalactic New Ltd"));
+
+        List recipients = new ArrayList<>();
+        recipients.add("");
+        NotificationMessagesClient client = new NotificationMessagesClientBuilder()
+            .connectionString("")
+            .buildClient();
+        SendMessageResult result = client.send(
+            new InteractiveNotificationContent("",  recipients, interactiveMessage));
+
+        result.getReceipts().forEach(r -> System.out.println("Message sent to:" + r.getTo() + " and message id:" + r.getMessageId()));
+    }
+    // END: readme-sample-sendInteractiveMessageWithUrlAction
+
     public static void getMessageTemplateWithConnectionString() {
         // BEGIN: readme-sample-ListTemplates
         MessageTemplateClient templateClient =
diff --git a/sdk/communication/azure-communication-messages/src/test/java/com/azure/communication/messages/CommunicationMessagesTestBase.java b/sdk/communication/azure-communication-messages/src/test/java/com/azure/communication/messages/CommunicationMessagesTestBase.java
index 69595e96905d9..da4384e7f389b 100644
--- a/sdk/communication/azure-communication-messages/src/test/java/com/azure/communication/messages/CommunicationMessagesTestBase.java
+++ b/sdk/communication/azure-communication-messages/src/test/java/com/azure/communication/messages/CommunicationMessagesTestBase.java
@@ -28,7 +28,7 @@ public class CommunicationMessagesTestBase extends TestProxyTestBase {
             "endpoint=https://REDACTED.int.communication.azure.net;accessKey=secret");
 
     protected static final String CHANNEL_REGISTRATION_ID = Configuration.getGlobalConfiguration()
-        .get("SENDER_CHANNEL_REGISTRATION_ID", "bc73327d-d246-4983-9e13-284468af7240");
+        .get("SENDER_CHANNEL_REGISTRATION_ID", "77ffd898-ec44-42cd-b560-57a8903d05c7");
 
     protected static final String RECIPIENT_IDENTIFIER
         = Configuration.getGlobalConfiguration().get("RECIPIENT_IDENTIFIER", "+11234567788");
diff --git a/sdk/communication/azure-communication-messages/src/test/java/com/azure/communication/messages/NotificationMessageAsyncClientTest.java b/sdk/communication/azure-communication-messages/src/test/java/com/azure/communication/messages/NotificationMessageAsyncClientTest.java
index 352353058ceeb..d68a6ec783f21 100644
--- a/sdk/communication/azure-communication-messages/src/test/java/com/azure/communication/messages/NotificationMessageAsyncClientTest.java
+++ b/sdk/communication/azure-communication-messages/src/test/java/com/azure/communication/messages/NotificationMessageAsyncClientTest.java
@@ -4,10 +4,7 @@
 package com.azure.communication.messages;
 
 import com.azure.communication.messages.models.*;
-import com.azure.communication.messages.models.channels.WhatsAppMessageButtonSubType;
-import com.azure.communication.messages.models.channels.WhatsAppMessageTemplateBindings;
-import com.azure.communication.messages.models.channels.WhatsAppMessageTemplateBindingsButton;
-import com.azure.communication.messages.models.channels.WhatsAppMessageTemplateBindingsComponent;
+import com.azure.communication.messages.models.channels.*;
 import com.azure.core.credential.TokenCredential;
 import com.azure.core.http.HttpClient;
 import com.azure.core.test.utils.MockTokenCredential;
@@ -100,6 +97,170 @@ public void shouldSendDocumentMessage(HttpClient httpClient) {
             }).verifyComplete();
     }
 
+    @ParameterizedTest
+    @MethodSource("com.azure.core.test.TestBase#getHttpClients")
+    public void sendStickerMessage(HttpClient httpClient) {
+        String mediaUrl = "https://www.gstatic.com/webp/gallery/1.sm.webp";
+        messagesClient = buildNotificationMessagesAsyncClient(httpClient);
+        List recipients = new ArrayList<>();
+        recipients.add(RECIPIENT_IDENTIFIER);
+        StepVerifier
+            .create(messagesClient.send(new StickerNotificationContent(CHANNEL_REGISTRATION_ID, recipients, mediaUrl)))
+            .assertNext(resp -> {
+                assertEquals(1, resp.getReceipts().size());
+                assertNotNull(resp.getReceipts().get(0).getMessageId());
+            })
+            .verifyComplete();
+    }
+
+    @ParameterizedTest
+    @MethodSource("com.azure.core.test.TestBase#getHttpClients")
+    public void sendInteractiveMessageWithButtonAction(HttpClient httpClient) {
+        messagesClient = buildNotificationMessagesAsyncClient(httpClient);
+        List recipients = new ArrayList<>();
+        recipients.add(RECIPIENT_IDENTIFIER);
+        List buttonActions = new ArrayList<>();
+        buttonActions.add(new ButtonContent("no", "No"));
+        buttonActions.add(new ButtonContent("yes", "Yes"));
+        ButtonSetContent buttonSet = new ButtonSetContent(buttonActions);
+        InteractiveMessage interactiveMessage = new InteractiveMessage(
+            new TextMessageContent("Do you want to proceed?"), new WhatsAppButtonActionBindings(buttonSet));
+        StepVerifier
+            .create(messagesClient
+                .send(new InteractiveNotificationContent(CHANNEL_REGISTRATION_ID, recipients, interactiveMessage)))
+            .assertNext(resp -> {
+                assertEquals(1, resp.getReceipts().size());
+                assertNotNull(resp.getReceipts().get(0).getMessageId());
+            })
+            .verifyComplete();
+    }
+
+    @ParameterizedTest
+    @MethodSource("com.azure.core.test.TestBase#getHttpClients")
+    public void sendInteractiveMessageWithButtonActionWithImageHeader(HttpClient httpClient) {
+        messagesClient = buildNotificationMessagesAsyncClient(httpClient);
+        List recipients = new ArrayList<>();
+        recipients.add(RECIPIENT_IDENTIFIER);
+        List buttonActions = new ArrayList<>();
+        buttonActions.add(new ButtonContent("no", "No"));
+        buttonActions.add(new ButtonContent("yes", "Yes"));
+        ButtonSetContent buttonSet = new ButtonSetContent(buttonActions);
+        InteractiveMessage interactiveMessage = new InteractiveMessage(
+            new TextMessageContent("Do you want to proceed?"), new WhatsAppButtonActionBindings(buttonSet));
+        interactiveMessage.setHeader(new ImageMessageContent("https://wallpapercave.com/wp/wp2163723.jpg"));
+        StepVerifier
+            .create(messagesClient
+                .send(new InteractiveNotificationContent(CHANNEL_REGISTRATION_ID, recipients, interactiveMessage)))
+            .assertNext(resp -> {
+                assertEquals(1, resp.getReceipts().size());
+                assertNotNull(resp.getReceipts().get(0).getMessageId());
+            })
+            .verifyComplete();
+    }
+
+    @ParameterizedTest
+    @MethodSource("com.azure.core.test.TestBase#getHttpClients")
+    public void sendInteractiveMessageWithButtonActionWithDocumentHeader(HttpClient httpClient) {
+        messagesClient = buildNotificationMessagesAsyncClient(httpClient);
+        List recipients = new ArrayList<>();
+        recipients.add(RECIPIENT_IDENTIFIER);
+        List buttonActions = new ArrayList<>();
+        buttonActions.add(new ButtonContent("no", "No"));
+        buttonActions.add(new ButtonContent("yes", "Yes"));
+        ButtonSetContent buttonSet = new ButtonSetContent(buttonActions);
+        InteractiveMessage interactiveMessage = new InteractiveMessage(
+            new TextMessageContent("Do you want to proceed?"), new WhatsAppButtonActionBindings(buttonSet));
+        interactiveMessage.setHeader(
+            new DocumentMessageContent("https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf"));
+        StepVerifier
+            .create(messagesClient
+                .send(new InteractiveNotificationContent(CHANNEL_REGISTRATION_ID, recipients, interactiveMessage)))
+            .assertNext(resp -> {
+                assertEquals(1, resp.getReceipts().size());
+                assertNotNull(resp.getReceipts().get(0).getMessageId());
+            })
+            .verifyComplete();
+    }
+
+    @ParameterizedTest
+    @MethodSource("com.azure.core.test.TestBase#getHttpClients")
+    public void sendInteractiveMessageWithButtonActionWithVideoHeader(HttpClient httpClient) {
+        messagesClient = buildNotificationMessagesAsyncClient(httpClient);
+        List recipients = new ArrayList<>();
+        recipients.add(RECIPIENT_IDENTIFIER);
+        List buttonActions = new ArrayList<>();
+        buttonActions.add(new ButtonContent("no", "No"));
+        buttonActions.add(new ButtonContent("yes", "Yes"));
+        ButtonSetContent buttonSet = new ButtonSetContent(buttonActions);
+        InteractiveMessage interactiveMessage = new InteractiveMessage(new TextMessageContent("Do you like it?"),
+            new WhatsAppButtonActionBindings(buttonSet));
+        interactiveMessage.setHeader(new VideoMessageContent("https://sample-videos.com/audio/mp3/wave.mp3"));
+        StepVerifier
+            .create(messagesClient
+                .send(new InteractiveNotificationContent(CHANNEL_REGISTRATION_ID, recipients, interactiveMessage)))
+            .assertNext(resp -> {
+                assertEquals(1, resp.getReceipts().size());
+                assertNotNull(resp.getReceipts().get(0).getMessageId());
+            })
+            .verifyComplete();
+    }
+
+    @ParameterizedTest
+    @MethodSource("com.azure.core.test.TestBase#getHttpClients")
+    public void sendInteractiveMessageWithListAction(HttpClient httpClient) {
+        List group1 = new ArrayList<>();
+        group1.add(new ActionGroupItem("priority_express", "Priority Mail Express", "Delivered on same day!"));
+        group1.add(new ActionGroupItem("priority_mail", "Priority Mail", "Delivered in 1-2 days"));
+
+        List group2 = new ArrayList<>();
+        group2.add(new ActionGroupItem("usps_ground_advantage", "USPS Ground Advantage", "Delivered in 2-5 days"));
+        group2.add(new ActionGroupItem("media_mail", "Media Mail", "Delivered in 5-8 days"));
+
+        List options = new ArrayList<>();
+        options.add(new ActionGroup("Express Delivery", group1));
+        options.add(new ActionGroup("Normal Delivery", group2));
+
+        ActionGroupContent actionGroupContent = new ActionGroupContent("Shipping Options", options);
+        InteractiveMessage interactiveMessage
+            = new InteractiveMessage(new TextMessageContent("Which shipping option do you want?"),
+                new WhatsAppListActionBindings(actionGroupContent));
+        interactiveMessage.setFooter(new TextMessageContent("Eagle Logistic"));
+        interactiveMessage.setHeader(new TextMessageContent("Shipping Options"));
+
+        messagesClient = buildNotificationMessagesAsyncClient(httpClient);
+        List recipients = new ArrayList<>();
+        recipients.add(RECIPIENT_IDENTIFIER);
+        StepVerifier
+            .create(messagesClient
+                .send(new InteractiveNotificationContent(CHANNEL_REGISTRATION_ID, recipients, interactiveMessage)))
+            .assertNext(resp -> {
+                assertEquals(1, resp.getReceipts().size());
+                assertNotNull(resp.getReceipts().get(0).getMessageId());
+            })
+            .verifyComplete();
+    }
+
+    @ParameterizedTest
+    @MethodSource("com.azure.core.test.TestBase#getHttpClients")
+    public void sendInteractiveMessageWithUrlAction(HttpClient httpClient) {
+        LinkContent urlAction = new LinkContent("Rocket is the best!", "https://wallpapercave.com/wp/wp2163723.jpg");
+        InteractiveMessage interactiveMessage = new InteractiveMessage(
+            new TextMessageContent("The best Guardian of Galaxy"), new WhatsAppUrlActionBindings(urlAction));
+        interactiveMessage.setFooter(new TextMessageContent("Intergalactic New Ltd"));
+
+        messagesClient = buildNotificationMessagesAsyncClient(httpClient);
+        List recipients = new ArrayList<>();
+        recipients.add(RECIPIENT_IDENTIFIER);
+        StepVerifier
+            .create(messagesClient
+                .send(new InteractiveNotificationContent(CHANNEL_REGISTRATION_ID, recipients, interactiveMessage)))
+            .assertNext(resp -> {
+                assertEquals(1, resp.getReceipts().size());
+                assertNotNull(resp.getReceipts().get(0).getMessageId());
+            })
+            .verifyComplete();
+    }
+
     @ParameterizedTest
     @MethodSource("com.azure.core.test.TestBase#getHttpClients")
     public void shouldSendMessageTemplateWithImage(HttpClient httpClient) {
diff --git a/sdk/communication/azure-communication-messages/src/test/java/com/azure/communication/messages/NotificationMessagesClientTest.java b/sdk/communication/azure-communication-messages/src/test/java/com/azure/communication/messages/NotificationMessagesClientTest.java
index e82a4e24ee10d..4181a65c388b9 100644
--- a/sdk/communication/azure-communication-messages/src/test/java/com/azure/communication/messages/NotificationMessagesClientTest.java
+++ b/sdk/communication/azure-communication-messages/src/test/java/com/azure/communication/messages/NotificationMessagesClientTest.java
@@ -4,10 +4,7 @@
 package com.azure.communication.messages;
 
 import com.azure.communication.messages.models.*;
-import com.azure.communication.messages.models.channels.WhatsAppMessageButtonSubType;
-import com.azure.communication.messages.models.channels.WhatsAppMessageTemplateBindings;
-import com.azure.communication.messages.models.channels.WhatsAppMessageTemplateBindingsButton;
-import com.azure.communication.messages.models.channels.WhatsAppMessageTemplateBindingsComponent;
+import com.azure.communication.messages.models.channels.*;
 import com.azure.core.credential.TokenCredential;
 import com.azure.core.http.HttpClient;
 import com.azure.core.test.utils.MockTokenCredential;
@@ -117,6 +114,150 @@ public void shouldSendDocumentMessage(HttpClient httpClient) {
         assertNotNull(result.getReceipts().get(0).getMessageId());
     }
 
+    @ParameterizedTest
+    @MethodSource("com.azure.core.test.TestBase#getHttpClients")
+    public void sendStickerMessage(HttpClient httpClient) {
+        String mediaUrl = "https://www.gstatic.com/webp/gallery/1.sm.webp";
+        messagesClient = buildNotificationMessagesClient(httpClient);
+        List recipients = new ArrayList<>();
+        recipients.add(RECIPIENT_IDENTIFIER);
+        SendMessageResult result
+            = messagesClient.send(new StickerNotificationContent(CHANNEL_REGISTRATION_ID, recipients, mediaUrl));
+
+        assertEquals(1, result.getReceipts().size());
+        assertNotNull(result.getReceipts().get(0).getMessageId());
+    }
+
+    @ParameterizedTest
+    @MethodSource("com.azure.core.test.TestBase#getHttpClients")
+    public void sendInteractiveMessageWithButtonAction(HttpClient httpClient) {
+        messagesClient = buildNotificationMessagesClient(httpClient);
+        List recipients = new ArrayList<>();
+        recipients.add(RECIPIENT_IDENTIFIER);
+        List buttonActions = new ArrayList<>();
+        buttonActions.add(new ButtonContent("no", "No"));
+        buttonActions.add(new ButtonContent("yes", "Yes"));
+        ButtonSetContent buttonSet = new ButtonSetContent(buttonActions);
+        InteractiveMessage interactiveMessage = new InteractiveMessage(
+            new TextMessageContent("Do you want to proceed?"), new WhatsAppButtonActionBindings(buttonSet));
+        SendMessageResult result = messagesClient
+            .send(new InteractiveNotificationContent(CHANNEL_REGISTRATION_ID, recipients, interactiveMessage));
+
+        assertEquals(1, result.getReceipts().size());
+        assertNotNull(result.getReceipts().get(0).getMessageId());
+    }
+
+    @ParameterizedTest
+    @MethodSource("com.azure.core.test.TestBase#getHttpClients")
+    public void sendInteractiveMessageWithButtonActionWithImageHeader(HttpClient httpClient) {
+        messagesClient = buildNotificationMessagesClient(httpClient);
+        List recipients = new ArrayList<>();
+        recipients.add(RECIPIENT_IDENTIFIER);
+        List buttonActions = new ArrayList<>();
+        buttonActions.add(new ButtonContent("no", "No"));
+        buttonActions.add(new ButtonContent("yes", "Yes"));
+        ButtonSetContent buttonSet = new ButtonSetContent(buttonActions);
+        InteractiveMessage interactiveMessage = new InteractiveMessage(
+            new TextMessageContent("Do you want to proceed?"), new WhatsAppButtonActionBindings(buttonSet));
+        interactiveMessage.setHeader(new ImageMessageContent("https://wallpapercave.com/wp/wp2163723.jpg"));
+        SendMessageResult result = messagesClient
+            .send(new InteractiveNotificationContent(CHANNEL_REGISTRATION_ID, recipients, interactiveMessage));
+
+        assertEquals(1, result.getReceipts().size());
+        assertNotNull(result.getReceipts().get(0).getMessageId());
+    }
+
+    @ParameterizedTest
+    @MethodSource("com.azure.core.test.TestBase#getHttpClients")
+    public void sendInteractiveMessageWithButtonActionWithDocumentHeader(HttpClient httpClient) {
+        messagesClient = buildNotificationMessagesClient(httpClient);
+        List recipients = new ArrayList<>();
+        recipients.add(RECIPIENT_IDENTIFIER);
+        List buttonActions = new ArrayList<>();
+        buttonActions.add(new ButtonContent("no", "No"));
+        buttonActions.add(new ButtonContent("yes", "Yes"));
+        ButtonSetContent buttonSet = new ButtonSetContent(buttonActions);
+        InteractiveMessage interactiveMessage = new InteractiveMessage(
+            new TextMessageContent("Do you want to proceed?"), new WhatsAppButtonActionBindings(buttonSet));
+        interactiveMessage.setHeader(
+            new DocumentMessageContent("https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf"));
+        SendMessageResult result = messagesClient
+            .send(new InteractiveNotificationContent(CHANNEL_REGISTRATION_ID, recipients, interactiveMessage));
+
+        assertEquals(1, result.getReceipts().size());
+        assertNotNull(result.getReceipts().get(0).getMessageId());
+    }
+
+    @ParameterizedTest
+    @MethodSource("com.azure.core.test.TestBase#getHttpClients")
+    public void sendInteractiveMessageWithButtonActionWithVideoHeader(HttpClient httpClient) {
+        messagesClient = buildNotificationMessagesClient(httpClient);
+        List recipients = new ArrayList<>();
+        recipients.add(RECIPIENT_IDENTIFIER);
+        List buttonActions = new ArrayList<>();
+        buttonActions.add(new ButtonContent("no", "No"));
+        buttonActions.add(new ButtonContent("yes", "Yes"));
+        ButtonSetContent buttonSet = new ButtonSetContent(buttonActions);
+        InteractiveMessage interactiveMessage = new InteractiveMessage(new TextMessageContent("Do you like it?"),
+            new WhatsAppButtonActionBindings(buttonSet));
+        interactiveMessage.setHeader(new VideoMessageContent("https://sample-videos.com/audio/mp3/wave.mp3"));
+        SendMessageResult result = messagesClient
+            .send(new InteractiveNotificationContent(CHANNEL_REGISTRATION_ID, recipients, interactiveMessage));
+
+        assertEquals(1, result.getReceipts().size());
+        assertNotNull(result.getReceipts().get(0).getMessageId());
+    }
+
+    @ParameterizedTest
+    @MethodSource("com.azure.core.test.TestBase#getHttpClients")
+    public void sendInteractiveMessageWithListAction(HttpClient httpClient) {
+        List group1 = new ArrayList<>();
+        group1.add(new ActionGroupItem("priority_express", "Priority Mail Express", "Delivered on same day!"));
+        group1.add(new ActionGroupItem("priority_mail", "Priority Mail", "Delivered in 1-2 days"));
+
+        List group2 = new ArrayList<>();
+        group2.add(new ActionGroupItem("usps_ground_advantage", "USPS Ground Advantage", "Delivered in 2-5 days"));
+        group2.add(new ActionGroupItem("usps_mail", "USPS Mail", "Delivered in 5-8 days"));
+
+        List options = new ArrayList<>();
+        options.add(new ActionGroup("Express Delivery", group1));
+        options.add(new ActionGroup("Normal Delivery", group2));
+
+        ActionGroupContent actionGroupContent = new ActionGroupContent("Shipping Options", options);
+        InteractiveMessage interactiveMessage
+            = new InteractiveMessage(new TextMessageContent("Which shipping option do you want?"),
+                new WhatsAppListActionBindings(actionGroupContent));
+        interactiveMessage.setFooter(new TextMessageContent("Eagle Logistic"));
+        interactiveMessage.setHeader(new TextMessageContent("Shipping Options"));
+
+        messagesClient = buildNotificationMessagesClient(httpClient);
+        List recipients = new ArrayList<>();
+        recipients.add(RECIPIENT_IDENTIFIER);
+        SendMessageResult result = messagesClient
+            .send(new InteractiveNotificationContent(CHANNEL_REGISTRATION_ID, recipients, interactiveMessage));
+
+        assertEquals(1, result.getReceipts().size());
+        assertNotNull(result.getReceipts().get(0).getMessageId());
+    }
+
+    @ParameterizedTest
+    @MethodSource("com.azure.core.test.TestBase#getHttpClients")
+    public void sendInteractiveMessageWithUrlAction(HttpClient httpClient) {
+        LinkContent urlAction = new LinkContent("Rocket is the best!", "https://wallpapercave.com/wp/wp2163723.jpg");
+        InteractiveMessage interactiveMessage = new InteractiveMessage(
+            new TextMessageContent("The best Guardian of Galaxy"), new WhatsAppUrlActionBindings(urlAction));
+        interactiveMessage.setFooter(new TextMessageContent("Intergalactic News Ltd"));
+
+        messagesClient = buildNotificationMessagesClient(httpClient);
+        List recipients = new ArrayList<>();
+        recipients.add(RECIPIENT_IDENTIFIER);
+        SendMessageResult result = messagesClient
+            .send(new InteractiveNotificationContent(CHANNEL_REGISTRATION_ID, recipients, interactiveMessage));
+
+        assertEquals(1, result.getReceipts().size());
+        assertNotNull(result.getReceipts().get(0).getMessageId());
+    }
+
     @ParameterizedTest
     @MethodSource("com.azure.core.test.TestBase#getHttpClients")
     public void shouldSendMessageImageTemplate(HttpClient httpClient) {
diff --git a/sdk/communication/azure-communication-messages/tsp-location.yaml b/sdk/communication/azure-communication-messages/tsp-location.yaml
index 277f8c2c5f5a2..226175670e898 100644
--- a/sdk/communication/azure-communication-messages/tsp-location.yaml
+++ b/sdk/communication/azure-communication-messages/tsp-location.yaml
@@ -1,4 +1,4 @@
 directory: specification/communication/Communication.Messages
-commit: abe3209e7c6924a58ab560ebab2349bc8fde6aa7
+commit: 8f0670c04a112cdf6f5ca107f62fc66916ef8441
 repo: Azure/azure-rest-api-specs
 additionalDirectories: null