diff --git a/java/res/values/donottranslate-debug-settings.xml b/java/res/values/donottranslate-debug-settings.xml
index 491043f..9df73ae 100644
--- a/java/res/values/donottranslate-debug-settings.xml
+++ b/java/res/values/donottranslate-debug-settings.xml
@@ -41,20 +41,10 @@
     <string name="prefs_key_popup_dismiss_end_x_scale_settings">Key popup dismiss end X scale</string>
     <!-- Title of the settings for key popup dismiss animation end Y-scale (in percentile) [CHAR LIMIT=35] -->
     <string name="prefs_key_popup_dismiss_end_y_scale_settings">Key popup dismiss end Y scale</string>
-    <!-- Title of the settings for reading an external dictionary file -->
-    <string name="prefs_read_external_dictionary">Read external dictionary file</string>
     <!-- Title of the settings to enable keyboard resizing -->
     <string name="prefs_resize_keyboard">Enable keyboard resizing</string>
     <!-- Title of the settings for setting keyboard height -->
     <string name="prefs_keyboard_height_scale">Keyboard height scale</string>
-    <!-- Message to show when there are no files to install as an external dictionary [CHAR LIMIT=100] -->
-    <string name="read_external_dictionary_no_files_message">No dictionary files in the Downloads folder</string>
-    <!-- Title of the dialog that selects a file to install as an external dictionary [CHAR LIMIT=50] -->
-    <string name="read_external_dictionary_multiple_files_title">Select a dictionary file to install</string>
-    <!-- Title of the confirmation dialog to install a file as an external dictionary [CHAR LIMIT=50] -->
-    <string name="read_external_dictionary_confirm_install_message">Really install this file for <xliff:g id="LANGUAGE_NAME" example="English">%s</xliff:g>?</string>
-    <!-- Title for an error dialog that contains the details of the error in the body [CHAR LIMIT=80] -->
-    <string name="read_external_dictionary_error">There was an error</string>
     <!-- Title of the settings group for dumpping dictionary files that have been created on the device [CHAR LIMIT=35] -->
     <string name="prefs_dump_dynamic_dicts">Dump dictionary</string>
 </resources>
diff --git a/java/res/xml/prefs_screen_debug.xml b/java/res/xml/prefs_screen_debug.xml
index 905bc04..1ae2d0e 100644
--- a/java/res/xml/prefs_screen_debug.xml
+++ b/java/res/xml/prefs_screen_debug.xml
@@ -87,9 +87,6 @@
         android:title="@string/prefs_keyboard_height_scale"
         latin:minValue="50"
         latin:maxValue="120" /> <!-- percentage -->
-    <PreferenceScreen
-        android:key="read_external_dictionary"
-        android:title="@string/prefs_read_external_dictionary" />
     <PreferenceCategory
         android:key="pref_key_dump_dictionaries"
         android:title="@string/prefs_dump_dynamic_dicts">
