diff --git a/.gitignore b/.gitignore
index fa8d85ac..f976c0b5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,4 @@
 Cargo.lock
 target
+
+\.idea/
diff --git a/.travis.yml b/.travis.yml
index 46bbd08f..85769bd1 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -12,13 +12,9 @@ notifications:
         on_failure: always
 
 script:
-    - |
-      [ "$TRAVIS_RUST_VERSION" = "1.20.0" ] || cargo test
+    - cargo test
     - cargo test --no-default-features
-    - |
-      [ "$TRAVIS_RUST_VERSION" = "1.20.0" ] || cargo test --no-default-features --features "deflate-zlib"
-    - cargo test --no-default-features --features "deflate-miniz"
-    - cargo doc --no-deps --no-default-features --features "deflate-miniz,bzip2"
+    - cargo doc --no-deps
     - rustdoc --test README.md -L target/debug
 
 after_success:
diff --git a/Cargo.toml b/Cargo.toml
index 9b32474f..1346f2c5 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -12,17 +12,15 @@ Library to support the reading and writing of zip files.
 """
 
 [dependencies]
-flate2 = { version = "1.0", default-features = false, optional = true }
 time = "0.1"
 podio = "0.1"
 msdos_time = "0.1"
 bzip2 = { version = "0.3", optional = true }
+libflate = { version = "0.1.16", optional = true }
 
 [dev-dependencies]
 walkdir = "1.0"
 
 [features]
-deflate = ["flate2", "flate2/rust_backend"]
-deflate-miniz = ["flate2", "flate2/miniz-sys"]
-deflate-zlib = ["flate2", "flate2/zlib"]
+deflate = ["libflate"]
 default = ["bzip2", "deflate"]
diff --git a/appveyor.yml b/appveyor.yml
index b9450e3c..67321b4b 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -42,4 +42,3 @@ build: false
 test_script:
   - cargo test
   - cargo test --no-default-features
-  - cargo test --no-default-features --features "deflate-miniz"
diff --git a/examples/write_dir.rs b/examples/write_dir.rs
index 0e6f59bd..5d689eef 100644
--- a/examples/write_dir.rs
+++ b/examples/write_dir.rs
@@ -17,9 +17,9 @@ fn main() {
 
 const METHOD_STORED : Option<zip::CompressionMethod> = Some(zip::CompressionMethod::Stored);
 
-#[cfg(feature = "flate2")]
+#[cfg(feature = "deflate")]
 const METHOD_DEFLATED : Option<zip::CompressionMethod> = Some(zip::CompressionMethod::Deflated);
-#[cfg(not(feature = "flate2"))]
+#[cfg(not(feature = "deflate"))]
 const METHOD_DEFLATED : Option<zip::CompressionMethod> = None;
 
 #[cfg(feature = "bzip2")]
diff --git a/src/compression.rs b/src/compression.rs
index 79c41a8f..cbf73b79 100644
--- a/src/compression.rs
+++ b/src/compression.rs
@@ -8,8 +8,8 @@ pub enum CompressionMethod
 {
     /// The file is stored (no compression)
     Stored,
-    /// The file is Deflated
-    #[cfg(feature = "flate2")]
+    /// Deflate in pure rust
+    #[cfg(feature = "deflate")]
     Deflated,
     /// File is compressed using BZIP2 algorithm
     #[cfg(feature = "bzip2")]
@@ -23,7 +23,7 @@ impl CompressionMethod {
     pub fn from_u16(val: u16) -> CompressionMethod {
         match val {
             0 => CompressionMethod::Stored,
-            #[cfg(feature = "flate2")]
+            #[cfg(feature = "deflate")]
             8 => CompressionMethod::Deflated,
             #[cfg(feature = "bzip2")]
             12 => CompressionMethod::Bzip2,
@@ -35,7 +35,7 @@ impl CompressionMethod {
     pub fn to_u16(self) -> u16 {
         match self {
             CompressionMethod::Stored => 0,
-            #[cfg(feature = "flate2")]
+            #[cfg(feature = "deflate")]
             CompressionMethod::Deflated => 8,
             #[cfg(feature = "bzip2")]
             CompressionMethod::Bzip2 => 12,
@@ -65,22 +65,22 @@ mod test {
         }
     }
 
-    #[cfg(all(not(feature = "bzip2"), feature = "flate2"))]
+    #[cfg(all(not(feature = "bzip2"), feature = "deflate"))]
     fn methods() -> Vec<CompressionMethod> {
         vec![CompressionMethod::Stored, CompressionMethod::Deflated]
     }
 
-    #[cfg(all(not(feature = "flate2"), feature = "bzip2"))]
+    #[cfg(all(not(feature = "deflate"), feature = "bzip2"))]
     fn methods() -> Vec<CompressionMethod> {
         vec![CompressionMethod::Stored, CompressionMethod::Bzip2]
     }
 
-    #[cfg(all(feature = "bzip2", feature = "flate2"))]
+    #[cfg(all(feature = "bzip2", feature = "deflate"))]
     fn methods() -> Vec<CompressionMethod> {
         vec![CompressionMethod::Stored, CompressionMethod::Deflated, CompressionMethod::Bzip2]
     }
 
-    #[cfg(all(not(feature = "bzip2"), not(feature = "flate2")))]
+    #[cfg(all(not(feature = "bzip2"), not(feature = "deflate")))]
     fn methods() -> Vec<CompressionMethod> {
         vec![CompressionMethod::Stored]
     }
diff --git a/src/lib.rs b/src/lib.rs
index f694dfc0..f4d7738a 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -4,8 +4,8 @@
 
 #[cfg(feature = "bzip2")]
 extern crate bzip2;
-#[cfg(feature = "flate2")]
-extern crate flate2;
+#[cfg(feature = "deflate")]
+extern crate libflate;
 extern crate msdos_time;
 extern crate podio;
 extern crate time;
diff --git a/src/read.rs b/src/read.rs
index e37be2c6..8ed01b59 100644
--- a/src/read.rs
+++ b/src/read.rs
@@ -14,10 +14,8 @@ use types::{ZipFileData, System, DateTime};
 use cp437::FromCp437;
 use msdos_time::MsDosDateTime;
 
-#[cfg(feature = "flate2")]
-use flate2;
-#[cfg(feature = "flate2")]
-use flate2::read::DeflateDecoder;
+#[cfg(feature = "deflate")]
+use libflate;
 
 #[cfg(feature = "bzip2")]
 use bzip2::read::BzDecoder;
@@ -66,8 +64,8 @@ pub struct ZipArchive<R: Read + io::Seek>
 enum ZipFileReader<'a> {
     NoReader,
     Stored(Crc32Reader<io::Take<&'a mut Read>>),
-    #[cfg(feature = "flate2")]
-    Deflated(Crc32Reader<flate2::read::DeflateDecoder<io::Take<&'a mut Read>>>),
+    #[cfg(feature = "deflate")]
+    Deflated(Crc32Reader<libflate::deflate::Decoder<io::Take<&'a mut Read>>>),
     #[cfg(feature = "bzip2")]
     Bzip2(Crc32Reader<BzDecoder<io::Take<&'a mut Read>>>),
 }
@@ -97,10 +95,10 @@ fn make_reader<'a>(
                 reader,
                 crc32)))
         },
-        #[cfg(feature = "flate2")]
+        #[cfg(feature = "deflate")]
         CompressionMethod::Deflated =>
         {
-            let deflate_reader = DeflateDecoder::new(reader);
+            let deflate_reader = libflate::deflate::Decoder::new(reader);
             Ok(ZipFileReader::Deflated(Crc32Reader::new(
                 deflate_reader,
                 crc32)))
@@ -419,14 +417,14 @@ fn get_reader<'a>(reader: &'a mut ZipFileReader) -> &'a mut Read {
     match *reader {
         ZipFileReader::NoReader => panic!("ZipFileReader was in an invalid state"),
         ZipFileReader::Stored(ref mut r) => r as &mut Read,
-        #[cfg(feature = "flate2")]
+        #[cfg(feature = "deflate")]
         ZipFileReader::Deflated(ref mut r) => r as &mut Read,
         #[cfg(feature = "bzip2")]
         ZipFileReader::Bzip2(ref mut r) => r as &mut Read,
     }
 }
 
-/// Methods for retreiving information on zip files
+/// Methods for retrieving information on zip files
 impl<'a> ZipFile<'a> {
     fn get_reader(&mut self) -> &mut Read {
         get_reader(&mut self.reader)
@@ -523,7 +521,7 @@ impl<'a> Drop for ZipFile<'a> {
             let mut reader = match innerreader {
                 ZipFileReader::NoReader => panic!("ZipFileReader was in an invalid state"),
                 ZipFileReader::Stored(crcreader) => crcreader.into_inner(),
-                #[cfg(feature = "flate2")]
+                #[cfg(feature = "deflate")]
                 ZipFileReader::Deflated(crcreader) => crcreader.into_inner().into_inner(),
                 #[cfg(feature = "bzip2")]
                 ZipFileReader::Bzip2(crcreader) => crcreader.into_inner().into_inner(),
diff --git a/src/write.rs b/src/write.rs
index 03fa7e6f..bab9a954 100644
--- a/src/write.rs
+++ b/src/write.rs
@@ -12,10 +12,8 @@ use std::mem;
 use time;
 use podio::{WritePodExt, LittleEndian};
 
-#[cfg(feature = "flate2")]
-use flate2;
-#[cfg(feature = "flate2")]
-use flate2::write::DeflateEncoder;
+#[cfg(feature = "deflate")]
+use libflate;
 
 #[cfg(feature = "bzip2")]
 use bzip2;
@@ -28,8 +26,8 @@ enum GenericZipWriter<W: Write + io::Seek>
 {
     Closed,
     Storer(W),
-    #[cfg(feature = "flate2")]
-    Deflater(DeflateEncoder<W>),
+    #[cfg(feature = "deflate")]
+    Deflater(libflate::deflate::Encoder<W>),
     #[cfg(feature = "bzip2")]
     Bzip2(BzEncoder<W>),
 }
@@ -82,7 +80,7 @@ pub struct FileOptions {
 }
 
 impl FileOptions {
-    #[cfg(feature = "flate2")]
+    #[cfg(feature = "deflate")]
     /// Construct a new FileOptions object
     pub fn default() -> FileOptions {
         FileOptions {
@@ -92,7 +90,7 @@ impl FileOptions {
         }
     }
 
-    #[cfg(not(feature = "flate2"))]
+    #[cfg(not(feature = "deflate"))]
     /// Construct a new FileOptions object
     pub fn default() -> FileOptions {
         FileOptions {
@@ -357,8 +355,8 @@ impl<W: Write+io::Seek> GenericZipWriter<W>
         let bare = match mem::replace(self, GenericZipWriter::Closed)
         {
             GenericZipWriter::Storer(w) => w,
-            #[cfg(feature = "flate2")]
-            GenericZipWriter::Deflater(w) => w.finish()?,
+            #[cfg(feature = "deflate")]
+            GenericZipWriter::Deflater(w) =>  w.finish().into_result()?,
             #[cfg(feature = "bzip2")]
             GenericZipWriter::Bzip2(w) => w.finish()?,
             GenericZipWriter::Closed => Err(io::Error::new(io::ErrorKind::BrokenPipe, "ZipWriter was already closed"))?,
@@ -367,8 +365,8 @@ impl<W: Write+io::Seek> GenericZipWriter<W>
         *self = match compression
         {
             CompressionMethod::Stored => GenericZipWriter::Storer(bare),
-            #[cfg(feature = "flate2")]
-            CompressionMethod::Deflated => GenericZipWriter::Deflater(DeflateEncoder::new(bare, flate2::Compression::default())),
+            #[cfg(feature = "deflate")]
+            CompressionMethod::Deflated => GenericZipWriter::Deflater(libflate::deflate::Encoder::new(bare)),
             #[cfg(feature = "bzip2")]
             CompressionMethod::Bzip2 => GenericZipWriter::Bzip2(BzEncoder::new(bare, bzip2::Compression::Default)),
             CompressionMethod::Unsupported(..) => return Err(ZipError::UnsupportedArchive("Unsupported compression")),
@@ -380,7 +378,7 @@ impl<W: Write+io::Seek> GenericZipWriter<W>
     fn ref_mut(&mut self) -> Option<&mut Write> {
         match *self {
             GenericZipWriter::Storer(ref mut w) => Some(w as &mut Write),
-            #[cfg(feature = "flate2")]
+            #[cfg(feature = "deflate")]
             GenericZipWriter::Deflater(ref mut w) => Some(w as &mut Write),
             #[cfg(feature = "bzip2")]
             GenericZipWriter::Bzip2(ref mut w) => Some(w as &mut Write),
@@ -409,7 +407,7 @@ impl<W: Write+io::Seek> GenericZipWriter<W>
     fn current_compression(&self) -> Option<CompressionMethod> {
         match *self {
             GenericZipWriter::Storer(..) => Some(CompressionMethod::Stored),
-            #[cfg(feature = "flate2")]
+            #[cfg(feature = "deflate")]
             GenericZipWriter::Deflater(..) => Some(CompressionMethod::Deflated),
             #[cfg(feature = "bzip2")]
             GenericZipWriter::Bzip2(..) => Some(CompressionMethod::Bzip2),