diff --git a/common/rfb/JpegEncoder.cxx b/common/rfb/JpegEncoder.cxx
new file mode 100644
index 0000000..6f980b7
--- /dev/null
+++ b/common/rfb/JpegEncoder.cxx
@@ -0,0 +1,79 @@
+/* Copyright (C) 2007 Constantin Kaplinsky.  All Rights Reserved.
+ *    
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this software; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
+ * USA.
+ */
+
+#include <rfb/JpegEncoder.h>
+#include <rdr/OutStream.h>
+#include <rfb/encodings.h>
+
+using namespace rfb;
+
+const int JpegEncoder::qualityMap[10] = {
+  5, 10, 15, 25, 37, 50, 60, 70, 75, 80
+};
+
+JpegEncoder::JpegEncoder(SMsgWriter* writer_) : writer(writer_)
+{
+  jcomp = new StandardJpegCompressor;
+  jcomp->setQuality(qualityMap[6]);
+}
+
+JpegEncoder::~JpegEncoder()
+{
+  delete jcomp;
+}
+
+void JpegEncoder::setQualityLevel(int level)
+{
+  if (level >= 0 && level <= 9) {
+    jcomp->setQuality(qualityMap[level]);
+  }
+}
+
+bool JpegEncoder::writeRect(PixelBuffer* pb, const Rect& r)
+{
+  int serverBitsPerPixel = pb->getPF().bpp;
+  int clientBitsPerPixel = writer->bpp();
+
+  // FIXME: Implement JPEG compression for (serverBitsPerPixel == 16).
+  // FIXME: Check that all color components are actually 8 bits wide.
+  if (serverBitsPerPixel != 32 || clientBitsPerPixel < 16) {
+    // FIXME: Make sure this return value is checked properly.
+    return false;
+  }
+
+  writer->startRect(r, encodingTight);
+  rdr::OutStream* os = writer->getOutStream();
+
+  // Get access to pixel data
+  int stride;
+  const rdr::U32* pixels = (const rdr::U32 *)pb->getPixelsR(r, &stride);
+  const PixelFormat& fmt = pb->getPF();
+
+  // Encode data
+  jcomp->compress(pixels, &fmt, r.width(), r.height(), stride);
+
+  // Write Tight-encoded header and JPEG data.
+  os->writeU8(0x09 << 4);
+  os->writeCompactLength(jcomp->getDataLength());
+  os->writeBytes(jcomp->getDataPtr(), jcomp->getDataLength());
+
+  writer->endRect();
+
+  return true;
+}
+
diff --git a/common/rfb/JpegEncoder.h b/common/rfb/JpegEncoder.h
new file mode 100644
index 0000000..14fa104
--- /dev/null
+++ b/common/rfb/JpegEncoder.h
@@ -0,0 +1,51 @@
+/* Copyright (C) 2007 Constantin Kaplinsky.  All Rights Reserved.
+ *    
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this software; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
+ * USA.
+ */
+#ifndef __RFB_JPEGENCODER_H__
+#define __RFB_JPEGENCODER_H__
+
+#include <rfb/SMsgWriter.h>
+#include <rfb/PixelBuffer.h>
+#include <rfb/JpegCompressor.h>
+
+//
+// JPEG Encoder.
+// NOTE: JpegEncoder class is NOT derived from Encoder, because we need
+//       access to the original server's framebuffer, without extra pixel
+//       copying and with no pixel format translation.
+//
+
+namespace rfb {
+
+  class JpegEncoder {
+  public:
+    JpegEncoder(SMsgWriter* writer);
+    virtual ~JpegEncoder();
+
+    virtual void setQualityLevel(int level);
+    virtual bool writeRect(PixelBuffer* pb, const Rect& r);
+
+  private:
+    SMsgWriter* writer;
+    JpegCompressor* jcomp;
+
+    static const int qualityMap[10];
+  };
+
+}
+
+#endif
diff --git a/common/rfb/rfb.dsp b/common/rfb/rfb.dsp
index 0f2ef46..0913e27 100644
--- a/common/rfb/rfb.dsp
+++ b/common/rfb/rfb.dsp
@@ -223,6 +223,10 @@
 # End Source File
 # Begin Source File
 
+SOURCE=.\JpegEncoder.cxx
+# End Source File
+# Begin Source File
+
 SOURCE=.\KeyRemapper.cxx
 # End Source File
 # Begin Source File
@@ -553,6 +557,10 @@
 # End Source File
 # Begin Source File
 
+SOURCE=.\JpegEncoder.h
+# End Source File
+# Begin Source File
+
 SOURCE=.\KeyRemapper.h
 # End Source File
 # Begin Source File