diff --git a/java/src/com/android/inputmethod/latin/debug/ExternalDictionaryGetterForDebug.java b/java/src/com/android/inputmethod/latin/debug/ExternalDictionaryGetterForDebug.java
deleted file mode 100644
index 8cc3552..0000000
--- a/java/src/com/android/inputmethod/latin/debug/ExternalDictionaryGetterForDebug.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * 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.debug;
-
-import android.app.AlertDialog;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.DialogInterface.OnCancelListener;
-import android.content.DialogInterface.OnClickListener;
-import android.os.Environment;
-
-import com.android.inputmethod.latin.BinaryDictionaryFileDumper;
-import com.android.inputmethod.latin.BinaryDictionaryGetter;
-import com.android.inputmethod.latin.R;
-import com.android.inputmethod.latin.common.LocaleUtils;
-import com.android.inputmethod.latin.makedict.DictionaryHeader;
-import com.android.inputmethod.latin.utils.DialogUtils;
-import com.android.inputmethod.latin.utils.DictionaryInfoUtils;
-
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Locale;
-
-/**
- * A class to read a local file as a dictionary for debugging purposes.
- */
-public class ExternalDictionaryGetterForDebug {
-    static final String SOURCE_FOLDER = Environment.getExternalStorageDirectory().getPath()
-            + "/Download";
-
-    private static String[] findDictionariesInTheDownloadedFolder() {
-        final File[] files = new File(SOURCE_FOLDER).listFiles();
-        final ArrayList<String> eligibleList = new ArrayList<>();
-        for (File f : files) {
-            final DictionaryHeader header = DictionaryInfoUtils.getDictionaryFileHeaderOrNull(f);
-            if (null == header) continue;
-            eligibleList.add(f.getName());
-        }
-        return eligibleList.toArray(new String[0]);
-    }
-
-    public static void chooseAndInstallDictionary(final Context context) {
-        final String[] fileNames = findDictionariesInTheDownloadedFolder();
-        if (0 == fileNames.length) {
-            showNoFileDialog(context);
-        } else if (1 == fileNames.length) {
-            askInstallFile(context, SOURCE_FOLDER, fileNames[0], null /* completeRunnable */);
-        } else {
-            showChooseFileDialog(context, fileNames);
-        }
-    }
-
-    private static void showNoFileDialog(final Context context) {
-        new AlertDialog.Builder(DialogUtils.getPlatformDialogThemeContext(context))
-                .setMessage(R.string.read_external_dictionary_no_files_message)
-                .setPositiveButton(android.R.string.ok, new OnClickListener() {
-                    @Override
-                    public void onClick(final DialogInterface dialog, final int which) {
-                        dialog.dismiss();
-                    }
-                }).create().show();
-    }
-
-    private static void showChooseFileDialog(final Context context, final String[] fileNames) {
-        new AlertDialog.Builder(DialogUtils.getPlatformDialogThemeContext(context))
-                .setTitle(R.string.read_external_dictionary_multiple_files_title)
-                .setItems(fileNames, new OnClickListener() {
-                    @Override
-                    public void onClick(final DialogInterface dialog, final int which) {
-                        askInstallFile(context, SOURCE_FOLDER, fileNames[which],
-                                null /* completeRunnable */);
-                    }
-                })
-                .create().show();
-    }
-
-    /**
-     * Shows a dialog which offers the user to install the external dictionary.
-     */
-    public static void askInstallFile(final Context context, final String dirPath,
-            final String fileName, final Runnable completeRunnable) {
-        final File file = new File(dirPath, fileName.toString());
-        final DictionaryHeader header = DictionaryInfoUtils.getDictionaryFileHeaderOrNull(file);
-        final StringBuilder message = new StringBuilder();
-        final String localeString = header.mLocaleString;
-        for (final String key : header.mDictionaryOptions.mAttributes.keySet()) {
-            message.append(key + " = " + header.mDictionaryOptions.mAttributes.get(key));
-            message.append("\n");
-        }
-        final String languageName = LocaleUtils.constructLocaleFromString(localeString)
-                .getDisplayName(Locale.getDefault());
-        final String title = String.format(
-                context.getString(R.string.read_external_dictionary_confirm_install_message),
-                languageName);
-        new AlertDialog.Builder(DialogUtils.getPlatformDialogThemeContext(context))
-                .setTitle(title)
-                .setMessage(message)
-                .setNegativeButton(android.R.string.cancel, new OnClickListener() {
-                    @Override
-                    public void onClick(final DialogInterface dialog, final int which) {
-                        dialog.dismiss();
-                        if (completeRunnable != null) {
-                            completeRunnable.run();
-                        }
-                    }
-                }).setPositiveButton(android.R.string.ok, new OnClickListener() {
-                    @Override
-                    public void onClick(final DialogInterface dialog, final int which) {
-                        installFile(context, file, header);
-                        dialog.dismiss();
-                        if (completeRunnable != null) {
-                            completeRunnable.run();
-                        }
-                    }
-                }).setOnCancelListener(new OnCancelListener() {
-                    @Override
-                    public void onCancel(DialogInterface dialog) {
-                        // Canceled by the user by hitting the back key
-                        if (completeRunnable != null) {
-                            completeRunnable.run();
-                        }
-                    }
-                }).create().show();
-    }
-
-    static void installFile(final Context context, final File file, final DictionaryHeader header) {
-        BufferedOutputStream outputStream = null;
-        File tempFile = null;
-        try {
-            final String localeString = header.mLocaleString;
-            // Create the id for a main dictionary for this locale
-            final String id = BinaryDictionaryGetter.MAIN_DICTIONARY_CATEGORY
-                    + BinaryDictionaryGetter.ID_CATEGORY_SEPARATOR + localeString;
-            final String finalFileName = DictionaryInfoUtils.getCacheFileName(
-                    id, localeString, context);
-            final String tempFileName = BinaryDictionaryGetter.getTempFileName(id, context);
-            tempFile = new File(tempFileName);
-            tempFile.delete();
-            outputStream = new BufferedOutputStream(new FileOutputStream(tempFile));
-            final BufferedInputStream bufferedStream = new BufferedInputStream(
-                    new FileInputStream(file));
-            BinaryDictionaryFileDumper.checkMagicAndCopyFileTo(bufferedStream, outputStream);
-            outputStream.flush();
-            final File finalFile = new File(finalFileName);
-            finalFile.delete();
-            if (!tempFile.renameTo(finalFile)) {
-                throw new IOException("Can't move the file to its final name");
-            }
-        } catch (IOException e) {
-            // There was an error: show a dialog
-            new AlertDialog.Builder(DialogUtils.getPlatformDialogThemeContext(context))
-                    .setTitle(R.string.read_external_dictionary_error)
-                    .setMessage(e.toString())
-                    .setPositiveButton(android.R.string.ok, new OnClickListener() {
-                        @Override
-                        public void onClick(final DialogInterface dialog, final int which) {
-                            dialog.dismiss();
-                        }
-                    }).create().show();
-            return;
-        } finally {
-            try {
-                if (null != outputStream) outputStream.close();
-                if (null != tempFile) tempFile.delete();
-            } catch (IOException e) {
-                // Don't do anything
-            }
-        }
-    }
-}
diff --git a/java/src/com/android/inputmethod/latin/settings/DebugSettingsFragment.java b/java/src/com/android/inputmethod/latin/settings/DebugSettingsFragment.java
index a56de1f..3785537 100644
--- a/java/src/com/android/inputmethod/latin/settings/DebugSettingsFragment.java
+++ b/java/src/com/android/inputmethod/latin/settings/DebugSettingsFragment.java
@@ -30,7 +30,6 @@
 import com.android.inputmethod.latin.DictionaryDumpBroadcastReceiver;
 import com.android.inputmethod.latin.DictionaryFacilitatorImpl;
 import com.android.inputmethod.latin.R;
