diff --git a/briar-gtk/briar_gtk/actions/window.py b/briar-gtk/briar_gtk/actions/window.py
index 71f01f2010e021638dbc40d6a189d573ccda6243..e853349762d92c750b887b95ba848fa52ef2136a 100644
--- a/briar-gtk/briar_gtk/actions/window.py
+++ b/briar-gtk/briar_gtk/actions/window.py
@@ -28,6 +28,7 @@ class WindowActions(Actions):
         self._setup_change_alias_contact_action()
         self._setup_open_about_page_action()
         self._setup_open_add_contact_action()
+        self._setup_open_emoji_menu_action()
         self._setup_open_main_window_action()
         self._setup_open_private_chat_action()
 
@@ -55,6 +56,9 @@ class WindowActions(Actions):
     def _setup_open_add_contact_action(self):
         self._setup_action("open-add-contact", None, self._open_add_contact)
 
+    def _setup_open_emoji_menu_action(self):
+        self._setup_action("open-emoji-menu", None, self._open_emoji_menu)
+
     def _setup_open_main_window_action(self):
         self._setup_action("open-main-window", None, self._open_main_window)
 
@@ -97,6 +101,12 @@ class WindowActions(Actions):
     def _open_add_contact(self, action, parameter):
         self.widget.show_add_contact_view()
 
+    # pylint: disable=unused-argument
+    def _open_emoji_menu(self, action, parameter):
+        if not isinstance(self.widget.current_view, MainWindowView):
+            raise Exception("Should open emoji menu only from MainWindowView")
+        self.widget.current_view.presenter.open_emoji_menu()
+
     # pylint: disable=unused-argument
     def _open_main_window(self, action, parameter):
         self.widget.show_main_window_view()
diff --git a/briar-gtk/briar_gtk/presenters/main_window.py b/briar-gtk/briar_gtk/presenters/main_window.py
index 4bafce689ef4051c09b4bbee3c19e7716b35c573..59a0e3ff4c6e7f2a2201d29af6bc5374f5605141 100644
--- a/briar-gtk/briar_gtk/presenters/main_window.py
+++ b/briar-gtk/briar_gtk/presenters/main_window.py
@@ -38,6 +38,10 @@ class MainWindowPresenter:
         if isinstance(self._private_chat_presenter, PrivateChatPresenter):
             self._private_chat_presenter.open_delete_contact_dialog()
 
+    def open_emoji_menu(self):
+        if isinstance(self._private_chat_presenter, PrivateChatPresenter):
+            self._private_chat_presenter.open_emoji_menu()
+
     def close_private_chat(self):
         if isinstance(self._private_chat_presenter, PrivateChatPresenter):
             self._private_chat_presenter.close_private_chat()
diff --git a/briar-gtk/briar_gtk/presenters/private_chat.py b/briar-gtk/briar_gtk/presenters/private_chat.py
index ea4173e4675cb80e0a3b4786c6abc10e885c0762..2f6e41a9d83c49a2ca9ba0e87af1af8cd1b753a9 100644
--- a/briar-gtk/briar_gtk/presenters/private_chat.py
+++ b/briar-gtk/briar_gtk/presenters/private_chat.py
@@ -86,6 +86,10 @@ class PrivateChatPresenter:
         confirmation_dialog.connect("response", self._delete_contact)
         confirmation_dialog.show_all()
 
+    def open_emoji_menu(self):
+        chat_entry = self._view.builder.get_object("chat_entry")
+        chat_entry.emit("insert-emoji")
+
     def close_private_chat(self):  # formerly `show_sidebar`
         main_content_stack = self._view.builder.get_object(
             "main_content_stack")