diff --git a/java/CMakeLists.txt b/java/CMakeLists.txt
index f321594..86b9627 100644
--- a/java/CMakeLists.txt
+++ b/java/CMakeLists.txt
@@ -7,7 +7,7 @@
 
 find_package(Java)
 
-set(DEFAULT_JAVACFLAGS "-source 1.5 -target 1.5 -Xlint:all,-serial,-cast,-unchecked,-fallthrough,-dep-ann")
+set(DEFAULT_JAVACFLAGS "-source 1.5 -target 1.5 -Xlint:all,-serial,-cast,-unchecked,-fallthrough,-dep-ann,-deprecation")
 set(JAVACFLAGS ${DEFAULT_JAVACFLAGS} CACHE STRING
   "Java compiler flags (Default: ${DEFAULT_JAVACFLAGS})")
 message(STATUS "Java compiler flags = ${JAVACFLAGS}")
diff --git a/java/com/jcraft/jzlib/Adler32.java b/java/com/jcraft/jzlib/Adler32.java
index d8b6ef8..a789a5a 100644
--- a/java/com/jcraft/jzlib/Adler32.java
+++ b/java/com/jcraft/jzlib/Adler32.java
@@ -1,6 +1,6 @@
 /* -*-mode:java; c-basic-offset:2; -*- */
 /*
-Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved.
+Copyright (c) 2000-2011 ymnk, JCraft,Inc. All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are met:
@@ -34,61 +34,106 @@
 
 package com.jcraft.jzlib;
 
-final class Adler32{
+final public class Adler32 implements Checksum {
 
   // largest prime smaller than 65536
   static final private int BASE=65521; 
   // NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1
   static final private int NMAX=5552;
 
-  long adler32(long adler, byte[] buf, int index, int len){
-    if(buf == null){ return 1L; }
+  private long s1=1L;
+  private long s2=0L;
 
-    long s1=adler&0xffff;
-    long s2=(adler>>16)&0xffff;
-    int k;
+  public void reset(long init){
+    s1=init&0xffff;
+    s2=(init>>16)&0xffff;
+  }
 
-    while(len > 0) {
-      k=len<NMAX?len:NMAX;
+  public void reset(){
+    s1=1L;
+    s2=0L;
+  }
+
+  public long getValue(){
+    return ((s2<<16)|s1);
+  }
+
+  public void update(byte[] buf, int index, int len){
+
+    if(len==1){
+      s1+=buf[index++]&0xff; s2+=s1;
+      s1%=BASE;
+      s2%=BASE;
+      return;
+    }
+
+    int len1 = len/NMAX;
+    int len2 = len%NMAX;
+    while(len1-->0) {
+      int k=NMAX;
       len-=k;
-      while(k>=16){
-        s1+=buf[index++]&0xff; s2+=s1;
-        s1+=buf[index++]&0xff; s2+=s1;
-        s1+=buf[index++]&0xff; s2+=s1;
-        s1+=buf[index++]&0xff; s2+=s1;
-        s1+=buf[index++]&0xff; s2+=s1;
-        s1+=buf[index++]&0xff; s2+=s1;
-        s1+=buf[index++]&0xff; s2+=s1;
-        s1+=buf[index++]&0xff; s2+=s1;
-        s1+=buf[index++]&0xff; s2+=s1;
-        s1+=buf[index++]&0xff; s2+=s1;
-        s1+=buf[index++]&0xff; s2+=s1;
-        s1+=buf[index++]&0xff; s2+=s1;
-        s1+=buf[index++]&0xff; s2+=s1;
-        s1+=buf[index++]&0xff; s2+=s1;
-        s1+=buf[index++]&0xff; s2+=s1;
-        s1+=buf[index++]&0xff; s2+=s1;
-        k-=16;
-      }
-      if(k!=0){
-        do{
-          s1+=buf[index++]&0xff; s2+=s1;
-        }
-        while(--k!=0);
+      while(k-->0){
+	s1+=buf[index++]&0xff; s2+=s1;
       }
       s1%=BASE;
       s2%=BASE;
     }
-    return (s2<<16)|s1;
+
+    int k=len2;
+    len-=k;
+    while(k-->0){
+      s1+=buf[index++]&0xff; s2+=s1;
+    }
+    s1%=BASE;
+    s2%=BASE;
   }
 
-  /*
+  public Adler32 copy(){
+    Adler32 foo = new Adler32();
+    foo.s1 = this.s1;
+    foo.s2 = this.s2;
+    return foo;
+  }
+
+  // The following logic has come from zlib.1.2.
+  static long combine(long adler1, long adler2, long len2){
+    long BASEL = (long)BASE;
+    long sum1;
+    long sum2;
+    long rem;  // unsigned int
+
+    rem = len2 % BASEL;
+    sum1 = adler1 & 0xffffL;
+    sum2 = rem * sum1;
+    sum2 %= BASEL; // MOD(sum2);
+    sum1 += (adler2 & 0xffffL) + BASEL - 1;
+    sum2 += ((adler1 >> 16) & 0xffffL) + ((adler2 >> 16) & 0xffffL) + BASEL - rem;
+    if (sum1 >= BASEL) sum1 -= BASEL;
+    if (sum1 >= BASEL) sum1 -= BASEL;
+    if (sum2 >= (BASEL << 1)) sum2 -= (BASEL << 1);
+    if (sum2 >= BASEL) sum2 -= BASEL;
+    return sum1 | (sum2 << 16);
+  }
+
+/*
   private java.util.zip.Adler32 adler=new java.util.zip.Adler32();
-  long adler32(long value, byte[] buf, int index, int len){
-    if(value==1) {adler.reset();}
+  public void update(byte[] buf, int index, int len){
     if(buf==null) {adler.reset();}
     else{adler.update(buf, index, len);}
+  }
+  public void reset(){
+    adler.reset();
+  }
+  public void reset(long init){
+    if(init==1L){
+      adler.reset();
+    }
+    else{
+      System.err.println("unsupported operation");
+    }
+  }
+  public long getValue(){
     return adler.getValue();
   }
-  */
+*/
 }
diff --git a/java/com/jcraft/jzlib/CRC32.java b/java/com/jcraft/jzlib/CRC32.java
new file mode 100644
index 0000000..3045796
--- /dev/null
+++ b/java/com/jcraft/jzlib/CRC32.java
@@ -0,0 +1,179 @@
+/* -*-mode:java; c-basic-offset:2; -*- */
+/*
+Copyright (c) 2011 ymnk, JCraft,Inc. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+  1. Redistributions of source code must retain the above copyright notice,
+     this list of conditions and the following disclaimer.
+
+  2. Redistributions in binary form must reproduce the above copyright 
+     notice, this list of conditions and the following disclaimer in 
+     the documentation and/or other materials provided with the distribution.
+
+  3. The names of the authors may not be used to endorse or promote products
+     derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
+INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+/*
+ * This program is based on zlib-1.1.3, so all credit should go authors
+ * Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu)
+ * and contributors of zlib.
+ */
+
+package com.jcraft.jzlib;
+
+final public class CRC32 implements Checksum {
+
+  /*
+   *  The following logic has come from RFC1952.
+   */
+  private int v = 0;
+  private static int[] crc_table = null;
+  static {
+    crc_table = new int[256];
+    for (int n = 0; n < 256; n++) {
+      int c = n;
+      for (int k = 8;  --k >= 0; ) {
+        if ((c & 1) != 0)
+	  c = 0xedb88320 ^ (c >>> 1);
+        else
+          c = c >>> 1;
+      }
+      crc_table[n] = c;
+    }
+  }
+
+  public void update (byte[] buf, int index, int len) {
+    int c = ~v;
+    while (--len >= 0)
+      c = crc_table[(c^buf[index++])&0xff]^(c >>> 8);
+    v = ~c;
+  }
+
+  public void reset(){
+    v = 0;
+  }
+
+  public void reset(long vv){
+    v = (int)(vv&0xffffffffL);
+  }
+
+  public long getValue(){
+    return (long)(v&0xffffffffL);
+  }
+
+  // The following logic has come from zlib.1.2.
+  private static final int GF2_DIM = 32;
+  static long combine(long crc1, long crc2, long len2){
+    long row;
+    long[] even = new long[GF2_DIM];
+    long[] odd = new long[GF2_DIM];
+
+    // degenerate case (also disallow negative lengths)
+    if (len2 <= 0)
+      return crc1;
+
+    // put operator for one zero bit in odd
+    odd[0] = 0xedb88320L;          // CRC-32 polynomial
+    row = 1;
+    for (int n = 1; n < GF2_DIM; n++) {
+        odd[n] = row;
+        row <<= 1;
+    }
+
+    // put operator for two zero bits in even
+    gf2_matrix_square(even, odd);
+
+    // put operator for four zero bits in odd
+    gf2_matrix_square(odd, even);
+
+    // apply len2 zeros to crc1 (first square will put the operator for one
+    // zero byte, eight zero bits, in even)
+    do {
+      // apply zeros operator for this bit of len2
+      gf2_matrix_square(even, odd);
+      if ((len2 & 1)!=0)
+        crc1 = gf2_matrix_times(even, crc1);
+      len2 >>= 1;
+
+      // if no more bits set, then done
+      if (len2 == 0)
+        break;
+
+      // another iteration of the loop with odd and even swapped
+      gf2_matrix_square(odd, even);
+      if ((len2 & 1)!=0)
+        crc1 = gf2_matrix_times(odd, crc1);
+      len2 >>= 1;
+
+      // if no more bits set, then done
+    } while (len2 != 0);
+
+    /* return combined crc */
+    crc1 ^= crc2;
+    return crc1;
+  }
+
+  private static long gf2_matrix_times(long[] mat, long vec){
+    long sum = 0;
+    int index = 0;
+    while (vec!=0) {
+      if ((vec & 1)!=0)
+        sum ^= mat[index];
+      vec >>= 1;
+      index++;
+    }
+    return sum;
+  }
+
+  static final void gf2_matrix_square(long[] square, long[] mat) {
+    for (int n = 0; n < GF2_DIM; n++)
+      square[n] = gf2_matrix_times(mat, mat[n]);
+  }
+
+  /*
+  private java.util.zip.CRC32 crc32 = new java.util.zip.CRC32();
+
+  public void update(byte[] buf, int index, int len){
+    if(buf==null) {crc32.reset();}
+    else{crc32.update(buf, index, len);}
+  }
+  public void reset(){
+    crc32.reset();
+  }
+  public void reset(long init){
+    if(init==0L){
+      crc32.reset();
+    }
+    else{
+      System.err.println("unsupported operation");
+    }
+  }
+  public long getValue(){
+    return crc32.getValue();
+  }
+*/
+  public CRC32 copy(){
+    CRC32 foo = new CRC32();
+    foo.v = this.v;
+    return foo;
+  }
+
+  public static int[] getCRC32Table(){
+    int[] tmp = new int[crc_table.length];
+    System.arraycopy(crc_table, 0, tmp, 0, tmp.length);
+    return tmp;
+  }
+}
diff --git a/java/com/jcraft/jzlib/ChangeLog b/java/com/jcraft/jzlib/ChangeLog
index c828fae..d963cff 100644
--- a/java/com/jcraft/jzlib/ChangeLog
+++ b/java/com/jcraft/jzlib/ChangeLog
@@ -1,17 +1,54 @@
 ChangeLog of JZlib
 ====================================================================
-Last modified: Thu Aug 18 16:16:06 UTC 2005
+Last modified: Mon Feb 20 06:06:07 UTC 2012
 
