diff --git a/patches/0001-Ehhance-hyphenation-dictionary-reading-from-characte.patch b/patches/0001-Ehhance-hyphenation-dictionary-reading-from-characte.patch
new file mode 100644
index 0000000..6438cfd
--- /dev/null
+++ b/patches/0001-Ehhance-hyphenation-dictionary-reading-from-characte.patch
@@ -0,0 +1,164 @@
+From 4760752af1c9b7507b51917ff4e4d8eb0491e353 Mon Sep 17 00:00:00 2001
+Date: Tue, 1 Jun 2010 17:27:23 -0700
+Subject: [PATCH] Ehhance hyphenation dictionary reading from character buffer.
+
+Previous file reading is kept and enhanced with mmap.
+
+This is the prepration for reading the dictionary from asset.
+
+issue: 2672163
+Change-Id: I0527b7b1260dc103a3be63856b9f4e4c10ed2857
+---
+ hyphen.c |   70 +++++++++++++++++++++++++++++++++++++++++++++++++++----------
+ hyphen.h |    2 +
+ 2 files changed, 60 insertions(+), 12 deletions(-)
+
+diff --git a/hyphen.c b/hyphen.c
+index 974d87f..446d5bd 100644
+--- a/hyphen.c
++++ b/hyphen.c
+@@ -36,13 +36,13 @@
+  * MPL.
+  *
+  */
++#include <fcntl.h>
++#include <sys/mman.h>
++#include <sys/stat.h>
+ #include <stdlib.h> /* for NULL, malloc */
+ #include <stdio.h>  /* for fprintf */
+ #include <string.h> /* for strdup */
+-
+-#ifdef UNX
+-#include <unistd.h> /* for exit */
+-#endif
++#include <unistd.h> /* for close */
+ 
+ #define noVERBOSE
+ 
+@@ -230,12 +230,57 @@ get_state_str (int state)
+ }
+ #endif
+ 
++// Get a line from the dictionary contents.
++static char *
++get_line (char *s, int size, const char *dict_contents, int dict_length,
++    int *dict_ptr)
++{
++    int len = 0;
++    while (len < (size - 1) && *dict_ptr < dict_length) {
++        s[len++] = *(dict_contents + *dict_ptr);
++        (*dict_ptr)++;
++        if (s[len - 1] == '\n')
++            break;
++    }
++    s[len] = '\0';
++    if (len > 0) {
++        return s;
++    } else {
++        return NULL;
++    }
++}
++
+ HyphenDict *
+ hnj_hyphen_load (const char *fn)
+ {
++    if (fn == NULL)
++        return NULL;
++    const int fd = open(fn, O_RDONLY);
++    if (fd == -1)
++        return NULL;
++    struct stat sb;
++    if (fstat(fd, &sb) == -1)  {  /* To obtain file size */
++        close(fd);
++        return NULL;
++    }
++
++    const char *addr = mmap(NULL, sb.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
++    if (addr == MAP_FAILED) {
++        close(fd);
++        return NULL;
++    }
++    HyphenDict *dict = hnj_hyphen_load_from_buffer(addr, sb.st_size);
++    munmap((void *)addr, sb.st_size);
++    close(fd);
++
++    return dict;
++}
++
++HyphenDict *
++hnj_hyphen_load_from_buffer (const char *dict_contents, int dict_length)
++{
+     HyphenDict *dict[2];
+     HashTab *hashtab;
+-    FILE *f;
+     char buf[MAX_CHARS];
+     char word[MAX_CHARS];
+     char pattern[MAX_CHARS];
+@@ -249,10 +294,10 @@ hnj_hyphen_load (const char *fn)
+     HashEntry *e;
+     int nextlevel = 0;
+ 
+-    f = fopen (fn, "r");
+-    if (f == NULL)
++    if (dict_contents == NULL)
+         return NULL;
+ 
++    int dict_ptr = 0;
+ // loading one or two dictionaries (separated by NEXTLEVEL keyword)
+     for (k = 0; k == 0 || (k == 1 && nextlevel); k++) { 
+         hashtab = hnj_hash_new ();
+@@ -277,7 +322,8 @@ hnj_hyphen_load (const char *fn)
+         /* read in character set info */
+         if (k == 0) {
+             for (i=0;i<MAX_NAME;i++) dict[k]->cset[i]= 0;
+-            fgets(dict[k]->cset,  sizeof(dict[k]->cset),f);
++            get_line(dict[k]->cset, sizeof(dict[k]->cset), dict_contents,
++                dict_length, &dict_ptr);
+             for (i=0;i<MAX_NAME;i++)
+                 if ((dict[k]->cset[i] == '\r') || (dict[k]->cset[i] == '\n'))
+                     dict[k]->cset[i] = 0;
+@@ -287,7 +333,8 @@ hnj_hyphen_load (const char *fn)
+             dict[k]->utf8 = dict[0]->utf8;
+         }
+ 
+-        while (fgets (buf, sizeof(buf), f) != NULL)
++        while (get_line(buf, sizeof(buf), dict_contents, dict_length,
++                &dict_ptr) != NULL)
+         {
+             if (buf[0] != '%')
+             {
+@@ -446,7 +493,6 @@ hnj_hyphen_load (const char *fn)
+ #endif
+         state_num = 0;
+     }
+-    fclose(f);
+     if (k == 2) dict[0]->nextlevel = dict[1];
+     return dict[0];
+ }
+@@ -870,8 +916,8 @@ int hnj_hyphen_hyph_(HyphenDict *dict, const char *word, int word_size,
+             hyphens2 = hnj_malloc (word_size);
+         }
+         for (i = 0; i < word_size; i++) rep2[i] = NULL;
+-        for (i = 0; i < word_size; i++) if 
+-                                            (hyphens[i]&1 || (begin > 0 && i + 1 == word_size)) {
++        for (i = 0; i < word_size; i++)
++            if (hyphens[i]&1 || (begin > 0 && i + 1 == word_size)) {
+                 if (i - begin > 1) {
+                     int hyph = 0;
+                     prep_word[i + 2] = '\0';
+diff --git a/hyphen.h b/hyphen.h
+index 5d79308..29a0701 100644
+--- a/hyphen.h
++++ b/hyphen.h
+@@ -91,6 +91,8 @@ struct _HyphenTrans {
+ };
+ 
+ HyphenDict *hnj_hyphen_load (const char *fn);
++HyphenDict *hnj_hyphen_load_from_buffer (const char *dict_contents,
++    int dict_length);
+ void hnj_hyphen_free (HyphenDict *dict);
+ 
+ /* obsolete, use hnj_hyphen_hyphenate2() or *hyphenate3() functions) */
+-- 
+1.7.0.1
+
