diff --git a/labs/bbb-webrtc-sfu/lib/mcs-core/lib/adapters/kurento/kurento.js b/labs/bbb-webrtc-sfu/lib/mcs-core/lib/adapters/kurento/kurento.js
index 2b975f7cac0133b35352f5583a3ae28acd3e511e..c5bde4277850a8291f91689f9d6253999cb29f4c 100644
--- a/labs/bbb-webrtc-sfu/lib/mcs-core/lib/adapters/kurento/kurento.js
+++ b/labs/bbb-webrtc-sfu/lib/mcs-core/lib/adapters/kurento/kurento.js
@@ -37,10 +37,9 @@ module.exports = class MediaServer extends EventEmitter {
         }
         resolve();
       }
-      catch (err) {
-        this._handleError(err);
+      catch (error) {
         this.emit(C.ERROR.MEDIA_SERVER_OFFLINE);
-        reject(err);
+        reject(this._handleError(error));
       }
     });
   }
@@ -49,8 +48,7 @@ module.exports = class MediaServer extends EventEmitter {
     return new Promise((resolve, reject) =>  {
       mediaServerClient(serverUri, {failAfter: 1}, (error, client) => {
         if (error) {
-          error = this._handleError(error);
-          return reject(error);
+          return reject(this._handleError(error));
         }
         resolve(client);
       });
@@ -131,16 +129,15 @@ module.exports = class MediaServer extends EventEmitter {
         if (pipeline && typeof pipeline.release === 'function') {
           pipeline.release((error) => {
             if (error) {
-              error = this._handleError(error);
-              return reject(error);
+              return reject(this._handleError(error));
             }
             delete this._mediaPipelines[room];
             return resolve()
           });
         }
       }
-      catch (err) {
-        return reject(this._handleError(err));
+      catch (error) {
+        return reject(this._handleError(error));
       }
     });
   }
@@ -150,8 +147,7 @@ module.exports = class MediaServer extends EventEmitter {
       try {
         pipeline.create(type, options, (error, mediaElement) => {
           if (error) {
-            error = this._handleError(error);
-            return reject(error);
+            return reject(this._handleError(error));
           }
           Logger.info("[mcs-media] Created [" + type + "] media element: " + mediaElement.id);
           this._mediaElements[mediaElement.id] = mediaElement;
@@ -187,7 +183,7 @@ module.exports = class MediaServer extends EventEmitter {
     const source = this._mediaElements[sourceId];
     return new Promise((resolve, reject) => {
       if (source == null) {
-        return reject(this._handleError("[mcs-recording] startRecording error"));
+        return reject(this._handleError(ERRORS[40101]));
       }
       try {
         source.record((err) => {
@@ -208,7 +204,7 @@ module.exports = class MediaServer extends EventEmitter {
 
     return new Promise((resolve, reject) => {
       if (source == null) {
-        return reject(this._handleError("[mcs-recording] stopRecording error"));
+        return reject(this._handleError(ERRORS[40101]));
       }
       try {
         source.stopAndWait((err) => {
@@ -230,15 +226,14 @@ module.exports = class MediaServer extends EventEmitter {
 
     return new Promise((resolve, reject) => {
       if (source == null || sink == null) {
-        return reject(this._handleError("[mcs-media] Failed to connect " + type + ": " + sourceId + " to " + sinkId));
+        return reject(this._handleError(ERRORS[40101]));
       }
       try {
         switch (type) {
           case 'ALL':
             source.connect(sink, (error) => {
               if (error) {
-                error = this._handleError(error);
-                return reject(error);
+                return reject(this._handleError(error));
               }
               return resolve();
             });
@@ -248,8 +243,7 @@ module.exports = class MediaServer extends EventEmitter {
           case 'AUDIO':
             source.connect(sink, 'AUDIO', (error) => {
               if (error) {
-                error = this._handleError(error);
-                return reject(error);
+                return reject(this._handleError(error));
               }
               return resolve();
             });
@@ -257,19 +251,18 @@ module.exports = class MediaServer extends EventEmitter {
           case 'VIDEO':
             source.connect(sink, (error) => {
               if (error) {
-                error = this._handleError(error);
-                return reject(error);
+                return reject(this._handleError(error));
               }
               return resolve();
             });
             break;
 
           default:
-            return reject(this._handleError("[mcs-media] Invalid connect type"));
+            return reject(this._handleError(ERRORS[40107]));
         }
       }
-      catch (err) {
-        return reject(this._handleError(err));
+      catch (error) {
+        return reject(this._handleError(error));
       }
     });
   }
@@ -280,7 +273,7 @@ module.exports = class MediaServer extends EventEmitter {
 
     return new Promise((resolve, reject) => {
       if (source == null || sink == null) {
-        return reject(this._handleError("[mcs-media] Failed to disconnect " + type + ": " + sourceId + " to " + sinkId));
+        return reject(this._handleError(ERRORS[40101]));
       }
       try {
         switch (type) {
@@ -311,11 +304,11 @@ module.exports = class MediaServer extends EventEmitter {
             break;
 
           default:
-            return reject(this._handleError("[mcs-media] Invalid disconnect type"));
+            return reject(this._handleError(ERRORS[40107]));
         }
       }
-      catch (err) {
-        return reject(this._handleError(err));
+      catch (error) {
+        return reject(this._handleError(error));
       }
     });
   }
@@ -369,20 +362,18 @@ module.exports = class MediaServer extends EventEmitter {
         if (mediaElement  && candidate) {
           mediaElement.addIceCandidate(candidate, (error) => {
             if (error) {
-              error = this._handleError(error);
-              return reject(error);
+              return reject(this._handleError(error));
             }
             Logger.debug("[mcs-media] Added ICE candidate for => " + elementId);
             return resolve();
           });
         }
         else {
-          return reject("Candidate could not be parsed or media element does not exist");
+          return reject(this._handleError(ERRORS[40101]));
         }
       }
-      catch (err) {
-        err = this._handleError(err);
-        reject(err);
+      catch (error) {
+        return reject(this._handleError(error));
       }
     });
   }
@@ -394,7 +385,7 @@ module.exports = class MediaServer extends EventEmitter {
     return new Promise((resolve, reject) => {
       try {
         if (mediaElement == null) {
-          return reject("[mcs-media] There is no element " + elementId);
+          return reject(this._handleError(ERRORS[40101]));
         }
         mediaElement.gatherCandidates((error) => {
           if (error) {
@@ -457,7 +448,7 @@ module.exports = class MediaServer extends EventEmitter {
           });
         }
         else {
-          return reject(this._handleError("[mcs-media] There is no element " + elementId));
+          return reject(this._handleError(ERRORS[40101]));
         }
       }
       catch (err) {
@@ -544,39 +535,44 @@ module.exports = class MediaServer extends EventEmitter {
   }
 
   _handleError(err) {
-    let { message, code, stack, data, reason } = err;
+    let { message: oldMessage , code, stack } = err;
+    let message;
+
+    if (code && code >= C.ERROR.MIN_CODE && code <= C.ERROR.MAX_CODE) {
+      return err;
+    }
+
     const error = ERRORS[code]? ERRORS[code].error : null;
 
-    console.log("BYE", error);
     if (error == null) {
-      switch (message) {
+      switch (oldMessage) {
         case "Request has timed out":
-          ({ code, reason }  = C.ERROR.MEDIA_SERVER_REQUEST_TIMEOUT);
+          ({ code, message }  = C.ERROR.MEDIA_SERVER_REQUEST_TIMEOUT);
         break;
 
         case "Connection error":
-          ({ code, reason } = C.ERROR.CONNECTION_ERROR);
+          ({ code, message } = C.ERROR.CONNECTION_ERROR);
         break;
 
         default:
-          ({ code, reason } = C.ERROR.MEDIA_SERVER_GENERIC_ERROR);
+          ({ code, message } = C.ERROR.MEDIA_SERVER_GENERIC_ERROR);
       }
     }
     else {
-      ({ code, reason } = error);
+      ({ code, message } = error);
     }
 
     // Checking if the error needs to be wrapped into a JS Error instance
     if (!isError(err)) {
-      err = new Error(reason);
+      err = new Error(message);
     }
 
     err.code = code;
-    err.message = reason;
-    err.details = message;
+    err.message = message;
+    err.details = oldMessage;
     err.stack = stack
 
-    Logger.debug('[mcs-media] Media Server returned an', err.code, err.message, err.stack);
+    Logger.debug('[mcs-media] Media Server returned an', err.code, err.message);
     Logger.trace(err.stack);
     return err;
   }
diff --git a/labs/bbb-webrtc-sfu/lib/mcs-core/lib/constants/Constants.js b/labs/bbb-webrtc-sfu/lib/mcs-core/lib/constants/Constants.js
index a03efdcf8e3da0b6a645d66b3b74f4ae2ad62a16..b56ec85ce0b6763b0fcbcbbf89ff17dd59b19a4a 100644
--- a/labs/bbb-webrtc-sfu/lib/mcs-core/lib/constants/Constants.js
+++ b/labs/bbb-webrtc-sfu/lib/mcs-core/lib/constants/Constants.js
@@ -47,30 +47,32 @@ exports.EVENT.RECORDING.PAUSED = 'Paused';
 
 // Error codes
 exports.ERROR = {};
-exports.ERROR.CONNECTION_ERROR = { code: 2000, reason: "MEDIA_SERVER_CONNECTION_ERROR" };
-exports.ERROR.MEDIA_SERVER_OFFLINE = { code: 2001, reason: "MEDIA_SERVER_OFFLINE" };
-exports.ERROR.MEDIA_SERVER_NO_RESOURCES = { code: 2002, reason: "MEDIA_SERVER_NO_RESOURCES" };
-exports.ERROR.ICE_CANDIDATE_FAILED = { code: 2003, reason: "ICE_ADD_CANDIDATE_FAILED" };
-exports.ERROR.ICE_GATHERING_FAILED = { code: 2004, reason: "ICE_GATHERING_FAILED" };
-exports.ERROR.MEDIA_SERVER_REQUEST_TIMEOUT = { code: 2005, reason: "MEDIA_SERVER_REQUEST_TIMEOUT" };
-exports.ERROR.MEDIA_SERVER_GENERIC_ERROR = { code: 2006, reason: "MEDIA_SERVER_GENERIC_ERROR" };
-
-exports.ERROR.ROOM_GENERIC_ERROR = { code: 2100, reason: "ROOM_GENNERIC_ERROR" };
-exports.ERROR.ROOM_NOT_FOUND = { code: 2101, reason: "ROOM_NOT_FOUND" };
-exports.ERROR.USER_GENERIC_ERROR = { code: 2110, reason: "USER_GENERIC_ERROR" };
-exports.ERROR.USER_NOT_FOUND = { code: 2111, reason: "USER_NOT_FOUND" };
-
-exports.ERROR.MEDIA_GENERIC_ERROR = { code: 2200, reason: "MEDIA_GENERIC_ERROR" };
-exports.ERROR.MEDIA_NOT_FOUND = { code: 2201, reason: "MEDIA_NOT_FOUND" };
-exports.ERROR.MEDIA_INVALID_SDP = { code: 2202, reason: "MEDIA_INVALID_SDP" };
-exports.ERROR.MEDIA_NO_AVAILABLE_CODEC = { code: 2203, reason: "MEDIA_NO_AVAILABLE_CODEC" };
-exports.ERROR.MEDIA_INVALID_TYPE = { code: 2204, reason: "MEDIA_INVALID_TYPE" };
-exports.ERROR.MEDIA_INVALID_OPERATION = { code: 2205, reason: "MEDIA_INVALID_OPERATION" };
-exports.ERROR.MEDIA_PROCESS_OFFER_FAILED = { code: 2206, reason : "MEDIA_PROCESS_OFFER_FAILED" };
-exports.ERROR.MEDIA_PROCESS_ANSWER_FAILED = { code: 2207, reason : "MEDIA_PROCESS_ANSWER_FAILED" };
-exports.ERROR.MEDIA_GENERIC_PROCESS_ERROR = { code: 2208, reason: "MEDIA_GENERIC_PROCESS_ERROR" };
-exports.ERROR.MEDIA_ADAPTER_OBJECT_NOT_FOUND = { code: 2209, reason: "MEDIA_ADAPTER_OBJECT_NOT_FOUND" };
-exports.ERROR.MEDIA_CONNECT_ERROR = { code: 2210, reason: "MEDIA_CONNECT_ERROR" };
+exports.ERROR.MIN_CODE = 2000;
+exports.ERROR.MAX_CODE = 2999;
+exports.ERROR.CONNECTION_ERROR = { code: 2000, message: "MEDIA_SERVER_CONNECTION_ERROR" };
+exports.ERROR.MEDIA_SERVER_OFFLINE = { code: 2001, message: "MEDIA_SERVER_OFFLINE" };
+exports.ERROR.MEDIA_SERVER_NO_RESOURCES = { code: 2002, message: "MEDIA_SERVER_NO_RESOURCES" };
+exports.ERROR.ICE_CANDIDATE_FAILED = { code: 2003, message: "ICE_ADD_CANDIDATE_FAILED" };
+exports.ERROR.ICE_GATHERING_FAILED = { code: 2004, message: "ICE_GATHERING_FAILED" };
+exports.ERROR.MEDIA_SERVER_REQUEST_TIMEOUT = { code: 2005, message: "MEDIA_SERVER_REQUEST_TIMEOUT" };
+exports.ERROR.MEDIA_SERVER_GENERIC_ERROR = { code: 2006, message: "MEDIA_SERVER_GENERIC_ERROR" };
+
+exports.ERROR.ROOM_GENERIC_ERROR = { code: 2100, message: "ROOM_GENNERIC_ERROR" };
+exports.ERROR.ROOM_NOT_FOUND = { code: 2101, message: "ROOM_NOT_FOUND" };
+exports.ERROR.USER_GENERIC_ERROR = { code: 2110, message: "USER_GENERIC_ERROR" };
+exports.ERROR.USER_NOT_FOUND = { code: 2111, message: "USER_NOT_FOUND" };
+
+exports.ERROR.MEDIA_GENERIC_ERROR = { code: 2200, message: "MEDIA_GENERIC_ERROR" };
+exports.ERROR.MEDIA_NOT_FOUND = { code: 2201, message: "MEDIA_NOT_FOUND" };
+exports.ERROR.MEDIA_INVALID_SDP = { code: 2202, message: "MEDIA_INVALID_SDP" };
+exports.ERROR.MEDIA_NO_AVAILABLE_CODEC = { code: 2203, message: "MEDIA_NO_AVAILABLE_CODEC" };
+exports.ERROR.MEDIA_INVALID_TYPE = { code: 2204, message: "MEDIA_INVALID_TYPE" };
+exports.ERROR.MEDIA_INVALID_OPERATION = { code: 2205, message: "MEDIA_INVALID_OPERATION" };
+exports.ERROR.MEDIA_PROCESS_OFFER_FAILED = { code: 2206, message : "MEDIA_PROCESS_OFFER_FAILED" };
+exports.ERROR.MEDIA_PROCESS_ANSWER_FAILED = { code: 2207, message : "MEDIA_PROCESS_ANSWER_FAILED" };
+exports.ERROR.MEDIA_GENERIC_PROCESS_ERROR = { code: 2208, message: "MEDIA_GENERIC_PROCESS_ERROR" };
+exports.ERROR.MEDIA_ADAPTER_OBJECT_NOT_FOUND = { code: 2209, message: "MEDIA_ADAPTER_OBJECT_NOT_FOUND" };
+exports.ERROR.MEDIA_CONNECT_ERROR = { code: 2210, message: "MEDIA_CONNECT_ERROR" };
 
 
 
diff --git a/labs/bbb-webrtc-sfu/lib/mcs-core/lib/media/MCSApiStub.js b/labs/bbb-webrtc-sfu/lib/mcs-core/lib/media/MCSApiStub.js
index c57a18b331d17cfffd07091d76a8be8e9d3594dd..89d4c629e078b4cefa40967874f83f127f1e8f97 100644
--- a/labs/bbb-webrtc-sfu/lib/mcs-core/lib/media/MCSApiStub.js
+++ b/labs/bbb-webrtc-sfu/lib/mcs-core/lib/media/MCSApiStub.js
@@ -24,55 +24,50 @@ module.exports = class MCSApiStub extends EventEmitter {
   async join (room, type, params) {
     try {
       const answer = await this._mediaController.join(room, type, params);
-      return Promise.resolve(answer);
+      return (answer);
     }
-    catch (err) {
-      Logger.error("[MCSApi] join ", err);
-      Promise.reject(err);
+    catch (error) {
+      throw (this._handleError(error, 'join', { room, type, params}));
     }
   }
 
-  async leave (roomId, userId) {
+  async leave (room, user) {
     try {
-      const answer = await this._mediaController.leave(roomId, userId);
-      return Promise.resolve(answer);
+      const answer = await this._mediaController.leave(room, user);
+      return (answer);
     }
-    catch (err) {
-      Logger.error("[MCSApi] leave ", err);
-      return Promise.reject(err);
+    catch (error) {
+      throw (this._handleError(error, 'leave', { room, user }));
     }
   }
 
   async publishnsubscribe (user, sourceId, sdp, params) {
     try {
       const answer = await this._mediaController.publishnsubscribe(user, sourceId, sdp, params);
-      return Promise.resolve(answer);
+      return (answer);
     }
-    catch (err) {
-      Logger.error("[MCSApi] publishnsubscribe ", err);
-      return Promise.reject(err);
+    catch (error) {
+      throw (this._handleError(error, 'publishnsubscribe', { user, sourceId, sdp, params }));
     }
   }
 
   async publish (user, room,  type, params) {
     try {
       const answer = await this._mediaController.publish(user, room, type, params);
-      return Promise.resolve(answer);
+      return (answer);
     }
-    catch (err) {
-      Logger.error("[MCSApi] publish ", err);
-      return Promise.reject(err);
+    catch (error) {
+      throw (this._handleError(error, 'publish', { user, room, type, params }));
     }
   }
 
   async unpublish (user, mediaId) {
     try {
       await this._mediaController.unpublish(mediaId);
-      return Promise.resolve();
+      return ;
     }
-    catch (err) {
-      Logger.error("[MCSApi] unpublish ", err);
-      return Promise.reject(err);
+    catch (error) {
+      throw (this._handleError(error, 'unpublish', { user, mediaId }));
     }
   }
 
@@ -80,66 +75,60 @@ module.exports = class MCSApiStub extends EventEmitter {
     try {
       const answer = await this._mediaController.subscribe(user, sourceId, type, params);
 
-      return Promise.resolve(answer);
+      return (answer);
     }
-    catch (err) {
-      Logger.error("[MCSApi] subscribe ", err);
-      return Promise.reject(err);
+    catch (error) {
+      throw (this._handleError(error, 'subscribe', { user, sourceId, type, params }));
     }
   }
 
   async unsubscribe (user, mediaId) {
     try {
       await this._mediaController.unsubscribe(user, mediaId);
-      return Promise.resolve();
+      return ;
     }
-    catch (err) {
-      Logger.error("[MCSApi] unsubscribe ", err);
-      return Promise.reject(err);
+    catch (error) {
+      throw (this._handleError(error, 'unsubscribe', { user, mediaId }));
     }
   }
 
   async startRecording(userId, mediaId, recordingName) {
     try {
       const answer = await this._mediaController.startRecording(userId, mediaId, recordingName);
-      return Promise.resolve(answer);
+      return (answer);
     }
-    catch (err) {
-      Logger.error("[MCSApi] startRecording ", err);
-      return Promise.reject(err);
+    catch (error) {
+      throw (this._handleError(error, 'startRecording', { userId, mediaId, recordingName }));
     }
   }
 
   async stopRecording(userId, sourceId, recId) {
     try {
       let answer = await this._mediaController.stopRecording(userId, sourceId, recId);
-      return Promise.resolve(answer);
+      return (answer);
     }
-    catch (err) {
-      Logger.error("[MCSApi] stopRecording ", err);
-      return Promise.reject(err);
+    catch (error) {
+      throw (this._handleError(error, 'stopRecording', { userId, sourceId, recId }));
     }
   }
 
   async connect (source, sink, type) {
     try {
       await this._mediaController.connect(source, sink, type);
-      return Promise.resolve();
+      return ;
     }
-    catch (err) {
-      Logger.error(err);
-      return Promise.reject(err);
+    catch (error) {
+      throw (this._handleError(error, 'connect', { source, sink, type }));
     }
   }
 
   async disconnect (source, sink, type) {
     try {
       await this._mediaController.disconnect(source, sink, type);
-      return Promise.resolve();
+      return ;
     }
-    catch (err) {
-      Logger.error(err);
-      return Promise.reject(err);
+    catch (error) {
+      throw (this._handleError(error, 'disconnect', { source, sink, type }));
     }
   }
 
@@ -150,26 +139,32 @@ module.exports = class MCSApiStub extends EventEmitter {
         this.emitter.emit(eventTag, event);
       });
 
-      return Promise.resolve(eventTag);
+      return (eventTag);
     }
-    catch (err) {
-      Logger.error("[MCSApi] onEvent ", err);
-      return Promise.reject();
+    catch (error) {
+      throw (this._handleError(error, 'onEvent', { eventName, mediaId }));
     }
   }
 
   async addIceCandidate (mediaId, candidate) {
     try {
       await this._mediaController.addIceCandidate(mediaId, candidate);
-      return Promise.resolve();
+      return ;
     }
-    catch (err) {
-      Logger.error("[MCSApi] addIceCandidate ", err);
-      Promise.reject();
+    catch (error) {
+      throw (this._handleError(error, 'addIceCandidate', { mediaId, candidate }));
     }
   }
 
   setStrategy (strategy) {
     // TODO
   }
+
+  _handleError (error, operation, params) {
+    const { code, message, details } = error;
+    const response = { type: 'error', code, message, details, operation, params};
+    Logger.error("[mcs-api] Reject operation", response.operation, "with", { error: response });
+
+    return response;
+  }
 }
diff --git a/labs/bbb-webrtc-sfu/lib/mcs-core/lib/media/MediaController.js b/labs/bbb-webrtc-sfu/lib/mcs-core/lib/media/MediaController.js
index 10cc45585b950a844aeb8a35dca2303bbf9c8b93..a6a576b896e85d1ddfe384161dbf3229a569af7d 100644
--- a/labs/bbb-webrtc-sfu/lib/mcs-core/lib/media/MediaController.js
+++ b/labs/bbb-webrtc-sfu/lib/mcs-core/lib/media/MediaController.js
@@ -6,7 +6,8 @@ const Logger = require('../../../utils/Logger');
 // Model
 const SfuUser = require('../model/SfuUser');
 const Room = require('../model/Room.js');
-const isError = require('../utils/util').isError;
+const { handleError } = require('../utils/util');
+const LOG_PREFIX = "[mcs-controller]";
 
 /* PUBLIC ELEMENTS */
 
@@ -366,34 +367,6 @@ module.exports = class MediaController {
   }
 
   _handleError (error) {
-    let { message, code, stack, data, details } = error;
-
-    if (code == null) {
-      ({ code, message } = C.ERROR.MEDIA_GENERIC_ERROR);
-    }
-    else {
-      ({ code, message } = error);
-    }
-
-    if (!isError(error)) {
-      error = new Error(message);
-    }
-
-    error.code = code;
-    error.message = message;
-    error.stack = stack
-
-    if (details) {
-      error.details = details;
-    }
-    else {
-      error.details = message;
-    }
-
-
-    Logger.trace("[mcs-controller ] Controller received an error", error.code, error.message);
-    Logger.trace(error.stack);
-
-    return error;
+    return handleError(LOG_PREFIX, error);
   }
 }
diff --git a/labs/bbb-webrtc-sfu/lib/mcs-core/lib/model/MediaSession.js b/labs/bbb-webrtc-sfu/lib/mcs-core/lib/model/MediaSession.js
index 8efc3bec10926b65631a8b1c6acf603a4aca42d4..ca96a693932bb4594981cd11f8c6b138f1546bc3 100644
--- a/labs/bbb-webrtc-sfu/lib/mcs-core/lib/model/MediaSession.js
+++ b/labs/bbb-webrtc-sfu/lib/mcs-core/lib/model/MediaSession.js
@@ -12,7 +12,8 @@ const Freeswitch = require('../adapters/freeswitch/freeswitch');
 const config = require('config');
 const kurentoUrl = config.get('kurentoUrl');
 const Logger = require('../../../utils/Logger');
-const isError = require('../utils/util').isError;
+const { handleError } = require('../utils/util');
+const LOG_PREFIX = "[mcs-media-session]";
 
 module.exports = class MediaSession {
   constructor (
@@ -164,34 +165,7 @@ module.exports = class MediaSession {
   }
 
   _handleError (error) {
-    let { message, code, stack, data, details } = error;
-
-    if (code == null) {
-      ({ code, message } = C.ERROR.MEDIA_GENERIC_ERROR);
-    }
-    else {
-      ({ code, message } = error);
-    }
-
-    if (!isError(error)) {
-      error = new Error(message);
-    }
-
-    error.code = code;
-    error.message = message;
-    error.stack = stack
-
-    if (details) {
-      error.details = details;
-    }
-    else {
-      error.details = message;
-    }
-
-
-    Logger.trace("[mcs-media-session] SFU MediaSession received an error", error.code, error.message); Logger.trace(error.stack);
     this._status = C.STATUS.STOPPED;
-
-    return error;
+    return handleError(LOG_PREFIX, error);
   }
 }
diff --git a/labs/bbb-webrtc-sfu/lib/mcs-core/lib/model/Room.js b/labs/bbb-webrtc-sfu/lib/mcs-core/lib/model/Room.js
index 1b9eb77cbea7e652595f8d8ff023f6b997ad5b1c..935c6b37f6a8c15d943ce6b7284431802f6dcb21 100644
--- a/labs/bbb-webrtc-sfu/lib/mcs-core/lib/model/Room.js
+++ b/labs/bbb-webrtc-sfu/lib/mcs-core/lib/model/Room.js
@@ -17,14 +17,10 @@ module.exports = class Room {
   }
 
   setUser (user) {
-  if (typeof this._users[user.id] == 'undefined' ||
-        !this._users[user.id]) {
-      this._users[user.id] = {};
-    }
     this._users[user.id] = user;
   }
 
   destroyUser(userId) {
-    this._users[userId] = null;;
+    this._users[userId] = null;
   }
 }
diff --git a/labs/bbb-webrtc-sfu/lib/mcs-core/lib/model/User.js b/labs/bbb-webrtc-sfu/lib/mcs-core/lib/model/User.js
index 92d69583df05d72b46d513b5cb7b0911dda33ac4..bd5b993c9687e8928f83671eb32642f3798a32fb 100644
--- a/labs/bbb-webrtc-sfu/lib/mcs-core/lib/model/User.js
+++ b/labs/bbb-webrtc-sfu/lib/mcs-core/lib/model/User.js
@@ -8,8 +8,9 @@
 const rid = require('readable-id');
 const User = require('./User');
 const C = require('../constants/Constants.js');
-const isError = require('../utils/util').isError;
 const Logger = require('../../../utils/Logger');
+const { handleError } = require('../utils/util');
+const LOG_PREFIX = "[mcs-user]";
 
 module.exports = class User {
   constructor(roomId, type, userAgentString = C.STRING.ANONYMOUS) {
@@ -19,33 +20,6 @@ module.exports = class User {
   }
 
   _handleError (error) {
-    let { message, code, stack, data, details } = error;
-
-    if (code == null) {
-      ({ code, message } = C.ERROR.MEDIA_GENERIC_ERROR);
-    }
-    else {
-      ({ code, message } = error);
-    }
-
-    if (!isError(error)) {
-      error = new Error(message);
-    }
-
-    error.code = code;
-    error.message = message;
-    error.stack = stack
-
-    if (details) {
-      error.details = details;
-    }
-    else {
-      error.details = message;
-    }
-
-    Logger.trace("[User] SFU User received an error", error.code, error.message);
-    Logger.trace(error.stack);
-
-    return error;
+    return handleError(LOG_PREFIX, error);
   }
 }
diff --git a/labs/bbb-webrtc-sfu/lib/mcs-core/lib/utils/util.js b/labs/bbb-webrtc-sfu/lib/mcs-core/lib/utils/util.js
index 3d0806966da9a2e18ff270fae426321b7282824b..57316ebc71abdeae70a48078e86d8edcae1b95f1 100644
--- a/labs/bbb-webrtc-sfu/lib/mcs-core/lib/utils/util.js
+++ b/labs/bbb-webrtc-sfu/lib/mcs-core/lib/utils/util.js
@@ -5,7 +5,44 @@
  *
  */
 
-exports.isError = function (error) {
+const C = require('../constants/Constants');
+
+exports.isError = (error) => {
   return error && error.stack && error.message && typeof error.stack === 'string'
     && typeof error.message === 'string';
 }
+
+exports.handleError = (logPrefix, error) => {
+  let { message, code, stack, data, details } = error;
+
+  if (code && code >= C.ERROR.MIN_CODE && code <= C.ERROR.MAX_CODE) {
+    return error;
+  }
+
+  if (code == null) {
+    ({ code, message } = C.ERROR.MEDIA_GENERIC_ERROR);
+  }
+  else {
+    ({ code, message } = error);
+  }
+
+  if (!isError(error)) {
+    error = new Error(message);
+  }
+
+  error.code = code;
+  error.message = message;
+  error.stack = stack
+
+  if (details) {
+    error.details = details;
+  }
+  else {
+    error.details = message;
+  }
+
+  Logger.debug(logPrefix, "Handling error", error.code, error.message);
+  Logger.trace(logPrefix, error.stack);
+
+  return error;
+}
diff --git a/labs/bbb-webrtc-sfu/lib/utils/Utils.js b/labs/bbb-webrtc-sfu/lib/utils/Utils.js
index f8c93c637c2191587d7344c19a9674cd6629c282..9faed84b89a4294062ac29c4e0d6a8b8181c46f8 100644
--- a/labs/bbb-webrtc-sfu/lib/utils/Utils.js
+++ b/labs/bbb-webrtc-sfu/lib/utils/Utils.js
@@ -15,23 +15,3 @@ exports.hrTime = function () {
 
   return t[0]*1000 + parseInt(t[1]/1000000);
 }
-
-/*
- * isRecordedStream
- *
- * Returns the stream id if it's not a flash stream and is recorded
- */
-
-exports.isRecordedStream = function (stream) {
-  const flashStream = /^([A-z0-9]+)-([A-z0-9]+)-([A-z0-9+])(-recorded)?$/;
-  const recordedStream = /^([_A-z0-9]+)-recorded$/;
-
-  if (!stream.match(flashStream)) {
-    let res = stream.match(recordedStream);
-    if (res) {
-      return res[1];
-    }
-  }
-
-  return null;
-}
diff --git a/labs/bbb-webrtc-sfu/lib/video/video.js b/labs/bbb-webrtc-sfu/lib/video/video.js
index 033632e97eaed686f79247bbb706658538ed0cde..3881b1b9451a2e310bf95185307038c8a7bc9b9e 100644
--- a/labs/bbb-webrtc-sfu/lib/video/video.js
+++ b/labs/bbb-webrtc-sfu/lib/video/video.js
@@ -251,7 +251,7 @@ module.exports = class Video extends EventEmitter {
       return resolve(sdpAnswer);
     }
     catch (err) {
-      Logger.error("[video] MCS returned error => " + err);
+      Logger.error("[video] MCS returned error => ", err);
       return reject(err);
     }
     });