diff --git a/.gitignore b/.gitignore
index b925cf6..7aa8ee3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,3 @@
-SOURCES/grafana-pcp-3.0.2.tar.gz
-SOURCES/grafana-pcp-vendor-3.0.2.tar.xz
-SOURCES/grafana-pcp-webpack-3.0.2.tar.gz
+SOURCES/grafana-pcp-3.1.0.tar.gz
+SOURCES/grafana-pcp-vendor-3.1.0.tar.xz
+SOURCES/grafana-pcp-webpack-3.1.0.tar.gz
diff --git a/.grafana-pcp.metadata b/.grafana-pcp.metadata
index e4fd00f..3c0bff0 100644
--- a/.grafana-pcp.metadata
+++ b/.grafana-pcp.metadata
@@ -1,3 +1,3 @@
-8196f1c480fd56f90eb5cf6aaf42c0f0818dff73 SOURCES/grafana-pcp-3.0.2.tar.gz
-d2b773374b80b1ceac9111c3ecb2364b968f42b0 SOURCES/grafana-pcp-vendor-3.0.2.tar.xz
-2fc03a2e11363ede44e4dca8a5814af01829ea8b SOURCES/grafana-pcp-webpack-3.0.2.tar.gz
+117b12d50ac2c5993181e701d0f97d35be3fdc1b SOURCES/grafana-pcp-3.1.0.tar.gz
+2c5ba04caa23028900b45a2beba3ad38c5c7b0fe SOURCES/grafana-pcp-vendor-3.1.0.tar.xz
+47e29693f27e125053cf84661d8affdeb566951a SOURCES/grafana-pcp-webpack-3.1.0.tar.gz
diff --git a/SOURCES/001-remove-unused-frontend-crypto.patch b/SOURCES/001-remove-unused-frontend-crypto.patch
new file mode 100644
index 0000000..b998774
--- /dev/null
+++ b/SOURCES/001-remove-unused-frontend-crypto.patch
@@ -0,0 +1,28 @@
+diff --git a/package.json b/package.json
+index 2a3544b..07a785e 100644
+--- a/package.json
++++ b/package.json
+@@ -70,6 +70,8 @@
+     "redux-thunk": "^2.3.0"
+   },
+   "resolutions": {
++    "crypto-browserify": "https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.1.tgz",
++    "http-signature": "https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.1.tgz",
+     "monaco-editor": "0.20.0",
+     "rxjs": "6.6.3"
+   },
+diff --git a/webpack.config.js b/webpack.config.js
+index f762003..53fcb06 100644
+--- a/webpack.config.js
++++ b/webpack.config.js
+@@ -82,6 +82,10 @@ module.exports.getWebpackConfig = (config, options) => {
+             ...config.module,
+             rules: removeDataTestAttributeInProduction(options.production, excludeExtractionLoaderForMonaco(config.module.rules)),
+         },
++        node: {
++            ...config.node,
++            crypto: false
++        },
+         plugins: [
+             ...updateForkTsCheckerPluginSettings(config.plugins),
+             new MonacoWebpackPlugin({
diff --git a/SOURCES/Makefile b/SOURCES/Makefile
index 6fffbaa..60ab517 100644
--- a/SOURCES/Makefile
+++ b/SOURCES/Makefile
@@ -2,14 +2,19 @@ all: grafana-pcp-$(VER).tar.gz \
 	 grafana-pcp-vendor-$(VER).tar.xz \
 	 grafana-pcp-webpack-$(VER).tar.gz
 
-grafana-pcp-$(VER).tar.gz grafana-pcp-$(VER)/:
+grafana-pcp-$(VER).tar.gz:
 	wget https://github.com/performancecopilot/grafana-pcp/archive/v$(VER)/grafana-pcp-$(VER).tar.gz
+
+ALL_PATCHES := $(wildcard *.patch)
+PATCHES_TO_APPLY := $(ALL_PATCHES)
+
+grafana-pcp-vendor-$(VER).tar.xz: grafana-pcp-$(VER).tar.gz
 	rm -rf grafana-pcp-$(VER)
 	tar xfz grafana-pcp-$(VER).tar.gz
-	cd grafana-pcp-$(VER) && shopt -s nullglob && \
-		for patch in ../*.patch; do patch -p1 < $$patch; done
 
-grafana-pcp-vendor-$(VER).tar.xz: grafana-pcp-$(VER)/
+	# patches can affect Go or Node.js dependencies, or the webpack
+	for patch in $(PATCHES_TO_APPLY); do patch -d grafana-pcp-$(VER) -p1 --fuzz=0 < $$patch; done
+
 	# Go
 	cd grafana-pcp-$(VER) && go mod vendor -v
 	awk '$$2~/^v/ && $$4 != "indirect" {print "Provides: bundled(golang(" $$1 ")) = " substr($$2, 2)}' grafana-pcp-$(VER)/go.mod | \
@@ -19,7 +24,7 @@ grafana-pcp-vendor-$(VER).tar.xz: grafana-pcp-$(VER)/
 	cd grafana-pcp-$(VER) && yarn install --pure-lockfile
 	# Remove files with licensing issues
 	find grafana-pcp-$(VER) -type d -name 'node-notifier' -prune -exec rm -r {} \;
-	find grafana-pcp-$(VER) -name '*.exe' -delete
+	find grafana-pcp-$(VER) -type f -name '*.exe' -delete
 	# Remove not required packages
 	rm -r grafana-pcp-$(VER)/node_modules/puppeteer
 	./list_bundled_nodejs_packages.py grafana-pcp-$(VER)/ >> $@.manifest
@@ -30,14 +35,12 @@ grafana-pcp-vendor-$(VER).tar.xz: grafana-pcp-$(VER)/
 	# Create tarball
 	XZ_OPT=-9 tar cfJ $@ \
 		grafana-pcp-$(VER)/vendor \
-		$$(find grafana-pcp-$(VER) -type d -name "node_modules" -prune) \
+		grafana-pcp-$(VER)/node_modules \
 		grafana-pcp-$(VER)/vendor_jsonnet
 
-grafana-pcp-webpack-$(VER).tar.gz: grafana-pcp-$(VER)/
+grafana-pcp-webpack-$(VER).tar.gz: grafana-pcp-$(VER).tar.gz
 	cd grafana-pcp-$(VER) && \
-		yarn install --pure-lockfile && \
-		make dist-dashboards dist-frontend && \
-		chmod -R g-w,o-w dist
+		../build_frontend.sh
 
 	tar cfz $@ grafana-pcp-$(VER)/dist
 
diff --git a/SOURCES/build_frontend.sh b/SOURCES/build_frontend.sh
new file mode 100755
index 0000000..48cc8d7
--- /dev/null
+++ b/SOURCES/build_frontend.sh
@@ -0,0 +1,10 @@
+#!/bin/bash -eu
+
+# Build the frontend
+yarn run build
+
+# Build the dashboards
+make dist-dashboards
+
+# Fix permissions (webpack sometimes outputs files with mode = 666 due to reasons unknown (race condition/umask issue afaics))
+chmod -R g-w,o-w dist
diff --git a/SOURCES/list_bundled_nodejs_packages.py b/SOURCES/list_bundled_nodejs_packages.py
index a7c5e22..3158c2c 100755
--- a/SOURCES/list_bundled_nodejs_packages.py
+++ b/SOURCES/list_bundled_nodejs_packages.py
@@ -1,4 +1,7 @@
 #!/usr/bin/env python3
+#
+# generates Provides: bundled(npm(...)) = ... lines for each declared dependency and devDependency of package.json
+#
 import sys
 import json
 import re
diff --git a/SPECS/grafana-pcp.spec b/SPECS/grafana-pcp.spec
index a5313ee..d164399 100644
--- a/SPECS/grafana-pcp.spec
+++ b/SPECS/grafana-pcp.spec
@@ -1,7 +1,3 @@
-# https://bugzilla.redhat.com/show_bug.cgi?id=1752991
-# unfortunately the go_arches macro doesn't reflect that change yet
-ExcludeArch: i686
-
 %global grafanapcp_arches %{lua: go_arches = {}
   for arch in rpm.expand("%{go_arches}"):gmatch("%S+") do
     go_arches[arch] = 1
@@ -12,21 +8,12 @@ ExcludeArch: i686
   end
 end}
 
-# gobuild and gotest macros are defined in go-rpm-macros, which is not available on RHEL
-# definitions lifted from Fedora 34 podman.spec
-%if ! 0%{?gobuild:1}
-%define gobuild(o:) GO111MODULE=off go build -buildmode pie -compiler gc -tags="rpm_crashtraceback ${BUILDTAGS:-}" -ldflags "${LDFLAGS:-} -B 0x$(head -c20 /dev/urandom|od -An -tx1|tr -d ' \\n') -extldflags '-Wl,-z,relro -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld '" -a -v -x %{?**};
-%endif
-%if ! 0%{?gotest:1}
-%define gotest() GO111MODULE=off go test -buildmode pie -compiler gc -ldflags "${LDFLAGS:-} -extldflags '-Wl,-z,relro -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld '" %{?**};
-%endif
-
 # Specify if the frontend and dashboards will be compiled as part of the build or are attached
 # as a webpack tarball (in case of an unsuitable nodejs or jsonnet version on the build system)
 %define compile_frontend 0
 
 Name:           grafana-pcp
-Version:        3.0.2
+Version:        3.1.0
 Release:        1%{?dist}
 Summary:        Performance Co-Pilot Grafana Plugin
 License:        ASL 2.0
@@ -39,7 +26,10 @@ Source1:        grafana-pcp-vendor-%{version}.tar.xz
 Source2:        grafana-pcp-webpack-%{version}.tar.gz
 %endif
 Source3:        Makefile
-Source4:        list_bundled_nodejs_packages.py
+Source4:        build_frontend.sh
+Source5:        list_bundled_nodejs_packages.py
+
+Patch1:         001-remove-unused-frontend-crypto.patch
 
 # Intersection of go_arches and nodejs_arches
 ExclusiveArch:  %{grafanapcp_arches}
@@ -48,8 +38,9 @@ BuildRequires:  systemd-rpm-macros, golang, go-srpm-macros
 %if 0%{?fedora} >= 31
 BuildRequires:  go-rpm-macros
 %endif
+
 %if %{compile_frontend}
-BuildRequires:  make, nodejs >= 1:12, nodejs < 1:13, yarnpkg, golang-github-google-jsonnet
+BuildRequires:  make, nodejs >= 1:14, yarnpkg, golang-github-google-jsonnet
 %endif
 
 # omit golang debugsource, see BZ 995136 and related
@@ -58,7 +49,7 @@ BuildRequires:  make, nodejs >= 1:12, nodejs < 1:13, yarnpkg, golang-github-goog
 
 %global         install_dir %{_sharedstatedir}/grafana/plugins/performancecopilot-pcp-app
 
-Requires:       grafana >= 7.3.6
+Requires:       grafana >= 7.5.9
 Suggests:       pcp >= 5.2.2
 Suggests:       redis >= 5.0.0
 Suggests:       bpftrace >= 0.9.2
@@ -74,56 +65,55 @@ Obsoletes: pcp-webapp-vector <= 4.3.4
 # this is for security purposes, if nodejs-foo ever needs an update,
 # affected packages can be easily identified.
 # Note: generated by the Makefile (see README.md)
-Provides: bundled(golang(github.com/grafana/grafana-plugin-sdk-go)) = 0.79.0
-Provides: bundled(golang(github.com/smartystreets/goconvey)) = 1.6.4
-Provides: bundled(npm(@babel/plugin-transform-modules-commonjs)) = 7.12.1
-Provides: bundled(npm(@grafana/data)) = 7.3.6
-Provides: bundled(npm(@grafana/runtime)) = 7.3.6
-Provides: bundled(npm(@grafana/toolkit)) = 7.3.6
-Provides: bundled(npm(@grafana/ui)) = 7.3.6
-Provides: bundled(npm(@types/blueimp-md5)) = 2.7.0
+Provides: bundled(golang(github.com/grafana/grafana-plugin-sdk-go)) = 0.105.0
+Provides: bundled(golang(github.com/stretchr/testify)) = 1.7.0
+Provides: bundled(npm(@babel/plugin-transform-modules-commonjs)) = 7.14.5
+Provides: bundled(npm(@grafana/data)) = 7.5.9
+Provides: bundled(npm(@grafana/runtime)) = 7.5.9
+Provides: bundled(npm(@grafana/toolkit)) = 7.5.9
+Provides: bundled(npm(@grafana/ui)) = 7.5.9
+Provides: bundled(npm(@testing-library/jest-dom)) = 5.4.0
+Provides: bundled(npm(@testing-library/react)) = 10.4.9
+Provides: bundled(npm(@types/blueimp-md5)) = 2.18.0
 Provides: bundled(npm(@types/d3-selection)) = 1.4.3
-Provides: bundled(npm(@types/enzyme)) = 3.10.5
+Provides: bundled(npm(@types/enzyme)) = 3.10.8
 Provides: bundled(npm(@types/enzyme-adapter-react-16)) = 1.0.6
 Provides: bundled(npm(@types/expect-puppeteer)) = 3.3.1
-Provides: bundled(npm(@types/jest)) = 24.0.13
+Provides: bundled(npm(@types/jest)) = 26.0.15
 Provides: bundled(npm(@types/jest-environment-puppeteer)) = 4.4.1
-Provides: bundled(npm(@types/lodash)) = 4.14.165
+Provides: bundled(npm(@types/lodash)) = 4.14.170
 Provides: bundled(npm(@types/memoize-one)) = 5.1.2
 Provides: bundled(npm(@types/react-autosuggest)) = 9.3.14
-Provides: bundled(npm(@types/react-redux)) = 7.1.12
+Provides: bundled(npm(@types/react-redux)) = 7.1.16
 Provides: bundled(npm(@types/redux)) = 3.6.0
 Provides: bundled(npm(@types/redux-persist)) = 4.3.1
 Provides: bundled(npm(@types/redux-persist-transform-filter)) = 0.0.4
 Provides: bundled(npm(babel-plugin-remove-object-properties)) = 1.0.2
 Provides: bundled(npm(blueimp-md5)) = 2.18.0
-Provides: bundled(npm(core-js)) = 1.2.7
+Provides: bundled(npm(core-js)) = 2.6.12
 Provides: bundled(npm(d3-flame-graph)) = 3.1.1
-Provides: bundled(npm(d3-selection)) = 1.4.1
+Provides: bundled(npm(d3-selection)) = 1.4.2
 Provides: bundled(npm(emotion)) = 10.0.27
 Provides: bundled(npm(enzyme)) = 3.11.0
-Provides: bundled(npm(enzyme-adapter-react-16)) = 1.15.5
-Provides: bundled(npm(eslint-plugin-prettier)) = 3.1.4
-Provides: bundled(npm(jest)) = 25.5.4
+Provides: bundled(npm(enzyme-adapter-react-16)) = 1.15.6
+Provides: bundled(npm(eslint-plugin-prettier)) = 3.3.1
 Provides: bundled(npm(jest-date-mock)) = 1.0.8
-Provides: bundled(npm(jest-puppeteer)) = 4.4.0
-Provides: bundled(npm(lodash)) = 4.17.19
+Provides: bundled(npm(jest-puppeteer)) = 5.0.4
+Provides: bundled(npm(lodash)) = 4.17.21
 Provides: bundled(npm(loglevel)) = 1.7.1
 Provides: bundled(npm(loglevel-plugin-prefix)) = 0.8.4
 Provides: bundled(npm(memoize-one)) = 4.1.0
 Provides: bundled(npm(monaco-editor)) = 0.20.0
 Provides: bundled(npm(monaco-editor-webpack-plugin)) = 1.9.0
-Provides: bundled(npm(prettier)) = 1.19.1
-Provides: bundled(npm(prettier-plugin-organize-imports)) = 1.1.1
-Provides: bundled(npm(puppeteer)) = 5.5.0
-Provides: bundled(npm(react-autosuggest)) = 10.0.4
+Provides: bundled(npm(prettier-plugin-organize-imports)) = 2.1.0
+Provides: bundled(npm(puppeteer)) = 10.0.0
+Provides: bundled(npm(react-autosuggest)) = 10.1.0
 Provides: bundled(npm(react-monaco-editor)) = 0.36.0
-Provides: bundled(npm(react-redux)) = 7.2.2
-Provides: bundled(npm(react-use)) = 15.3.4
+Provides: bundled(npm(react-redux)) = 7.2.4
+Provides: bundled(npm(react-use)) = 15.3.8
 Provides: bundled(npm(redux)) = 3.7.2
 Provides: bundled(npm(redux-persist)) = 4.10.2
 Provides: bundled(npm(redux-thunk)) = 2.3.0
-Provides: bundled(npm(ts-jest)) = 26.3.0
 Provides: bundled(npm(utility-types)) = 3.10.0
 
 
@@ -139,6 +129,8 @@ bpftrace scripts from pmdabpftrace(1), as well as several dashboards.
 %setup -q -T -D -b 2
 %endif
 
+%patch1 -p1
+
 # Set up Go build subdir and links
 mkdir -p %{_builddir}/src/github.com/performancecopilot
 ln -s %{_builddir}/%{name}-%{version} \
@@ -148,9 +140,7 @@ ln -s %{_builddir}/%{name}-%{version} \
 %build
 # Build frontend datasources
 %if %{compile_frontend}
-make dist-dashboards dist-frontend
-# webpack/copy-webpack-plugin sometimes outputs files with mode = 666 due to reasons unknown (race condition/umask issue afaics)
-chmod -R g-w,o-w dist
+%{SOURCE4}
 %endif
 
 # Build backend datasource
@@ -194,6 +184,10 @@ export GOPATH=%{_builddir}
 
 
 %changelog
+* Fri Jun 25 2021 Andreas Gerstmayr <agerstmayr@redhat.com> 3.1.0-1
+- update to 3.1.0 tagged upstream community sources, see CHANGELOG
+- remove unused cryptographic implementations
+
 * Fri Jan 22 2021 Andreas Gerstmayr <agerstmayr@redhat.com> 3.0.2-1
 - update to 3.0.2 tagged upstream community sources, see CHANGELOG