add LZ4 support
diff --git a/changes.xml b/changes.xml
index 014c051..085cbcd 100644
--- a/changes.xml
+++ b/changes.xml
@@ -40,7 +40,7 @@
     <release version="1.5" date="unreleased">
       <action type="update" breaks-bwc="true">
         The Apache Compress Antlib now requires Apache Commons
-        Compress 1.14 or later for 7z, DEFLATE and write support
+        Compress 1.14 or later for 7z, DEFLATE, LZ4 and write support
         for LZMA and Snappy.
         XZ for Java 1.6 is required for write support for LZMA.
       </action>
@@ -66,6 +66,9 @@
       <action type="add">
         Added write support for the Snappy format.
       </action>
+      <action type="add">
+        Added support for the LZ4 format.
+      </action>
     </release>
 
     <release version="1.4" date="2014-01-29">
diff --git a/docs/compresource.html b/docs/compresource.html
index 50dc979..3091c72 100644
--- a/docs/compresource.html
+++ b/docs/compresource.html
@@ -33,7 +33,7 @@
 
 <a name="decompressConcatenated">
 <p>Resources for the formats that support files holding multiple
-  compressed streams (bzip2, gzip and xz) support a boolean attribute
+  compressed streams (bzip2, gzip, lz4 and xz) support a boolean attribute
   decompressConcatenated.  If set to true all streams will be
   concatenated and treated as a single resource.  With the default
   value false only the first stream is uncompressed.</p>
@@ -111,6 +111,50 @@
   some-archive.tar.gz where the <code>gzipresource</code> provides
   the decompression of the archive.</p>
 
+<h2><a name="lz4resource">lz4resource</a></h2>
+
+<p><em>Since Apache Compress Antlib 1.5</em>.</p>
+
+<p>This is a <a href="#compresource">compressed resource</a> using the
+  LZ4 compression.</p>
+
+<p>This resource supports
+  the <a href="#decompressConcatenated">decompressConcatenated</a>
+  attribute if the frame format is used.</p>
+
+<h4>Parameters</h4>
+  <p>In addition to the attributes supported by all uncompressing resources
+    this resource also supports.</p>
+  <table border="1" cellpadding="2" cellspacing="0">
+    <tr>
+      <td valign="top"><b>Attribute</b></td>
+      <td valign="top"><b>Description</b></td>
+      <td align="center" valign="top"><b>Required</b></td>
+    </tr>
+    <tr>
+      <td valign="top">framed</td>
+      <td valign="top">Whether the input is expected to use
+      the <a href="http://lz4.github.io/lz4/lz4_Frame_format.html">frame
+     format</a>.</td>
+      <td align="center" valign="top">No, defaults to true.</td>
+    </tr>
+  </table>
+
+<h4>Examples</h4>
+
+<pre>
+&lt;cmp:tarentry xmlns:cmp="antlib:org.apache.ant.compress"
+    name="some-file.txt"&gt;
+  &lt;cmp:lz4resource&gt;
+    &lt;file file="some-archive.tar.lz4"/&gt;
+  &lt;/cmp:lz4resource&gt;
+&lt;/cmp:tarentry&gt;
+</pre>
+
+<p>Represents the entry named some-file.txt in archive
+  some-archive.tar.lz4 where the <code>lz4resource</code> provides
+  the decompression of the archive.</p>
+
 <h2><a name="lzmaresource">lzmaresource</a></h2>
 
 <p><em>Since Apache Compress Antlib 1.3</em>.</p>
diff --git a/docs/index.html b/docs/index.html
index f7e2c4b..c249f43 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -28,10 +28,10 @@
     <p>This Antlib contains tasks and resources that provide
       compression/uncompression and archival/unarchival capabilities
       based on <a href="http://commons.apache.org/compress/">Apache
-      Commons Compress</a>.  Using Apache Commons Compress 1.13 this
-      Antlib supports gzip, bzip2, lzma standalone, xz, .Z, DEFLATE, Snappy and
-      pack200 compression and ar, arj, cpio, 7z, Unix dump, tar and
-      zip archives.  Support for arj, .Z and dump is
+      Commons Compress</a>.  Using Apache Commons Compress 1.14 this
+      Antlib supports gzip, bzip2, lzma standalone, xz, .Z, DEFLATE,
+      Snappy, LZ4 and pack200 compression and ar, arj, cpio, 7z, Unix
+      dump, tar and zip archives.  Support for arj, .Z and dump is
       read-only.  7z can only be used on filesystem resources.</p>
 
     <h3>Known Limitations</h3>
