diff --git a/Android.mk b/Android.mk
new file mode 100644
index 0000000..2cce0dc
--- /dev/null
+++ b/Android.mk
@@ -0,0 +1,36 @@
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+libLZF_SRC_FILES := \
+    lzf_c.c \
+    lzf_d.c
+
+# Static library for host
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := liblzf
+LOCAL_SRC_FILES := $(libLZF_SRC_FILES)
+
+include $(BUILD_HOST_STATIC_LIBRARY)
+
+
+# Static library for target
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := liblzf
+LOCAL_SRC_FILES := $(libLZF_SRC_FILES)
+
+include $(BUILD_STATIC_LIBRARY)
+
+# JAR for host
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_MODULE := liblzf
+LOCAL_MODULE_TAGS := optional
+
+include $(BUILD_HOST_JAVA_LIBRARY)
diff --git a/CleanSpec.mk b/CleanSpec.mk
new file mode 100644
index 0000000..5f27c8c
--- /dev/null
+++ b/CleanSpec.mk
@@ -0,0 +1,51 @@
+# Copyright (C) 2011 The Android Open Source Project
+#
+# Licensed 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.
+#
+
+# If you don't need to do a full clean build but would like to touch
+# a file or delete some intermediate files, add a clean step to the end
+# of the list.  These steps will only be run once, if they haven't been
+# run before.
+#
+# E.g.:
+#     $(call add-clean-step, touch -c external/sqlite/sqlite3.h)
+#     $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/STATIC_LIBRARIES/libz_intermediates)
+#
+# Always use "touch -c" and "rm -f" or "rm -rf" to gracefully deal with
+# files that are missing or have been moved.
+#
+# Use $(PRODUCT_OUT) to get to the "out/target/product/blah/" directory.
+# Use $(OUT_DIR) to refer to the "out" directory.
+#
+# If you need to re-do something that's already mentioned, just copy
+# the command and add it to the bottom of the list.  E.g., if a change
+# that you made last week required touching a file and a change you
+# made today requires touching the same file, just copy the old
+# touch step and add it to the end of the list.
+#
+# ************************************************
+# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
+# ************************************************
+
+# For example:
+#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/AndroidTests_intermediates)
+#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/core_intermediates)
+#$(call add-clean-step, find $(OUT_DIR) -type f -name "IGTalkSession*" -print0 | xargs -0 rm -f)
+#$(call add-clean-step, rm -rf $(PRODUCT_OUT)/data/*)
+
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/STATIC_LIBRARIES/libLZF_intermediates)
+
+# ************************************************
+# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
+# ************************************************
diff --git a/src/org/liblzf/CLZF.java b/src/org/liblzf/CLZF.java
index 710419a..c555be2 100644
--- a/src/org/liblzf/CLZF.java
+++ b/src/org/liblzf/CLZF.java
@@ -36,10 +36,9 @@
  * of this file under either the BSD or the GPL.
  */
 
-using System;
+// ported from C# to Java
 
