It is well known c:forEach tag is broken, and that it is advised to users to avoid this tag or at least ensure the collection that iterates this component to be static over the application lifetime.
But users keep trying over and over to use this tag, perceiving this behavior as a bug. See:
A lot of important fixes has been done in MyFaces code, and with the introduction of 2.2.x, we can finally try to fix this problem once for all.
The challenge for this issue is we need to save the iteration data (only if the data is Serializable or StateHolder) into the component state and synchronize this with the generated ids, so if a new element is added or an existing one is removed, we keep the state and the id generation consistent.
Now we have the environment set to do the job: an stable id generation algorithm, a well understood algorithm for PSS and we are in the process to get a release of 2.2 branch.