diff --git a/Makefile b/Makefile
index 3e385b175..2cc886091 100644
--- a/Makefile
+++ b/Makefile
@@ -63,6 +63,7 @@ bundle: | $(BUILD_DIR)
 	@cd src; \
 	cat $(PDF_JS_FILES) > all_files.tmp; \
 	sed '/PDFJSSCRIPT_INCLUDE_ALL/ r all_files.tmp' pdf.js > ../$(BUILD_TARGET); \
+	sed -i '' "s/PDFJSSCRIPT_BUNDLE_VER/`git log --format="%H" -n 1`/" ../$(BUILD_TARGET); \
 	rm -f *.tmp; \
 	cd ..
 
diff --git a/README.md b/README.md
index deb925601..97db68d36 100644
--- a/README.md
+++ b/README.md
@@ -95,9 +95,17 @@ workings of PDF and pdf.js:
 ## Contributing
 
 pdf.js is a community-driven project, so contributors are always welcome. 
-Simply fork our repo and contribute away. A great place to start is our
-[open issues](https://github.com/mozilla/pdf.js/issues). For better consistency and 
-long-term stability, please do look around the code and try to follow our conventions.
+Simply fork our repo and contribute away. Good starting places for picking
+a bug are the top error messages and TODOs in our corpus report:
+
++ http://people.mozilla.com/~bdahl/corpusreport/test/ref/
+
+and of course our open Github issues:
+
++ https://github.com/mozilla/pdf.js/issues 
+
+For better consistency and long-term stability, please do look around the 
+code and try to follow our conventions.
 More information about the contributor process can be found on the 
 [contributor wiki page](https://github.com/mozilla/pdf.js/wiki/Contributing).
 
@@ -152,9 +160,9 @@ See the bot repo for details:
 
 ## Additional resources
 
-Our demo site is here:
+Gallery of user projects and modifications:
 
-+ http://mozilla.github.com/pdf.js/web/viewer.html
++ https://github.com/mozilla/pdf.js/wiki/Gallery-of-user-projects-and-modifications
 
 You can read more about pdf.js here:
 
diff --git a/src/canvas.js b/src/canvas.js
index d80bc80b2..0107570d9 100644
--- a/src/canvas.js
+++ b/src/canvas.js
@@ -689,7 +689,9 @@ var CanvasGraphics = (function canvasGraphics() {
     setStrokeColor: function canvasGraphicsSetStrokeColor(/*...*/) {
       var cs = this.current.strokeColorSpace;
       var color = cs.getRgb(arguments);
-      this.setStrokeRGBColor.apply(this, color);
+      var color = Util.makeCssRgb.apply(null, cs.getRgb(arguments));
+      this.ctx.strokeStyle = color;
+      this.current.strokeColor = color;
     },
     getColorN_IR_Pattern: function canvasGraphicsGetColorN_IR_Pattern(IR, cs) {
       if (IR[0] == 'TilingPattern') {
@@ -724,8 +726,9 @@ var CanvasGraphics = (function canvasGraphics() {
     },
     setFillColor: function canvasGraphicsSetFillColor(/*...*/) {
       var cs = this.current.fillColorSpace;
-      var color = cs.getRgb(arguments);
-      this.setFillRGBColor.apply(this, color);
+      var color = Util.makeCssRgb.apply(null, cs.getRgb(arguments));
+      this.ctx.fillStyle = color;
+      this.current.fillColor = color;
     },
     setFillColorN_IR: function canvasGraphicsSetFillColorN(/*...*/) {
       var cs = this.current.fillColorSpace;
@@ -737,27 +740,49 @@ var CanvasGraphics = (function canvasGraphics() {
       }
     },
     setStrokeGray: function canvasGraphicsSetStrokeGray(gray) {
-      this.setStrokeRGBColor(gray, gray, gray);
+      if (!(this.current.strokeColorSpace instanceof DeviceGrayCS))
+        this.current.strokeColorSpace = new DeviceGrayCS();
+
+      var color = Util.makeCssRgb(gray, gray, gray);
+      this.ctx.strokeStyle = color;
+      this.current.strokeColor = color;
     },
     setFillGray: function canvasGraphicsSetFillGray(gray) {
-      this.setFillRGBColor(gray, gray, gray);
+      if (!(this.current.fillColorSpace instanceof DeviceGrayCS))
+        this.current.fillColorSpace = new DeviceGrayCS();
+
+      var color = Util.makeCssRgb(gray, gray, gray);
+      this.ctx.fillStyle = color;
+      this.current.fillColor = color;
     },
     setStrokeRGBColor: function canvasGraphicsSetStrokeRGBColor(r, g, b) {
+      if (!(this.current.strokeColorSpace instanceof DeviceRgbCS))
+        this.current.strokeColorSpace = new DeviceRgbCS();
+
       var color = Util.makeCssRgb(r, g, b);
       this.ctx.strokeStyle = color;
       this.current.strokeColor = color;
     },
     setFillRGBColor: function canvasGraphicsSetFillRGBColor(r, g, b) {
+      if (!(this.current.fillColorSpace instanceof DeviceRgbCS))
+        this.current.fillColorSpace = new DeviceRgbCS();
+
       var color = Util.makeCssRgb(r, g, b);
       this.ctx.fillStyle = color;
       this.current.fillColor = color;
     },
     setStrokeCMYKColor: function canvasGraphicsSetStrokeCMYKColor(c, m, y, k) {
+      if (!(this.current.strokeColorSpace instanceof DeviceCmykCS))
+        this.current.strokeColorSpace = new DeviceCmykCS();
+
       var color = Util.makeCssCmyk(c, m, y, k);
       this.ctx.strokeStyle = color;
       this.current.strokeColor = color;
     },
     setFillCMYKColor: function canvasGraphicsSetFillCMYKColor(c, m, y, k) {
+      if (!(this.current.fillColorSpace instanceof DeviceCmykCS))
+        this.current.fillColorSpace = new DeviceCmykCS();
+
       var color = Util.makeCssCmyk(c, m, y, k);
       this.ctx.fillStyle = color;
       this.current.fillColor = color;
diff --git a/src/evaluator.js b/src/evaluator.js
index 619a633b2..1cb8fe39f 100644
--- a/src/evaluator.js
+++ b/src/evaluator.js
@@ -522,7 +522,9 @@ var PartialEvaluator = (function partialEvaluator() {
       var cmapObj = xref.fetchIfRef(toUnicode);
       var charToUnicode = [];
       if (isName(cmapObj)) {
-        error('ToUnicode file cmap translation not implemented');
+        var isIdentityMap = cmapObj.name.substr(0, 9) == 'Identity-';
+        if (!isIdentityMap)
+          error('ToUnicode file cmap translation not implemented');
       } else if (isStream(cmapObj)) {
         var tokens = [];
         var token = '';
diff --git a/src/pdf.js b/src/pdf.js
index 51f606548..1042a651b 100644
--- a/src/pdf.js
+++ b/src/pdf.js
@@ -7,8 +7,9 @@ var PDFJS = {};
   // Use strict in our context only - users might not want it
   'use strict';
 
+  PDFJS.build = 'PDFJSSCRIPT_BUNDLE_VER';
+
   // Files are inserted below - see Makefile
   /* PDFJSSCRIPT_INCLUDE_ALL */
 
 }).call((typeof window === 'undefined') ? this : window);
-
diff --git a/test/driver.js b/test/driver.js
index e84b7c8e0..c11cecf56 100644
--- a/test/driver.js
+++ b/test/driver.js
@@ -56,23 +56,29 @@ function load() {
 }
 
 function cleanup() {
-  var styleSheet = document.styleSheets[0];
-  if (styleSheet) {
+  // Clear out all the stylesheets since a new one is created for each font.
+  while (document.styleSheets.length > 0) {
+    var styleSheet = document.styleSheets[0];
     while (styleSheet.cssRules.length > 0)
       styleSheet.deleteRule(0);
+    var ownerNode = styleSheet.ownerNode;
+    ownerNode.parentNode.removeChild(ownerNode);
   }
   var guard = document.getElementById('content-end');
   var body = document.body;
   while (body.lastChild !== guard)
     body.removeChild(body.lastChild);
+
+  // Wipe out the link to the pdfdoc so it can be GC'ed.
+  for (var i = 0; i < manifest.length; i++) {
+    if (manifest[i].pdfDoc) {
+      manifest[i].pdfDoc.destroy();
+      delete manifest[i].pdfDoc;
+    }
+  }
 }
 
 function nextTask() {
-  // If there is a pdfDoc on the last task executed, destroy it to free memory.
-  if (task && task.pdfDoc) {
-    task.pdfDoc.destroy();
-    delete task.pdfDoc;
-  }
   cleanup();
 
   if (currentTaskIdx == manifest.length) {
diff --git a/test/test.py b/test/test.py
index 65def5d8e..256200587 100644
--- a/test/test.py
+++ b/test/test.py
@@ -323,18 +323,18 @@ def verifyPDFs(manifestList):
         if os.access(f, os.R_OK):
             fileMd5 = hashlib.md5(open(f, 'rb').read()).hexdigest()
             if 'md5' not in item:
-                print 'ERROR: Missing md5 for file "' + f + '".',
+                print 'WARNING: Missing md5 for file "' + f + '".',
                 print 'Hash for current file is "' + fileMd5 + '"'
                 error = True
                 continue
             md5 = item['md5']
             if fileMd5 != md5:
-                print 'ERROR: MD5 of file "' + f + '" does not match file.',
+                print 'WARNING: MD5 of file "' + f + '" does not match file.',
                 print 'Expected "' + md5 + '" computed "' + fileMd5 + '"'
                 error = True
                 continue
         else:
-            print 'ERROR: Unable to open file for reading "' + f + '".'
+            print 'WARNING: Unable to open file for reading "' + f + '".'
             error = True
     return not error
 
@@ -365,7 +365,8 @@ def setUp(options):
     downloadLinkedPDFs(manifestList)
 
     if not verifyPDFs(manifestList):
-        raise Exception('ERROR: failed to verify pdfs.')
+      print 'Unable to verify the checksum for the files that are used for testing.'
+      print 'Please re-download the files, or adjust the MD5 checksum in the manifest for the files listed above.\n'
 
     for b in testBrowsers:
         State.taskResults[b.name] = { }
diff --git a/test/test_manifest.json b/test/test_manifest.json
index 8085506a2..0bac41d34 100644
--- a/test/test_manifest.json
+++ b/test/test_manifest.json
@@ -19,7 +19,7 @@
     },
     {  "id": "intelisa-load",
        "file": "pdfs/intelisa.pdf",
-       "md5": "f3ed5487d1afa34d8b77c0c734a95c79",
+       "md5": "f5712097d29287a97f1278839814f682",
        "link": true,
        "rounds": 1,
        "type": "load"
@@ -194,7 +194,7 @@
     },
     {  "id": "f1040",
        "file": "pdfs/f1040.pdf",
-       "md5": "7323b50c6d28d959b8b4b92c469b2469",
+       "md5": "b59272ce19b4a0c5808c8861441b0741",
        "link": true,
        "rounds": 1,
        "type": "load"