Index: tika-app/src/main/java/org/apache/tika/cli/TikaCLI.java
===================================================================
--- tika-app/src/main/java/org/apache/tika/cli/TikaCLI.java	(revision 1026543)
+++ tika-app/src/main/java/org/apache/tika/cli/TikaCLI.java	(working copy)
@@ -56,6 +56,7 @@
 import org.apache.tika.mime.MediaTypeRegistry;
 import org.apache.tika.mime.MimeTypeException;
 import org.apache.tika.parser.AutoDetectParser;
+import org.apache.tika.parser.CompositeParser;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.parser.Parser;
 import org.apache.tika.parser.html.BoilerpipeContentHandler;
@@ -310,17 +311,41 @@
         }
     }
 
+    /*
+     * Displays loaded parsers and their mime types
+     * If a parser is a composite parser, it will list the
+     * sub parsers and their mime-types.
+     */
     private void displayParsers(boolean includeMimeTypes) {
-        // Invert the map
-        Map<MediaType,Parser> supported = parser.getParsers();
-        Map<Parser,Set<MediaType>> parsers = new HashMap<Parser, Set<MediaType>>();
-        for(Entry<MediaType, Parser> e : supported.entrySet()) {
-            if (!parsers.containsKey(e.getValue())) {
-                parsers.put(e.getValue(), new HashSet<MediaType>());
+        // Get a nicely sorted list of the parsers
+        Parser[] sortedParsers = sortParsers(invertMediaTypeMap(parser.getParsers()));
+
+        // Display
+        for (Parser p : sortedParsers) {
+            boolean isComposite = (p instanceof CompositeParser);
+            System.out.println(p.getClass().getName() + (isComposite ? " (Composite Parser):" : ""));
+            if (includeMimeTypes && !isComposite) {
+                for (MediaType mt : p.getSupportedTypes(context)) {
+                    System.out.println("  " + mt);
+                }
             }
-            parsers.get(e.getValue()).add(e.getKey());
+            
+            // List 2nd level of parsers if top level is composite
+            if (isComposite) {
+                Parser[] subParsers = sortParsers(invertMediaTypeMap(((CompositeParser) p).getParsers()));
+                for(Parser sp : subParsers) {
+                    System.out.println("  " + sp.getClass().getName());
+                    if (includeMimeTypes) {
+                        for (MediaType mt : sp.getSupportedTypes(context)) {
+                            System.out.println("    " + mt);
+                        }
+                    }                    
+                }
+            }
         }
+    }
 
+    private Parser[] sortParsers(Map<Parser, Set<MediaType>> parsers) {
         // Get a nicely sorted list of the parsers
         Parser[] sortedParsers = parsers.keySet().toArray(new Parser[parsers.size()]);
         Arrays.sort(sortedParsers, new Comparator<Parser>() {
@@ -330,16 +355,18 @@
                 return name1.compareTo(name2);
             }
         });
+        return sortedParsers;
+    }
 
-        // Display
-        for (Parser p : sortedParsers) {
-            System.out.println(p.getClass().getName());
-            if (includeMimeTypes) {
-                for (MediaType mt : parsers.get(p)) {
-                    System.out.println("  " + mt);
-                }
+    private Map<Parser, Set<MediaType>> invertMediaTypeMap(Map<MediaType, Parser> supported) {
+        Map<Parser,Set<MediaType>> parsers = new HashMap<Parser, Set<MediaType>>();
+        for(Entry<MediaType, Parser> e : supported.entrySet()) {
+            if (!parsers.containsKey(e.getValue())) {
+                parsers.put(e.getValue(), new HashSet<MediaType>());
             }
+            parsers.get(e.getValue()).add(e.getKey());
         }
+        return parsers;
     }
 
     /**
