diff --git a/tools/soyc-vis/build.xml b/tools/soyc-vis/build.xml
index cbe1c15..c6d929d 100644
--- a/tools/soyc-vis/build.xml
+++ b/tools/soyc-vis/build.xml
@@ -13,6 +13,12 @@
   <target name="compile">
     <mkdir dir="${javac.out}"/>
     <javac srcdir="src" destdir="${javac.out}"/>
+    <mkdir dir="${javac.out}/images"/>
+    <copy todir="${javac.out}/images">
+      <fileset dir="images"/>
+    </copy>
+    <copy file="classLevel.css" tofile="${javac.out}/classLevel.css"/>
+    <copy file="roundedCorners.css" tofile="${javac.out}/roundedCorners.css"/>
   </target>
 
   <target name="build" depends="compile">
diff --git a/tools/soyc-vis/classLevel.css b/tools/soyc-vis/classLevel.css
new file mode 100644
index 0000000..5c70a24
--- /dev/null
+++ b/tools/soyc-vis/classLevel.css
@@ -0,0 +1,162 @@
+/* \*/
+* html #tlc, * html #trc {height: 1%;}
+/* */
+
+#tlc, #trc { zoom: 1 }
+
+h2 {background-color: transparent}
+p {background-color: fuchsia}
+    A:link {text-decoration: none; color: blue;}
+A:visited {text-decoration: none; color: blue;}
+A:active {text-decoration: none}
+A:hover {text-decoration: underline; color: maroon;}
+
+body
+	{
+	margin: 0;
+	padding: 0;
+    background-color: #728FCE;
+	font-size: 100.01%;
+	text-align: center; 
+	}
+
+.box
+	{
+	position: absolute;
+	margin-left: 0;
+	margin-right: 0;
+    margin-top: 0;
+    margin-bottom: 0;
+	text-align: left;
+	<!--background-color: #eeeeee;-->
+   
+    z-index: 1;
+    opacity:0.7; 
+	}
+
+.box-right
+	{
+	position: absolute;
+	margin-left: 0;
+	margin-right: 0;
+    margin-top: 0;
+    margin-bottom: 0;
+	text-align: right;
+	<!--background-color: #eeeeee;-->
+    z-index: 2;
+    opacity:0.7; 
+	}
+
+ 	
+#content
+	{
+    height:25px;
+	}
+
+
+
+.barlabel {
+    
+    position: absolute;
+    font-size: 14px;
+    text-color: maroon;
+    z-index: 2;
+    <!--font-weight: bold;-->
+    text-align: left;
+    
+
+}
+
+#content h1
+	{
+	color:#0354c2;
+	font-weight: bold;
+	font-size: 1.2em;
+	font-family: helvetica, geneva, arial, sans-serif;
+	}
+		
+#content p
+	{
+	color:#3b3b3b;
+	font-size: 1em;
+	line-height: 1.3em;
+	font-family: arial, helvetica, sans-serif;
+	}
+
+
+		
+/* ---=== border code follows ===--- */
+/*
+	tlc = top left corner
+	trc = top right corner
+	blc = bottom left corner
+	brc = bottom right corner
+	lb = left border
+	rb = right border
+	tb = top border
+	bb = bottom border 
+*/
+
+#tlc, #trc, #blc, #brc
+	{
+	background-color: transparent;
+	background-repeat: no-repeat;
+	}
+
+#tlc
+	{
+	background-image:url(images/tlc.gif);
+	background-position: 0% 0%;
+	}
+
+#trc
+	{
+	background-image:url(images/trc.gif);
+	background-position: 100% 0%;
+	}
+	
+#blc
+	{
+	background-image:url(images/blc.gif);
+	background-position: 0% 100%;
+	}
+
+#brc
+	{
+	background-image:url(images/brc.gif);
+	background-position: 100% 100%;
+	}
+
+#tb, #bb
+	{
+	 background-color: transparent;
+	background-repeat: repeat-x;
+	}
+			
+#tb
+	{
+	background-image:url(images/tb.gif);
+	background-position: 0% 0%;
+	}
+
+#bb
+	{
+	background-image:url(images/bb.gif);
+	background-position: 50% 100%;
+	}
+	
+#rb
+	{
+	background-image:url(images/r.gif);
+	background-position: 100% 0%;
+	background-repeat: repeat-y;
+	}
+
+#lb
+	{
+	background-color: #eeeeee;
+	background-image:url(images/l.gif);
+	background-position: 0% 100%;
+	background-repeat: repeat-y;
+	}
+			
diff --git a/tools/soyc-vis/images/1bl.gif b/tools/soyc-vis/images/1bl.gif
new file mode 100644
index 0000000..3183405
--- /dev/null
+++ b/tools/soyc-vis/images/1bl.gif
Binary files differ
diff --git a/tools/soyc-vis/images/1br.gif b/tools/soyc-vis/images/1br.gif
new file mode 100644
index 0000000..8748c10
--- /dev/null
+++ b/tools/soyc-vis/images/1br.gif
Binary files differ
diff --git a/tools/soyc-vis/images/1tl.gif b/tools/soyc-vis/images/1tl.gif
new file mode 100644
index 0000000..2ca18a7
--- /dev/null
+++ b/tools/soyc-vis/images/1tl.gif
Binary files differ
diff --git a/tools/soyc-vis/images/1tr.gif b/tools/soyc-vis/images/1tr.gif
new file mode 100644
index 0000000..e4e2a96
--- /dev/null
+++ b/tools/soyc-vis/images/1tr.gif
Binary files differ
diff --git a/tools/soyc-vis/images/bb.gif b/tools/soyc-vis/images/bb.gif
new file mode 100644
index 0000000..ef7d5a3
--- /dev/null
+++ b/tools/soyc-vis/images/bb.gif
Binary files differ
diff --git a/tools/soyc-vis/images/blc.gif b/tools/soyc-vis/images/blc.gif
new file mode 100644
index 0000000..7b6d57a
--- /dev/null
+++ b/tools/soyc-vis/images/blc.gif
Binary files differ
diff --git a/tools/soyc-vis/images/brc.gif b/tools/soyc-vis/images/brc.gif
new file mode 100644
index 0000000..5afd529
--- /dev/null
+++ b/tools/soyc-vis/images/brc.gif
Binary files differ
diff --git a/tools/soyc-vis/images/l.gif b/tools/soyc-vis/images/l.gif
new file mode 100644
index 0000000..a85da2c
--- /dev/null
+++ b/tools/soyc-vis/images/l.gif
Binary files differ
diff --git a/tools/soyc-vis/images/r.gif b/tools/soyc-vis/images/r.gif
new file mode 100644
index 0000000..4b8f639
--- /dev/null
+++ b/tools/soyc-vis/images/r.gif
Binary files differ
diff --git a/tools/soyc-vis/images/roundedbox_lo.gif b/tools/soyc-vis/images/roundedbox_lo.gif
new file mode 100644
index 0000000..c614467
--- /dev/null
+++ b/tools/soyc-vis/images/roundedbox_lo.gif
Binary files differ
diff --git a/tools/soyc-vis/images/roundedbox_lu.gif b/tools/soyc-vis/images/roundedbox_lu.gif
new file mode 100644
index 0000000..995bf88
--- /dev/null
+++ b/tools/soyc-vis/images/roundedbox_lu.gif
Binary files differ
diff --git a/tools/soyc-vis/images/roundedbox_ro.gif b/tools/soyc-vis/images/roundedbox_ro.gif
new file mode 100644
index 0000000..8124e86
--- /dev/null
+++ b/tools/soyc-vis/images/roundedbox_ro.gif
Binary files differ
diff --git a/tools/soyc-vis/images/roundedbox_ru.gif b/tools/soyc-vis/images/roundedbox_ru.gif
new file mode 100644
index 0000000..55774ef
--- /dev/null
+++ b/tools/soyc-vis/images/roundedbox_ru.gif
Binary files differ
diff --git a/tools/soyc-vis/images/tb.gif b/tools/soyc-vis/images/tb.gif
new file mode 100644
index 0000000..8b9a080
--- /dev/null
+++ b/tools/soyc-vis/images/tb.gif
Binary files differ
diff --git a/tools/soyc-vis/images/tlc.gif b/tools/soyc-vis/images/tlc.gif
new file mode 100644
index 0000000..8c40bf7
--- /dev/null
+++ b/tools/soyc-vis/images/tlc.gif
Binary files differ
diff --git a/tools/soyc-vis/images/trc.gif b/tools/soyc-vis/images/trc.gif
new file mode 100644
index 0000000..2e4ed5a
--- /dev/null
+++ b/tools/soyc-vis/images/trc.gif
Binary files differ
diff --git a/tools/soyc-vis/roundedCorners.css b/tools/soyc-vis/roundedCorners.css
new file mode 100644
index 0000000..567daf1
--- /dev/null
+++ b/tools/soyc-vis/roundedCorners.css
@@ -0,0 +1,146 @@
+/* \*/
+* html #tlc, * html #trc {height: 1%;}
+/* */
+
+#tlc, #trc { zoom: 1 }
+
+h2 {background-color: transparent}
+p {background-color: fuchsia}
+    A:link {text-decoration: none; color: blue;}
+A:visited {text-decoration: none; color: blue;}
+A:active {text-decoration: none}
+A:hover {text-decoration: underline; color: maroon;}
+
+body
+	{
+	margin: 0;
+	padding: 0;
+    background-color: white;
+	font-size: 100.01%;
+	text-align: center; 
+	}
+
+#box
+	{
+	position: absolute;
+	margin-left: 0;
+	margin-right: 0;
+    margin-top: 0;
+    margin-bottom: 0;
+	text-align: left;
+	<!--background-color: #eeeeee;-->
+   
+    z-index: 1;
+    opacity:0.7; 
+	}
+ 	
+#content
+	{
+    height:25px;
+	}
+
+.barlabel {
+    
+    position: absolute;
+    font-size: 14px;
+    text-color: maroon;
+    z-index: 2;
+    <!--font-weight: bold;-->
+    text-align: left;
+    
+
+}
+
+#content h1
+	{
+	color:#0354c2;
+	font-weight: bold;
+	font-size: 1.2em;
+	font-family: helvetica, geneva, arial, sans-serif;
+	}
+		
+#content p
+	{
+	color:#3b3b3b;
+	font-size: 1em;
+	line-height: 1.3em;
+	font-family: arial, helvetica, sans-serif;
+	}
+
+
+		
+/* ---=== border code follows ===--- */
+/*
+	tlc = top left corner
+	trc = top right corner
+	blc = bottom left corner
+	brc = bottom right corner
+	lb = left border
+	rb = right border
+	tb = top border
+	bb = bottom border 
+*/
+
+#tlc, #trc, #blc, #brc
+	{
+	background-color: transparent;
+	background-repeat: no-repeat;
+	}
+
+#tlc
+	{
+	background-image:url(images/tlc.gif);
+	background-position: 0% 0%;
+	}
+
+#trc
+	{
+	background-image:url(images/trc.gif);
+	background-position: 100% 0%;
+	}
+	
+#blc
+	{
+	background-image:url(images/blc.gif);
+	background-position: 0% 100%;
+	}
+
+#brc
+	{
+	background-image:url(images/brc.gif);
+	background-position: 100% 100%;
+	}
+
+#tb, #bb
+	{
+	 background-color: transparent;
+	background-repeat: repeat-x;
+	}
+			
+#tb
+	{
+	background-image:url(images/tb.gif);
+	background-position: 0% 0%;
+	}
+
+#bb
+	{
+	background-image:url(images/bb.gif);
+	background-position: 50% 100%;
+	}
+	
+#rb
+	{
+	background-image:url(images/r.gif);
+	background-position: 100% 0%;
+	background-repeat: repeat-y;
+	}
+
+#lb
+	{
+	background-color: #eeeeee;
+	background-image:url(images/l.gif);
+	background-position: 0% 100%;
+	background-repeat: repeat-y;
+	}
+			
diff --git a/tools/soyc-vis/src/com/google/gwt/soyc/CodeCollection.java b/tools/soyc-vis/src/com/google/gwt/soyc/CodeCollection.java
index 6575008..655b516 100644
--- a/tools/soyc-vis/src/com/google/gwt/soyc/CodeCollection.java
+++ b/tools/soyc-vis/src/com/google/gwt/soyc/CodeCollection.java
@@ -25,11 +25,12 @@
   public TreeSet<String> stories = new TreeSet<String>();
   public float cumPartialSize = 0f;
   public int cumSize = 0;
