about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--.gitmodules3
-rw-r--r--app/controllers/application_controller.rb36
-rw-r--r--app/javascript/core/settings.js2
-rw-r--r--app/javascript/flavours/glitch/actions/accounts.js (renamed from app/javascript/themes/glitch/actions/accounts.js)2
-rw-r--r--app/javascript/flavours/glitch/actions/alerts.js (renamed from app/javascript/themes/glitch/actions/alerts.js)0
-rw-r--r--app/javascript/flavours/glitch/actions/blocks.js (renamed from app/javascript/themes/glitch/actions/blocks.js)2
-rw-r--r--app/javascript/flavours/glitch/actions/bundles.js (renamed from app/javascript/themes/glitch/actions/bundles.js)0
-rw-r--r--app/javascript/flavours/glitch/actions/cards.js (renamed from app/javascript/themes/glitch/actions/cards.js)2
-rw-r--r--app/javascript/flavours/glitch/actions/columns.js (renamed from app/javascript/themes/glitch/actions/columns.js)0
-rw-r--r--app/javascript/flavours/glitch/actions/compose.js (renamed from app/javascript/themes/glitch/actions/compose.js)4
-rw-r--r--app/javascript/flavours/glitch/actions/domain_blocks.js (renamed from app/javascript/themes/glitch/actions/domain_blocks.js)2
-rw-r--r--app/javascript/flavours/glitch/actions/emojis.js (renamed from app/javascript/themes/glitch/actions/emojis.js)0
-rw-r--r--app/javascript/flavours/glitch/actions/favourites.js (renamed from app/javascript/themes/glitch/actions/favourites.js)2
-rw-r--r--app/javascript/flavours/glitch/actions/height_cache.js (renamed from app/javascript/themes/glitch/actions/height_cache.js)0
-rw-r--r--app/javascript/flavours/glitch/actions/interactions.js (renamed from app/javascript/themes/glitch/actions/interactions.js)2
-rw-r--r--app/javascript/flavours/glitch/actions/local_settings.js (renamed from app/javascript/themes/glitch/actions/local_settings.js)0
-rw-r--r--app/javascript/flavours/glitch/actions/modal.js (renamed from app/javascript/themes/glitch/actions/modal.js)0
-rw-r--r--app/javascript/flavours/glitch/actions/mutes.js (renamed from app/javascript/themes/glitch/actions/mutes.js)4
-rw-r--r--app/javascript/flavours/glitch/actions/notifications.js (renamed from app/javascript/themes/glitch/actions/notifications.js)2
-rw-r--r--app/javascript/flavours/glitch/actions/onboarding.js (renamed from app/javascript/themes/glitch/actions/onboarding.js)0
-rw-r--r--app/javascript/flavours/glitch/actions/pin_statuses.js (renamed from app/javascript/themes/glitch/actions/pin_statuses.js)4
-rw-r--r--app/javascript/flavours/glitch/actions/push_notifications.js (renamed from app/javascript/themes/glitch/actions/push_notifications.js)0
-rw-r--r--app/javascript/flavours/glitch/actions/reports.js (renamed from app/javascript/themes/glitch/actions/reports.js)2
-rw-r--r--app/javascript/flavours/glitch/actions/search.js (renamed from app/javascript/themes/glitch/actions/search.js)2
-rw-r--r--app/javascript/flavours/glitch/actions/settings.js (renamed from app/javascript/themes/glitch/actions/settings.js)0
-rw-r--r--app/javascript/flavours/glitch/actions/statuses.js (renamed from app/javascript/themes/glitch/actions/statuses.js)2
-rw-r--r--app/javascript/flavours/glitch/actions/store.js (renamed from app/javascript/themes/glitch/actions/store.js)0
-rw-r--r--app/javascript/flavours/glitch/actions/streaming.js (renamed from app/javascript/themes/glitch/actions/streaming.js)2
-rw-r--r--app/javascript/flavours/glitch/actions/timelines.js (renamed from app/javascript/themes/glitch/actions/timelines.js)2
-rw-r--r--app/javascript/flavours/glitch/components/account.js (renamed from app/javascript/themes/glitch/components/account.js)2
-rw-r--r--app/javascript/flavours/glitch/components/attachment_list.js (renamed from app/javascript/themes/glitch/components/attachment_list.js)0
-rw-r--r--app/javascript/flavours/glitch/components/autosuggest_emoji.js (renamed from app/javascript/themes/glitch/components/autosuggest_emoji.js)2
-rw-r--r--app/javascript/flavours/glitch/components/autosuggest_textarea.js (renamed from app/javascript/themes/glitch/components/autosuggest_textarea.js)4
-rw-r--r--app/javascript/flavours/glitch/components/avatar.js (renamed from app/javascript/themes/glitch/components/avatar.js)0
-rw-r--r--app/javascript/flavours/glitch/components/avatar_overlay.js (renamed from app/javascript/themes/glitch/components/avatar_overlay.js)0
-rw-r--r--app/javascript/flavours/glitch/components/button.js (renamed from app/javascript/themes/glitch/components/button.js)0
-rw-r--r--app/javascript/flavours/glitch/components/collapsable.js (renamed from app/javascript/themes/glitch/components/collapsable.js)2
-rw-r--r--app/javascript/flavours/glitch/components/column.js (renamed from app/javascript/themes/glitch/components/column.js)2
-rw-r--r--app/javascript/flavours/glitch/components/column_back_button.js (renamed from app/javascript/themes/glitch/components/column_back_button.js)0
-rw-r--r--app/javascript/flavours/glitch/components/column_back_button_slim.js (renamed from app/javascript/themes/glitch/components/column_back_button_slim.js)0
-rw-r--r--app/javascript/flavours/glitch/components/column_header.js (renamed from app/javascript/themes/glitch/components/column_header.js)3
-rw-r--r--app/javascript/flavours/glitch/components/display_name.js (renamed from app/javascript/themes/glitch/components/display_name.js)0
-rw-r--r--app/javascript/flavours/glitch/components/dropdown_menu.js (renamed from app/javascript/themes/glitch/components/dropdown_menu.js)2
-rw-r--r--app/javascript/flavours/glitch/components/extended_video_player.js (renamed from app/javascript/themes/glitch/components/extended_video_player.js)0
-rw-r--r--app/javascript/flavours/glitch/components/icon_button.js (renamed from app/javascript/themes/glitch/components/icon_button.js)2
-rw-r--r--app/javascript/flavours/glitch/components/intersection_observer_article.js (renamed from app/javascript/themes/glitch/components/intersection_observer_article.js)4
-rw-r--r--app/javascript/flavours/glitch/components/load_more.js (renamed from app/javascript/themes/glitch/components/load_more.js)0
-rw-r--r--app/javascript/flavours/glitch/components/loading_indicator.js (renamed from app/javascript/themes/glitch/components/loading_indicator.js)0
-rw-r--r--app/javascript/flavours/glitch/components/media_gallery.js (renamed from app/javascript/themes/glitch/components/media_gallery.js)4
-rw-r--r--app/javascript/flavours/glitch/components/missing_indicator.js (renamed from app/javascript/themes/glitch/components/missing_indicator.js)0
-rw-r--r--app/javascript/flavours/glitch/components/notification_purge_buttons.js (renamed from app/javascript/themes/glitch/components/notification_purge_buttons.js)0
-rw-r--r--app/javascript/flavours/glitch/components/permalink.js (renamed from app/javascript/themes/glitch/components/permalink.js)0
-rw-r--r--app/javascript/flavours/glitch/components/relative_timestamp.js (renamed from app/javascript/themes/glitch/components/relative_timestamp.js)0
-rw-r--r--app/javascript/flavours/glitch/components/scrollable_list.js (renamed from app/javascript/themes/glitch/components/scrollable_list.js)6
-rw-r--r--app/javascript/flavours/glitch/components/setting_text.js (renamed from app/javascript/themes/glitch/components/setting_text.js)0
-rw-r--r--app/javascript/flavours/glitch/components/status.js (renamed from app/javascript/themes/glitch/components/status.js)4
-rw-r--r--app/javascript/flavours/glitch/components/status_action_bar.js (renamed from app/javascript/themes/glitch/components/status_action_bar.js)7
-rw-r--r--app/javascript/flavours/glitch/components/status_content.js (renamed from app/javascript/themes/glitch/components/status_content.js)2
-rw-r--r--app/javascript/flavours/glitch/components/status_header.js (renamed from app/javascript/themes/glitch/components/status_header.js)0
-rw-r--r--app/javascript/flavours/glitch/components/status_list.js (renamed from app/javascript/themes/glitch/components/status_list.js)2
-rw-r--r--app/javascript/flavours/glitch/components/status_prepend.js (renamed from app/javascript/themes/glitch/components/status_prepend.js)0
-rw-r--r--app/javascript/flavours/glitch/components/status_visibility_icon.js (renamed from app/javascript/themes/glitch/components/status_visibility_icon.js)0
-rw-r--r--app/javascript/flavours/glitch/containers/account_container.js (renamed from app/javascript/themes/glitch/containers/account_container.js)12
-rw-r--r--app/javascript/flavours/glitch/containers/card_container.js (renamed from app/javascript/themes/glitch/containers/card_container.js)2
-rw-r--r--app/javascript/flavours/glitch/containers/compose_container.js (renamed from app/javascript/themes/glitch/containers/compose_container.js)8
-rw-r--r--app/javascript/flavours/glitch/containers/dropdown_menu_container.js (renamed from app/javascript/themes/glitch/containers/dropdown_menu_container.js)6
-rw-r--r--app/javascript/flavours/glitch/containers/intersection_observer_article_container.js (renamed from app/javascript/themes/glitch/containers/intersection_observer_article_container.js)4
-rw-r--r--app/javascript/flavours/glitch/containers/mastodon.js (renamed from app/javascript/themes/glitch/containers/mastodon.js)12
-rw-r--r--app/javascript/flavours/glitch/containers/media_gallery_container.js (renamed from app/javascript/themes/glitch/containers/media_gallery_container.js)2
-rw-r--r--app/javascript/flavours/glitch/containers/notification_purge_buttons_container.js (renamed from app/javascript/themes/glitch/containers/notification_purge_buttons_container.js)6
-rw-r--r--app/javascript/flavours/glitch/containers/status_container.js (renamed from app/javascript/themes/glitch/containers/status_container.js)20
-rw-r--r--app/javascript/flavours/glitch/containers/timeline_container.js (renamed from app/javascript/themes/glitch/containers/timeline_container.js)10
-rw-r--r--app/javascript/flavours/glitch/containers/video_container.js (renamed from app/javascript/themes/glitch/containers/video_container.js)2
-rw-r--r--app/javascript/flavours/glitch/features/account/components/action_bar.js (renamed from app/javascript/themes/glitch/features/account/components/action_bar.js)4
-rw-r--r--app/javascript/flavours/glitch/features/account/components/header.js (renamed from app/javascript/themes/glitch/features/account/components/header.js)10
-rw-r--r--app/javascript/flavours/glitch/features/account_gallery/components/media_item.js (renamed from app/javascript/themes/glitch/features/account_gallery/components/media_item.js)2
-rw-r--r--app/javascript/flavours/glitch/features/account_gallery/index.js (renamed from app/javascript/themes/glitch/features/account_gallery/index.js)16
-rw-r--r--app/javascript/flavours/glitch/features/account_timeline/components/header.js (renamed from app/javascript/themes/glitch/features/account_timeline/components/header.js)6
-rw-r--r--app/javascript/flavours/glitch/features/account_timeline/containers/header_container.js (renamed from app/javascript/themes/glitch/features/account_timeline/containers/header_container.js)16
-rw-r--r--app/javascript/flavours/glitch/features/account_timeline/index.js (renamed from app/javascript/themes/glitch/features/account_timeline/index.js)4
-rw-r--r--app/javascript/flavours/glitch/features/blocks/index.js (renamed from app/javascript/themes/glitch/features/blocks/index.js)10
-rw-r--r--app/javascript/flavours/glitch/features/community_timeline/components/column_settings.js (renamed from app/javascript/themes/glitch/features/community_timeline/components/column_settings.js)2
-rw-r--r--app/javascript/flavours/glitch/features/community_timeline/containers/column_settings_container.js (renamed from app/javascript/themes/glitch/features/community_timeline/containers/column_settings_container.js)2
-rw-r--r--app/javascript/flavours/glitch/features/community_timeline/index.js (renamed from app/javascript/themes/glitch/features/community_timeline/index.js)12
-rw-r--r--app/javascript/flavours/glitch/features/compose/components/advanced_options.js (renamed from app/javascript/themes/glitch/features/compose/components/advanced_options.js)0
-rw-r--r--app/javascript/flavours/glitch/features/compose/components/advanced_options_toggle.js (renamed from app/javascript/themes/glitch/features/compose/components/advanced_options_toggle.js)0
-rw-r--r--app/javascript/flavours/glitch/features/compose/components/attach_options.js (renamed from app/javascript/themes/glitch/features/compose/components/attach_options.js)4
-rw-r--r--app/javascript/flavours/glitch/features/compose/components/autosuggest_account.js (renamed from app/javascript/themes/glitch/features/compose/components/autosuggest_account.js)4
-rw-r--r--app/javascript/flavours/glitch/features/compose/components/character_counter.js (renamed from app/javascript/themes/glitch/features/compose/components/character_counter.js)0
-rw-r--r--app/javascript/flavours/glitch/features/compose/components/compose_form.js (renamed from app/javascript/themes/glitch/features/compose/components/compose_form.js)12
-rw-r--r--app/javascript/flavours/glitch/features/compose/components/dropdown.js (renamed from app/javascript/themes/glitch/features/compose/components/dropdown.js)2
-rw-r--r--app/javascript/flavours/glitch/features/compose/components/emoji_picker_dropdown.js (renamed from app/javascript/themes/glitch/features/compose/components/emoji_picker_dropdown.js)4
-rw-r--r--app/javascript/flavours/glitch/features/compose/components/navigation_bar.js (renamed from app/javascript/themes/glitch/features/compose/components/navigation_bar.js)6
-rw-r--r--app/javascript/flavours/glitch/features/compose/components/privacy_dropdown.js (renamed from app/javascript/themes/glitch/features/compose/components/privacy_dropdown.js)4
-rw-r--r--app/javascript/flavours/glitch/features/compose/components/reply_indicator.js (renamed from app/javascript/themes/glitch/features/compose/components/reply_indicator.js)6
-rw-r--r--app/javascript/flavours/glitch/features/compose/components/search.js (renamed from app/javascript/themes/glitch/features/compose/components/search.js)2
-rw-r--r--app/javascript/flavours/glitch/features/compose/components/search_results.js (renamed from app/javascript/themes/glitch/features/compose/components/search_results.js)4
-rw-r--r--app/javascript/flavours/glitch/features/compose/components/text_icon_button.js (renamed from app/javascript/themes/glitch/features/compose/components/text_icon_button.js)0
-rw-r--r--app/javascript/flavours/glitch/features/compose/components/upload.js (renamed from app/javascript/themes/glitch/features/compose/components/upload.js)4
-rw-r--r--app/javascript/flavours/glitch/features/compose/components/upload_button.js (renamed from app/javascript/themes/glitch/features/compose/components/upload_button.js)2
-rw-r--r--app/javascript/flavours/glitch/features/compose/components/upload_form.js (renamed from app/javascript/themes/glitch/features/compose/components/upload_form.js)0
-rw-r--r--app/javascript/flavours/glitch/features/compose/components/upload_progress.js (renamed from app/javascript/themes/glitch/features/compose/components/upload_progress.js)2
-rw-r--r--app/javascript/flavours/glitch/features/compose/components/warning.js (renamed from app/javascript/themes/glitch/features/compose/components/warning.js)2
-rw-r--r--app/javascript/flavours/glitch/features/compose/containers/advanced_options_container.js (renamed from app/javascript/themes/glitch/features/compose/containers/advanced_options_container.js)2
-rw-r--r--app/javascript/flavours/glitch/features/compose/containers/autosuggest_account_container.js (renamed from app/javascript/themes/glitch/features/compose/containers/autosuggest_account_container.js)2
-rw-r--r--app/javascript/flavours/glitch/features/compose/containers/compose_form_container.js (renamed from app/javascript/themes/glitch/features/compose/containers/compose_form_container.js)4
-rw-r--r--app/javascript/flavours/glitch/features/compose/containers/emoji_picker_dropdown_container.js (renamed from app/javascript/themes/glitch/features/compose/containers/emoji_picker_dropdown_container.js)4
-rw-r--r--app/javascript/flavours/glitch/features/compose/containers/navigation_container.js (renamed from app/javascript/themes/glitch/features/compose/containers/navigation_container.js)2
-rw-r--r--app/javascript/flavours/glitch/features/compose/containers/privacy_dropdown_container.js (renamed from app/javascript/themes/glitch/features/compose/containers/privacy_dropdown_container.js)6
-rw-r--r--app/javascript/flavours/glitch/features/compose/containers/reply_indicator_container.js (renamed from app/javascript/themes/glitch/features/compose/containers/reply_indicator_container.js)4
-rw-r--r--app/javascript/flavours/glitch/features/compose/containers/search_container.js (renamed from app/javascript/themes/glitch/features/compose/containers/search_container.js)2
-rw-r--r--app/javascript/flavours/glitch/features/compose/containers/search_results_container.js (renamed from app/javascript/themes/glitch/features/compose/containers/search_results_container.js)0
-rw-r--r--app/javascript/flavours/glitch/features/compose/containers/sensitive_button_container.js (renamed from app/javascript/themes/glitch/features/compose/containers/sensitive_button_container.js)6
-rw-r--r--app/javascript/flavours/glitch/features/compose/containers/spoiler_button_container.js (renamed from app/javascript/themes/glitch/features/compose/containers/spoiler_button_container.js)2
-rw-r--r--app/javascript/flavours/glitch/features/compose/containers/upload_button_container.js (renamed from app/javascript/themes/glitch/features/compose/containers/upload_button_container.js)2
-rw-r--r--app/javascript/flavours/glitch/features/compose/containers/upload_container.js (renamed from app/javascript/themes/glitch/features/compose/containers/upload_container.js)2
-rw-r--r--app/javascript/flavours/glitch/features/compose/containers/upload_form_container.js (renamed from app/javascript/themes/glitch/features/compose/containers/upload_form_container.js)0
-rw-r--r--app/javascript/flavours/glitch/features/compose/containers/upload_progress_container.js (renamed from app/javascript/themes/glitch/features/compose/containers/upload_progress_container.js)0
-rw-r--r--app/javascript/flavours/glitch/features/compose/containers/warning_container.js (renamed from app/javascript/themes/glitch/features/compose/containers/warning_container.js)2
-rw-r--r--app/javascript/flavours/glitch/features/compose/index.js (renamed from app/javascript/themes/glitch/features/compose/index.js)10
-rw-r--r--app/javascript/flavours/glitch/features/direct_timeline/containers/column_settings_container.js (renamed from app/javascript/themes/glitch/features/direct_timeline/containers/column_settings_container.js)4
-rw-r--r--app/javascript/flavours/glitch/features/direct_timeline/index.js (renamed from app/javascript/themes/glitch/features/direct_timeline/index.js)12
-rw-r--r--app/javascript/flavours/glitch/features/favourited_statuses/index.js (renamed from app/javascript/themes/glitch/features/favourited_statuses/index.js)10
-rw-r--r--app/javascript/flavours/glitch/features/favourites/index.js (renamed from app/javascript/themes/glitch/features/favourites/index.js)10
-rw-r--r--app/javascript/flavours/glitch/features/follow_requests/components/account_authorize.js (renamed from app/javascript/themes/glitch/features/follow_requests/components/account_authorize.js)8
-rw-r--r--app/javascript/flavours/glitch/features/follow_requests/containers/account_authorize_container.js (renamed from app/javascript/themes/glitch/features/follow_requests/containers/account_authorize_container.js)4
-rw-r--r--app/javascript/flavours/glitch/features/follow_requests/index.js (renamed from app/javascript/themes/glitch/features/follow_requests/index.js)8
-rw-r--r--app/javascript/flavours/glitch/features/followers/index.js (renamed from app/javascript/themes/glitch/features/followers/index.js)14
-rw-r--r--app/javascript/flavours/glitch/features/following/index.js (renamed from app/javascript/themes/glitch/features/following/index.js)14
-rw-r--r--app/javascript/flavours/glitch/features/generic_not_found/index.js11
-rw-r--r--app/javascript/flavours/glitch/features/getting_started/index.js (renamed from app/javascript/themes/glitch/features/getting_started/index.js)10
-rw-r--r--app/javascript/flavours/glitch/features/hashtag_timeline/index.js (renamed from app/javascript/themes/glitch/features/hashtag_timeline/index.js)12
-rw-r--r--app/javascript/flavours/glitch/features/home_timeline/components/column_settings.js (renamed from app/javascript/themes/glitch/features/home_timeline/components/column_settings.js)4
-rw-r--r--app/javascript/flavours/glitch/features/home_timeline/containers/column_settings_container.js (renamed from app/javascript/themes/glitch/features/home_timeline/containers/column_settings_container.js)2
-rw-r--r--app/javascript/flavours/glitch/features/home_timeline/index.js (renamed from app/javascript/themes/glitch/features/home_timeline/index.js)10
-rw-r--r--app/javascript/flavours/glitch/features/local_settings/index.js (renamed from app/javascript/themes/glitch/features/local_settings/index.js)4
-rw-r--r--app/javascript/flavours/glitch/features/local_settings/navigation/index.js (renamed from app/javascript/themes/glitch/features/local_settings/navigation/index.js)0
-rw-r--r--app/javascript/flavours/glitch/features/local_settings/navigation/item/index.js (renamed from app/javascript/themes/glitch/features/local_settings/navigation/item/index.js)0
-rw-r--r--app/javascript/flavours/glitch/features/local_settings/navigation/item/style.scss (renamed from app/javascript/themes/glitch/features/local_settings/navigation/item/style.scss)0
-rw-r--r--app/javascript/flavours/glitch/features/local_settings/navigation/style.scss (renamed from app/javascript/themes/glitch/features/local_settings/navigation/style.scss)0
-rw-r--r--app/javascript/flavours/glitch/features/local_settings/page/index.js (renamed from app/javascript/themes/glitch/features/local_settings/page/index.js)0
-rw-r--r--app/javascript/flavours/glitch/features/local_settings/page/item/index.js (renamed from app/javascript/themes/glitch/features/local_settings/page/item/index.js)0
-rw-r--r--app/javascript/flavours/glitch/features/local_settings/page/item/style.scss (renamed from app/javascript/themes/glitch/features/local_settings/page/item/style.scss)0
-rw-r--r--app/javascript/flavours/glitch/features/local_settings/page/style.scss (renamed from app/javascript/themes/glitch/features/local_settings/page/style.scss)0
-rw-r--r--app/javascript/flavours/glitch/features/local_settings/style.scss (renamed from app/javascript/themes/glitch/features/local_settings/style.scss)0
-rw-r--r--app/javascript/flavours/glitch/features/mutes/index.js (renamed from app/javascript/themes/glitch/features/mutes/index.js)10
-rw-r--r--app/javascript/flavours/glitch/features/notifications/components/clear_column_button.js (renamed from app/javascript/themes/glitch/features/notifications/components/clear_column_button.js)0
-rw-r--r--app/javascript/flavours/glitch/features/notifications/components/column_settings.js (renamed from app/javascript/themes/glitch/features/notifications/components/column_settings.js)0
-rw-r--r--app/javascript/flavours/glitch/features/notifications/components/follow.js (renamed from app/javascript/themes/glitch/features/notifications/components/follow.js)4
-rw-r--r--app/javascript/flavours/glitch/features/notifications/components/notification.js (renamed from app/javascript/themes/glitch/features/notifications/components/notification.js)2
-rw-r--r--app/javascript/flavours/glitch/features/notifications/components/overlay.js (renamed from app/javascript/themes/glitch/features/notifications/components/overlay.js)0
-rw-r--r--app/javascript/flavours/glitch/features/notifications/components/setting_toggle.js (renamed from app/javascript/themes/glitch/features/notifications/components/setting_toggle.js)0
-rw-r--r--app/javascript/flavours/glitch/features/notifications/containers/column_settings_container.js (renamed from app/javascript/themes/glitch/features/notifications/containers/column_settings_container.js)8
-rw-r--r--app/javascript/flavours/glitch/features/notifications/containers/notification_container.js (renamed from app/javascript/themes/glitch/features/notifications/containers/notification_container.js)4
-rw-r--r--app/javascript/flavours/glitch/features/notifications/containers/overlay_container.js (renamed from app/javascript/themes/glitch/features/notifications/containers/overlay_container.js)2
-rw-r--r--app/javascript/flavours/glitch/features/notifications/index.js (renamed from app/javascript/themes/glitch/features/notifications/index.js)10
-rw-r--r--app/javascript/flavours/glitch/features/pinned_statuses/index.js (renamed from app/javascript/themes/glitch/features/pinned_statuses/index.js)8
-rw-r--r--app/javascript/flavours/glitch/features/public_timeline/containers/column_settings_container.js (renamed from app/javascript/themes/glitch/features/public_timeline/containers/column_settings_container.js)4
-rw-r--r--app/javascript/flavours/glitch/features/public_timeline/index.js (renamed from app/javascript/themes/glitch/features/public_timeline/index.js)12
-rw-r--r--app/javascript/flavours/glitch/features/reblogs/index.js (renamed from app/javascript/themes/glitch/features/reblogs/index.js)10
-rw-r--r--app/javascript/flavours/glitch/features/report/components/status_check_box.js (renamed from app/javascript/themes/glitch/features/report/components/status_check_box.js)0
-rw-r--r--app/javascript/flavours/glitch/features/report/containers/status_check_box_container.js (renamed from app/javascript/themes/glitch/features/report/containers/status_check_box_container.js)2
-rw-r--r--app/javascript/flavours/glitch/features/standalone/compose/index.js20
-rw-r--r--app/javascript/flavours/glitch/features/standalone/hashtag_timeline/index.js (renamed from app/javascript/themes/glitch/features/standalone/hashtag_timeline/index.js)8
-rw-r--r--app/javascript/flavours/glitch/features/standalone/public_timeline/index.js (renamed from app/javascript/themes/glitch/features/standalone/public_timeline/index.js)8
-rw-r--r--app/javascript/flavours/glitch/features/status/components/action_bar.js (renamed from app/javascript/themes/glitch/features/status/components/action_bar.js)6
-rw-r--r--app/javascript/flavours/glitch/features/status/components/card.js (renamed from app/javascript/themes/glitch/features/status/components/card.js)0
-rw-r--r--app/javascript/flavours/glitch/features/status/components/detailed_status.js (renamed from app/javascript/themes/glitch/features/status/components/detailed_status.js)14
-rw-r--r--app/javascript/flavours/glitch/features/status/containers/card_container.js (renamed from app/javascript/themes/glitch/features/status/containers/card_container.js)0
-rw-r--r--app/javascript/flavours/glitch/features/status/index.js (renamed from app/javascript/themes/glitch/features/status/index.js)26
-rw-r--r--app/javascript/flavours/glitch/features/ui/components/actions_modal.js (renamed from app/javascript/themes/glitch/features/ui/components/actions_modal.js)10
-rw-r--r--app/javascript/flavours/glitch/features/ui/components/boost_modal.js (renamed from app/javascript/themes/glitch/features/ui/components/boost_modal.js)10
-rw-r--r--app/javascript/flavours/glitch/features/ui/components/bundle.js (renamed from app/javascript/themes/glitch/features/ui/components/bundle.js)0
-rw-r--r--app/javascript/flavours/glitch/features/ui/components/bundle_column_error.js (renamed from app/javascript/themes/glitch/features/ui/components/bundle_column_error.js)4
-rw-r--r--app/javascript/flavours/glitch/features/ui/components/bundle_modal_error.js (renamed from app/javascript/themes/glitch/features/ui/components/bundle_modal_error.js)2
-rw-r--r--app/javascript/flavours/glitch/features/ui/components/column.js (renamed from app/javascript/themes/glitch/features/ui/components/column.js)4
-rw-r--r--app/javascript/flavours/glitch/features/ui/components/column_header.js (renamed from app/javascript/themes/glitch/features/ui/components/column_header.js)0
-rw-r--r--app/javascript/flavours/glitch/features/ui/components/column_link.js (renamed from app/javascript/themes/glitch/features/ui/components/column_link.js)0
-rw-r--r--app/javascript/flavours/glitch/features/ui/components/column_loading.js (renamed from app/javascript/themes/glitch/features/ui/components/column_loading.js)4
-rw-r--r--app/javascript/flavours/glitch/features/ui/components/column_subheading.js (renamed from app/javascript/themes/glitch/features/ui/components/column_subheading.js)0
-rw-r--r--app/javascript/flavours/glitch/features/ui/components/columns_area.js (renamed from app/javascript/themes/glitch/features/ui/components/columns_area.js)4
-rw-r--r--app/javascript/flavours/glitch/features/ui/components/confirmation_modal.js (renamed from app/javascript/themes/glitch/features/ui/components/confirmation_modal.js)2
-rw-r--r--app/javascript/flavours/glitch/features/ui/components/doodle_modal.js (renamed from app/javascript/themes/glitch/features/ui/components/doodle_modal.js)6
-rw-r--r--app/javascript/flavours/glitch/features/ui/components/drawer_loading.js (renamed from app/javascript/themes/glitch/features/ui/components/drawer_loading.js)0
-rw-r--r--app/javascript/flavours/glitch/features/ui/components/embed_modal.js (renamed from app/javascript/themes/glitch/features/ui/components/embed_modal.js)0
-rw-r--r--app/javascript/flavours/glitch/features/ui/components/image_loader.js (renamed from app/javascript/themes/glitch/features/ui/components/image_loader.js)0
-rw-r--r--app/javascript/flavours/glitch/features/ui/components/media_modal.js (renamed from app/javascript/themes/glitch/features/ui/components/media_modal.js)4
-rw-r--r--app/javascript/flavours/glitch/features/ui/components/modal_loading.js (renamed from app/javascript/themes/glitch/features/ui/components/modal_loading.js)2
-rw-r--r--app/javascript/flavours/glitch/features/ui/components/modal_root.js (renamed from app/javascript/themes/glitch/features/ui/components/modal_root.js)2
-rw-r--r--app/javascript/flavours/glitch/features/ui/components/mute_modal.js (renamed from app/javascript/themes/glitch/features/ui/components/mute_modal.js)8
-rw-r--r--app/javascript/flavours/glitch/features/ui/components/onboarding_modal.js (renamed from app/javascript/themes/glitch/features/ui/components/onboarding_modal.js)10
-rw-r--r--app/javascript/flavours/glitch/features/ui/components/report_modal.js (renamed from app/javascript/themes/glitch/features/ui/components/report_modal.js)10
-rw-r--r--app/javascript/flavours/glitch/features/ui/components/tabs_bar.js (renamed from app/javascript/themes/glitch/features/ui/components/tabs_bar.js)2
-rw-r--r--app/javascript/flavours/glitch/features/ui/components/upload_area.js (renamed from app/javascript/themes/glitch/features/ui/components/upload_area.js)2
-rw-r--r--app/javascript/flavours/glitch/features/ui/components/video_modal.js (renamed from app/javascript/themes/glitch/features/ui/components/video_modal.js)2
-rw-r--r--app/javascript/flavours/glitch/features/ui/containers/bundle_container.js (renamed from app/javascript/themes/glitch/features/ui/containers/bundle_container.js)2
-rw-r--r--app/javascript/flavours/glitch/features/ui/containers/columns_area_container.js (renamed from app/javascript/themes/glitch/features/ui/containers/columns_area_container.js)0
-rw-r--r--app/javascript/flavours/glitch/features/ui/containers/loading_bar_container.js (renamed from app/javascript/themes/glitch/features/ui/containers/loading_bar_container.js)0
-rw-r--r--app/javascript/flavours/glitch/features/ui/containers/modal_container.js (renamed from app/javascript/themes/glitch/features/ui/containers/modal_container.js)2
-rw-r--r--app/javascript/flavours/glitch/features/ui/containers/notifications_container.js (renamed from app/javascript/themes/glitch/features/ui/containers/notifications_container.js)4
-rw-r--r--app/javascript/flavours/glitch/features/ui/containers/status_list_container.js (renamed from app/javascript/themes/glitch/features/ui/containers/status_list_container.js)6
-rw-r--r--app/javascript/flavours/glitch/features/ui/index.js (renamed from app/javascript/themes/glitch/features/ui/index.js)16
-rw-r--r--app/javascript/flavours/glitch/features/video/index.js (renamed from app/javascript/themes/glitch/features/video/index.js)2
-rw-r--r--app/javascript/flavours/glitch/middleware/errors.js (renamed from app/javascript/themes/glitch/middleware/errors.js)2
-rw-r--r--app/javascript/flavours/glitch/middleware/loading_bar.js (renamed from app/javascript/themes/glitch/middleware/loading_bar.js)0
-rw-r--r--app/javascript/flavours/glitch/middleware/sounds.js (renamed from app/javascript/themes/glitch/middleware/sounds.js)0
-rw-r--r--app/javascript/flavours/glitch/packs/about.js (renamed from app/javascript/themes/glitch/packs/about.js)6
-rw-r--r--app/javascript/flavours/glitch/packs/common.js1
-rw-r--r--app/javascript/flavours/glitch/packs/home.js7
-rw-r--r--app/javascript/flavours/glitch/packs/public.js (renamed from app/javascript/themes/glitch/packs/public.js)12
-rw-r--r--app/javascript/flavours/glitch/packs/share.js (renamed from app/javascript/themes/glitch/packs/share.js)6
-rw-r--r--app/javascript/flavours/glitch/reducers/accounts.js (renamed from app/javascript/themes/glitch/reducers/accounts.js)24
-rw-r--r--app/javascript/flavours/glitch/reducers/accounts_counters.js (renamed from app/javascript/themes/glitch/reducers/accounts_counters.js)22
-rw-r--r--app/javascript/flavours/glitch/reducers/alerts.js (renamed from app/javascript/themes/glitch/reducers/alerts.js)2
-rw-r--r--app/javascript/flavours/glitch/reducers/cards.js (renamed from app/javascript/themes/glitch/reducers/cards.js)2
-rw-r--r--app/javascript/flavours/glitch/reducers/compose.js (renamed from app/javascript/themes/glitch/reducers/compose.js)10
-rw-r--r--app/javascript/flavours/glitch/reducers/contexts.js (renamed from app/javascript/themes/glitch/reducers/contexts.js)4
-rw-r--r--app/javascript/flavours/glitch/reducers/custom_emojis.js (renamed from app/javascript/themes/glitch/reducers/custom_emojis.js)6
-rw-r--r--app/javascript/flavours/glitch/reducers/height_cache.js (renamed from app/javascript/themes/glitch/reducers/height_cache.js)2
-rw-r--r--app/javascript/flavours/glitch/reducers/index.js (renamed from app/javascript/themes/glitch/reducers/index.js)0
-rw-r--r--app/javascript/flavours/glitch/reducers/local_settings.js (renamed from app/javascript/themes/glitch/reducers/local_settings.js)4
-rw-r--r--app/javascript/flavours/glitch/reducers/media_attachments.js (renamed from app/javascript/themes/glitch/reducers/media_attachments.js)2
-rw-r--r--app/javascript/flavours/glitch/reducers/meta.js (renamed from app/javascript/themes/glitch/reducers/meta.js)2
-rw-r--r--app/javascript/flavours/glitch/reducers/modal.js (renamed from app/javascript/themes/glitch/reducers/modal.js)2
-rw-r--r--app/javascript/flavours/glitch/reducers/mutes.js (renamed from app/javascript/themes/glitch/reducers/mutes.js)2
-rw-r--r--app/javascript/flavours/glitch/reducers/notifications.js (renamed from app/javascript/themes/glitch/reducers/notifications.js)6
-rw-r--r--app/javascript/flavours/glitch/reducers/push_notifications.js (renamed from app/javascript/themes/glitch/reducers/push_notifications.js)4
-rw-r--r--app/javascript/flavours/glitch/reducers/relationships.js (renamed from app/javascript/themes/glitch/reducers/relationships.js)4
-rw-r--r--app/javascript/flavours/glitch/reducers/reports.js (renamed from app/javascript/themes/glitch/reducers/reports.js)2
-rw-r--r--app/javascript/flavours/glitch/reducers/search.js (renamed from app/javascript/themes/glitch/reducers/search.js)4
-rw-r--r--app/javascript/flavours/glitch/reducers/settings.js (renamed from app/javascript/themes/glitch/reducers/settings.js)10
-rw-r--r--app/javascript/flavours/glitch/reducers/status_lists.js (renamed from app/javascript/themes/glitch/reducers/status_lists.js)6
-rw-r--r--app/javascript/flavours/glitch/reducers/statuses.js (renamed from app/javascript/themes/glitch/reducers/statuses.js)18
-rw-r--r--app/javascript/flavours/glitch/reducers/timelines.js (renamed from app/javascript/themes/glitch/reducers/timelines.js)4
-rw-r--r--app/javascript/flavours/glitch/reducers/user_lists.js (renamed from app/javascript/themes/glitch/reducers/user_lists.js)8
-rw-r--r--app/javascript/flavours/glitch/selectors/index.js (renamed from app/javascript/themes/glitch/selectors/index.js)0
-rw-r--r--app/javascript/flavours/glitch/service_worker/entry.js (renamed from app/javascript/themes/glitch/service_worker/entry.js)0
-rw-r--r--app/javascript/flavours/glitch/service_worker/web_push_notifications.js (renamed from app/javascript/themes/glitch/service_worker/web_push_notifications.js)0
-rw-r--r--app/javascript/flavours/glitch/store/configureStore.js (renamed from app/javascript/themes/glitch/store/configureStore.js)0
-rw-r--r--app/javascript/flavours/glitch/styles/_mixins.scss (renamed from app/javascript/themes/glitch/styles/_mixins.scss)0
-rw-r--r--app/javascript/flavours/glitch/styles/about.scss (renamed from app/javascript/themes/glitch/styles/about.scss)0
-rw-r--r--app/javascript/flavours/glitch/styles/accounts.scss (renamed from app/javascript/themes/glitch/styles/accounts.scss)0
-rw-r--r--app/javascript/flavours/glitch/styles/admin.scss (renamed from app/javascript/themes/glitch/styles/admin.scss)0
-rw-r--r--app/javascript/flavours/glitch/styles/basics.scss (renamed from app/javascript/themes/glitch/styles/basics.scss)0
-rw-r--r--app/javascript/flavours/glitch/styles/boost.scss (renamed from app/javascript/themes/glitch/styles/boost.scss)0
-rw-r--r--app/javascript/flavours/glitch/styles/compact_header.scss (renamed from app/javascript/themes/glitch/styles/compact_header.scss)0
-rw-r--r--app/javascript/flavours/glitch/styles/components.scss (renamed from app/javascript/themes/glitch/styles/components.scss)0
-rw-r--r--app/javascript/flavours/glitch/styles/containers.scss (renamed from app/javascript/themes/glitch/styles/containers.scss)0
-rw-r--r--app/javascript/flavours/glitch/styles/doodle.scss (renamed from app/javascript/themes/glitch/styles/doodle.scss)0
-rw-r--r--app/javascript/flavours/glitch/styles/emoji_picker.scss (renamed from app/javascript/themes/glitch/styles/emoji_picker.scss)0
-rw-r--r--app/javascript/flavours/glitch/styles/footer.scss (renamed from app/javascript/themes/glitch/styles/footer.scss)0
-rw-r--r--app/javascript/flavours/glitch/styles/forms.scss (renamed from app/javascript/themes/glitch/styles/forms.scss)0
-rw-r--r--app/javascript/flavours/glitch/styles/index.scss (renamed from app/javascript/themes/glitch/styles/index.scss)0
-rw-r--r--app/javascript/flavours/glitch/styles/landing_strip.scss (renamed from app/javascript/themes/glitch/styles/landing_strip.scss)0
-rw-r--r--app/javascript/flavours/glitch/styles/lists.scss (renamed from app/javascript/themes/glitch/styles/lists.scss)0
-rw-r--r--app/javascript/flavours/glitch/styles/reset copy.scss (renamed from app/javascript/themes/glitch/styles/reset copy.scss)0
-rw-r--r--app/javascript/flavours/glitch/styles/reset.scss (renamed from app/javascript/themes/glitch/styles/reset.scss)0
-rw-r--r--app/javascript/flavours/glitch/styles/rtl.scss (renamed from app/javascript/themes/glitch/styles/rtl.scss)0
-rw-r--r--app/javascript/flavours/glitch/styles/stream_entries.scss (renamed from app/javascript/themes/glitch/styles/stream_entries.scss)0
-rw-r--r--app/javascript/flavours/glitch/styles/tables.scss (renamed from app/javascript/themes/glitch/styles/tables.scss)0
-rw-r--r--app/javascript/flavours/glitch/styles/variables.scss (renamed from app/javascript/themes/glitch/styles/variables.scss)0
-rw-r--r--app/javascript/flavours/glitch/theme.yml (renamed from app/javascript/themes/glitch/theme.yml)8
-rw-r--r--app/javascript/flavours/glitch/util/api.js (renamed from app/javascript/themes/glitch/util/api.js)0
-rw-r--r--app/javascript/flavours/glitch/util/async-components.js115
-rw-r--r--app/javascript/flavours/glitch/util/base_polyfills.js (renamed from app/javascript/themes/glitch/util/base_polyfills.js)0
-rw-r--r--app/javascript/flavours/glitch/util/bio_metadata.js (renamed from app/javascript/themes/glitch/util/bio_metadata.js)0
-rw-r--r--app/javascript/flavours/glitch/util/counter.js (renamed from app/javascript/themes/glitch/util/counter.js)0
-rw-r--r--app/javascript/flavours/glitch/util/emoji/emoji_compressed.js (renamed from app/javascript/themes/glitch/util/emoji/emoji_compressed.js)0
-rw-r--r--app/javascript/flavours/glitch/util/emoji/emoji_map.json (renamed from app/javascript/themes/glitch/util/emoji/emoji_map.json)0
-rw-r--r--app/javascript/flavours/glitch/util/emoji/emoji_mart_data_light.js (renamed from app/javascript/themes/glitch/util/emoji/emoji_mart_data_light.js)0
-rw-r--r--app/javascript/flavours/glitch/util/emoji/emoji_mart_search_light.js (renamed from app/javascript/themes/glitch/util/emoji/emoji_mart_search_light.js)0
-rw-r--r--app/javascript/flavours/glitch/util/emoji/emoji_picker.js (renamed from app/javascript/themes/glitch/util/emoji/emoji_picker.js)0
-rw-r--r--app/javascript/flavours/glitch/util/emoji/emoji_unicode_mapping_light.js (renamed from app/javascript/themes/glitch/util/emoji/emoji_unicode_mapping_light.js)0
-rw-r--r--app/javascript/flavours/glitch/util/emoji/emoji_utils.js (renamed from app/javascript/themes/glitch/util/emoji/emoji_utils.js)0
-rw-r--r--app/javascript/flavours/glitch/util/emoji/index.js (renamed from app/javascript/themes/glitch/util/emoji/index.js)2
-rw-r--r--app/javascript/flavours/glitch/util/emoji/unicode_to_filename.js (renamed from app/javascript/themes/glitch/util/emoji/unicode_to_filename.js)0
-rw-r--r--app/javascript/flavours/glitch/util/emoji/unicode_to_unified_name.js (renamed from app/javascript/themes/glitch/util/emoji/unicode_to_unified_name.js)0
-rw-r--r--app/javascript/flavours/glitch/util/extra_polyfills.js (renamed from app/javascript/themes/glitch/util/extra_polyfills.js)0
-rw-r--r--app/javascript/flavours/glitch/util/fullscreen.js (renamed from app/javascript/themes/glitch/util/fullscreen.js)0
-rw-r--r--app/javascript/flavours/glitch/util/get_rect_from_entry.js (renamed from app/javascript/themes/glitch/util/get_rect_from_entry.js)0
-rw-r--r--app/javascript/flavours/glitch/util/initial_state.js (renamed from app/javascript/themes/glitch/util/initial_state.js)0
-rw-r--r--app/javascript/flavours/glitch/util/intersection_observer_wrapper.js (renamed from app/javascript/themes/glitch/util/intersection_observer_wrapper.js)0
-rw-r--r--app/javascript/flavours/glitch/util/is_mobile.js (renamed from app/javascript/themes/glitch/util/is_mobile.js)0
-rw-r--r--app/javascript/flavours/glitch/util/link_header.js (renamed from app/javascript/themes/glitch/util/link_header.js)0
-rw-r--r--app/javascript/flavours/glitch/util/load_polyfills.js (renamed from app/javascript/themes/glitch/util/load_polyfills.js)0
-rw-r--r--app/javascript/flavours/glitch/util/main.js (renamed from app/javascript/themes/glitch/util/main.js)2
-rw-r--r--app/javascript/flavours/glitch/util/optional_motion.js (renamed from app/javascript/themes/glitch/util/optional_motion.js)2
-rw-r--r--app/javascript/flavours/glitch/util/performance.js (renamed from app/javascript/themes/glitch/util/performance.js)0
-rw-r--r--app/javascript/flavours/glitch/util/react_router_helpers.js (renamed from app/javascript/themes/glitch/util/react_router_helpers.js)6
-rw-r--r--app/javascript/flavours/glitch/util/ready.js (renamed from app/javascript/themes/glitch/util/ready.js)0
-rw-r--r--app/javascript/flavours/glitch/util/reduced_motion.js (renamed from app/javascript/themes/glitch/util/reduced_motion.js)0
-rw-r--r--app/javascript/flavours/glitch/util/rtl.js (renamed from app/javascript/themes/glitch/util/rtl.js)0
-rw-r--r--app/javascript/flavours/glitch/util/schedule_idle_task.js (renamed from app/javascript/themes/glitch/util/schedule_idle_task.js)0
-rw-r--r--app/javascript/flavours/glitch/util/scroll.js (renamed from app/javascript/themes/glitch/util/scroll.js)0
-rw-r--r--app/javascript/flavours/glitch/util/stream.js (renamed from app/javascript/themes/glitch/util/stream.js)0
-rw-r--r--app/javascript/flavours/glitch/util/url_regex.js (renamed from app/javascript/themes/glitch/util/url_regex.js)0
-rw-r--r--app/javascript/flavours/glitch/util/uuid.js (renamed from app/javascript/themes/glitch/util/uuid.js)0
-rw-r--r--app/javascript/flavours/glitch/util/web_push_subscription.js (renamed from app/javascript/themes/glitch/util/web_push_subscription.js)4
-rw-r--r--app/javascript/flavours/vanilla/theme.yml (renamed from app/javascript/themes/vanilla/theme.yml)0
-rw-r--r--app/javascript/themes/glitch/features/generic_not_found/index.js11
-rw-r--r--app/javascript/themes/glitch/features/standalone/compose/index.js20
-rw-r--r--app/javascript/themes/glitch/packs/common.js1
-rw-r--r--app/javascript/themes/glitch/packs/home.js7
-rw-r--r--app/javascript/themes/glitch/util/async-components.js115
m---------app/javascript/themes/mastodon-go0
-rw-r--r--app/lib/themes.rb6
-rw-r--r--app/models/user.rb2
-rw-r--r--app/views/layouts/_theme.html.haml6
-rw-r--r--app/views/settings/preferences/show.html.haml2
-rw-r--r--config/locales/simple_form.en.yml6
-rw-r--r--config/settings.yml2
-rw-r--r--config/webpack/configuration.js22
-rw-r--r--config/webpack/shared.js6
313 files changed, 665 insertions, 680 deletions
diff --git a/.gitmodules b/.gitmodules
index 35b0cd787..e69de29bb 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,3 +0,0 @@
-[submodule "app/javascript/themes/mastodon-go"]
-	path = app/javascript/themes/mastodon-go
-	url = https://github.com/marrus-sh/mastodon-go
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index f5753963d..d116c4767 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -12,7 +12,7 @@ class ApplicationController < ActionController::Base
 
   helper_method :current_account
   helper_method :current_session
