diff --git a/gogo/felixcommands/pom.xml b/gogo/felixcommands/pom.xml
index f8be0ef..e026e84 100644
--- a/gogo/felixcommands/pom.xml
+++ b/gogo/felixcommands/pom.xml
@@ -41,6 +41,11 @@
       <version>4.2.0</version>
     </dependency>
     <dependency>
+      <groupId>org.osgi</groupId>
+      <artifactId>org.osgi.compendium</artifactId>
+      <version>4.0.0</version>
+    </dependency>
+    <dependency>
       <groupId>org.apache.felix.gogo</groupId>
       <artifactId>org.apache.felix.gogo.runtime</artifactId>
       <version>0.5.0-SNAPSHOT</version>
@@ -65,6 +70,7 @@
         <extensions>true</extensions>
         <configuration>
           <instructions>
+            <Export-Package>org.osgi.service.log</Export-Package>
             <Bundle-SymbolicName>${artifactId}</Bundle-SymbolicName>
             <Private-Package>${pom.artifactId}</Private-Package>
             <Bundle-Activator>${artifactId}.Activator</Bundle-Activator>
diff --git a/gogo/felixcommands/src/main/java/org/apache/felix/gogo/felixcommands/Activator.java b/gogo/felixcommands/src/main/java/org/apache/felix/gogo/felixcommands/Activator.java
index a77b60e..9ecd1e6 100644
--- a/gogo/felixcommands/src/main/java/org/apache/felix/gogo/felixcommands/Activator.java
+++ b/gogo/felixcommands/src/main/java/org/apache/felix/gogo/felixcommands/Activator.java
@@ -29,9 +29,10 @@
         Hashtable props = new Hashtable();
         props.put("osgi.command.scope", "basic");
         props.put("osgi.command.function", new String[] {
-            "bundlelevel", "frameworklevel", "headers", "help",
-            "install", "lb", "refresh", "resolve", "start",
-            "stop", "uninstall", "update", "which" });
+            "bundlelevel", "frameworklevel", "headers",
+            "help", "install", "inspect", "lb", "log", "refresh",
+            "resolve", "start", "stop", "uninstall", "update",
+            "which" });
         bc.registerService(
             Basic.class.getName(), new Basic(bc), props);
 
diff --git a/gogo/felixcommands/src/main/java/org/apache/felix/gogo/felixcommands/Basic.java b/gogo/felixcommands/src/main/java/org/apache/felix/gogo/felixcommands/Basic.java
index 985c5eb..b7d56e8 100644
--- a/gogo/felixcommands/src/main/java/org/apache/felix/gogo/felixcommands/Basic.java
+++ b/gogo/felixcommands/src/main/java/org/apache/felix/gogo/felixcommands/Basic.java
@@ -21,12 +21,16 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.PrintStream;
+import java.io.PrintWriter;
+import java.io.StringWriter;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Method;
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Date;
 import java.util.Dictionary;
 import java.util.Enumeration;
 import java.util.Iterator;
@@ -44,13 +48,15 @@
 import org.osgi.service.command.Descriptor;
 import org.osgi.service.command.Flag;
 import org.osgi.service.command.Option;
