basic implementation without remote storage