diff --git a/Makefile b/Makefile
index 3e385b175..2b566cbbf 100644
--- a/Makefile
+++ b/Makefile
@@ -33,6 +33,7 @@ PDF_JS_FILES = \
   pattern.js \
   stream.js \
   worker.js \
+  ../external/jpgjs/jpg.js \
 	$(NULL)
 
 # make server
diff --git a/examples/helloworld/index.html b/examples/helloworld/index.html
index a48e3705b..a2485d918 100644
--- a/examples/helloworld/index.html
+++ b/examples/helloworld/index.html
@@ -22,6 +22,7 @@
   <script type="text/javascript" src="../../src/pattern.js"></script>
   <script type="text/javascript" src="../../src/stream.js"></script>
   <script type="text/javascript" src="../../src/worker.js"></script>
+  <script type="text/javascript" src="../../external/jpgjs/jpg.js"></script>
 
   <script type="text/javascript">
     // Specify the main script used to create a new PDF.JS web worker.
diff --git a/src/core.js b/src/core.js
index 5e97763ab..6ff34dfbe 100644
--- a/src/core.js
+++ b/src/core.js
@@ -546,7 +546,7 @@ var PDFDoc = (function pdfDoc() {
         switch (type) {
           case 'JpegStream':
             var IR = data[2];
-            new JpegImage(id, IR, this.objs);
+            new JpegImageLoader(id, IR, this.objs);
             break;
           case 'Font':
             var name = data[2];
diff --git a/src/evaluator.js b/src/evaluator.js
index 064288c6f..3b33519d8 100644
--- a/src/evaluator.js
+++ b/src/evaluator.js
@@ -179,7 +179,7 @@ var PartialEvaluator = (function partialEvaluator() {
         var w = dict.get('Width', 'W');
         var h = dict.get('Height', 'H');
 
-        if (image instanceof JpegStream) {
+        if (image instanceof JpegStream && image.isNative) {
           var objId = 'img_' + uniquePrefix + (++self.objIdCounter);
           handler.send('obj', [objId, 'JpegStream', image.getIR()]);
 
diff --git a/src/image.js b/src/image.js
index 71aa0f113..17ef7b06d 100644
--- a/src/image.js
+++ b/src/image.js
@@ -229,12 +229,12 @@ var PDFImage = (function pdfImage() {
   return constructor;
 })();
 
-var JpegImage = (function jpegImage() {
-  function JpegImage(objId, imageData, objs) {
+var JpegImageLoader = (function jpegImage() {
+  function JpegImageLoader(objId, imageData, objs) {
     var src = 'data:image/jpeg;base64,' + window.btoa(imageData);
 
     var img = new Image();
-    img.onload = (function jpegImageOnload() {
+    img.onload = (function jpegImageLoaderOnload() {
       this.loaded = true;
 
       objs.resolve(objId, this);
@@ -246,12 +246,12 @@ var JpegImage = (function jpegImage() {
     this.domImage = img;
   }
 
-  JpegImage.prototype = {
-    getImage: function jpegImageGetImage() {
+  JpegImageLoader.prototype = {
+    getImage: function jpegImageLoaderGetImage() {
       return this.domImage;
     }
   };
 
-  return JpegImage;
+  return JpegImageLoader;
 })();
 
diff --git a/src/stream.js b/src/stream.js
index 73b096f1e..de07e1387 100644
--- a/src/stream.js
+++ b/src/stream.js
@@ -793,20 +793,46 @@ var JpegStream = (function jpegStream() {
     // TODO: per poppler, some images may have 'junk' before that
     // need to be removed
     this.dict = dict;
+    this.isNative = true;
+
+    if (isAdobeImage(bytes)) {
+      // when bug 674619 land, let's check if browser can do
+      // normal cmyk and then we won't have to the following
+      var cs = dict.get('ColorSpace');
+      if (isName(cs) && cs.name === 'DeviceCMYK') {
+        this.isNative = false;
+        this.bytes = bytes;
+      } else {
+        bytes = fixAdobeImage(bytes);
+        this.src = bytesToString(bytes);
+      }
+    } else {
+      this.src = bytesToString(bytes);
+    }
 
-    if (isAdobeImage(bytes))
-      bytes = fixAdobeImage(bytes);
-
-    this.src = bytesToString(bytes);
+    DecodeStream.call(this);
   }
 
-  constructor.prototype = {
-    getIR: function jpegStreamGetIR() {
-      return this.src;
-    },
-    getChar: function jpegStreamGetChar() {
+  constructor.prototype = Object.create(DecodeStream.prototype);
+
+  constructor.prototype.ensureBuffer = function jpegStreamEnsureBuffer(req) {
+    if (this.bufferLength)
+      return;
+    var jpegImage = new JpegImage();
+    jpegImage.parse(this.bytes);
+    var width = jpegImage.width;
+    var height = jpegImage.height;
+    var dataLength = width * height * 4;
+    var data = new Uint8Array(dataLength);
+    jpegImage.getData(data, width, height);
+    this.buffer = data;
+    this.bufferLength = data.length;
+  };
+  constructor.prototype.getIR = function jpegStreamGetIR() {
+    return this.src;
+  };
+  constructor.prototype.getChar = function jpegStreamGetChar() {
       error('internal error: getChar is not valid on JpegStream');
-    }
   };
 
   return constructor;
diff --git a/test/test_slave.html b/test/test_slave.html
index 91852d5a5..166251af9 100644
--- a/test/test_slave.html
+++ b/test/test_slave.html
@@ -21,6 +21,7 @@
     <script type="text/javascript" src="/src/pattern.js"></script>
     <script type="text/javascript" src="/src/stream.js"></script>
     <script type="text/javascript" src="/src/worker.js"></script>
+    <script type="text/javascript" src="/external/jpgjs/jpg.js"></script>
     <script type="text/javascript" src="driver.js"></script>
 
     <script type="text/javascript">
diff --git a/web/viewer.html b/web/viewer.html
index a72503eee..e441a9847 100644
--- a/web/viewer.html
+++ b/web/viewer.html
@@ -25,7 +25,7 @@
         <script type="text/javascript" src="../src/pattern.js"></script>  <!-- PDFJSSCRIPT_REMOVE -->
         <script type="text/javascript" src="../src/stream.js"></script>  <!-- PDFJSSCRIPT_REMOVE -->
         <script type="text/javascript" src="../src/worker.js"></script>  <!-- PDFJSSCRIPT_REMOVE -->
-
+        <script type="text/javascript" src="../external/jpgjs/jpg.js"></script>  <!-- PDFJSSCRIPT_REMOVE -->
         <script type="text/javascript">PDFJS.workerSrc = '../src/worker_loader.js';</script> <!-- PDFJSSCRIPT_REMOVE -->
 
         <script type="text/javascript" src="viewer.js"></script>