diff --git a/icu/src/main/java/com/ibm/icu4jni/text/NativeNormalizer.java b/icu/src/main/java/com/ibm/icu4jni/text/NativeNormalizer.java
new file mode 100644
index 0000000..f14b6c1
--- /dev/null
+++ b/icu/src/main/java/com/ibm/icu4jni/text/NativeNormalizer.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package com.ibm.icu4jni.text;
+
+import java.text.Normalizer.Form;
+
+public final class NativeNormalizer {
+    public static boolean isNormalized(CharSequence src, Form form) {
+        return isNormalizedImpl(src.toString(), toUNormalizationMode(form));
+    }
+
+    public static String normalize(CharSequence src, Form form) {
+        return normalizeImpl(src.toString(), toUNormalizationMode(form));
+    }
+
+    private static int toUNormalizationMode(Form form) {
+        // Translates Java enum constants to ICU int constants.
+        // See UNormalizationMode in "unicode/unorm.h". Stable API since ICU 2.0.
+        switch (form) {
+        case NFC: return 4;
+        case NFD: return 2;
+        case NFKC: return 5;
+        case NFKD: return 3;
+        }
+        throw new AssertionError("unknown Normalizer.Form " + form);
+    }
+
+    private static native String normalizeImpl(String src, int form);
+
+    private static native boolean isNormalizedImpl(String src, int form);
+
+    private NativeNormalizer() {}
+}
diff --git a/icu/src/main/native/NativeNormalizer.cpp b/icu/src/main/native/NativeNormalizer.cpp
new file mode 100644
index 0000000..b09b26e
--- /dev/null
+++ b/icu/src/main/native/NativeNormalizer.cpp
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2006 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.
+ */
+
+#include "ErrorCode.h"
+#include "JNIHelp.h"
+#include "ScopedJavaUnicodeString.h"
+#include "unicode/normlzr.h"
+
+static jstring normalizeImpl(JNIEnv* env, jclass, jstring s, jint intMode) {
+    ScopedJavaUnicodeString src(env, s);
+    UNormalizationMode mode = static_cast<UNormalizationMode>(intMode);
+    UErrorCode errorCode = U_ZERO_ERROR;
+    UnicodeString dst;
+    Normalizer::normalize(src.unicodeString(), mode, 0, dst, errorCode);
+    icu4jni_error(env, errorCode);
+    return dst.isBogus() ? NULL : env->NewString(dst.getBuffer(), dst.length());
+}
+
+static jboolean isNormalizedImpl(JNIEnv* env, jclass, jstring s, jint intMode) {
+    ScopedJavaUnicodeString src(env, s);
+    UNormalizationMode mode = static_cast<UNormalizationMode>(intMode);
+    UErrorCode errorCode = U_ZERO_ERROR;
+    UBool result = Normalizer::isNormalized(src.unicodeString(), mode, errorCode);
+    icu4jni_error(env, errorCode);
+    return result;
+}
+
+static JNINativeMethod gMethods[] = {
+    /* name, signature, funcPtr */
+    {"normalizeImpl", "(Ljava/lang/String;I)Ljava/lang/String;", (void*) normalizeImpl},
+    {"isNormalizedImpl", "(Ljava/lang/String;I)Z", (void*) isNormalizedImpl},
+};
+extern "C" int register_com_ibm_icu4jni_text_NativeNormalizer(JNIEnv* env) {
+    return jniRegisterNativeMethods(env,
+            "com/ibm/icu4jni/text/NativeNormalizer", gMethods, NELEM(gMethods));
+}
diff --git a/icu/src/main/native/ScopedJavaUnicodeString.h b/icu/src/main/native/ScopedJavaUnicodeString.h
index 3486aac..44952b4 100644
--- a/icu/src/main/native/ScopedJavaUnicodeString.h
+++ b/icu/src/main/native/ScopedJavaUnicodeString.h
@@ -18,6 +18,7 @@
 #define SCOPED_JAVA_UNICODE_STRING_H_included
 
 #include "JNIHelp.h"
+#include "unicode/unistr.h"
 
 // A smart pointer that provides access to an ICU UnicodeString given a JNI
 // jstring. We give ICU a direct pointer to the characters on the Java heap.
diff --git a/icu/src/main/native/sub.mk b/icu/src/main/native/sub.mk
index fd5f20c..41260cf 100644
--- a/icu/src/main/native/sub.mk
+++ b/icu/src/main/native/sub.mk
@@ -9,6 +9,7 @@
 	NativeCollation.cpp \
 	NativeConverter.cpp \
 	NativeDecimalFormat.cpp \
+	NativeNormalizer.cpp \
 	NativeRegEx.cpp \
 	RuleBasedNumberFormat.cpp \
 	Resources.cpp \
