Index: GridLayoutLayouts.lua
===================================================================
--- GridLayoutLayouts.lua	(revision 42843)
+++ GridLayoutLayouts.lua	(working copy)
@@ -58,6 +58,30 @@
 		},
 	})
 
+GridLayout:AddLayout(L["By Group 25 w/Pets"], {
+		[1] = {
+			groupFilter = "1",
+		},
+		[2] = {
+			groupFilter = "2",
+		},
+		[3] = {
+			groupFilter = "3",
+		},
+		[4] = {
+			groupFilter = "4",
+		},
+		[5] = {
+			groupFilter = "5",
+		},
+		[6] = {
+			isPetGroup = true,
+			groupFilter = "WARLOCK,HUNTER",
+--			unitsPerColumn = 5,
+			filterOnPet = true,
+		},
+	})
+
 GridLayout:AddLayout(L["By Group 20"], {
 		[1] = {
 			groupFilter = "1",
Index: GridStatusAggro.lua
===================================================================
--- GridStatusAggro.lua	(revision 42843)
+++ GridStatusAggro.lua	(working copy)
@@ -32,7 +32,6 @@
 
 function GridStatusAggro:Banzai_UnitGainedAggro(unitid)
 	local settings = self.db.profile.alert_aggro
-	if string.find(unitid, "pet") then return end
 
 	self.core:SendStatusGained(UnitName(unitid), "alert_aggro",
 				    settings.priority,
@@ -46,7 +45,5 @@
 end
 
 function GridStatusAggro:Banzai_UnitLostAggro(unitid)
-	if string.find(unitid, "pet") then return end
-
 	self.core:SendStatusLost(UnitName(unitid), "alert_aggro")
 end	
Index: GridLocale-enUS.lua
===================================================================
--- GridLocale-enUS.lua	(revision 42843)
+++ GridLocale-enUS.lua	(working copy)
@@ -106,6 +106,7 @@
 	["None"] = true,
 	["By Group 40"] = true,
 	["By Group 25"] = true,
+	["By Group 25 w/Pets"] = true,
 	["By Group 20"] = true,
 	["By Group 15"] = true,
 	["By Group 10"] = true,
Index: GridStatusHealth.lua
===================================================================
--- GridStatusHealth.lua	(revision 42843)
+++ GridStatusHealth.lua	(working copy)
@@ -209,7 +209,6 @@
 	local priority = settings.priority
 
 	if not name then return end
-	if string.find(unitid, "pet") then return end
 
 	if UnitIsDeadOrGhost(unitid) then
 		if Aura:UnitHasBuff(unitid, BS["Feign Death"]) then
@@ -278,9 +277,10 @@
 	return healthText
 end
 
+local PETCOLOR = { r=0, g=1, b=0, a=1 }
 function GridStatusHealth:UnitClassColor(name)
 	local u = RL:GetUnitObjectFromName(name)
-	return (u and RAID_CLASS_COLORS[u.class])
+	return (u and RAID_CLASS_COLORS[u.class]) or PETCOLOR
 end
 
 function GridStatusHealth:IsLowHealth(name, cur, max)
Index: GridLayout.lua
===================================================================
--- GridLayout.lua	(revision 43356)
+++ GridLayout.lua	(working copy)
@@ -141,9 +141,9 @@
 local GridLayoutHeaderClass = AceOO.Class()
 local NUM_HEADERS = 0
 
-function GridLayoutHeaderClass.prototype:init()
+function GridLayoutHeaderClass.prototype:init(isPetGroup)
 	GridLayoutHeaderClass.super.prototype.init(self)
-	self:CreateFrames()
+	self:CreateFrames(isPetGroup)
 	self:Reset()
 	self:SetOrientation()
 end
@@ -156,10 +156,11 @@
 	self.frame:Hide()
 end
 
-function GridLayoutHeaderClass.prototype:CreateFrames()
+function GridLayoutHeaderClass.prototype:CreateFrames(isPetGroup)
 	NUM_HEADERS = NUM_HEADERS + 1
 
-	self.frame = CreateFrame("Frame", "GridLayoutHeader"..NUM_HEADERS, GridLayoutFrame, "SecureRaidGroupHeaderTemplate")
+	self.frame = CreateFrame("Frame", "GridLayoutHeader"..NUM_HEADERS, GridLayoutFrame, 
+		isPetGroup and "SecureRaidPetHeaderTemplate" or "SecureRaidGroupHeaderTemplate")
 	self.frame:SetAttribute("template", "GridFrameTemplateSecure")
 	self.frame.initialConfigFunction = GridLayout_InitialConfigFunction
 end
@@ -480,6 +481,7 @@
 function GridLayout:OnInitialize()
 	self.super.OnInitialize(self)
 	self.layoutGroups = {}
+	self.layoutPetGroups = {}
 end
 
 function GridLayout:OnEnable()
@@ -728,24 +730,44 @@
 
 function GridLayout:LoadLayout(layoutName)
 	local i, attr, value
-	local groupsNeeded, groupsAvailable
+	local groupsNeeded, groupsAvailable, petGroupsNeeded, petGroupsAvailable
 	local layout = self.layoutSettings[layoutName]
 
 	self:Debug("LoadLayout", layoutName)
 
-	groupsNeeded = InRaidOrBG() and layout and #layout or 0
+	groupsNeeded = 0
+	petGroupsNeeded = 0
+	
+	if layout then
+		for _, l in ipairs(layout) do
+			if l.isPetGroup then
+				petGroupsNeeded = petGroupsNeeded + 1
+			else
+				groupsNeeded = groupsNeeded + 1
+			end
+		end
+	end
+	
 	groupsAvailable = #self.layoutGroups
+	petGroupsAvailable = #self.layoutPetGroups
 
 	-- create groups as needed
 	while groupsNeeded > groupsAvailable do
-		table.insert(self.layoutGroups, self.layoutHeaderClass:new())
+		table.insert(self.layoutGroups, self.layoutHeaderClass:new(false))
 		groupsAvailable = groupsAvailable + 1
 	end
+	while petGroupsNeeded > petGroupsAvailable do
+		table.insert(self.layoutPetGroups, self.layoutHeaderClass:new(true))
+		petGroupsAvailable = petGroupsAvailable + 1
+	end
 
 	-- hide unused groups
 	for i = groupsNeeded + 1, groupsAvailable, 1 do
 		self.layoutGroups[i]:Reset()
 	end
+	for i = petGroupsNeeded + 1, petGroupsAvailable, 1 do
+		self.layoutPetGroups[i]:Reset()
+	end
 
 	-- show party
 	if not InRaidOrBG() or self.db.profile.showParty then
@@ -756,9 +778,17 @@
 		self.partyGroup.frame:Hide()
 	end
 
+	local iGroup, iPetGroup = 1, 1
 	-- configure groups
-	for i = 1, groupsNeeded do
-		local layoutGroup = self.layoutGroups[i]
+	for i = 1, #layout do
+		local layoutGroup
+		if layout[i].isPetGroup then
+			layoutGroup = self.layoutPetGroups[iPetGroup]
+			iPetGroup = iPetGroup + 1
+		else
+			layoutGroup = self.layoutGroups[iGroup]
+			iGroup = iGroup + 1
+		end
 
 		-- apply defaults
 		if layout.defaults then
@@ -768,8 +798,16 @@
 		end
 
 		-- apply settings
-		for attr,value in pairs(layout[i]) do
-			layoutGroup:SetFrameAttribute(attr, value)
+		for attr, value in pairs(layout[i]) do
+			if attr == "unitsPerColumn" then
+				local p = self.db.profile
+				local anchor = getRelativePoint(p.groupAnchor, p.horizontal)
+				layoutGroup:SetFrameAttribute("unitsPerColumn", value)
+				layoutGroup:SetFrameAttribute("columnSpacing", p.Padding)
+				layoutGroup:SetFrameAttribute("columnAnchorPoint", anchor)
+			elseif attr ~= "isPetGroup" then
+				layoutGroup:SetFrameAttribute(attr, value)
+			end
 		end
 
 		-- place groups
Index: GridStatusAuras.lua
===================================================================
--- GridStatusAuras.lua	(revision 42843)
+++ GridStatusAuras.lua	(working copy)
@@ -331,8 +331,6 @@
 
 
 function GridStatusAuras:ScanUnitAuras(unit)
-	if string.find(unit, "pet") then return end
-
 	self:Debug("ScanUnitAuras", unit)
 
 	for buff, index, apps, tex, rank in Aura:BuffIter(unit) do
@@ -351,8 +349,6 @@
 	local debuffTypeStatus = "debuff_" .. strlower(type)
 	local settings, status
 
-	if string.find(unit, "pet") then return end
-
 	if self.db.profile[debuffNameStatus] then
 		settings = self.db.profile[debuffNameStatus]
 		status = debuffNameStatus
@@ -387,8 +383,6 @@
 	local debuffNameStatus = statusForSpell(debuff, false)
 	local debuffTypeStatus = "debuff_" .. strlower(type)
 
-	if string.find(unit, "pet") then return end
-
 	local name = UnitName(unit)
 
 	if self.db.profile[debuffNameStatus] then
@@ -418,8 +412,6 @@
 	local settings = self.db.profile[buffNameStatus]
 	if not (settings and settings.enable) then return end
 
-	if string.find(unit, "pet") then return end
-
 	local u = RL:GetUnitObjectFromUnit(unit)
 
 	-- ignore the event if we're skipping this class or if we don't have a valid
Index: GridStatusMana.lua
===================================================================
--- GridStatusMana.lua	(revision 42843)
+++ GridStatusMana.lua	(working copy)
@@ -80,7 +80,6 @@
 function GridStatusMana:UpdateUnit(unitid)
 	local name = UnitName(unitid)
 	if not name then return end
-	if string.find(unitid, "pet") then return end
 	
 	local cur, max = UnitMana(unitid), UnitManaMax(unitid)
 	if self:IsLowMana(unitid, cur, max) and
Index: GridStatusName.lua
===================================================================
--- GridStatusName.lua	(revision 42843)
+++ GridStatusName.lua	(working copy)
@@ -54,6 +54,7 @@
 	self:UpdateAllUnits()
 end
 
+local PETCOLOR = { r=0, g=1, b=0, a=1 }
 function GridStatusName:UpdateUnit(name, unitid)
 	local settings = self.db.profile.unit_name
 	local u = RL:GetUnitObjectFromName(name)
@@ -69,7 +70,7 @@
 	-- set color
 	local color = settings.color
 	if settings.class then
-		color = RAID_CLASS_COLORS[u.class]
+		color = RAID_CLASS_COLORS[u.class] or PETCOLOR
 		color.a = 1
 	end
 
Index: GridCore.lua
===================================================================
--- GridCore.lua	(revision 42843)
+++ GridCore.lua	(working copy)
@@ -279,18 +279,15 @@
 function Grid:RosterLib_UnitChanged(unitid, name, class, subgroup, rank, oldname, oldunitid, oldclass, oldsubgroup, oldrank)
 	local needsUpdate = false
 
-	-- don't attempt to update frames if it's only a pet that died
-	if class ~= "PET" and oldclass ~= "PET" then
-		if not name then
-			self:Debug("UnitLeft "..(oldname))
-			self:TriggerEvent("Grid_UnitLeft", oldname)
-		elseif not oldname then
-			self:Debug("UnitJoined "..(name))
-			self:TriggerEvent("Grid_UnitJoined", name, unitid)
-		else
-			self:Debug("UnitChanged "..(name))
-			self:TriggerEvent("Grid_UnitChanged", name, unitid)
-		end
+	if not name then
+		self:Debug("UnitLeft "..(oldname))
+		self:TriggerEvent("Grid_UnitLeft", oldname)
+	elseif not oldname then
+		self:Debug("UnitJoined "..(name))
+		self:TriggerEvent("Grid_UnitJoined", name, unitid)
+	else
+		self:Debug("UnitChanged "..(name))
+		self:TriggerEvent("Grid_UnitChanged", name, unitid)
 	end
 end
 