+  
+  
   public CodeCollection(String type){
     codeType = type;
   }
   
-  
   public int getCumSize(){
     cumSize = 0;
     for (String className : classes){
diff --git a/tools/soyc-vis/src/com/google/gwt/soyc/GlobalInformation.java b/tools/soyc-vis/src/com/google/gwt/soyc/GlobalInformation.java
index d7d23f5..47c9c25 100644
--- a/tools/soyc-vis/src/com/google/gwt/soyc/GlobalInformation.java
+++ b/tools/soyc-vis/src/com/google/gwt/soyc/GlobalInformation.java
@@ -23,36 +23,36 @@
 import java.util.TreeSet;
 
 public class GlobalInformation {
-
-  public static HashMap<String, HashSet<String>> storiesToCorrClasses = new HashMap<String, HashSet<String>>();
-  public static HashMap<String, String> storiesToLitType = new HashMap<String, String>();
   
-  public static HashMap<String, Integer> packageToSize = new HashMap<String, Integer>();
-  public static HashMap<String, Float> packageToPartialSize = new HashMap<String, Float>();
-
+  public static int allOtherFragmentsPartialSize = 0;
   public static HashMap<String, String> classToPackage = new HashMap<String, String>();
-  
+  public static HashMap<String, Float> classToPartialSize = new HashMap<String, Float>();
+  public static HashMap<String, Integer> classToSize = new HashMap<String, Integer>();
   //TODO(kprobst): not currently used, but will be for dependencies
   public static HashMap<String, HashSet<String>> classToWhatItDependsOn = new HashMap<String, HashSet<String>>();
-  
-  public static HashMap<String, Integer> classToSize = new HashMap<String, Integer>();
-  public static HashMap<String, Float> classToPartialSize = new HashMap<String, Float>();
-  public static TreeMap<String, TreeSet<String>> packageToClasses = new TreeMap<String, TreeSet<String>>();
-  
-  public static HashSet<String> nonAttributedStories = new HashSet<String>();
-  public static int nonAttributedBytes = 0;
-  public static int numBytesDoubleCounted = 0;
-  
-  public static int cumSizeAllCode  = 0;
   public static float cumPartialSizeFromPackages = 0f;
+  public static int cumSizeAllCode  = 0;
   public static int cumSizeFromPackages = 0;
-  
+  public static int cumSizeInitialFragment = 0;
+  public static HashMap<Integer, Float> fragmentToPartialSize = new HashMap<Integer, Float>(); //collect only size for exclusive fragments
   public static HashMap<Integer, HashSet<String>> fragmentToStories = new HashMap<Integer, HashSet<String>>();
-  public static HashMap<Integer, Float> fragmentToPartialSize = new HashMap<Integer, Float>();
+  public static TreeMap<String, LiteralsCollection> nameToLitColl = new TreeMap<String, LiteralsCollection>();
+  public static HashMap<String, CodeCollection> nameToCodeColl = new HashMap<String, CodeCollection>();
+
+
+  public static int nonAttributedBytes = 0;
+  public static HashSet<String> nonAttributedStories = new HashSet<String>();
+  public static int numBytesDoubleCounted = 0;
   public static int numFragments = 0;
   public static int numSplitPoints = 0;
-  public static int cumSizeInitialFragment = 0;
-    
+  public static TreeMap<String, TreeSet<String>> packageToClasses = new TreeMap<String, TreeSet<String>>();
+  public static HashMap<String, Float> packageToPartialSize = new HashMap<String, Float>();
+  public static HashMap<String, Integer> packageToSize = new HashMap<String, Integer>();
+  public static HashMap<Integer, String> splitPointToLocation = new HashMap<Integer, String>();
+  public static HashMap<String, HashSet<String>> storiesToCorrClasses = new HashMap<String, HashSet<String>>();
+  public static HashMap<String, HashSet<String>> storiesToCorrClassesAndMethods = new HashMap<String, HashSet<String>>();
+  
+  public static HashMap<String, String> storiesToLitType = new HashMap<String, String>();
   public static void computePackageSizes(){
     cumSizeFromPackages = 0;
     packageToSize.clear();
@@ -71,7 +71,6 @@
       }
     }
   }
-  
   public static void computePartialPackageSizes(){
     cumPartialSizeFromPackages = 0;
     packageToPartialSize.clear();
diff --git a/tools/soyc-vis/src/com/google/gwt/soyc/LiteralsCollection.java b/tools/soyc-vis/src/com/google/gwt/soyc/LiteralsCollection.java
index ce17b5d..3f71ef1 100644
--- a/tools/soyc-vis/src/com/google/gwt/soyc/LiteralsCollection.java
+++ b/tools/soyc-vis/src/com/google/gwt/soyc/LiteralsCollection.java
@@ -22,18 +22,21 @@
 import java.util.TreeMap;
 
 public class LiteralsCollection {
+  public int cumSize = 0;
+  public int cumStringSize = 0;
   public String literalType = "";
   public Map<String, HashSet<String>> literalToLocations = new TreeMap<String, HashSet<String>>();
   public Map<String, HashSet<String> > storyToLocations = new HashMap<String, HashSet<String>>();
   public TreeMap<String, String> stringLiteralToType = new TreeMap<String, String>();
   public Map<String, Integer> stringTypeToSize = new HashMap<String, Integer>();
   public Map<String, Integer> stringTypeToCount = new HashMap<String, Integer>();
-  public int cumSize = 0;
-  public int cumStringSize = 0;
   
+  /**
+   * constructor
+   */
   public LiteralsCollection(String type){
     literalType = type;
-  }  
+  }
 
   /**
    * Utility method
diff --git a/tools/soyc-vis/src/com/google/gwt/soyc/MakeTopLevelHtmlForPerm.java b/tools/soyc-vis/src/com/google/gwt/soyc/MakeTopLevelHtmlForPerm.java
index e5f66d3..7de2f8f 100644
--- a/tools/soyc-vis/src/com/google/gwt/soyc/MakeTopLevelHtmlForPerm.java
+++ b/tools/soyc-vis/src/com/google/gwt/soyc/MakeTopLevelHtmlForPerm.java
@@ -16,131 +16,21 @@
 
 package com.google.gwt.soyc;
 
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
 import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
 import java.io.PrintWriter;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.TreeMap;
+import java.util.TreeSet;
 
 public class MakeTopLevelHtmlForPerm {
   
-  public static void makeHTMLShell(HashMap<String, CodeCollection> nameToCodeColl, TreeMap<String, LiteralsCollection> nameToLitColl) throws IOException{
-    //this will contain the place holder iframes where the actual information is going to go.
-
-    String fileName = "SoycDashboard-index.html";
-    
-    final PrintWriter outFile = new PrintWriter(fileName);
-    outFile.println("<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">");
-    outFile.println("<html>");
-    outFile.println("<head>");
-    outFile.println("<title>Story of Your Compile - Top Level Dashboard for Permutation</title>");
-    
-    outFile.println("<style type=\"text/css\">");
-    outFile.println("body {background-color: #728FCE}");
-    outFile.println("h2 {background-color: transparent}");
-    outFile.println("p {background-color: fuchsia}");
-    outFile.println("</style>");
-    outFile.println("</head>");
-    
-    
-    outFile.println("<body>");
-    outFile.println("<center>");
-    outFile.println("<h3>Story of Your Compile Dashboard</h3>");
-    outFile.println("<hr>");
-    if (GlobalInformation.cumSizeInitialFragment != 0){
-      outFile.println("<b>Full code size: <span style=\"color:maroon\">" + GlobalInformation.cumSizeAllCode + "</span>, Size of Initial Download:  <span style=\"color:maroon\">" + GlobalInformation.cumSizeInitialFragment + "</span></b>");
-    }
-    else{
-      outFile.println("<b>Full code size: <span style=\"color:maroon\">" + GlobalInformation.cumSizeAllCode + "</span></b>");
-    }
-    outFile.println("</center>");
-    outFile.println("  <div style=\"width:50%;  float:left; padding-top: 10px;\">");
-    outFile.println("<b>Package breakdown</b>");
-    outFile.println("    </div>");
-    outFile.println("  <div style=\"width:48%;  float:right; padding-top: 10px; \">");
-    outFile.println("<b>Code type breakdown</b>");
-    outFile.println("    </div>");
-    
-
-    outFile.println("  <div style=\"width:50%;  float:left; padding-top: 10px;\">");
-    outFile.println("<div style=\"width: 110px; float: left; font-size:16px;\">Size</div>");
-    outFile.println("<div style=\"width: 200px; float: left; text-align:left; font-size:16px; \">Package Name</div>");
-    outFile.println("    </div>");
-    
-    
-    outFile.println("  <div style=\"width:48%;  float:right; padding-top: 10px;\">");
-    outFile.println("<div style=\"width: 110px; float: left; font-size:16px;\">Size</div>");
-    outFile.println("<div style=\"width: 200px; float: left; text-align:left; font-size:16px; \">Code Type</div>");
-    outFile.println("    </div>");
-    
-    
-    
-    outFile.println("<div style=\"height:35%; width:48%; margin:0 auto; background-color:white; float:left;\">");
-    outFile.println("<iframe src=\"packageBreakdown.html\" width=100% height=100% scrolling=auto></iframe>");
-    outFile.println("  </div>");
-    makePackageHtml("packageBreakdown.html");
-    
-    outFile.println("<div style=\"height:35%; width:48%; margin:0 auto; background-color:white; float:right;\">");
-    outFile.println("<iframe src=\"codeTypeBreakdown.html\" width=100% height=100% scrolling=auto></iframe>");
-    outFile.println("  </div>");
-    makeCodeTypeHtml("codeTypeBreakdown.html", nameToCodeColl);
-    
-    outFile.println("  <div style=\"width:50%;  float:left; padding-top: 10px;\">");
-    outFile.println("<b>Literals breakdown</b>");
-    outFile.println("    </div>");
-    outFile.println("  <div style=\"width:48%;  float:right; padding-top: 10px;  \">");
-    outFile.println("<b>String literals breakdown</b>");
-    outFile.println("    </div>");
-    
-
-    outFile.println("  <div style=\"width:50%;  float:left; padding-top: 10px;\">");
-    outFile.println("<div style=\"width: 110px; float: left; font-size:16px;\">Size</div>");
-    outFile.println("<div style=\"width: 200px; float: left; text-align:left; font-size:16px; \">Literal Type</div>");
-    outFile.println("    </div>");
-    
-    
-    outFile.println("  <div style=\"width:48%;  float:right; padding-top: 10px; \">");
-    outFile.println("<div style=\"width: 110px; float: left; font-size:16px;\">Size</div>");
-    outFile.println("<div style=\"width: 200px; float: left; text-align:left; font-size:16px; \">String Literal Type</div>");
-    outFile.println("    </div>");
-    
-    
-    outFile.println("<div style=\"height:35%; width:48%; margin:0 auto; background-color:white; float:left;\">");
-    outFile.println("<iframe src=\"literalsBreakdown.html\" width=100% height=100% scrolling=auto></iframe>");
-    outFile.println("</div>");
-    makeLiteralsHtml("literalsBreakdown.html", nameToLitColl);
-
-    outFile.println("<div style=\"height:35%; width:48%; margin:0 auto; background-color:white; float:right;\">");
-    outFile.println("<iframe src=\"stringLiteralsBreakdown.html\" width=100% height=100% scrolling=auto></iframe>");
-    outFile.println("  </div>");
-    makeStringLiteralsHtml("stringLiteralsBreakdown.html", nameToLitColl);
-
-
-
-    if (GlobalInformation.fragmentToStories.size() != 1){
-      outFile.println("  <div style=\"width:100%;  float:left; padding-top: 10px;\">");
-      outFile.println("<b>Fragments breakdown</b>");
-      outFile.println("    </div>");
-  
-      outFile.println("  <div style=\"width:100%;  float:left; padding-top: 10px;\">");
-      outFile.println("<div style=\"width: 110px; float: left; font-size:16px;\">Size</div>");
-      outFile.println("<div style=\"width: 200px; float: left; text-align:left; font-size:16px; \">Fragment Name</div>");
-      outFile.println("    </div>");
-      
-      outFile.println("<div style=\"height:35%; width:50%; margin:0 auto; background-color:white; float:left;\">");
-      outFile.println("<iframe src=\"fragmentsBreakdown.html\" width=100% height=100% scrolling=auto></iframe>");
-      outFile.println("</div>");
-      makeFragmentsHtml("fragmentsBreakdown.html");
-    }
-
-    outFile.println("  </body>");
-    outFile.println("</html>");
-    outFile.close();
-    
-  }
-
-  
   private static void makePackageHtml(String outFileName) throws IOException{
     
     
@@ -163,6 +53,7 @@
     outFile.println("<head>");
     outFile.println("<meta http-equiv=\"content-type\" content=\"text/html;charset=ISO-8859-1\">");
     outFile.println("<link rel=\"stylesheet\" href=\"roundedCorners.css\" media=\"screen\">");
+
     outFile.println("</head>");
     outFile.println("<body>");
 
@@ -206,19 +97,47 @@
     
   }
   
-  
   private static void makeFragmentsHtml(String outFileName) throws IOException{
     
-    TreeMap<Float, Integer> sortedFragments = new TreeMap<Float, Integer>(Collections.reverseOrder());
+    // TreeMap<Float, Integer> sortedFragments = new TreeMap<Float, Integer>(Collections.reverseOrder());
+    TreeMap<Float, String> sortedSplitPoints = new TreeMap<Float, String>(Collections.reverseOrder());
     float maxSize = 0f;
     float sumSize = 0f;
-    for (Integer fragmentName : GlobalInformation.fragmentToPartialSize.keySet()){
+    
+    // initial fragment
+    float initialSize = GlobalInformation.fragmentToPartialSize.get(0);
+    sumSize += initialSize;
+    maxSize = initialSize;
+    sortedSplitPoints.put(initialSize, "initialDownload");
+    
+    // all fragments that are not in the initial load order
+    float allOtherFragmentsSize = GlobalInformation.allOtherFragmentsPartialSize;
+    sumSize += allOtherFragmentsSize;
+    if (allOtherFragmentsSize > maxSize){
+      maxSize = allOtherFragmentsSize;
+    }
+    sortedSplitPoints.put(allOtherFragmentsSize, "allOtherFragments");
+    
+    // all exclusive fragments
+    System.out.println("");
+    for (Integer splitPointId : GlobalInformation.splitPointToLocation.keySet()){
+      System.out.println("splitPointId is: " + splitPointId);
+      Float sizeOfCurExclusiveFrag = GlobalInformation.fragmentToPartialSize.get(splitPointId);
+      sortedSplitPoints.put(sizeOfCurExclusiveFrag, GlobalInformation.splitPointToLocation.get(splitPointId));
+      sumSize += sizeOfCurExclusiveFrag;
+      if (sizeOfCurExclusiveFrag > maxSize){
+        maxSize = sizeOfCurExclusiveFrag;
+      }
+    }
+    
+    
+/*    for (Integer fragmentName : GlobalInformation.fragmentToPartialSize.keySet()){
       sortedFragments.put(GlobalInformation.fragmentToPartialSize.get(fragmentName), fragmentName);
       sumSize += GlobalInformation.fragmentToPartialSize.get(fragmentName);
       if (GlobalInformation.fragmentToPartialSize.get(fragmentName) > maxSize){
         maxSize = GlobalInformation.fragmentToPartialSize.get(fragmentName);
       }
-    }
+    }*/
     
     final PrintWriter outFile = new PrintWriter(outFileName);
     
@@ -232,10 +151,13 @@
     outFile.println("<body>");
 
     int yOffset = 0;
-    for (Float size : sortedFragments.keySet()){
-      
-      Integer fragmentName = sortedFragments.get(size);
-      String drillDownFileName = "fragment" + Integer.toString(fragmentName) + "Classes.html";
+    //for (Float size : sortedFragments.keySet()){
+    for (Float size : sortedSplitPoints.keySet()){
+    
+      // Integer fragmentName = sortedFragments.get(size);
+      String splitPointName = sortedSplitPoints.get(size);
+      // String drillDownFileName = "fragment" + Integer.toString(fragmentName) + "Classes.html";
+      String drillDownFileName = "splitPoint" + splitPointName + "Classes.html";
       
       float ratio = (size / maxSize) * 79;
       
@@ -260,8 +182,9 @@
       outFile.printf("<div class=\"barlabel\" style=\"top:" + yOffsetText + "px; left:5px;\">%.1f</div>\n", size);
       outFile.printf("<div class=\"barlabel\" style=\"top:" + yOffsetText + "px; left:80px;\">%.1f", perc);
       outFile.println("%</div>\n");
-      outFile.println("<div class=\"barlabel\" style=\"top:" + yOffsetText + "px; left:120px;\"><a href=\"" + drillDownFileName + "\" target=\"_top\">fragment"+ Integer.toString(fragmentName) +"</a></div>");
-      
+      // outFile.println("<div class=\"barlabel\" style=\"top:" + yOffsetText + "px; left:120px;\"><a href=\"" + drillDownFileName + "\" target=\"_top\">fragment"+ Integer.toString(fragmentName) +"</a></div>");
+      outFile.println("<div class=\"barlabel\" style=\"top:" + yOffsetText + "px; left:120px;\"><a href=\"" + drillDownFileName + "\" target=\"_top\">"+ splitPointName +"</a></div>");
+       
       yOffset = yOffset + 25;
 
     }
@@ -270,10 +193,7 @@
     outFile.close();
     
   }
-  
 
-  
-  
   private static void makeCodeTypeHtml(String outFileName, HashMap<String, CodeCollection> nameToCodeColl) throws IOException{
     
     
@@ -345,8 +265,6 @@
     
   }
   
-
-
   private static void makeLiteralsHtml(String outFileName, TreeMap<String, LiteralsCollection> nameToLitColl) throws IOException{
     
 
@@ -418,7 +336,6 @@
     
   }
   
-
   private static void makeStringLiteralsHtml(String outFileName, TreeMap<String, LiteralsCollection> nameToLitColl) throws IOException{
 
     final PrintWriter outFile = new PrintWriter(outFileName);
@@ -499,137 +416,44 @@
     outFile.close();
   }
   
-  
-
-  public static void makePackageClassesHtmls() throws IOException{
-        
-    for (String packageName : GlobalInformation.packageToClasses.keySet()){
-      
-      String outFileName = packageName + "Classes.html";
-      TreeMap<Float, String> sortedClasses = new TreeMap<Float, String>(Collections.reverseOrder());
-      float maxSize = 0f;
-      
-      //TODO(kprobst): not currently used, but will be for dependencies
-      int maxDepCount = 1;
-
-      for (String className : GlobalInformation.packageToClasses.get(packageName)){
-        
-        float curSize = 0f;
-        if (! GlobalInformation.classToPartialSize.containsKey(className)){
-          System.err.println("*** NO PARTIAL SIZE FOUND FOR CLASS " + className + " *****");
-        }
-        else{
-          curSize = GlobalInformation.classToPartialSize.get(className);
-        }
-          
-        //TODO(kprobst): not currently used, but will be for dependencies
-        int depCount = 0;
-        if (GlobalInformation.classToWhatItDependsOn.containsKey(className)){
-          depCount = GlobalInformation.classToWhatItDependsOn.get(className).size();
-        }
-        
-        if (curSize != 0f){
-          
-          sortedClasses.put(curSize, className);
-          if (curSize > maxSize){
-            maxSize = curSize;
-          }
-          //TODO(kprobst): not currently used, but will be for dependencies
-          if (depCount > maxDepCount){
-            maxDepCount = depCount;
-          }
-        }
+  public static void copyFileOrDirectory(File srcPath, File dstPath) throws IOException{
+    if (srcPath.isDirectory()){
+      if (!dstPath.exists()){
+        dstPath.mkdir();
+     }
+     String files[] = srcPath.list();
+     for(int i = 0; i < files.length; i++){
+        copyFileOrDirectory(new File(srcPath, files[i]), new File(dstPath, files[i]));
       }
-      
-        
-      final PrintWriter outFile = new PrintWriter(outFileName);
-      
-      outFile.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"");
-      outFile.println("\"http://www.w3.org/TR/html4/strict.dtd\">");
-      outFile.println("<html>");
-      outFile.println("<head>");
-      outFile.println("<meta http-equiv=\"content-type\" content=\"text/html;charset=ISO-8859-1\">");
-      outFile.println("<link rel=\"stylesheet\" href=\"classLevel.css\" media=\"screen\">");
-      outFile.println("<title>Classes in package \"" + packageName + "\"</title>");
-      outFile.println("</head>");
-      outFile.println("<body>");
-      
-
-      outFile.println("<center>");
-      outFile.println("<h2>Classes in package \"" + packageName + "\"</h2>");
-      outFile.println("</center>");
-      outFile.println("<hr>");
-
-      outFile.println("<div style=\"width:90%; height:80%; overflow-y:auto; overflow-x:auto; top: 90px; left:70px; position:absolute; background-color:white\"");
-
-  
-      int yOffset = 0;
-      for (Float size : sortedClasses.keySet()){
-        
-        String className = sortedClasses.get(size);
-        
-        //TODO(kprobst): switch out the commented/uncommented lines below when showing dependencies
-        float ratio = (size / maxSize) * 45;
-        //float ratio = (size / maxSize) * 85;
-         
-        if (ratio < 3){
-          ratio = 3;
-        }
-        
-        //TODO(kprobst): not currently used, but will be for dependencies
-       // get the dependency count
-        int depCount = 0;
-        if (GlobalInformation.classToWhatItDependsOn.containsKey(className)){
-          depCount = GlobalInformation.classToWhatItDependsOn.get(className).size();
-        }
-        float depRatio = ((float)depCount / (float)maxDepCount) * 45f;
-        if (depRatio < 3.0){
-          depRatio = 3;
-        }
-  
-        outFile.println("<div class=\"box\" style=\"width:" + ratio + "%; top: " + yOffset + "px; left: 60px;\">");
-        outFile.println("<div id=\"lb\">");
-        outFile.println("<div id=\"rb\">");
-        outFile.println("<div id=\"bb\"><div id=\"blc\"><div id=\"brc\">");
-        outFile.println("<div id=\"tb\"><div id=\"tlc\"><div id=\"trc\">");
-        outFile.println("<div id=\"content\">");
-        outFile.println("</div>");
-        outFile.println("</div></div></div></div>");
-        outFile.println("</div></div></div></div>");
-        outFile.println("</div>");
-        
-        
-        //TODO(kprobst): not currently used, but will be for dependencies
-        // place holder for mock-up of dependency display  
-        outFile.println("<div class=\"box-right\" style=\"width:" + depRatio + "%; top: " + yOffset + "px; left: 50%\">");
-        outFile.println("<div id=\"lb\">");
-        outFile.println("<div id=\"rb\">");
-        outFile.println("<div id=\"bb\"><div id=\"blc\"><div id=\"brc\">");
-        outFile.println("<div id=\"tb\"><div id=\"tlc\"><div id=\"trc\">");
-        outFile.println("<div id=\"content\">");
-        outFile.println("</div>");
-        outFile.println("</div></div></div></div>");
-        outFile.println("</div></div></div></div>");
-        outFile.println("</div>");
-              
-        int yOffsetText = yOffset+8;
-        outFile.printf("<div class=\"barlabel\" style=\"top:" + yOffsetText + "px; left:5px;\">%.1f</div>\n", size);
-        outFile.println("<div class=\"barlabel\" style=\"top:" + yOffsetText + "px; left:70px;\">"+className+"</div>");
-        //TODO(kprobst) make this a link
-        String drillDownFileName = className + "Deps.html";
-        outFile.println("<div class=\"barlabel\" style=\"top:" + yOffsetText + "px; left:50%;\"><a href=\"" + drillDownFileName + "\" target=\"_top\">Dependencies: " + depCount + "</a></div>");
-        
-        yOffset = yOffset + 25;
-  
-      }
-      
-      outFile.println("</div>");
-      outFile.println("</body>");
-      outFile.println("</html>");
-      outFile.close();
     }
+   else{
+      if(!srcPath.exists()){
+        System.out.println("File or directory does not exist.");
+       System.exit(0);
+      }    
+      else{
+        InputStream in = new FileInputStream(srcPath);
+        OutputStream out = new FileOutputStream(dstPath); 
+        // Transfer bytes from in to out
+        byte[] buf = new byte[1024];
+        int len;
+        while ((len = in.read(buf)) > 0) {
+          out.write(buf, 0, len);
+        }
+        in.close();
+        out.close();
+        }
+     }
   }
-  
+
+  public static String escapeXml(String unescaped) {
+    String escaped = unescaped.replaceAll("\\&", "&amp;");
+    escaped = escaped.replaceAll("\\<", "&lt;");
+    escaped = escaped.replaceAll("\\>", "&gt;");
+    escaped = escaped.replaceAll("\\\"", "&quot;");
+    escaped = escaped.replaceAll("\\'", "&apos;");
+    return escaped;
+  }
 
   public static void makeCodeTypeClassesHtmls(HashMap<String, CodeCollection> nameToCodeColl) throws IOException{
     
@@ -643,7 +467,7 @@
       TreeMap<Float, String> sortedClasses = new TreeMap<Float, String>(Collections.reverseOrder());
       for (String className : nameToCodeColl.get(codeType).classes){
         if (GlobalInformation.classToPartialSize.containsKey(className)){
-
+  
           float curSize = 0f;
           if (! GlobalInformation.classToPartialSize.containsKey(className)){
             System.err.println("*** NO PARTIAL SIZE FOUND FOR CLASS " + className + " *****");
@@ -667,7 +491,7 @@
       outFile.println("\"http://www.w3.org/TR/html4/strict.dtd\">");
       outFile.println("<html>");
       outFile.println("<head>");
-
+  
       outFile.println("<style type=\"text/css\">");
       outFile.println("body {background-color: #728FCE}");
       outFile.println("h2 {background-color: transparent}");
@@ -680,15 +504,15 @@
       outFile.println("</head>");
       outFile.println("<body>");
       
-
-
+  
+  
       outFile.println("<center>");
       outFile.println("<h2>Classes of type \"" + codeType + "\"</h2>");
       outFile.println("</center>");
       outFile.println("<hr>");
-
+  
       outFile.println("<div style=\"width:90%; height:80%; overflow-y:auto; overflow-x:auto; top: 90px; left:70px; position:absolute; background-color:white\"");
-
+  
   
       int yOffset = 0;
       for (Float size : sortedClasses.keySet()){
@@ -727,6 +551,262 @@
     }    
   }
 
+  public static void makeDependenciesTableHtmls() throws IOException{
+  
+    for (String className : GlobalInformation.classToWhatItDependsOn.keySet()){
+          
+      String outFileName = className + "Deps.html";
+      final PrintWriter outFile = new PrintWriter(outFileName);
+      
+      outFile.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"");
+      outFile.println("\"http://www.w3.org/TR/html4/strict.dtd\">");
+      outFile.println("<html>");
+      outFile.println("<head>");
+      outFile.println("<meta http-equiv=\"content-type\" content=\"text/html;charset=ISO-8859-1\">");
+      outFile.println("<title>Classes that \"" + className + "\" depends on</title>");
+      outFile.println("</head>");
+  
+      outFile.println("<style type=\"text/css\">");
+      outFile.println("body {background-color: #728FCE}");
+      outFile.println("h2 {background-color: transparent}");
+      outFile.println("p {background-color: fuchsia}");
+      outFile.println("</style>");
+      
+      outFile.println("<body>");
+      outFile.println("<center>");
+      outFile.println("<h2>Classes that \"" + className + "\" depends on</h2>");
+      outFile.println("</center>");
+      outFile.println("<hr>");
+      
+      outFile.println("<center>");
+      outFile.println("<table border=\"1\" width=\"80%\" style=\"font-size: 11pt;\" bgcolor=\"white\">");
+      
+      for (String depClassName : GlobalInformation.classToWhatItDependsOn.get(className)){
+        
+          outFile.println("<tr>");
+          outFile.println("<td width=\"80%\">" + depClassName + "</td>");
+          outFile.println("</tr>");
+          
+      }
+  
+      outFile.println("</table>");
+      outFile.println("<center>");
+      
+      outFile.println("</div>");
+      outFile.println("</body>");
+      outFile.println("</html>");
+      outFile.close();
+    }
+  }
+
+  /**
+   * Makes html file for fragment classes. 
+   * TODO(kprobst): update this once we have SOYC updated to supply enough information
+   * @throws IOException
+   */
+  public static void makeFragmentClassesHtmls() throws IOException{
+    
+    
+    for (Integer fragmentName : GlobalInformation.fragmentToStories.keySet()){
+      HashSet<String> alreadyPrintedClasses = new HashSet<String>();
+      
+      String outFileName = "fragment" + Integer.toString(fragmentName) + "Classes.html";
+      
+      final PrintWriter outFile = new PrintWriter(outFileName);
+      
+      outFile.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"");
+      outFile.println("\"http://www.w3.org/TR/html4/strict.dtd\">");
+      outFile.println("<html>");
+      outFile.println("<head>");
+      outFile.println("<meta http-equiv=\"content-type\" content=\"text/html;charset=ISO-8859-1\">");
+      outFile.println("<title>Classes correlated with fragment " + Integer.toString(fragmentName) + " </title>");
+      outFile.println("</head>");
+  
+      outFile.println("<style type=\"text/css\">");
+      outFile.println("body {background-color: #728FCE}");
+      outFile.println("h2 {background-color: transparent}");
+      outFile.println("p {background-color: fuchsia}");
+      outFile.println(".tablediv {");
+      outFile.println("display:  table;");
+      outFile.println("width:100%;");
+      outFile.println("background-color:#eee;");
+      outFile.println("border:1px solid  #666666;");
+      outFile.println("border-spacing:5px;/*cellspacing:poor IE support for  this*/");
+      outFile.println("border-collapse:separate;");
+      outFile.println("}");
+      outFile.println(".celldiv {");
+      outFile.println("float:left;/*fix for  buggy browsers*/");
+      outFile.println("display:  table-cell;");
+      outFile.println("width:49.5%;");
+      outFile.println("font-size: 14px;");
+      outFile.println("background-color:white;");
+      outFile.println("}");
+      outFile.println(".rowdiv  {");
+      outFile.println("display:  table-row;");
+      outFile.println("width:100%;");
+      outFile.println("}");
+      outFile.println("</style>");
+      
+      outFile.println("<body>");
+      outFile.println("<center>");
+      outFile.println("<h2>Classes correlated with fragment " + Integer.toString(fragmentName) + "</h2>");
+      outFile.println("</center>");
+      outFile.println("<hr>");
+      
+      outFile.println("<div style=\"width:90%; height:80%; overflow-y:auto; overflow-x:auto; top: 30px; left:60px; position:relative; background-color:white\"");  
+      outFile.println("<div  class=\"tablediv\">");      
+      
+      for (String storyName : GlobalInformation.fragmentToStories.get(fragmentName)){
+        if (GlobalInformation.storiesToCorrClasses.containsKey(storyName)){
+          for (String className : GlobalInformation.storiesToCorrClasses.get(storyName)){
+  
+            if (! alreadyPrintedClasses.contains(className)){
+              //outFile.println("<div class=\"rowdiv\">");   
+              outFile.println("<div  class=\"rowdiv\">" + className + "</div>");
+              //outFile.println("</div>");
+              alreadyPrintedClasses.add(className);
+            }
+          }
+        }
+      }
+      outFile.println("</div>");
+      outFile.println("</body>");
+      outFile.println("</html>");
+      outFile.close();
+     }
+  }
+
+  public static void makeHTMLShell(HashMap<String, CodeCollection> nameToCodeColl, TreeMap<String, LiteralsCollection> nameToLitColl) throws IOException{
+    //this will contain the place holder iframes where the actual information is going to go.
+    
+    // copy from the bin directory to the current directory
+    String classPath = System.getProperty("java.class.path");
+    if (!classPath.endsWith("/")){
+      classPath += "/";
+    }
+    File inputFile = new File(classPath + "roundedCorners.css");
+    File outputFile = new File("roundedCorners.css");
+    copyFileOrDirectory(inputFile, outputFile);
+  
+    File inputFile2 = new File(classPath + "classLevel.css");
+    File outputFile2 = new File("classLevel.css");
+    copyFileOrDirectory(inputFile2, outputFile2);
+  
+    File inputDir = new File(classPath + "images");
+    File outputDir = new File("images");
+    copyFileOrDirectory(inputDir, outputDir);
+    
+    
+    String fileName = "SoycDashboard-index.html";
+    
+    final PrintWriter outFile = new PrintWriter(fileName);
+    outFile.println("<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">");
+    outFile.println("<html>");
+    outFile.println("<head>");
+    outFile.println("<title>Story of Your Compile - Top Level Dashboard for Permutation</title>");
+    
+    outFile.println("<style type=\"text/css\">");
+    outFile.println("body {background-color: #728FCE}");
+    outFile.println("h2 {background-color: transparent}");
+    outFile.println("p {background-color: fuchsia}");
+    outFile.println("</style>");
+    outFile.println("</head>");
+    
+    
+    outFile.println("<body>");
+    outFile.println("<center>");
+    outFile.println("<h3>Story of Your Compile Dashboard</h3>");
+    outFile.println("<hr>");
+    if (GlobalInformation.fragmentToStories.size() > 1){
+      outFile.println("<b>Full code size: <span style=\"color:maroon\">" + GlobalInformation.cumSizeAllCode + "</span>, Size of Initial Download:  <span style=\"color:maroon\">" + GlobalInformation.fragmentToPartialSize.get(0) + "</span></b>");
+    }
+    else{
+      outFile.println("<b>Full code size: <span style=\"color:maroon\">" + GlobalInformation.cumSizeAllCode + "</span></b>");
+    }
+    outFile.println("</center>");
+    outFile.println("  <div style=\"width:50%;  float:left; padding-top: 10px;\">");
+    outFile.println("<b>Package breakdown</b>");
+    outFile.println("    </div>");
+    outFile.println("  <div style=\"width:48%;  float:right; padding-top: 10px; \">");
+    outFile.println("<b>Code type breakdown</b>");
+    outFile.println("    </div>");
+    
+  
+    outFile.println("  <div style=\"width:50%;  float:left; padding-top: 10px;\">");
+    outFile.println("<div style=\"width: 110px; float: left; font-size:16px;\">Size</div>");
+    outFile.println("<div style=\"width: 200px; float: left; text-align:left; font-size:16px; \">Package Name</div>");
+    outFile.println("    </div>");
+    
+    
+    outFile.println("  <div style=\"width:48%;  float:right; padding-top: 10px;\">");
+    outFile.println("<div style=\"width: 110px; float: left; font-size:16px;\">Size</div>");
+    outFile.println("<div style=\"width: 200px; float: left; text-align:left; font-size:16px; \">Code Type</div>");
+    outFile.println("    </div>");
+    
+    
+    
+    outFile.println("<div style=\"height:35%; width:48%; margin:0 auto; background-color:white; float:left;\">");
+    outFile.println("<iframe src=\"packageBreakdown.html\" width=100% height=100% scrolling=auto></iframe>");
+    outFile.println("  </div>");
+    makePackageHtml("packageBreakdown.html");
+    
+    outFile.println("<div style=\"height:35%; width:48%; margin:0 auto; background-color:white; float:right;\">");
+    outFile.println("<iframe src=\"codeTypeBreakdown.html\" width=100% height=100% scrolling=auto></iframe>");
+    outFile.println("  </div>");
+    makeCodeTypeHtml("codeTypeBreakdown.html", nameToCodeColl);
+    
+    outFile.println("  <div style=\"width:50%;  float:left; padding-top: 10px;\">");
+    outFile.println("<b>Literals breakdown</b>");
+    outFile.println("    </div>");
+    outFile.println("  <div style=\"width:48%;  float:right; padding-top: 10px;  \">");
+    outFile.println("<b>String literals breakdown</b>");
+    outFile.println("    </div>");
+    
+  
+    outFile.println("  <div style=\"width:50%;  float:left; padding-top: 10px;\">");
+    outFile.println("<div style=\"width: 110px; float: left; font-size:16px;\">Size</div>");
+    outFile.println("<div style=\"width: 200px; float: left; text-align:left; font-size:16px; \">Literal Type</div>");
+    outFile.println("    </div>");
+    
+    
+    outFile.println("  <div style=\"width:48%;  float:right; padding-top: 10px; \">");
+    outFile.println("<div style=\"width: 110px; float: left; font-size:16px;\">Size</div>");
+    outFile.println("<div style=\"width: 200px; float: left; text-align:left; font-size:16px; \">String Literal Type</div>");
+    outFile.println("    </div>");
+    
+    
+    outFile.println("<div style=\"height:35%; width:48%; margin:0 auto; background-color:white; float:left;\">");
+    outFile.println("<iframe src=\"literalsBreakdown.html\" width=100% height=100% scrolling=auto></iframe>");
+    outFile.println("</div>");
+    makeLiteralsHtml("literalsBreakdown.html", nameToLitColl);
+  
+    outFile.println("<div style=\"height:35%; width:48%; margin:0 auto; background-color:white; float:right;\">");
+    outFile.println("<iframe src=\"stringLiteralsBreakdown.html\" width=100% height=100% scrolling=auto></iframe>");
+    outFile.println("  </div>");
+    makeStringLiteralsHtml("stringLiteralsBreakdown.html", nameToLitColl);
+  
+  
+    if (GlobalInformation.fragmentToStories.size() > 1){
+      outFile.println("  <div style=\"width:50%;  float:left; padding-top: 10px;\">");
+      outFile.println("<b>Breakdown by runAsync split points</b>");
+      outFile.println("    </div>");
+  
+      outFile.println("  <div style=\"width:100%;  float:left; padding-top: 10px;\">");
+      outFile.println("<div style=\"width: 110px; float: left; font-size:16px;\">Size</div>");
+      outFile.println("<div style=\"width: 200px; float: left; text-align:left; font-size:16px; \">Fragment Name</div>");
+      outFile.println("    </div>");
+      
+      outFile.println("<div style=\"height:35%; width:100%; margin:0 auto; background-color:white; float:left;\">");
+      outFile.println("<iframe src=\"fragmentsBreakdown.html\" width=100% height=100% scrolling=auto></iframe>");
+      outFile.println("</div>");
+      makeFragmentsHtml("fragmentsBreakdown.html");
+    }
+  
+    outFile.println("  </body>");
+    outFile.println("</html>");
+    outFile.close();
+    
+  }
 
   public static void makeLiteralsClassesTableHtmls(TreeMap<String, LiteralsCollection> nameToLitColl) throws IOException{
 
@@ -938,19 +1018,47 @@
      }
   }
 
-  /**
-   * Makes html file for fragment classes. 
-   * TODO(kprobst): update this once we have SOYC updated to supply enough information
-   * @throws IOException
-   */
-  public static void makeFragmentClassesHtmls() throws IOException{
-    
-    
-    for (Integer fragmentName : GlobalInformation.fragmentToStories.keySet()){
-      HashSet<String> alreadyPrintedClasses = new HashSet<String>();
+  public static void makePackageClassesHtmls() throws IOException{
+        
+    for (String packageName : GlobalInformation.packageToClasses.keySet()){
       
-      String outFileName = "fragment" + Integer.toString(fragmentName) + "Classes.html";
+      String outFileName = packageName + "Classes.html";
+      TreeMap<Float, String> sortedClasses = new TreeMap<Float, String>(Collections.reverseOrder());
+      float maxSize = 0f;
       
+      //TODO(kprobst): not currently used, but will be for dependencies
+      int maxDepCount = 1;
+  
+      for (String className : GlobalInformation.packageToClasses.get(packageName)){
+        
+        float curSize = 0f;
+        if (! GlobalInformation.classToPartialSize.containsKey(className)){
+          System.err.println("*** NO PARTIAL SIZE FOUND FOR CLASS " + className + " *****");
+        }
+        else{
+          curSize = GlobalInformation.classToPartialSize.get(className);
+        }
+          
+        //TODO(kprobst): not currently used, but will be for dependencies
+        int depCount = 0;
+        if (GlobalInformation.classToWhatItDependsOn.containsKey(className)){
+          depCount = GlobalInformation.classToWhatItDependsOn.get(className).size();
+        }
+        
+        if (curSize != 0f){
+          
+          sortedClasses.put(curSize, className);
+          if (curSize > maxSize){
+            maxSize = curSize;
+          }
+          //TODO(kprobst): not currently used, but will be for dependencies
+          if (depCount > maxDepCount){
+            maxDepCount = depCount;
+          }
+        }
+      }
+      
+        
       final PrintWriter outFile = new PrintWriter(outFileName);
       
       outFile.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"");
@@ -958,64 +1066,250 @@
       outFile.println("<html>");
       outFile.println("<head>");
       outFile.println("<meta http-equiv=\"content-type\" content=\"text/html;charset=ISO-8859-1\">");
-      outFile.println("<title>Classes correlated with fragment " + Integer.toString(fragmentName) + " </title>");
+      outFile.println("<link rel=\"stylesheet\" href=\"classLevel.css\" media=\"screen\">");
+      outFile.println("<title>Classes in package \"" + packageName + "\"</title>");
       outFile.println("</head>");
-
-      outFile.println("<style type=\"text/css\">");
-      outFile.println("body {background-color: #728FCE}");
-      outFile.println("h2 {background-color: transparent}");
-      outFile.println("p {background-color: fuchsia}");
-      outFile.println(".tablediv {");
-      outFile.println("display:  table;");
-      outFile.println("width:100%;");
-      outFile.println("background-color:#eee;");
-      outFile.println("border:1px solid  #666666;");
-      outFile.println("border-spacing:5px;/*cellspacing:poor IE support for  this*/");
-      outFile.println("border-collapse:separate;");
-      outFile.println("}");
-      outFile.println(".celldiv {");
-      outFile.println("float:left;/*fix for  buggy browsers*/");
-      outFile.println("display:  table-cell;");
-      outFile.println("width:49.5%;");
-      outFile.println("font-size: 14px;");
-      outFile.println("background-color:white;");
-      outFile.println("}");
-      outFile.println(".rowdiv  {");
-      outFile.println("display:  table-row;");
-      outFile.println("width:100%;");
-      outFile.println("}");
-      outFile.println("</style>");
-      
       outFile.println("<body>");
+      
+  
       outFile.println("<center>");
-      outFile.println("<h2>Classes correlated with fragment " + Integer.toString(fragmentName) + "</h2>");
+      outFile.println("<h2>Classes in package \"" + packageName + "\"</h2>");
       outFile.println("</center>");
       outFile.println("<hr>");
-      
-      outFile.println("<div style=\"width:90%; height:80%; overflow-y:auto; overflow-x:auto; top: 30px; left:60px; position:relative; background-color:white\"");  
-      outFile.println("<div  class=\"tablediv\">");      
-      
-      for (String storyName : GlobalInformation.fragmentToStories.get(fragmentName)){
-        if (GlobalInformation.storiesToCorrClasses.containsKey(storyName)){
-          for (String className : GlobalInformation.storiesToCorrClasses.get(storyName)){
   
-            if (! alreadyPrintedClasses.contains(className)){
-              //outFile.println("<div class=\"rowdiv\">");   
-              outFile.println("<div  class=\"rowdiv\">" + className + "</div>");
-              //outFile.println("</div>");
-              alreadyPrintedClasses.add(className);
-            }
-          }
+      outFile.println("<div style=\"width:90%; height:80%; overflow-y:auto; overflow-x:auto; top: 90px; left:70px; position:absolute; background-color:white\"");
+  
+  
+      int yOffset = 0;
+      for (Float size : sortedClasses.keySet()){
+        
+        String className = sortedClasses.get(size);
+        
+        //TODO(kprobst): switch out the commented/uncommented lines below when showing dependencies
+        float ratio = (size / maxSize) * 45;
+        //float ratio = (size / maxSize) * 85;
+         
+        if (ratio < 3){
+          ratio = 3;
         }
+        
+        //TODO(kprobst): not currently used, but will be for dependencies
+       // get the dependency count
+        int depCount = 0;
+        if (GlobalInformation.classToWhatItDependsOn.containsKey(className)){
+          depCount = GlobalInformation.classToWhatItDependsOn.get(className).size();
+        }
+        float depRatio = ((float)depCount / (float)maxDepCount) * 45f;
+        if (depRatio < 3.0){
+          depRatio = 3;
+        }
+  
+        outFile.println("<div class=\"box\" style=\"width:" + ratio + "%; top: " + yOffset + "px; left: 60px;\">");
+        outFile.println("<div id=\"lb\">");
+        outFile.println("<div id=\"rb\">");
+        outFile.println("<div id=\"bb\"><div id=\"blc\"><div id=\"brc\">");
+        outFile.println("<div id=\"tb\"><div id=\"tlc\"><div id=\"trc\">");
+        outFile.println("<div id=\"content\">");
+        outFile.println("</div>");
+        outFile.println("</div></div></div></div>");
+        outFile.println("</div></div></div></div>");
+        outFile.println("</div>");
+        
+        
+        //TODO(kprobst): not currently used, but will be for dependencies
+        // place holder for mock-up of dependency display  
+        outFile.println("<div class=\"box-right\" style=\"width:" + depRatio + "%; top: " + yOffset + "px; left: 50%\">");
+        outFile.println("<div id=\"lb\">");
+        outFile.println("<div id=\"rb\">");
+        outFile.println("<div id=\"bb\"><div id=\"blc\"><div id=\"brc\">");
+        outFile.println("<div id=\"tb\"><div id=\"tlc\"><div id=\"trc\">");
+        outFile.println("<div id=\"content\">");
+        outFile.println("</div>");
+        outFile.println("</div></div></div></div>");
+        outFile.println("</div></div></div></div>");
+        outFile.println("</div>");
+              
+        int yOffsetText = yOffset+8;
+        outFile.printf("<div class=\"barlabel\" style=\"top:" + yOffsetText + "px; left:5px;\">%.1f</div>\n", size);
+        outFile.println("<div class=\"barlabel\" style=\"top:" + yOffsetText + "px; left:70px;\">"+className+"</div>");
+        //TODO(kprobst) make this a link
+        String drillDownFileName = className + "Deps.html";
+        outFile.println("<div class=\"barlabel\" style=\"top:" + yOffsetText + "px; left:50%;\"><a href=\"" + drillDownFileName + "\" target=\"_top\">Dependencies: " + depCount + "</a></div>");
+        
+        yOffset = yOffset + 25;
+  
       }
+      
       outFile.println("</div>");
       outFile.println("</body>");
       outFile.println("</html>");
       outFile.close();
-     }
+    }
   }
 
+  /**
+   * Makes html file for fragment classes. 
+   * TODO(kprobst): update this once we have SOYC updated to supply enough information
+   * @throws IOException
+   */
+  public static void makeSplitPointClassesHtmls() throws IOException{
+    
+    //for the initial fragment and the fragments in the load order, we can print this immediately
+    // For those fragments *not* in the initial load order, we just collect and then print at the end
+    TreeSet<String> sortedClassesAndMethodsAllOtherFragments = new TreeSet<String>();
+        
+    for (Integer fragmentName : GlobalInformation.fragmentToStories.keySet()){
+         
+      if ((fragmentName != 0)&&(!GlobalInformation.splitPointToLocation.containsKey(fragmentName))){
+        
+        // get the stories from ALL the fragments
+        for (String storyName : GlobalInformation.fragmentToStories.get(fragmentName)){
+          if ((!GlobalInformation.nameToLitColl.get("string").storyToLocations.containsKey(storyName))&&(GlobalInformation.storiesToCorrClassesAndMethods.containsKey(storyName))){
+            for (String className : GlobalInformation.storiesToCorrClassesAndMethods.get(storyName)){
+                sortedClassesAndMethodsAllOtherFragments.add(className);
+            }
+          }
+        }
+      }
+      
+//      else if ((fragmentName == 0)||(GlobalInformation.splitPointToLocation.containsKey(fragmentName))){
+      else{
+        String curSplitPointLocation;
+        
+        if (fragmentName == 0){
+          curSplitPointLocation = "initialDownload";
+        }
+        else{
+          curSplitPointLocation = GlobalInformation.splitPointToLocation.get(fragmentName);
+        }
+        
+        String outFileName = "splitPoint" + curSplitPointLocation + "Classes.html";
+        
+        final PrintWriter outFile = new PrintWriter(outFileName);
+        
+        outFile.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"");
+        outFile.println("\"http://www.w3.org/TR/html4/strict.dtd\">");
+        outFile.println("<html>");
+        outFile.println("<head>");
+        outFile.println("<meta http-equiv=\"content-type\" content=\"text/html;charset=ISO-8859-1\">");
+        outFile.println("<title>Classes and methods in exclusives fragment for runAsync split point \"" + curSplitPointLocation + "\" </title>");
+        outFile.println("</head>");
   
+        outFile.println("<style type=\"text/css\">");
+        outFile.println("body {background-color: #728FCE}");
+        outFile.println("h2 {background-color: transparent}");
+        outFile.println("p {background-color: fuchsia}");
+        outFile.println(".tablediv {");
+        outFile.println("display:  table;");
+        outFile.println("width:100%;");
+        outFile.println("background-color:#eee;");
+        outFile.println("border:1px solid  #666666;");
+        outFile.println("border-spacing:5px;/*cellspacing:poor IE support for  this*/");
+        outFile.println("border-collapse:separate;");
+        outFile.println("}");
+        outFile.println(".celldiv {");
+        outFile.println("float:left;/*fix for  buggy browsers*/");
+        outFile.println("display:  table-cell;");
+        outFile.println("width:49.5%;");
+        outFile.println("font-size: 14px;");
+        outFile.println("background-color:white;");
+        outFile.println("}");
+        outFile.println(".rowdiv  {");
+        outFile.println("display:  table-row;");
+        outFile.println("width:100%;");
+        outFile.println("}");
+        outFile.println("</style>");
+        
+        outFile.println("<body>");
+        outFile.println("<center>");
+        outFile.println("<h2>Classes and methods in exclusives fragment for runAsync split point \"" + curSplitPointLocation + "\"</h2>");
+        outFile.println("</center>");
+        outFile.println("<hr>");
+        
+        outFile.println("<div style=\"width:90%; height:80%; overflow-y:auto; overflow-x:auto; top: 30px; left:60px; position:relative; background-color:white\"");  
+        outFile.println("<div  class=\"tablediv\">");  
+        
+        TreeSet<String> sortedClassesAndMethods = new TreeSet<String>();
+        for (String storyName : GlobalInformation.fragmentToStories.get(fragmentName)){
+          if ((!GlobalInformation.nameToLitColl.get("string").storyToLocations.containsKey(storyName))&&(GlobalInformation.storiesToCorrClassesAndMethods.containsKey(storyName))){
+            for (String className : GlobalInformation.storiesToCorrClassesAndMethods.get(storyName)){
+                sortedClassesAndMethods.add(className);
+            }
+          }
+        }
+        for (String classOrMethod : sortedClassesAndMethods){
+          outFile.println("<div  class=\"rowdiv\">" + classOrMethod + "</div>");
+        }
+        
+        outFile.println("</div>");
+        outFile.println("</body>");
+        outFile.println("</html>");
+        outFile.close();
+       }
+    }
+    
+    
+    //finally, make the file for all the other fragments
+    String outFileName = "splitPointAllOtherFragmentsClasses.html";
+    
+    final PrintWriter outFile = new PrintWriter(outFileName);
+
+    
+    outFile.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"");
+    outFile.println("\"http://www.w3.org/TR/html4/strict.dtd\">");
+    outFile.println("<html>");
+    outFile.println("<head>");
+    outFile.println("<meta http-equiv=\"content-type\" content=\"text/html;charset=ISO-8859-1\">");
+    outFile.println("<title>Classes and methods in exclusives fragment for runAsync split point \"allOtherFragments\" </title>");
+    outFile.println("</head>");
+
+    outFile.println("<style type=\"text/css\">");
+    outFile.println("body {background-color: #728FCE}");
+    outFile.println("h2 {background-color: transparent}");
+    outFile.println("p {background-color: fuchsia}");
+    outFile.println(".tablediv {");
+    outFile.println("display:  table;");
+    outFile.println("width:100%;");
+    outFile.println("background-color:#eee;");
+    outFile.println("border:1px solid  #666666;");
+    outFile.println("border-spacing:5px;/*cellspacing:poor IE support for  this*/");
+    outFile.println("border-collapse:separate;");
+    outFile.println("}");
+    outFile.println(".celldiv {");
+    outFile.println("float:left;/*fix for  buggy browsers*/");
+    outFile.println("display:  table-cell;");
+    outFile.println("width:49.5%;");
+    outFile.println("font-size: 14px;");
+    outFile.println("background-color:white;");
+    outFile.println("}");
+    outFile.println(".rowdiv  {");
+    outFile.println("display:  table-row;");
+    outFile.println("width:100%;");
+    outFile.println("}");
+    outFile.println("</style>");
+    
+    outFile.println("<body>");
+    outFile.println("<center>");
+    outFile.println("<h2>Classes and methods in exclusives fragment for runAsync split point \"allOtherFragments\"</h2>");
+    outFile.println("</center>");
+    outFile.println("<hr>");
+    
+    outFile.println("<div style=\"width:90%; height:80%; overflow-y:auto; overflow-x:auto; top: 30px; left:60px; position:relative; background-color:white\"");  
+    outFile.println("<div  class=\"tablediv\">");  
+    
+    for (String classOrMethod : sortedClassesAndMethodsAllOtherFragments){
+      outFile.println("<div  class=\"rowdiv\">" + classOrMethod + "</div>");
+    }
+    
+    outFile.println("</div>");
+    outFile.println("</body>");
+    outFile.println("</html>");
+    outFile.close();
+
+    
+    
+  }
+
   public static void makeStringLiteralsClassesHtmls(TreeMap<String, LiteralsCollection> nameToLitColl) throws IOException{
     
     
@@ -1129,11 +1423,6 @@
 
   }
   
-  
-  
-  
-  
-
   public static void makeStringLiteralsClassesTableHtmls(TreeMap<String, LiteralsCollection> nameToLitColl) throws IOException{
 
     
@@ -1242,68 +1531,4 @@
       outFile.close();
     }
   }
-
-  
-
-
-  public static void makeDependenciesTableHtmls() throws IOException{
-
-    for (String className : GlobalInformation.classToWhatItDependsOn.keySet()){
-          
-      String outFileName = className + "Deps.html";
-      final PrintWriter outFile = new PrintWriter(outFileName);
-      
-      outFile.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"");
-      outFile.println("\"http://www.w3.org/TR/html4/strict.dtd\">");
-      outFile.println("<html>");
-      outFile.println("<head>");
-      outFile.println("<meta http-equiv=\"content-type\" content=\"text/html;charset=ISO-8859-1\">");
-      outFile.println("<title>Classes that \"" + className + "\" depends on</title>");
-      outFile.println("</head>");
-
-      outFile.println("<style type=\"text/css\">");
-      outFile.println("body {background-color: #728FCE}");
-      outFile.println("h2 {background-color: transparent}");
-      outFile.println("p {background-color: fuchsia}");
-      outFile.println("</style>");
-      
-      outFile.println("<body>");
-      outFile.println("<center>");
-      outFile.println("<h2>Classes that \"" + className + "\" depends on</h2>");
-      outFile.println("</center>");
-      outFile.println("<hr>");
-      
-      outFile.println("<center>");
-      outFile.println("<table border=\"1\" width=\"80%\" style=\"font-size: 11pt;\" bgcolor=\"white\">");
-      
-      for (String depClassName : GlobalInformation.classToWhatItDependsOn.get(className)){
-        
-          outFile.println("<tr>");
-          outFile.println("<td width=\"80%\">" + depClassName + "</td>");
-          outFile.println("</tr>");
-          
-      }
-  
-      outFile.println("</table>");
-      outFile.println("<center>");
-      
-      outFile.println("</div>");
-      outFile.println("</body>");
-      outFile.println("</html>");
-      outFile.close();
-    }
-  }
-
-  
-  
-
-  public static String escapeXml(String unescaped) {
-    String escaped = unescaped.replaceAll("\\&", "&amp;");
-    escaped = escaped.replaceAll("\\<", "&lt;");
-    escaped = escaped.replaceAll("\\>", "&gt;");
-    escaped = escaped.replaceAll("\\\"", "&quot;");
-    escaped = escaped.replaceAll("\\'", "&apos;");
-    return escaped;
-  }
-
 }
diff --git a/tools/soyc-vis/src/com/google/gwt/soyc/SoycDashboard.java b/tools/soyc-vis/src/com/google/gwt/soyc/SoycDashboard.java
index 87d660a..4c8d760 100644
--- a/tools/soyc-vis/src/com/google/gwt/soyc/SoycDashboard.java
+++ b/tools/soyc-vis/src/com/google/gwt/soyc/SoycDashboard.java
@@ -45,56 +45,30 @@
     String inFileName = args[0];
     
     // to store literals data
-    final TreeMap<String, LiteralsCollection> nameToLitColl = new TreeMap<String, LiteralsCollection>();
-    nameToLitColl.put("long",new LiteralsCollection("long"));
-    nameToLitColl.put("null",new LiteralsCollection("null"));
-    nameToLitColl.put("class",new LiteralsCollection("class"));
-    nameToLitColl.put("int",new LiteralsCollection("int"));
-    nameToLitColl.put("string",new LiteralsCollection("string"));
-    nameToLitColl.put("number",new LiteralsCollection("number"));
-    nameToLitColl.put("boolean",new LiteralsCollection("boolean"));
-    nameToLitColl.put("double",new LiteralsCollection("double"));
-    nameToLitColl.put("char",new LiteralsCollection("char"));
-    nameToLitColl.put("undefined",new LiteralsCollection("undefined"));
-    nameToLitColl.put("float",new LiteralsCollection("float"));
+    GlobalInformation.nameToLitColl.put("long",new LiteralsCollection("long"));
+    GlobalInformation.nameToLitColl.put("null",new LiteralsCollection("null"));
+    GlobalInformation.nameToLitColl.put("class",new LiteralsCollection("class"));
+    GlobalInformation.nameToLitColl.put("int",new LiteralsCollection("int"));
+    GlobalInformation.nameToLitColl.put("string",new LiteralsCollection("string"));
+    GlobalInformation.nameToLitColl.put("number",new LiteralsCollection("number"));
+    GlobalInformation.nameToLitColl.put("boolean",new LiteralsCollection("boolean"));
+    GlobalInformation.nameToLitColl.put("double",new LiteralsCollection("double"));
+    GlobalInformation.nameToLitColl.put("char",new LiteralsCollection("char"));
+    GlobalInformation.nameToLitColl.put("undefined",new LiteralsCollection("undefined"));
+    GlobalInformation.nameToLitColl.put("float",new LiteralsCollection("float"));
     
     // to store code data
-    final HashMap<String, CodeCollection> nameToCodeColl = new HashMap<String, CodeCollection>();
-    nameToCodeColl.put("allOther", new CodeCollection("allOther"));
-    nameToCodeColl.put("widget", new CodeCollection("widget"));
-    nameToCodeColl.put("rpcUser", new CodeCollection("rpcUser"));
-    nameToCodeColl.put("rpcGen", new CodeCollection("rpcGen"));
-    nameToCodeColl.put("rpcGwt", new CodeCollection("rpcGwt"));
-    nameToCodeColl.put("gwtLang", new CodeCollection("long"));
-    nameToCodeColl.put("jre", new CodeCollection("jre"));
+    GlobalInformation.nameToCodeColl.put("allOther", new CodeCollection("allOther"));
+    GlobalInformation.nameToCodeColl.put("widget", new CodeCollection("widget"));
+    GlobalInformation.nameToCodeColl.put("rpcUser", new CodeCollection("rpcUser"));
+    GlobalInformation.nameToCodeColl.put("rpcGen", new CodeCollection("rpcGen"));
+    GlobalInformation.nameToCodeColl.put("rpcGwt", new CodeCollection("rpcGwt"));
+    GlobalInformation.nameToCodeColl.put("gwtLang", new CodeCollection("long"));
+    GlobalInformation.nameToCodeColl.put("jre", new CodeCollection("jre"));
     
-    // get the number of split points (so we know what code to ignore)
-    DefaultHandler fragmentCountHandler = scanXMLDocument();
-    
-    // start parsing
-    SAXParserFactory factory = SAXParserFactory.newInstance();
-    factory.setNamespaceAware(true);
-    try {
-      SAXParser saxParser = factory.newSAXParser();
-      InputStream in = new FileInputStream(inFileName);
-      if (inFileName.endsWith(".gz")) {
-        in = new GZIPInputStream(in);
-      }
-      in = new BufferedInputStream(in);
-      saxParser.parse(in,fragmentCountHandler);
-    } catch (ParserConfigurationException e) {
-      throw new RuntimeException("Could not parse document. ", e);
-    } catch (SAXException e) {
-      throw new RuntimeException("Could not create SAX parser. ", e);
-    } catch (FileNotFoundException e) {
-      throw new RuntimeException("Could not open file. ", e);
-    } catch (IOException e) {
-      throw new RuntimeException("Could not open file. ", e);
-    }
-    GlobalInformation.numSplitPoints = (int)((float)(GlobalInformation.numFragments - 1) / 3f);
     
     // make the parser handler
-    DefaultHandler handler = parseXMLDocument(nameToLitColl, nameToCodeColl);
+    DefaultHandler handler = parseXMLDocument(GlobalInformation.nameToLitColl, GlobalInformation.nameToCodeColl);
     
     
     // start parsing
@@ -119,17 +93,17 @@
     }
 
     // add to "All Other Code" if none of the special categories apply
-    updateAllOtherCodeType(nameToCodeColl);
+    updateAllOtherCodeType(GlobalInformation.nameToCodeColl);
     
     // now we need to aggregate numbers
     GlobalInformation.computePackageSizes();
     GlobalInformation.computePartialPackageSizes();
     
     // clean up the RPC categories
-    foldInRPCHeuristic(nameToCodeColl);
+    foldInRPCHeuristic(GlobalInformation.nameToCodeColl);
     
     // generate all the html files
-    makeHTMLFiles(nameToLitColl, nameToCodeColl); 
+    makeHTMLFiles(GlobalInformation.nameToLitColl, GlobalInformation.nameToCodeColl); 
     
     System.out.println("Finished creating reports. To see the dashboard, open SoycDashboard-index.html in your browser.");
   }