+import org.osgi.service.log.LogEntry;
+import org.osgi.service.log.LogReaderService;
+import org.osgi.service.log.LogService;
 import org.osgi.service.packageadmin.PackageAdmin;
 import org.osgi.service.startlevel.StartLevel;
 
 public class Basic
 {
     private final BundleContext m_bc;
-    private final List<ServiceReference> m_usedRefs = new ArrayList(0);
 
     public Basic(BundleContext bc)
     {
@@ -59,11 +65,13 @@
 
     @Descriptor(description="query bundle start level")
     public void bundlelevel(
-        @Descriptor(description="bundle identifier to query") Long id)
+        @Descriptor(description="bundle to query") Bundle bundle)
     {
+        // Keep track of service references.
+        List<ServiceReference> refs = new ArrayList();
+
         // Get start level service.
-        ServiceReference ref = m_bc.getServiceReference(StartLevel.class.getName());
-        StartLevel sl = getService(StartLevel.class, ref);
+        StartLevel sl = Util.getService(m_bc, StartLevel.class, refs);
         if (sl == null)
         {
             System.out.println("Start Level service is unavailable.");
@@ -71,14 +79,13 @@
         // Get the bundle start level.
         else
         {
-            Bundle bundle = getBundle(m_bc, id);
             if (bundle != null)
             {
                 System.out.println(bundle + " is level " + sl.getBundleStartLevel(bundle));
             }
         }
 
-        ungetServices();
+        Util.ungetServices(m_bc, refs);
     }
 
     @Descriptor(description="set bundle start level or initial bundle start level")
@@ -86,11 +93,13 @@
         @Flag(name="-s", description="set the specified bundle's start level") boolean set,
         @Flag(name="-i", description="set the initial bundle start level") boolean initial,
         @Descriptor(description="target level") int level,
-        @Descriptor(description="target bundle identifiers") Long[] ids)
+        @Descriptor(description="target identifiers") Bundle[] bundles)
     {
+        // Keep track of service references.
+        List<ServiceReference> refs = new ArrayList();
+
         // Get start level service.
-        ServiceReference ref = m_bc.getServiceReference(StartLevel.class.getName());
-        StartLevel sl = getService(StartLevel.class, ref);
+        StartLevel sl = Util.getService(m_bc, StartLevel.class, refs);
         if (sl == null)
         {
             System.out.println("Start Level service is unavailable.");
@@ -110,7 +119,7 @@
         // Set the initial bundle start level.
         else if (initial)
         {
-            if ((ids != null) && (ids.length == 0))
+            if ((bundles != null) && (bundles.length == 0))
             {
                 sl.setInitialBundleStartLevel(level);
             }
@@ -123,8 +132,7 @@
         // Set the bundle start level.
         else if (set)
         {
-            List<Bundle> bundles = getBundles(m_bc, ids);
-            if (bundles != null)
+            if ((bundles != null) && (bundles.length == 0))
             {
                 for (Bundle bundle: bundles)
                 {
@@ -137,36 +145,40 @@
             }
         }
 
-        ungetServices();
+        Util.ungetServices(m_bc, refs);
     }
 
     @Descriptor(description="query framework active start level")
     public void frameworklevel()
     {
+        // Keep track of service references.
+        List<ServiceReference> refs = new ArrayList();
+
         // Get start level service.
-        ServiceReference ref = m_bc.getServiceReference(StartLevel.class.getName());
-        StartLevel sl = getService(StartLevel.class, ref);
+        StartLevel sl = Util.getService(m_bc, StartLevel.class, refs);
         if (sl == null)
         {
             System.out.println("Start Level service is unavailable.");
         }
         System.out.println("Level is " + sl.getStartLevel());
-        ungetServices();
+        Util.ungetServices(m_bc, refs);
     }
 
     @Descriptor(description="set framework active start level")
     public void frameworklevel(
         @Descriptor(description="target start level") int level)
     {
+        // Keep track of service references.
+        List<ServiceReference> refs = new ArrayList();
+
         // Get start level service.
-        ServiceReference ref = m_bc.getServiceReference(StartLevel.class.getName());
-        StartLevel sl = getService(StartLevel.class, ref);
+        StartLevel sl = Util.getService(m_bc, StartLevel.class, refs);
         if (sl == null)
         {
             System.out.println("Start Level service is unavailable.");
         }
         sl.setStartLevel(level);
-        ungetServices();
+        Util.ungetServices(m_bc, refs);
     }
 
     @Descriptor(description="display bundle headers")
@@ -347,6 +359,15 @@
         return commands;
     }
 
+    @Descriptor(description="inspects bundle dependency information")
+    public void inspect(
+        @Descriptor(description="(package | bundle | fragment | service)") String type,
+        @Descriptor(description="(capability | requirement)") String direction,
+        @Descriptor(description="target bundles") Bundle[] bundles)
+    {
+        Inspect.inspect(m_bc, type, direction, bundles);
+    }
+
     @Descriptor(description="install bundle using URLs")
     public void install(
         @Descriptor(description="target URLs") String[] urls)
@@ -399,31 +420,174 @@
         }
     }
 