@@ -52,6 +52,7 @@
       <li><a href="pack.html#deflate">deflate</a></li>
       <li><a href="unpack.html#gunzip">gunzip</a></li>
       <li><a href="pack.html#gzip">gzip</a></li>
+      <li><a href="pack.html#lz4">lz4</a></li>
       <li><a href="pack.html#lzma">lzma</a></li>
       <li><a href="pack.html#pack200">pack200</a></li>
       <li><a href="pack200normalize.html">pack200normalize</a></li>
@@ -64,6 +65,7 @@
       <li><a href="expand.html#uncpio">uncpio</a></li>
       <li><a href="unpack.html#undeflate">undeflate</a></li>
       <li><a href="expand.html#undump">undump</a></li>
+      <li><a href="unpack.html#unlz4">unlz4</a></li>
       <li><a href="unpack.html#unlzma">unlzma</a></li>
       <li><a href="unpack.html#unpack200">unpack200</a></li>
       <li><a href="unpack.html#unsnappy">unsnappy</a></li>
@@ -90,6 +92,7 @@
       <li><a href="entry.html#dumpentry">dumpentry</a></li>
       <li><a href="fileset.html#dumpfileset">dumpfileset</a></li>
       <li><a href="compresource.html#gzipresource">gzipresource</a></li>
+      <li><a href="compresource.html#lz4resource">lz4resource</a></li>
       <li><a href="compresource.html#lzmaresource">lzmaresource</a></li>
       <li><a href="compresource.html#pack200resource">pack200resource</a></li>
       <li><a href="compresource.html#snappyresource">snappyresource</a></li>
diff --git a/docs/pack.html b/docs/pack.html
index 39e9b10..2383102 100644
--- a/docs/pack.html
+++ b/docs/pack.html
@@ -151,6 +151,33 @@
     </tr>
   </table>
 
+  <h3><a name="lz4">LZ4</a></h3>
+
+  <p>Is a <a href="#pack">compressing task</a> that uses
+    the <a href="http://lz4.github.io/lz4/">LZ4</a> compression
+    algorithm.</p>
+
+  <p><em>Since Compress Antlib 1.5</em>
+
+  <h4>Parameters</h4>
+  <p>In addition to the attributes supported by all compressing task
+    this task also supports.</p>
+  <table border="1" cellpadding="2" cellspacing="0">
+    <tr>
+      <td valign="top"><b>Attribute</b></td>
+      <td valign="top"><b>Description</b></td>
+      <td align="center" valign="top"><b>Required</b></td>
+    </tr>
+    <tr>
+      <td valign="top">framed</td>
+      <td valign="top">Whether to use
+        the <a href="http://lz4.github.io/lz4/lz4_Frame_format.html">frame
+        format</a>.
+      </td>
+      <td align="center" valign="top">No, defaults to true.</td>
+    </tr>
+  </table>
+
   <h3><a name="lzma">LZMA</a></h3>
 
   <p>Is a <a href="#pack">compressing task</a> that uses the LZMA
diff --git a/docs/unpack.html b/docs/unpack.html
index 2b96a70..e36d97d 100644
--- a/docs/unpack.html
+++ b/docs/unpack.html
@@ -117,7 +117,36 @@
     </tr>
   </table>
 
