diff --git a/gogo/command/src/main/java/org/apache/felix/gogo/command/Basic.java b/gogo/command/src/main/java/org/apache/felix/gogo/command/Basic.java
index 44477e6..0ac4899 100644
--- a/gogo/command/src/main/java/org/apache/felix/gogo/command/Basic.java
+++ b/gogo/command/src/main/java/org/apache/felix/gogo/command/Basic.java
@@ -37,6 +37,8 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.TreeMap;
+
+import org.apache.felix.service.command.CommandSession;
 import org.apache.felix.service.command.Descriptor;
 import org.apache.felix.service.command.Parameter;
 import org.osgi.framework.Bundle;
@@ -52,6 +54,7 @@
 import org.osgi.service.packageadmin.PackageAdmin;
 import org.osgi.service.startlevel.StartLevel;
 
+@SuppressWarnings("deprecation")
 public class Basic
 {
     private final BundleContext m_bc;
@@ -65,7 +68,7 @@
     public void bundlelevel(@Descriptor("bundle to query") Bundle bundle)
     {
         // Keep track of service references.
-        List<ServiceReference> refs = new ArrayList();
+        List<ServiceReference<?>> refs = new ArrayList<ServiceReference<?>>();
 
         // Get start level service.
         StartLevel sl = Util.getService(m_bc, StartLevel.class, refs);
@@ -95,7 +98,7 @@
         @Descriptor("target identifiers") Bundle[] bundles)
     {
         // Keep track of service references.
-        List<ServiceReference> refs = new ArrayList();
+        List<ServiceReference<?>> refs = new ArrayList<ServiceReference<?>>();
 
         // Get start level service.
         StartLevel sl = Util.getService(m_bc, StartLevel.class, refs);
@@ -150,7 +153,7 @@
     public void frameworklevel()
     {
         // Keep track of service references.
-        List<ServiceReference> refs = new ArrayList();
+        List<ServiceReference<?>> refs = new ArrayList<ServiceReference<?>>();
 
         // Get start level service.
         StartLevel sl = Util.getService(m_bc, StartLevel.class, refs);
@@ -166,7 +169,7 @@
     public void frameworklevel(@Descriptor("target start level") int level)
     {
         // Keep track of service references.
-        List<ServiceReference> refs = new ArrayList();
+        List<ServiceReference<?>> refs = new ArrayList<ServiceReference<?>>();
 
         // Get start level service.
         StartLevel sl = Util.getService(m_bc, StartLevel.class, refs);
@@ -188,13 +191,13 @@
             String title = Util.getBundleName(bundle);
             System.out.println("\n" + title);
             System.out.println(Util.getUnderlineString(title.length()));
-            Dictionary dict = bundle.getHeaders();
-            Enumeration keys = dict.keys();
+            Dictionary<String, String> dict = bundle.getHeaders();
+            Enumeration<String> keys = dict.keys();
             while (keys.hasMoreElements())
             {
-                Object k = (String) keys.nextElement();
-                Object v = dict.get(k);
-                System.out.println(k + " = " + Util.getValueString(v));
+                String k = keys.nextElement();
+                String v = dict.get(k);
+                System.out.println(k + " = " + v);
             }
         }
     }
@@ -255,15 +258,20 @@
                 System.out.println("   scope: " + name.substring(0, name.indexOf(':')));
 
                 // Get flags and options.
-                Class[] paramTypes = m.getParameterTypes();
-                Map<String, Parameter> flags = new TreeMap();
-                Map<String, String> flagDescs = new TreeMap();
-                Map<String, Parameter> options = new TreeMap();
-                Map<String, String> optionDescs = new TreeMap();
-                List<String> params = new ArrayList();
+                Class<?>[] paramTypes = m.getParameterTypes();
+                Map<String, Parameter> flags = new TreeMap<String, Parameter>();
+                Map<String, String> flagDescs = new TreeMap<String, String>();
+                Map<String, Parameter> options = new TreeMap<String, Parameter>();
+                Map<String, String> optionDescs = new TreeMap<String, String>();
+                List<String> params = new ArrayList<String>();
                 Annotation[][] anns = m.getParameterAnnotations();
                 for (int paramIdx = 0; paramIdx < anns.length; paramIdx++)
                 {
+                    Class<?> paramType = m.getParameterTypes()[paramIdx];
+                    if (paramType == CommandSession.class) {
+                        /* Do not bother the user with a CommandSession. */
+                        continue;
+                    }
                     Parameter p = findAnnotation(anns[paramIdx], Parameter.class);
                     d = findAnnotation(anns[paramIdx], Descriptor.class);
                     if (p != null)
@@ -358,7 +366,7 @@
 
     private Map<String, List<Method>> getCommands()
     {
-        ServiceReference[] refs = null;
+        ServiceReference<?>[] refs = null;
         try
         {
             refs = m_bc.getAllServiceReferences(null, "(osgi.command.scope=*)");
@@ -368,9 +376,9 @@
             // This should never happen.
         }
 
-        Map<String, List<Method>> commands = new TreeMap();
+        Map<String, List<Method>> commands = new TreeMap<String, List<Method>>();
 
-        for (ServiceReference ref : refs)
+        for (ServiceReference<?> ref : refs)
         {
             Object svc = m_bc.getService(ref);
             if (svc != null)
@@ -382,7 +390,7 @@
 
                 for (String func : funcs)
                 {
-                    commands.put(scope + ":" + func, new ArrayList());
+                    commands.put(scope + ":" + func, new ArrayList<Method>());
                 }
 
                 if (!commands.isEmpty())
@@ -482,7 +490,7 @@
         @Descriptor("subtring matched against name or symbolic name") String pattern)
     {
         // Keep track of service references.
-        List<ServiceReference> refs = new ArrayList();
+        List<ServiceReference<?>> refs = new ArrayList<ServiceReference<?>>();
 
         // Get start level service.
         StartLevel sl = Util.getService(m_bc, StartLevel.class, refs);
@@ -491,7 +499,7 @@
             System.out.println("Start Level service is unavailable.");
         }
 
-        List<Bundle> found = new ArrayList();
+        List<Bundle> found = new ArrayList<Bundle>();
 
         if (pattern == null)
         {
@@ -543,7 +551,7 @@
         @Descriptor("minimum log level [ debug | info | warn | error ]") String logLevel)
     {
         // Keep track of service references.
-        List<ServiceReference> refs = new ArrayList();
+        List<ServiceReference<?>> refs = new ArrayList<ServiceReference<?>>();
 
         // Get start level service.
         LogReaderService lrs = Util.getService(m_bc, LogReaderService.class, refs);
@@ -553,7 +561,8 @@
         }
         else
         {
-            Enumeration entries = lrs.getLog();
+            @SuppressWarnings("unchecked")
+            Enumeration<LogEntry> entries = lrs.getLog();
 
             int minLevel = logLevelAsInt(logLevel);
 
@@ -640,7 +649,7 @@
         }
 
         // Keep track of service references.
-        List<ServiceReference> refs = new ArrayList();
+        List<ServiceReference<?>> refs = new ArrayList<ServiceReference<?>>();
 
         // Get package admin service.
         PackageAdmin pa = Util.getService(m_bc, PackageAdmin.class, refs);
@@ -664,7 +673,7 @@
         }
 
         // Keep track of service references.
-        List<ServiceReference> refs = new ArrayList();
+        List<ServiceReference<?>> refs = new ArrayList<ServiceReference<?>>();
 
         // Get package admin service.
         PackageAdmin pa = Util.getService(m_bc, PackageAdmin.class, refs);
@@ -925,7 +934,7 @@
         }
         else
         {
-            Class clazz = null;
+            Class<?> clazz = null;
             try
             {
                 clazz = bundle.loadClass(className);
@@ -1020,12 +1029,12 @@
 
             if (level < 0)
             {
-                System.out.println(String.format("%5d|%-11s|%s", bundle.getBundleId(),
+                System.out.println(String.format("%5d|%-11s|%s|%s", bundle.getBundleId(),
                     getStateString(bundle), name, bundle.getVersion()));
             }
             else
             {
-                System.out.println(String.format("%5d|%-11s|%5d|%s",
+                System.out.println(String.format("%5d|%-11s|%5d|%s|%s",
                     bundle.getBundleId(), getStateString(bundle), level, name,
                     bundle.getVersion()));
             }
@@ -1060,4 +1069,4 @@
             return "Unknown    ";
         }
     }
-}
\ No newline at end of file
+}
diff --git a/gogo/command/src/main/java/org/apache/felix/gogo/command/Inspect42.java b/gogo/command/src/main/java/org/apache/felix/gogo/command/Inspect42.java
index 5e28e98..b65365d 100644
--- a/gogo/command/src/main/java/org/apache/felix/gogo/command/Inspect42.java
+++ b/gogo/command/src/main/java/org/apache/felix/gogo/command/Inspect42.java
@@ -30,6 +30,7 @@
 import org.osgi.service.packageadmin.PackageAdmin;
 import org.osgi.service.packageadmin.RequiredBundle;
 
+@SuppressWarnings("deprecation")
 public class Inspect42
 {
     public static final String LEGACY_PACKAGE_NAMESPACE = "package";
@@ -175,7 +176,7 @@
         boolean matches = false;
 
         // Keep track of service references.
-        List<ServiceReference> refs = new ArrayList();
+        List<ServiceReference<?>> refs = new ArrayList<ServiceReference<?>>();
 
         // Fragments cannot export packages.
         if (!isFragment(b))
@@ -242,7 +243,7 @@
         boolean matches = false;
 
         // Keep track of service references.
-        List<ServiceReference> refs = new ArrayList();
+        List<ServiceReference<?>> refs = new ArrayList<ServiceReference<?>>();
 
         // Fragments cannot import packages.
         if (!isFragment(b))
@@ -298,7 +299,7 @@
         boolean matches = false;
 
         // Keep track of service references.
-        List<ServiceReference> refs = new ArrayList();
+        List<ServiceReference<?>> refs = new ArrayList<ServiceReference<?>>();
 
         // Fragments cannot be required.
         if (!isFragment(b))
@@ -371,7 +372,7 @@
         boolean matches = false;
 
         // Keep track of service references.
-        List<ServiceReference> refs = new ArrayList();
+        List<ServiceReference<?>> refs = new ArrayList<ServiceReference<?>>();
 
         // Fragments cannot require bundles.
         if (!isFragment(b))
@@ -421,7 +422,7 @@
         boolean matches = false;
 
         // Keep track of service references.
-        List<ServiceReference> refs = new ArrayList();
+        List<ServiceReference<?>> refs = new ArrayList<ServiceReference<?>>();
 
         // Get package admin service.
         PackageAdmin pa = Util.getService(bc, PackageAdmin.class, refs);
@@ -480,7 +481,7 @@
         boolean matches = false;
 
         // Keep track of service references.
-        List<ServiceReference> refs = new ArrayList();
+        List<ServiceReference<?>> refs = new ArrayList<ServiceReference<?>>();
 
         // Get package admin service.
         PackageAdmin pa = Util.getService(bc, PackageAdmin.class, refs);
diff --git a/gogo/command/src/main/java/org/apache/felix/gogo/command/Util.java b/gogo/command/src/main/java/org/apache/felix/gogo/command/Util.java
index 48ac8c5..4b4e76b 100644
--- a/gogo/command/src/main/java/org/apache/felix/gogo/command/Util.java
+++ b/gogo/command/src/main/java/org/apache/felix/gogo/command/Util.java
@@ -123,9 +123,10 @@
     }
 
     public static <T> T getService(
-        BundleContext bc, Class<T> clazz, List<ServiceReference> refs)
+        BundleContext bc, Class<T> clazz, List<ServiceReference<?>> refs)
     {
-        ServiceReference ref = bc.getServiceReference(clazz.getName());
+        @SuppressWarnings("unchecked")
+        ServiceReference<T> ref = (ServiceReference<T>) bc.getServiceReference(clazz.getName());
         if (ref == null)
         {
             return null;
@@ -138,7 +139,7 @@
         return t;
     }
 
-    public static void ungetServices(BundleContext bc, List<ServiceReference> refs)
+    public static void ungetServices(BundleContext bc, List<ServiceReference<?>> refs)
     {
         while (refs.size() > 0)
         {
@@ -181,10 +182,8 @@
                 out.println("Downloading " + fileName + ".");
             }
             byte[] buffer = new byte[4096];
-            int count = 0;
             for (int len = is.read(buffer); len > 0; len = is.read(buffer))
             {
-                count += len;
                 os.write(buffer, 0, len);
             }
 
@@ -320,7 +319,7 @@
 
     public static List<String> parseSubstring(String value)
     {
-        List<String> pieces = new ArrayList();
+        List<String> pieces = new ArrayList<String>();
         StringBuffer ss = new StringBuffer();
         // int kind = SIMPLE; // assume until proven otherwise
         boolean wasStar = false; // indicates last piece was a star
