diff --git a/gogo/gogo.runtime/pom.xml b/gogo/gogo.runtime/pom.xml
index 22c6dfb..b2f0362 100644
--- a/gogo/gogo.runtime/pom.xml
+++ b/gogo/gogo.runtime/pom.xml
@@ -59,7 +59,6 @@
                             org.osgi.service.threadio; version=1.0.0
                         </Export-Package>
                         <Import-Package>
-                            org.osgi.service.component*; resolution:=optional,
                             org.osgi.service.log*; resolution:=optional,
                             org.osgi.service.packageadmin*; resolution:=optional,
                             org.osgi.service.startlevel*; resolution:=optional,
@@ -69,6 +68,7 @@
                         <Bundle-SymbolicName>${pom.artifactId}</Bundle-SymbolicName>
                         <Bundle-Vendor>The Apache Software Foundation</Bundle-Vendor>
                         <Bundle-Activator>org.apache.felix.gogo.runtime.Activator</Bundle-Activator>
+                        <_versionpolicy>[$(version;==;$(@)),$(version;+;$(@)))</_versionpolicy>
                     </instructions>
                 </configuration>
             </plugin>
diff --git a/gogo/gogo.runtime/src/main/java/org/apache/felix/gogo/runtime/equinox/Equinox.java b/gogo/gogo.runtime/src/main/java/org/apache/felix/gogo/runtime/equinox/Equinox.java
deleted file mode 100644
index 8187496..0000000
--- a/gogo/gogo.runtime/src/main/java/org/apache/felix/gogo/runtime/equinox/Equinox.java
+++ /dev/null
@@ -1,476 +0,0 @@
-package org.apache.felix.gogo.runtime.equinox;
-
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.BundleException;
-import org.osgi.framework.ServiceReference;
-import org.osgi.service.command.CommandProcessor;
-import org.osgi.service.command.CommandSession;
-import org.osgi.service.command.Converter;
-import org.osgi.service.component.ComponentContext;
-import org.osgi.service.log.LogEntry;
-import org.osgi.service.log.LogReaderService;
-import org.osgi.service.log.LogService;
-import org.osgi.service.packageadmin.ExportedPackage;
-import org.osgi.service.packageadmin.PackageAdmin;
-import org.osgi.service.startlevel.StartLevel;
-
-import java.io.IOException;
-import java.net.URL;
-import java.util.*;
-
-public class Equinox implements Converter
-{
-    BundleContext context;
-    PackageAdmin pka;
-    LogReaderService lrs;
-    StartLevel sls;
-    final static String[] functions = {"active", "bundles", "close", "diag", "exec", "exit", "fork", "gc", "getprop", "headers", "init", "install", "launch", "log", "packages", "packages", "refresh", "services", "setbsl", "setfwsl", "setibsl", "setprop", "shutdown", "sl", "ss", "start", "status", "stop", "uninstall", "update"};
-
-    protected void activate(ComponentContext context)
-    {
-        this.context = context.getBundleContext();
-        Dictionary<String, Object> dict = new Hashtable<String, Object>();
-        dict.put(CommandProcessor.COMMAND_SCOPE, "eqx");
-        dict.put(CommandProcessor.COMMAND_FUNCTION, functions);
-        this.context.registerService(Converter.class.getName(), this, dict);
-    }
-
-    BundleContext getContext()
-    {
-        return context;
-    }
-
-    public void setPka(PackageAdmin pka)
-    {
-        this.pka = pka;
-    }
-
-    public void setLrs(LogReaderService lrs)
-    {
-        this.lrs = lrs;
-    }
-
-    public void setSls(StartLevel sls)
-    {
-        this.sls = sls;
-    }
-
-    /**
-     * - Displays unsatisfied constraints for the specified bundle(s).
-     */
-    public void diag()
-    {
-    }
-
-    /*
-     * active - Displays a list of all bundles currently in the ACTIVE state.
-     */
-    public List<Bundle> active()
-    {
-        List<Bundle> result = new ArrayList<Bundle>();
-        Bundle[] bundles = getContext().getBundles();
-        for (Bundle b : bundles)
-        {
-            if (b.getState() == Bundle.ACTIVE)
-            {
-                result.add(b);
-            }
-        }
-        return result;
-    }
-
-    /*
-     * getprop { name } - Displays the system properties with the given name, or
-     * all of them.
-     */
-
-    public Object getprop(CharSequence name)
-    {
-        if (name == null)
-        {
-            return System.getProperties();
-        }
-        else
-        {
-            return System.getProperty(name.toString());
-        }
-    }
-
-    /**
-     * launch - start the OSGi Framework
-     */
-
-    public void launch()
-    {
-        throw new IllegalStateException("Already running");
-    }
-
-    /**
-     * shutdown - shutdown the OSGi Framework
-     */
-    public void shutdown() throws BundleException
-    {
-        getContext().getBundle().stop();
-    }
-
-    /**
-     * close - shutdown and exit
-     */
-    public void close(CommandSession session)
-    {
-        session.close();
-    }
-
-    /**
-     * exit - exit immediately (System.exit)
-     */
-
-    public void exit(int exitValue)
-    {
-        exit(exitValue);
-    }
-
-    /**
-     * gc - perform a garbage collection
-     */
-    public long gc()
-    {
-        Runtime.getRuntime().gc();
-        return Runtime.getRuntime().freeMemory();
-    }
-
-    /**
-     * init - uninstall all bundles
-     */
-
-    public void init() throws Exception
-    {
-        Bundle bundles[] = getContext().getBundles();
-        for (Bundle b : bundles)
-        {
-            if (b.getBundleId() != 0)
-            {
-                b.uninstall();
-            }
-        }
-    }
-
-    /**
-     * setprop <key>=<value> - set the OSGi property
-     */
-    public void setprop(CommandSession session, String key, String value)
-    {
-        session.put(key, value);
-    }
-
-    /**
-     * install - install and optionally start bundle from the given URL
-     *
-     * @throws BundleException
-     */
-
-    public Bundle install(URL url) throws BundleException
-    {
-        return getContext().installBundle(url.toExternalForm());
-    }
-
-    /**
-     * uninstall - uninstall the specified bundle(s)
-     *
-     * @throws BundleException
-     */
-    public void uninstall(Bundle[] bundles) throws BundleException
-    {
-        for (Bundle b : bundles)
-        {
-            b.uninstall();
-        }
-    }
-
-    /**
-     * start - start the specified bundle(s)
-     */
-    public void start(Bundle[] bundles) throws BundleException
-    {
-        for (Bundle b : bundles)
-        {
-            b.start();
-        }
-    }
-
-    /**
-     * stop - stop the specified bundle(s)
-     */
-    public void stop(Bundle[] bundles) throws BundleException
-    {
-        for (Bundle b : bundles)
-        {
-            b.stop();
-        }
-    }
-
-    /**
-     * refresh - refresh the packages of the specified bundles
-     */
-    public void refresh(Bundle[] bundles) throws Exception
-    {
-        if (pka != null)
-        {
-            pka.refreshPackages(bundles);
-        }
-        else
-        {
-            throw new RuntimeException("No PackageAdmin service registered");
-        }
-    }
-
-    /**
-     * update - update the specified bundle(s)
-     */
-    public void update(Bundle[] bundles) throws BundleException
-    {
-        for (Bundle b : bundles)
-        {
-            b.update();
-        }
-    }
-
-    /**
-     * status - display installed bundles and registered services
-     */
-    public List<Object> status() throws Exception
-    {
-        List<Object> status = new ArrayList<Object>();
-        status.addAll(Arrays.asList(getContext().getBundles()));
-        status.addAll(Arrays.asList(getContext().getServiceReferences(null, null)));
-        return status;
-    }
-
-    /**
-     * ss - display installed bundles (short status)
-     */
-    public Bundle[] ss()
-    {
-        return getContext().getBundles();
-    }
-
-    /**
-     * services {filter} - display registered service details
-     */
-    public ServiceReference[] services(String filter) throws Exception
-    {
-        return getContext().getServiceReferences(null, filter);
-    }
-
-    /**
-     * packages {<pkgname>|<id>|<location>} - display imported/exported
-     * package details
-     */
-    public ExportedPackage[] packages(Bundle bundle) throws Exception
-    {
-        if (pka != null)
-        {
-            return pka.getExportedPackages(bundle);
-        }
-        else
-        {
-            throw new RuntimeException("No PackageAdmin service registered");
-        }
-    }
-
-    public ExportedPackage[] packages(String packageName) throws Exception
-    {
-        if (pka != null)
-        {
-            return pka.getExportedPackages(packageName);
-        }
-        return null;
-    }
-
-    /**
-     * bundles - display details for all installed bundles
-     */
-    public Bundle[] bundles()
-    {
-        return ss();
-    }
-
-    /**
-     * bundle (<id>|<location>) - display details for the specified bundle(s)
-     */
-
-    /**
-     * headers (<id>|<location>) - print bundle headers
-     */
-
-    @SuppressWarnings("unchecked")
-    public Dictionary headers(Bundle b, String locale)
-    {
-        return b.getHeaders(locale);
-    }
-
-    /**
-     * log (<id>|<location>) - display log entries
-     */
-
-    @SuppressWarnings("unchecked")
-    public Collection<LogEntry> log(Bundle bundle) throws Exception
-    {
-        if (lrs != null)
-        {
-            return Collections.list((Enumeration<LogEntry>) lrs.getLog());
-        }
-        else
-        {
-            throw new RuntimeException("LogReader not available");
-        }
-    }
-
-    /**
-     * exec <command> - execute a command in a separate process and wait
-     *
-     * @throws IOException
-     */
-
-    public int exec(Object[] args, boolean fork) throws IOException
-    {
-        StringBuffer sb = new StringBuffer();
-        String del = "";
-        for (Object arg : args)
-        {
-            sb.append(del);
-            sb.append(arg);
-            del = " ";
-        }
-        Process p = Runtime.getRuntime().exec(sb.toString());
-        if (fork)
-        {
-            int c;
-            while ((c = p.getInputStream().read()) > 0)
-            {
-                System.out.print(c);
-            }
-        }
-        return p.exitValue();
-    }
-
-    /**
-     * fork <command> - execute a command in a separate process
-     */
-
-    public void fork(Object args[]) throws Exception
-    {
-        exec(args, true);
-    }
-
-    /**
-     * sl {(<id>|<location>)} - display the start level for the specified
-     * bundle, or for the framework if no bundle specified
-     */
-    public int sl(Bundle b) throws Exception
-    {
-        if (sls == null)
-        {
-            throw new RuntimeException("No StartLevel service registered");
-        }
-        if (b == null)
-        {
-            return sls.getStartLevel();
-        }
-        else
-        {
-            return sls.getBundleStartLevel(b);
-        }
-    }
-
-    /**
-     * setfwsl <start level> - set the framework start level
-     */
-    public int setfwsl(int n) throws Exception
-    {
-        if (sls == null)
-        {
-            throw new RuntimeException("No StartLevel service registered");
-        }
-        int old = sls.getStartLevel();
-        sls.setStartLevel(n);
-        return old;
-    }
-
-    /**
-     * setbsl <start level> (<id>|<location>) - set the start level for the
-     * bundle(s)
-     */
-    public int setbsl(Bundle b, int n) throws Exception
-    {
-        if (sls == null)
-        {
-            throw new RuntimeException("No StartLevel service registered");
-        }
-        int old = sls.getBundleStartLevel(b);
-        sls.setBundleStartLevel(b, n);
-        return old;
-    }
-
-    /**
-     * setibsl <start level> - set the initial bundle start level
-     */
-    public int setibsl(int n) throws Exception
-    {
-        if (sls == null)
-        {
-            throw new RuntimeException("No StartLevel service registered");
-        }
-        int old = sls.getInitialBundleStartLevel();
-        sls.setInitialBundleStartLevel(n);
-        return old;
-    }
-
-    public Object convert(Class<?> desiredType, Object in) throws Exception
-    {
-        return null;
-    }
-
-    String getLevel(int index)
-    {
-        switch (index)
-        {
-            case LogService.LOG_DEBUG:
-                return "DEBUG";
-            case LogService.LOG_INFO:
-                return "INFO ";
-            case LogService.LOG_WARNING:
-                return "WARNI";
-            case LogService.LOG_ERROR:
-                return "ERROR";
-            default:
-                return "<" + index + ">";
-        }
-    }
-
-    public CharSequence format(Object target, int level, Converter escape)
-    {
-        if (target instanceof LogEntry)
-        {
-            LogEntry entry = (LogEntry) target;
-            switch (level)
-            {
-                case LINE:
-                    Formatter f = new Formatter();
-                    f.format("%tT %04d %s %s", entry.getTime(), entry.getBundle().getBundleId(), getLevel(entry.getLevel()) + "", entry.getMessage() + "");
-                    return f.toString();
-
-                case PART:
-                    Formatter f2 = new Formatter();
-                    f2.format("%tT %s", entry.getTime(), entry.getMessage());
-                    return f2.toString();
-            }
-        }
-        return null;
-    }
-    /**
-     * profilelog - Display & flush the profile log messages
-     */
-
-}
diff --git a/gogo/gogo.runtime/src/main/java/org/apache/felix/gogo/runtime/osgi/OSGiShell.java b/gogo/gogo.runtime/src/main/java/org/apache/felix/gogo/runtime/osgi/OSGiShell.java
index 75bdcf6..e968740 100644
--- a/gogo/gogo.runtime/src/main/java/org/apache/felix/gogo/runtime/osgi/OSGiShell.java
+++ b/gogo/gogo.runtime/src/main/java/org/apache/felix/gogo/runtime/osgi/OSGiShell.java
@@ -26,7 +26,6 @@
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.command.Converter;
-import org.osgi.service.component.ComponentContext;
 import org.osgi.service.packageadmin.PackageAdmin;
 import org.osgi.service.threadio.ThreadIO;
 