-    @Descriptor(description="list installed bundles")
+    @Descriptor(description="list all installed bundles")
     public void lb(
         @Flag(name="-l", description="show location") boolean showLoc,
         @Flag(name="-s", description="show symbolic name") boolean showSymbolic,
         @Flag(name="-u", description="show update location") boolean showUpdate)
     {
+        lb(showLoc, showSymbolic, showUpdate, null);
+    }
+
+    @Descriptor(description="list installed bundles matching a pattern")
+    public void lb(
+        @Flag(name="-l", description="show location") boolean showLoc,
+        @Flag(name="-s", description="show symbolic name") boolean showSymbolic,
+        @Flag(name="-u", description="show update location") boolean showUpdate,
+        String pattern)
+    {
+        // Keep track of service references.
+        List<ServiceReference> refs = new ArrayList();
+
         // Get start level service.
-        ServiceReference ref = m_bc.getServiceReference(StartLevel.class.getName());
-        StartLevel sl = getService(StartLevel.class, ref);
+        StartLevel sl = Util.getService(m_bc, StartLevel.class, refs);
         if (sl == null)
         {
             System.out.println("Start Level service is unavailable.");
         }
 
-        Bundle[] bundles = m_bc.getBundles();
-        if (bundles != null)
+        List<Bundle> found = new ArrayList();
+
+        if (pattern == null)
         {
-            printBundleList(bundles, sl, System.out, showLoc, showSymbolic, showUpdate);
+            found.addAll(Arrays.asList(m_bc.getBundles()));
         }
         else
         {
-            System.out.println("There are no installed bundles.");
+            Bundle[] bundles = m_bc.getBundles();
+
+            for (int i = 0; i < bundles.length; i++)
+            {
+                Bundle bundle = bundles[i];
+                String name = (String) bundle.getHeaders().get(Constants.BUNDLE_NAME);
+                if (matchBundleName(bundle.getSymbolicName(), pattern)
+                    || matchBundleName(name, pattern))
+                {
+                    found.add(bundle);
+                }
+            }
         }
 
-        ungetServices();
+        if (found.size() > 0)
+        {
+            printBundleList(
+                (Bundle[]) found.toArray(new Bundle[found.size()]), sl,
+                showLoc, showSymbolic, showUpdate);
+        }
+        else
+        {
+            System.out.println("No matching bundles found");
+        }
+
+        Util.ungetServices(m_bc, refs);
+    }
+
+    private boolean matchBundleName(String name, String pattern)
+    {
+        return (name != null) && name.toLowerCase().contains(pattern.toLowerCase());
+    }
+
+    @Descriptor(description="display all matching log entries")
+    public void log(
+        @Descriptor(description="minimum log level [ debug | info | warn | error ]")
+            String logLevel)
+    {
+        log(-1, logLevel);
+    }
+
+    @Descriptor(description="display some matching log entries")
+    public void log(
+        @Descriptor(description="maximum number of entries") int maxEntries,
+        @Descriptor(description="minimum log level [ debug | info | warn | error ]")
+            String logLevel)
+    {
+        // Keep track of service references.
+        List<ServiceReference> refs = new ArrayList();
+
+        // Get start level service.
+        LogReaderService lrs = Util.getService(m_bc, LogReaderService.class, refs);
+        if (lrs == null)
+        {
+            System.out.println("Log reader service is unavailable.");
+        }
+        else
+        {
+            Enumeration entries = lrs.getLog();
+
+            int minLevel = logLevelAsInt(logLevel);
+
+            int index = 0;
+            while (entries.hasMoreElements()
+                && (maxEntries < 0 || index < maxEntries))
+            {
+                LogEntry entry = (LogEntry) entries.nextElement();
+                if (entry.getLevel() <= minLevel)
+                {
+                    display(entry);
+                    index++;
+                }
+            }
+
+            Util.ungetServices(m_bc, refs);
+        }
+    }
+
+    private void display(LogEntry entry)
+    {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
+
+        StringBuffer buffer = new StringBuffer();
+        buffer.append(sdf.format(new Date(entry.getTime()))).append(" ");
+        buffer.append(logLevelAsString(entry.getLevel())).append(" - ");
+        buffer.append("Bundle: ").append(entry.getBundle().getSymbolicName());
+        if (entry.getServiceReference() != null)
+        {
+            buffer.append(" - ");
+            buffer.append(entry.getServiceReference().toString());
+        }
+        buffer.append(" - ").append(entry.getMessage());
+        if (entry.getException() != null)
+        {
+            buffer.append(" - ");
+            StringWriter writer = new StringWriter();
+            PrintWriter  pw = new PrintWriter(writer);
+            entry.getException().printStackTrace(pw);
+            buffer.append(writer.toString());
+        }
+
+        System.out.println(buffer.toString());
+    }
+
+    private static int logLevelAsInt(String logLevel)
+    {
+        if ("error".equalsIgnoreCase(logLevel))
+        {
+            return LogService.LOG_ERROR;
+        }
+        else if ("warn".equalsIgnoreCase(logLevel))
+        {
+            return LogService.LOG_WARNING;
+        }
+        else if ("info".equalsIgnoreCase(logLevel))
+        {
+            return LogService.LOG_INFO;
+        }
+        return LogService.LOG_DEBUG;
+    }
+
+    private static String logLevelAsString(int level)
+    {
+        switch (level)
+        {
+            case LogService.LOG_ERROR:
+                return "ERROR";
+            case LogService.LOG_WARNING:
+                return "WARNING";
+            case LogService.LOG_INFO:
+                return "INFO";
+            default:
+                return "DEBUG";
+        }
     }
 
     @Descriptor(description="refresh any updated or uninstalled bundles")
