diff --git a/cgra-dynamicmeasures/README.md b/cgra-dynamicmeasures/README.md
index 14cbf6d0..7e0ec35e 100644
--- a/cgra-dynamicmeasures/README.md
+++ b/cgra-dynamicmeasures/README.md
@@ -8,16 +8,6 @@ This app adds new functionality to insights on a dashboard. Insights with multip
* Measures bucket must be the first bucket
* Insight must have 2 or more measures
-## 🦠Bugs
-
-* When you double-click any checkbox REALLY fast, sometimes the insight renders two or even three times stack on each other. See the bug-01 screenshot below.
-
-![bug-01](public/bug-01.png)
-
-* When you double-click any checkbox REALLY fast, the insight will re-render and won't respect the state of the checkbox; in other words the measure will be displayed in the insight even when the checkbox is unchecked, and vice versa. See the bug-02 screenshot below.
-
-![bug-02](public/bug-02.png)
-
## Ideas for improvements
* Activate the functionality based on insight title prefix
diff --git a/cgra-dynamicmeasures/src/components/MetricSwitcher.js b/cgra-dynamicmeasures/src/components/MetricSwitcher.js
new file mode 100644
index 00000000..e80709f4
--- /dev/null
+++ b/cgra-dynamicmeasures/src/components/MetricSwitcher.js
@@ -0,0 +1,70 @@
+import React, { useMemo, useState } from "react";
+import { DefaultDashboardInsight } from "@gooddata/sdk-ui-dashboard";
+import { insightSetBuckets } from "@gooddata/sdk-model";
+
+import styles from "./MetricSwitcher.module.scss";
+
+const MetricSwitcher = props => {
+ const widgetId = props.widget.identifier;
+ const originalBuckets = props.insight.insight.buckets;
+ const originalMeasures = originalBuckets[0].items;
+ const [measures, setMeasures] = useState(originalMeasures);
+
+ // memoize the altered insight properly to improve performance and prevent weird race conditions
+ // this makes sure the underlying pluggable visualization is updated only when actually needed
+ const newInsight = useMemo(() => {
+ const newMeasuresBucket = {
+ ...originalBuckets[0],
+ items: measures,
+ };
+
+ return insightSetBuckets(props.insight, [
+ newMeasuresBucket,
+ ...originalBuckets.filter(b => b.localIdentifier !== "measures"),
+ ]);
+ }, [measures, props.insight, originalBuckets]);
+
+ return (
+