diff --git a/client/startup/defaultRoomTypes.coffee b/client/startup/defaultRoomTypes.coffee
index b6abf2bede258acdc6ecc9f6efb1337c1aca4e44..9e8305acc1593d67d26a226c6fb46e938668e140 100644
--- a/client/startup/defaultRoomTypes.coffee
+++ b/client/startup/defaultRoomTypes.coffee
@@ -13,6 +13,13 @@ RocketChat.roomTypes.add 'c', 10,
 			RocketChat.TabBar.showGroup 'channel'
 		link: (sub) ->
 			return { name: sub.name }
+	findRoom: (identifier) ->
+		query =
+			t: 'c'
+			name: identifier
+		return ChatRoom.findOne(query)
+	roomName: (roomData) ->
+		return roomData.name
 	condition: ->
 		return RocketChat.authz.hasAllPermission 'view-c-room'
 
@@ -27,6 +34,14 @@ RocketChat.roomTypes.add 'd', 20,
 			RocketChat.TabBar.showGroup 'directmessage'
 		link: (sub) ->
 			return { username: sub.name }
+	findRoom: (identifier, user) ->
+		query =
+			t: 'd'
+			usernames:
+				$all: [identifier, user.username]
+		return ChatRoom.findOne(query)
+	roomName: (roomData) ->
+		return ChatSubscription.findOne({ rid: roomData._id }, { fields: { name: 1 } })?.name
 	condition: ->
 		return RocketChat.authz.hasAllPermission 'view-d-room'
 
@@ -41,5 +56,12 @@ RocketChat.roomTypes.add 'p', 30,
 			RocketChat.TabBar.showGroup 'privategroup'
 		link: (sub) ->
 			return { name: sub.name }
+	findRoom: (identifier) ->
+		query =
+			t: 'p'
+			name: identifier
+		return ChatRoom.findOne(query)
+	roomName: (roomData) ->
+		return roomData.name
 	condition: ->
 		return RocketChat.authz.hasAllPermission 'view-p-room'
diff --git a/packages/rocketchat-lib/client/lib/openRoom.coffee b/packages/rocketchat-lib/client/lib/openRoom.coffee
index 6f2237b0625160b03876507762d7fbefc7f98681..fc432d21e74760f53de88d23deaf9bb1a2ff4ca5 100644
--- a/packages/rocketchat-lib/client/lib/openRoom.coffee
+++ b/packages/rocketchat-lib/client/lib/openRoom.coffee
@@ -9,23 +9,14 @@ currentTracker = undefined
 				BlazeLayout.render 'main', {center: 'loading'}
 				return
 
-			username = Meteor.user()?.username
-			unless username
+			user = Meteor.user()
+			unless user?.username
 				return
 
 			currentTracker = undefined
 			c.stop()
 
-			query =
-				t: type
-				name: name
-
-			if type is 'd'
-				delete query.name
-				query.usernames =
-					$all: [name, username]
-
-			room = ChatRoom.findOne(query)
+			room = RocketChat.roomTypes.findRoom(type, name, user)
 			if not room?
 				if type is 'd'
 					Meteor.call 'createDirectMessage', name, (err) ->
diff --git a/packages/rocketchat-lib/client/lib/roomTypes.coffee b/packages/rocketchat-lib/client/lib/roomTypes.coffee
index ffc9ba6ff355692111be9690d1df08429f528328..dd76247c66c9e59eb22eda5b86ec9acf4cca996e 100644
--- a/packages/rocketchat-lib/client/lib/roomTypes.coffee
+++ b/packages/rocketchat-lib/client/lib/roomTypes.coffee
@@ -60,17 +60,26 @@ RocketChat.roomTypes = new class
 	getIcon = (roomType) ->
 		return roomTypes[roomType]?.icon
 
+	getRoomName = (roomType, roomData) ->
+		return roomTypes[roomType]?.roomName roomData
+
 	getIdentifiers = (except) ->
 		except = [].concat except
 		list = _.reject roomTypesOrder, (t) -> return except.indexOf(t.identifier) isnt -1
 		return _.map list, (t) -> return t.identifier
 
+	findRoom = (roomType, identifier, user) ->
+		return roomTypes[roomType]?.findRoom identifier, user
+
 	# addType: addType
 	getTypes: getAllTypes
 	getIdentifiers: getIdentifiers
 
+	findRoom: findRoom
+
 	# setIcon: setIcon
 	getIcon: getIcon
+	getRoomName: getRoomName
 
 	# setRoute: setRoute
 	getRouteLink: getRouteLink
