diff --git a/esoui/ingame/hud/hudinfamymeter.lua b/esoui/ingame/hud/hudinfamymeter.lua
index 13f081c..89c0545 100755
--- a/esoui/ingame/hud/hudinfamymeter.lua
+++ b/esoui/ingame/hud/hudinfamymeter.lua
@@ -16,6 +16,16 @@ local INFAMY_METER_SLOW_FADE_TIME = 1400 -- in milliseconds
 local INFAMY_METER_SLOW_FADE_DELAY = 600 -- in milliseconds
 local INFAMY_METER_FADE_TIME = 200 -- in milliseconds
 
+local CENTER_ICON_STATE_DAGGER_GREY = 1
+local CENTER_ICON_STATE_DAGGER_RED = 2
+local CENTER_ICON_STATE_EYE = 3
+
+local GREY_DAGGER_ICON = "EsoUI/Art/HUD/infamy_dagger-grey.dds" 
+local RED_DAGGER_ICON = "EsoUI/Art/HUD/infamy_dagger-red.dds" 
+local DAGGER_ICON_CUTOUT = "EsoUI/Art/HUD/infamy_dagger-cutout.dds" 
+local RED_EYE_ICON = "EsoUI/Art/HUD/trespassing_eye-red.dds" 
+local EYE_ICON_CUTOUT = "EsoUI/Art/HUD/trespassing_eye-cutout.dds" 
+
 local ZO_HUDInfamyMeter = ZO_Object:Subclass()
 
 function ZO_HUDInfamyMeter:New(...)
@@ -24,21 +34,36 @@ function ZO_HUDInfamyMeter:New(...)
     return object
 end
 
+function ZO_HUDInfamyMeter:UpdateInfamyMeterState(infamy, bounty, isKOS, isTrespassing)
+    self.infamyMeterState["infamy"] = infamy or GetInfamy()
+    self.infamyMeterState["bounty"] = bounty or GetBounty()
+
+    if isKOS ~= nil then
+        self.infamyMeterState["isKOS"] = isKOS
+    else
+        self.infamyMeterState["isKOS"] = IsKillOnSight()
+    end
+
+    if isTrespassing ~= nil then
+        self.infamyMeterState["isTrespassing"] = isTrespassing
+    else
+        self.infamyMeterState["isTrespassing"] = IsTrespassing()
+    end
+end
+
+function ZO_HUDInfamyMeter:GetOldInfamyMeterState() 
+    return self.infamyMeterState["infamy"], self.infamyMeterState["bounty"], self.infamyMeterState["isKOS"], self.infamyMeterState["isTrespassing"]
+end
+
 function ZO_HUDInfamyMeter:Initialize(control) 
     -- Initialize state
     self.nextUpdateTime = 0
     self.hiddenExternalRequest = false
     self.meterTotal = GetInfamyMeterSize()
 
-    self.wasKOS = IsKillOnSight()
-    self.infamy = GetInfamy()
-    self.bounty = GetBounty()
-
-    self.oldInfamy = self.infamy
-    self.oldBounty = self.bounty
+    self.infamyMeterState = {}
+    self:UpdateInfamyMeterState(0, 0, false, false)
 
-    self.playerOwesGold = true  -- This controls the color of the currency label. When Enforcers get implemented, this variable will reflect
-                                -- whether the player is owed gold (reward) or owes gold (bounty). But for now, only the latter is possible.
     self.isInGamepadMode = IsInGamepadPreferredMode()
 
     self.currencyOptions = 
@@ -57,7 +82,8 @@ function ZO_HUDInfamyMeter:Initialize(control)
     self.meterFrame = control:GetNamedChild("Frame")
     self.infamyBar = control:GetNamedChild("InfamyBar")
     self.bountyBar = control:GetNamedChild("BountyBar")
-    self.kosIcon = control:GetNamedChild("KOSIcon")
+    self.centerIconAnimatingTexture = control:GetNamedChild("CenterIconAnimatingTexture")
+    self.centerIconPersistentTexture = control:GetNamedChild("CenterIconPersistentTexture")
     self.bountyLabel = control:GetNamedChild("BountyDisplay")
 
     -- Set up fade in/out animations
@@ -67,26 +93,33 @@ function ZO_HUDInfamyMeter:Initialize(control)
     -- Initialize bar states and animations
     self.infamyBar.easeAnimation = ANIMATION_MANAGER:CreateTimelineFromVirtual("ZO_HUDInfamyMeterEasing")
     self.infamyBar.startPercent = 0