@@ -35,16 +34,6 @@
     Bundle bundle;
     OSGiCommands commands;
 
-    protected void activate(ComponentContext context) throws Exception
-    {
-        this.bundle = context.getBundleContext().getBundle();
-        if (threadIO == null)
-        {
-            threadIO = (ThreadIO) context.locateService("x");
-        }
-        start();
-    }
-
     public void start() throws Exception
     {
         commands = new OSGiCommands(bundle);
@@ -84,11 +73,6 @@
         }
     }
 
-    protected void deactivate(ComponentContext context)
-    {
-        System.out.println("Deactivating");
-    }
-
     public Object get(String name)
     {
         if (bundle.getBundleContext() != null)
diff --git a/gogo/gogo.runtime/src/main/java/org/apache/felix/gogo/runtime/shell/Closure.java b/gogo/gogo.runtime/src/main/java/org/apache/felix/gogo/runtime/shell/Closure.java
index e479bac..3bc61a5 100644
--- a/gogo/gogo.runtime/src/main/java/org/apache/felix/gogo/runtime/shell/Closure.java
+++ b/gogo/gogo.runtime/src/main/java/org/apache/felix/gogo/runtime/shell/Closure.java
@@ -235,7 +235,7 @@
                 {
                     return false;
                 }
-                return seq;
+                return result;
         }
     }
 
