@@ -9,24 +9,44 @@ local MAX_CREATURES_PER_ENCOUNTER = 9;
 local SECTION_BUTTON_OFFSET = 6;
 local SECTION_DESCRIPTION_OFFSET = 27;
 
-
 local EJ_STYPE_ITEM = 0;
 local EJ_STYPE_ENCOUNTER = 1;
 local EJ_STYPE_CREATURE = 2;
 local EJ_STYPE_SECTION = 3;
 local EJ_STYPE_INSTANCE = 4;
 
+local EJ_HTYPE_OVERVIEW = 3;
 
 local EJ_NUM_INSTANCE_PER_ROW = 4;
 
 local EJ_LORE_MAX_HEIGHT = 97;
 local EJ_MAX_SECTION_MOVE = 320;
 
+-- Priority list for *not my spec*
+local overviewPriorities = {
+	[1] = "DAMAGER",
+	[2] = "HEALER",
+	[3] = "TANK",
+}
+
+local flagsByRole = {
+	["DAMAGER"] = 1,
+	["HEALER"] = 2,
+	["TANK"] = 0,
+}
+
+local rolesByFlag = {
+	[0] = "TANK",
+	[1] = "DAMAGER",
+	[2] = "HEALER"
+}
 
 local EJ_Tabs = {};
-EJ_Tabs[1] = {frame="detailsScroll", button="bossTab"};
+
+EJ_Tabs[1] = {frame="overviewScroll", button="overviewTab"};
 EJ_Tabs[2] = {frame="lootScroll", button="lootTab"};
-EJ_Tabs[3] = {frame="model", button="modelTab"};
+EJ_Tabs[3] = {frame="detailsScroll", button="bossTab"};
+EJ_Tabs[4] = {frame="model", button="modelTab"};
 
 
 local EJ_section_openTable = {};
@@ -38,23 +58,28 @@ local EJ_LINK_SECTION 		= 3;
 
 local EJ_DIFFICULTIES =  
 {
-	[1] = { size = 5, prefix = PLAYER_DIFFICULTY1, difficultyID = 1 },
-	[2] = { size = 5, prefix = PLAYER_DIFFICULTY2, difficultyID =  2 },
-	[3] = { size = 25, prefix = PLAYER_DIFFICULTY3, difficultyID = 7 },
-	[4] = { size = 10, prefix = PLAYER_DIFFICULTY1, difficultyID = 3 },
-	[5] = { size = 10, prefix = PLAYER_DIFFICULTY2, difficultyID = 5 },
-	[6] = { size = 25, prefix = PLAYER_DIFFICULTY1, difficultyID = 4 },
-	[7] = { size = 25, prefix = PLAYER_DIFFICULTY2, difficultyID = 6 },
-	[8] = { size = "10-25", prefix = PLAYER_DIFFICULTY4, difficultyID = 14 },
+	{ size = "5", prefix = PLAYER_DIFFICULTY1, difficultyID = 1 },
+	{ size = "5", prefix = PLAYER_DIFFICULTY2, difficultyID =  2 },
+	{ size = "5", prefix = PLAYER_DIFFICULTY5, difficultyID = 8 },
+	{ size = "25", prefix = PLAYER_DIFFICULTY3, difficultyID = 7 },
+	{ size = "10", prefix = PLAYER_DIFFICULTY1, difficultyID = 3 },
+	{ size = "10", prefix = PLAYER_DIFFICULTY2, difficultyID = 5 },
+	{ size = "25", prefix = PLAYER_DIFFICULTY1, difficultyID = 4 },
+	{ size = "25", prefix = PLAYER_DIFFICULTY2, difficultyID = 6 },
+	{ size = "10-25", prefix = PLAYER_DIFFICULTY3, difficultyID = 17 },
+	{ size = "10-30", prefix = PLAYER_DIFFICULTY1, difficultyID = 14 },
+	{ size = "10-30", prefix = PLAYER_DIFFICULTY2, difficultyID = 15 },
+	{ size = "20", prefix = PLAYER_DIFFICULTY6, difficultyID = 16 },
 }
 
 local EJ_TIER_DATA =
 {
-	[1] = { backgroundTexture = "Interface\\EncounterJournal\\UI-EJ-Classic", r = 1.0, g = 0.8, b = 0.0},
-	[2] = { backgroundTexture = "Interface\\EncounterJournal\\UI-EJ-BurningCrusade", r = 0.6, g = 0.8, b = 0.0},
-	[3] = { backgroundTexture = "Interface\\EncounterJournal\\UI-EJ-WrathoftheLichKing", r = 0.2, g = 0.8, b = 1.0},
-	[4] = { backgroundTexture = "Interface\\EncounterJournal\\UI-EJ-Cataclysm", r = 1.0, g = 0.4, b = 0.0},
-	[5] = { backgroundTexture = "Interface\\EncounterJournal\\UI-EJ-MistsofPandaria", r = 0.0, g = 0.6, b = 0.2},
+	[1] = { backgroundTexture = "Interface\\EncounterJournal\\UI-EJ-Classic", r = 1.0, g = 0.8, b = 0.0 },
+	[2] = { backgroundTexture = "Interface\\EncounterJournal\\UI-EJ-BurningCrusade", r = 0.6, g = 0.8, b = 0.0 },
+	[3] = { backgroundTexture = "Interface\\EncounterJournal\\UI-EJ-WrathoftheLichKing", r = 0.2, g = 0.8, b = 1.0 },
+	[4] = { backgroundTexture = "Interface\\EncounterJournal\\UI-EJ-Cataclysm", r = 1.0, g = 0.4, b = 0.0 },
+	[5] = { backgroundTexture = "Interface\\EncounterJournal\\UI-EJ-MistsofPandaria", r = 0.0, g = 0.6, b = 0.2 },
+	[6] = { backgroundTexture = "Interface\\EncounterJournal\\UI-EJ-Classic", r = 1.0, g = 0.8, b = 0.0 },
 }
 
 
@@ -72,13 +97,18 @@ function EncounterJournal_OnLoad(self)
 	self.encounter.freeHeaders = {};
 	self.encounter.usedHeaders = {};
 	
+	self.encounter.overviewFrame = self.encounter.info.overviewScroll.child;
+	self.encounter.overviewFrame.isOverview = true;
+	self.encounter.overviewFrame.overviews = {};
+	self.encounter.info.overviewScroll.ScrollBar.scrollStep = 30;
+
 	self.encounter.infoFrame = self.encounter.info.detailsScroll.child;
 	self.encounter.info.detailsScroll.ScrollBar.scrollStep = 30;	
 	
 	self.encounter.bossesFrame = self.encounter.info.bossesScroll.child;
 	self.encounter.info.bossesScroll.ScrollBar.scrollStep = 30;	
 	
-	self.encounter.info.bossTab:Click();
+	self.encounter.info.overviewTab:Click();
 	
 	self.encounter.info.lootScroll.update = EncounterJournal_LootUpdate;
 	self.encounter.info.lootScroll.scrollBar.doNotHide = true;
@@ -100,7 +130,6 @@ function EncounterJournal_OnLoad(self)
 	local homeData = {
 		name = HOME,
 		OnClick = EncounterJournal_ListInstances,
-		listFunc = EJNAV_ListInstance,
 	}
 	NavBar_Initialize(self.navBar, "NavButtonTemplate", homeData, self.navBar.home, self.navBar.overflow);
 	
