smarter restore function