diff --git a/src/assets/sfx/tone.mp3 b/src/assets/sfx/tone.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..304cf7cbc36aa31baee9e9de534adafa0aed93ba
Binary files /dev/null and b/src/assets/sfx/tone.mp3 differ
diff --git a/src/assets/sfx/tone.ogg b/src/assets/sfx/tone.ogg
old mode 100755
new mode 100644
index c1d5d5f765d600523a9cd920f08c26ab92489ae3..d0b5b151fcf45e01c2cd53853013c2cd8d9cf80d
Binary files a/src/assets/sfx/tone.ogg and b/src/assets/sfx/tone.ogg differ
diff --git a/src/assets/sfx/tone.wav b/src/assets/sfx/tone.wav
new file mode 100644
index 0000000000000000000000000000000000000000..2d7b195387bbddd53c8ac4508657ecd3f9abb5fd
Binary files /dev/null and b/src/assets/sfx/tone.wav differ
diff --git a/src/assets/sfx/tone.webm b/src/assets/sfx/tone.webm
new file mode 100644
index 0000000000000000000000000000000000000000..de9789187bd8b1cdc70152b2cd9cf2cb5dc5400a
Binary files /dev/null and b/src/assets/sfx/tone.webm differ
diff --git a/src/assets/stylesheets/audio.scss b/src/assets/stylesheets/audio.scss
index d73a85eddc926c4b9a2f58c21fd4a97521822fd8..97abcfaa415e02ab6a9cbd1fb5ae2b54f11328a4 100644
--- a/src/assets/stylesheets/audio.scss
+++ b/src/assets/stylesheets/audio.scss
@@ -66,6 +66,7 @@
       position:relative;
       width: 111px;
       height: 111px;
+      cursor: pointer;
     }
 
     &__icon-part {
diff --git a/src/hub.html b/src/hub.html
index edb7395d4641f10c27994b3399dc580e72f6952b..ad2bcf9af57cca18c10b72994e37b8a2bbe5e258 100644
--- a/src/hub.html
+++ b/src/hub.html
@@ -16,7 +16,12 @@
 </head>
 
 <body data-html-prefix="<%= HTML_PREFIX %>">
-    <audio id="test-tone" src="./assets/sfx/tone.ogg"></audio>
+    <audio id="test-tone">
+        <source src="./assets/sfx/tone.webm" type="audio/webm"/>
+        <source src="./assets/sfx/tone.mp3" type="audio/mpeg"/>
+        <source src="./assets/sfx/tone.ogg" type="audio/ogg"/>
+        <source src="./assets/sfx/tone.wav" type="audio/wav"/>
+    </audio>
 
     <a-scene
         networked-scene="adapter: janus; audio: true; debug: true; connectOnLoad: false;"
diff --git a/src/react-components/ui-root.js b/src/react-components/ui-root.js
index 2883d23f066498e941d561b6722b9fc5b434590c..6dd077c36d747ac1b5cbbf0eebddb17ef97cb8c1 100644
--- a/src/react-components/ui-root.js
+++ b/src/react-components/ui-root.js
@@ -101,7 +101,6 @@ class UIRoot extends Component {
   }
 
   componentDidMount() {
-    this.setupTestTone();
     this.props.concurrentLoadDetector.addEventListener("concurrentload", this.onConcurrentLoad);
     this.micLevelMovingAverage = MovingAverage(100);
     this.props.scene.addEventListener("loaded", this.onSceneLoaded);
@@ -151,37 +150,22 @@ class UIRoot extends Component {
     }
   };
 
-  setupTestTone = () => {
+  playTestTone = () => {
     const toneClip = document.querySelector("#test-tone");
-    const toneLength = 1800;
-    const toneDelay = 5000;
-
-    const toneIndicatorLoop = () => {
-      this.setState({ tonePlaying: false });
-
-      setTimeout(() => {
-        this.setState({ tonePlaying: true });
-        setTimeout(() => {
-          this.setState({ tonePlaying: false });
-        }, toneLength);
-      }, toneDelay);
-    };
-
-    toneClip.addEventListener("seeked", toneIndicatorLoop);
-    toneClip.addEventListener("playing", toneIndicatorLoop);
-  };
-
-  startTestTone = () => {
-    const toneClip = document.querySelector("#test-tone");
-    toneClip.loop = true;
+    toneClip.currentTime = 0;
     toneClip.play();
+    clearTimeout(this.testToneTimeout);
+    this.setState({ tonePlaying: true });
+    const toneLength = 1393;
+    this.testToneTimeout = setTimeout(() => {
+      this.setState({ tonePlaying: false });
+    }, toneLength);
   };
 
   stopTestTone = () => {
     const toneClip = document.querySelector("#test-tone");
     toneClip.pause();
     toneClip.currentTime = 0;
-
     this.setState({ tonePlaying: false });
   };
 
@@ -247,8 +231,8 @@ class UIRoot extends Component {
     const hasGrantedMic = await this.hasGrantedMicPermissions();
 
     if (hasGrantedMic) {
+      this.beginAudioSetup();
       await this.setMediaStreamToDefault();
-      await this.beginAudioSetup();
     } else {
       this.setState({ entryStep: ENTRY_STEPS.mic_grant });
     }
@@ -420,10 +404,10 @@ class UIRoot extends Component {
       if (hasAudio) {
         this.setState({ entryStep: ENTRY_STEPS.mic_granted });
       } else {
-        await this.beginAudioSetup();
+        this.beginAudioSetup();
       }
     } else {
-      await this.beginAudioSetup();
+      this.beginAudioSetup();
     }
   };
 
@@ -431,8 +415,7 @@ class UIRoot extends Component {
     this.setState({ showProfileEntry: false });
   };
 
-  beginAudioSetup = async () => {
-    this.startTestTone();
+  beginAudioSetup = () => {
     this.setState({ entryStep: ENTRY_STEPS.audio_setup });
   };
 
@@ -495,6 +478,7 @@ class UIRoot extends Component {
     }
 
     this.stopTestTone();
+    clearTimeout(this.testToneTimeout);
 
     if (this.state.micLevelAudioContext) {
       this.state.micLevelAudioContext.close();
@@ -658,7 +642,7 @@ class UIRoot extends Component {
                 />
               )}
             </div>
-            <div className="audio-setup-panel__levels__icon">
+            <div className="audio-setup-panel__levels__icon" onClick={this.playTestTone}>
               <img
                 src="../assets/images/level_background.png"
                 srcSet="../assets/images/level_background@2x.png 2x"
diff --git a/webpack.config.js b/webpack.config.js
index 55bae82132e8d8611ba8b01ffcddf1ac49109c4b..69da8694296d35a1602f88f135ebd9d8129f213f 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -117,7 +117,7 @@ const config = {
         loader: "html-loader",
         options: {
           // <a-asset-item>'s src property is overwritten with the correct transformed asset url.
-          attrs: ["img:src", "a-asset-item:src", "audio:src"],
+          attrs: ["img:src", "a-asset-item:src", "audio:src", "source:src"],
           // You can get transformed asset urls in an html template using ${require("pathToFile.ext")}
           interpolate: "require"
         }
@@ -162,7 +162,7 @@ const config = {
         })
       },
       {
-        test: /\.(png|jpg|gif|glb|ogg|woff2|svg|webm)$/,
+        test: /\.(png|jpg|gif|glb|ogg|mp3|wav|woff2|svg|webm)$/,
         use: {
           loader: "file-loader",
           options: {