diff --git a/CMakeLists.txt b/CMakeLists.txt
index 169aafaafa..8118c8072c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1648,6 +1648,8 @@ add_library(${CoreLibName} ${CoreLinkType}
Core/Debugger/WebSocket/GPUBufferSubscriber.h
Core/Debugger/WebSocket/GPURecordSubscriber.cpp
Core/Debugger/WebSocket/GPURecordSubscriber.h
+ Core/Debugger/WebSocket/GPUStatsSubscriber.cpp
+ Core/Debugger/WebSocket/GPUStatsSubscriber.h
Core/Debugger/WebSocket/HLESubscriber.cpp
Core/Debugger/WebSocket/HLESubscriber.h
Core/Debugger/WebSocket/InputBroadcaster.cpp
diff --git a/Core/Core.vcxproj b/Core/Core.vcxproj
index ee2b8a5f72..6533787460 100644
--- a/Core/Core.vcxproj
+++ b/Core/Core.vcxproj
@@ -519,6 +519,7 @@
+
@@ -1076,6 +1077,7 @@
+
diff --git a/Core/Core.vcxproj.filters b/Core/Core.vcxproj.filters
index 3d3b1e9853..bbb85cbeb5 100644
--- a/Core/Core.vcxproj.filters
+++ b/Core/Core.vcxproj.filters
@@ -1181,6 +1181,9 @@
Core
+
+ Debugger\WebSocket
+
@@ -1904,6 +1907,9 @@
Core
+
+ Debugger\WebSocket
+
diff --git a/Core/Debugger/WebSocket.cpp b/Core/Debugger/WebSocket.cpp
index 3d85f4b6fd..b71db06877 100644
--- a/Core/Debugger/WebSocket.cpp
+++ b/Core/Debugger/WebSocket.cpp
@@ -55,6 +55,7 @@
#include "Core/Debugger/WebSocket/GameSubscriber.h"
#include "Core/Debugger/WebSocket/GPUBufferSubscriber.h"
#include "Core/Debugger/WebSocket/GPURecordSubscriber.h"
+#include "Core/Debugger/WebSocket/GPUStatsSubscriber.h"
#include "Core/Debugger/WebSocket/HLESubscriber.h"
#include "Core/Debugger/WebSocket/InputSubscriber.h"
#include "Core/Debugger/WebSocket/MemoryInfoSubscriber.h"
@@ -70,6 +71,7 @@ static const std::vector subscribers({
&WebSocketGameInit,
&WebSocketGPUBufferInit,
&WebSocketGPURecordInit,
+ &WebSocketGPUStatsInit,
&WebSocketHLEInit,
&WebSocketInputInit,
&WebSocketMemoryInfoInit,
diff --git a/Core/Debugger/WebSocket/GPUStatsSubscriber.cpp b/Core/Debugger/WebSocket/GPUStatsSubscriber.cpp
new file mode 100644
index 0000000000..bcfb0b2fcd
--- /dev/null
+++ b/Core/Debugger/WebSocket/GPUStatsSubscriber.cpp
@@ -0,0 +1,24 @@
+// Copyright (c) 2021- PPSSPP Project.
+
+// 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, version 2.0 or later versions.
+
+// 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 2.0 for more details.
+
+// A copy of the GPL 2.0 should have been included with the program.
+// If not, see http://www.gnu.org/licenses/
+
+// Official git repository and contact information can be found at
+// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.
+
+#include "Core/Debugger/WebSocket/GPUStatsSubscriber.h"
+#include "Core/HLE/sceDisplay.h"
+
+DebuggerSubscriber *WebSocketGPUStatsInit(DebuggerEventHandlerMap &map) {
+ // TODO
+ return nullptr;
+}
diff --git a/Core/Debugger/WebSocket/GPUStatsSubscriber.h b/Core/Debugger/WebSocket/GPUStatsSubscriber.h
new file mode 100644
index 0000000000..d9d517a086
--- /dev/null
+++ b/Core/Debugger/WebSocket/GPUStatsSubscriber.h
@@ -0,0 +1,22 @@
+// Copyright (c) 2021- PPSSPP Project.
+
+// 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, version 2.0 or later versions.
+
+// 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 2.0 for more details.
+
+// A copy of the GPL 2.0 should have been included with the program.
+// If not, see http://www.gnu.org/licenses/
+
+// Official git repository and contact information can be found at
+// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.
+
+#pragma once
+
+#include "Core/Debugger/WebSocket/WebSocketUtils.h"
+
+DebuggerSubscriber *WebSocketGPUStatsInit(DebuggerEventHandlerMap &map);
diff --git a/UWP/CoreUWP/CoreUWP.vcxproj b/UWP/CoreUWP/CoreUWP.vcxproj
index 19882bdb05..e44da3fb91 100644
--- a/UWP/CoreUWP/CoreUWP.vcxproj
+++ b/UWP/CoreUWP/CoreUWP.vcxproj
@@ -400,6 +400,7 @@
+
@@ -634,6 +635,7 @@
+
diff --git a/UWP/CoreUWP/CoreUWP.vcxproj.filters b/UWP/CoreUWP/CoreUWP.vcxproj.filters
index 6a1542dfd1..753ecb296d 100644
--- a/UWP/CoreUWP/CoreUWP.vcxproj.filters
+++ b/UWP/CoreUWP/CoreUWP.vcxproj.filters
@@ -682,6 +682,9 @@
Debugger\WebSocket
+
+ Debugger\WebSocket
+
Debugger\WebSocket
@@ -1685,6 +1688,9 @@
Debugger\WebSocket
+
+ Debugger\WebSocket
+
Debugger\WebSocket
diff --git a/android/jni/Android.mk b/android/jni/Android.mk
index 3e911bb34c..37f4314a98 100644
--- a/android/jni/Android.mk
+++ b/android/jni/Android.mk
@@ -420,6 +420,7 @@ EXEC_AND_LIB_FILES := \
$(SRC)/Core/Debugger/WebSocket/GameSubscriber.cpp \
$(SRC)/Core/Debugger/WebSocket/GPUBufferSubscriber.cpp \
$(SRC)/Core/Debugger/WebSocket/GPURecordSubscriber.cpp \
+ $(SRC)/Core/Debugger/WebSocket/GPUStatsSubscriber.cpp \
$(SRC)/Core/Debugger/WebSocket/HLESubscriber.cpp \
$(SRC)/Core/Debugger/WebSocket/InputBroadcaster.cpp \
$(SRC)/Core/Debugger/WebSocket/InputSubscriber.cpp \