diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb
index 0a8015a5674c3d1dd5322c0927fef2ca4f291218..f6c599b8624de4c465cd3224ccaef1ea7428c462 100644
--- a/app/controllers/accounts_controller.rb
+++ b/app/controllers/accounts_controller.rb
@@ -40,7 +40,7 @@ class AccountsController < ApplicationController
       format.rss do
         expires_in 1.minute, public: true
 
-        @statuses = filtered_statuses.without_reblogs.without_replies.limit(PAGE_SIZE)
+        @statuses = filtered_statuses.without_reblogs.without_local_only.without_replies.limit(PAGE_SIZE)
         @statuses = cache_collection(@statuses, Status)
         render xml: RSS::AccountSerializer.render(@account, @statuses, params[:tag])
       end
@@ -71,7 +71,11 @@ class AccountsController < ApplicationController
   end
 
   def default_statuses
-    @account.statuses.where(visibility: [:public, :unlisted])
+    if current_user.nil?
+      @account.statuses.without_local_only.where(visibility: [:public, :unlisted])
+    else
+      @account.statuses.where(visibility: [:public, :unlisted])
+    end
   end
 
   def only_media_scope
diff --git a/app/controllers/api/v1/accounts/credentials_controller.rb b/app/controllers/api/v1/accounts/credentials_controller.rb
index e77f57910b2bfbcbe11c0fb958bb7b9eb43e3f63..b2fa720b6bcdde4fbf9d67da81c49ea3edbab649 100644
--- a/app/controllers/api/v1/accounts/credentials_controller.rb
+++ b/app/controllers/api/v1/accounts/credentials_controller.rb
@@ -33,6 +33,7 @@ class Api::V1::Accounts::CredentialsController < Api::BaseController
       'setting_default_privacy' => source_params.fetch(:privacy, @account.user.setting_default_privacy),
       '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),
     }
   end
 end
diff --git a/app/controllers/api/v1/statuses_controller.rb b/app/controllers/api/v1/statuses_controller.rb
index bba3c0651beedb365d8554bd3bb0057d801e9db4..cb454e286473707a8c779c058a534bbe4f6ab39f 100644
--- a/app/controllers/api/v1/statuses_controller.rb
+++ b/app/controllers/api/v1/statuses_controller.rb
@@ -44,7 +44,8 @@ class Api::V1::StatusesController < Api::BaseController
                                          scheduled_at: status_params[:scheduled_at],
                                          application: doorkeeper_token.application,
                                          poll: status_params[:poll],
-                                         idempotency: request.headers['Idempotency-Key'])
+                                         idempotency: request.headers['Idempotency-Key'],
+                                         local_only: status_params[:local_only])
 
     render json: @status, serializer: @status.is_a?(ScheduledStatus) ? REST::ScheduledStatusSerializer : REST::StatusSerializer
   end
@@ -76,6 +77,7 @@ class Api::V1::StatusesController < Api::BaseController
       :spoiler_text,
       :visibility,
       :scheduled_at,