-    self.infamyBar.endPercent = self.infamy / self.meterTotal
+    self.infamyBar.endPercent = self.infamyMeterState["infamy"] / self.meterTotal
 
     self.bountyBar.easeAnimation = ANIMATION_MANAGER:CreateTimelineFromVirtual("ZO_HUDInfamyMeterEasing")
     self.bountyBar.startPercent = 0
-    self.bountyBar.endPercent = self.bounty / self.meterTotal
+    self.bountyBar.endPercent = self.infamyMeterState["bounty"] / self.meterTotal
+
+    -- Initialize Center Icon and its animations
+    self.centerIconCutoutInAnimation = ANIMATION_MANAGER:CreateTimelineFromVirtual("ZO_HUDInfamyMeterCenterIconCutoutIn")
+    self.centerIconCutoutInAnimation:GetAnimation(1):SetAnimatedControl(self.centerIconAnimatingTexture)
+    self.centerIconCutoutInAnimation:GetAnimation(2):SetAnimatedControl(self.centerIconAnimatingTexture)
+    self.centerIconCutoutInAnimation:GetAnimation(3):SetAnimatedControl(self.centerIconAnimatingTexture)
+    self.centerIconCutoutInAnimation:GetAnimation(4):SetAnimatedControl(self.centerIconPersistentTexture)
 
-    -- Initialize KOS Icon
-    self.kosIcon.bounceAnimation = ANIMATION_MANAGER:CreateTimelineFromVirtual("ZO_HUDInfamyMeterKOSIconBounce", self.kosIcon)
+    self.centerIconScaleOutAnimation = ANIMATION_MANAGER:CreateTimelineFromVirtual("ZO_HUDInfamyMeterCenterIconScaleOut")
+    self.centerIconScaleOutAnimation:GetAnimation(1):SetAnimatedControl(self.centerIconAnimatingTexture)
+    self.centerIconScaleOutAnimation:GetAnimation(2):SetAnimatedControl(self.centerIconAnimatingTexture)
+    self.centerIconScaleOutAnimation:GetAnimation(3):SetAnimatedControl(self.centerIconPersistentTexture)
 
     -- Register for events
     control:RegisterForEvent(EVENT_JUSTICE_INFAMY_UPDATED, function()
-        local infamy = GetInfamy()
-        if IsInJusticeEnabledZone() and not self.hiddenExternalRequest and infamy ~= 0 and infamy ~= self.oldInfamy then
+        if self:ShouldProcessUpdateEvent() then
             self:OnInfamyUpdated(UPDATE_TYPE_EVENT) 
         end
     end)
 
     control:RegisterForEvent(EVENT_LEVEL_UPDATE, function()
-        local infamy = GetInfamy()
-        if IsInJusticeEnabledZone() and not self.hiddenExternalRequest and infamy ~= 0 and infamy ~= self.oldInfamy then
+        if self:ShouldProcessUpdateEvent() then
             self:OnInfamyUpdated(UPDATE_TYPE_EVENT) 
         end
     end)
@@ -94,7 +127,7 @@ function ZO_HUDInfamyMeter:Initialize(control)
     control:RegisterForEvent(EVENT_PLAYER_ACTIVATED, function() 
         local infamy = GetInfamy()
         if IsInJusticeEnabledZone() then
-            if infamy ~= 0 then
+            if self:ShouldProcessUpdateEvent() then
                 self:OnInfamyUpdated(UPDATE_TYPE_EVENT) 
             end
         else
@@ -103,6 +136,15 @@ function ZO_HUDInfamyMeter:Initialize(control)
     end)
 end
 
+function ZO_HUDInfamyMeter:ShouldProcessUpdateEvent()
+    local infamy = GetInfamy()
+    local isKOS = IsKillOnSight()
+    local isTrespassing = IsTrespassing()
+    return IsInJusticeEnabledZone() 
+           and not self.hiddenExternalRequest 
+           and ((infamy ~= 0 and infamy ~= self.infamyMeterState["infamy"]) or isTrespassing ~= self.infamyMeterState["isTrespassing"])
+end
+
 function ZO_HUDInfamyMeter:Update(time)
     if self.nextUpdateTime <= time and not self.hiddenExternalRequest and IsInJusticeEnabledZone() then
         self.nextUpdateTime = time + INFAMY_METER_UPDATE_DELAY_SECONDS
@@ -111,11 +153,12 @@ function ZO_HUDInfamyMeter:Update(time)
 end
 
 function ZO_HUDInfamyMeter:OnInfamyUpdated(updateType)
-    local isKOS = IsKillOnSight()
-    self.infamy = GetInfamy()
-    self.bounty = GetBounty()
+    local oldInfamy, oldBounty, wasKOS, wasTrespassing = self:GetOldInfamyMeterState()
+    self:UpdateInfamyMeterState()
 
