Locked2

combined changes from other merge requests

Use this instead of them

Kept previous implementation as StateChangeVolatile if we ever decide to use it.