diff --git a/gogo/gogo.runtime/src/main/java/org/apache/felix/gogo/runtime/shell/Parser.java b/gogo/gogo.runtime/src/main/java/org/apache/felix/gogo/runtime/shell/Parser.java
index 6d6e7cd..44a5153 100644
--- a/gogo/gogo.runtime/src/main/java/org/apache/felix/gogo/runtime/shell/Parser.java
+++ b/gogo/gogo.runtime/src/main/java/org/apache/felix/gogo/runtime/shell/Parser.java
@@ -28,7 +28,7 @@
     int current = 0;
     CharSequence text;
     boolean escaped;
-    static final String SPECIAL = "<;|{[\"'$'`(=";
+    static final String SPECIAL = "<;|{[\"'$`(=";
 
     public Parser(CharSequence program)
     {
@@ -71,24 +71,29 @@
 
     char peek()
     {
+        return peek(false);
+    }
+
+    char peek(boolean increment)
+    {
         escaped = false;
         if (eof())
         {
             return 0;
         }
 
-        char c = text.charAt(current);
+        int last = current;
+        char c = text.charAt(current++);
 
         if (c == '\\')
         {
             escaped = true;
-            ++current;
             if (eof())
             {
                 throw new RuntimeException("Eof found after \\"); // derek
             }
 
-            c = text.charAt(current);
+            c = text.charAt(current++);
 
             switch (c)
             {
@@ -113,12 +118,16 @@
                     break;
                 case 'u':
                     c = unicode();
+                    current += 4;
                     break;
                 default:
                     // We just take the next character literally
                     // but have the escaped flag set, important for {},[] etc
             }
         }
+        if (!increment) {
+            current = last;
+        }
         return c;
     }
 
@@ -200,7 +209,6 @@
                 }
                 next();
             }
