UIFileUpload doesn't obey the JSF lifecycle by updating the model in the Apply Request Values phase rather than in the Update Model Values phase. In decode() the component should decode the request, then return control. In processUpdates() the model should be updated.
This allows for
1) validation and conversion to occur
2) the model not to be updated unless validation and conversion succeeds on ALL components
3) ValueChangeEvents to be enqueued and acted upon
At the moment the component is kinda behanving like immediate=true