@@ -39,7 +39,7 @@ LFG_RETURN_VALUES = {
 	description = 14,
 	isHoliday = 15,
 	bonusRepAmount = 16,
-	forceHide = 17,
+	minPlayers = 17,
 }
 
 LFG_INSTANCE_INVALID_RAID_LOCKED = 6;
@@ -55,6 +55,8 @@ LFG_INSTANCE_INVALID_CODES = { --Any oth
 	nil,	--Target level too high
 	nil,	--Target level too low
 	"AREA_NOT_EXPLORED",
+	nil,	--Wrong faction
+	"NO_VALID_ROLES",
 	[1001] = "LEVEL_TOO_LOW",
 	[1002] = "LEVEL_TOO_HIGH",
 	[1022] = "QUEST_NOT_COMPLETED",
@@ -333,6 +335,8 @@ function LFG_PermanentlyDisableRoleButto
 	button.cover:SetAlpha(0.7);
 	button.checkButton:Hide();
 	button.checkButton:Disable();
+	button.checkButton:SetChecked(false);
+	button.alert:Hide();
 	if ( button.background ) then
 		button.background:Hide();
 	end
@@ -365,8 +369,13 @@ function LFG_EnableRoleButton(button)
 	button:Enable();
 	SetDesaturation(button:GetNormalTexture(), false);
 	button.cover:Hide();
-	button.checkButton:Show();
-	button.checkButton:Enable();
+	if( button.lockedIndicator:IsShown() ) then
+		button.checkButton:Hide();
+		button.checkButton:Disable();
+	else
+		button.checkButton:Show();
+		button.checkButton:Enable();
+	end
 	if ( button.background ) then
 		button.background:Show();
 	end
@@ -377,26 +386,19 @@ function LFG_EnableRoleButton(button)
 	end
 end
 
-function LFG_UpdateAvailableRoles(tankButton, healButton, dpsButton, leaderButton)
-	local canBeTank, canBeHealer, canBeDPS = UnitGetAvailableRoles("player");
-	
-	if ( canBeTank ) then
-		LFG_EnableRoleButton(tankButton);
+function LFG_UpdateAvailableRoleButton( button, canBeRole )
+	if (canBeRole) then
+		LFG_EnableRoleButton(button);
 	else
-		LFG_PermanentlyDisableRoleButton(tankButton);
-	end
-	
-	if ( canBeHealer ) then
-		LFG_EnableRoleButton(healButton);
-	else
-		LFG_PermanentlyDisableRoleButton(healButton);
-	end
-	
-	if ( canBeDPS ) then
-		LFG_EnableRoleButton(dpsButton);
-	else
-		LFG_PermanentlyDisableRoleButton(dpsButton);
+		LFG_PermanentlyDisableRoleButton(button);
 	end
+end
+
+function LFG_UpdateAvailableRoles(tankButton, healButton, dpsButton, leaderButton)
+	local canBeTank, canBeHealer, canBeDPS = C_LFGList.GetAvailableRoles();
+	LFG_UpdateAvailableRoleButton(tankButton, canBeTank);
+	LFG_UpdateAvailableRoleButton(healButton, canBeHealer);
+	LFG_UpdateAvailableRoleButton(dpsButton, canBeDPS);
 	
 	if ( leaderButton ) then
 		if (not IsInGroup() or UnitIsGroupLeader("player")) then
@@ -430,10 +432,10 @@ function LFG_UpdateRoleCheckboxes(catego
 	if ( mode ~= "queued" and mode ~= "listed" and mode ~= "suspended" ) then
 		leader, tank, healer, dps = GetLFGRoles();
 	end
-
-	tankButton.checkButton:SetChecked(tank);
-	healButton.checkButton:SetChecked(healer);
-	dpsButton.checkButton:SetChecked(dps);
+	
+	LFGRole_SetChecked(tankButton, tank);
+	LFGRole_SetChecked(healButton, healer);
+	LFGRole_SetChecked(dpsButton, dps);
 	
 	if ( leaderButton ) then
 		leaderButton.checkButton:SetChecked(leader);
@@ -498,44 +500,62 @@ function LFGRoleIconIncentive_OnEnter(se
 	local role = LFG_ID_TO_ROLES[self:GetParent():GetID()];
 	
 	GameTooltip:SetText(format(LFG_CALL_TO_ARMS, _G[role]), 1, 1, 1);
-	GameTooltip:AddLine(LFG_CALL_TO_ARMS_EXPLANATION, nil, nil, nil, 1);
+	GameTooltip:AddLine(LFG_CALL_TO_ARMS_EXPLANATION, nil, nil, nil, true);
 	GameTooltip:Show();
 end
 
+function LFDRoleButton_OnEnter(self)
+	GameTooltip:SetOwner(self, "ANCHOR_RIGHT");
+	GameTooltip:SetText(_G["ROLE_DESCRIPTION_"..self.role], nil, nil, nil, nil, true);
+	if ( self.permDisabled ) then
+		if(self.permDisabledTip)then
+			GameTooltip:AddLine(self.permDisabledTip, 1, 0, 0, true);
+		end
+	elseif ( self.disabledTooltip and not self:IsEnabled() ) then
+		GameTooltip:AddLine(self.disabledTooltip, 1, 0, 0, true);
+	elseif ( self.lockedIndicator:IsShown() ) then
+		local dungeonID = LFDQueueFrame.type;
+		local roleID = self:GetID();
+		local reasons;
+		GameTooltip:SetText(ERR_ROLE_UNAVAILABLE, 1.0, 1.0, 1.0, true);
+		if ( type(dungeonID) == "number" ) then
+			reasons = GetLFDRoleLockInfo(dungeonID, roleID);
+			for i = 1, #reasons do
+				local text = _G["INSTANCE_UNAVAILABLE_SELF_"..(LFG_INSTANCE_INVALID_CODES[reasons[i]])];
+				if( text ) then
+					GameTooltip:AddLine(text, nil, nil, nil, true);
+				end
+			end
+		else
+			for dungeonID, isChecked in pairs(LFGEnabledList) do
+				if( not LFGIsIDHeader(dungeonID) and isChecked and not LFGLockList[dungeonID] ) then
+					reasons = GetLFDRoleLockInfo(dungeonID, roleID);
+					for i = 1, #reasons do
+						local text = _G["INSTANCE_UNAVAILABLE_SELF_"..(LFG_INSTANCE_INVALID_CODES[reasons[i]])];
+						if( text ) then
+							GameTooltip:AddLine(text, nil, nil, nil, true);
+						end
+					end
+				end
+			end
+		end
+		GameTooltip:Show();
+		return;
+	elseif ( self.alert:IsShown() ) then
+		GameTooltip:SetText(INSTANCE_ROLE_WARNING_TITLE, 1.0, 1.0, 1.0, true);
+		GameTooltip:AddLine(INSTANCE_ROLE_WARNING_TEXT, nil, nil, nil, true);
+	end
+	GameTooltip:Show();
+	LFGFrameRoleCheckButton_OnEnter(self);
+end
+
 function LFGSpecificChoiceEnableButton_SetIsRadio(button, isRadio)
 	if ( isRadio ) then
 		button:SetSize(17, 17)
-		button:SetNormalTexture("Interface\\Buttons\\UI-RadioButton");
-		button:GetNormalTexture():SetTexCoord(0, 0.25, 0, 1);
-		
-		button:SetHighlightTexture("Interface\\Buttons\\UI-RadioButton");
-		button:GetHighlightTexture():SetTexCoord(0.5, 0.75, 0, 1);
-		
-		button:SetCheckedTexture("Interface\\Buttons\\UI-RadioButton");
-		button:GetCheckedTexture():SetTexCoord(0.25, 0.5, 0, 1);
-		
-		button:SetPushedTexture("Interface\\Buttons\\UI-RadioButton");
-		button:GetPushedTexture():SetTexCoord(0, 0.25, 0, 1);
-		
-		button:SetDisabledCheckedTexture("Interface\\Buttons\\UI-RadioButton");
-		button:GetDisabledCheckedTexture():SetTexCoord(0.75, 1, 0, 1);
 	else
 		button:SetSize(20, 20);
-		button:SetNormalTexture("Interface\\Buttons\\UI-CheckBox-Up");
-		button:GetNormalTexture():SetTexCoord(0, 1, 0, 1);
-		
-		button:SetHighlightTexture("Interface\\Buttons\\UI-CheckBox-Highlight");
-		button:GetHighlightTexture():SetTexCoord(0, 1, 0, 1);
-		
-		button:SetCheckedTexture("Interface\\Buttons\\UI-CheckBox-Check");
-		button:GetCheckedTexture():SetTexCoord(0, 1, 0, 1);
-		
-		button:SetPushedTexture("Interface\\Buttons\\UI-CheckBox-Down");
-		button:GetPushedTexture():SetTexCoord(0, 1, 0, 1);
-		
-		button:SetDisabledCheckedTexture("Interface\\Buttons\\UI-CheckBox-Check-Disabled");
-		button:GetDisabledCheckedTexture():SetTexCoord(0, 1, 0, 1);
 	end	
+	SetCheckButtonIsRadio(button, isRadio);
 end
 
 --More functions
@@ -580,7 +600,7 @@ function GetTexCoordsForRoleSmall(role)
 end
 
 function LFGFrameRoleCheckButton_OnEnter(self)
-	if ( self.checkButton:IsEnabled() == 1 ) then
+	if ( self.checkButton:IsEnabled() ) then
 		self.checkButton:LockHighlight();
 	end
 end
@@ -658,6 +678,11 @@ function LFGDungeonReadyPopup_Update()
 		StaticPopupSpecial_Hide(LFGDungeonReadyPopup);
 		return;
 	end
+
+	--When the group doesn't require a role (like scenarios and legacy raids), we get "NONE" as the role
+	if ( role == "NONE" ) then
+		role = "DAMAGER";
+	end
 	
 	LFGDungeonReadyPopup.dungeonID = id;
 	
@@ -841,11 +866,7 @@ function LFGDungeonReadyPopup_Update()
 end
 
 function LFGDungeonReadyDialog_UpdateRewards(dungeonID, role)
-	local doneToday, moneyBase, moneyVar, experienceBase, experienceVar, numRewards = GetLFGDungeonRewards(dungeonID);
-	
-	local numRandoms = 4 - GetNumSubgroupMembers();
-	local moneyAmount = moneyBase + moneyVar * numRandoms;
-	local experienceGained = experienceBase + experienceVar * numRandoms;
+	local doneToday, moneyAmount, moneyVar, experienceGained, experienceVar, numRewards = GetLFGDungeonRewards(dungeonID);
 	
 	local frameID = 1;
 
@@ -940,10 +961,7 @@ function LFGDungeonReadyDialogReward_OnE
 	GameTooltip:SetOwner(self, "ANCHOR_RIGHT");
 	if ( self.rewardType == "misc" ) then
 		GameTooltip:AddLine(REWARD_ITEMS_ONLY);
-		local doneToday, moneyBase, moneyVar, experienceBase, experienceVar, numRewards = GetLFGDungeonRewards(LFGDungeonReadyPopup.dungeonID);
-		local numRandoms = 4 - GetNumSubgroupMembers();
-		local moneyAmount = moneyBase + moneyVar * numRandoms;
-		local experienceGained = experienceBase + experienceVar * numRandoms;
+		local doneToday, moneyAmount, moneyVar, experienceGained, experienceVar, numRewards = GetLFGDungeonRewards(LFGDungeonReadyPopup.dungeonID);
 		
 		if ( experienceGained > 0 ) then
 			GameTooltip:AddLine(string.format(GAIN_EXPERIENCE, experienceGained));
@@ -1223,12 +1241,9 @@ end
 
 --Reward frame functions
 function LFGRewardsFrame_OnLoad(self)
-	local myName = self:GetName();
 	self.numRewardFrames = 1;
 	self.description:SetTextColor(1, 1, 1);
 	self.rewardsDescription:SetTextColor(1, 1, 1);
-	self.pugDescription:SetTextColor(1, 1, 1);
-	self.moneyLabel:SetTextColor(1, 1, 1);
 	self.xpLabel:SetTextColor(1, 1, 1);
 	self.BonusValor.BonusText:SetTextColor(1, 1, 1);
 end
@@ -1249,11 +1264,7 @@ function LFGRewardsFrame_UpdateFrame(par
 	local dungeonName, typeID, subtypeID,_,_,_,_,_,_,_,textureFilename,difficulty,_,dungeonDescription, isHoliday, bonusRepAmount = GetLFGDungeonInfo(dungeonID);
 	local isHeroic = difficulty > 0;
 	local isScenario = (subtypeID == LFG_SUBTYPEID_SCENARIO);
-	local doneToday, moneyBase, moneyVar, experienceBase, experienceVar, numRewards = GetLFGDungeonRewards(dungeonID);
-	local numRandoms = 4 - GetNumSubgroupMembers();
-	local moneyAmount = moneyBase + moneyVar * numRandoms;
-	local experienceGained = experienceBase + experienceVar * numRandoms;
-
+	local doneToday, moneyAmount, moneyVar, experienceGained, experienceVar, numRewards = GetLFGDungeonRewards(dungeonID);
 	
 	local backgroundTexture;
 	
@@ -1375,7 +1386,7 @@ function LFGRewardsFrame_UpdateFrame(par
 	
 	local totalRewards = itemButtonIndex - 1;
 		
-	if ( totalRewards > 0 or ((moneyVar == 0 and experienceVar == 0) and (moneyAmount > 0 or experienceGained > 0)) ) then
+	if ( totalRewards > 0 or moneyAmount > 0 or experienceGained > 0 ) then
 		parentFrame.rewardsLabel:Show();
 		parentFrame.rewardsDescription:Show();
 		lastFrame = parentFrame.rewardsDescription;
@@ -1384,7 +1395,35 @@ function LFGRewardsFrame_UpdateFrame(par
 		parentFrame.rewardsDescription:Hide();
 	end
 	
-	if ( totalRewards > 0 ) then
+	local amountText = parentFrame.MoneyReward.Name;
+	if ( moneyAmount > 0 ) then
+		amountText:SetText(GetMoneyString(moneyAmount));
+		if ( amountText:IsTruncated() ) then
+			amountText:SetText(GetMoneyString(moneyAmount - mod(moneyAmount, 100)));
+			if ( amountText:IsTruncated() ) then
+				amountText:SetText(GetMoneyString(moneyAmount - mod(moneyAmount, 10000)));
+			end
+		end
+
+		if ( itemButtonIndex > 1 ) then
+			if ( mod(itemButtonIndex, 2) == 0 ) then
+				parentFrame.MoneyReward:SetPoint("LEFT", parentName.."Item"..(itemButtonIndex-1), "RIGHT", 0, 0);
+			else
+				parentFrame.MoneyReward:SetPoint("TOPLEFT", parentName.."Item"..(itemButtonIndex-2), "BOTTOMLEFT", 0, -5);
+			end
+		else
+			parentFrame.MoneyReward:SetPoint("TOPLEFT", lastFrame, "BOTTOMLEFT", 0, -5);
+		end
+		
+		parentFrame.MoneyReward:Show();
+	else
+		parentFrame.MoneyReward:Hide();
+	end
+	
+	
+	if ( mod(totalRewards, 2) == 0 and parentFrame.MoneyReward:IsShown() ) then
+		lastFrame = parentFrame.MoneyReward;
+	elseif ( totalRewards > 0 ) then
 		lastFrame = _G[parentName.."Item"..(totalRewards - mod(totalRewards+1, 2))];
 	end
 	
@@ -1398,38 +1437,11 @@ function LFGRewardsFrame_UpdateFrame(par
 	else
 		parentFrame.bonusRepFrame:Hide();
 	end
-
-	if ( moneyVar > 0 or experienceVar > 0 ) then
-		parentFrame.pugDescription:SetPoint("TOPLEFT", lastFrame, "BOTTOMLEFT", 0, -5);
-		parentFrame.pugDescription:Show();
-		lastFrame = parentFrame.pugDescription;
-	else
-		parentFrame.pugDescription:Hide();
-	end
-	
-	if ( moneyAmount > 0 ) then
-		MoneyFrame_Update(parentFrame.moneyFrame, moneyAmount);
-		parentFrame.moneyLabel:SetPoint("TOPLEFT", lastFrame, "BOTTOMLEFT", 20, -10);
-		parentFrame.moneyLabel:Show();
-		parentFrame.moneyFrame:Show()
-		
-		parentFrame.xpLabel:SetPoint("TOPLEFT", lastFrame, "BOTTOMLEFT", 0, -5);
-		
-		lastFrame = parentFrame.moneyLabel;
-	else
-		parentFrame.moneyLabel:Hide();
-		parentFrame.moneyFrame:Hide();
-		
-	end
 	
 	if ( experienceGained > 0 ) then
 		parentFrame.xpAmount:SetText(experienceGained);
+		parentFrame.xpLabel:SetPoint("TOPLEFT", lastFrame, "BOTTOMLEFT", 20, -10);
 		
-		if ( lastFrame == parentFrame.moneyLabel ) then
-			parentFrame.xpLabel:SetPoint("TOPLEFT", lastFrame, "BOTTOMLEFT", 0, -5);
-		else
-			parentFrame.xpLabel:SetPoint("TOPLEFT", lastFrame, "BOTTOMLEFT", 20, -10);
-		end
 		parentFrame.xpLabel:Show();
 		parentFrame.xpAmount:Show();
 		
@@ -1602,15 +1614,29 @@ end
 -- LFR/LFD group invite stuff
 --
 function LFGInvitePopup_UpdateAcceptButton()
-	if ( LFGInvitePopupRoleButtonTank.checkButton:GetChecked() or LFGInvitePopupRoleButtonHealer.checkButton:GetChecked() or LFGInvitePopupRoleButtonDPS.checkButton:GetChecked() ) then
+	if ( LFGRole_GetChecked(LFGInvitePopupRoleButtonTank) or LFGRole_GetChecked(LFGInvitePopupRoleButtonHealer) or LFGRole_GetChecked(LFGInvitePopupRoleButtonDPS) ) then
 		LFGInvitePopupAcceptButton:Enable();
 	else
 		LFGInvitePopupAcceptButton:Disable();
 	end
 end
 
+function LFGInvitePopupCheckButton_OnClick(checkButton)
+	local popup = LFGInvitePopup;
+	if ( not popup.allowMultipleRoles ) then
+		for i=1, #popup.RoleButtons do
+			local cb = popup.RoleButtons[i].checkButton;
+			if ( cb ~= checkButton ) then
+				cb:SetChecked(false);
+			end
+		end
+	end
+
+	LFGInvitePopup_UpdateAcceptButton();
+end
+
 function LFGInvitePopupAccept_OnClick()
-	AcceptGroup(LFGInvitePopupRoleButtonTank.checkButton:GetChecked(), LFGInvitePopupRoleButtonHealer.checkButton:GetChecked(), LFGInvitePopupRoleButtonDPS.checkButton:GetChecked());
+	AcceptGroup(LFGRole_GetChecked(LFGInvitePopupRoleButtonTank), LFGRole_GetChecked(LFGInvitePopupRoleButtonHealer), LFGRole_GetChecked(LFGInvitePopupRoleButtonDPS));
 	StaticPopupSpecial_Hide(LFGInvitePopup);
 end
 
@@ -1619,9 +1645,9 @@ function LFGInvitePopupDecline_OnClick()
 	StaticPopupSpecial_Hide(LFGInvitePopup);
 end
 
-function LFGInvitePopup_Update(inviter, roleTankAvailable, roleHealerAvailable, roleDamagerAvailable)
+function LFGInvitePopup_Update(inviter, roleTankAvailable, roleHealerAvailable, roleDamagerAvailable, allowMultipleRoles)
 	local self = LFGInvitePopup;
-	local canBeTank, canBeHealer, canBeDamager = UnitGetAvailableRoles("player");
+	local canBeTank, canBeHealer, canBeDamager = C_LFGList.GetAvailableRoles();
 	local tankButton = LFGInvitePopupRoleButtonTank;
 	local healerButton = LFGInvitePopupRoleButtonHealer;
 	local damagerButton = LFGInvitePopupRoleButtonDPS;
@@ -1661,6 +1687,13 @@ function LFGInvitePopup_Update(inviter,
 		damagerButton.disabledTooltip = nil;
 		availableRolesField = availableRolesField + 8;
 	end	
+
+	-- update whether we can only have 1 role selected
+	SetCheckButtonIsRadio(tankButton.checkButton, not allowMultipleRoles);
+	SetCheckButtonIsRadio(healerButton.checkButton, not allowMultipleRoles);
+	SetCheckButtonIsRadio(damagerButton.checkButton, not allowMultipleRoles);
+	self.allowMultipleRoles = allowMultipleRoles;
+
 	-- if only 1 role is available, check it otherwise check none
 	tankButton.checkButton:SetChecked(availableRolesField == 2);
 	healerButton.checkButton:SetChecked(availableRolesField == 4);
@@ -1770,7 +1803,7 @@ function LFGDungeonListButton_SetDungeon
 end
 
 function LFGList_DefaultFilterFunction(dungeonID, maxLevelDiff)
-	local name, typeID, subtypeID, minLevel, maxLevel, recLevel, minRecLevel, maxRecLevel, expansionLevel, groupID, textureFilename, difficulty, maxPlayers, description, isHoliday, repAmount, forceHide = GetLFGDungeonInfo(dungeonID);
+	local name, typeID, subtypeID, minLevel, maxLevel, recLevel, minRecLevel, maxRecLevel, expansionLevel, groupID, textureFilename, difficulty, maxPlayers, description, isHoliday, repAmount = GetLFGDungeonInfo(dungeonID);
 	local level = UnitLevel("player");
 
 	--Check whether we're initialized yet
@@ -1778,11 +1811,6 @@ function LFGList_DefaultFilterFunction(d
 		return false;
 	end
 
-	--Sometimes we want to force hide even if the server thinks we can join (e.g. there are certain dungeons where you can only join from the NPCs, so we don't want to show them in the UI)
-	if ( forceHide ) then
-		return false;
-	end
-
 	--If the server tells us we can join, we won't argue
 	if ( not LFGLockList[dungeonID] ) then
 		return true;
@@ -1858,7 +1886,7 @@ function LFG_HasRequiredGroupSize(catego
 	if ( joinType == "specific" ) then	--Random queue
 		for _, queueID in pairs(dungeonList) do
 			if ( not LFGIsIDHeader(queueID) and LFGEnabledList[queueID] and not LFGLockList[queueID] ) then
-				numRequiredPlayers = select(18, GetLFGDungeonInfo(queueID));
+				numRequiredPlayers = select(LFG_RETURN_VALUES.minPlayers, GetLFGDungeonInfo(queueID));
 				if ( numRequiredPlayers and numRequiredPlayers ~= numGroupMembers ) then
 					return false, numRequiredPlayers;
 				end
@@ -1866,14 +1894,14 @@ function LFG_HasRequiredGroupSize(catego
 		end
 		for _, queueID in pairs(hiddenByCollapseList) do
 			if ( not LFGIsIDHeader(queueID) and LFGEnabledList[queueID] and not LFGLockList[queueID] ) then
-				numRequiredPlayers = select(18, GetLFGDungeonInfo(queueID));
+				numRequiredPlayers = select(LFG_RETURN_VALUES.minPlayers, GetLFGDungeonInfo(queueID));
 				if ( numRequiredPlayers and numRequiredPlayers ~= numGroupMembers ) then
 					return false, numRequiredPlayers;
 				end
 			end
 		end
 	else
-		numRequiredPlayers = select(18, GetLFGDungeonInfo(joinType));
+		numRequiredPlayers = select(LFG_RETURN_VALUES.minPlayers, GetLFGDungeonInfo(joinType));
 		if ( numRequiredPlayers and numRequiredPlayers ~= numGroupMembers ) then
 			return false, numRequiredPlayers;
 		end	
@@ -1900,7 +1928,7 @@ end
 
 function LFGDungeonList_SetDungeonEnabled(dungeonID, isEnabled)
 	SetLFGDungeonEnabled(dungeonID, isEnabled);
-	LFGEnabledList[dungeonID] = not not isEnabled; --Change to true/false.
+	LFGEnabledList[dungeonID] = isEnabled;
 end
 
 function LFGDungeonList_SetHeaderEnabled(category, headerID, isEnabled, dungeonList, hiddenByCollapseList)
@@ -1914,7 +1942,7 @@ function LFGDungeonList_SetHeaderEnabled
 			LFGDungeonList_SetDungeonEnabled(dungeonID, isEnabled);
 		end
 	end
-	LFGEnabledList[headerID] = not not isEnabled; --Change to true/false.
+	LFGEnabledList[headerID] = isEnabled;
 end
 
 function LFGDungeonListButton_OnEnter(button, tooltipTitle)
@@ -2119,7 +2147,7 @@ function LFGDungeonListCheckButton_OnCli
 	local dungeonID = parent.id;
 	local isChecked = button:GetChecked();
 
-	PlaySound(isChecked and "igMainMenuOptionCheckBoxOff" or "igMainMenuOptionCheckBoxOff");
+	PlaySound(isChecked and "igMainMenuOptionCheckBoxOn" or "igMainMenuOptionCheckBoxOff");
 	if ( LFGIsIDHeader(dungeonID) ) then
 		LFGDungeonList_SetHeaderEnabled(category, dungeonID, isChecked, dungeonList, hiddenByCollapseList);
 	else
@@ -2180,3 +2208,49 @@ function isRaidFinderDungeonDisplayable(
 	return myLevel >= minLevel and myLevel <= maxLevel and EXPANSION_LEVEL >= expansionLevel;
 end
 
+function LFGRole_GetChecked(button)
+	return button.checkButton:GetChecked();
+end
+
+function LFGRole_SetChecked(button, checked)
+	button.checkButton:SetChecked(checked);
+end
+
+function LFGRoleButtonTemplate_OnLoad(self)
+	self:GetNormalTexture():SetTexCoord(GetTexCoordsForRole(self.role));
+	local classTank, classHealer, classDPS = UnitGetAvailableRoles("player");
+	local id = self.role;
+	if(self.role == "TANK") then
+		if( not classTank ) then
+			self.permDisabledTip = YOUR_CLASS_MAY_NOT_PERFORM_ROLE;
+		else
+			self.permDisabledTip = YOU_ARE_NOT_SPECIALIZED_IN_ROLE;
+		end
+	elseif(self.role == "HEALER")then
+		if( not classHealer ) then
+			self.permDisabledTip = YOUR_CLASS_MAY_NOT_PERFORM_ROLE;
+		else
+			self.permDisabledTip = YOU_ARE_NOT_SPECIALIZED_IN_ROLE;
+		end
+	elseif(self.role == "DAMAGER")then
+		if( not classDPS ) then
+			self.permDisabledTip = YOUR_CLASS_MAY_NOT_PERFORM_ROLE;
+		else
+			self.permDisabledTip = YOU_ARE_NOT_SPECIALIZED_IN_ROLE;
+		end
+	end
+end
+
+function LFGRoleButtonTemplate_OnEnter(self)
+	GameTooltip:SetOwner(self, "ANCHOR_RIGHT");
+	GameTooltip:SetText(_G["ROLE_DESCRIPTION_"..self.role], nil, nil, nil, nil, true);
+	if ( self.permDisabled ) then
+		if(self.permDisabledTip)then
+			GameTooltip:AddLine(self.permDisabledTip, 1, 0, 0, true);
+		end
+	elseif ( self.disabledTooltip and not self:IsEnabled() ) then
+		GameTooltip:AddLine(self.disabledTooltip, 1, 0, 0, true);
+	end
+	GameTooltip:Show();
+	LFGFrameRoleCheckButton_OnEnter(self);
+end