We are interested in solving the algorithmic challenges presented by, for example, programming a robot to autonomously prepare a meal in a home kitchen. To achieve such a task, it must reason about high-level objectives, such as which ingredients are needed. Retrieving each ingredient requires planning low-level robot motions which are mechanically feasible and are collision-free. Frequently, these low-level constraints affect the feasibility of a high-level action. For example, an ingredient may be at the back of a refrigerator requiring the robot to open the refrigerator door and move several items out of the way in order to grasp it. By simultaneously reasoning about both the task-level and motion-level, our algorithms are able to efficiently plan for problems requiring manipulating many objects in complicated environments.