diff --git a/Gemfile b/Gemfile
index d10b88b191966176b8845f95577f0603fe2ec10a..d587db50e699bd2ca525dbe0b0245cad234b3e19 100644
--- a/Gemfile
+++ b/Gemfile
@@ -63,6 +63,8 @@ gem 'http_accept_language', '~> 2.1'
 gem 'httplog', '~> 1.4.3'
 gem 'idn-ruby', require: 'idn'
 gem 'kaminari', '~> 1.2'
+gem 'kramdown', '~> 2.3'
+gem 'kramdown-parser-gfm', '~> 1.1'
 gem 'link_header', '~> 0.0'
 gem 'mime-types', '~> 3.3.1', require: 'mime/types/columnar'
 gem 'nilsimsa', git: 'https://github.com/witgo/nilsimsa', ref: 'fd184883048b922b176939f851338d0a4971a532'
diff --git a/Gemfile.lock b/Gemfile.lock
index 3c23330d13e570a20465730b35f50c229540be57..a31c0ffce56c9266e7a90136ba33e008b5a22376 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -324,6 +324,10 @@ GEM
       activerecord
       kaminari-core (= 1.2.1)
     kaminari-core (1.2.1)
+    kramdown (2.3.0)
+      rexml
+    kramdown-parser-gfm (1.1.0)
+      kramdown (~> 2.0)
     launchy (2.5.0)
       addressable (~> 2.7)
     letter_opener (1.7.0)
@@ -760,6 +764,8 @@ DEPENDENCIES
   json-ld
   json-ld-preloaded (~> 3.1)
   kaminari (~> 1.2)
+  kramdown (~> 2.3)
+  kramdown-parser-gfm (~> 1.1)
   letter_opener (~> 1.7)
   letter_opener_web (~> 1.4)
   link_header (~> 0.0)
diff --git a/app/controllers/api/v1/accounts/credentials_controller.rb b/app/controllers/api/v1/accounts/credentials_controller.rb
index af4b6e68f9765225832ed27e858bdb73a3177dca..209c8958dedf3ff196d0633b190147e82b44fa09 100644
--- a/app/controllers/api/v1/accounts/credentials_controller.rb
+++ b/app/controllers/api/v1/accounts/credentials_controller.rb
@@ -34,6 +34,7 @@ class Api::V1::Accounts::CredentialsController < Api::BaseController
       'setting_default_sensitive' => source_params.fetch(:sensitive, @account.user.setting_default_sensitive),
       'setting_default_language' => source_params.fetch(:language, @account.user.setting_default_language),
       'setting_default_federation' => source_params.fetch(:federation, @account.user.setting_default_federation),
+      'setting_default_content_type' => source_params.fetch(:content_type, @account.user.setting_default_content_type),
     }
   end
 end
diff --git a/app/controllers/api/v1/statuses_controller.rb b/app/controllers/api/v1/statuses_controller.rb
index ec4a56c1972630ed58d9d8fd585d75e2b14dc15f..c97822691c05f942cacd2723e03d187a65a9db58 100644
--- a/app/controllers/api/v1/statuses_controller.rb
+++ b/app/controllers/api/v1/statuses_controller.rb
@@ -53,6 +53,7 @@ class Api::V1::StatusesController < Api::BaseController
                                          idempotency: request.headers['Idempotency-Key'],
                                          with_rate_limit: true,
                                          quote_id: status_params[:quote_id].presence,
+                                         content_type: status_params[:content_type], #'text/markdown'
                                          local_only: status_params[:local_only])
 
     render json: @status, serializer: @status.is_a?(ScheduledStatus) ? REST::ScheduledStatusSerializer : REST::StatusSerializer
@@ -102,6 +103,7 @@ class Api::V1::StatusesController < Api::BaseController
       :quote_id,
       :expires_at,
       :expires_action,
