Added cubby-holes for new projects.
diff --git a/cli/src/main/java/org/onlab/onos/cli/AbstractShellCommand.java b/cli/src/main/java/org/onlab/onos/cli/AbstractShellCommand.java
new file mode 100644
index 0000000..aeea443
--- /dev/null
+++ b/cli/src/main/java/org/onlab/onos/cli/AbstractShellCommand.java
@@ -0,0 +1,24 @@
+package org.onlab.onos.cli;
+
+import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+
+/**
+ * Base abstraction of Karaf shell commands.
+ */
+public abstract class AbstractShellCommand extends OsgiCommandSupport {
+
+    /**
+     * Returns the reference to the implementaiton of the specified service.
+     *
+     * @param serviceClass service class
+     * @param <T>          type of service
+     * @return service implementation
+     */
+    static <T> T get(Class<T> serviceClass) {
+        BundleContext bc = FrameworkUtil.getBundle(AbstractShellCommand.class).getBundleContext();
+        return bc.getService(bc.getServiceReference(serviceClass));
+    }
+
+}
diff --git a/cli/src/main/java/org/onlab/onos/cli/GreetCommand.java b/cli/src/main/java/org/onlab/onos/cli/GreetCommand.java
new file mode 100644
index 0000000..dd8ae81
--- /dev/null
+++ b/cli/src/main/java/org/onlab/onos/cli/GreetCommand.java
@@ -0,0 +1,24 @@
+package org.onlab.onos.cli;
+
+import org.apache.karaf.shell.commands.Argument;
+import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.onlab.onos.net.GreetService;
+
+/**
+ * Simple command example to demonstrate use of Karaf shell extensions; shows
+ * use of an optional parameter as well.
+ */
+@Command(scope = "onos", name = "greet", description = "Issues a greeting")
+public class GreetCommand extends OsgiCommandSupport {
+
+    @Argument(index = 0, name = "name", description = "Name to greet",
+              required = false, multiValued = false)
+    String name = "dude";
+
+    @Override
+    protected Object doExecute() throws Exception {
+        System.out.println(getService(GreetService.class).yo(name));
+        return null;
+    }
+}
diff --git a/cli/src/main/java/org/onlab/onos/cli/NameCompleter.java b/cli/src/main/java/org/onlab/onos/cli/NameCompleter.java
new file mode 100644
index 0000000..bdf3f72
--- /dev/null
+++ b/cli/src/main/java/org/onlab/onos/cli/NameCompleter.java
@@ -0,0 +1,33 @@
+package org.onlab.onos.cli;
+
+import org.apache.karaf.shell.console.Completer;
+import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.onlab.onos.net.GreetService;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.SortedSet;
+
+/**
+ * Simple example of a command-line parameter completer.
+ * For a more open-ended sets a more efficient implementation would be required.
+ */
+public class NameCompleter implements Completer {
+    @Override
+    public int complete(String buffer, int cursor, List<String> candidates) {
+        // Delegate string completer
+        StringsCompleter delegate = new StringsCompleter();
+
+        // Fetch our service and feed it's offerings to the string completer
+        GreetService greetService = AbstractShellCommand.get(GreetService.class);
+        Iterator<String> it = greetService.names().iterator();
+        SortedSet<String> strings = delegate.getStrings();
+        while (it.hasNext()) {
+            strings.add(it.next());
+        }
+
+        // Now let the completer do the work for figuring out what to offer.
+        return delegate.complete(buffer, cursor, candidates);
+    }
+
+}
diff --git a/cli/src/main/javadoc/org/onlab/onos/cli/package.html b/cli/src/main/javadoc/org/onlab/onos/cli/package.html
new file mode 100644
index 0000000..dacfec0
--- /dev/null
+++ b/cli/src/main/javadoc/org/onlab/onos/cli/package.html
@@ -0,0 +1,3 @@
+<body>
+Administrative console command-line extensions.
+</body>
diff --git a/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
new file mode 100644
index 0000000..5cc83ef
--- /dev/null
+++ b/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
@@ -0,0 +1,14 @@
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+
+    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
+        <command>
+            <action class="org.onlab.onos.cli.GreetCommand"/>
+            <completers>
+                <ref component-id="nameCompleter"/>
+            </completers>
+        </command>
+    </command-bundle>
+
+    <bean id="nameCompleter" class="org.onlab.onos.cli.NameCompleter"/>
+
+</blueprint>