diff --git a/pico/AndroidManifest.xml b/pico/AndroidManifest.xml
index fcf6980..c8cb570 100755
--- a/pico/AndroidManifest.xml
+++ b/pico/AndroidManifest.xml
@@ -55,6 +55,13 @@
             </intent-filter>
         </activity>
 
+        <activity android:name=".EngineSettings" android:label="@string/app_name">
+            <intent-filter>
+                <action android:name="android.speech.tts.engine.CONFIGURE_ENGINE" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+
         <activity android:enabled="true" android:name=".Pico"
             android:hasCode="false" android:label="@string/app_name"
             android:theme="@android:style/Theme.Translucent.NoTitleBar">
diff --git a/pico/res/values/strings.xml b/pico/res/values/strings.xml
index f68995a..932403d 100755
--- a/pico/res/values/strings.xml
+++ b/pico/res/values/strings.xml
@@ -26,4 +26,6 @@
     <string name="deu_deu_sample">Dies ist ein Beispiel für Sprachsynthese in Deutsch mit Pico.</string>
     <string name="ita_ita_sample">Questo è un esempio di sintesi vocale in italiano con Pico.</string>
     <string name="spa_esp_sample">Este es un ejemplo de síntesis de voz en español con Pico.</string>
+    <string name="installed">Installed</string>
+    <string name="not_installed">Not Installed</string>
 </resources>
diff --git a/pico/res/xml/voices_list.xml b/pico/res/xml/voices_list.xml
new file mode 100755
index 0000000..3b7e640
--- /dev/null
+++ b/pico/res/xml/voices_list.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 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.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+        android:title="@string/app_name">
+
+        <Preference
+            android:key="eng-USA"
+            android:persistent="false" />
+        <Preference
+            android:key="eng-GBR"
+            android:persistent="false" />
+        <Preference
+            android:key="fra-FRA"
+            android:persistent="false" />
+        <Preference
+            android:key="ita-ITA"
+            android:persistent="false" />
+        <Preference
+            android:key="deu-DEU"
+            android:persistent="false" />
+        <Preference
+            android:key="spa-ESP"
+            android:persistent="false" />
+
+</PreferenceScreen>
diff --git a/pico/src/com/svox/pico/EngineSettings.java b/pico/src/com/svox/pico/EngineSettings.java
new file mode 100755
index 0000000..dee798a
--- /dev/null
+++ b/pico/src/com/svox/pico/EngineSettings.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2009 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.svox.pico;
+
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+import android.preference.Preference;
+import android.preference.PreferenceActivity;
+import android.preference.Preference.OnPreferenceClickListener;
+import android.util.Log;
+
+import java.util.ArrayList;
+import java.util.Locale;
+
+/*
+ * Checks if the voice data for the SVOX Pico Engine is present on the
+ * sd card.
+ */
+public class EngineSettings extends PreferenceActivity {
+    private final static String MARKET_URI_START = "market://search?q=pname:com.svox.pico.voice.";
+    private static final int VOICE_DATA_CHECK_CODE = 42;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        
+        Intent i = new Intent();
+        i.setClass(this, CheckVoiceData.class);
+        startActivityForResult(i, VOICE_DATA_CHECK_CODE);
+    }
+    
+    @Override
+    public void onActivityResult(int requestCode, int resultCode, Intent data){
+        if (requestCode == VOICE_DATA_CHECK_CODE){
+            ArrayList<String> available = data.getStringArrayListExtra("TextToSpeech.Engine.EXTRA_AVAILABLE_VOICES");
+            ArrayList<String> unavailable = data.getStringArrayListExtra("TextToSpeech.Engine.EXTRA_UNAVAILABLE_VOICES");
+
+            addPreferencesFromResource(R.xml.voices_list);
+            
+            for (int i = 0; i < available.size(); i++){
+                Log.e("debug", available.get(i));
+                String[] languageCountry = available.get(i).split("-");
+                Locale loc = new Locale(languageCountry[0], languageCountry[1]);
+                Preference pref = findPreference(available.get(i));
+                pref.setTitle(loc.getDisplayLanguage() + " (" + loc.getDisplayCountry() + ")");
+                pref.setSummary(R.string.installed);
+                pref.setEnabled(false);
+            }
+
+            
+            for (int i = 0; i < unavailable.size(); i++){
+                final String unavailableLang = unavailable.get(i);
+                String[] languageCountry = unavailableLang.split("-");
+                Locale loc = new Locale(languageCountry[0], languageCountry[1]);
+                Preference pref = findPreference(unavailableLang);
+                pref.setTitle(loc.getDisplayLanguage() + " (" + loc.getDisplayCountry() + ")");
+                pref.setSummary(R.string.not_installed);
+                pref.setEnabled(true);
+                pref.setOnPreferenceClickListener(new OnPreferenceClickListener(){
+                    public boolean onPreferenceClick(Preference preference) {
+                        Uri marketUri = Uri.parse(MARKET_URI_START + unavailableLang.toLowerCase().replace("-", "."));
+                        Intent marketIntent = new Intent(Intent.ACTION_VIEW, marketUri);
+                        startActivity(marketIntent);
+                        return false;
+                    }
+                });
+            }
+        }
+    }
+    
+
+}
