The STRIPS specification for actions, despite criticisms of its shortcomings, remains popular in implementations because of its simplicity and intuitive appeal. Lifschitz showed in his logical account of STRIPS that states can safely he represented as sets of ground atom, and this is our starting point. Our aim is to provide logical foundations for design heuristics and procedural implementations of STRIPS. In particular, we formalize the notions of 'localness' in pre-and post-conditions of actions. This justifies and explicates the intuitions that underlie the diagrammatic reasoning typically used to design such conditions. A formal account is also given for 'generic' actions that have parameters. We conclude with a method for extracting candidate action invariants that distinguishes between two kinds of inertia implied by the action specifications.