software implementaton