diff --git a/packages/rocketchat-channel-settings/client/stylesheets/channel-settings.less b/packages/rocketchat-channel-settings/client/stylesheets/channel-settings.less
index 05f745e0abc52a12182c9cdf622b918ba98cb44c..a09d3ee179c2e5800f74f5b334bc852563d37dca 100644
--- a/packages/rocketchat-channel-settings/client/stylesheets/channel-settings.less
+++ b/packages/rocketchat-channel-settings/client/stylesheets/channel-settings.less
@@ -13,6 +13,10 @@
 			margin-top: 30px;
 			text-align: center;
 		}
+
+		[data-edit] {
+			cursor: pointer;
+		}
 	}
 }
 
diff --git a/packages/rocketchat-channel-settings/client/views/channelSettings.coffee b/packages/rocketchat-channel-settings/client/views/channelSettings.coffee
index a56bc8f54cb6bf794c23a8cf09ecc58c25db4a16..7f5639384fe1a1e628078e36028a9ca694cf9ce7 100644
--- a/packages/rocketchat-channel-settings/client/views/channelSettings.coffee
+++ b/packages/rocketchat-channel-settings/client/views/channelSettings.coffee
@@ -1,40 +1,64 @@
 Template.channelSettings.helpers
 	canEdit: ->
-		return true
+		return RocketChat.authz.hasAllPermission('edit-room', @rid)
 	editing: (field) ->
-		return false
+		return Template.instance().editing.get() is field
 	notDirect: ->
 		return ChatRoom.findOne(@rid)?.t isnt 'd'
 	roomType: ->
 		return ChatRoom.findOne(@rid)?.t
 	roomTypeDescription: ->
-		return if ChatRoom.findOne(@rid)?.t is 'c' then t('Channel') else t('Private_Group')
+		roomType = ChatRoom.findOne(@rid)?.t
+		if roomType is 'c'
+			return t('Channel')
+		else if roomType is 'p'
+			return t('Private_Group')
 	roomName: ->
 		return ChatRoom.findOne(@rid)?.name
 	roomTopic: ->
 		return ChatRoom.findOne(@rid)?.topic
 
 Template.channelSettings.events
-	'click .save': (e, t) ->
-		e.preventDefault()
+	# 'click .save': (e, t) ->
+	# 	e.preventDefault()
+
+	# 	settings =
+	# 		roomType: t.$('input[name=roomType]:checked').val()
+	# 		roomName: t.$('input[name=roomName]').val()
+	# 		roomTopic: t.$('input[name=roomTopic]').val()
+
+	# 	if t.validate()
+	# 		Meteor.call 'saveRoomSettings', t.data.rid, settings, (err, results) ->
+	# 			if err
+	# 				if err.error in [ 'duplicate-name', 'name-invalid' ]
+	# 					return toastr.error TAPi18n.__(err.reason, err.details.channelName)
+	# 				if err.error is 'invalid-room-type'
+	# 					return toastr.error TAPi18n.__(err.reason, err.details.roomType)
+	# 				return toastr.error TAPi18n.__(err.reason)
+
+	# 			toastr.success TAPi18n.__ 'Settings_updated'
 
-		settings =
-			roomType: t.$('input[name=roomType]:checked').val()
-			roomName: t.$('input[name=roomName]').val()
-			roomTopic: t.$('input[name=roomTopic]').val()
+	'keydown input[type=text]': (e, t) ->
+		if e.keyCode is 13
+			e.preventDefault()
+			t.saveSetting()
 
-		if t.validate()
-			Meteor.call 'saveRoomSettings', t.data.rid, settings, (err, results) ->
-				if err
-					if err.error in [ 'duplicate-name', 'name-invalid' ]
-						return toastr.error TAPi18n.__(err.reason, err.details.channelName)
-					if err.error is 'invalid-room-type'
-						return toastr.error TAPi18n.__(err.reason, err.details.roomType)
-					return toastr.error TAPi18n.__(err.reason)
+	'click [data-edit]': (e, t) ->
+		e.preventDefault()
+		t.editing.set($(e.currentTarget).data('edit'))
+		setTimeout (-> t.$('input.editing').focus().select()), 100
+
+	'click .cancel': (e, t) ->
+		e.preventDefault()
+		t.editing.set()
 
-				toastr.success TAPi18n.__ 'Settings_updated'
+	'click .save': (e, t) ->
+		e.preventDefault()
+		t.saveSetting()
 
 Template.channelSettings.onCreated ->
+	@editing = new ReactiveVar
+
 	@validateRoomType = =>
 		type = @$('input[name=roomType]:checked').val()
 		if type not in ['c', 'p']
@@ -45,7 +69,7 @@ Template.channelSettings.onCreated ->
 		rid = Template.currentData()?.rid
 		room = ChatRoom.findOne rid
 
