diff --git a/zulipterminal/ui_tools/buttons.py b/zulipterminal/ui_tools/buttons.py
index fe21169..3fd8b97 100644
--- a/zulipterminal/ui_tools/buttons.py
+++ b/zulipterminal/ui_tools/buttons.py
@@ -493,12 +493,17 @@ class MessageLinkButton(urwid.Button):
         """
         # NOTE: The optional stream_id link version is deprecated. The extended
         # support is for old messages.
+        # NOTE: Support for narrow links with subject instead of topic is also added
         # We expect the fragment to be one of the following types:
         # a. narrow/stream/[{stream_id}-]{stream-name}
         # b. narrow/stream/[{stream_id}-]{stream-name}/near/{message_id}
         # c. narrow/stream/[{stream_id}-]{stream-name}/topic/
         #    {encoded.20topic.20name}
-        # d. narrow/stream/[{stream_id}-]{stream-name}/topic/
+        # d. narrow/stream/[{stream_id}-]{stream-name}/subject/
+        #    {encoded.20topic.20name}
+        # e. narrow/stream/[{stream_id}-]{stream-name}/topic/
+        #    {encoded.20topic.20name}/near/{message_id}
+        # f. narrow/stream/[{stream_id}-]{stream-name}/subject/
         #    {encoded.20topic.20name}/near/{message_id}
         fragments = urlparse(link.rstrip("/")).fragment.split("/")
         len_fragments = len(fragments)
@@ -509,7 +514,9 @@ class MessageLinkButton(urwid.Button):
             parsed_link = dict(narrow="stream", stream=stream_data)
 
         elif (
-            len_fragments == 5 and fragments[1] == "stream" and fragments[3] == "topic"
+            len_fragments == 5
+            and fragments[1] == "stream"
+            and (fragments[3] == "topic" or fragments[3] == "subject")
         ):
             stream_data = cls._decode_stream_data(fragments[2])
             topic_name = hash_util_decode(fragments[4])
@@ -527,7 +534,7 @@ class MessageLinkButton(urwid.Button):
         elif (
             len_fragments == 7
             and fragments[1] == "stream"
-            and fragments[3] == "topic"
+            and (fragments[3] == "topic" or fragments[3] == "subject")
             and fragments[5] == "near"
         ):
             stream_data = cls._decode_stream_data(fragments[2])

diff --git a/tests/ui_tools/test_buttons.py b/tests/ui_tools/test_buttons.py
index b29e88a..3705bba 100644
--- a/tests/ui_tools/test_buttons.py
+++ b/tests/ui_tools/test_buttons.py
@@ -653,70 +653,109 @@ class TestMessageLinkButton:
     @pytest.mark.parametrize(
         "link, expected_parsed_link",
         [
-            (
-                SERVER_URL + "/#narrow/stream/1-Stream-1",
+            case(
+                "/#narrow/stream/1-Stream-1",
                 ParsedNarrowLink(
                     narrow="stream", stream=DecodedStream(stream_id=1, stream_name=None)
                 ),
+                id="modern_stream_narrow_link",
             ),
-            (
-                SERVER_URL + "/#narrow/stream/Stream.201",
+            case(
+                "/#narrow/stream/Stream.201",
                 ParsedNarrowLink(
                     narrow="stream",
                     stream=DecodedStream(stream_id=None, stream_name="Stream 1"),
                 ),
+                id="deprecated_stream_narrow_link",
             ),
-            (
-                SERVER_URL + "/#narrow/stream/1-Stream-1/topic/foo.20bar",
+            case(
+                "/#narrow/stream/1-Stream-1/topic/foo.20bar",
                 ParsedNarrowLink(
                     narrow="stream:topic",
                     topic_name="foo bar",
                     stream=DecodedStream(stream_id=1, stream_name=None),
                 ),
+                id="topic_narrow_link",
             ),
-            (
-                SERVER_URL + "/#narrow/stream/1-Stream-1/near/1",
+            case(
+                "/#narrow/stream/1-Stream-1/subject/foo.20bar",
+                ParsedNarrowLink(
+                    narrow="stream:topic",
+                    topic_name="foo bar",
+                    stream=DecodedStream(stream_id=1, stream_name=None),
+                ),
+                id="subject_narrow_link",
+            ),
+            case(
+                "/#narrow/stream/1-Stream-1/near/987",
                 ParsedNarrowLink(
                     narrow="stream:near",
-                    message_id=1,
+                    message_id=987,
                     stream=DecodedStream(stream_id=1, stream_name=None),
                 ),
+                id="stream_near_narrow_link",
             ),
-            (
-                SERVER_URL + "/#narrow/stream/1-Stream-1/topic/foo/near/1",
+            case(
+                "/#narrow/stream/1-Stream-1/topic/foo/near/789",
                 ParsedNarrowLink(
                     narrow="stream:topic:near",
                     topic_name="foo",
-                    message_id=1,
+                    message_id=789,
                     stream=DecodedStream(stream_id=1, stream_name=None),
                 ),
+                id="topic_near_narrow_link",
             ),
-            (SERVER_URL + "/#narrow/foo", ParsedNarrowLink()),
-            (SERVER_URL + "/#narrow/stream/", ParsedNarrowLink()),
-            (SERVER_URL + "/#narrow/stream/1-Stream-1/topic/", ParsedNarrowLink()),
-            (SERVER_URL + "/#narrow/stream/1-Stream-1//near/", ParsedNarrowLink()),
-            (
-                SERVER_URL + "/#narrow/stream/1-Stream-1/topic/foo/near/",
+            case(
+                "/#narrow/stream/1-Stream-1/subject/foo/near/654",
+                ParsedNarrowLink(
+                    narrow="stream:topic:near",
+                    topic_name="foo",
+                    message_id=654,
+                    stream=DecodedStream(stream_id=1, stream_name=None),
+                ),
+                id="subject_near_narrow_link",
+            ),
+            case(
+                "/#narrow/foo",
                 ParsedNarrowLink(),
+                id="invalid_narrow_link_1",
+            ),
+            case(
+                "/#narrow/stream/",
+                ParsedNarrowLink(),
+                id="invalid_narrow_link_2",
+            ),
+            case(
+                "/#narrow/stream/1-Stream-1/topic/",
+                ParsedNarrowLink(),
+                id="invalid_narrow_link_3",
+            ),
+            case(
+                "/#narrow/stream/1-Stream-1/subject/",
+                ParsedNarrowLink(),
+                id="invalid_narrow_link_4",
+            ),
+            case(
+                "/#narrow/stream/1-Stream-1//near/",
+                ParsedNarrowLink(),
+                id="invalid_narrow_link_5",
+            ),
+            case(
+                "/#narrow/stream/1-Stream-1/topic/foo/near/",
+                ParsedNarrowLink(),
+                id="invalid_narrow_link_6",
+            ),
+            case(
+                "/#narrow/stream/1-Stream-1/subject/foo/near/",
+                ParsedNarrowLink(),
+                id="invalid_narrow_link_7",
             ),
-        ],
-        ids=[
-            "modern_stream_narrow_link",
-            "deprecated_stream_narrow_link",
-            "topic_narrow_link",
-            "stream_near_narrow_link",
-            "topic_near_narrow_link",
-            "invalid_narrow_link_1",
-            "invalid_narrow_link_2",
-            "invalid_narrow_link_3",
-            "invalid_narrow_link_4",
-            "invalid_narrow_link_5",
         ],
     )
     def test__parse_narrow_link(
         self, link: str, expected_parsed_link: ParsedNarrowLink
     ) -> None:
-        return_value = MessageLinkButton._parse_narrow_link(link)
+        return_value = MessageLinkButton._parse_narrow_link(SERVER_URL + link)
 
         assert return_value == expected_parsed_link
 

Support old format for narrow links (subject in addition to topic)
As documented in buttons.py (currently `_parse_narrow_link`), we support links formatted in the form:
```
... narrow/stream/[{stream-id}-]{stream-name}/topic/{encoded.20.topic.20name}[/near/{message_id}]
```

As I noted in [**#api documentation > Narrow URL formats**](https://chat.zulip.org/#narrow/stream/412-api-documentation/topic/Narrow.20URL.20formats) this doesn't handle an old format where `subject` was used in place of `topic`, which makes the URL in the quoted message fail to be identified and link properly in ZT.

Servers running newer versions of Zulip will not generate links of this format, which limits the impact of this issue, but equally anyone who has upgraded an older server will potentially still have messages with links of this form.
tests/ui_tools/test_buttons.py::TestMessageLinkButton::test__parse_narrow_link[subject_narrow_link] tests/ui_tools/test_buttons.py::TestMessageLinkButton::test__parse_narrow_link[subject_near_narrow_link]
tests/ui_tools/test_buttons.py::TestTopButton::test_init tests/ui_tools/test_buttons.py::TestTopButton::test_style_properties tests/ui_tools/test_buttons.py::TestTopButton::test_text_properties tests/ui_tools/test_buttons.py::TestTopButton::test_update_count[11-11] tests/ui_tools/test_buttons.py::TestTopButton::test_update_count[1-1] tests/ui_tools/test_buttons.py::TestTopButton::test_update_count[10-10] tests/ui_tools/test_buttons.py::TestTopButton::test_update_count[0-] tests/ui_tools/test_buttons.py::TestTopButton::test_update_widget[suffix_markup0-expected_suffix_markup0-label_markup0-prefix_markup0-expected_prefix_markup0] tests/ui_tools/test_buttons.py::TestTopButton::test_update_widget[suffix_markup0-expected_suffix_markup0-label_markup0-prefix_markup1-expected_prefix_markup1] tests/ui_tools/test_buttons.py::TestTopButton::test_update_widget[suffix_markup0-expected_suffix_markup0-label_markup1-prefix_markup0-expected_prefix_markup0] tests/ui_tools/test_buttons.py::TestTopButton::test_update_widget[suffix_markup0-expected_suffix_markup0-label_markup1-prefix_markup1-expected_prefix_markup1] tests/ui_tools/test_buttons.py::TestTopButton::test_update_widget[suffix_markup1-expected_suffix_markup1-label_markup0-prefix_markup0-expected_prefix_markup0] tests/ui_tools/test_buttons.py::TestTopButton::test_update_widget[suffix_markup1-expected_suffix_markup1-label_markup0-prefix_markup1-expected_prefix_markup1] tests/ui_tools/test_buttons.py::TestTopButton::test_update_widget[suffix_markup1-expected_suffix_markup1-label_markup1-prefix_markup0-expected_prefix_markup0] tests/ui_tools/test_buttons.py::TestTopButton::test_update_widget[suffix_markup1-expected_suffix_markup1-label_markup1-prefix_markup1-expected_prefix_markup1] tests/ui_tools/test_buttons.py::TestTopButton::test_update_widget[suffix_markup2-expected_suffix_markup2-label_markup0-prefix_markup0-expected_prefix_markup0] tests/ui_tools/test_buttons.py::TestTopButton::test_update_widget[suffix_markup2-expected_suffix_markup2-label_markup0-prefix_markup1-expected_prefix_markup1] tests/ui_tools/test_buttons.py::TestTopButton::test_update_widget[suffix_markup2-expected_suffix_markup2-label_markup1-prefix_markup0-expected_prefix_markup0] tests/ui_tools/test_buttons.py::TestTopButton::test_update_widget[suffix_markup2-expected_suffix_markup2-label_markup1-prefix_markup1-expected_prefix_markup1] tests/ui_tools/test_buttons.py::TestTopButton::test_update_widget[suffix_markup3-expected_suffix_markup3-label_markup0-prefix_markup0-expected_prefix_markup0] tests/ui_tools/test_buttons.py::TestTopButton::test_update_widget[suffix_markup3-expected_suffix_markup3-label_markup0-prefix_markup1-expected_prefix_markup1] tests/ui_tools/test_buttons.py::TestTopButton::test_update_widget[suffix_markup3-expected_suffix_markup3-label_markup1-prefix_markup0-expected_prefix_markup0] tests/ui_tools/test_buttons.py::TestTopButton::test_update_widget[suffix_markup3-expected_suffix_markup3-label_markup1-prefix_markup1-expected_prefix_markup1] tests/ui_tools/test_buttons.py::TestPMButton::test_button_text_length tests/ui_tools/test_buttons.py::TestPMButton::test_button_text_title tests/ui_tools/test_buttons.py::TestStarredButton::test_count_style_init_argument_value tests/ui_tools/test_buttons.py::TestStreamButton::test_mark_muted tests/ui_tools/test_buttons.py::TestStreamButton::test_mark_unmuted tests/ui_tools/test_buttons.py::TestStreamButton::test_keypress_ENTER_TOGGLE_TOPIC[t] tests/ui_tools/test_buttons.py::TestStreamButton::test_keypress_TOGGLE_MUTE_STREAM[m] tests/ui_tools/test_buttons.py::TestUserButton::test_activate_called_once_on_keypress[enter] tests/ui_tools/test_buttons.py::TestUserButton::test_keypress_USER_INFO[i] tests/ui_tools/test_buttons.py::TestEmojiButton::test_init_calls_top_button[stream_message-emoji_button_with_no_reaction] tests/ui_tools/test_buttons.py::TestEmojiButton::test_init_calls_top_button[stream_message-emoji_button_with_a_reaction] tests/ui_tools/test_buttons.py::TestEmojiButton::test_init_calls_top_button[pm_message-emoji_button_with_no_reaction] tests/ui_tools/test_buttons.py::TestEmojiButton::test_init_calls_top_button[pm_message-emoji_button_with_a_reaction] tests/ui_tools/test_buttons.py::TestEmojiButton::test_init_calls_top_button[group_pm_message-emoji_button_with_no_reaction] tests/ui_tools/test_buttons.py::TestEmojiButton::test_init_calls_top_button[group_pm_message-emoji_button_with_a_reaction] tests/ui_tools/test_buttons.py::TestEmojiButton::test_keypress_emoji_button[stream_message-reacted_unselected_emoji-enter] tests/ui_tools/test_buttons.py::TestEmojiButton::test_keypress_emoji_button[stream_message-reacted_selected_emoji-enter] tests/ui_tools/test_buttons.py::TestEmojiButton::test_keypress_emoji_button[stream_message-unreacted_unselected_emoji-enter] tests/ui_tools/test_buttons.py::TestEmojiButton::test_keypress_emoji_button[stream_message-unreacted_selected_emoji-enter] tests/ui_tools/test_buttons.py::TestEmojiButton::test_keypress_emoji_button[pm_message-reacted_unselected_emoji-enter] tests/ui_tools/test_buttons.py::TestEmojiButton::test_keypress_emoji_button[pm_message-reacted_selected_emoji-enter] tests/ui_tools/test_buttons.py::TestEmojiButton::test_keypress_emoji_button[pm_message-unreacted_unselected_emoji-enter] tests/ui_tools/test_buttons.py::TestEmojiButton::test_keypress_emoji_button[pm_message-unreacted_selected_emoji-enter] tests/ui_tools/test_buttons.py::TestEmojiButton::test_keypress_emoji_button[group_pm_message-reacted_unselected_emoji-enter] tests/ui_tools/test_buttons.py::TestEmojiButton::test_keypress_emoji_button[group_pm_message-reacted_selected_emoji-enter] tests/ui_tools/test_buttons.py::TestEmojiButton::test_keypress_emoji_button[group_pm_message-unreacted_unselected_emoji-enter] tests/ui_tools/test_buttons.py::TestEmojiButton::test_keypress_emoji_button[group_pm_message-unreacted_selected_emoji-enter] tests/ui_tools/test_buttons.py::TestTopicButton::test_init_calls_top_button[2-86-topic1-Django-False] tests/ui_tools/test_buttons.py::TestTopicButton::test_init_calls_top_button[1-14-\u2714 tests/ui_tools/test_buttons.py::TestTopicButton::test_init_calls_top_button[1000-205-topic3-PTEST-False] tests/ui_tools/test_buttons.py::TestTopicButton::test_init_calls_mark_muted[stream_and_topic_match] tests/ui_tools/test_buttons.py::TestTopicButton::test_init_calls_mark_muted[topic_mismatch] tests/ui_tools/test_buttons.py::TestTopicButton::test_init_calls_mark_muted[stream_mismatch] tests/ui_tools/test_buttons.py::TestTopicButton::test_mark_muted tests/ui_tools/test_buttons.py::TestTopicButton::test_keypress_EXIT_TOGGLE_TOPIC[t] tests/ui_tools/test_buttons.py::TestMessageLinkButton::test_init tests/ui_tools/test_buttons.py::TestMessageLinkButton::test_update_widget[Test-5] tests/ui_tools/test_buttons.py::TestMessageLinkButton::test_update_widget[Check-6] tests/ui_tools/test_buttons.py::TestMessageLinkButton::test_handle_link[internal_narrow_link] tests/ui_tools/test_buttons.py::TestMessageLinkButton::test_handle_link[internal_media_link] tests/ui_tools/test_buttons.py::TestMessageLinkButton::test_handle_link[external_link] tests/ui_tools/test_buttons.py::TestMessageLinkButton::test__decode_stream_data[stream_data_current_version] tests/ui_tools/test_buttons.py::TestMessageLinkButton::test__decode_stream_data[stream_data_deprecated_version] tests/ui_tools/test_buttons.py::TestMessageLinkButton::test__decode_message_id[1-1] tests/ui_tools/test_buttons.py::TestMessageLinkButton::test__decode_message_id[foo-None] tests/ui_tools/test_buttons.py::TestMessageLinkButton::test__parse_narrow_link[modern_stream_narrow_link] tests/ui_tools/test_buttons.py::TestMessageLinkButton::test__parse_narrow_link[deprecated_stream_narrow_link] tests/ui_tools/test_buttons.py::TestMessageLinkButton::test__parse_narrow_link[topic_narrow_link] tests/ui_tools/test_buttons.py::TestMessageLinkButton::test__parse_narrow_link[stream_near_narrow_link] tests/ui_tools/test_buttons.py::TestMessageLinkButton::test__parse_narrow_link[topic_near_narrow_link] tests/ui_tools/test_buttons.py::TestMessageLinkButton::test__parse_narrow_link[invalid_narrow_link_1] tests/ui_tools/test_buttons.py::TestMessageLinkButton::test__parse_narrow_link[invalid_narrow_link_2] tests/ui_tools/test_buttons.py::TestMessageLinkButton::test__parse_narrow_link[invalid_narrow_link_3] tests/ui_tools/test_buttons.py::TestMessageLinkButton::test__parse_narrow_link[invalid_narrow_link_4] tests/ui_tools/test_buttons.py::TestMessageLinkButton::test__parse_narrow_link[invalid_narrow_link_5] tests/ui_tools/test_buttons.py::TestMessageLinkButton::test__parse_narrow_link[invalid_narrow_link_6] tests/ui_tools/test_buttons.py::TestMessageLinkButton::test__parse_narrow_link[invalid_narrow_link_7] tests/ui_tools/test_buttons.py::TestMessageLinkButton::test__validate_narrow_link[valid_modern_stream_narrow_parsed_link] tests/ui_tools/test_buttons.py::TestMessageLinkButton::test__validate_narrow_link[invalid_modern_stream_narrow_parsed_link] tests/ui_tools/test_buttons.py::TestMessageLinkButton::test__validate_narrow_link[valid_deprecated_stream_narrow_parsed_link] tests/ui_tools/test_buttons.py::TestMessageLinkButton::test__validate_narrow_link[invalid_deprecated_stream_narrow_parsed_link] tests/ui_tools/test_buttons.py::TestMessageLinkButton::test__validate_narrow_link[valid_topic_narrow_parsed_link] tests/ui_tools/test_buttons.py::TestMessageLinkButton::test__validate_narrow_link[invalid_topic_narrow_parsed_link] tests/ui_tools/test_buttons.py::TestMessageLinkButton::test__validate_narrow_link[valid_stream_near_narrow_parsed_link] tests/ui_tools/test_buttons.py::TestMessageLinkButton::test__validate_narrow_link[invalid_stream_near_narrow_parsed_link] tests/ui_tools/test_buttons.py::TestMessageLinkButton::test__validate_narrow_link[valid_topic_near_narrow_parsed_link] tests/ui_tools/test_buttons.py::TestMessageLinkButton::test__validate_narrow_link[invalid_topic_near_narrow_parsed_link] tests/ui_tools/test_buttons.py::TestMessageLinkButton::test__validate_narrow_link[invalid_narrow_link] tests/ui_tools/test_buttons.py::TestMessageLinkButton::test__validate_and_patch_stream_data[valid_stream_data_with_stream_id] tests/ui_tools/test_buttons.py::TestMessageLinkButton::test__validate_and_patch_stream_data[invalid_stream_data_with_stream_id] tests/ui_tools/test_buttons.py::TestMessageLinkButton::test__validate_and_patch_stream_data[valid_stream_data_with_stream_name] tests/ui_tools/test_buttons.py::TestMessageLinkButton::test__validate_and_patch_stream_data[invalid_stream_data_with_stream_name] tests/ui_tools/test_buttons.py::TestMessageLinkButton::test__switch_narrow_to[stream_narrow] tests/ui_tools/test_buttons.py::TestMessageLinkButton::test__switch_narrow_to[topic_narrow] tests/ui_tools/test_buttons.py::TestMessageLinkButton::test__switch_narrow_to[stream_near_narrow] tests/ui_tools/test_buttons.py::TestMessageLinkButton::test__switch_narrow_to[topic_near_narrow] tests/ui_tools/test_buttons.py::TestMessageLinkButton::test_handle_narrow_link[successful_narrow] tests/ui_tools/test_buttons.py::TestMessageLinkButton::test_handle_narrow_link[unsuccessful_narrow]