@@ -445,9 +609,11 @@
 
     private void refresh(List<Bundle> bundles)
     {
+        // Keep track of service references.
+        List<ServiceReference> refs = new ArrayList();
+
         // Get package admin service.
-        ServiceReference ref = m_bc.getServiceReference(PackageAdmin.class.getName());
-        PackageAdmin pa = getService(PackageAdmin.class, ref);
+        PackageAdmin pa = Util.getService(m_bc, PackageAdmin.class, refs);
         if (pa == null)
         {
             System.out.println("Package Admin service is unavailable.");
@@ -456,7 +622,7 @@
             ? null
             : (Bundle[]) bundles.toArray(new Bundle[bundles.size()]));
 
-        ungetServices();
+        Util.ungetServices(m_bc, refs);
     }
 
     @Descriptor(description="resolve all bundles")
@@ -478,9 +644,11 @@
 
     private void resolve(List<Bundle> bundles)
     {
+        // Keep track of service references.
+        List<ServiceReference> refs = new ArrayList();
+
         // Get package admin service.
-        ServiceReference ref = m_bc.getServiceReference(PackageAdmin.class.getName());
-        PackageAdmin pa = getService(PackageAdmin.class, ref);
+        PackageAdmin pa = Util.getService(m_bc, PackageAdmin.class, refs);
         if (pa == null)
         {
             System.out.println("Package Admin service is unavailable.");
@@ -489,7 +657,7 @@
             ? null
             : (Bundle[]) bundles.toArray(new Bundle[bundles.size()]));
 
-        ungetServices();
+        Util.ungetServices(m_bc, refs);
     }
 
     @Descriptor(description="start bundles")
@@ -769,13 +937,13 @@
     }
 
     private static void printBundleList(
-        Bundle[] bundles, StartLevel startLevel, PrintStream out, boolean showLoc,
+        Bundle[] bundles, StartLevel startLevel, boolean showLoc,
         boolean showSymbolic, boolean showUpdate)
     {
         // Display active start level.
         if (startLevel != null)
         {
-            out.println("START LEVEL " + startLevel.getStartLevel());
+            System.out.println("START LEVEL " + startLevel.getStartLevel());
         }
 
         // Print column headers.
@@ -793,7 +961,7 @@
            msg = " Update location";
         }
         String level = (startLevel == null) ? "" : "  Level ";
-        out.println("   ID " + "  State       " + level + msg);
+        System.out.println("   ID " + "  State       " + level + msg);
         for (int i = 0; i < bundles.length; i++)
         {
             // Get the bundle name or location.
@@ -846,34 +1014,12 @@
             {
                 id = " " + id;
             }
-            out.println("[" + id + "] ["
+            System.out.println("[" + id + "] ["
                 + getStateString(bundles[i])
                 + "] [" + level + "] " + name);
         }
     }
 