-import com.android.inputmethod.latin.debug.ExternalDictionaryGetterForDebug;
 import com.android.inputmethod.latin.utils.ApplicationUtils;
 import com.android.inputmethod.latin.utils.ResourceUtils;
 
@@ -43,12 +42,10 @@
  */
 public final class DebugSettingsFragment extends SubScreenFragment
         implements OnPreferenceClickListener {
-    private static final String PREF_READ_EXTERNAL_DICTIONARY = "read_external_dictionary";
     private static final String PREF_KEY_DUMP_DICTS = "pref_key_dump_dictionaries";
     private static final String PREF_KEY_DUMP_DICT_PREFIX = "pref_key_dump_dictionaries";
 
     private boolean mServiceNeedsRestart = false;
-    private Preference mReadExternalDictionaryPref;
     private TwoStatePreference mDebugMode;
 
     @Override
@@ -60,11 +57,6 @@
             removePreference(DebugSettings.PREF_SHOULD_SHOW_LXX_SUGGESTION_UI);
         }
 
-        mReadExternalDictionaryPref = findPreference(PREF_READ_EXTERNAL_DICTIONARY);
-        if (mReadExternalDictionaryPref != null) {
-            mReadExternalDictionaryPref.setOnPreferenceClickListener(this);
-        }
-
         final PreferenceGroup dictDumpPreferenceGroup =
                 (PreferenceGroup)findPreference(PREF_KEY_DUMP_DICTS);
         for (final String dictName : DictionaryFacilitatorImpl.DICT_TYPE_TO_CLASS.keySet()) {
@@ -111,11 +103,6 @@
     @Override
     public boolean onPreferenceClick(final Preference pref) {
         final Context context = getActivity();
-        if (pref == mReadExternalDictionaryPref) {
-            ExternalDictionaryGetterForDebug.chooseAndInstallDictionary(context);
-            mServiceNeedsRestart = true;
-            return true;
-        }
         if (pref instanceof DictDumpPreference) {
             final DictDumpPreference dictDumpPref = (DictDumpPreference)pref;
             final String dictName = dictDumpPref.mDictName;
