  This paper studies useful sharing, which is a sophisticated optimization for
lambda-calculi, in the context of call-by-need evaluation in presence of open
terms. Useful sharing turns out to be harder in call-by-need than in
call-by-name or call-by-value, because call-by-need evaluates inside
environments, making it harder to specify when a substitution step is useful.
We isolate the key involved concepts and prove the correctness and the
completeness of useful sharing in this setting.
