diff --git a/java/src/com/tightvnc/rfbplayer/ButtonPanel.java b/java/src/com/tightvnc/rfbplayer/ButtonPanel.java
index 8b062e8..95a7eb6 100644
--- a/java/src/com/tightvnc/rfbplayer/ButtonPanel.java
+++ b/java/src/com/tightvnc/rfbplayer/ButtonPanel.java
@@ -52,8 +52,7 @@
     timeScaleText.addActionListener(this);
   }
 
-  public void setPaused(boolean paused)
-  {
+  public void setPaused(boolean paused) {
     if (paused) {
       playButton.setLabel("Play");
     } else {
@@ -69,7 +68,7 @@
       char[] zeroes = {'0', '0', '0', '0'};
       String text = String.valueOf(seconds);
       if (text.length() < 4) {
-	text = new String(zeroes, 0, 4 - text.length()) + text;
+        text = new String(zeroes, 0, 4 - text.length()) + text;
       }
       posText.setText(text);
       posText.setCaretPosition(text.length());
@@ -79,7 +78,6 @@
   //
   // Event processing.
   //
-
   public void actionPerformed(ActionEvent evt) {
     if (evt.getSource() == playButton) {
       player.setPaused(playButton.getLabel().equals("Pause"));
@@ -88,10 +86,11 @@
     } else if (evt.getSource() == timeScaleText) {
       double speed = Double.valueOf(timeScaleText.getText()).doubleValue();
       if (speed <= 0.0)
-	speed = 1.0;
+        speed = 1.0;
       timeScaleText.setText(String.valueOf(speed));
       player.setSpeed(speed);
     }
   }
+
 }
 
diff --git a/java/src/com/tightvnc/rfbplayer/FbsInputStream.java b/java/src/com/tightvnc/rfbplayer/FbsInputStream.java
index d2cf593..1dcdd09 100644
--- a/java/src/com/tightvnc/rfbplayer/FbsInputStream.java
+++ b/java/src/com/tightvnc/rfbplayer/FbsInputStream.java
@@ -43,7 +43,6 @@
   //
   // Constructors.
   //
-
   FbsInputStream() throws IOException {
     throw new IOException("FbsInputStream: no such constructor");
   }
@@ -51,9 +50,7 @@
   //
   // Construct FbsInputStream object, begin playback.
   //
-
-  FbsInputStream(InputStream in) throws IOException
-  {
+  FbsInputStream(InputStream in) throws IOException {
     this.in = in;
     startTime = System.currentTimeMillis();
     timeOffset = 0;
@@ -66,9 +63,9 @@
     readFully(b);
 
     if (b[0] != 'F' || b[1] != 'B' || b[2] != 'S' || b[3] != ' ' ||
-	b[4] != '0' || b[5] != '0' || b[6] != '1' || b[7] != '.' ||
-	b[8] < '0' || b[8] > '9' || b[9] < '0' || b[9] > '9' ||
-	b[10] < '0' || b[10] > '9' || b[11] != '\n') {
+        b[4] != '0' || b[5] != '0' || b[6] != '1' || b[7] != '.' ||
+        b[8] < '0' || b[8] > '9' || b[9] < '0' || b[9] > '9' ||
+        b[10] < '0' || b[10] > '9' || b[11] != '\n') {
       throw new IOException("Incorrect protocol version");
     }
 
@@ -80,19 +77,16 @@
   //
   // Basic methods overriding InputStream's methods.
   //
-
-  public int read() throws IOException
-  {
+  public int read() throws IOException {
     while (bufferSize == 0) {
       if (!fillBuffer())
-	return -1;
+        return -1;
     }
     bufferSize--;
     return buffer[bufferPos++] & 0xFF;
   }
 
-  public int available() throws IOException
-  {
+  public int available() throws IOException {
     // FIXME: This will work incorrectly if our caller will wait until
     // some amount of data is available when the buffer contains less
     // data than then that. Current implementation never reads more
@@ -100,8 +94,7 @@
     return bufferSize;
   }
 
-  public synchronized void close() throws IOException
-  {
+  public synchronized void close() throws IOException {
     in.close();
     in = null;
     startTime = -1;
@@ -121,15 +114,12 @@
   //
   // Methods providing additional functionality.
   //
-
-  public synchronized long getTimeOffset()
-  {
+  public synchronized long getTimeOffset() {
     long off = Math.max(seekOffset, timeOffset);
     return (long)(off * playbackSpeed);
   }
 
-  public synchronized void setTimeOffset(long pos)
-  {
+  public synchronized void setTimeOffset(long pos) {
     seekOffset = (long)(pos / playbackSpeed);
     if (seekOffset < timeOffset) {
       seekBackwards = true;
@@ -137,8 +127,7 @@
     notify();
   }
 
-  public synchronized void setSpeed(double newSpeed)
-  {
+  public synchronized void setSpeed(double newSpeed) {
     long newOffset = (long)(timeOffset * playbackSpeed / newSpeed);
     startTime += timeOffset - newOffset;
     timeOffset = newOffset;
@@ -148,45 +137,37 @@
     playbackSpeed = newSpeed;
   }
 
-  public boolean isSeeking()
-  {
+  public boolean isSeeking() {
     return (seekOffset >= 0);
   }
 
-  public long getSeekOffset()
-  {
+  public long getSeekOffset() {
     return (long)(seekOffset * playbackSpeed);
   }
 
-  public boolean isPaused()
-  {
+  public boolean isPaused() {
     return paused;
   }
 
-  public synchronized void pausePlayback()
-  {
+  public synchronized void pausePlayback() {
     paused = true;
     notify();
   }
 
-  public synchronized void resumePlayback()
-  {
+  public synchronized void resumePlayback() {
     paused = false;
     startTime = System.currentTimeMillis() - timeOffset;
     notify();
   }
 
-  public void addObserver(Observer target)
-  {
+  public void addObserver(Observer target) {
     obs = target;
   }
 
   //
   // Methods for internal use.
   //
-
-  private synchronized boolean fillBuffer() throws IOException
-  {
+  private synchronized boolean fillBuffer() throws IOException {
     // The reading thread should be interrupted on backward seeking.
     if (seekBackwards)
       throw new EOFException("[REWIND]");
@@ -212,20 +193,20 @@
 
     if (seekOffset >= 0) {
       if (timeOffset >= seekOffset) {
-	startTime = System.currentTimeMillis() - seekOffset;
-	seekOffset = -1;
+        startTime = System.currentTimeMillis() - seekOffset;
+        seekOffset = -1;
       } else {
-	return true;
+        return true;
       }
     }
 
     while (true) {
       long timeDiff = startTime + timeOffset - System.currentTimeMillis();
       if (timeDiff <= 0) {
-	break;
+        break;
       }
       try {
-	wait(timeDiff);
+        wait(timeDiff);
       } catch (InterruptedException e) {
       }
       waitWhilePaused();
@@ -237,48 +218,45 @@
   //
   // In paused mode, wait for external notification on this object.
   //
-
-  private void waitWhilePaused()
-  {
+  private void waitWhilePaused() {
     while (paused && !isSeeking()) {
       synchronized(this) {
-	try {
-	  // Note: we call Observer.update(Observable,Object) method
-	  // directly instead of maintaining an Observable object.
-	  obs.update(null, null);
-	  wait();
-	} catch (InterruptedException e) {
-	}
+        try {
+          // Note: we call Observer.update(Observable,Object) method
+          // directly instead of maintaining an Observable object.
+          obs.update(null, null);
+          wait();
+        } catch (InterruptedException e) {
+        }
       }
     }
   }
 
-  private long readUnsigned32() throws IOException
-  {
+  private long readUnsigned32() throws IOException {
     byte[] buf = new byte[4];
     if (!readFully(buf))
       return -1;
 
     return ((long)(buf[0] & 0xFF) << 24 |
-	    (buf[1] & 0xFF) << 16 |
-	    (buf[2] & 0xFF) << 8  |
-	    (buf[3] & 0xFF));
+        (buf[1] & 0xFF) << 16 |
+        (buf[2] & 0xFF) << 8 |
+        (buf[3] & 0xFF));
   }
 
-  private boolean readFully(byte[] b) throws IOException
-  {
+  private boolean readFully(byte[] b) throws IOException {
     int off = 0;
     int len = b.length;
 
     while (off != len) {
       int count = in.read(b, off, len - off);
       if (count < 0) {
-	return false;
+        return false;
       }
       off += count;
     }
 
     return true;
   }
+
 }
 
diff --git a/java/src/com/tightvnc/rfbplayer/RfbPlayer.java b/java/src/com/tightvnc/rfbplayer/RfbPlayer.java
index 1cf16ab..0918bef 100644
--- a/java/src/com/tightvnc/rfbplayer/RfbPlayer.java
+++ b/java/src/com/tightvnc/rfbplayer/RfbPlayer.java
@@ -24,7 +24,7 @@
 import java.net.*;
 
 public class RfbPlayer extends java.applet.Applet
-  implements java.lang.Runnable, WindowListener {
+    implements java.lang.Runnable, WindowListener {
 
   boolean inAnApplet = true;
   boolean inSeparateFrame = false;
@@ -33,7 +33,6 @@
   // main() is called when run as a java program from the command line.
   // It simply runs the applet inside a newly-created frame.
   //
-
   public static void main(String[] argv) {
     RfbPlayer p = new RfbPlayer();
     p.mainArgs = argv;
@@ -67,7 +66,6 @@
   //
   // init()
   //
-
   public void init() {
 
     readParameters();
@@ -75,7 +73,7 @@
     if (inSeparateFrame) {
       vncFrame = new Frame("RFB Session Player");
       if (!inAnApplet) {
-	vncFrame.add("Center", this);
+        vncFrame.add("Center", this);
       }
       vncContainer = vncFrame;
     } else {
@@ -95,7 +93,6 @@
   //
   // run() - executed by the rfbThread to read RFB data.
   //
-
   public void run() {
 
     gridbag = new GridBagLayout();
@@ -121,9 +118,9 @@
 
     try {
       if (inAnApplet) {
-	url = new URL(getCodeBase(), sessionURL);
+        url = new URL(getCodeBase(), sessionURL);
       } else {
-	url = new URL(sessionURL);
+        url = new URL(sessionURL);
       }
       rfb = new RfbProto(url);
 
@@ -133,54 +130,54 @@
 
       if (inSeparateFrame) {
 
-	// Create a panel which itself is resizeable and can hold
-	// non-resizeable VncCanvas component at the top left corner.
-	Panel canvasPanel = new Panel();
-	canvasPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
-	canvasPanel.add(vc);
+        // Create a panel which itself is resizeable and can hold
+        // non-resizeable VncCanvas component at the top left corner.
+        Panel canvasPanel = new Panel();
+        canvasPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
+        canvasPanel.add(vc);
 
-	// Create a ScrollPane which will hold a panel with VncCanvas
-	// inside.
-	desktopScrollPane = new ScrollPane(ScrollPane.SCROLLBARS_AS_NEEDED);
-	gbc.fill = GridBagConstraints.BOTH;
-	gridbag.setConstraints(desktopScrollPane, gbc);
-	desktopScrollPane.add(canvasPanel);
+        // Create a ScrollPane which will hold a panel with VncCanvas
+        // inside.
+        desktopScrollPane = new ScrollPane(ScrollPane.SCROLLBARS_AS_NEEDED);
+        gbc.fill = GridBagConstraints.BOTH;
+        gridbag.setConstraints(desktopScrollPane, gbc);
+        desktopScrollPane.add(canvasPanel);
 
-	// Finally, add our ScrollPane to the Frame window.
-	vncFrame.add(desktopScrollPane);
-	vncFrame.setTitle(rfb.desktopName);
-	vncFrame.pack();
-	vc.resizeDesktopFrame();
+        // Finally, add our ScrollPane to the Frame window.
+        vncFrame.add(desktopScrollPane);
+        vncFrame.setTitle(rfb.desktopName);
+        vncFrame.pack();
+        vc.resizeDesktopFrame();
 
       } else {
 
-	// Just add the VncCanvas component to the Applet.
-	gridbag.setConstraints(vc, gbc);
-	add(vc);
-	validate();
+        // Just add the VncCanvas component to the Applet.
+        gridbag.setConstraints(vc, gbc);
+        add(vc);
+        validate();
 
       }
 
       while (true) {
-	try {
-	  setPaused(!autoPlay);
-	  rfb.fbs.setSpeed(playbackSpeed);
-	  if (initialTimeOffset > rfb.fbs.getTimeOffset())
-	    setPos(initialTimeOffset); // don't seek backwards here
-	  vc.processNormalProtocol();
-	} catch (EOFException e) {
-	  if (e.getMessage() != null && e.getMessage().equals("[REWIND]")) {
-	    // A special type of EOFException allowing us to seek backwards.
-	    initialTimeOffset = rfb.fbs.getSeekOffset();
-	    autoPlay = !rfb.fbs.isPaused();
-	  } else {
-	    // Return to the beginning after the playback is finished.
-	    initialTimeOffset = 0;
-	    autoPlay = false;
-	  }
+        try {
+          setPaused(!autoPlay);
+          rfb.fbs.setSpeed(playbackSpeed);
+          if (initialTimeOffset > rfb.fbs.getTimeOffset())
+            setPos(initialTimeOffset); // don't seek backwards here
+          vc.processNormalProtocol();
+        } catch (EOFException e) {
+          if (e.getMessage() != null && e.getMessage().equals("[REWIND]")) {
+            // A special type of EOFException allowing us to seek backwards.
+            initialTimeOffset = rfb.fbs.getSeekOffset();
+            autoPlay = !rfb.fbs.isPaused();
+          } else {
+            // Return to the beginning after the playback is finished.
+            initialTimeOffset = 0;
+            autoPlay = false;
+          }
           rfb.newSession(url);
           vc.updateFramebufferSize();
-	}
+        }
       }
 
     } catch (FileNotFoundException e) {
@@ -189,7 +186,7 @@
       e.printStackTrace();
       fatalError(e.toString());
     }
-    
+
   }
 
   public void setPaused(boolean paused) {
@@ -215,7 +212,6 @@
     rfb.fbs.setTimeOffset(pos);
   }
 
-
   public void updatePos() {
     if (showControls)
       buttonPanel.setPos(rfb.fbs.getTimeOffset());
@@ -227,7 +223,6 @@
   // param_name/param_value pairs where the names and values correspond to
   // those expected in the html applet tag source.
   //
-
   public void readParameters() {
 
     sessionURL = readParameter("URL", true);
@@ -253,7 +248,7 @@
     if (inAnApplet) {
       str = readParameter("Open New Window", false);
       if (str != null && str.equalsIgnoreCase("Yes"))
-	inSeparateFrame = true;
+        inSeparateFrame = true;
     }
 
     // Fine tuning options.
@@ -266,21 +261,21 @@
     if (inAnApplet) {
       String s = getParameter(name);
       if ((s == null) && required) {
-	fatalError(name + " parameter not specified");
+        fatalError(name + " parameter not specified");
       }
       return s;
     }
 
     for (int i = 0; i < mainArgs.length; i += 2) {
       if (mainArgs[i].equalsIgnoreCase(name)) {
-	try {
-	  return mainArgs[i+1];
-	} catch (Exception e) {
-	  if (required) {
-	    fatalError(name + " parameter not specified");
-	  }
-	  return null;
-	}
+        try {
+          return mainArgs[i + 1];
+        } catch (Exception e) {
+          if (required) {
+            fatalError(name + " parameter not specified");
+          }
+          return null;
+        }
       }
     }
     if (required) {
@@ -294,8 +289,9 @@
     long result = defaultValue;
     if (str != null) {
       try {
-	result = Long.parseLong(str);
-      } catch (NumberFormatException e) { }
+        result = Long.parseLong(str);
+      } catch (NumberFormatException e) {
+      }
     }
     return result;
   }
@@ -305,8 +301,9 @@
     double result = defaultValue;
     if (str != null) {
       try {
-	result = Double.valueOf(str).doubleValue();
-      } catch (NumberFormatException e) { }
+        result = Double.valueOf(str).doubleValue();
+      } catch (NumberFormatException e) {
+      }
     }
     return result;
   }
@@ -314,23 +311,22 @@
   //
   // fatalError() - print out a fatal error message.
   //
-
   public void fatalError(String str) {
     System.out.println(str);
 
     if (inAnApplet) {
       vncContainer.removeAll();
       if (rfb != null) {
-	rfb = null;
+        rfb = null;
       }
       Label errLabel = new Label(str);
       errLabel.setFont(new Font("Helvetica", Font.PLAIN, 12));
       vncContainer.setLayout(new FlowLayout(FlowLayout.LEFT, 30, 30));
       vncContainer.add(errLabel);
       if (inSeparateFrame) {
-	vncFrame.pack();
+        vncFrame.pack();
       } else {
-	validate();
+        validate();
       }
       Thread.currentThread().stop();
     } else {
@@ -342,7 +338,6 @@
   //
   // This method is called before the applet is destroyed.
   //
-
   public void destroy() {
     vncContainer.removeAll();
     if (rfb != null) {
@@ -357,7 +352,6 @@
   //
   // Close application properly on window close event.
   //
-
   public void windowClosing(WindowEvent evt) {
     vncContainer.removeAll();
     if (rfb != null)
@@ -372,11 +366,22 @@
   //
   // Ignore window events we're not interested in.
   //
+  public void windowActivated(WindowEvent evt) {
+  }
 
-  public void windowActivated (WindowEvent evt) {}
-  public void windowDeactivated (WindowEvent evt) {}
-  public void windowOpened(WindowEvent evt) {}
-  public void windowClosed(WindowEvent evt) {}
-  public void windowIconified(WindowEvent evt) {}
-  public void windowDeiconified(WindowEvent evt) {}
+  public void windowDeactivated(WindowEvent evt) {
+  }
+
+  public void windowOpened(WindowEvent evt) {
+  }
+
+  public void windowClosed(WindowEvent evt) {
+  }
+
+  public void windowIconified(WindowEvent evt) {
+  }
+
+  public void windowDeiconified(WindowEvent evt) {
+  }
+
 }
diff --git a/java/src/com/tightvnc/rfbplayer/RfbProto.java b/java/src/com/tightvnc/rfbplayer/RfbProto.java
index 5814012..e8a5042 100644
--- a/java/src/com/tightvnc/rfbplayer/RfbProto.java
+++ b/java/src/com/tightvnc/rfbplayer/RfbProto.java
@@ -32,46 +32,36 @@
 class RfbProto {
 
   final String versionMsg = "RFB 003.003\n";
-  final static int ConnFailed = 0, NoAuth = 1, VncAuth = 2;
-  final static int VncAuthOK = 0, VncAuthFailed = 1, VncAuthTooMany = 2;
+  final static int ConnFailed = 0,  NoAuth = 1,  VncAuth = 2;
+  final static int VncAuthOK = 0,  VncAuthFailed = 1,  VncAuthTooMany = 2;
 
-  final static int FramebufferUpdate = 0, SetColourMapEntries = 1, Bell = 2,
-    ServerCutText = 3;
+  final static int FramebufferUpdate = 0,  SetColourMapEntries = 1,  Bell = 2,  ServerCutText =
+      3;
 
-  final int SetPixelFormat = 0, FixColourMapEntries = 1, SetEncodings = 2,
-    FramebufferUpdateRequest = 3, KeyboardEvent = 4, PointerEvent = 5,
-    ClientCutText = 6;
+  final int SetPixelFormat = 0,  FixColourMapEntries = 1,  SetEncodings = 2,  FramebufferUpdateRequest =
+      3,  KeyboardEvent = 4,  PointerEvent = 5,  ClientCutText = 6;
 
-  final static int
-    EncodingRaw            = 0,
-    EncodingCopyRect       = 1,
-    EncodingRRE            = 2,
-    EncodingCoRRE          = 4,
-    EncodingHextile        = 5,
-    EncodingZlib           = 6,
-    EncodingTight          = 7,
-    EncodingCompressLevel0 = 0xFFFFFF00,
-    EncodingQualityLevel0  = 0xFFFFFFE0,
-    EncodingXCursor        = 0xFFFFFF10,
-    EncodingRichCursor     = 0xFFFFFF11,
-    EncodingLastRect       = 0xFFFFFF20,
-    EncodingNewFBSize      = 0xFFFFFF21;
+  final static int EncodingRaw = 0,  EncodingCopyRect = 1,  EncodingRRE = 2,  EncodingCoRRE =
+      4,  EncodingHextile = 5,  EncodingZlib = 6,  EncodingTight = 7,  EncodingCompressLevel0 =
+      0xFFFFFF00,  EncodingQualityLevel0 = 0xFFFFFFE0,  EncodingXCursor =
+      0xFFFFFF10,  EncodingRichCursor = 0xFFFFFF11,  EncodingLastRect =
+      0xFFFFFF20,  EncodingNewFBSize = 0xFFFFFF21;
 
-  final int HextileRaw			= (1 << 0);
-  final int HextileBackgroundSpecified	= (1 << 1);
-  final int HextileForegroundSpecified	= (1 << 2);
-  final int HextileAnySubrects		= (1 << 3);
-  final int HextileSubrectsColoured	= (1 << 4);
+  final int HextileRaw = (1 << 0);
+  final int HextileBackgroundSpecified = (1 << 1);
+  final int HextileForegroundSpecified = (1 << 2);
+  final int HextileAnySubrects = (1 << 3);
+  final int HextileSubrectsColoured = (1 << 4);
 
-  final static int TightExplicitFilter  = 0x04;
-  final static int TightFill            = 0x08;
-  final static int TightJpeg            = 0x09;
-  final static int TightMaxSubencoding  = 0x09;
-  final static int TightFilterCopy      = 0x00;
-  final static int TightFilterPalette   = 0x01;
-  final static int TightFilterGradient  = 0x02;
+  final static int TightExplicitFilter = 0x04;
+  final static int TightFill = 0x08;
+  final static int TightJpeg = 0x09;
+  final static int TightMaxSubencoding = 0x09;
+  final static int TightFilterCopy = 0x00;
+  final static int TightFilterPalette = 0x01;
+  final static int TightFilterGradient = 0x02;
 
-  final static int TightMinToCompress   = 12;
+  final static int TightMinToCompress = 12;
 
   FbsInputStream fbs;
   DataInputStream is;
@@ -80,7 +70,6 @@
   //
   // Constructor.
   //
-
   RfbProto(URL url) throws Exception {
     fbs = null;
     newSession(url);
@@ -89,7 +78,6 @@
   //
   // Open new session URL.
   //
-
   public void newSession(URL url) throws Exception {
     if (fbs != null)
       fbs.close();
@@ -106,7 +94,6 @@
   //
   // Read server's protocol version message.
   //
-
   int serverMajor, serverMinor;
 
   void readVersionMsg() throws IOException {
@@ -115,12 +102,11 @@
 
     is.readFully(b);
 
-    if ((b[0] != 'R') || (b[1] != 'F') || (b[2] != 'B') || (b[3] != ' ')
-	|| (b[4] < '0') || (b[4] > '9') || (b[5] < '0') || (b[5] > '9')
-	|| (b[6] < '0') || (b[6] > '9') || (b[7] != '.')
-	|| (b[8] < '0') || (b[8] > '9') || (b[9] < '0') || (b[9] > '9')
-	|| (b[10] < '0') || (b[10] > '9') || (b[11] != '\n'))
-    {
+    if ((b[0] != 'R') || (b[1] != 'F') || (b[2] != 'B') || (b[3] != ' ') ||
+        (b[4] < '0') || (b[4] > '9') || (b[5] < '0') || (b[5] > '9') || (b[6] <
+        '0') || (b[6] > '9') || (b[7] != '.') || (b[8] < '0') || (b[8] > '9') ||
+        (b[9] < '0') || (b[9] > '9') || (b[10] < '0') || (b[10] > '9') ||
+        (b[11] != '\n')) {
       throw new IOException("Incorrect protocol version");
     }
 
@@ -132,7 +118,6 @@
   //
   // Find out the authentication scheme.
   //
-
   int readAuthScheme() throws IOException {
     int authScheme = is.readInt();
 
@@ -158,7 +143,6 @@
   //
   // Read the server initialisation message
   //
-
   String desktopName;
   int framebufferWidth, framebufferHeight;
   int bitsPerPixel, depth;
@@ -190,7 +174,6 @@
   //
   // Set new framebuffer size
   //
-
   void setFramebufferSize(int width, int height) {
     framebufferWidth = width;
     framebufferHeight = height;
@@ -200,7 +183,6 @@
   //
   // Read the server message type
   //
-
   int readServerMessageType() throws IOException {
     return is.readUnsignedByte();
   }
@@ -209,7 +191,6 @@
   //
   // Read a FramebufferUpdate message
   //
-
   int updateNRects;
 
   void readFramebufferUpdate() throws IOException {
@@ -218,7 +199,6 @@
   }
 
   // Read a FramebufferUpdate rectangle header
-
   int updateRectX, updateRectY, updateRectW, updateRectH, updateRectEncoding;
 
   void readFramebufferUpdateRectHdr() throws IOException {
@@ -229,19 +209,18 @@
     updateRectEncoding = is.readInt();
 
     if ((updateRectEncoding == EncodingLastRect) ||
-	(updateRectEncoding == EncodingNewFBSize))
+        (updateRectEncoding == EncodingNewFBSize))
       return;
 
     if ((updateRectX + updateRectW > framebufferWidth) ||
-	(updateRectY + updateRectH > framebufferHeight)) {
+        (updateRectY + updateRectH > framebufferHeight)) {
       throw new IOException("Framebuffer update rectangle too large: " +
-			    updateRectW + "x" + updateRectH + " at (" +
-			    updateRectX + "," + updateRectY + ")");
+                            updateRectW + "x" + updateRectH + " at (" +
+                            updateRectX + "," + updateRectY + ")");
     }
   }
 
   // Read CopyRect source X and Y.
-
   int copyRectSrcX, copyRectSrcY;
 
   void readCopyRect() throws IOException {
@@ -253,7 +232,6 @@
   //
   // Read a ServerCutText message
   //
-
   String readServerCutText() throws IOException {
     byte[] pad = new byte[3];
     is.readFully(pad);
@@ -267,7 +245,6 @@
   //
   // Read integer in compact representation
   //
-
   int readCompactLen() throws IOException {
     int portion = is.readUnsignedByte();
     int len = portion & 0x7F;
@@ -275,8 +252,8 @@
       portion = is.readUnsignedByte();
       len |= (portion & 0x7F) << 7;
       if ((portion & 0x80) != 0) {
-	portion = is.readUnsignedByte();
-	len |= (portion & 0xFF) << 14;
+        portion = is.readUnsignedByte();
+        len |= (portion & 0xFF) << 14;
       }
     }
     return len;
diff --git a/java/src/com/tightvnc/rfbplayer/VncCanvas.java b/java/src/com/tightvnc/rfbplayer/VncCanvas.java
index 8272016..57bb858 100644
--- a/java/src/com/tightvnc/rfbplayer/VncCanvas.java
+++ b/java/src/com/tightvnc/rfbplayer/VncCanvas.java
@@ -32,7 +32,6 @@
 //
 // VncCanvas is a subclass of Canvas which draws a VNC desktop on it.
 //
-
 class VncCanvas extends Canvas implements Observer {
 
   RfbPlayer player;
@@ -69,7 +68,6 @@
   //
   // The constructor.
   //
-
   VncCanvas(RfbPlayer player) throws IOException {
     this.player = player;
     rfb = player.rfb;
@@ -83,7 +81,6 @@
   //
   // Callback methods to determine geometry of our Component.
   //
-
   public Dimension getPreferredSize() {
     return new Dimension(rfb.framebufferWidth, rfb.framebufferHeight);
   }
@@ -99,7 +96,6 @@
   //
   // All painting is performed here.
   //
-
   public void update(Graphics g) {
     paint(g);
   }
@@ -114,22 +110,21 @@
   // Override the ImageObserver interface method to handle drawing of
   // JPEG-encoded data.
   //
-
   public boolean imageUpdate(Image img, int infoflags,
-                             int x, int y, int width, int height) {
+                              int x, int y, int width, int height) {
     if ((infoflags & (ALLBITS | ABORT)) == 0) {
       return true;		// We need more image data.
     } else {
       // If the whole image is available, draw it now.
       if ((infoflags & ALLBITS) != 0) {
-	if (jpegRect != null) {
-	  synchronized(jpegRect) {
-	    memGraphics.drawImage(img, jpegRect.x, jpegRect.y, null);
-	    scheduleRepaint(jpegRect.x, jpegRect.y,
-			    jpegRect.width, jpegRect.height);
-	    jpegRect.notify();
-	  }
-	}
+        if (jpegRect != null) {
+          synchronized(jpegRect) {
+            memGraphics.drawImage(img, jpegRect.x, jpegRect.y, null);
+            scheduleRepaint(jpegRect.x, jpegRect.y,
+                            jpegRect.width, jpegRect.height);
+            jpegRect.notify();
+          }
+        }
       }
       return false;		// All image data was processed.
     }
@@ -148,10 +143,10 @@
       memImage = player.createImage(fbWidth, fbHeight);
       memGraphics = memImage.getGraphics();
     } else if (memImage.getWidth(null) != fbWidth ||
-	       memImage.getHeight(null) != fbHeight) {
+        memImage.getHeight(null) != fbHeight) {
       synchronized(memImage) {
-	memImage = player.createImage(fbWidth, fbHeight);
-	memGraphics = memImage.getGraphics();
+        memImage = player.createImage(fbWidth, fbHeight);
+        memGraphics = memImage.getGraphics();
       }
     }
 
@@ -159,14 +154,14 @@
     // of geometry or pixel format.
     pixels24 = new int[fbWidth * fbHeight];
     pixelsSource =
-      new MemoryImageSource(fbWidth, fbHeight, cm24, pixels24, 0, fbWidth);
+        new MemoryImageSource(fbWidth, fbHeight, cm24, pixels24, 0, fbWidth);
     pixelsSource.setAnimated(true);
     rawPixelsImage = createImage(pixelsSource);
 
     // Update the size of desktop containers.
     if (player.inSeparateFrame) {
       if (player.desktopScrollPane != null)
-	resizeDesktopFrame();
+        resizeDesktopFrame();
     } else {
       setSize(fbWidth, fbHeight);
     }
@@ -179,9 +174,9 @@
     // ScrollPane.  -- const
     Insets insets = player.desktopScrollPane.getInsets();
     player.desktopScrollPane.setSize(rfb.framebufferWidth +
-				     2 * Math.min(insets.left, insets.right),
-				     rfb.framebufferHeight +
-				     2 * Math.min(insets.top, insets.bottom));
+                                     2 * Math.min(insets.left, insets.right),
+                                     rfb.framebufferHeight +
+                                     2 * Math.min(insets.top, insets.bottom));
 
     player.vncFrame.pack();
 
@@ -209,7 +204,6 @@
   // processNormalProtocol() - executed by the rfbThread to deal with
   // the RFB data.
   //
-
   public void processNormalProtocol() throws Exception {
 
     zlibInflater = new Inflater();
@@ -230,70 +224,70 @@
 
       switch (msgType) {
       case RfbProto.FramebufferUpdate:
-	rfb.readFramebufferUpdate();
+        rfb.readFramebufferUpdate();
 
-	for (int i = 0; i < rfb.updateNRects; i++) {
-	  rfb.readFramebufferUpdateRectHdr();
-	  int rx = rfb.updateRectX, ry = rfb.updateRectY;
-	  int rw = rfb.updateRectW, rh = rfb.updateRectH;
+        for (int i = 0; i < rfb.updateNRects; i++) {
+          rfb.readFramebufferUpdateRectHdr();
+          int rx = rfb.updateRectX, ry = rfb.updateRectY;
+          int rw = rfb.updateRectW, rh = rfb.updateRectH;
 
-	  if (rfb.updateRectEncoding == rfb.EncodingLastRect)
-	    break;
+          if (rfb.updateRectEncoding == rfb.EncodingLastRect)
+            break;
 
-	  if (rfb.updateRectEncoding == rfb.EncodingNewFBSize) {
-	    rfb.setFramebufferSize(rfb.updateRectW, rfb.updateRectH);
-	    updateFramebufferSize();
-	    break;
-	  }
+          if (rfb.updateRectEncoding == rfb.EncodingNewFBSize) {
+            rfb.setFramebufferSize(rfb.updateRectW, rfb.updateRectH);
+            updateFramebufferSize();
+            break;
+          }
 
-	  if (rfb.updateRectEncoding == rfb.EncodingXCursor ||
-	      rfb.updateRectEncoding == rfb.EncodingRichCursor) {
-	    throw new Exception("Sorry, no support for" +
-				" cursor shape updates yet");
-	  }
+          if (rfb.updateRectEncoding == rfb.EncodingXCursor ||
+              rfb.updateRectEncoding == rfb.EncodingRichCursor) {
+            throw new Exception("Sorry, no support for" +
+                                " cursor shape updates yet");
+          }
 
-	  switch (rfb.updateRectEncoding) {
-	  case RfbProto.EncodingRaw:
-	    handleRawRect(rx, ry, rw, rh);
-	    break;
-	  case RfbProto.EncodingCopyRect:
-	    handleCopyRect(rx, ry, rw, rh);
-	    break;
-	  case RfbProto.EncodingRRE:
-	    handleRRERect(rx, ry, rw, rh);
-	    break;
-	  case RfbProto.EncodingCoRRE:
-	    handleCoRRERect(rx, ry, rw, rh);
-	    break;
-	  case RfbProto.EncodingHextile:
-	    handleHextileRect(rx, ry, rw, rh);
-	    break;
-	  case RfbProto.EncodingZlib:
+          switch (rfb.updateRectEncoding) {
+          case RfbProto.EncodingRaw:
+            handleRawRect(rx, ry, rw, rh);
+            break;
+          case RfbProto.EncodingCopyRect:
+            handleCopyRect(rx, ry, rw, rh);
+            break;
+          case RfbProto.EncodingRRE:
+            handleRRERect(rx, ry, rw, rh);
+            break;
+          case RfbProto.EncodingCoRRE:
+            handleCoRRERect(rx, ry, rw, rh);
+            break;
+          case RfbProto.EncodingHextile:
+            handleHextileRect(rx, ry, rw, rh);
+            break;
+          case RfbProto.EncodingZlib:
             handleZlibRect(rx, ry, rw, rh);
-	    break;
-	  case RfbProto.EncodingTight:
-	    handleTightRect(rx, ry, rw, rh);
-	    break;
-	  default:
-	    throw new Exception("Unknown RFB rectangle encoding " +
-				rfb.updateRectEncoding);
-	  }
-	}
-	break;
+            break;
+          case RfbProto.EncodingTight:
+            handleTightRect(rx, ry, rw, rh);
+            break;
+          default:
+            throw new Exception("Unknown RFB rectangle encoding " +
+                                rfb.updateRectEncoding);
+          }
+        }
+        break;
 
       case RfbProto.SetColourMapEntries:
-	throw new Exception("Can't handle SetColourMapEntries message");
+        throw new Exception("Can't handle SetColourMapEntries message");
 
       case RfbProto.Bell:
         Toolkit.getDefaultToolkit().beep();
-	break;
+        break;
 
       case RfbProto.ServerCutText:
-	String s = rfb.readServerCutText();
-	break;
+        String s = rfb.readServerCutText();
+        break;
 
       default:
-	throw new Exception("Unknown RFB message type " + msgType);
+        throw new Exception("Unknown RFB message type " + msgType);
       }
 
       player.updatePos();
@@ -304,7 +298,6 @@
   //
   // Handle a raw rectangle.
   //
-
   void handleRawRect(int x, int y, int w, int h) throws IOException {
 
     byte[] buf = new byte[w * 4];
@@ -313,10 +306,10 @@
       rfb.is.readFully(buf);
       offset = dy * rfb.framebufferWidth + x;
       for (i = 0; i < w; i++) {
-	pixels24[offset + i] =
-	  (buf[i * 4 + 2] & 0xFF) << 16 |
-	  (buf[i * 4 + 1] & 0xFF) << 8 |
-	  (buf[i * 4] & 0xFF);
+        pixels24[offset + i] =
+            (buf[i * 4 + 2] & 0xFF) << 16 |
+            (buf[i * 4 + 1] & 0xFF) << 8 |
+            (buf[i * 4] & 0xFF);
       }
     }
 
@@ -328,12 +321,11 @@
   //
   // Handle a CopyRect rectangle.
   //
-
   void handleCopyRect(int x, int y, int w, int h) throws IOException {
 
     rfb.readCopyRect();
     memGraphics.copyArea(rfb.copyRectSrcX, rfb.copyRectSrcY, w, h,
-			 x - rfb.copyRectSrcX, y - rfb.copyRectSrcY);
+                         x - rfb.copyRectSrcX, y - rfb.copyRectSrcY);
 
     scheduleRepaint(x, y, w, h);
   }
@@ -341,7 +333,6 @@
   //
   // Handle an RRE-encoded rectangle.
   //
-
   void handleRRERect(int x, int y, int w, int h) throws IOException {
 
     int nSubrects = rfb.is.readInt();
@@ -371,7 +362,6 @@
   //
   // Handle a CoRRE-encoded rectangle.
   //
-
   void handleCoRRERect(int x, int y, int w, int h) throws IOException {
 
     int nSubrects = rfb.is.readInt();
@@ -403,7 +393,7 @@
   //
 
   // These colors should be kept between handleHextileSubrect() calls.
-  private Color hextile_bg, hextile_fg;
+  private Color hextile_bg,  hextile_fg;
 
   void handleHextileRect(int x, int y, int w, int h) throws IOException {
 
@@ -413,14 +403,14 @@
     for (int ty = y; ty < y + h; ty += 16) {
       int th = 16;
       if (y + h - ty < 16)
-	th = y + h - ty;
+        th = y + h - ty;
 
       for (int tx = x; tx < x + w; tx += 16) {
-	int tw = 16;
-	if (x + w - tx < 16)
-	  tw = x + w - tx;
+        int tw = 16;
+        if (x + w - tx < 16)
+          tw = x + w - tx;
 
-	handleHextileSubrect(tx, ty, tw, th);
+        handleHextileSubrect(tx, ty, tw, th);
       }
 
       // Finished with a row of tiles, now let's show it.
@@ -431,9 +421,8 @@
   //
   // Handle one tile in the Hextile-encoded data.
   //
-
   void handleHextileSubrect(int tx, int ty, int tw, int th)
-    throws IOException {
+      throws IOException {
 
     byte[] buf = new byte[256 * 4];
 
@@ -443,14 +432,14 @@
     if ((subencoding & rfb.HextileRaw) != 0) {
       int count, offset;
       for (int j = ty; j < ty + th; j++) {
-	rfb.is.readFully(buf, 0, tw * 4);
-	offset = j * rfb.framebufferWidth + tx;
-	for (count = 0; count < tw; count++) {
-	  pixels24[offset + count] =
-	    (buf[count * 4 + 2] & 0xFF) << 16 |
-	    (buf[count * 4 + 1] & 0xFF) << 8 |
-	    (buf[count * 4] & 0xFF);
-	}
+        rfb.is.readFully(buf, 0, tw * 4);
+        offset = j * rfb.framebufferWidth + tx;
+        for (count = 0; count < tw; count++) {
+          pixels24[offset + count] =
+              (buf[count * 4 + 2] & 0xFF) << 16 |
+              (buf[count * 4 + 1] & 0xFF) << 8 |
+              (buf[count * 4] & 0xFF);
+        }
       }
       handleUpdatedPixels(tx, ty, tw, th);
       return;
@@ -479,27 +468,27 @@
     int b1, b2, sx, sy, sw, sh;
     if ((subencoding & rfb.HextileSubrectsColoured) != 0) {
       for (int j = 0; j < nSubrects; j++) {
-	rfb.is.readFully(buf, 0, 4);
-	hextile_fg = new Color(buf[2] & 0xFF, buf[1] & 0xFF, buf[0] & 0xFF);
-	b1 = rfb.is.readUnsignedByte();
-	b2 = rfb.is.readUnsignedByte();
-	sx = tx + (b1 >> 4);
-	sy = ty + (b1 & 0xf);
-	sw = (b2 >> 4) + 1;
-	sh = (b2 & 0xf) + 1;
-	memGraphics.setColor(hextile_fg);
-	memGraphics.fillRect(sx, sy, sw, sh);
+        rfb.is.readFully(buf, 0, 4);
+        hextile_fg = new Color(buf[2] & 0xFF, buf[1] & 0xFF, buf[0] & 0xFF);
+        b1 = rfb.is.readUnsignedByte();
+        b2 = rfb.is.readUnsignedByte();
+        sx = tx + (b1 >> 4);
+        sy = ty + (b1 & 0xf);
+        sw = (b2 >> 4) + 1;
+        sh = (b2 & 0xf) + 1;
+        memGraphics.setColor(hextile_fg);
+        memGraphics.fillRect(sx, sy, sw, sh);
       }
     } else {
       memGraphics.setColor(hextile_fg);
       for (int j = 0; j < nSubrects; j++) {
-	b1 = rfb.is.readUnsignedByte();
-	b2 = rfb.is.readUnsignedByte();
-	sx = tx + (b1 >> 4);
-	sy = ty + (b1 & 0xf);
-	sw = (b2 >> 4) + 1;
-	sh = (b2 & 0xf) + 1;
-	memGraphics.fillRect(sx, sy, sw, sh);
+        b1 = rfb.is.readUnsignedByte();
+        b2 = rfb.is.readUnsignedByte();
+        sx = tx + (b1 >> 4);
+        sy = ty + (b1 & 0xf);
+        sw = (b2 >> 4) + 1;
+        sh = (b2 & 0xf) + 1;
+        memGraphics.fillRect(sx, sy, sw, sh);
       }
     }
   }
@@ -507,7 +496,6 @@
   //
   // Handle a Zlib-encoded rectangle.
   //
-
   void handleZlibRect(int x, int y, int w, int h) throws Exception {
 
     int nBytes = rfb.is.readInt();
@@ -524,17 +512,16 @@
       byte[] buf = new byte[w * 4];
       int i, offset;
       for (int dy = y; dy < y + h; dy++) {
-	zlibInflater.inflate(buf);
-	offset = dy * rfb.framebufferWidth + x;
-	for (i = 0; i < w; i++) {
-	  pixels24[offset + i] =
-	    (buf[i * 4 + 2] & 0xFF) << 16 |
-	    (buf[i * 4 + 1] & 0xFF) << 8 |
-	    (buf[i * 4] & 0xFF);
-	}
+        zlibInflater.inflate(buf);
+        offset = dy * rfb.framebufferWidth + x;
+        for (i = 0; i < w; i++) {
+          pixels24[offset + i] =
+              (buf[i * 4 + 2] & 0xFF) << 16 |
+              (buf[i * 4 + 1] & 0xFF) << 8 |
+              (buf[i * 4] & 0xFF);
+        }
       }
-    }
-    catch (DataFormatException dfe) {
+    } catch (DataFormatException dfe) {
       throw new Exception(dfe.toString());
     }
 
@@ -545,7 +532,6 @@
   //
   // Handle a Tight-encoded rectangle.
   //
-
   void handleTightRect(int x, int y, int w, int h) throws Exception {
 
     int comp_ctl = rfb.is.readUnsignedByte();
@@ -553,7 +539,7 @@
     // Flush zlib streams if we are told by the server to do so.
     for (int stream_id = 0; stream_id < 4; stream_id++) {
       if ((comp_ctl & 1) != 0 && tightInflaters[stream_id] != null) {
-	tightInflaters[stream_id] = null;
+        tightInflaters[stream_id] = null;
       }
       comp_ctl >>= 1;
     }
@@ -589,13 +575,13 @@
       // Let the imageUpdate() method do the actual drawing, here just
       // wait until the image is fully loaded and drawn.
       synchronized(jpegRect) {
-	Toolkit.getDefaultToolkit().prepareImage(jpegImage, -1, -1, this);
-	try {
-	  // Wait no longer than three seconds.
-	  jpegRect.wait(3000);
-	} catch (InterruptedException e) {
-	  throw new Exception("Interrupted while decoding JPEG image");
-	}
+        Toolkit.getDefaultToolkit().prepareImage(jpegImage, -1, -1, this);
+        try {
+          // Wait no longer than three seconds.
+          jpegRect.wait(3000);
+        } catch (InterruptedException e) {
+          throw new Exception("Interrupted while decoding JPEG image");
+        }
       }
 
       // Done, jpegRect is not needed any more.
@@ -612,20 +598,20 @@
     if ((comp_ctl & rfb.TightExplicitFilter) != 0) {
       int filter_id = rfb.is.readUnsignedByte();
       if (filter_id == rfb.TightFilterPalette) {
-	numColors = rfb.is.readUnsignedByte() + 1;
-	byte[] buf = new byte[numColors * 3];
-	rfb.is.readFully(buf);
-	for (int i = 0; i < numColors; i++) {
-	  palette24[i] = ((buf[i * 3] & 0xFF) << 16 |
-			  (buf[i * 3 + 1] & 0xFF) << 8 |
-			  (buf[i * 3 + 2] & 0xFF));
-	}
-	if (numColors == 2)
-	  rowSize = (w + 7) / 8;
+        numColors = rfb.is.readUnsignedByte() + 1;
+        byte[] buf = new byte[numColors * 3];
+        rfb.is.readFully(buf);
+        for (int i = 0; i < numColors; i++) {
+          palette24[i] = ((buf[i * 3] & 0xFF) << 16 |
+              (buf[i * 3 + 1] & 0xFF) << 8 |
+              (buf[i * 3 + 2] & 0xFF));
+        }
+        if (numColors == 2)
+          rowSize = (w + 7) / 8;
       } else if (filter_id == rfb.TightFilterGradient) {
-	useGradient = true;
+        useGradient = true;
       } else if (filter_id != rfb.TightFilterCopy) {
-	throw new Exception("Incorrect tight filter id: " + filter_id);
+        throw new Exception("Incorrect tight filter id: " + filter_id);
       }
     }
     if (numColors == 0)
@@ -636,41 +622,41 @@
     if (dataSize < rfb.TightMinToCompress) {
       // Data size is small - not compressed with zlib.
       if (numColors != 0) {
-	// Indexed colors.
-	byte[] indexedData = new byte[dataSize];
-	rfb.is.readFully(indexedData);
-	if (numColors == 2) {
-	  // Two colors.
-	  decodeMonoData(x, y, w, h, indexedData, palette24);
-	} else {
-	  // 3..255 colors.
-	  int i = 0;
-	  for (int dy = y; dy < y + h; dy++) {
-	    for (int dx = x; dx < x + w; dx++) {
-	      pixels24[dy * rfb.framebufferWidth + dx] =
-		palette24[indexedData[i++] & 0xFF];
-	    }
-	  }
-	}
+        // Indexed colors.
+        byte[] indexedData = new byte[dataSize];
+        rfb.is.readFully(indexedData);
+        if (numColors == 2) {
+          // Two colors.
+          decodeMonoData(x, y, w, h, indexedData, palette24);
+        } else {
+          // 3..255 colors.
+          int i = 0;
+          for (int dy = y; dy < y + h; dy++) {
+            for (int dx = x; dx < x + w; dx++) {
+              pixels24[dy * rfb.framebufferWidth + dx] =
+                  palette24[indexedData[i++] & 0xFF];
+            }
+          }
+        }
       } else if (useGradient) {
-	// "Gradient"-processed data
-	byte[] buf = new byte[w * h * 3];
-	rfb.is.readFully(buf);
-	decodeGradientData(x, y, w, h, buf);
+        // "Gradient"-processed data
+        byte[] buf = new byte[w * h * 3];
+        rfb.is.readFully(buf);
+        decodeGradientData(x, y, w, h, buf);
       } else {
-	// Raw truecolor data.
-	byte[] buf = new byte[w * 3];
-	int i, offset;
-	for (int dy = y; dy < y + h; dy++) {
-	  rfb.is.readFully(buf);
-	  offset = dy * rfb.framebufferWidth + x;
-	  for (i = 0; i < w; i++) {
-	    pixels24[offset + i] =
-	      (buf[i * 3] & 0xFF) << 16 |
-	      (buf[i * 3 + 1] & 0xFF) << 8 |
-	      (buf[i * 3 + 2] & 0xFF);
-	  }
-	}
+        // Raw truecolor data.
+        byte[] buf = new byte[w * 3];
+        int i, offset;
+        for (int dy = y; dy < y + h; dy++) {
+          rfb.is.readFully(buf);
+          offset = dy * rfb.framebufferWidth + x;
+          for (i = 0; i < w; i++) {
+            pixels24[offset + i] =
+                (buf[i * 3] & 0xFF) << 16 |
+                (buf[i * 3 + 1] & 0xFF) << 8 |
+                (buf[i * 3 + 2] & 0xFF);
+          }
+        }
       }
     } else {
       // Data was compressed with zlib.
@@ -679,51 +665,50 @@
       rfb.is.readFully(zlibData);
       int stream_id = comp_ctl & 0x03;
       if (tightInflaters[stream_id] == null) {
-	tightInflaters[stream_id] = new Inflater();
+        tightInflaters[stream_id] = new Inflater();
       }
       Inflater myInflater = tightInflaters[stream_id];
       myInflater.setInput(zlibData);
       try {
-	if (numColors != 0) {
-	  // Indexed colors.
-	  byte[] indexedData = new byte[dataSize];
-	  myInflater.inflate(indexedData);
-	  if (numColors == 2) {
-	    // Two colors.
-	    decodeMonoData(x, y, w, h, indexedData, palette24);
-	  } else {
-	    // More than two colors.
-	    int i = 0;
-	    for (int dy = y; dy < y + h; dy++) {
-	      for (int dx = x; dx < x + w; dx++) {
-		pixels24[dy * rfb.framebufferWidth + dx] =
-		  palette24[indexedData[i++] & 0xFF];
-	      }
-	    }
-	  }
-	} else if (useGradient) {
-	  // Compressed "Gradient"-filtered data.
-	  byte[] buf = new byte[w * h * 3];
-	  myInflater.inflate(buf);
-	  decodeGradientData(x, y, w, h, buf);
-	} else {
-	  // Compressed truecolor data.
-	  byte[] buf = new byte[w * 3];
-	  int i, offset;
-	  for (int dy = y; dy < y + h; dy++) {
-	    myInflater.inflate(buf);
-	    offset = dy * rfb.framebufferWidth + x;
-	    for (i = 0; i < w; i++) {
-	      pixels24[offset + i] =
-		(buf[i * 3] & 0xFF) << 16 |
-		(buf[i * 3 + 1] & 0xFF) << 8 |
-		(buf[i * 3 + 2] & 0xFF);
-	    }
-	  }
-	}
-      }
-      catch(DataFormatException dfe) {
-	throw new Exception(dfe.toString());
+        if (numColors != 0) {
+          // Indexed colors.
+          byte[] indexedData = new byte[dataSize];
+          myInflater.inflate(indexedData);
+          if (numColors == 2) {
+            // Two colors.
+            decodeMonoData(x, y, w, h, indexedData, palette24);
+          } else {
+            // More than two colors.
+            int i = 0;
+            for (int dy = y; dy < y + h; dy++) {
+              for (int dx = x; dx < x + w; dx++) {
+                pixels24[dy * rfb.framebufferWidth + dx] =
+                    palette24[indexedData[i++] & 0xFF];
+              }
+            }
+          }
+        } else if (useGradient) {
+          // Compressed "Gradient"-filtered data.
+          byte[] buf = new byte[w * h * 3];
+          myInflater.inflate(buf);
+          decodeGradientData(x, y, w, h, buf);
+        } else {
+          // Compressed truecolor data.
+          byte[] buf = new byte[w * 3];
+          int i, offset;
+          for (int dy = y; dy < y + h; dy++) {
+            myInflater.inflate(buf);
+            offset = dy * rfb.framebufferWidth + x;
+            for (i = 0; i < w; i++) {
+              pixels24[offset + i] =
+                  (buf[i * 3] & 0xFF) << 16 |
+                  (buf[i * 3 + 1] & 0xFF) << 8 |
+                  (buf[i * 3 + 2] & 0xFF);
+            }
+          }
+        }
+      } catch (DataFormatException dfe) {
+        throw new Exception(dfe.toString());
       }
     }
 
@@ -734,7 +719,6 @@
   //
   // Decode 1bpp-encoded bi-color rectangle.
   //
-
   void decodeMonoData(int x, int y, int w, int h, byte[] src, int[] palette) {
 
     int dx, dy, n;
@@ -744,12 +728,12 @@
 
     for (dy = 0; dy < h; dy++) {
       for (dx = 0; dx < w / 8; dx++) {
-	b = src[dy*rowBytes+dx];
-	for (n = 7; n >= 0; n--)
-	  pixels24[i++] = palette[b >> n & 1];
+        b = src[dy * rowBytes + dx];
+        for (n = 7; n >= 0; n--)
+          pixels24[i++] = palette[b >> n & 1];
       }
       for (n = 7; n >= 8 - w % 8; n--) {
-	pixels24[i++] = palette[src[dy*rowBytes+dx] >> n & 1];
+        pixels24[i++] = palette[src[dy * rowBytes + dx] >> n & 1];
       }
       i += (rfb.framebufferWidth - w);
     }
@@ -758,8 +742,7 @@
   //
   // Decode data processed with the "Gradient" filter.
   //
-
-  void decodeGradientData (int x, int y, int w, int h, byte[] buf) {
+  void decodeGradientData(int x, int y, int w, int h, byte[] buf) {
 
     int dx, dy, c;
     byte[] prevRow = new byte[w * 3];
@@ -773,27 +756,27 @@
 
       /* First pixel in a row */
       for (c = 0; c < 3; c++) {
-	pix[c] = (byte)(prevRow[c] + buf[dy * w * 3 + c]);
-	thisRow[c] = pix[c];
+        pix[c] = (byte)(prevRow[c] + buf[dy * w * 3 + c]);
+        thisRow[c] = pix[c];
       }
       pixels24[offset++] =
-	(pix[0] & 0xFF) << 16 | (pix[1] & 0xFF) << 8 | (pix[2] & 0xFF);
+          (pix[0] & 0xFF) << 16 | (pix[1] & 0xFF) << 8 | (pix[2] & 0xFF);
 
       /* Remaining pixels of a row */
       for (dx = 1; dx < w; dx++) {
-	for (c = 0; c < 3; c++) {
-	  est[c] = ((prevRow[dx * 3 + c] & 0xFF) + (pix[c] & 0xFF) -
-		    (prevRow[(dx-1) * 3 + c] & 0xFF));
-	  if (est[c] > 0xFF) {
-	    est[c] = 0xFF;
-	  } else if (est[c] < 0x00) {
-	    est[c] = 0x00;
-	  }
-	  pix[c] = (byte)(est[c] + buf[(dy * w + dx) * 3 + c]);
-	  thisRow[dx * 3 + c] = pix[c];
-	}
-	pixels24[offset++] =
-	  (pix[0] & 0xFF) << 16 | (pix[1] & 0xFF) << 8 | (pix[2] & 0xFF);
+        for (c = 0; c < 3; c++) {
+          est[c] = ((prevRow[dx * 3 + c] & 0xFF) + (pix[c] & 0xFF) -
+              (prevRow[(dx - 1) * 3 + c] & 0xFF));
+          if (est[c] > 0xFF) {
+            est[c] = 0xFF;
+          } else if (est[c] < 0x00) {
+            est[c] = 0x00;
+          }
+          pix[c] = (byte)(est[c] + buf[(dy * w + dx) * 3 + c]);
+          thisRow[dx * 3 + c] = pix[c];
+        }
+        pixels24[offset++] =
+            (pix[0] & 0xFF) << 16 | (pix[1] & 0xFF) << 8 | (pix[2] & 0xFF);
       }
 
       System.arraycopy(thisRow, 0, prevRow, 0, w * 3);
@@ -805,7 +788,6 @@
   //
   // Display newly updated area of pixels.
   //
-
   void handleUpdatedPixels(int x, int y, int w, int h) {
 
     // Draw updated pixels of the off-screen image.
@@ -819,18 +801,17 @@
   //
   // Tell JVM to repaint specified desktop area.
   //
-
   void scheduleRepaint(int x, int y, int w, int h) {
     if (rfb.fbs.isSeeking()) {
       // Do nothing, and remember we are seeking.
       seekMode = true;
     } else {
       if (seekMode) {
-	// Immediate repaint of the whole desktop after seeking.
-	repaint();
+        // Immediate repaint of the whole desktop after seeking.
+        repaint();
       } else {
-	// Usual incremental repaint.
-	repaint(player.deferScreenUpdates, x, y, w, h);
+        // Usual incremental repaint.
+        repaint(player.deferScreenUpdates, x, y, w, h);
       }
       seekMode = false;
     }
@@ -841,7 +822,6 @@
   // switching to the `paused' mode. In such cases we want to repaint
   // our desktop if we were seeking.
   //
-
   public void update(Observable o, Object arg) {
     // Immediate repaint of the whole desktop after seeking.
     repaint();
