diff --git a/src/contentScripts/communityConsole/flattenThreads/components/ReplyButton.js b/src/contentScripts/communityConsole/flattenThreads/components/ReplyButton.js
index a8aeaba..6a35b10 100644
--- a/src/contentScripts/communityConsole/flattenThreads/components/ReplyButton.js
+++ b/src/contentScripts/communityConsole/flattenThreads/components/ReplyButton.js
@@ -2,10 +2,10 @@
 
 import {msg, str} from '@lit/localize';
 import {css, html} from 'lit';
-import {waitFor} from 'poll-until-promise';
 
 import {I18nLitElement} from '../../../../common/litI18nUtils.js';
 import {SHARED_MD3_STYLES} from '../../../../common/styles/md3.js';
+import {openReplyEditor} from '../../utils/common.js';
 import {getExtraInfoNodes} from '../flattenThreads.js';
 
 export default class TwptFlattenThreadReplyButton extends I18nLitElement {
@@ -26,6 +26,7 @@
   constructor() {
     super();
     this.extraInfo = {};
+    this.addEventListener('twpt-click', this.openReplyEditor);
   }
 
   render() {
@@ -69,30 +70,7 @@
     }
 
     const parentId = this.extraInfo?.parentId ?? this.extraInfo?.id;
-    const parentNodeReply =
-        document.querySelector('[data-twpt-message-id="' + parentId + '"]')
-            ?.closest?.('sc-tailwind-thread-message-message-card');
-    const parentNodeReplyButton = parentNodeReply?.querySelector?.(
-        '.scTailwindThreadMessageMessagecardadd-comment button');
-    if (!parentNodeReplyButton) {
-      // This is not critical: the reply button might already have been clicked
-      // (so it no longer exists), or the thread might be locked so replying is
-      // disabled and the button does'nt exist.
-      console.debug('[flattenThreads] Reply button not found.');
-      return;
-    }
-
-    // Click the reply button.
-    parentNodeReplyButton.click();
-
-    // Fill in the default reply text (it includes a quote of the message the
-    // user wishes to reply to).
-    waitFor(() => {
-      const editor =
-          parentNodeReply?.querySelector('sc-tailwind-thread-reply-editor');
-      if (editor) return Promise.resolve(editor);
-      return Promise.reject(new Error('Editor not found.'));
-    }, {interval: 75, timeout: 10 * 1000}).then(editor => {
+    openReplyEditor(parentId).then(editor => {
       const payload =
           editor?.querySelector('.scTailwindSharedRichtexteditoreditor');
 
diff --git a/src/contentScripts/communityConsole/flattenThreads/replyActionHandler.js b/src/contentScripts/communityConsole/flattenThreads/replyActionHandler.js
new file mode 100644
index 0000000..99ef0fc
--- /dev/null
+++ b/src/contentScripts/communityConsole/flattenThreads/replyActionHandler.js
@@ -0,0 +1,74 @@
+import {waitFor} from 'poll-until-promise';
+
+import {parseUrl} from '../../../common/commonUtils';
+import {getOptions} from '../../../common/optionsUtils';
+
+const kOpenReplyEditorIntervalInMs = 500;
+const kOpenReplyEditorTimeoutInMs = 10 * 1000;
+
+// @TODO: Handle observing when the hash is added after the page has loaded.
+export default class FlattenThreadsReplyActionHandler {
+  /**
+   * @param {Object} options Options object which at least includes the
+   *     |flattenthreads| and |flattenthreads_switch_enabled| options.
+   */
+  constructor(options = null) {
+    this.options = options;
+  }
+
+  async handleIfApplicable() {
+    if (await this.isFeatureEnabled()) this.handle();
+  }
+
+  async handle() {
+    const hash = window.location.hash;
+    if (hash === '#action=reply') await this.openReplyEditor();
+  }
+
+  async openReplyEditor() {
+    // We erase the hash so the Community Console doesn't open the reply
+    // editor, since we're going to do that instead.
+    window.location.hash = '';
+
+    const messageId = this.getCurrentMessageId();
+    if (messageId === null) {
+      console.error(
+          '[FlattenThreadsReplyActionHandler] Could not parse current message id.');
+      return;
+    }
+
+    const replyButton = await waitFor(async () => {
+      const replyButton = document.querySelector(
+          '[data-twpt-message-id="' + messageId +
+          '"] twpt-flatten-thread-reply-button');
+      if (replyButton === null) throw new Error('Reply button not found.');
+      return replyButton;
+    }, {
+      interval: kOpenReplyEditorIntervalInMs,
+      timeout: kOpenReplyEditorTimeoutInMs,
+    });
+
+    const e = new Event('twpt-click');
+    replyButton.dispatchEvent(e);
+  }
+
+  async isFeatureEnabled() {
+    let options;
+    if (this.options !== null) {
+      options = this.options;
+    } else {
+      options =
+          await getOptions(['flattenthreads', 'flattenthreads_switch_enabled']);
+    }
+    return options['flattenthreads'] &&
+        options['flattenthreads_switch_enabled'];
+  }
+
+  getCurrentMessageId() {
+    const thread = parseUrl(window.location.href);
+    if (thread === false || thread.message === null) {
+      return null;
+    }
+    return thread.message;
+  }
+}
diff --git a/src/contentScripts/communityConsole/start.js b/src/contentScripts/communityConsole/start.js
index 294c6cd..71b4779 100644
--- a/src/contentScripts/communityConsole/start.js
+++ b/src/contentScripts/communityConsole/start.js
@@ -6,6 +6,7 @@
 
 import AutoRefresh from './autoRefresh.js';
 import ExtraInfo from './extraInfo/index.js';
+import FlattenThreadsReplyActionHandler from './flattenThreads/replyActionHandler.js';
 import ThreadPageDesignWarning from './threadPageDesignWarning.js';
 import WorkflowsImport from './workflows/import.js';
 
@@ -83,4 +84,7 @@
     injectStylesheet(chrome.runtime.getURL('css/ui_spacing/shared.css'));
     injectStylesheet(chrome.runtime.getURL('css/ui_spacing/console.css'));
   }
+
+  const flattenThreadsReplyActionHandler = new FlattenThreadsReplyActionHandler(options);
+  flattenThreadsReplyActionHandler.handleIfApplicable();
 });
diff --git a/src/contentScripts/communityConsole/utils/common.js b/src/contentScripts/communityConsole/utils/common.js
index 3d2bac5..90ff24d 100644
--- a/src/contentScripts/communityConsole/utils/common.js
+++ b/src/contentScripts/communityConsole/utils/common.js
@@ -1,4 +1,5 @@
 import {MDCTooltip} from '@material/tooltip';
+import {waitFor} from 'poll-until-promise';
 
 import {createPlainTooltip} from '../../../common/tooltip.js';
 
@@ -31,8 +32,10 @@
   return [badge, badgeTooltip];
 }
 
-// Adds an element to the thread list actions bar next to the button given by
-// |originalBtn|.
+/**
+ * Adds an element to the thread list actions bar next to the button given by
+ * |originalBtn|.
+ */
 export function addElementToThreadListActions(originalBtn, element) {
   var duplicateBtn =
       originalBtn.parentNode.querySelector('[debugid="mark-duplicate-button"]');
@@ -44,9 +47,11 @@
         element, (originalBtn.nextSibling || originalBtn));
 }
 
