Index: src/main/resources/org/jboss/dna/graph/GraphI18n.properties
===================================================================
--- src/main/resources/org/jboss/dna/graph/GraphI18n.properties	(revision 564)
+++ src/main/resources/org/jboss/dna/graph/GraphI18n.properties	(working copy)
@@ -51,6 +51,7 @@
 executedGraphCommand = Executed {0}
 closingCommandExecutor = Closing command executor
 closedCommandExecutor = Closed command executor
+multipleErrorsWhileExecutingRequests = {0} of the {1} requests resulted in errors
 
 errorSequencingXmlDocument = An error was received while sequencing XML: {0}
 fatalErrorSequencingXmlDocument = A fatal error was received while sequencing XML: {0}
Index: src/main/java/org/jboss/dna/graph/AbstractInstruction.java
===================================================================
--- src/main/java/org/jboss/dna/graph/AbstractInstruction.java	(revision 0)
+++ src/main/java/org/jboss/dna/graph/AbstractInstruction.java	(revision 0)
@@ -0,0 +1,121 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors. 
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph;
+
+import org.jboss.dna.graph.instructions.Instruction;
+import org.jboss.dna.graph.properties.Name;
+import org.jboss.dna.graph.properties.Path;
+import org.jboss.dna.graph.requests.Request;
+
+/**
+ * @author Randall Hauch
+ */
+/*package*/abstract class AbstractInstruction implements Instruction {
+
+    private final Graph graph;
+    private AbstractInstruction previous;
+    private AbstractInstruction next;
+    private Request executedRequest;
+
+    protected AbstractInstruction( Graph graph ) {
+        this.graph = graph;
+    }
+
+    /**
+     * Get the graph that created this request and that will be used to execute the request.
+     * 
+     * @return the graph instance; never null
+     */
+    public Graph graph() {
+        return graph;
+    }
+
+    /*package*/ExecutionContext context() {
+        return graph.getContext();
+    }
+
+    /*package*/Path createPath( String path ) {
+        return context().getValueFactories().getPathFactory().create(path);
+    }
+
+    /*package*/Name createName( String name ) {
+        return context().getValueFactories().getNameFactory().create(name);
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.instructions.Instruction#hasNext()
+     */
+    public boolean hasNext() {
+        return this.next != null;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.instructions.Instruction#hasPrevious()
+     */
+    public boolean hasPrevious() {
+        return this.previous != null;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.instructions.Instruction#next()
+     */
+    public Instruction next() {
+        return this.next;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.instructions.Instruction#previous()
+     */
+    public Instruction previous() {
+        return this.previous;
+    }
+
+    /*package*/void setNext( AbstractInstruction next ) {
+        assert this.next == null;
+        assert next.previous == null;
+        this.next = next;
+        next.previous = this;
+    }
+
+    /*package*/Request getRequest() {
+        if (executedRequest != null) return executedRequest;
+        return executedRequest;
+    }
+
+    /*package*/abstract Request createRequest();
+
+    /*package*/Request execute() {
+        if (executedRequest != null) return executedRequest;
+        graph.commit(this);
+        assert executedRequest != null;
+        return executedRequest;
+    }
+
+}
Index: src/main/java/org/jboss/dna/graph/Graph.java
===================================================================
--- src/main/java/org/jboss/dna/graph/Graph.java	(revision 0)
+++ src/main/java/org/jboss/dna/graph/Graph.java	(revision 0)
@@ -0,0 +1,683 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors. 
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph;
+
+import java.util.LinkedList;
+import java.util.List;
+import java.util.UUID;
+import net.jcip.annotations.NotThreadSafe;
+import org.jboss.dna.common.util.CheckArg;
+import org.jboss.dna.graph.commands.CompositeCommand;
+import org.jboss.dna.graph.commands.GraphCommand;
+import org.jboss.dna.graph.connectors.RepositoryConnection;
+import org.jboss.dna.graph.connectors.RepositorySource;
+import org.jboss.dna.graph.connectors.RepositorySourceException;
+import org.jboss.dna.graph.instructions.ChangeNode;
+import org.jboss.dna.graph.instructions.Children;
+import org.jboss.dna.graph.instructions.Copy;
+import org.jboss.dna.graph.instructions.Create;
+import org.jboss.dna.graph.instructions.CreateChild;
+import org.jboss.dna.graph.instructions.Delete;
+import org.jboss.dna.graph.instructions.Get;
+import org.jboss.dna.graph.instructions.Move;
+import org.jboss.dna.graph.instructions.MultipleProperties;
+import org.jboss.dna.graph.instructions.NameMatcher;
+import org.jboss.dna.graph.instructions.Node;
+import org.jboss.dna.graph.instructions.Set;
+import org.jboss.dna.graph.instructions.SetProperty;
+import org.jboss.dna.graph.instructions.Subgraph;
+import org.jboss.dna.graph.instructions.Target;
+import org.jboss.dna.graph.properties.Name;
+import org.jboss.dna.graph.properties.Path;
+import org.jboss.dna.graph.properties.Property;
+import org.jboss.dna.graph.properties.ValueFormatException;
+import org.jboss.dna.graph.properties.Path.Segment;
+import org.jboss.dna.graph.requests.CompositeRequest;
+import org.jboss.dna.graph.requests.Request;
+
+/**
+ * A graph representation of the content within a {@link RepositorySource}, including mechanisms to interact and manipulate that
+ * content. The graph is designed to be an <i><a href="http://en.wikipedia.org/wiki/Domain_Specific_Language">embedded domain
+ * specific language</a></i>, meaning calls to it are designed to read like sentences even though they are really just Java
+ * methods. And to be more readable, methods can be chained together.
+ * <p>
+ * For example, the following code obtains the properties of a node with a specified UUID:
+ * 
+ * <pre>
+ * graph.get().properties().on(uuid);
+ * </pre>
+ * 
+ * This a very simple example of a single operation (e.g., getting the properties) generated by calling multiple methods (e.g.,
+ * <code>get()</code>, <code>properties()</code>, and <code>on(UUID)</code>) in a chain to form a readable sentence using
+ * terminology of the domain (e.g., "nodes", "properties", "children", "matching", etc.).
+ * </p>
+ * <p>
+ * Besides readability, method chaining provides other benefits, too. Each method returns an interface that defines the methods
+ * that can follow it. So if you use an IDE with code completion, your IDE will help guide you by telling you what you can do
+ * next. This is very helpful, as there are a lot of optional things you can do.
+ * </p>
+ * <p>
+ * Method chaining also makes it possible to allow methods to be called in different orders, so that it makes for what the
+ * developer thinks is the most readable sentence for that situation. Consider these two equivalent operations:
+ * 
+ * <pre>
+ * graph.get().children().of(path).matching(nameMatcher);
+ * graph.get().children().matching(nameMatcher).of(path);
+ * </pre>
+ * 
+ * Both obtain from the node at the given path the children with names matching the supplied {@link NameMatcher}. And both
+ * operations do exactly the same thing.
+ * </p>
+ * Method chaining also makes it possible to create compound operations:
+ * 
+ * <pre>
+ * graph.get().node(path1).and().move(path2).into(path3);
+ * </pre>
+ * 
+ * Such compount operations will be submitted to the {@link RepositorySource} in
+ * {@link RepositoryConnection#execute(ExecutionContext, GraphCommand...) one execution}. </p>
+ * <p>
+ * Creating a graph is simple: just {@link #create(RepositorySource, ExecutionContext) create one} for the
+ * {@link RepositorySource} and {@link ExecutionContext}. Then, use that graph instance to {@link #get() get} content from the
+ * repository, {@link #create() create} new content, {@link #set() update} content, {@link #move() move} content around, and
+ * {@link #delete() delete} content.
+ * </p>
+ * <p>
+ * The graph API was designed to make it really easy to read and change the content of the underlying repositoy. And reading, or
+ * {@link #get() getting}, content is done very frequently. Therefore, the graph allows the caller to create the operation and
+ * immediately use the results, and the graph will figure out when the operation needs to be executed. For example, the following
+ * code gets the children of a node and immediately iterates over the children. The code using the graph is seamless, but the
+ * graph knows that the {@link Children#iterator() iterator()} method called by the <code>for</code> loop requires the children,
+ * so this method implicitly {@link #commit() commits} the reading of the children:
+ * 
+ * <pre>
+ *    for ( Path.Segment child : graph.get().children().of(path) ) {
+ *        ...
+ *    }
+ * </pre>
+ * 
+ * In other words, the <code>iterator()</code> call signals execution, not the <code>of(path)</code> call, which could be followed
+ * with other clauses:
+ * 
+ * <pre>
+ *    for ( Path.Segment child : graph.get().children().of(path).matching(nameMatcher).and().having(propertyMatcher) ) {
+ *        ...
+ *    }
+ * </pre>
+ * 
+ * Implicitly {@link #commit() committing} an operation is called "deferred execution", and is applicable only to {@link #get()
+ * get} operations. The other kinds of operations all modify the repository, and really don't have methods (like
+ * {@link Children#iterator() iterator()} that signal an operation can or should be executed. So instead, all modification
+ * operations require explicit use of {@link #commit() commit}.
+ * </p>
+ * <h2>Examples</h2>
+ * <p>
+ * The graph API offers a lot of power for working with repository content, and perhaps one of the easiest ways to see this is by
+ * looking at some examples.
+ * </p>
+ * <h3>Getting children</h3>
+ * <p>
+ * Here are some examples of getting all (or some) of the children of a node:
+ * 
+ * <pre>
+ * Children children1 = graph.get().children().at(path);
+ * Children children2 = graph.get().children().of(path);
+ * Children children3 = graph.get().children().of(path).matching(nameMatcher);
+ * Children children4 = graph.get().children().matching(nameMatcher).of(path);
+ * Children children5 = graph.get().children().having(propertyMatcher).of(path);
+ * </pre>
+ * 
+ * The {@link Children} interface extends {@link Iterable Iterable&lt;Path.Segment>}, so these can be used directly in loops:
+ * 
+ * <pre>
+ * for (Path.Segment child : graph.get().children().at(path)) {
+ * }
+ * </pre>
+ * 
+ * </p>
+ * <h3>Getting properties</h3>
+ * <p>
+ * Here are some examples of getting all (or some) of the properties on a node:
+ * 
+ * <pre>
+ * Property property1 = graph.get().property(name).on(path);
+ * Property property2 = graph.get().property(name).on(uuid);
+ * </pre>
+ * 
+ * And since {@link Property} extends {@link Iterable Iterable&lt;Object>}, you can use these calls to iterate over the values:
+ * 
+ * <pre>
+ * for (Object value : graph.get().property(name).at(path)) {
+ * }
+ * </pre>
+ * 
+ * Here are some examples of getting all (or some) of the properties on a node:
+ * 
+ * <pre>
+ * for (Property property : graph.get().properties().at(path)) {
+ * }
+ * for (Property property : graph.get().properties().at(path).matching(nameMatcher)) {
+ * }
+ * for (Property property : graph.get().properties().at(path).matching(nameMatcher)) {
+ * }
+ * </pre>
+ * 
+ * Those methods return {@link MultipleProperties}, which extends {@link Iterable Iterable&lt;Property>} so that iteration just
+ * works. However, {@link MultipleProperties} also has methods to access properties
+ * {@link MultipleProperties#getPropertyByName(String) by name} or to get the {@link MultipleProperties#size() number of
+ * properties}.
+ * </p>
+ * <h3>Getting nodes</h3>
+ * <p>
+ * Here are some examples of getting entire nodes - the children and properties:
+ * 
+ * <pre>
+ * Node node1 = graph.get().node().at(path);
+ * Node node2 = graph.get().node().with(uuid);
+ * Node node3 = graph.get().node().having(uuid);
+ * Node node4 = graph.get().node().at(uuid);
+ * Node node5 = graph.get().node(path);
+ * Node node6 = graph.get().node(uuid);
+ * </pre>
+ * 
+ * Of course, getting an node is not very useful unless you can get to the children and properties:
+ * 
+ * <pre>
+ * Children children6 = node1.getChildren();
+ * Children children7 = node1.getChildren().having(propertyMatcher);
+ * Children children8 = node1.getChildren().matching(nameMatcher);
+ * Property prop7 = node1.getProperty(name);
+ * MultipleProperties props4 = node1.getProperties();
+ * MultipleProperties props5 = node1.getProperties().having(propertyMatcher);
+ * MultipleProperties props6 = node1.getProperties().matching(nameMatcher);
+ * </pre>
+ * 
+ * </p>
+ * <h3>Getting subgraphs</h3>
+ * <p>
+ * Sometimes its useful to get a node and its children (and maybe the grandchildren). This is called a {@link Subgraph subgraph},
+ * and is just as easily obtained as nodes:
+ * 
+ * <pre>
+ * Subgraph subgraph1 = graph.get().subgraph(&quot;/a/b&quot;);
+ * Subgraph subgraph2 = graph.get().subgraph(&quot;/a/b&quot;).ofDepth(3);
+ * Subgraph subgraph3 = graph.get().subgraph().at(&quot;/a/b&quot;).ofDepth(3);
+ * Subgraph subgraph4 = graph.get().subgraph().at(uuid).ofDepth(3);
+ * </pre>
+ * 
+ * Note that it's possible to specify the {@link Subgraph#ofDepth(int) maximum depth} of the subgraph that should be retrieved.
+ * However, be careful about getting subgraphs without specifying the depth, since that could result in a very expensive and time
+ * consuming operation.
+ * </p>
+ * <p>
+ * A subgraphs is not a {@link Node node} per se, but it does have a {@link Subgraph#getRoot() root node} and ways of
+ * {@link Subgraph#getNode(Path) getting} {@link Subgraph#getNode(String) nodes}.
+ * 
+ * <pre>
+ * // Get nodes from within a subgraph ...
+ * Node node10 = subgraph1.getRoot();
+ * Node node11 = subgraph1.getNode(relativePath);
+ * Node node12 = subgraph1.getNode(uuid);
+ * </pre>
+ * 
+ * Once you have a <code>Node</code> instance, get the children and properties as shown above.
+ * </p>
+ * <p>
+ * </p>
+ * 
+ * @author Randall Hauch
+ */
+@NotThreadSafe
+public class Graph {
+
+    /**
+     * Create a graph instance that uses the supplied repository and {@link ExecutionContext context}.
+     * 
+     * @param source the source that should be used
+     * @param context the context in which all executions should be performed
+     * @return the new graph
+     * @throws IllegalArgumentException if the source or context parameters are null
+     */
+    public static Graph create( RepositorySource source,
+                                ExecutionContext context ) {
+        return new Graph(source, context);
+    }
+
+    private final RepositorySource source;
+    private final ExecutionContext context;
+    private AbstractInstruction pendingInstruction;
+    private AbstractInstruction lastInstruction;
+
+    protected Graph( RepositorySource source,
+                     ExecutionContext context ) {
+        CheckArg.isNotNull(source, "source");
+        CheckArg.isNotNull(context, "context");
+        this.source = source;
+        this.context = context;
+    }
+
+    /**
+     * Get the RepositorySource that this graph operates against.
+     * 
+     * @return the repository source used by this graph; never null
+     */
+    public RepositorySource getRepositorySource() {
+        return source;
+    }
+
+    /**
+     * Get the context of execution within which operations on this graph are performed.
+     * 
+     * @return the execution context; never null
+     */
+    public ExecutionContext getContext() {
+        return context;
+    }
+
+    /**
+     * Start a new <i>get</i> operation to retrieve content from the repository. Executing <i>get</i> operations may be deferred
+     * until the results are needed, although any <i>get</i> operations that have been created but not executed will be executed
+     * when {@link #commit()} is explicitly called.
+     * 
+     * @return the new <i>get</i> operation, which must be completed in subsequent clauses
+     */
+    public Get get() {
+        GetInstruction result = new GetInstruction(this);
+        if (this.pendingInstruction == null) {
+            pendingInstruction = result;
+            lastInstruction = result;
+        } else {
+            lastInstruction.setNext(result);
+        }
+        return result;
+    }
+
+    /**
+     * Convenience method to get a node at the supplied path. This is identical to calling <code>get().node(path)</code>.
+     * 
+     * @param path the path of the node to be obtained
+     * @return the node, which may be used to further refine the request or obtain the results
+     * @throws IllegalArgumentException if the path is null
+     * @throws ValueFormatException if the supplied path cannot be formatted into a {@link Path path}
+     */
+    public Node getNode( String path ) {
+        return get().node(path);
+    }
+
+    /**
+     * Convenience method to get a node at the supplied path. This is identical to calling <code>get().node(path)</code>.
+     * 
+     * @param path the path of the node to be obtained
+     * @return the node, which may be used to further refine the request or obtain the results
+     * @throws IllegalArgumentException if the path is null
+     */
+    public Node getNode( Path path ) {
+        return get().node(path);
+    }
+
+    /**
+     * Convenience method to get a node with the supplied UUID. This is identical to calling <code>get().node(uuid)</code>.
+     * 
+     * @param uuid the UUID of the node to be obtained
+     * @return the node, which may be used to further refine the request or obtain the results
+     * @throws IllegalArgumentException if the supplied UUID is null
+     */
+    public Node getNode( UUID uuid ) {
+        return get().node(uuid);
+    }
+
+    /**
+     * Convenience method to get a subgraph rooted at the supplied path. This is identical to calling
+     * <code>get().subgraph(path)</code>.
+     * 
+     * @param path the root path of the subgraph that is to be obtained
+     * @return the subgraph, which may be used to further refine the request or obtain the results
+     * @throws IllegalArgumentException if the path is null
+     * @throws ValueFormatException if the supplied path cannot be formatted into a {@link Path path}
+     */
+    public Subgraph getSubgraph( String path ) {
+        return get().subgraph(path);
+    }
+
+    /**
+     * Convenience method to get a subgraph rooted at the supplied path. This is identical to calling
+     * <code>get().subgraph(path)</code>.
+     * 
+     * @param path the root path of the subgraph that is to be obtained
+     * @return the subgraph, which may be used to further refine the request or obtain the results
+     * @throws IllegalArgumentException if the path is null
+     */
+    public Subgraph getSubgraph( Path path ) {
+        return get().subgraph(path);
+    }
+
+    /**
+     * Convenience method to get a subgraph rooted at the node with the supplied UUID. This is identical to calling
+     * <code>get().subgraph(uuid)</code>.
+     * 
+     * @param uuid the UUID of the root node for the subgraph that is to be obtained
+     * @return the subgraph, which may be used to further refine the request or obtain the results
+     * @throws IllegalArgumentException if the supplied UUID is null
+     */
+    public Subgraph getSubgraph( UUID uuid ) {
+        return get().subgraph(uuid);
+    }
+
+    /**
+     * Start a request to copy content.
+     * 
+     * @return the interface used to complete the information about the copy operation
+     */
+    public Copy copy() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * Convenience method to copy a node at the supplied path. This is identical to calling <code>copy().node(path)</code>.
+     * 
+     * @param path the path of the node that is to be copied
+     * @return the interface used to specify the location into which the content is to be copied.
+     * @throws IllegalArgumentException if the path is null
+     * @throws ValueFormatException if the supplied path cannot be formatted into a {@link Path path}
+     */
+    public Target<Copy> copyNode( String path ) {
+        return copy().node(path);
+    }
+
+    /**
+     * Convenience method to copy a node at the supplied path. This is identical to calling <code>copy().node(path)</code>.
+     * 
+     * @param path the path of the node that is to be copied
+     * @return the interface used to specify the location into which the content is to be copied.
+     * @throws IllegalArgumentException if the path is null
+     */
+    public Target<Copy> copyNode( Path path ) {
+        return copy().node(path);
+    }
+
+    /**
+     * Convenience method to copy a node with the supplied UUID. This is identical to calling <code>copy().node(uuid)</code>.
+     * 
+     * @param uuid the UUID of the node that is to be copied
+     * @return the interface used to specify the location into which the content is to be copied.
+     * @throws IllegalArgumentException if the supplied UUID is null
+     */
+    public Target<Copy> copyNode( UUID uuid ) {
+        return copy().node(uuid);
+    }
+
+    /**
+     * Convenience method to copy a subgraph rooted at the supplied path. This is identical to calling
+     * <code>copy().subgraph(path)</code>.
+     * 
+     * @param path the root path of the subgraph that is to be copied
+     * @return the interface used to specify the location into which the content is to be copied.
+     * @throws IllegalArgumentException if the path is null
+     * @throws ValueFormatException if the supplied path cannot be formatted into a {@link Path path}
+     */
+    public Target<Copy> copySubgraph( String path ) {
+        return copy().subgraph(path);
+    }
+
+    /**
+     * Convenience method to copy a subgraph rooted at the supplied path. This is identical to calling
+     * <code>copy().subgraph(path)</code>.
+     * 
+     * @param path the root path of the subgraph that is to be copied
+     * @return the interface used to specify the location into which the content is to be copied.
+     * @throws IllegalArgumentException if the path is null
+     */
+    public Target<Copy> copySubgraph( Path path ) {
+        return copy().subgraph(path);
+    }
+
+    /**
+     * Convenience method to copy a subgraph rooted at the node with the supplied UUID. This is identical to calling
+     * <code>copy().subgraph(uuid)</code>.
+     * 
+     * @param uuid the UUID of the root node in the subgraph to be copied
+     * @return the interface used to specify the location into which the content is to be copied.
+     * @throws IllegalArgumentException if the supplied UUID is null
+     */
+    public Target<Copy> copySubgraph( UUID uuid ) {
+        return copy().subgraph(uuid);
+    }
+
+    /**
+     * Start a request to move content.
+     * 
+     * @return the interface used to complete the information about the move operation
+     */
+    public Move move() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * Convenience method to move a subgraph rooted at the supplied path. This is identical to calling
+     * <code>move().subgraph(path)</code>.
+     * 
+     * @param path the root path of the subgraph that is to be moved
+     * @return the interface used to specify the location into which the content is to be moved.
+     * @throws IllegalArgumentException if the path is null
+     * @throws ValueFormatException if the supplied path cannot be formatted into a {@link Path path}
+     */
+    public Target<Move> move( String path ) {
+        return move().node(path);
+    }
+
+    /**
+     * Convenience method to move a subgraph rooted at the supplied path. This is identical to calling
+     * <code>move().subgraph(path)</code>.
+     * 
+     * @param path the root path of the subgraph that is to be moved
+     * @return the interface used to specify the location into which the content is to be moved.
+     * @throws IllegalArgumentException if the path is null
+     */
+    public Target<Move> move( Path path ) {
+        return move().node(path);
+    }
+
+    /**
+     * Convenience method to move a subgraph rooted at the node with the supplied UUID. This is identical to calling
+     * <code>copy().subgraph(uuid)</code>.
+     * 
+     * @param uuid the UUID of the root node in the subgraph to be moved
+     * @return the interface used to specify the location into which the content is to be moved.
+     * @throws IllegalArgumentException if the supplied UUID is null
+     */
+    public Target<Move> move( UUID uuid ) {
+        return move().node(uuid);
+    }
+
+    /**
+     * Start a request to delete content.
+     * 
+     * @return the interface used to complete the information about the move operation
+     */
+    public Delete delete() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * Start a request to create content.
+     * 
+     * @return the interface used to complete the information about the create operation
+     */
+    public Create create() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * Convenience method to create a node at the supplied path. This is identical to calling <code>create().node(path)</code>.
+     * 
+     * @param path the path of the node that is to be created
+     * @return the interface used to further specify the content of the new node
+     * @throws IllegalArgumentException if the path is null
+     * @throws ValueFormatException if the supplied path cannot be formatted into a {@link Path path}
+     */
+    public ChangeNode create( String path ) {
+        return create().node(path);
+    }
+
+    /**
+     * Convenience method to create a node at the supplied path. This is identical to calling <code>create().node(path)</code>.
+     * 
+     * @param path the path of the node that is to be created
+     * @return the interface used to further specify the content of the new node
+     * @throws IllegalArgumentException if the path is null
+     */
+    public ChangeNode create( Path path ) {
+        return create().node(path);
+    }
+
+    /**
+     * Convenience method to create a child node with a given name under a node to be identified in a subsequent method. This is
+     * identical to calling <code>create().child(name)</code>.
+     * 
+     * @param name the name of the child node that is to be created
+     * @return the interface used to further specify the parent and the content of the new node
+     * @throws IllegalArgumentException if the name is null
+     */
+    public CreateChild createChild( Name name ) {
+        return create().child(name);
+    }
+
+    /**
+     * Convenience method to create a child node with a given name and same-name-sibling index under a node to be identified in a
+     * subsequent method. This is identical to calling <code>create().child(name,index)</code>.
+     * 
+     * @param name the name of the child node that is to be created
+     * @param index the same-name-sibling index for the child
+     * @return the interface used to further specify the parent and the content of the new node
+     * @throws IllegalArgumentException if the name is null or if the index is invalid
+     */
+    public CreateChild createChild( Name name,
+                                    int index ) {
+        return create().child(name, index);
+    }
+
+    /**
+     * Convenience method to create a child node with a given name under a node to be identified in a subsequent method. This is
+     * identical to calling <code>create().child(path)</code>.
+     * 
+     * @param name the name of the child node that is to be created
+     * @return the interface used to further specify the parent and the content of the new node
+     * @throws IllegalArgumentException if the name is null
+     */
+    public CreateChild createChild( Segment name ) {
+        return create().child(name);
+    }
+
+    /**
+     * Convenience method to create a child node with a given name under a node to be identified in a subsequent method. This is
+     * identical to calling <code>create().child(name)</code>.
+     * 
+     * @param name the name of the child node that is to be created
+     * @return the interface used to further specify the parent and the content of the new node
+     * @throws IllegalArgumentException if the name is null
+     * @throws ValueFormatException if the supplied name cannot be formatted into a {@link Path.Segment path segment}
+     */
+    public CreateChild createChild( String name ) {
+        return create().child(name);
+    }
+
+    /**
+     * Start a request to set content.
+     * 
+     * @return the interface used to complete the information about the set operation
+     */
+    public Set set() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * Convenience method to set a property with the given name on a node to be identified in a subsequent method. This is
+     * identical to calling <code>set().property(name)</code>.
+     * 
+     * @param name the name of the property that is to be set
+     * @return the interface used to further specify the node and the values for the property
+     * @throws IllegalArgumentException if the name is null
+     * @throws ValueFormatException if the supplied name cannot be formatted into a {@link Name name}
+     */
+    public SetProperty set( String name ) {
+        return set().property(name);
+    }
+
+    /**
+     * Convenience method to set a property with the given name and values on a node to be identified in a subsequent method. This
+     * is identical to calling <code>set().property(name,values)</code> or <code>set().property(name).to(values)</code>.
+     * 
+     * @param name the name of the property that is to be set
+     * @param values the values for the property
+     * @return the interface used to further specify the node for the property
+     * @throws IllegalArgumentException if the name is null
+     * @throws ValueFormatException if the supplied name cannot be formatted into a {@link Name name}
+     */
+    public SetProperty set( String name,
+                            Object... values ) {
+        return set().property(name, values);
+    }
+
+    /**
+     * Commit any pending instructions.
+     * 
+     * @return this graph instance, useful for method chaining
+     * @throws RepositorySourceException if there is a problem while executing the enqueued instructions
+     * @throws InterruptedException
+     */
+    public Graph commit() throws RepositorySourceException, InterruptedException {
+        return commit(null);
+    }
+
+    /**
+     * Commit any pending instructions, up through the supplied instruction.
+     * 
+     * @param instruction the instruction that is being committed, or null if all enqueued instructions should be committed
+     * @return this graph instance, useful for method chaining
+     * @throws RepositorySourceException if there is a problem while executing the enqueued instructions
+     */
+    Graph commit( AbstractInstruction instruction ) throws RepositorySourceException {
+        // Convert the instructions into Requests, and bundle in a single CompositeRequest ...
+        List<Request> requests = new LinkedList<Request>();
+        AbstractInstruction nextInstruction = pendingInstruction;
+        pendingInstruction = null;
+        while (nextInstruction != null) {
+            Request nextRequest = nextInstruction.getRequest();
+            requests.add(nextRequest);
+            if (nextInstruction == instruction) break;
+            nextInstruction = (AbstractInstruction)nextInstruction.next();
+        }
+        Request allRequests = CompositeRequest.with(requests.iterator());
+        // Now execute the requests ...
+        RepositoryConnection connection = null;
+        try {
+            connection = source.getConnection();
+            connection.execute(context, (CompositeCommand)allRequests);
+        } finally {
+            if (connection != null) {
+                connection.close();
+            }
+        }
+        return this;
+    }
+
+}
Index: src/main/java/org/jboss/dna/graph/GetInstruction.java
===================================================================
--- src/main/java/org/jboss/dna/graph/GetInstruction.java	(revision 0)
+++ src/main/java/org/jboss/dna/graph/GetInstruction.java	(revision 0)
@@ -0,0 +1,499 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors. 
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph;
+
+import java.util.Iterator;
+import java.util.Map;
+import java.util.UUID;
+import org.jboss.dna.graph.instructions.Children;
+import org.jboss.dna.graph.instructions.Get;
+import org.jboss.dna.graph.instructions.MultipleProperties;
+import org.jboss.dna.graph.instructions.NameMatcher;
+import org.jboss.dna.graph.instructions.Node;
+import org.jboss.dna.graph.instructions.PropertyMatcher;
+import org.jboss.dna.graph.instructions.SingleProperty;
+import org.jboss.dna.graph.instructions.Subgraph;
+import org.jboss.dna.graph.properties.Name;
+import org.jboss.dna.graph.properties.Path;
+import org.jboss.dna.graph.properties.Property;
+import org.jboss.dna.graph.properties.Path.Segment;
+import org.jboss.dna.graph.requests.Location;
+import org.jboss.dna.graph.requests.ReadAllChildrenRequest;
+import org.jboss.dna.graph.requests.ReadNodeRequest;
+import org.jboss.dna.graph.requests.Request;
+
+/**
+ * @author Randall Hauch
+ */
+class GetInstruction extends AbstractInstruction implements Get {
+
+    private GetObject<?> what;
+
+    public GetInstruction( Graph graph ) {
+        super(graph);
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.instructions.Get#children()
+     */
+    public Children children() {
+        this.what = new GetChildren();
+        return (Children)this.what;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.instructions.Get#node()
+     */
+    public Node node() {
+        this.what = new GetNode();
+        return (Node)this.what;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.instructions.Get#node(java.lang.String)
+     */
+    public Node node( String path ) {
+        this.what = (GetObject<?>)new GetNode().at(path);
+        return (Node)this.what;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.instructions.Get#node(Path)
+     */
+    public Node node( Path path ) {
+        this.what = (GetObject<?>)new GetNode().at(path);
+        return (Node)this.what;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.instructions.Get#node(java.util.UUID)
+     */
+    public Node node( UUID uuid ) {
+        this.what = (GetObject<?>)new GetNode().at(uuid);
+        return (Node)this.what;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.instructions.Get#properties()
+     */
+    public MultipleProperties properties() {
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.instructions.Get#property(java.lang.String)
+     */
+    public SingleProperty property( String name ) {
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.instructions.Get#property(Name)
+     */
+    public SingleProperty property( Name name ) {
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.instructions.Get#subgraph()
+     */
+    public Subgraph subgraph() {
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.instructions.Get#subgraph(java.lang.String)
+     */
+    public Subgraph subgraph( String path ) {
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.instructions.Get#subgraph(Path)
+     */
+    public Subgraph subgraph( Path path ) {
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.instructions.Get#subgraph(java.util.UUID)
+     */
+    public Subgraph subgraph( UUID uuid ) {
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.AbstractInstruction#createRequest()
+     */
+    @Override
+    Request createRequest() {
+        return this.what.createRequest();
+    }
+
+    /**
+     * @author Randall Hauch
+     * @param <T> the request type
+     */
+    abstract class GetObject<T extends Request> {
+
+        abstract T createRequest();
+
+        @SuppressWarnings( "unchecked" )
+        T execute() {
+            return (T)GetInstruction.this.execute();
+        }
+
+    }
+
+    class GetNode extends GetObject<ReadNodeRequest> implements Node {
+        private Location location;
+        private Children children;
+        private MultipleProperties properties;
+
+        GetNode setLocation( Location location ) {
+            this.location = location;
+            this.children = null;
+            this.properties = null;
+            return this;
+        }
+
+        @Override
+        ReadNodeRequest createRequest() {
+            return null;
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.graph.instructions.Node#getChildren()
+         */
+        public Children getChildren() {
+            // if (children == null) {
+            // children = new ChildrenWrapper(execute().getChildren());
+            // }
+            return children;
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.graph.instructions.Node#getProperties()
+         */
+        public MultipleProperties getProperties() {
+            // if (properties == null) {
+            // properties = new PropertiesWrapper(execute().getPropertiesByName());
+            // }
+            return properties;
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.graph.instructions.Node#getPropertiesByName()
+         */
+        public Map<Name, Property> getPropertiesByName() {
+            return getProperties().asMap();
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.graph.instructions.Node#getProperty(java.lang.String)
+         */
+        public Property getProperty( String name ) {
+            return getProperties().asMap().get(createName(name));
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.graph.instructions.Node#getProperty(org.jboss.dna.graph.properties.Name)
+         */
+        public Property getProperty( Name name ) {
+            return getProperties().asMap().get(name);
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.graph.instructions.Node#having(java.util.UUID)
+         */
+        public Node having( UUID uuid ) {
+            return setLocation(new Location(uuid));
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.graph.instructions.Node#with(java.util.UUID)
+         */
+        public Node with( UUID uuid ) {
+            return setLocation(new Location(uuid));
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see java.lang.Iterable#iterator()
+         */
+        public Iterator<Segment> iterator() {
+            return null;
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.graph.instructions.LocationMatchingClause#at(java.lang.String)
+         */
+        public Node at( String path ) {
+            return setLocation(new Location(createPath(path)));
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.graph.instructions.LocationMatchingClause#at(java.util.UUID)
+         */
+        public Node at( UUID uuid ) {
+            return setLocation(new Location(uuid));
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.graph.instructions.LocationMatchingClause#at(org.jboss.dna.graph.properties.Path)
+         */
+        public Node at( Path path ) {
+            return setLocation(new Location(path));
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.graph.instructions.LocationMatchingClause#of(java.lang.String)
+         */
+        public Node of( String path ) {
+            return setLocation(new Location(createPath(path)));
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.graph.instructions.LocationMatchingClause#of(java.util.UUID)
+         */
+        public Node of( UUID uuid ) {
+            return setLocation(new Location(uuid));
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.graph.instructions.LocationMatchingClause#of(org.jboss.dna.graph.properties.Path)
+         */
+        public Node of( Path path ) {
+            return setLocation(new Location(path));
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.graph.instructions.NameMatchingClause#matching(org.jboss.dna.graph.instructions.NameMatcher)
+         */
+        public Node matching( NameMatcher nameMatcher ) {
+            throw new UnsupportedOperationException();
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.graph.instructions.NameMatchingClause#with(org.jboss.dna.graph.instructions.NameMatcher)
+         */
+        public Node with( NameMatcher nameMatcher ) {
+            throw new UnsupportedOperationException();
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.graph.instructions.And#and()
+         */
+        public Graph and() {
+            return graph();
+        }
+
+    }
+
+    class GetChildren extends GetObject<ReadAllChildrenRequest> implements Children {
+
+        private Location location;
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.graph.instructions.Children#and()
+         */
+        public Children and() {
+            return this;
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.graph.instructions.Children#having(org.jboss.dna.graph.instructions.PropertyMatcher)
+         */
+        public Children having( PropertyMatcher propertyMatcher ) {
+            throw new UnsupportedOperationException();
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.graph.instructions.Children#size()
+         */
+        public int size() {
+            return 0;
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see java.lang.Iterable#iterator()
+         */
+        public Iterator<Segment> iterator() {
+            return null;
+        }
+
+        @Override
+        public ReadAllChildrenRequest createRequest() {
+            if (this.location == null) {
+
+            }
+            return new ReadAllChildrenRequest(this.location);
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.graph.instructions.LocationMatchingClause#at(java.lang.String)
+         */
+        public Children at( String path ) {
+            this.location = new Location(createPath(path));
+            return this;
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.graph.instructions.LocationMatchingClause#at(java.util.UUID)
+         */
+        public Children at( UUID uuid ) {
+            this.location = new Location(uuid);
+            return this;
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.graph.instructions.LocationMatchingClause#at(org.jboss.dna.graph.properties.Path)
+         */
+        public Children at( Path path ) {
+            this.location = new Location(path);
+            return this;
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.graph.instructions.LocationMatchingClause#of(java.lang.String)
+         */
+        public Children of( String path ) {
+            this.location = new Location(createPath(path));
+            return this;
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.graph.instructions.LocationMatchingClause#of(java.util.UUID)
+         */
+        public Children of( UUID uuid ) {
+            this.location = new Location(uuid);
+            return this;
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.graph.instructions.LocationMatchingClause#of(org.jboss.dna.graph.properties.Path)
+         */
+        public Children of( Path path ) {
+            this.location = new Location(path);
+            return this;
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.graph.instructions.NameMatchingClause#matching(org.jboss.dna.graph.instructions.NameMatcher)
+         */
+        public Children matching( NameMatcher nameMatcher ) {
+            throw new UnsupportedOperationException();
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.graph.instructions.NameMatchingClause#with(org.jboss.dna.graph.instructions.NameMatcher)
+         */
+        public Children with( NameMatcher nameMatcher ) {
+            throw new UnsupportedOperationException();
+        }
+
+    }
+
+}
Index: src/main/java/org/jboss/dna/graph/GraphI18n.java
===================================================================
--- src/main/java/org/jboss/dna/graph/GraphI18n.java	(revision 564)
+++ src/main/java/org/jboss/dna/graph/GraphI18n.java	(working copy)
@@ -64,6 +64,7 @@
     public static I18n executedGraphCommand;
     public static I18n closingCommandExecutor;
     public static I18n closedCommandExecutor;
+    public static I18n multipleErrorsWhileExecutingRequests;
 
     // XML Sequencer
     public static I18n errorSequencingXmlDocument;
Index: src/main/java/org/jboss/dna/graph/instructions/And.java
===================================================================
--- src/main/java/org/jboss/dna/graph/instructions/And.java	(revision 0)
+++ src/main/java/org/jboss/dna/graph/instructions/And.java	(revision 0)
@@ -0,0 +1,42 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors. 
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph.instructions;
+
+import org.jboss.dna.graph.Graph;
+
+/**
+ * Interface that defines the {@link #and()} method, which returns the {@link Graph graph} that can be used to create other
+ * operations.
+ * 
+ * @author Randall Hauch
+ */
+public interface And {
+
+    /**
+     * Begin the creation of another operation on the {@link Graph}. Calling this method terminates the boundary of the previous
+     * command.
+     * 
+     * @return the graph, which can be used (with method chaining) to define additional commands; never null
+     */
+    Graph and();
+
+}
Index: src/main/java/org/jboss/dna/graph/instructions/ChangeNode.java
===================================================================
--- src/main/java/org/jboss/dna/graph/instructions/ChangeNode.java	(revision 0)
+++ src/main/java/org/jboss/dna/graph/instructions/ChangeNode.java	(revision 0)
@@ -0,0 +1,207 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors. 
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph.instructions;
+
+import java.util.UUID;
+import org.jboss.dna.graph.properties.Name;
+import org.jboss.dna.graph.properties.ValueFormatException;
+
+/**
+ * A clause that defines the new properties on a node. All methods return the object on which the method was called, which is
+ * useful when methods are chained together:
+ * 
+ * <pre>
+ * property(name1, value1).and(uuid).and(name2, value2).and(name3, value3)
+ * </pre>
+ * 
+ * @author Randall Hauch
+ */
+public interface ChangeNode extends And {
+
+    /**
+     * Define the property that should be set on a node, via the property's name and value(s). This is a synonym for
+     * {@link #with(String, Object...)} and {@link #and(String, Object...)}, and exists to make chains of methods more readable
+     * and sentence-like.
+     * 
+     * @param name the name of the property
+     * @param values the values for the property
+     * @return this changed node, useful for chaining methods together.
+     * @throws IllegalArgumentException if the supplied name is null or if the values are empty
+     * @throws ValueFormatException if the supplied string cannot be converted into a name
+     * @see #property(Name, Object...)
+     * @see #and(Name, Object...)
+     * @see #and(String, Object...)
+     * @see #and(UUID)
+     * @see #with(Name, Object...)
+     * @see #with(String, Object...)
+     * @see #with(UUID)
+     */
+    ChangeNode property( String name,
+                         Object... values );
+
+    /**
+     * Define the property that should be set on a node, via the property's name and value(s). This is a synonym for
+     * {@link #with(Name, Object...)} and {@link #and(Name, Object...)}, and exists to make chains of methods more readable and
+     * sentence-like.
+     * 
+     * @param name the name of the property
+     * @param values the values for the property
+     * @return this changed node, useful for chaining methods together.
+     * @throws IllegalArgumentException if the name is null, or if the values are empty
+     * @see #property(String, Object...)
+     * @see #and(Name, Object...)
+     * @see #and(String, Object...)
+     * @see #and(UUID)
+     * @see #with(Name, Object...)
+     * @see #with(String, Object...)
+     * @see #with(UUID)
+     */
+    ChangeNode property( Name name,
+                         Object... values );
+
+    /**
+     * Simple conjunction that provides syntactic sugar by returning this object so it can be chained with other methods to make
+     * more readable sentences.
+     * 
+     * @return this object, useful for chaining methods
+     */
+    ChangeNode with();
+
+    /**
+     * Define the UUID of the node. This is a synonym for {@link #and(UUID)}, and exists to make chains of methods more readable
+     * and sentence-like.
+     * 
+     * @param uuid the UUID
+     * @return this changed node, useful for chaining methods
+     * @throws IllegalArgumentException if the UUID is null
+     * @see #property(Name, Object...)
+     * @see #property(String, Object...)
+     * @see #and(Name, Object...)
+     * @see #and(String, Object...)
+     * @see #and(UUID)
+     * @see #with(Name, Object...)
+     * @see #with(String, Object...)
+     */
+    ChangeNode with( UUID uuid );
+
+    /**
+     * Define the property that should be set on a node, via the property's name and value(s). This is a synonym for
+     * {@link #property(String, Object...)} and {@link #and(String, Object...)}, and exists to make chains of methods more
+     * readable and sentence-like.
+     * 
+     * @param name the name of the property
+     * @param values the values for the property
+     * @return this changed node, useful for chaining methods together.
+     * @throws IllegalArgumentException if the supplied name is null or if the values are empty
+     * @throws ValueFormatException if the supplied string cannot be converted into a name
+     * @see #property(Name, Object...)
+     * @see #property(String, Object...)
+     * @see #and(Name, Object...)
+     * @see #and(String, Object...)
+     * @see #and(UUID)
+     * @see #with(Name, Object...)
+     * @see #with(UUID)
+     */
+    ChangeNode with( String name,
+                     Object... values );
+
+    /**
+     * Define the property that should be set on a node, via the property's name and value(s). This is a synonym for
+     * {@link #property(Name, Object...)} and {@link #and(Name, Object...)}, and exists to make chains of methods more readable
+     * and sentence-like.
+     * 
+     * @param name the name of the property
+     * @param values the values for the property
+     * @return this changed node, useful for chaining methods together.
+     * @throws IllegalArgumentException if the name is null, or if the values are empty
+     * @see #property(Name, Object...)
+     * @see #property(String, Object...)
+     * @see #and(Name, Object...)
+     * @see #and(String, Object...)
+     * @see #and(UUID)
+     * @see #with(String, Object...)
+     * @see #with(UUID)
+     */
+    ChangeNode with( Name name,
+                     Object... values );
+
+    /**
+     * Define the UUID of the node. This is a synonym for {@link #with(UUID)}, and exists to make chains of methods more readable
+     * and sentence-like.
+     * 
+     * @param uuid the UUID
+     * @return this changed node, useful for chaining methods
+     * @throws IllegalArgumentException if the UUID is null
+     * @see #property(Name, Object...)
+     * @see #property(String, Object...)
+     * @see #and(Name, Object...)
+     * @see #and(String, Object...)
+     * @see #with(UUID)
+     * @see #with(Name, Object...)
+     * @see #with(String, Object...)
+     */
+    ChangeNode and( UUID uuid );
+
+    /**
+     * Define the property that should be set on a node, via the property's name and value(s). This is a synonym for
+     * {@link #property(String, Object...)} and {@link #with(String, Object...)}, and exists to make chains of methods more
+     * readable and sentence-like.
+     * 
+     * @param name the name of the property
+     * @param values the values for the property
+     * @return this changed node, useful for chaining methods together.
+     * @throws IllegalArgumentException if the supplied name is null or if the values are empty
+     * @throws ValueFormatException if the supplied string cannot be converted into a name
+     * @see #property(Name, Object...)
+     * @see #property(String, Object...)
+     * @see #and(UUID)
+     * @see #and(Name, Object...)
+     * @see #and(String, Object...)
+     * @see #with(Name, Object...)
+     * @see #with(String, Object...)
+     * @see #with(UUID)
+     */
+    ChangeNode and( String name,
+                    Object... values );
+
+    /**
+     * Define the property that should be set on a node, via the property's name and value(s). This is a synonym for
+     * {@link #property(Name, Object...)} and {@link #with(Name, Object...)}, and exists to make chains of methods more readable
+     * and sentence-like.
+     * 
+     * @param name the name of the property
+     * @param values the values for the property
+     * @return this changed node, useful for chaining methods together.
+     * @throws IllegalArgumentException if the name is null, or if the values are empty
+     * @see #property(Name, Object...)
+     * @see #property(String, Object...)
+     * @see #and(UUID)
+     * @see #and(Name, Object...)
+     * @see #and(String, Object...)
+     * @see #with(Name, Object...)
+     * @see #with(String, Object...)
+     * @see #with(UUID)
+     */
+    ChangeNode and( Name name,
+                    Object... values );
+
+}
Index: src/main/java/org/jboss/dna/graph/instructions/Children.java
===================================================================
--- src/main/java/org/jboss/dna/graph/instructions/Children.java	(revision 0)
+++ src/main/java/org/jboss/dna/graph/instructions/Children.java	(revision 0)
@@ -0,0 +1,56 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors. 
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph.instructions;
+
+import org.jboss.dna.graph.properties.Path;
+
+/**
+ * The result of a call to {@link Get#children() get the children} of a node, allowing the further filtering of children with
+ * {@link NameMatcher name matching rules} and {@link PropertyMatcher property matching rules}. This also serves as a terminus for
+ * the {@link Get#children() get children} command and provides access to the {@link #iterator() children}.
+ * 
+ * @author Randall Hauch
+ */
+public interface Children extends Iterable<Path.Segment>, LocationMatchingClause<Children>, NameMatchingClause<Children> {
+
+    /**
+     * Add property criteria to the children specification.
+     * 
+     * @param propertyMatcher the matcher used to identify children with specific properties
+     * @return this object, useful for chaining methods together
+     */
+    Children having( PropertyMatcher propertyMatcher );
+
+    /**
+     * Add another clause for the children.
+     * 
+     * @return this object, useful for chaining methods together
+     */
+    Children and();
+
+    /**
+     * Get the number of children. This method results in the execution of the command.
+     * 
+     * @return the number of children
+     */
+    int size();
+}
Index: src/main/java/org/jboss/dna/graph/instructions/Copy.java
===================================================================
--- src/main/java/org/jboss/dna/graph/instructions/Copy.java	(revision 0)
+++ src/main/java/org/jboss/dna/graph/instructions/Copy.java	(revision 0)
@@ -0,0 +1,128 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors. 
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph.instructions;
+
+import java.util.UUID;
+import org.jboss.dna.graph.properties.Path;
+import org.jboss.dna.graph.properties.ValueFormatException;
+
+/**
+ * Instruction to copy a node or a subgraph.
+ * 
+ * @author Randall Hauch
+ */
+public interface Copy extends Instruction, And {
+
+    /**
+     * Copy a node (properties only) that will be further identified in subsequent clauses.
+     * 
+     * @return the interface for identifying the node to be copied; never null
+     * @see #subgraph()
+     */
+    Subject<Copy> node();
+
+    /**
+     * Copy a subgraph (a node's properties and children, recursively) that will be further identified in subsequent clauses.
+     * 
+     * @return the interface for identifying the subgraph to be copied; never null
+     * @see #node()
+     */
+    Subject<Copy> subgraph();
+
+    /**
+     * Copy children of a node. Subsequent clauses are used to identify the parent node and further reduced or filter those
+     * children are to be copied.
+     * 
+     * @return the interface for identifying the parent node and (optionally) filter those children to be copied
+     */
+    Subject<Copy> children();
+
+    /**
+     * Copy properties of a node. Subsequent clauses are used to identify the node and further reduced or filter those properties
+     * are to be copied.
+     * 
+     * @return the interface for identifying the node and (optionally) filter those properties to be copied
+     */
+    Subject<Copy> properties();
+
+    /**
+     * Copy a node given by the supplied path. Subsequent clauses are used to identify the location where the copy is to be
+     * placed.
+     * 
+     * @param path the path for the node to be copied
+     * @return the interface for identifying the location where the copied node is to be placed
+     * @throws IllegalArgumentException if the supplied path is null
+     * @throws ValueFormatException if the supplied string cannot be converted into a path
+     */
+    Target<Copy> node( String path );
+
+    /**
+     * Copy a node given by the supplied path. Subsequent clauses are used to identify the location where the copy is to be
+     * placed.
+     * 
+     * @param path the path for the node to be copied
+     * @return the interface for identifying the location where the copied node is to be placed
+     * @throws IllegalArgumentException if the supplied path is null
+     */
+    Target<Copy> node( Path path );
+
+    /**
+     * Copy a node given by the supplied UUID. Subsequent clauses are used to identify the location where the copy is to be
+     * placed.
+     * 
+     * @param uuid the UUID for the node to be copied
+     * @return the interface for identifying the location where the copied node is to be placed
+     * @throws IllegalArgumentException if the supplied UUID is null
+     */
+    Target<Copy> node( UUID uuid );
+
+    /**
+     * Copy a subgraph given by the supplied path. Subsequent clauses are used to identify the location where the copy is to be
+     * placed.
+     * 
+     * @param path the path for the subgraph to be copied
+     * @return the interface for identifying the location where the copied subgraph is to be placed
+     * @throws IllegalArgumentException if the supplied path is null
+     * @throws ValueFormatException if the supplied string cannot be converted into a path
+     */
+    Target<Copy> subgraph( String path );
+
+    /**
+     * Copy a subgraph given by the supplied path. Subsequent clauses are used to identify the location where the copy is to be
+     * placed.
+     * 
+     * @param path the path for the subgraph to be copied
+     * @return the interface for identifying the location where the copied subgraph is to be placed
+     * @throws IllegalArgumentException if the supplied path is null
+     */
+    Target<Copy> subgraph( Path path );
+
+    /**
+     * Copy a subgraph given by the supplied UUID. Subsequent clauses are used to identify the location where the copy is to be
+     * placed.
+     * 
+     * @param uuid the UUID for the subgraph to be copied
+     * @return the interface for identifying the location where the copied subgraph is to be placed
+     * @throws IllegalArgumentException if the supplied UUID is null
+     */
+    Target<Copy> subgraph( UUID uuid );
+}
Index: src/main/java/org/jboss/dna/graph/instructions/Create.java
===================================================================
--- src/main/java/org/jboss/dna/graph/instructions/Create.java	(revision 0)
+++ src/main/java/org/jboss/dna/graph/instructions/Create.java	(revision 0)
@@ -0,0 +1,121 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors. 
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph.instructions;
+
+import org.jboss.dna.graph.properties.Name;
+import org.jboss.dna.graph.properties.Path;
+import org.jboss.dna.graph.properties.ValueFormatException;
+
+/**
+ * Instruction to create a node.
+ * 
+ * @author Randall Hauch
+ */
+public interface Create extends Instruction, And {
+
+    /**
+     * Create a node that will be located or identified in a subsequent clause.
+     * 
+     * @return the interface used to locate or identify the node to be created
+     */
+    public CreateNodeAt node();
+
+    /**
+     * Create a child node with the supplied name, under a parent node that is identified in a subequent clause.
+     * 
+     * @param name the name or path segment of the child, or a relative path to the new child
+     * @return the interface used to identify the parent of the child node
+     * @throws IllegalArgumentException if the supplied name is null
+     * @throws ValueFormatException if the supplied name cannot be formatted into a {@link Name name}, {@link Path.Segment path
+     *         segment}, or {@link Path relative path}
+     * @see #child(Name)
+     * @see #child(Path.Segment)
+     * @see #child(Name, int)
+     */
+    public CreateChild child( String name );
+
+    /**
+     * Create a child node with the supplied name, under a parent node that is identified in a subequent clause.
+     * 
+     * @param name the path segment for the new child
+     * @return the interface used to identify the parent of the child node
+     * @throws IllegalArgumentException if the supplied name is null
+     * @see #child(Name)
+     * @see #child(String)
+     * @see #child(Name, int)
+     */
+    public CreateChild child( Path.Segment name );
+
+    /**
+     * Create a child node with the supplied name, under a parent node that is identified in a subequent clause.
+     * 
+     * @param name the path segment for the new child
+     * @return the interface used to identify the parent of the child node
+     * @throws IllegalArgumentException if the supplied name is null
+     * @see #child(String)
+     * @see #child(Path.Segment)
+     * @see #child(Name, int)
+     */
+    public CreateChild child( Name name );
+
+    /**
+     * Create a child node with the supplied name and index, under a parent node that is identified in a subequent clause. Any
+     * existing same-name-siblings with the supplied index will be relocated after this new child.
+     * 
+     * @param name the path segment for the new child
+     * @param index the same-name-sibling index of the child, identifying the index relative to other siblings with the same name
+     * @return the interface used to identify the parent of the child node
+     * @throws IllegalArgumentException if the supplied name is null or if the index is invalid
+     * @see #child(String)
+     * @see #child(Path.Segment)
+     * @see #child(Name)
+     */
+    public CreateChild child( Name name,
+                              int index );
+
+    /**
+     * Create a node at the supplied path.
+     * 
+     * @param path the absolute path for the new node
+     * @return the interface used to set properties for the new node
+     * @throws IllegalArgumentException if the supplied path is null
+     * @throws ValueFormatException if the supplied path cannot be formatted into a {@link Path path}
+     */
+    public ChangeNode node( String path );
+
+    /**
+     * Create a node at the supplied path.
+     * 
+     * @param path the absolute path for the new node
+     * @return the interface used to set properties for the new node
+     * @throws IllegalArgumentException if the supplied path is null
+     */
+    public ChangeNode node( Path path );
+
+    /**
+     * Specify that the create request should not fail if a node already exists, but should instead update the existing node.
+     * 
+     * @return this create request, useful for chaining methods together.
+     */
+    Create orUpdate();
+
+}
Index: src/main/java/org/jboss/dna/graph/instructions/CreateChild.java
===================================================================
--- src/main/java/org/jboss/dna/graph/instructions/CreateChild.java	(revision 0)
+++ src/main/java/org/jboss/dna/graph/instructions/CreateChild.java	(revision 0)
@@ -0,0 +1,63 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors. 
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph.instructions;
+
+import java.util.UUID;
+import org.jboss.dna.graph.properties.Path;
+import org.jboss.dna.graph.properties.ValueFormatException;
+
+/**
+ * Clause of a {@link Create} request that identifies the node under which the child is to be created.
+ * 
+ * @author Randall Hauch
+ */
+public interface CreateChild {
+
+    /**
+     * Create the child under the parent at the supplied path.
+     * 
+     * @param path the path of the parent
+     * @return the interface used to set properties for the new node
+     * @throws IllegalArgumentException if the supplied path is null
+     * @throws ValueFormatException if the supplied path cannot be formatted into a {@link Path path}
+     */
+    ChangeNode under( String path );
+
+    /**
+     * Create the child under the parent at the supplied path.
+     * 
+     * @param path the path of the parent
+     * @return the interface used to set properties for the new node
+     * @throws IllegalArgumentException if the supplied path is null
+     */
+    ChangeNode under( Path path );
+
+    /**
+     * Create the child under the parent with the supplied UUID.
+     * 
+     * @param uuid the UUID of the parent
+     * @return the interface used to set properties for the new node
+     * @throws IllegalArgumentException if the supplied path is null
+     */
+    ChangeNode under( UUID uuid );
+
+}
Index: src/main/java/org/jboss/dna/graph/instructions/CreateNodeAt.java
===================================================================
--- src/main/java/org/jboss/dna/graph/instructions/CreateNodeAt.java	(revision 0)
+++ src/main/java/org/jboss/dna/graph/instructions/CreateNodeAt.java	(revision 0)
@@ -0,0 +1,53 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors. 
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph.instructions;
+
+import org.jboss.dna.graph.properties.Path;
+import org.jboss.dna.graph.properties.ValueFormatException;
+
+/**
+ * Clause of the {@link Create} request that specifies the location at which the node is to be created.
+ * 
+ * @author Randall Hauch
+ */
+public interface CreateNodeAt {
+
+    /**
+     * Create the node at the supplied path.
+     * 
+     * @param path the path for the new node
+     * @return the interface used to set properties for the new node
+     * @throws IllegalArgumentException if the supplied path is null
+     * @throws ValueFormatException if the supplied name cannot be formatted into a {@link Path path}
+     */
+    ChangeNode at( String path );
+
+    /**
+     * Create the node at the supplied path.
+     * 
+     * @param path the path for the new node
+     * @return the interface used to set properties for the new node
+     * @throws IllegalArgumentException if the supplied path is null
+     */
+    ChangeNode at( Path path );
+
+}
Index: src/main/java/org/jboss/dna/graph/instructions/Delete.java
===================================================================
--- src/main/java/org/jboss/dna/graph/instructions/Delete.java	(revision 0)
+++ src/main/java/org/jboss/dna/graph/instructions/Delete.java	(revision 0)
@@ -0,0 +1,89 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors. 
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph.instructions;
+
+import java.util.UUID;
+import org.jboss.dna.graph.properties.Path;
+import org.jboss.dna.graph.properties.ValueFormatException;
+
+/**
+ * Instruction to delete a node, properties of a node, or children of a node.
+ * 
+ * @author Randall Hauch
+ */
+public interface Delete extends Instruction, DeleteAction {
+
+    /**
+     * Delete the nodes that will be identified in subsequent clauses.
+     * 
+     * @return the interface for refining or adding to the content that is to be deleted
+     */
+    DeleteNodes nodes();
+
+    /**
+     * Delete the node at the supplied path.
+     * 
+     * @param path the path of the node to be deleted
+     * @return the interface for refining or adding to the content that is to be deleted
+     * @throws IllegalArgumentException if the supplied path is null
+     * @throws ValueFormatException if the supplied path cannot be formatted into a {@link Path path}
+     */
+    DeleteNode node( String path );
+
+    /**
+     * Delete the node at the supplied path.
+     * 
+     * @param path the path of the node to be deleted
+     * @return the interface for refining or adding to the content that is to be deleted
+     * @throws IllegalArgumentException if the supplied path is null
+     */
+    DeleteNode node( Path path );
+
+    /**
+     * Delete the node with the supplied UUID.
+     * 
+     * @param uuid the UUID of the node to be deleted
+     * @return the interface for refining or adding to the content that is to be deleted
+     * @throws IllegalArgumentException if the supplied UUID is null
+     */
+    DeleteNode node( UUID uuid );
+
+    /**
+     * Delete the nodes at the supplied paths.
+     * 
+     * @param paths the paths of the nodes to be deleted
+     * @return the interface for refining or adding to the content that is to be deleted
+     * @throws IllegalArgumentException if any of the supplied paths is null
+     * @throws ValueFormatException if any of the supplied paths cannot be formatted into a {@link Path path}
+     */
+    DeleteNode nodes( String... paths );
+
+    /**
+     * Delete the nodes at the supplied paths.
+     * 
+     * @param paths the paths of the nodes to be deleted
+     * @return the interface for refining or adding to the content that is to be deleted
+     * @throws IllegalArgumentException if any of the supplied paths is null
+     */
+    DeleteNode nodes( Path... paths );
+
+}
Index: src/main/java/org/jboss/dna/graph/instructions/DeleteAction.java
===================================================================
--- src/main/java/org/jboss/dna/graph/instructions/DeleteAction.java	(revision 0)
+++ src/main/java/org/jboss/dna/graph/instructions/DeleteAction.java	(revision 0)
@@ -0,0 +1,133 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors. 
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph.instructions;
+
+import org.jboss.dna.graph.properties.Name;
+import org.jboss.dna.graph.properties.Path;
+import org.jboss.dna.graph.properties.ValueFormatException;
+
+/**
+ * Syntax to delete a node, properties of a node, or children of a node.
+ * 
+ * @author Randall Hauch
+ */
+public interface DeleteAction extends Instruction {
+
+    /**
+     * Delete the property with the supplied name.
+     * 
+     * @param name the name of the property to be deleted
+     * @return the interface for refining or adding to the content that is to be deleted
+     * @throws IllegalArgumentException if the supplied name is null
+     * @throws ValueFormatException if the supplied name cannot be formatted into a {@link Name name}
+     */
+    DeleteCriteria property( String name );
+
+    /**
+     * Delete the property with the supplied name.
+     * 
+     * @param name the name of the property to be deleted
+     * @return the interface for refining or adding to the content that is to be deleted
+     * @throws IllegalArgumentException if the supplied name is null
+     */
+    DeleteCriteria property( Name name );
+
+    /**
+     * Delete a property to be identified in subsequent clauses.
+     * 
+     * @return the interface for refining or adding to the content that is to be deleted
+     */
+    DeleteCriteria property();
+
+    /**
+     * Delete the properties with the supplied names.
+     * 
+     * @param names the names of the properties to be deleted
+     * @return the interface for refining or adding to the content that is to be deleted
+     * @throws IllegalArgumentException if any of the supplied names are null
+     * @throws ValueFormatException if any of the supplied names cannot be formatted into a {@link Name name}
+     */
+    DeleteCriteria properties( String... names );
+
+    /**
+     * Delete the properties with the supplied names.
+     * 
+     * @param names the names of the properties to be deleted
+     * @return the interface for refining or adding to the content that is to be deleted
+     * @throws IllegalArgumentException if any of the supplied names are null
+     */
+    DeleteCriteria properties( Name... names );
+
+    /**
+     * Delete the properties that will be identified in subsequent clauses.
+     * 
+     * @return the interface for refining or adding to the content that is to be deleted
+     */
+    DeleteCriteria properties();
+
+    /**
+     * Delete the child with the supplied path segment (name and optional index).
+     * 
+     * @param segment the path segment of the child to be deleted
+     * @return the interface for refining or adding to the content that is to be deleted
+     * @throws IllegalArgumentException if the supplied name is null
+     * @throws ValueFormatException if the supplied name cannot be formatted into a {@link Path.Segment path segment}
+     */
+    DeleteCriteria child( String segment );
+
+    /**
+     * Delete the child with the supplied name (and no index).
+     * 
+     * @param name the name of the child to be deleted
+     * @return the interface for refining or adding to the content that is to be deleted
+     * @throws IllegalArgumentException if the supplied name is null
+     */
+    DeleteCriteria child( Name name );
+
+    /**
+     * Delete the child with the supplied name and index.
+     * 
+     * @param name the name of the child to be deleted
+     * @param index the same-name-sibling index of the child to be deleted
+     * @return the interface for refining or adding to the content that is to be deleted
+     * @throws IllegalArgumentException if the supplied name is null
+     */
+    DeleteCriteria child( Name name,
+                          int index );
+
+    /**
+     * Delete the child with the supplied path segment (name and optional index).
+     * 
+     * @param segment the path segment of the child to be deleted
+     * @return the interface for refining or adding to the content that is to be deleted
+     * @throws IllegalArgumentException if the supplied name is null
+     */
+    DeleteCriteria child( Path.Segment segment );
+
+    /**
+     * Delete the children that will be identified in subsequent clauses.
+     * 
+     * @return the interface for refining or adding to the content that is to be deleted
+     */
+    DeleteCriteria children();
+
+}
Index: src/main/java/org/jboss/dna/graph/instructions/DeleteCriteria.java
===================================================================
--- src/main/java/org/jboss/dna/graph/instructions/DeleteCriteria.java	(revision 0)
+++ src/main/java/org/jboss/dna/graph/instructions/DeleteCriteria.java	(revision 0)
@@ -0,0 +1,36 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors. 
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph.instructions;
+
+/**
+ * @author Randall Hauch
+ */
+public interface DeleteCriteria extends Subject<Delete>, DeleteAction {
+
+    /**
+     * Conjunction useful for combining criteria.
+     * 
+     * @return the interface for refining or adding to the content that is to be deleted
+     */
+    DeleteCriteria and();
+
+}
Index: src/main/java/org/jboss/dna/graph/instructions/DeleteNode.java
===================================================================
--- src/main/java/org/jboss/dna/graph/instructions/DeleteNode.java	(revision 0)
+++ src/main/java/org/jboss/dna/graph/instructions/DeleteNode.java	(revision 0)
@@ -0,0 +1,63 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors. 
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph.instructions;
+
+import java.util.UUID;
+import org.jboss.dna.graph.properties.Path;
+import org.jboss.dna.graph.properties.ValueFormatException;
+
+/**
+ * Instruction to delete a node.
+ * 
+ * @author Randall Hauch
+ */
+public interface DeleteNode extends And {
+
+    /**
+     * Delete a nodes with the supplied paths.
+     * 
+     * @param paths the paths of the nodes to be deleted
+     * @return the interface useful for deleting nodes by path or UUID
+     * @throws IllegalArgumentException if any of the supplied paths are null
+     * @throws ValueFormatException if any of the supplied paths cannot be formatted into a {@link Path path}
+     */
+    DeleteNode and( String... paths );
+
+    /**
+     * Delete a nodes with the supplied paths.
+     * 
+     * @param paths the paths of the nodes to be deleted
+     * @return the interface useful for deleting nodes by path or UUID
+     * @throws IllegalArgumentException if any of the supplied paths are null
+     */
+    DeleteNode and( Path... paths );
+
+    /**
+     * Delete a nodes with the supplied UUID.
+     * 
+     * @param uuid the UUID of the nodes to be deleted
+     * @return the interface useful for deleting nodes by path or UUID
+     * @throws IllegalArgumentException if any of the supplied UUIDs are null
+     */
+    DeleteNode and( UUID... uuid );
+
+}
Index: src/main/java/org/jboss/dna/graph/instructions/DeleteNodes.java
===================================================================
--- src/main/java/org/jboss/dna/graph/instructions/DeleteNodes.java	(revision 0)
+++ src/main/java/org/jboss/dna/graph/instructions/DeleteNodes.java	(revision 0)
@@ -0,0 +1,71 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors. 
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph.instructions;
+
+import java.util.UUID;
+import org.jboss.dna.graph.properties.Path;
+import org.jboss.dna.graph.properties.ValueFormatException;
+
+/**
+ * Clause to define the criteria for the nodes that are to be deleted.
+ * 
+ * @author Randall Hauch
+ */
+public interface DeleteNodes extends LocationMatchingClause<DeleteNodes>, NameMatchingClause<DeleteNodes>, And {
+
+    /**
+     * Specify the property matcher used to identify nodes that should be deleted.
+     * 
+     * @param propertyMatcher the property matcher
+     * @return the interface useful for deleting nodes by path or UUID
+     * @throws IllegalArgumentException if the property matcher is null or invalid
+     */
+    DeleteNodes having( PropertyMatcher propertyMatcher );
+
+    /**
+     * Define the path under which nodes are to be deleted.
+     * 
+     * @param path the path under which the nodes to be deleted
+     * @return the interface useful for deleting nodes by path or UUID
+     * @throws IllegalArgumentException if any of the supplied paths are null
+     * @throws ValueFormatException if the supplied path cannot be formatted into a {@link Path path}
+     */
+    DeleteNodes under( String path );
+
+    /**
+     * Define the path under which nodes are to be deleted.
+     * 
+     * @param path the path under which the nodes to be deleted
+     * @return the interface useful for deleting nodes by path or UUID
+     * @throws IllegalArgumentException if any of the supplied paths are null
+     */
+    DeleteNodes under( Path path );
+
+    /**
+     * Define the UUID under which nodes are to be deleted.
+     * 
+     * @param uuid the UUID under which the nodes to be deleted
+     * @return the interface useful for deleting nodes by path or UUID
+     * @throws IllegalArgumentException if any of the supplied paths are null
+     */
+    DeleteNodes under( UUID uuid );
+}
Index: src/main/java/org/jboss/dna/graph/instructions/Get.java
===================================================================
--- src/main/java/org/jboss/dna/graph/instructions/Get.java	(revision 0)
+++ src/main/java/org/jboss/dna/graph/instructions/Get.java	(revision 0)
@@ -0,0 +1,145 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors. 
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph.instructions;
+
+import java.util.UUID;
+import org.jboss.dna.graph.Graph;
+import org.jboss.dna.graph.properties.Name;
+import org.jboss.dna.graph.properties.Path;
+import org.jboss.dna.graph.properties.ValueFormatException;
+
+/**
+ * Instruction to get a node, subgraph, properties of a node, or children of a node.
+ * 
+ * @see Graph#get()
+ * @author Randall Hauch
+ */
+public interface Get extends Instruction {
+
+    /**
+     * Get the children of a node that will be identified in subsequent clauses.
+     * 
+     * @return the interface for identifying the node to be read; never null
+     */
+    public Children children();
+
+    /**
+     * Get the supplied property of a node that will be identified in subsequent clauses.
+     * 
+     * @param name the name of the property that is to be read
+     * @return the interface for identifying the node on which the property exists; never null
+     * @throws IllegalArgumentException if the name is null
+     * @throws ValueFormatException if the supplied name cannot be formatted into a {@link Name name}
+     */
+    public SingleProperty property( String name );
+
+    /**
+     * Get the supplied property of a node that will be identified in subsequent clauses.
+     * 
+     * @param name the name of the property that is to be read
+     * @return the interface for identifying the node on which the property exists; never null
+     * @throws IllegalArgumentException if the name is null
+     */
+    public SingleProperty property( Name name );
+
+    /**
+     * Get the properties of a node that will be identified in subsequent clauses.
+     * 
+     * @return the interface for identifying the node to be read; never null
+     */
+    public MultipleProperties properties();
+
+    /**
+     * Get the properties and children of the node that will be identified in subsequent clauses.
+     * 
+     * @return the interface for identifying the node to be read; never null
+     */
+    public Node node();
+
+    /**
+     * Get the properties and children of the node at the supplied path.
+     * 
+     * @param path the path of the node that is to be read
+     * @return the interface for further refining or identifying the content to be retrieved; never null
+     * @throws IllegalArgumentException if the path is null
+     * @throws ValueFormatException if the supplied name cannot be formatted into a {@link Name name}
+     */
+    public Node node( String path );
+
+    /**
+     * Get the properties and children of the node at the supplied path.
+     * 
+     * @param path the path of the node that is to be read
+     * @return the interface for further refining or identifying the content to be retrieved; never null
+     * @throws IllegalArgumentException if the path is null
+     */
+    public Node node( Path path );
+
+    /**
+     * Get the properties and children of the node with the supplied UUID.
+     * 
+     * @param uuid the UUID of the node that is to be read
+     * @return the interface for further refining or identifying the content to be retrieved; never null
+     * @throws IllegalArgumentException if the UUID is null
+     */
+    public Node node( UUID uuid );
+
+    /**
+     * Get the subgraph rooted at the node that will be identified in subsequent clauses. A subgraph contains it's root node and
+     * all nodes below it (optionally to a {@link Subgraph#ofDepth(int) depth}). Every node retrieved includes its properties.
+     * 
+     * @return the interface for identifying the node to be read; never null
+     */
+    public Subgraph subgraph();
+
+    /**
+     * Get the subgraph rooted at the node at the supplied path. A subgraph contains it's root node and all nodes below it
+     * (optionally to a {@link Subgraph#ofDepth(int) depth}). Every node retrieved includes its properties.
+     * 
+     * @param path the path of the node that is to be read
+     * @return the interface for identifying the node to be read; never null
+     * @throws IllegalArgumentException if the path is null
+     * @throws ValueFormatException if the supplied name cannot be formatted into a {@link Name name}
+     */
+    public Subgraph subgraph( String path );
+
+    /**
+     * Get the subgraph rooted at the node at the supplied path. A subgraph contains it's root node and all nodes below it
+     * (optionally to a {@link Subgraph#ofDepth(int) depth}). Every node retrieved includes its properties.
+     * 
+     * @param path the path of the node that is to be read
+     * @return the interface for identifying the node to be read; never null
+     * @throws IllegalArgumentException if the path is null
+     */
+    public Subgraph subgraph( Path path );
+
+    /**
+     * Get the subgraph rooted at the node at the supplied UUID. A subgraph contains it's root node and all nodes below it
+     * (optionally to a {@link Subgraph#ofDepth(int) depth}). Every node retrieved includes its properties.
+     * 
+     * @param uuid the UUID of the node that is to be read
+     * @return the interface for identifying the node to be read; never null
+     * @throws IllegalArgumentException if the UUID is null
+     */
+    public Subgraph subgraph( UUID uuid );
+
+}
Index: src/main/java/org/jboss/dna/graph/instructions/Instruction.java
===================================================================
--- src/main/java/org/jboss/dna/graph/instructions/Instruction.java	(revision 0)
+++ src/main/java/org/jboss/dna/graph/instructions/Instruction.java	(revision 0)
@@ -0,0 +1,65 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors. 
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph.instructions;
+
+import org.jboss.dna.graph.Graph;
+
+/**
+ * @author Randall Hauch
+ */
+public interface Instruction {
+
+    /**
+     * Return whether there is an instruction that follows this instruction.
+     * 
+     * @return true if there is an instruction that follows this instruction, or false if this is the last instruction
+     */
+    boolean hasNext();
+
+    /**
+     * Get the next instruction.
+     * 
+     * @return the next instruction, or null if this is the last instruction
+     */
+    Instruction next();
+
+    /**
+     * Get the previous instruction.
+     * 
+     * @return the previous instruction, or null if this is the first instruction
+     */
+    boolean hasPrevious();
+
+    /**
+     * Get the previous instruction.
+     * 
+     * @return the previous instruction, or null if this is the first instruction
+     */
+    Instruction previous();
+
+    /**
+     * Get the graph that created this request and that will be used to execute the request.
+     * 
+     * @return the graph instance; never null
+     */
+    Graph graph();
+}
Index: src/main/java/org/jboss/dna/graph/instructions/InvalidGraphRequestException.java
===================================================================
--- src/main/java/org/jboss/dna/graph/instructions/InvalidGraphRequestException.java	(revision 0)
+++ src/main/java/org/jboss/dna/graph/instructions/InvalidGraphRequestException.java	(revision 0)
@@ -0,0 +1,78 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors. 
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph.instructions;
+
+/**
+ * @author Randall Hauch
+ */
+public class InvalidGraphRequestException extends RuntimeException {
+
+    private static final long serialVersionUID = 1L;
+    private final Instruction invalidRequest;
+
+    /**
+     * @param invalidRequest the invalid request
+     */
+    public InvalidGraphRequestException( Instruction invalidRequest ) {
+        this.invalidRequest = invalidRequest;
+    }
+
+    /**
+     * @param invalidRequest the invalid request
+     * @param message
+     */
+    public InvalidGraphRequestException( Instruction invalidRequest,
+                                String message ) {
+        super(message);
+        this.invalidRequest = invalidRequest;
+    }
+
+    /**
+     * @param invalidRequest the invalid request
+     * @param cause
+     */
+    public InvalidGraphRequestException( Instruction invalidRequest,
+                                Throwable cause ) {
+        super(cause);
+        this.invalidRequest = invalidRequest;
+    }
+
+    /**
+     * @param invalidRequest the invalid request
+     * @param message
+     * @param cause
+     */
+    public InvalidGraphRequestException( Instruction invalidRequest,
+                                String message,
+                                Throwable cause ) {
+        super(message, cause);
+        this.invalidRequest = invalidRequest;
+    }
+
+    /**
+     * @return invalidRequest
+     */
+    public Instruction getInvalidRequest() {
+        return invalidRequest;
+    }
+
+}
Index: src/main/java/org/jboss/dna/graph/instructions/LocationMatchingClause.java
===================================================================
--- src/main/java/org/jboss/dna/graph/instructions/LocationMatchingClause.java	(revision 0)
+++ src/main/java/org/jboss/dna/graph/instructions/LocationMatchingClause.java	(revision 0)
@@ -0,0 +1,92 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors. 
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph.instructions;
+
+import java.util.UUID;
+import org.jboss.dna.graph.properties.Path;
+import org.jboss.dna.graph.properties.ValueFormatException;
+
+/**
+ * Clause that is used for specifying the location of a node via a path or UUID.
+ * 
+ * @author Randall Hauch
+ * @param <T> the interface that should be the return type for the methods
+ */
+public interface LocationMatchingClause<T> {
+
+    /**
+     * Specify the location. This is a synonym for {@link #of(String)}.
+     * 
+     * @param path the location
+     * @return the next interface
+     * @throws IllegalArgumentException if the path is null
+     * @throws ValueFormatException if the supplied path cannot be formatted into a {@link Path path}
+     */
+    T at( String path );
+
+    /**
+     * Specify the location. This is a synonym for {@link #of(UUID)}.
+     * 
+     * @param uuid the UUID of the location
+     * @return the next interface
+     * @throws IllegalArgumentException if the path is null
+     */
+    T at( UUID uuid );
+
+    /**
+     * Specify the location. This is a synonym for {@link #of(Path)}.
+     * 
+     * @param path the location
+     * @return the next interface
+     * @throws IllegalArgumentException if the path is null
+     */
+    T at( Path path );
+
+    /**
+     * Specify the location. This is a synonym for {@link #at(String)}.
+     * 
+     * @param path the location
+     * @return the next interface
+     * @throws IllegalArgumentException if the path is null
+     * @throws ValueFormatException if the supplied path cannot be formatted into a {@link Path path}
+     */
+    T of( String path );
+
+    /**
+     * Specify the location. This is a synonym for {@link #at(UUID)}.
+     * 
+     * @param uuid the UUID of the location
+     * @return the next interface
+     * @throws IllegalArgumentException if the path is null
+     */
+    T of( UUID uuid );
+
+    /**
+     * Specify the location. This is a synonym for {@link #at(Path)}.
+     * 
+     * @param path the location
+     * @return the next interface
+     * @throws IllegalArgumentException if the path is null
+     */
+    T of( Path path );
+
+}
Index: src/main/java/org/jboss/dna/graph/instructions/Move.java
===================================================================
--- src/main/java/org/jboss/dna/graph/instructions/Move.java	(revision 0)
+++ src/main/java/org/jboss/dna/graph/instructions/Move.java	(revision 0)
@@ -0,0 +1,51 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors. 
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph.instructions;
+
+import java.util.UUID;
+import org.jboss.dna.graph.properties.Path;
+
+/**
+ * @author Randall Hauch
+ */
+public interface Move extends Instruction, And {
+
+    Subject<Move> node();
+
+    Subject<Move> subgraph();
+
+    Subject<Move> children();
+
+    Subject<Move> properties();
+
+    Target<Move> node( String path );
+
+    Target<Move> node( Path path );
+
+    Target<Move> node( UUID uuid );
+
+    Target<Move> subgraph( String path );
+
+    Target<Move> subgraph( Path path );
+
+    Target<Move> subgraph( UUID uuid );
+}
Index: src/main/java/org/jboss/dna/graph/instructions/MultipleProperties.java
===================================================================
--- src/main/java/org/jboss/dna/graph/instructions/MultipleProperties.java	(revision 0)
+++ src/main/java/org/jboss/dna/graph/instructions/MultipleProperties.java	(revision 0)
@@ -0,0 +1,53 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors. 
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph.instructions;
+
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+import org.jboss.dna.graph.properties.Name;
+import org.jboss.dna.graph.properties.Path;
+import org.jboss.dna.graph.properties.Property;
+
+/**
+ * @author Randall Hauch
+ */
+public interface MultipleProperties
+    extends Iterable<Property>, LocationMatchingClause<MultipleProperties>, NameMatchingClause<MultipleProperties>, And {
+
+    MultipleProperties on( String path );
+
+    MultipleProperties on( UUID uuid );
+
+    MultipleProperties on( Path path );
+
+    MultipleProperties having( PropertyMatcher propertyMatcher );
+
+    Property getPropertyByName( String name );
+
+    int size();
+
+    Set<Name> getPropertyNames();
+
+    Map<Name, Property> asMap();
+
+}
Index: src/main/java/org/jboss/dna/graph/instructions/NameMatcher.java
===================================================================
--- src/main/java/org/jboss/dna/graph/instructions/NameMatcher.java	(revision 0)
+++ src/main/java/org/jboss/dna/graph/instructions/NameMatcher.java	(revision 0)
@@ -0,0 +1,30 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors. 
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph.instructions;
+
+/**
+ * 
+ * @author Randall Hauch
+ */
+public interface NameMatcher {
+
+}
Index: src/main/java/org/jboss/dna/graph/instructions/NameMatchingClause.java
===================================================================
--- src/main/java/org/jboss/dna/graph/instructions/NameMatchingClause.java	(revision 0)
+++ src/main/java/org/jboss/dna/graph/instructions/NameMatchingClause.java	(revision 0)
@@ -0,0 +1,33 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors. 
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph.instructions;
+
+/**
+ * @author Randall Hauch
+ * @param <T>
+ */
+public interface NameMatchingClause<T> {
+
+    T with( NameMatcher nameMatcher );
+
+    T matching( NameMatcher nameMatcher );
+}
Index: src/main/java/org/jboss/dna/graph/instructions/Node.java
===================================================================
--- src/main/java/org/jboss/dna/graph/instructions/Node.java	(revision 0)
+++ src/main/java/org/jboss/dna/graph/instructions/Node.java	(revision 0)
@@ -0,0 +1,49 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors. 
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph.instructions;
+
+import java.util.Map;
+import java.util.UUID;
+import org.jboss.dna.graph.properties.Name;
+import org.jboss.dna.graph.properties.Path;
+import org.jboss.dna.graph.properties.Property;
+
+/**
+ * @author Randall Hauch
+ */
+public interface Node extends Iterable<Path.Segment>, LocationMatchingClause<Node>, NameMatchingClause<Node>, And {
+
+    Node with( UUID uuid );
+
+    Node having( UUID uuid );
+
+    Children getChildren();
+
+    MultipleProperties getProperties();
+
+    Property getProperty( String name );
+
+    Property getProperty( Name name );
+
+    Map<Name, Property> getPropertiesByName();
+
+}
Index: src/main/java/org/jboss/dna/graph/instructions/PropertyMatcher.java
===================================================================
--- src/main/java/org/jboss/dna/graph/instructions/PropertyMatcher.java	(revision 0)
+++ src/main/java/org/jboss/dna/graph/instructions/PropertyMatcher.java	(revision 0)
@@ -0,0 +1,30 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors. 
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph.instructions;
+
+/**
+ * 
+ * @author Randall Hauch
+ */
+public interface PropertyMatcher {
+
+}
Index: src/main/java/org/jboss/dna/graph/instructions/Set.java
===================================================================
--- src/main/java/org/jboss/dna/graph/instructions/Set.java	(revision 0)
+++ src/main/java/org/jboss/dna/graph/instructions/Set.java	(revision 0)
@@ -0,0 +1,34 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors. 
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph.instructions;
+
+/**
+ * @author Randall Hauch
+ */
+public interface Set extends Instruction, And {
+
+    SetProperty property( String name );
+
+    SetProperty property( String name,
+                          Object... values );
+
+}
Index: src/main/java/org/jboss/dna/graph/instructions/SetProperty.java
===================================================================
--- src/main/java/org/jboss/dna/graph/instructions/SetProperty.java	(revision 0)
+++ src/main/java/org/jboss/dna/graph/instructions/SetProperty.java	(revision 0)
@@ -0,0 +1,44 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors. 
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph.instructions;
+
+import java.util.UUID;
+import org.jboss.dna.graph.properties.Path;
+
+/**
+ * @author Randall Hauch
+ */
+public interface SetProperty extends And {
+
+    SetProperty to( Object... values );
+
+    SetPropertyValues on( String path );
+
+    SetPropertyValues on( UUID uuid );
+
+    SetPropertyValues on( Path path );
+
+    SetProperty and( String name,
+                     Object... values );
+
+    SetPropertyValues and( String name );
+}
Index: src/main/java/org/jboss/dna/graph/instructions/SetPropertyValues.java
===================================================================
--- src/main/java/org/jboss/dna/graph/instructions/SetPropertyValues.java	(revision 0)
+++ src/main/java/org/jboss/dna/graph/instructions/SetPropertyValues.java	(revision 0)
@@ -0,0 +1,33 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors. 
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph.instructions;
+
+/**
+ * @author Randall Hauch
+ */
+public interface SetPropertyValues extends And {
+
+    SetProperty to( Object... values );
+
+    SetPropertyValues and( String name,
+                           Object... values );
+}
Index: src/main/java/org/jboss/dna/graph/instructions/SingleProperty.java
===================================================================
--- src/main/java/org/jboss/dna/graph/instructions/SingleProperty.java	(revision 0)
+++ src/main/java/org/jboss/dna/graph/instructions/SingleProperty.java	(revision 0)
@@ -0,0 +1,39 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors. 
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph.instructions;
+
+import java.util.UUID;
+import org.jboss.dna.graph.properties.Path;
+import org.jboss.dna.graph.properties.Property;
+
+/**
+ * @author Randall Hauch
+ */
+public interface SingleProperty extends LocationMatchingClause<SingleProperty>, Property, And {
+
+    SingleProperty on( String path );
+
+    SingleProperty on( UUID uuid );
+
+    SingleProperty on( Path path );
+
+}
Index: src/main/java/org/jboss/dna/graph/instructions/Subgraph.java
===================================================================
--- src/main/java/org/jboss/dna/graph/instructions/Subgraph.java	(revision 0)
+++ src/main/java/org/jboss/dna/graph/instructions/Subgraph.java	(revision 0)
@@ -0,0 +1,44 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors. 
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph.instructions;
+
+import java.util.UUID;
+import org.jboss.dna.graph.properties.Path;
+
+/**
+ * @author Randall Hauch
+ */
+public interface Subgraph extends LocationMatchingClause<Subgraph>, NameMatchingClause<Subgraph>, And {
+
+    Subgraph ofDepth( int maxDepth );
+
+    Subgraph with( UUID uuid );
+
+    Node getRoot();
+
+    Node getNode( String relativePath );
+
+    Node getNode( Path relativePath );
+
+    Node getNode( UUID uuid );
+
+}
Index: src/main/java/org/jboss/dna/graph/instructions/Subject.java
===================================================================
--- src/main/java/org/jboss/dna/graph/instructions/Subject.java	(revision 0)
+++ src/main/java/org/jboss/dna/graph/instructions/Subject.java	(revision 0)
@@ -0,0 +1,44 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors. 
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph.instructions;
+
+import java.util.UUID;
+import org.jboss.dna.graph.properties.Path;
+
+/**
+ * @author Randall Hauch
+ * @param <T> the type of command
+ */
+public interface Subject<T> extends LocationMatchingClause<Target<T>>, NameMatchingClause<Target<T>> {
+
+    Target<T> having( PropertyMatcher propertyMatcher );
+
+    Target<T> on( String path );
+
+    Target<T> on( UUID uuid );
+
+    Target<T> on( Path path );
+
+    Target<T> with( UUID uuid );
+
+    Target<T> having( UUID uuid );
+}
Index: src/main/java/org/jboss/dna/graph/instructions/Target.java
===================================================================
--- src/main/java/org/jboss/dna/graph/instructions/Target.java	(revision 0)
+++ src/main/java/org/jboss/dna/graph/instructions/Target.java	(revision 0)
@@ -0,0 +1,41 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors. 
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph.instructions;
+
+import java.util.UUID;
+import org.jboss.dna.graph.properties.Path;
+
+/**
+ * @author Randall Hauch
+ * @param <T> the type of command
+ */
+public interface Target<T> extends Subject<T>, And {
+
+    LocationMatchingClause<Target<T>> into();
+
+    T into( String path );
+
+    T into( Path path );
+
+    T into( UUID uuid );
+
+}
Index: src/test/java/org/jboss/dna/graph/GraphTest.java
===================================================================
--- src/test/java/org/jboss/dna/graph/GraphTest.java	(revision 0)
+++ src/test/java/org/jboss/dna/graph/GraphTest.java	(revision 0)
@@ -0,0 +1,220 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors. 
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph;
+
+import static org.hamcrest.core.Is.is;
+import static org.junit.Assert.assertThat;
+import static org.mockito.Matchers.notNull;
+import java.util.UUID;
+import org.jboss.dna.graph.instructions.Children;
+import org.jboss.dna.graph.instructions.MultipleProperties;
+import org.jboss.dna.graph.instructions.NameMatcher;
+import org.jboss.dna.graph.instructions.Node;
+import org.jboss.dna.graph.instructions.PropertyMatcher;
+import org.jboss.dna.graph.instructions.Subgraph;
+import org.jboss.dna.graph.properties.Name;
+import org.jboss.dna.graph.properties.Path;
+import org.jboss.dna.graph.properties.Property;
+import org.junit.Test;
+
+/**
+ * @author Randall Hauch
+ */
+public class GraphTest {
+
+    private Graph graph;
+    private UUID uuid;
+    private Name name;
+    private Path path;
+    private Path relativePath;
+    private Path.Segment pathSegment;
+    private PropertyMatcher propertyMatcher;
+    private NameMatcher nameMatcher;
+
+    @Test
+    public void shouldGetIterableOfPropertiesOnNodeWithPath() {
+        for (Property property : graph.get().properties().on("/a/b")) {
+            assertThat(property, is(notNull()));
+        }
+    }
+
+    @Test
+    public void shouldGetIterableChildrenOfNodeWithName() {
+        for (Path.Segment child : graph.get().children().of("/a/b")) {
+            assertThat(child, is(notNull()));
+        }
+    }
+
+    @Test
+    @SuppressWarnings( "unused" )
+    public void shouldBuildReadableSentences() throws InterruptedException {
+        // Get all (or some) of the children of a node ...
+        Children children1 = graph.get().children().at(path);
+        Children children2 = graph.get().children().of(path);
+        Children children3 = graph.get().children().of(path).matching(nameMatcher);
+        Children children4 = graph.get().children().matching(nameMatcher).of(path);
+        Children children5 = graph.get().children().having(propertyMatcher).of(path);
+
+        // Get the values of a single property by iterating ...
+        for (Object value : graph.get().property(name).at(path)) {
+        }
+        for (Object value : graph.get().property(name).on(path)) {
+        }
+        for (Object value : graph.get().property(name).of(path)) {
+        }
+
+        // Get the properties on a node by iterating ...
+        for (Property property : graph.get().properties().at(path)) {
+        }
+        for (Property property : graph.get().properties().at(path).matching(nameMatcher)) {
+        }
+        for (Property property : graph.get().properties().at(path).matching(nameMatcher)) {
+        }
+
+        // Get a node (both properties and children) ...
+        Node node1 = graph.get().node().at(path);
+        Node node2 = graph.get().node().with(uuid);
+        Node node3 = graph.get().node().having(uuid);
+        Node node4 = graph.get().node().at(uuid);
+        Node node5 = graph.get().node(path);
+        Node node6 = graph.get().node(uuid);
+
+        // Work with the properties and children of a previously obtained node...
+        Children children6 = node1.getChildren();
+        Children children7 = node1.getChildren().having(propertyMatcher);
+        Children children8 = node1.getChildren().matching(nameMatcher);
+        Property prop7 = node1.getProperty(name);
+        MultipleProperties props4 = node1.getProperties();
+        MultipleProperties props5 = node1.getProperties().having(propertyMatcher);
+        MultipleProperties props6 = node1.getProperties().matching(nameMatcher);
+
+        // Get a subgraph (nodes and properties)
+        Subgraph subgraph1 = graph.get().subgraph("/a/b");
+        Subgraph subgraph2 = graph.get().subgraph("/a/b").ofDepth(3);
+        Subgraph subgraph3 = graph.get().subgraph().at("/a/b").ofDepth(3);
+        Subgraph subgraph4 = graph.get().subgraph().at(uuid).ofDepth(3);
+
+        // Get nodes from within a subgraph ...
+        Node node10 = subgraph1.getRoot();
+        Node node11 = subgraph1.getNode(relativePath);
+        Node node12 = subgraph1.getNode(uuid);
+
+        // We can add support for visitors, too
+        // graph.get().subgraph(path).visit(myVisitor);
+
+        // Then there are operations on a graph that result in changes to the graph. These consist of
+        // copy, delete, move, create, and set. When using these, the graph records the commands but
+        // delays executing (or committing) them against the source until the "commit()" method is called.
+        //
+        // Changes to the graph can be interspersed with "get()" commands. When this happens, it is
+        // up to the graph implementation to define the behavior when the result of a get command
+        // is requested (e.g., the get command is to be executed) while there are uncommitted changes.
+
+        // Copy a portion of the content in the graph ...
+        graph.copy().node("/a/b/").into("/x/y");
+        graph.copy().node("/a/b/").into("/x/y").and().get().node("/m/n");
+        graph.copyNode("/a/b/").into("/x/y");
+        graph.copy().node().at("/a/b").into("/x/y");
+        graph.copy().node().with(uuid).into("/x/y");
+        graph.copy().subgraph("/a/b").into("/x/y");
+        graph.copy().subgraph().at(uuid).into("/x/y");
+        graph.copySubgraph("/a/b/").into("/x/y");
+        graph.copy().children().of(uuid).into("/x/y");
+        graph.copy().children().matching(nameMatcher).on(uuid).into("/x/y");
+        graph.copy().children().of(uuid).matching(nameMatcher).into("/x/y");
+        graph.copy().children().of("/a/b").into("/x/y");
+        graph.copy().properties().of("/a/b").into("/x/y");
+
+        graph.move().node("/a/b/").into("/x/y");
+        graph.move().node("/a/b/").into("/x/y").and().get().node("/m/n");
+        graph.move().node().at("/a/b").into("/x/y");
+        graph.move().node().with(uuid).into("/x/y");
+        graph.move().properties().of("/a/b").into("/x/y");
+        graph.move().properties().of("/a/b").matching(nameMatcher).into("/x/y");
+        graph.move().children().of("/a/b").into("/x/y");
+        graph.move().children().of(uuid).into("/x/y");
+        graph.move().children().with(nameMatcher).on(uuid).into("/x/y");
+        graph.move().children().having(propertyMatcher).on(uuid).into("/x/y");
+        graph.move().children().matching(nameMatcher).on(uuid).into("/x/y");
+        graph.move().children().of(uuid).matching(nameMatcher).into("/x/y");
+        graph.move().properties().matching(nameMatcher).on(uuid).into("/x/y");
+        graph.move().properties().of(uuid).matching(nameMatcher).into("/x/y");
+        graph.move().properties().with(nameMatcher).on(uuid).into("/x/y");
+        graph.move().properties().having(propertyMatcher).on(uuid).into("/x/y");
+        graph.move().properties().of(uuid).matching(nameMatcher).into("/x/y");
+        graph.move("/a/b/").into("/x/y").and().getNode("/m/n");
+
+        graph.delete().nodes().under(path);
+        graph.delete().nodes().under(path).matching(nameMatcher);
+        graph.delete().nodes().under(path).having(propertyMatcher);
+        graph.delete().node("/a/b");
+        graph.delete().child(name).on(uuid);
+        graph.delete().child(name, 1).on(uuid);
+        graph.delete().child(pathSegment).on(uuid);
+        graph.delete().children().matching(nameMatcher).on(uuid);
+        graph.delete().children().matching(nameMatcher).on("/a/b");
+        graph.delete().children().having(propertyMatcher).on("/a/b");
+        graph.delete().children().of(uuid).matching(nameMatcher);
+        graph.delete().children().of("/a/b").matching(nameMatcher);
+        graph.delete().children().of("/a/b").having(propertyMatcher);
+        graph.delete().property("p1").on("/a/b");
+        graph.delete().property("p1").on(uuid);
+        graph.delete().property("p1").and().property("p2").on(uuid);
+        graph.delete().properties("p1", "p2").on(uuid);
+        graph.delete().properties().matching(nameMatcher);
+        graph.delete().property().matching(nameMatcher);
+        graph.delete().property("p1").and().children().matching(nameMatcher).on(uuid);
+        graph.delete().node(path).and().delete().node(path);
+        graph.delete().node(path).and(path);
+        graph.delete().nodes(path, path);
+
+        graph.create().node().at(path).with().property("p1", 1, 2, 3);
+        graph.create().node().at(path).with().property("p1", 1, 2, 3).and("p2", 1);
+        graph.create().node(path).with().property("p1", 1, 2, 3).and("p2", 1);
+        graph.create().node(path).with(uuid).and("p1", 1, 2, 3).and("p2", 1);
+        graph.create().node(path).with("p1", 1, 2, 3).and("p2", 1);
+        graph.create().child(name).under(path).with().property("p1", 1, 2, 3).and("p2", 1);
+        graph.create().child(name, 3).under(path).with().property("p1", 1, 2, 3).and("p2", 1);
+        graph.create().orUpdate().node().at(path).with().property("p1", 1, 2, 3).and("p2", 1);
+
+        graph.create().node("/a/b").with().property("p1", 1, 2, 3).and("p2", 2);
+        graph.create("/a/b").with().property("p1", 1, 2, 3).and("p2", 2);
+        graph.create("/a/b").with("p1", 1, 2, 3).and("p2", 2);
+        graph.create("/a/b").with("p1", 1, 2, 3).and("p2", 2).and().create("/a/b/c").with(uuid).and("p3", "p3value");
+        graph.create("/a/b").with(uuid).and("p1", 1, 2, 3).and("p2", 2);
+        graph.create("/a/b").with(uuid).and("p1", 1, 2).and("p2", 2).and().createChild("c").under(path).with().property("p3", 10);
+        graph.create("/a/b").with(uuid).and("p1", 1, 2, 3).and("p2", 2).and().create("/a/b/c").with().property("p3", 10);
+        graph.createChild("c").under("/a/b").with("p1", 1, 2, 3).and("p2", 2);
+        graph.createChild("c/d").under("/a/b").with("p1", 1, 2, 3).and("p2", 2);
+
+        graph.set().property("p1").on(path).to(1, 2).and().set().property("p2").on("/c/d/");
+        graph.set().property("p1", 1, 2).on("/a/b").and().set().property("p2").on("/c/d/");
+        graph.set().property("p1", 1, 2).and("p2", "value").and("p3", "x").on("/a/b").and().set().property("p2").on("/c/d/");
+        graph.set().property("p1", 1, 2).and("p2").to("value").on("/a/b").and().set().property("p2").on("/c/d/");
+        graph.set().property("p1").to(1, 2).and("p2").to("value").on("/a/b").and().set().property("p2").on("/c/d/");
+        graph.set("p1").to(1, 2).on("/a/b").and().set().property("p2").on("/c/d/");
+        graph.set("p1", 1, 2).on("/a/b").and().set().property("p2").on("/c/d/");
+
+        // Changes made via a graph are committed (or executed) using the "commit" method.
+        graph.commit();
+    }
+}