-	
-Changes since version 1.0.6:	
-- change: memory and performance optimizations in the inflate operation.
-  Many thanks to Paul Wakefield at platx.org(http://www.platx.org), who 
-  suggested above improvements.
+
+Changes since version 1.1.0:
+- fixed a bug in DeflaterOutputStream#write() with empty data.  9d4616f
+- fixed a bug in processing unwrapped data with InfalterInputStream. d35db2
+- fixed bugs reported in https://github.com/ymnk/jzlib/pull/5 e4aa20
+  - comments and filename in GZIPHeader must be in ISO-8859-1 encoding
+  - fixing a bug in GZIPHeader#setOS(int os)
+- some refactoring code. e912088 6900f5 614fdf
+- improving the performace of Adler32#update method.  6900f5
+- constructors of Alder32 and CRC32 become public. 30c4cf
+- added ZStream#end() and ZStream#finished().  6b55e3
+- exposed useful constants for jruby.  e17ad1
+- updated pom.xml to delete "souceDirectory"
+  No need to specify sourceDirectory if the project follows maven
+  standard.
+- updated configurations to use sbt 0.11.1
+
+
+Changes since version 1.0.7:
+- supported some new functionalities, which have been introduced since 'zlib' 1.2.
+  - JZlib#{adler32,crc32}_combine,
+  - JZlib can handle gzip file format(RFC1952).
+- added following classes,
+  - DeflaterOutputStream
+  - InflaterInputStream
+  - GZIPOutputStream
+  - GZIPInputStream
+  - Inflater
+  - Deflater
+  - ZStream has been deprecated.
+    Use Inflater and Deflater instead of it.
+  - GZIPHeader
+- re-implemented Z{Input,Output}Stream with {Deflater,Inflater}{I/O}Stream
+  - those classes have been deprecated.
+    Use DeflaterOutputStream and InfaterInputStream instead of them.
+- com/ -> src/main/java/com/
+- some tests under src/test/scala/
+- pom.xml for mvn, and projects/ for sbt.
+
+
+Changes since version 1.0.6:
+- change: memory and performance optimisations in the inflate operation.
 - change: added the nowrap argument to Z{Input,Output}?Stream.
 
-	
+
 Changes since version 1.0.5:
-- ZInputStream.read(byte[], int, int) method return sometimes zero 
+- ZInputStream.read(byte[], int, int) method return sometimes zero
   instead of -1 at the end of stream.
 - ZOutputStream.end() method should not declare IOException.
 - It should be possible to call ZOutputStream.end() method more times 
@@ -20,64 +57,64 @@
 - ZOutputStream.finish() method should not ignore IOException from flush().
 Many thanks to Matej Kraus at seznam.cz , who pointed out above problems.
 
-	
+
 Changes since version 1.0.4:
 - a minor bug fix in ZInputStream
 
-	
+
 Changes since version 1.0.3:
 - fixed a bug in closing ZOutputStream.
   The inflating and deflating processes were not finished successfully.
 - added 'finish' and 'end' methods to ZOutputStream.java
 - added 'example/test_stream_deflate_inflate.java'
 
-	
+
 Changes since version 1.0.2:
 - enabled pure Java implementation of adler32 and
   commented out the dependency on J2SE in Adler32.java for J2ME users.
 
-	
+
 Changes since version 1.0.1:
 - fixed a bug in deflating some trivial data, for example,
-  large data chunk filled with zero.	
+  large data chunk filled with zero.
 - added 'version' method to JZlib class.
 
-	
+
 Changes since version 1.0.0:
 - added ZInputStream and ZOutputStream classes.
 - fixed a typo in LICENSE.txt.
 
-	
+
 Changes since version 0.0.9:
 - fixed a bug in setting a dictionary in the inflation process.
 - The license was changed to a BSD style license.
 - Z{Input,Output}Stream classes were deleted.
-	
-	
+
+
 Changes since version 0.0.8:
 - fixed a bug in handling a preset dictionary in the inflation process.
 
-	
+
 Changes since version 0.0.7:
 - added methods to control the window size (the size of the history
   buffer) and to handle the no-wrap option (no zlib header or check),
   which is the undocumented functionality of zlib.
 
-	
+
 Changes since version 0.0.6:
 - updated InfBlocks.java as zlib did to fix the vulnerability related to
   the 'double free'. Of course, JZlib is free from such a vulnerability
   like the 'double free', but JZlib had crashed with NullPointerException
-  by a specially-crafted block of invalid deflated data.	
+  by a specially-crafted block of invalid deflated data.
 
-	
+
 Changes since version 0.0.5:
 - added 'flush()' method to com.jcraft.jzlib.ZOutputStream.
-- fixed to take care when occurring the buffer overflow in 
+- fixed to take care when occurring the buffer overflow in
   com.jcraft.jzlib.ZOutputStream.
 Many thanks to Tim Bendfelt at cs.wisc.edu , who pointed out above problems.
-	
-	
+
+
 Changes since version 0.0.4:
 ............................
 - fixed a bug in Adler32 class.
@@ -87,11 +124,11 @@
 - modified ZOutputStream to be extended from OutputStream
   instead of FileOutputStream.
 - modified ZStream to be changeable wbits. Give wbits value to
-  the method 'deflateInit' of ZStream.	 
+  the method 'deflateInit' of ZStream.
 Many thanks to Bryan Keller<keller@neomar.com>, who reported bugs
 and made suggestions.
 
-	
+
 Changes since version 0.0.3:
 ............................
 - fixed a bug in the compression level 0.
diff --git a/java/com/jcraft/jzlib/Checksum.java b/java/com/jcraft/jzlib/Checksum.java
new file mode 100644
index 0000000..1139093
--- /dev/null
+++ b/java/com/jcraft/jzlib/Checksum.java
@@ -0,0 +1,43 @@
+/* -*-mode:java; c-basic-offset:2; -*- */
+/*
+Copyright (c) 2011 ymnk, JCraft,Inc. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+  1. Redistributions of source code must retain the above copyright notice,
+     this list of conditions and the following disclaimer.
+
+  2. Redistributions in binary form must reproduce the above copyright 
+     notice, this list of conditions and the following disclaimer in 
+     the documentation and/or other materials provided with the distribution.
+
+  3. The names of the authors may not be used to endorse or promote products
+     derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
+INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+/*
+ * This program is based on zlib-1.1.3, so all credit should go authors
+ * Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu)
+ * and contributors of zlib.
+ */
+
+package com.jcraft.jzlib;
+
+interface Checksum {
+  void update(byte[] buf, int index, int len);
+  void reset();
+  void reset(long init);
+  long getValue();
+  Checksum copy();
+}
diff --git a/java/com/jcraft/jzlib/Deflate.java b/java/com/jcraft/jzlib/Deflate.java
index 9978802..baaac9b 100644
--- a/java/com/jcraft/jzlib/Deflate.java
+++ b/java/com/jcraft/jzlib/Deflate.java
@@ -1,6 +1,6 @@
 /* -*-mode:java; c-basic-offset:2; -*- */
 /*
-Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved.
+Copyright (c) 2000-2011 ymnk, JCraft,Inc. All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are met:
@@ -35,7 +35,7 @@
 package com.jcraft.jzlib;
 
 public 
-final class Deflate{
+final class Deflate implements Cloneable {
 
   static final private int MAX_MEM_LEVEL=9;
 
@@ -169,13 +169,13 @@
 
   static final private int END_BLOCK=256;
 
-  ZStream strm;         // pointer back to this zlib stream
+  ZStream strm;        // pointer back to this zlib stream
   int status;           // as the name implies
   byte[] pending_buf;   // output still pending
   int pending_buf_size; // size of pending_buf
   int pending_out;      // next pending byte to output to the stream
   int pending;          // nb of bytes in the pending buffer
-  int noheader;         // suppress zlib header and adler32
+  int wrap = 1;
   byte data_type;       // UNKNOWN, BINARY or ASCII
   byte method;          // STORED (for zip only) or DEFLATED
   int last_flush;       // value of flush param for previous deflate call
@@ -317,7 +317,10 @@
   // are always zero.
   int bi_valid;
 
-  Deflate(){
+  GZIPHeader gheader = null;
+
+  Deflate(ZStream strm){
+    this.strm=strm;
     dyn_ltree=new short[HEAP_SIZE*2];
     dyn_dtree=new short[(2*D_CODES+1)*2]; // distance tree
     bl_tree=new short[(2*BL_CODES+1)*2];  // Huffman tree for bit lengths
@@ -1311,17 +1314,22 @@
     if (best_len <= lookahead) return best_len;
     return lookahead;
   }
-    
-  int deflateInit(ZStream strm, int level, int bits){
-    return deflateInit2(strm, level, Z_DEFLATED, bits, DEF_MEM_LEVEL,
+
+  int deflateInit(int level, int bits, int memlevel){
+    return deflateInit(level, Z_DEFLATED, bits, memlevel,
 			Z_DEFAULT_STRATEGY);
   }
-  int deflateInit(ZStream strm, int level){
-    return deflateInit(strm, level, MAX_WBITS);
+    
+  int deflateInit(int level, int bits){
+    return deflateInit(level, Z_DEFLATED, bits, DEF_MEM_LEVEL,
+			Z_DEFAULT_STRATEGY);
   }
-  int deflateInit2(ZStream strm, int level, int method,  int windowBits,
-		   int memLevel, int strategy){
-    int noheader = 0;
+  int deflateInit(int level){
+    return deflateInit(level, MAX_WBITS);
+  }
+  private int deflateInit(int level, int method,  int windowBits,
+			  int memLevel, int strategy){
+    int wrap = 1;
     //    byte[] my_version=ZLIB_VERSION;
 
     //
@@ -1335,9 +1343,14 @@
     if (level == Z_DEFAULT_COMPRESSION) level = 6;
 
     if (windowBits < 0) { // undocumented feature: suppress zlib header
-      noheader = 1;
+      wrap = 0;
       windowBits = -windowBits;
     }
+    else if(windowBits > 15){
+      wrap = 2;
+      windowBits -= 16;
+      strm.adler=new CRC32();
+    }
 
     if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || 
 	method != Z_DEFLATED ||
@@ -1348,7 +1361,7 @@
 
     strm.dstate = (Deflate)this;
 
-    this.noheader = noheader;
+    this.wrap = wrap;
     w_bits = windowBits;
     w_size = 1 << w_bits;
     w_mask = w_size - 1;
@@ -1374,15 +1387,13 @@
 
     this.level = level;
 
-//System.out.println("level="+level);
-
     this.strategy = strategy;
     this.method = (byte)method;
 
-    return deflateReset(strm);
+    return deflateReset();
   }
 
-  int deflateReset(ZStream strm){
+  int deflateReset(){
     strm.total_in = strm.total_out = 0;
     strm.msg = null; //
     strm.data_type = Z_UNKNOWN;
@@ -1390,11 +1401,11 @@
     pending = 0;
     pending_out = 0;
 
-    if(noheader < 0) {
-      noheader = 0; // was set to -1 by deflate(..., Z_FINISH);
+    if(wrap < 0){
+      wrap = -wrap;
     }
-    status = (noheader!=0) ? BUSY_STATE : INIT_STATE;
-    strm.adler=strm._adler.adler32(0, null, 0, 0);
+    status = (wrap==0) ? BUSY_STATE : INIT_STATE;
+    strm.adler.reset();
 
     last_flush = Z_NO_FLUSH;
 
@@ -1417,7 +1428,7 @@
     return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK;
   }
 
-  int deflateParams(ZStream strm, int _level, int _strategy){
+  int deflateParams(int _level, int _strategy){
     int err=Z_OK;
 
     if(_level == Z_DEFAULT_COMPRESSION){
@@ -1445,14 +1456,14 @@
     return err;
   }
 
-  int deflateSetDictionary (ZStream strm, byte[] dictionary, int dictLength){
+  int deflateSetDictionary (byte[] dictionary, int dictLength){
     int length = dictLength;
     int index=0;
 
     if(dictionary == null || status != INIT_STATE)
       return Z_STREAM_ERROR;
 
-    strm.adler=strm._adler.adler32(strm.adler, dictionary, 0, dictLength);
+    strm.adler.update(dictionary, 0, dictLength);
 
     if(length < MIN_MATCH) return Z_OK;
     if(length > w_size-MIN_LOOKAHEAD){
@@ -1478,7 +1489,7 @@
     return Z_OK;
   }
 
-  int deflate(ZStream strm, int flush){
+  int deflate(int flush){
     int old_flush;
 
     if(flush>Z_FINISH || flush<0){
@@ -1496,12 +1507,17 @@
       return Z_BUF_ERROR;
     }
 
-    this.strm = strm; // just in case
     old_flush = last_flush;
     last_flush = flush;
 
     // Write the zlib header
     if(status == INIT_STATE) {
+      if(wrap == 2){
+        getGZIPHeader().put(this);
+        status=BUSY_STATE;
+        strm.adler.reset();
+      }
+      else{
       int header = (Z_DEFLATED+((w_bits-8)<<4))<<8;
       int level_flags=((level-1)&0xff)>>1;
 
@@ -1516,17 +1532,18 @@
 
       // Save the adler32 of the preset dictionary:
       if(strstart!=0){
-        putShortMSB((int)(strm.adler>>>16));
-        putShortMSB((int)(strm.adler&0xffff));
+        long adler=strm.adler.getValue();
+        putShortMSB((int)(adler>>>16));
+        putShortMSB((int)(adler&0xffff));
       }
-      strm.adler=strm._adler.adler32(0, null, 0, 0);
+      strm.adler.reset();
+      }
     }
 
     // Flush as much pending output as possible
     if(pending != 0) {
       strm.flush_pending();
       if(strm.avail_out == 0) {
-	//System.out.println("  avail_out==0");
 	// Since avail_out is 0, deflate will be called again with
 	// more output space, but possibly with both pending and
 	// avail_in equal to zero. There won't be anything to do,
@@ -1608,16 +1625,127 @@
     }
 
     if(flush!=Z_FINISH) return Z_OK;
-    if(noheader!=0) return Z_STREAM_END;
+    if(wrap<=0) return Z_STREAM_END;
 
-    // Write the zlib trailer (adler32)
-    putShortMSB((int)(strm.adler>>>16));
-    putShortMSB((int)(strm.adler&0xffff));
+    if(wrap==2){
+      long adler=strm.adler.getValue();
+      put_byte((byte)(adler&0xff));
+      put_byte((byte)((adler>>8)&0xff));
+      put_byte((byte)((adler>>16)&0xff));
+      put_byte((byte)((adler>>24)&0xff));
+      put_byte((byte)(strm.total_in&0xff));
+      put_byte((byte)((strm.total_in>>8)&0xff));
+      put_byte((byte)((strm.total_in>>16)&0xff));
+      put_byte((byte)((strm.total_in>>24)&0xff));
+
+      getGZIPHeader().setCRC(adler);
+    } 
+    else{
+      // Write the zlib trailer (adler32)
+      long adler=strm.adler.getValue();
+      putShortMSB((int)(adler>>>16));
+      putShortMSB((int)(adler&0xffff));
+    }
+
     strm.flush_pending();
 
     // If avail_out is zero, the application will call deflate again
     // to flush the rest.
-    noheader = -1; // write the trailer only once!
+
+    if(wrap > 0) wrap = -wrap; // write the trailer only once!
     return pending != 0 ? Z_OK : Z_STREAM_END;
   }
+
+  static int deflateCopy(ZStream dest, ZStream src){
+
+    if(src.dstate == null){
+      return Z_STREAM_ERROR;
+    }
+
+    if(src.next_in!=null){
+      dest.next_in = new byte[src.next_in.length];
+      System.arraycopy(src.next_in, 0, dest.next_in, 0, src.next_in.length);
+    }
+    dest.next_in_index = src.next_in_index;
+    dest.avail_in = src.avail_in;
+    dest.total_in = src.total_in;
+
+    if(src.next_out!=null){
+      dest.next_out = new byte[src.next_out.length];
+      System.arraycopy(src.next_out, 0, dest.next_out ,0 , src.next_out.length);
+    }
+
+    dest.next_out_index = src.next_out_index;
+    dest.avail_out = src.avail_out;
+    dest.total_out = src.total_out;
+
+    dest.msg = src.msg;
+    dest.data_type = src.data_type;
+    dest.adler = src.adler.copy();
+
+    try{
+      dest.dstate = (Deflate)src.dstate.clone();
+      dest.dstate.strm = dest;
+    }
+    catch(CloneNotSupportedException e){
+      //
+    }
+    return Z_OK;
+  }
+
+  public Object clone() throws CloneNotSupportedException {
+    Deflate dest = (Deflate)super.clone();
+
+    dest.pending_buf = dup(dest.pending_buf);
+    dest.window = dup(dest.window);
+
+    dest.prev = dup(dest.prev);
+    dest.head = dup(dest.head);
+    dest.dyn_ltree = dup(dest.dyn_ltree);
+    dest.dyn_dtree = dup(dest.dyn_dtree);
+    dest.bl_tree = dup(dest.bl_tree);
+
+    dest.bl_count = dup(dest.bl_count);
+    dest.heap = dup(dest.heap);
+    dest.depth = dup(dest.depth);
+
+    dest.l_desc.dyn_tree = dest.dyn_ltree;
+    dest.d_desc.dyn_tree = dest.dyn_dtree;
+    dest.bl_desc.dyn_tree = dest.bl_tree;
+
+    /*
+    dest.l_desc.stat_desc = StaticTree.static_l_desc;
+    dest.d_desc.stat_desc = StaticTree.static_d_desc;
+    dest.bl_desc.stat_desc = StaticTree.static_bl_desc;
+    */
+
+    if(dest.gheader!=null){
+      dest.gheader = (GZIPHeader)dest.gheader.clone();
+    }
+
+    return dest;
+  }
+
+  private byte[] dup(byte[] buf){
+    byte[] foo = new byte[buf.length];
+    System.arraycopy(buf, 0, foo, 0, foo.length);
+    return foo;
+  }
+  private short[] dup(short[] buf){
+    short[] foo = new short[buf.length];
+    System.arraycopy(buf, 0, foo, 0, foo.length);
+    return foo;
+  }
+  private int[] dup(int[] buf){
+    int[] foo = new int[buf.length];
+    System.arraycopy(buf, 0, foo, 0, foo.length);
+    return foo;
+  }
+
+  synchronized GZIPHeader getGZIPHeader(){
+    if(gheader==null){
+      gheader = new GZIPHeader();
+    }
+    return gheader;
+  }
 }
