diff --git a/.meteor/packages b/.meteor/packages
index 8f28d2040643bab8346fba60c10685a31ed98e3d..719996033a22de03f464a9faa893888eaad5075e 100644
--- a/.meteor/packages
+++ b/.meteor/packages
@@ -63,6 +63,7 @@ rocketchat:statistics
 rocketchat:theme
 rocketchat:tutum
 rocketchat:webrtc
+rocketchat:channel-settings
 rocketchat:wordpress
 #rocketchat:chatops
 #rocketchat:hubot
diff --git a/.meteor/versions b/.meteor/versions
index f2096cfe749384335e8b177d804ac3f497dfbc78..06e1c2c87c1abd96d0b12579252ff62b06487f26 100644
--- a/.meteor/versions
+++ b/.meteor/versions
@@ -123,6 +123,7 @@ reload@1.1.4
 retry@1.0.4
 rocketchat:authorization@0.0.1
 rocketchat:autolinker@0.0.1
+rocketchat:channel-settings@0.0.1
 rocketchat:colors@0.0.1
 rocketchat:custom-oauth@1.0.0
 rocketchat:emojione@0.0.1
diff --git a/client/lib/RoomManager.coffee b/client/lib/RoomManager.coffee
index b5684d5785ed43352576fe217e9c55f576b979c2..a9e8a7a406b3d3c495c9da08cbe051c1fbb32ee3 100644
--- a/client/lib/RoomManager.coffee
+++ b/client/lib/RoomManager.coffee
@@ -110,13 +110,7 @@ RocketChat.Notifications.onUser 'message', (msg) ->
 							Meteor.defer ->
 								RoomManager.updateMentionsMarksOfRoom typeName
 
-							# If room was renamed then close current room and send user to the new one
-							Tracker.nonreactive ->
-								if msg.t is 'r'
-									if Session.get('openedRoom') is msg.rid
-										type = if FlowRouter.current().route.name is 'channel' then 'c' else 'p'
-										RoomManager.close type + FlowRouter.getParam('name')
-										FlowRouter.go FlowRouter.current().route.name, name: msg.msg
+							RocketChat.callbacks.run 'streamMessage', msg
 
 						RocketChat.Notifications.onRoom openedRooms[typeName].rid, 'deleteMessage', onDeleteMessageStream
 
diff --git a/client/lib/trackRoomNameChanged.coffee b/client/lib/trackRoomNameChanged.coffee
new file mode 100644
index 0000000000000000000000000000000000000000..8b3a0769febae4f4b9f11b9e85d6e2753536a69d
--- /dev/null
+++ b/client/lib/trackRoomNameChanged.coffee
@@ -0,0 +1,12 @@
+Meteor.startup ->
+	roomNameChangedCallback = (msg) ->
+		Tracker.nonreactive ->
+			if msg.t is 'r'
+				if Session.get('openedRoom') is msg.rid
+					type = if FlowRouter.current().route.name is 'channel' then 'c' else 'p'
+					RoomManager.close type + FlowRouter.getParam('name')
+					FlowRouter.go FlowRouter.current().route.name, name: msg.msg
+
+		return msg
+
+	RocketChat.callbacks.add 'streamMessage', roomNameChangedCallback, RocketChat.callbacks.priority.HIGH
diff --git a/client/views/app/message.coffee b/client/views/app/message.coffee
index 2e053390781a13f4dc229b523f944ef7009eba1a..2792c4cf8cb7445a57a501193e8116c0f63330a8 100644
--- a/client/views/app/message.coffee
+++ b/client/views/app/message.coffee
@@ -14,11 +14,14 @@ Template.message.helpers
 			return 'temp'
 	body: ->
 		return Template.instance().body
+
 	system: ->
 		if RocketChat.MessageTypes.isSystemMessage(this)
 			return 'system'
+
 	edited: ->
 		return Template.instance().wasEdited
+
 	editTime: ->
 		if Template.instance().wasEdited
 			return moment(@editedAt).format('LL hh:mma') #TODO profile pref for 12hr/24hr clock?
@@ -91,6 +94,7 @@ Template.message.onCreated ->
 				message = RocketChat.callbacks.run 'renderMentions', msg
 				# console.log JSON.stringify message
 				return msg.html
+
 			msg.html = msg.msg
 			if _.trim(msg.html) isnt ''
 				msg.html = _.escapeHTML msg.html
