diff --git a/labs/bbb-webrtc-sfu/lib/audio/audio.js b/labs/bbb-webrtc-sfu/lib/audio/audio.js
index 3a6754b0b9f45498e7b892fce03c21b357bafc92..1f16dd399926cddb8148d75ba720545d186010b8 100644
--- a/labs/bbb-webrtc-sfu/lib/audio/audio.js
+++ b/labs/bbb-webrtc-sfu/lib/audio/audio.js
@@ -7,8 +7,10 @@ const MCSApi = require('../mcs-core/lib/media/MCSApiStub');
 const C = require('../bbb/messages/Constants');
 const Logger = require('../utils/Logger');
 const Messaging = require('../bbb/messages/Messaging');
+const BaseProvider = require('../base/BaseProvider');
+const LOG_PREFIX = "[audio]";
 
-module.exports = class Audio {
+module.exports = class Audio extends BaseProvider {
   constructor(_bbbGW, _id, voiceBridge) {
     this.mcs = new MCSApi();
     this.bbbGW = _bbbGW;
@@ -32,6 +34,7 @@ module.exports = class Audio {
         this.mcs.addIceCandidate(this.audioEndpoints[connectionId], _candidate);
       }
       catch (err)   {
+        this._handleError(LOG_PREFIX, err);
         Logger.error("[audio] ICE candidate could not be added to media controller.", err);
       }
     }
@@ -52,6 +55,7 @@ module.exports = class Audio {
         }
       }
       catch (err) {
+        this._handleError(LOG_PREFIX, err);
         Logger.error("[audio] ICE candidate could not be added to media controller.", err);
       }
     }
@@ -190,6 +194,7 @@ module.exports = class Audio {
       return callback(null, sdpAnswer);
     }
     catch (err) {
+      this._handleError(LOG_PREFIX, err);
       Logger.error("[audio] MCS returned error => " + err);
       return callback(err);
     }
@@ -217,6 +222,7 @@ module.exports = class Audio {
         return;
       }
       catch (err) {
+        this._handleError(LOG_PREFIX, err);
         Logger.error('[audio] MCS returned error when trying to unsubscribe', err);
         return;
       }
@@ -246,7 +252,7 @@ module.exports = class Audio {
       return Promise.resolve();
     }
     catch (err) {
-      // TODO error handling
+      this._handleError(LOG_PREFIX, err);
       return Promise.reject();
     }
   };
diff --git a/labs/bbb-webrtc-sfu/lib/base/BaseManager.js b/labs/bbb-webrtc-sfu/lib/base/BaseManager.js
index 5f83ad17c570cb9ffeff6bd3078aba7dab00c62e..6e3668e1f9f982fd0e0abb3bac8c8f1314968c1d 100644
--- a/labs/bbb-webrtc-sfu/lib/base/BaseManager.js
+++ b/labs/bbb-webrtc-sfu/lib/base/BaseManager.js
@@ -10,7 +10,6 @@
 const BigBlueButtonGW = require('../bbb/pubsub/bbb-gw');
 const C = require('../bbb/messages/Constants');
 const Logger = require('../utils/Logger');