-
             return text.subSequence(start, current);
         }
         else
@@ -215,59 +223,45 @@
 
         int start = current;
         char c = next();
-        switch (c)
-        {
-            case '{':
-                return text.subSequence(start, find('}', '{'));
-            case '(':
-                return text.subSequence(start, find(')', '('));
-            case '[':
-                return text.subSequence(start, find(']', '['));
-            case '"':
-                return text.subSequence(start + 1, quote('"'));
-            case '\'':
-                return text.subSequence(start + 1, quote('\''));
-            case '<':
-                return text.subSequence(start, find('>', '<'));
-            case '$':
-                value();
-                return text.subSequence(start, current);
-        }
-
-        if (Character.isJavaIdentifierPart(c))
-        {
-            // Some identifier or number
-            while (!eof())
+        if (!escaped) {
+            switch (c)
             {
-                c = peek();
-                if (c != ':' && !Character.isJavaIdentifierPart(c) && c != '.')
-                {
-                    break;
-                }
-                next();
-            }
-        }
-        else
-        {
-            // Operator, repeat while in operator class
-            while (!eof())
-            {
-                c = peek();
-                if (Character.isWhitespace(c) || Character.isJavaIdentifierPart(c))
-                {
-                    break;
-                }
+                case '{':
+                    return text.subSequence(start, find('}', '{'));
+                case '(':
+                    return text.subSequence(start, find(')', '('));
+                case '[':
+                    return text.subSequence(start, find(']', '['));
+                case '"':
+                    return text.subSequence(start + 1, quote('"'));
+                case '\'':
+                    return text.subSequence(start + 1, quote('\''));
+                case '<':
+                    return text.subSequence(start, find('>', '<'));
+                case '$':
+                    value();
+                    return text.subSequence(start, current);
+                case '=':
+                    return text.subSequence(start, current);
             }
         }
 
+        // Some identifier or number
+        while (!eof())
+        {
+            c = peek();
+            if ((!escaped && SPECIAL.indexOf(c) >= 0) || Character.isWhitespace(c))
+            {
+                break;
+            }
+            next();
+        }
         return text.subSequence(start, current);
     }
 
     char next()
     {
-        char c = peek();
-        current++;
-        return c;
+        return peek(true);
     }
 
     char unicode()