-  helper_method :current_theme
+  helper_method :current_flavour
   helper_method :current_skin
   helper_method :single_user_mode?
 
@@ -57,8 +57,8 @@ class ApplicationController < ActionController::Base
   def pack(data, pack_name, skin = 'default')
     return nil unless pack?(data, pack_name)
     pack_data = {
-      common: pack_name == 'common' ? nil : resolve_pack(data['name'] ? Themes.instance.get(current_theme) : Themes.instance.core, 'common'),
-      name: data['name'],
+      common: pack_name == 'common' ? nil : resolve_pack(data['name'] ? Themes.instance.flavour(current_flavour) : Themes.instance.core, 'common'),
+      flavour: data['name'],
       pack: pack_name,
       preload: nil,
       skin: nil,
@@ -88,8 +88,8 @@ class ApplicationController < ActionController::Base
 
   def nil_pack(data, pack_name, skin = 'default')
     {
-      common: pack_name == 'common' ? nil : resolve_pack(data['name'] ? Themes.instance.get(current_theme) : Themes.instance.core, 'common', skin),
-      name: data['name'],
+      common: pack_name == 'common' ? nil : resolve_pack(data['name'] ? Themes.instance.flavour(current_flavour) : Themes.instance.core, 'common', skin),
+      flavour: data['name'],
       pack: nil,
       preload: nil,
       skin: nil,
@@ -102,23 +102,23 @@ class ApplicationController < ActionController::Base
       if data['name'] && data.key?('fallback')
         if data['fallback'].nil?
           return nil_pack(data, pack_name, skin)
-        elsif data['fallback'].is_a?(String) && Themes.instance.get(data['fallback'])
-          return resolve_pack(Themes.instance.get(data['fallback']), pack_name, skin)
+        elsif data['fallback'].is_a?(String) && Themes.instance.flavour(data['fallback'])
+          return resolve_pack(Themes.instance.flavour(data['fallback']), pack_name, skin)
         elsif data['fallback'].is_a?(Array)
           data['fallback'].each do |fallback|
-            return resolve_pack(Themes.instance.get(fallback), pack_name, skin) if Themes.instance.get(fallback)
+            return resolve_pack(Themes.instance.flavour(fallback), pack_name, skin) if Themes.instance.flavour(fallback)
           end
         end
         return nil_pack(data, pack_name, skin)
       end
-      return data.key?('name') && data['name'] != default_theme ? resolve_pack(Themes.instance.get(default_theme), pack_name, skin) : nil_pack(data, pack_name, skin)
+      return data.key?('name') && data['name'] != Setting.default_settings['flavour'] ? resolve_pack(Themes.instance.flavour(Setting.default_settings['flavour']), pack_name, skin) : nil_pack(data, pack_name, skin)
     end
     result
   end
 
   def use_pack(pack_name)
     @core = resolve_pack(Themes.instance.core, pack_name)
-    @theme = resolve_pack(Themes.instance.get(current_theme), pack_name, current_skin)
+    @theme = resolve_pack(Themes.instance.flavour(current_flavour), pack_name, current_skin)
   end
 
   protected
@@ -151,21 +151,13 @@ class ApplicationController < ActionController::Base
     @current_session ||= SessionActivation.find_by(session_id: cookies.signed['_session_id'])
   end
 
-  def default_theme
-    Setting.default_settings['theme']
-  end
-
-  def current_theme
-    return default_theme unless Themes.instance.names.include? current_user&.setting_theme
-    current_user.setting_theme
-  end
-
-  def default_skin
-    'default'
+  def current_flavour
+    return Setting.default_settings['flavour'] unless Themes.instance.flavours.include? current_user&.setting_flavour
+    current_user.setting_flavour
   end
 
   def current_skin
-    return default_skin unless Themes.instance.skins_for(current_theme).include? current_user&.setting_skin
+    return 'default' unless Themes.instance.skins_for(current_flavour).include? current_user&.setting_skin
     current_user.setting_skin
   end
 
diff --git a/app/javascript/core/settings.js b/app/javascript/core/settings.js
index bc5f9ed1d..1e4bb4ced 100644
--- a/app/javascript/core/settings.js
+++ b/app/javascript/core/settings.js
@@ -3,7 +3,7 @@
 const { length } = require('stringz');
 const { delegate } = require('rails-ujs');
 
-import { processBio } from 'themes/glitch/util/bio_metadata';
+import { processBio } from 'flavours/glitch/util/bio_metadata';
 
 delegate(document, '.account_display_name', 'input', ({ target }) => {
   const nameCounter = document.querySelector('.name-counter');
diff --git a/app/javascript/themes/glitch/actions/accounts.js b/app/javascript/flavours/glitch/actions/accounts.js
index f1a8c5471..8ab92f9e7 100644
--- a/app/javascript/themes/glitch/actions/accounts.js
+++ b/app/javascript/flavours/glitch/actions/accounts.js
@@ -1,4 +1,4 @@
-import api, { getLinks } from 'themes/glitch/util/api';
+import api, { getLinks } from 'flavours/glitch/util/api';
 
 export const ACCOUNT_FETCH_REQUEST = 'ACCOUNT_FETCH_REQUEST';
 export const ACCOUNT_FETCH_SUCCESS = 'ACCOUNT_FETCH_SUCCESS';
diff --git a/app/javascript/themes/glitch/actions/alerts.js b/app/javascript/flavours/glitch/actions/alerts.js
index f37fdeeb6..f37fdeeb6 100644
--- a/app/javascript/themes/glitch/actions/alerts.js
+++ b/app/javascript/flavours/glitch/actions/alerts.js
diff --git a/app/javascript/themes/glitch/actions/blocks.js b/app/javascript/flavours/glitch/actions/blocks.js
index 6ba9460f0..fe44ca19a 100644
--- a/app/javascript/themes/glitch/actions/blocks.js
+++ b/app/javascript/flavours/glitch/actions/blocks.js
@@ -1,4 +1,4 @@
-import api, { getLinks } from 'themes/glitch/util/api';
+import api, { getLinks } from 'flavours/glitch/util/api';
 import { fetchRelationships } from './accounts';
 
 export const BLOCKS_FETCH_REQUEST = 'BLOCKS_FETCH_REQUEST';
diff --git a/app/javascript/themes/glitch/actions/bundles.js b/app/javascript/flavours/glitch/actions/bundles.js
index ecc9c8f7d..ecc9c8f7d 100644
--- a/app/javascript/themes/glitch/actions/bundles.js
+++ b/app/javascript/flavours/glitch/actions/bundles.js
diff --git a/app/javascript/themes/glitch/actions/cards.js b/app/javascript/flavours/glitch/actions/cards.js
index 2a1bc369a..c897daf58 100644
--- a/app/javascript/themes/glitch/actions/cards.js
+++ b/app/javascript/flavours/glitch/actions/cards.js
@@ -1,4 +1,4 @@
-import api from 'themes/glitch/util/api';
+import api from 'flavours/glitch/util/api';
 
 export const STATUS_CARD_FETCH_REQUEST = 'STATUS_CARD_FETCH_REQUEST';
 export const STATUS_CARD_FETCH_SUCCESS = 'STATUS_CARD_FETCH_SUCCESS';
diff --git a/app/javascript/themes/glitch/actions/columns.js b/app/javascript/flavours/glitch/actions/columns.js
index bcb0cdf98..bcb0cdf98 100644
--- a/app/javascript/themes/glitch/actions/columns.js
+++ b/app/javascript/flavours/glitch/actions/columns.js
diff --git a/app/javascript/themes/glitch/actions/compose.js b/app/javascript/flavours/glitch/actions/compose.js
index 07c469477..32746f27b 100644
--- a/app/javascript/themes/glitch/actions/compose.js
+++ b/app/javascript/flavours/glitch/actions/compose.js
@@ -1,6 +1,6 @@
-import api from 'themes/glitch/util/api';
+import api from 'flavours/glitch/util/api';
 import { throttle } from 'lodash';
-import { search as emojiSearch } from 'themes/glitch/util/emoji/emoji_mart_search_light';
+import { search as emojiSearch } from 'flavours/glitch/util/emoji/emoji_mart_search_light';
 import { useEmoji } from './emojis';
 
 import {
diff --git a/app/javascript/themes/glitch/actions/domain_blocks.js b/app/javascript/flavours/glitch/actions/domain_blocks.js
index 0a880394a..8506df91c 100644
--- a/app/javascript/themes/glitch/actions/domain_blocks.js
+++ b/app/javascript/flavours/glitch/actions/domain_blocks.js
@@ -1,4 +1,4 @@
-import api, { getLinks } from 'themes/glitch/util/api';
+import api, { getLinks } from 'flavours/glitch/util/api';
 
 export const DOMAIN_BLOCK_REQUEST = 'DOMAIN_BLOCK_REQUEST';
 export const DOMAIN_BLOCK_SUCCESS = 'DOMAIN_BLOCK_SUCCESS';
diff --git a/app/javascript/themes/glitch/actions/emojis.js b/app/javascript/flavours/glitch/actions/emojis.js
index 7cd9d4b7b..7cd9d4b7b 100644
--- a/app/javascript/themes/glitch/actions/emojis.js
+++ b/app/javascript/flavours/glitch/actions/emojis.js
diff --git a/app/javascript/themes/glitch/actions/favourites.js b/app/javascript/flavours/glitch/actions/favourites.js
index e9b3559af..decdcee4f 100644
--- a/app/javascript/themes/glitch/actions/favourites.js
+++ b/app/javascript/flavours/glitch/actions/favourites.js
@@ -1,4 +1,4 @@
-import api, { getLinks } from 'themes/glitch/util/api';
+import api, { getLinks } from 'flavours/glitch/util/api';
 
 export const FAVOURITED_STATUSES_FETCH_REQUEST = 'FAVOURITED_STATUSES_FETCH_REQUEST';
 export const FAVOURITED_STATUSES_FETCH_SUCCESS = 'FAVOURITED_STATUSES_FETCH_SUCCESS';
diff --git a/app/javascript/themes/glitch/actions/height_cache.js b/app/javascript/flavours/glitch/actions/height_cache.js
index 4c752993f..4c752993f 100644
--- a/app/javascript/themes/glitch/actions/height_cache.js
+++ b/app/javascript/flavours/glitch/actions/height_cache.js
diff --git a/app/javascript/themes/glitch/actions/interactions.js b/app/javascript/flavours/glitch/actions/interactions.js
index d61a7ba2a..ceeb2773b 100644
--- a/app/javascript/themes/glitch/actions/interactions.js
+++ b/app/javascript/flavours/glitch/actions/interactions.js
@@ -1,4 +1,4 @@
-import api from 'themes/glitch/util/api';
+import api from 'flavours/glitch/util/api';
 
 export const REBLOG_REQUEST = 'REBLOG_REQUEST';
 export const REBLOG_SUCCESS = 'REBLOG_SUCCESS';
diff --git a/app/javascript/themes/glitch/actions/local_settings.js b/app/javascript/flavours/glitch/actions/local_settings.js
index 28660a4e8..28660a4e8 100644
--- a/app/javascript/themes/glitch/actions/local_settings.js
+++ b/app/javascript/flavours/glitch/actions/local_settings.js
diff --git a/app/javascript/themes/glitch/actions/modal.js b/app/javascript/flavours/glitch/actions/modal.js
index 80e15c28e..80e15c28e 100644
--- a/app/javascript/themes/glitch/actions/modal.js
+++ b/app/javascript/flavours/glitch/actions/modal.js
diff --git a/app/javascript/themes/glitch/actions/mutes.js b/app/javascript/flavours/glitch/actions/mutes.js
index bb19e8657..e06130533 100644
--- a/app/javascript/themes/glitch/actions/mutes.js
+++ b/app/javascript/flavours/glitch/actions/mutes.js
@@ -1,6 +1,6 @@
-import api, { getLinks } from 'themes/glitch/util/api';
+import api, { getLinks } from 'flavours/glitch/util/api';
 import { fetchRelationships } from './accounts';
-import { openModal } from 'themes/glitch/actions/modal';
+import { openModal } from 'flavours/glitch/actions/modal';
 
 export const MUTES_FETCH_REQUEST = 'MUTES_FETCH_REQUEST';
 export const MUTES_FETCH_SUCCESS = 'MUTES_FETCH_SUCCESS';
diff --git a/app/javascript/themes/glitch/actions/notifications.js b/app/javascript/flavours/glitch/actions/notifications.js
index fbf06f7c4..9b9ebf86d 100644
--- a/app/javascript/themes/glitch/actions/notifications.js
+++ b/app/javascript/flavours/glitch/actions/notifications.js
@@ -1,4 +1,4 @@
-import api, { getLinks } from 'themes/glitch/util/api';
+import api, { getLinks } from 'flavours/glitch/util/api';
 import { List as ImmutableList } from 'immutable';
 import IntlMessageFormat from 'intl-messageformat';
 import { fetchRelationships } from './accounts';
diff --git a/app/javascript/themes/glitch/actions/onboarding.js b/app/javascript/flavours/glitch/actions/onboarding.js
index a161c50ef..a161c50ef 100644
--- a/app/javascript/themes/glitch/actions/onboarding.js
+++ b/app/javascript/flavours/glitch/actions/onboarding.js
diff --git a/app/javascript/themes/glitch/actions/pin_statuses.js b/app/javascript/flavours/glitch/actions/pin_statuses.js
index b3e064e58..d3d1a154f 100644
--- a/app/javascript/themes/glitch/actions/pin_statuses.js
+++ b/app/javascript/flavours/glitch/actions/pin_statuses.js
@@ -1,10 +1,10 @@
-import api from 'themes/glitch/util/api';
+import api from 'flavours/glitch/util/api';
 
 export const PINNED_STATUSES_FETCH_REQUEST = 'PINNED_STATUSES_FETCH_REQUEST';
 export const PINNED_STATUSES_FETCH_SUCCESS = 'PINNED_STATUSES_FETCH_SUCCESS';
 export const PINNED_STATUSES_FETCH_FAIL = 'PINNED_STATUSES_FETCH_FAIL';
 
-import { me } from 'themes/glitch/util/initial_state';
+import { me } from 'flavours/glitch/util/initial_state';
 
 export function fetchPinnedStatuses() {
   return (dispatch, getState) => {
diff --git a/app/javascript/themes/glitch/actions/push_notifications.js b/app/javascript/flavours/glitch/actions/push_notifications.js
index 55661d2b0..55661d2b0 100644
--- a/app/javascript/themes/glitch/actions/push_notifications.js
+++ b/app/javascript/flavours/glitch/actions/push_notifications.js
diff --git a/app/javascript/themes/glitch/actions/reports.js b/app/javascript/flavours/glitch/actions/reports.js
index 93f9085b2..ad4fd18a9 100644
--- a/app/javascript/themes/glitch/actions/reports.js
+++ b/app/javascript/flavours/glitch/actions/reports.js
@@ -1,4 +1,4 @@
-import api from 'themes/glitch/util/api';
+import api from 'flavours/glitch/util/api';
 import { openModal, closeModal } from './modal';
 
 export const REPORT_INIT   = 'REPORT_INIT';
diff --git a/app/javascript/themes/glitch/actions/search.js b/app/javascript/flavours/glitch/actions/search.js
index 414e4755e..e86bd848e 100644
--- a/app/javascript/themes/glitch/actions/search.js
+++ b/app/javascript/flavours/glitch/actions/search.js
@@ -1,4 +1,4 @@
-import api from 'themes/glitch/util/api';
+import api from 'flavours/glitch/util/api';
 
 export const SEARCH_CHANGE = 'SEARCH_CHANGE';
 export const SEARCH_CLEAR  = 'SEARCH_CLEAR';
diff --git a/app/javascript/themes/glitch/actions/settings.js b/app/javascript/flavours/glitch/actions/settings.js
index 79adca18c..79adca18c 100644
--- a/app/javascript/themes/glitch/actions/settings.js
+++ b/app/javascript/flavours/glitch/actions/settings.js
diff --git a/app/javascript/themes/glitch/actions/statuses.js b/app/javascript/flavours/glitch/actions/statuses.js
index 702f4e9b6..8b49083ac 100644
--- a/app/javascript/themes/glitch/actions/statuses.js
+++ b/app/javascript/flavours/glitch/actions/statuses.js
@@ -1,4 +1,4 @@
-import api from 'themes/glitch/util/api';
+import api from 'flavours/glitch/util/api';
 
 import { deleteFromTimelines } from './timelines';
 import { fetchStatusCard } from './cards';
diff --git a/app/javascript/themes/glitch/actions/store.js b/app/javascript/flavours/glitch/actions/store.js
index a1db0fdd5..a1db0fdd5 100644
--- a/app/javascript/themes/glitch/actions/store.js
+++ b/app/javascript/flavours/glitch/actions/store.js
diff --git a/app/javascript/themes/glitch/actions/streaming.js b/app/javascript/flavours/glitch/actions/streaming.js
index ccf6c27d8..595eefa41 100644
--- a/app/javascript/themes/glitch/actions/streaming.js
+++ b/app/javascript/flavours/glitch/actions/streaming.js
@@ -1,4 +1,4 @@
-import { connectStream } from 'themes/glitch/util/stream';
+import { connectStream } from 'flavours/glitch/util/stream';
 import {
   updateTimeline,
   deleteFromTimelines,
diff --git a/app/javascript/themes/glitch/actions/timelines.js b/app/javascript/flavours/glitch/actions/timelines.js
index 5ce14fbe9..3fabf3885 100644
--- a/app/javascript/themes/glitch/actions/timelines.js
+++ b/app/javascript/flavours/glitch/actions/timelines.js
@@ -1,4 +1,4 @@
-import api, { getLinks } from 'themes/glitch/util/api';
+import api, { getLinks } from 'flavours/glitch/util/api';
 import { Map as ImmutableMap, List as ImmutableList } from 'immutable';
 
 export const TIMELINE_UPDATE  = 'TIMELINE_UPDATE';
diff --git a/app/javascript/themes/glitch/components/account.js b/app/javascript/flavours/glitch/components/account.js
index d0ff77050..c8dacb0ab 100644
--- a/app/javascript/themes/glitch/components/account.js
+++ b/app/javascript/flavours/glitch/components/account.js
@@ -7,7 +7,7 @@ import Permalink from './permalink';
 import IconButton from './icon_button';
 import { defineMessages, injectIntl } from 'react-intl';
 import ImmutablePureComponent from 'react-immutable-pure-component';
-import { me } from 'themes/glitch/util/initial_state';
+import { me } from 'flavours/glitch/util/initial_state';
 
 const messages = defineMessages({
   follow: { id: 'account.follow', defaultMessage: 'Follow' },
diff --git a/app/javascript/themes/glitch/components/attachment_list.js b/app/javascript/flavours/glitch/components/attachment_list.js
index b3d00b335..b3d00b335 100644
--- a/app/javascript/themes/glitch/components/attachment_list.js
+++ b/app/javascript/flavours/glitch/components/attachment_list.js
diff --git a/app/javascript/themes/glitch/components/autosuggest_emoji.js b/app/javascript/flavours/glitch/components/autosuggest_emoji.js
index 3c6f915e4..79e113d9c 100644
--- a/app/javascript/themes/glitch/components/autosuggest_emoji.js
+++ b/app/javascript/flavours/glitch/components/autosuggest_emoji.js
@@ -1,6 +1,6 @@
 import React from 'react';
 import PropTypes from 'prop-types';
-import unicodeMapping from 'themes/glitch/util/emoji/emoji_unicode_mapping_light';
+import unicodeMapping from 'flavours/glitch/util/emoji/emoji_unicode_mapping_light';
 
 const assetHost = process.env.CDN_HOST || '';
 
diff --git a/app/javascript/themes/glitch/components/autosuggest_textarea.js b/app/javascript/flavours/glitch/components/autosuggest_textarea.js
index fa93847a2..551528e5a 100644
--- a/app/javascript/themes/glitch/components/autosuggest_textarea.js
+++ b/app/javascript/flavours/glitch/components/autosuggest_textarea.js
@@ -1,9 +1,9 @@
 import React from 'react';
-import AutosuggestAccountContainer from 'themes/glitch/features/compose/containers/autosuggest_account_container';
+import AutosuggestAccountContainer from 'flavours/glitch/features/compose/containers/autosuggest_account_container';
 import AutosuggestEmoji from './autosuggest_emoji';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import PropTypes from 'prop-types';
-import { isRtl } from 'themes/glitch/util/rtl';
+import { isRtl } from 'flavours/glitch/util/rtl';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 import Textarea from 'react-textarea-autosize';
 import classNames from 'classnames';
diff --git a/app/javascript/themes/glitch/components/avatar.js b/app/javascript/flavours/glitch/components/avatar.js
index dd155f059..dd155f059 100644
--- a/app/javascript/themes/glitch/components/avatar.js
+++ b/app/javascript/flavours/glitch/components/avatar.js
diff --git a/app/javascript/themes/glitch/components/avatar_overlay.js b/app/javascript/flavours/glitch/components/avatar_overlay.js
index 2ecf9fa44..2ecf9fa44 100644
--- a/app/javascript/themes/glitch/components/avatar_overlay.js
+++ b/app/javascript/flavours/glitch/components/avatar_overlay.js
diff --git a/app/javascript/themes/glitch/components/button.js b/app/javascript/flavours/glitch/components/button.js
index 16868010c..16868010c 100644
--- a/app/javascript/themes/glitch/components/button.js
+++ b/app/javascript/flavours/glitch/components/button.js
diff --git a/app/javascript/themes/glitch/components/collapsable.js b/app/javascript/flavours/glitch/components/collapsable.js
index 8bc0a54f4..fe125a729 100644
--- a/app/javascript/themes/glitch/components/collapsable.js
+++ b/app/javascript/flavours/glitch/components/collapsable.js
@@ -1,5 +1,5 @@
 import React from 'react';
-import Motion from 'themes/glitch/util/optional_motion';
+import Motion from 'flavours/glitch/util/optional_motion';
 import spring from 'react-motion/lib/spring';
 import PropTypes from 'prop-types';
 
diff --git a/app/javascript/themes/glitch/components/column.js b/app/javascript/flavours/glitch/components/column.js
index adeba9cc1..57c4c7a40 100644
--- a/app/javascript/themes/glitch/components/column.js
+++ b/app/javascript/flavours/glitch/components/column.js
@@ -1,7 +1,7 @@
 import React from 'react';
 import PropTypes from 'prop-types';
 import detectPassiveEvents from 'detect-passive-events';
-import { scrollTop } from 'themes/glitch/util/scroll';
+import { scrollTop } from 'flavours/glitch/util/scroll';
 
 export default class Column extends React.PureComponent {
 
diff --git a/app/javascript/themes/glitch/components/column_back_button.js b/app/javascript/flavours/glitch/components/column_back_button.js
index 50c3bf11f..50c3bf11f 100644
--- a/app/javascript/themes/glitch/components/column_back_button.js
+++ b/app/javascript/flavours/glitch/components/column_back_button.js
diff --git a/app/javascript/themes/glitch/components/column_back_button_slim.js b/app/javascript/flavours/glitch/components/column_back_button_slim.js
index 2cdf1b25b..2cdf1b25b 100644
--- a/app/javascript/themes/glitch/components/column_back_button_slim.js
+++ b/app/javascript/flavours/glitch/components/column_back_button_slim.js
diff --git a/app/javascript/themes/glitch/components/column_header.js b/app/javascript/flavours/glitch/components/column_header.js
index e601082c8..ae90b6f81 100644
--- a/app/javascript/themes/glitch/components/column_header.js
+++ b/app/javascript/flavours/glitch/components/column_header.js
@@ -4,8 +4,7 @@ import classNames from 'classnames';
 import { defineMessages, FormattedMessage, injectIntl } from 'react-intl';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 
-// Glitch imports
-import NotificationPurgeButtonsContainer from 'themes/glitch/containers/notification_purge_buttons_container';
+import NotificationPurgeButtonsContainer from 'flavours/glitch/containers/notification_purge_buttons_container';
 
 const messages = defineMessages({
   show: { id: 'column_header.show_settings', defaultMessage: 'Show settings' },
diff --git a/app/javascript/themes/glitch/components/display_name.js b/app/javascript/flavours/glitch/components/display_name.js
index 2cf84f8f4..2cf84f8f4 100644
--- a/app/javascript/themes/glitch/components/display_name.js
+++ b/app/javascript/flavours/glitch/components/display_name.js
diff --git a/app/javascript/themes/glitch/components/dropdown_menu.js b/app/javascript/flavours/glitch/components/dropdown_menu.js
index d30dc2aaf..d4a886a8b 100644
--- a/app/javascript/themes/glitch/components/dropdown_menu.js
+++ b/app/javascript/flavours/glitch/components/dropdown_menu.js
@@ -3,7 +3,7 @@ import PropTypes from 'prop-types';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import IconButton from './icon_button';
 import Overlay from 'react-overlays/lib/Overlay';
-import Motion from 'themes/glitch/util/optional_motion';
+import Motion from 'flavours/glitch/util/optional_motion';
 import spring from 'react-motion/lib/spring';
 import detectPassiveEvents from 'detect-passive-events';
 
diff --git a/app/javascript/themes/glitch/components/extended_video_player.js b/app/javascript/flavours/glitch/components/extended_video_player.js
index f8bd067e8..f8bd067e8 100644
--- a/app/javascript/themes/glitch/components/extended_video_player.js
+++ b/app/javascript/flavours/glitch/components/extended_video_player.js
diff --git a/app/javascript/themes/glitch/components/icon_button.js b/app/javascript/flavours/glitch/components/icon_button.js
index 31cdf4703..13b91e8a1 100644
--- a/app/javascript/themes/glitch/components/icon_button.js
+++ b/app/javascript/flavours/glitch/components/icon_button.js
@@ -1,5 +1,5 @@
 import React from 'react';
-import Motion from 'themes/glitch/util/optional_motion';
+import Motion from 'flavours/glitch/util/optional_motion';
 import spring from 'react-motion/lib/spring';
 import PropTypes from 'prop-types';
 import classNames from 'classnames';
diff --git a/app/javascript/themes/glitch/components/intersection_observer_article.js b/app/javascript/flavours/glitch/components/intersection_observer_article.js
index f0139ac75..8b06f9a8c 100644
--- a/app/javascript/themes/glitch/components/intersection_observer_article.js
+++ b/app/javascript/flavours/glitch/components/intersection_observer_article.js
@@ -1,7 +1,7 @@
 import React from 'react';
 import PropTypes from 'prop-types';
-import scheduleIdleTask from 'themes/glitch/util/schedule_idle_task';
-import getRectFromEntry from 'themes/glitch/util/get_rect_from_entry';
+import scheduleIdleTask from 'flavours/glitch/util/schedule_idle_task';
+import getRectFromEntry from 'flavours/glitch/util/get_rect_from_entry';
 import { is } from 'immutable';
 
 // Diff these props in the "rendered" state
diff --git a/app/javascript/themes/glitch/components/load_more.js b/app/javascript/flavours/glitch/components/load_more.js
index c4c8c94a2..c4c8c94a2 100644
--- a/app/javascript/themes/glitch/components/load_more.js
+++ b/app/javascript/flavours/glitch/components/load_more.js
diff --git a/app/javascript/themes/glitch/components/loading_indicator.js b/app/javascript/flavours/glitch/components/loading_indicator.js
index d6a5adb6f..d6a5adb6f 100644
--- a/app/javascript/themes/glitch/components/loading_indicator.js
+++ b/app/javascript/flavours/glitch/components/loading_indicator.js
diff --git a/app/javascript/themes/glitch/components/media_gallery.js b/app/javascript/flavours/glitch/components/media_gallery.js
index b6b40c585..d2e80de49 100644
--- a/app/javascript/themes/glitch/components/media_gallery.js
+++ b/app/javascript/flavours/glitch/components/media_gallery.js
@@ -4,9 +4,9 @@ import PropTypes from 'prop-types';
 import { is } from 'immutable';
 import IconButton from './icon_button';
 import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
-import { isIOS } from 'themes/glitch/util/is_mobile';
+import { isIOS } from 'flavours/glitch/util/is_mobile';
 import classNames from 'classnames';
-import { autoPlayGif } from 'themes/glitch/util/initial_state';
+import { autoPlayGif } from 'flavours/glitch/util/initial_state';
 
 const messages = defineMessages({
   toggle_visible: { id: 'media_gallery.toggle_visible', defaultMessage: 'Toggle visibility' },
diff --git a/app/javascript/themes/glitch/components/missing_indicator.js b/app/javascript/flavours/glitch/components/missing_indicator.js
index 87df7f61c..87df7f61c 100644
--- a/app/javascript/themes/glitch/components/missing_indicator.js
+++ b/app/javascript/flavours/glitch/components/missing_indicator.js
diff --git a/app/javascript/themes/glitch/components/notification_purge_buttons.js b/app/javascript/flavours/glitch/components/notification_purge_buttons.js
index e0c1543b0..e0c1543b0 100644
--- a/app/javascript/themes/glitch/components/notification_purge_buttons.js
+++ b/app/javascript/flavours/glitch/components/notification_purge_buttons.js
diff --git a/app/javascript/themes/glitch/components/permalink.js b/app/javascript/flavours/glitch/components/permalink.js
index d726d37a2..d726d37a2 100644
--- a/app/javascript/themes/glitch/components/permalink.js
+++ b/app/javascript/flavours/glitch/components/permalink.js
diff --git a/app/javascript/themes/glitch/components/relative_timestamp.js b/app/javascript/flavours/glitch/components/relative_timestamp.js
index 51588e78c..51588e78c 100644
--- a/app/javascript/themes/glitch/components/relative_timestamp.js
+++ b/app/javascript/flavours/glitch/components/relative_timestamp.js
diff --git a/app/javascript/themes/glitch/components/scrollable_list.js b/app/javascript/flavours/glitch/components/scrollable_list.js
index ccdcd7c85..8b1e3c93d 100644
--- a/app/javascript/themes/glitch/components/scrollable_list.js
+++ b/app/javascript/flavours/glitch/components/scrollable_list.js
@@ -1,13 +1,13 @@
 import React, { PureComponent } from 'react';
 import { ScrollContainer } from 'react-router-scroll-4';
 import PropTypes from 'prop-types';
-import IntersectionObserverArticleContainer from 'themes/glitch/containers/intersection_observer_article_container';
+import IntersectionObserverArticleContainer from 'flavours/glitch/containers/intersection_observer_article_container';
 import LoadMore from './load_more';
-import IntersectionObserverWrapper from 'themes/glitch/util/intersection_observer_wrapper';
+import IntersectionObserverWrapper from 'flavours/glitch/util/intersection_observer_wrapper';
 import { throttle } from 'lodash';
 import { List as ImmutableList } from 'immutable';
 import classNames from 'classnames';
-import { attachFullscreenListener, detachFullscreenListener, isFullscreen } from 'themes/glitch/util/fullscreen';
+import { attachFullscreenListener, detachFullscreenListener, isFullscreen } from 'flavours/glitch/util/fullscreen';
 
 export default class ScrollableList extends PureComponent {
 
diff --git a/app/javascript/themes/glitch/components/setting_text.js b/app/javascript/flavours/glitch/components/setting_text.js
index a6dde4c0f..a6dde4c0f 100644
--- a/app/javascript/themes/glitch/components/setting_text.js
+++ b/app/javascript/flavours/glitch/components/setting_text.js
diff --git a/app/javascript/themes/glitch/components/status.js b/app/javascript/flavours/glitch/components/status.js
index e2ef47f5f..6662285d0 100644
--- a/app/javascript/themes/glitch/components/status.js
+++ b/app/javascript/flavours/glitch/components/status.js
@@ -6,9 +6,9 @@ import StatusHeader from './status_header';
 import StatusContent from './status_content';
 import StatusActionBar from './status_action_bar';
 import ImmutablePureComponent from 'react-immutable-pure-component';
-import { MediaGallery, Video } from 'themes/glitch/util/async-components';
+import { MediaGallery, Video } from 'flavours/glitch/util/async-components';
 import { HotKeys } from 'react-hotkeys';
-import NotificationOverlayContainer from 'themes/glitch/features/notifications/containers/overlay_container';
+import NotificationOverlayContainer from 'flavours/glitch/features/notifications/containers/overlay_container';
 
 // We use the component (and not the container) since we do not want
 // to use the progress bar to show download progress
diff --git a/app/javascript/themes/glitch/components/status_action_bar.js b/app/javascript/flavours/glitch/components/status_action_bar.js
index 9d615ed7c..5a06782be 100644
--- a/app/javascript/themes/glitch/components/status_action_bar.js
+++ b/app/javascript/flavours/glitch/components/status_action_bar.js
@@ -1,14 +1,11 @@
-//  THIS FILE EXISTS FOR UPSTREAM COMPATIBILITY & SHOULDN'T BE USED !!
-//  SEE INSTEAD : glitch/components/status/action_bar
-
 import React from 'react';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import PropTypes from 'prop-types';
 import IconButton from './icon_button';
-import DropdownMenuContainer from 'themes/glitch/containers/dropdown_menu_container';
+import DropdownMenuContainer from 'flavours/glitch/containers/dropdown_menu_container';
 import { defineMessages, injectIntl } from 'react-intl';
 import ImmutablePureComponent from 'react-immutable-pure-component';
-import { me } from 'themes/glitch/util/initial_state';
+import { me } from 'flavours/glitch/util/initial_state';
 import RelativeTimestamp from './relative_timestamp';
 
 const messages = defineMessages({
diff --git a/app/javascript/themes/glitch/components/status_content.js b/app/javascript/flavours/glitch/components/status_content.js
index 3eba6eaa0..0c40e62cc 100644
--- a/app/javascript/themes/glitch/components/status_content.js
+++ b/app/javascript/flavours/glitch/components/status_content.js
@@ -1,7 +1,7 @@
 import React from 'react';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import PropTypes from 'prop-types';
-import { isRtl } from 'themes/glitch/util/rtl';
+import { isRtl } from 'flavours/glitch/util/rtl';
 import { FormattedMessage } from 'react-intl';
 import Permalink from './permalink';
 import classnames from 'classnames';
diff --git a/app/javascript/themes/glitch/components/status_header.js b/app/javascript/flavours/glitch/components/status_header.js
index bfa996cd5..bfa996cd5 100644
--- a/app/javascript/themes/glitch/components/status_header.js
+++ b/app/javascript/flavours/glitch/components/status_header.js
diff --git a/app/javascript/themes/glitch/components/status_list.js b/app/javascript/flavours/glitch/components/status_list.js
index ddb1354c6..f190ba6ab 100644
--- a/app/javascript/themes/glitch/components/status_list.js
+++ b/app/javascript/flavours/glitch/components/status_list.js
@@ -1,7 +1,7 @@
 import React from 'react';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import PropTypes from 'prop-types';
-import StatusContainer from 'themes/glitch/containers/status_container';
+import StatusContainer from 'flavours/glitch/containers/status_container';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 import ScrollableList from './scrollable_list';
 
diff --git a/app/javascript/themes/glitch/components/status_prepend.js b/app/javascript/flavours/glitch/components/status_prepend.js
index bd2559e46..bd2559e46 100644
--- a/app/javascript/themes/glitch/components/status_prepend.js
+++ b/app/javascript/flavours/glitch/components/status_prepend.js
diff --git a/app/javascript/themes/glitch/components/status_visibility_icon.js b/app/javascript/flavours/glitch/components/status_visibility_icon.js
index 017b69cbb..017b69cbb 100644
--- a/app/javascript/themes/glitch/components/status_visibility_icon.js
+++ b/app/javascript/flavours/glitch/components/status_visibility_icon.js
diff --git a/app/javascript/themes/glitch/containers/account_container.js b/app/javascript/flavours/glitch/containers/account_container.js
index c1ce49987..bc84d299b 100644
--- a/app/javascript/themes/glitch/containers/account_container.js
+++ b/app/javascript/flavours/glitch/containers/account_container.js
@@ -1,8 +1,8 @@
 import React from 'react';
 import { connect } from 'react-redux';
 import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
-import { makeGetAccount } from 'themes/glitch/selectors';
-import Account from 'themes/glitch/components/account';
+import { makeGetAccount } from 'flavours/glitch/selectors';
+import Account from 'flavours/glitch/components/account';
 import {
   followAccount,
   unfollowAccount,
@@ -10,10 +10,10 @@ import {
   unblockAccount,
   muteAccount,
   unmuteAccount,
-} from 'themes/glitch/actions/accounts';
-import { openModal } from 'themes/glitch/actions/modal';
-import { initMuteModal } from 'themes/glitch/actions/mutes';
-import { unfollowModal } from 'themes/glitch/util/initial_state';
+} from 'flavours/glitch/actions/accounts';
+import { openModal } from 'flavours/glitch/actions/modal';
+import { initMuteModal } from 'flavours/glitch/actions/mutes';
+import { unfollowModal } from 'flavours/glitch/util/initial_state';
 
 const messages = defineMessages({
   unfollowConfirm: { id: 'confirmations.unfollow.confirm', defaultMessage: 'Unfollow' },
diff --git a/app/javascript/themes/glitch/containers/card_container.js b/app/javascript/flavours/glitch/containers/card_container.js
index 8285437bb..dec7df522 100644
--- a/app/javascript/themes/glitch/containers/card_container.js
+++ b/app/javascript/flavours/glitch/containers/card_container.js
@@ -1,6 +1,6 @@
 import React from 'react';
 import PropTypes from 'prop-types';
-import Card from 'themes/glitch/features/status/components/card';
+import Card from 'flavours/glitch/features/status/components/card';
 import { fromJS } from 'immutable';
 
 export default class CardContainer extends React.PureComponent {
diff --git a/app/javascript/themes/glitch/containers/compose_container.js b/app/javascript/flavours/glitch/containers/compose_container.js
index 82980ee36..60f6a9c9f 100644
--- a/app/javascript/themes/glitch/containers/compose_container.js
+++ b/app/javascript/flavours/glitch/containers/compose_container.js
@@ -1,12 +1,12 @@
 import React from 'react';
 import { Provider } from 'react-redux';
 import PropTypes from 'prop-types';
-import configureStore from 'themes/glitch/store/configureStore';
-import { hydrateStore } from 'themes/glitch/actions/store';
+import configureStore from 'flavours/glitch/store/configureStore';
+import { hydrateStore } from 'flavours/glitch/actions/store';
 import { IntlProvider, addLocaleData } from 'react-intl';
 import { getLocale } from 'mastodon/locales';
-import Compose from 'themes/glitch/features/standalone/compose';
-import initialState from 'themes/glitch/util/initial_state';
+import Compose from 'flavours/glitch/features/standalone/compose';
+import initialState from 'flavours/glitch/util/initial_state';
 
 const { localeData, messages } = getLocale();
 addLocaleData(localeData);
diff --git a/app/javascript/themes/glitch/containers/dropdown_menu_container.js b/app/javascript/flavours/glitch/containers/dropdown_menu_container.js
index 15e8da2e3..0b4f72fa1 100644
--- a/app/javascript/themes/glitch/containers/dropdown_menu_container.js
+++ b/app/javascript/flavours/glitch/containers/dropdown_menu_container.js
@@ -1,7 +1,7 @@
-import { openModal, closeModal } from 'themes/glitch/actions/modal';
+import { openModal, closeModal } from 'flavours/glitch/actions/modal';
 import { connect } from 'react-redux';
-import DropdownMenu from 'themes/glitch/components/dropdown_menu';
-import { isUserTouching } from 'themes/glitch/util/is_mobile';
+import DropdownMenu from 'flavours/glitch/components/dropdown_menu';
+import { isUserTouching } from 'flavours/glitch/util/is_mobile';
 
 const mapStateToProps = state => ({
   isModalOpen: state.get('modal').modalType === 'ACTIONS',
diff --git a/app/javascript/themes/glitch/containers/intersection_observer_article_container.js b/app/javascript/flavours/glitch/containers/intersection_observer_article_container.js
index 6ede64738..f2741f2d4 100644
--- a/app/javascript/themes/glitch/containers/intersection_observer_article_container.js
+++ b/app/javascript/flavours/glitch/containers/intersection_observer_article_container.js
@@ -1,6 +1,6 @@
 import { connect } from 'react-redux';
-import IntersectionObserverArticle from 'themes/glitch/components/intersection_observer_article';
-import { setHeight } from 'themes/glitch/actions/height_cache';
+import IntersectionObserverArticle from 'flavours/glitch/components/intersection_observer_article';
+import { setHeight } from 'flavours/glitch/actions/height_cache';
 
 const makeMapStateToProps = (state, props) => ({
   cachedHeight: state.getIn(['height_cache', props.saveHeightKey, props.id]),
diff --git a/app/javascript/themes/glitch/containers/mastodon.js b/app/javascript/flavours/glitch/containers/mastodon.js
index 755b5564a..1c98cd5f7 100644
--- a/app/javascript/themes/glitch/containers/mastodon.js
+++ b/app/javascript/flavours/glitch/containers/mastodon.js
@@ -1,16 +1,16 @@
 import React from 'react';
 import { Provider } from 'react-redux';
 import PropTypes from 'prop-types';
-import configureStore from 'themes/glitch/store/configureStore';
-import { showOnboardingOnce } from 'themes/glitch/actions/onboarding';
+import configureStore from 'flavours/glitch/store/configureStore';
+import { showOnboardingOnce } from 'flavours/glitch/actions/onboarding';
 import { BrowserRouter, Route } from 'react-router-dom';
 import { ScrollContext } from 'react-router-scroll-4';
-import UI from 'themes/glitch/features/ui';
-import { hydrateStore } from 'themes/glitch/actions/store';
-import { connectUserStream } from 'themes/glitch/actions/streaming';
+import UI from 'flavours/glitch/features/ui';
+import { hydrateStore } from 'flavours/glitch/actions/store';
+import { connectUserStream } from 'flavours/glitch/actions/streaming';
 import { IntlProvider, addLocaleData } from 'react-intl';
 import { getLocale } from 'locales';
-import initialState from 'themes/glitch/util/initial_state';
+import initialState from 'flavours/glitch/util/initial_state';
 
 const { localeData, messages } = getLocale();
 addLocaleData(localeData);
diff --git a/app/javascript/themes/glitch/containers/media_gallery_container.js b/app/javascript/flavours/glitch/containers/media_gallery_container.js
index 86965f73b..54bfbf453 100644
--- a/app/javascript/themes/glitch/containers/media_gallery_container.js
+++ b/app/javascript/flavours/glitch/containers/media_gallery_container.js
@@ -2,7 +2,7 @@ import React from 'react';
 import PropTypes from 'prop-types';
 import { IntlProvider, addLocaleData } from 'react-intl';
 import { getLocale } from 'mastodon/locales';
-import MediaGallery from 'themes/glitch/components/media_gallery';
+import MediaGallery from 'flavours/glitch/components/media_gallery';
 import { fromJS } from 'immutable';
 
 const { localeData, messages } = getLocale();
diff --git a/app/javascript/themes/glitch/containers/notification_purge_buttons_container.js b/app/javascript/flavours/glitch/containers/notification_purge_buttons_container.js
index ee4cb84cd..2570cf4a5 100644
--- a/app/javascript/themes/glitch/containers/notification_purge_buttons_container.js
+++ b/app/javascript/flavours/glitch/containers/notification_purge_buttons_container.js
@@ -3,13 +3,13 @@ import { connect } from 'react-redux';
 import { defineMessages, injectIntl } from 'react-intl';
 
 //  Our imports.
-import NotificationPurgeButtons from 'themes/glitch/components/notification_purge_buttons';
+import NotificationPurgeButtons from 'flavours/glitch/components/notification_purge_buttons';
 import {
   deleteMarkedNotifications,
   enterNotificationClearingMode,
   markAllNotifications,
-} from 'themes/glitch/actions/notifications';
-import { openModal } from 'themes/glitch/actions/modal';
+} from 'flavours/glitch/actions/notifications';
+import { openModal } from 'flavours/glitch/actions/modal';
 
 const messages = defineMessages({
   clearMessage: { id: 'notifications.marked_clear_confirmation', defaultMessage: 'Are you sure you want to permanently clear all selected notifications?' },
diff --git a/app/javascript/themes/glitch/containers/status_container.js b/app/javascript/flavours/glitch/containers/status_container.js
index 14906723a..1a4f35278 100644
--- a/app/javascript/themes/glitch/containers/status_container.js
+++ b/app/javascript/flavours/glitch/containers/status_container.js
@@ -1,11 +1,11 @@
 import React from 'react';
 import { connect } from 'react-redux';
-import Status from 'themes/glitch/components/status';
-import { makeGetStatus } from 'themes/glitch/selectors';
+import Status from 'flavours/glitch/components/status';
+import { makeGetStatus } from 'flavours/glitch/selectors';
 import {
   replyCompose,
   mentionCompose,
-} from 'themes/glitch/actions/compose';
+} from 'flavours/glitch/actions/compose';
 import {
   reblog,
   favourite,
@@ -13,14 +13,14 @@ import {
   unfavourite,
   pin,
   unpin,
-} from 'themes/glitch/actions/interactions';
-import { blockAccount } from 'themes/glitch/actions/accounts';
-import { muteStatus, unmuteStatus, deleteStatus } from 'themes/glitch/actions/statuses';
-import { initMuteModal } from 'themes/glitch/actions/mutes';
-import { initReport } from 'themes/glitch/actions/reports';
-import { openModal } from 'themes/glitch/actions/modal';
+} from 'flavours/glitch/actions/interactions';
+import { blockAccount } from 'flavours/glitch/actions/accounts';
+import { muteStatus, unmuteStatus, deleteStatus } from 'flavours/glitch/actions/statuses';
+import { initMuteModal } from 'flavours/glitch/actions/mutes';
+import { initReport } from 'flavours/glitch/actions/reports';
+import { openModal } from 'flavours/glitch/actions/modal';
 import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
-import { boostModal, deleteModal } from 'themes/glitch/util/initial_state';
+import { boostModal, deleteModal } from 'flavours/glitch/util/initial_state';
 
 const messages = defineMessages({
   deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' },
diff --git a/app/javascript/themes/glitch/containers/timeline_container.js b/app/javascript/flavours/glitch/containers/timeline_container.js
index a75f8808d..c5ffe1b63 100644
--- a/app/javascript/themes/glitch/containers/timeline_container.js
+++ b/app/javascript/flavours/glitch/containers/timeline_container.js
@@ -1,13 +1,13 @@
 import React from 'react';
 import { Provider } from 'react-redux';
 import PropTypes from 'prop-types';
-import configureStore from 'themes/glitch/store/configureStore';
-import { hydrateStore } from 'themes/glitch/actions/store';
+import configureStore from 'flavours/glitch/store/configureStore';
+import { hydrateStore } from 'flavours/glitch/actions/store';
 import { IntlProvider, addLocaleData } from 'react-intl';
 import { getLocale } from 'mastodon/locales';
-import PublicTimeline from 'themes/glitch/features/standalone/public_timeline';
-import HashtagTimeline from 'themes/glitch/features/standalone/hashtag_timeline';
-import initialState from 'themes/glitch/util/initial_state';
+import PublicTimeline from 'flavours/glitch/features/standalone/public_timeline';
+import HashtagTimeline from 'flavours/glitch/features/standalone/hashtag_timeline';
+import initialState from 'flavours/glitch/util/initial_state';
 
 const { localeData, messages } = getLocale();
 addLocaleData(localeData);
diff --git a/app/javascript/themes/glitch/containers/video_container.js b/app/javascript/flavours/glitch/containers/video_container.js
index 2b0e98666..b206e9a10 100644
--- a/app/javascript/themes/glitch/containers/video_container.js
+++ b/app/javascript/flavours/glitch/containers/video_container.js
@@ -2,7 +2,7 @@ import React from 'react';
 import PropTypes from 'prop-types';
 import { IntlProvider, addLocaleData } from 'react-intl';
 import { getLocale } from 'mastodon/locales';
-import Video from 'themes/glitch/features/video';
+import Video from 'flavours/glitch/features/video';
 
 const { localeData, messages } = getLocale();
 addLocaleData(localeData);
diff --git a/app/javascript/themes/glitch/features/account/components/action_bar.js b/app/javascript/flavours/glitch/features/account/components/action_bar.js
index 0edd5c848..7c9c1af4e 100644
--- a/app/javascript/themes/glitch/features/account/components/action_bar.js
+++ b/app/javascript/flavours/glitch/features/account/components/action_bar.js
@@ -1,10 +1,10 @@
 import React from 'react';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import PropTypes from 'prop-types';
-import DropdownMenuContainer from 'themes/glitch/containers/dropdown_menu_container';
+import DropdownMenuContainer from 'flavours/glitch/containers/dropdown_menu_container';
 import { Link } from 'react-router-dom';
 import { defineMessages, injectIntl, FormattedMessage, FormattedNumber } from 'react-intl';
-import { me } from 'themes/glitch/util/initial_state';
+import { me } from 'flavours/glitch/util/initial_state';
 
 const messages = defineMessages({
   mention: { id: 'account.mention', defaultMessage: 'Mention @{name}' },
diff --git a/app/javascript/themes/glitch/features/account/components/header.js b/app/javascript/flavours/glitch/features/account/components/header.js
index 696bb1991..f5ecaae71 100644
--- a/app/javascript/themes/glitch/features/account/components/header.js
+++ b/app/javascript/flavours/glitch/features/account/components/header.js
@@ -4,12 +4,12 @@ import PropTypes from 'prop-types';
 import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 
-import Avatar from 'themes/glitch/components/avatar';
-import IconButton from 'themes/glitch/components/icon_button';
+import Avatar from 'flavours/glitch/components/avatar';
+import IconButton from 'flavours/glitch/components/icon_button';
 
-import emojify from 'themes/glitch/util/emoji';
-import { me } from 'themes/glitch/util/initial_state';
-import { processBio } from 'themes/glitch/util/bio_metadata';
+import emojify from 'flavours/glitch/util/emoji';
+import { me } from 'flavours/glitch/util/initial_state';
+import { processBio } from 'flavours/glitch/util/bio_metadata';
 
 const messages = defineMessages({
   unfollow: { id: 'account.unfollow', defaultMessage: 'Unfollow' },
diff --git a/app/javascript/themes/glitch/features/account_gallery/components/media_item.js b/app/javascript/flavours/glitch/features/account_gallery/components/media_item.js
index 88c9156b5..e52d3b0bb 100644
--- a/app/javascript/themes/glitch/features/account_gallery/components/media_item.js
+++ b/app/javascript/flavours/glitch/features/account_gallery/components/media_item.js
@@ -1,7 +1,7 @@
 import React from 'react';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import ImmutablePureComponent from 'react-immutable-pure-component';
-import Permalink from 'themes/glitch/components/permalink';
+import Permalink from 'flavours/glitch/components/permalink';
 
 export default class MediaItem extends ImmutablePureComponent {
 
diff --git a/app/javascript/themes/glitch/features/account_gallery/index.js b/app/javascript/flavours/glitch/features/account_gallery/index.js
index a21c089da..951e019e3 100644
--- a/app/javascript/themes/glitch/features/account_gallery/index.js
+++ b/app/javascript/flavours/glitch/features/account_gallery/index.js
@@ -2,18 +2,18 @@ import React from 'react';
 import { connect } from 'react-redux';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import PropTypes from 'prop-types';
-import { fetchAccount } from 'themes/glitch/actions/accounts';
-import { refreshAccountMediaTimeline, expandAccountMediaTimeline } from 'themes/glitch/actions/timelines';
-import LoadingIndicator from 'themes/glitch/components/loading_indicator';
-import Column from 'themes/glitch/features/ui/components/column';
-import ColumnBackButton from 'themes/glitch/components/column_back_button';
+import { fetchAccount } from 'flavours/glitch/actions/accounts';
+import { refreshAccountMediaTimeline, expandAccountMediaTimeline } from 'flavours/glitch/actions/timelines';
+import LoadingIndicator from 'flavours/glitch/components/loading_indicator';
+import Column from 'flavours/glitch/features/ui/components/column';
+import ColumnBackButton from 'flavours/glitch/components/column_back_button';
 import ImmutablePureComponent from 'react-immutable-pure-component';
-import { getAccountGallery } from 'themes/glitch/selectors';
+import { getAccountGallery } from 'flavours/glitch/selectors';
 import MediaItem from './components/media_item';
-import HeaderContainer from 'themes/glitch/features/account_timeline/containers/header_container';
+import HeaderContainer from 'flavours/glitch/features/account_timeline/containers/header_container';
 import { FormattedMessage } from 'react-intl';
 import { ScrollContainer } from 'react-router-scroll-4';
-import LoadMore from 'themes/glitch/components/load_more';
+import LoadMore from 'flavours/glitch/components/load_more';
 
 const mapStateToProps = (state, props) => ({
   medias: getAccountGallery(state, props.params.accountId),
diff --git a/app/javascript/themes/glitch/features/account_timeline/components/header.js b/app/javascript/flavours/glitch/features/account_timeline/components/header.js
index c719a7bcb..4ad677fbe 100644
--- a/app/javascript/themes/glitch/features/account_timeline/components/header.js
+++ b/app/javascript/flavours/glitch/features/account_timeline/components/header.js
@@ -1,9 +1,9 @@
 import React from 'react';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import PropTypes from 'prop-types';
-import InnerHeader from 'themes/glitch/features/account/components/header';
-import ActionBar from 'themes/glitch/features/account/components/action_bar';
-import MissingIndicator from 'themes/glitch/components/missing_indicator';
+import InnerHeader from 'flavours/glitch/features/account/components/header';
+import ActionBar from 'flavours/glitch/features/account/components/action_bar';
+import MissingIndicator from 'flavours/glitch/components/missing_indicator';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 
 export default class Header extends ImmutablePureComponent {
diff --git a/app/javascript/themes/glitch/features/account_timeline/containers/header_container.js b/app/javascript/flavours/glitch/features/account_timeline/containers/header_container.js
index 766b57b56..815a1a613 100644
--- a/app/javascript/themes/glitch/features/account_timeline/containers/header_container.js
+++ b/app/javascript/flavours/glitch/features/account_timeline/containers/header_container.js
@@ -1,6 +1,6 @@
 import React from 'react';
 import { connect } from 'react-redux';
-import { makeGetAccount } from 'themes/glitch/selectors';
+import { makeGetAccount } from 'flavours/glitch/selectors';
 import Header from '../components/header';
 import {
   followAccount,
@@ -8,14 +8,14 @@ import {
   blockAccount,
   unblockAccount,
   unmuteAccount,
-} from 'themes/glitch/actions/accounts';
-import { mentionCompose } from 'themes/glitch/actions/compose';
-import { initMuteModal } from 'themes/glitch/actions/mutes';
-import { initReport } from 'themes/glitch/actions/reports';
-import { openModal } from 'themes/glitch/actions/modal';
-import { blockDomain, unblockDomain } from 'themes/glitch/actions/domain_blocks';
+} from 'flavours/glitch/actions/accounts';
+import { mentionCompose } from 'flavours/glitch/actions/compose';
+import { initMuteModal } from 'flavours/glitch/actions/mutes';
+import { initReport } from 'flavours/glitch/actions/reports';
+import { openModal } from 'flavours/glitch/actions/modal';
+import { blockDomain, unblockDomain } from 'flavours/glitch/actions/domain_blocks';
 import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
-import { unfollowModal } from 'themes/glitch/util/initial_state';
+import { unfollowModal } from 'flavours/glitch/util/initial_state';
 
 const messages = defineMessages({
   unfollowConfirm: { id: 'confirmations.unfollow.confirm', defaultMessage: 'Unfollow' },
diff --git a/app/javascript/themes/glitch/features/account_timeline/index.js b/app/javascript/flavours/glitch/features/account_timeline/index.js
index 81336ef3a..75dba5049 100644
--- a/app/javascript/themes/glitch/features/account_timeline/index.js
+++ b/app/javascript/flavours/glitch/features/account_timeline/index.js
@@ -2,8 +2,8 @@ import React from 'react';
 import { connect } from 'react-redux';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import PropTypes from 'prop-types';
-import { fetchAccount } from 'themes/glitch/actions/accounts';
-import { refreshAccountTimeline, expandAccountTimeline } from 'themes/glitch/actions/timelines';
+import { fetchAccount } from 'flavours/glitch/actions/accounts';
+import { refreshAccountTimeline, expandAccountTimeline } from 'flavours/glitch/actions/timelines';
 import StatusList from '../../components/status_list';
 import LoadingIndicator from '../../components/loading_indicator';
 import Column from '../ui/components/column';
diff --git a/app/javascript/themes/glitch/features/blocks/index.js b/app/javascript/flavours/glitch/features/blocks/index.js
index 70630818c..edd448921 100644
--- a/app/javascript/themes/glitch/features/blocks/index.js
+++ b/app/javascript/flavours/glitch/features/blocks/index.js
@@ -2,12 +2,12 @@ import React from 'react';
 import { connect } from 'react-redux';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import PropTypes from 'prop-types';
-import LoadingIndicator from 'themes/glitch/components/loading_indicator';
+import LoadingIndicator from 'flavours/glitch/components/loading_indicator';
 import { ScrollContainer } from 'react-router-scroll-4';
-import Column from 'themes/glitch/features/ui/components/column';
-import ColumnBackButtonSlim from 'themes/glitch/components/column_back_button_slim';
-import AccountContainer from 'themes/glitch/containers/account_container';
-import { fetchBlocks, expandBlocks } from 'themes/glitch/actions/blocks';
+import Column from 'flavours/glitch/features/ui/components/column';
+import ColumnBackButtonSlim from 'flavours/glitch/components/column_back_button_slim';
+import AccountContainer from 'flavours/glitch/containers/account_container';
+import { fetchBlocks, expandBlocks } from 'flavours/glitch/actions/blocks';
 import { defineMessages, injectIntl } from 'react-intl';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 
diff --git a/app/javascript/themes/glitch/features/community_timeline/components/column_settings.js b/app/javascript/flavours/glitch/features/community_timeline/components/column_settings.js
index 988e36308..6dc292ee5 100644
--- a/app/javascript/themes/glitch/features/community_timeline/components/column_settings.js
+++ b/app/javascript/flavours/glitch/features/community_timeline/components/column_settings.js
@@ -2,7 +2,7 @@ import React from 'react';
 import PropTypes from 'prop-types';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
-import SettingText from 'themes/glitch/components/setting_text';
+import SettingText from 'flavours/glitch/components/setting_text';
 
 const messages = defineMessages({
   filter_regex: { id: 'home.column_settings.filter_regex', defaultMessage: 'Filter out by regular expressions' },
diff --git a/app/javascript/themes/glitch/features/community_timeline/containers/column_settings_container.js b/app/javascript/flavours/glitch/features/community_timeline/containers/column_settings_container.js
index cd9c34365..84234a836 100644
--- a/app/javascript/themes/glitch/features/community_timeline/containers/column_settings_container.js
+++ b/app/javascript/flavours/glitch/features/community_timeline/containers/column_settings_container.js
@@ -1,6 +1,6 @@
 import { connect } from 'react-redux';
 import ColumnSettings from '../components/column_settings';
-import { changeSetting } from 'themes/glitch/actions/settings';
+import { changeSetting } from 'flavours/glitch/actions/settings';
 
 const mapStateToProps = state => ({
   settings: state.getIn(['settings', 'community']),
diff --git a/app/javascript/themes/glitch/features/community_timeline/index.js b/app/javascript/flavours/glitch/features/community_timeline/index.js
index 9d255bd01..55355414f 100644
--- a/app/javascript/themes/glitch/features/community_timeline/index.js
+++ b/app/javascript/flavours/glitch/features/community_timeline/index.js
@@ -1,17 +1,17 @@
 import React from 'react';
 import { connect } from 'react-redux';
 import PropTypes from 'prop-types';
-import StatusListContainer from 'themes/glitch/features/ui/containers/status_list_container';
-import Column from 'themes/glitch/components/column';
-import ColumnHeader from 'themes/glitch/components/column_header';
+import StatusListContainer from 'flavours/glitch/features/ui/containers/status_list_container';
+import Column from 'flavours/glitch/components/column';
+import ColumnHeader from 'flavours/glitch/components/column_header';
 import {
   refreshCommunityTimeline,
   expandCommunityTimeline,
-} from 'themes/glitch/actions/timelines';
-import { addColumn, removeColumn, moveColumn } from 'themes/glitch/actions/columns';
+} from 'flavours/glitch/actions/timelines';
+import { addColumn, removeColumn, moveColumn } from 'flavours/glitch/actions/columns';
 import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
 import ColumnSettingsContainer from './containers/column_settings_container';
-import { connectCommunityStream } from 'themes/glitch/actions/streaming';
+import { connectCommunityStream } from 'flavours/glitch/actions/streaming';
 
 const messages = defineMessages({
   title: { id: 'column.community', defaultMessage: 'Local timeline' },
diff --git a/app/javascript/themes/glitch/features/compose/components/advanced_options.js b/app/javascript/flavours/glitch/features/compose/components/advanced_options.js
index 045bad2e5..045bad2e5 100644
--- a/app/javascript/themes/glitch/features/compose/components/advanced_options.js
+++ b/app/javascript/flavours/glitch/features/compose/components/advanced_options.js
diff --git a/app/javascript/themes/glitch/features/compose/components/advanced_options_toggle.js b/app/javascript/flavours/glitch/features/compose/components/advanced_options_toggle.js
index 98b3b6a44..98b3b6a44 100644
--- a/app/javascript/themes/glitch/features/compose/components/advanced_options_toggle.js
+++ b/app/javascript/flavours/glitch/features/compose/components/advanced_options_toggle.js
diff --git a/app/javascript/themes/glitch/features/compose/components/attach_options.js b/app/javascript/flavours/glitch/features/compose/components/attach_options.js
index c396714f3..6c7a1f55f 100644
--- a/app/javascript/themes/glitch/features/compose/components/attach_options.js
+++ b/app/javascript/flavours/glitch/features/compose/components/attach_options.js
@@ -6,10 +6,10 @@ import { injectIntl, defineMessages } from 'react-intl';
 
 //  Our imports  //
 import ComposeDropdown from './dropdown';
-import { uploadCompose } from 'themes/glitch/actions/compose';
+import { uploadCompose } from 'flavours/glitch/actions/compose';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import ImmutablePureComponent from 'react-immutable-pure-component';
-import { openModal } from 'themes/glitch/actions/modal';
+import { openModal } from 'flavours/glitch/actions/modal';
 
 const messages = defineMessages({
   upload :
diff --git a/app/javascript/themes/glitch/features/compose/components/autosuggest_account.js b/app/javascript/flavours/glitch/features/compose/components/autosuggest_account.js
index 4a98d89fe..3d474af30 100644
--- a/app/javascript/themes/glitch/features/compose/components/autosuggest_account.js
+++ b/app/javascript/flavours/glitch/features/compose/components/autosuggest_account.js
@@ -1,6 +1,6 @@
 import React from 'react';
-import Avatar from 'themes/glitch/components/avatar';
-import DisplayName from 'themes/glitch/components/display_name';
+import Avatar from 'flavours/glitch/components/avatar';
+import DisplayName from 'flavours/glitch/components/display_name';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 
diff --git a/app/javascript/themes/glitch/features/compose/components/character_counter.js b/app/javascript/flavours/glitch/features/compose/components/character_counter.js
index 0ecfc9141..0ecfc9141 100644
--- a/app/javascript/themes/glitch/features/compose/components/character_counter.js
+++ b/app/javascript/flavours/glitch/features/compose/components/character_counter.js
diff --git a/app/javascript/themes/glitch/features/compose/components/compose_form.js b/app/javascript/flavours/glitch/features/compose/components/compose_form.js
index 54b1944a4..67ce935f4 100644
--- a/app/javascript/themes/glitch/features/compose/components/compose_form.js
+++ b/app/javascript/flavours/glitch/features/compose/components/compose_form.js
@@ -1,12 +1,12 @@
 import React from 'react';
 import CharacterCounter from './character_counter';
-import Button from 'themes/glitch/components/button';
+import Button from 'flavours/glitch/components/button';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import PropTypes from 'prop-types';
 import ReplyIndicatorContainer from '../containers/reply_indicator_container';
-import AutosuggestTextarea from 'themes/glitch/components/autosuggest_textarea';
+import AutosuggestTextarea from 'flavours/glitch/components/autosuggest_textarea';
 import { defineMessages, injectIntl } from 'react-intl';
-import Collapsable from 'themes/glitch/components/collapsable';
+import Collapsable from 'flavours/glitch/components/collapsable';
 import SpoilerButtonContainer from '../containers/spoiler_button_container';
 import PrivacyDropdownContainer from '../containers/privacy_dropdown_container';
 import ComposeAdvancedOptionsContainer from '../containers/advanced_options_container';
@@ -14,12 +14,12 @@ import SensitiveButtonContainer from '../containers/sensitive_button_container';
 import EmojiPickerDropdown from '../containers/emoji_picker_dropdown_container';
 import UploadFormContainer from '../containers/upload_form_container';
 import WarningContainer from '../containers/warning_container';
-import { isMobile } from 'themes/glitch/util/is_mobile';
+import { isMobile } from 'flavours/glitch/util/is_mobile';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 import { length } from 'stringz';
-import { countableText } from 'themes/glitch/util/counter';
+import { countableText } from 'flavours/glitch/util/counter';
 import ComposeAttachOptions from './attach_options';
-import initialState from 'themes/glitch/util/initial_state';
+import initialState from 'flavours/glitch/util/initial_state';
 
 const maxChars = initialState.max_toot_chars;
 
diff --git a/app/javascript/themes/glitch/features/compose/components/dropdown.js b/app/javascript/flavours/glitch/features/compose/components/dropdown.js
index f3d9f094e..1b0000fb7 100644
--- a/app/javascript/themes/glitch/features/compose/components/dropdown.js
+++ b/app/javascript/flavours/glitch/features/compose/components/dropdown.js
@@ -3,7 +3,7 @@ import React from 'react';
 import PropTypes from 'prop-types';
 
 //  Our imports.
-import IconButton from 'themes/glitch/components/icon_button';
+import IconButton from 'flavours/glitch/components/icon_button';
 
 const iconStyle = {
   height     : null,
diff --git a/app/javascript/themes/glitch/features/compose/components/emoji_picker_dropdown.js b/app/javascript/flavours/glitch/features/compose/components/emoji_picker_dropdown.js
index fd59efb85..cf89f91d3 100644
--- a/app/javascript/themes/glitch/features/compose/components/emoji_picker_dropdown.js
+++ b/app/javascript/flavours/glitch/features/compose/components/emoji_picker_dropdown.js
@@ -1,12 +1,12 @@
 import React from 'react';
 import PropTypes from 'prop-types';
 import { defineMessages, injectIntl } from 'react-intl';
-import { EmojiPicker as EmojiPickerAsync } from 'themes/glitch/util/async-components';
+import { EmojiPicker as EmojiPickerAsync } from 'flavours/glitch/util/async-components';
 import Overlay from 'react-overlays/lib/Overlay';
 import classNames from 'classnames';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import detectPassiveEvents from 'detect-passive-events';
-import { buildCustomEmojis } from 'themes/glitch/util/emoji';
+import { buildCustomEmojis } from 'flavours/glitch/util/emoji';
 
 const messages = defineMessages({
   emoji: { id: 'emoji_button.label', defaultMessage: 'Insert emoji' },
diff --git a/app/javascript/themes/glitch/features/compose/components/navigation_bar.js b/app/javascript/flavours/glitch/features/compose/components/navigation_bar.js
index 24a70949b..1b6d74123 100644
--- a/app/javascript/themes/glitch/features/compose/components/navigation_bar.js
+++ b/app/javascript/flavours/glitch/features/compose/components/navigation_bar.js
@@ -1,9 +1,9 @@
 import React from 'react';
 import PropTypes from 'prop-types';
 import ImmutablePropTypes from 'react-immutable-proptypes';
-import Avatar from 'themes/glitch/components/avatar';
-import IconButton from 'themes/glitch/components/icon_button';
-import Permalink from 'themes/glitch/components/permalink';
+import Avatar from 'flavours/glitch/components/avatar';
+import IconButton from 'flavours/glitch/components/icon_button';
+import Permalink from 'flavours/glitch/components/permalink';
 import { FormattedMessage } from 'react-intl';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 
diff --git a/app/javascript/themes/glitch/features/compose/components/privacy_dropdown.js b/app/javascript/flavours/glitch/features/compose/components/privacy_dropdown.js
index 0cd92d174..90f062f8f 100644
--- a/app/javascript/themes/glitch/features/compose/components/privacy_dropdown.js
+++ b/app/javascript/flavours/glitch/features/compose/components/privacy_dropdown.js
@@ -1,9 +1,9 @@
 import React from 'react';
 import PropTypes from 'prop-types';
 import { injectIntl, defineMessages } from 'react-intl';
-import IconButton from 'themes/glitch/components/icon_button';
+import IconButton from 'flavours/glitch/components/icon_button';
 import Overlay from 'react-overlays/lib/Overlay';
-import Motion from 'themes/glitch/util/optional_motion';
+import Motion from 'flavours/glitch/util/optional_motion';
 import spring from 'react-motion/lib/spring';
 import detectPassiveEvents from 'detect-passive-events';
 import classNames from 'classnames';
diff --git a/app/javascript/themes/glitch/features/compose/components/reply_indicator.js b/app/javascript/flavours/glitch/features/compose/components/reply_indicator.js
index 9a8d10ceb..cb28e51be 100644
--- a/app/javascript/themes/glitch/features/compose/components/reply_indicator.js
+++ b/app/javascript/flavours/glitch/features/compose/components/reply_indicator.js
@@ -1,9 +1,9 @@
 import React from 'react';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import PropTypes from 'prop-types';
-import Avatar from 'themes/glitch/components/avatar';
-import IconButton from 'themes/glitch/components/icon_button';
-import DisplayName from 'themes/glitch/components/display_name';
+import Avatar from 'flavours/glitch/components/avatar';
+import IconButton from 'flavours/glitch/components/icon_button';
+import DisplayName from 'flavours/glitch/components/display_name';
 import { defineMessages, injectIntl } from 'react-intl';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 
diff --git a/app/javascript/themes/glitch/features/compose/components/search.js b/app/javascript/flavours/glitch/features/compose/components/search.js
index c3218137f..1ce66b19d 100644
--- a/app/javascript/themes/glitch/features/compose/components/search.js
+++ b/app/javascript/flavours/glitch/features/compose/components/search.js
@@ -2,7 +2,7 @@ import React from 'react';
 import PropTypes from 'prop-types';
 import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
 import Overlay from 'react-overlays/lib/Overlay';
-import Motion from 'themes/glitch/util/optional_motion';
+import Motion from 'flavours/glitch/util/optional_motion';
 import spring from 'react-motion/lib/spring';
 
 const messages = defineMessages({
diff --git a/app/javascript/themes/glitch/features/compose/components/search_results.js b/app/javascript/flavours/glitch/features/compose/components/search_results.js
index 3fdafa5f3..2a4818d4e 100644
--- a/app/javascript/themes/glitch/features/compose/components/search_results.js
+++ b/app/javascript/flavours/glitch/features/compose/components/search_results.js
@@ -1,8 +1,8 @@
 import React from 'react';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import { FormattedMessage } from 'react-intl';
-import AccountContainer from 'themes/glitch/containers/account_container';
-import StatusContainer from 'themes/glitch/containers/status_container';
+import AccountContainer from 'flavours/glitch/containers/account_container';
+import StatusContainer from 'flavours/glitch/containers/status_container';
 import { Link } from 'react-router-dom';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 
diff --git a/app/javascript/themes/glitch/features/compose/components/text_icon_button.js b/app/javascript/flavours/glitch/features/compose/components/text_icon_button.js
index 9c8ffab1f..9c8ffab1f 100644
--- a/app/javascript/themes/glitch/features/compose/components/text_icon_button.js
+++ b/app/javascript/flavours/glitch/features/compose/components/text_icon_button.js
diff --git a/app/javascript/themes/glitch/features/compose/components/upload.js b/app/javascript/flavours/glitch/features/compose/components/upload.js
index ded376ada..a1fc93234 100644
--- a/app/javascript/themes/glitch/features/compose/components/upload.js
+++ b/app/javascript/flavours/glitch/features/compose/components/upload.js
@@ -1,8 +1,8 @@
 import React from 'react';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import PropTypes from 'prop-types';
-import IconButton from 'themes/glitch/components/icon_button';
-import Motion from 'themes/glitch/util/optional_motion';
+import IconButton from 'flavours/glitch/components/icon_button';
+import Motion from 'flavours/glitch/util/optional_motion';
 import spring from 'react-motion/lib/spring';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 import { defineMessages, injectIntl } from 'react-intl';
diff --git a/app/javascript/themes/glitch/features/compose/components/upload_button.js b/app/javascript/flavours/glitch/features/compose/components/upload_button.js
index d7742adfe..f06167a2a 100644
--- a/app/javascript/themes/glitch/features/compose/components/upload_button.js
+++ b/app/javascript/flavours/glitch/features/compose/components/upload_button.js
@@ -1,5 +1,5 @@
 import React from 'react';
-import IconButton from 'themes/glitch/components/icon_button';
+import IconButton from 'flavours/glitch/components/icon_button';
 import PropTypes from 'prop-types';
 import { defineMessages, injectIntl } from 'react-intl';
 import { connect } from 'react-redux';
diff --git a/app/javascript/themes/glitch/features/compose/components/upload_form.js b/app/javascript/flavours/glitch/features/compose/components/upload_form.js
index b7f112205..b7f112205 100644
--- a/app/javascript/themes/glitch/features/compose/components/upload_form.js
+++ b/app/javascript/flavours/glitch/features/compose/components/upload_form.js
diff --git a/app/javascript/themes/glitch/features/compose/components/upload_progress.js b/app/javascript/flavours/glitch/features/compose/components/upload_progress.js
index b923d0a22..2a3b8ceb4 100644
--- a/app/javascript/themes/glitch/features/compose/components/upload_progress.js
+++ b/app/javascript/flavours/glitch/features/compose/components/upload_progress.js
@@ -1,6 +1,6 @@
 import React from 'react';
 import PropTypes from 'prop-types';
-import Motion from 'themes/glitch/util/optional_motion';
+import Motion from 'flavours/glitch/util/optional_motion';
 import spring from 'react-motion/lib/spring';
 import { FormattedMessage } from 'react-intl';
 
diff --git a/app/javascript/themes/glitch/features/compose/components/warning.js b/app/javascript/flavours/glitch/features/compose/components/warning.js
index 82df55a31..4962e76c8 100644
--- a/app/javascript/themes/glitch/features/compose/components/warning.js
+++ b/app/javascript/flavours/glitch/features/compose/components/warning.js
@@ -1,6 +1,6 @@
 import React from 'react';
 import PropTypes from 'prop-types';
-import Motion from 'themes/glitch/util/optional_motion';
+import Motion from 'flavours/glitch/util/optional_motion';
 import spring from 'react-motion/lib/spring';
 
 export default class Warning extends React.PureComponent {
diff --git a/app/javascript/themes/glitch/features/compose/containers/advanced_options_container.js b/app/javascript/flavours/glitch/features/compose/containers/advanced_options_container.js
index 9f168942a..da381568b 100644
--- a/app/javascript/themes/glitch/features/compose/containers/advanced_options_container.js
+++ b/app/javascript/flavours/glitch/features/compose/containers/advanced_options_container.js
@@ -2,7 +2,7 @@
 import { connect } from 'react-redux';
 
 //  Our imports.
-import { toggleComposeAdvancedOption } from 'themes/glitch/actions/compose';
+import { toggleComposeAdvancedOption } from 'flavours/glitch/actions/compose';
 import ComposeAdvancedOptions from '../components/advanced_options';
 
 const mapStateToProps = state => ({
diff --git a/app/javascript/themes/glitch/features/compose/containers/autosuggest_account_container.js b/app/javascript/flavours/glitch/features/compose/containers/autosuggest_account_container.js
index 96eb70c18..0e1c328fe 100644
--- a/app/javascript/themes/glitch/features/compose/containers/autosuggest_account_container.js
+++ b/app/javascript/flavours/glitch/features/compose/containers/autosuggest_account_container.js
@@ -1,6 +1,6 @@
 import { connect } from 'react-redux';
 import AutosuggestAccount from '../components/autosuggest_account';
-import { makeGetAccount } from 'themes/glitch/selectors';
+import { makeGetAccount } from 'flavours/glitch/selectors';
 
 const makeMapStateToProps = () => {
   const getAccount = makeGetAccount();
diff --git a/app/javascript/themes/glitch/features/compose/containers/compose_form_container.js b/app/javascript/flavours/glitch/features/compose/containers/compose_form_container.js
index 7afa988f1..e2e93e44b 100644
--- a/app/javascript/themes/glitch/features/compose/containers/compose_form_container.js
+++ b/app/javascript/flavours/glitch/features/compose/containers/compose_form_container.js
@@ -1,6 +1,6 @@
 import { connect } from 'react-redux';
 import ComposeForm from '../components/compose_form';
-import { changeComposeVisibility, uploadCompose } from 'themes/glitch/actions/compose';
+import { changeComposeVisibility, uploadCompose } from 'flavours/glitch/actions/compose';
 import {
   changeCompose,
   submitCompose,
@@ -9,7 +9,7 @@ import {
   selectComposeSuggestion,
   changeComposeSpoilerText,
   insertEmojiCompose,
-} from 'themes/glitch/actions/compose';
+} from 'flavours/glitch/actions/compose';
 
 const mapStateToProps = state => ({
   text: state.getIn(['compose', 'text']),
diff --git a/app/javascript/themes/glitch/features/compose/containers/emoji_picker_dropdown_container.js b/app/javascript/flavours/glitch/features/compose/containers/emoji_picker_dropdown_container.js
index 55a13bd65..ba85edd87 100644
--- a/app/javascript/themes/glitch/features/compose/containers/emoji_picker_dropdown_container.js
+++ b/app/javascript/flavours/glitch/features/compose/containers/emoji_picker_dropdown_container.js
@@ -1,9 +1,9 @@
 import { connect } from 'react-redux';
 import EmojiPickerDropdown from '../components/emoji_picker_dropdown';
-import { changeSetting } from 'themes/glitch/actions/settings';
+import { changeSetting } from 'flavours/glitch/actions/settings';
 import { createSelector } from 'reselect';
 import { Map as ImmutableMap } from 'immutable';
-import { useEmoji } from 'themes/glitch/actions/emojis';
+import { useEmoji } from 'flavours/glitch/actions/emojis';
 
 const perLine = 8;
 const lines   = 2;
diff --git a/app/javascript/themes/glitch/features/compose/containers/navigation_container.js b/app/javascript/flavours/glitch/features/compose/containers/navigation_container.js
index b6d737b46..eb630ffbb 100644
--- a/app/javascript/themes/glitch/features/compose/containers/navigation_container.js
+++ b/app/javascript/flavours/glitch/features/compose/containers/navigation_container.js
@@ -1,6 +1,6 @@
 import { connect }   from 'react-redux';
 import NavigationBar from '../components/navigation_bar';
-import { me } from 'themes/glitch/util/initial_state';
+import { me } from 'flavours/glitch/util/initial_state';
 
 const mapStateToProps = state => {
   return {
diff --git a/app/javascript/themes/glitch/features/compose/containers/privacy_dropdown_container.js b/app/javascript/flavours/glitch/features/compose/containers/privacy_dropdown_container.js
index 9636ceab2..cb94fcc80 100644
--- a/app/javascript/themes/glitch/features/compose/containers/privacy_dropdown_container.js
+++ b/app/javascript/flavours/glitch/features/compose/containers/privacy_dropdown_container.js
@@ -1,8 +1,8 @@
 import { connect } from 'react-redux';
 import PrivacyDropdown from '../components/privacy_dropdown';
-import { changeComposeVisibility } from 'themes/glitch/actions/compose';
-import { openModal, closeModal } from 'themes/glitch/actions/modal';
-import { isUserTouching } from 'themes/glitch/util/is_mobile';
+import { changeComposeVisibility } from 'flavours/glitch/actions/compose';
+import { openModal, closeModal } from 'flavours/glitch/actions/modal';
+import { isUserTouching } from 'flavours/glitch/util/is_mobile';
 
 const mapStateToProps = state => ({
   isModalOpen: state.get('modal').modalType === 'ACTIONS',
diff --git a/app/javascript/themes/glitch/features/compose/containers/reply_indicator_container.js b/app/javascript/flavours/glitch/features/compose/containers/reply_indicator_container.js
index 6dcabb3cd..a7c82d135 100644
--- a/app/javascript/themes/glitch/features/compose/containers/reply_indicator_container.js
+++ b/app/javascript/flavours/glitch/features/compose/containers/reply_indicator_container.js
@@ -1,6 +1,6 @@
 import { connect } from 'react-redux';
-import { cancelReplyCompose } from 'themes/glitch/actions/compose';
-import { makeGetStatus } from 'themes/glitch/selectors';
+import { cancelReplyCompose } from 'flavours/glitch/actions/compose';
+import { makeGetStatus } from 'flavours/glitch/selectors';
 import ReplyIndicator from '../components/reply_indicator';
 
 const makeMapStateToProps = () => {
diff --git a/app/javascript/themes/glitch/features/compose/containers/search_container.js b/app/javascript/flavours/glitch/features/compose/containers/search_container.js
index a450d27e7..8f4bfcf08 100644
--- a/app/javascript/themes/glitch/features/compose/containers/search_container.js
+++ b/app/javascript/flavours/glitch/features/compose/containers/search_container.js
@@ -4,7 +4,7 @@ import {
   clearSearch,
   submitSearch,
   showSearch,
-} from 'themes/glitch/actions/search';
+} from 'flavours/glitch/actions/search';
 import Search from '../components/search';
 
 const mapStateToProps = state => ({
diff --git a/app/javascript/themes/glitch/features/compose/containers/search_results_container.js b/app/javascript/flavours/glitch/features/compose/containers/search_results_container.js
index 16d95d417..16d95d417 100644
--- a/app/javascript/themes/glitch/features/compose/containers/search_results_container.js
+++ b/app/javascript/flavours/glitch/features/compose/containers/search_results_container.js
diff --git a/app/javascript/themes/glitch/features/compose/containers/sensitive_button_container.js b/app/javascript/flavours/glitch/features/compose/containers/sensitive_button_container.js
index a710dd104..cf6706c0e 100644
--- a/app/javascript/themes/glitch/features/compose/containers/sensitive_button_container.js
+++ b/app/javascript/flavours/glitch/features/compose/containers/sensitive_button_container.js
@@ -2,9 +2,9 @@ import React from 'react';
 import { connect } from 'react-redux';
 import PropTypes from 'prop-types';
 import classNames from 'classnames';
-import IconButton from 'themes/glitch/components/icon_button';
-import { changeComposeSensitivity } from 'themes/glitch/actions/compose';
-import Motion from 'themes/glitch/util/optional_motion';
+import IconButton from 'flavours/glitch/components/icon_button';
+import { changeComposeSensitivity } from 'flavours/glitch/actions/compose';
+import Motion from 'flavours/glitch/util/optional_motion';
 import spring from 'react-motion/lib/spring';
 import { injectIntl, defineMessages } from 'react-intl';
 
diff --git a/app/javascript/themes/glitch/features/compose/containers/spoiler_button_container.js b/app/javascript/flavours/glitch/features/compose/containers/spoiler_button_container.js
index 160e71ba9..d7b4246bc 100644
--- a/app/javascript/themes/glitch/features/compose/containers/spoiler_button_container.js
+++ b/app/javascript/flavours/glitch/features/compose/containers/spoiler_button_container.js
@@ -1,6 +1,6 @@
 import { connect } from 'react-redux';
 import TextIconButton from '../components/text_icon_button';
-import { changeComposeSpoilerness } from 'themes/glitch/actions/compose';
+import { changeComposeSpoilerness } from 'flavours/glitch/actions/compose';
 import { injectIntl, defineMessages } from 'react-intl';
 
 const messages = defineMessages({
diff --git a/app/javascript/themes/glitch/features/compose/containers/upload_button_container.js b/app/javascript/flavours/glitch/features/compose/containers/upload_button_container.js
index f332eae1a..4c1cb49e9 100644
--- a/app/javascript/themes/glitch/features/compose/containers/upload_button_container.js
+++ b/app/javascript/flavours/glitch/features/compose/containers/upload_button_container.js
@@ -1,6 +1,6 @@
 import { connect } from 'react-redux';
 import UploadButton from '../components/upload_button';
-import { uploadCompose } from 'themes/glitch/actions/compose';
+import { uploadCompose } from 'flavours/glitch/actions/compose';
 
 const mapStateToProps = state => ({
   disabled: state.getIn(['compose', 'is_uploading']) || (state.getIn(['compose', 'media_attachments']).size > 3 || state.getIn(['compose', 'media_attachments']).some(m => m.get('type') === 'video')),
diff --git a/app/javascript/themes/glitch/features/compose/containers/upload_container.js b/app/javascript/flavours/glitch/features/compose/containers/upload_container.js
index eea514bf5..368038425 100644
--- a/app/javascript/themes/glitch/features/compose/containers/upload_container.js
+++ b/app/javascript/flavours/glitch/features/compose/containers/upload_container.js
@@ -1,6 +1,6 @@
 import { connect } from 'react-redux';
 import Upload from '../components/upload';
-import { undoUploadCompose, changeUploadCompose } from 'themes/glitch/actions/compose';
+import { undoUploadCompose, changeUploadCompose } from 'flavours/glitch/actions/compose';
 
 const mapStateToProps = (state, { id }) => ({
   media: state.getIn(['compose', 'media_attachments']).find(item => item.get('id') === id),
diff --git a/app/javascript/themes/glitch/features/compose/containers/upload_form_container.js b/app/javascript/flavours/glitch/features/compose/containers/upload_form_container.js
index a6798bf51..a6798bf51 100644
--- a/app/javascript/themes/glitch/features/compose/containers/upload_form_container.js
+++ b/app/javascript/flavours/glitch/features/compose/containers/upload_form_container.js
diff --git a/app/javascript/themes/glitch/features/compose/containers/upload_progress_container.js b/app/javascript/flavours/glitch/features/compose/containers/upload_progress_container.js
index 0cfee96da..0cfee96da 100644
--- a/app/javascript/themes/glitch/features/compose/containers/upload_progress_container.js
+++ b/app/javascript/flavours/glitch/features/compose/containers/upload_progress_container.js
diff --git a/app/javascript/themes/glitch/features/compose/containers/warning_container.js b/app/javascript/flavours/glitch/features/compose/containers/warning_container.js
index 225d6a1dd..f20c75b91 100644
--- a/app/javascript/themes/glitch/features/compose/containers/warning_container.js
+++ b/app/javascript/flavours/glitch/features/compose/containers/warning_container.js
@@ -3,7 +3,7 @@ import { connect } from 'react-redux';
 import Warning from '../components/warning';
 import PropTypes from 'prop-types';
 import { FormattedMessage } from 'react-intl';
-import { me } from 'themes/glitch/util/initial_state';
+import { me } from 'flavours/glitch/util/initial_state';
 
 const mapStateToProps = state => ({
   needsLockWarning: state.getIn(['compose', 'privacy']) === 'private' && !state.getIn(['accounts', me, 'locked']),
diff --git a/app/javascript/themes/glitch/features/compose/index.js b/app/javascript/flavours/glitch/features/compose/index.js
index 3fcaf416f..02b97ad00 100644
--- a/app/javascript/themes/glitch/features/compose/index.js
+++ b/app/javascript/flavours/glitch/features/compose/index.js
@@ -4,16 +4,16 @@ import NavigationContainer from './containers/navigation_container';
 import PropTypes from 'prop-types';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import { connect } from 'react-redux';
-import { mountCompose, unmountCompose } from 'themes/glitch/actions/compose';
-import { openModal } from 'themes/glitch/actions/modal';
-import { changeLocalSetting } from 'themes/glitch/actions/local_settings';
+import { mountCompose, unmountCompose } from 'flavours/glitch/actions/compose';
+import { openModal } from 'flavours/glitch/actions/modal';
+import { changeLocalSetting } from 'flavours/glitch/actions/local_settings';
 import { Link } from 'react-router-dom';
 import { injectIntl, defineMessages } from 'react-intl';
 import SearchContainer from './containers/search_container';
-import Motion from 'themes/glitch/util/optional_motion';
+import Motion from 'flavours/glitch/util/optional_motion';
 import spring from 'react-motion/lib/spring';
 import SearchResultsContainer from './containers/search_results_container';
-import { changeComposing } from 'themes/glitch/actions/compose';
+import { changeComposing } from 'flavours/glitch/actions/compose';
 
 const messages = defineMessages({
   start: { id: 'getting_started.heading', defaultMessage: 'Getting started' },
diff --git a/app/javascript/themes/glitch/features/direct_timeline/containers/column_settings_container.js b/app/javascript/flavours/glitch/features/direct_timeline/containers/column_settings_container.js
index 2a40c65a5..d3e4b4216 100644
--- a/app/javascript/themes/glitch/features/direct_timeline/containers/column_settings_container.js
+++ b/app/javascript/flavours/glitch/features/direct_timeline/containers/column_settings_container.js
@@ -1,6 +1,6 @@
 import { connect } from 'react-redux';
-import ColumnSettings from 'themes/glitch/features/community_timeline/components/column_settings';
-import { changeSetting } from 'themes/glitch/actions/settings';
+import ColumnSettings from 'flavours/glitch/features/community_timeline/components/column_settings';
+import { changeSetting } from 'flavours/glitch/actions/settings';
 
 const mapStateToProps = state => ({
   settings: state.getIn(['settings', 'direct']),
diff --git a/app/javascript/themes/glitch/features/direct_timeline/index.js b/app/javascript/flavours/glitch/features/direct_timeline/index.js
index 6b29cf94d..81096c0ec 100644
--- a/app/javascript/themes/glitch/features/direct_timeline/index.js
+++ b/app/javascript/flavours/glitch/features/direct_timeline/index.js
@@ -1,17 +1,17 @@
 import React from 'react';
 import { connect } from 'react-redux';
 import PropTypes from 'prop-types';
-import StatusListContainer from 'themes/glitch/features/ui/containers/status_list_container';
-import Column from 'themes/glitch/components/column';
-import ColumnHeader from 'themes/glitch/components/column_header';
+import StatusListContainer from 'flavours/glitch/features/ui/containers/status_list_container';
+import Column from 'flavours/glitch/components/column';
+import ColumnHeader from 'flavours/glitch/components/column_header';
 import {
   refreshDirectTimeline,
   expandDirectTimeline,
-} from 'themes/glitch/actions/timelines';
-import { addColumn, removeColumn, moveColumn } from 'themes/glitch/actions/columns';
+} from 'flavours/glitch/actions/timelines';
+import { addColumn, removeColumn, moveColumn } from 'flavours/glitch/actions/columns';
 import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
 import ColumnSettingsContainer from './containers/column_settings_container';
-import { connectDirectStream } from 'themes/glitch/actions/streaming';
+import { connectDirectStream } from 'flavours/glitch/actions/streaming';
 
 const messages = defineMessages({
   title: { id: 'column.direct', defaultMessage: 'Direct messages' },
diff --git a/app/javascript/themes/glitch/features/favourited_statuses/index.js b/app/javascript/flavours/glitch/features/favourited_statuses/index.js
index 80345e0e2..e20dda718 100644
--- a/app/javascript/themes/glitch/features/favourited_statuses/index.js
+++ b/app/javascript/flavours/glitch/features/favourited_statuses/index.js
@@ -2,11 +2,11 @@ import React from 'react';
 import { connect } from 'react-redux';
 import PropTypes from 'prop-types';
 import ImmutablePropTypes from 'react-immutable-proptypes';
-import { fetchFavouritedStatuses, expandFavouritedStatuses } from 'themes/glitch/actions/favourites';
-import Column from 'themes/glitch/features/ui/components/column';
-import ColumnHeader from 'themes/glitch/components/column_header';
-import { addColumn, removeColumn, moveColumn } from 'themes/glitch/actions/columns';
-import StatusList from 'themes/glitch/components/status_list';
+import { fetchFavouritedStatuses, expandFavouritedStatuses } from 'flavours/glitch/actions/favourites';
+import Column from 'flavours/glitch/features/ui/components/column';
+import ColumnHeader from 'flavours/glitch/components/column_header';
+import { addColumn, removeColumn, moveColumn } from 'flavours/glitch/actions/columns';
+import StatusList from 'flavours/glitch/components/status_list';
 import { defineMessages, injectIntl } from 'react-intl';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 
diff --git a/app/javascript/themes/glitch/features/favourites/index.js b/app/javascript/flavours/glitch/features/favourites/index.js
index d7b8ac3b1..055a15ccb 100644
--- a/app/javascript/themes/glitch/features/favourites/index.js
+++ b/app/javascript/flavours/glitch/features/favourites/index.js
@@ -2,12 +2,12 @@ import React from 'react';
 import { connect } from 'react-redux';
 import PropTypes from 'prop-types';
 import ImmutablePropTypes from 'react-immutable-proptypes';
-import LoadingIndicator from 'themes/glitch/components/loading_indicator';
-import { fetchFavourites } from 'themes/glitch/actions/interactions';
+import LoadingIndicator from 'flavours/glitch/components/loading_indicator';
+import { fetchFavourites } from 'flavours/glitch/actions/interactions';
 import { ScrollContainer } from 'react-router-scroll-4';
-import AccountContainer from 'themes/glitch/containers/account_container';
-import Column from 'themes/glitch/features/ui/components/column';
-import ColumnBackButton from 'themes/glitch/components/column_back_button';
+import AccountContainer from 'flavours/glitch/containers/account_container';
+import Column from 'flavours/glitch/features/ui/components/column';
+import ColumnBackButton from 'flavours/glitch/components/column_back_button';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 
 const mapStateToProps = (state, props) => ({
diff --git a/app/javascript/themes/glitch/features/follow_requests/components/account_authorize.js b/app/javascript/flavours/glitch/features/follow_requests/components/account_authorize.js
index ce386d888..dead0753f 100644
--- a/app/javascript/themes/glitch/features/follow_requests/components/account_authorize.js
+++ b/app/javascript/flavours/glitch/features/follow_requests/components/account_authorize.js
@@ -1,10 +1,10 @@
 import React from 'react';
 import PropTypes from 'prop-types';
 import ImmutablePropTypes from 'react-immutable-proptypes';
-import Permalink from 'themes/glitch/components/permalink';
-import Avatar from 'themes/glitch/components/avatar';
-import DisplayName from 'themes/glitch/components/display_name';
-import IconButton from 'themes/glitch/components/icon_button';
+import Permalink from 'flavours/glitch/components/permalink';
+import Avatar from 'flavours/glitch/components/avatar';
+import DisplayName from 'flavours/glitch/components/display_name';
+import IconButton from 'flavours/glitch/components/icon_button';
 import { defineMessages, injectIntl } from 'react-intl';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 
diff --git a/app/javascript/themes/glitch/features/follow_requests/containers/account_authorize_container.js b/app/javascript/flavours/glitch/features/follow_requests/containers/account_authorize_container.js
index 78ae77eee..693e98e8c 100644
--- a/app/javascript/themes/glitch/features/follow_requests/containers/account_authorize_container.js
+++ b/app/javascript/flavours/glitch/features/follow_requests/containers/account_authorize_container.js
@@ -1,7 +1,7 @@
 import { connect } from 'react-redux';
-import { makeGetAccount } from 'themes/glitch/selectors';
+import { makeGetAccount } from 'flavours/glitch/selectors';
 import AccountAuthorize from '../components/account_authorize';
-import { authorizeFollowRequest, rejectFollowRequest } from 'themes/glitch/actions/accounts';
+import { authorizeFollowRequest, rejectFollowRequest } from 'flavours/glitch/actions/accounts';
 
 const makeMapStateToProps = () => {
   const getAccount = makeGetAccount();
diff --git a/app/javascript/themes/glitch/features/follow_requests/index.js b/app/javascript/flavours/glitch/features/follow_requests/index.js
index 3f44f518a..04ff3f111 100644
--- a/app/javascript/themes/glitch/features/follow_requests/index.js
+++ b/app/javascript/flavours/glitch/features/follow_requests/index.js
@@ -2,12 +2,12 @@ import React from 'react';
 import { connect } from 'react-redux';
 import PropTypes from 'prop-types';
 import ImmutablePropTypes from 'react-immutable-proptypes';
-import LoadingIndicator from 'themes/glitch/components/loading_indicator';
+import LoadingIndicator from 'flavours/glitch/components/loading_indicator';
 import { ScrollContainer } from 'react-router-scroll-4';
-import Column from 'themes/glitch/features/ui/components/column';
-import ColumnBackButtonSlim from 'themes/glitch/components/column_back_button_slim';
+import Column from 'flavours/glitch/features/ui/components/column';
+import ColumnBackButtonSlim from 'flavours/glitch/components/column_back_button_slim';
 import AccountAuthorizeContainer from './containers/account_authorize_container';
-import { fetchFollowRequests, expandFollowRequests } from 'themes/glitch/actions/accounts';
+import { fetchFollowRequests, expandFollowRequests } from 'flavours/glitch/actions/accounts';
 import { defineMessages, injectIntl } from 'react-intl';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 
diff --git a/app/javascript/themes/glitch/features/followers/index.js b/app/javascript/flavours/glitch/features/followers/index.js
index d586bf41d..f0ef29ff6 100644
--- a/app/javascript/themes/glitch/features/followers/index.js
+++ b/app/javascript/flavours/glitch/features/followers/index.js
@@ -2,18 +2,18 @@ import React from 'react';
 import { connect } from 'react-redux';
 import PropTypes from 'prop-types';
 import ImmutablePropTypes from 'react-immutable-proptypes';
-import LoadingIndicator from 'themes/glitch/components/loading_indicator';
+import LoadingIndicator from 'flavours/glitch/components/loading_indicator';
 import {
   fetchAccount,
   fetchFollowers,
   expandFollowers,
-} from 'themes/glitch/actions/accounts';
+} from 'flavours/glitch/actions/accounts';
 import { ScrollContainer } from 'react-router-scroll-4';
-import AccountContainer from 'themes/glitch/containers/account_container';
-import Column from 'themes/glitch/features/ui/components/column';
-import HeaderContainer from 'themes/glitch/features/account_timeline/containers/header_container';
-import LoadMore from 'themes/glitch/components/load_more';
-import ColumnBackButton from 'themes/glitch/components/column_back_button';
+import AccountContainer from 'flavours/glitch/containers/account_container';
+import Column from 'flavours/glitch/features/ui/components/column';
+import HeaderContainer from 'flavours/glitch/features/account_timeline/containers/header_container';
+import LoadMore from 'flavours/glitch/components/load_more';
+import ColumnBackButton from 'flavours/glitch/components/column_back_button';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 
 const mapStateToProps = (state, props) => ({
diff --git a/app/javascript/themes/glitch/features/following/index.js b/app/javascript/flavours/glitch/features/following/index.js
index c306faf21..f30f7b0d9 100644
--- a/app/javascript/themes/glitch/features/following/index.js
+++ b/app/javascript/flavours/glitch/features/following/index.js
@@ -2,18 +2,18 @@ import React from 'react';
 import { connect } from 'react-redux';
 import PropTypes from 'prop-types';
 import ImmutablePropTypes from 'react-immutable-proptypes';
-import LoadingIndicator from 'themes/glitch/components/loading_indicator';
+import LoadingIndicator from 'flavours/glitch/components/loading_indicator';
 import {
   fetchAccount,
   fetchFollowing,
   expandFollowing,
-} from 'themes/glitch/actions/accounts';
+} from 'flavours/glitch/actions/accounts';
 import { ScrollContainer } from 'react-router-scroll-4';
-import AccountContainer from 'themes/glitch/containers/account_container';
-import Column from 'themes/glitch/features/ui/components/column';
-import HeaderContainer from 'themes/glitch/features/account_timeline/containers/header_container';
-import LoadMore from 'themes/glitch/components/load_more';
-import ColumnBackButton from 'themes/glitch/components/column_back_button';
+import AccountContainer from 'flavours/glitch/containers/account_container';
+import Column from 'flavours/glitch/features/ui/components/column';
+import HeaderContainer from 'flavours/glitch/features/account_timeline/containers/header_container';
+import LoadMore from 'flavours/glitch/components/load_more';
+import ColumnBackButton from 'flavours/glitch/components/column_back_button';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 
 const mapStateToProps = (state, props) => ({
diff --git a/app/javascript/flavours/glitch/features/generic_not_found/index.js b/app/javascript/flavours/glitch/features/generic_not_found/index.js
new file mode 100644
index 000000000..d01a1ba47
--- /dev/null
+++ b/app/javascript/flavours/glitch/features/generic_not_found/index.js
@@ -0,0 +1,11 @@
+import React from 'react';
+import Column from 'flavours/glitch/features/ui/components/column';
+import MissingIndicator from 'flavours/glitch/components/missing_indicator';
+
+const GenericNotFound = () => (
+  <Column>
+    <MissingIndicator />
+  </Column>
+);
+
+export default GenericNotFound;
diff --git a/app/javascript/themes/glitch/features/getting_started/index.js b/app/javascript/flavours/glitch/features/getting_started/index.js
index 74b019cf1..2af0fcf48 100644
--- a/app/javascript/themes/glitch/features/getting_started/index.js
+++ b/app/javascript/flavours/glitch/features/getting_started/index.js
@@ -1,14 +1,14 @@
 import React from 'react';
-import Column from 'themes/glitch/features/ui/components/column';
-import ColumnLink from 'themes/glitch/features/ui/components/column_link';
-import ColumnSubheading from 'themes/glitch/features/ui/components/column_subheading';
+import Column from 'flavours/glitch/features/ui/components/column';
+import ColumnLink from 'flavours/glitch/features/ui/components/column_link';
+import ColumnSubheading from 'flavours/glitch/features/ui/components/column_subheading';
 import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
 import { connect } from 'react-redux';
-import { openModal } from 'themes/glitch/actions/modal';
+import { openModal } from 'flavours/glitch/actions/modal';
 import PropTypes from 'prop-types';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import ImmutablePureComponent from 'react-immutable-pure-component';
-import { me } from 'themes/glitch/util/initial_state';
+import { me } from 'flavours/glitch/util/initial_state';
 
 const messages = defineMessages({
   heading: { id: 'getting_started.heading', defaultMessage: 'Getting started' },
diff --git a/app/javascript/themes/glitch/features/hashtag_timeline/index.js b/app/javascript/flavours/glitch/features/hashtag_timeline/index.js
index a878931b3..9f3c9bec7 100644
--- a/app/javascript/themes/glitch/features/hashtag_timeline/index.js
+++ b/app/javascript/flavours/glitch/features/hashtag_timeline/index.js
@@ -1,16 +1,16 @@
 import React from 'react';
 import { connect } from 'react-redux';
 import PropTypes from 'prop-types';
-import StatusListContainer from 'themes/glitch/features/ui/containers/status_list_container';
-import Column from 'themes/glitch/components/column';
-import ColumnHeader from 'themes/glitch/components/column_header';
+import StatusListContainer from 'flavours/glitch/features/ui/containers/status_list_container';
+import Column from 'flavours/glitch/components/column';
+import ColumnHeader from 'flavours/glitch/components/column_header';
 import {
   refreshHashtagTimeline,
   expandHashtagTimeline,
-} from 'themes/glitch/actions/timelines';
-import { addColumn, removeColumn, moveColumn } from 'themes/glitch/actions/columns';
+} from 'flavours/glitch/actions/timelines';
+import { addColumn, removeColumn, moveColumn } from 'flavours/glitch/actions/columns';
 import { FormattedMessage } from 'react-intl';
-import { connectHashtagStream } from 'themes/glitch/actions/streaming';
+import { connectHashtagStream } from 'flavours/glitch/actions/streaming';
 
 const mapStateToProps = (state, props) => ({
   hasUnread: state.getIn(['timelines', `hashtag:${props.params.id}`, 'unread']) > 0,
diff --git a/app/javascript/themes/glitch/features/home_timeline/components/column_settings.js b/app/javascript/flavours/glitch/features/home_timeline/components/column_settings.js
index 533da6c36..604a7c6dc 100644
--- a/app/javascript/themes/glitch/features/home_timeline/components/column_settings.js
+++ b/app/javascript/flavours/glitch/features/home_timeline/components/column_settings.js
@@ -2,8 +2,8 @@ import React from 'react';
 import PropTypes from 'prop-types';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
-import SettingToggle from 'themes/glitch/features/notifications/components/setting_toggle';
-import SettingText from 'themes/glitch/components/setting_text';
+import SettingToggle from 'flavours/glitch/features/notifications/components/setting_toggle';
+import SettingText from 'flavours/glitch/components/setting_text';
 
 const messages = defineMessages({
   filter_regex: { id: 'home.column_settings.filter_regex', defaultMessage: 'Filter out by regular expressions' },
diff --git a/app/javascript/themes/glitch/features/home_timeline/containers/column_settings_container.js b/app/javascript/flavours/glitch/features/home_timeline/containers/column_settings_container.js
index a0062f564..19a8e792f 100644
--- a/app/javascript/themes/glitch/features/home_timeline/containers/column_settings_container.js
+++ b/app/javascript/flavours/glitch/features/home_timeline/containers/column_settings_container.js
@@ -1,6 +1,6 @@
 import { connect } from 'react-redux';
 import ColumnSettings from '../components/column_settings';
-import { changeSetting, saveSettings } from 'themes/glitch/actions/settings';
+import { changeSetting, saveSettings } from 'flavours/glitch/actions/settings';
 
 const mapStateToProps = state => ({
   settings: state.getIn(['settings', 'home']),
diff --git a/app/javascript/themes/glitch/features/home_timeline/index.js b/app/javascript/flavours/glitch/features/home_timeline/index.js
index 8a65891cd..2dfec6bbe 100644
--- a/app/javascript/themes/glitch/features/home_timeline/index.js
+++ b/app/javascript/flavours/glitch/features/home_timeline/index.js
@@ -1,11 +1,11 @@
 import React from 'react';
 import { connect } from 'react-redux';
-import { expandHomeTimeline } from 'themes/glitch/actions/timelines';
+import { expandHomeTimeline } from 'flavours/glitch/actions/timelines';
 import PropTypes from 'prop-types';
-import StatusListContainer from 'themes/glitch/features/ui/containers/status_list_container';
-import Column from 'themes/glitch/components/column';
-import ColumnHeader from 'themes/glitch/components/column_header';
-import { addColumn, removeColumn, moveColumn } from 'themes/glitch/actions/columns';
+import StatusListContainer from 'flavours/glitch/features/ui/containers/status_list_container';
+import Column from 'flavours/glitch/components/column';
+import ColumnHeader from 'flavours/glitch/components/column_header';
+import { addColumn, removeColumn, moveColumn } from 'flavours/glitch/actions/columns';
 import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
 import ColumnSettingsContainer from './containers/column_settings_container';
 import { Link } from 'react-router-dom';
diff --git a/app/javascript/themes/glitch/features/local_settings/index.js b/app/javascript/flavours/glitch/features/local_settings/index.js
index 6c5d51413..81d9a3f41 100644
--- a/app/javascript/themes/glitch/features/local_settings/index.js
+++ b/app/javascript/flavours/glitch/features/local_settings/index.js
@@ -7,8 +7,8 @@ import { connect } from 'react-redux';
 //  Our imports
 import LocalSettingsPage from './page';
 import LocalSettingsNavigation from './navigation';
-import { closeModal } from 'themes/glitch/actions/modal';
-import { changeLocalSetting } from 'themes/glitch/actions/local_settings';
+import { closeModal } from 'flavours/glitch/actions/modal';
+import { changeLocalSetting } from 'flavours/glitch/actions/local_settings';
 
 //  Stylesheet imports
 import './style.scss';
diff --git a/app/javascript/themes/glitch/features/local_settings/navigation/index.js b/app/javascript/flavours/glitch/features/local_settings/navigation/index.js
index fa35e83c7..fa35e83c7 100644
--- a/app/javascript/themes/glitch/features/local_settings/navigation/index.js
+++ b/app/javascript/flavours/glitch/features/local_settings/navigation/index.js
diff --git a/app/javascript/themes/glitch/features/local_settings/navigation/item/index.js b/app/javascript/flavours/glitch/features/local_settings/navigation/item/index.js
index a352d5fb2..a352d5fb2 100644
--- a/app/javascript/themes/glitch/features/local_settings/navigation/item/index.js
+++ b/app/javascript/flavours/glitch/features/local_settings/navigation/item/index.js
diff --git a/app/javascript/themes/glitch/features/local_settings/navigation/item/style.scss b/app/javascript/flavours/glitch/features/local_settings/navigation/item/style.scss
index 7f7371993..7f7371993 100644
--- a/app/javascript/themes/glitch/features/local_settings/navigation/item/style.scss
+++ b/app/javascript/flavours/glitch/features/local_settings/navigation/item/style.scss
diff --git a/app/javascript/themes/glitch/features/local_settings/navigation/style.scss b/app/javascript/flavours/glitch/features/local_settings/navigation/style.scss
index 0336f943b..0336f943b 100644
--- a/app/javascript/themes/glitch/features/local_settings/navigation/style.scss
+++ b/app/javascript/flavours/glitch/features/local_settings/navigation/style.scss
diff --git a/app/javascript/themes/glitch/features/local_settings/page/index.js b/app/javascript/flavours/glitch/features/local_settings/page/index.js
index 498230f7b..498230f7b 100644
--- a/app/javascript/themes/glitch/features/local_settings/page/index.js
+++ b/app/javascript/flavours/glitch/features/local_settings/page/index.js
diff --git a/app/javascript/themes/glitch/features/local_settings/page/item/index.js b/app/javascript/flavours/glitch/features/local_settings/page/item/index.js
index 37e28c084..37e28c084 100644
--- a/app/javascript/themes/glitch/features/local_settings/page/item/index.js
+++ b/app/javascript/flavours/glitch/features/local_settings/page/item/index.js
diff --git a/app/javascript/themes/glitch/features/local_settings/page/item/style.scss b/app/javascript/flavours/glitch/features/local_settings/page/item/style.scss
index b2d8f7185..b2d8f7185 100644
--- a/app/javascript/themes/glitch/features/local_settings/page/item/style.scss
+++ b/app/javascript/flavours/glitch/features/local_settings/page/item/style.scss
diff --git a/app/javascript/themes/glitch/features/local_settings/page/style.scss b/app/javascript/flavours/glitch/features/local_settings/page/style.scss
index e9eedcad0..e9eedcad0 100644
--- a/app/javascript/themes/glitch/features/local_settings/page/style.scss
+++ b/app/javascript/flavours/glitch/features/local_settings/page/style.scss
diff --git a/app/javascript/themes/glitch/features/local_settings/style.scss b/app/javascript/flavours/glitch/features/local_settings/style.scss
index 765294607..765294607 100644
--- a/app/javascript/themes/glitch/features/local_settings/style.scss
+++ b/app/javascript/flavours/glitch/features/local_settings/style.scss
diff --git a/app/javascript/themes/glitch/features/mutes/index.js b/app/javascript/flavours/glitch/features/mutes/index.js
index 1158b8262..87517eec9 100644
--- a/app/javascript/themes/glitch/features/mutes/index.js
+++ b/app/javascript/flavours/glitch/features/mutes/index.js
@@ -2,12 +2,12 @@ import React from 'react';
 import { connect } from 'react-redux';
 import PropTypes from 'prop-types';
 import ImmutablePropTypes from 'react-immutable-proptypes';
-import LoadingIndicator from 'themes/glitch/components/loading_indicator';
+import LoadingIndicator from 'flavours/glitch/components/loading_indicator';
 import { ScrollContainer } from 'react-router-scroll-4';
-import Column from 'themes/glitch/features/ui/components/column';
-import ColumnBackButtonSlim from 'themes/glitch/components/column_back_button_slim';
-import AccountContainer from 'themes/glitch/containers/account_container';
-import { fetchMutes, expandMutes } from 'themes/glitch/actions/mutes';
+import Column from 'flavours/glitch/features/ui/components/column';
+import ColumnBackButtonSlim from 'flavours/glitch/components/column_back_button_slim';
+import AccountContainer from 'flavours/glitch/containers/account_container';
+import { fetchMutes, expandMutes } from 'flavours/glitch/actions/mutes';
 import { defineMessages, injectIntl } from 'react-intl';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 
diff --git a/app/javascript/themes/glitch/features/notifications/components/clear_column_button.js b/app/javascript/flavours/glitch/features/notifications/components/clear_column_button.js
index 22a10753f..22a10753f 100644
--- a/app/javascript/themes/glitch/features/notifications/components/clear_column_button.js
+++ b/app/javascript/flavours/glitch/features/notifications/components/clear_column_button.js
diff --git a/app/javascript/themes/glitch/features/notifications/components/column_settings.js b/app/javascript/flavours/glitch/features/notifications/components/column_settings.js
index 88a29d4d3..88a29d4d3 100644
--- a/app/javascript/themes/glitch/features/notifications/components/column_settings.js
+++ b/app/javascript/flavours/glitch/features/notifications/components/column_settings.js
diff --git a/app/javascript/themes/glitch/features/notifications/components/follow.js b/app/javascript/flavours/glitch/features/notifications/components/follow.js
index 8a0f01736..4b682733e 100644
--- a/app/javascript/themes/glitch/features/notifications/components/follow.js
+++ b/app/javascript/flavours/glitch/features/notifications/components/follow.js
@@ -7,8 +7,8 @@ import ImmutablePureComponent from 'react-immutable-pure-component';
 import { HotKeys } from 'react-hotkeys';
 
 // Our imports.
-import Permalink from 'themes/glitch/components/permalink';
-import AccountContainer from 'themes/glitch/containers/account_container';
+import Permalink from 'flavours/glitch/components/permalink';
+import AccountContainer from 'flavours/glitch/containers/account_container';
 import NotificationOverlayContainer from '../containers/overlay_container';
 
 export default class NotificationFollow extends ImmutablePureComponent {
diff --git a/app/javascript/themes/glitch/features/notifications/components/notification.js b/app/javascript/flavours/glitch/features/notifications/components/notification.js
index a309d3a42..185da8395 100644
--- a/app/javascript/themes/glitch/features/notifications/components/notification.js
+++ b/app/javascript/flavours/glitch/features/notifications/components/notification.js
@@ -5,7 +5,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 
 //  Our imports,
-import StatusContainer from 'themes/glitch/containers/status_container';
+import StatusContainer from 'flavours/glitch/containers/status_container';
 import NotificationFollow from './follow';
 
 export default class Notification extends ImmutablePureComponent {
diff --git a/app/javascript/themes/glitch/features/notifications/components/overlay.js b/app/javascript/flavours/glitch/features/notifications/components/overlay.js
index e56f9c628..e56f9c628 100644
--- a/app/javascript/themes/glitch/features/notifications/components/overlay.js
+++ b/app/javascript/flavours/glitch/features/notifications/components/overlay.js
diff --git a/app/javascript/themes/glitch/features/notifications/components/setting_toggle.js b/app/javascript/flavours/glitch/features/notifications/components/setting_toggle.js
index 281359d2a..281359d2a 100644
--- a/app/javascript/themes/glitch/features/notifications/components/setting_toggle.js
+++ b/app/javascript/flavours/glitch/features/notifications/components/setting_toggle.js
diff --git a/app/javascript/themes/glitch/features/notifications/containers/column_settings_container.js b/app/javascript/flavours/glitch/features/notifications/containers/column_settings_container.js
index ddc8495f4..ce502700c 100644
--- a/app/javascript/themes/glitch/features/notifications/containers/column_settings_container.js
+++ b/app/javascript/flavours/glitch/features/notifications/containers/column_settings_container.js
@@ -1,10 +1,10 @@
 import { connect } from 'react-redux';
 import { defineMessages, injectIntl } from 'react-intl';
 import ColumnSettings from '../components/column_settings';
-import { changeSetting, saveSettings } from 'themes/glitch/actions/settings';
-import { clearNotifications } from 'themes/glitch/actions/notifications';
-import { changeAlerts as changePushNotifications, saveSettings as savePushNotificationSettings } from 'themes/glitch/actions/push_notifications';
-import { openModal } from 'themes/glitch/actions/modal';
+import { changeSetting, saveSettings } from 'flavours/glitch/actions/settings';
+import { clearNotifications } from 'flavours/glitch/actions/notifications';
+import { changeAlerts as changePushNotifications, saveSettings as savePushNotificationSettings } from 'flavours/glitch/actions/push_notifications';
+import { openModal } from 'flavours/glitch/actions/modal';
 
 const messages = defineMessages({
   clearMessage: { id: 'notifications.clear_confirmation', defaultMessage: 'Are you sure you want to permanently clear all your notifications?' },
diff --git a/app/javascript/themes/glitch/features/notifications/containers/notification_container.js b/app/javascript/flavours/glitch/features/notifications/containers/notification_container.js
index b61aaa21c..c60e72e1c 100644
--- a/app/javascript/themes/glitch/features/notifications/containers/notification_container.js
+++ b/app/javascript/flavours/glitch/features/notifications/containers/notification_container.js
@@ -2,9 +2,9 @@
 import { connect } from 'react-redux';
 
 //  Our imports.
-import { makeGetNotification } from 'themes/glitch/selectors';
+import { makeGetNotification } from 'flavours/glitch/selectors';
 import Notification from '../components/notification';
-import { mentionCompose } from 'themes/glitch/actions/compose';
+import { mentionCompose } from 'flavours/glitch/actions/compose';
 
 const makeMapStateToProps = () => {
   const getNotification = makeGetNotification();
diff --git a/app/javascript/themes/glitch/features/notifications/containers/overlay_container.js b/app/javascript/flavours/glitch/features/notifications/containers/overlay_container.js
index 52649cdd7..ee2d19814 100644
--- a/app/javascript/themes/glitch/features/notifications/containers/overlay_container.js
+++ b/app/javascript/flavours/glitch/features/notifications/containers/overlay_container.js
@@ -3,7 +3,7 @@ import { connect } from 'react-redux';
 
 //  Our imports.
 import NotificationOverlay from '../components/overlay';
-import { markNotificationForDelete } from 'themes/glitch/actions/notifications';
+import { markNotificationForDelete } from 'flavours/glitch/actions/notifications';
 
 const mapDispatchToProps = dispatch => ({
   onMarkForDelete(id, yes) {
diff --git a/app/javascript/themes/glitch/features/notifications/index.js b/app/javascript/flavours/glitch/features/notifications/index.js
index 1ecde660a..12b0b5b83 100644
--- a/app/javascript/themes/glitch/features/notifications/index.js
+++ b/app/javascript/flavours/glitch/features/notifications/index.js
@@ -2,21 +2,21 @@ import React from 'react';
 import { connect } from 'react-redux';
 import PropTypes from 'prop-types';
 import ImmutablePropTypes from 'react-immutable-proptypes';
-import Column from 'themes/glitch/components/column';
-import ColumnHeader from 'themes/glitch/components/column_header';
+import Column from 'flavours/glitch/components/column';
+import ColumnHeader from 'flavours/glitch/components/column_header';
 import {
   enterNotificationClearingMode,
   expandNotifications,
   scrollTopNotifications,
-} from 'themes/glitch/actions/notifications';
-import { addColumn, removeColumn, moveColumn } from 'themes/glitch/actions/columns';
+} from 'flavours/glitch/actions/notifications';
+import { addColumn, removeColumn, moveColumn } from 'flavours/glitch/actions/columns';
 import NotificationContainer from './containers/notification_container';
 import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
 import ColumnSettingsContainer from './containers/column_settings_container';
 import { createSelector } from 'reselect';
 import { List as ImmutableList } from 'immutable';
 import { debounce } from 'lodash';
-import ScrollableList from 'themes/glitch/components/scrollable_list';
+import ScrollableList from 'flavours/glitch/components/scrollable_list';
 
 const messages = defineMessages({
   title: { id: 'column.notifications', defaultMessage: 'Notifications' },
diff --git a/app/javascript/themes/glitch/features/pinned_statuses/index.js b/app/javascript/flavours/glitch/features/pinned_statuses/index.js
index 0a3997850..f56d70176 100644
--- a/app/javascript/themes/glitch/features/pinned_statuses/index.js
+++ b/app/javascript/flavours/glitch/features/pinned_statuses/index.js
@@ -2,10 +2,10 @@ import React from 'react';
 import { connect } from 'react-redux';
 import PropTypes from 'prop-types';
 import ImmutablePropTypes from 'react-immutable-proptypes';
-import { fetchPinnedStatuses } from 'themes/glitch/actions/pin_statuses';
-import Column from 'themes/glitch/features/ui/components/column';
-import ColumnBackButtonSlim from 'themes/glitch/components/column_back_button_slim';
-import StatusList from 'themes/glitch/components/status_list';
+import { fetchPinnedStatuses } from 'flavours/glitch/actions/pin_statuses';
+import Column from 'flavours/glitch/features/ui/components/column';
+import ColumnBackButtonSlim from 'flavours/glitch/components/column_back_button_slim';
+import StatusList from 'flavours/glitch/components/status_list';
 import { defineMessages, injectIntl } from 'react-intl';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 
diff --git a/app/javascript/themes/glitch/features/public_timeline/containers/column_settings_container.js b/app/javascript/flavours/glitch/features/public_timeline/containers/column_settings_container.js
index 0185a7724..b13e20645 100644
--- a/app/javascript/themes/glitch/features/public_timeline/containers/column_settings_container.js
+++ b/app/javascript/flavours/glitch/features/public_timeline/containers/column_settings_container.js
@@ -1,6 +1,6 @@
 import { connect } from 'react-redux';
-import ColumnSettings from 'themes/glitch/features/community_timeline/components/column_settings';
-import { changeSetting } from 'themes/glitch/actions/settings';
+import ColumnSettings from 'flavours/glitch/features/community_timeline/components/column_settings';
+import { changeSetting } from 'flavours/glitch/actions/settings';
 
 const mapStateToProps = state => ({
   settings: state.getIn(['settings', 'public']),
diff --git a/app/javascript/themes/glitch/features/public_timeline/index.js b/app/javascript/flavours/glitch/features/public_timeline/index.js
index f5b3865af..bbdd4612e 100644
--- a/app/javascript/themes/glitch/features/public_timeline/index.js
+++ b/app/javascript/flavours/glitch/features/public_timeline/index.js
@@ -1,17 +1,17 @@
 import React from 'react';
 import { connect } from 'react-redux';
 import PropTypes from 'prop-types';
-import StatusListContainer from 'themes/glitch/features/ui/containers/status_list_container';
-import Column from 'themes/glitch/components/column';
-import ColumnHeader from 'themes/glitch/components/column_header';
+import StatusListContainer from 'flavours/glitch/features/ui/containers/status_list_container';
+import Column from 'flavours/glitch/components/column';
+import ColumnHeader from 'flavours/glitch/components/column_header';
 import {
   refreshPublicTimeline,
   expandPublicTimeline,
-} from 'themes/glitch/actions/timelines';
-import { addColumn, removeColumn, moveColumn } from 'themes/glitch/actions/columns';
+} from 'flavours/glitch/actions/timelines';
+import { addColumn, removeColumn, moveColumn } from 'flavours/glitch/actions/columns';
 import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
 import ColumnSettingsContainer from './containers/column_settings_container';
-import { connectPublicStream } from 'themes/glitch/actions/streaming';
+import { connectPublicStream } from 'flavours/glitch/actions/streaming';
 
 const messages = defineMessages({
   title: { id: 'column.public', defaultMessage: 'Federated timeline' },
diff --git a/app/javascript/themes/glitch/features/reblogs/index.js b/app/javascript/flavours/glitch/features/reblogs/index.js
index 8723f7c7c..25b792b39 100644
--- a/app/javascript/themes/glitch/features/reblogs/index.js
+++ b/app/javascript/flavours/glitch/features/reblogs/index.js
@@ -2,12 +2,12 @@ import React from 'react';
 import { connect } from 'react-redux';
 import PropTypes from 'prop-types';
 import ImmutablePropTypes from 'react-immutable-proptypes';
-import LoadingIndicator from 'themes/glitch/components/loading_indicator';
-import { fetchReblogs } from 'themes/glitch/actions/interactions';
+import LoadingIndicator from 'flavours/glitch/components/loading_indicator';
+import { fetchReblogs } from 'flavours/glitch/actions/interactions';
 import { ScrollContainer } from 'react-router-scroll-4';
-import AccountContainer from 'themes/glitch/containers/account_container';
-import Column from 'themes/glitch/features/ui/components/column';
-import ColumnBackButton from 'themes/glitch/components/column_back_button';
+import AccountContainer from 'flavours/glitch/containers/account_container';
+import Column from 'flavours/glitch/features/ui/components/column';
+import ColumnBackButton from 'flavours/glitch/components/column_back_button';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 
 const mapStateToProps = (state, props) => ({
diff --git a/app/javascript/themes/glitch/features/report/components/status_check_box.js b/app/javascript/flavours/glitch/features/report/components/status_check_box.js
index cc9232201..cc9232201 100644
--- a/app/javascript/themes/glitch/features/report/components/status_check_box.js
+++ b/app/javascript/flavours/glitch/features/report/components/status_check_box.js
diff --git a/app/javascript/themes/glitch/features/report/containers/status_check_box_container.js b/app/javascript/flavours/glitch/features/report/containers/status_check_box_container.js
index 40d55fb3c..9bfd41ffc 100644
--- a/app/javascript/themes/glitch/features/report/containers/status_check_box_container.js
+++ b/app/javascript/flavours/glitch/features/report/containers/status_check_box_container.js
@@ -1,6 +1,6 @@
 import { connect } from 'react-redux';
 import StatusCheckBox from '../components/status_check_box';
-import { toggleStatusReport } from 'themes/glitch/actions/reports';
+import { toggleStatusReport } from 'flavours/glitch/actions/reports';
 import { Set as ImmutableSet } from 'immutable';
 
 const mapStateToProps = (state, { id }) => ({
diff --git a/app/javascript/flavours/glitch/features/standalone/compose/index.js b/app/javascript/flavours/glitch/features/standalone/compose/index.js
new file mode 100644
index 000000000..b33c21cb5
--- /dev/null
+++ b/app/javascript/flavours/glitch/features/standalone/compose/index.js
@@ -0,0 +1,20 @@
+import React from 'react';
+import ComposeFormContainer from 'flavours/glitch/features/compose/containers/compose_form_container';
+import NotificationsContainer from 'flavours/glitch/features/ui/containers/notifications_container';
+import LoadingBarContainer from 'flavours/glitch/features/ui/containers/loading_bar_container';
+import ModalContainer from 'flavours/glitch/features/ui/containers/modal_container';
+
+export default class Compose extends React.PureComponent {
+
+  render () {
+    return (
+      <div>
+        <ComposeFormContainer />
+        <NotificationsContainer />
+        <ModalContainer />
+        <LoadingBarContainer className='loading-bar' />
+      </div>
+    );
+  }
+
+}
diff --git a/app/javascript/themes/glitch/features/standalone/hashtag_timeline/index.js b/app/javascript/flavours/glitch/features/standalone/hashtag_timeline/index.js
index 7c56f264f..0ad2cef80 100644
--- a/app/javascript/themes/glitch/features/standalone/hashtag_timeline/index.js
+++ b/app/javascript/flavours/glitch/features/standalone/hashtag_timeline/index.js
@@ -1,13 +1,13 @@
 import React from 'react';
 import { connect } from 'react-redux';
 import PropTypes from 'prop-types';
-import StatusListContainer from 'themes/glitch/features/ui/containers/status_list_container';
+import StatusListContainer from 'flavours/glitch/features/ui/containers/status_list_container';
 import {
   refreshHashtagTimeline,
   expandHashtagTimeline,
-} from 'themes/glitch/actions/timelines';
-import Column from 'themes/glitch/components/column';
-import ColumnHeader from 'themes/glitch/components/column_header';
+} from 'flavours/glitch/actions/timelines';
+import Column from 'flavours/glitch/components/column';
+import ColumnHeader from 'flavours/glitch/components/column_header';
 
 @connect()
 export default class HashtagTimeline extends React.PureComponent {
diff --git a/app/javascript/themes/glitch/features/standalone/public_timeline/index.js b/app/javascript/flavours/glitch/features/standalone/public_timeline/index.js
index b3fb55288..717f6fcaf 100644
--- a/app/javascript/themes/glitch/features/standalone/public_timeline/index.js
+++ b/app/javascript/flavours/glitch/features/standalone/public_timeline/index.js
@@ -1,13 +1,13 @@
 import React from 'react';
 import { connect } from 'react-redux';
 import PropTypes from 'prop-types';
-import StatusListContainer from 'themes/glitch/features/ui/containers/status_list_container';
+import StatusListContainer from 'flavours/glitch/features/ui/containers/status_list_container';
 import {
   refreshPublicTimeline,
   expandPublicTimeline,
-} from 'themes/glitch/actions/timelines';
-import Column from 'themes/glitch/components/column';
-import ColumnHeader from 'themes/glitch/components/column_header';
+} from 'flavours/glitch/actions/timelines';
+import Column from 'flavours/glitch/components/column';
+import ColumnHeader from 'flavours/glitch/components/column_header';
 import { defineMessages, injectIntl } from 'react-intl';
 
 const messages = defineMessages({
diff --git a/app/javascript/themes/glitch/features/status/components/action_bar.js b/app/javascript/flavours/glitch/features/status/components/action_bar.js
index 6cda988d1..4d660ee3c 100644
--- a/app/javascript/themes/glitch/features/status/components/action_bar.js
+++ b/app/javascript/flavours/glitch/features/status/components/action_bar.js
@@ -1,10 +1,10 @@
 import React from 'react';
 import PropTypes from 'prop-types';
-import IconButton from 'themes/glitch/components/icon_button';
+import IconButton from 'flavours/glitch/components/icon_button';
 import ImmutablePropTypes from 'react-immutable-proptypes';
-import DropdownMenuContainer from 'themes/glitch/containers/dropdown_menu_container';
+import DropdownMenuContainer from 'flavours/glitch/containers/dropdown_menu_container';
 import { defineMessages, injectIntl } from 'react-intl';
-import { me } from 'themes/glitch/util/initial_state';
+import { me } from 'flavours/glitch/util/initial_state';
 
 const messages = defineMessages({
   delete: { id: 'status.delete', defaultMessage: 'Delete' },
diff --git a/app/javascript/themes/glitch/features/status/components/card.js b/app/javascript/flavours/glitch/features/status/components/card.js
index bb83374b9..bb83374b9 100644
--- a/app/javascript/themes/glitch/features/status/components/card.js
+++ b/app/javascript/flavours/glitch/features/status/components/card.js
diff --git a/app/javascript/themes/glitch/features/status/components/detailed_status.js b/app/javascript/flavours/glitch/features/status/components/detailed_status.js
index 7606bfbf3..7c6f436d6 100644
--- a/app/javascript/themes/glitch/features/status/components/detailed_status.js
+++ b/app/javascript/flavours/glitch/features/status/components/detailed_status.js
@@ -1,17 +1,17 @@
 import React from 'react';
 import PropTypes from 'prop-types';
 import ImmutablePropTypes from 'react-immutable-proptypes';
-import Avatar from 'themes/glitch/components/avatar';
-import DisplayName from 'themes/glitch/components/display_name';
-import StatusContent from 'themes/glitch/components/status_content';
-import StatusGallery from 'themes/glitch/components/media_gallery';
-import AttachmentList from 'themes/glitch/components/attachment_list';
+import Avatar from 'flavours/glitch/components/avatar';
+import DisplayName from 'flavours/glitch/components/display_name';
+import StatusContent from 'flavours/glitch/components/status_content';
+import StatusGallery from 'flavours/glitch/components/media_gallery';
+import AttachmentList from 'flavours/glitch/components/attachment_list';
 import { Link } from 'react-router-dom';
 import { FormattedDate, FormattedNumber } from 'react-intl';
 import CardContainer from '../containers/card_container';
 import ImmutablePureComponent from 'react-immutable-pure-component';
-import Video from 'themes/glitch/features/video';
-import VisibilityIcon from 'themes/glitch/components/status_visibility_icon';
+import Video from 'flavours/glitch/features/video';
+import VisibilityIcon from 'flavours/glitch/components/status_visibility_icon';
 
 export default class DetailedStatus extends ImmutablePureComponent {
 
diff --git a/app/javascript/themes/glitch/features/status/containers/card_container.js b/app/javascript/flavours/glitch/features/status/containers/card_container.js
index a97404de1..a97404de1 100644
--- a/app/javascript/themes/glitch/features/status/containers/card_container.js
+++ b/app/javascript/flavours/glitch/features/status/containers/card_container.js
diff --git a/app/javascript/themes/glitch/features/status/index.js b/app/javascript/flavours/glitch/features/status/index.js
index 57af94a9a..73b212bba 100644
--- a/app/javascript/themes/glitch/features/status/index.js
+++ b/app/javascript/flavours/glitch/features/status/index.js
@@ -3,11 +3,11 @@ import { connect } from 'react-redux';
 import PropTypes from 'prop-types';
 import classNames from 'classnames';
 import ImmutablePropTypes from 'react-immutable-proptypes';
-import { fetchStatus } from 'themes/glitch/actions/statuses';
-import MissingIndicator from 'themes/glitch/components/missing_indicator';
+import { fetchStatus } from 'flavours/glitch/actions/statuses';
+import MissingIndicator from 'flavours/glitch/components/missing_indicator';
 import DetailedStatus from './components/detailed_status';
 import ActionBar from './components/action_bar';
-import Column from 'themes/glitch/features/ui/components/column';
+import Column from 'flavours/glitch/features/ui/components/column';
 import {
   favourite,
   unfavourite,
@@ -15,23 +15,23 @@ import {
   unreblog,
   pin,
   unpin,
-} from 'themes/glitch/actions/interactions';
+} from 'flavours/glitch/actions/interactions';
 import {
   replyCompose,
   mentionCompose,
-} from 'themes/glitch/actions/compose';
-import { deleteStatus } from 'themes/glitch/actions/statuses';
-import { initReport } from 'themes/glitch/actions/reports';
-import { makeGetStatus } from 'themes/glitch/selectors';
+} from 'flavours/glitch/actions/compose';
+import { deleteStatus } from 'flavours/glitch/actions/statuses';
+import { initReport } from 'flavours/glitch/actions/reports';
+import { makeGetStatus } from 'flavours/glitch/selectors';
 import { ScrollContainer } from 'react-router-scroll-4';
-import ColumnBackButton from 'themes/glitch/components/column_back_button';
-import StatusContainer from 'themes/glitch/containers/status_container';
-import { openModal } from 'themes/glitch/actions/modal';
+import ColumnBackButton from 'flavours/glitch/components/column_back_button';
+import StatusContainer from 'flavours/glitch/containers/status_container';
+import { openModal } from 'flavours/glitch/actions/modal';
 import { defineMessages, injectIntl } from 'react-intl';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 import { HotKeys } from 'react-hotkeys';
-import { boostModal, deleteModal } from 'themes/glitch/util/initial_state';
-import { attachFullscreenListener, detachFullscreenListener, isFullscreen } from 'themes/glitch/util/fullscreen';
+import { boostModal, deleteModal } from 'flavours/glitch/util/initial_state';
+import { attachFullscreenListener, detachFullscreenListener, isFullscreen } from 'flavours/glitch/util/fullscreen';
 
 const messages = defineMessages({
   deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' },
diff --git a/app/javascript/themes/glitch/features/ui/components/actions_modal.js b/app/javascript/flavours/glitch/features/ui/components/actions_modal.js
index 7a2b78b63..0873c282f 100644
--- a/app/javascript/themes/glitch/features/ui/components/actions_modal.js
+++ b/app/javascript/flavours/glitch/features/ui/components/actions_modal.js
@@ -2,11 +2,11 @@ import React from 'react';
 import PropTypes from 'prop-types';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import ImmutablePureComponent from 'react-immutable-pure-component';
-import StatusContent from 'themes/glitch/components/status_content';
-import Avatar from 'themes/glitch/components/avatar';
-import RelativeTimestamp from 'themes/glitch/components/relative_timestamp';
-import DisplayName from 'themes/glitch/components/display_name';
-import IconButton from 'themes/glitch/components/icon_button';
+import StatusContent from 'flavours/glitch/components/status_content';
+import Avatar from 'flavours/glitch/components/avatar';
+import RelativeTimestamp from 'flavours/glitch/components/relative_timestamp';
+import DisplayName from 'flavours/glitch/components/display_name';
+import IconButton from 'flavours/glitch/components/icon_button';
 import classNames from 'classnames';
 
 export default class ActionsModal extends ImmutablePureComponent {
diff --git a/app/javascript/themes/glitch/features/ui/components/boost_modal.js b/app/javascript/flavours/glitch/features/ui/components/boost_modal.js
index 49781db10..9652bcb2d 100644
--- a/app/javascript/themes/glitch/features/ui/components/boost_modal.js
+++ b/app/javascript/flavours/glitch/features/ui/components/boost_modal.js
@@ -2,11 +2,11 @@ import React from 'react';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import PropTypes from 'prop-types';
 import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
-import Button from 'themes/glitch/components/button';
-import StatusContent from 'themes/glitch/components/status_content';
-import Avatar from 'themes/glitch/components/avatar';
-import RelativeTimestamp from 'themes/glitch/components/relative_timestamp';
-import DisplayName from 'themes/glitch/components/display_name';
+import Button from 'flavours/glitch/components/button';
+import StatusContent from 'flavours/glitch/components/status_content';
+import Avatar from 'flavours/glitch/components/avatar';
+import RelativeTimestamp from 'flavours/glitch/components/relative_timestamp';
+import DisplayName from 'flavours/glitch/components/display_name';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 
 const messages = defineMessages({
diff --git a/app/javascript/themes/glitch/features/ui/components/bundle.js b/app/javascript/flavours/glitch/features/ui/components/bundle.js
index fc88e0c70..fc88e0c70 100644
--- a/app/javascript/themes/glitch/features/ui/components/bundle.js
+++ b/app/javascript/flavours/glitch/features/ui/components/bundle.js
diff --git a/app/javascript/themes/glitch/features/ui/components/bundle_column_error.js b/app/javascript/flavours/glitch/features/ui/components/bundle_column_error.js
index daedc6299..3e979a250 100644
--- a/app/javascript/themes/glitch/features/ui/components/bundle_column_error.js
+++ b/app/javascript/flavours/glitch/features/ui/components/bundle_column_error.js
@@ -4,8 +4,8 @@ import { defineMessages, injectIntl } from 'react-intl';
 
 import Column from './column';
 import ColumnHeader from './column_header';
-import ColumnBackButtonSlim from 'themes/glitch/components/column_back_button_slim';
-import IconButton from 'themes/glitch/components/icon_button';
+import ColumnBackButtonSlim from 'flavours/glitch/components/column_back_button_slim';
+import IconButton from 'flavours/glitch/components/icon_button';
 
 const messages = defineMessages({
   title: { id: 'bundle_column_error.title', defaultMessage: 'Network error' },
diff --git a/app/javascript/themes/glitch/features/ui/components/bundle_modal_error.js b/app/javascript/flavours/glitch/features/ui/components/bundle_modal_error.js
index 8cca32ae9..2c14a1e5c 100644
--- a/app/javascript/themes/glitch/features/ui/components/bundle_modal_error.js
+++ b/app/javascript/flavours/glitch/features/ui/components/bundle_modal_error.js
@@ -2,7 +2,7 @@ import React from 'react';
 import PropTypes from 'prop-types';
 import { defineMessages, injectIntl } from 'react-intl';
 
-import IconButton from 'themes/glitch/components/icon_button';
+import IconButton from 'flavours/glitch/components/icon_button';
 
 const messages = defineMessages({
   error: { id: 'bundle_modal_error.message', defaultMessage: 'Something went wrong while loading this component.' },
diff --git a/app/javascript/themes/glitch/features/ui/components/column.js b/app/javascript/flavours/glitch/features/ui/components/column.js
index 73a5bc15e..ab78414e0 100644
--- a/app/javascript/themes/glitch/features/ui/components/column.js
+++ b/app/javascript/flavours/glitch/features/ui/components/column.js
@@ -2,8 +2,8 @@ import React from 'react';
 import ColumnHeader from './column_header';
 import PropTypes from 'prop-types';
 import { debounce } from 'lodash';
-import { scrollTop } from 'themes/glitch/util/scroll';
-import { isMobile } from 'themes/glitch/util/is_mobile';
+import { scrollTop } from 'flavours/glitch/util/scroll';
+import { isMobile } from 'flavours/glitch/util/is_mobile';
 
 export default class Column extends React.PureComponent {
 
diff --git a/app/javascript/themes/glitch/features/ui/components/column_header.js b/app/javascript/flavours/glitch/features/ui/components/column_header.js
index af195ea9c..af195ea9c 100644
--- a/app/javascript/themes/glitch/features/ui/components/column_header.js
+++ b/app/javascript/flavours/glitch/features/ui/components/column_header.js
diff --git a/app/javascript/themes/glitch/features/ui/components/column_link.js b/app/javascript/flavours/glitch/features/ui/components/column_link.js
index b845d1895..b845d1895 100644
--- a/app/javascript/themes/glitch/features/ui/components/column_link.js
+++ b/app/javascript/flavours/glitch/features/ui/components/column_link.js
diff --git a/app/javascript/themes/glitch/features/ui/components/column_loading.js b/app/javascript/flavours/glitch/features/ui/components/column_loading.js
index 75f26218a..ba2d0824e 100644
--- a/app/javascript/themes/glitch/features/ui/components/column_loading.js
+++ b/app/javascript/flavours/glitch/features/ui/components/column_loading.js
@@ -1,8 +1,8 @@
 import React from 'react';
 import PropTypes from 'prop-types';
 
-import Column from 'themes/glitch/components/column';
-import ColumnHeader from 'themes/glitch/components/column_header';
+import Column from 'flavours/glitch/components/column';
+import ColumnHeader from 'flavours/glitch/components/column_header';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 
 export default class ColumnLoading extends ImmutablePureComponent {
diff --git a/app/javascript/themes/glitch/features/ui/components/column_subheading.js b/app/javascript/flavours/glitch/features/ui/components/column_subheading.js
index 8160c4aa3..8160c4aa3 100644
--- a/app/javascript/themes/glitch/features/ui/components/column_subheading.js
+++ b/app/javascript/flavours/glitch/features/ui/components/column_subheading.js
diff --git a/app/javascript/themes/glitch/features/ui/components/columns_area.js b/app/javascript/flavours/glitch/features/ui/components/columns_area.js
index 452950363..264f60724 100644
--- a/app/javascript/themes/glitch/features/ui/components/columns_area.js
+++ b/app/javascript/flavours/glitch/features/ui/components/columns_area.js
@@ -11,10 +11,10 @@ import BundleContainer from '../containers/bundle_container';
 import ColumnLoading from './column_loading';
 import DrawerLoading from './drawer_loading';
 import BundleColumnError from './bundle_column_error';
-import { Compose, Notifications, HomeTimeline, CommunityTimeline, PublicTimeline, HashtagTimeline, DirectTimeline, FavouritedStatuses } from 'themes/glitch/util/async-components';
+import { Compose, Notifications, HomeTimeline, CommunityTimeline, PublicTimeline, HashtagTimeline, DirectTimeline, FavouritedStatuses } from 'flavours/glitch/util/async-components';
 
 import detectPassiveEvents from 'detect-passive-events';
-import { scrollRight } from 'themes/glitch/util/scroll';
+import { scrollRight } from 'flavours/glitch/util/scroll';
 
 const componentMap = {
   'COMPOSE': Compose,
diff --git a/app/javascript/themes/glitch/features/ui/components/confirmation_modal.js b/app/javascript/flavours/glitch/features/ui/components/confirmation_modal.js
index 3d568aec3..d4d1e587e 100644
--- a/app/javascript/themes/glitch/features/ui/components/confirmation_modal.js
+++ b/app/javascript/flavours/glitch/features/ui/components/confirmation_modal.js
@@ -1,7 +1,7 @@
 import React from 'react';
 import PropTypes from 'prop-types';
 import { injectIntl, FormattedMessage } from 'react-intl';
-import Button from 'themes/glitch/components/button';
+import Button from 'flavours/glitch/components/button';
 
 @injectIntl
 export default class ConfirmationModal extends React.PureComponent {
diff --git a/app/javascript/themes/glitch/features/ui/components/doodle_modal.js b/app/javascript/flavours/glitch/features/ui/components/doodle_modal.js
index 819656dbf..9c74451b3 100644
--- a/app/javascript/themes/glitch/features/ui/components/doodle_modal.js
+++ b/app/javascript/flavours/glitch/features/ui/components/doodle_modal.js
@@ -1,12 +1,12 @@
 import React from 'react';
 import PropTypes from 'prop-types';
-import Button from 'themes/glitch/components/button';
+import Button from 'flavours/glitch/components/button';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 import Atrament from 'atrament'; // the doodling library
 import { connect } from 'react-redux';
 import ImmutablePropTypes from 'react-immutable-proptypes';
-import { doodleSet, uploadCompose } from 'themes/glitch/actions/compose';
-import IconButton from 'themes/glitch/components/icon_button';
+import { doodleSet, uploadCompose } from 'flavours/glitch/actions/compose';
+import IconButton from 'flavours/glitch/components/icon_button';
 import { debounce, mapValues } from 'lodash';
 import classNames from 'classnames';
 
diff --git a/app/javascript/themes/glitch/features/ui/components/drawer_loading.js b/app/javascript/flavours/glitch/features/ui/components/drawer_loading.js
index 08b0d2347..08b0d2347 100644
--- a/app/javascript/themes/glitch/features/ui/components/drawer_loading.js
+++ b/app/javascript/flavours/glitch/features/ui/components/drawer_loading.js
diff --git a/app/javascript/themes/glitch/features/ui/components/embed_modal.js b/app/javascript/flavours/glitch/features/ui/components/embed_modal.js
index 1afffb51b..1afffb51b 100644
--- a/app/javascript/themes/glitch/features/ui/components/embed_modal.js
+++ b/app/javascript/flavours/glitch/features/ui/components/embed_modal.js
diff --git a/app/javascript/themes/glitch/features/ui/components/image_loader.js b/app/javascript/flavours/glitch/features/ui/components/image_loader.js
index aad594380..aad594380 100644
--- a/app/javascript/themes/glitch/features/ui/components/image_loader.js
+++ b/app/javascript/flavours/glitch/features/ui/components/image_loader.js
diff --git a/app/javascript/themes/glitch/features/ui/components/media_modal.js b/app/javascript/flavours/glitch/features/ui/components/media_modal.js
index 1dad972b2..e56147c5b 100644
--- a/app/javascript/themes/glitch/features/ui/components/media_modal.js
+++ b/app/javascript/flavours/glitch/features/ui/components/media_modal.js
@@ -2,9 +2,9 @@ import React from 'react';
 import ReactSwipeableViews from 'react-swipeable-views';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import PropTypes from 'prop-types';
-import ExtendedVideoPlayer from 'themes/glitch/components/extended_video_player';
+import ExtendedVideoPlayer from 'flavours/glitch/components/extended_video_player';
 import { defineMessages, injectIntl } from 'react-intl';
-import IconButton from 'themes/glitch/components/icon_button';
+import IconButton from 'flavours/glitch/components/icon_button';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 import ImageLoader from './image_loader';
 
diff --git a/app/javascript/themes/glitch/features/ui/components/modal_loading.js b/app/javascript/flavours/glitch/features/ui/components/modal_loading.js
index e14d20fbb..b1c322154 100644
--- a/app/javascript/themes/glitch/features/ui/components/modal_loading.js
+++ b/app/javascript/flavours/glitch/features/ui/components/modal_loading.js
@@ -1,6 +1,6 @@
 import React from 'react';
 
-import LoadingIndicator from 'themes/glitch/components/loading_indicator';
+import LoadingIndicator from 'flavours/glitch/components/loading_indicator';
 
 // Keep the markup in sync with <BundleModalError />
 // (make sure they have the same dimensions)
diff --git a/app/javascript/themes/glitch/features/ui/components/modal_root.js b/app/javascript/flavours/glitch/features/ui/components/modal_root.js
index fbe794170..61b239283 100644
--- a/app/javascript/themes/glitch/features/ui/components/modal_root.js
+++ b/app/javascript/flavours/glitch/features/ui/components/modal_root.js
@@ -15,7 +15,7 @@ import {
   ReportModal,
   SettingsModal,
   EmbedModal,
-} from 'themes/glitch/util/async-components';
+} from 'flavours/glitch/util/async-components';
 
 const MODAL_COMPONENTS = {
   'MEDIA': () => Promise.resolve({ default: MediaModal }),
diff --git a/app/javascript/themes/glitch/features/ui/components/mute_modal.js b/app/javascript/flavours/glitch/features/ui/components/mute_modal.js
index ffccdc84d..0202b1ab1 100644
--- a/app/javascript/themes/glitch/features/ui/components/mute_modal.js
+++ b/app/javascript/flavours/glitch/features/ui/components/mute_modal.js
@@ -3,10 +3,10 @@ import { connect } from 'react-redux';
 import PropTypes from 'prop-types';
 import { injectIntl, FormattedMessage } from 'react-intl';
 import Toggle from 'react-toggle';
-import Button from 'themes/glitch/components/button';
-import { closeModal } from 'themes/glitch/actions/modal';
-import { muteAccount } from 'themes/glitch/actions/accounts';
-import { toggleHideNotifications } from 'themes/glitch/actions/mutes';
+import Button from 'flavours/glitch/components/button';
+import { closeModal } from 'flavours/glitch/actions/modal';
+import { muteAccount } from 'flavours/glitch/actions/accounts';
+import { toggleHideNotifications } from 'flavours/glitch/actions/mutes';
 
 
 const mapStateToProps = state => {
diff --git a/app/javascript/themes/glitch/features/ui/components/onboarding_modal.js b/app/javascript/flavours/glitch/features/ui/components/onboarding_modal.js
index 58875262e..21f1addea 100644
--- a/app/javascript/themes/glitch/features/ui/components/onboarding_modal.js
+++ b/app/javascript/flavours/glitch/features/ui/components/onboarding_modal.js
@@ -5,16 +5,16 @@ import ImmutablePropTypes from 'react-immutable-proptypes';
 import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
 import ReactSwipeableViews from 'react-swipeable-views';
 import classNames from 'classnames';
-import Permalink from 'themes/glitch/components/permalink';
-import ComposeForm from 'themes/glitch/features/compose/components/compose_form';
-import Search from 'themes/glitch/features/compose/components/search';
-import NavigationBar from 'themes/glitch/features/compose/components/navigation_bar';
+import Permalink from 'flavours/glitch/components/permalink';
+import ComposeForm from 'flavours/glitch/features/compose/components/compose_form';
+import Search from 'flavours/glitch/features/compose/components/search';
+import NavigationBar from 'flavours/glitch/features/compose/components/navigation_bar';
 import ColumnHeader from './column_header';
 import {
   List as ImmutableList,
   Map as ImmutableMap,
 } from 'immutable';
-import { me } from 'themes/glitch/util/initial_state';
+import { me } from 'flavours/glitch/util/initial_state';
 
 const noop = () => { };
 
diff --git a/app/javascript/themes/glitch/features/ui/components/report_modal.js b/app/javascript/flavours/glitch/features/ui/components/report_modal.js
index e6153948e..b4dc1e3d6 100644
--- a/app/javascript/themes/glitch/features/ui/components/report_modal.js
+++ b/app/javascript/flavours/glitch/features/ui/components/report_modal.js
@@ -1,15 +1,15 @@
 import React from 'react';
 import { connect } from 'react-redux';
-import { changeReportComment, submitReport } from 'themes/glitch/actions/reports';
-import { refreshAccountTimeline } from 'themes/glitch/actions/timelines';
+import { changeReportComment, submitReport } from 'flavours/glitch/actions/reports';
+import { refreshAccountTimeline } from 'flavours/glitch/actions/timelines';
 import PropTypes from 'prop-types';
 import ImmutablePropTypes from 'react-immutable-proptypes';
-import { makeGetAccount } from 'themes/glitch/selectors';
+import { makeGetAccount } from 'flavours/glitch/selectors';
 import { defineMessages, FormattedMessage, injectIntl } from 'react-intl';
-import StatusCheckBox from 'themes/glitch/features/report/containers/status_check_box_container';
+import StatusCheckBox from 'flavours/glitch/features/report/containers/status_check_box_container';
 import { OrderedSet } from 'immutable';
 import ImmutablePureComponent from 'react-immutable-pure-component';
-import Button from 'themes/glitch/components/button';
+import Button from 'flavours/glitch/components/button';
 
 const messages = defineMessages({
   placeholder: { id: 'report.placeholder', defaultMessage: 'Additional comments' },
diff --git a/app/javascript/themes/glitch/features/ui/components/tabs_bar.js b/app/javascript/flavours/glitch/features/ui/components/tabs_bar.js
index ef5deae99..89b455dd8 100644
--- a/app/javascript/themes/glitch/features/ui/components/tabs_bar.js
+++ b/app/javascript/flavours/glitch/features/ui/components/tabs_bar.js
@@ -3,7 +3,7 @@ import PropTypes from 'prop-types';
 import { NavLink } from 'react-router-dom';
 import { FormattedMessage, injectIntl } from 'react-intl';
 import { debounce } from 'lodash';
-import { isUserTouching } from 'themes/glitch/util/is_mobile';
+import { isUserTouching } from 'flavours/glitch/util/is_mobile';
 
 export const links = [
   <NavLink className='tabs-bar__link primary' to='/statuses/new' data-preview-title-id='tabs_bar.compose' data-preview-icon='pencil' ><i className='fa fa-fw fa-pencil' /><FormattedMessage id='tabs_bar.compose' defaultMessage='Compose' /></NavLink>,
diff --git a/app/javascript/themes/glitch/features/ui/components/upload_area.js b/app/javascript/flavours/glitch/features/ui/components/upload_area.js
index 72a450215..cc6b6d171 100644
--- a/app/javascript/themes/glitch/features/ui/components/upload_area.js
+++ b/app/javascript/flavours/glitch/features/ui/components/upload_area.js
@@ -1,6 +1,6 @@
 import React from 'react';
 import PropTypes from 'prop-types';
-import Motion from 'themes/glitch/util/optional_motion';
+import Motion from 'flavours/glitch/util/optional_motion';
 import spring from 'react-motion/lib/spring';
 import { FormattedMessage } from 'react-intl';
 
diff --git a/app/javascript/themes/glitch/features/ui/components/video_modal.js b/app/javascript/flavours/glitch/features/ui/components/video_modal.js
index 91168c790..22fa998fb 100644
--- a/app/javascript/themes/glitch/features/ui/components/video_modal.js
+++ b/app/javascript/flavours/glitch/features/ui/components/video_modal.js
@@ -1,7 +1,7 @@
 import React from 'react';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import PropTypes from 'prop-types';
-import Video from 'themes/glitch/features/video';
+import Video from 'flavours/glitch/features/video';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 
 export default class VideoModal extends ImmutablePureComponent {
diff --git a/app/javascript/themes/glitch/features/ui/containers/bundle_container.js b/app/javascript/flavours/glitch/features/ui/containers/bundle_container.js
index e6f9afcf7..c9086c9bc 100644
--- a/app/javascript/themes/glitch/features/ui/containers/bundle_container.js
+++ b/app/javascript/flavours/glitch/features/ui/containers/bundle_container.js
@@ -2,7 +2,7 @@ import { connect } from 'react-redux';
 
 import Bundle from '../components/bundle';
 
-import { fetchBundleRequest, fetchBundleSuccess, fetchBundleFail } from 'themes/glitch/actions/bundles';
+import { fetchBundleRequest, fetchBundleSuccess, fetchBundleFail } from 'flavours/glitch/actions/bundles';
 
 const mapDispatchToProps = dispatch => ({
   onFetch () {
diff --git a/app/javascript/themes/glitch/features/ui/containers/columns_area_container.js b/app/javascript/flavours/glitch/features/ui/containers/columns_area_container.js
index 95f95618b..95f95618b 100644
--- a/app/javascript/themes/glitch/features/ui/containers/columns_area_container.js
+++ b/app/javascript/flavours/glitch/features/ui/containers/columns_area_container.js
diff --git a/app/javascript/themes/glitch/features/ui/containers/loading_bar_container.js b/app/javascript/flavours/glitch/features/ui/containers/loading_bar_container.js
index 4bb90fb68..4bb90fb68 100644
--- a/app/javascript/themes/glitch/features/ui/containers/loading_bar_container.js
+++ b/app/javascript/flavours/glitch/features/ui/containers/loading_bar_container.js
diff --git a/app/javascript/themes/glitch/features/ui/containers/modal_container.js b/app/javascript/flavours/glitch/features/ui/containers/modal_container.js
index c26f19886..f074002e4 100644
--- a/app/javascript/themes/glitch/features/ui/containers/modal_container.js
+++ b/app/javascript/flavours/glitch/features/ui/containers/modal_container.js
@@ -1,5 +1,5 @@
 import { connect } from 'react-redux';
-import { closeModal } from 'themes/glitch/actions/modal';
+import { closeModal } from 'flavours/glitch/actions/modal';
 import ModalRoot from '../components/modal_root';
 
 const mapStateToProps = state => ({
diff --git a/app/javascript/themes/glitch/features/ui/containers/notifications_container.js b/app/javascript/flavours/glitch/features/ui/containers/notifications_container.js
index 5bd4017f5..88d482bcf 100644
--- a/app/javascript/themes/glitch/features/ui/containers/notifications_container.js
+++ b/app/javascript/flavours/glitch/features/ui/containers/notifications_container.js
@@ -1,7 +1,7 @@
 import { connect } from 'react-redux';
 import { NotificationStack } from 'react-notification';
-import { dismissAlert } from 'themes/glitch/actions/alerts';
-import { getAlerts } from 'themes/glitch/selectors';
+import { dismissAlert } from 'flavours/glitch/actions/alerts';
+import { getAlerts } from 'flavours/glitch/selectors';
 
 const mapStateToProps = state => ({
   notifications: getAlerts(state),
diff --git a/app/javascript/themes/glitch/features/ui/containers/status_list_container.js b/app/javascript/flavours/glitch/features/ui/containers/status_list_container.js
index 807c82e16..69508f9ff 100644
--- a/app/javascript/themes/glitch/features/ui/containers/status_list_container.js
+++ b/app/javascript/flavours/glitch/features/ui/containers/status_list_container.js
@@ -1,10 +1,10 @@
 import { connect } from 'react-redux';
-import StatusList from 'themes/glitch/components/status_list';
-import { scrollTopTimeline } from 'themes/glitch/actions/timelines';
+import StatusList from 'flavours/glitch/components/status_list';
+import { scrollTopTimeline } from 'flavours/glitch/actions/timelines';
 import { Map as ImmutableMap, List as ImmutableList } from 'immutable';
 import { createSelector } from 'reselect';
 import { debounce } from 'lodash';
-import { me } from 'themes/glitch/util/initial_state';
+import { me } from 'flavours/glitch/util/initial_state';
 
 const makeGetStatusIds = () => createSelector([
   (state, { type }) => state.getIn(['settings', type], ImmutableMap()),
diff --git a/app/javascript/themes/glitch/features/ui/index.js b/app/javascript/flavours/glitch/features/ui/index.js
index b59a2e637..620630faf 100644
--- a/app/javascript/themes/glitch/features/ui/index.js
+++ b/app/javascript/flavours/glitch/features/ui/index.js
@@ -6,13 +6,13 @@ import TabsBar from './components/tabs_bar';
 import ModalContainer from './containers/modal_container';
 import { connect } from 'react-redux';
 import { Redirect, withRouter } from 'react-router-dom';
-import { isMobile } from 'themes/glitch/util/is_mobile';
+import { isMobile } from 'flavours/glitch/util/is_mobile';
 import { debounce } from 'lodash';
-import { uploadCompose, resetCompose } from 'themes/glitch/actions/compose';
-import { refreshHomeTimeline } from 'themes/glitch/actions/timelines';
-import { refreshNotifications } from 'themes/glitch/actions/notifications';
-import { clearHeight } from 'themes/glitch/actions/height_cache';
-import { WrappedSwitch, WrappedRoute } from 'themes/glitch/util/react_router_helpers';
+import { uploadCompose, resetCompose } from 'flavours/glitch/actions/compose';
+import { refreshHomeTimeline } from 'flavours/glitch/actions/timelines';
+import { refreshNotifications } from 'flavours/glitch/actions/notifications';
+import { clearHeight } from 'flavours/glitch/actions/height_cache';
+import { WrappedSwitch, WrappedRoute } from 'flavours/glitch/util/react_router_helpers';
 import UploadArea from './components/upload_area';
 import ColumnsAreaContainer from './containers/columns_area_container';
 import classNames from 'classnames';
@@ -38,9 +38,9 @@ import {
   Blocks,
   Mutes,
   PinnedStatuses,
-} from 'themes/glitch/util/async-components';
+} from 'flavours/glitch/util/async-components';
 import { HotKeys } from 'react-hotkeys';
-import { me } from 'themes/glitch/util/initial_state';
+import { me } from 'flavours/glitch/util/initial_state';
 import { defineMessages, injectIntl } from 'react-intl';
 
 // Dummy import, to make sure that <Status /> ends up in the application bundle.
diff --git a/app/javascript/themes/glitch/features/video/index.js b/app/javascript/flavours/glitch/features/video/index.js
index 0ecbe37c9..97c1c27fa 100644
--- a/app/javascript/themes/glitch/features/video/index.js
+++ b/app/javascript/flavours/glitch/features/video/index.js
@@ -3,7 +3,7 @@ import PropTypes from 'prop-types';
 import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
 import { throttle } from 'lodash';
 import classNames from 'classnames';
-import { isFullscreen, requestFullscreen, exitFullscreen } from 'themes/glitch/util/fullscreen';
+import { isFullscreen, requestFullscreen, exitFullscreen } from 'flavours/glitch/util/fullscreen';
 
 const messages = defineMessages({
   play: { id: 'video.play', defaultMessage: 'Play' },
diff --git a/app/javascript/themes/glitch/middleware/errors.js b/app/javascript/flavours/glitch/middleware/errors.js
index c54e7b0a2..f3dfc8b06 100644
--- a/app/javascript/themes/glitch/middleware/errors.js
+++ b/app/javascript/flavours/glitch/middleware/errors.js
@@ -1,4 +1,4 @@
-import { showAlert } from 'themes/glitch/actions/alerts';
+import { showAlert } from 'flavours/glitch/actions/alerts';
 
 const defaultFailSuffix = 'FAIL';
 
diff --git a/app/javascript/themes/glitch/middleware/loading_bar.js b/app/javascript/flavours/glitch/middleware/loading_bar.js
index a98f1bb2b..a98f1bb2b 100644
--- a/app/javascript/themes/glitch/middleware/loading_bar.js
+++ b/app/javascript/flavours/glitch/middleware/loading_bar.js
diff --git a/app/javascript/themes/glitch/middleware/sounds.js b/app/javascript/flavours/glitch/middleware/sounds.js
index 3d1e3eaba..3d1e3eaba 100644
--- a/app/javascript/themes/glitch/middleware/sounds.js
+++ b/app/javascript/flavours/glitch/middleware/sounds.js
diff --git a/app/javascript/themes/glitch/packs/about.js b/app/javascript/flavours/glitch/packs/about.js
index 9639d5453..bc0a4887b 100644
--- a/app/javascript/themes/glitch/packs/about.js
+++ b/app/javascript/flavours/glitch/packs/about.js
@@ -1,7 +1,7 @@
-import loadPolyfills from 'themes/glitch/util/load_polyfills';
+import loadPolyfills from 'flavours/glitch/util/load_polyfills';
 
 function loaded() {
-  const TimelineContainer = require('themes/glitch/containers/timeline_container').default;
+  const TimelineContainer = require('flavours/glitch/containers/timeline_container').default;
   const React             = require('react');
   const ReactDOM          = require('react-dom');
   const mountNode         = document.getElementById('mastodon-timeline');
@@ -13,7 +13,7 @@ function loaded() {
 }
 
 function main() {
-  const ready = require('themes/glitch/util/ready').default;
+  const ready = require('flavours/glitch/util/ready').default;
   ready(loaded);
 }
 
diff --git a/app/javascript/flavours/glitch/packs/common.js b/app/javascript/flavours/glitch/packs/common.js
new file mode 100644
index 000000000..07445d2b3
--- /dev/null
+++ b/app/javascript/flavours/glitch/packs/common.js
@@ -0,0 +1 @@
+import 'flavours/glitch/styles/index.scss';
diff --git a/app/javascript/flavours/glitch/packs/home.js b/app/javascript/flavours/glitch/packs/home.js
new file mode 100644
index 000000000..b8f7b7d8e
--- /dev/null
+++ b/app/javascript/flavours/glitch/packs/home.js
@@ -0,0 +1,7 @@
+import loadPolyfills from 'flavours/glitch/util/load_polyfills';
+
+loadPolyfills().then(() => {
+  require('flavours/glitch/util/main').default();
+}).catch(e => {
+  console.error(e);
+});
diff --git a/app/javascript/themes/glitch/packs/public.js b/app/javascript/flavours/glitch/packs/public.js
index 410e66716..9ea82b53a 100644
--- a/app/javascript/themes/glitch/packs/public.js
+++ b/app/javascript/flavours/glitch/packs/public.js
@@ -1,14 +1,14 @@
-import loadPolyfills from 'themes/glitch/util/load_polyfills';
-import ready from 'themes/glitch/util/ready';
+import loadPolyfills from 'flavours/glitch/util/load_polyfills';
+import ready from 'flavours/glitch/util/ready';
 
 function main() {
   const IntlRelativeFormat = require('intl-relativeformat').default;
-  const emojify = require('themes/glitch/util/emoji').default;
+  const emojify = require('flavours/glitch/util/emoji').default;
   const { getLocale } = require('locales');
   const { localeData } = getLocale();
-  const VideoContainer = require('themes/glitch/containers/video_container').default;
-  const MediaGalleryContainer = require('themes/glitch/containers/media_gallery_container').default;
-  const CardContainer = require('themes/glitch/containers/card_container').default;
+  const VideoContainer = require('flavours/glitch/containers/video_container').default;
+  const MediaGalleryContainer = require('flavours/glitch/containers/media_gallery_container').default;
+  const CardContainer = require('flavours/glitch/containers/card_container').default;
   const React = require('react');
   const ReactDOM = require('react-dom');
 
diff --git a/app/javascript/themes/glitch/packs/share.js b/app/javascript/flavours/glitch/packs/share.js
index dc2e677e4..9f2aa2553 100644
--- a/app/javascript/themes/glitch/packs/share.js
+++ b/app/javascript/flavours/glitch/packs/share.js
@@ -1,7 +1,7 @@
-import loadPolyfills from 'themes/glitch/util/load_polyfills';
+import loadPolyfills from 'flavours/glitch/util/load_polyfills';
 
 function loaded() {
-  const ComposeContainer = require('themes/glitch/containers/compose_container').default;
+  const ComposeContainer = require('flavours/glitch/containers/compose_container').default;
   const React = require('react');
   const ReactDOM = require('react-dom');
   const mountNode = document.getElementById('mastodon-compose');
@@ -13,7 +13,7 @@ function loaded() {
 }
 
 function main() {
-  const ready = require('themes/glitch/util/ready').default;
+  const ready = require('flavours/glitch/util/ready').default;
   ready(loaded);
 }
 
diff --git a/app/javascript/themes/glitch/reducers/accounts.js b/app/javascript/flavours/glitch/reducers/accounts.js
index 0a65d3723..5113a281a 100644
--- a/app/javascript/themes/glitch/reducers/accounts.js
+++ b/app/javascript/flavours/glitch/reducers/accounts.js
@@ -6,16 +6,16 @@ import {
   FOLLOWING_EXPAND_SUCCESS,
   FOLLOW_REQUESTS_FETCH_SUCCESS,
   FOLLOW_REQUESTS_EXPAND_SUCCESS,
-} from 'themes/glitch/actions/accounts';
+} from 'flavours/glitch/actions/accounts';
 import {
   BLOCKS_FETCH_SUCCESS,
   BLOCKS_EXPAND_SUCCESS,
-} from 'themes/glitch/actions/blocks';
+} from 'flavours/glitch/actions/blocks';
 import {
   MUTES_FETCH_SUCCESS,
   MUTES_EXPAND_SUCCESS,
-} from 'themes/glitch/actions/mutes';
-import { COMPOSE_SUGGESTIONS_READY } from 'themes/glitch/actions/compose';
+} from 'flavours/glitch/actions/mutes';
+import { COMPOSE_SUGGESTIONS_READY } from 'flavours/glitch/actions/compose';
 import {
   REBLOG_SUCCESS,
   UNREBLOG_SUCCESS,
@@ -23,28 +23,28 @@ import {
   UNFAVOURITE_SUCCESS,
   REBLOGS_FETCH_SUCCESS,
   FAVOURITES_FETCH_SUCCESS,
-} from 'themes/glitch/actions/interactions';
+} from 'flavours/glitch/actions/interactions';
 import {
   TIMELINE_REFRESH_SUCCESS,
   TIMELINE_UPDATE,
   TIMELINE_EXPAND_SUCCESS,
-} from 'themes/glitch/actions/timelines';
+} from 'flavours/glitch/actions/timelines';
 import {
   STATUS_FETCH_SUCCESS,
   CONTEXT_FETCH_SUCCESS,
-} from 'themes/glitch/actions/statuses';
-import { SEARCH_FETCH_SUCCESS } from 'themes/glitch/actions/search';
+} from 'flavours/glitch/actions/statuses';
+import { SEARCH_FETCH_SUCCESS } from 'flavours/glitch/actions/search';
 import {
   NOTIFICATIONS_UPDATE,
   NOTIFICATIONS_REFRESH_SUCCESS,
   NOTIFICATIONS_EXPAND_SUCCESS,
-} from 'themes/glitch/actions/notifications';
+} from 'flavours/glitch/actions/notifications';
 import {
   FAVOURITED_STATUSES_FETCH_SUCCESS,
   FAVOURITED_STATUSES_EXPAND_SUCCESS,
-} from 'themes/glitch/actions/favourites';
-import { STORE_HYDRATE } from 'themes/glitch/actions/store';
-import emojify from 'themes/glitch/util/emoji';
+} from 'flavours/glitch/actions/favourites';
+import { STORE_HYDRATE } from 'flavours/glitch/actions/store';
+import emojify from 'flavours/glitch/util/emoji';
 import { Map as ImmutableMap, fromJS } from 'immutable';
 import escapeTextContentForBrowser from 'escape-html';
 
diff --git a/app/javascript/themes/glitch/reducers/accounts_counters.js b/app/javascript/flavours/glitch/reducers/accounts_counters.js
index e3728ecd7..a9aebd26f 100644
--- a/app/javascript/themes/glitch/reducers/accounts_counters.js
+++ b/app/javascript/flavours/glitch/reducers/accounts_counters.js
@@ -8,16 +8,16 @@ import {
   FOLLOW_REQUESTS_EXPAND_SUCCESS,
   ACCOUNT_FOLLOW_SUCCESS,
   ACCOUNT_UNFOLLOW_SUCCESS,
-} from 'themes/glitch/actions/accounts';
+} from 'flavours/glitch/actions/accounts';
 import {
   BLOCKS_FETCH_SUCCESS,
   BLOCKS_EXPAND_SUCCESS,
-} from 'themes/glitch/actions/blocks';
+} from 'flavours/glitch/actions/blocks';
 import {
   MUTES_FETCH_SUCCESS,
   MUTES_EXPAND_SUCCESS,
-} from 'themes/glitch/actions/mutes';
-import { COMPOSE_SUGGESTIONS_READY } from 'themes/glitch/actions/compose';
+} from 'flavours/glitch/actions/mutes';
+import { COMPOSE_SUGGESTIONS_READY } from 'flavours/glitch/actions/compose';
 import {
   REBLOG_SUCCESS,
   UNREBLOG_SUCCESS,
@@ -25,27 +25,27 @@ import {
   UNFAVOURITE_SUCCESS,
   REBLOGS_FETCH_SUCCESS,
   FAVOURITES_FETCH_SUCCESS,
-} from 'themes/glitch/actions/interactions';
+} from 'flavours/glitch/actions/interactions';
 import {
   TIMELINE_REFRESH_SUCCESS,
   TIMELINE_UPDATE,
   TIMELINE_EXPAND_SUCCESS,
-} from 'themes/glitch/actions/timelines';
+} from 'flavours/glitch/actions/timelines';
 import {
   STATUS_FETCH_SUCCESS,
   CONTEXT_FETCH_SUCCESS,
-} from 'themes/glitch/actions/statuses';
-import { SEARCH_FETCH_SUCCESS } from 'themes/glitch/actions/search';
+} from 'flavours/glitch/actions/statuses';
+import { SEARCH_FETCH_SUCCESS } from 'flavours/glitch/actions/search';
 import {
   NOTIFICATIONS_UPDATE,
   NOTIFICATIONS_REFRESH_SUCCESS,
   NOTIFICATIONS_EXPAND_SUCCESS,
-} from 'themes/glitch/actions/notifications';
+} from 'flavours/glitch/actions/notifications';
 import {
   FAVOURITED_STATUSES_FETCH_SUCCESS,
   FAVOURITED_STATUSES_EXPAND_SUCCESS,
-} from 'themes/glitch/actions/favourites';
-import { STORE_HYDRATE } from 'themes/glitch/actions/store';
+} from 'flavours/glitch/actions/favourites';
+import { STORE_HYDRATE } from 'flavours/glitch/actions/store';
 import { Map as ImmutableMap, fromJS } from 'immutable';
 
 const normalizeAccount = (state, account) => state.set(account.id, fromJS({
diff --git a/app/javascript/themes/glitch/reducers/alerts.js b/app/javascript/flavours/glitch/reducers/alerts.js
index ad66b63f6..50f8d30f7 100644
--- a/app/javascript/themes/glitch/reducers/alerts.js
+++ b/app/javascript/flavours/glitch/reducers/alerts.js
@@ -2,7 +2,7 @@ import {
   ALERT_SHOW,
   ALERT_DISMISS,
   ALERT_CLEAR,
-} from 'themes/glitch/actions/alerts';
+} from 'flavours/glitch/actions/alerts';
 import { Map as ImmutableMap, List as ImmutableList } from 'immutable';
 
 const initialState = ImmutableList([]);
diff --git a/app/javascript/themes/glitch/reducers/cards.js b/app/javascript/flavours/glitch/reducers/cards.js
index 35be30444..92ecfd086 100644
--- a/app/javascript/themes/glitch/reducers/cards.js
+++ b/app/javascript/flavours/glitch/reducers/cards.js
@@ -1,4 +1,4 @@
-import { STATUS_CARD_FETCH_SUCCESS } from 'themes/glitch/actions/cards';
+import { STATUS_CARD_FETCH_SUCCESS } from 'flavours/glitch/actions/cards';
 
 import { Map as ImmutableMap, fromJS } from 'immutable';
 
diff --git a/app/javascript/themes/glitch/reducers/compose.js b/app/javascript/flavours/glitch/reducers/compose.js
index be359fcb4..aaa36b696 100644
--- a/app/javascript/themes/glitch/reducers/compose.js
+++ b/app/javascript/flavours/glitch/reducers/compose.js
@@ -28,12 +28,12 @@ import {
   COMPOSE_UPLOAD_CHANGE_FAIL,
   COMPOSE_DOODLE_SET,
   COMPOSE_RESET,
-} from 'themes/glitch/actions/compose';
-import { TIMELINE_DELETE } from 'themes/glitch/actions/timelines';
-import { STORE_HYDRATE } from 'themes/glitch/actions/store';
+} from 'flavours/glitch/actions/compose';
+import { TIMELINE_DELETE } from 'flavours/glitch/actions/timelines';
+import { STORE_HYDRATE } from 'flavours/glitch/actions/store';
 import { Map as ImmutableMap, List as ImmutableList, OrderedSet as ImmutableOrderedSet, fromJS } from 'immutable';
-import uuid from 'themes/glitch/util/uuid';
-import { me } from 'themes/glitch/util/initial_state';
+import uuid from 'flavours/glitch/util/uuid';
+import { me } from 'flavours/glitch/util/initial_state';
 
 const initialState = ImmutableMap({
   mounted: false,
diff --git a/app/javascript/themes/glitch/reducers/contexts.js b/app/javascript/flavours/glitch/reducers/contexts.js
index 56c930bd5..53e93a589 100644
--- a/app/javascript/themes/glitch/reducers/contexts.js
+++ b/app/javascript/flavours/glitch/reducers/contexts.js
@@ -1,5 +1,5 @@
-import { CONTEXT_FETCH_SUCCESS } from 'themes/glitch/actions/statuses';
-import { TIMELINE_DELETE, TIMELINE_CONTEXT_UPDATE } from 'themes/glitch/actions/timelines';
+import { CONTEXT_FETCH_SUCCESS } from 'flavours/glitch/actions/statuses';
+import { TIMELINE_DELETE, TIMELINE_CONTEXT_UPDATE } from 'flavours/glitch/actions/timelines';
 import { Map as ImmutableMap, List as ImmutableList } from 'immutable';
 
 const initialState = ImmutableMap({
diff --git a/app/javascript/themes/glitch/reducers/custom_emojis.js b/app/javascript/flavours/glitch/reducers/custom_emojis.js
index e3f1e0018..592cea8dc 100644
--- a/app/javascript/themes/glitch/reducers/custom_emojis.js
+++ b/app/javascript/flavours/glitch/reducers/custom_emojis.js
@@ -1,7 +1,7 @@
 import { List as ImmutableList } from 'immutable';
-import { STORE_HYDRATE } from 'themes/glitch/actions/store';
-import { search as emojiSearch } from 'themes/glitch/util/emoji/emoji_mart_search_light';
-import { buildCustomEmojis } from 'themes/glitch/util/emoji';
+import { STORE_HYDRATE } from 'flavours/glitch/actions/store';
+import { search as emojiSearch } from 'flavours/glitch/util/emoji/emoji_mart_search_light';
+import { buildCustomEmojis } from 'flavours/glitch/util/emoji';
 
 const initialState = ImmutableList();
 
diff --git a/app/javascript/themes/glitch/reducers/height_cache.js b/app/javascript/flavours/glitch/reducers/height_cache.js
index 93c31b42c..8b05e0b19 100644
--- a/app/javascript/themes/glitch/reducers/height_cache.js
+++ b/app/javascript/flavours/glitch/reducers/height_cache.js
@@ -1,5 +1,5 @@
 import { Map as ImmutableMap } from 'immutable';
-import { HEIGHT_CACHE_SET, HEIGHT_CACHE_CLEAR } from 'themes/glitch/actions/height_cache';
+import { HEIGHT_CACHE_SET, HEIGHT_CACHE_CLEAR } from 'flavours/glitch/actions/height_cache';
 
 const initialState = ImmutableMap();
 
diff --git a/app/javascript/themes/glitch/reducers/index.js b/app/javascript/flavours/glitch/reducers/index.js
index aa748421a..aa748421a 100644
--- a/app/javascript/themes/glitch/reducers/index.js
+++ b/app/javascript/flavours/glitch/reducers/index.js
diff --git a/app/javascript/themes/glitch/reducers/local_settings.js b/app/javascript/flavours/glitch/reducers/local_settings.js
index b1ffa047e..69d98741b 100644
--- a/app/javascript/themes/glitch/reducers/local_settings.js
+++ b/app/javascript/flavours/glitch/reducers/local_settings.js
@@ -2,8 +2,8 @@
 import { Map as ImmutableMap } from 'immutable';
 
 //  Our imports.
-import { STORE_HYDRATE } from 'themes/glitch/actions/store';
-import { LOCAL_SETTING_CHANGE } from 'themes/glitch/actions/local_settings';
+import { STORE_HYDRATE } from 'flavours/glitch/actions/store';
+import { LOCAL_SETTING_CHANGE } from 'flavours/glitch/actions/local_settings';
 
 const initialState = ImmutableMap({
   layout    : 'auto',
diff --git a/app/javascript/themes/glitch/reducers/media_attachments.js b/app/javascript/flavours/glitch/reducers/media_attachments.js
index 69a44639c..6e6058576 100644
--- a/app/javascript/themes/glitch/reducers/media_attachments.js
+++ b/app/javascript/flavours/glitch/reducers/media_attachments.js
@@ -1,4 +1,4 @@
-import { STORE_HYDRATE } from 'themes/glitch/actions/store';
+import { STORE_HYDRATE } from 'flavours/glitch/actions/store';
 import { Map as ImmutableMap } from 'immutable';
 
 const initialState = ImmutableMap({
diff --git a/app/javascript/themes/glitch/reducers/meta.js b/app/javascript/flavours/glitch/reducers/meta.js
index 2249f1d78..a98dc436a 100644
--- a/app/javascript/themes/glitch/reducers/meta.js
+++ b/app/javascript/flavours/glitch/reducers/meta.js
@@ -1,4 +1,4 @@
-import { STORE_HYDRATE } from 'themes/glitch/actions/store';
+import { STORE_HYDRATE } from 'flavours/glitch/actions/store';
 import { Map as ImmutableMap } from 'immutable';
 
 const initialState = ImmutableMap({
diff --git a/app/javascript/themes/glitch/reducers/modal.js b/app/javascript/flavours/glitch/reducers/modal.js
index 97fb31203..80bc11dda 100644
--- a/app/javascript/themes/glitch/reducers/modal.js
+++ b/app/javascript/flavours/glitch/reducers/modal.js
@@ -1,4 +1,4 @@
-import { MODAL_OPEN, MODAL_CLOSE } from 'themes/glitch/actions/modal';
+import { MODAL_OPEN, MODAL_CLOSE } from 'flavours/glitch/actions/modal';
 
 const initialState = {
   modalType: null,
diff --git a/app/javascript/themes/glitch/reducers/mutes.js b/app/javascript/flavours/glitch/reducers/mutes.js
index 8fe4ae0c3..8f52a7704 100644
--- a/app/javascript/themes/glitch/reducers/mutes.js
+++ b/app/javascript/flavours/glitch/reducers/mutes.js
@@ -3,7 +3,7 @@ import Immutable from 'immutable';
 import {
   MUTES_INIT_MODAL,
   MUTES_TOGGLE_HIDE_NOTIFICATIONS,
-} from 'themes/glitch/actions/mutes';
+} from 'flavours/glitch/actions/mutes';
 
 const initialState = Immutable.Map({
   new: Immutable.Map({
diff --git a/app/javascript/themes/glitch/reducers/notifications.js b/app/javascript/flavours/glitch/reducers/notifications.js
index c4f505053..fb2b3f549 100644
--- a/app/javascript/themes/glitch/reducers/notifications.js
+++ b/app/javascript/flavours/glitch/reducers/notifications.js
@@ -14,12 +14,12 @@ import {
   NOTIFICATIONS_DELETE_MARKED_FAIL,
   NOTIFICATIONS_ENTER_CLEARING_MODE,
   NOTIFICATIONS_MARK_ALL_FOR_DELETE,
-} from 'themes/glitch/actions/notifications';
+} from 'flavours/glitch/actions/notifications';
 import {
   ACCOUNT_BLOCK_SUCCESS,
   ACCOUNT_MUTE_SUCCESS,
-} from 'themes/glitch/actions/accounts';
-import { TIMELINE_DELETE } from 'themes/glitch/actions/timelines';
+} from 'flavours/glitch/actions/accounts';
+import { TIMELINE_DELETE } from 'flavours/glitch/actions/timelines';
 import { Map as ImmutableMap, List as ImmutableList } from 'immutable';
 
 const initialState = ImmutableMap({
diff --git a/app/javascript/themes/glitch/reducers/push_notifications.js b/app/javascript/flavours/glitch/reducers/push_notifications.js
index 744e4a0eb..f0a800d23 100644
--- a/app/javascript/themes/glitch/reducers/push_notifications.js
+++ b/app/javascript/flavours/glitch/reducers/push_notifications.js
@@ -1,5 +1,5 @@
-import { STORE_HYDRATE } from 'themes/glitch/actions/store';
-import { SET_BROWSER_SUPPORT, SET_SUBSCRIPTION, CLEAR_SUBSCRIPTION, ALERTS_CHANGE } from 'themes/glitch/actions/push_notifications';
+import { STORE_HYDRATE } from 'flavours/glitch/actions/store';
+import { SET_BROWSER_SUPPORT, SET_SUBSCRIPTION, CLEAR_SUBSCRIPTION, ALERTS_CHANGE } from 'flavours/glitch/actions/push_notifications';
 import Immutable from 'immutable';
 
 const initialState = Immutable.Map({
diff --git a/app/javascript/themes/glitch/reducers/relationships.js b/app/javascript/flavours/glitch/reducers/relationships.js
index d9135d6da..6303089ac 100644
--- a/app/javascript/themes/glitch/reducers/relationships.js
+++ b/app/javascript/flavours/glitch/reducers/relationships.js
@@ -6,11 +6,11 @@ import {
   ACCOUNT_MUTE_SUCCESS,
   ACCOUNT_UNMUTE_SUCCESS,
   RELATIONSHIPS_FETCH_SUCCESS,
-} from 'themes/glitch/actions/accounts';
+} from 'flavours/glitch/actions/accounts';
 import {
   DOMAIN_BLOCK_SUCCESS,
   DOMAIN_UNBLOCK_SUCCESS,
-} from 'themes/glitch/actions/domain_blocks';
+} from 'flavours/glitch/actions/domain_blocks';
 import { Map as ImmutableMap, fromJS } from 'immutable';
 
 const normalizeRelationship = (state, relationship) => state.set(relationship.id, fromJS(relationship));
diff --git a/app/javascript/themes/glitch/reducers/reports.js b/app/javascript/flavours/glitch/reducers/reports.js
index b714374ea..c18fbcdc6 100644
--- a/app/javascript/themes/glitch/reducers/reports.js
+++ b/app/javascript/flavours/glitch/reducers/reports.js
@@ -6,7 +6,7 @@ import {
   REPORT_CANCEL,
   REPORT_STATUS_TOGGLE,
   REPORT_COMMENT_CHANGE,
-} from 'themes/glitch/actions/reports';
+} from 'flavours/glitch/actions/reports';
 import { Map as ImmutableMap, Set as ImmutableSet } from 'immutable';
 
 const initialState = ImmutableMap({
diff --git a/app/javascript/themes/glitch/reducers/search.js b/app/javascript/flavours/glitch/reducers/search.js
index aec9e2efb..f9bf92098 100644
--- a/app/javascript/themes/glitch/reducers/search.js
+++ b/app/javascript/flavours/glitch/reducers/search.js
@@ -3,8 +3,8 @@ import {
   SEARCH_CLEAR,
   SEARCH_FETCH_SUCCESS,
   SEARCH_SHOW,
-} from 'themes/glitch/actions/search';
-import { COMPOSE_MENTION, COMPOSE_REPLY } from 'themes/glitch/actions/compose';
+} from 'flavours/glitch/actions/search';
+import { COMPOSE_MENTION, COMPOSE_REPLY } from 'flavours/glitch/actions/compose';
 import { Map as ImmutableMap, List as ImmutableList } from 'immutable';
 
 const initialState = ImmutableMap({
diff --git a/app/javascript/themes/glitch/reducers/settings.js b/app/javascript/flavours/glitch/reducers/settings.js
index c22bbbd8d..ceafbc467 100644
--- a/app/javascript/themes/glitch/reducers/settings.js
+++ b/app/javascript/flavours/glitch/reducers/settings.js
@@ -1,9 +1,9 @@
-import { SETTING_CHANGE, SETTING_SAVE } from 'themes/glitch/actions/settings';
-import { COLUMN_ADD, COLUMN_REMOVE, COLUMN_MOVE } from 'themes/glitch/actions/columns';
-import { STORE_HYDRATE } from 'themes/glitch/actions/store';
-import { EMOJI_USE } from 'themes/glitch/actions/emojis';
+import { SETTING_CHANGE, SETTING_SAVE } from 'flavours/glitch/actions/settings';
+import { COLUMN_ADD, COLUMN_REMOVE, COLUMN_MOVE } from 'flavours/glitch/actions/columns';
+import { STORE_HYDRATE } from 'flavours/glitch/actions/store';
+import { EMOJI_USE } from 'flavours/glitch/actions/emojis';
 import { Map as ImmutableMap, fromJS } from 'immutable';
-import uuid from 'themes/glitch/util/uuid';
+import uuid from 'flavours/glitch/util/uuid';
 
 const initialState = ImmutableMap({
   saved: true,
diff --git a/app/javascript/themes/glitch/reducers/status_lists.js b/app/javascript/flavours/glitch/reducers/status_lists.js
index 8dc7d374e..5a3d0db0c 100644
--- a/app/javascript/themes/glitch/reducers/status_lists.js
+++ b/app/javascript/flavours/glitch/reducers/status_lists.js
@@ -1,17 +1,17 @@
 import {
   FAVOURITED_STATUSES_FETCH_SUCCESS,
   FAVOURITED_STATUSES_EXPAND_SUCCESS,
-} from 'themes/glitch/actions/favourites';
+} from 'flavours/glitch/actions/favourites';
 import {
   PINNED_STATUSES_FETCH_SUCCESS,
-} from 'themes/glitch/actions/pin_statuses';
+} from 'flavours/glitch/actions/pin_statuses';
 import { Map as ImmutableMap, List as ImmutableList } from 'immutable';
 import {
   FAVOURITE_SUCCESS,
   UNFAVOURITE_SUCCESS,
   PIN_SUCCESS,
   UNPIN_SUCCESS,
-} from 'themes/glitch/actions/interactions';
+} from 'flavours/glitch/actions/interactions';
 
 const initialState = ImmutableMap({
   favourites: ImmutableMap({
diff --git a/app/javascript/themes/glitch/reducers/statuses.js b/app/javascript/flavours/glitch/reducers/statuses.js
index ef8086865..410bc013b 100644
--- a/app/javascript/themes/glitch/reducers/statuses.js
+++ b/app/javascript/flavours/glitch/reducers/statuses.js
@@ -9,37 +9,37 @@ import {
   UNFAVOURITE_SUCCESS,
   PIN_SUCCESS,
   UNPIN_SUCCESS,
-} from 'themes/glitch/actions/interactions';
+} from 'flavours/glitch/actions/interactions';
 import {
   STATUS_FETCH_SUCCESS,
   CONTEXT_FETCH_SUCCESS,
   STATUS_MUTE_SUCCESS,
   STATUS_UNMUTE_SUCCESS,
-} from 'themes/glitch/actions/statuses';
+} from 'flavours/glitch/actions/statuses';
 import {
   TIMELINE_REFRESH_SUCCESS,
   TIMELINE_UPDATE,
   TIMELINE_DELETE,
   TIMELINE_EXPAND_SUCCESS,
-} from 'themes/glitch/actions/timelines';
+} from 'flavours/glitch/actions/timelines';
 import {
   ACCOUNT_BLOCK_SUCCESS,
   ACCOUNT_MUTE_SUCCESS,
-} from 'themes/glitch/actions/accounts';
+} from 'flavours/glitch/actions/accounts';
 import {
   NOTIFICATIONS_UPDATE,
   NOTIFICATIONS_REFRESH_SUCCESS,
   NOTIFICATIONS_EXPAND_SUCCESS,
-} from 'themes/glitch/actions/notifications';
+} from 'flavours/glitch/actions/notifications';
 import {
   FAVOURITED_STATUSES_FETCH_SUCCESS,
   FAVOURITED_STATUSES_EXPAND_SUCCESS,
-} from 'themes/glitch/actions/favourites';
+} from 'flavours/glitch/actions/favourites';
 import {
   PINNED_STATUSES_FETCH_SUCCESS,
-} from 'themes/glitch/actions/pin_statuses';
-import { SEARCH_FETCH_SUCCESS } from 'themes/glitch/actions/search';
-import emojify from 'themes/glitch/util/emoji';
+} from 'flavours/glitch/actions/pin_statuses';
+import { SEARCH_FETCH_SUCCESS } from 'flavours/glitch/actions/search';
+import emojify from 'flavours/glitch/util/emoji';
 import { Map as ImmutableMap, fromJS } from 'immutable';
 import escapeTextContentForBrowser from 'escape-html';
 
diff --git a/app/javascript/themes/glitch/reducers/timelines.js b/app/javascript/flavours/glitch/reducers/timelines.js
index 7f19a1897..679e1601e 100644
--- a/app/javascript/themes/glitch/reducers/timelines.js
+++ b/app/javascript/flavours/glitch/reducers/timelines.js
@@ -10,12 +10,12 @@ import {
   TIMELINE_SCROLL_TOP,
   TIMELINE_CONNECT,
   TIMELINE_DISCONNECT,
-} from 'themes/glitch/actions/timelines';
+} from 'flavours/glitch/actions/timelines';
 import {
   ACCOUNT_BLOCK_SUCCESS,
   ACCOUNT_MUTE_SUCCESS,
   ACCOUNT_UNFOLLOW_SUCCESS,
-} from 'themes/glitch/actions/accounts';
+} from 'flavours/glitch/actions/accounts';
 import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable';
 
 const initialState = ImmutableMap();
diff --git a/app/javascript/themes/glitch/reducers/user_lists.js b/app/javascript/flavours/glitch/reducers/user_lists.js
index 8c3a7d748..a4df9ec8d 100644
--- a/app/javascript/themes/glitch/reducers/user_lists.js
+++ b/app/javascript/flavours/glitch/reducers/user_lists.js
@@ -7,19 +7,19 @@ import {
   FOLLOW_REQUESTS_EXPAND_SUCCESS,
   FOLLOW_REQUEST_AUTHORIZE_SUCCESS,
   FOLLOW_REQUEST_REJECT_SUCCESS,
-} from 'themes/glitch/actions/accounts';
+} from 'flavours/glitch/actions/accounts';
 import {
   REBLOGS_FETCH_SUCCESS,
   FAVOURITES_FETCH_SUCCESS,
-} from 'themes/glitch/actions/interactions';
+} from 'flavours/glitch/actions/interactions';
 import {
   BLOCKS_FETCH_SUCCESS,
   BLOCKS_EXPAND_SUCCESS,
-} from 'themes/glitch/actions/blocks';
+} from 'flavours/glitch/actions/blocks';
 import {
   MUTES_FETCH_SUCCESS,
   MUTES_EXPAND_SUCCESS,
-} from 'themes/glitch/actions/mutes';
+} from 'flavours/glitch/actions/mutes';
 import { Map as ImmutableMap, List as ImmutableList } from 'immutable';
 
 const initialState = ImmutableMap({
diff --git a/app/javascript/themes/glitch/selectors/index.js b/app/javascript/flavours/glitch/selectors/index.js
index d26d1b727..d26d1b727 100644
--- a/app/javascript/themes/glitch/selectors/index.js
+++ b/app/javascript/flavours/glitch/selectors/index.js
diff --git a/app/javascript/themes/glitch/service_worker/entry.js b/app/javascript/flavours/glitch/service_worker/entry.js
index eea4cfc3c..eea4cfc3c 100644
--- a/app/javascript/themes/glitch/service_worker/entry.js
+++ b/app/javascript/flavours/glitch/service_worker/entry.js
diff --git a/app/javascript/themes/glitch/service_worker/web_push_notifications.js b/app/javascript/flavours/glitch/service_worker/web_push_notifications.js
index f63cff335..f63cff335 100644
--- a/app/javascript/themes/glitch/service_worker/web_push_notifications.js
+++ b/app/javascript/flavours/glitch/service_worker/web_push_notifications.js
diff --git a/app/javascript/themes/glitch/store/configureStore.js b/app/javascript/flavours/glitch/store/configureStore.js
index 1376d4cba..1376d4cba 100644
--- a/app/javascript/themes/glitch/store/configureStore.js
+++ b/app/javascript/flavours/glitch/store/configureStore.js
diff --git a/app/javascript/themes/glitch/styles/_mixins.scss b/app/javascript/flavours/glitch/styles/_mixins.scss
index 79a8149fd..79a8149fd 100644
--- a/app/javascript/themes/glitch/styles/_mixins.scss
+++ b/app/javascript/flavours/glitch/styles/_mixins.scss
diff --git a/app/javascript/themes/glitch/styles/about.scss b/app/javascript/flavours/glitch/styles/about.scss
index 4ec689427..4ec689427 100644
--- a/app/javascript/themes/glitch/styles/about.scss
+++ b/app/javascript/flavours/glitch/styles/about.scss
diff --git a/app/javascript/themes/glitch/styles/accounts.scss b/app/javascript/flavours/glitch/styles/accounts.scss
index 2cf98c642..2cf98c642 100644
--- a/app/javascript/themes/glitch/styles/accounts.scss
+++ b/app/javascript/flavours/glitch/styles/accounts.scss
diff --git a/app/javascript/themes/glitch/styles/admin.scss b/app/javascript/flavours/glitch/styles/admin.scss
index 87bc710af..87bc710af 100644
--- a/app/javascript/themes/glitch/styles/admin.scss
+++ b/app/javascript/flavours/glitch/styles/admin.scss
diff --git a/app/javascript/themes/glitch/styles/basics.scss b/app/javascript/flavours/glitch/styles/basics.scss
index b5d77ff63..b5d77ff63 100644
--- a/app/javascript/themes/glitch/styles/basics.scss
+++ b/app/javascript/flavours/glitch/styles/basics.scss
diff --git a/app/javascript/themes/glitch/styles/boost.scss b/app/javascript/flavours/glitch/styles/boost.scss
index b07b72f8e..b07b72f8e 100644
--- a/app/javascript/themes/glitch/styles/boost.scss
+++ b/app/javascript/flavours/glitch/styles/boost.scss
diff --git a/app/javascript/themes/glitch/styles/compact_header.scss b/app/javascript/flavours/glitch/styles/compact_header.scss
index 90d98cc8c..90d98cc8c 100644
--- a/app/javascript/themes/glitch/styles/compact_header.scss
+++ b/app/javascript/flavours/glitch/styles/compact_header.scss
diff --git a/app/javascript/themes/glitch/styles/components.scss b/app/javascript/flavours/glitch/styles/components.scss
index 3be8db4b4..3be8db4b4 100644
--- a/app/javascript/themes/glitch/styles/components.scss
+++ b/app/javascript/flavours/glitch/styles/components.scss
diff --git a/app/javascript/themes/glitch/styles/containers.scss b/app/javascript/flavours/glitch/styles/containers.scss
index af2589e23..af2589e23 100644
--- a/app/javascript/themes/glitch/styles/containers.scss
+++ b/app/javascript/flavours/glitch/styles/containers.scss
diff --git a/app/javascript/themes/glitch/styles/doodle.scss b/app/javascript/flavours/glitch/styles/doodle.scss
index a4a1cfc84..a4a1cfc84 100644
--- a/app/javascript/themes/glitch/styles/doodle.scss
+++ b/app/javascript/flavours/glitch/styles/doodle.scss
diff --git a/app/javascript/themes/glitch/styles/emoji_picker.scss b/app/javascript/flavours/glitch/styles/emoji_picker.scss
index 2b46d30fc..2b46d30fc 100644
--- a/app/javascript/themes/glitch/styles/emoji_picker.scss
+++ b/app/javascript/flavours/glitch/styles/emoji_picker.scss
diff --git a/app/javascript/themes/glitch/styles/footer.scss b/app/javascript/flavours/glitch/styles/footer.scss
index 2d953b34e..2d953b34e 100644
--- a/app/javascript/themes/glitch/styles/footer.scss
+++ b/app/javascript/flavours/glitch/styles/footer.scss
diff --git a/app/javascript/themes/glitch/styles/forms.scss b/app/javascript/flavours/glitch/styles/forms.scss
index 61fcf286f..61fcf286f 100644
--- a/app/javascript/themes/glitch/styles/forms.scss
+++ b/app/javascript/flavours/glitch/styles/forms.scss
diff --git a/app/javascript/themes/glitch/styles/index.scss b/app/javascript/flavours/glitch/styles/index.scss
index c962a1f62..c962a1f62 100644
--- a/app/javascript/themes/glitch/styles/index.scss
+++ b/app/javascript/flavours/glitch/styles/index.scss
diff --git a/app/javascript/themes/glitch/styles/landing_strip.scss b/app/javascript/flavours/glitch/styles/landing_strip.scss
index 0bf9daafd..0bf9daafd 100644
--- a/app/javascript/themes/glitch/styles/landing_strip.scss
+++ b/app/javascript/flavours/glitch/styles/landing_strip.scss
diff --git a/app/javascript/themes/glitch/styles/lists.scss b/app/javascript/flavours/glitch/styles/lists.scss
index 6019cd800..6019cd800 100644
--- a/app/javascript/themes/glitch/styles/lists.scss
+++ b/app/javascript/flavours/glitch/styles/lists.scss
diff --git a/app/javascript/themes/glitch/styles/reset copy.scss b/app/javascript/flavours/glitch/styles/reset copy.scss
index cc5ba9d7c..cc5ba9d7c 100644
--- a/app/javascript/themes/glitch/styles/reset copy.scss
+++ b/app/javascript/flavours/glitch/styles/reset copy.scss
diff --git a/app/javascript/themes/glitch/styles/reset.scss b/app/javascript/flavours/glitch/styles/reset.scss
index cc5ba9d7c..cc5ba9d7c 100644
--- a/app/javascript/themes/glitch/styles/reset.scss
+++ b/app/javascript/flavours/glitch/styles/reset.scss
diff --git a/app/javascript/themes/glitch/styles/rtl.scss b/app/javascript/flavours/glitch/styles/rtl.scss
index 67bfa8a38..67bfa8a38 100644
--- a/app/javascript/themes/glitch/styles/rtl.scss
+++ b/app/javascript/flavours/glitch/styles/rtl.scss
diff --git a/app/javascript/themes/glitch/styles/stream_entries.scss b/app/javascript/flavours/glitch/styles/stream_entries.scss
index 453070b7c..453070b7c 100644
--- a/app/javascript/themes/glitch/styles/stream_entries.scss
+++ b/app/javascript/flavours/glitch/styles/stream_entries.scss
diff --git a/app/javascript/themes/glitch/styles/tables.scss b/app/javascript/flavours/glitch/styles/tables.scss
index ad46f5f9f..ad46f5f9f 100644
--- a/app/javascript/themes/glitch/styles/tables.scss
+++ b/app/javascript/flavours/glitch/styles/tables.scss
diff --git a/app/javascript/themes/glitch/styles/variables.scss b/app/javascript/flavours/glitch/styles/variables.scss
index f42d9c8c5..f42d9c8c5 100644
--- a/app/javascript/themes/glitch/styles/variables.scss
+++ b/app/javascript/flavours/glitch/styles/variables.scss
diff --git a/app/javascript/themes/glitch/theme.yml b/app/javascript/flavours/glitch/theme.yml
index ac6f57546..9d24f0107 100644
--- a/app/javascript/themes/glitch/theme.yml
+++ b/app/javascript/flavours/glitch/theme.yml
@@ -11,10 +11,10 @@ pack:
   home:
     filename: packs/home.js
     preload:
-    - themes/glitch/async/getting_started
-    - themes/glitch/async/compose
-    - themes/glitch/async/home_timeline
-    - themes/glitch/async/notifications
+    - flavours/glitch/async/getting_started
+    - flavours/glitch/async/compose
+    - flavours/glitch/async/home_timeline
+    - flavours/glitch/async/notifications
     stylesheet: true
   modal:
   public: packs/public.js
diff --git a/app/javascript/themes/glitch/util/api.js b/app/javascript/flavours/glitch/util/api.js
index ecc703c0a..ecc703c0a 100644
--- a/app/javascript/themes/glitch/util/api.js
+++ b/app/javascript/flavours/glitch/util/api.js
diff --git a/app/javascript/flavours/glitch/util/async-components.js b/app/javascript/flavours/glitch/util/async-components.js
new file mode 100644
index 000000000..b7ac4d3ec
--- /dev/null
+++ b/app/javascript/flavours/glitch/util/async-components.js
@@ -0,0 +1,115 @@
+export function EmojiPicker () {
+  return import(/* webpackChunkName: "flavours/glitch/async/emoji_picker" */'flavours/glitch/util/emoji/emoji_picker');
+}
+
+export function Compose () {
+  return import(/* webpackChunkName: "flavours/glitch/async/compose" */'flavours/glitch/features/compose');
+}
+
+export function Notifications () {
+  return import(/* webpackChunkName: "flavours/glitch/async/notifications" */'flavours/glitch/features/notifications');
+}
+
+export function HomeTimeline () {
+  return import(/* webpackChunkName: "flavours/glitch/async/home_timeline" */'flavours/glitch/features/home_timeline');
+}
+
+export function PublicTimeline () {
+  return import(/* webpackChunkName: "flavours/glitch/async/public_timeline" */'flavours/glitch/features/public_timeline');
+}
+
+export function CommunityTimeline () {
+  return import(/* webpackChunkName: "flavours/glitch/async/community_timeline" */'flavours/glitch/features/community_timeline');
+}
+
+export function HashtagTimeline () {
+  return import(/* webpackChunkName: "flavours/glitch/async/hashtag_timeline" */'flavours/glitch/features/hashtag_timeline');
+}
+
+export function DirectTimeline() {
+  return import(/* webpackChunkName: "flavours/glitch/async/direct_timeline" */'flavours/glitch/features/direct_timeline');
+}
+
+export function Status () {
+  return import(/* webpackChunkName: "flavours/glitch/async/status" */'flavours/glitch/features/status');
+}
+
+export function GettingStarted () {
+  return import(/* webpackChunkName: "flavours/glitch/async/getting_started" */'flavours/glitch/features/getting_started');
+}
+
+export function PinnedStatuses () {
+  return import(/* webpackChunkName: "flavours/glitch/async/pinned_statuses" */'flavours/glitch/features/pinned_statuses');
+}
+
+export function AccountTimeline () {
+  return import(/* webpackChunkName: "flavours/glitch/async/account_timeline" */'flavours/glitch/features/account_timeline');
+}
+
+export function AccountGallery () {
+  return import(/* webpackChunkName: "flavours/glitch/async/account_gallery" */'flavours/glitch/features/account_gallery');
+}
+
+export function Followers () {
+  return import(/* webpackChunkName: "flavours/glitch/async/followers" */'flavours/glitch/features/followers');
+}
+
+export function Following () {
+  return import(/* webpackChunkName: "flavours/glitch/async/following" */'flavours/glitch/features/following');
+}
+
+export function Reblogs () {
+  return import(/* webpackChunkName: "flavours/glitch/async/reblogs" */'flavours/glitch/features/reblogs');
+}
+
+export function Favourites () {
+  return import(/* webpackChunkName: "flavours/glitch/async/favourites" */'flavours/glitch/features/favourites');
+}
+
+export function FollowRequests () {
+  return import(/* webpackChunkName: "flavours/glitch/async/follow_requests" */'flavours/glitch/features/follow_requests');
+}
+
+export function GenericNotFound () {
+  return import(/* webpackChunkName: "flavours/glitch/async/generic_not_found" */'flavours/glitch/features/generic_not_found');
+}
+
+export function FavouritedStatuses () {
+  return import(/* webpackChunkName: "flavours/glitch/async/favourited_statuses" */'flavours/glitch/features/favourited_statuses');
+}
+
+export function Blocks () {
+  return import(/* webpackChunkName: "flavours/glitch/async/blocks" */'flavours/glitch/features/blocks');
+}
+
+export function Mutes () {
+  return import(/* webpackChunkName: "flavours/glitch/async/mutes" */'flavours/glitch/features/mutes');
+}
+
+export function OnboardingModal () {
+  return import(/* webpackChunkName: "flavours/glitch/async/onboarding_modal" */'flavours/glitch/features/ui/components/onboarding_modal');
+}
+
+export function MuteModal () {
+  return import(/* webpackChunkName: "flavours/glitch/async/mute_modal" */'flavours/glitch/features/ui/components/mute_modal');
+}
+
+export function ReportModal () {
+  return import(/* webpackChunkName: "flavours/glitch/async/report_modal" */'flavours/glitch/features/ui/components/report_modal');
+}
+
+export function SettingsModal () {
+  return import(/* webpackChunkName: "flavours/glitch/async/settings_modal" */'flavours/glitch/features/local_settings');
+}
+
+export function MediaGallery () {
+  return import(/* webpackChunkName: "flavours/glitch/async/media_gallery" */'flavours/glitch/components/media_gallery');
+}
+
+export function Video () {
+  return import(/* webpackChunkName: "flavours/glitch/async/video" */'flavours/glitch/features/video');
+}
+
+export function EmbedModal () {
+  return import(/* webpackChunkName: "flavours/glitch/async/embed_modal" */'flavours/glitch/features/ui/components/embed_modal');
+}
diff --git a/app/javascript/themes/glitch/util/base_polyfills.js b/app/javascript/flavours/glitch/util/base_polyfills.js
index 7856b26f9..7856b26f9 100644
--- a/app/javascript/themes/glitch/util/base_polyfills.js
+++ b/app/javascript/flavours/glitch/util/base_polyfills.js
diff --git a/app/javascript/themes/glitch/util/bio_metadata.js b/app/javascript/flavours/glitch/util/bio_metadata.js
index 599ec20e2..599ec20e2 100644
--- a/app/javascript/themes/glitch/util/bio_metadata.js
+++ b/app/javascript/flavours/glitch/util/bio_metadata.js
diff --git a/app/javascript/themes/glitch/util/counter.js b/app/javascript/flavours/glitch/util/counter.js
index 700ba2163..700ba2163 100644
--- a/app/javascript/themes/glitch/util/counter.js
+++ b/app/javascript/flavours/glitch/util/counter.js
diff --git a/app/javascript/themes/glitch/util/emoji/emoji_compressed.js b/app/javascript/flavours/glitch/util/emoji/emoji_compressed.js
index e5b834a74..e5b834a74 100644
--- a/app/javascript/themes/glitch/util/emoji/emoji_compressed.js
+++ b/app/javascript/flavours/glitch/util/emoji/emoji_compressed.js
diff --git a/app/javascript/themes/glitch/util/emoji/emoji_map.json b/app/javascript/flavours/glitch/util/emoji/emoji_map.json
index 13753ba84..13753ba84 100644
--- a/app/javascript/themes/glitch/util/emoji/emoji_map.json
+++ b/app/javascript/flavours/glitch/util/emoji/emoji_map.json
diff --git a/app/javascript/themes/glitch/util/emoji/emoji_mart_data_light.js b/app/javascript/flavours/glitch/util/emoji/emoji_mart_data_light.js
index 45086fc4c..45086fc4c 100644
--- a/app/javascript/themes/glitch/util/emoji/emoji_mart_data_light.js
+++ b/app/javascript/flavours/glitch/util/emoji/emoji_mart_data_light.js
diff --git a/app/javascript/themes/glitch/util/emoji/emoji_mart_search_light.js b/app/javascript/flavours/glitch/util/emoji/emoji_mart_search_light.js
index 5755bf1c4..5755bf1c4 100644
--- a/app/javascript/themes/glitch/util/emoji/emoji_mart_search_light.js
+++ b/app/javascript/flavours/glitch/util/emoji/emoji_mart_search_light.js
diff --git a/app/javascript/themes/glitch/util/emoji/emoji_picker.js b/app/javascript/flavours/glitch/util/emoji/emoji_picker.js
index 7e145381e..7e145381e 100644
--- a/app/javascript/themes/glitch/util/emoji/emoji_picker.js
+++ b/app/javascript/flavours/glitch/util/emoji/emoji_picker.js
diff --git a/app/javascript/themes/glitch/util/emoji/emoji_unicode_mapping_light.js b/app/javascript/flavours/glitch/util/emoji/emoji_unicode_mapping_light.js
index 918684c31..918684c31 100644
--- a/app/javascript/themes/glitch/util/emoji/emoji_unicode_mapping_light.js
+++ b/app/javascript/flavours/glitch/util/emoji/emoji_unicode_mapping_light.js
diff --git a/app/javascript/themes/glitch/util/emoji/emoji_utils.js b/app/javascript/flavours/glitch/util/emoji/emoji_utils.js
index dbf725c1f..dbf725c1f 100644
--- a/app/javascript/themes/glitch/util/emoji/emoji_utils.js
+++ b/app/javascript/flavours/glitch/util/emoji/emoji_utils.js
diff --git a/app/javascript/themes/glitch/util/emoji/index.js b/app/javascript/flavours/glitch/util/emoji/index.js
index 8c45a58fe..31c3e14ca 100644
--- a/app/javascript/themes/glitch/util/emoji/index.js
+++ b/app/javascript/flavours/glitch/util/emoji/index.js
@@ -1,4 +1,4 @@
-import { autoPlayGif } from 'themes/glitch/util/initial_state';
+import { autoPlayGif } from 'flavours/glitch/util/initial_state';
 import unicodeMapping from './emoji_unicode_mapping_light';
 import Trie from 'substring-trie';
 
diff --git a/app/javascript/themes/glitch/util/emoji/unicode_to_filename.js b/app/javascript/flavours/glitch/util/emoji/unicode_to_filename.js
index c75c4cd7d..c75c4cd7d 100644
--- a/app/javascript/themes/glitch/util/emoji/unicode_to_filename.js
+++ b/app/javascript/flavours/glitch/util/emoji/unicode_to_filename.js
diff --git a/app/javascript/themes/glitch/util/emoji/unicode_to_unified_name.js b/app/javascript/flavours/glitch/util/emoji/unicode_to_unified_name.js
index 808ac197e..808ac197e 100644
--- a/app/javascript/themes/glitch/util/emoji/unicode_to_unified_name.js
+++ b/app/javascript/flavours/glitch/util/emoji/unicode_to_unified_name.js
diff --git a/app/javascript/themes/glitch/util/extra_polyfills.js b/app/javascript/flavours/glitch/util/extra_polyfills.js
index 3acc55abd..3acc55abd 100644
--- a/app/javascript/themes/glitch/util/extra_polyfills.js
+++ b/app/javascript/flavours/glitch/util/extra_polyfills.js
diff --git a/app/javascript/themes/glitch/util/fullscreen.js b/app/javascript/flavours/glitch/util/fullscreen.js
index cf5d0cf98..cf5d0cf98 100644
--- a/app/javascript/themes/glitch/util/fullscreen.js
+++ b/app/javascript/flavours/glitch/util/fullscreen.js
diff --git a/app/javascript/themes/glitch/util/get_rect_from_entry.js b/app/javascript/flavours/glitch/util/get_rect_from_entry.js
index c266cd7dc..c266cd7dc 100644
--- a/app/javascript/themes/glitch/util/get_rect_from_entry.js
+++ b/app/javascript/flavours/glitch/util/get_rect_from_entry.js
diff --git a/app/javascript/themes/glitch/util/initial_state.js b/app/javascript/flavours/glitch/util/initial_state.js
index ef5d8b0ef..ef5d8b0ef 100644
--- a/app/javascript/themes/glitch/util/initial_state.js
+++ b/app/javascript/flavours/glitch/util/initial_state.js
diff --git a/app/javascript/themes/glitch/util/intersection_observer_wrapper.js b/app/javascript/flavours/glitch/util/intersection_observer_wrapper.js
index 2b24c6583..2b24c6583 100644
--- a/app/javascript/themes/glitch/util/intersection_observer_wrapper.js
+++ b/app/javascript/flavours/glitch/util/intersection_observer_wrapper.js
diff --git a/app/javascript/themes/glitch/util/is_mobile.js b/app/javascript/flavours/glitch/util/is_mobile.js
index 80e8e0a8a..80e8e0a8a 100644
--- a/app/javascript/themes/glitch/util/is_mobile.js
+++ b/app/javascript/flavours/glitch/util/is_mobile.js
diff --git a/app/javascript/themes/glitch/util/link_header.js b/app/javascript/flavours/glitch/util/link_header.js
index a3e7ccf1c..a3e7ccf1c 100644
--- a/app/javascript/themes/glitch/util/link_header.js
+++ b/app/javascript/flavours/glitch/util/link_header.js
diff --git a/app/javascript/themes/glitch/util/load_polyfills.js b/app/javascript/flavours/glitch/util/load_polyfills.js
index 8927b7358..8927b7358 100644
--- a/app/javascript/themes/glitch/util/load_polyfills.js
+++ b/app/javascript/flavours/glitch/util/load_polyfills.js
diff --git a/app/javascript/themes/glitch/util/main.js b/app/javascript/flavours/glitch/util/main.js
index c10a64ded..fe57fa962 100644
--- a/app/javascript/themes/glitch/util/main.js
+++ b/app/javascript/flavours/glitch/util/main.js
@@ -1,5 +1,5 @@
 import * as WebPushSubscription from './web_push_subscription';
-import Mastodon from 'themes/glitch/containers/mastodon';
+import Mastodon from 'flavours/glitch/containers/mastodon';
 import React from 'react';
 import ReactDOM from 'react-dom';
 import ready from './ready';
diff --git a/app/javascript/themes/glitch/util/optional_motion.js b/app/javascript/flavours/glitch/util/optional_motion.js
index b8a57b22f..eecb6634e 100644
--- a/app/javascript/themes/glitch/util/optional_motion.js
+++ b/app/javascript/flavours/glitch/util/optional_motion.js
@@ -1,4 +1,4 @@
-import { reduceMotion } from 'themes/glitch/util/initial_state';
+import { reduceMotion } from 'flavours/glitch/util/initial_state';
 import ReducedMotion from './reduced_motion';
 import Motion from 'react-motion/lib/Motion';
 
diff --git a/app/javascript/themes/glitch/util/performance.js b/app/javascript/flavours/glitch/util/performance.js
index 450a90626..450a90626 100644
--- a/app/javascript/themes/glitch/util/performance.js
+++ b/app/javascript/flavours/glitch/util/performance.js
diff --git a/app/javascript/themes/glitch/util/react_router_helpers.js b/app/javascript/flavours/glitch/util/react_router_helpers.js
index c02fb5247..1dba5e9bb 100644
--- a/app/javascript/themes/glitch/util/react_router_helpers.js
+++ b/app/javascript/flavours/glitch/util/react_router_helpers.js
@@ -2,9 +2,9 @@ import React from 'react';
 import PropTypes from 'prop-types';
 import { Switch, Route } from 'react-router-dom';
 
-import ColumnLoading from 'themes/glitch/features/ui/components/column_loading';
-import BundleColumnError from 'themes/glitch/features/ui/components/bundle_column_error';
-import BundleContainer from 'themes/glitch/features/ui/containers/bundle_container';
+import ColumnLoading from 'flavours/glitch/features/ui/components/column_loading';
+import BundleColumnError from 'flavours/glitch/features/ui/components/bundle_column_error';
+import BundleContainer from 'flavours/glitch/features/ui/containers/bundle_container';
 
 // Small wrapper to pass multiColumn to the route components
 export class WrappedSwitch extends React.PureComponent {
diff --git a/app/javascript/themes/glitch/util/ready.js b/app/javascript/flavours/glitch/util/ready.js
index dd543910b..dd543910b 100644
--- a/app/javascript/themes/glitch/util/ready.js
+++ b/app/javascript/flavours/glitch/util/ready.js
diff --git a/app/javascript/themes/glitch/util/reduced_motion.js b/app/javascript/flavours/glitch/util/reduced_motion.js
index 95519042b..95519042b 100644
--- a/app/javascript/themes/glitch/util/reduced_motion.js
+++ b/app/javascript/flavours/glitch/util/reduced_motion.js
diff --git a/app/javascript/themes/glitch/util/rtl.js b/app/javascript/flavours/glitch/util/rtl.js
index 00870a15d..00870a15d 100644
--- a/app/javascript/themes/glitch/util/rtl.js
+++ b/app/javascript/flavours/glitch/util/rtl.js
diff --git a/app/javascript/themes/glitch/util/schedule_idle_task.js b/app/javascript/flavours/glitch/util/schedule_idle_task.js
index b04d4a8ee..b04d4a8ee 100644
--- a/app/javascript/themes/glitch/util/schedule_idle_task.js
+++ b/app/javascript/flavours/glitch/util/schedule_idle_task.js
diff --git a/app/javascript/themes/glitch/util/scroll.js b/app/javascript/flavours/glitch/util/scroll.js
index 2af07e0fb..2af07e0fb 100644
--- a/app/javascript/themes/glitch/util/scroll.js
+++ b/app/javascript/flavours/glitch/util/scroll.js
diff --git a/app/javascript/themes/glitch/util/stream.js b/app/javascript/flavours/glitch/util/stream.js
index 36c68ffc5..36c68ffc5 100644
--- a/app/javascript/themes/glitch/util/stream.js
+++ b/app/javascript/flavours/glitch/util/stream.js
diff --git a/app/javascript/themes/glitch/util/url_regex.js b/app/javascript/flavours/glitch/util/url_regex.js
index e676d1879..e676d1879 100644
--- a/app/javascript/themes/glitch/util/url_regex.js
+++ b/app/javascript/flavours/glitch/util/url_regex.js
diff --git a/app/javascript/themes/glitch/util/uuid.js b/app/javascript/flavours/glitch/util/uuid.js
index be1899305..be1899305 100644
--- a/app/javascript/themes/glitch/util/uuid.js
+++ b/app/javascript/flavours/glitch/util/uuid.js
diff --git a/app/javascript/themes/glitch/util/web_push_subscription.js b/app/javascript/flavours/glitch/util/web_push_subscription.js
index 70b26105b..de185b6d9 100644
--- a/app/javascript/themes/glitch/util/web_push_subscription.js
+++ b/app/javascript/flavours/glitch/util/web_push_subscription.js
@@ -1,6 +1,6 @@
 import axios from 'axios';
-import { store } from 'themes/glitch/containers/mastodon';
-import { setBrowserSupport, setSubscription, clearSubscription } from 'themes/glitch/actions/push_notifications';
+import { store } from 'flavours/glitch/containers/mastodon';
+import { setBrowserSupport, setSubscription, clearSubscription } from 'flavours/glitch/actions/push_notifications';
 
 // Taken from https://www.npmjs.com/package/web-push
 const urlBase64ToUint8Array = (base64String) => {
diff --git a/app/javascript/themes/vanilla/theme.yml b/app/javascript/flavours/vanilla/theme.yml
index 67fd9723e..67fd9723e 100644
--- a/app/javascript/themes/vanilla/theme.yml
+++ b/app/javascript/flavours/vanilla/theme.yml
diff --git a/app/javascript/themes/glitch/features/generic_not_found/index.js b/app/javascript/themes/glitch/features/generic_not_found/index.js
deleted file mode 100644
index ccd2b87b2..000000000
--- a/app/javascript/themes/glitch/features/generic_not_found/index.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import React from 'react';
-import Column from 'themes/glitch/features/ui/components/column';
-import MissingIndicator from 'themes/glitch/components/missing_indicator';
-
-const GenericNotFound = () => (
-  <Column>
-    <MissingIndicator />
-  </Column>
-);
-
-export default GenericNotFound;
diff --git a/app/javascript/themes/glitch/features/standalone/compose/index.js b/app/javascript/themes/glitch/features/standalone/compose/index.js
deleted file mode 100644
index 8a8118178..000000000
--- a/app/javascript/themes/glitch/features/standalone/compose/index.js
+++ /dev/null
@@ -1,20 +0,0 @@
-import React from 'react';
-import ComposeFormContainer from 'themes/glitch/features/compose/containers/compose_form_container';
-import NotificationsContainer from 'themes/glitch/features/ui/containers/notifications_container';
-import LoadingBarContainer from 'themes/glitch/features/ui/containers/loading_bar_container';
-import ModalContainer from 'themes/glitch/features/ui/containers/modal_container';
-
-export default class Compose extends React.PureComponent {
-
-  render () {
-    return (
-      <div>
-        <ComposeFormContainer />
-        <NotificationsContainer />
-        <ModalContainer />
-        <LoadingBarContainer className='loading-bar' />
-      </div>
-    );
-  }
-
-}
diff --git a/app/javascript/themes/glitch/packs/common.js b/app/javascript/themes/glitch/packs/common.js
deleted file mode 100644
index fd4254a0e..000000000
--- a/app/javascript/themes/glitch/packs/common.js
+++ /dev/null
@@ -1 +0,0 @@
-import 'themes/glitch/styles/index.scss';
diff --git a/app/javascript/themes/glitch/packs/home.js b/app/javascript/themes/glitch/packs/home.js
deleted file mode 100644
index 69dddf51c..000000000
--- a/app/javascript/themes/glitch/packs/home.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import loadPolyfills from 'themes/glitch/util/load_polyfills';
-
-loadPolyfills().then(() => {
-  require('themes/glitch/util/main').default();
-}).catch(e => {
-  console.error(e);
-});
diff --git a/app/javascript/themes/glitch/util/async-components.js b/app/javascript/themes/glitch/util/async-components.js
deleted file mode 100644
index 91e85fed5..000000000
--- a/app/javascript/themes/glitch/util/async-components.js
+++ /dev/null
@@ -1,115 +0,0 @@
-export function EmojiPicker () {
-  return import(/* webpackChunkName: "themes/glitch/async/emoji_picker" */'themes/glitch/util/emoji/emoji_picker');
-}
-
-export function Compose () {
-  return import(/* webpackChunkName: "themes/glitch/async/compose" */'themes/glitch/features/compose');
-}
-
-export function Notifications () {
-  return import(/* webpackChunkName: "themes/glitch/async/notifications" */'themes/glitch/features/notifications');
-}
-
-export function HomeTimeline () {
-  return import(/* webpackChunkName: "themes/glitch/async/home_timeline" */'themes/glitch/features/home_timeline');
-}
-
-export function PublicTimeline () {
-  return import(/* webpackChunkName: "themes/glitch/async/public_timeline" */'themes/glitch/features/public_timeline');
-}
-
-export function CommunityTimeline () {
-  return import(/* webpackChunkName: "themes/glitch/async/community_timeline" */'themes/glitch/features/community_timeline');
-}
-
-export function HashtagTimeline () {
-  return import(/* webpackChunkName: "themes/glitch/async/hashtag_timeline" */'themes/glitch/features/hashtag_timeline');
-}
-
-export function DirectTimeline() {
-  return import(/* webpackChunkName: "themes/glitch/async/direct_timeline" */'themes/glitch/features/direct_timeline');
-}
-
-export function Status () {
-  return import(/* webpackChunkName: "themes/glitch/async/status" */'themes/glitch/features/status');
-}
-
-export function GettingStarted () {
-  return import(/* webpackChunkName: "themes/glitch/async/getting_started" */'themes/glitch/features/getting_started');
-}
-
-export function PinnedStatuses () {
-  return import(/* webpackChunkName: "themes/glitch/async/pinned_statuses" */'themes/glitch/features/pinned_statuses');
-}
-
-export function AccountTimeline () {
-  return import(/* webpackChunkName: "themes/glitch/async/account_timeline" */'themes/glitch/features/account_timeline');
-}
-
-export function AccountGallery () {
-  return import(/* webpackChunkName: "themes/glitch/async/account_gallery" */'themes/glitch/features/account_gallery');
-}
-
-export function Followers () {
-  return import(/* webpackChunkName: "themes/glitch/async/followers" */'themes/glitch/features/followers');
-}
-
-export function Following () {
-  return import(/* webpackChunkName: "themes/glitch/async/following" */'themes/glitch/features/following');
-}
-
-export function Reblogs () {
-  return import(/* webpackChunkName: "themes/glitch/async/reblogs" */'themes/glitch/features/reblogs');
-}
-
-export function Favourites () {
-  return import(/* webpackChunkName: "themes/glitch/async/favourites" */'themes/glitch/features/favourites');
-}
-
-export function FollowRequests () {
-  return import(/* webpackChunkName: "themes/glitch/async/follow_requests" */'themes/glitch/features/follow_requests');
-}
-
-export function GenericNotFound () {
-  return import(/* webpackChunkName: "themes/glitch/async/generic_not_found" */'themes/glitch/features/generic_not_found');
-}
-
-export function FavouritedStatuses () {
-  return import(/* webpackChunkName: "themes/glitch/async/favourited_statuses" */'themes/glitch/features/favourited_statuses');
-}
-
-export function Blocks () {
-  return import(/* webpackChunkName: "themes/glitch/async/blocks" */'themes/glitch/features/blocks');
-}
-
-export function Mutes () {
-  return import(/* webpackChunkName: "themes/glitch/async/mutes" */'themes/glitch/features/mutes');
-}
-
-export function OnboardingModal () {
-  return import(/* webpackChunkName: "themes/glitch/async/onboarding_modal" */'themes/glitch/features/ui/components/onboarding_modal');
-}
-
-export function MuteModal () {
-  return import(/* webpackChunkName: "themes/glitch/async/mute_modal" */'themes/glitch/features/ui/components/mute_modal');
-}
-
-export function ReportModal () {
-  return import(/* webpackChunkName: "themes/glitch/async/report_modal" */'themes/glitch/features/ui/components/report_modal');
-}
-
-export function SettingsModal () {
-  return import(/* webpackChunkName: "themes/glitch/async/settings_modal" */'themes/glitch/features/local_settings');
-}
-
-export function MediaGallery () {
-  return import(/* webpackChunkName: "themes/glitch/async/media_gallery" */'themes/glitch/components/media_gallery');
-}
-
-export function Video () {
-  return import(/* webpackChunkName: "themes/glitch/async/video" */'themes/glitch/features/video');
-}
-
-export function EmbedModal () {
-  return import(/* webpackChunkName: "themes/glitch/async/embed_modal" */'themes/glitch/features/ui/components/embed_modal');
-}
diff --git a/app/javascript/themes/mastodon-go b/app/javascript/themes/mastodon-go
deleted file mode 160000
-Subproject 74c0293e83dbb49ea4f27eea108526df6216d2a
diff --git a/app/lib/themes.rb b/app/lib/themes.rb
index f1796d0e3..863326e2d 100644
--- a/app/lib/themes.rb
+++ b/app/lib/themes.rb
@@ -12,7 +12,7 @@ class Themes
     core['pack'] = Hash.new unless core['pack']
 
     result = Hash.new
-    Dir.glob(Rails.root.join('app', 'javascript', 'themes', '*', 'theme.yml')) do |path|
+    Dir.glob(Rails.root.join('app', 'javascript', 'flavours', '*', 'theme.yml')) do |path|
       data = YAML.load_file(path)
       name = File.basename(File.dirname(path))
       if data['pack']
@@ -51,11 +51,11 @@ class Themes
     @core
   end
 
-  def get(name)
+  def flavour(name)
     @conf[name]
   end
 
-  def names
+  def flavours
     @conf.keys
   end
 
diff --git a/app/models/user.rb b/app/models/user.rb
index 1d42d4f70..2458cf298 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -74,7 +74,7 @@ class User < ApplicationRecord
   has_many :session_activations, dependent: :destroy
 
   delegate :auto_play_gif, :default_sensitive, :unfollow_modal, :boost_modal, :delete_modal,
-           :reduce_motion, :system_font_ui, :noindex, :theme, :skin,
+           :reduce_motion, :system_font_ui, :noindex, :flavour, :skin,
            to: :settings, prefix: :setting, allow_nil: false
 
   def confirmed?
diff --git a/app/views/layouts/_theme.html.haml b/app/views/layouts/_theme.html.haml
index 941ccc914..39727953d 100644
--- a/app/views/layouts/_theme.html.haml
+++ b/app/views/layouts/_theme.html.haml
@@ -2,10 +2,10 @@
   - if theme[:pack] != 'common' && theme[:common]
     = render partial: 'layouts/theme', object: theme[:common]
   - if theme[:pack]
-    = javascript_pack_tag theme[:name] ? "themes/#{theme[:name]}/#{theme[:pack]}" : "core/#{theme[:pack]}", integrity: true, crossorigin: 'anonymous'
+    = javascript_pack_tag theme[:flavour] ? "flavours/#{theme[:flavour]}/#{theme[:pack]}" : "core/#{theme[:pack]}", integrity: true, crossorigin: 'anonymous'
     - if theme[:skin]
-      - if !theme[:name] || theme[:skin] == 'default'
-        = stylesheet_pack_tag theme[:name] ? "themes/#{theme[:name]}/#{theme[:pack]}" : "core/#{theme[:pack]}", integrity: true, media: 'all'
+      - if !theme[:flavour] || theme[:skin] == 'default'
+        = stylesheet_pack_tag theme[:flavour] ? "flavours/#{theme[:flavour]}/#{theme[:pack]}" : "core/#{theme[:pack]}", integrity: true, media: 'all'
       - else
         = stylesheet_pack_tag "skins/#{theme[:name]}/#{theme[:skin]}/#{theme[:pack]}"
     - if theme[:preload]
diff --git a/app/views/settings/preferences/show.html.haml b/app/views/settings/preferences/show.html.haml
index 0d487d9f3..030a902cf 100644
--- a/app/views/settings/preferences/show.html.haml
+++ b/app/views/settings/preferences/show.html.haml
@@ -27,7 +27,7 @@
 
   .fields-group
     - if Themes.instance.names.size > 1
-      = f.input :setting_theme, collection: Themes.instance.names, label_method: lambda { |theme| I18n.t("themes.#{theme}", default: theme) }, wrapper: :with_label, include_blank: false
+      = f.input :setting_flavour, collection: Themes.instance.flavours, label_method: lambda { |flavour| I18n.t("themes.#{flavour}", default: flavour) }, wrapper: :with_label, include_blank: false
       = f.input :setting_skin, collection: Themes.instance.skins_for(current_theme), label_method: lambda { |skin| I18n.t("themes.#{current_theme}.skins.#{skin}", default: skin) }, wrapper: :with_label, include_blank: false
 
     = f.input :setting_unfollow_modal, as: :boolean, wrapper: :with_label
diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml
index b9ef21fef..1ce24e3c6 100644
--- a/config/locales/simple_form.en.yml
+++ b/config/locales/simple_form.en.yml
@@ -14,8 +14,8 @@ en:
           one: <span class="note-counter">1</span> character left
           other: <span class="note-counter">%{count}</span> characters left
         setting_noindex: Affects your public profile and status pages
-        setting_theme: Affects how Mastodon looks when you're logged in from any device.
-        setting_skin: Reskins the selected Mastodon theme
+        setting_flavour: Affects how Mastodon looks when you're logged in from any device
+        setting_skin: Reskins the selected Mastodon flavour
       imports:
         data: CSV file exported from another Mastodon instance
       sessions:
@@ -47,7 +47,7 @@ en:
         setting_noindex: Opt-out of search engine indexing
         setting_reduce_motion: Reduce motion in animations
         setting_system_font_ui: Use system's default font
-        setting_theme: Site theme
+        setting_flavour: Mastodon Flavour
         setting_skin: Skin
         setting_unfollow_modal: Show confirmation dialog before unfollowing someone
         severity: Severity
diff --git a/config/settings.yml b/config/settings.yml
index 5abf647e8..48d971d44 100644
--- a/config/settings.yml
+++ b/config/settings.yml
@@ -25,7 +25,7 @@ defaults: &defaults
   reduce_motion: false
   system_font_ui: false
   noindex: false
-  theme: 'glitch'
+  flavour: 'glitch'
   skin: 'default'
   notification_emails:
     follow: false
diff --git a/config/webpack/configuration.js b/config/webpack/configuration.js
index cb31c6ab8..59d46c78d 100644
--- a/config/webpack/configuration.js
+++ b/config/webpack/configuration.js
@@ -9,9 +9,9 @@ const glob = require('glob');
 const configPath = resolve('config', 'webpacker.yml');
 const loadersDir = join(__dirname, 'loaders');
 const settings = safeLoad(readFileSync(configPath), 'utf8')[env.NODE_ENV];
-const themeFiles = glob.sync('app/javascript/themes/*/theme.yml');
+const flavourFiles = glob.sync('app/javascript/flavours/*/theme.yml');
 const skinFiles = glob.sync('app/javascript/skins/*/*');
-const themes = {};
+const flavours = {};
 
 const core = function () {
   const coreFile = resolve('app', 'javascript', 'core', 'theme.yml');
@@ -22,16 +22,16 @@ const core = function () {
   return data.pack ? data : {};
 }();
 
-for (let i = 0; i < themeFiles.length; i++) {
-  const themeFile = themeFiles[i];
-  const data = safeLoad(readFileSync(themeFile), 'utf8');
-  data.name = basename(dirname(themeFile));
+for (let i = 0; i < flavourFiles.length; i++) {
+  const flavourFile = flavourFiles[i];
+  const data = safeLoad(readFileSync(flavourFile), 'utf8');
+  data.name = basename(dirname(flavourFile));
   data.skin = {};
   if (!data.pack_directory) {
-    data.pack_directory = dirname(themeFile);
+    data.pack_directory = dirname(flavourFile);
   }
   if (data.pack && typeof data.pack === 'object') {
-    themes[data.name] = data;
+    flavours[data.name] = data;
   }
 }
 
@@ -39,10 +39,10 @@ for (let i = 0; i < skinFiles.length; i++) {
   const skinFile = skinFiles[i];
   let skin = basename(skinFile);
   const name = basename(dirname(skinFile));
-  if (!themes[name]) {
+  if (!flavours[name]) {
     continue;
   }
-  const data = themes[name].skin;
+  const data = flavours[name].skin;
   if (lstatSync(skinFile).isDirectory()) {
     data[skin] = {};
     const skinPacks = glob.sync(skinFile, '*.{css,scss}');
@@ -76,7 +76,7 @@ const output = {
 module.exports = {
   settings,
   core,
-  themes,
+  flavours,
   env,
   loadersDir,
   output,
diff --git a/config/webpack/shared.js b/config/webpack/shared.js
index a2550bc81..e4b057ffb 100644
--- a/config/webpack/shared.js
+++ b/config/webpack/shared.js
@@ -6,7 +6,7 @@ const { sync } = require('glob');
 const ExtractTextPlugin = require('extract-text-webpack-plugin');
 const ManifestPlugin = require('webpack-manifest-plugin');
 const extname = require('path-complete-extname');
-const { env, settings, core, themes, output, loadersDir } = require('./configuration.js');
+const { env, settings, core, flavours, output, loadersDir } = require('./configuration.js');
 const localePackPaths = require('./generateLocalePacks');
 
 function reducePacks (data, into = {}) {
@@ -20,7 +20,7 @@ function reducePacks (data, into = {}) {
     }
     const packFile = typeof pack === 'string' ? pack : pack.filename;
     if (packFile) {
-      map[data.name ? `themes/${data.name}/${entry}` : `core/${entry}`] = resolve(data.pack_directory, packFile);
+      map[data.name ? `flavours/${data.name}/${entry}` : `core/${entry}`] = resolve(data.pack_directory, packFile);
     }
     return map;
   }, into);
@@ -54,7 +54,7 @@ module.exports = {
       return localMap;
     }, {}),
     reducePacks(core),
-    Object.keys(themes).reduce((map, entry) => reducePacks(themes[entry], map), {})
+    Object.keys(flavours).reduce((map, entry) => reducePacks(flavours[entry], map), {})
   ),
 
   output: {