diff --git a/CastBarTemplate.lua b/CastBarTemplate.lua
index 54b422f..5e48b04 100644
--- a/CastBarTemplate.lua
+++ b/CastBarTemplate.lua
@@ -60,23 +60,30 @@ local function OnUpdate(self)
 	local startTime, endTime, delay = self.startTime, self.endTime, self.delay
 	local db = self.config
 	if self.channeling or self.casting then
-		local perc, remainingTime, delayFormat, delayFormatTime
-		if self.casting then
+		local perc, remainingTime
+        -- CMTitan: delayFormat and delayFormatTime are currently not used
+        -- CMTitan: when reactivating these might need to depend on .casting/.channeling instead of .filling/.emptying
+        -- , delayFormat, delayFormatTime
+        if self.filling then
 			local showTime = min(currentTime, endTime)
 			remainingTime = endTime - showTime
 			perc = (showTime - startTime) / (endTime - startTime)
 
-			delayFormat, delayFormatTime = "|cffff0000+%.1f|cffffffff %s", "|cffff0000+%.1f|cffffffff %s / %s"
-		elseif self.channeling then
+		--	delayFormat, delayFormatTime = "|cffff0000+%.1f|cffffffff %s", "|cffff0000+%.1f|cffffffff %s / %s"
+        elseif self.emptying then
 			remainingTime = endTime - currentTime
 			perc = remainingTime / (endTime - startTime)
 			
-			delayFormat, delayFormatTime = "|cffff0000-%.1f|cffffffff %s", "|cffff0000-%.1f|cffffffff %s / %s"
+		--	delayFormat, delayFormatTime = "|cffff0000-%.1f|cffffffff %s", "|cffff0000-%.1f|cffffffff %s / %s"
 		end
 
 		self.Bar:SetValue(perc)
 		self.Spark:ClearAllPoints()
+        if self.reverse then
+    		self.Spark:SetPoint("CENTER", self.Bar, "RIGHT", -perc * self.Bar:GetWidth(), 0)
+        else
 		self.Spark:SetPoint("CENTER", self.Bar, "LEFT", perc * self.Bar:GetWidth(), 0)
+        end
 
 		if delay and delay ~= 0 then
 			if db.hidecasttime then
@@ -199,9 +206,14 @@ function CastBarTemplate:UNIT_SPELLCAST_START(event, unit)
 	local db = self.config
 	if event == "UNIT_SPELLCAST_START" then
 		self.casting, self.channeling = true, nil
+        self.reverse = db.castingReverse
+        self.filling, self.emptying = not db.castingDeplete, db.castingDeplete
 	else
 		self.casting, self.channeling = nil, true
+        self.reverse = db.channelReverse
+        self.filling, self.emptying = not db.channelDeplete, db.channelDeplete
 	end
+    self.Bar:SetReverse(self.reverse)
 
 	local spell, rank, displayName, icon, startTime, endTime, isTradeSkill, castID, notInterruptible
 	if self.casting then
@@ -223,7 +235,7 @@ function CastBarTemplate:UNIT_SPELLCAST_START(event, unit)
 
 	self.Bar:SetStatusBarColor(unpack(self.casting and Quartz3.db.profile.castingcolor or Quartz3.db.profile.channelingcolor))
 
-	self.Bar:SetValue(self.casting and 0 or 1)
+    self.Bar:SetValue(self.filling and 0 or 1)
 	self:Show()
 	self:SetAlpha(db.alpha)
 
@@ -238,7 +250,21 @@ function CastBarTemplate:UNIT_SPELLCAST_START(event, unit)
 
 	local position = db.timetextposition
 	if position == "caststart" or position == "castend" then
-		if (position == "caststart" and self.casting) or (position == "castend" and self.channeling) then
+        local textleft
+        if position == "caststart" then
+            if self.filling then
+                textleft = not self.reverse
+            else
+                textleft = self.reverse
+            end
+        else
+            if self.filling then
+                textleft = self.reverse
+            else
+                textleft = not self.reverse
+            end
+        end
+		if textleft then
 			self.TimeText:SetPoint("LEFT", self.Bar, "LEFT", db.timetextx, db.timetexty)
 			self.TimeText:SetJustifyH("LEFT")
 		else
@@ -258,7 +284,7 @@ function CastBarTemplate:UNIT_SPELLCAST_STOP(event, unit)
 		return
 	end
 
-	self.Bar:SetValue(self.casting and 1.0 or 0)
+    self.Bar:SetValue(self.filling and 1.0 or 0)
 	self.Bar:SetStatusBarColor(unpack(Quartz3.db.profile.completecolor))
 
 	self.casting, self.channeling = nil, nil
@@ -711,6 +737,46 @@ do
 					min = 0.1, max = 1, bigStep = 0.025,
 					order = 202,
 				},