+      :local_only,
       media_ids: [],
       poll: [
         :multiple,
diff --git a/app/controllers/settings/preferences_controller.rb b/app/controllers/settings/preferences_controller.rb
index edf29947bb046761c86ce3f9b7453aecea30a719..12b11c542c52f73be0c8a3c9bbfd60cf62da0964 100644
--- a/app/controllers/settings/preferences_controller.rb
+++ b/app/controllers/settings/preferences_controller.rb
@@ -40,6 +40,7 @@ class Settings::PreferencesController < Settings::BaseController
       :setting_default_privacy,
       :setting_default_sensitive,
       :setting_default_language,
+      :setting_default_federation,
       :setting_unfollow_modal,
       :setting_boost_modal,
       :setting_delete_modal,
diff --git a/app/javascript/mastodon/actions/compose.js b/app/javascript/mastodon/actions/compose.js
index 8e7906c7387da3de01a0d6afe7cb76576f04559b..2dcb81035de9c483f89a5132bc0c78191e3f7588 100644
--- a/app/javascript/mastodon/actions/compose.js
+++ b/app/javascript/mastodon/actions/compose.js
@@ -42,6 +42,7 @@ export const COMPOSE_SENSITIVITY_CHANGE = 'COMPOSE_SENSITIVITY_CHANGE';
 export const COMPOSE_SPOILERNESS_CHANGE = 'COMPOSE_SPOILERNESS_CHANGE';
 export const COMPOSE_SPOILER_TEXT_CHANGE = 'COMPOSE_SPOILER_TEXT_CHANGE';
 export const COMPOSE_VISIBILITY_CHANGE  = 'COMPOSE_VISIBILITY_CHANGE';
+export const COMPOSE_FEDERATION_CHANGE  = 'COMPOSE_FEDERATION_CHANGE';
 export const COMPOSE_LISTABILITY_CHANGE = 'COMPOSE_LISTABILITY_CHANGE';
 export const COMPOSE_COMPOSING_CHANGE = 'COMPOSE_COMPOSING_CHANGE';
 
@@ -142,6 +143,7 @@ export function submitCompose(routerHistory) {
       spoiler_text: getState().getIn(['compose', 'spoiler']) ? getState().getIn(['compose', 'spoiler_text'], '') : '',
       visibility: getState().getIn(['compose', 'privacy']),
       poll: getState().getIn(['compose', 'poll'], null),
+      local_only: !getState().getIn(['compose', 'federation']),
     }, {
       headers: {
         'Idempotency-Key': getState().getIn(['compose', 'idempotencyKey']),
@@ -525,6 +527,13 @@ export function changeComposeVisibility(value) {
   };
 };
 
+export function changeComposeFederation(value) {
+  return {
+    type: COMPOSE_FEDERATION_CHANGE,
+    value,
+  };
+};
+
 export function insertEmojiCompose(position, emoji, needsSpace) {
   return {
     type: COMPOSE_EMOJI_INSERT,
diff --git a/app/javascript/mastodon/components/status_action_bar.js b/app/javascript/mastodon/components/status_action_bar.js
index 0bfbd887945dabdf9b9e5001c4d17121b087420c..27c2b466500780b1a79164e7124de7d8e47578b4 100644
--- a/app/javascript/mastodon/components/status_action_bar.js
+++ b/app/javascript/mastodon/components/status_action_bar.js
@@ -22,6 +22,7 @@ const messages = defineMessages({
   reblog_private: { id: 'status.reblog_private', defaultMessage: 'Boost to original audience' },
   cancel_reblog_private: { id: 'status.cancel_reblog_private', defaultMessage: 'Unboost' },
   cannot_reblog: { id: 'status.cannot_reblog', defaultMessage: 'This post cannot be boosted' },
+  local_only: { id: 'status.local_only', defaultMessage: 'This post is only visible by other users of your instance' },
   favourite: { id: 'status.favourite', defaultMessage: 'Favourite' },
   open: { id: 'status.open', defaultMessage: 'Expand this status' },
   report: { id: 'status.report', defaultMessage: 'Report @{name}' },
@@ -183,6 +184,7 @@ class StatusActionBar extends ImmutablePureComponent {
     const mutingConversation = status.get('muted');
     const anonymousAccess    = !me;
     const publicStatus       = ['public', 'unlisted'].includes(status.get('visibility'));
+    const federated          = !status.get('local_only');
 
     let menu = [];
     let reblogIcon = 'retweet';
@@ -257,6 +259,9 @@ class StatusActionBar extends ImmutablePureComponent {
         <div className='status__action-bar-dropdown'>
           <DropdownMenuContainer disabled={anonymousAccess} status={status} items={menu} icon='ellipsis-h' size={18} direction='right' title={intl.formatMessage(messages.more)} />
         </div>
+        { !federated &&
+          <IconButton className='status__action-bar-button' disabled title={intl.formatMessage(messages.local_only)} icon='chain-broken' />
+        }
       </div>
     );
   }
diff --git a/app/javascript/mastodon/features/compose/components/compose_form.js b/app/javascript/mastodon/features/compose/components/compose_form.js
index 672f93cf45cc41cb29d1ffdb96226735432090b8..a6d0c88a8956b63be1a42c4ec68199063eafd466 100644
--- a/app/javascript/mastodon/features/compose/components/compose_form.js
+++ b/app/javascript/mastodon/features/compose/components/compose_form.js
@@ -11,6 +11,7 @@ import UploadButtonContainer from '../containers/upload_button_container';
 import { defineMessages, injectIntl } from 'react-intl';
 import SpoilerButtonContainer from '../containers/spoiler_button_container';
 import PrivacyDropdownContainer from '../containers/privacy_dropdown_container';
+import FederationDropdownContainer from '../containers/federation_dropdown_container';
 import EmojiPickerDropdown from '../containers/emoji_picker_dropdown_container';
 import PollFormContainer from '../containers/poll_form_container';
 import UploadFormContainer from '../containers/upload_form_container';
@@ -43,6 +44,7 @@ class ComposeForm extends ImmutablePureComponent {
     suggestions: ImmutablePropTypes.list,
     spoiler: PropTypes.bool,
     privacy: PropTypes.string,
+    federation: PropTypes.bool,
     spoilerText: PropTypes.string,
     focusDate: PropTypes.instanceOf(Date),
     caretPosition: PropTypes.number,
@@ -242,6 +244,7 @@ class ComposeForm extends ImmutablePureComponent {
             <PollButtonContainer />
             <PrivacyDropdownContainer />
             <SpoilerButtonContainer />
+            <FederationDropdownContainer />
           </div>
           <div className='character-counter__wrapper'><CharacterCounter max={65535} text={text} /></div>
         </div>
diff --git a/app/javascript/mastodon/features/compose/components/federation_dropdown.js b/app/javascript/mastodon/features/compose/components/federation_dropdown.js
new file mode 100644
index 0000000000000000000000000000000000000000..571cbcb6b59aeb324bc992664a4baf7ba8486f9e
--- /dev/null
+++ b/app/javascript/mastodon/features/compose/components/federation_dropdown.js
@@ -0,0 +1,250 @@
+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';
+
+const messages = defineMessages({
+  federate_short: { id: 'federation.federated.short', defaultMessage: 'Federated' },
+  federate_long: { id: 'federation.federated.long', defaultMessage: 'Allow toot to reach other instances' },
+  local_only_short: { id: 'federation.local_only.short', defaultMessage: 'Local-only' },
+  local_only_long: { id: 'federation.local_only.long', defaultMessage: 'Restrict this toot only to my instance' },
+  change_federation: { id: 'federation.change', defaultMessage: 'Adjust status federation' },
+});
+
+const listenerOptions = detectPassiveEvents.hasSupport ? { passive: true } : false;
+
+class FederationDropdownMenu extends React.PureComponent {
+
+  static propTypes = {
+    style: PropTypes.object,
+    items: PropTypes.array.isRequired,
+    value: PropTypes.bool.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 = Boolean(e.currentTarget.getAttribute('data-index'));
+    const index = items.findIndex(item => {
+      return (item.value === value);
+    });
+    let element;
+
+    switch(e.key) {
+    case 'Escape':
+      this.props.onClose();
+      break;
+    case 'Enter':
+      this.handleClick(e);
+      break;
+    case 'ArrowDown':
+      element = this.node.childNodes[index + 1];
+      if (element) {
+        element.focus();
+        this.props.onChange(Boolean(element.getAttribute('data-index')));
+      }
+      break;
+    case 'ArrowUp':
+      element = this.node.childNodes[index - 1];
+      if (element) {
+        element.focus();
+        this.props.onChange(Boolean(element.getAttribute('data-index')));
+      }
+      break;
+    case 'Home':
+      element = this.node.firstChild;
+      if (element) {
+        element.focus();
+        this.props.onChange(Boolean(element.getAttribute('data-index')));
+      }
+      break;
+    case 'End':
+      element = this.node.lastChild;
+      if (element) {
+        element.focus();
+        this.props.onChange(Boolean(element.getAttribute('data-index')));
+      }
+      break;
+    }
+  }
+
+  handleClick = e => {
+    const value = Boolean(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();
+    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, 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' style={{ ...style, opacity: opacity, transform: mounted ? `scale(${scaleX}, ${scaleY})` : null }} role='listbox' ref={this.setRef}>
+            {items.map(item => (
+              <div role='option' tabIndex='0' key={item.value} data-index={item.value ? item.value : undefined} 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'>
+                  <i className={`fa fa-fw fa-${item.icon}`} />
+                </div>
+
+                <div className='privacy-dropdown__option__content'>
+                  <strong>{item.text}</strong>
+                  {item.meta}
+                </div>
+              </div>
+            ))}
+          </div>
+        )}
+      </Motion>
+    );
+  }
+
+}
+
+@injectIntl
+export default class FederationDropdown extends React.PureComponent {
+
+  static propTypes = {
+    isUserTouching: PropTypes.func,
+    isModalOpen: PropTypes.bool.isRequired,
+    onModalOpen: PropTypes.func,
+    onModalClose: PropTypes.func,
+    value: PropTypes.bool.isRequired,
+    onChange: PropTypes.func.isRequired,
+    intl: PropTypes.object.isRequired,
+  };
+
+  state = {
+    open: false,
+    placement: null,
+  };
+
+  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();
+      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;
+    }
+  }
+
+  handleClose = () => {
+    this.setState({ open: false });
+  }
+
+  handleChange = value => {
+    this.props.onChange(value);
+  }
+
+  componentWillMount () {
+    const { intl: { formatMessage } } = this.props;
+
+    this.options = [
+      { icon: 'link', value: true, text: formatMessage(messages.federate_short), meta: formatMessage(messages.federate_long) },
+      { icon: 'chain-broken', value: false, text: formatMessage(messages.local_only_short), meta: formatMessage(messages.local_only_long) },
+    ];
+  }
+
+  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', { active: open })} onKeyDown={this.handleKeyDown}>
+        <div className={classNames('privacy-dropdown__value', { active: this.options.indexOf(valueOption) === 0 })}>
+          <IconButton
+            className='privacy-dropdown__value-icon'
+            icon={valueOption.icon}
+            title={intl.formatMessage(messages.change_federation)}
+            size={18}
+            expanded={open}
+            active={open}
+            inverted
+            onClick={this.handleToggle}
+            style={{ height: null, lineHeight: '27px' }}
+          />
+        </div>
+
+        <Overlay show={open} placement={placement} target={this}>
+          <FederationDropdownMenu
+            items={this.options}
+            value={value}
+            onClose={this.handleClose}
+            onChange={this.handleChange}
+          />
+        </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 37a0e8845b4f1b1d2f523a40ad932407b6b2c1fd..1483e943b4e14b87fda779a76c1592bba33fc521 100644
--- a/app/javascript/mastodon/features/compose/containers/compose_form_container.js
+++ b/app/javascript/mastodon/features/compose/containers/compose_form_container.js
@@ -17,6 +17,7 @@ const mapStateToProps = state => ({
   spoiler: state.getIn(['compose', 'spoiler']),
   spoilerText: state.getIn(['compose', 'spoiler_text']),
   privacy: state.getIn(['compose', 'privacy']),
+  federation: state.getIn(['compose', 'federation']),
   focusDate: state.getIn(['compose', 'focusDate']),
   caretPosition: state.getIn(['compose', 'caretPosition']),
   preselectDate: state.getIn(['compose', 'preselectDate']),
diff --git a/app/javascript/mastodon/features/compose/containers/federation_dropdown_container.js b/app/javascript/mastodon/features/compose/containers/federation_dropdown_container.js
new file mode 100644
index 0000000000000000000000000000000000000000..268f4da2dbb6ddbe102347c075c3cf6061f5f2f6
--- /dev/null
+++ b/app/javascript/mastodon/features/compose/containers/federation_dropdown_container.js
@@ -0,0 +1,24 @@
+import { connect } from 'react-redux';
+import FederationDropdown from '../components/federation_dropdown';
+import { changeComposeFederation } 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', 'federation']),
+});
+
+const mapDispatchToProps = dispatch => ({
+
+  onChange (value) {
+    dispatch(changeComposeFederation(value));
+  },
+
+  isUserTouching,
+  onModalOpen: props => dispatch(openModal('ACTIONS', props)),
+  onModalClose: () => dispatch(closeModal()),
+
+});
+
+export default connect(mapStateToProps, mapDispatchToProps)(FederationDropdown);
diff --git a/app/javascript/mastodon/features/status/components/detailed_status.js b/app/javascript/mastodon/features/status/components/detailed_status.js
index e97f18f08c134ce796d5dd317db01f269cc24822..a0838740a7dbe8feda2e5ea7100179707ad6d340 100644
--- a/app/javascript/mastodon/features/status/components/detailed_status.js
+++ b/app/javascript/mastodon/features/status/components/detailed_status.js
@@ -6,7 +6,7 @@ import DisplayName from '../../../components/display_name';
 import StatusContent from '../../../components/status_content';
 import MediaGallery from '../../../components/media_gallery';
 import { Link } from 'react-router-dom';
-import { FormattedDate, FormattedNumber } from 'react-intl';
+import { defineMessages, injectIntl, FormattedDate, FormattedNumber } from 'react-intl';
 import Card from './card';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 import Video from '../../video';
@@ -15,6 +15,11 @@ import scheduleIdleTask from '../../ui/util/schedule_idle_task';
 import classNames from 'classnames';
 import Icon from 'mastodon/components/icon';
 
+const messages = defineMessages({
+  local_only: { id: 'status.local_only', defaultMessage: 'This post is only visible by other users of your instance' },
+});
+
+@injectIntl
 export default class DetailedStatus extends ImmutablePureComponent {
 
   static contextTypes = {
@@ -90,6 +95,7 @@ export default class DetailedStatus extends ImmutablePureComponent {
 
   render () {
     const status = (this.props.status && this.props.status.get('reblog')) ? this.props.status.get('reblog') : this.props.status;
+    const intl = this.props.intl;
     const outerStyle = { boxSizing: 'border-box' };
     const { compact } = this.props;
 
@@ -100,6 +106,7 @@ export default class DetailedStatus extends ImmutablePureComponent {
     let media           = '';
     let applicationLink = '';
     let reblogLink = '';
+    let localOnly = '';
     let reblogIcon = 'retweet';
     let favouriteLink = '';
 
@@ -187,6 +194,10 @@ export default class DetailedStatus extends ImmutablePureComponent {
       );
     }
 
+    if(status.get('local_only')) {
+      localOnly = <span> · <i className='fa fa-chain-broken' title={intl.formatMessage(messages.local_only)} /></span>;
+    }
+
     if (this.context.router) {
       favouriteLink = (
         <Link to={`/statuses/${status.get('id')}/favourites`} className='detailed-status__link'>
@@ -222,7 +233,7 @@ export default class DetailedStatus extends ImmutablePureComponent {
           <div className='detailed-status__meta'>
             <a className='detailed-status__datetime' href={status.get('url')} target='_blank' rel='noopener'>
               <FormattedDate value={new Date(status.get('created_at'))} hour12={false} year='numeric' month='short' day='2-digit' hour='2-digit' minute='2-digit' />
-            </a>{applicationLink} · {reblogLink} · {favouriteLink}
+            </a>{applicationLink} · {reblogLink} · {favouriteLink}{localOnly}
           </div>
         </div>
       </div>
diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json
index 1b560b96416262551df5ac90a1465eb16501ac9a..4dd9df55bc8d384251f4a772812172c026d7f37a 100644
--- a/app/javascript/mastodon/locales/ar.json
+++ b/app/javascript/mastodon/locales/ar.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "الإبلاغ عن خلل",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "ترخيص",
   "follow_request.reject": "رفض",
   "getting_started.developers": "المُطوِّرون",
@@ -354,6 +359,7 @@
   "status.favourite": "أضف إلى المفضلة",
   "status.filtered": "مُصفّى",
   "status.load_more": "حمّل المزيد",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "الصورة مستترة",
   "status.mention": "أذكُر @{name}",
   "status.more": "المزيد",
diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json
index 5145a6579b0795b8fbbdea1588157a407249066e..b2c98bb157731bb4532c1318f4a298705157bae4 100644
--- a/app/javascript/mastodon/locales/ast.json
+++ b/app/javascript/mastodon/locales/ast.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "Autorizar",
   "follow_request.reject": "Refugar",
   "getting_started.developers": "Desendolcadores",
@@ -354,6 +359,7 @@
   "status.favourite": "Favourite",
   "status.filtered": "Filtered",
   "status.load_more": "Cargar más",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "Mediu anubríu",
   "status.mention": "Mentar a @{name}",
   "status.more": "Más",
diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json
index a4afe2adb2bebc0efc4272ea88f84a342e6d3437..12b03796eb7371a3f321c02cb8b0193274ac6420 100644
--- a/app/javascript/mastodon/locales/bg.json
+++ b/app/javascript/mastodon/locales/bg.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "Authorize",
   "follow_request.reject": "Reject",
   "getting_started.developers": "Developers",
@@ -354,6 +359,7 @@
   "status.favourite": "Предпочитани",
   "status.filtered": "Filtered",
   "status.load_more": "Load more",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "Media hidden",
   "status.mention": "Споменаване",
   "status.more": "More",
diff --git a/app/javascript/mastodon/locales/bn.json b/app/javascript/mastodon/locales/bn.json
index 6c4f0def6bb162e00de8fbf4d47a0a0675cae861..67501844d1eee52857d93038faa6c21c828fa7ce 100644
--- a/app/javascript/mastodon/locales/bn.json
+++ b/app/javascript/mastodon/locales/bn.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "অনুমতি দিন",
   "follow_request.reject": "প্রত্যাখ্যান করুন",
   "getting_started.developers": "তৈরিকারকদের জন্য",
@@ -354,6 +359,7 @@
   "status.favourite": "পছন্দের করতে",
   "status.filtered": "ছাঁকনিদিত",
   "status.load_more": "আরো দেখুন",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "ছবি বা ভিডিও পেছনে",
   "status.mention": "@{name}কে উল্লেখ করতে",
   "status.more": "আরো",
diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json
index 396e4a325d4ff78e2a6bb5771d0d1b6908a09c14..e6d1bba1d3e3dc50ec28816a6daceae502474946 100644
--- a/app/javascript/mastodon/locales/ca.json
+++ b/app/javascript/mastodon/locales/ca.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Prova recarregant la pàgina. Si això no ajuda encara pots ser capaç d'utilitzar Mastodont a través d'un navegador diferent o app nativa.",
   "errors.unexpected_crash.copy_stacktrace": "Còpia stacktrace al porta-retalls",
   "errors.unexpected_crash.report_issue": "Informa d'un problema",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "Autoritzar",
   "follow_request.reject": "Rebutjar",
   "getting_started.developers": "Desenvolupadors",
@@ -354,6 +359,7 @@
   "status.favourite": "Favorit",
   "status.filtered": "Filtrat",
   "status.load_more": "Carrega més",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "Multimèdia amagat",
   "status.mention": "Esmentar @{name}",
   "status.more": "Més",
diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json
index 6c680f13fa1b5d56f69046d8b8e1c72a3d0046dc..8321ffe5a365427718ce2ed08942f4fdd7cb62f3 100644
--- a/app/javascript/mastodon/locales/co.json
+++ b/app/javascript/mastodon/locales/co.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Pruvate d'attualizà sta pagina. S'ellu persiste u prublemu, pudete forse sempre accede à Mastodon dapoi un'alltru navigatore o applicazione.",
   "errors.unexpected_crash.copy_stacktrace": "Cupià stacktrace nant'à u fermacarta",
   "errors.unexpected_crash.report_issue": "Palisà prublemu",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "Auturizà",
   "follow_request.reject": "Righjittà",
   "getting_started.developers": "Sviluppatori",
@@ -354,6 +359,7 @@
   "status.favourite": "Aghjunghje à i favuriti",
   "status.filtered": "Filtratu",
   "status.load_more": "Vede di più",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "Media piattata",
   "status.mention": "Mintuvà @{name}",
   "status.more": "Più",
diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json
index fc807d45e50b5678216de80716acb42d0fdc3b21..ed0588e7c7a0af87949f58a10c936623fe626af4 100644
--- a/app/javascript/mastodon/locales/cs.json
+++ b/app/javascript/mastodon/locales/cs.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Zkuste obnovit stránku. Pokud to nepomůže, budete možná moci dále používat Mastodon pomocí jiného prohlížeče nebo nativní aplikace.",
   "errors.unexpected_crash.copy_stacktrace": "Zkopírovat stacktrace do schránky",
   "errors.unexpected_crash.report_issue": "Nahlásit problém",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "Autorizovat",
   "follow_request.reject": "Odmítnout",
   "getting_started.developers": "Vývojáři",
@@ -354,6 +359,7 @@
   "status.favourite": "Oblíbit",
   "status.filtered": "Filtrováno",
   "status.load_more": "Zobrazit více",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "Média skryta",
   "status.mention": "Zmínit uživatele @{name}",
   "status.more": "Více",
diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json
index 8c2e08bb3d4969f04147ebcaf259f55af29dbb5a..aeb919f5fb8da086f24b75e7fda755e746c37f9d 100644
--- a/app/javascript/mastodon/locales/cy.json
+++ b/app/javascript/mastodon/locales/cy.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "Caniatau",
   "follow_request.reject": "Gwrthod",
   "getting_started.developers": "Datblygwyr",
@@ -354,6 +359,7 @@
   "status.favourite": "Hoffi",
   "status.filtered": "Wedi'i hidlo",
   "status.load_more": "Llwythwch mwy",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "Cyfryngau wedi'u cuddio",
   "status.mention": "Crybwyll @{name}",
   "status.more": "Mwy",
diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json
index 95e4fe5033dc0653b4fe47311f8e4e261052ed46..64088fd6e8e01df82f864774a7dab7d17ec439fd 100644
--- a/app/javascript/mastodon/locales/da.json
+++ b/app/javascript/mastodon/locales/da.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "Godkend",
   "follow_request.reject": "Afvis",
   "getting_started.developers": "Udviklere",
@@ -354,6 +359,7 @@
   "status.favourite": "Favorit",
   "status.filtered": "Filtreret",
   "status.load_more": "Indlæs mere",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "Medie skjult",
   "status.mention": "Nævn @{name}",
   "status.more": "Mere",
diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json
index 401e3fc15348601bdee038e2945dae06315651ac..077cb729a99f1fbed5b388fbc8d5fd03917b345d 100644
--- a/app/javascript/mastodon/locales/de.json
+++ b/app/javascript/mastodon/locales/de.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Versuche die Seite zu aktualisieren. Wenn das nicht hilft, kannst du Mastodon über einen anderen Browser oder eine native App verwenden.",
   "errors.unexpected_crash.copy_stacktrace": "Fehlerlog in die Zwischenablage kopieren",
   "errors.unexpected_crash.report_issue": "Problem melden",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "Erlauben",
   "follow_request.reject": "Ablehnen",
   "getting_started.developers": "Entwickler",
@@ -354,6 +359,7 @@
   "status.favourite": "Favorisieren",
   "status.filtered": "Gefiltert",
   "status.load_more": "Weitere laden",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "Medien versteckt",
   "status.mention": "@{name} erwähnen",
   "status.more": "Mehr",
diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json
index 8ab40ce3c70ffe5b3485ff159a93286e4f72cebe..62d822615e79993e6df0cc02a8c8114bf43f897b 100644
--- a/app/javascript/mastodon/locales/defaultMessages.json
+++ b/app/javascript/mastodon/locales/defaultMessages.json
@@ -394,6 +394,10 @@
         "defaultMessage": "This post cannot be boosted",
         "id": "status.cannot_reblog"
       },
+      {
+        "defaultMessage": "This post is only visible by other users of your instance",
+        "id": "status.local_only"
+      },
       {
         "defaultMessage": "Favourite",
         "id": "status.favourite"
@@ -946,6 +950,31 @@
     ],
     "path": "app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.json"
   },
+  {
+    "descriptors": [
+      {
+        "defaultMessage": "Federated",
+        "id": "federation.federated.short"
+      },
+      {
+        "defaultMessage": "Allow toot to reach other instances",
+        "id": "federation.federated.long"
+      },
+      {
+        "defaultMessage": "Local-only",
+        "id": "federation.local_only.short"
+      },
+      {
+        "defaultMessage": "Restrict this toot only to my instance",
+        "id": "federation.local_only.long"
+      },
+      {
+        "defaultMessage": "Adjust status federation",
+        "id": "federation.change"
+      }
+    ],
+    "path": "app/javascript/mastodon/features/compose/components/federation_dropdown.json"
+  },
   {
     "descriptors": [
       {
@@ -2247,6 +2276,15 @@
     ],
     "path": "app/javascript/mastodon/features/status/components/action_bar.json"
   },
+  {
+    "descriptors": [
+      {
+        "defaultMessage": "This post is only visible by other users of your instance",
+        "id": "status.local_only"
+      }
+    ],
+    "path": "app/javascript/mastodon/features/status/components/detailed_status.json"
+  },
   {
     "descriptors": [
       {
diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json
index ab000fa8d6ce1b6b330d7243fcdcb29cd4e5354b..e395c8ba991168b92371cfdcf8c29a657e556218 100644
--- a/app/javascript/mastodon/locales/el.json
+++ b/app/javascript/mastodon/locales/el.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Δοκίμασε να ανανεώσεις τη σελίδα. Αν αυτό δε βοηθήσει, ίσως να μπορέσεις να χρησιμοποιήσεις το Mastodon μέσω διαφορετικού browser ή κάποιας εφαρμογής.",
   "errors.unexpected_crash.copy_stacktrace": "Αντιγραφή μηνυμάτων κώδικα στο πρόχειρο",
   "errors.unexpected_crash.report_issue": "Αναφορά προβλήματος",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "Ενέκρινε",
   "follow_request.reject": "Απέρριψε",
   "getting_started.developers": "Ανάπτυξη",
@@ -354,6 +359,7 @@
   "status.favourite": "Σημείωσε ως αγαπημένο",
   "status.filtered": "Φιλτραρισμένα",
   "status.load_more": "Φόρτωσε περισσότερα",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "Κρυμμένο πολυμέσο",
   "status.mention": "Ανέφερε τον/την @{name}",
   "status.more": "Περισσότερα",
diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json
index c50bdb8d3d2602eb55ecfb658e222017bb2e6f72..29070422dbdecc12ed99cabb9cc6afa79d8a4d2e 100644
--- a/app/javascript/mastodon/locales/en.json
+++ b/app/javascript/mastodon/locales/en.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "Authorize",
   "follow_request.reject": "Reject",
   "getting_started.developers": "Developers",
@@ -354,6 +359,7 @@
   "status.favourite": "Favourite",
   "status.filtered": "Filtered",
   "status.load_more": "Load more",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "Media hidden",
   "status.mention": "Mention @{name}",
   "status.more": "More",
diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json
index 0070cdb5cfbdebc48bbf2d2be7299eaaaff0c1dc..0835ae5b07b6edd31039c163459ad10ce35b727c 100644
--- a/app/javascript/mastodon/locales/eo.json
+++ b/app/javascript/mastodon/locales/eo.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Raporti problemon",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "Rajtigi",
   "follow_request.reject": "Rifuzi",
   "getting_started.developers": "Programistoj",
@@ -354,6 +359,7 @@
   "status.favourite": "Stelumi",
   "status.filtered": "Filtrita",
   "status.load_more": "Åœargi pli",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "Aŭdovidaĵo kaŝita",
   "status.mention": "Mencii @{name}",
   "status.more": "Pli",
diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json
index c213a03e13eb4fddb4ec8f22cec27ea953eb47c4..d964716faf3f63731579952c3d18a1270fdc8e64 100644
--- a/app/javascript/mastodon/locales/es.json
+++ b/app/javascript/mastodon/locales/es.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Intenta actualizar la página. Si eso no ayuda, es posible que puedas usar Mastodon a través de otro navegador o aplicación nativa.",
   "errors.unexpected_crash.copy_stacktrace": "Copiar el seguimiento de pila en el portapapeles",
   "errors.unexpected_crash.report_issue": "Informar de un problema/error",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "Autorizar",
   "follow_request.reject": "Rechazar",
   "getting_started.developers": "Desarrolladores",
@@ -354,6 +359,7 @@
   "status.favourite": "Favorito",
   "status.filtered": "Filtrado",
   "status.load_more": "Cargar más",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "Contenido multimedia oculto",
   "status.mention": "Mencionar",
   "status.more": "Más",
diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json
index f89901ab030b1b30eccc035bb3322ccb7442a402..1fb7faf9adf53a8a1ac081d14d1cdac7fb6039ec 100644
--- a/app/javascript/mastodon/locales/eu.json
+++ b/app/javascript/mastodon/locales/eu.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Saiatu orria berritzen. Horrek ez badu laguntzen, agian Mastodon erabiltzeko aukera duzu oraindik ere beste nabigatzaile bat edo aplikazio natibo bat erabilita.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Eman arazoaren berri",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "Baimendu",
   "follow_request.reject": "Ukatu",
   "getting_started.developers": "Garatzaileak",
@@ -354,6 +359,7 @@
   "status.favourite": "Gogokoa",
   "status.filtered": "Iragazita",
   "status.load_more": "Kargatu gehiago",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "Multimedia ezkutatua",
   "status.mention": "Aipatu @{name}",
   "status.more": "Gehiago",
diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json
index b651edd32ee1a07dc2002b7f9f4192e692f79a27..fa3453f105d3d4dd341c7a763b178884f1917469 100644
--- a/app/javascript/mastodon/locales/fa.json
+++ b/app/javascript/mastodon/locales/fa.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "لطفاً صفحه را دوباره باز کنید. اگر آن هم کمکی نکرد، همچنان شاید بتوانید با ماستدون از راه یکی از اپ‌های آن کار کنید.",
   "errors.unexpected_crash.copy_stacktrace": "کپی جزئیات اشکال",
   "errors.unexpected_crash.report_issue": "گزارش اشکال",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "اجازه دهید",
   "follow_request.reject": "اجازه ندهید",
   "getting_started.developers": "برای برنامه‌نویسان",
@@ -354,6 +359,7 @@
   "status.favourite": "پسندیدن",
   "status.filtered": "فیلترشده",
   "status.load_more": "بیشتر نشان بده",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "تصویر پنهان شده",
   "status.mention": "نام‌بردن از @{name}",
   "status.more": "بیشتر",
diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json
index 2e71e6e180c331f7d4935fd07441df7c10bbc205..ca96d298abd397120eba70b66d541d13ba470ef2 100644
--- a/app/javascript/mastodon/locales/fi.json
+++ b/app/javascript/mastodon/locales/fi.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Kokeile päivittää sivu. Jos tämä ei auta, saatat yhä pystyä käyttämään Mastodonia toisen selaimen tai sovelluksen kautta.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Ilmoita ongelmasta",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "Valtuuta",
   "follow_request.reject": "Hylkää",
   "getting_started.developers": "Kehittäjille",
@@ -354,6 +359,7 @@
   "status.favourite": "Tykkää",
   "status.filtered": "Suodatettu",
   "status.load_more": "Lataa lisää",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "Media piilotettu",
   "status.mention": "Mainitse @{name}",
   "status.more": "Lisää",
diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json
index 38f20b619d29744cba71187589d1e3799a38dfdc..9568b54f0f9b73a721dcacb8f0b4dd3db0353b67 100644
--- a/app/javascript/mastodon/locales/fr.json
+++ b/app/javascript/mastodon/locales/fr.json
@@ -156,6 +156,12 @@
   "error.unexpected_crash.next_steps": "Essayez de rafraîchir la page. Si cela n’aide pas, vous pouvez toujours utiliser Mastodon via un autre navigateur ou une application native.",
   "errors.unexpected_crash.copy_stacktrace": "Copier la trace-pile dans le presse-papier",
   "errors.unexpected_crash.report_issue": "Signaler un bogue",
+  "empty_column.public": "Il n’y a rien ici ! Écrivez quelque chose publiquement, ou bien suivez manuellement des personnes d’autres instances pour remplir le fil public",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "Accepter",
   "follow_request.reject": "Rejeter",
   "getting_started.developers": "Développeur·euse·s",
@@ -354,6 +360,7 @@
   "status.favourite": "Ajouter aux favoris",
   "status.filtered": "Filtré",
   "status.load_more": "Charger plus",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "Média caché",
   "status.mention": "Mentionner @{name}",
   "status.more": "Plus",
diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json
index 0125754b131ad5dfc9d2de78b2d5973fcbea240c..bee0384c33f438f428511fbd01c1b8934cd3adeb 100644
--- a/app/javascript/mastodon/locales/gl.json
+++ b/app/javascript/mastodon/locales/gl.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Intenta actualizar a páxina. Se esto non axuda podes tamén utilizar Mastodon en outro navegador ou app nativa.",
   "errors.unexpected_crash.copy_stacktrace": "Copiar trazas ao portaretallos",
   "errors.unexpected_crash.report_issue": "Informar de problema",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "Autorizar",
   "follow_request.reject": "Rexeitar",
   "getting_started.developers": "Desenvolvedoras",
@@ -354,6 +359,7 @@
   "status.favourite": "Favorita",
   "status.filtered": "Filtrado",
   "status.load_more": "Cargar máis",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "Medios ocultos",
   "status.mention": "Mencionar @{name}",
   "status.more": "Máis",
diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json
index 70aec3279b22aa446bdbeb6c244bb64bad5fd22d..81912477d9a5cd05002c51c86f3fb6e75f8af570 100644
--- a/app/javascript/mastodon/locales/he.json
+++ b/app/javascript/mastodon/locales/he.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "קבלה",
   "follow_request.reject": "דחיה",
   "getting_started.developers": "Developers",
@@ -354,6 +359,7 @@
   "status.favourite": "חיבוב",
   "status.filtered": "Filtered",
   "status.load_more": "עוד",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "מדיה מוסתרת",
   "status.mention": "פניה אל @{name}",
   "status.more": "עוד",
diff --git a/app/javascript/mastodon/locales/hi.json b/app/javascript/mastodon/locales/hi.json
index 4fb924a5fb154e3f283abd237ab149e31463bc52..325b64dc4220ae521d8d2b17be81b02733b953b1 100644
--- a/app/javascript/mastodon/locales/hi.json
+++ b/app/javascript/mastodon/locales/hi.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "Authorize",
   "follow_request.reject": "Reject",
   "getting_started.developers": "Developers",
@@ -354,6 +359,7 @@
   "status.favourite": "Favourite",
   "status.filtered": "Filtered",
   "status.load_more": "Load more",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "Media hidden",
   "status.mention": "Mention @{name}",
   "status.more": "More",
diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json
index 09298a7ad14a9d51a1e00e4175fcab9db4d688b4..fd32fcd3804190e4f82989dc6ed02ec5cdf03970 100644
--- a/app/javascript/mastodon/locales/hr.json
+++ b/app/javascript/mastodon/locales/hr.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "Autoriziraj",
   "follow_request.reject": "Odbij",
   "getting_started.developers": "Developers",
@@ -354,6 +359,7 @@
   "status.favourite": "Označi omiljenim",
   "status.filtered": "Filtered",
   "status.load_more": "Učitaj više",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "Sakriven media sadržaj",
   "status.mention": "Spomeni @{name}",
   "status.more": "More",
diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json
index c35c943e6f5ab19eb5e0a52df61720d6a8af1a1b..0eadb290348a5a445b29215a2dbd504ec2aa87d6 100644
--- a/app/javascript/mastodon/locales/hu.json
+++ b/app/javascript/mastodon/locales/hu.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Próbáld frissíteni az oldalt. Ha ez nem segít, egy másik böngészőn vagy appon keresztül még mindig használhatod a Mastodont.",
   "errors.unexpected_crash.copy_stacktrace": "Stacktrace vágólapra másolása",
   "errors.unexpected_crash.report_issue": "Probléma bejelentése",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "Engedélyezés",
   "follow_request.reject": "Visszautasítás",
   "getting_started.developers": "Fejlesztőknek",
@@ -354,6 +359,7 @@
   "status.favourite": "Kedvenc",
   "status.filtered": "Megszűrt",
   "status.load_more": "Többet",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "Média elrejtve",
   "status.mention": "@{name} említése",
   "status.more": "Többet",
diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json
index 69af86bf2645dd822f57556d7b9969cf8ea890b4..e667e5b4e8c4618b9520b2854991afaeef5d1343 100644
--- a/app/javascript/mastodon/locales/hy.json
+++ b/app/javascript/mastodon/locales/hy.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "Վավերացնել",
   "follow_request.reject": "Õ„Õ¥Ö€ÕªÕ¥Õ¬",
   "getting_started.developers": "Developers",
@@ -354,6 +359,7 @@
   "status.favourite": "Õ€Õ¡Õ¾Õ¡Õ¶Õ¥Õ¬",
   "status.filtered": "Filtered",
   "status.load_more": "Ô²Õ¥Õ¼Õ¶Õ¥Õ¬ Õ¡Õ¾Õ¥Õ¬Õ«Õ¶",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "մեդիաբովանդակությունը թաքցված է",
   "status.mention": "Õ†Õ·Õ¥Õ¬ @{name}ÖŠÕ«Õ¶",
   "status.more": "Ô±Õ¾Õ¥Õ¬Õ«Õ¶",
diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json
index 371922a4d678961a7e8617872bedbbd3f0ce718d..900f95d422b1b7944d157f2eb235194ebef8d7e5 100644
--- a/app/javascript/mastodon/locales/id.json
+++ b/app/javascript/mastodon/locales/id.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Coba segarkan halaman. Jika tak membantu, Anda masih bisa memakai Mastodon dengan peramban berbeda atau aplikasi native.",
   "errors.unexpected_crash.copy_stacktrace": "Salin stacktrace ke papan klip",
   "errors.unexpected_crash.report_issue": "Laporkan masalah",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "Izinkan",
   "follow_request.reject": "Tolak",
   "getting_started.developers": "Pengembang",
@@ -354,6 +359,7 @@
   "status.favourite": "Difavoritkan",
   "status.filtered": "Filtered",
   "status.load_more": "Tampilkan semua",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "Media disembunyikan",
   "status.mention": "Balasan @{name}",
   "status.more": "More",
diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json
index 076835218ca56d235231a23dbc0f1e93b81c2168..06db699cb248a6720df8b6c84ba6da0232e949ca 100644
--- a/app/javascript/mastodon/locales/io.json
+++ b/app/javascript/mastodon/locales/io.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "Yurizar",
   "follow_request.reject": "Refuzar",
   "getting_started.developers": "Developers",
@@ -354,6 +359,7 @@
   "status.favourite": "Favorizar",
   "status.filtered": "Filtered",
   "status.load_more": "Kargar pluse",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "Kontenajo celita",
   "status.mention": "Mencionar @{name}",
   "status.more": "More",
diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json
index 8d4b8f66efbca3a00d57b40b090067d6ae3d95e4..c5b1d724b7ee220a944d5ba67ef7ad23c0a062b8 100644
--- a/app/javascript/mastodon/locales/it.json
+++ b/app/javascript/mastodon/locales/it.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "Autorizza",
   "follow_request.reject": "Rifiuta",
   "getting_started.developers": "Sviluppatori",
@@ -354,6 +359,7 @@
   "status.favourite": "Apprezzato",
   "status.filtered": "Filtrato",
   "status.load_more": "Mostra di più",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "Allegato nascosto",
   "status.mention": "Nomina @{name}",
   "status.more": "Altro",
diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json
index 5561e9da17cf610381a7f6d32ccdf90ab8d0d6a1..f6026824c12d4f031489a3e64f3a6ecc9dab4ba3 100644
--- a/app/javascript/mastodon/locales/ja.json
+++ b/app/javascript/mastodon/locales/ja.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "ページの再読み込みをお試しください。それでも解決しない場合、別のブラウザかアプリを使えば使用できることがあります。",
   "errors.unexpected_crash.copy_stacktrace": "スタックトレースをクリップボードにコピー",
   "errors.unexpected_crash.report_issue": "問題を報告",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "許可",
   "follow_request.reject": "拒否",
   "getting_started.developers": "開発",
@@ -354,6 +359,7 @@
   "status.favourite": "お気に入り",
   "status.filtered": "フィルターされました",
   "status.load_more": "もっと見る",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "非表示のメディア",
   "status.mention": "@{name}さんにトゥート",
   "status.more": "もっと見る",
diff --git a/app/javascript/mastodon/locales/ka.json b/app/javascript/mastodon/locales/ka.json
index 35789374a5d9ababe3c07c2a25f6aefad8f50640..c378bc9c88916e28c398a8c659d611f095eed645 100644
--- a/app/javascript/mastodon/locales/ka.json
+++ b/app/javascript/mastodon/locales/ka.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "ავტორიზაცია",
   "follow_request.reject": "უარყოფა",
   "getting_started.developers": "დეველოპერები",
@@ -354,6 +359,7 @@
   "status.favourite": "ფავორიტი",
   "status.filtered": "ფილტრირებული",
   "status.load_more": "მეტის ჩატვირთვა",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "მედია დამალულია",
   "status.mention": "ასახელე @{name}",
   "status.more": "მეტი",
diff --git a/app/javascript/mastodon/locales/kk.json b/app/javascript/mastodon/locales/kk.json
index ba0f5378e8a002f229ef02658458fa0a3fb5ad5f..be0a5050397af653ffc7d9a3d66f29bae882d38b 100644
--- a/app/javascript/mastodon/locales/kk.json
+++ b/app/javascript/mastodon/locales/kk.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "Авторизация",
   "follow_request.reject": "Қабылдамау",
   "getting_started.developers": "Жасаушылар тобы",
@@ -354,6 +359,7 @@
   "status.favourite": "Таңдаулы",
   "status.filtered": "Фильтрленген",
   "status.load_more": "Тағы әкел",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "Жабық медиа",
   "status.mention": "Аталым @{name}",
   "status.more": "Тағы",
diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json
index ea70c7055fa53f0f31bf7ecb6b5dc0bbad1e9fdb..2640b43b415dbdf8323b65feae11678735ac8032 100644
--- a/app/javascript/mastodon/locales/ko.json
+++ b/app/javascript/mastodon/locales/ko.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "페이지를 새로고침 해보세요. 그래도 해결되지 않는 경우, 다른 브라우저나 네이티브 앱으로도 마스토돈을 이용하실 수 있습니다.",
   "errors.unexpected_crash.copy_stacktrace": "에러 내용을 클립보드에 복사",
   "errors.unexpected_crash.report_issue": "문제 신고",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "허가",
   "follow_request.reject": "ê±°ë¶€",
   "getting_started.developers": "개발자",
@@ -354,6 +359,7 @@
   "status.favourite": "즐겨찾기",
   "status.filtered": "필터로 걸러짐",
   "status.load_more": "더 보기",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "미디어 숨겨짐",
   "status.mention": "답장",
   "status.more": "자세히",
diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json
index 39ca86a0ccd390881205a230f7d0d328a057c737..611a5eb53cf3b0288fd322003f0e907bbc289665 100644
--- a/app/javascript/mastodon/locales/lt.json
+++ b/app/javascript/mastodon/locales/lt.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "Authorize",
   "follow_request.reject": "Reject",
   "getting_started.developers": "Developers",
@@ -354,6 +359,7 @@
   "status.favourite": "Favourite",
   "status.filtered": "Filtered",
   "status.load_more": "Load more",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "Media hidden",
   "status.mention": "Mention @{name}",
   "status.more": "More",
diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json
index 1c0e355018ff0ae30f1beff37c1a6dec2707dca3..fc76339c54f534877d939069a95c88fa4c697cfc 100644
--- a/app/javascript/mastodon/locales/lv.json
+++ b/app/javascript/mastodon/locales/lv.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "Autorizēt",
   "follow_request.reject": "Noraidīt",
   "getting_started.developers": "Developers",
@@ -354,6 +359,7 @@
   "status.favourite": "Favourite",
   "status.filtered": "Filtered",
   "status.load_more": "Load more",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "Media hidden",
   "status.mention": "Mention @{name}",
   "status.more": "More",
diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json
index 6881d3be38d58c31ae4f985c39cec711111fe6b4..6efd42955cfe20fae93a6c4a0f18b2bbbd374bbe 100644
--- a/app/javascript/mastodon/locales/ms.json
+++ b/app/javascript/mastodon/locales/ms.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "Authorize",
   "follow_request.reject": "Reject",
   "getting_started.developers": "Developers",
@@ -354,6 +359,7 @@
   "status.favourite": "Favourite",
   "status.filtered": "Filtered",
   "status.load_more": "Load more",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "Media hidden",
   "status.mention": "Mention @{name}",
   "status.more": "More",
diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json
index 68b8f4cbd0fb72dd723610356e9f57282f6f7db0..ba649dde09fd6489233a0b3fb5f7375f021dbed0 100644
--- a/app/javascript/mastodon/locales/nl.json
+++ b/app/javascript/mastodon/locales/nl.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Stacktrace naar klembord kopiëren",
   "errors.unexpected_crash.report_issue": "Technisch probleem melden",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "Goedkeuren",
   "follow_request.reject": "Afkeuren",
   "getting_started.developers": "Ontwikkelaars",
@@ -354,6 +359,7 @@
   "status.favourite": "Favoriet",
   "status.filtered": "Gefilterd",
   "status.load_more": "Meer laden",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "Media verborgen",
   "status.mention": "Vermeld @{name}",
   "status.more": "Meer",
diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json
index 37b893938fcd9542c9e1b141ef0c7bccc614dcc0..28f89863323581c959eafc17c18c5419134e5dd2 100644
--- a/app/javascript/mastodon/locales/no.json
+++ b/app/javascript/mastodon/locales/no.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "Autorisér",
   "follow_request.reject": "Avvis",
   "getting_started.developers": "Developers",
@@ -354,6 +359,7 @@
   "status.favourite": "Lik",
   "status.filtered": "Filtered",
   "status.load_more": "Last mer",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "Media skjult",
   "status.mention": "Nevn @{name}",
   "status.more": "Mer",
diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json
index b52d58970109c65c8b660b176dd971a8835ac470..1a2479ecb2d9f4371db33c2d2ed986ac573780bd 100644
--- a/app/javascript/mastodon/locales/oc.json
+++ b/app/javascript/mastodon/locales/oc.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Senhalar un problèma",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "Acceptar",
   "follow_request.reject": "Regetar",
   "getting_started.developers": "Desvelopaires",
@@ -354,6 +359,7 @@
   "status.favourite": "Apondre als favorits",
   "status.filtered": "Filtrat",
   "status.load_more": "Cargar mai",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "Mèdia rescondut",
   "status.mention": "Mencionar",
   "status.more": "Mai",
diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json
index 1eb9822498d65b822132d38ffad3f5154ce7c88d..cf0c0188edc7c963737be4e1f5e16d1e85e83fe0 100644
--- a/app/javascript/mastodon/locales/pl.json
+++ b/app/javascript/mastodon/locales/pl.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Spróbuj odświeżyć stronę. Jeśli to nie pomoże, wciąż jesteś w stanie używać Mastodona przez inną przeglądarkę lub natywną aplikację.",
   "errors.unexpected_crash.copy_stacktrace": "Skopiuj ślad stosu do schowka",
   "errors.unexpected_crash.report_issue": "Zgłoś problem",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "Autoryzuj",
   "follow_request.reject": "Odrzuć",
   "getting_started.developers": "Dla programistów",
@@ -354,6 +359,7 @@
   "status.favourite": "Dodaj do ulubionych",
   "status.filtered": "Filtrowany(-a)",
   "status.load_more": "Załaduj więcej",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "Zawartość multimedialna ukryta",
   "status.mention": "Wspomnij o @{name}",
   "status.more": "Więcej",
diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json
index 7c6a1fd224ef92d280ed2eb65983b8cc07f59e40..86322e1e12c94971a99f28939c268ed075b17153 100644
--- a/app/javascript/mastodon/locales/pt-BR.json
+++ b/app/javascript/mastodon/locales/pt-BR.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Tente atualizar a página. Se isso não ajudar, você ainda pode usar Mastodon através de um navegador diferente ou aplicativo nativo.",
   "errors.unexpected_crash.copy_stacktrace": "Copiar stacktrace para a área de transferência",
   "errors.unexpected_crash.report_issue": "Reportar problema",
+  "federation.change": "Ajustar federação do toot",
+  "federation.federated.long": "Permitir que o toot chegue a outras instâncias",
+  "federation.federated.short": "Federado",
+  "federation.local_only.long": "Restringir o toot somente à minha instância",
+  "federation.local_only.short": "Somente local",
   "follow_request.authorize": "Autorizar",
   "follow_request.reject": "Rejeitar",
   "getting_started.developers": "Desenvolvedores",
@@ -354,6 +359,7 @@
   "status.favourite": "Adicionar aos favoritos",
   "status.filtered": "Filtrado",
   "status.load_more": "Carregar mais",
+  "status.local_only": "Esse post só é visível para outros usuários da sua instância",
   "status.media_hidden": "Mídia escondida",
   "status.mention": "Mencionar @{name}",
   "status.more": "Mais",
diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json
index 859dc1991254149683ca0456686d33adbfefc65c..c3b1ea17136bda3623b3a57d21d586e404fd2725 100644
--- a/app/javascript/mastodon/locales/pt-PT.json
+++ b/app/javascript/mastodon/locales/pt-PT.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
+  "federation.change": "Ajustar federação do toot",
+  "federation.federated.long": "Permitir que o toot chegue a outras instâncias",
+  "federation.federated.short": "Federado",
+  "federation.local_only.long": "Restringir o toot somente à minha instância",
+  "federation.local_only.short": "Somente local",
   "follow_request.authorize": "Autorizar",
   "follow_request.reject": "Rejeitar",
   "getting_started.developers": "Responsáveis pelo desenvolvimento",
@@ -354,6 +359,7 @@
   "status.favourite": "Adicionar aos favoritos",
   "status.filtered": "Filtrada",
   "status.load_more": "Carregar mais",
+  "status.local_only": "Esse post só é visível para outros usuários da sua instância",
   "status.media_hidden": "Média escondida",
   "status.mention": "Mencionar @{name}",
   "status.more": "Mais",
diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json
index 617dbcc0dc3347f764bd91a9d0d3b247dd034b6d..b52ec721b8d1743e0caa6b1c354f57e8541eeba1 100644
--- a/app/javascript/mastodon/locales/ro.json
+++ b/app/javascript/mastodon/locales/ro.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "Autorizează",
   "follow_request.reject": "Respinge",
   "getting_started.developers": "Dezvoltatori",
@@ -354,6 +359,7 @@
   "status.favourite": "Favorite",
   "status.filtered": "Sortate",
   "status.load_more": "Încarcă mai multe",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "Media ascunsă",
   "status.mention": "Mentionează @{name}",
   "status.more": "Mai mult",
diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json
index 4ace1649aa067f37ce8f6a3a0af7703b24d18866..9a36c3b575ccbd7ff569196f9e5839715ce59d1f 100644
--- a/app/javascript/mastodon/locales/ru.json
+++ b/app/javascript/mastodon/locales/ru.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Попробуйте обновить страницу. Если проблема не исчезает, используйте Mastodon из-под другого браузера или приложения.",
   "errors.unexpected_crash.copy_stacktrace": "Копировать стектрейс в буфер обмена",
   "errors.unexpected_crash.report_issue": "Сообщить о проблеме",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "Авторизовать",
   "follow_request.reject": "Отказать",
   "getting_started.developers": "Разработчикам",
@@ -354,6 +359,7 @@
   "status.favourite": "Нравится",
   "status.filtered": "Отфильтровано",
   "status.load_more": "Показать еще",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "Медиа скрыто",
   "status.mention": "Упомянуть @{name}",
   "status.more": "Больше",
diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json
index 5d27263094403a64b0f24f9232ecf8a07b0c6374..01fd3d42c979dfd89e483932411724886bb187bd 100644
--- a/app/javascript/mastodon/locales/sk.json
+++ b/app/javascript/mastodon/locales/sk.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Skopíruj stacktrace do schránky",
   "errors.unexpected_crash.report_issue": "Nahlás problém",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "Povoľ prístup",
   "follow_request.reject": "Odmietni",
   "getting_started.developers": "Vývojári",
@@ -354,6 +359,7 @@
   "status.favourite": "Páči sa mi",
   "status.filtered": "Filtrované",
   "status.load_more": "Ukáž viac",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "Skryté médiá",
   "status.mention": "Spomeň @{name}",
   "status.more": "Viac",
diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json
index 65e275102cd70e6d113065c734f39aaf87cfe5fd..29d7bf473ec6007201326431d1edfd6658ec045f 100644
--- a/app/javascript/mastodon/locales/sl.json
+++ b/app/javascript/mastodon/locales/sl.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "Overi",
   "follow_request.reject": "Zavrni",
   "getting_started.developers": "Razvijalci",
@@ -354,6 +359,7 @@
   "status.favourite": "Priljubljen",
   "status.filtered": "Filtrirano",
   "status.load_more": "Naloži več",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "Mediji so skriti",
   "status.mention": "Omeni @{name}",
   "status.more": "Več",
diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json
index f58466d87138aaf20638ee249d7dae8f8e7e3672..1f6de613d636ed674a3b018ef3544e4f88e291f2 100644
--- a/app/javascript/mastodon/locales/sq.json
+++ b/app/javascript/mastodon/locales/sq.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "Autorizoje",
   "follow_request.reject": "Hidhe tej",
   "getting_started.developers": "Zhvillues",
@@ -354,6 +359,7 @@
   "status.favourite": "I parapëlqyer",
   "status.filtered": "I filtruar",
   "status.load_more": "Ngarko më tepër",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "Me media të fshehur",
   "status.mention": "Përmendni @{name}",
   "status.more": "Më tepër",
diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json
index 59b8459aedecc4da8e1b5e9449eed3443ba8bcf9..e396087dff74b93a47bf97e6fb7b8fe8618d19ab 100644
--- a/app/javascript/mastodon/locales/sr-Latn.json
+++ b/app/javascript/mastodon/locales/sr-Latn.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "Odobri",
   "follow_request.reject": "Odbij",
   "getting_started.developers": "Developers",
@@ -354,6 +359,7 @@
   "status.favourite": "Omiljeno",
   "status.filtered": "Filtered",
   "status.load_more": "Učitaj još",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "Multimedija sakrivena",
   "status.mention": "Pomeni korisnika @{name}",
   "status.more": "Još",
diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json
index d222e774d217c3f2120093458f7616d1f6c16b5c..40d14599a41b15a2f0abec6c01626e480d08c851 100644
--- a/app/javascript/mastodon/locales/sr.json
+++ b/app/javascript/mastodon/locales/sr.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "Одобри",
   "follow_request.reject": "Одбиј",
   "getting_started.developers": "Програмери",
@@ -354,6 +359,7 @@
   "status.favourite": "Омиљено",
   "status.filtered": "Филтрирано",
   "status.load_more": "Учитај још",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "Мултимедија сакривена",
   "status.mention": "Помени корисника @{name}",
   "status.more": "Још",
diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json
index e8c1c40c2546df9daf1e28bafb0e37d48f7958b5..2bbb534c889df84c730304f1768a08d066b78caf 100644
--- a/app/javascript/mastodon/locales/sv.json
+++ b/app/javascript/mastodon/locales/sv.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Prova att ladda om sidan. Om det inte hjälper kan du försöka använda Mastodon med en annan webbläsare eller app.",
   "errors.unexpected_crash.copy_stacktrace": "Kopiera stacktrace till urklipp",
   "errors.unexpected_crash.report_issue": "Rapportera problem",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "Godkänn",
   "follow_request.reject": "Avvisa",
   "getting_started.developers": "Utvecklare",
@@ -354,6 +359,7 @@
   "status.favourite": "Favorit",
   "status.filtered": "Filtrerat",
   "status.load_more": "Ladda fler",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "Media dold",
   "status.mention": "Omnämn @{name}",
   "status.more": "Mer",
diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json
index 82b5fff9e34eb2c431c2cbfb3454a6259031048a..957cf024c53fe3aa588ac186e88df6a5f01b9913 100644
--- a/app/javascript/mastodon/locales/ta.json
+++ b/app/javascript/mastodon/locales/ta.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "அதிகாரமளி",
   "follow_request.reject": "விலக்கு",
   "getting_started.developers": "உருவாக்குநர்கள்",
@@ -354,6 +359,7 @@
   "status.favourite": "விருப்பத்துக்குகந்த",
   "status.filtered": "வடிகட்டு",
   "status.load_more": "அதிகமாய் ஏற்று",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "மீடியா மறைக்கப்பட்டது",
   "status.mention": "குறிப்பிடு @{name}",
   "status.more": "அதிக",
diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json
index 3cfbc5786ff40a2c487f087dec90d856ffbf3ba0..6e2a3acfd49d9b6aa15f339e1ce8bee1bb94f1dc 100644
--- a/app/javascript/mastodon/locales/te.json
+++ b/app/javascript/mastodon/locales/te.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "అనుమతించు",
   "follow_request.reject": "తిరస్కరించు",
   "getting_started.developers": "డెవలపర్లు",
@@ -354,6 +359,7 @@
   "status.favourite": "ఇష్టపడు",
   "status.filtered": "వడకట్టబడిన",
   "status.load_more": "మరిన్ని లోడ్ చేయి",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "మీడియా దాచబడింది",
   "status.mention": "@{name}ను ప్రస్తావించు",
   "status.more": "ఇంకొన్ని",
diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json
index a9278fdd057e2925ed9cde27a190f9c497db7946..352e92092290a44100291ad59d6252cdb0ca088d 100644
--- a/app/javascript/mastodon/locales/th.json
+++ b/app/javascript/mastodon/locales/th.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "รายงานปัญหา",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "อนุญาต",
   "follow_request.reject": "ปฏิเสธ",
   "getting_started.developers": "นักพัฒนา",
@@ -354,6 +359,7 @@
   "status.favourite": "ชื่นชอบ",
   "status.filtered": "กรองอยู่",
   "status.load_more": "โหลดเพิ่มเติม",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "ซ่อนสื่ออยู่",
   "status.mention": "กล่าวถึง @{name}",
   "status.more": "เพิ่มเติม",
diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json
index 5ceefa1828d95e15c48f42f04fb9f3838ddb21e1..4be3eaa15e36c983462ad27d6876b33ada627646 100644
--- a/app/javascript/mastodon/locales/tr.json
+++ b/app/javascript/mastodon/locales/tr.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Sayfayı yenilemeyi deneyin. Eğer bu yardımcı olmazsa, Mastodon'u farklı bir tarayıcı ya da yerel uygulama üzerinden kullanabilirsiniz.",
   "errors.unexpected_crash.copy_stacktrace": "Yığın izlemeyi (stacktrace) panoya kopyala",
   "errors.unexpected_crash.report_issue": "Sorun bildir",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "Yetkilendir",
   "follow_request.reject": "Reddet",
   "getting_started.developers": "GeliÅŸtiriciler",
@@ -354,6 +359,7 @@
   "status.favourite": "Favorilere ekle",
   "status.filtered": "FiltrelenmiÅŸ",
   "status.load_more": "Daha fazla",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "Gizli görsel",
   "status.mention": "Bahset : @{name}",
   "status.more": "Daha fazla",
diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json
index 6501c0283b99e4ace08748756011030691bda9a5..b8be74b008b2ba4b7d2d69f5186723300a5ae77e 100644
--- a/app/javascript/mastodon/locales/uk.json
+++ b/app/javascript/mastodon/locales/uk.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "Авторизувати",
   "follow_request.reject": "Відмовити",
   "getting_started.developers": "Розробникам",
@@ -354,6 +359,7 @@
   "status.favourite": "Подобається",
   "status.filtered": "Відфільтровано",
   "status.load_more": "Завантажити більше",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "Медіаконтент приховано",
   "status.mention": "Згадати @{name}",
   "status.more": "Більше",
diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json
index 2804b2724ea22950c494752f31da8b51e30890b4..0e53f8ffad9930c2521bf6db635498d941973ebd 100644
--- a/app/javascript/mastodon/locales/zh-CN.json
+++ b/app/javascript/mastodon/locales/zh-CN.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "同意",
   "follow_request.reject": "拒绝",
   "getting_started.developers": "开发",
@@ -354,6 +359,7 @@
   "status.favourite": "收藏",
   "status.filtered": "已过滤",
   "status.load_more": "加载更多",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "隐藏媒体内容",
   "status.mention": "提及 @{name}",
   "status.more": "更多",
diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json
index 3ca9f0e2e5dc6a0265cfdc55bad5c6411aaea9a0..49993cb52053fa5b68a9c53172a0c06bb78cddac 100644
--- a/app/javascript/mastodon/locales/zh-HK.json
+++ b/app/javascript/mastodon/locales/zh-HK.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "批准",
   "follow_request.reject": "拒絕",
   "getting_started.developers": "開發者",
@@ -354,6 +359,7 @@
   "status.favourite": "收藏",
   "status.filtered": "Filtered",
   "status.load_more": "載入更多",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "隱藏媒體內容",
   "status.mention": "提及 @{name}",
   "status.more": "更多",
diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json
index 136573381f0608e5ffe39d24ace1127e1b4d3f7c..e6080011ee8ef9dc758ade4c3a3a329ec57ac506 100644
--- a/app/javascript/mastodon/locales/zh-TW.json
+++ b/app/javascript/mastodon/locales/zh-TW.json
@@ -156,6 +156,11 @@
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
+  "federation.change": "Adjust status federation",
+  "federation.federated.long": "Allow toot to reach other instances",
+  "federation.federated.short": "Federated",
+  "federation.local_only.long": "Restrict this toot only to my instance",
+  "federation.local_only.short": "Local-only",
   "follow_request.authorize": "授權",
   "follow_request.reject": "拒絕",
   "getting_started.developers": "開發者",
@@ -354,6 +359,7 @@
   "status.favourite": "最愛",
   "status.filtered": "已過濾",
   "status.load_more": "載入更多",
+  "status.local_only": "This post is only visible by other users of your instance",
   "status.media_hidden": "隱藏媒體內容",
   "status.mention": "提到 @{name}",
   "status.more": "更多",
diff --git a/app/javascript/mastodon/reducers/compose.js b/app/javascript/mastodon/reducers/compose.js
index b5dc81703d156f670a08c9e0a1bb8eeb8f612f8d..8692cb25467a2e45c3039d12ac7e73ab90381847 100644
--- a/app/javascript/mastodon/reducers/compose.js
+++ b/app/javascript/mastodon/reducers/compose.js
@@ -23,6 +23,7 @@ import {
   COMPOSE_SPOILERNESS_CHANGE,
   COMPOSE_SPOILER_TEXT_CHANGE,
   COMPOSE_VISIBILITY_CHANGE,
+  COMPOSE_FEDERATION_CHANGE,
   COMPOSE_COMPOSING_CHANGE,
   COMPOSE_EMOJI_INSERT,
   COMPOSE_UPLOAD_CHANGE_REQUEST,
@@ -50,6 +51,7 @@ const initialState = ImmutableMap({
   spoiler: false,
   spoiler_text: '',
   privacy: null,
+  federation: null,
   text: '',
   focusDate: null,
   caretPosition: null,
@@ -65,6 +67,7 @@ const initialState = ImmutableMap({
   suggestion_token: null,
   suggestions: ImmutableList(),
   default_privacy: 'public',
+  default_federation: true,
   default_sensitive: false,
   resetFileKey: Math.floor((Math.random() * 0x10000)),
   idempotencyKey: null,
@@ -96,6 +99,7 @@ function clearAll(state) {
     map.set('is_changing_upload', false);
     map.set('in_reply_to', null);
     map.set('privacy', state.get('default_privacy'));
+    map.set('federation', state.get('default_federation'));
     map.set('sensitive', false);
     map.update('media_attachments', list => list.clear());
     map.set('poll', null);
@@ -272,6 +276,10 @@ export default function compose(state = initialState, action) {
     return state
       .set('spoiler_text', action.text)
       .set('idempotencyKey', uuid());
+  case COMPOSE_FEDERATION_CHANGE:
+    return state
+      .set('federation', action.value)
+      .set('idempotencyKey', uuid());
   case COMPOSE_VISIBILITY_CHANGE:
     return state
       .set('privacy', action.value)
@@ -287,6 +295,7 @@ export default function compose(state = initialState, action) {
       map.set('in_reply_to', action.status.get('id'));
       map.set('text', statusToTextMentions(state, action.status));
       map.set('privacy', privacyPreference(action.status.get('visibility'), state.get('default_privacy')));
+      map.set('federation', !action.status.get('local_only'));
       map.set('focusDate', new Date());
       map.set('caretPosition', null);
       map.set('preselectDate', new Date());
@@ -309,6 +318,7 @@ export default function compose(state = initialState, action) {
       map.set('spoiler_text', '');
       map.set('privacy', state.get('default_privacy'));
       map.set('poll', null);
+      map.set('federation', state.get('default_federation'));
       map.set('idempotencyKey', uuid());
     });
   case COMPOSE_SUBMIT_REQUEST:
@@ -379,6 +389,7 @@ export default function compose(state = initialState, action) {
       map.set('text', action.raw_text || unescapeHTML(expandMentions(action.status)));
       map.set('in_reply_to', action.status.get('in_reply_to_id'));
       map.set('privacy', action.status.get('visibility'));
+      map.set('federation', !action.status.get('local_only'));
       map.set('media_attachments', action.status.get('media_attachments'));
       map.set('focusDate', new Date());
       map.set('caretPosition', null);
diff --git a/app/lib/user_settings_decorator.rb b/app/lib/user_settings_decorator.rb
index 3568a3e1167a20bbf03357c57a4d0cd6a359f535..52249f940111fd9c652f1985380e82b18e824427 100644
--- a/app/lib/user_settings_decorator.rb
+++ b/app/lib/user_settings_decorator.rb
@@ -20,6 +20,7 @@ class UserSettingsDecorator
     user.settings['default_privacy']     = default_privacy_preference if change?('setting_default_privacy')
     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['unfollow_modal']      = unfollow_modal_preference if change?('setting_unfollow_modal')
     user.settings['boost_modal']         = boost_modal_preference if change?('setting_boost_modal')
     user.settings['delete_modal']        = delete_modal_preference if change?('setting_delete_modal')
@@ -55,6 +56,10 @@ class UserSettingsDecorator
     boolean_cast_setting 'setting_default_sensitive'
   end
 
+  def default_federation_preference
+    boolean_cast_setting 'setting_default_federation'
+  end
+
   def unfollow_modal_preference
     boolean_cast_setting 'setting_unfollow_modal'
   end
diff --git a/app/models/status.rb b/app/models/status.rb
index 0c01a5389d88b355dea6e142fcbe4d4a0ea89e0a..8dd50e40c45756d1cf4b2a49be9aeb93285aeb0b 100644
--- a/app/models/status.rb
+++ b/app/models/status.rb
@@ -23,6 +23,7 @@
 #  in_reply_to_account_id :bigint(8)
 #  poll_id                :bigint(8)
 #  deleted_at             :datetime
+#  local_only             :boolean
 #
 
 class Status < ApplicationRecord
@@ -84,6 +85,7 @@ class Status < ApplicationRecord
 
   scope :without_replies, -> { where('statuses.reply = FALSE OR statuses.in_reply_to_account_id = statuses.account_id') }
   scope :without_reblogs, -> { where('statuses.reblog_of_id IS NULL') }
+  scope :without_local_only, -> { where(local_only: [false, nil]) }
   scope :with_public_visibility, -> { where(visibility: :public) }
   scope :tagged_with, ->(tag) { joins(:statuses_tags).where(statuses_tags: { tag_id: tag }) }
   scope :excluding_silenced_accounts, -> { left_outer_joins(:account).where(accounts: { silenced_at: nil }) }
@@ -154,6 +156,10 @@ class Status < ApplicationRecord
     attributes['local'] || uri.nil?
   end
 
+  def local_only?
+    local_only
+  end
+
   def reblog?
     !reblog_of_id.nil?
   end
@@ -265,6 +271,8 @@ class Status < ApplicationRecord
 
   around_create Mastodon::Snowflake::Callbacks
 
+  before_create :set_locality
+
   before_validation :prepare_contents, if: :local?
   before_validation :set_reblog
   before_validation :set_visibility
@@ -338,7 +346,7 @@ class Status < ApplicationRecord
       visibility = [:public, :unlisted]
 
       if account.nil?
-        where(visibility: visibility)
+        where(visibility: visibility).without_local_only
       elsif target_account.blocking?(account) # get rid of blocked peeps
         none
       elsif account.id == target_account.id # author can see own stuff
@@ -381,7 +389,7 @@ class Status < ApplicationRecord
     end
 
     def filter_timeline_default(query)
-      query.excluding_silenced_accounts
+      query.without_local_only.excluding_silenced_accounts
     end
 
     def account_silencing_filter(account)
@@ -454,6 +462,10 @@ class Status < ApplicationRecord
     self.local = account.local?
   end
 
+  def set_locality
+    self.local_only = reblog.local_only if reblog?
+  end
+
   def update_statistics
     return unless distributable?
 
diff --git a/app/models/user.rb b/app/models/user.rb
index 9a19a53b32dae12c4876050f8bf3f07c35e26576..b34546ab98447d67a13ce94f8057346a3ae923eb 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -108,7 +108,7 @@ class User < ApplicationRecord
   delegate :auto_play_gif, :default_sensitive, :unfollow_modal, :boost_modal, :delete_modal,
            :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,
+           :advanced_layout, :use_blurhash, :use_pending_items, :trends, :default_federation,
            to: :settings, prefix: :setting, allow_nil: false
 
   attr_reader :invite_code
diff --git a/app/policies/status_policy.rb b/app/policies/status_policy.rb
index 3d4e50d3719730cc65540f58180a103fc3a284f9..00e12bcbc9b18e308e0298dedbc5c7d0276aa6e8 100644
--- a/app/policies/status_policy.rb
+++ b/app/policies/status_policy.rb
@@ -12,6 +12,8 @@ class StatusPolicy < ApplicationPolicy
   end
 
   def show?
+    return false if local_only? && (current_account.nil? || !current_account.local?)
+
     if requires_mention?
       owned? || mention_exists?
     elsif private?
@@ -90,4 +92,8 @@ class StatusPolicy < ApplicationPolicy
   def author
     record.account
   end
+
+  def local_only?
+    record.local_only?
+  end
 end
diff --git a/app/serializers/initial_state_serializer.rb b/app/serializers/initial_state_serializer.rb
index e74f0b74068ea210d8f46650b57ce9273730cf4f..e473d4a09413a2cc88d6df0a52979f0cc839b3b2 100644
--- a/app/serializers/initial_state_serializer.rb
+++ b/app/serializers/initial_state_serializer.rb
@@ -59,6 +59,7 @@ class InitialStateSerializer < ActiveModel::Serializer
       store[:me]                = object.current_account.id.to_s
       store[:default_privacy]   = 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
     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 be0d763dc122991b0fdc957d321cd0d7c2a7a9df..fa8f900cc594170dc646a0fab0fee5643a6082b3 100644
--- a/app/serializers/rest/credential_account_serializer.rb
+++ b/app/serializers/rest/credential_account_serializer.rb
@@ -10,6 +10,7 @@ class REST::CredentialAccountSerializer < REST::AccountSerializer
       privacy: user.setting_default_privacy,
       sensitive: user.setting_default_sensitive,
       language: user.setting_default_language,
+      federation: user.setting_default_federation,
       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 2dc4a1b61cae02afbf5c91dcac14a8c30ce4052f..ad0287a91c9cdfc93dc7d1ed73282ce6e82f6c16 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
+             :favourites_count, :local_only
 
   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 a0a650d62411735c9da77f9ffc118e31065d61bd..b59982d84531c2369e6e94ec79933c0abb824176 100644
--- a/app/services/post_status_service.rb
+++ b/app/services/post_status_service.rb
@@ -85,11 +85,19 @@ class PostStatusService < BaseService
     end
   end
 
+  def local_only_option(local_only, in_reply_to, federation_setting)
+    return in_reply_to&.local_only? if local_only.nil? # XXX temporary, just until clients implement to avoid leaking local_only posts
+    return federation_setting if local_only.nil?
+    local_only
+  end
+
   def postprocess_status!
     LinkCrawlWorker.perform_async(@status.id) unless @status.spoiler_text?
     DistributionWorker.perform_async(@status.id)
-    ActivityPub::DistributionWorker.perform_async(@status.id)
-    PollExpirationNotifyWorker.perform_at(@status.poll.expires_at, @status.poll.id) if @status.poll
+    unless @status.local_only?
+      ActivityPub::DistributionWorker.perform_async(@status.id)
+      PollExpirationNotifyWorker.perform_at(@status.poll.expires_at, @status.poll.id) if @status.poll
+    end
   end
 
   def validate_media!
@@ -160,6 +168,7 @@ class PostStatusService < BaseService
       visibility: @visibility,
       language: language_from_option(@options[:language]) || @account.user&.setting_default_language&.presence || LanguageDetector.instance.detect(@text, @account),
       application: @options[:application],
+      local_only: local_only_option(@options[:local_only], @in_reply_to, @account.user&.setting_default_federation),
     }.compact
   end
 
diff --git a/app/services/process_mentions_service.rb b/app/services/process_mentions_service.rb
index 2f7a9e985b5f9209fcc8c6812b1199278b84613b..19de377174a724897466c95a1d7720c95d6d1900 100644
--- a/app/services/process_mentions_service.rb
+++ b/app/services/process_mentions_service.rb
@@ -49,7 +49,7 @@ class ProcessMentionsService < BaseService
 
     if mentioned_account.local?
       LocalNotificationWorker.perform_async(mentioned_account.id, mention.id, mention.class.name)
-    elsif mentioned_account.activitypub?
+    elsif mentioned_account.activitypub? && !@status.local_only?
       ActivityPub::DeliveryWorker.perform_async(activitypub_json, mention.status.account_id, mentioned_account.inbox_url)
     end
   end
diff --git a/app/services/reblog_service.rb b/app/services/reblog_service.rb
index 3bb460fcaf946e6db5a998b3c68d6c12bc4a84d9..9c409da801e1f6257756c3f04ad0b71e489d6cff 100644
--- a/app/services/reblog_service.rb
+++ b/app/services/reblog_service.rb
@@ -23,7 +23,9 @@ class ReblogService < BaseService
     reblog = account.statuses.create!(reblog: reblogged_status, text: '', visibility: visibility)
 
     DistributionWorker.perform_async(reblog.id)
-    ActivityPub::DistributionWorker.perform_async(reblog.id)
+    unless reblogged_status.local_only?
+      ActivityPub::DistributionWorker.perform_async(reblog.id)
+    end
 
     create_notification(reblog)
     bump_potential_friendship(account, reblog)
diff --git a/app/views/admin/reports/_status.html.haml b/app/views/admin/reports/_status.html.haml
index 6facc0a568ba93fc24d2dc19d380a99e7c6f1d07..6640f30e0fa661d3670f067ce58c01f3acc9deb4 100644
--- a/app/views/admin/reports/_status.html.haml
+++ b/app/views/admin/reports/_status.html.haml
@@ -35,3 +35,7 @@
         ·
         = fa_icon('eye-slash fw')
         = t('stream_entries.sensitive_content')
+      - if status.proper.local_only
+        ·
+        = fa_icon('chain-broken fw')
+        = t('statuses.local_only')
diff --git a/app/views/settings/preferences/other/show.html.haml b/app/views/settings/preferences/other/show.html.haml
index db7d806bc05445eed383840606b674be059d0b2a..4f15ed0164d740a35835f921996421f1d1950ce1 100644
--- a/app/views/settings/preferences/other/show.html.haml
+++ b/app/views/settings/preferences/other/show.html.haml
@@ -25,6 +25,9 @@
   .fields-group
     = f.input :setting_default_sensitive, as: :boolean, wrapper: :with_label
 
+  .fields-group
+    = f.input :setting_default_federation, as: :boolean, wrapper: :with_label
+
   .fields-group
     = f.input :setting_show_application, as: :boolean, wrapper: :with_label, recommended: true
 
diff --git a/app/views/statuses/_detailed_status.html.haml b/app/views/statuses/_detailed_status.html.haml
index 3e933289e98b5cfaed05f45d8efe51698c4eb000..6367f4eddf40199b7d18884b9d7638569d8b332a 100644
--- a/app/views/statuses/_detailed_status.html.haml
+++ b/app/views/statuses/_detailed_status.html.haml
@@ -78,6 +78,10 @@
       %span.detailed-status__favorites>= number_to_human status.favourites_count, strip_insignificant_zeros: true
       = " "
 
+    - if status.local_only
+      ·
+      %span.detailed-status__link.modal-button.disabled<
+        = fa_icon 'chain-broken fw', 'title': t('statuses.local_only')
     - if user_signed_in?
       ·
       = link_to t('statuses.open_in_web'), web_url("statuses/#{status.id}"), class: 'detailed-status__application', target: '_blank'
diff --git a/app/views/statuses/_simple_status.html.haml b/app/views/statuses/_simple_status.html.haml
index a68fe10220c85766afb2b5fee2649a361d433789..9b89e30a92db5b6bf02865b01ea54ee81ea4242e 100644
--- a/app/views/statuses/_simple_status.html.haml
+++ b/app/views/statuses/_simple_status.html.haml
@@ -62,3 +62,6 @@
         = fa_icon 'envelope fw'
     = link_to remote_interaction_path(status, type: :favourite), class: 'status__action-bar-button icon-button modal-button', style: 'font-size: 18px; width: 23.1429px; height: 23.1429px; line-height: 23.15px;' do
       = fa_icon 'star fw'
+    - if status.local_only
+      %span.status__action-bar-button.icon-button.disabled{style: 'font-size: 18px; width: 23.1429px; height: 23.1429px; line-height: 23.15px;'}<
+        = fa_icon 'chain-broken fw', 'title': t('statuses.local_only')
diff --git a/config/locales/en.yml b/config/locales/en.yml
index b62b4186ffbeb12843d700308669b2b93461b257..c00659a707fd9b04ae5325076049c9249afc2b5c 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -1025,6 +1025,7 @@ en:
       one: 'contained a disallowed hashtag: %{tags}'
       other: 'contained the disallowed hashtags: %{tags}'
     language_detection: Automatically detect language
+    local_only: Local-only
     open_in_web: Open in web
     over_character_limit: character limit of %{max} exceeded
     pin_errors:
diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml
index bafbcaab3018044eeb1bb377e73ae855172a6c34..c21d98063c7e46a1a920e50cd5699b8fb8a682ec 100644
--- a/config/locales/pt-BR.yml
+++ b/config/locales/pt-BR.yml
@@ -914,6 +914,7 @@ pt-BR:
       one: 'continha a hashtag não permitida: %{tags}'
       other: 'continha as hashtags não permitidas: %{tags}'
     language_detection: Detectar idioma automaticamente
+    local_only: Somente local
     open_in_web: Abrir na web
     over_character_limit: limite de caracteres de %{max} excedido
     pin_errors:
diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml
index 3d909e9991bd4351e7537b76f5f938ab05956003..2a08510ff02292a323ff1484ecdeb6c3417f926c 100644
--- a/config/locales/simple_form.en.yml
+++ b/config/locales/simple_form.en.yml
@@ -34,6 +34,7 @@ en:
         phrase: Will be matched regardless of casing in text or content warning of a toot
         scopes: Which APIs the application will be allowed to access. If you select a top-level scope, you don't need to select individual ones.
         setting_aggregate_reblogs: Do not show new boosts for toots that have been recently boosted (only affects newly-received boosts)
+        setting_default_federation: Toots do not federate to other instances unless manually changed while composing
         setting_default_sensitive: Sensitive media is hidden by default and can be revealed with a click
         setting_display_media_default: Hide media marked as sensitive
         setting_display_media_hide_all: Always hide all media
@@ -113,6 +114,7 @@ en:
         setting_aggregate_reblogs: Group boosts in timelines
         setting_auto_play_gif: Auto-play animated GIFs
         setting_boost_modal: Show confirmation dialog before boosting
+        setting_default_federation: Allow my toots to reach other instances by default
         setting_default_language: Posting language
         setting_default_privacy: Posting privacy
         setting_default_sensitive: Always mark media as sensitive
diff --git a/config/locales/simple_form.pt-BR.yml b/config/locales/simple_form.pt-BR.yml
index 3f3f78180b1695d6430ae019dfb0408aa1356559..72f179d5238af5affcbc180a482355af9c46b882 100644
--- a/config/locales/simple_form.pt-BR.yml
+++ b/config/locales/simple_form.pt-BR.yml
@@ -103,6 +103,7 @@ pt-BR:
         setting_aggregate_reblogs: Agrupar compartilhamentos nas timelines
         setting_auto_play_gif: Reproduzir GIFs automaticamente
         setting_boost_modal: Mostrar diálogo de confirmação antes de compartilhar postagem
+        setting_default_federation: Permitir que meus toots cheguem em outras instâncias por padrão
         setting_default_language: Idioma das postagens
         setting_default_privacy: Privacidade das postagens
         setting_default_sensitive: Sempre marcar mídia como sensível
diff --git a/config/settings.yml b/config/settings.yml
index bd2f65b5e4dc9583f199e8ac2f83d377e1fdd90e..a39eb2ea80bcd872125cd21676aae0c0d1a2d7d4 100644
--- a/config/settings.yml
+++ b/config/settings.yml
@@ -17,6 +17,7 @@ defaults: &defaults
   timeline_preview: true
   show_staff_badge: true
   default_sensitive: false
+  default_federation: true
   hide_network: false
   unfollow_modal: false
   boost_modal: false
diff --git a/db/migrate/20171210213213_add_local_only_flag_to_statuses.rb b/db/migrate/20171210213213_add_local_only_flag_to_statuses.rb
new file mode 100644
index 0000000000000000000000000000000000000000..af1e29d6a141c9bf1de2d9aa1ba48cdc596b30c1
--- /dev/null
+++ b/db/migrate/20171210213213_add_local_only_flag_to_statuses.rb
@@ -0,0 +1,5 @@
+class AddLocalOnlyFlagToStatuses < ActiveRecord::Migration[5.1]
+  def change
+    add_column :statuses, :local_only, :boolean
+  end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 62e2d3a6d64e8ef513c29a3ecef779588041dd3d..cd1f26281c5134d3ff7b19f2336645ed4d9c09e0 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -678,6 +678,7 @@ ActiveRecord::Schema.define(version: 2019_10_07_013357) do
     t.bigint "in_reply_to_account_id"
     t.bigint "poll_id"
     t.datetime "deleted_at"
+    t.boolean "local_only"
     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 ["in_reply_to_account_id"], name: "index_statuses_on_in_reply_to_account_id"
diff --git a/spec/models/status_spec.rb b/spec/models/status_spec.rb
index 51a10cd1776f2acad4cf3387b49c8cc1b970f824..0b6086978d890af4c93764d13a151d300734422e 100644
--- a/spec/models/status_spec.rb
+++ b/spec/models/status_spec.rb
@@ -481,6 +481,32 @@ RSpec.describe Status, type: :model do
         end
       end
     end
+
+    context 'with local-only statuses' do
+      let(:status) { Fabricate(:status, local_only: true) }
+
+      subject { Status.as_public_timeline(viewer) }
+
+      context 'without a viewer' do
+        let(:viewer) { nil }
+
+        it 'excludes local-only statuses' do
+          expect(subject).to_not include(status)
+        end
+      end
+
+      context 'with a viewer' do
+        let(:viewer) { Fabricate(:account, username: 'viewer') }
+
+        it 'includes local-only statuses' do
+          expect(subject).to include(status)
+        end
+      end
+
+      # TODO: What happens if the viewer is remote?
+      # Can the viewer be remote?
+      # What prevents the viewer from being remote?
+    end
   end
 
   describe '.as_tag_timeline' do
@@ -502,6 +528,27 @@ RSpec.describe Status, type: :model do
       results = Status.as_tag_timeline(tag)
       expect(results).to include(status)
     end
+
+    context 'on a local-only status' do
+      let(:tag) { Fabricate(:tag) }
+      let(:status) { Fabricate(:status, local_only: true, tags: [tag]) }
+
+      context 'without a viewer' do
+        let(:viewer) { nil }
+
+        it 'filters the local-only status out of the result set' do
+          expect(Status.as_tag_timeline(tag, viewer)).not_to include(status)
+        end
+      end
+
+      context 'with a viewer' do
+        let(:viewer) { Fabricate(:account, username: 'viewer', domain: nil) }
+
+        it 'keeps the local-only status in the result set' do
+          expect(Status.as_tag_timeline(tag, viewer)).to include(status)
+        end
+      end
+    end
   end
 
   describe '.permitted_for' do
diff --git a/spec/policies/status_policy_spec.rb b/spec/policies/status_policy_spec.rb
index 1cddf4abd57da9a0df420ae141f4e9d403c9f38a..8bce29cad27e3660fa7d6a6920afc8486b40c244 100644
--- a/spec/policies/status_policy_spec.rb
+++ b/spec/policies/status_policy_spec.rb
@@ -73,6 +73,18 @@ RSpec.describe StatusPolicy, type: :model do
 
       expect(subject).to_not permit(viewer, status)
     end
+
+    it 'denies access when local-only and the viewer is not logged in' do
+      allow(status).to receive(:local_only?) { true }
+
+      expect(subject).to_not permit(nil, status)
+    end
+
+    it 'denies access when local-only and the viewer is from another domain' do
+      viewer = Fabricate(:account, domain: 'remote-domain')
+      allow(status).to receive(:local_only?) { true }
+      expect(subject).to_not permit(viewer, status)
+    end
   end
 
   permissions :reblog? do
diff --git a/streaming/index.js b/streaming/index.js
index 304e7e0465bed4e3b79a2b8e2e8e53792779d99f..f743f574451e233ed7250aff0543db5966f9a332 100644
--- a/streaming/index.js
+++ b/streaming/index.js
@@ -376,6 +376,12 @@ const startWorker = (workerId) => {
         return;
       }
 
+      // Only send local-only statuses to logged-in users
+      if (payload.local_only && !req.accountId) {
+        log.silly(req.requestId, `Message ${payload.id} filtered because it was local-only`);
+        return;
+      }
+
       // Only messages that may require filtering are statuses, since notifications
       // are already personalized and deletes do not matter
       if (!needsFiltering || event !== 'update') {