diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings
index beac5cdd3..6cd47b5f9 100644
--- a/Telegram/Resources/langs/lang.strings
+++ b/Telegram/Resources/langs/lang.strings
@@ -2282,6 +2282,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 "lng_filters_type_no_read" = "Read";
 "lng_filters_icon_header" = "Choose icon";
 "lng_filters_error_pinned_max" = "Sorry, you can't pin any more chats to the top.";
+"lng_filters_context_edit" = "Edit Folder";
+"lng_filters_context_remove" = "Remove";
+"lng_filters_remove_sure" = "This will remove the folder, your chats will not be deleted.";
+"lng_filters_remove_yes" = "Remove";
 
 // Wnd specific
 
diff --git a/Telegram/SourceFiles/boxes/filters/edit_filter_box.cpp b/Telegram/SourceFiles/boxes/filters/edit_filter_box.cpp
index 13c5a1c31..81b1e04cf 100644
--- a/Telegram/SourceFiles/boxes/filters/edit_filter_box.cpp
+++ b/Telegram/SourceFiles/boxes/filters/edit_filter_box.cpp
@@ -26,6 +26,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 #include "main/main_session.h"
 #include "window/window_session_controller.h"
 #include "window/window_controller.h"
+#include "apiwrap.h"
 #include "styles/style_settings.h"
 #include "styles/style_boxes.h"
 #include "styles/style_layers.h"
@@ -639,4 +640,34 @@ void EditFilterBox(
 		creating ? tr::lng_filters_create_button() : tr::lng_settings_save(),
 		save);
 	box->addButton(tr::lng_cancel(), [=] { box->closeBox(); });
-}
\ No newline at end of file
+}
+
+void EditExistingFilter(
+		not_null<Window::SessionController*> window,
+		FilterId id) {
+	const auto session = &window->session();
+	const auto &list = session->data().chatsFilters().list();
+	const auto i = ranges::find(list, id, &Data::ChatFilter::id);
+	if (i == end(list)) {
+		return;
+	}
+	const auto doneCallback = [=](const Data::ChatFilter &result) {
+		Expects(id == result.id());
+
+		const auto tl = result.tl();
+		session->data().chatsFilters().apply(MTP_updateDialogFilter(
+			MTP_flags(MTPDupdateDialogFilter::Flag::f_filter),
+			MTP_int(id),
+			tl));
+		session->api().request(MTPmessages_UpdateDialogFilter(
+			MTP_flags(MTPmessages_UpdateDialogFilter::Flag::f_filter),
+			MTP_int(id),
+			tl
+		)).send();
+	};
+	window->window().show(Box(
+		EditFilterBox,
+		window,
+		*i,
+		crl::guard(session, doneCallback)));
+}
diff --git a/Telegram/SourceFiles/boxes/filters/edit_filter_box.h b/Telegram/SourceFiles/boxes/filters/edit_filter_box.h
index 8cd87f8d2..43b97adb1 100644
--- a/Telegram/SourceFiles/boxes/filters/edit_filter_box.h
+++ b/Telegram/SourceFiles/boxes/filters/edit_filter_box.h
@@ -7,9 +7,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 */
 #pragma once
 
-namespace Ui {
-class GenericBox;
-} // namespace Ui
+#include "ui/layers/generic_box.h"
 
 namespace Window {
 class SessionController;
@@ -24,3 +22,7 @@ void EditFilterBox(
 	not_null<Window::SessionController*> window,
 	const Data::ChatFilter &filter,
 	Fn<void(const Data::ChatFilter &)> doneCallback);
+
+void EditExistingFilter(
+	not_null<Window::SessionController*> window,
+	FilterId id);
diff --git a/Telegram/SourceFiles/window/window_filters_menu.cpp b/Telegram/SourceFiles/window/window_filters_menu.cpp
index f6a0fddc6..1ede652fd 100644
--- a/Telegram/SourceFiles/window/window_filters_menu.cpp
+++ b/Telegram/SourceFiles/window/window_filters_menu.cpp
@@ -16,8 +16,12 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 #include "lang/lang_keys.h"
 #include "ui/filter_icons.h"
 #include "ui/wrap/vertical_layout_reorder.h"
+#include "ui/widgets/popup_menu.h"
+#include "boxes/confirm_box.h"
+#include "boxes/filters/edit_filter_box.h"
 #include "settings/settings_common.h"
 #include "api/api_chat_filters.h"
+#include "apiwrap.h"
 #include "styles/style_widgets.h"
 #include "styles/style_window.h"
 
@@ -203,9 +207,60 @@ base::unique_qptr<Ui::SideBarButton> FiltersMenu::prepareButton(
 			}
 		}
 	});
