@@ -162,38 +162,46 @@ function RaidFinderQueueFrameSelectionDr
 	end
 end
 
+local function isRaidFinderDungeonDisplayable(id)
+	local name, typeID, subtypeID, minLevel, maxLevel, _, _, _, expansionLevel = GetLFGDungeonInfo(id);
+	local myLevel = UnitLevel("player");
+	return myLevel >= minLevel and myLevel <= maxLevel and EXPANSION_LEVEL >= expansionLevel;
+end
+
 function RaidFinderQueueFrameSelectionDropDown_Initialize(self)
 	local info = UIDropDownMenu_CreateInfo();
 	
 	-- If we ever change this logic, we also need to change the logic in RaidFinderFrame_UpdateAvailability
 	for i=1, GetNumRFDungeons() do
 		local id, name = GetRFDungeonInfo(i);
-		local isAvailable, isAvailableToPlayer = IsLFGDungeonJoinable(id);
-		if ( isAvailable or isAvailableToPlayer or isRaidFinderDungeonDisplayable(id) ) then
-			if ( isAvailable ) then
-				info.text = name; --Note that the dropdown text may be manually changed in RaidFinderQueueFrame_SetRaid
-				info.value = id;
-				info.isTitle = nil;
-				info.func = RaidFinderQueueFrameSelectionDropDownButton_OnClick;
-				info.disabled = nil;
-				info.checked = (RaidFinderQueueFrame.raid == info.value);
-				info.tooltipWhileDisabled = nil;
-				info.tooltipOnButton = nil;
-				info.tooltipTitle = nil;
-				info.tooltipText = nil;
-				UIDropDownMenu_AddButton(info);
-			else
-				info.text = name; --Note that the dropdown text may be manually changed in RaidFinderQueueFrame_SetRaid
-				info.value = id;
-				info.isTitle = nil;
-				info.func = nil;
-				info.disabled = 1;
-				info.checked = nil;
-				info.tooltipWhileDisabled = 1;
-				info.tooltipOnButton = 1;
-				info.tooltipTitle = YOU_MAY_NOT_QUEUE_FOR_THIS;
-				info.tooltipText = LFGConstructDeclinedMessage(id);
-				UIDropDownMenu_AddButton(info);
+		local isAvailable, isAvailableToPlayer, hideIfUnmet = IsLFGDungeonJoinable(id);
+		if( not hideIfUnmet or isAvailable ) then
+			if ( isAvailable or isAvailableToPlayer or isRaidFinderDungeonDisplayable(id) ) then
+				if ( isAvailable ) then
+					info.text = name; --Note that the dropdown text may be manually changed in RaidFinderQueueFrame_SetRaid
+					info.value = id;
+					info.isTitle = nil;
+					info.func = RaidFinderQueueFrameSelectionDropDownButton_OnClick;
+					info.disabled = nil;
+					info.checked = (RaidFinderQueueFrame.raid == info.value);
+					info.tooltipWhileDisabled = nil;
+					info.tooltipOnButton = nil;
+					info.tooltipTitle = nil;
+					info.tooltipText = nil;
+					UIDropDownMenu_AddButton(info);
+				else
+					info.text = name; --Note that the dropdown text may be manually changed in RaidFinderQueueFrame_SetRaid
+					info.value = id;
+					info.isTitle = nil;
+					info.func = nil;
+					info.disabled = 1;
+					info.checked = nil;
+					info.tooltipWhileDisabled = 1;
+					info.tooltipOnButton = 1;
+					info.tooltipTitle = YOU_MAY_NOT_QUEUE_FOR_THIS;
+					info.tooltipText = LFGConstructDeclinedMessage(id);
+					UIDropDownMenu_AddButton(info);
+				end
 			end
 		end
 	end
@@ -227,7 +235,7 @@ function RaidFinderQueueFrame_Join()
 	end
 end
 
-function RaidFinderQueueFrame_UpdateRoleIncentives()
+function RaidFinderQueueFrame_UpdateRoles()
 	local dungeonID = RaidFinderQueueFrame.raid;
 	LFG_SetRoleIconIncentive(RaidFinderQueueFrameRoleButtonTank, nil);
 	LFG_SetRoleIconIncentive(RaidFinderQueueFrameRoleButtonHealer, nil);
@@ -248,28 +256,48 @@ function RaidFinderQueueFrame_UpdateRole
 				end
 			end
 		end
+		
+		local tankLocked, healerLocked, dpsLocked = GetLFDRoleRestrictions(dungeonID);
+		RaidFinder_UpdateRoleButton(RaidFinderQueueFrameRoleButtonTank, tankLocked);
+		RaidFinder_UpdateRoleButton(RaidFinderQueueFrameRoleButtonHealer, healerLocked);
+		RaidFinder_UpdateRoleButton(RaidFinderQueueFrameRoleButtonDPS, dpsLocked);
+	end
+end
+
+function RaidFinder_UpdateRoleButton( button, locked )
+	if( button.permDisabled )then
+		return;
+	end
+	
+	if( locked ) then
+		button.lockedIndicator:Show();
+		button.checkButton:Hide();
+	else
+		button.lockedIndicator:Hide();
+		button.checkButton:Show();
 	end
 end
 
 function RaidFinderFrameRoleCheckButton_OnClick(self)
 	RaidFinderQueueFrame_SetRoles();