-<h3><a name="unlzma">UnLZMA</a></h3>
+<h3><a name="unlz4">UnLZ4</a></h3>
+
+<p>Is an <a href="#unpack">uncompressing task</a> that uses the LZ4
+  compression algorithm.</p>
+
+<p><em>Since Apache Compress Antlib 1.5</em>.</p>
+
+<p>This task supports
+  the <a href="#decompressConcatenated">decompressConcatenated</a>
+  attribute if the frame format is used.</p>
+
+<h4>Parameters</h4>
+  <p>In addition to the attributes supported by all uncompressing task
+    this task also supports.</p>
+  <table border="1" cellpadding="2" cellspacing="0">
+    <tr>
+      <td valign="top"><b>Attribute</b></td>
+      <td valign="top"><b>Description</b></td>
+      <td align="center" valign="top"><b>Required</b></td>
+    </tr>
+    <tr>
+      <td valign="top">framed</td>
+      <td valign="top">Whether the input is expected to use
+      the <a href="http://lz4.github.io/lz4/lz4_Frame_format.html">frame
+     format</a>.</td>
+      <td align="center" valign="top">No, defaults to true.</td>
+    </tr>
+  </table>
+
+  <h3><a name="unlzma">UnLZMA</a></h3>
 
 <p>Is an <a href="#unpack">uncompressing task</a> that uses the LZMA
   compression algorithm.</p>
diff --git a/ivy.xml b/ivy.xml
index 65bf92b..4eadc03 100644
--- a/ivy.xml
+++ b/ivy.xml
@@ -29,7 +29,7 @@
     <description homepage="http://ant.apache.org/antlibs/compress/">
       Provides tasks and types that deal with AR, ARJ, CPIO, TAR,
       DUMP, 7Z and ZIP archives as well as BZIP2, PACK200, GZIP, LZMA,
-      Snappy and XZ compressed files based on Apache Commons Compress.
+      Snappy, LZ4 and XZ compressed files based on Apache Commons Compress.
     </description>
   </info>
   <configurations>
diff --git a/src/main/org/apache/ant/compress/antlib.xml b/src/main/org/apache/ant/compress/antlib.xml
index 8f4ea91..00b762a 100644
--- a/src/main/org/apache/ant/compress/antlib.xml
+++ b/src/main/org/apache/ant/compress/antlib.xml
@@ -73,6 +73,10 @@
      classname="org.apache.ant.compress.taskdefs.GUnzip"
      />
   <taskdef
+     name="unlz4"
+     classname="org.apache.ant.compress.taskdefs.UnLZ4"
+     />
+  <taskdef
      name="unlzma"
      classname="org.apache.ant.compress.taskdefs.UnLZMA"
      />
@@ -125,6 +129,10 @@
      classname="org.apache.ant.compress.taskdefs.XZ"
      />
   <taskdef
+     name="lz4"
+     classname="org.apache.ant.compress.taskdefs.LZ4"
+     />
+  <taskdef
      name="lzma"
      classname="org.apache.ant.compress.taskdefs.LZMA"
      />
@@ -203,6 +211,10 @@
      classname="org.apache.ant.compress.resources.GZipResource"
      />
   <typedef
+     name="lz4resource"
+     classname="org.apache.ant.compress.resources.LZ4Resource"
+     />
+  <typedef
      name="lzmaresource"
      classname="org.apache.ant.compress.resources.LZMAResource"
      />