+      :content_type,
       :local_only,
       media_ids: [],
       poll: [
diff --git a/app/controllers/settings/preferences_controller.rb b/app/controllers/settings/preferences_controller.rb
index 0b2fd4bba9c97fb3e26adcb1db2e4796a14bfb63..8c9c2aa3a11c7bf314fad3ff74c78b7557697de2 100644
--- a/app/controllers/settings/preferences_controller.rb
+++ b/app/controllers/settings/preferences_controller.rb
@@ -37,6 +37,7 @@ class Settings::PreferencesController < Settings::BaseController
       :setting_default_sensitive,
       :setting_default_language,
       :setting_default_federation,
+      :setting_default_content_type,
       :setting_unfollow_modal,
       :setting_unsubscribe_modal,
       :setting_boost_modal,
diff --git a/app/javascript/mastodon/actions/compose.js b/app/javascript/mastodon/actions/compose.js
index 2dcb95baeed744e1e9420f4b45468bdd76af0c8f..db4d5801a657b0783b5af72a01382356d4c6a365 100644
--- a/app/javascript/mastodon/actions/compose.js
+++ b/app/javascript/mastodon/actions/compose.js
@@ -51,6 +51,7 @@ export const COMPOSE_SPOILER_TEXT_CHANGE = 'COMPOSE_SPOILER_TEXT_CHANGE';
 export const COMPOSE_VISIBILITY_CHANGE  = 'COMPOSE_VISIBILITY_CHANGE';
 export const COMPOSE_CIRCLE_CHANGE = 'COMPOSE_CIRCLE_CHANGE';
 export const COMPOSE_FEDERATION_CHANGE  = 'COMPOSE_FEDERATION_CHANGE';
+export const COMPOSE_CONTENT_TYPE_CHANGE  = 'COMPOSE_CONTENT_TYPE_CHANGE';
 export const COMPOSE_LISTABILITY_CHANGE = 'COMPOSE_LISTABILITY_CHANGE';
 export const COMPOSE_COMPOSING_CHANGE = 'COMPOSE_COMPOSING_CHANGE';
 
@@ -171,6 +172,7 @@ export function submitCompose(routerHistory) {
       poll: getState().getIn(['compose', 'poll'], null),
       quote_id: getState().getIn(['compose', 'quote_from'], null),
       local_only: !getState().getIn(['compose', 'federation']),
+      content_type: getState().getIn(['compose', 'content_type']),
     }, {
       headers: {
         'Idempotency-Key': getState().getIn(['compose', 'idempotencyKey']),
@@ -634,6 +636,13 @@ export function changeComposeFederation(value) {
   };
 };
 
+export function changeComposeContentType(value) {
+  return {
+    type: COMPOSE_CONTENT_TYPE_CHANGE,
+    value,
+  };
+};
+
 export function insertEmojiCompose(position, emoji, needsSpace) {
   return {
     type: COMPOSE_EMOJI_INSERT,
diff --git a/app/javascript/mastodon/features/compose/components/compose_form.js b/app/javascript/mastodon/features/compose/components/compose_form.js
index dd243b9d657d7f35fa1c3a0ead0b92aea0ee3636..5eefc193acd9ecf491e85a359b72d9e28e5cc2f2 100644
--- a/app/javascript/mastodon/features/compose/components/compose_form.js
+++ b/app/javascript/mastodon/features/compose/components/compose_form.js
@@ -14,6 +14,7 @@ import SpoilerButtonContainer from '../containers/spoiler_button_container';
 import PrivacyDropdownContainer from '../containers/privacy_dropdown_container';
 import CircleDropdownContainer from '../containers/circle_dropdown_container';
 import FederationDropdownContainer from '../containers/federation_dropdown_container';
+import ContentTypeDropdownContainer from '../containers/content_type_dropdown_container';
 import EmojiPickerDropdown from '../containers/emoji_picker_dropdown_container';
 import PollFormContainer from '../containers/poll_form_container';
 import UploadFormContainer from '../containers/upload_form_container';
@@ -47,6 +48,7 @@ class ComposeForm extends ImmutablePureComponent {
     spoiler: PropTypes.bool,
     privacy: PropTypes.string,
     federation: PropTypes.bool,
+    contentType: PropTypes.string,
     spoilerText: PropTypes.string,
     focusDate: PropTypes.instanceOf(Date),
     caretPosition: PropTypes.number,
@@ -246,6 +248,7 @@ class ComposeForm extends ImmutablePureComponent {
           <div className='compose-form__buttons'>
             <UploadButtonContainer />
             <PollButtonContainer />
+            <ContentTypeDropdownContainer/>
             <PrivacyDropdownContainer />
             <SpoilerButtonContainer />
             <FederationDropdownContainer />
diff --git a/app/javascript/mastodon/features/compose/components/content_type_dropdown.js b/app/javascript/mastodon/features/compose/components/content_type_dropdown.js
new file mode 100644
index 0000000000000000000000000000000000000000..5ac32cf20c55f3edbcd8b4d9790ffa2581d1187e
--- /dev/null
+++ b/app/javascript/mastodon/features/compose/components/content_type_dropdown.js
@@ -0,0 +1,272 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { injectIntl, defineMessages } from 'react-intl';
+import IconButton from '../../../components/icon_button';
+import Overlay from 'react-overlays/lib/Overlay';
+import Motion from '../../ui/util/optional_motion';
+import spring from 'react-motion/lib/spring';
+import detectPassiveEvents from 'detect-passive-events';
+import classNames from 'classnames';
+import Icon from 'mastodon/components/icon';
+
+const messages = defineMessages({
+  plain: { id: 'content_type.plain.short', defaultMessage: 'Plain Text' },
+  markdown: { id: 'content_type.markdown.short', defaultMessage: 'Markdown' },
+  change_content_type: { id: 'content_type.change', defaultMessage: 'Adjust status content type' },
+});
+
+const listenerOptions = detectPassiveEvents.hasSupport ? { passive: true } : false;
+
+class ContentTypeDropdownMenu extends React.PureComponent {
+
+  static propTypes = {
+    style: PropTypes.object,
+    items: PropTypes.array.isRequired,
+    value: PropTypes.string.isRequired,
+    placement: PropTypes.string.isRequired,
+    onClose: PropTypes.func.isRequired,
+    onChange: PropTypes.func.isRequired,
+  };
+
+  state = {
+    mounted: false,
+  };
+
+  handleDocumentClick = e => {
+    if (this.node && !this.node.contains(e.target)) {
+      this.props.onClose();
+    }
+  }
+
+  handleKeyDown = e => {
+    const { items } = this.props;
+    const value = e.currentTarget.getAttribute('data-index');
+    const index = items.findIndex(item => {
+      return (item.value === value);
+    });
+    let element = null;
+
+    switch(e.key) {
+    case 'Escape':
+      this.props.onClose();
+      break;
+    case 'Enter':
+      this.handleClick(e);
+      break;
+    case 'ArrowDown':
+      element = this.node.childNodes[index + 1] || this.node.firstChild;
+      break;
+    case 'ArrowUp':
+      element = this.node.childNodes[index - 1] || this.node.lastChild;
+      break;
+    case 'Tab':
+      if (e.shiftKey) {
+        element = this.node.childNodes[index - 1] || this.node.lastChild;
+      } else {
+        element = this.node.childNodes[index + 1] || this.node.firstChild;
+      }
+      break;
+    case 'Home':
+      element = this.node.firstChild;
+      break;
+    case 'End':
+      element = this.node.lastChild;
+      break;
+    }
+
+    if (element) {
+      element.focus();
+      this.props.onChange(element.getAttribute('data-index'));
+      e.preventDefault();
+      e.stopPropagation();
+    }
+  }
+
+  handleClick = e => {
+    const value = e.currentTarget.getAttribute('data-index');
+
+    e.preventDefault();
+
+    this.props.onClose();
+    this.props.onChange(value);
+  }
+
+  componentDidMount () {
+    document.addEventListener('click', this.handleDocumentClick, false);
+    document.addEventListener('touchend', this.handleDocumentClick, listenerOptions);
+    if (this.focusedItem) this.focusedItem.focus({ preventScroll: true });
+    this.setState({ mounted: true });
+  }
+
+  componentWillUnmount () {
+    document.removeEventListener('click', this.handleDocumentClick, false);
+    document.removeEventListener('touchend', this.handleDocumentClick, listenerOptions);
+  }
+
+  setRef = c => {
+    this.node = c;
+  }
+
+  setFocusRef = c => {
+    this.focusedItem = c;
+  }
+
+  render () {
+    const { mounted } = this.state;
+    const { style, items, placement, value } = this.props;
+
+    return (
+      <Motion defaultStyle={{ opacity: 0, scaleX: 0.85, scaleY: 0.75 }} style={{ opacity: spring(1, { damping: 35, stiffness: 400 }), scaleX: spring(1, { damping: 35, stiffness: 400 }), scaleY: spring(1, { damping: 35, stiffness: 400 }) }}>
+        {({ opacity, scaleX, scaleY }) => (
+          // It should not be transformed when mounting because the resulting
+          // size will be used to determine the coordinate of the menu by
+          // react-overlays
+          <div className={`privacy-dropdown__dropdown ${placement}`} style={{ ...style, opacity: opacity, transform: mounted ? `scale(${scaleX}, ${scaleY})` : null, zIndex: 2 }} role='listbox' ref={this.setRef}>
+            {items.map(item => (
+              <div role='option' tabIndex='0' key={item.value} data-index={item.value} onKeyDown={this.handleKeyDown} onClick={this.handleClick} className={classNames('privacy-dropdown__option', { active: item.value === value })} aria-selected={item.value === value} ref={item.value === value ? this.setFocusRef : null}>
+                <div className='privacy-dropdown__option__icon'>
+                  <Icon id={item.icon} fixedWidth />
+                </div>
+
+                <div className='privacy-dropdown__option__content'>
+                  <strong>{item.text}</strong>
+                  {item.meta}
+                </div>
+              </div>
+            ))}
+          </div>
+        )}
+      </Motion>
+    );
+  }
+
+}
+
+export default @injectIntl
+class ContentTypeDropdown extends React.PureComponent {
+
+  static propTypes = {
+    isUserTouching: PropTypes.func,
+    isModalOpen: PropTypes.bool.isRequired,
+    onModalOpen: PropTypes.func,
+    onModalClose: PropTypes.func,
+    value: PropTypes.string.isRequired,
+    onChange: PropTypes.func.isRequired,
+    intl: PropTypes.object.isRequired,
+  };
+
+  state = {
+    open: false,
+    placement: 'bottom',
+  };
+
+  handleToggle = ({ target }) => {
+    if (this.props.isUserTouching()) {
+      if (this.state.open) {
+        this.props.onModalClose();
+      } else {
+        this.props.onModalOpen({
+          actions: this.options.map(option => ({ ...option, active: option.value === this.props.value })),
+          onClick: this.handleModalActionClick,
+        });
+      }
+    } else {
+      const { top } = target.getBoundingClientRect();
+      if (this.state.open && this.activeElement) {
+        this.activeElement.focus({ preventScroll: true });
+      }
+      this.setState({ placement: top * 2 < innerHeight ? 'bottom' : 'top' });
+      this.setState({ open: !this.state.open });
+    }
+  }
+
+  handleModalActionClick = (e) => {
+    e.preventDefault();
+
+    const { value } = this.options[e.currentTarget.getAttribute('data-index')];
+
+    this.props.onModalClose();
+    this.props.onChange(value);
+  }
+
+  handleKeyDown = e => {
+    switch(e.key) {
+    case 'Escape':
+      this.handleClose();
+      break;
+    }
+  }
+
+  handleMouseDown = () => {
+    if (!this.state.open) {
+      this.activeElement = document.activeElement;
+    }
+  }
+
+  handleButtonKeyDown = (e) => {
+    switch(e.key) {
+    case ' ':
+    case 'Enter':
+      this.handleMouseDown();
+      break;
+    }
+  }
+
+  handleClose = () => {
+    if (this.state.open && this.activeElement) {
+      this.activeElement.focus({ preventScroll: true });
+    }
+    this.setState({ open: false });
+  }
+
+  handleChange = value => {
+    this.props.onChange(value);
+  }
+
+  componentWillMount () {
+    const { intl: { formatMessage } } = this.props;
+
+    this.options = [
+      { icon: 'file-text', value: 'text/plain', text: formatMessage(messages.plain), meta: null },
+      { icon: 'arrow-circle-down', value: 'text/markdown', text: formatMessage(messages.markdown), meta: null },
+    ];
+  }
+
+  render () {
+    const { value, intl } = this.props;
+    const { open, placement } = this.state;
+
+    const valueOption = this.options.find(item => item.value === value);
+
+    return (
+      <div className={classNames('privacy-dropdown', placement, { active: open })} onKeyDown={this.handleKeyDown}>
+        <div className={classNames('privacy-dropdown__value', { active: this.options.indexOf(valueOption) === (placement === 'bottom' ? 0 : (this.options.length - 1)) })}>
+          <IconButton
+            className='privacy-dropdown__value-icon'
+            icon={valueOption.icon}
+            title={intl.formatMessage(messages.change_content_type)}
+            size={18}
+            expanded={open}
+            active={open}
+            inverted
+            onClick={this.handleToggle}
+            onMouseDown={this.handleMouseDown}
+            onKeyDown={this.handleButtonKeyDown}
+            style={{ height: null, lineHeight: '27px' }}
+          />
+        </div>
+
+        <Overlay show={open} placement={placement} target={this}>
+          <ContentTypeDropdownMenu
+            items={this.options}
+            value={value}
+            onClose={this.handleClose}
+            onChange={this.handleChange}
+            placement={placement}
+          />
+        </Overlay>
+      </div>
+    );
+  }
+
+}
diff --git a/app/javascript/mastodon/features/compose/containers/compose_form_container.js b/app/javascript/mastodon/features/compose/containers/compose_form_container.js
index d1af2a60724e5e06f181da1152544922befdf035..39b307f2ede09ef191009798fe6e410d714c3995 100644
--- a/app/javascript/mastodon/features/compose/containers/compose_form_container.js
+++ b/app/javascript/mastodon/features/compose/containers/compose_form_container.js
@@ -18,6 +18,7 @@ const mapStateToProps = state => ({
   spoilerText: state.getIn(['compose', 'spoiler_text']),
   privacy: state.getIn(['compose', 'privacy']),
   federation: state.getIn(['compose', 'federation']),
+  contentType: state.getIn(['compose', 'content_type']),
   focusDate: state.getIn(['compose', 'focusDate']),
   caretPosition: state.getIn(['compose', 'caretPosition']),
   preselectDate: state.getIn(['compose', 'preselectDate']),
diff --git a/app/javascript/mastodon/features/compose/containers/content_type_dropdown_container.js b/app/javascript/mastodon/features/compose/containers/content_type_dropdown_container.js
new file mode 100644
index 0000000000000000000000000000000000000000..18107bce0ccb42848059652941be90f2c9b96c36
--- /dev/null
+++ b/app/javascript/mastodon/features/compose/containers/content_type_dropdown_container.js
@@ -0,0 +1,24 @@
+import { connect } from 'react-redux';
+import ContentTypeDropdown from '../components/content_type_dropdown';
+import { changeComposeContentType } from '../../../actions/compose';
+import { openModal, closeModal } from '../../../actions/modal';
+import { isUserTouching } from '../../../is_mobile';
+
+const mapStateToProps = state => ({
+  isModalOpen: state.get('modal').modalType === 'ACTIONS',
+  value: state.getIn(['compose', 'content_type']),
+});
+
+const mapDispatchToProps = dispatch => ({
+
+  onChange (value) {
+    dispatch(changeComposeContentType(value));
+  },
+
+  isUserTouching,
+  onModalOpen: props => dispatch(openModal('ACTIONS', props)),
+  onModalClose: () => dispatch(closeModal()),
+
+});
+
+export default connect(mapStateToProps, mapDispatchToProps)(ContentTypeDropdown);
diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json
index 876c6962c5d99839df8c19a7f0be3b0436473dcf..8af877910e7aa3688139be52d73cc708d83a6d90 100644
--- a/app/javascript/mastodon/locales/ar.json
+++ b/app/javascript/mastodon/locales/ar.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "الرد في الحين سوف يُعيد كتابة الرسالة التي أنت بصدد كتابتها. متأكد من أنك تريد المواصلة؟",
   "confirmations.unfollow.confirm": "إلغاء المتابعة",
   "confirmations.unfollow.message": "متأكد من أنك تريد إلغاء متابعة {name} ؟",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "احذف المحادثة",
   "conversation.mark_as_read": "اعتبرها كمقروءة",
   "conversation.open": "اعرض المحادثة",
diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json
index 675fbbf8e5de5bc136f98e63b51859ac01646442..b1c13a686b6dcba8b5873ec14f67d26f9c36a61e 100644
--- a/app/javascript/mastodon/locales/ast.json
+++ b/app/javascript/mastodon/locales/ast.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Responder agora va sobrescribir el mensaxe que tas componiendo anguaño. ¿De xuru que quies siguir?",
   "confirmations.unfollow.confirm": "Dexar de siguir",
   "confirmations.unfollow.message": "¿De xuru que quies dexar de siguir a {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Delete conversation",
   "conversation.mark_as_read": "Mark as read",
   "conversation.open": "View conversation",
diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json
index 9008de9ed8735fbe82b1bb318e384a359aa98a73..69fdba157c5a81344e939ce7bfb13e4acf299995 100644
--- a/app/javascript/mastodon/locales/bg.json
+++ b/app/javascript/mastodon/locales/bg.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
   "confirmations.unfollow.confirm": "Unfollow",
   "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Delete conversation",
   "conversation.mark_as_read": "Mark as read",
   "conversation.open": "View conversation",
diff --git a/app/javascript/mastodon/locales/bn.json b/app/javascript/mastodon/locales/bn.json
index 7de1a10221b2470daabdfb69b116a5fac84d298b..6bea3fee2e2d8084aa5d5b603568df8f10726a7b 100644
--- a/app/javascript/mastodon/locales/bn.json
+++ b/app/javascript/mastodon/locales/bn.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "এখন মতামত লিখতে গেলে আপনার এখন যেটা লিখছেন সেটা মুছে যাবে। আপনি নি নিশ্চিত এটা করতে চান ?",
   "confirmations.unfollow.confirm": "অনুসরণ করা বাতিল করতে",
   "confirmations.unfollow.message": "আপনি কি নিশ্চিত {name} কে আর অনুসরণ করতে চান না ?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "কথোপকথন মুছে ফেলুন",
   "conversation.mark_as_read": "পঠিত হিসেবে চিহ্নিত করুন",
   "conversation.open": "কথপোকথন দেখান",
diff --git a/app/javascript/mastodon/locales/br.json b/app/javascript/mastodon/locales/br.json
index 72a6d0a0a0e52a2d3368a0bcf36e9dfb89528f6e..e88a451c0ed6a0dc91be418a8e103cda7aaa2cec 100644
--- a/app/javascript/mastodon/locales/br.json
+++ b/app/javascript/mastodon/locales/br.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Respont bremañ a zilamo ar gemennadenn emaoc'h o skrivañ. Sur e oc'h e fell deoc'h kenderc'hel ganti?",
   "confirmations.unfollow.confirm": "Diheuliañ",
   "confirmations.unfollow.message": "Ha sur oc'h e fell deoc'h paouez da heuliañ {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Dilemel ar gaozeadenn",
   "conversation.mark_as_read": "Merkañ evel lennet",
   "conversation.open": "Gwelout ar gaozeadenn",
diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json
index 2273407ac895f9c0fd6740b470b0c5cd7dd11e89..5c2b6b65556ba679e822f03adc8b400f856590be 100644
--- a/app/javascript/mastodon/locales/ca.json
+++ b/app/javascript/mastodon/locales/ca.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Responen ara es sobreescriurà el missatge que estàs editant. Estàs segur que vols continuar?",
   "confirmations.unfollow.confirm": "Deixa de seguir",
   "confirmations.unfollow.message": "Estàs segur que vols deixar de seguir {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Elimina la conversa",
   "conversation.mark_as_read": "Marca com a llegida",
   "conversation.open": "Veure conversa",
diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json
index 34341ee8322ee915edea35e58eec2ddba1694b62..cd990718b70ce5b2b406eef5fcf07c208824d997 100644
--- a/app/javascript/mastodon/locales/co.json
+++ b/app/javascript/mastodon/locales/co.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Risponde avà sguasserà u missaghju chì scrivite. Site sicuru·a chì vulete cuntinuà?",
   "confirmations.unfollow.confirm": "Disabbunassi",
   "confirmations.unfollow.message": "Site sicuru·a ch'ùn vulete più siguità @{name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Sguassà a cunversazione",
   "conversation.mark_as_read": "Marcà cum'è lettu",
   "conversation.open": "Vede a cunversazione",
diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json
index cd5cd968056012cf4f54d40ac5667e1d88e94b13..a1ecc950acd32be977865646e5f6d006d7c8efd6 100644
--- a/app/javascript/mastodon/locales/cs.json
+++ b/app/javascript/mastodon/locales/cs.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Odpověď přepíše vaši rozepsanou zprávu. Opravdu chcete pokračovat?",
   "confirmations.unfollow.confirm": "Přestat sledovat",
   "confirmations.unfollow.message": "Opravdu chcete uživatele {name} přestat sledovat?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Smazat konverzaci",
   "conversation.mark_as_read": "Označit jako přečtenou",
   "conversation.open": "Zobrazit konverzaci",
diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json
index ecd49c577a48d49240592abc431432329432d319..8ab0fd0e72b045739113a12471cc34137011fa2c 100644
--- a/app/javascript/mastodon/locales/cy.json
+++ b/app/javascript/mastodon/locales/cy.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Bydd ateb nawr yn cymryd lle y neges yr ydych yn cyfansoddi ar hyn o bryd. Ydych chi'n sicr yr ydych am barhau?",
   "confirmations.unfollow.confirm": "Dad-ddilynwch",
   "confirmations.unfollow.message": "Ydych chi'n sicr eich bod am ddad-ddilyn {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Dileu sgwrs",
   "conversation.mark_as_read": "Nodi fel wedi'i ddarllen",
   "conversation.open": "Gweld sgwrs",
diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json
index fd6ec26f4d90065c1bc368cacb6f6f94ab96f6da..58bbef812bc510a3f2de08ab84a0177d9d610105 100644
--- a/app/javascript/mastodon/locales/da.json
+++ b/app/javascript/mastodon/locales/da.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Hvis du svarer nu vil du overskrive den besked du er ved at skrive. Er du sikker på, du vil fortsætte?",
   "confirmations.unfollow.confirm": "Følg ikke længere",
   "confirmations.unfollow.message": "Er du sikker på, du ikke længere vil følge {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Slet samtale",
   "conversation.mark_as_read": "Marker som læst",
   "conversation.open": "Vis samtale",
diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json
index 1a18bafc3cf1a6391ad337faca4ecb1a8fdde541..939aabf3655b1fd03a53652fa68b0bfea809d058 100644
--- a/app/javascript/mastodon/locales/de.json
+++ b/app/javascript/mastodon/locales/de.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Wenn du jetzt antwortest wird es die gesamte Nachricht verwerfen, die du gerade schreibst. Möchtest du wirklich fortfahren?",
   "confirmations.unfollow.confirm": "Entfolgen",
   "confirmations.unfollow.message": "Bist du dir sicher, dass du {name} entfolgen möchtest?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Unterhaltung löschen",
   "conversation.mark_as_read": "Als gelesen markieren",
   "conversation.open": "Unterhaltung anzeigen",
diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json
index bf0809437880a78965883b33c8a98e995f21f12a..77d61f36ad97b78f33a8faa6135495841d6e6814 100644
--- a/app/javascript/mastodon/locales/defaultMessages.json
+++ b/app/javascript/mastodon/locales/defaultMessages.json
@@ -1072,6 +1072,23 @@
     ],
     "path": "app/javascript/mastodon/features/compose/components/compose_form.json"
   },
+  {
+    "descriptors": [
+      {
+        "defaultMessage": "Plain Text",
+        "id": "content_type.plain.short"
+      },
+      {
+        "defaultMessage": "Markdown",
+        "id": "content_type.markdown.short"
+      },
+      {
+        "defaultMessage": "Adjust status content type",
+        "id": "content_type.change"
+      }
+    ],
+    "path": "app/javascript/mastodon/features/compose/components/content_type_dropdown.json"
+  },
   {
     "descriptors": [
       {
diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json
index 35adb204ed204bda9bed8ac8061b4a6b2a2081bf..e8b4374c729ab5d2c243f3345706cce79d22297b 100644
--- a/app/javascript/mastodon/locales/el.json
+++ b/app/javascript/mastodon/locales/el.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Απαντώντας τώρα θα αντικαταστήσεις το κείμενο που ήδη γράφεις. Σίγουρα θέλεις να συνεχίσεις;",
   "confirmations.unfollow.confirm": "Διακοπή παρακολούθησης",
   "confirmations.unfollow.message": "Σίγουρα θες να πάψεις να ακολουθείς τον/την {name};",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Διαγραφή συζήτησης",
   "conversation.mark_as_read": "Σήμανση ως αναγνωσμένο",
   "conversation.open": "Προβολή συνομιλίας",
diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json
index 49c4d99d2f9071572c22453a1bf223ed5a152f87..62c7d9d782dac4a1b95cca453d15fbd5c976e667 100644
--- a/app/javascript/mastodon/locales/en.json
+++ b/app/javascript/mastodon/locales/en.json
@@ -157,6 +157,9 @@
   "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
   "confirmations.unsubscribe.confirm": "Unsubscribe",
   "confirmations.unsubscribe.message": "Are you sure you want to unsubscribe {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Delete conversation",
   "conversation.mark_as_read": "Mark as read",
   "conversation.open": "View conversation",
diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json
index d6d6aa1b6d380869e718d76abe109a070cb780a9..44dbee9997fbc86e93e445ef74438fd7be975a0e 100644
--- a/app/javascript/mastodon/locales/eo.json
+++ b/app/javascript/mastodon/locales/eo.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Respondi nun anstataŭigos la mesaĝon, kiun vi nun skribas. Ĉu vi certas, ke vi volas daŭrigi?",
   "confirmations.unfollow.confirm": "Ne plu sekvi",
   "confirmations.unfollow.message": "Ĉu vi certas, ke vi volas ĉesi sekvi {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Forigi konversacion",
   "conversation.mark_as_read": "Marki legita",
   "conversation.open": "Vidi konversacion",
diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json
index fda38645541c06bf3f3e797c9d0ecdcd6e4c38f7..0e498054c1b68e4ffbdeb2faac0b5a1338270640 100644
--- a/app/javascript/mastodon/locales/es-AR.json
+++ b/app/javascript/mastodon/locales/es-AR.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Responder ahora sobreescribirá el mensaje que estás redactando actualmente. ¿Estás seguro que querés seguir?",
   "confirmations.unfollow.confirm": "Dejar de seguir",
   "confirmations.unfollow.message": "¿Estás seguro que querés dejar de seguir a {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Eliminar conversación",
   "conversation.mark_as_read": "Marcar como leído",
   "conversation.open": "Ver conversación",
diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json
index 88ec1f574a5c13e98510a75f34a8948460147c72..70a41dbfd44d7406b77602ad198bc1698c9523e9 100644
--- a/app/javascript/mastodon/locales/es.json
+++ b/app/javascript/mastodon/locales/es.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Responder sobrescribirá el mensaje que estás escribiendo. ¿Estás seguro de que deseas continuar?",
   "confirmations.unfollow.confirm": "Dejar de seguir",
   "confirmations.unfollow.message": "¿Estás seguro de que quieres dejar de seguir a {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Borrar conversación",
   "conversation.mark_as_read": "Marcar como leído",
   "conversation.open": "Ver conversación",
diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json
index 558fe38de259012796fcb3ad141c3840eac671ab..cebf52cad83484bc758972c09931cbe79b2662dc 100644
--- a/app/javascript/mastodon/locales/et.json
+++ b/app/javascript/mastodon/locales/et.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Praegu vastamine kirjutab üle sõnumi, mida hetkel koostate. Olete kindel, et soovite jätkata?",
   "confirmations.unfollow.confirm": "Ära jälgi",
   "confirmations.unfollow.message": "Olete kindel, et ei soovi rohkem jälgida kasutajat {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Kustuta vestlus",
   "conversation.mark_as_read": "Märgi loetuks",
   "conversation.open": "Vaata vestlust",
diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json
index 3d5ac92f8a6940c105acf5629d22afcefc43c9a3..40c2914c9ead1ea037f3fb59eac7b641339af653 100644
--- a/app/javascript/mastodon/locales/eu.json
+++ b/app/javascript/mastodon/locales/eu.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Orain erantzuteak idazten ari zaren mezua gainidatziko du. Ziur jarraitu nahi duzula?",
   "confirmations.unfollow.confirm": "Utzi jarraitzeari",
   "confirmations.unfollow.message": "Ziur {name} jarraitzeari utzi nahi diozula?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Ezabatu elkarrizketa",
   "conversation.mark_as_read": "Markatu irakurrita bezala",
   "conversation.open": "Ikusi elkarrizketa",
diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json
index 6685b2ccb1ec1597257462f6aa2f465aacabcdbe..6a07accd4a254d28fb01cfc2b8b12c4a82628f1c 100644
--- a/app/javascript/mastodon/locales/fa.json
+++ b/app/javascript/mastodon/locales/fa.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "اگر الان پاسخ دهید، چیزی که در حال نوشتنش بودید پاک خواهد شد. می‌خواهید ادامه دهید؟",
   "confirmations.unfollow.confirm": "پایان پیگیری",
   "confirmations.unfollow.message": "مطمئنید که می‌خواهید به پیگیری از {name} پایان دهید؟",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "حذف گفتگو",
   "conversation.mark_as_read": "علامت‌گذاری به عنوان خوانده شده",
   "conversation.open": "دیدن گفتگو",
diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json
index 0f150769b3dc9637ecc1fd055a2160535500f9f2..8f3154bec7a5f3c831c3faedfafb3426e3bb4333 100644
--- a/app/javascript/mastodon/locales/fi.json
+++ b/app/javascript/mastodon/locales/fi.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Jos vastaat nyt, vastaus korvaa tällä hetkellä työstämäsi viestin. Oletko varma, että haluat jatkaa?",
   "confirmations.unfollow.confirm": "Lakkaa seuraamasta",
   "confirmations.unfollow.message": "Haluatko varmasti lakata seuraamasta käyttäjää {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Poista keskustelu",
   "conversation.mark_as_read": "Merkitse luetuksi",
   "conversation.open": "Näytä keskustelu",
diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json
index 0c12719e25e8eaf15fb37cb4dad2238d31dfe5dd..a1fbd83d0c6b4409b19fc03d8ece52118a4b0745 100644
--- a/app/javascript/mastodon/locales/fr.json
+++ b/app/javascript/mastodon/locales/fr.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Répondre maintenant écrasera le message que vous rédigez actuellement. Voulez-vous vraiment continuer ?",
   "confirmations.unfollow.confirm": "Ne plus suivre",
   "confirmations.unfollow.message": "Voulez-vous vraiment arrêter de suivre {name} ?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Supprimer la conversation",
   "conversation.mark_as_read": "Marquer comme lu",
   "conversation.open": "Afficher la conversation",
diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json
index 2b1546a578b714bad57a06d021238144746d38d9..23c87159943a7f195a9c9dc90f875f11d7a55c1f 100644
--- a/app/javascript/mastodon/locales/ga.json
+++ b/app/javascript/mastodon/locales/ga.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
   "confirmations.unfollow.confirm": "Unfollow",
   "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Delete conversation",
   "conversation.mark_as_read": "Mark as read",
   "conversation.open": "View conversation",
diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json
index 44d8b4662d5df3642629673f01f53316234e13df..35d5db98b4850279f5c37241a4cd2ab6e6b3a66f 100644
--- a/app/javascript/mastodon/locales/gl.json
+++ b/app/javascript/mastodon/locales/gl.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Responder agora sobrescribirá a mensaxe que estás a compor. Tes a certeza de que queres continuar?",
   "confirmations.unfollow.confirm": "Deixar de seguir",
   "confirmations.unfollow.message": "Desexas deixar de seguir a {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Eliminar conversa",
   "conversation.mark_as_read": "Marcar como lido",
   "conversation.open": "Ver conversa",
diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json
index d43763d8b7e81ff0c6be4db81598b8cb5c312118..f3ee5be64527a45d1c0129a527936ee887f1b845 100644
--- a/app/javascript/mastodon/locales/he.json
+++ b/app/javascript/mastodon/locales/he.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
   "confirmations.unfollow.confirm": "להפסיק מעקב",
   "confirmations.unfollow.message": "להפסיק מעקב אחרי {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Delete conversation",
   "conversation.mark_as_read": "Mark as read",
   "conversation.open": "View conversation",
diff --git a/app/javascript/mastodon/locales/hi.json b/app/javascript/mastodon/locales/hi.json
index 88591a5bba46f71945617091d721b421ac22aa16..2a0be72ff290e5410c964a42dc40e43dcc2c6d54 100644
--- a/app/javascript/mastodon/locales/hi.json
+++ b/app/javascript/mastodon/locales/hi.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "अब उत्तर देना उस संदेश को अधिलेखित कर देगा जो आप वर्तमान में बना रहे हैं। क्या आप सुनिश्चित रूप से आगे बढ़ना चाहते हैं?",
   "confirmations.unfollow.confirm": "अनफॉलो करें",
   "confirmations.unfollow.message": "क्या आप वाकई {name} को अनफॉलो करना चाहते हैं?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "वार्तालाप हटाएँ",
   "conversation.mark_as_read": "पढ़ा गया के रूप में चिह्नित करें",
   "conversation.open": "वार्तालाप देखें",
diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json
index b1f80e29d5abe597d2a328ce41edb0486fffb109..8f37fe542b7edcc8feae22571c38b79cac0af27b 100644
--- a/app/javascript/mastodon/locales/hr.json
+++ b/app/javascript/mastodon/locales/hr.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
   "confirmations.unfollow.confirm": "Unfollow",
   "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Delete conversation",
   "conversation.mark_as_read": "Mark as read",
   "conversation.open": "View conversation",
diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json
index 9570f587ad2152f5a90375546a23c6fa7cf66174..812d68a4ee7f964763d91680e3791995424368b5 100644
--- a/app/javascript/mastodon/locales/hu.json
+++ b/app/javascript/mastodon/locales/hu.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Ha most válaszolsz, ez felülírja a most szerkesztés alatt álló üzenetet. Mégis ezt szeretnéd?",
   "confirmations.unfollow.confirm": "Követés visszavonása",
   "confirmations.unfollow.message": "Biztos, hogy vissza szeretnéd vonni {name} követését?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Beszélgetés törlése",
   "conversation.mark_as_read": "Megjelölés olvasottként",
   "conversation.open": "Beszélgetés megtekintése",
diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json
index 8c6cb1de2adbfec440f7ea15866724a83fec7ed0..0dda905a629265696d07953c0caac0514ffc2d6a 100644
--- a/app/javascript/mastodon/locales/hy.json
+++ b/app/javascript/mastodon/locales/hy.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Այս պահին պատասխանելը կը չեղարկի ձեր՝ այս պահին անաւարտ հաղորդագրութիւնը։ Համոզուա՞ծ էք։",
   "confirmations.unfollow.confirm": "Ô±ÕºÕ¡Õ°Õ¥Õ¿Õ¥Ö‚Õ¥Õ¬",
   "confirmations.unfollow.message": "ÕŽÕ½Õ¿Õ¡ÕžÕ° Õ¥Õ½, Õ¸Ö€ Õ¸Ö‚Õ¦Õ¸Ö‚Õ´ Õ¥Õ½ Õ¡ÕµÕ¬Õ¥Ö‚Õ½ Õ¹Õ°Õ¥Õ¿Õ¥Ö‚Õ¥Õ¬ {name}ÖŠÕ«Õ¶Ö‰",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Ջնջել խօսակցութիւնը",
   "conversation.mark_as_read": "Նշել որպէս ընթերցուած",
   "conversation.open": "Դիտել խօսակցութիւնը",
diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json
index 0b97bf1b2e9f488fb2983b5deb31f45cf0ac4128..67b0decf84b60ee4b16f659f0581f9b3a09555ce 100644
--- a/app/javascript/mastodon/locales/id.json
+++ b/app/javascript/mastodon/locales/id.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Membalas sekarang akan menimpa pesan yang sedang Anda buat. Anda yakin ingin melanjutkan?",
   "confirmations.unfollow.confirm": "Berhenti mengikuti",
   "confirmations.unfollow.message": "Apakah anda ingin berhenti mengikuti {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Hapus percakapan",
   "conversation.mark_as_read": "Tandai sudah dibaca",
   "conversation.open": "Lihat percakapan",
diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json
index 30d20a7e97160d996a85699658cbd050c78defe5..6e649e30dd924b4ca012f673dc335029821314c9 100644
--- a/app/javascript/mastodon/locales/io.json
+++ b/app/javascript/mastodon/locales/io.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
   "confirmations.unfollow.confirm": "Unfollow",
   "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Delete conversation",
   "conversation.mark_as_read": "Mark as read",
   "conversation.open": "View conversation",
diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json
index 72d8fefaf611980101691b057a1edf2c27b45747..fdad2d3363c32ba0bcc6eda55e9900632be38483 100644
--- a/app/javascript/mastodon/locales/is.json
+++ b/app/javascript/mastodon/locales/is.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Ef þú svarar núna verður skrifað yfir skilaboðin sem þú ert að semja núna. Ertu viss um að þú viljir halda áfram?",
   "confirmations.unfollow.confirm": "Hætta að fylgja",
   "confirmations.unfollow.message": "Ertu viss um að þú viljir hætta að fylgjast með {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Eyða samtali",
   "conversation.mark_as_read": "Merkja sem lesið",
   "conversation.open": "Skoða samtal",
diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json
index 5be797a60c66271e8cd197d26bff78891ee85cc2..c0bca57b6486d48c6fbeb74aba38d0643f19216a 100644
--- a/app/javascript/mastodon/locales/it.json
+++ b/app/javascript/mastodon/locales/it.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Rispondere ora sovrascriverà il messaggio che stai correntemente componendo. Sei sicuro di voler procedere?",
   "confirmations.unfollow.confirm": "Smetti di seguire",
   "confirmations.unfollow.message": "Sei sicuro di non voler più seguire {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Elimina conversazione",
   "conversation.mark_as_read": "Segna come letto",
   "conversation.open": "Visualizza conversazione",
diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json
index 7c0d164a50d16c221c7e3cf80527f96e3c508c12..a98d9f33f0b37a509c02ffdd3570bf7d351eae29 100644
--- a/app/javascript/mastodon/locales/ja.json
+++ b/app/javascript/mastodon/locales/ja.json
@@ -155,6 +155,9 @@
   "confirmations.unfollow.message": "本当に{name}さんのフォローを解除しますか?",
   "confirmations.unsubscribe.confirm": "購読解除",
   "confirmations.unsubscribe.message": "本当に{name}さんの購読を解除しますか?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "会話を削除",
   "conversation.mark_as_read": "既読にする",
   "conversation.open": "会話を表示",
diff --git a/app/javascript/mastodon/locales/ka.json b/app/javascript/mastodon/locales/ka.json
index 140f2d004283ec5f58f67277d16ba1d1cbbda989..565d3be40d844b0e58bd3ba8981675416e98db64 100644
--- a/app/javascript/mastodon/locales/ka.json
+++ b/app/javascript/mastodon/locales/ka.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
   "confirmations.unfollow.confirm": "ნუღარ მიჰყვები",
   "confirmations.unfollow.message": "დარწმუნებული ხართ, აღარ გსურთ მიჰყვებოდეთ {name}-ს?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Delete conversation",
   "conversation.mark_as_read": "Mark as read",
   "conversation.open": "View conversation",
diff --git a/app/javascript/mastodon/locales/kab.json b/app/javascript/mastodon/locales/kab.json
index fde0375045bd51d20940230d411850b64e8e1bc4..33c73197accc09573782bb2dfc7ec70680b2514c 100644
--- a/app/javascript/mastodon/locales/kab.json
+++ b/app/javascript/mastodon/locales/kab.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Tiririt akka tura ad k-degger izen-agi i tettaruḍ. Tebɣiḍ ad tkemmleḍ?",
   "confirmations.unfollow.confirm": "Ur ḍḍafaṛ ara",
   "confirmations.unfollow.message": "Tetḥeqqeḍ belli tebɣiḍ ur teṭafaṛeḍ ara {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Sfeḍ adiwenni",
   "conversation.mark_as_read": "Creḍ yettwaɣṛa",
   "conversation.open": "Ssken adiwenni",
diff --git a/app/javascript/mastodon/locales/kk.json b/app/javascript/mastodon/locales/kk.json
index 5e08d43a11f6c41264326146156c68820985f3a3..d3f7cc048d475171c6abd76870cd7be1bdc0445c 100644
--- a/app/javascript/mastodon/locales/kk.json
+++ b/app/javascript/mastodon/locales/kk.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Жауабыңыз жазып жатқан жазбаңыздың үстіне кетеді. Жалғастырамыз ба?",
   "confirmations.unfollow.confirm": "Оқымау",
   "confirmations.unfollow.message": "\"{name} атты қолданушыға енді жазылғыңыз келмей ме?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Пікірталасты өшіру",
   "conversation.mark_as_read": "Оқылды деп белгіле",
   "conversation.open": "Пікірталасты қарау",
diff --git a/app/javascript/mastodon/locales/kn.json b/app/javascript/mastodon/locales/kn.json
index 8a0014e91684ed53a6ea192efabf9ff98ea0a325..b08da6d7e5d2c9e9e257f8973d97785f3e415794 100644
--- a/app/javascript/mastodon/locales/kn.json
+++ b/app/javascript/mastodon/locales/kn.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
   "confirmations.unfollow.confirm": "Unfollow",
   "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Delete conversation",
   "conversation.mark_as_read": "Mark as read",
   "conversation.open": "View conversation",
diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json
index 07b570777cbd9891cd388ae24ca1cc5197f83c69..058adb89c4513ea85aaca0a00eaa79d8e71c5438 100644
--- a/app/javascript/mastodon/locales/ko.json
+++ b/app/javascript/mastodon/locales/ko.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "답글을 달기 위해 현재 작성 중인 메시지가 덮어 씌워집니다. 진행하시겠습니까?",
   "confirmations.unfollow.confirm": "언팔로우",
   "confirmations.unfollow.message": "정말로 {name}를 언팔로우하시겠습니까?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "대화 삭제",
   "conversation.mark_as_read": "읽은 상태로 표시",
   "conversation.open": "대화 보기",
diff --git a/app/javascript/mastodon/locales/ku.json b/app/javascript/mastodon/locales/ku.json
index b3822ff084f06a35511a4bb9fed9182d36afdbd5..ef549d4f9fb7a891e25d4f62635016b20d900dbd 100644
--- a/app/javascript/mastodon/locales/ku.json
+++ b/app/javascript/mastodon/locales/ku.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
   "confirmations.unfollow.confirm": "Unfollow",
   "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Delete conversation",
   "conversation.mark_as_read": "Mark as read",
   "conversation.open": "View conversation",
diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json
index 22fabd580e8f6db89ab1f965c96252fd43fa5bef..39ebf8cbee9bf3947e44ac927585e6296a20b38a 100644
--- a/app/javascript/mastodon/locales/lt.json
+++ b/app/javascript/mastodon/locales/lt.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
   "confirmations.unfollow.confirm": "Unfollow",
   "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Delete conversation",
   "conversation.mark_as_read": "Mark as read",
   "conversation.open": "View conversation",
diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json
index 59af93c98dabfc8320d61157544df48568b6bdd5..78999665f838a296185434858823de196af684d5 100644
--- a/app/javascript/mastodon/locales/lv.json
+++ b/app/javascript/mastodon/locales/lv.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Atbildot tagad tava ziņa ko šobrīd raksti tiks pārrakstīta. Vai tiešām vēlies turpināt?",
   "confirmations.unfollow.confirm": "Nesekot",
   "confirmations.unfollow.message": "Vai tiešam vairs nevēlies sekot lietotājam {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Delete conversation",
   "conversation.mark_as_read": "Mark as read",
   "conversation.open": "View conversation",
diff --git a/app/javascript/mastodon/locales/mk.json b/app/javascript/mastodon/locales/mk.json
index aeaf7355c70e6ba0bacb69be7e6556fc51add350..d44328d4e90f46e8059dfbdffaf9a60d9a9f2f7a 100644
--- a/app/javascript/mastodon/locales/mk.json
+++ b/app/javascript/mastodon/locales/mk.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
   "confirmations.unfollow.confirm": "Одследи",
   "confirmations.unfollow.message": "Сигурни сте дека ќе го отследите {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Избриши разговор",
   "conversation.mark_as_read": "Означете како прочитано",
   "conversation.open": "Прегледај разговор",
diff --git a/app/javascript/mastodon/locales/ml.json b/app/javascript/mastodon/locales/ml.json
index 0c5a84204234fbba46ba3281841c07b14c955d68..c95d83de7c6b90324cf01c8a22121cb3728ef7a8 100644
--- a/app/javascript/mastodon/locales/ml.json
+++ b/app/javascript/mastodon/locales/ml.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "ഇപ്പോൾ മറുപടി കൊടുക്കുന്നത് നിങ്ങൾ എഴുതിക്കൊണ്ടിരിക്കുന്ന സന്ദേശത്തിന് മുകളിൽ എഴുതാൻ കാരണമാകും. തീർച്ചയായും മുൻപോട്ട് പോകാൻ തീരുമാനിച്ചുവോ?",
   "confirmations.unfollow.confirm": "പിന്തുടരുന്നത് നിര്‍ത്തുക",
   "confirmations.unfollow.message": "നിങ്ങൾ {name} യെ പിന്തുടരുന്നത് നിർത്തുവാൻ തീർച്ചയായും തീരുമാനിച്ചുവോ?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "സംഭാഷണം മായിക്കുക",
   "conversation.mark_as_read": "വായിച്ചതായി അടയാളപ്പെടുത്തുക",
   "conversation.open": "സംഭാഷണം കാണുക",
diff --git a/app/javascript/mastodon/locales/mr.json b/app/javascript/mastodon/locales/mr.json
index e07baddffb8ffbdf2f2382eaf934db1e5f98c2f2..1157575e0548c4189036aa187e6216d5d8828bdd 100644
--- a/app/javascript/mastodon/locales/mr.json
+++ b/app/javascript/mastodon/locales/mr.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
   "confirmations.unfollow.confirm": "Unfollow",
   "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Delete conversation",
   "conversation.mark_as_read": "Mark as read",
   "conversation.open": "View conversation",
diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json
index 5144411bb7017c2775afb681e81fa60f366ed103..03c5c6b30c5d7b529b7cba32ff91924471311833 100644
--- a/app/javascript/mastodon/locales/ms.json
+++ b/app/javascript/mastodon/locales/ms.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
   "confirmations.unfollow.confirm": "Unfollow",
   "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Delete conversation",
   "conversation.mark_as_read": "Mark as read",
   "conversation.open": "View conversation",
diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json
index 9825fb3a0423f83019d8846a95f32cfb21969a09..13d9653481b5324c90ea1a8444db74e67f393c19 100644
--- a/app/javascript/mastodon/locales/nl.json
+++ b/app/javascript/mastodon/locales/nl.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Door nu te reageren overschrijf je de toot die je op dit moment aan het schrijven bent. Weet je zeker dat je verder wil gaan?",
   "confirmations.unfollow.confirm": "Ontvolgen",
   "confirmations.unfollow.message": "Weet je het zeker dat je {name} wilt ontvolgen?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Gesprek verwijderen",
   "conversation.mark_as_read": "Als gelezen markeren",
   "conversation.open": "Gesprek tonen",
diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json
index b567a35330d89d34132f767b3c5475e4a2b1c589..e28164ccc14f021c5a500550efb3c6a2690e8673 100644
--- a/app/javascript/mastodon/locales/nn.json
+++ b/app/javascript/mastodon/locales/nn.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Å svara no vil overskriva meldinga du skriv no. Er du sikker på at du vil halda fram?",
   "confirmations.unfollow.confirm": "Slutt å fylgja",
   "confirmations.unfollow.message": "Er du sikker på at du vil slutta å fylgja {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Slett samtale",
   "conversation.mark_as_read": "Merk som lese",
   "conversation.open": "Sjå samtale",
diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json
index af911c2be90b959a4e93fa5faf60f267c1d185ae..b17d81ef6e24a581e8a4efdb22ef7a59fef99e08 100644
--- a/app/javascript/mastodon/locales/no.json
+++ b/app/javascript/mastodon/locales/no.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Å svare nå vil overskrive meldingen du skriver for øyeblikket. Er du sikker på at du vil fortsette?",
   "confirmations.unfollow.confirm": "Slutt å følge",
   "confirmations.unfollow.message": "Er du sikker på at du vil slutte å følge {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Slett samtalen",
   "conversation.mark_as_read": "Marker som lest",
   "conversation.open": "Vis samtale",
diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json
index 6e7518d57284066eca17693e4fd20396099322d0..184307428678c67da887714c04b8a60736ae5eef 100644
--- a/app/javascript/mastodon/locales/oc.json
+++ b/app/javascript/mastodon/locales/oc.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Respondre remplaçarà lo messatge que sètz a escriure. Volètz vertadièrament contunhar ?",
   "confirmations.unfollow.confirm": "Quitar de sègre",
   "confirmations.unfollow.message": "Volètz vertadièrament quitar de sègre {name} ?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Suprimir la conversacion",
   "conversation.mark_as_read": "Marcar coma legida",
   "conversation.open": "Veire la conversacion",
diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json
index a43d7fc850d4ff80cf3ceabeafd56be183155a43..72fa7f7fdcea968916a136a692ca14a603d48e9d 100644
--- a/app/javascript/mastodon/locales/pl.json
+++ b/app/javascript/mastodon/locales/pl.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "W ten sposób utracisz wpis który obecnie tworzysz. Czy na pewno chcesz to zrobić?",
   "confirmations.unfollow.confirm": "Przestań śledzić",
   "confirmations.unfollow.message": "Czy na pewno zamierzasz przestać śledzić {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Usuń rozmowę",
   "conversation.mark_as_read": "Oznacz jako przeczytane",
   "conversation.open": "Zobacz rozmowÄ™",
diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json
index 016d98b933c72a248d450ff24d59fad8c4edf7ba..44f36ca4a3551a4b87327bb5c97d60c4d4fbc704 100644
--- a/app/javascript/mastodon/locales/pt-BR.json
+++ b/app/javascript/mastodon/locales/pt-BR.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Responder agora sobrescreverá o toot que você está compondo. Deseja continuar?",
   "confirmations.unfollow.confirm": "Deixar de seguir",
   "confirmations.unfollow.message": "Você tem certeza de que deseja deixar de seguir {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Excluir conversa",
   "conversation.mark_as_read": "Marcar como lida",
   "conversation.open": "Ver conversa",
diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json
index becce22e04ff27cb11689ec66de2bddc8d5fe7ff..821548dc24da948d04e5ebe84231ba3a3ed1fee8 100644
--- a/app/javascript/mastodon/locales/pt-PT.json
+++ b/app/javascript/mastodon/locales/pt-PT.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Responder agora irá reescrever a mensagem que está a compor actualmente. Tem a certeza que quer continuar?",
   "confirmations.unfollow.confirm": "Deixar de seguir",
   "confirmations.unfollow.message": "De certeza que queres deixar de seguir {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Eliminar conversa",
   "conversation.mark_as_read": "Marcar como lida",
   "conversation.open": "Ver conversa",
diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json
index 5470db028db02bb5af467265704b7c8b4acbbb89..3fe44cb660eeb952ab470f4ebf49a12ccaab54ef 100644
--- a/app/javascript/mastodon/locales/ro.json
+++ b/app/javascript/mastodon/locales/ro.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Răspunzând la asta acum, mesajul pe care îl compui în prezent se va șterge. Ești sigur că vrei să continui?",
   "confirmations.unfollow.confirm": "Nu mai urmări",
   "confirmations.unfollow.message": "Ești sigur că nu mai vrei să urmărești pe {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Ștergeți conversația",
   "conversation.mark_as_read": "Marcați ca citit",
   "conversation.open": "Vizualizați conversația",
diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json
index eb181e78e3108706404485475e4d72655bc800f5..467b2f4843a8127b505c66d5648e9e40a4ccfa30 100644
--- a/app/javascript/mastodon/locales/ru.json
+++ b/app/javascript/mastodon/locales/ru.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "При ответе, текст набираемого поста будет очищен. Продолжить?",
   "confirmations.unfollow.confirm": "Отписаться",
   "confirmations.unfollow.message": "Вы уверены, что хотите отписаться от {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Удалить беседу",
   "conversation.mark_as_read": "Пометить прочитанным",
   "conversation.open": "Просмотр беседы",
diff --git a/app/javascript/mastodon/locales/sc.json b/app/javascript/mastodon/locales/sc.json
index 30a3e33745b1fff6f40a50827ef7c86932534cc7..0b4d6cfe310ae6b9c67b1e90ff6a0ef8cd629d28 100644
--- a/app/javascript/mastodon/locales/sc.json
+++ b/app/javascript/mastodon/locales/sc.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Rispondende immoe as a subraiscrìere su messàgiu chi ses iscriende. Seguru chi boles sighire?",
   "confirmations.unfollow.confirm": "Non sigas prus",
   "confirmations.unfollow.message": "Seguru chi non boles sighire prus {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Cantzella arresonada",
   "conversation.mark_as_read": "Signala comente lèghidu",
   "conversation.open": "Bide arresonada",
diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json
index e2fd8477e21cb23cfa49d8e084d8f48a84688adc..c69433f41b455a04a1b3452e933be397424ae436 100644
--- a/app/javascript/mastodon/locales/sk.json
+++ b/app/javascript/mastodon/locales/sk.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Odpovedaním akurát teraz prepíšeš správu, ktorú máš práve rozpísanú. Si si istý/á, že chceš pokračovať?",
   "confirmations.unfollow.confirm": "Nesleduj",
   "confirmations.unfollow.message": "Naozaj chceš prestať sledovať {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Vymaž konverzáciu",
   "conversation.mark_as_read": "Označ za prečítané",
   "conversation.open": "Ukáž konverzáciu",
diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json
index 726a2a33a2db1347399490d598a3fd624f4654c8..70f81004e5b8d7d32f4e9b9b18a23bc1bc8ddd51 100644
--- a/app/javascript/mastodon/locales/sl.json
+++ b/app/javascript/mastodon/locales/sl.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Odgovarjanje bo prepisalo sporočilo, ki ga trenutno sestavljate. Ali ste prepričani, da želite nadaljevati?",
   "confirmations.unfollow.confirm": "Prenehaj slediti",
   "confirmations.unfollow.message": "Ali ste prepričani, da ne želite več slediti {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Delete conversation",
   "conversation.mark_as_read": "Mark as read",
   "conversation.open": "View conversation",
diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json
index 6f8acbc21f1c3a123eb5d61b2d7d838d0975decf..c1f6f1265c360346516c4b7382a1492282ce0675 100644
--- a/app/javascript/mastodon/locales/sq.json
+++ b/app/javascript/mastodon/locales/sq.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Po të përgjigjeni tani, mesazhi që po hartoni, do të mbishkruhet. Jeni i sigurt se doni të vazhdohet më tej?",
   "confirmations.unfollow.confirm": "Resht së ndjekuri",
   "confirmations.unfollow.message": "Jeni i sigurt se doni të mos ndiqet më {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Fshije bisedën",
   "conversation.mark_as_read": "Vëri shenjë si të lexuar",
   "conversation.open": "Shfaq bisedën",
diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json
index a0f1dff9ca81f4591f0e28d7fa42aa0754784ad7..3742981482303a6b080d282e3bc6f5638a070338 100644
--- a/app/javascript/mastodon/locales/sr-Latn.json
+++ b/app/javascript/mastodon/locales/sr-Latn.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
   "confirmations.unfollow.confirm": "Otprati",
   "confirmations.unfollow.message": "Da li ste sigurni da želite da otpratite korisnika {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Delete conversation",
   "conversation.mark_as_read": "Mark as read",
   "conversation.open": "View conversation",
diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json
index c3aef8080e69e8b3ad91293409d4b7d58f059694..01abd873659c50a6760df7597ee7aa8fa774250f 100644
--- a/app/javascript/mastodon/locales/sr.json
+++ b/app/javascript/mastodon/locales/sr.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Одговарањем ћете обрисати поруку коју састављате. Јесте ли сигурни да желите да наставите?",
   "confirmations.unfollow.confirm": "Отпрати",
   "confirmations.unfollow.message": "Да ли сте сигурни да желите да отпратите корисника {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Обриши преписку",
   "conversation.mark_as_read": "Означи као прочитано",
   "conversation.open": "Прикажи преписку",
diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json
index 1515443adf71a97f07d47b18ca3e622e94d27152..b35b9a982311015d691330b89c580a65bf3d64a0 100644
--- a/app/javascript/mastodon/locales/sv.json
+++ b/app/javascript/mastodon/locales/sv.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Om du svarar nu kommer det att ersätta meddelandet du håller på att skapa. Är du säker på att du vill fortsätta?",
   "confirmations.unfollow.confirm": "Avfölj",
   "confirmations.unfollow.message": "Är du säker på att du vill avfölja {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Radera konversation",
   "conversation.mark_as_read": "Markera som läst",
   "conversation.open": "Se konversation",
diff --git a/app/javascript/mastodon/locales/szl.json b/app/javascript/mastodon/locales/szl.json
index b3822ff084f06a35511a4bb9fed9182d36afdbd5..ef549d4f9fb7a891e25d4f62635016b20d900dbd 100644
--- a/app/javascript/mastodon/locales/szl.json
+++ b/app/javascript/mastodon/locales/szl.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
   "confirmations.unfollow.confirm": "Unfollow",
   "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Delete conversation",
   "conversation.mark_as_read": "Mark as read",
   "conversation.open": "View conversation",
diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json
index ca8e1bb2c0712bd141ce55cba62c5911811ee158..49571f45821dae30750430d3f4b09eb85c7d8dfb 100644
--- a/app/javascript/mastodon/locales/ta.json
+++ b/app/javascript/mastodon/locales/ta.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "ஏற்கனவே ஒரு பதிவு எழுதப்பட்டுக்கொண்டிருக்கிறது. இப்பொழுது பதில் எழுத முனைந்தால் அது அழிக்கப்படும். பரவாயில்லையா?",
   "confirmations.unfollow.confirm": "விலகு",
   "confirmations.unfollow.message": "{name}-ஐப் பின்தொடர்வதை நிச்சயமாக நீங்கள் நிறுத்த விரும்புகிறீர்களா?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "உரையாடலை அழி",
   "conversation.mark_as_read": "படிக்கபட்டதாகக் குறி",
   "conversation.open": "உரையாடலைக் காட்டு",
diff --git a/app/javascript/mastodon/locales/tai.json b/app/javascript/mastodon/locales/tai.json
index b3822ff084f06a35511a4bb9fed9182d36afdbd5..ef549d4f9fb7a891e25d4f62635016b20d900dbd 100644
--- a/app/javascript/mastodon/locales/tai.json
+++ b/app/javascript/mastodon/locales/tai.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
   "confirmations.unfollow.confirm": "Unfollow",
   "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Delete conversation",
   "conversation.mark_as_read": "Mark as read",
   "conversation.open": "View conversation",
diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json
index fce6f32f24a00e6d6d3d6e7c27b34e3cc1cdcd3e..5a17119611e3806449de14fd87ec6f455217c3e3 100644
--- a/app/javascript/mastodon/locales/te.json
+++ b/app/javascript/mastodon/locales/te.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "ఇప్పుడే ప్రత్యుత్తరం ఇస్తే మీరు ప్రస్తుతం వ్రాస్తున్న సందేశం తిరగరాయబడుతుంది. మీరు ఖచ్చితంగా కొనసాగించాలనుకుంటున్నారా?",
   "confirmations.unfollow.confirm": "అనుసరించవద్దు",
   "confirmations.unfollow.message": "{name}ను మీరు ఖచ్చితంగా అనుసరించవద్దనుకుంటున్నారా?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Delete conversation",
   "conversation.mark_as_read": "Mark as read",
   "conversation.open": "View conversation",
diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json
index b29a9eccdafccaf4f5ae956eb998be6b359b2800..182b91a94cf35b369f5477f17b951293002ef072 100644
--- a/app/javascript/mastodon/locales/th.json
+++ b/app/javascript/mastodon/locales/th.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "การตอบกลับตอนนี้จะเขียนทับข้อความที่คุณกำลังเขียน คุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อ?",
   "confirmations.unfollow.confirm": "เลิกติดตาม",
   "confirmations.unfollow.message": "คุณแน่ใจหรือไม่ว่าต้องการเลิกติดตาม {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "ลบการสนทนา",
   "conversation.mark_as_read": "ทำเครื่องหมายว่าอ่านแล้ว",
   "conversation.open": "ดูการสนทนา",
diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json
index 5c7d4b382ae7743d369bdef9cc1c9d5c57d69cd7..205d383800ace0afb714a1b1d71d8e9561a4b501 100644
--- a/app/javascript/mastodon/locales/tr.json
+++ b/app/javascript/mastodon/locales/tr.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Şimdi yanıtlarken o an oluşturduğunuz mesajın üzerine yazılır. Devam etmek istediğinize emin misiniz?",
   "confirmations.unfollow.confirm": "Takibi kaldır",
   "confirmations.unfollow.message": "{name}'yi takipten çıkarmak istediğinizden emin misiniz?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Konuşmayı sil",
   "conversation.mark_as_read": "OkunmuÅŸ olarak iÅŸaretle",
   "conversation.open": "Konuşmayı görüntüle",
diff --git a/app/javascript/mastodon/locales/ug.json b/app/javascript/mastodon/locales/ug.json
index b3822ff084f06a35511a4bb9fed9182d36afdbd5..ef549d4f9fb7a891e25d4f62635016b20d900dbd 100644
--- a/app/javascript/mastodon/locales/ug.json
+++ b/app/javascript/mastodon/locales/ug.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
   "confirmations.unfollow.confirm": "Unfollow",
   "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Delete conversation",
   "conversation.mark_as_read": "Mark as read",
   "conversation.open": "View conversation",
diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json
index 244f04a9e87f831c181e327bb3213a3559333d00..e19d906bab75beb13e85950371c04882b3d4fdce 100644
--- a/app/javascript/mastodon/locales/uk.json
+++ b/app/javascript/mastodon/locales/uk.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Поточна відповідь перезапише повідомлення, яке ви зараз пишете. Ви впевнені, що хочете продовжити?",
   "confirmations.unfollow.confirm": "Відписатися",
   "confirmations.unfollow.message": "Ви впевнені, що хочете відписатися від {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Видалити цю бесіду",
   "conversation.mark_as_read": "Позначити як прочитане",
   "conversation.open": "Переглянути бесіду",
diff --git a/app/javascript/mastodon/locales/ur.json b/app/javascript/mastodon/locales/ur.json
index ada675496afb52f3cc35237edc1eb996870b6f89..2b5547dfc8d083ebb01ee06fa1be9d808db1bee0 100644
--- a/app/javascript/mastodon/locales/ur.json
+++ b/app/javascript/mastodon/locales/ur.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
   "confirmations.unfollow.confirm": "Unfollow",
   "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Delete conversation",
   "conversation.mark_as_read": "Mark as read",
   "conversation.open": "View conversation",
diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json
index aa0c0d5ffbbe464ae05cbf6fdc46f18489694ae5..83c8ed9c85117cf82cb006a8b70f0a3a70d56014 100644
--- a/app/javascript/mastodon/locales/vi.json
+++ b/app/javascript/mastodon/locales/vi.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "Nội dung bạn đang soạn thảo sẽ bị ghi đè, bạn có tiếp tục?",
   "confirmations.unfollow.confirm": "Ngưng theo dõi",
   "confirmations.unfollow.message": "Bạn có chắc chắn muốn ngưng theo dõi {name}?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "Xóa tin nhắn này",
   "conversation.mark_as_read": "Đánh dấu là đã đọc",
   "conversation.open": "Xem toàn bộ tin nhắn",
diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json
index 778c8c04e5b63b864fe30e50c0a866d46f0d1f02..b3d8fbfe18069ceb882416514888f69e49c8fd3c 100644
--- a/app/javascript/mastodon/locales/zh-CN.json
+++ b/app/javascript/mastodon/locales/zh-CN.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "回复此消息将会覆盖当前正在编辑的信息。确定继续吗?",
   "confirmations.unfollow.confirm": "取消关注",
   "confirmations.unfollow.message": "你确定要取消关注 {name} 吗?",
+  "content_type.change": "设置富文本类型",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "纯文本",
   "conversation.delete": "删除对话",
   "conversation.mark_as_read": "标记为已读",
   "conversation.open": "查看对话",
diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json
index a332db0114a969984db8109f3f7a028b859899b3..b65e6d9748c6058db83da296e051cdb32e92f371 100644
--- a/app/javascript/mastodon/locales/zh-HK.json
+++ b/app/javascript/mastodon/locales/zh-HK.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "現在回覆將蓋掉您目前正在撰寫的訊息。是否仍要回覆?",
   "confirmations.unfollow.confirm": "取消關注",
   "confirmations.unfollow.message": "真的不要繼續關注 {name} 了嗎?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "刪除對話",
   "conversation.mark_as_read": "標為已讀",
   "conversation.open": "檢視對話",
diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json
index da4cc777dab6818d1dde9eaa5fda1e4928e45494..7bde874a521c75317644f1a00af9c4141f8b7d00 100644
--- a/app/javascript/mastodon/locales/zh-TW.json
+++ b/app/javascript/mastodon/locales/zh-TW.json
@@ -123,6 +123,9 @@
   "confirmations.reply.message": "現在回覆將蓋掉您目前正在撰寫的訊息。是否仍要回覆?",
   "confirmations.unfollow.confirm": "取消關注",
   "confirmations.unfollow.message": "真的要取消關注 {name} 嗎?",
+  "content_type.change": "Adjust status content type",
+  "content_type.markdown.short": "Markdown",
+  "content_type.plain.short": "Plain Text",
   "conversation.delete": "刪除對話",
   "conversation.mark_as_read": "標為已讀",
   "conversation.open": "檢視對話",
diff --git a/app/javascript/mastodon/reducers/compose.js b/app/javascript/mastodon/reducers/compose.js
index ff3d38c3f045b5a954bd09933d66e3be9e76ad44..d7985d241d3897d8ede93f1cfac6f8d47d8a6db5 100644
--- a/app/javascript/mastodon/reducers/compose.js
+++ b/app/javascript/mastodon/reducers/compose.js
@@ -31,6 +31,7 @@ import {
   COMPOSE_VISIBILITY_CHANGE,
   COMPOSE_CIRCLE_CHANGE,
   COMPOSE_FEDERATION_CHANGE,
+  COMPOSE_CONTENT_TYPE_CHANGE,
   COMPOSE_COMPOSING_CHANGE,
   COMPOSE_EMOJI_INSERT,
   COMPOSE_UPLOAD_CHANGE_REQUEST,
@@ -60,6 +61,7 @@ const initialState = ImmutableMap({
   privacy: null,
   circle_id: null,
   federation: null,
+  content_type: null,
   text: '',
   focusDate: null,
   caretPosition: null,
@@ -82,6 +84,7 @@ const initialState = ImmutableMap({
   suggestions: ImmutableList(),
   default_privacy: 'public',
   default_federation: true,
+  default_content_type: 'text/plain',
   default_sensitive: false,
   resetFileKey: Math.floor((Math.random() * 0x10000)),
   idempotencyKey: null,
@@ -131,6 +134,7 @@ const clearAll = state => {
     map.set('privacy', state.get('default_privacy'));
     map.set('circle_id', null);
     map.set('federation', state.get('default_federation'));
+    map.set('content_type', state.get('default_content_type'));
     map.set('sensitive', false);
     map.update('media_attachments', list => list.clear());
     map.set('poll', null);
@@ -322,6 +326,10 @@ export default function compose(state = initialState, action) {
     return state
       .set('federation', action.value)
       .set('idempotencyKey', uuid());
+  case COMPOSE_CONTENT_TYPE_CHANGE:
+    return state
+      .set('content_type', action.value)
+      .set('idempotencyKey', uuid());
   case COMPOSE_VISIBILITY_CHANGE:
     return state.withMutations(map => {
       map.set('text', statusToTextMentions(state.get('text'), action.value, state.get('reply_status')));
@@ -351,6 +359,7 @@ export default function compose(state = initialState, action) {
       map.set('privacy', privacy);
       map.set('circle_id', null);
       map.set('federation', !action.status.get('local_only'));
+      map.set('content_type', action.status.get('content_type')); // TODO MDpref
       map.set('focusDate', new Date());
       map.set('caretPosition', null);
       map.set('preselectDate', new Date());
@@ -398,6 +407,7 @@ export default function compose(state = initialState, action) {
       map.set('circle_id', null);
       map.set('poll', null);
       map.set('federation', state.get('default_federation'));
+      map.set('content_type', state.get('default_content_type'));
       map.set('idempotencyKey', uuid());
     });
   case COMPOSE_SUBMIT_REQUEST:
@@ -490,6 +500,7 @@ export default function compose(state = initialState, action) {
       map.set('privacy', action.status.get('visibility'));
       map.set('circle_id', action.status.get('circle_id'));
       map.set('federation', !action.status.get('local_only'));
+      map.set('content_type', action.status.get('content_type'));
       map.set('media_attachments', action.status.get('media_attachments'));
       map.set('focusDate', new Date());
       map.set('caretPosition', null);
diff --git a/app/lib/formatter.rb b/app/lib/formatter.rb
index d115f0ed6637d6e77ea21c8bc7a534dd94af3f60..71ad904cf6247f2028c329db8d0ec9e3646f2ebd 100644
--- a/app/lib/formatter.rb
+++ b/app/lib/formatter.rb
@@ -31,18 +31,40 @@ class Formatter
       return html.html_safe # rubocop:disable Rails/OutputSafety
     end
 
-    linkable_accounts = status.active_mentions.map(&:account)
-    linkable_accounts << status.account
+    formatter_options = {
+      input: :mastodon,
+      entity_output: :as_input,
+      linkable_accounts: status.active_mentions.map(&:account) + [status.account],
+      custom_emojis: options[:custom_emojify] ? status.emojis : nil,
+      autoplay: options[:autoplay],
+      syntax_highlighter: 'rouge',
+      syntax_highlighter_opts: {
+        guess_lang: true,
+        # line_numbers: true, # useless!
+        # inline_theme: 'base16.light' # do not use this!
+      }
+    }
+
+    case status.content_type
+    when 'text/markdown'
+      raw_content = "RT @#{prepend_reblog} #{raw_content}" if prepend_reblog
+      html = Kramdown::Document.new(raw_content, formatter_options).to_mastodon
+      html = html.delete("\n").html_safe # rubocop:disable Rails/OutputSafety
+    #when 'text/plain'
+    else
+      linkable_accounts = status.active_mentions.map(&:account)
+      linkable_accounts << status.account
 
-    html = raw_content
-    html = "RT @#{prepend_reblog} #{html}" if prepend_reblog
-    html = encode_and_link_urls(html, linkable_accounts)
-    html = encode_custom_emojis(html, status.emojis, options[:autoplay]) if options[:custom_emojify]
-    html = simple_format(html, {}, sanitize: false)
-    html = quotify(html, status) if status.quote? && !options[:escape_quotify]
-    html = html.delete("\n")
+      html = raw_content
+      html = "RT @#{prepend_reblog} #{html}" if prepend_reblog
+      html = encode_and_link_urls(html, linkable_accounts)
+      html = encode_custom_emojis(html, status.emojis, options[:autoplay]) if options[:custom_emojify]
+      html = simple_format(html, {}, sanitize: false)
+      html = quotify(html, status) if status.quote? && !options[:escape_quotify]
+      html = html.delete("\n")
 
-    html.html_safe # rubocop:disable Rails/OutputSafety
+      html.html_safe # rubocop:disable Rails/OutputSafety
+    end
   end
 
   def format_in_quote(status, **options)
diff --git a/app/lib/user_settings_decorator.rb b/app/lib/user_settings_decorator.rb
index 6824b8b0cb5d96889ae54311f9763daeb6837437..de5c639feccf6dd65fe4d111776a0a489a30bf5d 100644
--- a/app/lib/user_settings_decorator.rb
+++ b/app/lib/user_settings_decorator.rb
@@ -21,6 +21,7 @@ class UserSettingsDecorator
     user.settings['default_sensitive']   = default_sensitive_preference if change?('setting_default_sensitive')
     user.settings['default_language']    = default_language_preference if change?('setting_default_language')
     user.settings['default_federation']  = default_federation_preference if change?('setting_default_federation')
+    user.settings['default_content_type']= default_content_type_preference if change?('setting_default_content_type')
     user.settings['unfollow_modal']      = unfollow_modal_preference if change?('setting_unfollow_modal')
     user.settings['unsubscribe_modal']                 = unsubscribe_modal_preference if change?('setting_unsubscribe_modal')
     user.settings['boost_modal']         = boost_modal_preference if change?('setting_boost_modal')
@@ -70,6 +71,10 @@ class UserSettingsDecorator
   def default_federation_preference
     boolean_cast_setting 'setting_default_federation'
   end
+  
+  def default_content_type_preference
+    settings['setting_default_content_type']
+  end
 
   def unfollow_modal_preference
     boolean_cast_setting 'setting_unfollow_modal'
diff --git a/app/models/status.rb b/app/models/status.rb
index f8f3eebf86d7bca287f07bb84e08f36d252a3619..2e97f3584eb9b39b53bd3f802e9f56d764639cd1 100644
--- a/app/models/status.rb
+++ b/app/models/status.rb
@@ -27,6 +27,7 @@
 #  expires_at             :datetime
 #  expires_action         :integer          default("delete"), not null
 #  local_only             :boolean
+#  content_type           :string
 #
 
 class Status < ApplicationRecord
@@ -93,6 +94,7 @@ class Status < ApplicationRecord
   validates :visibility, exclusion: { in: %w(direct limited) }, if: :reblog?
   validates :quote_visibility, inclusion: { in: %w(public unlisted) }, if: :quote?
   validates_with ExpiresValidator, on: :create, if: :local?
+  validates :content_type, inclusion: { in: %w(text/plain text/markdown) }, allow_nil: true
 
   accepts_nested_attributes_for :poll
 
@@ -353,6 +355,10 @@ class Status < ApplicationRecord
       visibilities.keys - %w(direct limited)
     end
 
+    def selectable_content_types
+      %w(text/plain text/markdown)
+    end
+
     def favourites_map(status_ids, account_id)
       Favourite.select('status_id').where(status_id: status_ids).where(account_id: account_id).each_with_object({}) { |f, h| h[f.status_id] = true }
     end
diff --git a/app/models/user.rb b/app/models/user.rb
index 47c23f458eeddd9ef9e68545e1db151dadc74b5b..83a617f3c82d629e0fe726f9b6697df8a139b91d 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -116,7 +116,7 @@ class User < ApplicationRecord
            :reduce_motion, :system_font_ui, :noindex, :theme, :display_media, :hide_network,
            :expand_spoilers, :default_language, :aggregate_reblogs, :show_application,
            :advanced_layout, :use_blurhash, :use_pending_items, :trends, :crop_images, :default_federation,
-           :disable_swiping,
+           :disable_swiping, :default_content_type,
            :show_follow_button_on_timeline, :show_subscribe_button_on_timeline, :show_target,
            :show_follow_button_on_timeline, :show_subscribe_button_on_timeline, :show_followed_by, :show_target,
            :follow_button_to_list_adder, :show_navigation_panel, :show_quote_button, :show_bookmark_button,
diff --git a/app/serializers/initial_state_serializer.rb b/app/serializers/initial_state_serializer.rb
index 4751a8bd9bbfd077446fa0af00c491edb6cfe90a..b6390c23234a958af82b8e04310b972aa3c89a15 100644
--- a/app/serializers/initial_state_serializer.rb
+++ b/app/serializers/initial_state_serializer.rb
@@ -72,6 +72,7 @@ class InitialStateSerializer < ActiveModel::Serializer
       store[:default_privacy]   = object.visibility || object.current_account.user.setting_default_privacy
       store[:default_sensitive] = object.current_account.user.setting_default_sensitive
       store[:default_federation] = object.current_account.user.setting_default_federation
+      store[:default_content_type] = object.current_account.user.setting_default_content_type
     end
 
     store[:text] = object.text if object.text
diff --git a/app/serializers/rest/credential_account_serializer.rb b/app/serializers/rest/credential_account_serializer.rb
index fa8f900cc594170dc646a0fab0fee5643a6082b3..c91fe0adbd009d01688dc22c5d50c4957f3be7f2 100644
--- a/app/serializers/rest/credential_account_serializer.rb
+++ b/app/serializers/rest/credential_account_serializer.rb
@@ -11,6 +11,7 @@ class REST::CredentialAccountSerializer < REST::AccountSerializer
       sensitive: user.setting_default_sensitive,
       language: user.setting_default_language,
       federation: user.setting_default_federation,
+      content_type: user.setting_default_content_type,
       note: object.note,
       fields: object.fields.map(&:to_h),
       follow_requests_count: FollowRequest.where(target_account: object).limit(40).count,
diff --git a/app/serializers/rest/status_serializer.rb b/app/serializers/rest/status_serializer.rb
index e4c4991b4afe6d99138cc7ce5b5a629e2ea7efef..cc46277b87d27438c248c9e74598eb3aa4887b76 100644
--- a/app/serializers/rest/status_serializer.rb
+++ b/app/serializers/rest/status_serializer.rb
@@ -4,7 +4,7 @@ class REST::StatusSerializer < ActiveModel::Serializer
   attributes :id, :created_at, :in_reply_to_id, :in_reply_to_account_id,
              :sensitive, :spoiler_text, :visibility, :language,
              :uri, :url, :replies_count, :reblogs_count,
-             :favourites_count, :limited, :local_only
+             :favourites_count, :limited, :local_only, :content_type
 
   attribute :favourited, if: :current_user?
   attribute :reblogged, if: :current_user?
diff --git a/app/services/post_status_service.rb b/app/services/post_status_service.rb
index d3fc7c30736f98c125fcec8e458cf641f6cb36f2..4e94f9c15c3341657edf5616a04a36ae1f2a8336 100644
--- a/app/services/post_status_service.rb
+++ b/app/services/post_status_service.rb
@@ -128,6 +128,11 @@ class PostStatusService < BaseService
     local_only
   end
 
+  def content_type_option(content_type, content_type_setting)
+    return content_type_setting if content_type.nil?
+    content_type
+  end
+
   def postprocess_status!
     LinkCrawlWorker.perform_async(@status.id) unless @status.spoiler_text?
     DistributionWorker.perform_async(@status.id)
@@ -205,6 +210,7 @@ class PostStatusService < BaseService
       expires_at: @expires_at,
       expires_action: @expires_action,
       local_only: local_only_option(@options[:local_only], @in_reply_to, @account.user&.setting_default_federation),
+      content_type: content_type_option(@options[:content_type], @account.user&.setting_default_content_type),
     }.compact
   end
 
diff --git a/app/views/settings/preferences/other/show.html.haml b/app/views/settings/preferences/other/show.html.haml
index 6b9190b03328b635b35303d54e65e8eff021627e..91baca1b4068e0006e2129693240e475ea93eebc 100644
--- a/app/views/settings/preferences/other/show.html.haml
+++ b/app/views/settings/preferences/other/show.html.haml
@@ -25,6 +25,10 @@
     .fields-group.fields-row__column.fields-row__column-6
       = f.input :setting_default_language, collection: [nil] + filterable_languages.sort, wrapper: :with_label, label_method: lambda { |locale| locale.nil? ? I18n.t('statuses.language_detection') : human_locale(locale) }, required: false, include_blank: false, hint: false
 
+  .fields-row
+    .fields-group.fields-row__column.fields-row__column-6
+      = f.input :setting_default_content_type, collection: Status.selectable_content_types, wrapper: :with_label, include_blank: false, label_method: lambda { |content_type| I18n.t("statuses.content_types.#{content_type}") }, required: false, hint: false
+
   .fields-group
     = f.input :setting_default_sensitive, as: :boolean, wrapper: :with_label
 
diff --git a/config/application.rb b/config/application.rb
index ad6cf82d70f9710df3196214a06396d4a736dd5b..dbc02d1d7fde1cceba03ee00e685edded4bcf8a9 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -22,6 +22,8 @@ require_relative '../lib/mastodon/version'
 require_relative '../lib/devise/two_factor_ldap_authenticatable'
 require_relative '../lib/devise/two_factor_pam_authenticatable'
 require_relative '../lib/chewy/strategy/custom_sidekiq'
+require_relative '../lib/kramdown/parser/mastodon'
+require_relative '../lib/kramdown/converter/mastodon'
 
 Dotenv::Railtie.load
 
diff --git a/config/locales/en.yml b/config/locales/en.yml
index b480bf33a1b099ff79aa10e1644441e1fd45057f..b98283c1944e2a3fa6fb70ead648ddf0eb943dda 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -1271,6 +1271,9 @@ en:
         one: "%{count} video"
         other: "%{count} videos"
     boosted_from_html: Boosted from %{acct_link}
+    content_types:
+      text/markdown: Markdown
+      text/plain: Plain text
     content_warning: 'Content warning: %{warning}'
     disallowed_hashtags:
       one: 'contained a disallowed hashtag: %{tags}'
diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml
index 70daf572a02206759fa011fa4b8ad77f6184a935..4bff199bc5ad4b9550cdc20a671e95707613943a 100644
--- a/config/locales/simple_form.en.yml
+++ b/config/locales/simple_form.en.yml
@@ -163,6 +163,7 @@ en:
         setting_auto_play_gif: Auto-play animated GIFs
         setting_boost_modal: Show confirmation dialog before boosting
         setting_crop_images: Crop images in non-expanded toots to 16x9
+        setting_default_content_type: Default rich content type of toots
         setting_default_federation: Allow my toots to reach other instances by default
         setting_default_language: Posting language
         setting_default_privacy: Posting privacy
diff --git a/config/locales/simple_form.zh-CN.yml b/config/locales/simple_form.zh-CN.yml
index 6bb1053a8e11647bf93d9cf0cc27403f4ddd4250..5d190760666393ca63fc789d3a6779c1af76d5fe 100644
--- a/config/locales/simple_form.zh-CN.yml
+++ b/config/locales/simple_form.zh-CN.yml
@@ -131,6 +131,7 @@ zh-CN:
         setting_auto_play_gif: 自动播放 GIF 动画
         setting_boost_modal: 在转嘟前询问我
         setting_crop_images: 把未展开嘟文中的图片裁剪到 16x9
+        setting_default_content_type: 默认的嘟文富文本格式
         setting_default_language: 发布语言
         setting_default_privacy: 嘟文默认可见范围
         setting_default_sensitive: 总是将我发送的媒体文件标记为敏感内容
diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml
index a67cd01225461d7215b8eb4bf7b5ea2aa0068373..6172adcd2757f486adbabfa7bb40ace895079ccb 100644
--- a/config/locales/zh-CN.yml
+++ b/config/locales/zh-CN.yml
@@ -1114,6 +1114,9 @@ zh-CN:
       video:
         other: "%{count} 段视频"
     boosted_from_html: 转嘟自 %{acct_link}
+    content_types:
+      text/markdown: Markdown
+      text/plain: 纯文本
     content_warning: 内容警告:%{warning}
     disallowed_hashtags:
       other: 包含了这些禁止的话题标签:%{tags}
diff --git a/config/settings.yml b/config/settings.yml
index 57e3d84dacd931ad17d562c9052e9aad476f462b..a044caf06723b4b8053d32deab7a22d3f6060152 100644
--- a/config/settings.yml
+++ b/config/settings.yml
@@ -18,6 +18,7 @@ defaults: &defaults
   show_staff_badge: true
   default_sensitive: false
   default_federation: true
+  default_content_type: 'text/plain'
   hide_network: false
   unfollow_modal: false
   unsubscribe_modal: false
diff --git a/db/migrate/20200926190114_add_content_type_to_statuses.rb b/db/migrate/20200926190114_add_content_type_to_statuses.rb
new file mode 100644
index 0000000000000000000000000000000000000000..efbe2caa718784b0aa6d96900ae7b8384acb386c
--- /dev/null
+++ b/db/migrate/20200926190114_add_content_type_to_statuses.rb
@@ -0,0 +1,5 @@
+class AddContentTypeToStatuses < ActiveRecord::Migration[5.2]
+  def change
+    add_column :statuses, :content_type, :string
+  end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 0fdc8cbfad2829d19916a202da3f77129d533f2c..6dbad1864e4ada22935d69622cf384acaae9f7a6 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
 #
 # It's strongly recommended that you check this file into your version control system.
 
-ActiveRecord::Schema.define(version: 2020_10_08_220312) do
+ActiveRecord::Schema.define(version: 2020_10_08_220313) do
 
   # These are extensions that must be enabled in order to support this database
   enable_extension "plpgsql"
@@ -930,6 +930,7 @@ ActiveRecord::Schema.define(version: 2020_10_08_220312) do
     t.datetime "expires_at"
     t.integer "expires_action", default: 0, null: false
     t.boolean "local_only"
+    t.string "content_type"
     t.index ["account_id", "id", "visibility", "updated_at"], name: "index_statuses_20190820", order: { id: :desc }, where: "(deleted_at IS NULL)"
     t.index ["id", "account_id"], name: "index_statuses_local_20190824", order: { id: :desc }, where: "((local OR (uri IS NULL)) AND (deleted_at IS NULL) AND (visibility = 0) AND (reblog_of_id IS NULL) AND ((NOT reply) OR (in_reply_to_account_id = account_id)))"
     t.index ["id", "account_id"], name: "index_statuses_public_20200119", order: { id: :desc }, where: "((deleted_at IS NULL) AND (visibility = 0) AND (reblog_of_id IS NULL) AND ((NOT reply) OR (in_reply_to_account_id = account_id)))"
diff --git a/lib/kramdown/converter/mastodon.rb b/lib/kramdown/converter/mastodon.rb
new file mode 100644
index 0000000000000000000000000000000000000000..97aa67cd1cadfefef53e0baa359128351a94c95d
--- /dev/null
+++ b/lib/kramdown/converter/mastodon.rb
@@ -0,0 +1,75 @@
+# frozen_string_literal: true
+
+require 'kramdown/converter'
+require 'kramdown/utils'
+
+module Kramdown
+  module Converter
+    class Mastodon < Html
+      def convert_text(element, _indent)
+        html = Formatter.instance.send(:encode_and_link_urls, element.value, @options[:linkable_accounts])
+
+        if @options[:custom_emojis]
+          Formatter.instance.send(:encode_custom_emojis, html, @options[:custom_emojis], @options[:autoplay])
+        else
+          html
+        end
+      end
+
+      def host_to_url(str)
+        "http#{Rails.configuration.x.use_https ? 's' : ''}://#{str}" unless str.blank?
+      end
+
+      def convert_img(el, _opts)
+        base_host = Rails.configuration.x.web_domain
+
+        assets_host   = Rails.configuration.action_controller.asset_host
+        assets_host ||= host_to_url(base_host)
+
+        media_host   = host_to_url(ENV['S3_ALIAS_HOST'])
+        media_host ||= host_to_url(ENV['S3_CLOUDFRONT_HOST'])
+        media_host ||= host_to_url(ENV['S3_HOSTNAME']) if ENV['S3_ENABLED'] == 'true'
+        media_host ||= assets_host
+
+        src = el.attr['src']
+        unless src.start_with?( media_host, ENV['IMAGE_PROXY_HOST'] || 'https://images.weserv.nl/')
+          src = "#{ENV['IMAGE_PROXY_PATH'] || 'https://images.weserv.nl/?n=-1&il&url='}#{src}"
+        end
+        el.attr['src'] = src
+        "<img#{html_attributes(el.attr)} />"
+      end
+
+      def convert_codeblock(el, indent)
+        attr = el.attr.dup
+        lang = extract_code_language!(attr)
+        hl_opts = {}
+        highlighted_code = highlight_code(el.value, el.options[:lang] || lang, :block, hl_opts)
+        highlighted_code = highlighted_code == nil ? highlighted_code : highlighted_code.gsub(/[\r\n]/, '<br>')
+
+        if highlighted_code
+          add_syntax_highlighter_to_class_attr(attr, lang || hl_opts[:default_lang])
+          "#{' ' * indent}<div#{html_attributes(attr)}>#{highlighted_code}#{' ' * indent}</div>\n"
+        else
+          result = escape_html(el.value)
+          result.chomp!
+          if el.attr['class'].to_s =~ /\bshow-whitespaces\b/
+            result.gsub!(/(?:(^[ \t]+)|([ \t]+$)|([ \t]+))/) do |m|
+              suffix = ($1 ? '-l' : ($2 ? '-r' : ''))
+              m.scan(/./).map do |c|
+                case c
+                when "\t" then "<span class=\"ws-tab#{suffix}\">\t</span>"
+                when " " then "<span class=\"ws-space#{suffix}\">&#8901;</span>"
+                end
+              end.join('')
+            end
+          end
+          code_attr = {}
+          code_attr['class'] = "language-#{lang}" if lang
+          "#{' ' * indent}<pre#{html_attributes(attr)}>" \
+            "<code#{html_attributes(code_attr)}>#{result}\n</code></pre>\n"
+        end
+      end
+
+    end
+  end
+end
\ No newline at end of file
diff --git a/lib/kramdown/parser/mastodon.rb b/lib/kramdown/parser/mastodon.rb
new file mode 100644
index 0000000000000000000000000000000000000000..1b35a1d6e839b9571ce94d7d3d430daccf91f333
--- /dev/null
+++ b/lib/kramdown/parser/mastodon.rb
@@ -0,0 +1,69 @@
+# frozen_string_literal: true
+
+require 'kramdown/parser'
+
+module Kramdown
+  module Parser
+    class Mastodon < GFM
+      def initialize(source, options)
+        super
+
+        # @block_parsers = %i(blank_line paragraph)
+        # @span_parsers  = %i(no_intra_emphasis codespan immediate_line_break escaped_chars)
+      end
+
+      def parse_immediate_line_break
+        @tree.children << Element.new(:br, nil, nil, location: @src.current_line_number)
+        @src.pos += @src.matched_size
+      end
+
+      define_parser(:immediate_line_break, /\n/, '\n')
+
+      def parse_no_intra_emphasis
+        start_line_number = @src.current_line_number
+        saved_pos         = @src.save_pos
+
+        result  = @src.scan(EMPHASIS_START)
+        element = (result.length == 2 ? :strong : :em)
+        type    = result[0..0]
+
+        if (@src.pre_match =~ /[[:alpha:]-]\z/) || @src.check(/\s/) || @tree.type == element || @stack.any? { |el, _| el.type == element }
+          add_text(result)
+          return
+        end
+
+        sub_parse = lambda do |delim, elem|
+          el      = Element.new(elem, nil, nil, location: start_line_number)
+          stop_re = /#{Regexp.escape(delim)}/
+
+          found = parse_spans(el, stop_re) do
+            (@src.pre_match[-1, 1] !~ /\s/) &&
+              (elem != :em || !@src.match?(/#{Regexp.escape(delim * 2)}(?!#{Regexp.escape(delim)})/)) &&
+              (type != '_' || !@src.match?(/#{Regexp.escape(delim)}[[:alnum:]]/)) && !el.children.empty?
+          end
+
+          [found, el, stop_re]
+        end
+
+        found, el, stop_re = sub_parse.call(result, element)
+
+        if !found && element == :strong && @tree.type != :em
+          @src.revert_pos(saved_pos)
+          @src.pos += 1
+          found, el, stop_re = sub_parse.call(type, :em)
+        end
+
+        if found
+          @src.scan(stop_re)
+          @tree.children << el
+        else
+          @src.revert_pos(saved_pos)
+          @src.pos += result.length
+          add_text(result)
+        end
+      end
+
+      define_parser(:no_intra_emphasis, EMPHASIS_START, '\*|_')
+    end
+  end
+end
\ No newline at end of file