PowerBarColor = {};
 PowerBarColor["MANA"] = { r = 0.00, g = 0.00, b = 1.00 };
 PowerBarColor["RAGE"] = { r = 1.00, g = 0.00, b = 0.00 };
 PowerBarColor["FOCUS"] = { r = 1.00, g = 0.50, b = 0.25 };
 PowerBarColor["ENERGY"] = { r = 1.00, g = 1.00, b = 0.00 };
 PowerBarColor["CHI"] = { r = 0.71, g = 1.0, b = 0.92 };
 PowerBarColor["RUNES"] = { r = 0.50, g = 0.50, b = 0.50 };
 PowerBarColor["RUNIC_POWER"] = { r = 0.00, g = 0.82, b = 1.00 };
 PowerBarColor["SOUL_SHARDS"] = { r = 0.50, g = 0.32, b = 0.55 };
 PowerBarColor["ECLIPSE"] = { negative = { r = 0.30, g = 0.52, b = 0.90 },  positive = { r = 0.80, g = 0.82, b = 0.60 }};
 PowerBarColor["HOLY_POWER"] = { r = 0.95, g = 0.90, b = 0.60 };
 -- vehicle colors
 PowerBarColor["AMMOSLOT"] = { r = 0.80, g = 0.60, b = 0.00 };
 PowerBarColor["FUEL"] = { r = 0.0, g = 0.55, b = 0.5 };
 PowerBarColor["STAGGER"] = { {r = 0.52, g = 1.0, b = 0.52}, {r = 1.0, g = 0.98, b = 0.72}, {r = 1.0, g = 0.42, b = 0.42},};
 
 -- these are mostly needed for a fallback case (in case the code tries to index a power token that is missing from the table,
 -- it will try to index by power type instead)
 PowerBarColor[0] = PowerBarColor["MANA"];
 PowerBarColor[1] = PowerBarColor["RAGE"];
 PowerBarColor[2] = PowerBarColor["FOCUS"];
 PowerBarColor[3] = PowerBarColor["ENERGY"];
 PowerBarColor[4] = PowerBarColor["CHI"]; 
 PowerBarColor[5] = PowerBarColor["RUNES"];
 PowerBarColor[6] = PowerBarColor["RUNIC_POWER"];
 PowerBarColor[7] = PowerBarColor["SOUL_SHARDS"];
 PowerBarColor[8] = PowerBarColor["ECLIPSE"];
 PowerBarColor[9] = PowerBarColor["HOLY_POWER"];
 
 --[[
 	This system uses "update" functions as OnUpdate, and OnEvent handlers.
 	This "Initialize" function registers the events to handle.
 	The "update" function is set as the OnEvent handler (although they do not parse the event),
 	as well as run from the parent's update handler.
 
 	TT: I had to make the spellbar system differ from the norm.
 	I needed a seperate OnUpdate and OnEvent handlers. And needed to parse the event.
 ]]--
 
 function UnitFrame_Initialize (self, unit, name, portrait, healthbar, healthtext, manabar, manatext, threatIndicator, threatFeedbackUnit, threatNumericIndicator,
 		myHealPredictionBar, otherHealPredictionBar, totalAbsorbBar, totalAbsorbBarOverlay, overAbsorbGlow, overHealAbsorbGlow, healAbsorbBar, healAbsorbBarLeftShadow,
 		healAbsorbBarRightShadow)
 	self.unit = unit;
 	self.name = name;
 	self.portrait = portrait;
 	self.healthbar = healthbar;
 	self.manabar = manabar;
 	self.threatIndicator = threatIndicator;
 	self.threatNumericIndicator = threatNumericIndicator;
 	self.myHealPredictionBar = myHealPredictionBar;
 	self.otherHealPredictionBar = otherHealPredictionBar
 	self.totalAbsorbBar = totalAbsorbBar;
 	self.totalAbsorbBarOverlay = totalAbsorbBarOverlay;
 	self.overAbsorbGlow = overAbsorbGlow;
 	self.overHealAbsorbGlow = overHealAbsorbGlow;
 	self.healAbsorbBar = healAbsorbBar;
 	self.healAbsorbBarLeftShadow = healAbsorbBarLeftShadow;
 	self.healAbsorbBarRightShadow = healAbsorbBarRightShadow;
 	if ( self.myHealPredictionBar ) then
 		self.myHealPredictionBar:ClearAllPoints();
 	end
 	if ( self.otherHealPredictionBar ) then
 		self.otherHealPredictionBar:ClearAllPoints();
 	end
 	if ( self.totalAbsorbBar ) then
 		self.totalAbsorbBar:ClearAllPoints();
 	end
 	if ( self.totalAbsorbBarOverlay ) then
 		self.totalAbsorbBar.overlay = self.totalAbsorbBarOverlay;
 		self.totalAbsorbBarOverlay:SetAllPoints(self.totalAbsorbBar);
 		self.totalAbsorbBarOverlay.tileSize = 32;
 	end
 	if ( self.overAbsorbGlow ) then
 		self.overAbsorbGlow:ClearAllPoints();
 		self.overAbsorbGlow:SetPoint("TOPLEFT", self.healthbar, "TOPRIGHT", -7, 0);
 		self.overAbsorbGlow:SetPoint("BOTTOMLEFT", self.healthbar, "BOTTOMRIGHT", -7, 0);
 	end
 	if ( self.healAbsorbBar ) then
 		self.healAbsorbBar:ClearAllPoints();
 		self.healAbsorbBar:SetTexture("Interface\\RaidFrame\\Absorb-Fill", true, true);
 	end
 	if ( self.overHealAbsorbGlow ) then
 		self.overHealAbsorbGlow:ClearAllPoints();
 		self.overHealAbsorbGlow:SetPoint("BOTTOMRIGHT", self.healthbar, "BOTTOMLEFT", 7, 0);
 		self.overHealAbsorbGlow:SetPoint("TOPRIGHT", self.healthbar, "TOPLEFT", 7, 0);
 	end
 	if ( healAbsorbBarLeftShadow ) then
 		self.healAbsorbBarLeftShadow:ClearAllPoints();
 	end
 	if ( healAbsorbBarRightShadow ) then
 		self.healAbsorbBarRightShadow:ClearAllPoints();
 	end
 	if (self.healthbar) then
 		self.healthbar.capNumericDisplay = true;
 	end
 	if (self.manabar) then
 		self.manabar.capNumericDisplay = true;
 	end
 	UnitFrameHealthBar_Initialize(unit, healthbar, healthtext, true);
 	UnitFrameManaBar_Initialize(unit, manabar, manatext, (unit == "player" or unit == "pet" or unit == "vehicle" or unit == "target" or unit == "focus"));
 	UnitFrameThreatIndicator_Initialize(unit, self, threatFeedbackUnit);
 	UnitFrame_Update(self);
 	self:RegisterForClicks("LeftButtonUp", "RightButtonUp");
 	self:RegisterEvent("UNIT_NAME_UPDATE");
 	self:RegisterEvent("UNIT_DISPLAYPOWER");
 	self:RegisterEvent("UNIT_PORTRAIT_UPDATE");
 	if ( self.healAbsorbBar ) then
 		self:RegisterUnitEvent("UNIT_HEAL_ABSORB_AMOUNT_CHANGED");
 	end
 	if ( self.myHealPredictionBar ) then
 		self:RegisterUnitEvent("UNIT_MAXHEALTH", unit);
 		self:RegisterUnitEvent("UNIT_HEAL_PREDICTION", unit);
 	end
 	if ( self.totalAbsorbBar ) then
 		self:RegisterUnitEvent("UNIT_ABSORB_AMOUNT_CHANGED", unit);
 	end
 end
 
 function UnitFrame_SetUnit (self, unit, healthbar, manabar)
 	-- update unit events if unit changes
 	if ( self.unit ~= unit ) then
 		if ( self.myHealPredictionBar ) then
 			self:RegisterUnitEvent("UNIT_MAXHEALTH", unit);
 			self:RegisterUnitEvent("UNIT_HEAL_PREDICTION", unit);
 		end
 		if ( self.totalAbsorbBar ) then
 			self:RegisterUnitEvent("UNIT_ABSORB_AMOUNT_CHANGED", unit);
 		end
 		if ( not healthbar.frequentUpdates ) then
 			healthbar:RegisterUnitEvent("UNIT_HEALTH", unit);
 		end
 		if ( manabar and not manabar.frequentUpdates ) then
 			UnitFrameManaBar_RegisterDefaultEvents(manabar);
 		end
 		healthbar:RegisterUnitEvent("UNIT_MAXHEALTH", unit);
 	end
 
 	self.unit = unit;
 	healthbar.unit = unit;
 	if ( manabar ) then	--Party Pet frames don't have a mana bar.
 		manabar.unit = unit;
 	end
 	self:SetAttribute("unit", unit);
 	securecall("UnitFrame_Update", self);
 end
 
 function UnitFrame_Update (self, isParty)
 	if (self.name) then
 		local name;
 		if ( self.overrideName ) then
 			name = self.overrideName;
 		else
 			name = self.unit;
 		end
 		if (isParty) then
 			self.name:SetText(GetUnitName(name, true));
 		else
 			self.name:SetText(GetUnitName(name));
 		end
 	end
 	
 	UnitFramePortrait_Update(self);
 	UnitFrameHealthBar_Update(self.healthbar, self.unit);
 	UnitFrameManaBar_Update(self.manabar, self.unit);
 	UnitFrame_UpdateThreatIndicator(self.threatIndicator, self.threatNumericIndicator);
 	UnitFrameHealPredictionBars_UpdateMax(self);
 	UnitFrameHealPredictionBars_Update(self);
 end
 
 function UnitFramePortrait_Update (self)
 	if ( self.portrait ) then
 		SetPortraitTexture(self.portrait, self.unit);
 	end
 end
 
 function UnitFrame_OnEvent(self, event, ...)
 	local arg1 = ...
 	
 	local unit = self.unit;
 	if ( arg1 == unit ) then
 		if ( event == "UNIT_NAME_UPDATE" ) then
 			self.name:SetText(GetUnitName(unit));
 		elseif ( event == "UNIT_PORTRAIT_UPDATE" ) then
 			UnitFramePortrait_Update(self);
 		elseif ( event == "UNIT_DISPLAYPOWER" ) then
 			if ( self.manabar ) then
 				UnitFrameManaBar_UpdateType(self.manabar);
 			end
 		elseif ( event == "UNIT_MAXHEALTH" ) then
 			UnitFrameHealPredictionBars_UpdateMax(self);
 			UnitFrameHealPredictionBars_Update(self);
 		elseif ( event == "UNIT_HEAL_PREDICTION" ) then
 			UnitFrameHealPredictionBars_Update(self);
 		elseif ( event == "UNIT_ABSORB_AMOUNT_CHANGED" ) then
 			UnitFrameHealPredictionBars_Update(self);
 		elseif ( event == "UNIT_HEAL_ABSORB_AMOUNT_CHANGED" ) then
 			UnitFrameHealPredictionBars_Update(self);
 		end
 	elseif ( not arg1 and event == "UNIT_PORTRAIT_UPDATE" ) then
 		-- this is an update all portraits signal
 		UnitFramePortrait_Update(self);
 	end
 end
 
 function UnitFrameHealPredictionBars_UpdateMax(self)
 	if ( not self.myHealPredictionBar ) then
 		return;
 	end
 	
 	UnitFrameHealPredictionBars_Update(self);
 end
 
 function UnitFrameHealPredictionBars_UpdateSize(self)
 	if ( not self.myHealPredictionBar or not self.otherHealPredictionBar ) then
 		return;
 	end
 	
 	UnitFrameHealPredictionBars_Update(self);
 end
 
 --WARNING: This function is very similar to the function CompactUnitFrame_UpdateHealPrediction in CompactUnitFrame.lua.
 --If you are making changes here, it is possible you may want to make changes there as well.
 local MAX_INCOMING_HEAL_OVERFLOW = 1.0;
 function UnitFrameHealPredictionBars_Update(frame)
 	if ( not frame.myHealPredictionBar ) then
 		return;
 	end
 	
 	local _, maxHealth = frame.healthbar:GetMinMaxValues();
 	local health = frame.healthbar:GetValue();
 	if ( maxHealth <= 0 ) then
 		return;
 	end
 	
 	local myIncomingHeal = UnitGetIncomingHeals(frame.unit, "player") or 0;
 	local allIncomingHeal = UnitGetIncomingHeals(frame.unit) or 0;
 	local totalAbsorb = UnitGetTotalAbsorbs(frame.unit) or 0;
 	
 	local myCurrentHealAbsorb = 0;
 	if ( frame.healAbsorbBar ) then
 		myCurrentHealAbsorb = UnitGetTotalHealAbsorbs(frame.unit) or 0;
 	
 		--We don't fill outside the health bar with healAbsorbs.  Instead, an overHealAbsorbGlow is shown.
 		if ( health < myCurrentHealAbsorb ) then
 			frame.overHealAbsorbGlow:Show();
 			myCurrentHealAbsorb = health;
 		else
 			frame.overHealAbsorbGlow:Hide();
 		end	
 	end
 	
 	--See how far we're going over the health bar and make sure we don't go too far out of the frame.
 	if ( health - myCurrentHealAbsorb + allIncomingHeal > maxHealth * MAX_INCOMING_HEAL_OVERFLOW ) then
 		allIncomingHeal = maxHealth * MAX_INCOMING_HEAL_OVERFLOW - health + myCurrentHealAbsorb;
 	end
 	
 	local otherIncomingHeal = 0;
 	
 	--Split up incoming heals.
 	if ( allIncomingHeal >= myIncomingHeal ) then
 		otherIncomingHeal = allIncomingHeal - myIncomingHeal;
 	else
 		myIncomingHeal = allIncomingHeal;
 	end
 
 	--We don't fill outside the the health bar with absorbs.  Instead, an overAbsorbGlow is shown.
 	local overAbsorb = false;
 	if ( health - myCurrentHealAbsorb + allIncomingHeal + totalAbsorb >= maxHealth or health + totalAbsorb >= maxHealth ) then
 		if ( totalAbsorb > 0 ) then
 			overAbsorb = true;
 		end
 		
 		if ( allIncomingHeal > myCurrentHealAbsorb ) then
 			totalAbsorb = max(0,maxHealth - (health - myCurrentHealAbsorb + allIncomingHeal));
 		else
 			totalAbsorb = max(0,maxHealth - health);
 		end
 	end
 	
 	if ( overAbsorb ) then
 		frame.overAbsorbGlow:Show();
 	else
 		frame.overAbsorbGlow:Hide();
 	end
 	
 	local healthTexture = frame.healthbar:GetStatusBarTexture();
 	local myCurrentHealAbsorbPercent = 0;
 	local healAbsorbTexture = nil;
 	
 	if ( frame.healAbsorbBar ) then
 		myCurrentHealAbsorbPercent = myCurrentHealAbsorb / maxHealth;
 		
 		--If allIncomingHeal is greater than myCurrentHealAbsorb, then the current
 		--heal absorb will be completely overlayed by the incoming heals so we don't show it.
 		if ( myCurrentHealAbsorb > allIncomingHeal ) then
 			local shownHealAbsorb = myCurrentHealAbsorb - allIncomingHeal;
 			local shownHealAbsorbPercent = shownHealAbsorb / maxHealth;
 			
 			healAbsorbTexture = UnitFrameUtil_UpdateFillBar(frame, healthTexture, frame.healAbsorbBar, shownHealAbsorb, -shownHealAbsorbPercent);
 			
 			--If there are incoming heals the left shadow would be overlayed by the incoming heals
 			--so it isn't shown.
 			if ( allIncomingHeal > 0 ) then
 				frame.healAbsorbBarLeftShadow:Hide();
 			else
 				frame.healAbsorbBarLeftShadow:SetPoint("TOPLEFT", healAbsorbTexture, "TOPLEFT", 0, 0);
 				frame.healAbsorbBarLeftShadow:SetPoint("BOTTOMLEFT", healAbsorbTexture, "BOTTOMLEFT", 0, 0);
 				frame.healAbsorbBarLeftShadow:Show();
 			end
 			
 			-- The right shadow is only shown if there are absorbs on the health bar.
 			if ( totalAbsorb > 0 ) then
 				frame.healAbsorbBarRightShadow:SetPoint("TOPLEFT", healAbsorbTexture, "TOPRIGHT", -8, 0);
 				frame.healAbsorbBarRightShadow:SetPoint("BOTTOMLEFT", healAbsorbTexture, "BOTTOMRIGHT", -8, 0);
 				frame.healAbsorbBarRightShadow:Show();
 			else
 				frame.healAbsorbBarRightShadow:Hide();
 			end
 		else
 			frame.healAbsorbBar:Hide();
 			frame.healAbsorbBarLeftShadow:Hide();
 			frame.healAbsorbBarRightShadow:Hide();
 		end
 	end
 	
 	--Show myIncomingHeal on the health bar.
 	local incomingHealTexture = UnitFrameUtil_UpdateFillBar(frame, healthTexture, frame.myHealPredictionBar, myIncomingHeal, -myCurrentHealAbsorbPercent);
 	
 	--Append otherIncomingHeal on the health bar
 	if (myIncomingHeal > 0) then
 		incomingHealTexture = UnitFrameUtil_UpdateFillBar(frame, incomingHealTexture, frame.otherHealPredictionBar, otherIncomingHeal);
 	else
 		incomingHealTexture = UnitFrameUtil_UpdateFillBar(frame, healthTexture, frame.otherHealPredictionBar, otherIncomingHeal, -myCurrentHealAbsorbPercent);
 	end
 	
 	--Append absorbs to the correct section of the health bar.
 	local appendTexture = nil;
 	if ( healAbsorbTexture ) then
 		--If there is a healAbsorb part shown, append the absorb to the end of that.
 		appendTexture = healAbsorbTexture;
 	else
 		--Otherwise, append the absorb to the end of the the incomingHeals part;
 		appendTexture = incomingHealTexture;
 	end
 	UnitFrameUtil_UpdateFillBar(frame, appendTexture, frame.totalAbsorbBar, totalAbsorb)
 end
 
 --WARNING: This function is very similar to the function CompactUnitFrameUtil_UpdateFillBar in CompactUnitFrame.lua.
 --If you are making changes here, it is possible you may want to make changes there as well.
 function UnitFrameUtil_UpdateFillBar(frame, previousTexture, bar, amount, barOffsetXPercent)
 	if ( amount == 0 ) then
 		bar:Hide();
 		if ( bar.overlay ) then
 			bar.overlay:Hide();
 		end
 		return previousTexture;
 	end
 	
 	local barOffsetX = 0;
 	if ( barOffsetXPercent ) then
 		local healthbarSizeX = frame.healthbar:GetWidth();
 		barOffsetX = healthbarSizeX * barOffsetXPercent;
 	end
 
 	bar:SetPoint("TOPLEFT", previousTexture, "TOPRIGHT", barOffsetX, 0);
 	bar:SetPoint("BOTTOMLEFT", previousTexture, "BOTTOMRIGHT", barOffsetX, 0);
 
 	local totalWidth, totalHeight = frame.healthbar:GetSize();
 	local _, totalMax = frame.healthbar:GetMinMaxValues();
 
 	local barSize = (amount / totalMax) * totalWidth;
 	bar:SetWidth(barSize);
 	bar:Show();
 	if ( bar.overlay ) then
 		bar.overlay:SetTexCoord(0, barSize / bar.overlay.tileSize, 0, totalHeight / bar.overlay.tileSize);
 		bar.overlay:Show();
 	end
 	return bar;
 end
 
 function UnitFrame_OnEnter (self)
 	-- If showing newbie tips then only show the explanation
 	if ( SHOW_NEWBIE_TIPS == "1" ) then
 		if ( self == PlayerFrame ) then
 			GameTooltip_SetDefaultAnchor(GameTooltip, self);
 			GameTooltip_AddNewbieTip(self, PARTY_OPTIONS_LABEL, 1.0, 1.0, 1.0, NEWBIE_TOOLTIP_PARTYOPTIONS);
 			return;
 		elseif ( self == TargetFrame and UnitPlayerControlled("target") and not UnitIsUnit("target", "player") and not UnitIsUnit("target", "pet") ) then
 			GameTooltip_SetDefaultAnchor(GameTooltip, self);
 			GameTooltip_AddNewbieTip(self, PLAYER_OPTIONS_LABEL, 1.0, 1.0, 1.0, NEWBIE_TOOLTIP_PLAYEROPTIONS);
 			return;
 		end
 	end
 	UnitFrame_UpdateTooltip(self);
 end
 
 function UnitFrame_OnLeave ()
 	if ( SHOW_NEWBIE_TIPS == "1" ) then
 		GameTooltip:Hide();
 	else
 		GameTooltip:FadeOut();	
 	end
 end
 
 function UnitFrame_UpdateTooltip (self)
 	GameTooltip_SetDefaultAnchor(GameTooltip, self);
 	if ( GameTooltip:SetUnit(self.unit, self.hideStatusOnTooltip) ) then
 		self.UpdateTooltip = UnitFrame_UpdateTooltip;
 	else
 		self.UpdateTooltip = nil;
 	end
 	local r, g, b = GameTooltip_UnitColor(self.unit);
 	--GameTooltip:SetBackdropColor(r, g, b);
 	GameTooltipTextLeft1:SetTextColor(r, g, b);
 end
 
 function UnitFrameManaBar_UpdateType (manaBar)
 	if ( not manaBar ) then
 		return;
 	end
 	local unitFrame = manaBar:GetParent();
 	local powerType, powerToken, altR, altG, altB = UnitPowerType(manaBar.unit);
 	local prefix = _G[powerToken];
 	local info = PowerBarColor[powerToken];
 	if ( info ) then
 		if ( not manaBar.lockColor ) then
 			manaBar:SetStatusBarColor(info.r, info.g, info.b);
 		end
 	else
 		if ( not altR) then
 			-- couldn't find a power token entry...default to indexing by power type or just mana if we don't have that either
 			info = PowerBarColor[powerType] or PowerBarColor["MANA"];
 		else
 			if ( not manaBar.lockColor ) then
 				manaBar:SetStatusBarColor(altR, altG, altB);
 			end
 		end
 	end
 	manaBar.powerType = powerType;
