             @fn.raw(el, html)
 
     onattr: (el, key, value) ->
+        el._changes ?= {}
+        el._changes.attr ?= {}
+        el._changes.attr[key]= value
         @animation.push prepare_cancelable_manip(el, yes).call =>
+            delete el._changes.attr[key]
+            unless Object.keys(el._changes.attr).length
+                delete el._changes.attr
             @fn.attr(el, key, value)
 
     onshow: (el) ->

                @animation.push(newtag._browser.replace.call)

    ontext: (el, text) ->
        @animation.push prepare_cancelable_manip(el, yes).call =>
            @fn.text(el, text)

    onraw: (el, html) ->

    removePlaceholder: -> # create a dom object
        throw new Error "Adapter::removePlaceholder not defined."

    registerQuery: (query) ->
        old_query = @builder.query
        @builder.query = (type, tag, key) ->
            # use changes if they're not synced yet
            if Object.keys(tag._changes ? {}).indexOf(type) is -1
                query.call(this, type, tag, key, old_query)
            else if type is 'attr'
                tag._changes.attr[key]
            else
                tag._changes[type]

    # flow control : eventlisteners

    onadd: (parent, el) ->
