We investigate revision programming, a logic-based mechanism for describing changes in databases and enforcing certain type of integrity constraints. We show that revisions justified by an initial database and a revision program can be computed by a sequential execution of the rules of the program (with subsequent check of the applicability of the rules). In general, a program may determine none, exactly one or many justified revisions of a given initial database. We exhibit two classes of programs, safe and stratified, with the property that for every initial database a unique justified revision exists. We study the complexity of basic problems associated with justified revisions. Although the existence problems are NP-complete, for safe and stratified programs justified revisions can be computed in polynomial time.