You guys have probably been doing this for ages but I decided with my new puppy to try a new way of teaching stays and it works so well. Sorry if you are already doing it! You can do it with really really young puppies too which is great.
Get a small tupperware type pot and put some food in it.
Get the dog to sit
Whilst it is sitting just feed it bits of the food from the pot.
If the dog moves goes down just put the food away and say nothing.
Next day do the same again - gradually you should be able to get the pot to the floor and bend down to feed bits to the dog But the dog has to be in the sitting position at all times. The minute the dog moves put the food away and ignore the dog.
Eventually you will be able to leave the dog sitting with the food pot in front of it and walk away and even around the dog without the dog moving (this will take a while obviously)
This is an exercise where you really want the dog to go wrong as soon as the dog realises that moving makes the food go away the dog will learn that to stay still means the food will be there.
Finally as the dog is good at sitting still you can add the word stay and lengthen the gap between giving the food until they do without the food at all.
I have trialled this with my puppy who will now stay quite happily for 10 minutes in a stay and it was so easy to do.