-    if self.infamy ~= self.oldInfamy or updateType == UPDATE_TYPE_EVENT then
+    local gamepadModeSwitchUpdate = IsInGamepadPreferredMode() ~= self.isInGamepadMode
+
+    if oldInfamy ~= self.infamyMeterState["infamy"] or updateType == UPDATE_TYPE_EVENT or gamepadModeSwitchUpdate then
         -- Update frame and bars if we're switching between PC and console mode
         if IsInGamepadPreferredMode() and not self.isInGamepadMode then
             self.currencyOptions.font = "ZoFontGamepadHeaderDataValue"
@@ -131,7 +174,7 @@ function ZO_HUDInfamyMeter:OnInfamyUpdated(updateType)
         end
 
         -- Hide or show meter
-        if self.infamy == 0 then
+        if self.infamyMeterState["infamy"] == 0 then
             self.fadeAnim:FadeOut(INFAMY_METER_SLOW_FADE_DELAY, INFAMY_METER_SLOW_FADE_TIME, ZO_ALPHA_ANIMATION_OPTION_FORCE_ALPHA, function() self.control:SetHidden(true) end)
         else
             self.control:SetHidden(false)
@@ -139,32 +182,36 @@ function ZO_HUDInfamyMeter:OnInfamyUpdated(updateType)
         end
 
         -- Update bars
-        self:UpdateBar(self.infamyBar, self.infamy, updateType)
-        self:UpdateBar(self.bountyBar, self.bounty, updateType)
+        self:UpdateBar(self.infamyBar, self.infamyMeterState["infamy"], updateType)
+        self:UpdateBar(self.bountyBar, self.infamyMeterState["bounty"], updateType)
 
-        -- Update KoS icon
-        if isKOS then
-            if self.wasKOS then
-                self.kosIcon:SetAlpha(1)
-            else
-                self.kosIcon.bounceAnimation:PlayFromStart()
-            end
-        else
-            if self.wasKOS then
-                self.kosIcon.bounceAnimation:PlayFromEnd()
-            else
-                self.kosIcon:SetAlpha(0)
-            end
-        end
+        -- Update trespassing/KOS icon
+        self:AnimateCenterIcon(wasKOS, wasTrespassing)
 
         -- Update label
-        ZO_CurrencyControl_SetSimpleCurrency(self.bountyLabel, CURT_MONEY, GetFullBountyPayoffAmount(), self.currencyOptions, CURRENCY_SHOW_ALL, self.playerOwesGold) 
+        ZO_CurrencyControl_SetSimpleCurrency(self.bountyLabel, CURT_MONEY, GetFullBountyPayoffAmount(), self.currencyOptions, CURRENCY_SHOW_ALL, true) 
 
         -- Fire center-screen announcement if we updated below a threshold
-        local infamyLevel = GetInfamyLevel(self.infamy)
-        local oldInfamyLevel = GetInfamyLevel(self.oldInfamy)
-        if infamyLevel ~= oldInfamyLevel then 
+        local infamyLevel = GetInfamyLevel(self.infamyMeterState["infamy"])
+        local oldInfamyLevel = GetInfamyLevel(oldInfamy)
+
         -- Fire CSA
+        if self.infamyMeterState["isTrespassing"] ~= wasTrespassing then
+            local sound, primaryMessage, secondaryMessage
+            if wasTrespassing then
+                sound = SOUNDS.JUSTICE_NO_LONGER_KOS
+                primaryMessage = zo_strformat(SI_JUSTICE_CSA, GetString(SI_JUSTICE_NO_LONGER_TRESPASSING_PRIMARY))
+                secondaryMessage = zo_strformat(SI_JUSTICE_CSA, GetString(SI_JUSTICE_NO_LONGER_TRESPASSING_SECONDARY))
+            else
+            	TriggerTutorial(TUTORIAL_TRIGGER_TRESPASS_SUBZONE_ENTERED)
+                sound = SOUNDS.JUSTICE_NOW_KOS
+                primaryMessage = zo_strformat(SI_JUSTICE_CSA, GetString(SI_JUSTICE_NOW_TRESPASSING_PRIMARY))
+                secondaryMessage = zo_strformat(SI_JUSTICE_CSA, GetString(SI_JUSTICE_NOW_TRESPASSING_SECONDARY))
+            end
+
+            CENTER_SCREEN_ANNOUNCE:AddMessage(EVENT_JUSTICE_INFAMY_UPDATED, CSA_EVENT_COMBINED_TEXT, sound, primaryMessage, secondaryMessage)
+
+        elseif infamyLevel ~= oldInfamyLevel then 
             local sound, primaryMessage, secondaryMessage, icon
             if oldInfamyLevel == INFAMY_THRESHOLD_FUGITIVE then
                 sound = SOUNDS.JUSTICE_NO_LONGER_KOS