@@ -143,6 +172,19 @@ function EncounterJournal_OnShow(self)
 		-- fixes portraits when switching between fullscreen and windowed mode
 		EncounterJournal_UpdatePortraits();
 		EncounterJournal.queuedPortraitUpdate = false;
+	elseif ( self.encounter.overviewFrame:IsShown() and EncounterJournal.overviewDefaultRole and not EncounterJournal.encounter.overviewFrame.linkSection ) then
+		local spec, role;
+
+		spec = GetSpecialization();
+		if (spec) then
+			role = GetSpecializationRole(spec);
+		else
+			role = "DAMAGER";
+		end
+
+		if ( EncounterJournal.overviewDefaultRole ~= role ) then
+			EncounterJournal_ToggleHeaders(EncounterJournal.encounter.overviewFrame);
+		end
 	end
 
 	local tierData = EJ_TIER_DATA[EJ_GetCurrentTier()];
@@ -233,7 +275,7 @@ function EncounterJournal_ListInstances(
 	NavBar_Reset(EncounterJournal.navBar);
 	EncounterJournal.encounter:Hide();
 	EncounterJournal.instanceSelect:Show();
-	local showRaid = EncounterJournal.instanceSelect.raidsTab:IsEnabled() == nil;
+	local showRaid = not EncounterJournal.instanceSelect.raidsTab:IsEnabled();
 	
 
 	local self = EncounterJournal.instanceSelect.scroll.child;
@@ -252,7 +294,7 @@ function EncounterJournal_ListInstances(
 		return;
 	end
 	infiniteLoopPolice = false;
-	
+
 	while instanceID do
 		instanceButton = self["instance"..index];
 		if not instanceButton then -- create button
@@ -275,7 +317,7 @@ function EncounterJournal_ListInstances(
 		instanceButton.tooltipText = description;
 		instanceButton.link = link;
 		instanceButton:Show();
-		
+
 		index = index + 1;
 		instanceID, name, description, _, buttonImage, _, _, link = EJ_GetInstanceByIndex(index, showRaid);
 	end
@@ -299,6 +341,46 @@ function EncounterJournal_ListInstances(
 	end
 end
 
+function EncounterJournalInstanceButton_OnClick(self)
+	NavBar_Reset(EncounterJournal.navBar);
+	EncounterJournal_DisplayInstance(EncounterJournal.instanceID);
+end
+
+local function EncounterJournal_GetRootAfterOverviews(rootSectionID)
+	local nextSectionID = rootSectionID;
+
+	local headerType, siblingID, _;
+
+	repeat
+		_, _, headerType, _, _, siblingID = EJ_GetSectionInfo(nextSectionID);
+		if (headerType == EJ_HTYPE_OVERVIEW) then
+			nextSectionID = siblingID;
+		end
+	until headerType ~= EJ_HTYPE_OVERVIEW;
+
+	return nextSectionID;
+end
+
+local function EncounterJournal_CheckForOverview(rootSectionID)
+	return select(3,EJ_GetSectionInfo(rootSectionID)) == EJ_HTYPE_OVERVIEW;
+end
+
+local function EncounterJournal_SearchForOverview(instanceID)
+	local bossIndex = 1;
+	local _, _, bossID = EJ_GetEncounterInfoByIndex(bossIndex);
+	while bossID do
+		local _, _, _, rootSectionID = EJ_GetEncounterInfo(bossID);
+
+		if (EncounterJournal_CheckForOverview(rootSectionID)) then
+			return true;
+		end
+
+		bossIndex = bossIndex + 1;
+		_, _, bossID = EJ_GetEncounterInfoByIndex(bossIndex);
+	end
+
+	return false;
+end
 
 function EncounterJournal_DisplayInstance(instanceID, noButton)
 	local self = EncounterJournal.encounter;
@@ -312,7 +394,7 @@ function EncounterJournal_DisplayInstanc
 	EncounterJournal_LootUpdate();
 	EncounterJournal_ClearDetails()
 	
-	local iname, description, bgImage, _, loreImage = EJ_GetInstanceInfo();
+	local iname, description, bgImage, _, loreImage, buttonImage = EJ_GetInstanceInfo();
 	self.instance.title:SetText(iname);
 	self.instance.titleBG:SetWidth(self.instance.title:GetStringWidth() + 80);
 	self.instance.loreBG:SetTexture(loreImage);
@@ -327,11 +409,16 @@ function EncounterJournal_DisplayInstanc
 		self.instance.loreScroll.ScrollBar:Show();
 	end
 	
+	self.info.instanceButton.instanceID = instanceID;
+	self.info.instanceButton.icon:SetTexture(buttonImage);
+	self.info.instanceButton.icon:SetMask("Interface\\CharacterFrame\\TempPortraitAlphaMask");
+	
 	self.info.model.dungeonBG:SetTexture(bgImage);
 	
 	local bossIndex = 1;
 	local name, description, bossID, _, link = EJ_GetEncounterInfoByIndex(bossIndex);
 	local bossButton;
+
 	while bossID do
 		bossButton = _G["EncounterJournalBossButton"..bossIndex];
 		if not bossButton then -- create a new header;
@@ -357,19 +444,40 @@ function EncounterJournal_DisplayInstanc
 		name, description, bossID, _, link = EJ_GetEncounterInfoByIndex(bossIndex);
 	end
 	
-	--disable model tab, no boss selected
+	--disable model tab and abilities tab, no boss selected
 	EncounterJournal.encounter.info.modelTab:Disable();
 	EncounterJournal.encounter.info.modelTab:GetDisabledTexture():SetDesaturated(true);
 	EncounterJournal.encounter.info.modelTab.unselected:SetDesaturated(true);
-	
+	EncounterJournal.encounter.info.bossTab:Disable();
+	EncounterJournal.encounter.info.bossTab:GetDisabledTexture():SetDesaturated(true);
+	EncounterJournal.encounter.info.bossTab.unselected:SetDesaturated(true);
+
+	if (EncounterJournal_SearchForOverview(instanceID)) then
+		EJ_Tabs[1].frame = "overviewScroll";
+		EJ_Tabs[3].frame = "detailsScroll"; -- flip them back
+		self.info[EJ_Tabs[1].button].tooltip = OVERVIEW;
+		self.info[EJ_Tabs[3].button]:Show();
+		self.info[EJ_Tabs[4].button]:SetPoint("TOP", self.info[EJ_Tabs[3].button], "BOTTOM", 0, 2)
+		self.info.overviewFound = true;
+	else
+		EJ_Tabs[1].frame = "detailsScroll";
+		EJ_Tabs[3].frame = "overviewScroll"; -- flip these so detailsScroll won't get hidden, overview will never be shown here
+		self.info[EJ_Tabs[1].button].tooltip = ABILITIES;
+		self.info[EJ_Tabs[3].button]:Hide();
+		self.info[EJ_Tabs[4].button]:SetPoint("TOP", self.info[EJ_Tabs[2].button], "BOTTOM", 0, 2)
+		self.info.overviewFound = false;
+	end
+
 	self.instance:Show();
+	self.info.overviewScroll:Hide();
 	self.info.detailsScroll:Hide();
 	self.info.lootScroll:Hide();
 	self.info.rightShadow:Hide();
-	if (self.info.tab < 3) then
+	
+	if (self.info.tab < 4) then
 		self.info[EJ_Tabs[self.info.tab].button]:Click()
 	else
-		self.info.bossTab:Click();
+		self.info.overviewTab:Click();
 	end
 	
 	if not noButton then
@@ -377,7 +485,7 @@ function EncounterJournal_DisplayInstanc
 			id = instanceID,
 			name = iname,
 			OnClick = EJNAV_RefreshInstance,
-			listFunc = EJNAV_ListEncounter
+			listFunc = EJNAV_ListInstance,
 		}
 		NavBar_AddButton(EncounterJournal.navBar, buttonData);
 	end
@@ -405,8 +513,36 @@ function EncounterJournal_DisplayEncount
 	
 	self.info.encounterTitle:SetText(ename);
 	
+	local overviewFound;
+	if (EncounterJournal_CheckForOverview(rootSectionID)) then
+		local _, overviewDescription = EJ_GetSectionInfo(rootSectionID);
+		self.overviewFrame.loreDescription:SetHeight(0);
+		self.overviewFrame.loreDescription:SetText(description);
+		self.overviewFrame.loreDescription:SetWidth(self.overviewFrame:GetWidth() - 5);
+		self.overviewFrame.overviewDescription:SetWidth(self.overviewFrame:GetWidth() - 5);
+		self.overviewFrame.overviewDescription.Text:SetWidth(self.overviewFrame:GetWidth() - 5);
+		EncounterJournal_SetBullets(self.overviewFrame.overviewDescription, overviewDescription, false);
+		local bulletHeight = 0;
+		if (self.overviewFrame.Bullets) then
+			for i = 1, #self.overviewFrame.Bullets do
+				if (i == 1) then
+					local bullet = self.overviewFrame.Bullets[i];
+					bullet:ClearAllPoints();
+					bullet:SetPoint("TOPLEFT", self.overviewFrame.overviewDescription, "BOTTOMLEFT", 0, -9);
+				end
+				bulletHeight = bulletHeight + self.overviewFrame.Bullets[i]:GetHeight();
+			end
+		end
+		self.overviewFrame.descriptionHeight = self.overviewFrame.loreDescription:GetHeight() + self.overviewFrame.overviewDescription:GetHeight() + bulletHeight + 42;
+		self.overviewFrame.rootOverviewSectionID = rootSectionID;
+		rootSectionID = EncounterJournal_GetRootAfterOverviews(rootSectionID);
+		overviewFound = true;
+	end
+	
 	self.infoFrame.description:SetText(description);
 	self.infoFrame.description:SetWidth(self.infoFrame:GetWidth() -5);
+	self.infoFrame.descriptionHeight = self.infoFrame.description:GetHeight();
+	
 	self.infoFrame.encounterID = encounterID;
 	self.infoFrame.rootSectionID = rootSectionID;
 	self.infoFrame.expanded = false;
@@ -459,12 +595,23 @@ function EncounterJournal_DisplayEncount
 		end
 	end
 	
-	--enable model tab
+	--enable model and abilities tab
 	EncounterJournal.encounter.info.modelTab:Enable();
 	EncounterJournal.encounter.info.modelTab:GetDisabledTexture():SetDesaturated(false);
 	EncounterJournal.encounter.info.modelTab.unselected:SetDesaturated(false);
+	EncounterJournal.encounter.info.bossTab:Enable();
+	EncounterJournal.encounter.info.bossTab:GetDisabledTexture():SetDesaturated(false);
+	EncounterJournal.encounter.info.bossTab.unselected:SetDesaturated(false);
+
+	if (overviewFound) then
+		EncounterJournal_ToggleHeaders(self.overviewFrame);
+		self.overviewFrame:Show();
+	else
+		self.overviewFrame:Hide();
+	end
+
+	EncounterJournal_ToggleHeaders(self.infoFrame);
 	
-	EncounterJournal_ToggleHeaders(self.infoFrame)
 	self:Show();
 	
 	--make sure we stay on the tab we were on
@@ -475,6 +622,7 @@ function EncounterJournal_DisplayEncount
 			id = encounterID,
 			name = ename,
 			OnClick = EJNAV_RefreshEncounter,
+			listFunc = EJNAV_ListEncounter,
 		}
 		NavBar_AddButton(EncounterJournal.navBar, buttonData);
 	end
@@ -493,6 +641,21 @@ function EncounterJournal_DisplayCreatur
 	end
 		
 	EncounterJournal.encounter.info.model.imageTitle:SetText(self.name);
+	if (IsGMClient()) then
+		local displayID, name = EncounterJournal.encounter.info.model:GetModelInfo();
+		EncounterJournal.encounter.info.model.modelName:SetText(name);
+		EncounterJournal.encounter.info.model.modelDisplayId:SetText(displayID);
+		EncounterJournal.encounter.info.model.modelName:Show();
+		EncounterJournal.encounter.info.model.modelDisplayId:Show();
+		EncounterJournal.encounter.info.model.modelNameLabel:Show();
+		EncounterJournal.encounter.info.model.modelDisplayIdLabel:Show();
+	else
+		EncounterJournal.encounter.info.model.modelName:Hide();
+		EncounterJournal.encounter.info.model.modelDisplayId:Hide();
+		EncounterJournal.encounter.info.model.modelNameLabel:Hide();
+		EncounterJournal.encounter.info.model.modelDisplayIdLabel:Hide();
+	end
+
 	self:Disable();
 	EncounterJournal.encounter.info.shownCreatureButton = self;
 end
@@ -521,222 +684,531 @@ end
 
 local toggleTempList = {};
 local headerCount = 0;
+
+function EncounterJournal_UpdateButtonState(self)
+	local oldtex = self.textures.expanded;
+	if self:GetParent().expanded then
+		self.tex = self.textures.expanded;
+		oldtex = self.textures.collapsed;
+		self.expandedIcon:SetTextColor(0.929, 0.788, 0.620);
+		self.title:SetTextColor(0.929, 0.788, 0.620);
+	else
+		self.tex = self.textures.collapsed;
+		self.expandedIcon:SetTextColor(0.827, 0.659, 0.463);
+		self.title:SetTextColor(0.827, 0.659, 0.463);
+	end
+	
+	oldtex.up[1]:Hide();
+	oldtex.up[2]:Hide();
+	oldtex.up[3]:Hide();
+	oldtex.down[1]:Hide();
+	oldtex.down[2]:Hide();
+	oldtex.down[3]:Hide();
+	
+	
+	self.tex.up[1]:Show();
+	self.tex.up[2]:Show();
+	self.tex.up[3]:Show();
+	self.tex.down[1]:Hide();
+	self.tex.down[2]:Hide();
+	self.tex.down[3]:Hide();
+end
+
+function EncounterJournal_CleanBullets(self, start, keep)
+	if (not self.Bullets) then return end
+    start = start or 1;
+	for i = start, #self.Bullets do
+		self.Bullets[i]:Hide();
+		if (not keep) then
+			if (not self.BulletCache) then
+				self.BulletCache = {};
+			end
+			self.Bullets[i]:ClearAllPoints();
+			tinsert(self.BulletCache, self.Bullets[i]);
+			self.Bullets[i] = nil;
+		end
+	end
+end
+
+function EncounterJournal_SetBullets(object, description, hideBullets)
+	local parent = object:GetParent();
+
+	if (not string.find(description, "\$bullet;")) then
+		object.Text:SetText(description);
+		object.textString = description;
+		object:SetHeight(object.Text:GetContentHeight());
+		EncounterJournal_CleanBullets(parent);
+		return;
+	end
+
+	local desc = string.match(description, "(.-)\$bullet;");
+
+	if (desc) then
+		object.Text:SetText(desc);
+		object.textString = desc;
+		object:SetHeight(object.Text:GetContentHeight());
+	end
+	
+	local bullets = {}
+	for v in string.gmatch(description,"\$bullet;([^$]+)") do
+		tinsert(bullets, v);
+	end
+
+	local k = 1;
+	for j = 1,#bullets do
+		local text = bullets[j];
+		if (text and text ~= "") then
+			local bullet;
+			if (not parent.Bullets) then
+				parent.Bullets = {};
+			end
+			bullet = parent.Bullets[k];
+			if (not bullet) then
+				if (parent.BulletCache) then
+					parent.Bullets[k] = tremove(parent.BulletCache);
+					bullet = parent.Bullets[k];
+				else
+					bullet = CreateFrame("Frame", nil, parent, "EncounterOverviewBulletTemplate");
+				end
+				bullet:SetWidth(parent:GetWidth() - 13);
+				bullet.Text:SetWidth(bullet:GetWidth() - 26);
+			end
+			bullet:ClearAllPoints();
+			if (k == 1) then
+				if (parent.button) then
+					bullet:SetPoint("TOPLEFT", parent.button, "BOTTOMLEFT", 13, -9 - object:GetHeight());
+				else
+					bullet:SetPoint("TOPLEFT", parent, "TOPLEFT", 13, -9 - object:GetHeight());
+				end
+			else
+				bullet:SetPoint("TOP", parent.Bullets[k-1], "BOTTOM", 0, 0);
+			end
+			bullet.Text:SetText(text);
+			bullet:SetHeight(bullet.Text:GetContentHeight());
+
+			if (hideBullets) then
+				bullet:Hide();
+			else
+				bullet:Show();
+			end
+			k = k + 1;
+		end
+	end
+
+	EncounterJournal_CleanBullets(parent, #bullets + 1);
+end
+
+function EncounterJournal_SetDescriptionWithBullets(infoHeader, description)
+	EncounterJournal_SetBullets(infoHeader.overviewDescription, description, true);
+
+	infoHeader.descriptionBG:ClearAllPoints();
+	infoHeader.descriptionBG:SetPoint("TOPLEFT", infoHeader.button, "BOTTOMLEFT", 1, 0);
+	if (infoHeader.Bullets and #infoHeader.Bullets > 0) then
+		infoHeader.descriptionBG:SetPoint("BOTTOMRIGHT", infoHeader.Bullets[#infoHeader.Bullets], -1, -11);
+	else
+		infoHeader.descriptionBG:SetPoint("BOTTOMRIGHT", infoHeader.overviewDescription, 9, -11);
+	end
+	infoHeader.descriptionBG:Hide();
+	infoHeader.descriptionBGBottom:Hide();
+end
+
+function EncounterJournal_SetUpOverview(self, role, index)
+	if not self.overviews[index] then -- create a new header;
+		infoHeader = CreateFrame("FRAME", "EncounterJournalOverviewInfoHeader"..index, EncounterJournal.encounter.overviewFrame, "EncounterInfoTemplate");
+		infoHeader.description:Hide();
+		infoHeader.overviewDescription:Hide();
+		infoHeader.descriptionBG:Hide();
+		infoHeader.descriptionBGBottom:Hide();
+		infoHeader.button.abilityIcon:Hide();
+		infoHeader.button.portrait:Hide();
+		infoHeader.button.portrait.name = nil;
+		infoHeader.button.portrait.displayInfo = nil;
+		infoHeader.button.icon2:Hide();
+		infoHeader.button.icon3:Hide();
+		infoHeader.button.icon4:Hide();
+		infoHeader.overviewIndex = index;
+		infoHeader.isOverview = true;
+
+		local textLeftAnchor = infoHeader.button.expandedIcon;
+		local textRightAnchor = infoHeader.button.icon1;
+		infoHeader.button.title:SetPoint("LEFT", textLeftAnchor, "RIGHT", 5, 0);
+		infoHeader.button.title:SetPoint("RIGHT", textRightAnchor, "LEFT", -5, 0);
+
+		self.overviews[index] = infoHeader;
+	else
+		infoHeader = self.overviews[index];
+	end
+
+	infoHeader.button.expandedIcon:SetText("+");
+	infoHeader.expanded = false;
+	
+	infoHeader:ClearAllPoints();
+	if (index == 1) then
+		infoHeader:SetPoint("TOPLEFT", 0, -15 - self.descriptionHeight - SECTION_BUTTON_OFFSET);
+		infoHeader:SetPoint("TOPRIGHT", 0, -15 - self.descriptionHeight - SECTION_BUTTON_OFFSET);
+	else
+		infoHeader:SetPoint("TOPLEFT", self.overviews[index-1], "BOTTOMLEFT", 0, -9);
+		infoHeader:SetPoint("TOPRIGHT", self.overviews[index-1], "BOTTOMRIGHT", 0, -9);
+	end
+
+	infoHeader.description:Hide();
+
+	for i = 1, #infoHeader.Bullets do
+		infoHeader.Bullets[i]:Hide();
+	end
+
+	wipe(infoHeader.Bullets);
+	local flag1, title, description, link;
+	
+	local _, _, _, _, _, _, nextSectionID =  EJ_GetSectionInfo(self.rootOverviewSectionID);
+
+	while nextSectionID do
+		title, description, _, _, _, siblingID, _, _, link, _, flag1 = EJ_GetSectionInfo(nextSectionID);
+		if (role == rolesByFlag[flag1]) then
+			break;
+		end
+		nextSectionID = siblingID;
+	end
+
+	if (not title) then
+		return;
+	end
+	
+	infoHeader.button.icon1:Show();
+	EncounterJournal_SetFlagIcon(infoHeader.button.icon1.icon, flag1);
+
+	infoHeader.button.title:SetText(title);
+	infoHeader.button.link = link;
+	infoHeader.sectionID = nextSectionID;
+	
+	infoHeader.overviewDescription:SetWidth(infoHeader:GetWidth() - 20);
+	EncounterJournal_SetDescriptionWithBullets(infoHeader, description);
+	infoHeader:Show();
+end
+
 function EncounterJournal_ToggleHeaders(self, doNotShift)
 	local numAdded = 0
 	local infoHeader, parentID, _;
 	local hWidth = self:GetWidth();
 	local nextSectionID;
 	local topLevelSection = false;
-	if self.myID then  -- this is from a button click
-		_, _, _, _, _, _, nextSectionID =  EJ_GetSectionInfo(self.myID)
-		parentID = self.myID;
-		self.description:SetWidth(self:GetWidth() -20);
-		hWidth = hWidth - HEADER_INDENT;
-	else
-		--This sets the base encounter header
-		parentID = self.encounterID;
-		nextSectionID = self.rootSectionID;
-		topLevelSection = true;
-	end
 	
+	local isOverview = self.isOverview;
 	
-	local freeHeaders = EncounterJournal.encounter.freeHeaders;
-	local usedHeaders = EncounterJournal.encounter.usedHeaders;
-	
-	self.expanded = not self.expanded;
-	local hideHeaders = not self.expanded;
+	local hideHeaders;
+	if (not self.isOverview or (self.isOverview and self.overviewIndex)) then
+		self.expanded = not self.expanded;
+		hideHeaders = not self.expanded;
+	end
+
 	if hideHeaders then
-		-- This can only happen for buttons
 		self.button.expandedIcon:SetText("+");
 		self.description:Hide();
+		if (self.overviewDescription) then
+			self.overviewDescription:Hide();
+		end
 		self.descriptionBG:Hide();
 		self.descriptionBGBottom:Hide();
-		
-		EncounterJournal_ClearChildHeaders(self);
-	else
-		if strlen(self.description:GetText() or "") > 0 then
-			self.description:Show();
-			if self.button then
-				self.descriptionBG:Show();
-				self.descriptionBGBottom:Show();
-				self.button.expandedIcon:SetText("-");
+
+		EncounterJournal_CleanBullets(self, nil, true);
+			
+		if (self.overviewIndex) then
+			local overview = EncounterJournal.encounter.overviewFrame.overviews[self.overviewIndex + 1];
+
+			if (overview) then
+				overview:SetPoint("TOPLEFT", self, "BOTTOMLEFT", 0, -9);
 			end
-		elseif self.button then
-			self.description:Hide();
-			self.descriptionBG:Hide();
-			self.descriptionBGBottom:Hide();
-			self.button.expandedIcon:SetText("-");
+		else
+			EncounterJournal_ClearChildHeaders(self);
 		end
-	
-		-- Get Section Info
-		local listEnd  = #usedHeaders;
-		while nextSectionID do
-			local title, description, headerType, abilityIcon, displayInfo, siblingID, _, fileredByDifficulty, link, startsOpen, flag1, flag2, flag3, flag4 = EJ_GetSectionInfo(nextSectionID);
-			if not title then
-				break;
-			elseif not fileredByDifficulty then --ignore all sections that should not be shown with our current difficulty settings		
-				if #freeHeaders == 0 then -- create a new header;
-					headerCount = headerCount + 1; -- the is a file local
-					infoHeader = CreateFrame("FRAME", "EncounterJournalInfoHeader"..headerCount, EncounterJournal.encounter.infoFrame, "EncounterInfoTemplate");
-					infoHeader:Hide();
-				else
-					infoHeader = freeHeaders[#freeHeaders];
-					freeHeaders[#freeHeaders] = nil;
+	else
+		if (not isOverview) then
+			if strlen(self.description:GetText() or "") > 0 then
+				self.description:Show();
+				if (self.overviewDescription) then
+					self.overviewDescription:Hide();
 				end
-				
-				numAdded = numAdded + 1;
-				toggleTempList[#toggleTempList+1] = infoHeader;
-				
-				infoHeader.button.link = link;
-				infoHeader.parentID = parentID;
-				infoHeader.myID = nextSectionID;
-				infoHeader.description:SetText(description);
-				infoHeader.button.title:SetText(title);
-				if topLevelSection then
-					infoHeader.button.title:SetFontObject("GameFontNormalMed3");
-				else
-					infoHeader.button.title:SetFontObject("GameFontNormal");
+				if self.button then
+					self.descriptionBG:Show();
+					self.descriptionBGBottom:Show();
+					self.button.expandedIcon:SetText("-");
 				end
-				
-				--All headers start collapsed
-				infoHeader.expanded = false
-				infoHeader.description:Hide();
-				infoHeader.descriptionBG:Hide();
-				infoHeader.descriptionBGBottom:Hide();
-				infoHeader.button.expandedIcon:SetText("+");
-				
-				
-				local textLeftAnchor = infoHeader.button.expandedIcon;
-				--Show ability Icon
-				if abilityIcon ~= "" then
-					infoHeader.button.abilityIcon:SetTexture(abilityIcon);
-					infoHeader.button.abilityIcon:Show();
-					textLeftAnchor = infoHeader.button.abilityIcon;
-				else
-					infoHeader.button.abilityIcon:Hide();
+			elseif self.button then
+				self.description:Hide();
+				if (self.overviewDescription) then
+					self.overviewDescription:Hide();
 				end
-				
-				--Show Creature Portrait
-				if displayInfo ~= 0 then
-					SetPortraitTexture(infoHeader.button.portrait.icon, displayInfo);
-					infoHeader.button.portrait.name = title;
-					infoHeader.button.portrait.displayInfo = displayInfo;
-					infoHeader.button.portrait:Show();
-					textLeftAnchor = infoHeader.button.portrait;
-					infoHeader.button.abilityIcon:Hide();
-				else
-					infoHeader.button.portrait:Hide();
-					infoHeader.button.portrait.name = nil;
-					infoHeader.button.portrait.displayInfo = nil;
+				self.descriptionBG:Hide();
+				self.descriptionBGBottom:Hide();
+				self.button.expandedIcon:SetText("-");
+			end
+		else
+			if (self.overviewIndex) then
+				self.button.expandedIcon:SetText("-");
+				for i = 1, #self.Bullets do
+					self.Bullets[i]:Show();
 				end
-				infoHeader.button.title:SetPoint("LEFT", textLeftAnchor, "RIGHT", 5, 0);
-				
+				self.description:Hide();
+				self.overviewDescription:Show();
+				self.descriptionBG:Show();
+				self.descriptionBGBottom:Show();
 				
-				--Set flag Icons
-				local textRightAnchor = nil;
-				infoHeader.button.icon1:Hide();
-				infoHeader.button.icon2:Hide();
-				infoHeader.button.icon3:Hide();
-				infoHeader.button.icon4:Hide();
-				if flag1 then
-					textRightAnchor = infoHeader.button.icon1;
-					infoHeader.button.icon1:Show();
-					infoHeader.button.icon1.tooltipTitle = _G["ENCOUNTER_JOURNAL_SECTION_FLAG"..flag1];
-					infoHeader.button.icon1.tooltipText = _G["ENCOUNTER_JOURNAL_SECTION_FLAG_DESCRIPTION"..flag1];
-					EncounterJournal_SetFlagIcon(infoHeader.button.icon1.icon, flag1);
-					if flag2 then
-						textRightAnchor = infoHeader.button.icon2;
-						infoHeader.button.icon2:Show();
-						EncounterJournal_SetFlagIcon(infoHeader.button.icon2.icon, flag2);
-						infoHeader.button.icon2.tooltipTitle = _G["ENCOUNTER_JOURNAL_SECTION_FLAG"..flag2];
-						infoHeader.button.icon2.tooltipText = _G["ENCOUNTER_JOURNAL_SECTION_FLAG_DESCRIPTION"..flag2];
-						if flag3 then
-							textRightAnchor = infoHeader.button.icon3;
-							infoHeader.button.icon3:Show();
-							EncounterJournal_SetFlagIcon(infoHeader.button.icon3.icon, flag3);
-							infoHeader.button.icon3.tooltipTitle = _G["ENCOUNTER_JOURNAL_SECTION_FLAG"..flag3];
-							infoHeader.button.icon3.tooltipText = _G["ENCOUNTER_JOURNAL_SECTION_FLAG_DESCRIPTION"..flag3];
-							if flag4 then
-								textRightAnchor = infoHeader.button.icon4;
-								infoHeader.button.icon4:Show();
-								EncounterJournal_SetFlagIcon(infoHeader.button.icon4.icon, flag4);
-								infoHeader.button.icon4.tooltipTitle = _G["ENCOUNTER_JOURNAL_SECTION_FLAG"..flag4];
-								infoHeader.button.icon4.tooltipText = _G["ENCOUNTER_JOURNAL_SECTION_FLAG_DESCRIPTION"..flag4];
+				local overview = EncounterJournal.encounter.overviewFrame.overviews[self.overviewIndex + 1];
+
+				if (overview) then
+					overview:SetPoint("TOPLEFT", self.Bullets[#self.Bullets], "BOTTOMLEFT", -13, -18);
+				end
+				EncounterJournal_UpdateButtonState(self.button);
+			end
+		end
+
+		-- Get Section Info
+		if (not isOverview) then
+			local freeHeaders = EncounterJournal.encounter.freeHeaders;
+			local usedHeaders = EncounterJournal.encounter.usedHeaders;
+
+			local listEnd = #usedHeaders;
+			
+			if self.myID then  -- this is from a button click
+				_, _, _, _, _, _, nextSectionID =  EJ_GetSectionInfo(self.myID)
+				parentID = self.myID;
+				self.description:SetWidth(self:GetWidth() -20);
+				hWidth = hWidth - HEADER_INDENT;
+			else
+				--This sets the base encounter header
+				parentID = self.encounterID;
+				nextSectionID = self.rootSectionID;
+				topLevelSection = true;
+			end
+
+			while nextSectionID do
+				local title, description, headerType, abilityIcon, displayInfo, siblingID, _, fileredByDifficulty, link, startsOpen, flag1, flag2, flag3, flag4 = EJ_GetSectionInfo(nextSectionID);
+				if not title then
+					break;
+				elseif not fileredByDifficulty then --ignore all sections that should not be shown with our current difficulty settings		
+					if #freeHeaders == 0 then -- create a new header;
+						headerCount = headerCount + 1; -- the is a file local
+						infoHeader = CreateFrame("FRAME", "EncounterJournalInfoHeader"..headerCount, EncounterJournal.encounter.infoFrame, "EncounterInfoTemplate");
+						infoHeader:Hide();
+					else
+						infoHeader = freeHeaders[#freeHeaders];
+						freeHeaders[#freeHeaders] = nil;
+					end
+					
+					numAdded = numAdded + 1;
+					toggleTempList[#toggleTempList+1] = infoHeader;
+					
+					infoHeader.button.link = link;
+					infoHeader.parentID = parentID;
+					infoHeader.myID = nextSectionID;
+					infoHeader.description:SetText(description);
+					infoHeader.button.title:SetText(title);
+					if topLevelSection then
+						infoHeader.button.title:SetFontObject("GameFontNormalMed3");
+					else
+						infoHeader.button.title:SetFontObject("GameFontNormal");
+					end
+					
+					--All headers start collapsed
+					infoHeader.expanded = false
+					infoHeader.description:Hide();
+					infoHeader.descriptionBG:Hide();
+					infoHeader.descriptionBGBottom:Hide();
+					infoHeader.button.expandedIcon:SetText("+");
+
+					for i = 1, #infoHeader.Bullets do
+						infoHeader.Bullets[i]:Hide();
+					end
+
+					local textLeftAnchor = infoHeader.button.expandedIcon;
+					--Show ability Icon
+					if abilityIcon ~= "" then
+						infoHeader.button.abilityIcon:SetTexture(abilityIcon);
+						infoHeader.button.abilityIcon:Show();
+						textLeftAnchor = infoHeader.button.abilityIcon;
+					else
+						infoHeader.button.abilityIcon:Hide();
+					end
+					
+					--Show Creature Portrait
+					if displayInfo ~= 0 then
+						SetPortraitTexture(infoHeader.button.portrait.icon, displayInfo);
+						infoHeader.button.portrait.name = title;
+						infoHeader.button.portrait.displayInfo = displayInfo;
+						infoHeader.button.portrait:Show();
+						textLeftAnchor = infoHeader.button.portrait;
+						infoHeader.button.abilityIcon:Hide();
+					else
+						infoHeader.button.portrait:Hide();
+						infoHeader.button.portrait.name = nil;
+						infoHeader.button.portrait.displayInfo = nil;
+					end
+					infoHeader.button.title:SetPoint("LEFT", textLeftAnchor, "RIGHT", 5, 0);
+					
+					
+					--Set flag Icons
+					local textRightAnchor = nil;
+					infoHeader.button.icon1:Hide();
+					infoHeader.button.icon2:Hide();
+					infoHeader.button.icon3:Hide();
+					infoHeader.button.icon4:Hide();
+					if flag1 then
+						textRightAnchor = infoHeader.button.icon1;
+						infoHeader.button.icon1:Show();
+						infoHeader.button.icon1.tooltipTitle = _G["ENCOUNTER_JOURNAL_SECTION_FLAG"..flag1];
+						infoHeader.button.icon1.tooltipText = _G["ENCOUNTER_JOURNAL_SECTION_FLAG_DESCRIPTION"..flag1];
+						EncounterJournal_SetFlagIcon(infoHeader.button.icon1.icon, flag1);
+						if flag2 then
+							textRightAnchor = infoHeader.button.icon2;
+							infoHeader.button.icon2:Show();
+							EncounterJournal_SetFlagIcon(infoHeader.button.icon2.icon, flag2);
+							infoHeader.button.icon2.tooltipTitle = _G["ENCOUNTER_JOURNAL_SECTION_FLAG"..flag2];
+							infoHeader.button.icon2.tooltipText = _G["ENCOUNTER_JOURNAL_SECTION_FLAG_DESCRIPTION"..flag2];
+							if flag3 then
+								textRightAnchor = infoHeader.button.icon3;
+								infoHeader.button.icon3:Show();
+								EncounterJournal_SetFlagIcon(infoHeader.button.icon3.icon, flag3);
+								infoHeader.button.icon3.tooltipTitle = _G["ENCOUNTER_JOURNAL_SECTION_FLAG"..flag3];
+								infoHeader.button.icon3.tooltipText = _G["ENCOUNTER_JOURNAL_SECTION_FLAG_DESCRIPTION"..flag3];
+								if flag4 then
+									textRightAnchor = infoHeader.button.icon4;
+									infoHeader.button.icon4:Show();
+									EncounterJournal_SetFlagIcon(infoHeader.button.icon4.icon, flag4);
+									infoHeader.button.icon4.tooltipTitle = _G["ENCOUNTER_JOURNAL_SECTION_FLAG"..flag4];
+									infoHeader.button.icon4.tooltipText = _G["ENCOUNTER_JOURNAL_SECTION_FLAG_DESCRIPTION"..flag4];
+								end
 							end
 						end
 					end
+					if textRightAnchor then
+						infoHeader.button.title:SetPoint("RIGHT", textRightAnchor, "LEFT", -5, 0);
+					else
+						infoHeader.button.title:SetPoint("RIGHT", infoHeader.button, "RIGHT", -5, 0);
+					end
+					
+					infoHeader.index = nil;
+					infoHeader:SetWidth(hWidth);
+					
+					
+					-- If this section has not be seen and should start open
+					if EJ_section_openTable[infoHeader.myID] == nil and startsOpen then
+						EJ_section_openTable[infoHeader.myID] = true;
+					end
+					
+					--toggleNested?
+					if EJ_section_openTable[infoHeader.myID]  then
+						infoHeader.expanded = false; -- setting false to expand it in EncounterJournal_ToggleHeaders
+						numAdded = numAdded + EncounterJournal_ToggleHeaders(infoHeader, true);
+					end
+					
+					infoHeader:Show();
+				end -- if not fileredByDifficulty
+				nextSectionID = siblingID;
+			end
+
+			if not doNotShift and numAdded > 0 then
+				--fix the usedlist
+				local startIndex = self.index or 0;
+				for i=listEnd,startIndex+1,-1 do
+					usedHeaders[i+numAdded] = usedHeaders[i];
+					usedHeaders[i+numAdded].index = i + numAdded;
+					usedHeaders[i] = nil
 				end
-				if textRightAnchor then
-					infoHeader.button.title:SetPoint("RIGHT", textRightAnchor, "LEFT", -5, 0);
-				else
-					infoHeader.button.title:SetPoint("RIGHT", infoHeader.button, "RIGHT", -5, 0);
+				for i=1,numAdded do
+					usedHeaders[startIndex + i] = toggleTempList[i];
+					usedHeaders[startIndex + i].index = startIndex + i;
+					toggleTempList[i] = nil;
 				end
-				
-				infoHeader.index = nil;
-				infoHeader:SetWidth(hWidth);
-				
-				
-				-- If this section has not be seen and should start open
-				if EJ_section_openTable[infoHeader.myID] == nil and startsOpen then
-					EJ_section_openTable[infoHeader.myID] = true;
+			end
+			
+			if topLevelSection and usedHeaders[1] then
+				usedHeaders[1]:SetPoint("TOPRIGHT", 0 , -8 - EncounterJournal.encounter.infoFrame.descriptionHeight - SECTION_BUTTON_OFFSET);
+			end
+		elseif (not self.overviewIndex) then
+			for i = 1, #self.overviews do
+				self.overviews[i]:Hide();
+			end
+
+			EncounterJournal.overviewDefaultRole = nil;
+
+			if (not self.rootOverviewSectionID) then 
+				return;
+			end
+
+			local spec, role;
+
+			spec = GetSpecialization();
+			if (spec) then
+				role = GetSpecializationRole(spec);
+			else
+				role = "DAMAGER";
+			end
+
+			EncounterJournal_SetUpOverview(self, role, 1);
+
+			local k = 2;			
+			for i = 1, 3 do
+				local otherRole = overviewPriorities[i];
+				if (otherRole ~= role) then
+					EncounterJournal_SetUpOverview(self, otherRole, k);
+					k = k + 1;
 				end
-				
-				--toggleNested?
-				if EJ_section_openTable[infoHeader.myID]  then
-					infoHeader.expanded = false; -- setting false to expand it in EncounterJournal_ToggleHeaders
-					numAdded = numAdded + EncounterJournal_ToggleHeaders(infoHeader, true);
+			end
+
+			if (self.linkSection) then
+				for i = 1, 3 do
+					local overview = self.overviews[i];
+					if (overview.sectionID == self.linkSection) then
+						overview.expanded = false;
+						EncounterJournal_ToggleHeaders(overview);
+						overview.cbCount = 0;
+						overview.flashAnim:Play();
+						overview:SetScript("OnUpdate", EncounterJournal_FocusSectionCallback);
+					else
+						overview.expanded = true;
+						EncounterJournal_ToggleHeaders(overview);
+						overview.flashAnim:Stop();
+						overview:SetScript("OnUpdate", nil);
+					end
 				end
-				
-				infoHeader:Show();
-			end -- if not fileredByDifficulty
-			nextSectionID = siblingID;
-		end
-		
-		if not doNotShift and numAdded > 0 then
-			--fix the usedlist
-			local startIndex = self.index or 0;
-			for i=listEnd,startIndex+1,-1 do
-				usedHeaders[i+numAdded] = usedHeaders[i];
-				usedHeaders[i+numAdded].index = i + numAdded;
-				usedHeaders[i] = nil
-			end
-			for i=1,numAdded do
-				usedHeaders[startIndex + i] = toggleTempList[i];
-				usedHeaders[startIndex + i].index = startIndex + i;
-				toggleTempList[i] = nil;
+				self.linkSection = nil;
+			else
+				self.overviews[1].expanded = false;
+				EncounterJournal.overviewDefaultRole = role;
+				EncounterJournal_ToggleHeaders(self.overviews[1]);
 			end
 		end
-		
-		if topLevelSection and usedHeaders[1] then
-			usedHeaders[1]:SetPoint("TOPRIGHT", 0 , -8 - self.description:GetHeight() - SECTION_BUTTON_OFFSET);
-		end
 	end
-	
-	if self.myID then
-		EJ_section_openTable[self.myID] = self.expanded;
-	end
-	
-	if not doNotShift then
-		EncounterJournal_ShiftHeaders(self.index or 1);
+
+	if (not isOverview) then
+		if self.myID then
+			EJ_section_openTable[self.myID] = self.expanded;
+		end
 		
-		--check to see if it is offscreen
-		if self.index then
-			local scrollValue = EncounterJournal.encounter.info.detailsScroll.ScrollBar:GetValue();
-			local cutoff = EncounterJournal.encounter.info.detailsScroll:GetHeight() + scrollValue;
-			
-			local _, _, _, _, anchorY = self:GetPoint();
-			anchorY = anchorY - self:GetHeight();
-			if self.description:IsShown() then
-				anchorY = anchorY - self.description:GetHeight() - SECTION_DESCRIPTION_OFFSET;
-			end
+		if not doNotShift then
+			EncounterJournal_ShiftHeaders(self.index or 1);
 			
-			if cutoff < abs(anchorY) then
-				self.frameCount = 0;
-				self:SetScript("OnUpdate", EncounterJournal_MoveSectionUpdate);
+			--check to see if it is offscreen
+			if self.index then
+				local scrollValue = EncounterJournal.encounter.info.detailsScroll.ScrollBar:GetValue();
+				local cutoff = EncounterJournal.encounter.info.detailsScroll:GetHeight() + scrollValue;
+				
+				local _, _, _, _, anchorY = self:GetPoint();
+				anchorY = anchorY - self:GetHeight();
+				if self.description:IsShown() then
+					anchorY = anchorY - self.description:GetHeight() - SECTION_DESCRIPTION_OFFSET;
+				end
+				
+				if cutoff < abs(anchorY) then
+					self.frameCount = 0;
+					self:SetScript("OnUpdate", EncounterJournal_MoveSectionUpdate);
+				end
 			end
 		end
+		return numAdded;
+	else
+		return 0;
 	end
-	return numAdded;
 end
 
 
@@ -771,15 +1243,17 @@ end
 
 
 function EncounterJournal_FocusSection(sectionID)
-	local usedHeaders = EncounterJournal.encounter.usedHeaders;
-	for _, section in pairs(usedHeaders) do
-		if section.myID == sectionID then
-			section.cbCount = 0;
-			section.flashAnim:Play();
-			section:SetScript("OnUpdate", EncounterJournal_FocusSectionCallback);
-		else
-			section.flashAnim:Stop();
-			section:SetScript("OnUpdate", nil);
+	if (not EncounterJournal_CheckForOverview(sectionID)) then
+		local usedHeaders = EncounterJournal.encounter.usedHeaders;
+		for _, section in pairs(usedHeaders) do
+			if section.myID == sectionID then
+				section.cbCount = 0;
+				section.flashAnim:Play();
+				section:SetScript("OnUpdate", EncounterJournal_FocusSectionCallback);
+			else
+				section.flashAnim:Stop();
+				section:SetScript("OnUpdate", nil);
+			end
 		end
 	end
 end
@@ -878,6 +1352,15 @@ function EncounterJournal_ClearDetails()
 	EncounterJournal.searchBox:ClearFocus();
 end
 
+function EncounterJournal_OnHyperlinkEnter(self, link, text, hyperlinkButton)
+	if ( link and string.find(link, "spell") ) then
+		local _, _, spellID = string.find(link, "(%d+)");
+		if ( spellID ) then
+			GameTooltip:SetOwner(hyperlinkButton, "ANCHOR_RIGHT");
+			GameTooltip:SetSpellByID(spellID, false, false, false, EJ_GetDifficulty());
+		end
+	end
+end
 
 function EncounterJournal_TabClicked(self, button)
 	local tabType = self:GetID();
@@ -956,7 +1439,7 @@ function EncounterJournal_LootUpdate()
 			item:Show();
 			
 			if item.showingTooltip then
-				GameTooltip:SetHyperlink(link);
+				EncounterJournal_SetTooltip(link);
 			end
 		else
 			item:Hide();
@@ -967,7 +1450,6 @@ function EncounterJournal_LootUpdate()
 	HybridScrollFrame_Update(scrollFrame, totalHeight, scrollFrame:GetHeight());
 end
 
-
 function EncounterJournal_LootCalcScroll(offset)
 	local buttonHeight = BOSS_LOOT_BUTTON_HEIGHT;
 	local numLoot = EJ_GetNumLoot();
@@ -989,7 +1471,6 @@ function EncounterJournal_Loot_OnUpdate(
 		else
 			ShoppingTooltip1:Hide();
 			ShoppingTooltip2:Hide();
-			ShoppingTooltip3:Hide();
 		end
 
 		if IsModifiedClick("DRESSUP") then
@@ -1008,12 +1489,31 @@ function EncounterJournal_Loot_OnClick(s
 	end
 end
 
+function EncounterJournal_SetTooltip(link)
+	local classID, specID = EJ_GetLootFilter();
+
+	if (specID == 0) then
+		local spec = GetSpecialization();
+		if (spec and classID == select(3, UnitClass("player"))) then
+			specID = GetSpecializationInfo(spec, nil, nil, nil, UnitSex("player"));
+		else
+			specID = -1;
+		end
+	end
+
+	GameTooltip:SetHyperlink(link, specID);
+end
 
 function EncounterJournal_SetFlagIcon(texture, index)
 	local iconSize = 32;
 	local columns = 256/iconSize;
 	local rows = 64/iconSize;
 
+	-- Mythic flag should use heroic Icon
+	if (index == 12) then
+		index = 3;
+	end
+
 	local l = mod(index, columns) / columns;
 	local r = l + (1/columns);
 	local t = floor(index/columns) / rows;
@@ -1240,10 +1740,19 @@ function EncounterJournal_OpenJournal(di
 		EJ_SetDifficulty(difficultyID);
 		if encounterID then
 			if sectionID then
-				EncounterJournal.encounter.info.bossTab:Click();
-				local sectionPath = {EJ_GetSectionPath(sectionID)};
-				for _, id in pairs(sectionPath) do
-					EJ_section_openTable[id] = true;
+				if (EncounterJournal_CheckForOverview(sectionID)) then
+					EncounterJournal.encounter.overviewFrame.linkSection = sectionID;
+					EncounterJournal.encounter.info.overviewTab:Click();
+				else
+					if (EncounterJournal_SearchForOverview(instanceID)) then
+						EncounterJournal.encounter.info.bossTab:Click();
+					else
+						EncounterJournal.encounter.info.overviewTab:Click();
+					end
+					local sectionPath = {EJ_GetSectionPath(sectionID)};
+					for _, id in pairs(sectionPath) do
+						EJ_section_openTable[id] = true;
+					end
 				end
 			end
 			
@@ -1363,7 +1872,7 @@ function EncounterJournal_UpdateFilterSt
 	local classID, specID = EJ_GetLootFilter();
 
 	if (specID > 0) then
-		_, name = GetSpecializationInfoByID(specID)
+		_, name = GetSpecializationInfoByID(specID, UnitSex("player"))
 	elseif (classID > 0) then
 		name = GetClassInfoByID(classID);
 	end
@@ -1381,6 +1890,7 @@ end
 local CLASS_DROPDOWN = 1;
 function EncounterJournal_InitLootFilter(self, level)
 	local filterClassID, filterSpecID = EJ_GetLootFilter();
+	local sex = UnitSex("player");
 	local classDisplayName, classTag, classID;
 	local info = UIDropDownMenu_CreateInfo();
 	info.keepShownOnClick = nil;
@@ -1429,7 +1939,7 @@ function EncounterJournal_InitLootFilter
 		info.notCheckable = nil;
 		local numSpecs = GetNumSpecializationsForClassID(classID);
 		for i = 1, numSpecs do
-			local specID, specName = GetSpecializationInfoForClassID(classID, i);
+			local specID, specName = GetSpecializationInfoForClassID(classID, i, sex);
 			info.leftPadding = 10;
 			info.text = specName;
 			info.checked = (filterSpecID == specID);
@@ -1460,7 +1970,7 @@ function EJNAV_RefreshInstance()
 end
 
 function EJNAV_SelectInstance(self, index, navBar)
-	local showRaid = EncounterJournal.instanceSelect.raidsTab:IsEnabled() == nil;
+	local showRaid = not EncounterJournal.instanceSelect.raidsTab:IsEnabled();
 	local instanceID = EJ_GetInstanceByIndex(index, showRaid);
 	EncounterJournal_DisplayInstance(instanceID);
 end
@@ -1468,7 +1978,7 @@ end
 
 function EJNAV_ListInstance(self, index)
 	--local navBar = self:GetParent();
-	local showRaid = EncounterJournal.instanceSelect.raidsTab:IsEnabled() == nil;
+	local showRaid = not EncounterJournal.instanceSelect.raidsTab:IsEnabled();
 	local _, name = EJ_GetInstanceByIndex(index, showRaid);
 	return name, EJNAV_SelectInstance;
 end