+	if (id > 0) {
+		raw->events(
+		) | rpl::filter([=](not_null<QEvent*> e) {
+			return e->type() == QEvent::ContextMenu;
+		}) | rpl::start_with_next([=] {
+			showMenu(QCursor::pos(), id);
+		}, raw->lifetime());
+	}
 	return button;
 }
 
+void FiltersMenu::showMenu(QPoint position, FilterId id) {
+	if (_popupMenu) {
+		_popupMenu = nullptr;
+		return;
+	}
+	const auto i = _filters.find(id);
+	if (i == end(_filters)) {
+		return;
+	}
+	_popupMenu = base::make_unique_q<Ui::PopupMenu>(i->second.get());
+	_popupMenu->addAction(
+		tr::lng_filters_context_edit(tr::now),
+		crl::guard(&_outer, [=] { showEditBox(id); }));
+	_popupMenu->addAction(
+		tr::lng_filters_context_remove(tr::now),
+		crl::guard(&_outer, [=] { showRemoveBox(id); }));
+	_popupMenu->popup(position);
+}
+
+void FiltersMenu::showEditBox(FilterId id) {
+	EditExistingFilter(_session, id);
+}
+
+void FiltersMenu::showRemoveBox(FilterId id) {
+	const auto box = std::make_shared<QPointer<Ui::BoxContent>>();
+	*box = _session->window().show(Box<ConfirmBox>(
+		tr::lng_filters_remove_sure(tr::now),
+		tr::lng_filters_remove_yes(tr::now),
+		[=] { (*box)->closeBox(); remove(id); }));
+}
+
+void FiltersMenu::remove(FilterId id) {
+	_session->session().data().chatsFilters().apply(MTP_updateDialogFilter(
+		MTP_flags(MTPDupdateDialogFilter::Flag(0)),
+		MTP_int(id),
+		MTPDialogFilter()));
+	_session->session().api().request(MTPmessages_UpdateDialogFilter(
+		MTP_flags(MTPmessages_UpdateDialogFilter::Flag(0)),
+		MTP_int(id),
+		MTPDialogFilter()
+	)).send();
+}
+
 void FiltersMenu::applyReorder(
 		not_null<Ui::RpWidget*> widget,
 		int oldPosition,
diff --git a/Telegram/SourceFiles/window/window_filters_menu.h b/Telegram/SourceFiles/window/window_filters_menu.h
index e5dbef669..34aea5a6b 100644
--- a/Telegram/SourceFiles/window/window_filters_menu.h
+++ b/Telegram/SourceFiles/window/window_filters_menu.h
@@ -14,8 +14,13 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 namespace Ui {
 class VerticalLayoutReorder;
 enum class FilterIcon : uchar;
+class PopupMenu;
 } // namespace Ui
 
+namespace Data {
+class ChatFilter;
+} // namespace Data
+
 namespace Window {
 
 class SessionController;
@@ -40,6 +45,10 @@ private:
 		FilterId id,
 		const QString &title,
 		Ui::FilterIcon icon);
+	void showMenu(QPoint position, FilterId id);
+	void showEditBox(FilterId id);
+	void showRemoveBox(FilterId id);
+	void remove(FilterId id);
 
 	const not_null<SessionController*> _session;
 	const not_null<Ui::RpWidget*> _parent;
@@ -57,6 +66,8 @@ private:
 	bool _ignoreRefresh = false;
 	bool _waitingSuggested = false;
 
+	base::unique_qptr<Ui::PopupMenu> _popupMenu;
+
 };
 
 } // namespace Window