diff --git a/java/com/jcraft/jzlib/GZIPHeader.java b/java/com/jcraft/jzlib/GZIPHeader.java
new file mode 100644
index 0000000..0405e00
--- /dev/null
+++ b/java/com/jcraft/jzlib/GZIPHeader.java
@@ -0,0 +1,214 @@
+/* -*-mode:java; c-basic-offset:2; -*- */
+/*
+Copyright (c) 2011 ymnk, JCraft,Inc. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+  1. Redistributions of source code must retain the above copyright notice,
+     this list of conditions and the following disclaimer.
+
+  2. Redistributions in binary form must reproduce the above copyright 
+     notice, this list of conditions and the following disclaimer in 
+     the documentation and/or other materials provided with the distribution.
+
+  3. The names of the authors may not be used to endorse or promote products
+     derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
+INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+/*
+ * This program is based on zlib-1.1.3, so all credit should go authors
+ * Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu)
+ * and contributors of zlib.
+ */
+
+package com.jcraft.jzlib;
+
+import java.io.UnsupportedEncodingException;
+
+/**
+ * @see "http://www.ietf.org/rfc/rfc1952.txt"
+ */
+public class GZIPHeader implements Cloneable {
+
+  public static final byte OS_MSDOS = (byte) 0x00;
+  public static final byte OS_AMIGA = (byte) 0x01;
+  public static final byte OS_VMS = (byte) 0x02;
+  public static final byte OS_UNIX = (byte) 0x03;
+  public static final byte OS_ATARI = (byte) 0x05;
+  public static final byte OS_OS2 = (byte) 0x06;
+  public static final byte OS_MACOS = (byte) 0x07;
+  public static final byte OS_TOPS20 = (byte) 0x0a;
+  public static final byte OS_WIN32 = (byte) 0x0b;
+  public static final byte OS_VMCMS = (byte) 0x04;
+  public static final byte OS_ZSYSTEM = (byte) 0x08;
+  public static final byte OS_CPM = (byte) 0x09;
+  public static final byte OS_QDOS = (byte) 0x0c;
+  public static final byte OS_RISCOS = (byte) 0x0d;
+  public static final byte OS_UNKNOWN = (byte) 0xff;
+
+  boolean text = false;
+  private boolean fhcrc = false;
+  long time;
+  int xflags;
+  int os = 255;
+  byte[] extra;
+  byte[] name;
+  byte[] comment;
+  int hcrc;
+  long crc;
+  boolean done = false;
+  long mtime = 0;
+
+  public void setModifiedTime(long mtime) {
+    this.mtime = mtime;
+  }
+
+  public long getModifiedTime() {
+    return mtime;
+  }
+
+  public void setOS(int os) {
+    if((0<=os && os <=13) || os==255)
+      this.os=os;
+    else
+      throw new IllegalArgumentException("os: "+os);
+  }
+
+  public int getOS(){
+    return os;
+  }
+
+  public void setName(String name) {
+    try{
+      this.name=name.getBytes("ISO-8859-1");
+    }
+    catch(UnsupportedEncodingException e){
+      throw new IllegalArgumentException("name must be in ISO-8859-1 "+name);
+    }
+  }
+
+  public String getName(){
+    if(name==null) return "";
+    try {
+      return new String(name, "ISO-8859-1");
+    }
+    catch (UnsupportedEncodingException e) {
+      throw new InternalError(e.toString());
+    }
+  }
+
+  public void setComment(String comment) {
+    try{
+      this.comment=comment.getBytes("ISO-8859-1");
+    }
+    catch(UnsupportedEncodingException e){
+      throw new IllegalArgumentException("comment must be in ISO-8859-1 "+name);
+    }
+  }
+
+  public String getComment(){
+    if(comment==null) return "";
+    try {
+      return new String(comment, "ISO-8859-1");
+    }
+    catch (UnsupportedEncodingException e) {
+      throw new InternalError(e.toString());
+    }
+  }
+
+  public void setCRC(long crc){
+    this.crc = crc;
+  }
+
+  public long getCRC(){
+    return crc;
+  }
+
+  void put(Deflate d){
+    int flag = 0;
+    if(text){
+      flag |= 1;     // FTEXT
+    }
+    if(fhcrc){
+      flag |= 2;     // FHCRC
+    }
+    if(extra!=null){
+      flag |= 4;     // FEXTRA
+    }
+    if(name!=null){
+      flag |= 8;    // FNAME
+    }
+    if(comment!=null){
+      flag |= 16;   // FCOMMENT
+    }
+    int xfl = 0;
+    if(d.level == JZlib.Z_BEST_SPEED){
+      xfl |= 4;
+    }
+    else if (d.level == JZlib.Z_BEST_COMPRESSION){
+      xfl |= 2;
+    }
+
+    d.put_short((short)0x8b1f);  // ID1 ID2
+    d.put_byte((byte)8);         // CM(Compression Method)
+    d.put_byte((byte)flag);
+    d.put_byte((byte)mtime);
+    d.put_byte((byte)(mtime>>8));
+    d.put_byte((byte)(mtime>>16));
+    d.put_byte((byte)(mtime>>24));
+    d.put_byte((byte)xfl);
+    d.put_byte((byte)os);
+
+    if(extra!=null){
+      d.put_byte((byte)extra.length);
+      d.put_byte((byte)(extra.length>>8));
+      d.put_byte(extra, 0, extra.length);
+    }
+
+    if(name!=null){
+      d.put_byte(name, 0, name.length);
+      d.put_byte((byte)0);
+    }
+
+    if(comment!=null){
+      d.put_byte(comment, 0, comment.length);
+      d.put_byte((byte)0);
+    }
+  }
+
+  @Override
+  public Object clone() throws CloneNotSupportedException {
+    GZIPHeader gheader = (GZIPHeader)super.clone();
+    byte[] tmp;
+    if(gheader.extra!=null){
+      tmp=new byte[gheader.extra.length];
+      System.arraycopy(gheader.extra, 0, tmp, 0, tmp.length);
+      gheader.extra = tmp;
+    }
+
+    if(gheader.name!=null){
+      tmp=new byte[gheader.name.length];
+      System.arraycopy(gheader.name, 0, tmp, 0, tmp.length);
+      gheader.name = tmp;
+    }
+
+    if(gheader.comment!=null){
+      tmp=new byte[gheader.comment.length];
+      System.arraycopy(gheader.comment, 0, tmp, 0, tmp.length);
+      gheader.comment = tmp;
+    }
+
+    return gheader;
+  }
+}
diff --git a/java/com/jcraft/jzlib/InfBlocks.java b/java/com/jcraft/jzlib/InfBlocks.java
index f6997fc..6793c60 100644
--- a/java/com/jcraft/jzlib/InfBlocks.java
+++ b/java/com/jcraft/jzlib/InfBlocks.java
@@ -1,6 +1,6 @@
 /* -*-mode:java; c-basic-offset:2; -*- */
 /*
-Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved.
+Copyright (c) 2011 ymnk, JCraft,Inc. All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are met:
@@ -81,7 +81,15 @@
   int[] bb=new int[1]; // bit length tree depth 
   int[] tb=new int[1]; // bit length decoding tree 
 
-  InfCodes codes=new InfCodes();      // if CODES, current state 
+  int[] bl=new int[1];
+  int[] bd=new int[1];
+
+  int[][] tl=new int[1][];
+  int[][] td=new int[1][];
+  int[] tli=new int[1]; // tl_index
+  int[] tdi=new int[1]; // td_index
+
+  private final InfCodes codes;      // if CODES, current state 
 
   int last;            // true if this block is the last block 
 
@@ -93,22 +101,24 @@
   int end;             // one byte after sliding window 
   int read;            // window read pointer 
   int write;           // window write pointer 
-  Object checkfn;      // check function 
-  long check;          // check on output 
+  private boolean check;
 
-  InfTree inftree=new InfTree();
+  private final InfTree inftree=new InfTree();
 
-  InfBlocks(ZStream z, Object checkfn, int w){
+  private final ZStream z; 
+
+  InfBlocks(ZStream z, int w){
+    this.z=z;
+    this.codes=new InfCodes(this.z, this);
     hufts=new int[MANY*3];
     window=new byte[w];
     end=w;
-    this.checkfn = checkfn;
+    this.check = (z.istate.wrap==0) ? false : true;
     mode = TYPE;
-    reset(z, null);
+    reset();
   }
 
-  void reset(ZStream z, long[] c){
-    if(c!=null) c[0]=check;
+  void reset(){
     if(mode==BTREE || mode==DTREE){
     }
     if(mode==CODES){
@@ -118,12 +128,12 @@
     bitk=0;
     bitb=0;
     read=write=0;
-
-    if(checkfn != null)
-      z.adler=check=z._adler.adler32(0L, null, 0, 0);
+    if(check){
+      z.adler.reset();
+    }
   }
 
-  int proc(ZStream z, int r){
+  int proc(int r){
     int t;              // temporary storage
     int b;              // bit buffer
     int k;              // bits in bit buffer
@@ -150,7 +160,7 @@
 	    z.avail_in=n;
 	    z.total_in+=p-z.next_in_index;z.next_in_index=p;
 	    write=q;
-	    return inflate_flush(z,r);
+	    return inflate_flush(r);
 	  };
 	  n--;
 	  b|=(z.next_in[p++]&0xff)<<k;
@@ -168,15 +178,8 @@
           mode = LENS;                  // get length of stored block
           break;
         case 1:                         // fixed
-          {
-            int[] bl=new int[1];
-	    int[] bd=new int[1];
-            int[][] tl=new int[1][];
-	    int[][] td=new int[1][];
-
-	    InfTree.inflate_trees_fixed(bl, bd, tl, td, z);
-            codes.init(bl[0], bd[0], tl[0], 0, td[0], 0, z);
-          }
+          InfTree.inflate_trees_fixed(bl, bd, tl, td, z);
+          codes.init(bl[0], bd[0], tl[0], 0, td[0], 0);
 
           {b>>>=(3);k-=(3);}
 
@@ -198,7 +201,7 @@
 	  bitb=b; bitk=k; 
 	  z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p;
 	  write=q;
-	  return inflate_flush(z,r);
+	  return inflate_flush(r);
 	}
 	break;
       case LENS:
@@ -212,7 +215,7 @@
 	    z.avail_in=n;
 	    z.total_in+=p-z.next_in_index;z.next_in_index=p;
 	    write=q;
-	    return inflate_flush(z,r);
+	    return inflate_flush(r);
 	  };
 	  n--;
 	  b|=(z.next_in[p++]&0xff)<<k;
@@ -227,7 +230,7 @@
 	  bitb=b; bitk=k; 
 	  z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p;
 	  write=q;
-	  return inflate_flush(z,r);
+	  return inflate_flush(r);
 	}
 	left = (b & 0xffff);
 	b = k = 0;                       // dump bits
@@ -238,7 +241,7 @@
 	  bitb=b; bitk=k; 
 	  z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p;
 	  write=q;
-	  return inflate_flush(z,r);
+	  return inflate_flush(r);
 	}
 
 	if(m==0){
@@ -247,7 +250,7 @@
 	  }
 	  if(m==0){
 	    write=q; 
-	    r=inflate_flush(z,r);
+	    r=inflate_flush(r);
 	    q=write;m=(int)(q<read?read-q-1:end-q);
 	    if(q==end&&read!=0){
 	      q=0; m=(int)(q<read?read-q-1:end-q);
@@ -256,7 +259,7 @@
 	      bitb=b; bitk=k; 
 	      z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p;
 	      write=q;
-	      return inflate_flush(z,r);
+	      return inflate_flush(r);
 	    }
 	  }
 	}
@@ -283,7 +286,7 @@
 	    z.avail_in=n;
 	    z.total_in+=p-z.next_in_index;z.next_in_index=p;
 	    write=q;
-	    return inflate_flush(z,r);
+	    return inflate_flush(r);
 	  };
 	  n--;
 	  b|=(z.next_in[p++]&0xff)<<k;
@@ -300,7 +303,7 @@
 	    bitb=b; bitk=k; 
 	    z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p;
 	    write=q;
-	    return inflate_flush(z,r);
+	    return inflate_flush(r);
 	  }
 	t = 258 + (t & 0x1f) + ((t >> 5) & 0x1f);
 	if(blens==null || blens.length<t){
@@ -325,7 +328,7 @@
 	      z.avail_in=n;
 	      z.total_in+=p-z.next_in_index;z.next_in_index=p;
 	      write=q;
-	      return inflate_flush(z,r);
+	      return inflate_flush(r);
 	    };
 	    n--;
 	    b|=(z.next_in[p++]&0xff)<<k;
@@ -353,7 +356,7 @@
 	  bitb=b; bitk=k; 
 	  z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p;
 	  write=q;
-	  return inflate_flush(z,r);
+	  return inflate_flush(r);
 	}
 
 	index = 0;
@@ -379,7 +382,7 @@
 	      z.avail_in=n;
 	      z.total_in+=p-z.next_in_index;z.next_in_index=p;
 	      write=q;
-	      return inflate_flush(z,r);
+	      return inflate_flush(r);
 	    };
 	    n--;
 	    b|=(z.next_in[p++]&0xff)<<k;
@@ -410,7 +413,7 @@
 		z.avail_in=n;
 		z.total_in+=p-z.next_in_index;z.next_in_index=p;
 		write=q;
-		return inflate_flush(z,r);
+		return inflate_flush(r);
 	      };
 	      n--;
 	      b|=(z.next_in[p++]&0xff)<<k;
@@ -435,7 +438,7 @@
 	      bitb=b; bitk=k; 
 	      z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p;
 	      write=q;
-	      return inflate_flush(z,r);
+	      return inflate_flush(r);
 	    }
 
 	    c = c == 16 ? blens[i-1] : 0;
@@ -449,17 +452,12 @@
 
 	tb[0]=-1;
 	{
-	  int[] bl=new int[1];
-	  int[] bd=new int[1];
-	  int[] tl=new int[1];
-	  int[] td=new int[1];
 	  bl[0] = 9;         // must be <= 9 for lookahead assumptions
 	  bd[0] = 6;         // must be <= 9 for lookahead assumptions
-
 	  t = table;
 	  t = inftree.inflate_trees_dynamic(257 + (t & 0x1f), 
 					    1 + ((t >> 5) & 0x1f),
-					    blens, bl, bd, tl, td, hufts, z);
+					    blens, bl, bd, tli, tdi, hufts, z);
 
 	  if (t != Z_OK){
 	    if (t == Z_DATA_ERROR){
@@ -471,9 +469,9 @@
 	    bitb=b; bitk=k; 
 	    z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p;
 	    write=q;
-	    return inflate_flush(z,r);
+	    return inflate_flush(r);
 	  }
-	  codes.init(bl[0], bd[0], hufts, tl[0], hufts, td[0], z);
+	  codes.init(bl[0], bd[0], hufts, tli[0], hufts, tdi[0]);
 	}
 	mode = CODES;
       case CODES:
@@ -481,8 +479,8 @@
 	z.avail_in=n; z.total_in+=p-z.next_in_index;z.next_in_index=p;
 	write=q;
 
-	if ((r = codes.proc(this, z, r)) != Z_STREAM_END){
-	  return inflate_flush(z, r);
+	if ((r = codes.proc(r)) != Z_STREAM_END){
+	  return inflate_flush(r);
 	}
 	r = Z_OK;
 	codes.free(z);
@@ -497,13 +495,13 @@
 	mode = DRY;
       case DRY:
 	write=q; 
-	r=inflate_flush(z, r); 
+	r=inflate_flush(r); 
 	q=write; m=(int)(q<read?read-q-1:end-q);
 	if (read != write){
 	  bitb=b; bitk=k; 
 	  z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p;
 	  write=q;
-	  return inflate_flush(z, r);
+	  return inflate_flush(r);
 	}
 	mode = DONE;
       case DONE:
@@ -512,14 +510,14 @@
 	bitb=b; bitk=k; 
 	z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p;
 	write=q;
-	return inflate_flush(z, r);
+	return inflate_flush(r);
       case BAD:
 	r = Z_DATA_ERROR;
 
 	bitb=b; bitk=k; 
 	z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p;
 	write=q;
-	return inflate_flush(z, r);
+	return inflate_flush(r);
 
       default:
 	r = Z_STREAM_ERROR;
@@ -527,13 +525,13 @@
 	bitb=b; bitk=k; 
 	z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p;
 	write=q;
-	return inflate_flush(z, r);
+	return inflate_flush(r);
       }
     }
   }
 
-  void free(ZStream z){
-    reset(z, null);
+  void free(){
+    reset();
     window=null;
     hufts=null;
     //ZFREE(z, s);
@@ -551,7 +549,7 @@
   }
 
   // copy as much as possible from the sliding window to the output area
-  int inflate_flush(ZStream z, int r){
+  int inflate_flush(int r){
     int n;
     int p;
     int q;
@@ -562,16 +560,17 @@
 
     // compute number of bytes to copy as far as end of window
     n = (int)((q <= write ? write : end) - q);
-    if (n > z.avail_out) n = z.avail_out;
-    if (n!=0 && r == Z_BUF_ERROR) r = Z_OK;
+    if(n > z.avail_out) n = z.avail_out;
+    if(n!=0 && r == Z_BUF_ERROR) r = Z_OK;
 
     // update counters
     z.avail_out -= n;
     z.total_out += n;
 
     // update check information
-    if(checkfn != null)
-      z.adler=check=z._adler.adler32(check, window, q, n);
+    if(check && n>0){
+      z.adler.update(window, q, n);
+    }
 
     // copy as far as end of window
     System.arraycopy(window, q, z.next_out, p, n);
@@ -595,8 +594,9 @@
       z.total_out += n;
 
       // update check information
-      if(checkfn != null)
-	z.adler=check=z._adler.adler32(check, window, q, n);
+      if(check && n>0){
+	z.adler.update(window, q, n);
+      }
 
       // copy
       System.arraycopy(window, q, z.next_out, p, n);
diff --git a/java/com/jcraft/jzlib/InfCodes.java b/java/com/jcraft/jzlib/InfCodes.java
index c768fb1..aaf69cd 100644
--- a/java/com/jcraft/jzlib/InfCodes.java
+++ b/java/com/jcraft/jzlib/InfCodes.java
@@ -89,11 +89,16 @@
   int[] dtree;          // distance tree
   int dtree_index;      // distance tree
 
-  InfCodes(){
+  private final ZStream z;
+  private final InfBlocks s;
+  InfCodes(ZStream z, InfBlocks s){
+    this.z=z; 
+    this.s=s; 
   }
+
   void init(int bl, int bd,
 	   int[] tl, int tl_index,
-	   int[] td, int td_index, ZStream z){
+	   int[] td, int td_index){
     mode=START;
     lbits=(byte)bl;
     dbits=(byte)bd;
@@ -104,7 +109,7 @@
     tree=null;
   }
 
-  int proc(InfBlocks s, ZStream z, int r){ 
+  int proc(int r){ 
     int j;              // temporary storage
     int[] t;            // temporary pointer
     int tindex;         // temporary pointer
@@ -159,7 +164,7 @@
 	    s.bitb=b;s.bitk=k;
 	    z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p;
 	    s.write=q;
-	    return s.inflate_flush(z,r);
+	    return s.inflate_flush(r);
 	  }
 	  n--;
 	  b|=(z.next_in[p++]&0xff)<<k;
@@ -200,7 +205,7 @@
 	s.bitb=b;s.bitk=k;
 	z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p;
 	s.write=q;
-	return s.inflate_flush(z,r);
+	return s.inflate_flush(r);
 
       case LENEXT:        // i: getting length extra (have base)
 	j = get;
@@ -212,7 +217,7 @@
 	    s.bitb=b;s.bitk=k;
 	    z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p;
 	    s.write=q;
-	    return s.inflate_flush(z,r);
+	    return s.inflate_flush(r);
 	  }
 	  n--; b|=(z.next_in[p++]&0xff)<<k;
 	  k+=8;
@@ -237,7 +242,7 @@
 	    s.bitb=b;s.bitk=k;
 	    z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p;
 	    s.write=q;
-	    return s.inflate_flush(z,r);
+	    return s.inflate_flush(r);
 	  }
 	  n--; b|=(z.next_in[p++]&0xff)<<k;
 	  k+=8;
@@ -267,7 +272,7 @@
 	s.bitb=b;s.bitk=k;
 	z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p;
 	s.write=q;
-	return s.inflate_flush(z,r);
+	return s.inflate_flush(r);
 
       case DISTEXT:       // i: getting distance extra
 	j = get;
@@ -279,7 +284,7 @@
 	    s.bitb=b;s.bitk=k;
 	    z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p;
 	    s.write=q;
-	    return s.inflate_flush(z,r);
+	    return s.inflate_flush(r);
 	  }
 	  n--; b|=(z.next_in[p++]&0xff)<<k;
 	  k+=8;
@@ -301,7 +306,7 @@
 	  if(m==0){
 	    if(q==s.end&&s.read!=0){q=0;m=q<s.read?s.read-q-1:s.end-q;}
 	    if(m==0){
-	      s.write=q; r=s.inflate_flush(z,r);
+	      s.write=q; r=s.inflate_flush(r);
 	      q=s.write;m=q<s.read?s.read-q-1:s.end-q;
 
 	      if(q==s.end&&s.read!=0){q=0;m=q<s.read?s.read-q-1:s.end-q;}
@@ -310,7 +315,7 @@
 		s.bitb=b;s.bitk=k;
 		z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p;
 		s.write=q;
-		return s.inflate_flush(z,r);
+		return s.inflate_flush(r);
 	      }  
 	    }
 	  }
@@ -327,7 +332,7 @@
 	if(m==0){
 	  if(q==s.end&&s.read!=0){q=0;m=q<s.read?s.read-q-1:s.end-q;}
 	  if(m==0){
-	    s.write=q; r=s.inflate_flush(z,r);
+	    s.write=q; r=s.inflate_flush(r);
 	    q=s.write;m=q<s.read?s.read-q-1:s.end-q;
 
 	    if(q==s.end&&s.read!=0){q=0;m=q<s.read?s.read-q-1:s.end-q;}
@@ -335,7 +340,7 @@
 	      s.bitb=b;s.bitk=k;
 	      z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p;
 	      s.write=q;
-	      return s.inflate_flush(z,r);
+	      return s.inflate_flush(r);
 	    }
 	  }
 	}
@@ -352,14 +357,14 @@
 	  p--;             // can always return one
 	}
 
-	s.write=q; r=s.inflate_flush(z,r);
+	s.write=q; r=s.inflate_flush(r);
 	q=s.write;m=q<s.read?s.read-q-1:s.end-q;
 
 	if (s.read != s.write){
 	  s.bitb=b;s.bitk=k;
 	  z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p;
 	  s.write=q;
-	  return s.inflate_flush(z,r);
+	  return s.inflate_flush(r);
 	}
 	mode = END;
       case END:
@@ -367,7 +372,7 @@
 	s.bitb=b;s.bitk=k;
 	z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p;
 	s.write=q;
-	return s.inflate_flush(z,r);
+	return s.inflate_flush(r);
 
       case BADCODE:       // x: got error
 
@@ -376,7 +381,7 @@
 	s.bitb=b;s.bitk=k;
 	z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p;
 	s.write=q;
-	return s.inflate_flush(z,r);
+	return s.inflate_flush(r);
 
       default:
 	r = Z_STREAM_ERROR;
@@ -384,7 +389,7 @@
 	s.bitb=b;s.bitk=k;
 	z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p;
 	s.write=q;
-	return s.inflate_flush(z,r);
+	return s.inflate_flush(r);
       }
     }
   }
diff --git a/java/com/jcraft/jzlib/InfTree.java b/java/com/jcraft/jzlib/InfTree.java
index cbca436..80a2b7b 100644
--- a/java/com/jcraft/jzlib/InfTree.java
+++ b/java/com/jcraft/jzlib/InfTree.java
@@ -512,9 +512,7 @@
     for(int i=0; i<vsize; i++){v[i]=0;}
     for(int i=0; i<BMAX+1; i++){c[i]=0;}
     for(int i=0; i<3; i++){r[i]=0;}
-//  for(int i=0; i<BMAX; i++){u[i]=0;}
     System.arraycopy(c, 0, u, 0, BMAX);
-//  for(int i=0; i<BMAX+1; i++){x[i]=0;}
     System.arraycopy(c, 0, x, 0, BMAX+1);
   }
 }
diff --git a/java/com/jcraft/jzlib/Inflate.java b/java/com/jcraft/jzlib/Inflate.java
index 30310f6..6aa6240 100644
--- a/java/com/jcraft/jzlib/Inflate.java
+++ b/java/com/jcraft/jzlib/Inflate.java
@@ -1,6 +1,6 @@
 /* -*-mode:java; c-basic-offset:2; -*- */
 /*
-Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved.
+Copyright (c) 2000-2011 ymnk, JCraft,Inc. All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are met:
@@ -74,158 +74,221 @@
   static final private int DONE=12;    // finished check, done
   static final private int BAD=13;     // got an error--stay here
 
+  static final private int HEAD=14;
+  static final private int LENGTH=15;
+  static final private int TIME=16;
+  static final private int OS=17;
+  static final private int EXLEN=18;
+  static final private int EXTRA=19;
+  static final private int NAME=20;
+  static final private int COMMENT=21;
+  static final private int HCRC=22;
+  static final private int FLAGS=23;
+
   int mode;                            // current inflate mode
 
   // mode dependent information
   int method;        // if FLAGS, method byte
 
   // if CHECK, check values to compare
-  long[] was=new long[1] ; // computed check value
+  long was = -1;           // computed check value
   long need;               // stream check value
 
   // if BAD, inflateSync's marker bytes count
   int marker;
 
   // mode independent information
-  int  nowrap;          // flag for no wrapper
+  int  wrap;          // flag for no wrapper
   int wbits;            // log2(window size)  (8..15, defaults to 15)
 
   InfBlocks blocks;     // current inflate_blocks state
 
-  int inflateReset(ZStream z){
-    if(z == null || z.istate == null) return Z_STREAM_ERROR;
+  private final ZStream z;
+
+  private int flags; 
+
+  private int need_bytes = -1;
+  private byte[] crcbuf=new byte[4];
+
+  GZIPHeader gheader = null;
+
+  int inflateReset(){
+    if(z == null) return Z_STREAM_ERROR;
     
     z.total_in = z.total_out = 0;
     z.msg = null;
-    z.istate.mode = z.istate.nowrap!=0 ? BLOCKS : METHOD;
-    z.istate.blocks.reset(z, null);
+    this.mode = HEAD;
+    this.need_bytes = -1;
+    this.blocks.reset();
     return Z_OK;
   }
 
-  int inflateEnd(ZStream z){
-    if(blocks != null)
-      blocks.free(z);
-    blocks=null;
-    //    ZFREE(z, z->state);
+  int inflateEnd(){
+    if(blocks != null){
+      blocks.free();
+    }
     return Z_OK;
   }
 
-  int inflateInit(ZStream z, int w){
+  Inflate(ZStream z){
+    this.z=z;
+  }
+
+  int inflateInit(int w){
     z.msg = null;
     blocks = null;
 
-    // handle undocumented nowrap option (no zlib header or check)
-    nowrap = 0;
+    // handle undocumented wrap option (no zlib header or check)
+    wrap = 0;
     if(w < 0){
       w = - w;
-      nowrap = 1;
+    }
+    else {
+      wrap = (w >> 4) + 1;
+      if(w < 48)
+        w &= 15;
+    }
+
+    if(w<8 ||w>15){
+      inflateEnd();
+      return Z_STREAM_ERROR;
+    }
+    if(blocks != null && wbits != w){
+      blocks.free();
+      blocks=null;
     }
 
     // set window size
-    if(w<8 ||w>15){
-      inflateEnd(z);
-      return Z_STREAM_ERROR;
-    }
     wbits=w;
 
-    z.istate.blocks=new InfBlocks(z, 
-				  z.istate.nowrap!=0 ? null : this,
-				  1<<w);
+    this.blocks=new InfBlocks(z, 1<<w);
 
     // reset state
-    inflateReset(z);
+    inflateReset();
+
     return Z_OK;
   }
 
-  int inflate(ZStream z, int f){
+  int inflate(int f){
+    int hold = 0;
+
     int r;
     int b;
 
-    if(z == null || z.istate == null || z.next_in == null)
+    if(z == null || z.next_in == null){
+      if(f == Z_FINISH && this.mode==HEAD)
+        return Z_OK; 
       return Z_STREAM_ERROR;
+    }
+
     f = f == Z_FINISH ? Z_BUF_ERROR : Z_OK;
     r = Z_BUF_ERROR;
     while (true){
-//System.out.println("mode: "+z.istate.mode);
-      switch (z.istate.mode){
-      case METHOD:
 
-        if(z.avail_in==0)return r;r=f;
+      switch (this.mode){
+      case HEAD:
+        if(wrap==0){
+	  this.mode = BLOCKS;
+          break;
+        } 
 
-        z.avail_in--; z.total_in++;
-        if(((z.istate.method = z.next_in[z.next_in_index++])&0xf)!=Z_DEFLATED){
-          z.istate.mode = BAD;
-          z.msg="unknown compression method";
-          z.istate.marker = 5;       // can't try inflateSync
+        try { r=readBytes(2, r, f); }
+        catch(Return e){ return e.r; }
+
+        if((wrap&2)!=0 && this.need == 0x8b1fL) {   // gzip header
+	  z.adler=new CRC32();
+          checksum(2, this.need);
+
+          if(gheader==null) 
+            gheader=new GZIPHeader();
+
+          this.mode = FLAGS;
           break;
         }
-        if((z.istate.method>>4)+8>z.istate.wbits){
-          z.istate.mode = BAD;
-          z.msg="invalid window size";
-          z.istate.marker = 5;       // can't try inflateSync
-          break;
-        }
-        z.istate.mode=FLAG;
-      case FLAG:
 
-        if(z.avail_in==0)return r;r=f;
+        flags = 0;
 
-        z.avail_in--; z.total_in++;
-        b = (z.next_in[z.next_in_index++])&0xff;
+        this.method = ((int)this.need)&0xff;
+        b=((int)(this.need>>8))&0xff;
 
-        if((((z.istate.method << 8)+b) % 31)!=0){
-          z.istate.mode = BAD;
+        if((wrap&1)==0 ||  // check if zlib header allowed
+           (((this.method << 8)+b) % 31)!=0){
+          this.mode = BAD;
           z.msg = "incorrect header check";
-          z.istate.marker = 5;       // can't try inflateSync
+          // since zlib 1.2, it is allowted to inflateSync for this case.
+          /*
+          this.marker = 5;       // can't try inflateSync
+          */
           break;
         }
 
