Merge "Rename CharGroup to PtNode."
diff --git a/java/res/values-v18/emoji-categories.xml b/java/res/values-v18/emoji-categories.xml
new file mode 100644
index 0000000..17a2053
--- /dev/null
+++ b/java/res/values-v18/emoji-categories.xml
@@ -0,0 +1,922 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 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.
+-->
+
+<!-- Note: This emoji code point list is valid on JB-MR2 (API == 18).
+     There is another emoji code point list for KLP and later under res/xml/values-v19. -->
+<resources>
+    <!-- Dummy codeArrays for recents emoji keyboard.
+         Do not remove these keys, because they are used as a template. -->
+    <array
+        name="emoji_recents"
+        format="string"
+    >
+        <item>52</item>
+        <item>45</item>
+        <item>43</item>
+        <item>45</item>
+        <item>4E</item>
+        <item>54</item>
+    </array>
+    <array
+        name="emoji_nature"
+        format="string"
+    >
+        <!-- <item>1f415</item> -->
+        <item>1f436</item>
+        <item>1f429</item>
+        <!-- <item>1f408</item> -->
+        <item>1f431</item>
+        <!-- <item>1f400</item> -->
+        <!-- <item>1f401</item> -->
+        <item>1f42d</item>
+        <item>1f439</item>
+        <item>1f422</item>
+        <!-- <item>1f407</item> -->
+        <item>1f430</item>
+        <!-- <item>1f413</item> -->
+        <item>1f414</item>
+        <item>1f423</item>
+        <item>1f424</item>
+        <item>1f425</item>
+        <item>1f426</item>
+        <!-- <item>1f40f</item> -->
+        <item>1f411</item>
+        <!-- <item>1f410</item> -->
+        <item>1f43a</item>
+        <!-- <item>1f403</item> -->
+        <!-- <item>1f402</item> -->
+        <!-- <item>1f404</item> -->
+        <item>1f42e</item>
+        <item>1f434</item>
+        <item>1f417</item>
+        <!-- <item>1f416</item> -->
+        <item>1f437</item>
+        <item>1f43d</item>
+        <item>1f438</item>
+        <item>1f40d</item>
+        <item>1f43c</item>
+        <item>1f427</item>
+        <item>1f418</item>
+        <item>1f428</item>
+        <item>1f412</item>
+        <item>1f435</item>
+        <!-- <item>1f406</item> -->
+        <item>1f42f</item>
+        <item>1f43b</item>
+        <item>1f42b</item>
+        <!-- <item>1f42a</item> -->
+        <!-- <item>1f40a</item> -->
+        <item>1f433</item>
+        <!-- <item>1f40b</item> -->
+        <item>1f41f</item>
+        <item>1f420</item>
+        <item>1f421</item>
+        <item>1f419</item>
+        <item>1f41a</item>
+        <item>1f42c</item>
+        <item>1f40c</item>
+        <item>1f41b</item>
+        <item>1f41c</item>
+        <item>1f41d</item>
+        <item>1f41e</item>
+        <item>1f432</item>
+        <!-- <item>1f409</item> -->
+        <item>1f43e</item>
+        <item>1f378</item>
+        <item>1f37a</item>
+        <item>1f37b</item>
+        <item>1f377</item>
+        <item>1f379</item>
+        <item>1f376</item>
+        <!-- <item>2615</item> -->
+        <item>1f375</item>
+        <!-- <item>1f37c</item> -->
+        <item>1f374</item>
+        <item>1f368</item>
+        <item>1f367</item>
+        <item>1f366</item>
+        <item>1f369</item>
+        <item>1f370</item>
+        <item>1f36a</item>
+        <item>1f36b</item>
+        <item>1f36c</item>
+        <item>1f36d</item>
+        <item>1f36e</item>
+        <item>1f36f</item>
+        <item>1f373</item>
+        <item>1f354</item>
+        <item>1f35f</item>
+        <item>1f35d</item>
+        <item>1f355</item>
+        <item>1f356</item>
+        <item>1f357</item>
+        <item>1f364</item>
+        <item>1f363</item>
+        <item>1f371</item>
+        <item>1f35e</item>
+        <item>1f35c</item>
+        <item>1f359</item>
+        <item>1f35a</item>
+        <item>1f35b</item>
+        <item>1f372</item>
+        <item>1f365</item>
+        <item>1f362</item>
+        <item>1f361</item>
+        <item>1f358</item>
+        <item>1f360</item>
+        <item>1f34c</item>
+        <item>1f34e</item>
+        <item>1f34f</item>
+        <item>1f34a</item>
+        <!-- <item>1f34b</item> -->
+        <item>1f344</item>
+        <item>1f345</item>
+        <item>1f346</item>
+        <item>1f347</item>
+        <item>1f348</item>
+        <item>1f349</item>
+        <!-- <item>1f350</item> -->
+        <item>1f351</item>
+        <item>1f352</item>
+        <item>1f353</item>
+        <item>1f34d</item>
+        <item>1f330</item>
+        <item>1f331</item>
+        <!-- <item>1f332</item> -->
+        <!-- <item>1f333</item> -->
+        <item>1f334</item>
+        <item>1f335</item>
+        <item>1f337</item>
+        <item>1f338</item>
+        <item>1f339</item>
+        <item>1f340</item>
+        <item>1f341</item>
+        <item>1f342</item>
+        <item>1f343</item>
+        <item>1f33a</item>
+        <item>1f33b</item>
+        <item>1f33c</item>
+        <item>1f33d</item>
+        <item>1f33e</item>
+        <item>1f33f</item>
+        <item>2600</item>
+        <item>1f308</item>
+        <item>26c5</item>
+        <item>2601</item>
+        <item>1f301</item>
+        <item>1f302</item>
+        <!-- <item>2614</item> -->
+        <item>1f4a7</item>
+        <item>26a1</item>
+        <item>1f300</item>
+        <item>2744</item>
+        <item>26c4</item>
+        <item>1f319</item>
+        <!-- <item>1f31e</item> -->
+        <!-- <item>1f31d</item> -->
+        <!-- <item>1f31a</item> -->
+        <item>1f31b</item>
+        <!-- <item>1f31c</item> -->
+        <item>1f311</item>
+        <!-- <item>1f312</item> -->
+        <item>1f313</item>
+        <item>1f314</item>
+        <item>1f315</item>
+        <!-- <item>1f316</item> -->
+        <!-- <item>1f317</item> -->
+        <!-- <item>1f318</item> -->
+        <item>1f391</item>
+        <item>1f304</item>
+        <item>1f305</item>
+        <item>1f307</item>
+        <item>1f306</item>
+        <item>1f303</item>
+        <item>1f30c</item>
+        <item>1f309</item>
+        <item>1f30a</item>
+        <item>1f30b</item>
+        <!-- <item>1f30e</item> -->
+        <item>1f30f</item>
+        <!-- <item>1f30d</item> -->
+        <!-- <item>1f310</item> -->
+    </array>
+    <array
+        name="emoji_symbols"
+        format="string"
+    >
+        <!-- <item>fe82e|0031,20e3</item> -->
+        <!-- <item>fe82f|0032,20e3</item> -->
+        <!-- <item>fe830|0033,20e3</item> -->
+        <!-- <item>fe831|0034,20e3</item> -->
+        <!-- <item>fe832|0035,20e3</item> -->
+        <!-- <item>fe833|0036,20e3</item> -->
+        <!-- <item>fe834|0037,20e3</item> -->
+        <!-- <item>fe835|0038,20e3</item> -->
+        <!-- <item>fe836|0039,20e3</item> -->
+        <!-- <item>fe837|0030,20e3</item> -->
+        <!-- <item>1f51f</item> -->
+        <!-- <item>fe82c|0023,20e3</item> -->
+        <item>1f51d</item>
+        <item>1f519</item>
+        <item>1f51b</item>
+        <item>1f51c</item>
+        <item>1f51a</item>
+        <item>23f3</item>
+        <item>231b</item>
+        <item>23f0</item>
+        <item>2648</item>
+        <item>2649</item>
+        <item>264a</item>
+        <item>264b</item>
+        <item>264c</item>
+        <item>264d</item>
+        <item>264e</item>
+        <item>264f</item>
+        <item>2650</item>
+        <item>2651</item>
+        <item>2652</item>
+        <item>2653</item>
+        <item>26ce</item>
+        <item>1f531</item>
+        <item>1f52f</item>
+        <item>1f6bb</item>
+        <!-- <item>1f6ae</item> -->
+        <!-- <item>1f6af</item> -->
+        <!-- <item>1f6b0</item> -->
+        <!-- <item>1f6b1</item> -->
+        <item>1f170</item>
+        <item>1f171</item>
+        <item>1f18e</item>
+        <item>1f17e</item>
+        <item>1f4ae</item>
+        <item>1f4af</item>
+        <item>1f520</item>
+        <item>1f521</item>
+        <item>1f522</item>
+        <item>1f523</item>
+        <item>1f524</item>
+        <item>27bf</item>
+        <item>1f4f6</item>
+        <item>1f4f3</item>
+        <item>1f4f4</item>
+        <!-- <item>1f4f5</item> -->
+        <item>1f6b9</item>
+        <item>1f6ba</item>
+        <item>1f6bc</item>
+        <item>267f</item>
+        <item>267b</item>
+        <item>1f6ad</item>
+        <item>1f6a9</item>
+        <item>26a0</item>
+        <item>1f201</item>
+        <item>1f51e</item>
+        <item>26d4</item>
+        <item>1f192</item>
+        <item>1f197</item>
+        <item>1f195</item>
+        <item>1f198</item>
+        <item>1f199</item>
+        <item>1f193</item>
+        <item>1f196</item>
+        <item>1f19a</item>
+        <item>1f232</item>
+        <item>1f233</item>
+        <item>1f234</item>
+        <item>1f235</item>
+        <item>1f236</item>
+        <item>1f237</item>
+        <item>1f238</item>
+        <item>1f239</item>
+        <item>1f202</item>
+        <item>1f23a</item>
+        <item>1f250</item>
+        <item>1f251</item>
+        <item>3299</item>
+        <item>00ae</item>
+        <item>00a9</item>
+        <item>2122</item>
+        <item>1f21a</item>
+        <item>1f22f</item>
+        <item>3297</item>
+        <item>2b55</item>
+        <item>274c</item>
+        <item>274e</item>
+        <item>2139</item>
+        <item>1f6ab</item>
+        <item>2705</item>
+        <item>2714</item>
+        <item>1f517</item>
+        <item>2734</item>
+        <item>2733</item>
+        <item>2795</item>
+        <item>2796</item>
+        <item>2716</item>
+        <item>2797</item>
+        <item>1f4a0</item>
+        <item>1f4a1</item>
+        <item>1f4a4</item>
+        <item>1f4a2</item>
+        <item>1f525</item>
+        <item>1f4a5</item>
+        <item>1f4a8</item>
+        <item>1f4a6</item>
+        <item>1f4ab</item>
+        <item>1f55b</item>
+        <!-- <item>1f567</item> -->
+        <item>1f550</item>
+        <!-- <item>1f55c</item> -->
+        <item>1f551</item>
+        <!-- <item>1f55d</item> -->
+        <item>1f552</item>
+        <!-- <item>1f55e</item> -->
+        <item>1f553</item>
+        <!-- <item>1f55f</item> -->
+        <item>1f554</item>
+        <!-- <item>1f560</item> -->
+        <item>1f555</item>
+        <!-- <item>1f561</item> -->
+        <item>1f556</item>
+        <!-- <item>1f562</item> -->
+        <item>1f557</item>
+        <!-- <item>1f563</item> -->
+        <item>1f558</item>
+        <!-- <item>1f564</item> -->
+        <item>1f559</item>
+        <!-- <item>1f565</item> -->
+        <item>1f55a</item>
+        <!-- <item>1f566</item> -->
+        <item>2195</item>
+        <item>2b06</item>
+        <item>2197</item>
+        <item>27a1</item>
+        <item>2198</item>
+        <item>2b07</item>
+        <item>2199</item>
+        <item>2b05</item>
+        <item>2196</item>
+        <item>2194</item>
+        <item>2934</item>
+        <item>2935</item>
+        <item>23ea</item>
+        <item>23eb</item>
+        <item>23ec</item>
+        <item>23e9</item>
+        <item>25c0</item>
+        <item>25b6</item>
+        <item>1f53d</item>
+        <item>1f53c</item>
+        <item>2747</item>
+        <item>2728</item>
+        <item>1f534</item>
+        <item>1f535</item>
+        <item>26aa</item>
+        <item>26ab</item>
+        <item>1f533</item>
+        <item>1f532</item>
+        <item>2b50</item>
+        <item>1f31f</item>
+        <item>1f320</item>
+        <item>25ab</item>
+        <item>25aa</item>
+        <item>25fd</item>
+        <item>25fe</item>
+        <item>25fb</item>
+        <item>25fc</item>
+        <item>2b1c</item>
+        <item>2b1b</item>
+        <item>1f538</item>
+        <item>1f539</item>
+        <item>1f536</item>
+        <item>1f537</item>
+        <item>1f53a</item>
+        <item>1f53b</item>
+        <item>2754</item>
+        <item>2753</item>
+        <item>2755</item>
+        <item>2757</item>
+        <item>203c</item>
+        <item>2049</item>
+        <item>3030</item>
+        <item>27b0</item>
+        <item>2660</item>
+        <item>2665</item>
+        <item>2663</item>
+        <item>2666</item>
+        <item>1f194</item>
+        <item>1f511</item>
+        <item>21a9</item>
+        <item>1f191</item>
+        <item>1f50d</item>
+        <item>1f512</item>
+        <item>1f513</item>
+        <item>21aa</item>
+        <item>1f510</item>
+        <!-- <item>2611</item> -->
+        <item>1f518</item>
+        <item>1f50e</item>
+        <item>1f516</item>
+        <item>1f50f</item>
+        <item>1f503</item>
+        <!-- <item>1f500</item> -->
+        <!-- <item>1f501</item> -->
+        <!-- <item>1f502</item> -->
+        <!-- <item>1f504</item> -->
+        <item>1f4e7</item>
+        <!-- <item>1f505</item> -->
+        <!-- <item>1f506</item> -->
+        <!-- <item>1f507</item> -->
+        <!-- <item>1f508</item> -->
+        <!-- <item>1f509</item> -->
+        <item>1f50a</item>
+    </array>
+    <array
+        name="emoji_faces"
+        format="string"
+    >
+        <item>263a</item>
+        <item>1f60a</item>
+        <!-- <item>1f600</item> -->
+        <item>1f601</item>
+        <item>1f602</item>
+        <item>1f603</item>
+        <item>1f604</item>
+        <item>1f605</item>
+        <item>1f606</item>
+        <!-- <item>1f607</item> -->
+        <!-- <item>1f608</item> -->
+        <item>1f609</item>
+        <!-- <item>1f62f</item> -->
+        <!-- <item>1f610</item> -->
+        <!-- <item>1f611</item> -->
+        <!-- <item>1f615</item> -->
+        <item>1f620</item>
+        <!-- <item>1f62c</item> -->
+        <item>1f621</item>
+        <item>1f622</item>
+        <!-- <item>1f634</item> -->
+        <!-- <item>1f62e</item> -->
+        <item>1f623</item>
+        <item>1f624</item>
+        <item>1f625</item>
+        <!-- <item>1f626</item> -->
+        <!-- <item>1f627</item> -->
+        <item>1f628</item>
+        <item>1f629</item>
+        <item>1f630</item>
+        <!-- <item>1f61f</item> -->
+        <item>1f631</item>
+        <item>1f632</item>
+        <item>1f633</item>
+        <item>1f635</item>
+        <!-- <item>1f636</item> -->
+        <item>1f637</item>
+        <item>1f61e</item>
+        <item>1f612</item>
+        <item>1f60d</item>
+        <!-- <item>1f61b</item> -->
+        <item>1f61c</item>
+        <item>1f61d</item>
+        <item>1f60b</item>
+        <!-- <item>1f617</item> -->
+        <!-- <item>1f619</item> -->
+        <item>1f618</item>
+        <item>1f61a</item>
+        <!-- <item>1f60e</item> -->
+        <item>1f62d</item>
+        <item>1f60c</item>
+        <item>1f616</item>
+        <item>1f614</item>
+        <item>1f62a</item>
+        <item>1f60f</item>
+        <item>1f613</item>
+        <item>1f62b</item>
+        <item>1f64b</item>
+        <item>1f64c</item>
+        <item>1f64d</item>
+        <item>1f645</item>
+        <item>1f646</item>
+        <item>1f647</item>
+        <item>1f64e</item>
+        <item>1f64f</item>
+        <item>1f63a</item>
+        <item>1f63c</item>
+        <item>1f638</item>
+        <item>1f639</item>
+        <item>1f63b</item>
+        <item>1f63d</item>
+        <item>1f63f</item>
+        <item>1f63e</item>
+        <item>1f640</item>
+        <item>1f648</item>
+        <item>1f649</item>
+        <item>1f64a</item>
+        <item>1f4a9</item>
+        <item>1f476</item>
+        <item>1f466</item>
+        <item>1f467</item>
+        <item>1f468</item>
+        <item>1f469</item>
+        <item>1f474</item>
+        <item>1f475</item>
+        <item>1f48f</item>
+        <item>1f491</item>
+        <item>1f46a</item>
+        <item>1f46b</item>
+        <!-- <item>1f46c</item> -->
+        <!-- <item>1f46d</item> -->
+        <item>1f464</item>
+        <!-- <item>1f465</item> -->
+        <item>1f46e</item>
+        <item>1f477</item>
+        <item>1f481</item>
+        <item>1f482</item>
+        <item>1f46f</item>
+        <item>1f470</item>
+        <item>1f478</item>
+        <item>1f385</item>
+        <item>1f47c</item>
+        <!-- <item>1f471</item> -->
+        <!-- <item>1f472</item> -->
+        <!-- <item>1f473</item> -->
+        <item>1f483</item>
+        <item>1f486</item>
+        <item>1f487</item>
+        <item>1f485</item>
+        <item>1f47b</item>
+        <item>1f479</item>
+        <item>1f47a</item>
+        <item>1f47d</item>
+        <item>1f47e</item>
+        <item>1f47f</item>
+        <item>1f480</item>
+        <item>1f4aa</item>
+        <item>1f440</item>
+        <item>1f442</item>
+        <item>1f443</item>
+        <item>1f463</item>
+        <item>1f444</item>
+        <item>1f445</item>
+        <item>1f48b</item>
+        <item>2764</item>
+        <item>1f499</item>
+        <item>1f49a</item>
+        <item>1f49b</item>
+        <item>1f49c</item>
+        <item>1f493</item>
+        <item>1f494</item>
+        <item>1f495</item>
+        <item>1f496</item>
+        <item>1f497</item>
+        <item>1f498</item>
+        <item>1f49d</item>
+        <item>1f49e</item>
+        <item>1f49f</item>
+        <item>1f44d</item>
+        <item>1f44e</item>
+        <item>1f44c</item>
+        <item>270a</item>
+        <item>270c</item>
+        <item>270b</item>
+        <item>1f44a</item>
+        <!-- <item>261d</item> -->
+        <item>1f446</item>
+        <item>1f447</item>
+        <item>1f448</item>
+        <item>1f449</item>
+        <item>1f44b</item>
+        <item>1f44f</item>
+        <!-- <item>1f450</item> -->
+    </array>
+    <array
+        name="emoji_objects"
+        format="string"
+    >
+        <item>1f530</item>
+        <item>1f484</item>
+        <item>1f45e</item>
+        <item>1f45f</item>
+        <item>1f451</item>
+        <item>1f452</item>
+        <item>1f3a9</item>
+        <item>1f393</item>
+        <item>1f453</item>
+        <item>231a</item>
+        <item>1f454</item>
+        <item>1f455</item>
+        <item>1f456</item>
+        <item>1f457</item>
+        <item>1f458</item>
+        <item>1f459</item>
+        <item>1f460</item>
+        <item>1f461</item>
+        <item>1f462</item>
+        <item>1f45a</item>
+        <item>1f45c</item>
+        <item>1f4bc</item>
+        <item>1f392</item>
+        <item>1f45d</item>
+        <item>1f45b</item>
+        <item>1f4b0</item>
+        <item>1f4b3</item>
+        <item>1f4b2</item>
+        <item>1f4b5</item>
+        <item>1f4b4</item>
+        <!-- <item>1f4b6</item> -->
+        <!-- <item>1f4b7</item> -->
+        <item>1f4b8</item>
+        <item>1f4b1</item>
+        <item>1f4b9</item>
+        <item>1f52b</item>
+        <item>1f52a</item>
+        <item>1f4a3</item>
+        <item>1f489</item>
+        <item>1f48a</item>
+        <item>1f6ac</item>
+        <item>1f514</item>
+        <!-- <item>1f515</item> -->
+        <item>1f6aa</item>
+        <!-- <item>1f52c</item> -->
+        <!-- <item>1f52d</item> -->
+        <item>1f52e</item>
+        <item>1f526</item>
+        <item>1f50b</item>
+        <item>1f50c</item>
+        <item>1f4dc</item>
+        <item>1f4d7</item>
+        <item>1f4d8</item>
+        <item>1f4d9</item>
+        <item>1f4da</item>
+        <item>1f4d4</item>
+        <item>1f4d2</item>
+        <item>1f4d1</item>
+        <item>1f4d3</item>
+        <item>1f4d5</item>
+        <item>1f4d6</item>
+        <item>1f4f0</item>
+        <item>1f4db</item>
+        <item>1f383</item>
+        <item>1f384</item>
+        <item>1f380</item>
+        <item>1f381</item>
+        <item>1f382</item>
+        <item>1f388</item>
+        <item>1f386</item>
+        <item>1f387</item>
+        <item>1f389</item>
+        <item>1f38a</item>
+        <item>1f38d</item>
+        <item>1f38f</item>
+        <item>1f38c</item>
+        <item>1f390</item>
+        <item>1f38b</item>
+        <item>1f38e</item>
+        <item>1f4f1</item>
+        <item>1f4f2</item>
+        <item>1f4df</item>
+        <item>260e</item>
+        <item>1f4de</item>
+        <item>1f4e0</item>
+        <item>1f4e6</item>
+        <item>2709</item>
+        <item>1f4e8</item>
+        <item>1f4e9</item>
+        <item>1f4ea</item>
+        <item>1f4eb</item>
+        <!-- <item>1f4ed</item> -->
+        <!-- <item>1f4ec</item> -->
+        <item>1f4ee</item>
+        <item>1f4e4</item>
+        <item>1f4e5</item>
+        <!-- <item>1f4ef</item> -->
+        <item>1f4e2</item>
+        <item>1f4e3</item>
+        <item>1f4e1</item>
+        <item>1f4ac</item>
+        <!-- <item>1f4ad</item> -->
+        <item>2712</item>
+        <item>270f</item>
+        <item>1f4dd</item>
+        <item>1f4cf</item>
+        <item>1f4d0</item>
+        <item>1f4cd</item>
+        <item>1f4cc</item>
+        <item>1f4ce</item>
+        <item>2702</item>
+        <item>1f4ba</item>
+        <item>1f4bb</item>
+        <item>1f4bd</item>
+        <item>1f4be</item>
+        <item>1f4bf</item>
+        <item>1f4c6</item>
+        <item>1f4c5</item>
+        <item>1f4c7</item>
+        <item>1f4cb</item>
+        <item>1f4c1</item>
+        <item>1f4c2</item>
+        <item>1f4c3</item>
+        <item>1f4c4</item>
+        <item>1f4ca</item>
+        <item>1f4c8</item>
+        <item>1f4c9</item>
+        <item>26fa</item>
+        <item>1f3a1</item>
+        <item>1f3a2</item>
+        <item>1f3a0</item>
+        <item>1f3aa</item>
+        <item>1f3a8</item>
+        <item>1f3ac</item>
+        <item>1f3a5</item>
+        <item>1f4f7</item>
+        <item>1f4f9</item>
+        <item>1f3a6</item>
+        <item>1f3ad</item>
+        <item>1f3ab</item>
+        <item>1f3ae</item>
+        <item>1f3b2</item>
+        <item>1f3b0</item>
+        <item>1f0cf</item>
+        <item>1f3b4</item>
+        <item>1f004</item>
+        <item>1f3af</item>
+        <item>1f4fa</item>
+        <item>1f4fb</item>
+        <item>1f4c0</item>
+        <item>1f4fc</item>
+        <item>1f3a7</item>
+        <item>1f3a4</item>
+        <item>1f3b5</item>
+        <item>1f3b6</item>
+        <item>1f3bc</item>
+        <item>1f3bb</item>
+        <item>1f3b9</item>
+        <item>1f3b7</item>
+        <item>1f3ba</item>
+        <item>1f3b8</item>
+        <item>303d</item>
+    </array>
+    <array
+        name="emoji_places"
+        format="string"
+    >
+        <item>1f3e0</item>
+        <item>1f3e1</item>
+        <item>1f3e2</item>
+        <item>1f3e3</item>
+        <!-- <item>1f3e4</item> -->
+        <item>1f3e5</item>
+        <item>1f3e6</item>
+        <item>1f3e7</item>
+        <item>1f3e8</item>
+        <item>1f3e9</item>
+        <item>1f3ea</item>
+        <item>1f3eb</item>
+        <item>26ea</item>
+        <item>26f2</item>
+        <item>1f3ec</item>
+        <item>1f3ef</item>
+        <item>1f3f0</item>
+        <item>1f3ed</item>
+        <item>1f5fb</item>
+        <item>1f5fc</item>
+        <item>1f5fd</item>
+        <item>1f5fe</item>
+        <item>1f5ff</item>
+        <item>2693</item>
+        <item>1f3ee</item>
+        <item>1f488</item>
+        <item>1f527</item>
+        <item>1f528</item>
+        <item>1f529</item>
+        <!-- <item>1f6bf</item> -->
+        <!-- <item>1f6c1</item> -->
+        <item>1f6c0</item>
+        <item>1f6bd</item>
+        <item>1f6be</item>
+        <item>1f3bd</item>
+        <item>1f3a3</item>
+        <item>1f3b1</item>
+        <item>1f3b3</item>
+        <item>26be</item>
+        <item>26f3</item>
+        <item>1f3be</item>
+        <item>26bd</item>
+        <item>1f3bf</item>
+        <item>1f3c0</item>
+        <item>1f3c1</item>
+        <item>1f3c2</item>
+        <item>1f3c3</item>
+        <item>1f3c4</item>
+        <item>1f3c6</item>
+        <!-- <item>1f3c7</item> -->
+        <item>1f40e</item>
+        <item>1f3c8</item>
+        <!-- <item>1f3c9</item> -->
+        <item>1f3ca</item>
+        <!-- <item>1f682</item> -->
+        <item>1f683</item>
+        <item>1f684</item>
+        <item>1f685</item>
+        <!-- <item>1f686</item> -->
+        <item>1f687</item>
+        <item>24c2</item>
+        <!-- <item>1f688</item> -->
+        <!-- <item>1f68a</item> -->
+        <!-- <item>1f68b</item> -->
+        <item>1f68c</item>
+        <!-- <item>1f68d</item> -->
+        <!-- <item>1f68e</item> -->
+        <item>1f68f</item>
+        <!-- <item>1f690</item> -->
+        <item>1f691</item>
+        <item>1f692</item>
+        <item>1f693</item>
+        <!-- <item>1f694</item> -->
+        <item>1f695</item>
+        <!-- <item>1f696</item> -->
+        <item>1f697</item>
+        <!-- <item>1f698</item> -->
+        <item>1f699</item>
+        <!-- <item>1f69a</item> -->
+        <!-- <item>1f69b</item> -->
+        <!-- <item>1f69c</item> -->
+        <!-- <item>1f69d</item> -->
+        <!-- <item>1f69e</item> -->
+        <!-- <item>1f69f</item> -->
+        <!-- <item>1f6a0</item> -->
+        <!-- <item>1f6a1</item> -->
+        <item>1f6a2</item>
+        <!-- <item>1f6a3</item> -->
+        <!-- <item>1f681</item> -->
+        <item>2708</item>
+        <!-- <item>1f6c2</item> -->
+        <!-- <item>1f6c3</item> -->
+        <!-- <item>1f6c4</item> -->
+        <!-- <item>1f6c5</item> -->
+        <item>26f5</item>
+        <item>1f6b2</item>
+        <!-- <item>1f6b3</item> -->
+        <!-- <item>1f6b4</item> -->
+        <!-- <item>1f6b5</item> -->
+        <!-- <item>1f6b7</item> -->
+        <!-- <item>1f6b8</item> -->
+        <item>1f689</item>
+        <item>1f680</item>
+        <item>1f6a4</item>
+        <item>1f6b6</item>
+        <item>26fd</item>
+        <item>1f17f</item>
+        <item>1f6a5</item>
+        <!-- <item>1f6a6</item> -->
+        <item>1f6a7</item>
+        <item>1f6a8</item>
+        <item>2668</item>
+        <item>1f48c</item>
+        <item>1f48d</item>
+        <item>1f48e</item>
+        <item>1f490</item>
+        <item>1f492</item>
+        <item>fe4e5|1f1ef,1f1f5</item>
+        <item>fe4e6|1f1fa,1f1f8</item>
+        <item>fe4e7|1f1eb,1f1f7</item>
+        <item>fe4e8|1f1e9,1f1ea</item>
+        <item>fe4e9|1f1ee,1f1f9</item>
+        <item>fe4ea|1f1ec,1f1e7</item>
+        <item>fe4eb|1f1ea,1f1f8</item>
+        <item>fe4ec|1f1f7,1f1fa</item>
+        <item>fe4ed|1f1e8,1f1f3</item>
+        <item>fe4ee|1f1f0,1f1f7</item>
+    </array>
+    <array
+        name="emoji_emoticons"
+        format="string"
+    >
+        <item>=-O</item>
+        <item>:-P</item>
+        <item>;-)</item>
+        <item>:-(</item>
+        <item>:-)</item>
+        <item>:-!</item>
+        <item>:-$</item>
+        <item>B-)</item>
+        <item>:O</item>
+        <item>:-*</item>
+        <item>:-D</item>
+        <item>:\'(</item>
+        <item>:-\\</item>
+        <item>O:-)</item>
+        <item>:-[</item>
+    </array>
+</resources>
diff --git a/java/res/values-v19/emoji-categories.xml b/java/res/values-v19/emoji-categories.xml
new file mode 100644
index 0000000..a6affc4
--- /dev/null
+++ b/java/res/values-v19/emoji-categories.xml
@@ -0,0 +1,922 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 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.
+-->
+
+<!-- Note: This emoji code point list is valid on KLP and later (API >= 19).
+     There is another emoji code point list for JB-MR2 under res/xml/values and values-v18.-->
+<resources>
+    <!-- Dummy codeArrays for recents emoji keyboard.
+         Do not remove these keys, because they are used as a template. -->
+    <array
+        name="emoji_recents"
+        format="string"
+    >
+        <item>52</item>
+        <item>45</item>
+        <item>43</item>
+        <item>45</item>
+        <item>4E</item>
+        <item>54</item>
+    </array>
+    <array
+        name="emoji_nature"
+        format="string"
+    >
+        <item>1f415</item>
+        <item>1f436</item>
+        <item>1f429</item>
+        <item>1f408</item>
+        <item>1f431</item>
+        <item>1f400</item>
+        <item>1f401</item>
+        <item>1f42d</item>
+        <item>1f439</item>
+        <item>1f422</item>
+        <item>1f407</item>
+        <item>1f430</item>
+        <item>1f413</item>
+        <item>1f414</item>
+        <item>1f423</item>
+        <item>1f424</item>
+        <item>1f425</item>
+        <item>1f426</item>
+        <item>1f40f</item>
+        <item>1f411</item>
+        <item>1f410</item>
+        <item>1f43a</item>
+        <item>1f403</item>
+        <item>1f402</item>
+        <item>1f404</item>
+        <item>1f42e</item>
+        <item>1f434</item>
+        <item>1f417</item>
+        <item>1f416</item>
+        <item>1f437</item>
+        <item>1f43d</item>
+        <item>1f438</item>
+        <item>1f40d</item>
+        <item>1f43c</item>
+        <item>1f427</item>
+        <item>1f418</item>
+        <item>1f428</item>
+        <item>1f412</item>
+        <item>1f435</item>
+        <item>1f406</item>
+        <item>1f42f</item>
+        <item>1f43b</item>
+        <item>1f42b</item>
+        <item>1f42a</item>
+        <item>1f40a</item>
+        <item>1f433</item>
+        <item>1f40b</item>
+        <item>1f41f</item>
+        <item>1f420</item>
+        <item>1f421</item>
+        <item>1f419</item>
+        <item>1f41a</item>
+        <item>1f42c</item>
+        <item>1f40c</item>
+        <item>1f41b</item>
+        <item>1f41c</item>
+        <item>1f41d</item>
+        <item>1f41e</item>
+        <item>1f432</item>
+        <item>1f409</item>
+        <item>1f43e</item>
+        <item>1f378</item>
+        <item>1f37a</item>
+        <item>1f37b</item>
+        <item>1f377</item>
+        <item>1f379</item>
+        <item>1f376</item>
+        <item>2615</item>
+        <item>1f375</item>
+        <item>1f37c</item>
+        <item>1f374</item>
+        <item>1f368</item>
+        <item>1f367</item>
+        <item>1f366</item>
+        <item>1f369</item>
+        <item>1f370</item>
+        <item>1f36a</item>
+        <item>1f36b</item>
+        <item>1f36c</item>
+        <item>1f36d</item>
+        <item>1f36e</item>
+        <item>1f36f</item>
+        <item>1f373</item>
+        <item>1f354</item>
+        <item>1f35f</item>
+        <item>1f35d</item>
+        <item>1f355</item>
+        <item>1f356</item>
+        <item>1f357</item>
+        <item>1f364</item>
+        <item>1f363</item>
+        <item>1f371</item>
+        <item>1f35e</item>
+        <item>1f35c</item>
+        <item>1f359</item>
+        <item>1f35a</item>
+        <item>1f35b</item>
+        <item>1f372</item>
+        <item>1f365</item>
+        <item>1f362</item>
+        <item>1f361</item>
+        <item>1f358</item>
+        <item>1f360</item>
+        <item>1f34c</item>
+        <item>1f34e</item>
+        <item>1f34f</item>
+        <item>1f34a</item>
+        <item>1f34b</item>
+        <item>1f344</item>
+        <item>1f345</item>
+        <item>1f346</item>
+        <item>1f347</item>
+        <item>1f348</item>
+        <item>1f349</item>
+        <item>1f350</item>
+        <item>1f351</item>
+        <item>1f352</item>
+        <item>1f353</item>
+        <item>1f34d</item>
+        <item>1f330</item>
+        <item>1f331</item>
+        <item>1f332</item>
+        <item>1f333</item>
+        <item>1f334</item>
+        <item>1f335</item>
+        <item>1f337</item>
+        <item>1f338</item>
+        <item>1f339</item>
+        <item>1f340</item>
+        <item>1f341</item>
+        <item>1f342</item>
+        <item>1f343</item>
+        <item>1f33a</item>
+        <item>1f33b</item>
+        <item>1f33c</item>
+        <item>1f33d</item>
+        <item>1f33e</item>
+        <item>1f33f</item>
+        <item>2600</item>
+        <item>1f308</item>
+        <item>26c5</item>
+        <item>2601</item>
+        <item>1f301</item>
+        <item>1f302</item>
+        <item>2614</item>
+        <item>1f4a7</item>
+        <item>26a1</item>
+        <item>1f300</item>
+        <item>2744</item>
+        <item>26c4</item>
+        <item>1f319</item>
+        <item>1f31e</item>
+        <item>1f31d</item>
+        <item>1f31a</item>
+        <item>1f31b</item>
+        <item>1f31c</item>
+        <item>1f311</item>
+        <item>1f312</item>
+        <item>1f313</item>
+        <item>1f314</item>
+        <item>1f315</item>
+        <item>1f316</item>
+        <item>1f317</item>
+        <item>1f318</item>
+        <item>1f391</item>
+        <item>1f304</item>
+        <item>1f305</item>
+        <item>1f307</item>
+        <item>1f306</item>
+        <item>1f303</item>
+        <item>1f30c</item>
+        <item>1f309</item>
+        <item>1f30a</item>
+        <item>1f30b</item>
+        <item>1f30e</item>
+        <item>1f30f</item>
+        <item>1f30d</item>
+        <item>1f310</item>
+    </array>
+    <array
+        name="emoji_symbols"
+        format="string"
+    >
+        <item>fe82e|0031,20e3</item>
+        <item>fe82f|0032,20e3</item>
+        <item>fe830|0033,20e3</item>
+        <item>fe831|0034,20e3</item>
+        <item>fe832|0035,20e3</item>
+        <item>fe833|0036,20e3</item>
+        <item>fe834|0037,20e3</item>
+        <item>fe835|0038,20e3</item>
+        <item>fe836|0039,20e3</item>
+        <item>fe837|0030,20e3</item>
+        <item>1f51f</item>
+        <item>fe82c|0023,20e3</item>
+        <item>1f51d</item>
+        <item>1f519</item>
+        <item>1f51b</item>
+        <item>1f51c</item>
+        <item>1f51a</item>
+        <item>23f3</item>
+        <item>231b</item>
+        <item>23f0</item>
+        <item>2648</item>
+        <item>2649</item>
+        <item>264a</item>
+        <item>264b</item>
+        <item>264c</item>
+        <item>264d</item>
+        <item>264e</item>
+        <item>264f</item>
+        <item>2650</item>
+        <item>2651</item>
+        <item>2652</item>
+        <item>2653</item>
+        <item>26ce</item>
+        <item>1f531</item>
+        <item>1f52f</item>
+        <item>1f6bb</item>
+        <item>1f6ae</item>
+        <item>1f6af</item>
+        <item>1f6b0</item>
+        <item>1f6b1</item>
+        <item>1f170</item>
+        <item>1f171</item>
+        <item>1f18e</item>
+        <item>1f17e</item>
+        <item>1f4ae</item>
+        <item>1f4af</item>
+        <item>1f520</item>
+        <item>1f521</item>
+        <item>1f522</item>
+        <item>1f523</item>
+        <item>1f524</item>
+        <item>27bf</item>
+        <item>1f4f6</item>
+        <item>1f4f3</item>
+        <item>1f4f4</item>
+        <item>1f4f5</item>
+        <item>1f6b9</item>
+        <item>1f6ba</item>
+        <item>1f6bc</item>
+        <item>267f</item>
+        <item>267b</item>
+        <item>1f6ad</item>
+        <item>1f6a9</item>
+        <item>26a0</item>
+        <item>1f201</item>
+        <item>1f51e</item>
+        <item>26d4</item>
+        <item>1f192</item>
+        <item>1f197</item>
+        <item>1f195</item>
+        <item>1f198</item>
+        <item>1f199</item>
+        <item>1f193</item>
+        <item>1f196</item>
+        <item>1f19a</item>
+        <item>1f232</item>
+        <item>1f233</item>
+        <item>1f234</item>
+        <item>1f235</item>
+        <item>1f236</item>
+        <item>1f237</item>
+        <item>1f238</item>
+        <item>1f239</item>
+        <item>1f202</item>
+        <item>1f23a</item>
+        <item>1f250</item>
+        <item>1f251</item>
+        <item>3299</item>
+        <item>00ae</item>
+        <item>00a9</item>
+        <item>2122</item>
+        <item>1f21a</item>
+        <item>1f22f</item>
+        <item>3297</item>
+        <item>2b55</item>
+        <item>274c</item>
+        <item>274e</item>
+        <item>2139</item>
+        <item>1f6ab</item>
+        <item>2705</item>
+        <item>2714</item>
+        <item>1f517</item>
+        <item>2734</item>
+        <item>2733</item>
+        <item>2795</item>
+        <item>2796</item>
+        <item>2716</item>
+        <item>2797</item>
+        <item>1f4a0</item>
+        <item>1f4a1</item>
+        <item>1f4a4</item>
+        <item>1f4a2</item>
+        <item>1f525</item>
+        <item>1f4a5</item>
+        <item>1f4a8</item>
+        <item>1f4a6</item>
+        <item>1f4ab</item>
+        <item>1f55b</item>
+        <item>1f567</item>
+        <item>1f550</item>
+        <item>1f55c</item>
+        <item>1f551</item>
+        <item>1f55d</item>
+        <item>1f552</item>
+        <item>1f55e</item>
+        <item>1f553</item>
+        <item>1f55f</item>
+        <item>1f554</item>
+        <item>1f560</item>
+        <item>1f555</item>
+        <item>1f561</item>
+        <item>1f556</item>
+        <item>1f562</item>
+        <item>1f557</item>
+        <item>1f563</item>
+        <item>1f558</item>
+        <item>1f564</item>
+        <item>1f559</item>
+        <item>1f565</item>
+        <item>1f55a</item>
+        <item>1f566</item>
+        <item>2195</item>
+        <item>2b06</item>
+        <item>2197</item>
+        <item>27a1</item>
+        <item>2198</item>
+        <item>2b07</item>
+        <item>2199</item>
+        <item>2b05</item>
+        <item>2196</item>
+        <item>2194</item>
+        <item>2934</item>
+        <item>2935</item>
+        <item>23ea</item>
+        <item>23eb</item>
+        <item>23ec</item>
+        <item>23e9</item>
+        <item>25c0</item>
+        <item>25b6</item>
+        <item>1f53d</item>
+        <item>1f53c</item>
+        <item>2747</item>
+        <item>2728</item>
+        <item>1f534</item>
+        <item>1f535</item>
+        <item>26aa</item>
+        <item>26ab</item>
+        <item>1f533</item>
+        <item>1f532</item>
+        <item>2b50</item>
+        <item>1f31f</item>
+        <item>1f320</item>
+        <item>25ab</item>
+        <item>25aa</item>
+        <item>25fd</item>
+        <item>25fe</item>
+        <item>25fb</item>
+        <item>25fc</item>
+        <item>2b1c</item>
+        <item>2b1b</item>
+        <item>1f538</item>
+        <item>1f539</item>
+        <item>1f536</item>
+        <item>1f537</item>
+        <item>1f53a</item>
+        <item>1f53b</item>
+        <item>2754</item>
+        <item>2753</item>
+        <item>2755</item>
+        <item>2757</item>
+        <item>203c</item>
+        <item>2049</item>
+        <item>3030</item>
+        <item>27b0</item>
+        <item>2660</item>
+        <item>2665</item>
+        <item>2663</item>
+        <item>2666</item>
+        <item>1f194</item>
+        <item>1f511</item>
+        <item>21a9</item>
+        <item>1f191</item>
+        <item>1f50d</item>
+        <item>1f512</item>
+        <item>1f513</item>
+        <item>21aa</item>
+        <item>1f510</item>
+        <item>2611</item>
+        <item>1f518</item>
+        <item>1f50e</item>
+        <item>1f516</item>
+        <item>1f50f</item>
+        <item>1f503</item>
+        <item>1f500</item>
+        <item>1f501</item>
+        <item>1f502</item>
+        <item>1f504</item>
+        <item>1f4e7</item>
+        <item>1f505</item>
+        <item>1f506</item>
+        <item>1f507</item>
+        <item>1f508</item>
+        <item>1f509</item>
+        <item>1f50a</item>
+    </array>
+    <array
+        name="emoji_faces"
+        format="string"
+    >
+        <item>263a</item>
+        <item>1f60a</item>
+        <item>1f600</item>
+        <item>1f601</item>
+        <item>1f602</item>
+        <item>1f603</item>
+        <item>1f604</item>
+        <item>1f605</item>
+        <item>1f606</item>
+        <item>1f607</item>
+        <item>1f608</item>
+        <item>1f609</item>
+        <item>1f62f</item>
+        <item>1f610</item>
+        <item>1f611</item>
+        <item>1f615</item>
+        <item>1f620</item>
+        <item>1f62c</item>
+        <item>1f621</item>
+        <item>1f622</item>
+        <item>1f634</item>
+        <item>1f62e</item>
+        <item>1f623</item>
+        <item>1f624</item>
+        <item>1f625</item>
+        <item>1f626</item>
+        <item>1f627</item>
+        <item>1f628</item>
+        <item>1f629</item>
+        <item>1f630</item>
+        <item>1f61f</item>
+        <item>1f631</item>
+        <item>1f632</item>
+        <item>1f633</item>
+        <item>1f635</item>
+        <item>1f636</item>
+        <item>1f637</item>
+        <item>1f61e</item>
+        <item>1f612</item>
+        <item>1f60d</item>
+        <item>1f61b</item>
+        <item>1f61c</item>
+        <item>1f61d</item>
+        <item>1f60b</item>
+        <item>1f617</item>
+        <item>1f619</item>
+        <item>1f618</item>
+        <item>1f61a</item>
+        <item>1f60e</item>
+        <item>1f62d</item>
+        <item>1f60c</item>
+        <item>1f616</item>
+        <item>1f614</item>
+        <item>1f62a</item>
+        <item>1f60f</item>
+        <item>1f613</item>
+        <item>1f62b</item>
+        <item>1f64b</item>
+        <item>1f64c</item>
+        <item>1f64d</item>
+        <item>1f645</item>
+        <item>1f646</item>
+        <item>1f647</item>
+        <item>1f64e</item>
+        <item>1f64f</item>
+        <item>1f63a</item>
+        <item>1f63c</item>
+        <item>1f638</item>
+        <item>1f639</item>
+        <item>1f63b</item>
+        <item>1f63d</item>
+        <item>1f63f</item>
+        <item>1f63e</item>
+        <item>1f640</item>
+        <item>1f648</item>
+        <item>1f649</item>
+        <item>1f64a</item>
+        <item>1f4a9</item>
+        <item>1f476</item>
+        <item>1f466</item>
+        <item>1f467</item>
+        <item>1f468</item>
+        <item>1f469</item>
+        <item>1f474</item>
+        <item>1f475</item>
+        <item>1f48f</item>
+        <item>1f491</item>
+        <item>1f46a</item>
+        <item>1f46b</item>
+        <item>1f46c</item>
+        <item>1f46d</item>
+        <item>1f464</item>
+        <item>1f465</item>
+        <item>1f46e</item>
+        <item>1f477</item>
+        <item>1f481</item>
+        <item>1f482</item>
+        <item>1f46f</item>
+        <item>1f470</item>
+        <item>1f478</item>
+        <item>1f385</item>
+        <item>1f47c</item>
+        <item>1f471</item>
+        <item>1f472</item>
+        <item>1f473</item>
+        <item>1f483</item>
+        <item>1f486</item>
+        <item>1f487</item>
+        <item>1f485</item>
+        <item>1f47b</item>
+        <item>1f479</item>
+        <item>1f47a</item>
+        <item>1f47d</item>
+        <item>1f47e</item>
+        <item>1f47f</item>
+        <item>1f480</item>
+        <item>1f4aa</item>
+        <item>1f440</item>
+        <item>1f442</item>
+        <item>1f443</item>
+        <item>1f463</item>
+        <item>1f444</item>
+        <item>1f445</item>
+        <item>1f48b</item>
+        <item>2764</item>
+        <item>1f499</item>
+        <item>1f49a</item>
+        <item>1f49b</item>
+        <item>1f49c</item>
+        <item>1f493</item>
+        <item>1f494</item>
+        <item>1f495</item>
+        <item>1f496</item>
+        <item>1f497</item>
+        <item>1f498</item>
+        <item>1f49d</item>
+        <item>1f49e</item>
+        <item>1f49f</item>
+        <item>1f44d</item>
+        <item>1f44e</item>
+        <item>1f44c</item>
+        <item>270a</item>
+        <item>270c</item>
+        <item>270b</item>
+        <item>1f44a</item>
+        <item>261d</item>
+        <item>1f446</item>
+        <item>1f447</item>
+        <item>1f448</item>
+        <item>1f449</item>
+        <item>1f44b</item>
+        <item>1f44f</item>
+        <item>1f450</item>
+    </array>
+    <array
+        name="emoji_objects"
+        format="string"
+    >
+        <item>1f530</item>
+        <item>1f484</item>
+        <item>1f45e</item>
+        <item>1f45f</item>
+        <item>1f451</item>
+        <item>1f452</item>
+        <item>1f3a9</item>
+        <item>1f393</item>
+        <item>1f453</item>
+        <item>231a</item>
+        <item>1f454</item>
+        <item>1f455</item>
+        <item>1f456</item>
+        <item>1f457</item>
+        <item>1f458</item>
+        <item>1f459</item>
+        <item>1f460</item>
+        <item>1f461</item>
+        <item>1f462</item>
+        <item>1f45a</item>
+        <item>1f45c</item>
+        <item>1f4bc</item>
+        <item>1f392</item>
+        <item>1f45d</item>
+        <item>1f45b</item>
+        <item>1f4b0</item>
+        <item>1f4b3</item>
+        <item>1f4b2</item>
+        <item>1f4b5</item>
+        <item>1f4b4</item>
+        <item>1f4b6</item>
+        <item>1f4b7</item>
+        <item>1f4b8</item>
+        <item>1f4b1</item>
+        <item>1f4b9</item>
+        <item>1f52b</item>
+        <item>1f52a</item>
+        <item>1f4a3</item>
+        <item>1f489</item>
+        <item>1f48a</item>
+        <item>1f6ac</item>
+        <item>1f514</item>
+        <item>1f515</item>
+        <item>1f6aa</item>
+        <item>1f52c</item>
+        <item>1f52d</item>
+        <item>1f52e</item>
+        <item>1f526</item>
+        <item>1f50b</item>
+        <item>1f50c</item>
+        <item>1f4dc</item>
+        <item>1f4d7</item>
+        <item>1f4d8</item>
+        <item>1f4d9</item>
+        <item>1f4da</item>
+        <item>1f4d4</item>
+        <item>1f4d2</item>
+        <item>1f4d1</item>
+        <item>1f4d3</item>
+        <item>1f4d5</item>
+        <item>1f4d6</item>
+        <item>1f4f0</item>
+        <item>1f4db</item>
+        <item>1f383</item>
+        <item>1f384</item>
+        <item>1f380</item>
+        <item>1f381</item>
+        <item>1f382</item>
+        <item>1f388</item>
+        <item>1f386</item>
+        <item>1f387</item>
+        <item>1f389</item>
+        <item>1f38a</item>
+        <item>1f38d</item>
+        <item>1f38f</item>
+        <item>1f38c</item>
+        <item>1f390</item>
+        <item>1f38b</item>
+        <item>1f38e</item>
+        <item>1f4f1</item>
+        <item>1f4f2</item>
+        <item>1f4df</item>
+        <item>260e</item>
+        <item>1f4de</item>
+        <item>1f4e0</item>
+        <item>1f4e6</item>
+        <item>2709</item>
+        <item>1f4e8</item>
+        <item>1f4e9</item>
+        <item>1f4ea</item>
+        <item>1f4eb</item>
+        <item>1f4ed</item>
+        <item>1f4ec</item>
+        <item>1f4ee</item>
+        <item>1f4e4</item>
+        <item>1f4e5</item>
+        <item>1f4ef</item>
+        <item>1f4e2</item>
+        <item>1f4e3</item>
+        <item>1f4e1</item>
+        <item>1f4ac</item>
+        <item>1f4ad</item>
+        <item>2712</item>
+        <item>270f</item>
+        <item>1f4dd</item>
+        <item>1f4cf</item>
+        <item>1f4d0</item>
+        <item>1f4cd</item>
+        <item>1f4cc</item>
+        <item>1f4ce</item>
+        <item>2702</item>
+        <item>1f4ba</item>
+        <item>1f4bb</item>
+        <item>1f4bd</item>
+        <item>1f4be</item>
+        <item>1f4bf</item>
+        <item>1f4c6</item>
+        <item>1f4c5</item>
+        <item>1f4c7</item>
+        <item>1f4cb</item>
+        <item>1f4c1</item>
+        <item>1f4c2</item>
+        <item>1f4c3</item>
+        <item>1f4c4</item>
+        <item>1f4ca</item>
+        <item>1f4c8</item>
+        <item>1f4c9</item>
+        <item>26fa</item>
+        <item>1f3a1</item>
+        <item>1f3a2</item>
+        <item>1f3a0</item>
+        <item>1f3aa</item>
+        <item>1f3a8</item>
+        <item>1f3ac</item>
+        <item>1f3a5</item>
+        <item>1f4f7</item>
+        <item>1f4f9</item>
+        <item>1f3a6</item>
+        <item>1f3ad</item>
+        <item>1f3ab</item>
+        <item>1f3ae</item>
+        <item>1f3b2</item>
+        <item>1f3b0</item>
+        <item>1f0cf</item>
+        <item>1f3b4</item>
+        <item>1f004</item>
+        <item>1f3af</item>
+        <item>1f4fa</item>
+        <item>1f4fb</item>
+        <item>1f4c0</item>
+        <item>1f4fc</item>
+        <item>1f3a7</item>
+        <item>1f3a4</item>
+        <item>1f3b5</item>
+        <item>1f3b6</item>
+        <item>1f3bc</item>
+        <item>1f3bb</item>
+        <item>1f3b9</item>
+        <item>1f3b7</item>
+        <item>1f3ba</item>
+        <item>1f3b8</item>
+        <item>303d</item>
+    </array>
+    <array
+        name="emoji_places"
+        format="string"
+    >
+        <item>1f3e0</item>
+        <item>1f3e1</item>
+        <item>1f3e2</item>
+        <item>1f3e3</item>
+        <item>1f3e4</item>
+        <item>1f3e5</item>
+        <item>1f3e6</item>
+        <item>1f3e7</item>
+        <item>1f3e8</item>
+        <item>1f3e9</item>
+        <item>1f3ea</item>
+        <item>1f3eb</item>
+        <item>26ea</item>
+        <item>26f2</item>
+        <item>1f3ec</item>
+        <item>1f3ef</item>
+        <item>1f3f0</item>
+        <item>1f3ed</item>
+        <item>1f5fb</item>
+        <item>1f5fc</item>
+        <item>1f5fd</item>
+        <item>1f5fe</item>
+        <item>1f5ff</item>
+        <item>2693</item>
+        <item>1f3ee</item>
+        <item>1f488</item>
+        <item>1f527</item>
+        <item>1f528</item>
+        <item>1f529</item>
+        <item>1f6bf</item>
+        <item>1f6c1</item>
+        <item>1f6c0</item>
+        <item>1f6bd</item>
+        <item>1f6be</item>
+        <item>1f3bd</item>
+        <item>1f3a3</item>
+        <item>1f3b1</item>
+        <item>1f3b3</item>
+        <item>26be</item>
+        <item>26f3</item>
+        <item>1f3be</item>
+        <item>26bd</item>
+        <item>1f3bf</item>
+        <item>1f3c0</item>
+        <item>1f3c1</item>
+        <item>1f3c2</item>
+        <item>1f3c3</item>
+        <item>1f3c4</item>
+        <item>1f3c6</item>
+        <item>1f3c7</item>
+        <item>1f40e</item>
+        <item>1f3c8</item>
+        <item>1f3c9</item>
+        <item>1f3ca</item>
+        <item>1f682</item>
+        <item>1f683</item>
+        <item>1f684</item>
+        <item>1f685</item>
+        <item>1f686</item>
+        <item>1f687</item>
+        <item>24c2</item>
+        <item>1f688</item>
+        <item>1f68a</item>
+        <item>1f68b</item>
+        <item>1f68c</item>
+        <item>1f68d</item>
+        <item>1f68e</item>
+        <item>1f68f</item>
+        <item>1f690</item>
+        <item>1f691</item>
+        <item>1f692</item>
+        <item>1f693</item>
+        <item>1f694</item>
+        <item>1f695</item>
+        <item>1f696</item>
+        <item>1f697</item>
+        <item>1f698</item>
+        <item>1f699</item>
+        <item>1f69a</item>
+        <item>1f69b</item>
+        <item>1f69c</item>
+        <item>1f69d</item>
+        <item>1f69e</item>
+        <item>1f69f</item>
+        <item>1f6a0</item>
+        <item>1f6a1</item>
+        <item>1f6a2</item>
+        <item>1f6a3</item>
+        <item>1f681</item>
+        <item>2708</item>
+        <item>1f6c2</item>
+        <item>1f6c3</item>
+        <item>1f6c4</item>
+        <item>1f6c5</item>
+        <item>26f5</item>
+        <item>1f6b2</item>
+        <item>1f6b3</item>
+        <item>1f6b4</item>
+        <item>1f6b5</item>
+        <item>1f6b7</item>
+        <item>1f6b8</item>
+        <item>1f689</item>
+        <item>1f680</item>
+        <item>1f6a4</item>
+        <item>1f6b6</item>
+        <item>26fd</item>
+        <item>1f17f</item>
+        <item>1f6a5</item>
+        <item>1f6a6</item>
+        <item>1f6a7</item>
+        <item>1f6a8</item>
+        <item>2668</item>
+        <item>1f48c</item>
+        <item>1f48d</item>
+        <item>1f48e</item>
+        <item>1f490</item>
+        <item>1f492</item>
+        <item>fe4e5|1f1ef,1f1f5</item>
+        <item>fe4e6|1f1fa,1f1f8</item>
+        <item>fe4e7|1f1eb,1f1f7</item>
+        <item>fe4e8|1f1e9,1f1ea</item>
+        <item>fe4e9|1f1ee,1f1f9</item>
+        <item>fe4ea|1f1ec,1f1e7</item>
+        <item>fe4eb|1f1ea,1f1f8</item>
+        <item>fe4ec|1f1f7,1f1fa</item>
+        <item>fe4ed|1f1e8,1f1f3</item>
+        <item>fe4ee|1f1f0,1f1f7</item>
+    </array>
+    <array
+        name="emoji_emoticons"
+        format="string"
+    >
+        <item>=-O</item>
+        <item>:-P</item>
+        <item>;-)</item>
+        <item>:-(</item>
+        <item>:-)</item>
+        <item>:-!</item>
+        <item>:-$</item>
+        <item>B-)</item>
+        <item>:O</item>
+        <item>:-*</item>
+        <item>:-D</item>
+        <item>:\'(</item>
+        <item>:-\\</item>
+        <item>O:-)</item>
+        <item>:-[</item>
+    </array>
+</resources>
diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml
index 3512686..4c50976 100644
--- a/java/res/values/attrs.xml
+++ b/java/res/values/attrs.xml
@@ -373,6 +373,13 @@
             <enum name="phone" value="7"  />
             <enum name="phoneSymbols" value="8"  />
             <enum name="number" value="9"  />
+            <enum name="emojiRecents" value="10" />
+            <enum name="emojiCategory1" value="11" />
+            <enum name="emojiCategory2" value="12" />
+            <enum name="emojiCategory3" value="13" />
+            <enum name="emojiCategory4" value="14" />
+            <enum name="emojiCategory5" value="15" />
+            <enum name="emojiCategory6" value="16" />
         </attr>
         <!-- This should be aligned with KeyboardId.MODE_* -->
         <attr name="mode" format="enum|string">
@@ -427,6 +434,13 @@
             <enum name="phone" value="7"  />
             <enum name="phoneSymbols" value="8"  />
             <enum name="number" value="9"  />
+            <enum name="emojiRecents" value="10" />
+            <enum name="emojiCategory1" value="11" />
+            <enum name="emojiCategory2" value="12" />
+            <enum name="emojiCategory3" value="13" />
+            <enum name="emojiCategory4" value="14" />
+            <enum name="emojiCategory5" value="15" />
+            <enum name="emojiCategory6" value="16" />
         </attr>
         <attr name="elementKeyboard" format="reference"/>
         <!-- Enable proximity characters correction. Disabled by default. -->
diff --git a/java/res/values/emoji-categories.xml b/java/res/values/emoji-categories.xml
new file mode 100644
index 0000000..734a7a7
--- /dev/null
+++ b/java/res/values/emoji-categories.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 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.
+-->
+
+<!-- Note: This emoji code point list is valid prior to JB-MR2 (API < 18).
+     There is another emoji code point list for JB-MR2 and KLP and later under
+     res/xml/values-v1[89].-->
+<resources>
+    <!-- Dummy codeArrays for recents emoji keyboard.
+         Do not remove these keys, because they are used as a template. -->
+    <array
+        name="emoji_recents"
+        format="string"
+    >
+        <item>52</item>
+        <item>45</item>
+        <item>43</item>
+        <item>45</item>
+        <item>4E</item>
+        <item>54</item>
+    </array>
+    <array
+        name="emoji_nature"
+        format="string"
+    >
+    </array>
+    <array
+        name="emoji_symbols"
+        format="string"
+    >
+    </array>
+    <array
+        name="emoji_faces"
+        format="string"
+    >
+    </array>
+    <array
+        name="emoji_objects"
+        format="string"
+    >
+    </array>
+    <array
+        name="emoji_places"
+        format="string"
+    >
+    </array>
+    <array
+        name="emoji_emoticons"
+        format="string"
+    >
+        <item>=-O</item>
+        <item>:-P</item>
+        <item>;-)</item>
+        <item>:-(</item>
+        <item>:-)</item>
+        <item>:-!</item>
+        <item>:-$</item>
+        <item>B-)</item>
+        <item>:O</item>
+        <item>:-*</item>
+        <item>:-D</item>
+        <item>:\'(</item>
+        <item>:-\\</item>
+        <item>O:-)</item>
+        <item>:-[</item>
+    </array>
+</resources>
diff --git a/java/res/xml-sw600dp/key_styles_common.xml b/java/res/xml-sw600dp/key_styles_common.xml
index f407ba3..fc9342b 100644
--- a/java/res/xml-sw600dp/key_styles_common.xml
+++ b/java/res/xml-sw600dp/key_styles_common.xml
@@ -178,16 +178,6 @@
         latin:keyLabel="!text/label_to_alpha_key"
         latin:parentStyle="baseForLayoutSwitchKeyStyle" />
     <key-style
-        latin:styleName="toMoreSymbolKeyStyle"
-        latin:code="!code/key_shift"
-        latin:keyLabel="!text/label_to_more_symbol_for_tablet_key"
-        latin:parentStyle="baseForLayoutSwitchKeyStyle" />
-    <key-style
-        latin:styleName="backFromMoreSymbolKeyStyle"
-        latin:code="!code/key_shift"
-        latin:keyLabel="!text/label_to_symbol_key"
-        latin:parentStyle="baseForLayoutSwitchKeyStyle" />
-    <key-style
         latin:styleName="comKeyStyle"
         latin:keyLabel="!text/keylabel_for_popular_domain"
         latin:keyLabelFlags="autoXScale|fontNormal|hasPopupHint|preserveCase"
diff --git a/java/res/xml-sw768dp/key_styles_common.xml b/java/res/xml-sw768dp/key_styles_common.xml
index 7c0a82a..5389309 100644
--- a/java/res/xml-sw768dp/key_styles_common.xml
+++ b/java/res/xml-sw768dp/key_styles_common.xml
@@ -168,16 +168,6 @@
         latin:keyLabel="!text/label_to_alpha_key"
         latin:parentStyle="baseForLayoutSwitchKeyStyle" />
     <key-style
-        latin:styleName="toMoreSymbolKeyStyle"
-        latin:code="!code/key_shift"
-        latin:keyLabel="!text/label_to_more_symbol_for_tablet_key"
-        latin:parentStyle="baseForLayoutSwitchKeyStyle" />
-    <key-style
-        latin:styleName="backFromMoreSymbolKeyStyle"
-        latin:code="!code/key_shift"
-        latin:keyLabel="!text/label_to_symbol_key"
-        latin:parentStyle="baseForLayoutSwitchKeyStyle" />
-    <key-style
         latin:styleName="comKeyStyle"
         latin:keyLabel="!text/keylabel_for_popular_domain"
         latin:keyLabelFlags="fontNormal|hasPopupHint|preserveCase"
diff --git a/java/res/xml/key_styles_common.xml b/java/res/xml/key_styles_common.xml
index 355455e..dabe1e7 100644
--- a/java/res/xml/key_styles_common.xml
+++ b/java/res/xml/key_styles_common.xml
@@ -179,15 +179,6 @@
         latin:keyLabel="!text/label_to_alpha_key"
         latin:parentStyle="baseForLayoutSwitchKeyStyle" />
     <key-style
-        latin:styleName="toMoreSymbolKeyStyle"
-        latin:code="!code/key_shift"
-        latin:keyLabel="!text/label_to_more_symbol_key"
-        latin:parentStyle="baseForLayoutSwitchKeyStyle" />
-    <key-style
-        latin:styleName="backFromMoreSymbolKeyStyle"
-        latin:code="!code/key_shift"
-        latin:parentStyle="baseForToSymbolKeyStyle" />
-    <key-style
         latin:styleName="punctuationKeyStyle"
         latin:keyLabel="."
         latin:keyLabelFlags="hasPopupHint"
diff --git a/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java b/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java
index 8ce1263..7639432 100644
--- a/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java
+++ b/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java
@@ -157,7 +157,7 @@
 
             // Add the virtual children of the root View.
             final Keyboard keyboard = mKeyboardView.getKeyboard();
-            final Key[] keys = keyboard.mKeys;
+            final Key[] keys = keyboard.getKeys();
             for (Key key : keys) {
                 final int childVirtualViewId = generateVirtualViewIdForKey(key);
                 rootInfo.addChild(mKeyboardView, childVirtualViewId);
@@ -300,7 +300,7 @@
         }
         mVirtualViewIdToKey.clear();
 
-        final Key[] keys = keyboard.mKeys;
+        final Key[] keys = keyboard.getKeys();
         for (Key key : keys) {
             final int virtualViewId = generateVirtualViewIdForKey(key);
             mVirtualViewIdToKey.put(virtualViewId, key);
diff --git a/java/src/com/android/inputmethod/keyboard/Keyboard.java b/java/src/com/android/inputmethod/keyboard/Keyboard.java
index c40ddea..0b3737e 100644
--- a/java/src/com/android/inputmethod/keyboard/Keyboard.java
+++ b/java/src/com/android/inputmethod/keyboard/Keyboard.java
@@ -69,7 +69,7 @@
     public final int mMaxMoreKeysKeyboardColumn;
 
     /** Array of keys and icons in this keyboard */
-    public final Key[] mKeys;
+    private final Key[] mKeys;
     public final Key[] mShiftKeys;
     public final Key[] mAltCodeKeysWhileTyping;
     public final KeyboardIconsSet mIconsSet;
@@ -104,6 +104,28 @@
         mProximityCharsCorrectionEnabled = params.mProximityCharsCorrectionEnabled;
     }
 
+    protected Keyboard(final Keyboard keyboard) {
+        mId = keyboard.mId;
+        mThemeId = keyboard.mThemeId;
+        mOccupiedHeight = keyboard.mOccupiedHeight;
+        mOccupiedWidth = keyboard.mOccupiedWidth;
+        mMostCommonKeyHeight = keyboard.mMostCommonKeyHeight;
+        mMostCommonKeyWidth = keyboard.mMostCommonKeyWidth;
+        mMoreKeysTemplate = keyboard.mMoreKeysTemplate;
+        mMaxMoreKeysKeyboardColumn = keyboard.mMaxMoreKeysKeyboardColumn;
+        mKeyVisualAttributes = keyboard.mKeyVisualAttributes;
+        mTopPadding = keyboard.mTopPadding;
+        mVerticalGap = keyboard.mVerticalGap;
+
+        mKeys = keyboard.mKeys;
+        mShiftKeys = keyboard.mShiftKeys;
+        mAltCodeKeysWhileTyping = keyboard.mAltCodeKeysWhileTyping;
+        mIconsSet = keyboard.mIconsSet;
+
+        mProximityInfo = keyboard.mProximityInfo;
+        mProximityCharsCorrectionEnabled = keyboard.mProximityCharsCorrectionEnabled;
+    }
+
     public boolean hasProximityCharsCorrection(final int code) {
         if (!mProximityCharsCorrectionEnabled) {
             return false;
@@ -120,6 +142,10 @@
         return mProximityInfo;
     }
 
+    public Key[] getKeys() {
+        return mKeys;
+    }
+
     public Key getKey(final int code) {
         if (code == Constants.CODE_UNSPECIFIED) {
             return null;
@@ -130,7 +156,7 @@
                 return mKeyCache.valueAt(index);
             }
 
-            for (final Key key : mKeys) {
+            for (final Key key : getKeys()) {
                 if (key.getCode() == code) {
                     mKeyCache.put(code, key);
                     return key;
@@ -146,7 +172,7 @@
             return true;
         }
 
-        for (final Key key : mKeys) {
+        for (final Key key : getKeys()) {
             if (key == aKey) {
                 mKeyCache.put(key.getCode(), key);
                 return true;
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardId.java b/java/src/com/android/inputmethod/keyboard/KeyboardId.java
index 08ce064..53748bb 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardId.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardId.java
@@ -53,6 +53,13 @@
     public static final int ELEMENT_PHONE = 7;
     public static final int ELEMENT_PHONE_SYMBOLS = 8;
     public static final int ELEMENT_NUMBER = 9;
+    public static final int ELEMENT_EMOJI_RECENTS = 10;
+    public static final int ELEMENT_EMOJI_CATEGORY1 = 11;
+    public static final int ELEMENT_EMOJI_CATEGORY2 = 12;
+    public static final int ELEMENT_EMOJI_CATEGORY3 = 13;
+    public static final int ELEMENT_EMOJI_CATEGORY4 = 14;
+    public static final int ELEMENT_EMOJI_CATEGORY5 = 15;
+    public static final int ELEMENT_EMOJI_CATEGORY6 = 16;
 
     public final InputMethodSubtype mSubtype;
     public final Locale mLocale;
@@ -215,6 +222,13 @@
         case ELEMENT_PHONE: return "phone";
         case ELEMENT_PHONE_SYMBOLS: return "phoneSymbols";
         case ELEMENT_NUMBER: return "number";
+        case ELEMENT_EMOJI_RECENTS: return "emojiRecents";
+        case ELEMENT_EMOJI_CATEGORY1: return "emojiCategory1";
+        case ELEMENT_EMOJI_CATEGORY2: return "emojiCategory2";
+        case ELEMENT_EMOJI_CATEGORY3: return "emojiCategory3";
+        case ELEMENT_EMOJI_CATEGORY4: return "emojiCategory4";
+        case ELEMENT_EMOJI_CATEGORY5: return "emojiCategory5";
+        case ELEMENT_EMOJI_CATEGORY6: return "emojiCategory6";
         default: return null;
         }
     }
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardView.java b/java/src/com/android/inputmethod/keyboard/KeyboardView.java
index d049a86..0ef6802 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardView.java
@@ -285,7 +285,7 @@
         // TODO: Confirm if it's really required to draw all keys when hardware acceleration is on.
         if (drawAllKeys || isHardwareAccelerated) {
             // Draw all keys.
-            for (final Key key : mKeyboard.mKeys) {
+            for (final Key key : mKeyboard.getKeys()) {
                 onDrawKey(key, canvas, paint);
             }
         } else {
diff --git a/java/src/com/android/inputmethod/keyboard/MoreKeysDetector.java b/java/src/com/android/inputmethod/keyboard/MoreKeysDetector.java
index a2001cb..6b76e24 100644
--- a/java/src/com/android/inputmethod/keyboard/MoreKeysDetector.java
+++ b/java/src/com/android/inputmethod/keyboard/MoreKeysDetector.java
@@ -39,7 +39,7 @@
 
         Key nearestKey = null;
         int nearestDist = (y < 0) ? mSlideAllowanceSquareTop : mSlideAllowanceSquare;
-        for (final Key key : getKeyboard().mKeys) {
+        for (final Key key : getKeyboard().getKeys()) {
             final int dist = key.squaredDistanceToEdge(touchX, touchY);
             if (dist < nearestDist) {
                 nearestKey = key;
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java
index fce2458..507080d 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java
@@ -226,32 +226,30 @@
         /* 121 */ "shortcut_as_more_key",
         /* 122 */ "action_next_as_more_key",
         /* 123 */ "action_previous_as_more_key",
-        /* 124 */ "label_to_more_symbol_key",
-        /* 125 */ "label_to_more_symbol_for_tablet_key",
-        /* 126 */ "label_tab_key",
-        /* 127 */ "label_to_phone_numeric_key",
-        /* 128 */ "label_to_phone_symbols_key",
-        /* 129 */ "label_time_am",
-        /* 130 */ "label_time_pm",
-        /* 131 */ "label_to_symbol_key_pcqwerty",
-        /* 132 */ "keylabel_for_popular_domain",
-        /* 133 */ "more_keys_for_popular_domain",
-        /* 134 */ "more_keys_for_smiley",
-        /* 135 */ "single_laqm_raqm",
-        /* 136 */ "single_laqm_raqm_rtl",
-        /* 137 */ "single_raqm_laqm",
-        /* 138 */ "double_laqm_raqm",
-        /* 139 */ "double_laqm_raqm_rtl",
-        /* 140 */ "double_raqm_laqm",
-        /* 141 */ "single_lqm_rqm",
-        /* 142 */ "single_9qm_lqm",
-        /* 143 */ "single_9qm_rqm",
-        /* 144 */ "double_lqm_rqm",
-        /* 145 */ "double_9qm_lqm",
-        /* 146 */ "double_9qm_rqm",
-        /* 147 */ "more_keys_for_single_quote",
-        /* 148 */ "more_keys_for_double_quote",
-        /* 149 */ "more_keys_for_tablet_double_quote",
+        /* 124 */ "label_tab_key",
+        /* 125 */ "label_to_phone_numeric_key",
+        /* 126 */ "label_to_phone_symbols_key",
+        /* 127 */ "label_time_am",
+        /* 128 */ "label_time_pm",
+        /* 129 */ "label_to_symbol_key_pcqwerty",
+        /* 130 */ "keylabel_for_popular_domain",
+        /* 131 */ "more_keys_for_popular_domain",
+        /* 132 */ "more_keys_for_smiley",
+        /* 133 */ "single_laqm_raqm",
+        /* 134 */ "single_laqm_raqm_rtl",
+        /* 135 */ "single_raqm_laqm",
+        /* 136 */ "double_laqm_raqm",
+        /* 137 */ "double_laqm_raqm_rtl",
+        /* 138 */ "double_raqm_laqm",
+        /* 139 */ "single_lqm_rqm",
+        /* 140 */ "single_9qm_lqm",
+        /* 141 */ "single_9qm_rqm",
+        /* 142 */ "double_lqm_rqm",
+        /* 143 */ "double_9qm_lqm",
+        /* 144 */ "double_9qm_rqm",
+        /* 145 */ "more_keys_for_single_quote",
+        /* 146 */ "more_keys_for_double_quote",
+        /* 147 */ "more_keys_for_tablet_double_quote",
     };
 
     private static final String EMPTY = "";
@@ -379,28 +377,24 @@
         /* 121 */ "!icon/shortcut_key|!code/key_shortcut",
         /* 122 */ "!hasLabels!,!text/label_next_key|!code/key_action_next",
         /* 123 */ "!hasLabels!,!text/label_previous_key|!code/key_action_previous",
-        // Label for "switch to more symbol" modifier key.  Must be short to fit on key!
-        /* 124 */ "= \\ <",
-        // Label for "switch to more symbol" modifier key on tablets.  Must be short to fit on key!
-        /* 125 */ "~ \\ {",
         // Label for "Tab" key.  Must be short to fit on key!
-        /* 126 */ "Tab",
+        /* 124 */ "Tab",
         // Label for "switch to phone numeric" key.  Must be short to fit on key!
-        /* 127 */ "123",
+        /* 125 */ "123",
         // Label for "switch to phone symbols" key.  Must be short to fit on key!
         // U+FF0A: "*" FULLWIDTH ASTERISK
         // U+FF03: "#" FULLWIDTH NUMBER SIGN
-        /* 128 */ "\uFF0A\uFF03",
+        /* 126 */ "\uFF0A\uFF03",
         // Key label for "ante meridiem"
-        /* 129 */ "AM",
+        /* 127 */ "AM",
         // Key label for "post meridiem"
-        /* 130 */ "PM",
+        /* 128 */ "PM",
         // Label for "switch to symbols" key on PC QWERTY layout
-        /* 131 */ "Sym",
-        /* 132 */ ".com",
+        /* 129 */ "Sym",
+        /* 130 */ ".com",
         // popular web domains for the locale - most popular, displayed on the keyboard
-        /* 133 */ "!hasLabels!,.net,.org,.gov,.edu",
-        /* 134 */ "!fixedColumnOrder!5,!hasLabels!,=-O|=-O ,:-P|:-P ,;-)|;-) ,:-(|:-( ,:-)|:-) ,:-!|:-! ,:-$|:-$ ,B-)|B-) ,:O|:O ,:-*|:-* ,:-D|:-D ,:\'(|:\'( ,:-\\\\|:-\\\\ ,O:-)|O:-) ,:-[|:-[ ",
+        /* 131 */ "!hasLabels!,.net,.org,.gov,.edu",
+        /* 132 */ "!fixedColumnOrder!5,!hasLabels!,=-O|=-O ,:-P|:-P ,;-)|;-) ,:-(|:-( ,:-)|:-) ,:-!|:-! ,:-$|:-$ ,B-)|B-) ,:O|:O ,:-*|:-* ,:-D|:-D ,:\'(|:\'( ,:-\\\\|:-\\\\ ,O:-)|O:-) ,:-[|:-[ ",
         // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
         // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
         // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
@@ -422,24 +416,24 @@
         // The following each quotation mark pair consist of
         // <opening quotation mark>, <closing quotation mark>
         // and is named after (single|double)_<opening quotation mark>_<closing quotation mark>.
-        /* 135 */ "\u2039,\u203A",
-        /* 136 */ "\u2039|\u203A,\u203A|\u2039",
-        /* 137 */ "\u203A,\u2039",
-        /* 138 */ "\u00AB,\u00BB",
-        /* 139 */ "\u00AB|\u00BB,\u00BB|\u00AB",
-        /* 140 */ "\u00BB,\u00AB",
+        /* 133 */ "\u2039,\u203A",
+        /* 134 */ "\u2039|\u203A,\u203A|\u2039",
+        /* 135 */ "\u203A,\u2039",
+        /* 136 */ "\u00AB,\u00BB",
+        /* 137 */ "\u00AB|\u00BB,\u00BB|\u00AB",
+        /* 138 */ "\u00BB,\u00AB",
         // The following each quotation mark triplet consists of
         // <another quotation mark>, <opening quotation mark>, <closing quotation mark>
         // and is named after (single|double)_<opening quotation mark>_<closing quotation mark>.
-        /* 141 */ "\u201A,\u2018,\u2019",
-        /* 142 */ "\u2019,\u201A,\u2018",
-        /* 143 */ "\u2018,\u201A,\u2019",
-        /* 144 */ "\u201E,\u201C,\u201D",
-        /* 145 */ "\u201D,\u201E,\u201C",
-        /* 146 */ "\u201C,\u201E,\u201D",
-        /* 147 */ "!fixedColumnOrder!5,!text/single_quotes,!text/single_angle_quotes",
-        /* 148 */ "!fixedColumnOrder!5,!text/double_quotes,!text/double_angle_quotes",
-        /* 149 */ "!fixedColumnOrder!6,!text/double_quotes,!text/single_quotes,!text/double_angle_quotes,!text/single_angle_quotes",
+        /* 139 */ "\u201A,\u2018,\u2019",
+        /* 140 */ "\u2019,\u201A,\u2018",
+        /* 141 */ "\u2018,\u201A,\u2019",
+        /* 142 */ "\u201E,\u201C,\u201D",
+        /* 143 */ "\u201D,\u201E,\u201C",
+        /* 144 */ "\u201C,\u201E,\u201D",
+        /* 145 */ "!fixedColumnOrder!5,!text/single_quotes,!text/single_angle_quotes",
+        /* 146 */ "!fixedColumnOrder!5,!text/double_quotes,!text/double_angle_quotes",
+        /* 147 */ "!fixedColumnOrder!6,!text/double_quotes,!text/single_quotes,!text/double_angle_quotes,!text/single_angle_quotes",
     };
 
     /* Language af: Afrikaans */
diff --git a/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java b/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
index 3725677..7124c4c 100644
--- a/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
@@ -23,6 +23,7 @@
 import com.android.inputmethod.annotations.UsedForTesting;
 import com.android.inputmethod.keyboard.ProximityInfo;
 import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
+import com.android.inputmethod.latin.personalization.DynamicPersonalizationDictionaryWriter;
 import com.android.inputmethod.latin.utils.CollectionUtils;
 
 import java.io.File;
@@ -118,10 +119,9 @@
     }
 
     private static AbstractDictionaryWriter getDictionaryWriter(final Context context,
-            final String dictType, final boolean isUpdatable) {
-        if (isUpdatable) {
-            // TODO: Employ dynamically updatable DictionaryWriter.
-            return new DictionaryWriter(context, dictType);
+            final String dictType, final boolean isDynamicPersonalizationDictionary) {
+        if (isDynamicPersonalizationDictionary) {
+            return new DynamicPersonalizationDictionaryWriter(context, dictType);
         } else {
             return new DictionaryWriter(context, dictType);
         }
@@ -145,6 +145,7 @@
         mIsUpdatable = isUpdatable;
         mBinaryDictionary = null;
         mSharedDictionaryController = getSharedDictionaryController(filename);
+        // Currently, only dynamic personalization dictionary is updatable.
         mDictionaryWriter = getDictionaryWriter(context, dictType, isUpdatable);
     }
 
diff --git a/java/src/com/android/inputmethod/latin/ExpandableDictionary.java b/java/src/com/android/inputmethod/latin/ExpandableDictionary.java
index fc87cfa..491964f 100644
--- a/java/src/com/android/inputmethod/latin/ExpandableDictionary.java
+++ b/java/src/com/android/inputmethod/latin/ExpandableDictionary.java
@@ -327,7 +327,7 @@
         return (node == null) ? false : !node.mShortcutOnly;
     }
 
-    protected boolean removeBigram(final String word1, final String word2) {
+    public boolean removeBigram(final String word1, final String word2) {
         // Refer to addOrSetBigram() about word1.toLowerCase()
         final Node firstWord = searchWord(mRoots, word1.toLowerCase(), 0, null);
         final Node secondWord = searchWord(mRoots, word2, 0, null);
@@ -359,7 +359,7 @@
         return (node == null) ? -1 : node.mFrequency;
     }
 
-    protected NextWord getBigramWord(final String word1, final String word2) {
+    public NextWord getBigramWord(final String word1, final String word2) {
         // Refer to addOrSetBigram() about word1.toLowerCase()
         final Node firstWord = searchWord(mRoots, word1.toLowerCase(), 0, null);
         final Node secondWord = searchWord(mRoots, word2, 0, null);
@@ -700,7 +700,7 @@
         return null;
     }
 
-    protected void clearDictionary() {
+    public void clearDictionary() {
         mRoots = new NodeArray();
     }
 
diff --git a/java/src/com/android/inputmethod/latin/personalization/DynamicPersonalizationDictionaryWriter.java b/java/src/com/android/inputmethod/latin/personalization/DynamicPersonalizationDictionaryWriter.java
new file mode 100644
index 0000000..a1d93ef
--- /dev/null
+++ b/java/src/com/android/inputmethod/latin/personalization/DynamicPersonalizationDictionaryWriter.java
@@ -0,0 +1,159 @@
+/*
+ * Copyright (C) 2013 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.android.inputmethod.latin.personalization;
+
+import android.content.Context;
+
+import com.android.inputmethod.keyboard.ProximityInfo;
+import com.android.inputmethod.latin.AbstractDictionaryWriter;
+import com.android.inputmethod.latin.ExpandableDictionary;
+import com.android.inputmethod.latin.WordComposer;
+import com.android.inputmethod.latin.ExpandableDictionary.NextWord;
+import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
+import com.android.inputmethod.latin.makedict.DictEncoder;
+import com.android.inputmethod.latin.makedict.FormatSpec;
+import com.android.inputmethod.latin.makedict.UnsupportedFormatException;
+import com.android.inputmethod.latin.utils.UserHistoryDictIOUtils;
+import com.android.inputmethod.latin.utils.UserHistoryDictIOUtils.BigramDictionaryInterface;
+import com.android.inputmethod.latin.utils.UserHistoryForgettingCurveUtils;
+import com.android.inputmethod.latin.utils.UserHistoryForgettingCurveUtils.ForgettingCurveParams;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+// Currently this class is used to implement dynamic prodiction dictionary.
+// TODO: Move to native code.
+public class DynamicPersonalizationDictionaryWriter extends AbstractDictionaryWriter {
+    private static final String TAG = DynamicPersonalizationDictionaryWriter.class.getSimpleName();
+    /** Maximum number of pairs. Pruning will start when databases goes above this number. */
+    public static final int MAX_HISTORY_BIGRAMS = 10000;
+
+    /** Any pair being typed or picked */
+    private static final int FREQUENCY_FOR_TYPED = 2;
+
+    private static final int BINARY_DICT_VERSION = 3;
+    private static final FormatSpec.FormatOptions FORMAT_OPTIONS =
+            new FormatSpec.FormatOptions(BINARY_DICT_VERSION, true /* supportsDynamicUpdate */);
+
+    private final UserHistoryDictionaryBigramList mBigramList =
+            new UserHistoryDictionaryBigramList();
+    private final ExpandableDictionary mExpandableDictionary;
+
+    public DynamicPersonalizationDictionaryWriter(final Context context, final String dictType) {
+        super(context, dictType);
+        mExpandableDictionary = new ExpandableDictionary(context, dictType);
+    }
+
+    @Override
+    public void clear() {
+        mBigramList.evictAll();
+        mExpandableDictionary.clearDictionary();
+    }
+
+    /**
+     * Adds a word unigram to the fusion dictionary. Call updateBinaryDictionary when all changes
+     * are done to update the binary dictionary.
+     */
+    @Override
+    public void addUnigramWord(final String word, final String shortcutTarget, final int frequency,
+            final boolean isNotAWord) {
+        mExpandableDictionary.addWord(word, shortcutTarget, frequency);
+        mBigramList.addBigram(null, word, (byte)frequency);
+    }
+
+    @Override
+    public void addBigramWords(final String word0, final String word1, final int frequency,
+            final boolean isValid, final long lastModifiedTime) {
+        if (lastModifiedTime > 0) {
+            mExpandableDictionary.setBigramAndGetFrequency(word0, word1,
+                    new ForgettingCurveParams(frequency, System.currentTimeMillis(),
+                            lastModifiedTime));
+            mBigramList.addBigram(word0, word1, (byte)frequency);
+        } else {
+            mExpandableDictionary.setBigramAndGetFrequency(word0, word1,
+                    new ForgettingCurveParams(isValid));
+            mBigramList.addBigram(word0, word1, (byte)frequency);
+        }
+    }
+
+    @Override
+    public void removeBigramWords(final String word0, final String word1) {
+        if (mBigramList.removeBigram(word0, word1)) {
+            mExpandableDictionary.removeBigram(word0, word1);
+        }
+    }
+
+    @Override
+    protected void writeDictionary(final DictEncoder dictEncoder)
+            throws IOException, UnsupportedFormatException {
+        UserHistoryDictIOUtils.writeDictionary(dictEncoder,
+                new FrequencyProvider(mBigramList, mExpandableDictionary), mBigramList,
+                        FORMAT_OPTIONS);
+    }
+
+    private static class FrequencyProvider implements BigramDictionaryInterface {
+        final private UserHistoryDictionaryBigramList mBigramList;
+        final private ExpandableDictionary mExpandableDictionary;
+
+        public FrequencyProvider(final UserHistoryDictionaryBigramList bigramList,
+                final ExpandableDictionary expandableDictionary) {
+            mBigramList = bigramList;
+            mExpandableDictionary = expandableDictionary;
+        }
+        @Override
+        public int getFrequency(final String word0, final String word1) {
+            final int freq;
+            if (word0 == null) { // unigram
+                freq = FREQUENCY_FOR_TYPED;
+            } else { // bigram
+                final NextWord nw = mExpandableDictionary.getBigramWord(word0, word1);
+                if (nw != null) {
+                    final ForgettingCurveParams forgettingCurveParams = nw.getFcParams();
+                    final byte prevFc = mBigramList.getBigrams(word0).get(word1);
+                    final byte fc = forgettingCurveParams.getFc();
+                    final boolean isValid = forgettingCurveParams.isValid();
+                    if (prevFc > 0 && prevFc == fc) {
+                        freq = fc & 0xFF;
+                    } else if (UserHistoryForgettingCurveUtils.
+                            needsToSave(fc, isValid, mBigramList.size() <= MAX_HISTORY_BIGRAMS)) {
+                        freq = fc & 0xFF;
+                    } else {
+                        // Delete this entry
+                        freq = -1;
+                    }
+                } else {
+                    // Delete this entry
+                    freq = -1;
+                }
+            }
+            return freq;
+        }
+    }
+
+    @Override
+    public ArrayList<SuggestedWordInfo> getSuggestions(final WordComposer composer,
+            final String prevWord, final ProximityInfo proximityInfo,
+            boolean blockOffensiveWords) {
+        return mExpandableDictionary.getSuggestions(composer, prevWord, proximityInfo,
+                blockOffensiveWords);
+    }
+
+    @Override
+    public boolean isValidWord(final String word) {
+        return mExpandableDictionary.isValidWord(word);
+    }
+}
diff --git a/java/src/com/android/inputmethod/research/ResearchLogger.java b/java/src/com/android/inputmethod/research/ResearchLogger.java
index 3a34082..da9c611 100644
--- a/java/src/com/android/inputmethod/research/ResearchLogger.java
+++ b/java/src/com/android/inputmethod/research/ResearchLogger.java
@@ -1427,7 +1427,7 @@
                 kid.navigateNext(), kid.navigatePrevious(), kid.mClobberSettingsKey,
                 isPasswordView, kid.mShortcutKeyEnabled, kid.mHasShortcutKey,
                 kid.mLanguageSwitchKeyEnabled, kid.isMultiLine(), keyboard.mOccupiedWidth,
-                keyboard.mOccupiedHeight, keyboard.mKeys);
+                keyboard.mOccupiedHeight, keyboard.getKeys());
     }
 
     /**
diff --git a/tools/make-keyboard-text/res/values/donottranslate-more-keys.xml b/tools/make-keyboard-text/res/values/donottranslate-more-keys.xml
index 349baba..fa9739b 100644
--- a/tools/make-keyboard-text/res/values/donottranslate-more-keys.xml
+++ b/tools/make-keyboard-text/res/values/donottranslate-more-keys.xml
@@ -185,10 +185,6 @@
     <string name="shortcut_as_more_key">!icon/shortcut_key|!code/key_shortcut</string>
     <string name="action_next_as_more_key">!hasLabels!,\@string/label_next_key|!code/key_action_next</string>
     <string name="action_previous_as_more_key">!hasLabels!,\@string/label_previous_key|!code/key_action_previous</string>
-    <!-- Label for "switch to more symbol" modifier key.  Must be short to fit on key! -->
-    <string name="label_to_more_symbol_key">= \\ &lt;</string>
-    <!-- Label for "switch to more symbol" modifier key on tablets.  Must be short to fit on key! -->
-    <string name="label_to_more_symbol_for_tablet_key">~ \\ {</string>
     <!-- Label for "Tab" key.  Must be short to fit on key! -->
     <string name="label_tab_key">Tab</string>
     <!-- Label for "switch to phone numeric" key.  Must be short to fit on key! -->