What I do is, I have the dog sit. Now (this bit is important) DON'T SAY ANYTHING! Just reward. Now wait a heartbeat or two and reward again. After a few reps, get up and move. (The last thing you want is a dog that will stay but ONLY if he is sat just THERE.)
"Sit!" - slightly longer pause - reward again. With the dog sitting besde you, move the foot farthest from the dog forward as if about to take a step. STOP! get another reward in before the dog moves! Repeat, transfer your weight forward this time... repeat, take maybe two steps and step right back.... repeat, pivot to face the dog and step back.....
Keep the rewards thick and fast initially. Make it easy for the dog. He should be thinking "wow, this is so simple, all I got to do is SIT HERE and great stuff happens!!"
Build up to taking several steps OR expecting the dog to wait just a little longer each time. Every so often, cough up quickly to keep the dog alert and guessing. He should be watching you intently tinking "any minute now, as long as I keep still, something great will happen!"
Walk back to the dog, don't recall, at least initially.
Right - now that you can be reasonably sure the dog has got the hang of it, he is going to sit and stay there, NOW introduce your cue to "stay". You can be fairly sure it wont be "contaminated". (If you have a contaminated Stay-word, try starting over with another, like Wait) Say it in a non obtrusive voice and don't accompany it with a hand signal yet - especially if you have used food as a reward. The dog is more likely to move forward to investigate! So, say "sit" and then "stay" and, at this point (the first time you say it) go back to the beginning and barely move from the dogs side before stepping back and rewarding him. Don't give him chance to "poison" the word by getting it wrong first time!
Now go ahead and build up the length of time and distance from you and once the dog can do that well in various parts of your house, try it outside in the garden.... and gradually introduce distractions.... any time you go up a level, reintroduce plaenty of rewards and make it easier for the dog in other ways. So, say, first time he does it in a park, dont ask for it for long and go back to barely moving from his side before stepping back. It feels like you're starting over each time you raise the bar, but the dog will "learn" it faster each subsequent time and will be more reliable when he has finally generalised it. When first doing this one out in the wide world have a trailing line on the dog.
Edit to add: This is even easier with a clicker! Basically the same technique, just a click while the dog is sitting still while you are moving about as described... and then go back and reward. Best part is,it doesnt matter if the dog does get up once you've clicked... as long as the click happened while he was in the right position. Its easier because you cant give always your dog a reward from across the room.... but he can still hear the click no matter where you are and he knows he did right and the reward is coming.