+        if((this.method&0xf)!=Z_DEFLATED){
+          this.mode = BAD;
+          z.msg="unknown compression method";
+          // since zlib 1.2, it is allowted to inflateSync for this case.
+	  /*
+          this.marker = 5;       // can't try inflateSync
+	  */
+          break;
+        }
+
+        if((this.method>>4)+8>this.wbits){
+          this.mode = BAD;
+          z.msg="invalid window size";
+          // since zlib 1.2, it is allowted to inflateSync for this case.
+	  /*
+          this.marker = 5;       // can't try inflateSync
+	  */
+          break;
+        }
+
+        z.adler=new Adler32();
+
         if((b&PRESET_DICT)==0){
-          z.istate.mode = BLOCKS;
+          this.mode = BLOCKS;
           break;
         }
-        z.istate.mode = DICT4;
+        this.mode = DICT4;
       case DICT4:
 
         if(z.avail_in==0)return r;r=f;
 
         z.avail_in--; z.total_in++;
-        z.istate.need=((z.next_in[z.next_in_index++]&0xff)<<24)&0xff000000L;
-        z.istate.mode=DICT3;
+        this.need=((z.next_in[z.next_in_index++]&0xff)<<24)&0xff000000L;
+        this.mode=DICT3;
       case DICT3:
 
         if(z.avail_in==0)return r;r=f;
 
         z.avail_in--; z.total_in++;