@@ -155,6 +129,7 @@
       boolean specialCodeType = false;
       StringBuilder valueBuilder = new StringBuilder();
       int ct = 0;
+      boolean fragmentInLoadOrder = false;
       
       /**
        * This method deals with the beginning of the XML element.
@@ -171,7 +146,11 @@
         
         valueBuilder.delete(0,valueBuilder.length());
         
-        if ((strippedName.compareTo("package") == 0)&&(attributes.getValue("id") != null)){
+        if (strippedName.compareTo("splitpoint") == 0){
+          System.out.println("about to process splitpoint");
+         parseSplitPoint(attributes); 
+        }        
+        else if ((strippedName.compareTo("package") == 0)&&(attributes.getValue("id") != null)){
           curPackage = attributes.getValue("id");
           
           if (curPackage.compareTo("") == 0){
@@ -221,12 +200,18 @@
             // ignore all code that is not in the first load order
             
             curFragment = Integer.parseInt(attributes.getValue("fragment"));
-            if(!((curFragment == 0)||(curFragment == (GlobalInformation.numSplitPoints+1))||(curFragment == (GlobalInformation.numSplitPoints+2))||
-                  ((curFragment >= 2) && (curFragment <= GlobalInformation.numSplitPoints)))){
-              curFragment = -1;
+            if((curFragment == 0)||
+                (curFragment == (GlobalInformation.numSplitPoints+1))||
+                (curFragment == (GlobalInformation.numSplitPoints+2))||
+                ((curFragment >= 2) && (curFragment <= GlobalInformation.numSplitPoints))){
+              fragmentInLoadOrder = true;
+            }
+            else{
+              fragmentInLoadOrder = false;
             }
           }
           else{
+           
             curFragment = -2;
           }
         }
@@ -258,30 +243,16 @@
         
         int numBytes = value.getBytes().length;
           
-        if ((curStoryRef != null)&&(curFragment != -1)){
+        if (curStoryRef != null){
           
-          if ((!GlobalInformation.storiesToLitType.containsKey(curStoryRef))&&(! GlobalInformation.storiesToCorrClasses.containsKey(curStoryRef))){
-             GlobalInformation.nonAttributedStories.add(curStoryRef);
-             GlobalInformation.nonAttributedBytes += numBytes;
-          }
-          
-          GlobalInformation.cumSizeAllCode += numBytes;
-          
-          if (curFragment == 0){
-            GlobalInformation.cumSizeInitialFragment += numBytes;
-          }
-          
-          // go through all the classes for this story
+          //add this size to the current fragment
           if (GlobalInformation.storiesToCorrClasses.containsKey(curStoryRef)){
             
-
             if ((GlobalInformation.storiesToLitType.containsKey(curStoryRef))&&(GlobalInformation.storiesToCorrClasses.get(curStoryRef).size() > 0)){
              GlobalInformation.numBytesDoubleCounted += numBytes;
             }
             
             float partialSize = (float)numBytes / (float)GlobalInformation.storiesToCorrClasses.get(curStoryRef).size();                               
-            
-            //add this size to the current fragment
             if (!GlobalInformation.fragmentToPartialSize.containsKey(curFragment)){
               GlobalInformation.fragmentToPartialSize.put(curFragment, partialSize);
             }
@@ -289,45 +260,55 @@
               float newSize = GlobalInformation.fragmentToPartialSize.get(curFragment) + partialSize;
               GlobalInformation.fragmentToPartialSize.put(curFragment, newSize);
             }
+                    
+            // now do different things depending on whether this fragment is in the load order or not
+            if (fragmentInLoadOrder == false){
+              GlobalInformation.allOtherFragmentsPartialSize += numBytes;
+            }
+            else{
+              GlobalInformation.cumSizeAllCode += numBytes;
+              
+              if ((!GlobalInformation.storiesToLitType.containsKey(curStoryRef))&&
+                  (!GlobalInformation.storiesToCorrClasses.containsKey(curStoryRef))){
+                 GlobalInformation.nonAttributedStories.add(curStoryRef);
+                 GlobalInformation.nonAttributedBytes += numBytes;
+              }
             
-            for (String className : GlobalInformation.storiesToCorrClasses.get(curStoryRef)){
-              // get the corresponding package
-              if (GlobalInformation.classToPackage.containsKey(className)){
-                String packageName = GlobalInformation.classToPackage.get(className);
-                
-                if (!GlobalInformation.packageToClasses.containsKey(packageName)){
-                  TreeSet<String> insertSet = new TreeSet<String>();
-                  insertSet.add(className);
-                  GlobalInformation.packageToClasses.put(packageName, insertSet);
-                }
-                else{
-                  GlobalInformation.packageToClasses.get(packageName).add(className);
-                }
-                
-                if (GlobalInformation.classToSize.containsKey(className)){
-                  int newSize = GlobalInformation.classToSize.get(className) + numBytes;
-                  GlobalInformation.classToSize.put(className, newSize);
-                }
-                else{
-                  GlobalInformation.classToSize.put(className, numBytes);  
-                }
-                
-                if (GlobalInformation.classToPartialSize.containsKey(className)){
-                  float newSize = GlobalInformation.classToPartialSize.get(className) + partialSize;
-                  GlobalInformation.classToPartialSize.put(className, newSize);
-                }
-                else{
-                  GlobalInformation.classToPartialSize.put(className, partialSize);  
+            
+              // go through all the classes for this story
+              for (String className : GlobalInformation.storiesToCorrClasses.get(curStoryRef)){
+                // get the corresponding package
+                if (GlobalInformation.classToPackage.containsKey(className)){
+                  String packageName = GlobalInformation.classToPackage.get(className);
+                  
+                  if (!GlobalInformation.packageToClasses.containsKey(packageName)){
+                    TreeSet<String> insertSet = new TreeSet<String>();
+                    insertSet.add(className);
+                    GlobalInformation.packageToClasses.put(packageName, insertSet);
+                  }
+                  else{
+                    GlobalInformation.packageToClasses.get(packageName).add(className);
+                  }
+                  
+                  if (GlobalInformation.classToSize.containsKey(className)){
+                    int newSize = GlobalInformation.classToSize.get(className) + numBytes;
+                    GlobalInformation.classToSize.put(className, newSize);
+                  }
+                  else{
+                    GlobalInformation.classToSize.put(className, numBytes);  
+                  }
+                  
+                  if (GlobalInformation.classToPartialSize.containsKey(className)){
+                    float newSize = GlobalInformation.classToPartialSize.get(className) + partialSize;
+                    GlobalInformation.classToPartialSize.put(className, newSize);
+                  }
+                  else{
+                    GlobalInformation.classToPartialSize.put(className, partialSize);  
+                  }
                 }
               }
             }
           }
-            
-
-/*          else{
-            System.err.println("----- NO CORR CLASSES FOUND FOR STORY " + curStoryRef + " ---------");
-          }*/
-                   
           updateLitTypes(nameToLitColl, value, numBytes);    
         }
       }
