diff --git a/AdaptiveCards/authoring-cards/media/universal-action-model/inconsistent-action-model-lifecycle.png b/AdaptiveCards/authoring-cards/media/universal-action-model/inconsistent-action-model-lifecycle.png
new file mode 100644
index 000000000..eb6efffbe
Binary files /dev/null and b/AdaptiveCards/authoring-cards/media/universal-action-model/inconsistent-action-model-lifecycle.png differ
diff --git a/AdaptiveCards/authoring-cards/media/universal-action-model/inconsistent-action-model.png b/AdaptiveCards/authoring-cards/media/universal-action-model/inconsistent-action-model.png
new file mode 100644
index 000000000..e2d4023ad
Binary files /dev/null and b/AdaptiveCards/authoring-cards/media/universal-action-model/inconsistent-action-model.png differ
diff --git a/AdaptiveCards/authoring-cards/media/universal-action-model/new-universal-action-model.jpg b/AdaptiveCards/authoring-cards/media/universal-action-model/new-universal-action-model.jpg
new file mode 100644
index 000000000..a5c1cdfd6
Binary files /dev/null and b/AdaptiveCards/authoring-cards/media/universal-action-model/new-universal-action-model.jpg differ
diff --git a/AdaptiveCards/authoring-cards/media/universal-action-model/universal-action-model-lifecycle.jpg b/AdaptiveCards/authoring-cards/media/universal-action-model/universal-action-model-lifecycle.jpg
new file mode 100644
index 000000000..5681f774d
Binary files /dev/null and b/AdaptiveCards/authoring-cards/media/universal-action-model/universal-action-model-lifecycle.jpg differ
diff --git a/AdaptiveCards/authoring-cards/speech.md b/AdaptiveCards/authoring-cards/speech.md
index 8aeb07fad..7b5e21e59 100644
--- a/AdaptiveCards/authoring-cards/speech.md
+++ b/AdaptiveCards/authoring-cards/speech.md
@@ -13,7 +13,7 @@ The `speak` tag enables the adaptive card to be delivered to an environment wher
## Speak property
To support speech we have a `speak` property which contains text to say to the user. The text can be annotated using speech synthesis markup language
-([SSML](https://msdn.microsoft.com/library/office/hh361578)). SSML controls the speed, tone, and inflection of the speech. It even allows you to stream audio or a render a TTS audio stream from your own service, giving you a great deal of flexibility for customization.
+([SSML](/previous-versions/office/developer/speech-technologies/hh361578(v=office.14))). SSML controls the speed, tone, and inflection of the speech. It even allows you to stream audio or a render a TTS audio stream from your own service, giving you a great deal of flexibility for customization.
There are two patterns for speak property usage by a host application:
@@ -32,4 +32,4 @@ There are two patterns for speak property usage by a host application:
## Speech content design
-Content designed for speech is different from content designed for visual display. When you design a card, you are designing an entire visual experience to present information to a user in a way that delights them. When designing for speech, you should think about how to verbally describe the content in a way that delights the user.
+Content designed for speech is different from content designed for visual display. When you design a card, you are designing an entire visual experience to present information to a user in a way that delights them. When designing for speech, you should think about how to verbally describe the content in a way that delights the user.
\ No newline at end of file
diff --git a/AdaptiveCards/authoring-cards/universal-action-model.md b/AdaptiveCards/authoring-cards/universal-action-model.md
new file mode 100644
index 000000000..40e7b93ab
--- /dev/null
+++ b/AdaptiveCards/authoring-cards/universal-action-model.md
@@ -0,0 +1,325 @@
+---
+title: Universal Bot action model
+author: sowrabh-msft
+ms.author: sonrs
+ms.date: 02/10/2021
+ms.topic: article
+---
+# Universal Bot action model
+
+## Context
+
+Adaptive Cards are platform-agnostic snippets of UI, authored using a lightweight JSON format, that apps and services can share. Adaptive Cards not only adapt to the look-and-feel of the host, but also provide rich interaction capabilities. For more information about Adaptive Cards, please visit [adaptivecards.io](http://adaptivecards.io).
+
+As Adaptive Cards grew in popularity, different hosts started supporting different action models and this led to fragmentation. To solve this problem, the Teams, Outlook and Adaptive Cards teams worked on creating a new universal Bot action model compatible across hosts. This effort lead to the following:
+- The generalization of Bots and the Bot Framework as the way to implement Adaptive Card-based scenarios for both Teams (Bots) and Outlook (Actionable Message)
+- `Action.Execute` as a replacement for both `Action.Submit` (currently used by Bots) and `Action.Http` (currently used by Actionable Messages)
+- Popular features only supported by Actionable Messages made available to Bots, namely:
+ - The ability for a card to be refreshed at the time it is displayed
+ - The ability for `Action.Execute` actions to return an updated card to be immediately displayed in the client
+
+For more information about Actionable Messages in Outlook, please refer to the [Actionable Message documentation](https://docs.microsoft.com/outlook/actionable-messages/send-via-email)
+
+Before `Action.Execute` | With `Action.Execute`
+:-------------------------:|:-------------------------:
+![An image depicting the current inconsistent model in Teams and Outlook](media/universal-action-model/inconsistent-action-model-lifecycle.png) | ![An image depicting the consistent model that is enabled with Action.Execute in Teams and Outlook](media/universal-action-model/universal-action-model-lifecycle.jpg)
+![An image showing how Adaptive Card JSONs look like with current inconsistent model](media/universal-action-model/inconsistent-action-model.png) | ![An image showing how Adaptive Card JSONs would look the same with new Action.Execute based model](media/universal-action-model/new-universal-action-model.jpg)
+
+Source: [Adaptive Cards @ Microsoft Build 2020](https://youtu.be/hEBhwB72Qn4?t=1393)
+
+The rest of this document focuses on documenting the universal Bot action model in the context of Teams & Outlook. If you are already using Adaptive cards on Teams with Bot, you can use the same Bot with a few changes to support `Action.Execute`. If you are using Actionable Messages on Outlook, you will need to develop a Bot that supports `Action.Execute`. Currently the support on Outlook clients for Universal Bot action model is under active development.
+
+## Schema
+
+> ### IMPORTANT
+>
+> The universal Bot action model is introduced in the **Adaptive Cards schema version 1.4**. In order to use these new capabilities, the `version` property of your Adaptive Card must be set to **1.4** or greater, as shown in the below examples. Note that this will make your Adaptive Card incompatible with older clients (Outlook or Teams) that do not support the universal Bot action model.
+>
+> If you use the `refresh` property and/or `Action.Execute` and specify a card version < 1.4, the following will happen:
+>
+> | Client | Behavior |
+> | --- | --- |
+> | Outlook | Your card **WILL NOT** work. `refresh` will not be honored and `Action.Execute` will not render. Your card may even be rejected entirely. |
+> | Teams | Your card **MAY NOT** work (the `refresh` may not be honored, and the `Action.Execute` actions may not render) depending on the version of the Teams client.
To ensure maximum compatibility in Teams, consider defining your `Action.Execute` actions with an `Action.Submit` action in the `fallback` property. |
+>
+> Refer to the **Backward compatibility** section below for more information.
+
+
+### Action.Execute
+
+When authoring Adaptive Cards, use `Action.Execute` in place of both `Action.Submit` & `Action.Http`. The schema for `Action.Execute` is quite similar to that of `Action.Submit`.
+
+**Example JSON**
+```json
+{
+ "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
+ "type": "AdaptiveCard",
+ "version": "1.4",
+ "body": [
+ {
+ "type": "TextBlock",
+ "text": "Present a form and submit it back to the originator"
+ },
+ {
+ "type": "Input.Text",
+ "id": "firstName",
+ "placeholder": "What is your first name?"
+ },
+ {
+ "type": "Input.Text",
+ "id": "lastName",
+ "placeholder": "What is your last name?"
+ },
+ {
+ "type": "ActionSet",
+ "actions": [
+ {
+ "type": "Action.Execute",
+ "title": "Submit",
+ "verb": "personalDetailsFormSubmit",
+ "fallback": "Action.Submit"
+ }
+ ]
+ }
+ ]
+}
+```
+
+**Properties**
+
+| Property | Type | Required | Description
+| -------- | ---- | -------- | -----------
+| **type** | `"Action.Execute"` | Yes | Must be `"Action.Execute"`. |
+| **verb** | string | No | A convenience string that can be used by developer to identify the action |
+| **data** | `string`, `object` | No | Initial data that input fields will be combined with. These are essentially ‘hidden’ properties. |
+| **title** | `string` | No | Label for button or link that represents this action. |
+| **iconUrl** | `uri` | No | Optional icon to be shown on the action in conjunction with the title. Supports data URI in Adaptive Cards version 1.2+ |
+| **style** | `ActionStyle` | No | Controls the style of an Action, which influences how the action is displayed, spoken, etc. |
+| **fallback** | ``, `"drop"` | No | Describes what to do when Action.Execute is unsupported by the client displaying the card. |
+| **requires** | `Dictionary` | No | A series of key/value pairs indicating features that the item requires with corresponding minimum version. When a feature is missing or of insufficient version, fallback is triggered. |
+
+
+### Refresh mechanism
+
+Alongside `Action.Execute`, a new refresh mechanism is now supported, making it possible to create Adaptive Cards that automatically update at the time they are displayed. This ensures that users always see up to date data. A typical refresh use case is an approval request: once approved, it is best that users are not presented with a card prompting them to approve when it's already been done, but instead provides information on the time the request was approved and by whom.
+
+To allow an Adaptiver Card to automatically refresh, define its `refresh` property, which embeds an `action` of type `Action.Execute` as well as a `userIds` array.
+
+| Property | Type | Required | Description
+| -------- | ---- | -------- | -----------
+| **action** | `"Action.Execute"` | Yes | Must be an action instance of type `"Action.Execute"`. |
+| **userIds** | `Array` | Yes | An array of `MRI`s of users for whom Auto Refresh must be enabled.
**IMPORTANT:** If the `userIds` list property isn't included in the `refresh` section of the card, the card will NOT be automatically refresh on display. Instead, a button will be presented to the user to allow them to manually refresh. The reason for this is Channels in Teams can include a large number of members; if many members are all viewing the channel at the same time, and unconditional automatic refresh would results in many concurrent calls to the Bot, which would not scale. To alleviate the potential scale problem, the `userIds` property should always be included to identify which users should get an automatic refresh, with a maximum of **5** user IDs currently being allowed.
Note that the `userIds` property is ignored in Outlook, and the `refresh` property is always automatically honored. There is no scale issue in Outlook because users will typically view the card at different times. |
+
+**Sample JSON**
+```JSON
+{
+ "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
+ "type": "AdaptiveCard",
+ "originator":"c9b4352b-a76b-43b9-88ff-80edddaa243b",
+ "version": "1.4",
+ "refresh": {
+ "action": {
+ "type": "Action.Execute",
+ "title": "Submit",
+ "verb": "personalDetailsCardRefresh"
+ },
+ "userIds": []
+ },
+ "body": [
+ {
+ "type": "TextBlock",
+ "text": "Present a form and submit it back to the originator"
+ },
+ {
+ "type": "Input.Text",
+ "id": "firstName",
+ "placeholder": "What is your first name?"
+ },
+ {
+ "type": "Input.Text",
+ "id": "lastName",
+ "placeholder": "What is your last name?"
+ },
+ {
+ "type": "ActionSet",
+ "actions": [
+ {
+ "type": "Action.Execute",
+ "title": "Submit",
+ "verb": "personalDetailsFormSubmit",
+ "fallback": "Action.Submit"
+ }
+ ]
+ }
+ ]
+}
+```
+
+#### Important note for Outlook Actionable Message developers
+
+When developing Outlook Actionable Message scenarios, the Adaptive Card's `originator` property must be specified. `originator` is a Globally Unique Identified (GUID) generated at the time a Bot subscribes to the Outlook channel. It is used by Outlook to validate that the Adaptive Card was sent by an authorized Bot. The Adaptive Card will not be rendered in Outlook if `originator` is absent. `originator` is ignored in Teams.
+
+### `adaptiveCard/action` Invoke activity
+
+When an `Action.Execute` is executed in the client (whether it's the refresh action or an action explicitly taken by a user by clicking a button), a new type of Invoke activity - `adaptiveCard/action` - is made to your Bot. A typical `adaptiveCard/action` Invoke activity request will look like the following:
+
+#### Request format
+
+```
+{
+ "type": "invoke",
+ "name": "adaptiveCard/action",
+
+ // ... other properties omitted for brevity
+
+ "value": {
+ "action": {
+ "type": "Action.Execute",
+ "id": "abc",
+ "verb": "def",
+ "data": { ... }
+ },
+ "trigger": "automatic | manual"
+ }
+}
+```
+
+| Field | Description |
+| -------- | ----------- |
+| **value.action** | A copy of the action as defined in the Adaptive Card. Like with `Action.Submit`, the `data` property of the action includes the values of the various inputs in the card, if there are any |
+| **value.trigger** | Indicates if the action was triggered explicitly (by the user clicking a button) or implicitly (via automatic refresh) |
+
+#### Response format
+
+If the Bot did process an incoming `adaptiveCard/action` Invoke activity (i.e. if the Bot's code was involved at all in processing the request), the HTTP response's status code returned by the Bot must be equal to 200 and the body of the HTTP response must be formatted as follows:
+
+```JSON
+{
+ "statusCode": ,
+ "type": "",
+ "value": "