diff --git a/text/src/main/java/java/text/Normalizer.java b/text/src/main/java/java/text/Normalizer.java
new file mode 100644
index 0000000..c395715
--- /dev/null
+++ b/text/src/main/java/java/text/Normalizer.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package java.text;
+
+import com.ibm.icu4jni.text.NativeNormalizer;
+
+/**
+ * Provides normalization functions according to
+ * <a href="http://www.unicode.org/unicode/reports/tr15/tr15-23.html">Unicode Standard Annex #15:
+ * Unicode Normalization Forms</a>. Normalization can decompose and compose
+ * characters for equivalency checking.
+ * 
+ * @hide
+ * @since 1.6
+ */
+public final class Normalizer {
+    /**
+     * The normalization forms supported by the Normalizer. These are specified in
+     * <a href="http://www.unicode.org/unicode/reports/tr15/tr15-23.html">Unicode Standard
+     * Annex #15</a>.
+     */
+    public static enum Form {
+        /**
+         * Normalization Form D - Canonical Decomposition.
+         */
+        NFD,
+
+        /**
+         * Normalization Form C - Canonical Decomposition, followed by Canonical Composition.
+         */
+        NFC,
+
+        /**
+         * Normalization Form KD - Compatibility Decomposition.
+         */
+        NFKD,
+
+        /**
+         * Normalization Form KC - Compatibility Decomposition, followed by Canonical Composition.
+         */
+        NFKC;
+    }
+
+    /**
+     * Check whether the given character sequence <code>src</code> is normalized
+     * according to the normalization method <code>form</code>.
+     * 
+     * @param src character sequence to check
+     * @param form normalization form to check against
+     * @return true if normalized according to <code>form</code>
+     */
+    public static boolean isNormalized(CharSequence src, Form form) {
+        return NativeNormalizer.isNormalized(src, form);
+    }
+
+    /**
+     * Normalize the character sequence <code>src</code> according to the
+     * normalization method <code>form</code>.
+     * 
+     * @param src character sequence to read for normalization
+     * @param form normalization form
+     * @return string normalized according to <code>form</code>
+     */
+    public static String normalize(CharSequence src, Form form) {
+        return NativeNormalizer.normalize(src, form);
+    }
+}
diff --git a/text/src/test/java/org/apache/harmony/text/tests/java/text/AllTests.java b/text/src/test/java/org/apache/harmony/text/tests/java/text/AllTests.java
index c2cfbb2..c968b38 100644
--- a/text/src/test/java/org/apache/harmony/text/tests/java/text/AllTests.java
+++ b/text/src/test/java/org/apache/harmony/text/tests/java/text/AllTests.java
@@ -51,6 +51,7 @@
         suite.addTestSuite(FormatTest.class);
         suite.addTestSuite(MessageFormatFieldTest.class);
         suite.addTestSuite(MessageFormatTest.class);
+        suite.addTestSuite(NormalizerTest.class);
         suite.addTestSuite(NumberFormatFieldTest.class);
         suite.addTestSuite(NumberFormatTest.class);
         suite.addTestSuite(ParseExceptionTest.class);
