         cd = env.changeDetector.new()  # child CD
         env.stopBinding = true
 
-        cd.$select = mapper = new Mapper
+        cd.$select =
+            mapper: mapper = new Mapper
 
-        alight.bind cd, element,
-            skip_attr: env.skippedAttr()
+        # child-options were changed
+        lastValue = null
+        cd.$select.change = ->
+            setValueOfElement lastValue
 
-        watch = cd.watch key, (value) ->
+        setValueOfElement = (value) ->
             id = mapper.getId value
             if id
                 element.value = id
             else
                 element.selectedIndex = -1
-        cd.scan()
+
+        watch = cd.watch key, (value) ->
+            lastValue = value
+            setValueOfElement value
+
+        alight.bind cd, element,
+            skip_attr: env.skippedAttr()
 
         onChangeDOM = (event) ->
-            item = mapper.getItem event.target.value
-            cd.setValue key, item
+            lastValue = mapper.getItem event.target.value
+            cd.setValue key, lastValue
             cd.scan
                 skipWatch: watch
 


        cd.watch '$destroy', ->
            mapper.release id
        return

    alight.d.al.option = (scope, element, key, env) ->
        cd = step = env.changeDetector
        for i in [0..4]
            select = step.$select
            if select
                break
            step = step.parent or {}
        if not select
            alight.exceptionHandler '', 'Error in al-option - al-select is not found',
                cd: cd
                scope: cd.scope
                element: element
                value: key
            return

        mapper = select.mapper
        select.change()

        id = null
        cd.watch key, (item) ->