-const isRecordedStream = require('../utils/Utils.js').isRecordedStream;
 
 module.exports = class BaseManager {
   constructor (connectionChannel, additionalChannels = [], logPrefix = C.BASE_MANAGER_PREFIX) {
diff --git a/labs/bbb-webrtc-sfu/lib/base/BaseProvider.js b/labs/bbb-webrtc-sfu/lib/base/BaseProvider.js
new file mode 100644
index 0000000000000000000000000000000000000000..16c63697de3c157e89edacf3c3351529b4bcba19
--- /dev/null
+++ b/labs/bbb-webrtc-sfu/lib/base/BaseProvider.js
@@ -0,0 +1,17 @@
+"use strict";
+
+const C = require('../bbb/messages/Constants');
+const Logger = require('../utils/Logger');
+const EventEmitter = require('events').EventEmitter;
+
+module.exports = class BaseProvider extends EventEmitter {
+  constructor () {
+    super();
+  }
+
+  _handleError (logPrefix, error) {
+    Logger.debug(logPrefix, "Handling error", error.code, error.message);
+    Logger.trace(logPrefix, error.stack);
+  }
+};
+
diff --git a/labs/bbb-webrtc-sfu/lib/screenshare/screenshare.js b/labs/bbb-webrtc-sfu/lib/screenshare/screenshare.js
index 08ea257eba8e7de8a10a09f26cc039dc7933c3bf..19f78e1713718d4dd5df86063dfbf326f871564c 100644
--- a/labs/bbb-webrtc-sfu/lib/screenshare/screenshare.js
+++ b/labs/bbb-webrtc-sfu/lib/screenshare/screenshare.js
@@ -14,22 +14,23 @@ const moment = require('moment');
 const h264_sdp = require('../h264-sdp');
 const now = moment();
 const MCSApi = require('../mcs-core/lib/media/MCSApiStub');
+const Logger = require('../utils/Logger');
+const BaseProvider = require('../base/BaseProvider');
 const config = require('config');
 const kurentoIp = config.get('kurentoIp');
 const localIpAddress = config.get('localIpAddress');
 const FORCE_H264 = config.get('screenshare-force-h264');
 const PREFERRED_H264_PROFILE = config.get('screenshare-preferred-h264-profile');
-const EventEmitter = require('events').EventEmitter;
-const Logger = require('../utils/Logger');
 const SHOULD_RECORD = config.get('recordScreenSharing');
 const KEYFRAME_INTERVAL = config.get('screenshareKeyframeInterval');
+const LOG_PREFIX = "[screenshare]";
 
 // Global MCS endpoints mapping. These hashes maps IDs generated by the mcs-core
 // lib to the ones generate in the ScreenshareManager
 var sharedScreens = {};
 var rtpEndpoints = {};
 
-module.exports = class Screenshare extends EventEmitter {
+module.exports = class Screenshare extends BaseProvider {
   constructor(id, bbbgw, voiceBridge, caller = 'caller', vh, vw, meetingId) {
     super();
     this.mcs = new MCSApi();
@@ -69,6 +70,7 @@ module.exports = class Screenshare extends EventEmitter {
             await this.flushCandidatesQueue(this._presenterEndpoint, this._presenterCandidatesQueue);
             await this.mcs.addIceCandidate(this._presenterEndpoint, candidate);
           } catch (err) {
+            this._handleError(LOG_PREFIX, err);
             Logger.error("[screenshare] ICE candidate could not be added to media controller.", err);
           }
         } else {
@@ -82,6 +84,7 @@ module.exports = class Screenshare extends EventEmitter {
             await this.flushCandidatesQueue(endpoint, this._viewersCandidatesQueue[callerName]);
             await this.mcs.addIceCandidate(endpoint, candidate);
           } catch (err) {
+            this._handleError(LOG_PREFIX, err);
             Logger.error("[screenshare] Viewer ICE candidate could not be added to media controller.", err);
           }
         } else {
@@ -107,6 +110,7 @@ module.exports = class Screenshare extends EventEmitter {
           queue = [];
           resolve();
         }).catch((err) => {
+          this._handleError(LOG_PREFIX, err);
           Logger.error("[screenshare] ICE candidate could not be added to media controller.", err);
           reject();
         });
@@ -172,6 +176,7 @@ module.exports = class Screenshare extends EventEmitter {
   serverState (event) {
     switch (event && event.eventTag) {
       case C.MEDIA_SERVER_OFFLINE:
+        this._handleError(LOG_PREFIX, err);
         Logger.error("[screenshare] Screenshare provider received MEDIA_SERVER_OFFLINE event");
         this.emit(C.MEDIA_SERVER_OFFLINE, event);
         break;
@@ -193,6 +198,7 @@ module.exports = class Screenshare extends EventEmitter {
         this.sendStartShareEvent();
         resolve(this.recording);
       } catch (err) {
+        this._handleError(LOG_PREFIX, err);
         Logger.error("[screenshare] Error on start recording with message", err);
         reject(err);
       }
@@ -239,6 +245,7 @@ module.exports = class Screenshare extends EventEmitter {
 
         }
         catch (error) {
+          this._handleError(LOG_PREFIX, error);
           Logger.error("[screenshare] MCS Join returned error =>", error);
           return reject (error);
         }
@@ -250,6 +257,7 @@ module.exports = class Screenshare extends EventEmitter {
           return resolve(sdpAnswer);
         }
         catch (err) {
+          this._handleError(LOG_PREFIX, err);
           return reject(err);
         }
       }
@@ -260,6 +268,7 @@ module.exports = class Screenshare extends EventEmitter {
           return resolve(sdpAnswer);
         }
         catch (err) {
+          this._handleError(LOG_PREFIX, err);
           return reject(err);
         }
       }
@@ -301,6 +310,7 @@ module.exports = class Screenshare extends EventEmitter {
         return resolve(presenterSdpAnswer);
       }
       catch (err) {
+        this._handleError(LOG_PREFIX, err);
         Logger.error("[screenshare] MCS publish returned error =>", err);
         return reject(err);
       }
@@ -332,6 +342,7 @@ module.exports = class Screenshare extends EventEmitter {
         return resolve(sdpAnswer);
       }
       catch (err) {
+        this._handleError(LOG_PREFIX, err);
         Logger.error("[screenshare] MCS publish returned error =>", err);
         return reject(err);
       }
@@ -357,6 +368,7 @@ module.exports = class Screenshare extends EventEmitter {
         return resolve();
       }
       catch (err) {
+        this._handleError(LOG_PREFIX, err);
         Logger.error('[screenshare] MCS returned an error when trying to leave =>', err);
         return resolve();
       }
@@ -397,6 +409,7 @@ module.exports = class Screenshare extends EventEmitter {
         }
       }
       catch (err) {
+        this._handleError(LOG_PREFIX, err);
         Logger.error(err);
         resolve();
       }
@@ -479,6 +492,7 @@ module.exports = class Screenshare extends EventEmitter {
         return;
       }
       catch (err) {
+        this._handleError(LOG_PREFIX, err);
         Logger.error('[screenshare] MCS returned error when trying to unsubscribe', err);
         return;
       }
diff --git a/labs/bbb-webrtc-sfu/lib/video/video.js b/labs/bbb-webrtc-sfu/lib/video/video.js
index 3881b1b9451a2e310bf95185307038c8a7bc9b9e..9c877cf577679dd4ee3ab57b07c14cebc8c3b559 100644
--- a/labs/bbb-webrtc-sfu/lib/video/video.js
+++ b/labs/bbb-webrtc-sfu/lib/video/video.js
@@ -7,13 +7,14 @@ const C = require('../bbb/messages/Constants');
 const Logger = require('../utils/Logger');
 const Messaging = require('../bbb/messages/Messaging');
 const h264_sdp = require('../h264-sdp');
+const BaseProvider = require('../base/BaseProvider');
 const FORCE_H264 = config.get('webcam-force-h264');
-const EventEmitter = require('events').EventEmitter;
 const SHOULD_RECORD = config.get('recordWebcams');
+const LOG_PREFIX = "[video]";
 
 var sharedWebcams = {};
 
-module.exports = class Video extends EventEmitter {
+module.exports = class Video extends BaseProvider {
   constructor(_bbbGW, _meetingId, _id, _shared, _connectionId) {
     super();
     this.mcs = new MCSApi();
@@ -53,6 +54,7 @@ module.exports = class Video extends EventEmitter {
         await this.mcs.addIceCandidate(this.mediaId, _candidate);
       }
       catch (err)   {
+        this._handleError(LOG_PREFIX, err);
         Logger.error("[video] ICE candidate could not be added to media controller.", err);
       }
     }
@@ -72,6 +74,7 @@ module.exports = class Video extends EventEmitter {
           this.candidatesQueue = [];
           resolve();
         }).catch((err) => {
+          this._handleError(LOG_PREFIX, err);
           Logger.error("[video] ICE candidate could not be added to media controller.", err);
           reject();
         });
@@ -207,6 +210,7 @@ module.exports = class Video extends EventEmitter {
         resolve(this.recording);
       }
       catch (err) {
+        this._handleError(LOG_PREFIX, err);
         Logger.error("[video] Error on start recording with message", err);
         reject(err);
       }
@@ -251,6 +255,7 @@ module.exports = class Video extends EventEmitter {
       return resolve(sdpAnswer);
     }
     catch (err) {
+      this._handleError(LOG_PREFIX, err);
       Logger.error("[video] MCS returned error => ", err);
       return reject(err);
     }
@@ -273,6 +278,7 @@ module.exports = class Video extends EventEmitter {
         }
       }
       catch (err) {
+        this._handleError(LOG_PREFIX, err);
         return reject(err);
       }
     });
@@ -299,6 +305,7 @@ module.exports = class Video extends EventEmitter {
       }
     }
     catch (err) {
+      this._handleError(LOG_PREFIX, err);
       Logger.error("[video] MCS returned error on pause procedure with message", err);
     }
   }
@@ -338,7 +345,7 @@ module.exports = class Video extends EventEmitter {
         resolve();
       }
       catch (err) {
-        // TODO error handling
+        this._handleError(LOG_PREFIX, err);
         reject();
       }
     });