Alright, I've determined that you're correct in the call to advanceNodeStage is unnecessary. What I have found is that as the responses to the messages sent out in the DYNAMIC stage are received, the Controller class passes the message off to the handleApplicationCommandRequest() method of the specific command class for that particular message type. Within that method, there is a call to advanceNodeStage. That call is enclosed in an if statement checking whether the current node stage is not equal to done:

			case SWITCH_BINARY_REPORT:
				logger.trace("Process Switch Binary Report");
				processSwitchBinaryReport(serialMessage, offset, endpoint);
				
				if (this.getNode().getNodeStage() != NodeStage.DONE) 
					this.getNode().advanceNodeStage(NodeStage.DONE);

What is confusing here, is that during initialization, before the node has ever reached the DONE stage, this if statement is evaluated to true, but after the node has reached the DONE stage even though we reset it to dynamic with the setNodeStage(NodeStage.DYNAMIC) in the controller class, the "this.getNode().getNodeStage()" always returns DONE. This is where the breakdown occurs. Unfortunately, I've been searching and searching the code and I can't understand how it is possible. The only calls to setNodeStage are within the NodeStageAdvancer and Controller classes, excluding a couple in unrelated command classes. Do you have any idea how the NodeStage could be reported as DONE even though it has been set to DYNAMIC? Also, the check from within the command class is the one that returns the incorrect stage. When I check from within the controller class, it shows up properly. Could this be related to different threads not sharing state? Any thoughts are appreciated since I've exhausted most of my ideas.

On a side note, wouldn't it make more sense to use the polling build into the binding? The executeRefresh method seems to be the way to do it, but I'm not certain how to get hold of the necessary arguments (provider & item) from within the controller. I'm also not certain if it is appropriate.

Let me know what you think, and if you have any pointers and I'll keep digging.