diff --git a/native/jni/Android.mk b/native/jni/Android.mk
index ea35dab18b838121dc49a1a5b8e8d4b6daae2996..34b352433cff6592d40f293e642ae2382fee5bfc 100644
--- a/native/jni/Android.mk
+++ b/native/jni/Android.mk
@@ -49,9 +49,7 @@ LATIN_IME_CORE_SRC_FILES := \
     bigram_dictionary.cpp \
     char_utils.cpp \
     correction.cpp \
-    dictionary.cpp \
     dic_traverse_wrapper.cpp \
-    digraph_utils.cpp \
     unigram_dictionary.cpp \
     words_priority_queue.cpp \
     suggest/core/suggest.cpp \
@@ -59,6 +57,9 @@ LATIN_IME_CORE_SRC_FILES := \
         dic_node.cpp \
         dic_node_utils.cpp \
         dic_nodes_cache.cpp) \
+    $(addprefix suggest/core/dictionary/, \
+        dictionary.cpp \
+        digraph_utils.cpp) \
     $(addprefix suggest/core/layout/, \
         additional_proximity_chars.cpp \
         proximity_info.cpp \
diff --git a/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp b/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp
index 03b3c602867278094835da4edc7d38c26a18053b..9f5e2ae73fae18cace2e6f5ccf428590a3d5b0b4 100644
--- a/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp
+++ b/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp
@@ -29,13 +29,14 @@
 #include <cstdio> // for fopen() etc.
 #endif // USE_MMAP_FOR_DICTIONARY
 
-#include "binary_format.h"
 #include "com_android_inputmethod_latin_BinaryDictionary.h"
+
 #include "correction.h"
-#include "dictionary.h"
 #include "jni.h"
 #include "jni_common.h"
 #include "suggest_options.h"
+#include "suggest/core/dictionary/binary_format.h"
+#include "suggest/core/dictionary/dictionary.h"
 
 namespace latinime {
 
diff --git a/native/jni/src/bigram_dictionary.cpp b/native/jni/src/bigram_dictionary.cpp
index 9053e72260991e6fbd207c6c8ed698ba85c201d4..c592542bd0386623141a5efafc66813058b76c48 100644
--- a/native/jni/src/bigram_dictionary.cpp
+++ b/native/jni/src/bigram_dictionary.cpp
@@ -19,11 +19,12 @@
 #define LOG_TAG "LatinIME: bigram_dictionary.cpp"
 
 #include "bigram_dictionary.h"
-#include "binary_format.h"
-#include "bloom_filter.h"
+
 #include "char_utils.h"
 #include "defines.h"
-#include "dictionary.h"
+#include "suggest/core/dictionary/binary_format.h"
+#include "suggest/core/dictionary/bloom_filter.h"
+#include "suggest/core/dictionary/dictionary.h"
 
 namespace latinime {
 
diff --git a/native/jni/src/suggest/core/dicnode/dic_node.cpp b/native/jni/src/suggest/core/dicnode/dic_node.cpp
index 8c48c587bba14084dc356c1d80d638041afe3ff5..de088c7d0579d2700c028ff4d138ab1f671a55d3 100644
--- a/native/jni/src/suggest/core/dicnode/dic_node.cpp
+++ b/native/jni/src/suggest/core/dicnode/dic_node.cpp
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "dic_node.h"
+#include "suggest/core/dicnode/dic_node.h"
 
 namespace latinime {
 
diff --git a/native/jni/src/suggest/core/dicnode/dic_node.h b/native/jni/src/suggest/core/dicnode/dic_node.h
index 4225bb3e5c2c3e96bf073701817db8b1de12b9ea..1510e3d5e0674ecc12810ebbeb049866759636b2 100644
--- a/native/jni/src/suggest/core/dicnode/dic_node.h
+++ b/native/jni/src/suggest/core/dicnode/dic_node.h
@@ -19,11 +19,11 @@
 
 #include "char_utils.h"
 #include "defines.h"
-#include "dic_node_state.h"
-#include "dic_node_profiler.h"
-#include "dic_node_properties.h"
-#include "dic_node_release_listener.h"
-#include "digraph_utils.h"
+#include "suggest/core/dicnode/dic_node_state.h"
+#include "suggest/core/dicnode/dic_node_profiler.h"
+#include "suggest/core/dicnode/dic_node_properties.h"
+#include "suggest/core/dicnode/dic_node_release_listener.h"
+#include "suggest/core/dictionary/digraph_utils.h"
 
 #if DEBUG_DICT
 #define LOGI_SHOW_ADD_COST_PROP \
diff --git a/native/jni/src/suggest/core/dicnode/dic_node_priority_queue.h b/native/jni/src/suggest/core/dicnode/dic_node_priority_queue.h
index d3f28a8bd66e3b34baed6ceeaf32075e57455e79..970e3bda4c3ff2c18941aa63e5e097d077f7f07e 100644
--- a/native/jni/src/suggest/core/dicnode/dic_node_priority_queue.h
+++ b/native/jni/src/suggest/core/dicnode/dic_node_priority_queue.h
@@ -21,8 +21,8 @@
 #include <vector>
 
 #include "defines.h"
-#include "dic_node.h"
-#include "dic_node_release_listener.h"
+#include "suggest/core/dicnode/dic_node.h"
+#include "suggest/core/dicnode/dic_node_release_listener.h"
 
 #define MAX_DIC_NODE_PRIORITY_QUEUE_CAPACITY 200
 
diff --git a/native/jni/src/suggest/core/dicnode/dic_node_properties.h b/native/jni/src/suggest/core/dicnode/dic_node_properties.h
index 63a6b134039c32ee761a94935606e769e0a6bf3d..d2f87c10bb9797bc84d489acfdd446eaff2818f9 100644
--- a/native/jni/src/suggest/core/dicnode/dic_node_properties.h
+++ b/native/jni/src/suggest/core/dicnode/dic_node_properties.h
@@ -19,8 +19,8 @@
 
 #include <stdint.h>
 
-#include "binary_format.h"
 #include "defines.h"
+#include "suggest/core/dictionary/binary_format.h"
 
 namespace latinime {
 
diff --git a/native/jni/src/suggest/core/dicnode/dic_node_state.h b/native/jni/src/suggest/core/dicnode/dic_node_state.h
index 239b63c320b99401407517f5cce87ad2875a760b..d35e7d79f66cacc46aa215b99b31d6e11ce17f91 100644
--- a/native/jni/src/suggest/core/dicnode/dic_node_state.h
+++ b/native/jni/src/suggest/core/dicnode/dic_node_state.h
@@ -18,10 +18,10 @@
 #define LATINIME_DIC_NODE_STATE_H
 
 #include "defines.h"
-#include "dic_node_state_input.h"
-#include "dic_node_state_output.h"
-#include "dic_node_state_prevword.h"
-#include "dic_node_state_scoring.h"
+#include "suggest/core/dicnode/dic_node_state_input.h"
+#include "suggest/core/dicnode/dic_node_state_output.h"
+#include "suggest/core/dicnode/dic_node_state_prevword.h"
+#include "suggest/core/dicnode/dic_node_state_scoring.h"
 
 namespace latinime {
 
diff --git a/native/jni/src/suggest/core/dicnode/dic_node_state_prevword.h b/native/jni/src/suggest/core/dicnode/dic_node_state_prevword.h
index e3b892bdaa24f235d77294b40750e4cca74e9837..c3968c0906f602b9ed0361848acc389e1240010a 100644
--- a/native/jni/src/suggest/core/dicnode/dic_node_state_prevword.h
+++ b/native/jni/src/suggest/core/dicnode/dic_node_state_prevword.h
@@ -21,7 +21,7 @@
 #include <stdint.h>
 
 #include "defines.h"
-#include "dic_node_utils.h"
+#include "suggest/core/dicnode/dic_node_utils.h"
 
 namespace latinime {
 
diff --git a/native/jni/src/suggest/core/dicnode/dic_node_state_scoring.h b/native/jni/src/suggest/core/dicnode/dic_node_state_scoring.h
index dca9d60da4abbe9bc8bd60d4e3c8c566c62099c1..4c884225af922d4933a21050a6516933ba08b353 100644
--- a/native/jni/src/suggest/core/dicnode/dic_node_state_scoring.h
+++ b/native/jni/src/suggest/core/dicnode/dic_node_state_scoring.h
@@ -20,7 +20,7 @@
 #include <stdint.h>
 
 #include "defines.h"
-#include "digraph_utils.h"
+#include "suggest/core/dictionary/digraph_utils.h"
 
 namespace latinime {
 
diff --git a/native/jni/src/suggest/core/dicnode/dic_node_utils.cpp b/native/jni/src/suggest/core/dicnode/dic_node_utils.cpp
index 4fe4badc5f8eb58dafb8c888fd8cc870ba793bcd..7f0d0ed0ed54aebfe1431d796c52d5941cfc2e40 100644
--- a/native/jni/src/suggest/core/dicnode/dic_node_utils.cpp
+++ b/native/jni/src/suggest/core/dicnode/dic_node_utils.cpp
@@ -17,11 +17,11 @@
 #include <cstring>
 #include <vector>
 
-#include "binary_format.h"
-#include "dic_node.h"
-#include "dic_node_utils.h"
-#include "dic_node_vector.h"
-#include "multi_bigram_map.h"
+#include "suggest/core/dicnode/dic_node.h"
+#include "suggest/core/dicnode/dic_node_utils.h"
+#include "suggest/core/dicnode/dic_node_vector.h"
+#include "suggest/core/dictionary/binary_format.h"
+#include "suggest/core/dictionary/multi_bigram_map.h"
 #include "suggest/core/layout/proximity_info.h"
 #include "suggest/core/layout/proximity_info_state.h"
 
diff --git a/native/jni/src/suggest/core/dicnode/dic_node_vector.h b/native/jni/src/suggest/core/dicnode/dic_node_vector.h
index ca07edaee0b35084e6ff6efbdd5df178dc6dc44a..e23c411f011072fb6899f7887f64ee05e9336f89 100644
--- a/native/jni/src/suggest/core/dicnode/dic_node_vector.h
+++ b/native/jni/src/suggest/core/dicnode/dic_node_vector.h
@@ -20,7 +20,7 @@
 #include <vector>
 
 #include "defines.h"
-#include "dic_node.h"
+#include "suggest/core/dicnode/dic_node.h"
 
 namespace latinime {
 
diff --git a/native/jni/src/suggest/core/dicnode/dic_nodes_cache.cpp b/native/jni/src/suggest/core/dicnode/dic_nodes_cache.cpp
index b9a60780b8c23cfc0556a0f46a71be29fc41de2a..c3d2a2e74480395d8aed308ab41a53d3292d2e61 100644
--- a/native/jni/src/suggest/core/dicnode/dic_nodes_cache.cpp
+++ b/native/jni/src/suggest/core/dicnode/dic_nodes_cache.cpp
@@ -17,9 +17,9 @@
 #include <list>
 
 #include "defines.h"
-#include "dic_node_priority_queue.h"
-#include "dic_node_utils.h"
-#include "dic_nodes_cache.h"
+#include "suggest/core/dicnode/dic_node_priority_queue.h"
+#include "suggest/core/dicnode/dic_node_utils.h"
+#include "suggest/core/dicnode/dic_nodes_cache.h"
 
 namespace latinime {
 
diff --git a/native/jni/src/suggest/core/dicnode/dic_nodes_cache.h b/native/jni/src/suggest/core/dicnode/dic_nodes_cache.h
index a62aa422ad0614bb46126c242304c572dec01944..7f5bdbcf62abcb5d1537c97c3430ec2f06f42d47 100644
--- a/native/jni/src/suggest/core/dicnode/dic_nodes_cache.h
+++ b/native/jni/src/suggest/core/dicnode/dic_nodes_cache.h
@@ -20,7 +20,7 @@
 #include <stdint.h>
 
 #include "defines.h"
-#include "dic_node_priority_queue.h"
+#include "suggest/core/dicnode/dic_node_priority_queue.h"
 
 #define INITIAL_QUEUE_ID_ACTIVE 0
 #define INITIAL_QUEUE_ID_NEXT_ACTIVE 1
diff --git a/native/jni/src/binary_format.h b/native/jni/src/suggest/core/dictionary/binary_format.h
similarity index 99%
rename from native/jni/src/binary_format.h
rename to native/jni/src/suggest/core/dictionary/binary_format.h
index 98241532f52fb627574d7a7c824d0dd28b904c5a..65c2e91158234131179722e6cb9195bac673588c 100644
--- a/native/jni/src/binary_format.h
+++ b/native/jni/src/suggest/core/dictionary/binary_format.h
@@ -21,9 +21,9 @@
 #include <map>
 #include <stdint.h>
 
-#include "bloom_filter.h"
 #include "char_utils.h"
 #include "hash_map_compat.h"
+#include "suggest/core/dictionary/bloom_filter.h"
 
 namespace latinime {
 
diff --git a/native/jni/src/bloom_filter.h b/native/jni/src/suggest/core/dictionary/bloom_filter.h
similarity index 100%
rename from native/jni/src/bloom_filter.h
rename to native/jni/src/suggest/core/dictionary/bloom_filter.h
diff --git a/native/jni/src/dictionary.cpp b/native/jni/src/suggest/core/dictionary/dictionary.cpp
similarity index 97%
rename from native/jni/src/dictionary.cpp
rename to native/jni/src/suggest/core/dictionary/dictionary.cpp
index d9ed0fe493b25178a7bcd1b77de1e980ad6f21b0..1939c74200171da6e2eb1d57bb39ba4be020c581 100644
--- a/native/jni/src/dictionary.cpp
+++ b/native/jni/src/suggest/core/dictionary/dictionary.cpp
@@ -16,17 +16,17 @@
 
 #define LOG_TAG "LatinIME: dictionary.cpp"
 
-#include "dictionary.h"
+#include "suggest/core/dictionary/dictionary.h"
 
 #include <map> // TODO: remove
 #include <stdint.h>
 
 #include "bigram_dictionary.h"
-#include "binary_format.h"
 #include "defines.h"
 #include "dic_traverse_wrapper.h"
 #include "suggest_options.h"
 #include "suggest/core/suggest.h"
+#include "suggest/core/dictionary/binary_format.h"
 #include "suggest/policyimpl/gesture/gesture_suggest_policy_factory.h"
 #include "suggest/policyimpl/typing/typing_suggest_policy_factory.h"
 #include "unigram_dictionary.h"
diff --git a/native/jni/src/dictionary.h b/native/jni/src/suggest/core/dictionary/dictionary.h
similarity index 100%
rename from native/jni/src/dictionary.h
rename to native/jni/src/suggest/core/dictionary/dictionary.h
diff --git a/native/jni/src/digraph_utils.cpp b/native/jni/src/suggest/core/dictionary/digraph_utils.cpp
similarity index 98%
rename from native/jni/src/digraph_utils.cpp
rename to native/jni/src/suggest/core/dictionary/digraph_utils.cpp
index 083442669e0e11fa2bad661516f0009f44966b2e..7a0f755e59a24e917339e058528889c55e448efb 100644
--- a/native/jni/src/digraph_utils.cpp
+++ b/native/jni/src/suggest/core/dictionary/digraph_utils.cpp
@@ -14,10 +14,11 @@
  * limitations under the License.
  */
 
+#include "suggest/core/dictionary/digraph_utils.h"
+
 #include "char_utils.h"
-#include "binary_format.h"
 #include "defines.h"
-#include "digraph_utils.h"
+#include "suggest/core/dictionary/binary_format.h"
 
 namespace latinime {
 
diff --git a/native/jni/src/digraph_utils.h b/native/jni/src/suggest/core/dictionary/digraph_utils.h
similarity index 99%
rename from native/jni/src/digraph_utils.h
rename to native/jni/src/suggest/core/dictionary/digraph_utils.h
index 94435228e70c56e4fcc4ac17a67bf033aa454b74..c1205940c3430365aef43230faa3d624ef705e62 100644
--- a/native/jni/src/digraph_utils.h
+++ b/native/jni/src/suggest/core/dictionary/digraph_utils.h
@@ -17,6 +17,8 @@
 #ifndef DIGRAPH_UTILS_H
 #define DIGRAPH_UTILS_H
 
+#include "defines.h"
+
 namespace latinime {
 
 class DigraphUtils {
diff --git a/native/jni/src/multi_bigram_map.h b/native/jni/src/suggest/core/dictionary/multi_bigram_map.h
similarity index 98%
rename from native/jni/src/multi_bigram_map.h
rename to native/jni/src/suggest/core/dictionary/multi_bigram_map.h
index 7e1b6301f8b8ec89aa8791c846f6bbca4eaed512..fcac98f35c583f9c5b2168731a960939d39e45c9 100644
--- a/native/jni/src/multi_bigram_map.h
+++ b/native/jni/src/suggest/core/dictionary/multi_bigram_map.h
@@ -17,12 +17,11 @@
 #ifndef LATINIME_MULTI_BIGRAM_MAP_H
 #define LATINIME_MULTI_BIGRAM_MAP_H
 
-#include <cstring>
 #include <stdint.h>
 
 #include "defines.h"
-#include "binary_format.h"
 #include "hash_map_compat.h"
+#include "suggest/core/dictionary/binary_format.h"
 
 namespace latinime {
 
diff --git a/native/jni/src/suggest/core/dictionary/shortcut_utils.h b/native/jni/src/suggest/core/dictionary/shortcut_utils.h
index c411408ec43343b6ab01ccd75e7c9a7803ff8a6b..601ac5f5ad6e5c80b30fb15f38ac62eb9b0f39c1 100644
--- a/native/jni/src/suggest/core/dictionary/shortcut_utils.h
+++ b/native/jni/src/suggest/core/dictionary/shortcut_utils.h
@@ -19,7 +19,7 @@
 
 #include "defines.h"
 #include "suggest/core/dicnode/dic_node_utils.h"
-#include "terminal_attributes.h"
+#include "suggest/core/dictionary/terminal_attributes.h"
 
 namespace latinime {
 
diff --git a/native/jni/src/terminal_attributes.h b/native/jni/src/suggest/core/dictionary/terminal_attributes.h
similarity index 98%
rename from native/jni/src/terminal_attributes.h
rename to native/jni/src/suggest/core/dictionary/terminal_attributes.h
index 92ef71c2c85c905c7fd4822afecf200e9c12a799..8377c603da93836e9e7a2e7acd27624952ae07d1 100644
--- a/native/jni/src/terminal_attributes.h
+++ b/native/jni/src/suggest/core/dictionary/terminal_attributes.h
@@ -18,7 +18,8 @@
 #define LATINIME_TERMINAL_ATTRIBUTES_H
 
 #include <stdint.h>
-#include "binary_format.h"
+
+#include "suggest/core/dictionary/binary_format.h"
 
 namespace latinime {
 
diff --git a/native/jni/src/suggest/core/layout/touch_position_correction_utils.h b/native/jni/src/suggest/core/layout/touch_position_correction_utils.h
index e7a8cae58cfb1ea9161d005bc7fc634dcaa1eadf..429dcae0d84f8a03e4e99c350aa2d3a99f86ccbc 100644
--- a/native/jni/src/suggest/core/layout/touch_position_correction_utils.h
+++ b/native/jni/src/suggest/core/layout/touch_position_correction_utils.h
@@ -18,7 +18,7 @@
 #define LATINIME_TOUCH_POSITION_CORRECTION_UTILS_H
 
 #include "defines.h"
-#include "proximity_info_params.h"
+#include "suggest/core/layout/proximity_info_params.h"
 
 namespace latinime {
 class TouchPositionCorrectionUtils {
diff --git a/native/jni/src/suggest/core/session/dic_traverse_session.cpp b/native/jni/src/suggest/core/session/dic_traverse_session.cpp
index f9f1c0915184145f9baa47336251b936600680d0..4e634500c04363306b4f1fd23de6646bd6f06a07 100644
--- a/native/jni/src/suggest/core/session/dic_traverse_session.cpp
+++ b/native/jni/src/suggest/core/session/dic_traverse_session.cpp
@@ -16,12 +16,12 @@
 
 #include "suggest/core/session/dic_traverse_session.h"
 
-#include "binary_format.h"
 #include "defines.h"
-#include "dictionary.h"
 #include "dic_traverse_wrapper.h"
 #include "jni.h"
 #include "suggest/core/dicnode/dic_node_utils.h"
+#include "suggest/core/dictionary/binary_format.h"
+#include "suggest/core/dictionary/dictionary.h"
 
 namespace latinime {
 
diff --git a/native/jni/src/suggest/core/session/dic_traverse_session.h b/native/jni/src/suggest/core/session/dic_traverse_session.h
index c774eae71653820e3886c2bac3cfd6fad207e3b5..e5c7f8e0c3f4d2edd64c4cff9c2faeec7060fb6a 100644
--- a/native/jni/src/suggest/core/session/dic_traverse_session.h
+++ b/native/jni/src/suggest/core/session/dic_traverse_session.h
@@ -22,8 +22,8 @@
 
 #include "defines.h"
 #include "jni.h"
-#include "multi_bigram_map.h"
 #include "suggest/core/dicnode/dic_nodes_cache.h"
+#include "suggest/core/dictionary/multi_bigram_map.h"
 #include "suggest/core/layout/proximity_info_state.h"
 
 namespace latinime {
diff --git a/native/jni/src/suggest/core/suggest.cpp b/native/jni/src/suggest/core/suggest.cpp
index 8fe8fbc957f7754027e63acbc81a790b404b570f..94441877ad6f32d521ca2d012d9eb11f7084c020 100644
--- a/native/jni/src/suggest/core/suggest.cpp
+++ b/native/jni/src/suggest/core/suggest.cpp
@@ -17,18 +17,18 @@
 #include "suggest/core/suggest.h"
 
 #include "char_utils.h"
-#include "dictionary.h"
-#include "digraph_utils.h"
 #include "suggest/core/dicnode/dic_node.h"
 #include "suggest/core/dicnode/dic_node_priority_queue.h"
 #include "suggest/core/dicnode/dic_node_vector.h"
+#include "suggest/core/dictionary/dictionary.h"
+#include "suggest/core/dictionary/digraph_utils.h"
 #include "suggest/core/dictionary/shortcut_utils.h"
+#include "suggest/core/dictionary/terminal_attributes.h"
 #include "suggest/core/layout/proximity_info.h"
 #include "suggest/core/policy/scoring.h"
 #include "suggest/core/policy/traversal.h"
 #include "suggest/core/policy/weighting.h"
 #include "suggest/core/session/dic_traverse_session.h"
-#include "terminal_attributes.h"
 
 namespace latinime {
 
diff --git a/native/jni/src/unigram_dictionary.cpp b/native/jni/src/unigram_dictionary.cpp
index 08cd7b7fd9708b3bc48bb637412877bf150ee243..1133256c43557b9687d0d4ed928d4fe8e7786803 100644
--- a/native/jni/src/unigram_dictionary.cpp
+++ b/native/jni/src/unigram_dictionary.cpp
@@ -18,13 +18,13 @@
 
 #define LOG_TAG "LatinIME: unigram_dictionary.cpp"
 
-#include "binary_format.h"
 #include "char_utils.h"
 #include "defines.h"
-#include "dictionary.h"
-#include "digraph_utils.h"
+#include "suggest/core/dictionary/binary_format.h"
+#include "suggest/core/dictionary/dictionary.h"
+#include "suggest/core/dictionary/digraph_utils.h"
+#include "suggest/core/dictionary/terminal_attributes.h"
 #include "suggest/core/layout/proximity_info.h"
-#include "terminal_attributes.h"
 #include "unigram_dictionary.h"
 #include "words_priority_queue.h"
 #include "words_priority_queue_pool.h"
diff --git a/native/jni/src/unigram_dictionary.h b/native/jni/src/unigram_dictionary.h
index a64a539bd6ed2f7c414713958a6f06c3b135af2a..a50503256757324c9fef57b3458ea64869651888 100644
--- a/native/jni/src/unigram_dictionary.h
+++ b/native/jni/src/unigram_dictionary.h
@@ -19,8 +19,9 @@
 
 #include <map>
 #include <stdint.h>
+
 #include "defines.h"
-#include "digraph_utils.h"
+#include "suggest/core/dictionary/digraph_utils.h"
 
 namespace latinime {