@@ -343,13 +324,10 @@
         int iNumCounted = 0;
         
         for (String relLitType : curRelevantLitTypes){
-          
           iNumCounted++;
           
           //then give string literals special treatment
           if (relLitType.compareTo("string") == 0){
-          
-           
             
             // note that this will double-count (i.e., it will count a string twice if it's in the output twice), as it should.
             nameToLitColl.get("string").cumStringSize += numBytes;
@@ -417,15 +395,11 @@
                 HashSet<String> insertSet = new HashSet<String>();
                 insertSet.add(mostAppropriateLocation);
                 nameToLitColl.get(relLitType).literalToLocations.put(value,insertSet);
-                
               }
             } 
           }
 
-          
-          
           else{
-
             // note that this will double-count (i.e., it will count a literal twice if it's in the output twice), as it should.
             nameToLitColl.get(relLitType).cumSize += numBytes;
             
@@ -442,9 +416,6 @@
             }
           }          
         }
-        
-        //System.out.println("value: |" + value + "| in story |" + curStoryRef + "| was counted " + iNumCounted + " times.");
-        
       }
       
       /* 
@@ -519,6 +490,30 @@
       }
 
       /*
+       * parses the split points
+       */
+      private void parseSplitPoint(Attributes attributes){
+        System.out.println("processing split point");
+        if (attributes.getValue("id") != null){
+          String curSplitPoint = attributes.getValue("id");
+          System.out.println("\tcurSplitPoint is: " + curSplitPoint);
+          if (attributes.getValue("location") != null){
+            String curSplitPointLocation = attributes.getValue("location");
+            
+            curSplitPointLocation = curSplitPointLocation.replaceAll("\\(L.*","");
+            
+            System.out.println("\tcurSplitPointLocation is: " + curSplitPointLocation);
+            GlobalInformation.splitPointToLocation.put(Integer.parseInt(curSplitPoint), curSplitPointLocation);
+            GlobalInformation.numSplitPoints++;
+            
+            System.out.println("adding split point and location: " + curSplitPoint + "-->" + curSplitPointLocation);
+            System.out.println("\t(Number of split points is now: " + GlobalInformation.numSplitPoints + ")");
+            
+          }
+        }
+      }
+      
+      /*
        * parses the "story" portion of the XML file
        */
       private void parseStory(Attributes attributes) {
@@ -542,14 +537,26 @@
           Attributes attributes) {
         
         if (attributes.getValue("idref") != null){
+          
+          String corrClassOrMethod = attributes.getValue("idref");
+          
           String corrClass = attributes.getValue("idref");
-        
-
+ 
           if (corrClass.contains(":")){
             corrClass = corrClass.replaceAll(":.*", "");
           }
-
+          
           if (GlobalInformation.classToPackage.containsKey(corrClass)){ //if we know about this class
+            
+            if (! GlobalInformation.storiesToCorrClassesAndMethods.containsKey(curStoryId)){
+              HashSet<String> insertSet = new HashSet<String>();
+              insertSet.add(corrClassOrMethod);
+              GlobalInformation.storiesToCorrClassesAndMethods.put(curStoryId, insertSet);
+            }
+            else{
+              GlobalInformation.storiesToCorrClassesAndMethods.get(curStoryId).add(corrClassOrMethod);
+            }
+            
   
             if (! GlobalInformation.storiesToCorrClasses.containsKey(curStoryId)){
               HashSet<String> insertSet = new HashSet<String>();
@@ -579,12 +586,10 @@
           String overriddenClass = attributes.getValue("idref");
           
 
+          //TODO(kprobst): fix this -- we either generalize to classes, or the numbers are messed up...
           if (overriddenClass.contains(":")){
             overriddenClass = overriddenClass.replaceAll(":.*", "");
           }
-          if (overriddenClass.contains("$")){
-            overriddenClass = overriddenClass.replaceAll("\\$.*", "");
-          }
           
           if (overriddenClass.compareTo("com.google.gwt.user.client.ui.UIObject") == 0){
             nameToCodeColl.get("widget").classes.add(curClassId);
@@ -630,7 +635,6 @@
       /*
        * parses the "depends on" portion of the XML file
        */
-      //TODO(kprobst): not currently used, but will be for dependencies
       private void parseDependsOn(final HashMap<String, CodeCollection> nameToCodeColl, Attributes attributes) {
         if (curFunctionId.compareTo("") == 0){
           if (attributes.getValue("idref") != null){
@@ -658,79 +662,6 @@
     return handler;
   }
   
-  
-  
-
-  private static DefaultHandler scanXMLDocument() {
-    
-    DefaultHandler handler = new DefaultHandler() {
-      
-
-      /**
-       * This method deals with the beginning of the XML element.
-       * It analyzes the XML node and adds its information to the relevant literal or code collection for later analysis.
-       * @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
-       */
-      @Override
-      public void startElement(String nsUri, String strippedName, String tagName, Attributes attributes) {
-      
-        if (strippedName.compareTo("js") == 0){
-          if (attributes.getValue("fragment") != null){
-            GlobalInformation.numFragments++;
-          }
-        }
-      }
-    };
-    
-    return handler;
-  }
-  
-
-  /*
-   * assigns code to "all other code" if none of the special categories apply
-   */
-  private static void updateAllOtherCodeType(final HashMap<String, CodeCollection> nameToCodeColl){
-    //all classes not in any of the other categories
-    for (String className : GlobalInformation.classToPackage.keySet()){
-      if ( (!nameToCodeColl.get("widget").classes.contains(className))&&
-          (!nameToCodeColl.get("rpcUser").classes.contains(className))&&
-          (!nameToCodeColl.get("rpcGwt").classes.contains(className))&&
-          (!nameToCodeColl.get("rpcGen").classes.contains(className))&&
-          (!nameToCodeColl.get("jre").classes.contains(className))&&
-          (!nameToCodeColl.get("gwtLang").classes.contains(className))){
-        nameToCodeColl.get("allOther").classes.add(className);
-      }
-    }
-  }
-
-  /*
-   * generates all the HTML files
-   */
-  private static void makeHTMLFiles(
-      final TreeMap<String, LiteralsCollection> nameToLitColl,
-      final HashMap<String, CodeCollection> nameToCodeColl) {
-
-    try {
-      MakeTopLevelHtmlForPerm.makePackageClassesHtmls();
-      MakeTopLevelHtmlForPerm.makeCodeTypeClassesHtmls(nameToCodeColl);
-      MakeTopLevelHtmlForPerm.makeLiteralsClassesTableHtmls(nameToLitColl);
-      MakeTopLevelHtmlForPerm.makeStringLiteralsClassesTableHtmls(nameToLitColl);
-      MakeTopLevelHtmlForPerm.makeFragmentClassesHtmls();
-      MakeTopLevelHtmlForPerm.makeDependenciesTableHtmls();
-
-      //make the shell last so we can display aggregate information here
-      MakeTopLevelHtmlForPerm.makeHTMLShell(nameToCodeColl, nameToLitColl);
-      
-      
-
-      
-
-    } catch (IOException e) {
-      throw new RuntimeException("Cannot open file. ", e);
-    }
-  }
-
-  
   /*
    * cleans up the RPC code categories
    */
@@ -741,7 +672,7 @@
      * application really is not using RPC
      */
     
-
+  
     if (nameToCodeColl.get("rpcGen").classes.size() == 0){
       
       for (String className : nameToCodeColl.get("rpcUser").classes){
@@ -760,14 +691,61 @@
           (! nameToCodeColl.get("gwtLang").classes.contains(className))){
           nameToCodeColl.get("allOther").classes.add(className);          
         } 
-
+  
       }
       nameToCodeColl.get("rpcGwt").classes.clear();
     }
             
-
-  }
   
+  }
+
+
+  /*
+   * generates all the HTML files
+   */
+  private static void makeHTMLFiles(
+      final TreeMap<String, LiteralsCollection> nameToLitColl,
+      final HashMap<String, CodeCollection> nameToCodeColl) {
+
+    try {
+      MakeTopLevelHtmlForPerm.makePackageClassesHtmls();
+      MakeTopLevelHtmlForPerm.makeCodeTypeClassesHtmls(nameToCodeColl);
+      MakeTopLevelHtmlForPerm.makeLiteralsClassesTableHtmls(nameToLitColl);
+      MakeTopLevelHtmlForPerm.makeStringLiteralsClassesTableHtmls(nameToLitColl);
+      // MakeTopLevelHtmlForPerm.makeFragmentClassesHtmls();
+      MakeTopLevelHtmlForPerm.makeSplitPointClassesHtmls();
+      MakeTopLevelHtmlForPerm.makeDependenciesTableHtmls();
+
+      //make the shell last so we can display aggregate information here
+      MakeTopLevelHtmlForPerm.makeHTMLShell(nameToCodeColl, nameToLitColl);
+      
+      
+
+      
+
+    } catch (IOException e) {
+      throw new RuntimeException("Cannot open file. ", e);
+    }
+  }
+
+  
+  /*
+   * assigns code to "all other code" if none of the special categories apply
+   */
+  private static void updateAllOtherCodeType(final HashMap<String, CodeCollection> nameToCodeColl){
+    //all classes not in any of the other categories
+    for (String className : GlobalInformation.classToPackage.keySet()){
+      if ( (!nameToCodeColl.get("widget").classes.contains(className))&&
+          (!nameToCodeColl.get("rpcUser").classes.contains(className))&&
+          (!nameToCodeColl.get("rpcGwt").classes.contains(className))&&
+          (!nameToCodeColl.get("rpcGen").classes.contains(className))&&
+          (!nameToCodeColl.get("jre").classes.contains(className))&&
+          (!nameToCodeColl.get("gwtLang").classes.contains(className))){
+        nameToCodeColl.get("allOther").classes.add(className);
+      }
+    }
+  }
+
 
   /*
    * unescape the JS snippets - in the XML file they are XML encoded for correct display, but this 
