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;
+  }
+}