diff --git a/gogo/gogo.runtime/src/main/java/org/apache/felix/gogo/runtime/threadio/ThreadIOImpl.java b/gogo/gogo.runtime/src/main/java/org/apache/felix/gogo/runtime/threadio/ThreadIOImpl.java
index b9cab7a..2f15984 100644
--- a/gogo/gogo.runtime/src/main/java/org/apache/felix/gogo/runtime/threadio/ThreadIOImpl.java
+++ b/gogo/gogo.runtime/src/main/java/org/apache/felix/gogo/runtime/threadio/ThreadIOImpl.java
@@ -19,7 +19,6 @@
 // DWB20: ThreadIO should check and reset IO if something (e.g. jetty) overrides
 package org.apache.felix.gogo.runtime.threadio;
 
-import org.osgi.service.component.ComponentContext;
 import org.osgi.service.threadio.ThreadIO;
 
 import java.io.InputStream;
@@ -34,23 +33,6 @@
     ThreadInputStream in = new ThreadInputStream(System.in);
     ThreadLocal<Marker> current = new ThreadLocal<Marker>();
 
-    protected void activate(ComponentContext context)
-    {
-        start();
-    }
-
-    protected void deactivate()
-    {
-        stop();
-    }
-
-    public void stop()
-    {
-        System.setErr(err.dflt);
-        System.setOut(out.dflt);
-        System.setIn(in.dflt);
-    }
-
     public void start()
     {
         if (System.out instanceof ThreadPrintStream)
@@ -62,6 +44,13 @@
         System.setErr(err);
     }
 
+    public void stop()
+    {
+        System.setErr(err.dflt);
+        System.setOut(out.dflt);
+        System.setIn(in.dflt);
+    }
+
     private void checkIO()
     {    // derek
         if (System.in != in)
diff --git a/gogo/gogo.runtime/src/test/java/org/apache/felix/gogo/runtime/shell/TestParser.java b/gogo/gogo.runtime/src/test/java/org/apache/felix/gogo/runtime/shell/TestParser.java
index aea28f1..0aa294c 100644
--- a/gogo/gogo.runtime/src/test/java/org/apache/felix/gogo/runtime/shell/TestParser.java
+++ b/gogo/gogo.runtime/src/test/java/org/apache/felix/gogo/runtime/shell/TestParser.java
@@ -35,6 +35,15 @@
 {
     int beentheredonethat = 0;
 
+    public void testScope() throws Exception
+    {
+        Context c= new Context();
+        c.addCommand("echo", this);
+        c.addCommand("capture", this);
+        assertEquals("$a", c.execute("test:echo \\$a | capture"));
+        assertEquals("file://poo", c.execute("test:echo file://poo|capture"));
+    }
+
     public void testPipe() throws Exception
     {
         Context c = new Context();
@@ -98,6 +107,7 @@
         CharSequence cs = parser.messy();
         assertEquals("a|b;c", cs.toString());
         assertEquals("a|b;c", new Parser(cs).unescape());
+        assertEquals("$a", new Parser("\\$a").unescape());
     }
 
 