diff --git a/client/views/app/videoCall/videoCall.coffee b/client/views/app/videoCall/videoCall.coffee
index d777b03072723b61f73883413de166efe5693ec6..a3431aa73a0fa6ad33c58a2f1b37b9471b0b6337 100644
--- a/client/views/app/videoCall/videoCall.coffee
+++ b/client/views/app/videoCall/videoCall.coffee
@@ -9,7 +9,7 @@ Template.videoCall.helpers
 	videoActive: ->
 		webrtc = WebRTC.getInstanceByRoomId(Session.get('openedRoom'))
 		overlay = @overlay?
-		if overlay isnt webrtc.overlayEnabled.get()
+		if overlay isnt webrtc?.overlayEnabled.get()
 			return false
 
 		return webrtc.localUrl.get()? or webrtc.remoteItems.get()?.length > 0
diff --git a/packages/rocketchat-channel-settings/client/startup/messageTypes.coffee b/packages/rocketchat-channel-settings/client/startup/messageTypes.coffee
new file mode 100644
index 0000000000000000000000000000000000000000..3870f1ef762ef43f2c38dfbc876c828b2d4170bd
--- /dev/null
+++ b/packages/rocketchat-channel-settings/client/startup/messageTypes.coffee
@@ -0,0 +1,20 @@
+Meteor.startup ->
+	RocketChat.MessageTypes.registerType
+		id: 'room_changed_privacy'
+		system: true
+		message: 'room_changed_privacy'
+		data: (message) ->
+			return {
+				user_by: message.u?.username
+				room_type: message.msg
+			}
+
+	RocketChat.MessageTypes.registerType
+		id: 'room_changed_topic'
+		system: true
+		message: 'room_changed_topic'
+		data: (message) ->
+			return {
+				user_by: message.u?.username
+				room_topic: message.msg
+			}
diff --git a/packages/rocketchat-channel-settings/client/startup/tabBar.coffee b/packages/rocketchat-channel-settings/client/startup/tabBar.coffee
new file mode 100644
index 0000000000000000000000000000000000000000..17d1680317e5f51238544bf6c4a08cc9e7a6cc61
--- /dev/null
+++ b/packages/rocketchat-channel-settings/client/startup/tabBar.coffee
@@ -0,0 +1,12 @@
+Meteor.startup ->
+
+	RocketChat.callbacks.add 'enter-room', (subscription) ->
+
+		if RocketChat.authz.hasAtLeastOnePermission('edit-room', subscription?.rid)
+			RocketChat.TabBar.addButton
+				id: 'channel-settings'
+				i18nTitle: 'Channel_Settings'
+				icon: 'octicon octicon-gear'
+				template: 'channelSettings'
+				order: 0
+	, RocketChat.callbacks.priority.MEDIUM, 'enter-room-tabbar-channel-settings'
diff --git a/packages/rocketchat-channel-settings/client/startup/trackSettingsChange.coffee b/packages/rocketchat-channel-settings/client/startup/trackSettingsChange.coffee
new file mode 100644
index 0000000000000000000000000000000000000000..b3618dd7232e96c9c775de28896c58df47feef05
--- /dev/null
+++ b/packages/rocketchat-channel-settings/client/startup/trackSettingsChange.coffee
@@ -0,0 +1,15 @@
+Meteor.startup ->
+	roomSettingsChangedCallback = (msg) ->
+		Tracker.nonreactive ->
+			if msg.t is 'room_changed_privacy'
+				if Session.get('openedRoom') is msg.rid
+					type = if FlowRouter.current().route.name is 'channel' then 'c' else 'p'
+					RoomManager.close type + FlowRouter.getParam('name')
+
+					subscription = ChatSubscription.findOne({ rid: msg.rid })
+					route = if subscription.t is 'c' then 'channel' else 'group'
+					FlowRouter.go route, name: subscription.name
+
+		return msg
+
+	RocketChat.callbacks.add 'streamMessage', roomSettingsChangedCallback, RocketChat.callbacks.priority.HIGH
diff --git a/packages/rocketchat-channel-settings/client/stylesheets/channel-settings.less b/packages/rocketchat-channel-settings/client/stylesheets/channel-settings.less
new file mode 100644
index 0000000000000000000000000000000000000000..0227c11170d8da36077c2baffa8c113f2edd2ce1
--- /dev/null
+++ b/packages/rocketchat-channel-settings/client/stylesheets/channel-settings.less
@@ -0,0 +1,17 @@
+.flex-tab {
+	.channel-settings {
+		margin-top: 60px;
+		padding: 20px;
+
+		form {
+			label {
+
+			}
+		}
+
+		.submit {
+			margin-top: 30px;
+			text-align: center;
+		}
+	}
+}
diff --git a/packages/rocketchat-channel-settings/client/views/channelSettings.coffee b/packages/rocketchat-channel-settings/client/views/channelSettings.coffee
new file mode 100644
index 0000000000000000000000000000000000000000..4f9f5d344c5d991fad19f382913407cb7ea7e37b
--- /dev/null
+++ b/packages/rocketchat-channel-settings/client/views/channelSettings.coffee
@@ -0,0 +1,23 @@
+Template.channelSettings.helpers
+	notDirect: ->
+		return ChatRoom.findOne(@rid)?.t isnt 'd'
+	roomType: ->
+		return ChatRoom.findOne(@rid)?.t
+
+Template.channelSettings.events
+	'click .save': (e, t) ->
+		e.preventDefault()
+
+		settings =
+			roomType: t.$('input[name=roomType]:checked').val()
+
+		Meteor.call 'saveRoomSettings', t.data.rid, settings, (err, results) ->
+			return toastr.error err.reason if err
+			toastr.success TAPi18n.__ 'Settings_updated'
+
+
+			# switch room.t
+			# 	when 'c'
+			# 		FlowRouter.go 'channel', name: name
+			# 	when 'p'
+			# 		FlowRouter.go 'group', name: name
diff --git a/packages/rocketchat-channel-settings/client/views/channelSettings.html b/packages/rocketchat-channel-settings/client/views/channelSettings.html
new file mode 100644
index 0000000000000000000000000000000000000000..c72ecae4ad66d4f22d6ecb136fc607766b3e11ab
--- /dev/null
+++ b/packages/rocketchat-channel-settings/client/views/channelSettings.html
@@ -0,0 +1,25 @@
+<template name="channelSettings">
+	<div class="control">
+		<div class="header">
+			<h2>{{_ "Room_Settings"}}</h2>
+		</div>
+	</div>
+	<div class="channel-settings scrollable">
+		<form>
+			<fieldset>
+				{{#if notDirect}}
+					<div class="input-line double-col">
+						<label>{{_ "Room_Type"}}</label>
+						<div>
+							<label><input type="radio" name="roomType" value="c" checked="{{$eq roomType 'c'}}" /> {{_ "Channel"}}</label>
+							<label><input type="radio" name="roomType" value="p" checked="{{$eq roomType 'p'}}" /> {{_ "Private_Group"}}</label>
+						</div>
+					</div>
+				{{/if}}
+			</fieldset>
+			<div class="submit">
+				<button class="button save"><i class="icon-send"></i><span>{{_ "Save_changes"}}</span></button>
+			</div>
+		</form>
+	</div>
+</template>
diff --git a/packages/rocketchat-channel-settings/i18n/en.i18n.json b/packages/rocketchat-channel-settings/i18n/en.i18n.json
new file mode 100644
index 0000000000000000000000000000000000000000..ba1d6c016df575a3fd51bca1114e7e932d220575
--- /dev/null
+++ b/packages/rocketchat-channel-settings/i18n/en.i18n.json
@@ -0,0 +1,8 @@
+{
+	"Channel": "Channel",
+	"Private_Group": "Private Group",
+	"Room_Type": "Room Type",
+	"Room_Settings": "Room Settings",
+	"room_changed_privacy": "Room type changed to: <em>__room_type__</em> by <em>__user_by__</em>",
+	"room_changed_topic": "Room topic changed to: <em>__room_topic__</em> by <em>__user_by__</em>"
+}
diff --git a/packages/rocketchat-channel-settings/package.js b/packages/rocketchat-channel-settings/package.js
new file mode 100644
index 0000000000000000000000000000000000000000..06b8f3fe128ac6140841c36bb2827c5a803c48f6
--- /dev/null
+++ b/packages/rocketchat-channel-settings/package.js
@@ -0,0 +1,48 @@
+Package.describe({
+	name: 'rocketchat:channel-settings',
+	version: '0.0.1',
+	summary: 'Channel Settings Panel',
+	git: ''
+});
+
+Package.onUse(function(api) {
+	api.versionsFrom('1.0');
+
+	api.use([
+		'coffeescript',
+		'templating',
+		'less@2.5.0',
+		'rocketchat:lib@0.0.1'
+	]);
+
+	api.addFiles([
+		'client/startup/messageTypes.coffee',
+		'client/startup/tabBar.coffee',
+		'client/startup/trackSettingsChange.coffee',
+		'client/views/channelSettings.html',
+		'client/views/channelSettings.coffee',
+		'client/stylesheets/channel-settings.less'
+	], 'client');
+
+	api.addFiles([
+		'server/functions/changeRoomType.coffee',
+		'server/methods/saveRoomSettings.coffee',
+		'server/models/Messages.coffee'
+	], 'server');
+
+	// TAPi18n
+	var _ = Npm.require('underscore');
+	var fs = Npm.require('fs');
+	tapi18nFiles = _.compact(_.map(fs.readdirSync('packages/rocketchat-channel-settings/i18n'), function(filename) {
+		if (fs.statSync('packages/rocketchat-channel-settings/i18n/' + filename).size > 16) {
+			return 'i18n/' + filename;
+		}
+	}));
+	api.use('tap:i18n@1.6.1');
+	api.imply('tap:i18n');
+	api.addFiles(tapi18nFiles);
+});
+
+Package.onTest(function(api) {
+
+});
diff --git a/packages/rocketchat-channel-settings/server/functions/changeRoomType.coffee b/packages/rocketchat-channel-settings/server/functions/changeRoomType.coffee
new file mode 100644
index 0000000000000000000000000000000000000000..e9c89567302e183d11b51dec04818c0dacdde7c5
--- /dev/null
+++ b/packages/rocketchat-channel-settings/server/functions/changeRoomType.coffee
@@ -0,0 +1,47 @@
+RocketChat.changeRoomType = (rid, roomType) ->
+	console.log '[function] RocketChat.changeRoomType'.green, rid, roomType
+
+	unless Match.test rid, String
+		throw new Meteor.Error 'invalid-rid'
+
+	if roomType not in ['c', 'p']
+		throw new Meteor.Error 'invalid-room-type'
+
+	return RocketChat.models.Rooms.setTypeById(rid, roomType) and RocketChat.models.Subscriptions.updateTypeByRoomId(rid, roomType)
+
+
+	# username = s.trim username
+	# if not user or not username
+	# 	return false
+
+	# if not /^[0-9a-zA-Z-_.]+$/.test username
+	# 	return false
+
+	# # User already has desired username, return
+	# if user.username is username
+	# 	return user
+
+	# # Check username availability
+	# unless RocketChat.checkUsernameAvailability username
+	# 	return false
+
+	# previousUsername = user.username
+
+	# # Username is available; if coming from old username, update all references
+	# if previousUsername
+	# 	RocketChat.models.Messages.updateAllUsernamesByUserId user._id, username
+
+	# 	RocketChat.models.Messages.findByMention(previousUsername).forEach (msg) ->
+	# 		updatedMsg = msg.msg.replace(new RegExp("@#{previousUsername}", "ig"), "@#{username}")
+	# 		RocketChat.models.Messages.updateUsernameAndMessageOfMentionByIdAndOldUsername msg._id, previousUsername, username, updatedMsg
+
+	# 	RocketChat.models.Rooms.replaceUsername previousUsername, username
+	# 	RocketChat.models.Rooms.replaceUsernameOfUserByUserId user._id, username
+
+	# 	RocketChat.models.Subscriptions.setUserUsernameByUserId user._id, username
+	# 	RocketChat.models.Subscriptions.setNameForDirectRoomsWithOldName previousUsername, username
+
+	# # Set new username
+	# Meteor.users.update { _id: user._id }, { $set: { username: username } }
+	# user.username = username
+	# return user
diff --git a/packages/rocketchat-channel-settings/server/methods/saveRoomSettings.coffee b/packages/rocketchat-channel-settings/server/methods/saveRoomSettings.coffee
new file mode 100644
index 0000000000000000000000000000000000000000..6375bf5f289180ce9e3732a313febb8522c65e56
--- /dev/null
+++ b/packages/rocketchat-channel-settings/server/methods/saveRoomSettings.coffee
@@ -0,0 +1,26 @@
+Meteor.methods
+	saveRoomSettings: (rid, settings) ->
+		console.log '[method] saveRoomSettings'.green, rid, settings
+
+		unless Match.test rid, String
+			throw new Meteor.Error 'invalid-rid'
+
+		unless Match.test settings, Match.ObjectIncluding { roomType: String }
+			throw new Meteor.Error 'invalid-settings'
+
+		unless RocketChat.authz.hasPermission(Meteor.userId(), 'edit-room', rid)
+			throw new Meteor.Error 503, 'Not authorized'
+
+		room = RocketChat.models.Rooms.findOneById rid
+		if room?
+			if settings.roomType isnt room.t
+				RocketChat.changeRoomType(rid, settings.roomType)
+
+				if settings.roomType is 'c'
+					message = TAPi18n.__('Channel')
+				else
+					message = TAPi18n.__('Private_Group')
+
+				RocketChat.models.Messages.createRoomSettingsChangedWithTypeRoomIdMessageAndUser 'room_changed_privacy', rid, message, Meteor.user()
+
+		return true
diff --git a/packages/rocketchat-channel-settings/server/models/Messages.coffee b/packages/rocketchat-channel-settings/server/models/Messages.coffee
new file mode 100644
index 0000000000000000000000000000000000000000..0a8e900e45d40835d506b73c468240b2d9208a8c
--- /dev/null
+++ b/packages/rocketchat-channel-settings/server/models/Messages.coffee
@@ -0,0 +1,2 @@
+RocketChat.models.Messages.createRoomSettingsChangedWithTypeRoomIdMessageAndUser = (type, roomId, message, user, extraData) ->
+	return @createWithTypeRoomIdMessageAndUser type, roomId, message, user, extraData
diff --git a/packages/rocketchat-lib/client/lib/openRoom.coffee b/packages/rocketchat-lib/client/lib/openRoom.coffee
index c4dae8c00a15a6498a45998be145e8e8c029c550..545dce131b85cd960539bb4b3580f566491542bb 100644
--- a/packages/rocketchat-lib/client/lib/openRoom.coffee
+++ b/packages/rocketchat-lib/client/lib/openRoom.coffee
@@ -62,4 +62,4 @@ currentTracker = undefined
 			if ChatSubscription.findOne({rid: room._id})?.open is false
 				Meteor.call 'openRoom', room._id
 
-			RocketChat.callbacks.run 'enter-room'
+			RocketChat.callbacks.run 'enter-room', ChatSubscription.findOne({rid: room._id})
diff --git a/packages/rocketchat-lib/server/models/Rooms.coffee b/packages/rocketchat-lib/server/models/Rooms.coffee
index 579091a1080261a9e2be83a11a8df405c63a2185..dddc8f8c0216399447eb301955ced7cbf142a33c 100644
--- a/packages/rocketchat-lib/server/models/Rooms.coffee
+++ b/packages/rocketchat-lib/server/models/Rooms.coffee
@@ -290,6 +290,16 @@ RocketChat.models.Rooms = new class extends RocketChat.models._Base
 
 		return @update query, update
 
+	setTypeById: (_id, type) ->
+		query = 
+			_id: _id
+
+		update = 
+			$set: 
+				t: type
+
+		return @update query, update
+
 
 	# INSERT
 	createWithTypeNameUserAndUsernames: (type, name, user, usernames, extraData) ->
diff --git a/packages/rocketchat-lib/server/models/Subscriptions.coffee b/packages/rocketchat-lib/server/models/Subscriptions.coffee
index 7c98e495264e9b4c3171767323cef77b0eb98c8e..f698bea67354dfc1d80fd4812577483412f52dc6 100644
--- a/packages/rocketchat-lib/server/models/Subscriptions.coffee
+++ b/packages/rocketchat-lib/server/models/Subscriptions.coffee
@@ -194,6 +194,16 @@ RocketChat.models.Subscriptions = new class extends RocketChat.models._Base
 
 		return @update query, update, { multi: true }
 
+	updateTypeByRoomId: (roomId, type) ->
+		query = 
+			rid: roomId
+		
+		update =
+			$set: 
+				t: type
+
+		return @update query, update, { multi: true }
+
 
 	# INSERT
 	createWithRoomAndUser: (room, user, extraData) ->