Wow, that's a mouthful. Anyways, if your trying to update a property in an NHibernate (2.1.2.4000) pre update event listener that is "clean" (In other words wasn't updated in the calling code) and your entity is set to dynamic update the update will not make it to the database. Here is why that is the case. The pre update event gets called in the NHibernate.Action.EntityUpdateAction class. Problem is that by the time the event is called the dirty field list has already been set in this class. So no matter what you do the dirty list is already set in stone as an invariant:

public sealed class EntityUpdateAction : EntityAction
{
    private readonly int[] dirtyFields;

    // ...

    public EntityUpdateAction(object id, object[] state, int[] dirtyProperties, bool hasDirtyCollection, 
                              object[] previousState, object previousVersion, object nextVersion, object instance, 
                              IEntityPersister persister, ISessionImplementor session)
        : base(session, id, instance, persister)
    {
        this.dirtyFields = dirtyProperties;
        // ...
    }

    public override void Execute()
    {
        // ...
        bool flag2 = this.PreUpdate();
        // ...
        if (!flag2)
        {
            persister.Update(id, this.state, this.dirtyFields, this.hasDirtyCollection, this.previousState,
                             this.previousVersion, instance, null, session);
        }
        // ...
    }
}

So as you can see, there is no way the pre update event can effect the dirty fields value that is passed into the update call. What's the solution? Create an interceptor and implement the OnFlushDirty method. The easiest way to do this is to inherit from EmptyInterceptor and override the method as follows:

public class TimestampInterceptor : EmptyInterceptor
{
    public override bool OnFlushDirty(object entity, object id, object[] currentState, object[] previousState, 
                                      string[] propertyNames, global::NHibernate.Type.IType[] types)
    {
        return SetTimestamp(entity, propertyNames, currentState, x => x.Modified);
    }
}

Then register your interceptor and your good to go.