diff --git a/packages/rocketchat-lib/i18n/en.i18n.json b/packages/rocketchat-lib/i18n/en.i18n.json
index 6c1ea61082597857bfe98e191f5b26103f17aaf9..4846fd599260d87ee2449c5068f5d2409a871bd2 100644
--- a/packages/rocketchat-lib/i18n/en.i18n.json
+++ b/packages/rocketchat-lib/i18n/en.i18n.json
@@ -573,6 +573,7 @@
   "Livechat_enabled" : "Livechat enabled",
   "Livechat_guest_count" : "Guest Counter",
   "Livechat_managers" : "Livechat managers",
+  "Livechat_Room_Count" : "Livechat Room Count",
   "Livechat_title" : "Livechat Title",
   "Livechat_title_color" : "Livechat Title Background Color",
   "Livechat_Users" : "Livechat Users",
diff --git a/packages/rocketchat-livechat/app/client/lib/_visitor.coffee b/packages/rocketchat-livechat/app/client/lib/_visitor.coffee
index 9bb1e6ca7d1002ec2649bd493c42149a8fb7754f..c758998ea0871ee3d18dafb633fbdefb63a6f620 100644
--- a/packages/rocketchat-livechat/app/client/lib/_visitor.coffee
+++ b/packages/rocketchat-livechat/app/client/lib/_visitor.coffee
@@ -1,3 +1,5 @@
+msgStream = new Meteor.Streamer 'room-messages'
+
 @visitor = new class
 	token = new ReactiveVar null
 	room = new ReactiveVar null
@@ -30,9 +32,20 @@
 		room.set(rid)
 		return roomToSubscribe.set(rid)
 
+	subscribeToRoom = (roomId) ->
+		msgStream.on roomId, (msg) ->
+			if msg.t is 'command'
+				if msg.msg is 'survey'
+					unless $('body #survey').length
+						Blaze.render(Template.survey, $('body').get(0))
+			else
+				ChatMessage.upsert { _id: msg._id }, msg
+
 	register: register
 	getToken: getToken
 	setRoom: setRoom
 	getRoom: getRoom
 	setRoomToSubscribe: setRoomToSubscribe
 	getRoomToSubscribe: getRoomToSubscribe
+
+	subscribeToRoom: subscribeToRoom
diff --git a/packages/rocketchat-livechat/app/client/lib/chatMessages.coffee b/packages/rocketchat-livechat/app/client/lib/chatMessages.coffee
index 9ca165e660d7e251671d64cab5fb64d15545d799..e46e519bc440d34b3b27462223e7d0c7b2fe8f12 100644
--- a/packages/rocketchat-livechat/app/client/lib/chatMessages.coffee
+++ b/packages/rocketchat-livechat/app/client/lib/chatMessages.coffee
@@ -106,7 +106,8 @@ class @ChatMessages
 						sendMessage (message) ->
 							ChatMessage.update message._id, _.omit(message, '_id')
 							if message.rid?
-								visitor.setRoomToSubscribe(message.rid)
+								visitor.subscribeToRoom(message.rid)
+								visitor.setRoom(message.rid)
 			else
 				sendMessage()
 
diff --git a/packages/rocketchat-livechat/app/client/lib/collections.coffee b/packages/rocketchat-livechat/app/client/lib/collections.coffee
index c86ad59f9dde87d990bf26b7e8aa5ef400b6fc53..12be8dafa5607a1dae5ee8c01368167de9fdaa97 100644
--- a/packages/rocketchat-livechat/app/client/lib/collections.coffee
+++ b/packages/rocketchat-livechat/app/client/lib/collections.coffee
@@ -1,5 +1,2 @@
 @ChatMessage = new Meteor.Collection null
-@ChatRoom = new Meteor.Collection 'rocketchat_room'
-@Settings = new Meteor.Collection 'rocketchat_settings'
-@Trigger = new Meteor.Collection 'rocketchat_livechat_trigger'
-@Department = new Meteor.Collection 'rocketchat_livechat_department'
+@Department = new Meteor.Collection null
diff --git a/packages/rocketchat-livechat/app/client/lib/fromApp/Notifications.coffee b/packages/rocketchat-livechat/app/client/lib/fromApp/Notifications.coffee
index 56a4585af5dffad8c65e0b998460696dc734d5e9..9fd588378e23cb1f64d947a378ad812c7a79f4c1 100644
--- a/packages/rocketchat-livechat/app/client/lib/fromApp/Notifications.coffee
+++ b/packages/rocketchat-livechat/app/client/lib/fromApp/Notifications.coffee
@@ -22,17 +22,6 @@
 		args.unshift "#{userId}/#{eventName}"
 		@streamUser.emit.apply @streamUser, args
 
