add snapshot function