diff --git a/src/main/org/apache/ant/compress/resources/LZ4Resource.java b/src/main/org/apache/ant/compress/resources/LZ4Resource.java
new file mode 100644
index 0000000..bcdedd0
--- /dev/null
+++ b/src/main/org/apache/ant/compress/resources/LZ4Resource.java
@@ -0,0 +1,50 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.ant.compress.resources;
+
+import org.apache.ant.compress.util.LZ4StreamFactory;
+import org.apache.tools.ant.types.ResourceCollection;
+
+/**
+ * An LZ4 compressed resource.
+ * @since Apache Compress Antlib 1.5
+ */
+public final class LZ4Resource extends CommonsCompressCompressorResource {
+    private static final String NAME = "LZ4";
+
+    private final LZ4StreamFactory factory;
+
+    public LZ4Resource() {
+        super(NAME);
+        setFactory(factory = new LZ4StreamFactory());
+    }
+
+    public LZ4Resource(ResourceCollection other) {
+        super(NAME, other);
+        setFactory(factory = new LZ4StreamFactory());
+    }
+
+    /**
+     * Whether to use the "frame format".
+     *
+     * <p>Defaults to true.</p>
+     */
+    public void setFramed(boolean framed) {
+        factory.setFramed(framed);
+    }
+}
diff --git a/src/main/org/apache/ant/compress/taskdefs/LZ4.java b/src/main/org/apache/ant/compress/taskdefs/LZ4.java
new file mode 100644
index 0000000..763d700
--- /dev/null
+++ b/src/main/org/apache/ant/compress/taskdefs/LZ4.java
@@ -0,0 +1,56 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+
+package org.apache.ant.compress.taskdefs;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+import org.apache.ant.compress.resources.LZ4Resource;
+import org.apache.ant.compress.resources.CommonsCompressCompressorResource;
+import org.apache.ant.compress.util.LZ4StreamFactory;
+import org.apache.tools.ant.types.Resource;
+
+/**
+ * Compresses using LZ4.
+ * @since Apache Compress Antlib 1.5
+ */
+public final class LZ4 extends PackBase {
+
+    private final LZ4StreamFactory factory;
+
+    public LZ4() {
+        super(new PackBase.ResourceWrapper() {
+                @Override
+                public CommonsCompressCompressorResource wrap(Resource dest) {
+                    return new LZ4Resource(dest);
+                }
+            });
+        setFactory(factory = new LZ4StreamFactory());
+    }
+
+    /**
+     * Whether to use the "frame format".
+     *
+     * <p>Defaults to true.</p>
+     */
+    public void setFramed(boolean framed) {
+        factory.setFramed(framed);
+    }
+
+}
diff --git a/src/main/org/apache/ant/compress/taskdefs/UnLZ4.java b/src/main/org/apache/ant/compress/taskdefs/UnLZ4.java
new file mode 100644
index 0000000..079280b
--- /dev/null
+++ b/src/main/org/apache/ant/compress/taskdefs/UnLZ4.java
@@ -0,0 +1,45 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+
+package org.apache.ant.compress.taskdefs;
+
+import org.apache.ant.compress.util.LZ4StreamFactory;
+
+/**
+ * Expands an LZ4 archive.
+ * @since Apache Compress Antlib 1.5
+ */
+public final class UnLZ4 extends UnpackBase {
+
+    private final LZ4StreamFactory factory;
+
+    public UnLZ4() {
+        super(".lz4");
+        setFactory(factory = new LZ4StreamFactory());
+    }
+
+    /**
+     * Whether to use the "frame format".
+     *
+     * <p>Defaults to true.</p>
+     */
+    public void setFramed(boolean framed) {
+        factory.setFramed(framed);
+    }
+
+}
diff --git a/src/main/org/apache/ant/compress/util/LZ4StreamFactory.java b/src/main/org/apache/ant/compress/util/LZ4StreamFactory.java
new file mode 100644
index 0000000..59fb360
--- /dev/null
+++ b/src/main/org/apache/ant/compress/util/LZ4StreamFactory.java
@@ -0,0 +1,95 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+
+package org.apache.ant.compress.util;
+
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+import org.apache.commons.compress.compressors.CompressorInputStream;
+import org.apache.commons.compress.compressors.CompressorOutputStream;
+import org.apache.commons.compress.compressors.lz4.BlockLZ4CompressorInputStream;
+import org.apache.commons.compress.compressors.lz4.BlockLZ4CompressorOutputStream;
+import org.apache.commons.compress.compressors.lz4.FramedLZ4CompressorInputStream;
+import org.apache.commons.compress.compressors.lz4.FramedLZ4CompressorOutputStream;
+
+/**
+ * Creates streams for LZ4 format.
+ * @since Apache Compress Antlib 1.5
+ * @see <a href="http://lz4.github.io/lz4/">LZ4 Project</a>
+ */
+public class LZ4StreamFactory implements CompressorWithConcatenatedStreamsFactory {
+
+    private boolean framed = true;
+
+    /**
+     * Whether to use the "frame format".
+     *
+     * <p>Defaults to true.</p>
+     */
+    public void setFramed(boolean framed) {
+        this.framed = framed;
+    }
+
+    /**
+     * Whether to use the "frame format".
+     */
+    protected boolean isFramed() {
+        return framed;
+    }
+
+    /**
+     * @param stream the stream to read from, should be buffered
+     */
+    @Override
+    public CompressorInputStream getCompressorStream(InputStream stream)
+        throws IOException {
+        return framed ? new FramedLZ4CompressorInputStream(stream)
+            : (CompressorInputStream) new BlockLZ4CompressorInputStream(stream);
+    }
+
+    /**
+     * @param stream the stream to read from, should be buffered
+     * @param       decompressConcatenated
+     *                          if true, decompress until the end of the
+     *                          input; if false, stop after the first
+     *                          stream
+     */
+    @Override
+    public CompressorInputStream getCompressorStream(InputStream stream,
+                                                     boolean decompressConcatenated)
+        throws IOException {
+        if (!framed && decompressConcatenated) {
+            throw new UnsupportedOperationException("only the frame format supports"
+                                                    + " concatenated streams");
+        }
+        return framed ? new FramedLZ4CompressorInputStream(stream, decompressConcatenated)
+            : (CompressorInputStream) new BlockLZ4CompressorInputStream(stream);
+    }
+
+    /**
+     * @param stream the stream to write to, should be buffered
+     */
+    @Override
+    public CompressorOutputStream getCompressorStream(OutputStream stream)
+        throws IOException {
+        return framed ? new FramedLZ4CompressorOutputStream(stream)
+            : (CompressorOutputStream) new BlockLZ4CompressorOutputStream(stream);
+    }
+}
diff --git a/src/tests/antunit/lz4-test.xml b/src/tests/antunit/lz4-test.xml
new file mode 100644
index 0000000..c1cc22d
--- /dev/null
+++ b/src/tests/antunit/lz4-test.xml
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+  -->
+<project default="antunit"
+         xmlns:au="antlib:org.apache.ant.antunit"
+         xmlns:cond="antlib:org.apache.tools.ant.types.conditions"
+         xmlns:cmp="antlib:org.apache.ant.compress">
+
+  <import file="antunit-base.xml" />
+
+  <target name="setUp">
+    <mkdir dir="${output}" />
+    <mkdir dir="${output}/empty" />
+    <touch file="${output}/fileone" />
+    <touch file="${output}/filetwo" />
+  </target>
+
+  <target name="testFailNone" depends="setUp">
+    <au:expectfailure expectedmessage="source is required.">
+      <cmp:lz4 destfile="${output}/file.lz4">
+        <fileset dir="${output}/empty" />
+      </cmp:lz4>
+    </au:expectfailure>
+  </target>
+
+  <target name="testFailTwo" depends="setUp">
+    <au:expectfailure expectedmessage="Can only have one source.">
+      <cmp:lz4 destfile="${output}/file.lz4">
+        <fileset dir="${output}" />
+      </cmp:lz4>
+    </au:expectfailure>
+  </target>
+
+  <target name="testFailNoDest" depends="setUp">
+    <au:expectfailure expectedmessage="dest resource is required.">
+      <cmp:lz4 src="${output}/fileone">
+        <dest>
+          <fileset dir="${output}/empty" />
+        </dest>
+      </cmp:lz4>
+    </au:expectfailure>
+  </target>
+
+  <target name="testFailTwoDests" depends="setUp">
+    <au:expectfailure expectedmessage="Can only have one destination resource.">
+      <cmp:lz4 src="${output}/fileone">
+        <dest>
+          <fileset dir="${output}" />
+        </dest>
+      </cmp:lz4>
+    </au:expectfailure>
+  </target>
+
+  <target name="testRealTest" depends="setUp">
+    <cmp:lz4 src="../resources/asf-logo.gif"
+              destfile="${output}/asf-logo.gif.lz4" />
+    <au:assertLogContains text="Building: asf-logo.gif.lz4"/>
+    <au:assertFileExists file="${output}/asf-logo.gif.lz4"/>
+  </target>
+
+  <target name="testRealTestWithResource" depends="setUp">
+    <cmp:lz4 destfile="${output}/asf-logo.gif.lz4">
+      <file file="../resources/asf-logo.gif"/>
+    </cmp:lz4>
+    <au:assertLogContains text="Building: asf-logo.gif.lz4"/>
+    <au:assertFileExists file="${output}/asf-logo.gif.lz4"/>
+  </target>
+
+  <target name="testDateCheck" depends="setUp">
+    <touch file="${output}/asf-logo.gif.lz4"/>
+    <cmp:lz4 src="../resources/asf-logo.gif"
+              destfile="${output}/asf-logo.gif.lz4" />
+    <au:assertLogContains text="Nothing to do: asf-logo.gif.lz4 is up to date."/>
+  </target>
+
+  <target name="testNestedTask" depends="setUp">
+    <cmp:lz4 destfile="${output}/asf-logo.tar.lz4">
+      <cmp:tar>
+        <cmp:cpiofileset src="../resources/asf-logo.gif.bin.cpio"
+                         includes="asf-logo.gif"/>
+      </cmp:tar>
+    </cmp:lz4>
+    <au:assertFileExists file="${output}/asf-logo.tar.lz4"/>
+    <au:assertTrue>
+      <cond:islastmodified datetime="2009-07-31-20:11:13 +0200"
+                           pattern="yyyy-MM-dd-HH:mm:ss Z">
+        <cmp:tarentry name="asf-logo.gif">
+          <cmp:lz4resource>
+            <file file="${output}/asf-logo.tar.lz4"/>
+          </cmp:lz4resource>
+        </cmp:tarentry>
+      </cond:islastmodified>
+    </au:assertTrue>
+  </target>
+</project>
diff --git a/src/tests/antunit/lz4resource-test.xml b/src/tests/antunit/lz4resource-test.xml
new file mode 100644
index 0000000..d027dab
--- /dev/null
+++ b/src/tests/antunit/lz4resource-test.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+
+<project default="antunit"
+         xmlns:au="antlib:org.apache.ant.antunit"
+         xmlns:cond="antlib:org.apache.tools.ant.types.conditions"
+         xmlns:cmp="antlib:org.apache.ant.compress">
+
+  <import file="antunit-base.xml" />
+
+  <target name="setUp">
+    <mkdir dir="${output}"/>
+  </target>
+
+  <target name="testNativeLZ4" depends="setUp">
+    <copy todir="${output}">
+      <cmp:lz4resource>
+        <file file="../resources/asf-logo.gif.lz4"/>
+      </cmp:lz4resource>
+      <globmapper from="*.lz4" to="*"/>
+    </copy>
+    <au:assertFilesMatch expected="../resources/asf-logo.gif"
+                         actual="${output}/asf-logo.gif"/>
+  </target>
+
+  <target name="testConcatenatedStreamsDefault"
+          depends="setUp">
+    <echo file="${output}/expected">a</echo>
+    <copy todir="${output}">
+      <cmp:lz4resource>
+        <file file="../resources/multiple.lz4"/>
+      </cmp:lz4resource>
+      <mergemapper to="actual"/>
+    </copy>
+    <au:assertFilesMatch expected="${output}/expected"
+                         actual="${output}/actual"/>
+  </target>
+
+  <target name="testConcatenatedStreamsOnlyFirstStream"
+          depends="setUp">
+    <echo file="${output}/expected">a</echo>
+    <copy todir="${output}">
+      <cmp:lz4resource decompressconcatenated="false">
+        <file file="../resources/multiple.lz4"/>
+      </cmp:lz4resource>
+      <mergemapper to="actual"/>
+    </copy>
+    <au:assertFilesMatch expected="${output}/expected"
+                         actual="${output}/actual"/>
+  </target>
+
+  <target name="testConcatenatedStreamsAllStreams"
+          depends="setUp">
+    <echo file="${output}/expected">ab</echo>
+    <copy todir="${output}">
+      <cmp:lz4resource decompressconcatenated="true">
+        <file file="../resources/multiple.lz4"/>
+      </cmp:lz4resource>
+      <mergemapper to="actual"/>
+    </copy>
+    <au:assertFilesMatch expected="${output}/expected"
+                         actual="${output}/actual"/>
+  </target>
+</project>
diff --git a/src/tests/antunit/unlz4-test.xml b/src/tests/antunit/unlz4-test.xml
new file mode 100644
index 0000000..22e8256
--- /dev/null
+++ b/src/tests/antunit/unlz4-test.xml
@@ -0,0 +1,105 @@
+<?xml version="1.0"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+
+<project default="antunit"
+         xmlns:au="antlib:org.apache.ant.antunit"
+         xmlns:cond="antlib:org.apache.tools.ant.types.conditions"
+         xmlns:cmp="antlib:org.apache.ant.compress">
+
+  <import file="antunit-base.xml" />
+
+  <target name="setUp">
+    <mkdir dir="${output}"/>
+  </target>
+
+  <target name="test1">
+    <au:expectfailure>
+      <cmp:unlz4/>
+    </au:expectfailure>
+  </target>
+
+  <target name="test2">
+    <au:expectfailure>
+      <cmp:unlz4 src=""/>
+    </au:expectfailure>
+  </target>
+
+  <target name="testLz4Task" depends="setUp">
+    <cmp:lz4 src="../resources/asf-logo.gif"
+                destfile="${output}/asf-logo.gif.lz4"/>
+    <cmp:unlz4 src="${output}/asf-logo.gif.lz4" dest="${output}/asf-logo.gif" />
+    <au:assertFilesMatch expected="../resources/asf-logo.gif"
+                         actual="${output}/asf-logo.gif"/>
+  </target>
+
+  <target name="testLz4TaskWithoutFrame" depends="setUp">
+    <cmp:lz4 src="../resources/asf-logo.gif"
+                destfile="${output}/asf-logo.gif.lz4"
+                framed="false"/>
+    <cmp:unlz4 src="${output}/asf-logo.gif.lz4"
+                  dest="${output}/asf-logo.gif"
+                  framed="false"/>
+    <au:assertFilesMatch expected="../resources/asf-logo.gif"
+                         actual="${output}/asf-logo.gif"/>
+  </target>
+
+  <target name="testNativeLz4" depends="setUp">
+    <cmp:unlz4 src="../resources/asf-logo.gif.lz4"
+                dest="${output}/asf-logo.gif" />
+    <au:assertFilesMatch expected="../resources/asf-logo.gif"
+                         actual="${output}/asf-logo.gif"/>
+  </target>
+
+  <target name="testWithResource" depends="setUp">
+    <cmp:unlz4 dest="${output}/asf-logo.gif">
+      <file file="../resources/asf-logo.gif.lz4"/>
+    </cmp:unlz4>
+    <au:assertFilesMatch expected="../resources/asf-logo.gif"
+                         actual="${output}/asf-logo.gif"/>
+  </target>
+
+  <target name="testConcatenatedStreamsDefault"
+          depends="setUp">
+    <echo file="${output}/expected">a</echo>
+    <cmp:unlz4 dest="${output}/actual">
+      <file file="../resources/multiple.lz4"/>
+    </cmp:unlz4>
+    <au:assertFilesMatch expected="${output}/expected"
+                         actual="${output}/actual"/>
+  </target>
+
+  <target name="testConcatenatedStreamsOnlyFirstStream"
+          depends="setUp">
+    <echo file="${output}/expected">a</echo>
+    <cmp:unlz4 dest="${output}/actual" decompressconcatenated="false">
+      <file file="../resources/multiple.lz4"/>
+    </cmp:unlz4>
+    <au:assertFilesMatch expected="${output}/expected"
+                         actual="${output}/actual"/>
+  </target>
+
+  <target name="testConcatenatedStreamsAllStreams"
+          depends="setUp">
+    <echo file="${output}/expected">ab</echo>
+    <cmp:unlz4 dest="${output}/actual" decompressconcatenated="true">
+      <file file="../resources/multiple.lz4"/>
+    </cmp:unlz4>
+    <au:assertFilesMatch expected="${output}/expected"
+                         actual="${output}/actual"/>
+  </target>
+</project>
diff --git a/src/tests/resources/asf-logo.gif.lz4 b/src/tests/resources/asf-logo.gif.lz4
new file mode 100644
index 0000000..cc875dd
--- /dev/null
+++ b/src/tests/resources/asf-logo.gif.lz4
Binary files differ
diff --git a/src/tests/resources/multiple.lz4 b/src/tests/resources/multiple.lz4
new file mode 100644
index 0000000..0814e93
--- /dev/null
+++ b/src/tests/resources/multiple.lz4
Binary files differ