New design for the new reporter.
diff --git a/src/main/java/org/testng/collections/ListMultiMap.java b/src/main/java/org/testng/collections/ListMultiMap.java
index 0faa179..be916b6 100644
--- a/src/main/java/org/testng/collections/ListMultiMap.java
+++ b/src/main/java/org/testng/collections/ListMultiMap.java
@@ -74,4 +74,10 @@
   public Collection<List<V>> getValues() {
     return m_objects.values();
   }
+
+  public void putAll(K k, Collection<V> values) {
+    for (V v : values) {
+      put(k, v);
+    }
+  }
 }
diff --git a/src/main/java/org/testng/reporters/jq/Main.java b/src/main/java/org/testng/reporters/jq/Main.java
new file mode 100644
index 0000000..3c98ca7
--- /dev/null
+++ b/src/main/java/org/testng/reporters/jq/Main.java
@@ -0,0 +1,86 @@
+package org.testng.reporters.jq;
+
+import org.testng.IReporter;
+import org.testng.ISuite;
+import org.testng.ISuiteResult;
+import org.testng.ITestResult;
+import org.testng.collections.ListMultiMap;
+import org.testng.collections.Maps;
+import org.testng.internal.Utils;
+import org.testng.reporters.Files;
+import org.testng.reporters.XMLStringBuffer;
+import org.testng.xml.XmlSuite;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+
+public class Main implements IReporter {
+  private static final String C = "class";
+  private static final String D = "div";
+  private static final String S = "span";
+
+  private ListMultiMap<ISuite, ITestResult> model = Maps.newListMultiMap();
+  private String m_outputDirectory;
+
+  @Override
+  public void generateReport(List<XmlSuite> xmlSuites, List<ISuite> suites,
+      String outputDirectory) {
+    initModel(suites);
+    m_outputDirectory = "/Users/cedric/java/misc/jquery";
+
+    XMLStringBuffer xsb = new XMLStringBuffer("  ");
+    xsb.push(D, "class", "main-panel-root");
+
+    int suiteCount = 0;
+    for (ISuite s : suites) {
+      generateSuitePanel(s, xsb, "suite-" + suiteCount++);
+//      System.out.println("Suite:" + s.getName());
+//      for (ITestResult r : model.get(s)) {
+//        System.out.println("  TestResult: " + r);
+//      }
+    }
+    generateTestPanel(xsb, "test-panel");
+    xsb.pop(D);
+
+    String all;
+    try {
+      all = Files.readFile(new File("/Users/cedric/java/misc/jquery/head3"));
+      Utils.writeFile(m_outputDirectory, "index3.html", all + xsb.toXML());
+    } catch (IOException e) {
+      // TODO Auto-generated catch block
+      e.printStackTrace();
+    }
+  }
+
+  private void generateTestPanel(XMLStringBuffer xsb, String divName) {
+    xsb.push(D, C, "panel " + divName);
+    xsb.addString("TEST PANEL");
+    xsb.pop(D);
+  }
+
+  private void generateSuitePanel(ISuite suite, XMLStringBuffer xsb, String divName) {
+    xsb.push(D, C, "panel " + divName);
+    xsb.addOptional(S, suite.getName(), C, "suite-name");
+    for (ITestResult tr : model.get(suite)) {
+      xsb.push(D, C, "suite-content");
+      xsb.addOptional(S, tr.getName() + " " + tr.getStatus(), C, "test-name");
+      xsb.pop(D);
+    }
+    xsb.pop(D);
+  }
+
+  private void initModel(List<ISuite> suites) {
+    for (ISuite suite : suites) {
+      for (ISuiteResult sr : suite.getResults().values()) {
+        model.putAll(suite, sr.getTestContext().getFailedTests().getAllResults());
+      }
+      for (ISuiteResult sr : suite.getResults().values()) {
+        model.putAll(suite, sr.getTestContext().getSkippedTests().getAllResults());
+      }
+      for (ISuiteResult sr : suite.getResults().values()) {
+        model.putAll(suite, sr.getTestContext().getPassedTests().getAllResults());
+      }
+    }
+  }
+}