+                castGroup = {
+                    type = "group",
+                    name = L["When casting"],
+                    dialogInline = true,
+                    order = 210,
+                    args = {
+                        castingDeplete = {
+                            type = "toggle",
+                            name = L["Deplete"],
+                            desc = L["Causes the cast bar to empty instead of fill up."],
+                            order = 1,
+                        },
+                        castingReverse = {
+                            type = "toggle",
+                            name = L["Reverse"],
+                            desc = L["Reverses the direction of the cast bar."],
+                            order = 2,
+                        },
+                    },
+                },
+                channelGroup = {
+                    type = "group",
+                    name = L["When channeling"],
+                    dialogInline = true,
+                    order=211,
+                    args = {
+                        channelDeplete = {
+                            type = "toggle",
+                            name = L["Deplete"],
+                            desc = L["Causes the cast bar to empty instead of fill up."],
+                            order = 1,
+                        },
+                        channelReverse = {
+                            type = "toggle",
+                            name = L["Reverse"],
+                            desc = L["Reverses the direction of the cast bar."],
+                            order = 2,
+                        },
+                    },
+                },
 				icon = {
 					type = "header",
 					name = L["Icon"],
@@ -1000,6 +1066,11 @@ Quartz3.CastBarTemplate.defaults = {
 	noInterruptColorChange = false,
 	noInterruptColor = {1.0, 0.49, 0},
 	noInterruptShield = true,
+
+    castingDeplete = false,
+    castingReverse = false,
+    channelDeplete = true,
+    channelReverse = false,
 }
 Quartz3.CastBarTemplate.template = CastBarTemplate
 Quartz3.CastBarTemplate.bars = {}
diff --git a/QuartzStatusBar.lua b/QuartzStatusBar.lua
index 97f714c..8db596b 100644
--- a/QuartzStatusBar.lua
+++ b/QuartzStatusBar.lua
@@ -26,6 +26,7 @@ QuartzStatusBar.__max = 100
 QuartzStatusBar.__value = 0
 QuartzStatusBar.__orientation = "HORIZONTAL"
 QuartzStatusBar.__rotatesTexture = 1
+QuartzStatusBar.__reverse = false
 
 local DrawBar, UpdateBarValue
 
@@ -41,7 +42,11 @@ end
 
 function DrawBar(self)
 	self.__texture:ClearAllPoints()
+    if self.__reverse then
+        self.__texture:SetPoint("TOPRIGHT", self, "TOPRIGHT")
+    else
 	self.__texture:SetPoint("TOPLEFT", self, "TOPLEFT")
+    end
 	if self.__orientation == "HORIZONTAL" then
 		self.__texture:SetPoint("BOTTOMLEFT", self, "BOTTOMLEFT")
 	elseif self.__orientation == "VERTICAL" then
@@ -66,7 +71,11 @@ function UpdateBarValue(self)
 	end
 	perc = min(max(perc, 0), 1)
 	local width = self:GetWidth()
+    if self.__reverse then
+    	self.__texture:SetPoint("LEFT", self, "RIGHT", -perc * width, 0)
+    else
 	self.__texture:SetPoint("RIGHT", self, "LEFT", perc * width, 0)
+    end
 	self.__texture:SetTexCoord(0, perc, 0, 1)
 end
 
@@ -95,7 +104,16 @@ function QuartzStatusBar:SetValue(value)
 	UpdateBarValue(self)
 end
 
+function QuartzStatusBar:GetReverse()
+    return self.__reverse
+end
+
+function QuartzStatusBar:SetReverse(value)
+    self.__reverse = (value and true or false)
+    DrawBar(self)
+end
 
+-- CMTitan: __orientation is not a full NOOP, but seems unused in all of Quartz at the moment
 function QuartzStatusBar:GetOrientation()
 	return self.__orientation
 end
@@ -112,7 +130,8 @@ function QuartzStatusBar:GetRotatesTexture()
 	return self.__rotatesTexture
 end
 
-function QuartzStatusBar:GetRotatesTexture(rotate)
+-- CMTitan: __rotatesTexture is a complete dummy at the moment
+function QuartzStatusBar:SetRotatesTexture(rotate)
 	self.__rotatesTexture = rotate and 1 or nil
 	DrawBar(self)
 end
diff --git a/modules/Latency.lua b/modules/Latency.lua
index 8dc4365..e0e391f 100644
--- a/modules/Latency.lua
+++ b/modules/Latency.lua
@@ -109,11 +109,20 @@ function Latency:UNIT_SPELLCAST_START(object, bar, unit)
 	
 	lagbox:ClearAllPoints()
 	local side
+	local leftSide = ( bar.emptying and true or false )
 	if db.lagembed then
-		if bar.casting then
+		leftSide = not leftSide
+	end
+	-- The draw layer is independent of bar.reverse
+	lagbox:SetDrawLayer(leftSide and "OVERLAY" or "BACKGROUND")
+	if bar.reverse then
+		leftSide = not leftSide
+	end
+	if db.lagembed then
+		if leftSide then
 			side = "LEFT"
 			lagbox:SetTexCoord(0,perc,0,1)
-		else -- channeling
+		else
 			side = "RIGHT"
 			lagbox:SetTexCoord(1-perc,1,0,1)
 		end
@@ -123,15 +132,14 @@ function Latency:UNIT_SPELLCAST_START(object, bar, unit)
 		endTime = endTime - timeDiff + db.lagpadding
 		bar.endTime = endTime
 	else
-		if bar.casting then
-			side = "RIGHT"
-			lagbox:SetTexCoord(1-perc,1,0,1)
-		else -- channeling
+		if leftSide then
 			side = "LEFT"
 			lagbox:SetTexCoord(perc,1,0,1)
+		else
+			side = "RIGHT"
+			lagbox:SetTexCoord(1-perc,1,0,1)
 		end
 	end
-	lagbox:SetDrawLayer(side == "LEFT" and "OVERLAY" or "BACKGROUND")
 	lagbox:SetPoint(side, Player.Bar.Bar, side)
 	lagbox:SetWidth(Player.Bar.Bar:GetWidth() * perc)
 	lagbox:Show()
