diff --git a/src/main/java/org/xerial/snappy/Snappy.java b/src/main/java/org/xerial/snappy/Snappy.java
index f39262b..6bdb6b7 100755
--- a/src/main/java/org/xerial/snappy/Snappy.java
+++ b/src/main/java/org/xerial/snappy/Snappy.java
@@ -44,6 +44,41 @@ public class Snappy
         return SnappyNative.nativeLibraryVersion();
     }
 
+    /**
+     * High-level API for compressing the input byte array. This method performs
+     * array copy to generate the result. If you want to save this cost, use
+     * {@link #compress(byte[], int, int, byte[], int)} or
+     * {@link #compress(ByteBuffer, ByteBuffer)}.
+     * 
+     * @param input
+     *            the input data
+     * @return the compressed byte array
+     * @throws SnappyException
+     */
+    public static byte[] compress(byte[] input) throws SnappyException {
+        byte[] buf = new byte[Snappy.maxCompressedLength(input.length)];
+        int compressedByteSize = Snappy.compress(input, 0, input.length, buf, 0);
+        byte[] result = new byte[compressedByteSize];
+        System.arraycopy(buf, 0, result, 0, compressedByteSize);
+        return result;
+    }
+
+    /**
+     * High-level API for uncompressing the input byte array.
+     * 
+     * @param input
+     * @return
+     * @throws SnappyException
+     */
+    public static byte[] uncompress(byte[] input) throws SnappyException {
+        int uncompressedLength = Snappy.uncompressedLength(input, 0, input.length);
+        byte[] result = new byte[uncompressedLength];
+        int byteSize = Snappy.uncompress(input, 0, input.length, result, 0);
+        if (byteSize != uncompressedLength)
+            throw new SnappyException(SnappyErrorCode.INVALID_DECOMPRESSION);
+        return result;
+    }
+
     /**
      * Compress the content in the given input buffer. After the compression,
      * you can retrieve the compressed data from the output buffer [pos() ...
@@ -167,13 +202,15 @@ public class Snappy
     }
 
     /**
-     * Get the uncompressed byte size of the given compressed input.
+     * Get the uncompressed byte size of the given compressed input. This
+     * operation taks O(1) time.
      * 
      * @param compressed
      *            input data [pos() ... limit())
      * @return uncompressed byte length of the given input
      * @throws SnappyException
-     *             when failed to uncompress the given input
+     *             when failed to uncompress the given input. The error code is
+     *             {@link SnappyErrorCode#PARSING_ERROR}
      * @throws SnappyError
      *             when the input is not a direct buffer
      */
@@ -185,13 +222,16 @@ public class Snappy
     }
 
     /**
-     * Get the uncompressed byte size of the given compressed input
+     * Get the uncompressed byte size of the given compressed input. This
+     * operation takes O(1) time.
      * 
      * @param input
      * @param offset
      * @param length
      * @return umcompressed byte size of the the given input data
      * @throws SnappyException
+     *             when failed to uncompress the given input. The error code is
+     *             {@link SnappyErrorCode#PARSING_ERROR}
      */
     public static int uncompressedLength(byte[] input, int offset, int length) throws SnappyException {
         if (input == null)
diff --git a/src/main/java/org/xerial/snappy/SnappyErrorCode.java b/src/main/java/org/xerial/snappy/SnappyErrorCode.java
index a8d401f..6bc6277 100755
--- a/src/main/java/org/xerial/snappy/SnappyErrorCode.java
+++ b/src/main/java/org/xerial/snappy/SnappyErrorCode.java
@@ -32,7 +32,12 @@ package org.xerial.snappy;
  */
 public enum SnappyErrorCode {
 
-    UNKNOWN(0), FAILED_TO_LOAD_NATIVE_LIBRARY(1), PARSING_ERROR(2), NOT_A_DIRECT_BUFFER(3), OUT_OF_MEMORY(4);
+    UNKNOWN(0),
+    FAILED_TO_LOAD_NATIVE_LIBRARY(1),
+    PARSING_ERROR(2),
+    NOT_A_DIRECT_BUFFER(3),
+    OUT_OF_MEMORY(4),
+    INVALID_DECOMPRESSION(5);
 
     public final int id;
 
diff --git a/src/test/java/org/xerial/snappy/SnappyTest.java b/src/test/java/org/xerial/snappy/SnappyTest.java
index 4c0cae2..434e72c 100755
--- a/src/test/java/org/xerial/snappy/SnappyTest.java
+++ b/src/test/java/org/xerial/snappy/SnappyTest.java
@@ -191,4 +191,16 @@ public class SnappyTest
 
     }
 
+    @Test
+    public void highLevelAPI() throws Exception {
+
+        String m = "Hello! 01234 ACGDSFSDFJ World. FDSDF02394234 fdsfda03924";
+        byte[] input = m.getBytes();
+        byte[] output = Snappy.compress(input);
+
+        byte[] uncompressed = Snappy.uncompress(output);
+        String m2 = new String(uncompressed);
+        assertEquals(m, m2);
+    }
+
 }