diff --git a/meson.build b/meson.build
index 11e67368..f4fe3331 100644
--- a/meson.build
+++ b/meson.build
@@ -137,6 +137,7 @@ vst3_plugin_sources = [
'src/common/plugins.cpp',
'src/common/utils.cpp',
'src/plugin/bridges/vst3.cpp',
+ 'src/plugin/bridges/vst3-impls/context-menu-target.cpp',
'src/plugin/bridges/vst3-impls/plugin-factory.cpp',
'src/plugin/bridges/vst3-impls/plug-view-proxy.cpp',
'src/plugin/bridges/vst3-impls/plugin-proxy.cpp',
diff --git a/src/common/serialization/vst3.h b/src/common/serialization/vst3.h
index daf75285..443d7493 100644
--- a/src/common/serialization/vst3.h
+++ b/src/common/serialization/vst3.h
@@ -26,6 +26,7 @@
#include "vst3/component-handler-proxy.h"
#include "vst3/connection-point-proxy.h"
#include "vst3/context-menu-proxy.h"
+#include "vst3/context-menu-target.h"
#include "vst3/host-context-proxy.h"
#include "vst3/plug-frame-proxy.h"
#include "vst3/plug-view-proxy.h"
diff --git a/src/plugin/bridges/vst3-impls/context-menu-target.cpp b/src/plugin/bridges/vst3-impls/context-menu-target.cpp
new file mode 100644
index 00000000..21076e8e
--- /dev/null
+++ b/src/plugin/bridges/vst3-impls/context-menu-target.cpp
@@ -0,0 +1,41 @@
+// yabridge: a Wine VST bridge
+// Copyright (C) 2020-2021 Robbert van der Helm
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see .
+
+#include "context-menu-target.h"
+
+YaContextMenuTargetImpl::YaContextMenuTargetImpl(
+ Vst3PluginBridge& bridge,
+ native_size_t owner_instance_id,
+ native_size_t context_menu_id,
+ int32 tag)
+ : YaContextMenuTarget(owner_instance_id, context_menu_id, tag),
+ bridge(bridge) {}
+
+tresult PLUGIN_API
+YaContextMenuTargetImpl::queryInterface(const Steinberg::TUID _iid,
+ void** obj) {
+ const tresult result = YaContextMenuTarget::queryInterface(_iid, obj);
+ bridge.logger.log_query_interface("In IContextMenuTarget::queryInterface()",
+ result, Steinberg::FUID::fromTUID(_iid));
+
+ return result;
+}
+
+tresult PLUGIN_API YaContextMenuTargetImpl::executeMenuItem(int32 tag) {
+ // TODO: Implement
+ bridge.logger.log("TODO: IContextMenuTarget::executeMenuItem()");
+ return Steinberg::kNotImplemented;
+}
diff --git a/src/plugin/bridges/vst3-impls/context-menu-target.h b/src/plugin/bridges/vst3-impls/context-menu-target.h
new file mode 100644
index 00000000..34e61642
--- /dev/null
+++ b/src/plugin/bridges/vst3-impls/context-menu-target.h
@@ -0,0 +1,43 @@
+// yabridge: a Wine VST bridge
+// Copyright (C) 2020-2021 Robbert van der Helm
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see .
+
+#pragma once
+
+#include "../vst3.h"
+
+class YaContextMenuTargetImpl : public YaContextMenuTarget {
+ public:
+ /**
+ * @override
+ */
+ YaContextMenuTargetImpl(Vst3PluginBridge& bridge,
+ native_size_t owner_instance_id,
+ native_size_t context_menu_id,
+ int32 tag);
+
+ /**
+ * We'll override the query interface to log queries for interfaces we do
+ * not (yet) support.
+ */
+ tresult PLUGIN_API queryInterface(const Steinberg::TUID _iid,
+ void** obj) override;
+
+ // From `IContextMenuTarget`
+ tresult PLUGIN_API executeMenuItem(int32 tag) override;
+
+ private:
+ Vst3PluginBridge& bridge;
+};