-        z.istate.need+=((z.next_in[z.next_in_index++]&0xff)<<16)&0xff0000L;
-        z.istate.mode=DICT2;
+        this.need+=((z.next_in[z.next_in_index++]&0xff)<<16)&0xff0000L;
+        this.mode=DICT2;
       case DICT2:
 
         if(z.avail_in==0)return r;r=f;
 
         z.avail_in--; z.total_in++;
-        z.istate.need+=((z.next_in[z.next_in_index++]&0xff)<<8)&0xff00L;
-        z.istate.mode=DICT1;
+        this.need+=((z.next_in[z.next_in_index++]&0xff)<<8)&0xff00L;
+        this.mode=DICT1;
       case DICT1:
 
         if(z.avail_in==0)return r;r=f;
 
         z.avail_in--; z.total_in++;
-        z.istate.need += (z.next_in[z.next_in_index++]&0xffL);
-        z.adler = z.istate.need;
-        z.istate.mode = DICT0;
+        this.need += (z.next_in[z.next_in_index++]&0xffL);
+        z.adler.reset(this.need);
+        this.mode = DICT0;
         return Z_NEED_DICT;
       case DICT0:
-        z.istate.mode = BAD;
+        this.mode = BAD;
         z.msg = "need dictionary";
-        z.istate.marker = 0;       // can try inflateSync
+        this.marker = 0;       // can try inflateSync
         return Z_STREAM_ERROR;
       case BLOCKS:
-
-        r = z.istate.blocks.proc(z, r);
+        r = this.blocks.proc(r);
         if(r == Z_DATA_ERROR){
-          z.istate.mode = BAD;
-          z.istate.marker = 0;     // can try inflateSync
+          this.mode = BAD;
+          this.marker = 0;     // can try inflateSync
           break;
         }
         if(r == Z_OK){
@@ -235,100 +298,280 @@
           return r;
         }
         r = f;