diff --git a/text/src/test/java/org/apache/harmony/text/tests/java/text/NormalizerTest.java b/text/src/test/java/org/apache/harmony/text/tests/java/text/NormalizerTest.java
new file mode 100644
index 0000000..f877ae2
--- /dev/null
+++ b/text/src/test/java/org/apache/harmony/text/tests/java/text/NormalizerTest.java
@@ -0,0 +1,183 @@
+/* 
+ * 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.harmony.text.tests.java.text;
+
+import java.text.Normalizer;
+import java.text.Normalizer.Form;
+
+import junit.framework.TestCase;
+
+public class NormalizerTest extends TestCase {
+    /**
+     * @tests java.text.Normalizer.Form#values()
+     */
+    public void test_form_values() throws Exception {
+        Form[] forms = Form.values();
+        assertEquals(4, forms.length);
+        assertEquals(Form.NFD, forms[0]);
+        assertEquals(Form.NFC, forms[1]);
+        assertEquals(Form.NFKD, forms[2]);
+        assertEquals(Form.NFKC, forms[3]);
+    }
+
+    /**
+     * @tests java.text.Normalizer.Form#valueOf(String)
+     */
+    public void test_form_valueOfLjava_lang_String() {
+        try {
+            Form.valueOf(null);
+            fail("Should throw NullPointerException");
+        } catch (NullPointerException e) {
+            // expected
+        }
+
+        assertEquals(Form.NFC, Form.valueOf("NFC"));
+        assertEquals(Form.NFD, Form.valueOf("NFD"));
+        assertEquals(Form.NFKC, Form.valueOf("NFKC"));
+        assertEquals(Form.NFKD, Form.valueOf("NFKD"));
+
+        try {
+            Form.valueOf("not exist");
+            fail("Should throw IllegalArgumentException");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+        try {
+            Form.valueOf("nfc");
+            fail("Should throw IllegalArgumentException");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+        try {
+            Form.valueOf("NFC ");
+            fail("Should throw IllegalArgumentException");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+    }
+
+    /**
+     * @tests java.text.Normalizer#isNormalized(CharSequence, Form)
+     */
+    public void test_isNormalized() throws Exception {
+        String src = "\u00c1";
+        assertTrue(Normalizer.isNormalized(src, Form.NFC));
+        assertFalse(Normalizer.isNormalized(src, Form.NFD));
+        assertTrue(Normalizer.isNormalized(src, Form.NFKC));
+        assertFalse(Normalizer.isNormalized(src, Form.NFKD));
+
+        src = "\u0041\u0301";
+        assertFalse(Normalizer.isNormalized(src, Form.NFC));
+        assertTrue(Normalizer.isNormalized(src, Form.NFD));
+        assertFalse(Normalizer.isNormalized(src, Form.NFKC));
+        assertTrue(Normalizer.isNormalized(src, Form.NFKD));
+
+        src = "\ufb03";
+        assertTrue(Normalizer.isNormalized(src, Form.NFC));
+        assertTrue(Normalizer.isNormalized(src, Form.NFD));
+        assertFalse(Normalizer.isNormalized(src, Form.NFKC));
+        assertFalse(Normalizer.isNormalized(src, Form.NFKD));
+
+        src = "\u0066\u0066\u0069";
+        assertTrue(Normalizer.isNormalized(src, Form.NFC));
+        assertTrue(Normalizer.isNormalized(src, Form.NFD));
+        assertTrue(Normalizer.isNormalized(src, Form.NFKC));
+        assertTrue(Normalizer.isNormalized(src, Form.NFKD));
+
+        src = "";
+        assertTrue(Normalizer.isNormalized(src, Form.NFC));
+        assertTrue(Normalizer.isNormalized(src, Form.NFD));
+        assertTrue(Normalizer.isNormalized(src, Form.NFKC));
+        assertTrue(Normalizer.isNormalized(src, Form.NFKD));
+    }
+
+    /**
+     * @tests java.text.Normalizer#isNormalized(CharSequence, Form)
+     */
+    public void test_isNormalized_exception() throws Exception {
+        try {
+            Normalizer.isNormalized(null, Form.NFC);
+            fail("Should throw NullPointerException");
+        } catch (NullPointerException e) {
+            // expected
+        }
+
+        try {
+            Normalizer.isNormalized("chars", null);
+            fail("Should throw NullPointerException");
+        } catch (NullPointerException e) {
+            // expected
+        }
+    }
+
+    /**
+     * @tests java.text.Normalizer#normalize(CharSequence, Form)
+     */
+    public void test_normalize() throws Exception {
+        String src = "\u00c1";
+        assertEquals("\u00c1", Normalizer.normalize(src, Form.NFC));
+        assertEquals("\u0041\u0301", Normalizer.normalize(src, Form.NFD));
+        assertEquals("\u00c1", Normalizer.normalize(src, Form.NFKC));
+        assertEquals("\u0041\u0301", Normalizer.normalize(src, Form.NFKD));
+
+        src = "\u0041\u0301";
+        assertEquals("\u00c1", Normalizer.normalize(src, Form.NFC));
+        assertEquals("\u0041\u0301", Normalizer.normalize(src, Form.NFD));
+        assertEquals("\u00c1", Normalizer.normalize(src, Form.NFKC));
+        assertEquals("\u0041\u0301", Normalizer.normalize(src, Form.NFKD));
+
+        src = "\ufb03";
+        assertEquals("\ufb03", Normalizer.normalize(src, Form.NFC));
+        assertEquals("\ufb03", Normalizer.normalize(src, Form.NFD));
+        assertEquals("\u0066\u0066\u0069", Normalizer.normalize(src, Form.NFKC));
+        assertEquals("\u0066\u0066\u0069", Normalizer.normalize(src, Form.NFKD));
+
+        src = "\u0066\u0066\u0069";
+        assertEquals("\u0066\u0066\u0069", Normalizer.normalize(src, Form.NFC));
+        assertEquals("\u0066\u0066\u0069", Normalizer.normalize(src, Form.NFD));
+        assertEquals("\u0066\u0066\u0069", Normalizer.normalize(src, Form.NFKC));
+        assertEquals("\u0066\u0066\u0069", Normalizer.normalize(src, Form.NFKD));
+
+        src = "";
+        assertEquals("", Normalizer.normalize(src, Form.NFC));
+        assertEquals("", Normalizer.normalize(src, Form.NFD));
+        assertEquals("", Normalizer.normalize(src, Form.NFKC));
+        assertEquals("", Normalizer.normalize(src, Form.NFKD));
+    }
+
+    /**
+     * @tests java.text.Normalizer#normalize(CharSequence, Form)
+     */
+    public void test_normalize_exception() throws Exception {
+        try {
+            Normalizer.normalize(null, Form.NFC);
+            fail("Should throw NullPointerException");
+        } catch (NullPointerException e) {
+            // expected
+        }
+
+        try {
+            Normalizer.normalize("chars", null);
+            fail("Should throw NullPointerException");
+        } catch (NullPointerException e) {
+            // expected
+        }
+    }
+}
