diff --git a/package-lock.json b/package-lock.json
index 5b032157273a231574f175f8621d0e3aaadb8526..e9b37333452f49bd17ee3b46dec3ecabf28d71f4 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -11634,9 +11634,9 @@
       }
     },
     "nrp-jsproto": {
-      "version": "1.1.1-alpha.10",
-      "resolved": "https://registry.npmjs.org/nrp-jsproto/-/nrp-jsproto-1.1.1-alpha.10.tgz",
-      "integrity": "sha512-KFe2AQuhtx4wD76PIzxlhKFXtWYeUtyqSkONA8nYvIV9HfG67q09Qcnzhl745jZHZHZMC03xj9QVEr0x5so8Cg=="
+      "version": "1.1.1-alpha.20",
+      "resolved": "https://registry.npmjs.org/nrp-jsproto/-/nrp-jsproto-1.1.1-alpha.20.tgz",
+      "integrity": "sha512-n39H3PBdhA+ojWIRe43ZcSJEZeogGZ91o5beHKrLdbbjNGcduOAzUS75AYE2hQ0YbOWtGwNVDQL9LGHK0LZugQ=="
     },
     "nth-check": {
       "version": "1.0.2",
diff --git a/package.json b/package.json
index 23c65b4108e39e1201851ae0671e51a9ba4f1900..c992410e816558c807d4fb1748a5f1f9c65d4960 100644
--- a/package.json
+++ b/package.json
@@ -20,7 +20,7 @@
     "jquery": "3.6.0",
     "jszip": "3.2.0",
     "mqtt": "4.3.5",
-    "nrp-jsproto": "1.1.1-alpha.10",
+    "nrp-jsproto": "1.1.1-alpha.20",
     "protobufjs": "6.11.2",
     "react": "^17.0.1",
     "react-bootstrap": "1.4.0",
diff --git a/src/components/nrp-core-dashboard/nrp-core-dashboard.js b/src/components/nrp-core-dashboard/nrp-core-dashboard.js
index ee0b7adb3ded787acf89a330c583f9dc723552a0..f2072310ab9c0215a39203ca798d10f01a68dee6 100644
--- a/src/components/nrp-core-dashboard/nrp-core-dashboard.js
+++ b/src/components/nrp-core-dashboard/nrp-core-dashboard.js
@@ -1,6 +1,8 @@
+import { DomainDisabledOutlined } from '@material-ui/icons';
 import React from 'react';
 
 import MqttClientService from '../../services/mqtt-client-service';
+import ExperimentStorageService from '../../services/experiments/files/experiment-storage-service';
 
 export default class NrpCoreDashboard extends React.Component {
   constructor(props) {
@@ -22,10 +24,18 @@ export default class NrpCoreDashboard extends React.Component {
     });
   }
 
+  async triggerProxyScanStorage() {
+    let result = await ExperimentStorageService.instance.scanStorage();
+    console.info('triggerProxyScanStorage:');
+    console.info(result);
+  }
+
   render() {
     return (
       <div>
         {this.mqttBrokerUrl}
+        <br />
+        <button onClick={this.triggerProxyScanStorage}>Proxy Scan Storage</button>
       </div>
     );
   }
diff --git a/src/services/experiments/files/experiment-storage-service.js b/src/services/experiments/files/experiment-storage-service.js
index ac20e1a442fb67f751a645406d7390bc3425e2f0..d2957fcc8a01084ff32654d2e0bf5a21aae88e9b 100644
--- a/src/services/experiments/files/experiment-storage-service.js
+++ b/src/services/experiments/files/experiment-storage-service.js
@@ -5,8 +5,11 @@ import endpoints from '../../proxy/data/endpoints.json';
 import config from '../../../config.json';
 import DialogService from '../../dialog-service.js';
 
-const storageURL = `${config.api.proxy.url}${endpoints.proxy.storage.url}`;
-const storageExperimentsURL = `${config.api.proxy.url}${endpoints.proxy.storage.experiments.url}`;
+const PROXY_URL = config.api.proxy.url;
+const SCAN_STORAGE_URL = `${PROXY_URL}${endpoints.proxy.storage.scanStorage.url}`;
+const storageURL = `${PROXY_URL}${endpoints.proxy.storage.url}`;
+const storageExperimentsURL = `${PROXY_URL}${endpoints.proxy.storage.experiments.url}`;
+
 
 let _instance = null;
 const SINGLETON_ENFORCER = Symbol();
@@ -71,6 +74,7 @@ class ExperimentStorageService extends HttpService {
     if (!this.experiments || forceUpdate) {
       try {
         let experimentList = await (await this.httpRequestGET(storageExperimentsURL)).json();
+        console.info(['ExperimentStorageService.getExperiments()', experimentList]);
         // filter out experiments with incomplete configuration (probably storage corruption)
         experimentList = experimentList.filter(experiment => experiment.configuration.experimentFile);
         this.sortExperiments(experimentList);
@@ -275,6 +279,14 @@ class ExperimentStorageService extends HttpService {
         'please make sure that the contentType and the body type match.');
     }
   }
+
+  /**
+   * Trigger proxy to scan storage.
+   * @returns {promise} Result
+   */
+  async scanStorage() {
+    return await (await this.httpRequestPOST(SCAN_STORAGE_URL)).json();
+  }
 }
 
 ExperimentStorageService.EVENTS = Object.freeze({
diff --git a/src/services/mqtt-client-service.js b/src/services/mqtt-client-service.js
index 890bb0c8045ea1ebf377c5ab4c1e4e9fb6145259..ce09aa079385307634bda4ffd27c9d99c588cdaf 100644
--- a/src/services/mqtt-client-service.js
+++ b/src/services/mqtt-client-service.js
@@ -1,7 +1,7 @@
 import mqtt from 'mqtt';
 import { EventEmitter } from 'events';
 
-import * as proto from 'nrp-jsproto/nrp-engine_msgs-protobufjs';
+//import * as proto from 'nrp-jsproto/engine_grpc_pb';
 
 let _instance = null;
 const SINGLETON_ENFORCER = Symbol();
@@ -16,7 +16,7 @@ export default class MqttClientService extends EventEmitter {
       throw new Error('Use ' + this.constructor.name + '.instance');
     }
 
-    console.info(proto);
+    //console.info(proto);
   }
 
   static get instance() {
@@ -47,20 +47,9 @@ export default class MqttClientService extends EventEmitter {
     console.info('MQTT message: [topic, payload, packet]');
     console.info([topic, payload, packet]);
 
-    try {
-      if (topic.endsWith('/type')) {
-        let msg = String(payload);
-        console.info('"' + topic + '" message format = ' + msg);
-      }
-      else {
-        let msg = proto.Engine.DataPackMessage.decode(payload);
-        console.info('DataPackMessage');
-        console.info(msg);
-      }
-    }
-    catch (error) {
-      console.error(error);
-    }
+    // step 0: deserialize the payload => messageData
+    // step 1: pick subs based on topic => subs
+    // step 2: foreach(sub) {sub.callback(messageData, topic);}
   }
 }