software implementation