diff --git a/chips/src/com/android/ex/chips/RecipientAlternatesAdapter.java b/chips/src/com/android/ex/chips/RecipientAlternatesAdapter.java
index e3ef6cd..553890e 100644
--- a/chips/src/com/android/ex/chips/RecipientAlternatesAdapter.java
+++ b/chips/src/com/android/ex/chips/RecipientAlternatesAdapter.java
@@ -31,6 +31,7 @@
 
 import com.android.ex.chips.Queries.Query;
 
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
 
@@ -55,7 +56,7 @@
     private Query mQuery;
 
     public static HashMap<String, RecipientEntry> getMatchingRecipients(Context context,
-            String[] inAddresses) {
+            ArrayList<String> inAddresses) {
         return getMatchingRecipients(context, inAddresses, QUERY_TYPE_EMAIL);
     }
 
@@ -69,20 +70,20 @@
      * @return HashMap<String,RecipientEntry>
      */
     public static HashMap<String, RecipientEntry> getMatchingRecipients(Context context,
-            String[] inAddresses, int addressType) {
+            ArrayList<String> inAddresses, int addressType) {
         Queries.Query query;
         if (addressType == QUERY_TYPE_EMAIL) {
             query = Queries.EMAIL;
         } else {
             query = Queries.PHONE;
         }
-        int addressesSize = Math.min(MAX_LOOKUPS, inAddresses.length);
+        int addressesSize = Math.min(MAX_LOOKUPS, inAddresses.size());
         String[] addresses = new String[addressesSize];
         StringBuilder bindString = new StringBuilder();
         // Create the "?" string and set up arguments.
         for (int i = 0; i < addressesSize; i++) {
-            Rfc822Token[] tokens = Rfc822Tokenizer.tokenize(inAddresses[i].toLowerCase());
-            addresses[i] = (tokens.length > 0 ? tokens[0].getAddress() : inAddresses[i]);
+            Rfc822Token[] tokens = Rfc822Tokenizer.tokenize(inAddresses.get(i).toLowerCase());
+            addresses[i] = (tokens.length > 0 ? tokens[0].getAddress() : inAddresses.get(i));
             bindString.append("?");
             if (i < addressesSize - 1) {
                 bindString.append(",");
diff --git a/chips/src/com/android/ex/chips/RecipientEditTextView.java b/chips/src/com/android/ex/chips/RecipientEditTextView.java
index ac3caa8..1377ff0 100644
--- a/chips/src/com/android/ex/chips/RecipientEditTextView.java
+++ b/chips/src/com/android/ex/chips/RecipientEditTextView.java
@@ -995,8 +995,9 @@
      */
     @Override
     public boolean onKeyPreIme(int keyCode, KeyEvent event) {
-        if (keyCode == KeyEvent.KEYCODE_BACK) {
+        if (keyCode == KeyEvent.KEYCODE_BACK && mSelectedChip != null) {
             clearSelectedChip();
+            return true;
         }
         return super.onKeyPreIme(keyCode, event);
     }
@@ -1037,6 +1038,7 @@
                         return true;
                     }
                 }
+                break;
         }
         return super.onKeyUp(keyCode, event);
     }
@@ -2298,12 +2300,12 @@
             if (mRemovedSpans != null) {
                 originalRecipients.addAll(mRemovedSpans);
             }
-            String[] addresses = new String[originalRecipients.size()];
+            ArrayList<String> addresses = new ArrayList<String>();
             RecipientChip chip;
             for (int i = 0; i < originalRecipients.size(); i++) {
                 chip = originalRecipients.get(i);
                 if (chip != null) {
-                    addresses[i] = createAddressText(chip.getEntry());
+                    addresses.add(createAddressText(chip.getEntry()));
                 }
             }
             HashMap<String, RecipientEntry> entries = RecipientAlternatesAdapter
@@ -2363,12 +2365,12 @@
             // chip.
             final ArrayList<RecipientChip> originalRecipients =
                 (ArrayList<RecipientChip>) params[0];
-            String[] addresses = new String[originalRecipients.size()];
+            ArrayList<String> addresses = new ArrayList<String>();
             RecipientChip chip;
             for (int i = 0; i < originalRecipients.size(); i++) {
                 chip = originalRecipients.get(i);
                 if (chip != null) {
-                    addresses[i] = createAddressText(chip.getEntry());
+                    addresses.add(createAddressText(chip.getEntry()));
                 }
             }
             HashMap<String, RecipientEntry> entries = RecipientAlternatesAdapter