-namespace LZF.NET
-{
+package org.liblzf;
 	
 	/// <summary>
 	/// Summary description for CLZF.
@@ -47,7 +46,8 @@
 	public class CLZF
 	{
 		// CRC32 data & function
-		UInt32 []crc_32_tab = new UInt32[256]
+		/*
+		static int []crc_32_tab = new int[]
 		{
 			0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
 			0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
@@ -103,18 +103,18 @@
 			0x2d02ef8d
 		};
 
-		public UInt32 crc32(UInt32 OldCRC,byte NewData) 
+		public int crc32(int OldCRC,byte NewData) 
 		{
 			return crc_32_tab[(OldCRC & 0xff) ^ NewData] ^ (OldCRC >> 8);
 		}
-
+		*/
 
 		/// <summary>
 		/// LZF Compressor
 		/// </summary>
 
-		UInt32 HLOG=14;
-		UInt32 HSIZE=(1<<14);
+		static int HLOG=14;
+		static int HSIZE=(1<<14);
 
 		/*
 		* don't play with this unless you benchmark!
@@ -122,21 +122,21 @@
 		* the hashing function might seem strange, just believe me
 		* it works ;)
 		*/
-		UInt32 MAX_LIT=(1 <<  5);
-		UInt32 MAX_OFF=(1 << 13);
-		UInt32 MAX_REF=((1 <<  8) + (1 << 3));
+		static int MAX_LIT=(1 <<  5);
+		static int MAX_OFF=(1 << 13);
+		static int MAX_REF=((1 <<  8) + (1 << 3));
 
-		UInt32 FRST(byte[] Array,UInt32 ptr) 
+		static int FRST(byte[] Array,int ptr) 
 		{
-			return (UInt32)(((Array[ptr]) << 8) | Array[ptr+1]);
+			return (int)((((Array[ptr]) << 8) & 0xff00) | (Array[ptr+1] & 0xff));
 		}
 
-		UInt32 NEXT(UInt32 v,byte[] Array,UInt32 ptr)
+		static int NEXT(int v,byte[] Array,int ptr)
 		{
-			return ((v) << 8) | Array[ptr+2];
+			return ((v) << 8) | (Array[ptr+2] & 0xff);
 		}
 
-		UInt32 IDX(UInt32 h) 
+		static int IDX(int h) 
 		{
                 	return ((((h ^ (h << 5)) >> (int) (3*8 - HLOG)) - h*5) & (HSIZE - 1));
 		}
@@ -150,24 +150,24 @@
 		*
 		*/
 
-		public int lzf_compress (byte[] in_data, int in_len,byte[] out_data, int out_len)
+		public static int lzf_compress (byte[] in_data, int in_len,byte[] out_data, int out_len)
 		{
 			int c;
-			long []htab=new long[1<<14];
+			int []htab=new int[1<<14];
 			for (c=0;c<1<<14;c++)
 			{
 				htab[c]=0;
 			}
 
-			long hslot;
-			UInt32 iidx = 0;
-			UInt32 oidx = 0;
+			int hslot;
+			int iidx = 0;
+			int oidx = 0;
 			//byte *in_end  = ip + in_len;
 			//byte *out_end = op + out_len;
-			long reference;
+			int reference;
 
-			UInt32 hval = FRST (in_data,iidx);
-			long off;
+			int hval = FRST (in_data,iidx);
+			int off;
 			int lit = 0;
 
 			for (;;)
@@ -177,7 +177,7 @@
 					hval = NEXT (hval, in_data,iidx);
 					hslot = IDX (hval);
 					reference = htab[hslot]; 
-					htab[hslot] = (long)iidx;
+					htab[hslot] = (int)iidx;
 
 					if ((off = iidx - reference - 1) < MAX_OFF 
 						&& iidx + 4 < in_len 
@@ -188,8 +188,8 @@
 						)
 						{
 						/* match found at *reference++ */
-						UInt32 len = 2;
-						UInt32 maxlen = (UInt32)in_len - iidx - len;
+						int len = 2;
+						int maxlen = in_len - iidx - len;
 						maxlen = maxlen > MAX_REF ? MAX_REF : maxlen;
 
 						if (oidx + lit + 1 + 3 >= out_len)
@@ -274,14 +274,14 @@
 		/// <summary>
 		/// LZF Decompressor
 		/// </summary>
-		public int lzf_decompress ( byte[] in_data, int in_len, byte[] out_data, int out_len)
+		public static int lzf_decompress ( byte[] in_data, int in_len, byte[] out_data, int out_len)
 		{
-			UInt32 iidx=0;
-			UInt32 oidx=0;
+			int iidx=0;
+			int oidx=0;
 
 			do
 				{
-				UInt32 ctrl = in_data[iidx++];
+				int ctrl = in_data[iidx++] & 0xff;
 
 				if (ctrl < (1 << 5)) /* literal run */
 					{
@@ -299,14 +299,14 @@
 					}
 				else /* back reference */
 					{
-					UInt32 len = ctrl >> 5;
+					int len = ctrl >> 5;
 
 					int reference = (int)(oidx - ((ctrl & 0x1f) << 8) - 1);
 
 					if (len == 7)
-						len += in_data[iidx++];
+						len += in_data[iidx++] & 0xff;
 			          
-					reference -= in_data[iidx++];
+					reference -= in_data[iidx++] & 0xff;
 
 					if (oidx + len + 2 > out_len)
 						{
@@ -340,5 +340,5 @@
 			//
 		}
 	}
-}
+
 