+	manaBar.powerToken = powerToken;
 	
 	-- Update the manabar text
 	if ( not unitFrame.noTextPrefix ) then
 		SetTextStatusBarTextPrefix(manaBar, prefix);
 	end
 	TextStatusBar_UpdateTextString(manaBar);
 
 	-- Setup newbie tooltip
 	if ( manaBar.unit ~= "pet") then
 	    if ( unitFrame:GetName() == "PlayerFrame" ) then
 		    manaBar.tooltipTitle = prefix;
 		    manaBar.tooltipText = _G["NEWBIE_TOOLTIP_MANABAR_"..powerType];
 	    else
 		    manaBar.tooltipTitle = nil;
 		    manaBar.tooltipText = nil;
 	    end
 	end
 end
 
 function UnitFrameHealthBar_Initialize (unit, statusbar, statustext, frequentUpdates)
 	if ( not statusbar ) then
 		return;
 	end
 
 	statusbar.unit = unit;
 	SetTextStatusBarText(statusbar, statustext);
 	
 	statusbar.frequentUpdates = frequentUpdates;
 	if ( frequentUpdates ) then
 		statusbar:RegisterEvent("VARIABLES_LOADED");
 	end	
 	if ( GetCVarBool("predictedHealth") and frequentUpdates ) then
 		statusbar:SetScript("OnUpdate", UnitFrameHealthBar_OnUpdate);
 	else
 		statusbar:RegisterUnitEvent("UNIT_HEALTH", unit);
 	end
 	statusbar:RegisterUnitEvent("UNIT_MAXHEALTH", unit);
 	statusbar:SetScript("OnEvent", UnitFrameHealthBar_OnEvent);
 
 	-- Setup newbie tooltip
 	if ( statusbar and (statusbar:GetParent() == PlayerFrame) ) then
 		statusbar.tooltipTitle = HEALTH;
 		statusbar.tooltipText = NEWBIE_TOOLTIP_HEALTHBAR;
 	else
 		statusbar.tooltipTitle = nil;
 		statusbar.tooltipText = nil;
 	end
 end
 
 function UnitFrameHealthBar_OnEvent(self, event, ...)
 	if ( event == "CVAR_UPDATE" ) then
 		TextStatusBar_OnEvent(self, event, ...);
 	elseif ( event == "VARIABLES_LOADED" ) then
 		self:UnregisterEvent("VARIABLES_LOADED");
 		if ( GetCVarBool("predictedHealth") and self.frequentUpdates ) then
 			self:SetScript("OnUpdate", UnitFrameHealthBar_OnUpdate);
 			self:UnregisterEvent("UNIT_HEALTH");
 		else
 			self:RegisterUnitEvent("UNIT_HEALTH", self.unit);
 			self:SetScript("OnUpdate", nil);
 		end
 	else
 		if ( not self.ignoreNoUnit or UnitGUID(self.unit) ) then
 			UnitFrameHealthBar_Update(self, ...);
 		end
 	end
 end
 
 function UnitFrameHealthBar_OnUpdate(self)
 	if ( not self.disconnected and not self.lockValues) then
 		local currValue = UnitHealth(self.unit);
 		if ( currValue ~= self.currValue ) then
 			if ( not self.ignoreNoUnit or UnitGUID(self.unit) ) then
 				self:SetValue(currValue);
 				self.currValue = currValue;
 				TextStatusBar_UpdateTextString(self);
 				UnitFrameHealPredictionBars_Update(self:GetParent());
 			end
 		end
 	end
 end
 
 function UnitFrameHealthBar_Update(statusbar, unit)
 	if ( not statusbar or statusbar.lockValues ) then
 		return;
 	end
 	
 	if ( unit == statusbar.unit ) then
 		local maxValue = UnitHealthMax(unit);
 		
 		-- Safety check to make sure we never get an empty bar.
 		statusbar.forceHideText = false;
 		if ( maxValue == 0 ) then
 			maxValue = 1;
 			statusbar.forceHideText = true;
 		end
 
 		statusbar:SetMinMaxValues(0, maxValue);
 
 		statusbar.disconnected = not UnitIsConnected(unit);
 		if ( statusbar.disconnected ) then
 			if ( not statusbar.lockColor ) then
 				statusbar:SetStatusBarColor(0.5, 0.5, 0.5);
 			end
 			statusbar:SetValue(maxValue);
 			statusbar.currValue = maxValue;
 		else
 			local currValue = UnitHealth(unit);
 			if ( not statusbar.lockColor ) then
 				statusbar:SetStatusBarColor(0.0, 1.0, 0.0);
 			end
 			statusbar:SetValue(currValue);
 			statusbar.currValue = currValue;
 		end
 	end
 	TextStatusBar_UpdateTextString(statusbar);
 	UnitFrameHealPredictionBars_Update(statusbar:GetParent());
 end
 
 function UnitFrameHealthBar_OnValueChanged(self, value)
 	TextStatusBar_OnValueChanged(self, value);
 	HealthBar_OnValueChanged(self, value);
 end
 
 function UnitFrameManaBar_UnregisterDefaultEvents(self)
 	self:UnregisterEvent("UNIT_POWER");
 end
 
 function UnitFrameManaBar_RegisterDefaultEvents(self)
 	self:RegisterUnitEvent("UNIT_POWER", self.unit);
 end
 
 function UnitFrameManaBar_Initialize (unit, statusbar, statustext, frequentUpdates)
 	if ( not statusbar ) then
 		return;
 	end
 	statusbar.unit = unit;
 	SetTextStatusBarText(statusbar, statustext);
 	
 	statusbar.frequentUpdates = frequentUpdates;
 	if ( frequentUpdates ) then
 		statusbar:RegisterEvent("VARIABLES_LOADED");
 	end
 	if ( GetCVarBool("predictedPower") and frequentUpdates ) then
 		statusbar:SetScript("OnUpdate", UnitFrameManaBar_OnUpdate);
 	else
 		UnitFrameManaBar_RegisterDefaultEvents(statusbar);
 	end
 	statusbar:RegisterEvent("UNIT_DISPLAYPOWER");
 	statusbar:RegisterUnitEvent("UNIT_MAXPOWER", unit);
 	statusbar:SetScript("OnEvent", UnitFrameManaBar_OnEvent);
 end
 
 function UnitFrameManaBar_OnEvent(self, event, ...)
 	if ( event == "CVAR_UPDATE" ) then
 		TextStatusBar_OnEvent(self, event, ...);
 	elseif ( event == "VARIABLES_LOADED" ) then
 		self:UnregisterEvent("VARIABLES_LOADED");
 		if ( GetCVarBool("predictedPower") and self.frequentUpdates ) then
 			self:SetScript("OnUpdate", UnitFrameManaBar_OnUpdate);
 			UnitFrameManaBar_UnregisterDefaultEvents(self);
 		else
 			UnitFrameManaBar_RegisterDefaultEvents(self);
 			self:SetScript("OnUpdate", nil);
 		end
 	else
 		if ( not self.ignoreNoUnit or UnitGUID(self.unit) ) then
 			UnitFrameManaBar_Update(self, ...);
 		end
 	end
 end
 
 function UnitFrameManaBar_OnUpdate(self)
 	if ( not self.disconnected and not self.lockValues ) then
 		local currValue = UnitPower(self.unit, self.powerType);
 		if ( currValue ~= self.currValue ) then
 			if ( not self.ignoreNoUnit or UnitGUID(self.unit) ) then
 				self:SetValue(currValue);
 				self.currValue = currValue;
 				TextStatusBar_UpdateTextString(self);
 			end
 		end
 	end
 end
 
 function UnitFrameManaBar_Update(statusbar, unit)
 	if ( not statusbar or statusbar.lockValues ) then
 		return;
 	end
 
 	if ( unit == statusbar.unit ) then
 		-- be sure to update the power type before grabbing the max power!
 		UnitFrameManaBar_UpdateType(statusbar);
 
 		local maxValue = UnitPowerMax(unit, statusbar.powerType);
 
 		statusbar:SetMinMaxValues(0, maxValue);
 
 		statusbar.disconnected = not UnitIsConnected(unit);
 		if ( statusbar.disconnected ) then
 			statusbar:SetValue(maxValue);
 			statusbar.currValue = maxValue;
 			if ( not statusbar.lockColor ) then
 				statusbar:SetStatusBarColor(0.5, 0.5, 0.5);
 			end
 		else
 			local currValue = UnitPower(unit, statusbar.powerType);
 			statusbar:SetValue(currValue);
 			statusbar.currValue = currValue;
 		end
 	end
 	TextStatusBar_UpdateTextString(statusbar);
 end
 
 function UnitFrameThreatIndicator_Initialize(unit, unitFrame, feedbackUnit)
 	local indicator = unitFrame.threatIndicator;
 	if ( not indicator ) then
 		return;
 	end
 
 	indicator.unit = unit;
 	indicator.feedbackUnit = feedbackUnit or unit;
 
 	unitFrame:RegisterEvent("UNIT_THREAT_SITUATION_UPDATE");
 	if ( unitFrame.OnEvent == nil ) then
 		unitFrame.OnEvent = unitFrame:GetScript("OnEvent") or false;
 	end
 	unitFrame:SetScript("OnEvent", UnitFrameThreatIndicator_OnEvent);
 end
 
 function UnitFrameThreatIndicator_OnEvent(self, event, ...)
 	if ( self.OnEvent ) then
 		self.OnEvent(self, event, ...);
 	end
 	if ( event == "UNIT_THREAT_SITUATION_UPDATE" ) then
 		UnitFrame_UpdateThreatIndicator(self.threatIndicator, self.threatNumericIndicator,...);
 	end
 end
 
 function UnitFrame_UpdateThreatIndicator(indicator, numericIndicator, unit)
 	if ( not indicator ) then
 		return;
 	end
 
 	if ( not unit or unit == indicator.feedbackUnit ) then
 		local status;
 		if ( indicator.feedbackUnit ~= indicator.unit ) then
 			status = UnitThreatSituation(indicator.feedbackUnit, indicator.unit);
 		else
 			status = UnitThreatSituation(indicator.feedbackUnit);
 		end
 
 		if ( IsThreatWarningEnabled() ) then
 			if (status and status > 0) then
 				indicator:SetVertexColor(GetThreatStatusColor(status));
 				indicator:Show();
 			else
 				indicator:Hide();
 			end
 
 			if ( numericIndicator ) then
 				if ( ShowNumericThreat() and not (UnitClassification(indicator.unit) == "minus") ) then
 					local isTanking, status, percentage, rawPercentage = UnitDetailedThreatSituation(indicator.feedbackUnit, indicator.unit);
 					local display = rawPercentage;
 					if ( isTanking ) then
 						display = UnitThreatPercentageOfLead(indicator.feedbackUnit, indicator.unit);
 					end
 					if ( display and display ~= 0 ) then
 						numericIndicator.text:SetText(format("%d", display).."%");
 						numericIndicator.bg:SetVertexColor(GetThreatStatusColor(status));
 						numericIndicator:Show();
 					else
 						numericIndicator:Hide();
 					end
 				else
 					numericIndicator:Hide();
 				end
 			end
 		else
 			indicator:Hide();
 			if ( numericIndicator ) then
 				numericIndicator:Hide();
 			end
 		end
 	end
 end
 
 function GetUnitName(unit, showServerName)
 	local name, server = UnitName(unit);
 	local relationship = UnitRealmRelationship(unit);
 	if ( server and server ~= "" ) then
 		if ( showServerName ) then
 			return name.."-"..server;
 		else
 			if (relationship == LE_REALM_RELATION_VIRTUAL) then
 				return name;
 			else
 				return name..FOREIGN_SERVER_LABEL;
 			end
 		end
 	else
 		return name;
 	end
 end
 
 function ShowNumericThreat()
 	if ( GetCVar("threatShowNumeric") == "1" ) then
 		return true;
 	else
 		return false;
 	end
 end