-    private <T> T getService(Class<T> clazz, ServiceReference ref)
-    {
-        if (ref == null)
-        {
-            return null;
-        }
-        T t = (T) m_bc.getService(ref);
-        if (t != null)
-        {
-            m_usedRefs.add(ref);
-        }
-        return t;
-    }
-
-    private void ungetServices()
-    {
-        while (m_usedRefs.size() > 0)
-        {
-            m_bc.ungetService(m_usedRefs.remove(0));
-        }
-    }
-
     private static String getStateString(Bundle bundle)
     {
         int state = bundle.getState();
diff --git a/gogo/felixcommands/src/main/java/org/apache/felix/gogo/felixcommands/Inspect.java b/gogo/felixcommands/src/main/java/org/apache/felix/gogo/felixcommands/Inspect.java
new file mode 100644
index 0000000..d17c344
--- /dev/null
+++ b/gogo/felixcommands/src/main/java/org/apache/felix/gogo/felixcommands/Inspect.java
@@ -0,0 +1,640 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.gogo.felixcommands;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.packageadmin.ExportedPackage;
+import org.osgi.service.packageadmin.PackageAdmin;
+import org.osgi.service.packageadmin.RequiredBundle;
+
+public class Inspect
+{
+    public static final String PACKAGE_TYPE = "package";
+    public static final String BUNDLE_TYPE = "bundle";
+    public static final String FRAGMENT_TYPE = "fragment";
+    public static final String SERVICE_TYPE = "service";
+
+    public static final String CAPABILITY = "capability";
+    public static final String REQUIREMENT = "requirement";
+
+    public static void inspect(
+        BundleContext bc, String type, String direction, Bundle[] bundles)
+    {
+        // Verify arguments.
+        if (isValidType(type) && isValidDirection(direction))
+        {
+            // Now determine what needs to be printed.
+            if (PACKAGE_TYPE.startsWith(type))
+            {
+                if (CAPABILITY.startsWith(direction))
+                {
+                    printExportedPackages(bc, bundles);
+                }
+                else
+                {
+                    printImportedPackages(bc, bundles);
+                }
+            }
+            else if (BUNDLE_TYPE.startsWith(type))
+            {
+                if (CAPABILITY.startsWith(direction))
+                {
+                    printRequiringBundles(bc, bundles);
+                }
+                else
+                {
+                    printRequiredBundles(bc, bundles);
+                }
+            }
+            else if (FRAGMENT_TYPE.startsWith(type))
+            {
+                if (CAPABILITY.startsWith(direction))
+                {
+                    printFragmentHosts(bc, bundles);
+                }
+                else
+                {
+                    printHostedFragments(bc, bundles);
+                }
+            }
+            else
+            {
+                if (CAPABILITY.startsWith(direction))
+                {
+                    printExportedServices(bc, bundles);
+                }
+                else
+                {
+                    printImportedServices(bc, bundles);
+                }
+            }
+        }
+        else
+        {
+            if (!isValidType(type))
+            {
+                System.out.println("Invalid argument: " + type);
+            }
+            if (!isValidDirection(direction))
+            {
+                System.out.println("Invalid argument: " + direction);
+            }
+        }
+    }
+
+    public static void printExportedPackages(BundleContext bc, Bundle[] bundles)
+    {
+        // Keep track of service references.
+        List<ServiceReference> refs = new ArrayList();
+
+        // Get package admin service.
+        PackageAdmin pa = Util.getService(bc, PackageAdmin.class, refs);
+        if (pa == null)
+        {
+            System.out.println("PackageAdmin service is unavailable.");
+        }
+        else
+        {
+            boolean separatorNeeded = false;
+
+            if ((bundles == null) || (bundles.length == 0))
+            {
+                bundles = bc.getBundles();
+            }
+
+            for (int bundleIdx = 0; bundleIdx < bundles.length; bundleIdx++)
+            {
+                try
+                {
+                    if (bundles[bundleIdx] != null)
+                    {
+                        ExportedPackage[] exports = pa.getExportedPackages(bundles[bundleIdx]);
+                        if (separatorNeeded)
+                        {
+                            System.out.println("");
+                        }
+                        String title = bundles[bundleIdx] + " exports packages:";
+                        System.out.println(title);
+                        System.out.println(Util.getUnderlineString(title));
+                        if ((exports != null) && (exports.length > 0))
+                        {
+                            for (int expIdx = 0; expIdx < exports.length; expIdx++)
+                            {
+                                System.out.print(exports[expIdx]);
+                                Bundle[] importers = exports[expIdx].getImportingBundles();
+                                if ((importers == null) || (importers.length == 0))
+                                {
+                                    System.out.println(" UNUSED");
+                                }
+                                else
+                                {
+                                    System.out.println(" imported by:");
+                                    for (int impIdx = 0; impIdx < importers.length; impIdx++)
+                                    {
+                                        System.out.println("   " + importers[impIdx]);
+                                    }
+                                }
+                            }
+                        }
+                        else
+                        {
+                            System.out.println("Nothing");
+                        }
+                        separatorNeeded = true;
+                    }
+                }
+                catch (Exception ex)
+                {
+                    System.err.println(ex.toString());
+                }
+            }
+            Util.ungetServices(bc, refs);
+        }
+    }
+
+    public static void printImportedPackages(BundleContext bc, Bundle[] bundles)
+    {
+        boolean separatorNeeded = false;
+
+        if ((bundles == null) || (bundles.length == 0))
+        {
+            bundles = bc.getBundles();
+        }
+
+        for (int bundleIdx = 0; bundleIdx < bundles.length; bundleIdx++)
+        {
+            try
+            {
+                if (bundles[bundleIdx] != null)
+                {
+                    if (separatorNeeded)
+                    {
+                        System.out.println("");
+                    }
+                    _printImportedPackages(bc, bundles[bundleIdx]);
+                    separatorNeeded = true;
+                }
+            }
+            catch (Exception ex)
+            {
+                System.err.println(ex.toString());
+            }
+        }
+    }
+
+    private static void _printImportedPackages(BundleContext bc, Bundle bundle)
+    {
+        // Keep track of service references.
+        List<ServiceReference> refs = new ArrayList();
+
+        // Get package admin service.
+        PackageAdmin pa = Util.getService(bc, PackageAdmin.class, refs);
+        if (pa == null)
+        {
+            System.out.println("PackageAdmin service is unavailable.");
+        }
+        else
+        {
+            ExportedPackage[] exports = pa.getExportedPackages((Bundle) null);
+            String title = bundle + " imports packages:";
+            System.out.println(title);
+            System.out.println(Util.getUnderlineString(title));
+            boolean found = false;
+            for (int expIdx = 0; expIdx < exports.length; expIdx++)
+            {
+                Bundle[] importers = exports[expIdx].getImportingBundles();
+                for (int impIdx = 0; (importers != null) && (impIdx < importers.length); impIdx++)
+                {
+                    if (importers[impIdx] == bundle)
+                    {
+                        System.out.println(exports[expIdx]
+                            + " -> " + exports[expIdx].getExportingBundle());
+                        found = true;
+                    }
+                }
+            }
+            if (!found)
+            {
+                System.out.println("Nothing");
+            }
+            Util.ungetServices(bc, refs);
+        }
+    }
+
+    public static void printRequiringBundles(BundleContext bc, Bundle[] bundles)
+    {
+        // Keep track of service references.
+        List<ServiceReference> refs = new ArrayList();
+
+        // Get package admin service.
+        PackageAdmin pa = Util.getService(bc, PackageAdmin.class, refs);
+        if (pa == null)
+        {
+            System.out.println("PackageAdmin service is unavailable.");
+        }
+        else
+        {
+            boolean separatorNeeded = false;
+
+            if ((bundles == null) || (bundles.length == 0))
+            {
+                bundles = bc.getBundles();
+            }
+
+            for (int bundleIdx = 0; bundleIdx < bundles.length; bundleIdx++)
+            {
+                try
+                {
+                    if (bundles[bundleIdx] != null)
+                    {
+                        RequiredBundle[] rbs = pa.getRequiredBundles(
+                            bundles[bundleIdx].getSymbolicName());
+                        for (int rbIdx = 0; (rbs != null) && (rbIdx < rbs.length); rbIdx++)
+                        {
+                            if (rbs[rbIdx].getBundle() == bundles[bundleIdx])
+                            {
+                                if (separatorNeeded)
+                                {
+                                    System.out.println("");
+                                }
+                                String title = bundles[bundleIdx] + " is required by:";
+                                System.out.println(title);
+                                System.out.println(Util.getUnderlineString(title));
+                                if ((rbs[rbIdx].getRequiringBundles() != null)
+                                    && (rbs[rbIdx].getRequiringBundles().length > 0))
+                                {
+                                    for (int reqIdx = 0;
+                                        reqIdx < rbs[rbIdx].getRequiringBundles().length;
+                                        reqIdx++)
+                                    {
+                                        System.out.println(rbs[rbIdx].getRequiringBundles()[reqIdx]);
+                                    }
+                                }
+                                else
+                                {
+                                    System.out.println("Nothing");
+                                }
+                                separatorNeeded = true;
+                            }
+                        }
+                    }
+                }
+                catch (Exception ex)
+                {
+                    System.err.println(ex.toString());
+                }
+            }
+            Util.ungetServices(bc, refs);
+        }
+    }
+
+    public static void printRequiredBundles(BundleContext bc, Bundle[] bundles)
+    {
+        boolean separatorNeeded = false;
+
+        if ((bundles == null) || (bundles.length == 0))
+        {
+            bundles = bc.getBundles();
+        }
+
+        for (int bundleIdx = 0; bundleIdx < bundles.length; bundleIdx++)
+        {
+            try
+            {
+                if (bundles[bundleIdx] != null)
+                {
+                    if (separatorNeeded)
+                    {
+                        System.out.println("");
+                    }
+                    _printRequiredBundles(bc, bundles[bundleIdx]);
+                    separatorNeeded = true;
+                }
+            }
+            catch (Exception ex)
+            {
+                System.err.println(ex.toString());
+            }
+        }
+    }
+
+    private static void _printRequiredBundles(BundleContext bc, Bundle bundle)
+    {
+        // Keep track of service references.
+        List<ServiceReference> refs = new ArrayList();
+
+        // Get package admin service.
+        PackageAdmin pa = Util.getService(bc, PackageAdmin.class, refs);
+        if (pa == null)
+        {
+            System.out.println("PackageAdmin service is unavailable.");
+        }
+        else
+        {
+            RequiredBundle[] rbs = pa.getRequiredBundles(null);
+            String title = bundle + " requires bundles:";
+            System.out.println(title);
+            System.out.println(Util.getUnderlineString(title));
+            boolean found = false;
+            for (int rbIdx = 0; rbIdx < rbs.length; rbIdx++)
+            {
+                Bundle[] requirers = rbs[rbIdx].getRequiringBundles();
+                for (int reqIdx = 0; (requirers != null) && (reqIdx < requirers.length); reqIdx++)
+                {
+                    if (requirers[reqIdx] == bundle)
+                    {
+                        System.out.println(rbs[reqIdx]);
+                        found = true;
+                    }
+                }
+            }
+            if (!found)
+            {
+                System.out.println("Nothing");
+            }
+            Util.ungetServices(bc, refs);
+        }
+    }
+
+    public static void printFragmentHosts(BundleContext bc, Bundle[] bundles)
+    {
+        // Keep track of service references.
+        List<ServiceReference> refs = new ArrayList();
+
+        // Get package admin service.
+        PackageAdmin pa = Util.getService(bc, PackageAdmin.class, refs);
+        if (pa == null)
+        {
+            System.out.println("PackageAdmin service is unavailable.");
+        }
+        else
+        {
+            if ((bundles == null) || (bundles.length == 0))
+            {
+                bundles = bc.getBundles();
+            }
+
+            for (int bundleIdx = 0; bundleIdx < bundles.length; bundleIdx++)
+            {
+                // Print a separator for some whitespace.
+                if (bundleIdx > 0)
+                {
+                    System.out.println("");
+                }
+
+                try
+                {
+                    if ((bundles[bundleIdx] != null) && isFragment(bundles[bundleIdx]))
+                    {
+                        String title = bundles[bundleIdx] + " is attached to:";
+                        System.out.println(title);
+                        System.out.println(Util.getUnderlineString(title));
+                        Bundle[] hosts = pa.getHosts(bundles[bundleIdx]);
+                        for (int hostIdx = 0;
+                            (hosts != null) && (hostIdx < hosts.length);
+                            hostIdx++)
+                        {
+                            System.out.println(hosts[hostIdx]);
+                        }
+                        if ((hosts == null) || (hosts.length == 0))
+                        {
+                            System.out.println("Nothing");
+                        }
+                    }
+                    else if ((bundles[bundleIdx] != null) && !isFragment(bundles[bundleIdx]))
+                    {
+                        System.out.println("Bundle " + bundles[bundleIdx] + " is not a fragment.");
+                    }
+                }
+                catch (Exception ex)
+                {
+                    System.err.println(ex.toString());
+                }
+            }
+            Util.ungetServices(bc, refs);
+        }
+    }
+
+    public static void printHostedFragments(BundleContext bc, Bundle[] bundles)
+    {
+        // Keep track of service references.
+        List<ServiceReference> refs = new ArrayList();
+
+        // Get package admin service.
+        PackageAdmin pa = Util.getService(bc, PackageAdmin.class, refs);
+        if (pa == null)
+        {
+            System.out.println("PackageAdmin service is unavailable.");
+        }
+        else
+        {
+            if ((bundles == null) || (bundles.length == 0))
+            {
+                bundles = bc.getBundles();
+            }
+
+            for (int bundleIdx = 0; bundleIdx < bundles.length; bundleIdx++)
+            {
+                // Print a separator for some whitespace.
+                if (bundleIdx > 0)
+                {
+                    System.out.println("");
+                }
+
+                try
+                {
+                    if ((bundles[bundleIdx] != null) && !isFragment(bundles[bundleIdx]))
+                    {
+                        String title = bundles[bundleIdx] + " hosts:";
+                        System.out.println(title);
+                        System.out.println(Util.getUnderlineString(title));
+                        Bundle[] fragments = pa.getFragments(bundles[bundleIdx]);
+                        for (int fragIdx = 0;
+                            (fragments != null) && (fragIdx < fragments.length);
+                            fragIdx++)
+                        {
+                            System.out.println(fragments[fragIdx]);
+                        }
+                        if ((fragments == null) || (fragments.length == 0))
+                        {
+                            System.out.println("Nothing");
+                        }
+                    }
+                    else if ((bundles[bundleIdx] != null) && isFragment(bundles[bundleIdx]))
+                    {
+                        System.out.println("Bundle " + bundles[bundleIdx] + " is a fragment.");
+                    }
+                }
+                catch (Exception ex)
+                {
+                    System.err.println(ex.toString());
+                }
+            }
+            Util.ungetServices(bc, refs);
+        }
+    }
+
+    public static void printExportedServices(BundleContext bc, Bundle[] bundles)
+    {
+        if ((bundles == null) || (bundles.length == 0))
+        {
+            bundles = bc.getBundles();
+        }
+
+        for (int bundleIdx = 0; bundleIdx < bundles.length; bundleIdx++)
+        {
+            // Print a separator for some whitespace.
+            if (bundleIdx > 0)
+            {
+                System.out.println("");
+            }
+
+            try
+            {
+                if (bundles[bundleIdx] != null)
+                {
+                    ServiceReference[] refs = bundles[bundleIdx].getRegisteredServices();
+
+                    // Print header if we have not already done so.
+                    String title = Util.getBundleName(bundles[bundleIdx]) + " provides services:";
+                    System.out.println(title);
+                    System.out.println(Util.getUnderlineString(title));
+
+                    if ((refs == null) || (refs.length == 0))
+                    {
+                        System.out.println("Nothing");
+                    }
+
+                    // Print properties for each service.
+                    for (int refIdx = 0;
+                        (refs != null) && (refIdx < refs.length);
+                        refIdx++)
+                    {
+                        // Print service properties.
+                        String[] keys = refs[refIdx].getPropertyKeys();
+                        for (int keyIdx = 0;
+                            (keys != null) && (keyIdx < keys.length);
+                            keyIdx++)
+                        {
+                            Object v = refs[refIdx].getProperty(keys[keyIdx]);
+                            System.out.println(
+                                keys[keyIdx] + " = " + Util.getValueString(v));
+                        }
+
+                        // Print service separator if necessary.
+                        if ((refIdx + 1) < refs.length)
+                        {
+                            System.out.println("----");
+                        }
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                System.err.println(ex.toString());
+            }
+        }
+    }
+
+    public static void printImportedServices(BundleContext bc, Bundle[] bundles)
+    {
+        if ((bundles == null) || (bundles.length == 0))
+        {
+            bundles = bc.getBundles();
+        }
+
+        for (int bundleIdx = 0; bundleIdx < bundles.length; bundleIdx++)
+        {
+            // Print a separator for some whitespace.
+            if (bundleIdx > 0)
+            {
+                System.out.println("");
+            }
+
+            try
+            {
+                if (bundles[bundleIdx] != null)
+                {
+                    ServiceReference[] refs = bundles[bundleIdx].getServicesInUse();
+
+                    // Print header if we have not already done so.
+                    String title = Util.getBundleName(bundles[bundleIdx]) + " requires services:";
+                    System.out.println(title);
+                    System.out.println(Util.getUnderlineString(title));
+
+                    if ((refs == null) || (refs.length == 0))
+                    {
+                        System.out.println("Nothing");
+                    }
+
+                    // Print properties for each service.
+                    for (int refIdx = 0;
+                        (refs != null) && (refIdx < refs.length);
+                        refIdx++)
+                    {
+                        // Print the registering bundle.
+                        System.out.println("Registering bundle = " + refs[refIdx].getBundle());
+                        // Print service properties.
+                        String[] keys = refs[refIdx].getPropertyKeys();
+                        for (int keyIdx = 0;
+                            (keys != null) && (keyIdx < keys.length);
+                            keyIdx++)
+                        {
+                            Object v = refs[refIdx].getProperty(keys[keyIdx]);
+                            System.out.println(
+                                keys[keyIdx] + " = " + Util.getValueString(v));
+                        }
+
+                        // Print service separator if necessary.
+                        if ((refIdx + 1) < refs.length)
+                        {
+                            System.out.println("----");
+                        }
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                System.err.println(ex.toString());
+            }
+        }
+    }
+
+    private static boolean isValidType(String type)
+    {
+        return (PACKAGE_TYPE.startsWith(type) || BUNDLE_TYPE.startsWith(type)
+            || FRAGMENT_TYPE.startsWith(type) || SERVICE_TYPE.startsWith(type));
+    }
+
+    private static boolean isValidDirection(String direction)
+    {
+        return (CAPABILITY.startsWith(direction) || REQUIREMENT.startsWith(direction));
+    }
+
+    private static boolean isFragment(Bundle bundle)
+    {
+        return bundle.getHeaders().get(Constants.FRAGMENT_HOST) != null;
+    }
+}
\ No newline at end of file
diff --git a/gogo/felixcommands/src/main/java/org/apache/felix/gogo/felixcommands/Util.java b/gogo/felixcommands/src/main/java/org/apache/felix/gogo/felixcommands/Util.java
index acd9428..03021dc 100644
--- a/gogo/felixcommands/src/main/java/org/apache/felix/gogo/felixcommands/Util.java
+++ b/gogo/felixcommands/src/main/java/org/apache/felix/gogo/felixcommands/Util.java
@@ -18,8 +18,11 @@
  */
 package org.apache.felix.gogo.felixcommands;
 
+import java.util.List;
 import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceReference;
 
 public class Util
 {
@@ -105,4 +108,28 @@
             }
         }
     }
+
+    public static <T> T getService(
+        BundleContext bc, Class<T> clazz, List<ServiceReference> refs)
+    {
+        ServiceReference ref = bc.getServiceReference(clazz.getName());
+        if (ref == null)
+        {
+            return null;
+        }
+        T t = (T) bc.getService(ref);
+        if (t != null)
+        {
+            refs.add(ref);
+        }
+        return t;
+    }
+
+    public static void ungetServices(BundleContext bc, List<ServiceReference> refs)
+    {
+        while (refs.size() > 0)
+        {
+            bc.ungetService(refs.remove(0));
+        }
+    }
 }
\ No newline at end of file