-	RaidFinderQueueFrame_UpdateRoleIncentives();
+	RaidFinderQueueFrame_UpdateRoles();
 end
 
 function RaidFinderQueueFrame_SetRoles()
-	SetLFGRoles(RaidFinderQueueFrameRoleButtonLeader.checkButton:GetChecked(), 
-		RaidFinderQueueFrameRoleButtonTank.checkButton:GetChecked(),
-		RaidFinderQueueFrameRoleButtonHealer.checkButton:GetChecked(),
-		RaidFinderQueueFrameRoleButtonDPS.checkButton:GetChecked());
+	SetLFGRoles(LFGRole_GetChecked(RaidFinderQueueFrameRoleButtonLeader),
+		LFGRole_GetChecked(RaidFinderQueueFrameRoleButtonTank),
+		LFGRole_GetChecked(RaidFinderQueueFrameRoleButtonHealer),
+		LFGRole_GetChecked(RaidFinderQueueFrameRoleButtonDPS) );
 end
 
 function RaidFinderQueueFrameRewards_UpdateFrame()
 	LFGRewardsFrame_UpdateFrame(RaidFinderQueueFrameScrollFrameChildFrame, RaidFinderQueueFrame.raid, RaidFinderQueueFrameBackground);
-	RaidFinderQueueFrame_UpdateRoleIncentives();
+	RaidFinderQueueFrame_UpdateRoles();
 end
 
 function RaidFinderFrameFindRaidButton_Update()
 	local mode, subMode = GetLFGMode(LE_LFG_CATEGORY_RF, RaidFinderQueueFrame.raid);
+	--Update the text on the button
 	if ( mode == "queued" or mode == "rolecheck" or mode == "proposal" or mode == "suspended" ) then
 		RaidFinderFrameFindRaidButton:SetText(LEAVE_QUEUE);
 	else
@@ -280,6 +308,7 @@ function RaidFinderFrameFindRaidButton_U
 		end
 	end
 	
+	--Disable the button if we're not in a state where we can make a change
 	if ( LFD_IsEmpowered() and mode ~= "proposal" and mode ~= "listed"  ) then --During the proposal, they must use the proposal buttons to leave the queue.
 		if ( (mode == "queued" or mode == "rolecheck" or mode == "suspended")	--The players can dequeue even if one of the two cover panels is up.
 			or (not RaidFinderQueueFramePartyBackfill:IsVisible() and not RaidFinderQueueFrameCooldownFrame:IsVisible()) ) then
@@ -291,6 +320,22 @@ function RaidFinderFrameFindRaidButton_U
 		RaidFinderFrameFindRaidButton:Disable();
 	end
 
+	--Disable the button if the person is active in LFGList
+	local lfgListDisabled;
+	if ( select(2,C_LFGList.GetNumApplications()) > 0 ) then
+		lfgListDisabled = CANNOT_DO_THIS_WITH_LFGLIST_APP;
+	elseif ( C_LFGList.GetActiveEntryInfo() ) then
+		lfgListDisabled = CANNOT_DO_THIS_WHILE_LFGLIST_LISTED;
+	end
+
+	if ( lfgListDisabled ) then
+		RaidFinderFrameFindRaidButton:Disable();
+		RaidFinderFrameFindRaidButton.tooltip = lfgListDisabled;
+	else
+		RaidFinderFrameFindRaidButton.tooltip = nil;
+	end
+
+	--Update the backfill enable state
 	if ( LFD_IsEmpowered() and mode ~= "proposal" and mode ~= "queued" and mode ~= "suspended" and mode ~= "rolecheck" ) then
 		RaidFinderQueueFramePartyBackfillBackfillButton:Enable();
 	else
@@ -298,6 +343,32 @@ function RaidFinderFrameFindRaidButton_U
 	end
 end
 
+function RaidFinderRoleButton_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:IsVisible() ) then
+		local dungeonID = RaidFinderQueueFrame.raid;
+		local roleID = self:GetID();
+		GameTooltip:SetText(ERR_ROLE_UNAVAILABLE, 1.0, 1.0, 1.0, true);
+		if ( type(dungeonID) == "number" ) then
+			local textTable = LFGRoleButton_LockReasonsTextTable(dungeonID, roleID);
+			for text,_ in pairs( textTable ) do
+				GameTooltip:AddLine(text, nil, nil, nil, true);
+			end
+		end
+		GameTooltip:Show();
+		return;
+	end
+	GameTooltip:Show();
+	LFGFrameRoleCheckButton_OnEnter(self);
+end
+
 --Cooldown panel
 function RaidFinderQueueFrameCooldownFrame_OnLoad(self)
 	self:SetFrameLevel(RaidFinderQueueFrame:GetFrameLevel() + 9);	--This value also needs to be set when SetParent is called in LFDQueueFrameRandomCooldownFrame_Update.