-// Adds a button to the thread list actions bar next to the button given by
-// |originalBtn|. The button will have icon |icon|, when hovered it will display
-// |tooltip|, and will have a debugid attribute with value |debugId|.
+/**
+ * Adds a button to the thread list actions bar next to the button given by
+ * |originalBtn|. The button will have icon |icon|, when hovered it will display
+ * |tooltip|, and will have a debugid attribute with value |debugId|.
+ */
 export function addButtonToThreadListActions(
     originalBtn, icon, debugId, tooltip) {
   let clone = originalBtn.cloneNode(true);
@@ -67,9 +72,11 @@
   return clone;
 }
 
-// Returns true if |node| is the "mark as read/unread" button, the parent of the
-// parent of |node| is the actions bar of the thread list, and the button with
-// debugid |debugid| is NOT part of the actions bar.
+/**
+ * Returns true if |node| is the "mark as read/unread" button, the parent of the
+ * parent of |node| is the actions bar of the thread list, and the button with
+ * debugid |debugid| is NOT part of the actions bar.
+ */
 export function shouldAddBtnToActionBar(debugid, node) {
   return node?.tagName == 'MATERIAL-BUTTON' &&
       (node.getAttribute?.('debugid') == 'mark-read-button' ||
@@ -78,15 +85,19 @@
       node.parentNode?.parentNode?.tagName == 'EC-BULK-ACTIONS';
 }
 
-// Returns the display language set by the user.
+/**
+ * Returns the display language set by the user.
+ */
 export function getDisplayLanguage() {
   var startup =
       JSON.parse(document.querySelector('html').getAttribute('data-startup'));
   return startup?.[1]?.[1]?.[3]?.[6] ?? 'en';
 }
 
-// Refreshes the current view in the Community Console without reloading the
-// whole page if possible.
+/**
+ * Refreshes the current view in the Community Console without reloading the
+ * whole page if possible.
+ */
 export function softRefreshView() {
   const refreshButton = document.querySelector('.app-title-button');
   if (refreshButton == null)
@@ -94,3 +105,32 @@
   else
     refreshButton.click();
 }
+
+/**
+ * Opens the vanilla Community Console reply editor.
+ * @param {string} messageId The id of the message for which to open the reply
+ * editor.
+ * @returns {Promise<Element>} A promise resolving to the reply editor.
+ */
+export async function openReplyEditor(messageId) {
+  const nodeReply =
+      document.querySelector('[data-twpt-message-id="' + messageId + '"]')
+          ?.closest?.('sc-tailwind-thread-message-message-card');
+  const nodeReplyButton = nodeReply?.querySelector?.(
+      '.scTailwindThreadMessageMessagecardadd-comment button');
+  if (!nodeReplyButton) {
+    // This is not critical: the reply button might already have been clicked
+    // (so it no longer exists), or the thread might be locked so replying is
+    // disabled and the button doesn't exist.
+    console.debug('[flattenThreads] Reply button not found.');
+    return null;
+  }
+
+  nodeReplyButton.click();
+
+  return await waitFor(() => {
+    const editor = nodeReply?.querySelector('sc-tailwind-thread-reply-editor');
+    if (editor) return Promise.resolve(editor);
+    return Promise.reject(new Error('Editor not found.'));
+  }, {interval: 75, timeout: 10 * 1000});
+}
