diff --git a/ts/components/conversation/Message.md b/ts/components/conversation/Message.md
index ccd2c3db0d..080879a638 100644
--- a/ts/components/conversation/Message.md
+++ b/ts/components/conversation/Message.md
@@ -36,7 +36,7 @@ const View = Whisper.MessageView;
### With an attachment
-#### Image
+#### Image with caption
```jsx
const outgoing = new Whisper.Message({
@@ -66,7 +66,7 @@ const View = Whisper.MessageView;
```
-#### Image, no caption
+#### Image
```jsx
const outgoing = new Whisper.Message({
@@ -95,7 +95,7 @@ const View = Whisper.MessageView;
```
-#### Video
+#### Video with caption
```jsx
const outgoing = new Whisper.Message({
@@ -125,7 +125,7 @@ const View = Whisper.MessageView;
```
-#### Video, no caption
+#### Video
```jsx
const outgoing = new Whisper.Message({
@@ -154,7 +154,7 @@ const View = Whisper.MessageView;
```
-#### Audio
+#### Audio with caption
```jsx
const outgoing = new Whisper.Message({
@@ -184,7 +184,7 @@ const View = Whisper.MessageView;
```
-#### Audio, no caption
+#### Audio
```jsx
const outgoing = new Whisper.Message({
@@ -243,7 +243,7 @@ const View = Whisper.MessageView;
```
-#### Other file type
+#### Other file type with caption
```jsx
const outgoing = new Whisper.Message({
@@ -273,7 +273,7 @@ const View = Whisper.MessageView;
```
-#### Other file type, no caption
+#### Other file type
```jsx
const outgoing = new Whisper.Message({
@@ -301,3 +301,384 @@ const View = Whisper.MessageView;
/>
```
+
+### With a quotation, text-only replies
+
+#### Plain text
+
+```jsx
+const outgoing = new Whisper.Message({
+ type: 'outgoing',
+ body: 'About six',
+ sent_at: Date.now() - 18000000,
+ quote: {
+ text: 'How many ferrets do you have?',
+ author: '+12025550100',
+ id: Date.now() - 1000,
+ },
+});
+const incoming = new Whisper.Message(Object.assign({}, outgoing.attributes, {
+ source: '+12025550100',
+ type: 'incoming',
+ quote: Object.assign({}, outgoing.attributes.quote, {
+ author: '+12025550200',
+ }),
+}));
+const View = Whisper.MessageView;
+
+
+
+
+```
+
+#### Image with caption
+
+```jsx
+const outgoing = new Whisper.Message({
+ type: 'outgoing',
+ body: "Totally, it's a pretty unintuitive concept.",
+ sent_at: Date.now() - 18000000,
+ quote: {
+ text: 'I am pretty confused about Pi.',
+ author: '+12025550100',
+ id: Date.now() - 1000,
+ attachments: {
+ contentType: 'image/gif',
+ fileName: 'pi.gif',
+ thumbnail: {
+ contentType: 'image/gif',
+ data: util.gif,
+ }
+ }
+ },
+});
+const incoming = new Whisper.Message(Object.assign({}, outgoing.attributes, {
+ source: '+12025550100',
+ type: 'incoming',
+ quote: Object.assign({}, outgoing.attributes.quote, {
+ author: '+12025550200',
+ }),
+}));
+const View = Whisper.MessageView;
+
+
+
+
+```
+
+#### Image
+
+```jsx
+const outgoing = new Whisper.Message({
+ type: 'outgoing',
+ body: "Yeah, pi. Tough to wrap your head around.",
+ sent_at: Date.now() - 18000000,
+ quote: {
+ author: '+12025550100',
+ id: Date.now() - 1000,
+ attachments: {
+ contentType: 'image/gif',
+ fileName: 'pi.gif',
+ thumbnail: {
+ contentType: 'image/gif',
+ data: util.gif,
+ }
+ }
+ },
+});
+const incoming = new Whisper.Message(Object.assign({}, outgoing.attributes, {
+ source: '+12025550100',
+ type: 'incoming',
+ quote: Object.assign({}, outgoing.attributes.quote, {
+ author: '+12025550200',
+ }),
+}));
+const View = Whisper.MessageView;
+
+
+
+
+```
+
+#### Video with caption
+
+```jsx
+const outgoing = new Whisper.Message({
+ type: 'outgoing',
+ body: "Sweet the way the video sneaks up on you!",
+ sent_at: Date.now() - 18000000,
+ quote: {
+ author: '+12025550100',
+ text: 'Check out this video I found!',
+ id: Date.now() - 1000,
+ attachments: {
+ contentType: 'video/mp4',
+ fileName: 'freezing_bubble.mp4',
+ thumbnail: {
+ contentType: 'image/gif',
+ data: util.gif,
+ }
+ }
+ },
+});
+const incoming = new Whisper.Message(Object.assign({}, outgoing.attributes, {
+ source: '+12025550100',
+ type: 'incoming',
+ quote: Object.assign({}, outgoing.attributes.quote, {
+ author: '+12025550200',
+ }),
+}));
+const View = Whisper.MessageView;
+
+
+
+
+```
+
+#### Video
+
+```jsx
+const outgoing = new Whisper.Message({
+ type: 'outgoing',
+ body: "Awesome!",
+ sent_at: Date.now() - 18000000,
+ quote: {
+ author: '+12025550100',
+ id: Date.now() - 1000,
+ attachments: {
+ contentType: 'video/mp4',
+ fileName: 'freezing_bubble.mp4',
+ thumbnail: {
+ contentType: 'image/gif',
+ data: util.gif,
+ }
+ }
+ },
+});
+const incoming = new Whisper.Message(Object.assign({}, outgoing.attributes, {
+ source: '+12025550100',
+ type: 'incoming',
+ quote: Object.assign({}, outgoing.attributes.quote, {
+ author: '+12025550200',
+ }),
+}));
+const View = Whisper.MessageView;
+
+
+
+
+```
+
+#### Audio with caption
+
+```jsx
+const outgoing = new Whisper.Message({
+ type: 'outgoing',
+ body: 'I really like it!',
+ sent_at: Date.now() - 18000000,
+ quote: {
+ author: '+12025550100',
+ text: 'Check out this beautiful song!',
+ id: Date.now() - 1000,
+ attachments: {
+ contentType: 'audio/mp3',
+ fileName: 'agnus_dei.mp4',
+ }
+ },
+});
+const incoming = new Whisper.Message(Object.assign({}, outgoing.attributes, {
+ source: '+12025550100',
+ type: 'incoming',
+ quote: Object.assign({}, outgoing.attributes.quote, {
+ author: '+12025550200',
+ }),
+}));
+const View = Whisper.MessageView;
+
+
+
+
+```
+
+#### Audio
+
+```jsx
+const outgoing = new Whisper.Message({
+ type: 'outgoing',
+ body: 'I really like it!',
+ sent_at: Date.now() - 18000000,
+ quote: {
+ author: '+12025550100',
+ id: Date.now() - 1000,
+ attachments: {
+ contentType: 'audio/mp3',
+ fileName: 'agnus_dei.mp4',
+ }
+ },
+});
+const incoming = new Whisper.Message(Object.assign({}, outgoing.attributes, {
+ source: '+12025550100',
+ type: 'incoming',
+ quote: Object.assign({}, outgoing.attributes.quote, {
+ author: '+12025550200',
+ }),
+}));
+const View = Whisper.MessageView;
+
+
+
+
+```
+
+#### Voice message
+
+```jsx
+const outgoing = new Whisper.Message({
+ type: 'outgoing',
+ body: 'I really like it!',
+ sent_at: Date.now() - 18000000,
+ quote: {
+ author: '+12025550100',
+ id: Date.now() - 1000,
+ attachments: {
+ // proposed as of afternoon of 4/6 in Quoted Replies group
+ flags: textsecure.protobuf.AttachmentPointer.Flags.VOICE_MESSAGE,
+ contentType: 'audio/mp3',
+ fileName: 'agnus_dei.mp4',
+ }
+ },
+});
+const incoming = new Whisper.Message(Object.assign({}, outgoing.attributes, {
+ source: '+12025550100',
+ type: 'incoming',
+ quote: Object.assign({}, outgoing.attributes.quote, {
+ author: '+12025550200',
+ }),
+}));
+const View = Whisper.MessageView;
+
+
+
+
+```
+
+#### Other file type with caption
+
+```jsx
+const outgoing = new Whisper.Message({
+ type: 'outgoing',
+ body: "I can't read latin.",
+ sent_at: Date.now() - 18000000,
+ quote: {
+ author: '+12025550100',
+ text: 'This is my manifesto. Tell me what you think!',
+ id: Date.now() - 1000,
+ attachments: {
+ contentType: 'text/plain',
+ fileName: 'lorum_ipsum.txt',
+ }
+ },
+});
+const incoming = new Whisper.Message(Object.assign({}, outgoing.attributes, {
+ source: '+12025550100',
+ type: 'incoming',
+ quote: Object.assign({}, outgoing.attributes.quote, {
+ author: '+12025550200',
+ }),
+}));
+const View = Whisper.MessageView;
+
+
+
+
+```
+
+#### Other file type
+
+```jsx
+const outgoing = new Whisper.Message({
+ type: 'outgoing',
+ body: "Sorry, I can't read latin!",
+ sent_at: Date.now() - 18000000,
+ quote: {
+ author: '+12025550100',
+ id: Date.now() - 1000,
+ attachments: {
+ contentType: 'text/plain',
+ fileName: 'lorum_ipsum.txt',
+ }
+ },
+});
+const incoming = new Whisper.Message(Object.assign({}, outgoing.attributes, {
+ source: '+12025550100',
+ type: 'incoming',
+ quote: Object.assign({}, outgoing.attributes.quote, {
+ author: '+12025550200',
+ }),
+}));
+const View = Whisper.MessageView;
+
+
+
+
+```