Thanks for spotting this. There's a path that misses the cleanup for subordinates in the case you outline. We've fixed it in the trunk. For now, you are safe to call remove on the transaction within the last participant that is driven by your subordinate.
By the way, have you checked out the end-to-end transactions work that Jonathan did for JavaOne? It's not in the mainline code yet, but is still available via anonsvn.
Wow, what a quick response and solution. Thank you very much!
Until now I did not know of Jonathans end-to-end tx work. I had a short look at the source code in svn right now, but I'm sorry I don't have the time to investigate it further.
Now I will check if I can merge your fix into sp5 or use the described workaround.
OK, let us know if you have any further issues.