-	notifyUsersOfRoom: (room, eventName, args...) ->
-		console.log "RocketChat.Notifications: notifyUsersOfRoom", arguments if @debug is true
-
-		onlineUsers = RoomManager.onlineUsers.get()
-		room = ChatRoom.findOne(room)
-		for username in room?.usernames or []
-			if onlineUsers[username]?
-				argsToSend = ["#{onlineUsers[username]._id}/#{eventName}"].concat args
-				@streamUser.emit.apply @streamUser, argsToSend
-
-
 	onAll: (eventName, callback) ->
 		@streamAll.on eventName, callback
 
diff --git a/packages/rocketchat-livechat/app/client/lib/triggers.js b/packages/rocketchat-livechat/app/client/lib/triggers.js
index 1ea4fcf9876c426bc18b0c96c596b7f765c859ba..0e7eccde0b07b15e74a0a10270a9cf76e64a9f63 100644
--- a/packages/rocketchat-livechat/app/client/lib/triggers.js
+++ b/packages/rocketchat-livechat/app/client/lib/triggers.js
@@ -5,7 +5,7 @@ this.Triggers = (function() {
 
 	var fire = function(actions) {
 		if (Meteor.userId()) {
-			console.log('already logged user - does nothing');
+			// console.log('already logged user - does nothing');
 			return;
 		}
 		actions.forEach(function(action) {
@@ -57,23 +57,25 @@ this.Triggers = (function() {
 		});
 	};
 
+	var setTriggers = function(newTriggers) {
+		triggers = newTriggers;
+	};
+
 	var init = function() {
 		initiated = true;
-		Tracker.autorun(function() {
-			triggers = Trigger.find().fetch();
 
-			if (requests.length > 0 && triggers.length > 0) {
-				requests.forEach(function(request) {
-					processRequest(request);
-				});
+		if (requests.length > 0 && triggers.length > 0) {
+			requests.forEach(function(request) {
+				processRequest(request);
+			});
 
-				requests = [];
-			}
-		});
+			requests = [];
+		}
 	};
 
 	return {
 		init: init,
-		processRequest: processRequest
+		processRequest: processRequest,
+		setTriggers: setTriggers
 	};
 }());
diff --git a/packages/rocketchat-livechat/app/client/startup/room.coffee b/packages/rocketchat-livechat/app/client/startup/room.coffee
deleted file mode 100644
index cc1e9bfddb39858c06c0e19f7164385c13eceef1..0000000000000000000000000000000000000000
--- a/packages/rocketchat-livechat/app/client/startup/room.coffee
+++ /dev/null
@@ -1,10 +0,0 @@
-msgStream = new Meteor.Streamer 'room-messages'
-Tracker.autorun ->
-	if visitor.getRoomToSubscribe()?
-		msgStream.on visitor.getRoomToSubscribe(), (msg) ->
-			if msg.t is 'command'
-				if msg.msg is 'survey'
-					unless $('body #survey').length
-						Blaze.render(Template.survey, $('body').get(0))
-			else
-				ChatMessage.upsert { _id: msg._id }, msg
diff --git a/packages/rocketchat-livechat/app/client/startup/triggers.js b/packages/rocketchat-livechat/app/client/startup/triggers.js
deleted file mode 100644
index bb62aee128297bf34f875344e28b712475e07845..0000000000000000000000000000000000000000
--- a/packages/rocketchat-livechat/app/client/startup/triggers.js
+++ /dev/null
@@ -1,5 +0,0 @@
-Meteor.startup(function() {
-	Meteor.subscribe('livechat:trigger', function() {
-		Triggers.init();
-	});
-});
diff --git a/packages/rocketchat-livechat/app/client/views/livechatWindow.js b/packages/rocketchat-livechat/app/client/views/livechatWindow.js
index 3ee2fb5c661b2f441be8d1eddbf43979ddfbf32b..4c397091e51bb7f87f6771ee0c1be264b687b3b8 100644
--- a/packages/rocketchat-livechat/app/client/views/livechatWindow.js
+++ b/packages/rocketchat-livechat/app/client/views/livechatWindow.js
@@ -1,17 +1,10 @@
+/* globals Department */
 Template.livechatWindow.helpers({
 	title() {
-		var ref;
-		if (!Template.instance().subscriptionsReady()) {
-			return '';
-		}
-		return ((ref = Settings.findOne('Livechat_title')) != null ? ref.value : void 0) || 'Rocket.Chat';
+		return Template.instance().title.get();
 	},
 	color() {
-		var ref;
-		if (!Template.instance().subscriptionsReady()) {
-			return 'transparent';
-		}
-		return ((ref = Settings.findOne('Livechat_title_color')) != null ? ref.value : void 0) || '#C1272D';
+		return Template.instance().color.get();
 	},
 	popoutActive() {
 		return FlowRouter.getQueryParam('mode') === 'popout';
@@ -20,14 +13,13 @@ Template.livechatWindow.helpers({
 		if (Session.get('triggered') || Meteor.userId()) {
 			return false;
 		}
-		var form = Settings.findOne('Livechat_registration_form');
-		return form.value;
+		return Template.instance().registrationForm.get();
 	},
 	livechatStartedEnabled() {
-		return Template.instance().startedEnabled.get() !== null;
+		return Template.instance().enabled.get() !== null;
 	},
 	livechatEnabled() {
-		return Template.instance().startedEnabled.get();
+		return Template.instance().enabled.get();
 	}
 });
 
@@ -42,22 +34,37 @@ Template.livechatWindow.events({
 });
 
 Template.livechatWindow.onCreated(function() {
-	this.startedEnabled = new ReactiveVar(null);
+	this.enabled = new ReactiveVar(null);
 
-	this.subscribe('settings', ['Livechat_title', 'Livechat_title_color', 'Livechat_enabled', 'Livechat_registration_form']);
+	this.title = new ReactiveVar('Rocket.Chat');
+	this.color = new ReactiveVar('#C1272D');
+	this.registrationForm = new ReactiveVar(true);
 
-	var initialCheck = true;
+	// get all needed live chat info for the user
+	Meteor.call('livechat:getInitialData', visitor.getToken(), (err, result) => {
+		if (err) {
+			console.error(err);
+		} else {
+			if (!result.enabled) {
+				return parentCall('removeWidget');
+			}
+			this.enabled.set(result.enabled);
+			this.title.set(result.title);
+			this.color.set(result.color);
+			this.registrationForm.set(result.registrationForm);
 
-	this.autorun(() => {
-		if (this.subscriptionsReady()) {
-			var enabled = Settings.findOne('Livechat_enabled');
-			if (enabled !== undefined) {
-				if (!enabled.value && initialCheck) {
-					parentCall('removeWidget');
-				}
-				initialCheck = false;
-				this.startedEnabled.set(enabled.value);
+			if (result.room) {
+				RoomHistoryManager.getMoreIfIsEmpty(result.room._id);
+				visitor.subscribeToRoom(result.room._id);
+				visitor.setRoom(result.room._id);
 			}
+
+			Triggers.setTriggers(result.triggers);
+			Triggers.init();
+
+			result.departments.forEach((department) => {
+				Department.insert(department);
+			});
 		}
 	});
 });
diff --git a/packages/rocketchat-livechat/app/client/views/messages.js b/packages/rocketchat-livechat/app/client/views/messages.js
index 3098953b8c7bfd0a587f3cc766e5643e7bcec2b2..e9d0312cc02c2bbc7191851938d6117e7fcb704c 100644
--- a/packages/rocketchat-livechat/app/client/views/messages.js
+++ b/packages/rocketchat-livechat/app/client/views/messages.js
@@ -41,16 +41,7 @@ Template.messages.events({
 Template.messages.onCreated(function() {
 	var self;
 	self = this;
-	self.autorun(function() {
-		self.subscribe('livechat:visitorRoom', visitor.getToken(), function() {
-			var room;
-			room = ChatRoom.findOne();
-			if (room != null) {
-				visitor.setRoomToSubscribe(room._id);
-				RoomHistoryManager.getMoreIfIsEmpty(room._id);
-			}
-		});
-	});
+
 	self.atBottom = true;
 
 	self.updateMessageInputHeight = function(input) {
diff --git a/packages/rocketchat-livechat/app/client/views/register.js b/packages/rocketchat-livechat/app/client/views/register.js
index b95bb8549766f617a265bfce384fb9507b66dd72..fea2092edc4d4f051c20ec78adbe65914349713b 100644
--- a/packages/rocketchat-livechat/app/client/views/register.js
+++ b/packages/rocketchat-livechat/app/client/views/register.js
@@ -54,8 +54,6 @@ Template.register.events({
 });
 
 Template.register.onCreated(function() {
-	this.subscribe('livechat:availableDepartments');
-
 	this.error = new ReactiveVar();
 	this.showError = (msg) => {
 		$('.error').addClass('show');
diff --git a/packages/rocketchat-livechat/client/ui.js b/packages/rocketchat-livechat/client/ui.js
index f23113ac8d30b37f8bf6a7fd313660d68717b4c0..843dfffafc12f79213beddd1e478976b37bb66b0 100644
--- a/packages/rocketchat-livechat/client/ui.js
+++ b/packages/rocketchat-livechat/client/ui.js
@@ -5,17 +5,26 @@ RocketChat.roomTypes.add('l', 5, {
 	icon: 'icon-chat-empty',
 	route: {
 		name: 'live',
-		path: '/live/:name',
-		action: (params/*, queryParams*/) => {
-			openRoom('l', params.name);
+		path: '/live/:code(\\d+)',
+		action(params/*, queryParams*/) {
+			openRoom('l', params.code);
 			RocketChat.TabBar.showGroup('livechat', 'search');
 		},
-		link: (sub) => {
+		link(sub) {
 			return {
-				name: sub.name
+				code: sub.code
 			};
 		}
 	},
+
+	findRoom(identifier) {
+		return ChatRoom.findOne({ code: parseInt(identifier) });
+	},
+
+	roomName(roomData) {
+		return roomData.name;
+	},
+
 	condition: () => {
 		return RocketChat.settings.get('Livechat_enabled') && RocketChat.authz.hasAllPermission('view-l-room');
 	}
diff --git a/packages/rocketchat-livechat/config.js b/packages/rocketchat-livechat/config.js
index 36fdd74384b534e76ad041a0c93de92a51c6213f..d717b58023c3cace137ba5e41be72f2fb1c6dd73 100644
--- a/packages/rocketchat-livechat/config.js
+++ b/packages/rocketchat-livechat/config.js
@@ -6,6 +6,11 @@ Meteor.startup(function() {
 	RocketChat.settings.add('Livechat_registration_form', true, { type: 'boolean', group: 'Livechat', public: true, i18nLabel: 'Show_preregistration_form' });
 	RocketChat.settings.add('Livechat_guest_count', 1, { type: 'int', group: 'Livechat' });
 
+	RocketChat.settings.add('Livechat_Room_Count', 1, {
+		type: 'int',
+		group: 'Livechat'
+	});
+
 	RocketChat.settings.add('Livechat_Knowledge_Enabled', false, {
 		type: 'boolean',
 		group: 'Livechat',
diff --git a/packages/rocketchat-livechat/package.js b/packages/rocketchat-livechat/package.js
index 7f9d5806643e5e5a1bbffb7e1737f1d47c5824e1..f871ca392f428b50a343bbf010a2adb5e6856446 100644
--- a/packages/rocketchat-livechat/package.js
+++ b/packages/rocketchat-livechat/package.js
@@ -99,6 +99,7 @@ Package.onUse(function(api) {
 	api.addFiles('server/methods/addManager.js', 'server');
 	api.addFiles('server/methods/changeLivechatStatus.js', 'server');
 	api.addFiles('server/methods/getCustomFields.js', 'server');
+	api.addFiles('server/methods/getInitialData.js', 'server');
 	api.addFiles('server/methods/pageVisited.js', 'server');
 	api.addFiles('server/methods/registerGuest.js', 'server');
 	api.addFiles('server/methods/removeAgent.js', 'server');
@@ -124,6 +125,7 @@ Package.onUse(function(api) {
 	api.addFiles('server/models/LivechatDepartmentAgents.js', 'server');
 	api.addFiles('server/models/LivechatPageVisited.js', 'server');
 	api.addFiles('server/models/LivechatTrigger.js', 'server');
+	api.addFiles('server/models/indexes.js', 'server');
 
 	// server lib
 	api.addFiles('server/lib/Livechat.js', 'server');
@@ -131,7 +133,6 @@ Package.onUse(function(api) {
 	api.addFiles('server/externalMessageHook.js', 'server');
 
 	// publications
-	api.addFiles('server/publications/availableDepartments.js', 'server');
 	api.addFiles('server/publications/customFields.js', 'server');
 	api.addFiles('server/publications/departmentAgents.js', 'server');
 	api.addFiles('server/publications/externalMessages.js', 'server');
@@ -139,10 +140,8 @@ Package.onUse(function(api) {
 	api.addFiles('server/publications/livechatDepartments.js', 'server');
 	api.addFiles('server/publications/livechatManagers.js', 'server');
 	api.addFiles('server/publications/livechatRooms.js', 'server');
-	api.addFiles('server/publications/trigger.js', 'server');
 	api.addFiles('server/publications/visitorInfo.js', 'server');
 	api.addFiles('server/publications/visitorPageVisited.js', 'server');
-	api.addFiles('server/publications/visitorRoom.js', 'server');
 
 	// api
 	api.addFiles('server/api.js', 'server');
diff --git a/packages/rocketchat-livechat/server/lib/Livechat.js b/packages/rocketchat-livechat/server/lib/Livechat.js
index 8c9726854e4e9f26eed1b1a25b9148e67a816548..54902e579e1d185097fd9ab504da96533ab8c2ff 100644
--- a/packages/rocketchat-livechat/server/lib/Livechat.js
+++ b/packages/rocketchat-livechat/server/lib/Livechat.js
@@ -24,11 +24,15 @@ RocketChat.Livechat = {
 			if (!agent) {
 				throw new Meteor.Error('no-agent-online', 'Sorry, no online agents');
 			}
-			let roomData = _.extend({
+
+			const roomCode = RocketChat.models.Rooms.getNextLivechatRoomCode();
+
+			room = _.extend({
 				_id: message.rid,
 				name: guest.username,
 				msgs: 1,
 				lm: new Date(),
+				code: roomCode,
 				usernames: [agent.username, guest.username],
 				t: 'l',
 				ts: new Date(),
@@ -43,6 +47,7 @@ RocketChat.Livechat = {
 				open: true,
 				unread: 1,
 				answered: false,
+				code: roomCode,
 				u: {
 					_id: agent.agentId,
 					username: agent.username
@@ -53,10 +58,11 @@ RocketChat.Livechat = {
 				emailNotifications: 'all'
 			};
 
-			RocketChat.models.Rooms.insert(roomData);
+			RocketChat.models.Rooms.insert(room);
 			RocketChat.models.Subscriptions.insert(subscriptionData);
+		} else {
+			room = Meteor.call('canAccessRoom', message.rid, guest._id);
 		}
-		room = Meteor.call('canAccessRoom', message.rid, guest._id);
 		if (!room) {
 			throw new Meteor.Error('cannot-acess-room');
 		}
diff --git a/packages/rocketchat-livechat/server/methods/getInitialData.js b/packages/rocketchat-livechat/server/methods/getInitialData.js
new file mode 100644
index 0000000000000000000000000000000000000000..d0ee953fffb2bf76c1999cb993d4743c0b23ab6c
--- /dev/null
+++ b/packages/rocketchat-livechat/server/methods/getInitialData.js
@@ -0,0 +1,55 @@
+Meteor.methods({
+	'livechat:getInitialData'(visitorToken) {
+		var info = {
+			enabled: null,
+			title: null,
+			color: null,
+			registrationForm: null,
+			room: null,
+			triggers: [],
+			departments: []
+		};
+
+		const room = RocketChat.models.Rooms.findByVisitorToken(visitorToken, {
+			fields: {
+				name: 1,
+				t: 1,
+				cl: 1,
+				u: 1,
+				usernames: 1,
+				v: 1
+			}
+		}).fetch();
+
+		if (room && room.length > 0) {
+			info.room = room[0];
+		}
+
+		RocketChat.models.Settings.findNotHiddenPublic([
+			'Livechat_title',
+			'Livechat_title_color',
+			'Livechat_enabled',
+			'Livechat_registration_form'
+		]).forEach((setting) => {
+			if (setting._id === 'Livechat_title') {
+				info.title = setting.value;
+			} else if (setting._id === 'Livechat_title_color') {
+				info.color = setting.value;
+			} else if (setting._id === 'Livechat_enabled') {
+				info.enabled = setting.value;
+			} else if (setting._id === 'Livechat_registration_form') {
+				info.registrationForm = setting.value;
+			}
+		});
+
+		RocketChat.models.LivechatTrigger.find().forEach((trigger) => {
+			info.triggers.push(trigger);
+		});
+
+		RocketChat.models.LivechatDepartment.findEnabledWithAgents().forEach((department) => {
+			info.departments.push(department);
+		});
+
+		return info;
+	}
+});
diff --git a/packages/rocketchat-livechat/server/models/Rooms.js b/packages/rocketchat-livechat/server/models/Rooms.js
index 4aaf199eb2ecb09a5c79b6f083235641789b2817..cb11ec19d59a64f9ad88880a49744316aab24cbf 100644
--- a/packages/rocketchat-livechat/server/models/Rooms.js
+++ b/packages/rocketchat-livechat/server/models/Rooms.js
@@ -37,3 +37,41 @@ RocketChat.models.Rooms.findLivechat = function(offset = 0, limit = 20) {
 
 	return this.find(query, { sort: { ts: - 1 }, offset: offset, limit: limit });
 };
+
+RocketChat.models.Rooms.findLivechatByCode = function(code, fields) {
+	const query = {
+		t: 'l',
+		code: parseInt(code)
+	};
+
+	let options = {};
+
+	if (fields) {
+		options.fields = fields;
+	}
+
+	return this.find(query, options);
+};
+
+/**
+ * Get the next visitor name
+ * @return {string} The next visitor name
+ */
+RocketChat.models.Rooms.getNextLivechatRoomCode = function() {
+	const settingsRaw = RocketChat.models.Settings.model.rawCollection();
+	const findAndModify = Meteor.wrapAsync(settingsRaw.findAndModify, settingsRaw);
+
+	const query = {
+		_id: 'Livechat_Room_Count'
+	};
+
+	const update = {
+		$inc: {
+			value: 1
+		}
+	};
+
+	const livechatCount = findAndModify(query, null, update);
+
+	return livechatCount.value;
+};
diff --git a/packages/rocketchat-livechat/server/models/indexes.js b/packages/rocketchat-livechat/server/models/indexes.js
new file mode 100644
index 0000000000000000000000000000000000000000..c40e3bf6b3065db4b19de4821a878d24bc28ec4f
--- /dev/null
+++ b/packages/rocketchat-livechat/server/models/indexes.js
@@ -0,0 +1,3 @@
+Meteor.startup(function() {
+	RocketChat.models.Rooms.tryEnsureIndex({ code: 1 });
+});
diff --git a/packages/rocketchat-livechat/server/publications/availableDepartments.js b/packages/rocketchat-livechat/server/publications/availableDepartments.js
deleted file mode 100644
index 6ab277d73cecdcf214c4a1dea6644738762bf3f4..0000000000000000000000000000000000000000
--- a/packages/rocketchat-livechat/server/publications/availableDepartments.js
+++ /dev/null
@@ -1,3 +0,0 @@
-Meteor.publish('livechat:availableDepartments', function() {
-	return RocketChat.models.LivechatDepartment.findEnabledWithAgents();
-});
diff --git a/packages/rocketchat-livechat/server/publications/trigger.js b/packages/rocketchat-livechat/server/publications/trigger.js
deleted file mode 100644
index 61d7d6831f41d0013ff2e1efc106b24d907eb86a..0000000000000000000000000000000000000000
--- a/packages/rocketchat-livechat/server/publications/trigger.js
+++ /dev/null
@@ -1,3 +0,0 @@
-Meteor.publish('livechat:trigger', function() {
-	return RocketChat.models.LivechatTrigger.find();
-});
diff --git a/packages/rocketchat-livechat/server/publications/visitorRoom.js b/packages/rocketchat-livechat/server/publications/visitorRoom.js
deleted file mode 100644
index cb0570f7a7e8a736605bd737100a00c0395b475f..0000000000000000000000000000000000000000
--- a/packages/rocketchat-livechat/server/publications/visitorRoom.js
+++ /dev/null
@@ -1,12 +0,0 @@
-Meteor.publish('livechat:visitorRoom', function(visitorToken) {
-	return RocketChat.models.Rooms.findByVisitorToken(visitorToken, {
-		fields: {
-			name: 1,
-			t: 1,
-			cl: 1,
-			u: 1,
-			usernames: 1,
-			v: 1
-		}
-	});
-});
diff --git a/packages/rocketchat-livechat/server/startup.js b/packages/rocketchat-livechat/server/startup.js
index 58cee3def1365a8083296ac85ec025d4df07ec38..84ae762288107ea8aaa5c9ba7ee0514203a85892 100644
--- a/packages/rocketchat-livechat/server/startup.js
+++ b/packages/rocketchat-livechat/server/startup.js
@@ -1,18 +1,17 @@
 Meteor.startup(() => {
-	RocketChat.roomTypes.setPublish('l', (identifier) => {
-		return RocketChat.models.Rooms.findByTypeAndName('l', identifier, {
-			fields: {
-				name: 1,
-				t: 1,
-				cl: 1,
-				u: 1,
-				usernames: 1,
-				v: 1,
-				livechatData: 1,
-				topic: 1,
-				tags: 1,
-				sms: 1
-			}
+	RocketChat.roomTypes.setPublish('l', (code) => {
+		return RocketChat.models.Rooms.findLivechatByCode(code, {
+			name: 1,
+			t: 1,
+			cl: 1,
+			u: 1,
+			usernames: 1,
+			v: 1,
+			livechatData: 1,
+			topic: 1,
+			tags: 1,
+			sms: 1,
+			code: 1
 		});
 	});
 
diff --git a/packages/rocketchat-ui/lib/RoomManager.coffee b/packages/rocketchat-ui/lib/RoomManager.coffee
index 6b0c9afca095699de8263a3441f2b1f2ea5f7a9c..07c1d32a1bca7b30edc9378065c61987a2d6fdcd 100644
--- a/packages/rocketchat-ui/lib/RoomManager.coffee
+++ b/packages/rocketchat-ui/lib/RoomManager.coffee
@@ -86,9 +86,8 @@ RocketChat.Notifications.onUser 'message', (msg) ->
 		for typeName, record of openedRooms when record.active is true
 			do (typeName, record) ->
 
-				username = Meteor.user()?.username
-
-				unless username
+				user = Meteor.user()
+				unless user?.username
 					return
 
 				record.sub = [
@@ -104,15 +103,8 @@ RocketChat.Notifications.onUser 'message', (msg) ->
 					type = typeName.substr(0, 1)
 					name = typeName.substr(1)
 
-					query =
-						t: type
-
-					if type is 'd'
-						query.usernames = $all: [username, name]
-					else
-						query.name = name
-
-					room = ChatRoom.findOne query, { reactive: false }
+					room = Tracker.nonreactive =>
+						return RocketChat.roomTypes.findRoom(type, name, user)
 
 					if not room?
 						record.ready = true
diff --git a/packages/rocketchat-ui/views/app/room.coffee b/packages/rocketchat-ui/views/app/room.coffee
index ead835fd5c9cd91661e49126aa7907d41605578c..1643f28db5609a1e4aeac6d34cbdfe05dccc417c 100644
--- a/packages/rocketchat-ui/views/app/room.coffee
+++ b/packages/rocketchat-ui/views/app/room.coffee
@@ -74,10 +74,7 @@ Template.room.helpers
 		roomData = Session.get('roomData' + this._id)
 		return '' unless roomData
 
-		if roomData.t is 'd'
-			return ChatSubscription.findOne({ rid: this._id }, { fields: { name: 1 } })?.name
-		else
-			return roomData.name
+		return RocketChat.roomTypes.getRoomName roomData?.t, roomData
 
 	roomTopic: ->
 		roomData = Session.get('roomData' + this._id)
@@ -88,10 +85,7 @@ Template.room.helpers
 		roomData = Session.get('roomData' + this._id)
 		return '' unless roomData?.t
 
-		switch roomData.t
-			when 'd' then return 'icon-at'
-			when 'c' then return 'icon-hash'
-			when 'p' then return 'icon-lock'
+		return RocketChat.roomTypes.getIcon roomData?.t
 
 	userStatus: ->
 		roomData = Session.get('roomData' + this._id)
diff --git a/server/publications/subscription.coffee b/server/publications/subscription.coffee
index 08c3001d5683fc2de8ad98e534b585fa98b7b3b0..7ad7accceca3d78aaeb0cb7f0a2073c0054da883 100644
--- a/server/publications/subscription.coffee
+++ b/server/publications/subscription.coffee
@@ -9,6 +9,7 @@ Meteor.publish 'subscription', ->
 			ls: 1
 			name: 1
 			rid: 1
+			code: 1
 			f: 1
 			open: 1
 			alert: 1
diff --git a/server/startup/migrations/v049.js b/server/startup/migrations/v049.js
new file mode 100644
index 0000000000000000000000000000000000000000..90392b509c9f894f80927cadf1cf1313f04570c9
--- /dev/null
+++ b/server/startup/migrations/v049.js
@@ -0,0 +1,21 @@
+RocketChat.Migrations.add({
+	version: 49,
+	up: function() {
+
+		var count = 1;
+
+		RocketChat.models.Rooms.find({ t: 'l' }, { sort: { ts: 1 }, fields: { _id: 1 } }).forEach(function(room) {
+			RocketChat.models.Rooms.update({ _id: room._id }, { $set: { code: count } });
+			RocketChat.models.Subscriptions.update({ rid: room._id }, { $set: { code: count } }, { multi: true });
+			count++;
+		});
+
+		RocketChat.models.Settings.upsert({ _id: 'Livechat_Room_Count' }, {
+			$set: {
+				value: count,
+				type: 'int',
+				group: 'Livechat'
+			}
+		});
+	}
+});