-        z.istate.blocks.reset(z, z.istate.was);
-        if(z.istate.nowrap!=0){
-          z.istate.mode=DONE;
+        this.was=z.adler.getValue();
+        this.blocks.reset();
+        if(this.wrap==0){
+          this.mode=DONE;
           break;
         }
-        z.istate.mode=CHECK4;
+        this.mode=CHECK4;
       case CHECK4:
 
         if(z.avail_in==0)return r;r=f;
 
         z.avail_in--; z.total_in++;
-        z.istate.need=((z.next_in[z.next_in_index++]&0xff)<<24)&0xff000000L;
-        z.istate.mode=CHECK3;
+        this.need=((z.next_in[z.next_in_index++]&0xff)<<24)&0xff000000L;
+        this.mode=CHECK3;
       case CHECK3:
 
         if(z.avail_in==0)return r;r=f;
 
         z.avail_in--; z.total_in++;
-        z.istate.need+=((z.next_in[z.next_in_index++]&0xff)<<16)&0xff0000L;
-        z.istate.mode = CHECK2;
+        this.need+=((z.next_in[z.next_in_index++]&0xff)<<16)&0xff0000L;
+        this.mode = CHECK2;
       case CHECK2:
 
         if(z.avail_in==0)return r;r=f;
 
         z.avail_in--; z.total_in++;
-        z.istate.need+=((z.next_in[z.next_in_index++]&0xff)<<8)&0xff00L;
-        z.istate.mode = CHECK1;
+        this.need+=((z.next_in[z.next_in_index++]&0xff)<<8)&0xff00L;
+        this.mode = CHECK1;
       case CHECK1:
 
         if(z.avail_in==0)return r;r=f;
 
         z.avail_in--; z.total_in++;
-        z.istate.need+=(z.next_in[z.next_in_index++]&0xffL);
+        this.need+=(z.next_in[z.next_in_index++]&0xffL);
 
-        if(((int)(z.istate.was[0])) != ((int)(z.istate.need))){
-          z.istate.mode = BAD;
-          z.msg = "incorrect data check";
-          z.istate.marker = 5;       // can't try inflateSync
-          break;
+        if(flags!=0){  // gzip
+          this.need = ((this.need&0xff000000)>>24 | 
+                          (this.need&0x00ff0000)>>8 | 
+                          (this.need&0x0000ff00)<<8 | 
+                          (this.need&0x0000ffff)<<24)&0xffffffffL;
         }
 
-        z.istate.mode = DONE;
+        if(((int)(this.was)) != ((int)(this.need))){
+          z.msg = "incorrect data check";
+          // chack is delayed
+          /*
+          this.mode = BAD;
+          this.marker = 5;       // can't try inflateSync
+          break;
+	  */
+        }
+        else if(flags!=0 && gheader!=null){
+          gheader.crc = this.need; 
+        }
+
+        this.mode = LENGTH;
+      case LENGTH:
+        if (wrap!=0 && flags!=0) {
+
+          try { r=readBytes(4, r, f); }
+          catch(Return e){ return e.r; }
+
+          if(z.msg!=null && z.msg.equals("incorrect data check")){
+            this.mode = BAD;
+            this.marker = 5;       // can't try inflateSync
+            break;
+          }
+
+          if (this.need != (z.total_out & 0xffffffffL)) {
+            z.msg = "incorrect length check";
+            this.mode = BAD;
+            break;
+          }
+          z.msg = null;
+        }
+        else {
+          if(z.msg!=null && z.msg.equals("incorrect data check")){
+            this.mode = BAD;
+            this.marker = 5;       // can't try inflateSync
+            break;
+          }
+        }
+
+        this.mode = DONE;
       case DONE:
         return Z_STREAM_END;
       case BAD:
         return Z_DATA_ERROR;
+
+      case FLAGS:
+
+        try { r=readBytes(2, r, f); }
+        catch(Return e){ return e.r; }
+
+        flags = ((int)this.need)&0xffff;
+
+        if ((flags & 0xff) != Z_DEFLATED) {
+          z.msg = "unknown compression method";
+          this.mode = BAD; 
+          break;
+        }
+        if ((flags & 0xe000)!=0) {
+          z.msg = "unknown header flags set";
+          this.mode = BAD; 
+          break;
+        }
+
+        if ((flags & 0x0200)!=0){
+          checksum(2, this.need);
+        } 
+
+        this.mode = TIME;
+
+      case TIME:
+        try { r=readBytes(4, r, f); }
+        catch(Return e){ return e.r; }
+        if(gheader!=null)
+          gheader.time = this.need;
+        if ((flags & 0x0200)!=0){
+          checksum(4, this.need);
+        }
+        this.mode = OS;
+      case OS:
+        try { r=readBytes(2, r, f); }
+        catch(Return e){ return e.r; }
+        if(gheader!=null){
+          gheader.xflags = ((int)this.need)&0xff;
+          gheader.os = (((int)this.need)>>8)&0xff;
+        }
+        if ((flags & 0x0200)!=0){
+          checksum(2, this.need);
+        }
+        this.mode = EXLEN;
+      case EXLEN:
+        if ((flags & 0x0400)!=0) {
+          try { r=readBytes(2, r, f); }
+          catch(Return e){ return e.r; }
+          if(gheader!=null){
+            gheader.extra = new byte[((int)this.need)&0xffff];
+          }
+          if ((flags & 0x0200)!=0){
+            checksum(2, this.need);
+          }
+        }
+        else if(gheader!=null){
+          gheader.extra=null;
+        }
+        this.mode = EXTRA;
+
+      case EXTRA:
+        if ((flags & 0x0400)!=0) {
+          try { 
+            r=readBytes(r, f);
+            if(gheader!=null){
+              byte[] foo = tmp_string.toByteArray();
+              tmp_string=null;
+              if(foo.length == gheader.extra.length){
+                System.arraycopy(foo, 0, gheader.extra, 0, foo.length);
+	      }
+              else{
+                z.msg = "bad extra field length";
+                this.mode = BAD; 
+                break;
+	      }
+            }
+          }
+          catch(Return e){ return e.r; }
+        }
+        else if(gheader!=null){
+          gheader.extra=null;
+	}
+	this.mode = NAME;
+      case NAME:
+	if ((flags & 0x0800)!=0) {
+          try { 
+            r=readString(r, f);
+            if(gheader!=null){
+              gheader.name=tmp_string.toByteArray();
+            }
+            tmp_string=null;
+          }
+          catch(Return e){ return e.r; }
+        }
+        else if(gheader!=null){
+          gheader.name=null;
+	}
+        this.mode = COMMENT;
+      case COMMENT:
+        if ((flags & 0x1000)!=0) {
+          try { 
+            r=readString(r, f);
+            if(gheader!=null){
+              gheader.comment=tmp_string.toByteArray();
+            }
+            tmp_string=null;
+          }
+          catch(Return e){ return e.r; }
+        }
+        else if(gheader!=null){
+          gheader.comment=null;
+	}
+        this.mode = HCRC;
+      case HCRC:
+	if ((flags & 0x0200)!=0) {
+          try { r=readBytes(2, r, f); }
+          catch(Return e){ return e.r; }
+          if(gheader!=null){
+            gheader.hcrc=(int)(this.need&0xffff);
+          }
+          if(this.need != (z.adler.getValue()&0xffffL)){
+            this.mode = BAD;
+            z.msg = "header crc mismatch";
+            this.marker = 5;       // can't try inflateSync
+            break;
+          }
+        }
+        z.adler = new CRC32();
+
+        this.mode = BLOCKS;
+        break;
       default:
         return Z_STREAM_ERROR;
       }
     }
   }
 
