Just want to clarify some things for readers of this thread:
1) If you copy and paste a step, the newly created step gets a new, unique id. I'm pretty sure it's been this way as long as step ids have existed in teststand. You can see this directly if you turn on "Show Hidden Properties" in the station options Preferences tab and look at Step.TS.Id in the variables view.
2) If you cut and paste rather than copy and paste then the unique ids are preserved since that is really a move operation.
3) If you are programmatically cloning/copying a step, you need to call Step.CreateUniqueStepId() on the copy before inserting it into a sequence to guarantee you have a new unique step id for the step.
4) If you refer to steps by id rather than name, then you can have duplicate names and still refer to specific steps. That is why preconditions use the step id by default. Here's an example of using a step id:
RunState.Sequence.Main["ID#:PHf5NngRb0+OVNYzTGhTSC"].Result.Status == "Failed"
5) The expression browser dialog will actually show the name as a comment when you view the expression (even if you don't have such a comment in the actual expression):
RunState.Sequence.Main["ID#:PHf5NngRb0+OVNYzTGhTSC"/* Unique Id of 'Statement' */].Result.Status == "Failed"
Hope this helps clarify things,
-Doug