reimplement snapshot