+  int inflateSetDictionary(byte[] dictionary, int dictLength){
+    if(z==null || (this.mode != DICT0 && this.wrap != 0)){
+      return Z_STREAM_ERROR;
+    }
 
-  int inflateSetDictionary(ZStream z, byte[] dictionary, int dictLength){
     int index=0;
     int length = dictLength;
-    if(z==null || z.istate == null|| z.istate.mode != DICT0)
-      return Z_STREAM_ERROR;
 
-    if(z._adler.adler32(1L, dictionary, 0, dictLength)!=z.adler){
-      return Z_DATA_ERROR;
+    if(this.mode==DICT0){
+      long adler_need=z.adler.getValue();
+      z.adler.reset();
+      z.adler.update(dictionary, 0, dictLength);
+      if(z.adler.getValue()!=adler_need){
+        return Z_DATA_ERROR;
+      }
     }
 
-    z.adler = z._adler.adler32(0, null, 0, 0);
+    z.adler.reset();
 
-    if(length >= (1<<z.istate.wbits)){
-      length = (1<<z.istate.wbits)-1;
+    if(length >= (1<<this.wbits)){
+      length = (1<<this.wbits)-1;
       index=dictLength - length;
     }
-    z.istate.blocks.set_dictionary(dictionary, index, length);
-    z.istate.mode = BLOCKS;
+    this.blocks.set_dictionary(dictionary, index, length);
+    this.mode = BLOCKS;
     return Z_OK;
   }
 
   static private byte[] mark = {(byte)0, (byte)0, (byte)0xff, (byte)0xff};
 
-  int inflateSync(ZStream z){
+  int inflateSync(){
     int n;       // number of bytes to look at
     int p;       // pointer to bytes
     int m;       // number of marker bytes found in a row
     long r, w;   // temporaries to save total_in and total_out
 
     // set up
-    if(z == null || z.istate == null)
+    if(z == null)
       return Z_STREAM_ERROR;
-    if(z.istate.mode != BAD){
-      z.istate.mode = BAD;
-      z.istate.marker = 0;
+    if(this.mode != BAD){
+      this.mode = BAD;
+      this.marker = 0;
     }
     if((n=z.avail_in)==0)
       return Z_BUF_ERROR;
-    p=z.next_in_index;
-    m=z.istate.marker;
 
+    p=z.next_in_index;
+    m=this.marker;
     // search
     while (n!=0 && m < 4){
       if(z.next_in[p] == mark[m]){
@@ -347,16 +590,17 @@
     z.total_in += p-z.next_in_index;
     z.next_in_index = p;
     z.avail_in = n;
-    z.istate.marker = m;
+    this.marker = m;
 
     // return no joy or set up to restart on a new block
     if(m != 4){
       return Z_DATA_ERROR;
     }
     r=z.total_in;  w=z.total_out;
-    inflateReset(z);
+    inflateReset();
     z.total_in=r;  z.total_out = w;
-    z.istate.mode = BLOCKS;
+    this.mode = BLOCKS;
+
     return Z_OK;
   }
 
@@ -366,9 +610,102 @@
   // but removes the length bytes of the resulting empty stored block. When
   // decompressing, PPP checks that at the end of input packet, inflate is
   // waiting for these length bytes.
-  int inflateSyncPoint(ZStream z){
-    if(z == null || z.istate == null || z.istate.blocks == null)
+  int inflateSyncPoint(){
+    if(z == null || this.blocks == null)
       return Z_STREAM_ERROR;
-    return z.istate.blocks.sync_point();
+    return this.blocks.sync_point();
+  }
+
+  private int readBytes(int n, int r, int f) throws Return{
+    if(need_bytes == -1){
+      need_bytes=n;
+      this.need=0;
+    }
+    while(need_bytes>0){
+      if(z.avail_in==0){ throw new Return(r); }; r=f;
+      z.avail_in--; z.total_in++;
+      this.need = this.need | 
+	((z.next_in[z.next_in_index++]&0xff)<<((n-need_bytes)*8));
+      need_bytes--;
+    }
+    if(n==2){
+      this.need&=0xffffL;
+    }
+    else if(n==4) {
+      this.need&=0xffffffffL;
+    }
+    need_bytes=-1;
+    return r;
+  }
+  class Return extends Exception{
+    int r;
+    Return(int r){this.r=r; }
+  }
+
+  private java.io.ByteArrayOutputStream tmp_string = null;
+  private int readString(int r, int f) throws Return{
+    if(tmp_string == null){
+      tmp_string=new java.io.ByteArrayOutputStream();
+    }
+    int b=0; 
+    do {
+      if(z.avail_in==0){ throw new Return(r); }; r=f;
+      z.avail_in--; z.total_in++;
+      b = z.next_in[z.next_in_index];
+      if(b!=0) tmp_string.write(z.next_in, z.next_in_index, 1);
+      z.adler.update(z.next_in, z.next_in_index, 1);
+      z.next_in_index++;
+    }while(b!=0);
+    return r;
+  }
+
+  private int readBytes(int r, int f) throws Return{
+    if(tmp_string == null){
+      tmp_string=new java.io.ByteArrayOutputStream();
+    }
+    int b=0; 
+    while(this.need>0){
+      if(z.avail_in==0){ throw new Return(r); }; r=f;
+      z.avail_in--; z.total_in++;
+      b = z.next_in[z.next_in_index];
+      tmp_string.write(z.next_in, z.next_in_index, 1);
+      z.adler.update(z.next_in, z.next_in_index, 1);
+      z.next_in_index++;
+      this.need--;
+    }
+    return r;
+  }
+
+  private void checksum(int n, long v){
+    for(int i=0; i<n; i++){
+      crcbuf[i]=(byte)(v&0xff);
+      v>>=8;
+    }
+    z.adler.update(crcbuf, 0, n);
+  }
+
+  public GZIPHeader getGZIPHeader(){
+    return gheader;
+  }
+
+  boolean inParsingHeader(){
+    switch(mode){
+      case HEAD:
+      case DICT4:
+      case DICT3:
+      case DICT2:
+      case DICT1:
+      case FLAGS:
+      case TIME:
+      case OS:
+      case EXLEN:
+      case EXTRA:
+      case NAME:
+      case COMMENT:
+      case HCRC:
+	return true;
+      default:
+	return false;
+    }
   }
 }
diff --git a/java/com/jcraft/jzlib/JZlib.java b/java/com/jcraft/jzlib/JZlib.java
index b84d7a1..8fd98ea 100644
--- a/java/com/jcraft/jzlib/JZlib.java
+++ b/java/com/jcraft/jzlib/JZlib.java
@@ -1,6 +1,6 @@
 /* -*-mode:java; c-basic-offset:2; -*- */
 /*
-Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved.
+Copyright (c) 2011 ymnk, JCraft,Inc. All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are met:
@@ -35,9 +35,12 @@
 package com.jcraft.jzlib;
 
 final public class JZlib{
-  private static final String version="1.0.2";
+  private static final String version="1.1.0";
   public static String version(){return version;}
 
+  static final public int MAX_WBITS=15;        // 32K LZ77 window
+  static final public int DEF_WBITS=MAX_WBITS;
+
   // compression levels
   static final public int Z_NO_COMPRESSION=0;
   static final public int Z_BEST_SPEED=1;
@@ -64,4 +67,17 @@
   static final public int Z_MEM_ERROR=-4;
   static final public int Z_BUF_ERROR=-5;
   static final public int Z_VERSION_ERROR=-6;
+
+  // The three kinds of block type
+  static final public byte Z_BINARY = 0;
+  static final public byte Z_ASCII = 1;
+  static final public byte Z_UNKNOWN = 2;
+
+  public static long adler32_combine(long adler1, long adler2, long len2){
+    return Adler32.combine(adler1, adler2, len2);
+  }
+
+  public static long crc32_combine(long crc1, long crc2, long len2){
+    return CRC32.combine(crc1, crc2, len2);
+  }
 }
diff --git a/java/com/jcraft/jzlib/LICENSE.txt b/java/com/jcraft/jzlib/LICENSE.txt
index cdce500..6859c59 100644
--- a/java/com/jcraft/jzlib/LICENSE.txt
+++ b/java/com/jcraft/jzlib/LICENSE.txt
@@ -2,7 +2,7 @@
 over to a BSD-style license. 
 
 ------------------------------------------------------------------------------
-Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved.
+Copyright (c) 2000-2011 ymnk, JCraft,Inc. All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are met:
diff --git a/java/com/jcraft/jzlib/README b/java/com/jcraft/jzlib/README
index 45027db..69aec56 100644
--- a/java/com/jcraft/jzlib/README
+++ b/java/com/jcraft/jzlib/README
@@ -6,7 +6,7 @@
 
                           http://www.jcraft.com/jzlib/
 
-Last modified: Fri Feb 14 13:31:26 UTC 2003
+Last modified: Mon Sep 19 15:28:43 UTC 2011
 
 Description
 ===========
@@ -25,7 +25,7 @@
 
 Directories & Files in the Source Tree
 ======================================
-* com/ has source trees of JZlib.
+* src/main/java has source trees of JZlib.
 * example/ has some samples, which demonstrate the usages.
 * misc/ has some stuffs. At present, this directory includes
   a patch file for MindTerm v.1.2.1, which adds the packet compression
@@ -40,7 +40,7 @@
 * JZlib does not support gzip file handling supports.
 * The performance has not been estimated yet,  but it will be not so bad
   in deflating/inflating data stream on the low bandwidth network.
-* JZlib is licensed under BSD style license.
+* JZlib is under BSD style license.
 * Any invention has not been done in developing JZlib.
   So, if zlib is patent free, JZlib is also not covered by any patents.
 
@@ -73,6 +73,18 @@
 This is our motivation to hack JZlib.
 
 
+Building Jar File
+=================
+Use 'sbt'(https://github.com/harrah/xsbt/wiki),
+  % sbt package
+or
+  % mvn package
+or
+  % cd src/main/java
+  % javac -target 1.5 com/jcraft/jzlib/*.java
+  % jar -cvf jzlib.jar com/jcraft/jzlib/*.class
+
+
 A unofficial patch for MindTerm v.1.2.1
 =======================================
 A unofficial patch file for MindTerm v.1.2.1 has included in 'misc' directory.
@@ -84,7 +96,6 @@
 ========================
 JZlib is copyrighted by ymnk, JCraft,Inc. and is licensed through BSD
 style license.  Read the LICENSE.txt file for the complete license.
-ZInputStream and ZOutputStream classes were contributed by Lapo Luchini.
 
 
 Credits
diff --git a/java/com/jcraft/jzlib/StaticTree.java b/java/com/jcraft/jzlib/StaticTree.java
index 0f7f577..e35931c 100644
--- a/java/com/jcraft/jzlib/StaticTree.java
+++ b/java/com/jcraft/jzlib/StaticTree.java
@@ -134,12 +134,11 @@
   int elems;               // max number of elements in the tree
   int max_length;          // max bit length for the codes
 
-  StaticTree(short[] static_tree,
-	     int[] extra_bits,
-	     int extra_base,
-	     int elems,
-	     int max_length
-	     ){
+  private StaticTree(short[] static_tree,
+                     int[] extra_bits,
+                     int extra_base,
+                     int elems,
+                     int max_length){
     this.static_tree=static_tree;
     this.extra_bits=extra_bits;
     this.extra_base=extra_base;
diff --git a/java/com/jcraft/jzlib/Tree.java b/java/com/jcraft/jzlib/Tree.java
index 8103897..40b6ba8 100644
--- a/java/com/jcraft/jzlib/Tree.java
+++ b/java/com/jcraft/jzlib/Tree.java
@@ -317,17 +317,18 @@
   // the given tree and the field len is set for all tree elements.
   // OUT assertion: the field code is set for all tree elements of non
   //     zero code length.
-  static void gen_codes(short[] tree, // the tree to decorate
-			int max_code, // largest code with non zero frequency
-			short[] bl_count // number of codes at each bit length
-			){
-    short[] next_code=new short[MAX_BITS+1]; // next code value for each bit length
+  static short[] next_code=new short[MAX_BITS+1]; // next code value for each bit length
+  synchronized static void gen_codes(short[] tree, // the tree to decorate
+                         int max_code, // largest code with non zero frequency
+                         short[] bl_count // number of codes at each bit length
+                        ){
     short code = 0;            // running code value
     int bits;                  // bit index
     int n;                     // code index
 
     // The distribution counts are first used to generate the code values
     // without bit reversal.
+    next_code[0]=0;
     for (bits = 1; bits <= MAX_BITS; bits++) {
       next_code[bits] = code = (short)((code + bl_count[bits-1]) << 1);
     }
diff --git a/java/com/jcraft/jzlib/ZInputStream.java b/java/com/jcraft/jzlib/ZInputStream.java
index 3f97c44..0054645 100644
--- a/java/com/jcraft/jzlib/ZInputStream.java
+++ b/java/com/jcraft/jzlib/ZInputStream.java
@@ -1,6 +1,6 @@
 /* -*-mode:java; c-basic-offset:2; indent-tabs-mode:nil -*- */
 /*
-Copyright (c) 2001 Lapo Luchini.
+Copyright (c) 2011 ymnk, JCraft,Inc. All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are met:
@@ -17,8 +17,8 @@
 
 THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
 INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS
-OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
+INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
 OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
@@ -26,91 +26,71 @@
 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
-/*
- * This program is based on zlib-1.1.3, so all credit should go authors
- * Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu)
- * and contributors of zlib.
- */
 
 package com.jcraft.jzlib;
 import java.io.*;
 
+/**
+ * ZInputStream
+ *
+ * @deprecated  use DeflaterOutputStream or InflaterInputStream
+ */
+@Deprecated
 public class ZInputStream extends FilterInputStream {
 
-  protected ZStream z=new ZStream();
-  protected int bufsize=512;
   protected int flush=JZlib.Z_NO_FLUSH;
-  protected byte[] buf=new byte[bufsize],
-                   buf1=new byte[1];
   protected boolean compress;
-
   protected InputStream in=null;
 
-  public ZInputStream(InputStream in) {
+  protected Deflater deflater;
+  protected InflaterInputStream iis;
+
+  public ZInputStream(InputStream in) throws IOException {
     this(in, false);
   }
-  public ZInputStream(InputStream in, boolean nowrap) {
+  public ZInputStream(InputStream in, boolean nowrap) throws IOException {
     super(in);
-    this.in=in;
-    z.inflateInit(nowrap);
+    iis = new InflaterInputStream(in);
     compress=false;
-    z.next_in=buf;
-    z.next_in_index=0;
-    z.avail_in=0;
   }
 
-  public ZInputStream(InputStream in, int level) {
+  public ZInputStream(InputStream in, int level) throws IOException {
     super(in);
     this.in=in;
-    z.deflateInit(level);
+    deflater = new Deflater();
+    deflater.init(level);
     compress=true;
-    z.next_in=buf;
-    z.next_in_index=0;
-    z.avail_in=0;
   }
 
-  /*public int available() throws IOException {
-    return inf.finished() ? 0 : 1;
-  }*/
-
+  private byte[] buf1 = new byte[1];
   public int read() throws IOException {
-    if(read(buf1, 0, 1)==-1)
-      return(-1);
+    if(read(buf1, 0, 1)==-1) return -1;
     return(buf1[0]&0xFF);
   }
 
-  private boolean nomoreinput=false;
+  private byte[] buf = new byte[512];
 
   public int read(byte[] b, int off, int len) throws IOException {
-    if(len==0)
-      return(0);
-    int err;
-    z.next_out=b;
-    z.next_out_index=off;
-    z.avail_out=len;
-    do {
-      if((z.avail_in==0)&&(!nomoreinput)) { // if buffer is empty and more input is avaiable, refill it
-	z.next_in_index=0;
-	z.avail_in=in.read(buf, 0, bufsize);//(bufsize<z.avail_out ? bufsize : z.avail_out));
-	if(z.avail_in==-1) {
-	  z.avail_in=0;
-	  nomoreinput=true;
-	}
+    if(compress){
+      deflater.setOutput(b, off, len);
+      while(true){
+        int datalen = in.read(buf, 0, buf.length);
+        if(datalen == -1) return -1;
+        deflater.setInput(buf, 0, datalen, true);
+        int err = deflater.deflate(flush);
+        if(deflater.next_out_index>0)
+          return deflater.next_out_index;
+        if(err == JZlib.Z_STREAM_END)
+          return 0;
+        if(err == JZlib.Z_STREAM_ERROR ||
+           err == JZlib.Z_DATA_ERROR){
+          throw new ZStreamException("deflating: "+deflater.msg);
+        }
       }
-      if(compress)
-	err=z.deflate(flush);
-      else
-	err=z.inflate(flush);
-      if(nomoreinput&&(err==JZlib.Z_BUF_ERROR))
-        return(-1);
-      if(err!=JZlib.Z_OK && err!=JZlib.Z_STREAM_END)
-	throw new ZStreamException((compress ? "de" : "in")+"flating: "+z.msg);
-      if((nomoreinput||err==JZlib.Z_STREAM_END)&&(z.avail_out==len))
-	return(-1);
-    } 
-    while(z.avail_out==len&&err==JZlib.Z_OK);
-    //System.err.print("("+(len-z.avail_out)+")");
-    return(len-z.avail_out);
+    }
+    else{
+      return iis.read(b, off, len); 
+    }
   }
 
   public long skip(long n) throws IOException {
@@ -122,28 +102,25 @@
   }
 
   public int getFlushMode() {
-    return(flush);
+    return flush;
   }
 
   public void setFlushMode(int flush) {
     this.flush=flush;
   }
 
-  /**
-   * Returns the total number of bytes input so far.
-   */
   public long getTotalIn() {
-    return z.total_in;
+    if(compress) return deflater.total_in;
+    else return iis.getTotalIn();
   }
 
-  /**
-   * Returns the total number of bytes output so far.
-   */
   public long getTotalOut() {
-    return z.total_out;
+    if(compress) return deflater.total_out;
+    else return iis.getTotalOut();
   }
 
   public void close() throws IOException{
-    in.close();
+    if(compress) deflater.end();
+    else iis.close();
   }
 }
diff --git a/java/com/jcraft/jzlib/ZOutputStream.java b/java/com/jcraft/jzlib/ZOutputStream.java
index afee65b..32074aa 100644
--- a/java/com/jcraft/jzlib/ZOutputStream.java
+++ b/java/com/jcraft/jzlib/ZOutputStream.java
@@ -1,6 +1,6 @@
 /* -*-mode:java; c-basic-offset:2; indent-tabs-mode:nil -*- */
 /*
-Copyright (c) 2001 Lapo Luchini.
+Copyright (c) 2011 ymnk, JCraft,Inc. All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are met:
@@ -17,8 +17,8 @@
 
 THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
 INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS
-OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
+INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
 OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
@@ -26,72 +26,79 @@
 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
-/*
- * This program is based on zlib-1.1.3, so all credit should go authors
- * Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu)
- * and contributors of zlib.
- */
 
 package com.jcraft.jzlib;
 import java.io.*;
 
-public class ZOutputStream extends OutputStream {
+/**
+ * ZOutputStream
+ *
+ * @deprecated  use DeflaterOutputStream or InflaterInputStream
+ */
+@Deprecated
+public class ZOutputStream extends FilterOutputStream {
 
-  protected ZStream z=new ZStream();
   protected int bufsize=512;
   protected int flush=JZlib.Z_NO_FLUSH;
-  protected byte[] buf=new byte[bufsize],
-                   buf1=new byte[1];
+  protected byte[] buf=new byte[bufsize];
   protected boolean compress;
 
   protected OutputStream out;
+  private boolean end=false;
 
-  public ZOutputStream(OutputStream out) {
-    super();
+  private DeflaterOutputStream dos;
+  private Inflater inflater;
+
+  public ZOutputStream(OutputStream out) throws IOException {
+    super(out);
     this.out=out;
-    z.inflateInit();
+    inflater = new Inflater();
+    inflater.init();
     compress=false;
   }
 
-  public ZOutputStream(OutputStream out, int level) {
+  public ZOutputStream(OutputStream out, int level) throws IOException {
     this(out, level, false);
   }
-  public ZOutputStream(OutputStream out, int level, boolean nowrap) {
-    super();
+
+  public ZOutputStream(OutputStream out, int level, boolean nowrap) throws IOException {
+    super(out);
     this.out=out;
-    z.deflateInit(level, nowrap);
+    Deflater deflater = new Deflater(level, nowrap);
+    dos = new DeflaterOutputStream(out, deflater);
     compress=true;
   }
 
+  private byte[] buf1 = new byte[1];
   public void write(int b) throws IOException {
     buf1[0]=(byte)b;
     write(buf1, 0, 1);
   }
 
   public void write(byte b[], int off, int len) throws IOException {
-    if(len==0)
+    if(len==0) return;
+    if(compress){
+      dos.write(b, off, len);
+    }
+    else {
+      inflater.setInput(b, off, len, true);
+      int err = JZlib.Z_OK;
+      while(inflater.avail_in>0){
+        inflater.setOutput(buf, 0, buf.length);
+        err = inflater.inflate(flush);
+        if(inflater.next_out_index>0)
+          out.write(buf, 0, inflater.next_out_index);
+        if(err != JZlib.Z_OK)
+          break;
+      }
+      if(err != JZlib.Z_OK)
+        throw new ZStreamException("inflating: "+inflater.msg);
       return;
-    int err;
-    z.next_in=b;
-    z.next_in_index=off;
-    z.avail_in=len;
-    do{
-      z.next_out=buf;
-      z.next_out_index=0;
-      z.avail_out=bufsize;
-      if(compress)
-        err=z.deflate(flush);
-      else
-        err=z.inflate(flush);
-      if(err!=JZlib.Z_OK)
-        throw new ZStreamException((compress?"de":"in")+"flating: "+z.msg);
-      out.write(buf, 0, bufsize-z.avail_out);
-    } 
-    while(z.avail_in>0 || z.avail_out==0);
+    }
   }
 
   public int getFlushMode() {
-    return(flush);
+    return flush;
   }
 
   public void setFlushMode(int flush) {
@@ -100,28 +107,28 @@
 
   public void finish() throws IOException {
     int err;
-    do{
-      z.next_out=buf;
-      z.next_out_index=0;
-      z.avail_out=bufsize;
-      if(compress){ err=z.deflate(JZlib.Z_FINISH);  }
-      else{ err=z.inflate(JZlib.Z_FINISH); }
-      if(err!=JZlib.Z_STREAM_END && err != JZlib.Z_OK)
-      throw new ZStreamException((compress?"de":"in")+"flating: "+z.msg);
-      if(bufsize-z.avail_out>0){
-	out.write(buf, 0, bufsize-z.avail_out);
+    if(compress){
+      int tmp = flush;
+      int flush = JZlib.Z_FINISH;
+      try{
+        write("".getBytes(), 0, 0);
       }
+      finally { flush = tmp; }
     }
-    while(z.avail_in>0 || z.avail_out==0);
+    else{
+      dos.finish();
+    }
     flush();
   }
-  public void end() {
-    if(z==null)
-      return;
-    if(compress){ z.deflateEnd(); }
-    else{ z.inflateEnd(); }
-    z.free();
-    z=null;
+  public synchronized void end() {
+    if(end) return;
+    if(compress){
+      try { dos.finish(); } catch(Exception e){}
+    }
+    else{
+      inflater.end();
+    }
+    end=true;
   }
   public void close() throws IOException {
     try{
@@ -135,18 +142,14 @@
     }
   }
 
-  /**
-   * Returns the total number of bytes input so far.
-   */
   public long getTotalIn() {
-    return z.total_in;
+    if(compress) return dos.getTotalIn();
+    else return inflater.total_in;
   }
 
-  /**
-   * Returns the total number of bytes output so far.
-   */
   public long getTotalOut() {
-    return z.total_out;
+    if(compress) return dos.getTotalOut();
+    else return inflater.total_out;
   }
 
   public void flush() throws IOException {
diff --git a/java/com/jcraft/jzlib/ZStream.java b/java/com/jcraft/jzlib/ZStream.java
index 334475e..dd0a525 100644
--- a/java/com/jcraft/jzlib/ZStream.java
+++ b/java/com/jcraft/jzlib/ZStream.java
@@ -1,6 +1,6 @@
 /* -*-mode:java; c-basic-offset:2; indent-tabs-mode:nil -*- */
 /*
-Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved.
+Copyright (c) 2000-2011 ymnk, JCraft,Inc. All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are met:
@@ -34,7 +34,13 @@
 
 package com.jcraft.jzlib;
 
-final public class ZStream{
+/**
+ * ZStream
+ *
+ * @deprecated  Not for public use in the future.
+ */
+@Deprecated
+public class ZStream{
 
   static final private int MAX_WBITS=15;        // 32K LZ77 window
   static final private int DEF_WBITS=MAX_WBITS;
@@ -74,8 +80,15 @@
 
   int data_type; // best guess about the data type: ascii or binary
 
-  public long adler;
-  Adler32 _adler=new Adler32();
+  Checksum adler;
+
+  public ZStream(){
+    this(new Adler32());
+  }
+
+  public ZStream(Checksum adler){
+    this.adler=adler;
+  }
 
   public int inflateInit(){
     return inflateInit(DEF_WBITS);
@@ -88,29 +101,37 @@
   }
 
   public int inflateInit(int w, boolean nowrap){
-    istate=new Inflate();
-    return istate.inflateInit(this, nowrap?-w:w);
+    istate=new Inflate(this);
+    return istate.inflateInit(nowrap?-w:w);
   }
 
   public int inflate(int f){
     if(istate==null) return Z_STREAM_ERROR;
-    return istate.inflate(this, f);
+    return istate.inflate(f);
   }
   public int inflateEnd(){
     if(istate==null) return Z_STREAM_ERROR;
-    int ret=istate.inflateEnd(this);
-    istate = null;
+    int ret=istate.inflateEnd();
+//    istate = null;
     return ret;
   }
   public int inflateSync(){
     if(istate == null)
       return Z_STREAM_ERROR;
-    return istate.inflateSync(this);
+    return istate.inflateSync();
+  }
+  public int inflateSyncPoint(){
+    if(istate == null)
+      return Z_STREAM_ERROR;
+    return istate.inflateSyncPoint();
   }
   public int inflateSetDictionary(byte[] dictionary, int dictLength){
     if(istate == null)
       return Z_STREAM_ERROR;
-    return istate.inflateSetDictionary(this, dictionary, dictLength);
+    return istate.inflateSetDictionary(dictionary, dictLength);
+  }
+  public boolean inflateFinished(){
+    return istate.mode==12 /*DONE*/;
   }
 
   public int deflateInit(int level){
@@ -122,15 +143,19 @@
   public int deflateInit(int level, int bits){
     return deflateInit(level, bits, false);
   }
+  public int deflateInit(int level, int bits, int memlevel){
+    dstate=new Deflate(this);
+    return dstate.deflateInit(level, bits, memlevel);
+  }
   public int deflateInit(int level, int bits, boolean nowrap){
-    dstate=new Deflate();
-    return dstate.deflateInit(this, level, nowrap?-bits:bits);
+    dstate=new Deflate(this);
+    return dstate.deflateInit(level, nowrap?-bits:bits);
   }
   public int deflate(int flush){
     if(dstate==null){
       return Z_STREAM_ERROR;
     }
-    return dstate.deflate(this, flush);
+    return dstate.deflate(flush);
   }
   public int deflateEnd(){
     if(dstate==null) return Z_STREAM_ERROR;
@@ -140,12 +165,12 @@
   }
   public int deflateParams(int level, int strategy){
     if(dstate==null) return Z_STREAM_ERROR;
-    return dstate.deflateParams(this, level, strategy);
+    return dstate.deflateParams(level, strategy);
   }
   public int deflateSetDictionary (byte[] dictionary, int dictLength){
     if(dstate == null)
       return Z_STREAM_ERROR;
-    return dstate.deflateSetDictionary(this, dictionary, dictLength);
+    return dstate.deflateSetDictionary(dictionary, dictLength);
   }
 
   // Flush as much pending output as possible. All deflate() output goes
@@ -162,9 +187,9 @@
        next_out.length<=next_out_index ||
        dstate.pending_buf.length<(dstate.pending_out+len) ||
        next_out.length<(next_out_index+len)){
-      System.out.println(dstate.pending_buf.length+", "+dstate.pending_out+
-			 ", "+next_out.length+", "+next_out_index+", "+len);
-      System.out.println("avail_out="+avail_out);
+      //System.out.println(dstate.pending_buf.length+", "+dstate.pending_out+
+      //		 ", "+next_out.length+", "+next_out_index+", "+len);
+      //System.out.println("avail_out="+avail_out);
     }
 
     System.arraycopy(dstate.pending_buf, dstate.pending_out,
@@ -193,8 +218,8 @@
 
     avail_in-=len;
 
-    if(dstate.noheader==0) {
-      adler=_adler.adler32(adler, next_in, next_in_index, len);
+    if(dstate.wrap!=0) {
+      adler.update(next_in, next_in_index, len);
     }
     System.arraycopy(next_in, next_in_index, buf, start, len);
     next_in_index  += len;
@@ -202,10 +227,117 @@
     return len;
   }
 
+  public long getAdler(){
+    return adler.getValue();
+  }
+
   public void free(){
     next_in=null;
     next_out=null;
     msg=null;
-    _adler=null;
   }
+
+  public void setOutput(byte[] buf){
+    setOutput(buf, 0, buf.length); 
+  }
+
+  public void setOutput(byte[] buf, int off, int len){
+    next_out = buf;
+    next_out_index = off;
+    avail_out = len;
+  }
+
+  public void setInput(byte[] buf){
+    setInput(buf, 0, buf.length, false); 
+  }
+
+  public void setInput(byte[] buf, boolean append){
+    setInput(buf, 0, buf.length, append); 
+  }
+
+  public void setInput(byte[] buf, int off, int len, boolean append){
+    if(len<=0 && append && next_in!=null) return;
+
+    if(avail_in>0 && append){  
+      byte[] tmp = new byte[avail_in+len];
+      System.arraycopy(next_in, next_in_index, tmp, 0, avail_in);
+      System.arraycopy(buf, off, tmp, avail_in, len);
+      next_in=tmp;
+      next_in_index=0;
+      avail_in+=len;
+    }
+    else{
+      next_in=buf;
+      next_in_index=off;
+      avail_in=len;
+    }
+  }
+
+  public byte[] getNextIn(){
+    return next_in;
+  }
+
+  public void setNextIn(byte[] next_in){
+    this.next_in = next_in;
+  }
+
+  public int getNextInIndex(){
+    return next_in_index;
+  }
+
+  public void setNextInIndex(int next_in_index){
+    this.next_in_index = next_in_index;
+  }
+
+  public int getAvailIn(){
+    return avail_in;
+  }
+
+  public void setAvailIn(int avail_in){
+    this.avail_in = avail_in;
+  }
+
+  public byte[] getNextOut(){
+    return next_out;
+  }
+
+  public void setNextOut(byte[] next_out){
+    this.next_out = next_out;
+  }
+
+  public int getNextOutIndex(){
+    return next_out_index;
+  }
+
+  public void setNextOutIndex(int next_out_index){
+    this.next_out_index = next_out_index;
+  }
+
+  public int getAvailOut(){
+    return avail_out;
+
+  }
+
+  public void setAvailOut(int avail_out){
+    this.avail_out = avail_out;
+  }
+
+  public long getTotalOut(){
+    return total_out;
+  }
+
+  public long getTotalIn(){
+    return total_in;
+  }
+
+  public String getMessage(){
+    return msg;
+  }
+
+  /**
+   * Those methods are expected to be override by Inflater and Deflater.
+   * In the future, they will become abstract methods.
+   */ 
+  public int end(){ return Z_OK; }
+  public boolean finished(){ return false; }
 }