@@ -200,9 +247,34 @@ function ZO_HUDInfamyMeter:OnInfamyUpdated(updateType)
             )
         end
     end
+end
 
-    self.wasKOS = isKOS
-    self.oldInfamy = self.infamy
+function ZO_HUDInfamyMeter:AnimateCenterIcon(wasKOS, wasTrespassing)
+    if self.infamyMeterState["isTrespassing"] then
+        if not wasTrespassing then
+            self.centerIconAnimatingTexture:SetTexture(EYE_ICON_CUTOUT)
+            self.centerIconPersistentTexture:SetTexture(RED_EYE_ICON)
+            self.centerIconPersistentTexture:SetAlpha(0)
+            self.centerIconCutoutInAnimation:PlayFromStart()
+        end
+    elseif self.infamyMeterState["isKOS"] then
+        if wasTrespassing then
+            self.centerIconAnimatingTexture:SetTexture(RED_EYE_ICON)
+            self.centerIconPersistentTexture:SetTexture(RED_DAGGER_ICON)
+            self.centerIconScaleOutAnimation:PlayFromStart()
+        elseif not wasKOS then
+            self.centerIconAnimatingTexture:SetTexture(DAGGER_ICON_CUTOUT)
+            self.centerIconPersistentTexture:SetTexture(RED_DAGGER_ICON)
+            self.centerIconPersistentTexture:SetAlpha(0)
+            self.centerIconCutoutInAnimation:PlayFromStart()
+        end
+    else
+        if wasTrespassing or wasKOS then
+            self.centerIconAnimatingTexture:SetTexture(self.centerIconPersistentTexture:GetTextureFileName())
+            self.centerIconPersistentTexture:SetTexture(GREY_DAGGER_ICON)
+            self.centerIconScaleOutAnimation:PlayFromStart()
+        end
+    end
 end
 
 function ZO_HUDInfamyMeter:UpdateBar(bar, newValue, updateType)
@@ -223,9 +295,10 @@ end
 function ZO_HUDInfamyMeter:AnimateMeter(progress)
     local infamyFillPercentage = zo_min((progress * (self.infamyBar.endPercent - self.infamyBar.startPercent)) + self.infamyBar.startPercent, 1)
     local bountyFillPercentage = zo_min((progress * (self.bountyBar.endPercent - self.bountyBar.startPercent)) + self.bountyBar.startPercent, 1)
-    local minPercentage = self.infamy ~= 0 and MIN_BAR_PERCENTAGE or 0
-    self:SetBarValue(self.infamyBar, zo_max(infamyFillPercentage, minPercentage))
-    self:SetBarValue(self.bountyBar, zo_max(bountyFillPercentage, minPercentage))
+    local infamyMinPercentage = self.infamyMeterState["infamy"] ~= 0 and MIN_BAR_PERCENTAGE or 0
+    local bountyMinPercentage = self.infamyMeterState["bounty"] ~= 0 and MIN_BAR_PERCENTAGE or 0
+    self:SetBarValue(self.infamyBar, zo_max(infamyFillPercentage, infamyMinPercentage))
+    self:SetBarValue(self.bountyBar, zo_max(bountyFillPercentage, bountyMinPercentage))
 end
 
 function ZO_HUDInfamyMeter:SetBarValue(bar, percentFilled)
@@ -236,7 +309,7 @@ function ZO_HUDInfamyMeter:RequestHidden(hidden)
     if hidden ~= self.hiddenExternalRequest then
         if hidden then
             self.fadeAnim:FadeOut(0, INFAMY_METER_FADE_TIME, ZO_ALPHA_ANIMATION_OPTION_USE_CURRENT_ALPHA, function() self.control:SetHidden(true) end)
-        elseif IsInJusticeEnabledZone() and (GetInfamy() ~= 0 or self.infamy ~= 0 or self.oldInfamy ~= 0) then
+        elseif IsInJusticeEnabledZone() and (GetInfamy() ~= 0 or self.infamyMeterState["infamy"] ~= 0) then
             self.control:SetHidden(false)
             self.fadeAnim:FadeIn(0, INFAMY_METER_FADE_TIME, ZO_ALPHA_ANIMATION_OPTION_USE_CURRENT_ALPHA)
         end