-		if room.u._id isnt Meteor.userId() or room.t not in ['c', 'p']
+		if not RocketChat.authz.hasAllPermission('edit-room', @rid) or room.t not in ['c', 'p']
 			toastr.error t('Not_allowed')
 			return false
 
@@ -59,5 +83,28 @@ Template.channelSettings.onCreated ->
 	@validateRoomTopic = =>
 		return true
 
-	@validate = =>
-		return @validateRoomType() and @validateRoomName() and @validateRoomTopic()
+	@saveSetting = =>
+		switch @editing.get()
+			when 'roomName'
+				if @validateRoomName()
+					Meteor.call 'saveRoomSettings', @data?.rid, 'roomName', @$('input[name=roomName]').val(), (err, result) ->
+						if err
+							if err.error in [ 'duplicate-name', 'name-invalid' ]
+								return toastr.error TAPi18n.__(err.reason, err.details.channelName)
+							return toastr.error TAPi18n.__(err.reason)
+						toastr.success TAPi18n.__ 'Room_name_changed_successfully'
+			when 'roomTopic'
+				if @validateRoomTopic()
+					Meteor.call 'saveRoomSettings', @data?.rid, 'roomTopic', @$('input[name=roomTopic]').val(), (err, result) ->
+						if err
+							return toastr.error TAPi18n.__(err.reason)
+						toastr.success TAPi18n.__ 'Room_topic_changed_successfully'
+			when 'roomType'
+				if @validateRoomType()
+					Meteor.call 'saveRoomSettings', @data?.rid, 'roomType', @$('input[name=roomType]:checked').val(), (err, result) ->
+						if err
+							if err.error is 'invalid-room-type'
+								return toastr.error TAPi18n.__(err.reason, err.details.roomType)
+							return toastr.error TAPi18n.__(err.reason)
+						toastr.success TAPi18n.__ 'Room_type_changed_successfully'
+		@editing.set()
diff --git a/packages/rocketchat-channel-settings/client/views/channelSettings.html b/packages/rocketchat-channel-settings/client/views/channelSettings.html
index 36a5cc72b4b2be3b94813fde9f645ad7405e333a..042abb276142e61c553597a307f4612330d7be59 100644
--- a/packages/rocketchat-channel-settings/client/views/channelSettings.html
+++ b/packages/rocketchat-channel-settings/client/views/channelSettings.html
@@ -12,9 +12,9 @@
 						<label>{{_ "Name"}}</label>
 						<div>
 							{{#if editing 'roomName'}}
-								<input type="text" name="roomName" value="{{roomName}}" />
+								<input type="text" name="roomName" value="{{roomName}}" class="editing" /> <button type="button" class="button secondary cancel">{{_ "Cancel"}}</button> <button type="button" class="button primary save">{{_ "Save"}}</button>
 							{{else}}
-								{{roomName}}{{#if canEdit}} <i class="octicon octicon-pencil"></i>{{/if}}
+								{{roomName}}{{#if canEdit}} <i class="octicon octicon-pencil" data-edit="roomName"></i>{{/if}}
 							{{/if}}
 						</div>
 					</div>
@@ -23,9 +23,9 @@
 					<label>{{_ "Topic"}}</label>
 					<div>
 						{{#if editing 'roomTopic'}}
-							<input type="text" name="roomTopic" value="{{roomTopic}}" />
+							<input type="text" name="roomTopic" value="{{roomTopic}}" class="editing" /> <button type="button" class="button secondary cancel">{{_ "Cancel"}}</button> <button type="button" class="button primary save">{{_ "Save"}}</button>
 						{{else}}
-							{{roomTopic}}{{#if canEdit}} <i class="octicon octicon-pencil"></i>{{/if}}
+							{{roomTopic}}{{#if canEdit}} <i class="octicon octicon-pencil" data-edit="roomTopic"></i>{{/if}}
 						{{/if}}
 					</div>
 				</div>
@@ -34,10 +34,12 @@
 						<label>{{_ "Type"}}</label>
 						<div>
 							{{#if editing 'roomType'}}
-								<label><input type="radio" name="roomType" value="c" checked="{{$eq roomType 'c'}}" /> {{_ "Channel"}}</label>
+								<label><input type="radio" name="roomType" class="editing" value="c" checked="{{$eq roomType 'c'}}" /> {{_ "Channel"}}</label>
 								<label><input type="radio" name="roomType" value="p" checked="{{$eq roomType 'p'}}" /> {{_ "Private_Group"}}</label>
+								<button type="button" class="button secondary cancel">{{_ "Cancel"}}</button>
+								<button type="button" class="button primary save">{{_ "Save"}}</button>
 							{{else}}
-								{{roomTypeDescription}}{{#if canEdit}} <i class="octicon octicon-pencil"></i>{{/if}}
+								{{roomTypeDescription}}{{#if canEdit}} <i class="octicon octicon-pencil" data-edit="roomType"></i>{{/if}}
 							{{/if}}
 						</div>
 					</div>
diff --git a/packages/rocketchat-channel-settings/i18n/en.i18n.json b/packages/rocketchat-channel-settings/i18n/en.i18n.json
index 1191953e3ba8bf209eaf3ea75f397fc8d38bb5b6..f9b02ab82b586729c73f7a5071ffe8eedc85d31f 100644
--- a/packages/rocketchat-channel-settings/i18n/en.i18n.json
+++ b/packages/rocketchat-channel-settings/i18n/en.i18n.json
@@ -1,10 +1,14 @@
 {
+	"Cancel": "Cancel",
 	"Channel": "Channel",
 	"Private_Group": "Private Group",
 	"Name": "Name",
+	"Save": "Save",
 	"Topic": "Topic",
 	"Type": "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>"
+	"room_changed_topic": "Room topic changed to: <em>__room_topic__</em> by <em>__user_by__</em>",
+	"Room_topic_changed_successfully": "Room topic changed successfully",
+	"Room_type_changed_successfully": "Room type changed successfully"
 }
diff --git a/packages/rocketchat-channel-settings/server/methods/saveRoomSettings.coffee b/packages/rocketchat-channel-settings/server/methods/saveRoomSettings.coffee
index 9cc15ad6fb404613498a29d38bb43efc7b94878a..348d43afc661c7972b6e4845e430b40ec817cd0a 100644
--- a/packages/rocketchat-channel-settings/server/methods/saveRoomSettings.coffee
+++ b/packages/rocketchat-channel-settings/server/methods/saveRoomSettings.coffee
@@ -1,11 +1,11 @@
 Meteor.methods
-	saveRoomSettings: (rid, settings) ->
-		console.log '[method] saveRoomSettings'.green, rid, settings
+	saveRoomSettings: (rid, setting, value) ->
+		console.log '[method] saveRoomSettings'.green, rid, setting, value
 
 		unless Match.test rid, String
 			throw new Meteor.Error 'invalid-rid', 'Invalid room'
 
-		unless Match.test settings, Match.ObjectIncluding { roomName: String, roomTopic: String, roomType: String }
+		if setting not in ['roomName', 'roomTopic', 'roomType']
 			throw new Meteor.Error 'invalid-settings', 'Invalid settings provided'
 
 		unless RocketChat.authz.hasPermission(Meteor.userId(), 'edit-room', rid)
@@ -13,22 +13,21 @@ Meteor.methods
 
 		room = RocketChat.models.Rooms.findOneById rid
 		if room?
-			if settings.roomName isnt room.name
-				name = RocketChat.saveRoomName rid, settings.roomName
-				RocketChat.models.Messages.createRoomRenamedWithRoomIdRoomNameAndUser rid, name, Meteor.user()
-
-			if settings.roomType isnt room.t
-				RocketChat.saveRoomType(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()
-
-			if settings.roomTopic isnt room.topic
-				RocketChat.saveRoomTopic(rid, settings.roomTopic)
-				RocketChat.models.Messages.createRoomSettingsChangedWithTypeRoomIdMessageAndUser 'room_changed_topic', rid, settings.roomTopic, Meteor.user()
+			switch setting
+				when 'roomName'
+					name = RocketChat.saveRoomName rid, value
+					RocketChat.models.Messages.createRoomRenamedWithRoomIdRoomNameAndUser rid, name, Meteor.user()
+				when 'roomTopic'
+					if value isnt room.topic
+						RocketChat.saveRoomTopic(rid, value)
+						RocketChat.models.Messages.createRoomSettingsChangedWithTypeRoomIdMessageAndUser 'room_changed_topic', rid, value, Meteor.user()
+				when 'roomType'
+					if value isnt room.t
+						RocketChat.saveRoomType(rid, value)
+						if value 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-lib/client/lib/roomExit.coffee b/packages/rocketchat-lib/client/lib/roomExit.coffee
index d8a44ae00a37fc9a8ad39caeffa568b27ed2b748..7ee736f5e2ea1661e584d971b7224aee8e50131d 100644
--- a/packages/rocketchat-lib/client/lib/roomExit.coffee
+++ b/packages/rocketchat-lib/client/lib/roomExit.coffee
@@ -10,8 +10,9 @@
 			if child?
 				if child.classList.contains('room-container')
 					wrapper = child.querySelector('.messages-box > .wrapper')
-					if wrapper.scrollTop >= wrapper.scrollHeight - wrapper.clientHeight
-						child.oldScrollTop = 10e10
-					else
-						child.oldScrollTop = wrapper.scrollTop
+					if wrapper
+						if wrapper.scrollTop >= wrapper.scrollHeight - wrapper.clientHeight
+							child.oldScrollTop = 10e10
+						else
+							child.oldScrollTop = wrapper.scrollTop
 				mainNode.removeChild child