back in Firelands i came across EVN's WA Shadow Priest dynamic group set up. Now that i came back to wow im trying to use the coding, i had to do some editing myself to make it work in the meantime (making VT/SWP move from right group into left when 3 seconds left in dot timer ... this makes for in accurate reading).

The coding back in the day, evn wrote up some lua to have VT and SWP grab the total haste of the caster at the time of casting those debuffs, now this would cause the wa's for them both to have an accurate reading on their timers and as well making them appear on the left dynamic group to show that they need to be recasted with time to spare. Now in MOP this coding somehow doesnt work properly, where the timers do not tick down like normal theyt just skip through numbers .. [ex, going 9 to 6 then to 4 then down to 1] ... to make this work in the mean time i put both VT and SWP using Trigger 1 and just making it move at 3 seconds left so its not exactly very accurate. ... here is the lua coding im speaking about:

VT:
Code:
function ()
    
    local dot = {
        name = "Vampiric Touch",
        duration = 15.0,
        interval = 3.0,
    }
    
    
    WA_DOTS = WA_DOTS or {}
    WA_DOTS[dot.name] = WA_DOTS[dot.name] or {}
    local stats = WA_DOTS[dot.name][UnitGUID("target")] or {haste = 0}
    
    local _, _, _, _, _, duration, expires, _ = UnitAura("target", dot.name, nil, "PLAYER|HARMFUL")
    expires = expires or 0
    duration = duration or 0
    local time_left = expires - GetTime()
    local percent = floor((time_left / duration) * 100)
    
    -- calculate total number of ticks.
    local total_ticks =  dot.duration / (dot.interval / (1 + (stats.haste / 100)))
    
    if (floor(total_ticks * 10) - (10* floor(total_ticks)) >= 5) then
        total_ticks = ceil(total_ticks)
    else
        total_ticks = floor(total_ticks)
    end
    
    -- ticks_per_second=  (duration / ticks)
    local ticks_per_second = duration / total_ticks
    
    
    -- ticks_left = ceil(time_left / ticks_per_second)
    local ticks_left = ceil(time_left / ticks_per_second)
    if ticks_left < 0 then
        ticks_left = 0
    end
    
    
    return string.format("%d", ticks_left or 0)
    
end
SWP:
Code:
function(_,_,message,_,_,source,_,_,dest,_,_,_,_,spell,_,_)
    local dot = "Shadow Word: Pain"
    
    -- Only care about "dot" if it's cast by the player.
    if (UnitIsUnit(source or "", "player") and spell == dot) then
        -- Setup global variables incase they aren't already done.
        WA_DOTS = WA_DOTS or {}
        WA_DOTS[dot] = WA_DOTS[dot] or {}
        -- Aura applied, record stats
        if (message == "SPELL_AURA_APPLIED") or (message == "SPELL_AURA_REFRESH") then
            local stats = {}
            stats.haste = UnitSpellHaste("player") or 0
            WA_DOTS[dot][dest] = stats
            return true
        end
        -- Aura removed, stop tracking it.
        if (message == "SPELL_AURA_REMOVED") then
            WA_DOTS[dot][dest] = nil
            table.remove(WA_DOTS[dot], dest)
            return false
        end
    end
    
    return false
end
these are the WA imports if it makes it any easier for anyone to pinpoint the problem into making them work:

OFF CD: http://pastebin.com/GqiY1nj0
ON CD: http://pastebin.com/3rKwwLM0