             for attr in element.attributes
                 if attr.value.indexOf(alight.utils.pars_start_tag) < 0
                     continue
-                self.attrBindings.push
-                    value: attr.value
-                    name: attr.nodeName
-                    path: path.slice()
+
+                text = attr.value
+                key = attr.nodeName
+
+                rel = pathToEl path
+                fn = compileText text
+                rtext = text.replace(/"/g, '\\"').replace(/\n/g, '\\n')
+                rCallback = 'function(value) {f$.attr(' + rel + ', "' + key + '", value); return "$scanNoChanges"}'
+                if fn
+                    source.push 's.fw("' + rtext + '", ' + self.fastWatchFn.length + ', ' + rCallback + ');'
+                    self.fastWatchFn.push fn
+                else
+                    source.push 's.wt("' + rtext + '", ' + rCallback + ');'
+
             # child nodes
             for childElement, i in element.childNodes
                 path.length = deep + 1

        else if element.nodeType is 3
            if element.nodeValue.indexOf(alight.utils.pars_start_tag) < 0
                return
            self.textBindings.push
                value: element.nodeValue
                path: path.slice()
        null

    walk element, 0

    @


fastBinding::bind = (cd, element) ->
    self = @

    for item in self.attrBindings
        childElement = element
        for n in item.path
            childElement = childElement.childNodes[n]

        setter = do (element=childElement, attrName=item.name) ->
            (result) ->
                f$.attr element, attrName, result
                '$scanNoChanges'

        cd.watchText item.value, setter,
            init: true

    for item in self.textBindings
        childElement = element
        for n in item.path
            childElement = childElement.childNodes[n]

        setter = do (element=childElement) ->
            (result) ->
                element.nodeValue = result
                '$scanNoChanges'

        cd.watchText item.value, setter,
            init: true

    null


pathToEl = (path) ->
    if not path.length
        return 'el'

    result = 'el'
    for i in path
        result += ".childNodes[#{i}]"
    result


compileText = (text) ->
    data = alight.utils.parsText text
    for d in data
        if d.type isnt 'expression'
            continue

        if d.list.length > 1  # has filters
            return null

        key = d.list[0]
        if key[0] is '#'
            return null
        if key[0] is '='
            return null
        if key[0..1] is '::'
            return null

        ce = alight.utils.compile.expression key,
            string: true
            full: true
            rawExpression: true

        if not ce.rawExpression
            throw 'Error'
        d.re = ce.rawExpression

    st = alight.utils.compile.buildSimpleText text, data
    st.fn


alight.core.fastBinding = fastBinding = (element) ->
    self = @
    source = []
    self.fastWatchFn = []
    path = [0]
    walk = (element, deep) ->
        if element.nodeType is 1
