diff --git a/res/values/ids.xml b/res/values/ids.xml
index 3da8741..f84da9c 100644
--- a/res/values/ids.xml
+++ b/res/values/ids.xml
@@ -47,7 +47,7 @@
     <item type="id" name="dialog_select_import_type"/>
     <item type="id" name="dialog_select_one_vcard"/>
     <item type="id" name="dialog_select_multiple_vcard"/>
-    <item type="id" name="dialog_reading_vcard"/>
+    <item type="id" name="dialog_cache_vcard"/>
     <item type="id" name="dialog_io_exception"/>
     <item type="id" name="dialog_error_with_message"/>
 
diff --git a/res/values/strings.xml b/res/values/strings.xml
index e95dc3c..452b72a 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -717,6 +717,9 @@
          (with extension ".vcf" in SDCard.) -->
     <string name="fail_reason_no_vcard_file">No vCard file found on the SD card</string>
 
+    <!-- Fail reason shown when vCard importer failed to look over meta information stored in vCard file(s). -->
+    <string name="fail_reason_failed_to_collect_vcard_meta_info">Failed to collect meta information of given vCard file(s).</string>
+
     <!-- The failed reason shown when the import of some of vCard files failed during multiple vCard
          files import. It includes the case where all files were failed to be imported. -->
     <string name="fail_reason_failed_to_read_files">One or more files failed to be imported (%s).</string>
@@ -727,6 +730,14 @@
     <!-- Dialog title shown when a user is asked to select vCard file -->
     <string name="select_vcard_title">Select vCard file</string>
 
+    <!-- The title shown when vCard importer is caching files to be imported into local temporary
+         data storage. -->
+    <string name="caching_vcard_title">Caching vCard(s) to local temporary storage</string>
+
+    <!-- The message shown when vCard importer is caching files to be imported into local temporary
+         data storage. -->
+    <string name="caching_vcard_message">Importer is caching vCard(s) to local temporary storage. Actual import will start soon.</string>
+
     <!-- The message shown while reading vCard(s).
          First argument is current index of contacts to be imported.
          Second argument is the total number of contacts.
diff --git a/src/com/android/contacts/ImportVCardActivity.java b/src/com/android/contacts/ImportVCardActivity.java
index 7ad9228..164f539 100644
--- a/src/com/android/contacts/ImportVCardActivity.java
+++ b/src/com/android/contacts/ImportVCardActivity.java
@@ -21,6 +21,7 @@
 import android.app.AlertDialog;
 import android.app.Dialog;
 import android.app.ProgressDialog;
+import android.content.ContentResolver;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
@@ -39,12 +40,29 @@
 
 import com.android.contacts.model.Sources;
 import com.android.contacts.util.AccountSelectionUtil;
+import com.android.vcard.VCardEntryCounter;
+import com.android.vcard.VCardInterpreterCollection;
+import com.android.vcard.VCardParser;
+import com.android.vcard.VCardParser_V21;
+import com.android.vcard.VCardParser_V30;
+import com.android.vcard.VCardSourceDetector;
+import com.android.vcard.exception.VCardException;
+import com.android.vcard.exception.VCardNestedException;
+import com.android.vcard.exception.VCardNotSupportedException;
+import com.android.vcard.exception.VCardVersionException;
 
 import java.io.File;
 import java.io.IOException;
+import java.io.InputStream;
+import java.nio.ByteBuffer;
+import java.nio.channels.Channel;
+import java.nio.channels.Channels;
+import java.nio.channels.ReadableByteChannel;
+import java.nio.channels.WritableByteChannel;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Date;
 import java.util.HashSet;
 import java.util.List;
@@ -67,7 +85,11 @@
 
     private static final int SELECT_ACCOUNT = 0;
 
-    /* package */ static final String VCARD_URI_ARRAY = "vcard_uri_array";
+    /* package */ static final String VCARD_URI_ARRAY = "vcard_uri";
+    /* package */ static final String ESTIMATED_VCARD_TYPE_ARRAY = "estimated_vcard_type";
+    /* package */ static final String ESTIMATED_CHARSET_ARRAY = "estimated_charset";
+    /* package */ static final String USE_V30_ARRAY = "use_v30";
+    /* package */ static final String ENTRY_COUNT_ARRAY = "entry_count";
 
     // Run on the UI thread. Must not be null except after onDestroy().
     private Handler mHandler = new Handler();
@@ -80,10 +102,13 @@
     private Uri mUri;
 
     private ProgressDialog mProgressDialogForScanVCard;
+    private ProgressDialog mProgressDialogForCacheVCard;
 
     private List<VCardFile> mAllVCardFileList;
     private VCardScanThread mVCardScanThread;
 
+    private VCardCacheThread mVCardCacheThread;
+
     private String mErrorMessage;
 
     private static class VCardFile {
@@ -138,6 +163,288 @@
 
     private CancelListener mCancelListener = new CancelListener();
 
+    /**
+     * Caches all vCard data into local data directory so that we allow
+     * {@link ImportVCardService} to access all the contents in given Uris, some of
+     * which may not be accessible from other components due to permission problem.
+     * (Activity which gives the Uri may allow only this Activity to access that content,
+     * not the ohter components like {@link ImportVCardService}.
+     *
+     * We also allow the Service to happen to exit during the vCard import procedure.
+     */
+    private class VCardCacheThread extends Thread
+            implements DialogInterface.OnCancelListener {
+        private static final String CACHE_FILE_PREFIX = "import_tmp_";
+        private boolean mCanceled;
+        private PowerManager.WakeLock mWakeLock;
+        private VCardParser mVCardParser;
+        private final Uri[] mSourceUris;
+
+        // Not using Uri[] since we throw this object to Service via Intent.
+        private final String[] mDestUriStrings;
+
+        private final int[] mEstimatedVCardTypes;
+        private final String[] mEstimatedCharsets;
+        private final boolean[] mShouldUseV30;
+        private final int[] mEntryCounts;
+
+        public VCardCacheThread(final Uri[] sourceUris) {
+            mSourceUris = sourceUris;
+            final int length = sourceUris.length;
+
+            mDestUriStrings = new String[length];
+            mEstimatedVCardTypes = new int[length];
+            mEstimatedCharsets = new String[length];
+            mShouldUseV30 = new boolean[length];
+            mEntryCounts = new int[length];
+
+            final Context context = ImportVCardActivity.this;
+            PowerManager powerManager = (PowerManager)context.getSystemService(
+                    Context.POWER_SERVICE);
+            mWakeLock = powerManager.newWakeLock(
+                    PowerManager.SCREEN_DIM_WAKE_LOCK |
+                    PowerManager.ON_AFTER_RELEASE, LOG_TAG);
+        }
+
+        @Override
+        public void finalize() {
+            if (mWakeLock != null && mWakeLock.isHeld()) {
+                mWakeLock.release();
+            }
+        }
+
+        @Override
+        public void run() {
+            final Context context = ImportVCardActivity.this;
+            final ContentResolver resolver = context.getContentResolver();
+            String errorMessage = null;
+            mWakeLock.acquire();
+
+            try {
+                clearOldCache();
+
+                // We may be able to read content of each vCard file during copying them
+                // to local storage, but currently vCard code does not allow us to do so.
+                //
+                // Note that Uris given from caller applications may not be opened twice,
+                // so we have to use local data after this copy instead of relying on
+                // the original source Uris.
+                copyVCardToLocal();
+                if (mCanceled) {
+                    return;
+                }
+                Log.d("@@@", "Caching done. Count the number of vCard entries.");
+                if (!collectVCardMetaInfo()) {
+                    Log.e(LOG_TAG, "Failed to collect vCard meta information");
+                    runOnUIThread(new DialogDisplayer(
+                            getString(R.string.fail_reason_failed_to_collect_vcard_meta_info)));
+                    return;
+                }
+                if (mCanceled) {
+                    return;
+                }
+                for (int i = 0; i < mEntryCounts.length; i++) {
+                    Log.d("@@@", String.format("length for %s: %d",
+                            mDestUriStrings[i], mEntryCounts[i]));
+                }
+            } catch (OutOfMemoryError e) {
+                Log.e(LOG_TAG, "OutOfMemoryError");
+                // We should take care of this case since Android devices may have
+                // smaller memory than we usually expect.
+                System.gc();
+                runOnUIThread(new DialogDisplayer(
+                        getString(R.string.fail_reason_io_error) +
+                        ": " + e.getLocalizedMessage()));
+                return;
+            } catch (IOException e) {
+                Log.e(LOG_TAG, e.getMessage());
+                runOnUIThread(new DialogDisplayer(
+                        getString(R.string.fail_reason_io_error) +
+                        ": " + e.getLocalizedMessage()));
+                return;
+            } finally {
+
+                mWakeLock.release();
+                mProgressDialogForCacheVCard.dismiss();
+            }
+
+            // TODO(dmiyakawa): do we need runOnUIThread?
+            final Intent intent = new Intent(
+                    ImportVCardActivity.this, ImportVCardService.class);
+            intent.putExtra(VCARD_URI_ARRAY, mDestUriStrings);
+            intent.putExtra(SelectAccountActivity.ACCOUNT_NAME, mAccountName);
+            intent.putExtra(SelectAccountActivity.ACCOUNT_TYPE, mAccountType);
+            intent.putExtra(ESTIMATED_VCARD_TYPE_ARRAY, mEstimatedVCardTypes);
+            intent.putExtra(ESTIMATED_CHARSET_ARRAY, mEstimatedCharsets);
+            intent.putExtra(USE_V30_ARRAY, mShouldUseV30);
+            intent.putExtra(ENTRY_COUNT_ARRAY, mEntryCounts);
+            startService(intent);
+            finish();
+        }
+
+
+        private boolean collectVCardMetaInfo() {
+            final ContentResolver resolver =
+                    ImportVCardActivity.this.getContentResolver();
+            final int length = mDestUriStrings.length;
+            try {
+                for (int i = 0; i < length; i++) {                     
+                    if (mCanceled) {
+                        return false;
+                    }
+                    final Uri uri = Uri.parse(mDestUriStrings[i]);
+                    boolean shouldUseV30 = false;
+                    InputStream is;
+                    VCardEntryCounter counter;
+                    VCardSourceDetector detector;
+                    VCardInterpreterCollection interpreter;
+
+                    is = resolver.openInputStream(uri);
+                    mVCardParser = new VCardParser_V21();
+                    try {
+                        counter = new VCardEntryCounter();
+                        detector = new VCardSourceDetector();
+                        interpreter =
+                                new VCardInterpreterCollection(
+                                        Arrays.asList(counter, detector));
+                        mVCardParser.parse(is, interpreter);
+                    } catch (VCardVersionException e1) {
+                        try {
+                            is.close();
+                        } catch (IOException e) {
+                        }
+
+                        shouldUseV30 = true;
+                        is = resolver.openInputStream(uri);
+                        mVCardParser = new VCardParser_V30();
+                        try {
+                            counter = new VCardEntryCounter();
+                            detector = new VCardSourceDetector();
+                            interpreter =
+                                    new VCardInterpreterCollection(
+                                            Arrays.asList(counter, detector));
+                            mVCardParser.parse(is, interpreter);
+                        } catch (VCardVersionException e2) {
+                            throw new VCardException("vCard with unspported version.");
+                        }
+                    } finally {
+                        if (is != null) {
+                            try {
+                                is.close();
+                            } catch (IOException e) {
+                            }
+                        }
+                    }
+
+                    mEstimatedVCardTypes[i] = detector.getEstimatedType();
+                    mEstimatedCharsets[i] = detector.getEstimatedCharset();
+                    mShouldUseV30[i] = shouldUseV30;
+                    mEntryCounts[i] = counter.getCount();
+                }
+            } catch (IOException e) {
+                Log.e(LOG_TAG, "IOException was emitted: " + e.getMessage());
+                return false;
+            } catch (VCardNestedException e) {
+                Log.w(LOG_TAG, "Nested Exception is found (it may be false-positive).");
+            } catch (VCardNotSupportedException e) {
+                return false;
+            } catch (VCardException e) {
+                return false;
+            }
+            return true;
+        }
+
+        private void copyVCardToLocal() throws IOException {
+            final Context context = ImportVCardActivity.this;
+            final ContentResolver resolver = context.getContentResolver();
+            ReadableByteChannel inputChannel = null;
+            WritableByteChannel outputChannel = null;
+            try {
+                int length = mSourceUris.length;
+                for (int i = 0; i < length; i++) {
+                    if (mCanceled) {
+                        Log.d(LOG_TAG, "Canceled during import");
+                        break;
+                    }
+                    // XXX: better way to copy stream?
+                    inputChannel = Channels.newChannel(resolver.openInputStream(mSourceUris[i]));
+                    final String filename = CACHE_FILE_PREFIX + i + ".vcf"; 
+                    mDestUriStrings[i] =
+                            context.getFileStreamPath(filename).toURI().toString();
+                    Log.d("@@@", "temporary file: " + filename + ", dest: " + mDestUriStrings[i]);
+                    outputChannel =
+                            context.openFileOutput(filename, Context.MODE_PRIVATE).getChannel();
+                    {
+                        final ByteBuffer buffer = ByteBuffer.allocateDirect(8192);
+                        while (inputChannel.read(buffer) != -1) {
+                            if (mCanceled) {
+                                Log.d(LOG_TAG, "Canceled during caching " + mSourceUris[i]);
+                                break;
+                            }
+                            buffer.flip();
+                            outputChannel.write(buffer);
+                            buffer.compact();
+                        }
+                        buffer.flip();
+                        while (buffer.hasRemaining()) {
+                            outputChannel.write(buffer);
+                        }
+                    }
+
+                    // Avoid double close() in the "finally" block bellow. 
+                    Channel tmp = inputChannel;
+                    inputChannel = null;
+                    tmp.close();
+                    tmp = outputChannel;
+                    outputChannel = null;
+                    tmp.close();
+                }
+            } finally {
+                if (inputChannel != null) {
+                    try {
+                        inputChannel.close();
+                    } catch (IOException e) {
+                        Log.w(LOG_TAG, "Failed to close inputChannel.");
+                    }
+                }
+                if (outputChannel != null) {
+                    try {
+                        outputChannel.close();
+                    } catch(IOException e) {
+                        Log.w(LOG_TAG, "Failed to close outputChannel");
+                    }
+                }
+            }
+        }
+
+        /**
+         * We (currently) don't have any way to clean up cache files used in the previous
+         * import process,
+         * TODO(dmiyakawa): Can we do it after Service being done?
+         */
+        private void clearOldCache() {
+            final Context context = ImportVCardActivity.this;
+            final String[] fileLists = context.fileList();
+            for (String fileName : fileLists) {
+                if (fileName.startsWith(CACHE_FILE_PREFIX)) {
+                    Log.d(LOG_TAG, "Remove temporary file: " + fileName);
+                    context.deleteFile(fileName);
+                }
+            }
+        }
+        
+        public void cancel() {
+            mCanceled = true;
+            if (mVCardParser != null) {
+                mVCardParser.cancel();
+            }
+        }
+
+        public void onCancel(DialogInterface dialog) {
+            cancel();
+        }
+    }
+    
     private class ImportTypeSelectedListener implements
             DialogInterface.OnClickListener {
         public static final int IMPORT_ONE = 0;
@@ -366,16 +673,17 @@
     }
 
     private void importVCard(final String[] uriStrings) {
-        final Intent intent = new Intent(this, ImportVCardService.class);
-        intent.putExtra(VCARD_URI_ARRAY, uriStrings);
-        intent.putExtra(SelectAccountActivity.ACCOUNT_NAME, mAccountName);
-        intent.putExtra(SelectAccountActivity.ACCOUNT_TYPE, mAccountType);
-
-        // TODO: permission is not migrated to ImportVCardService, so some exception is
-        // thrown when reading some Uri, permission of which is temporarily guaranteed
-        // to ImportVCardActivity, not ImportVCardService.
-        startService(intent);
-        finish();
+        final int length = uriStrings.length;
+        final Uri[] uris = new Uri[length];
+        for (int i = 0; i < length; i++) {
+            uris[i] = Uri.parse(uriStrings[i]);
+        }
+        runOnUIThread(new Runnable() {
+            public void run() {
+                mVCardCacheThread = new VCardCacheThread(uris);
+                showDialog(R.id.dialog_cache_vcard);
+            }
+        });
     }
 
     private Dialog getSelectImportTypeDialog() {
@@ -543,6 +851,19 @@
             case R.id.dialog_select_one_vcard: {
                 return getVCardFileSelectDialog(false);
             }
+            case R.id.dialog_cache_vcard: {
+                if (mProgressDialogForCacheVCard == null) {
+                    final String title = getString(R.string.caching_vcard_title);
+                    final String message = getString(R.string.caching_vcard_message);
+                    mProgressDialogForCacheVCard = new ProgressDialog(this);
+                    mProgressDialogForCacheVCard.setTitle(title);
+                    mProgressDialogForCacheVCard.setMessage(message);
+                    mProgressDialogForCacheVCard.setProgressStyle(ProgressDialog.STYLE_SPINNER);
+                    mProgressDialogForCacheVCard.setOnCancelListener(mVCardCacheThread);
+                    mVCardCacheThread.start();
+                }
+                return mProgressDialogForCacheVCard;
+            }
             case R.id.dialog_io_exception: {
                 String message = (getString(R.string.scanning_sdcard_failed_message,
                         getString(R.string.fail_reason_io_error)));
diff --git a/src/com/android/contacts/ImportVCardService.java b/src/com/android/contacts/ImportVCardService.java
index 1482969..2be6468 100644
--- a/src/com/android/contacts/ImportVCardService.java
+++ b/src/com/android/contacts/ImportVCardService.java
@@ -141,7 +141,11 @@
                 mCreatedUris.clear();
 
                 final Account account;
-                final Uri[] uris;
+                final Uri uri;
+                final int estimatedType;
+                final String estimatedCharset;
+                final boolean useV30;
+                final int entryCount;
                 final int id;
                 final boolean needReview;
                 synchronized (mContext) {
@@ -151,97 +155,59 @@
                     } else {
                         final PendingInput pendingInput = mPendingInputs.poll();
                         account = pendingInput.account;
-                        uris = pendingInput.uris;
+                        uri = pendingInput.uri;
+                        estimatedType = pendingInput.estimatedType;
+                        estimatedCharset = pendingInput.estimatedCharset;
+                        useV30 = pendingInput.useV30;
+                        entryCount = pendingInput.entryCount;
                         id = pendingInput.id;
                     }
                 }
-                runInternal(account, uris, id);
-                doFinishNotification(id, uris);
+                runInternal(account, uri, estimatedType, estimatedCharset,
+                        useV30, entryCount, id);
+                doFinishNotification(id, uri);
             }
             Log.i(LOG_TAG, "Successfully imported. Total: " + mTotalCount);
             stopSelf();
         }
 
-        private void runInternal(Account account, Uri[] uris, int id) {
+        private void runInternal(Account account,
+                Uri uri, int estimatedType, String estimatedCharset,
+                boolean useV30, int entryCount,
+                int id) {
             int totalCount = 0;
             final ArrayList<VCardSourceDetector> detectorList =
                 new ArrayList<VCardSourceDetector>();
-            // First scan all Uris with a default charset and try to understand an exact
-            // charset to be used to each Uri. Note that detector would return null when
-            // it does not know an appropriate charset, so stick to use the default
-            // at that time.
-            // TODO: notification for first scanning?
-            for (Uri uri : uris) {
-                if (mCanceled) {
-                    return;
-                }
-                final VCardEntryCounter counter = new VCardEntryCounter();
-                final VCardSourceDetector detector = new VCardSourceDetector();
-                final VCardInterpreterCollection interpreterCollection =
-                        new VCardInterpreterCollection(Arrays.asList(counter, detector));
-                if (!readOneVCard(uri, VCardConfig.VCARD_TYPE_UNKNOWN, null,
-                        interpreterCollection)) {
-                    mErrorUris.add(uri);
-                }
-
-                totalCount += counter.getCount();
-                detectorList.add(detector);
-            }
-
-            if (mErrorUris.size() > 0) {
-                final StringBuilder builder = new StringBuilder();
-                builder.append("Error happened on ");
-                for (Uri errorUri : mErrorUris) {
-                    builder.append("\"");
-                    builder.append(errorUri.toString());
-                    builder.append("\"");
-                }
-                Log.e(LOG_TAG, builder.toString());
-                doErrorNotification(id);
-                return;
-            }
-
-            if (uris.length != detectorList.size()) {
-                Log.e(LOG_TAG,
-                        "The number of Uris to be imported is different from that of " +
-                        "charset to be used.");
-                doErrorNotification(id);
+            if (mCanceled) {
                 return;
             }
 
             // First scanning is over. Try to import each vCard, which causes side effects.
-            mTotalCount = totalCount;
+            mTotalCount += entryCount;
             mCurrentCount = 0;
 
-            for (int i = 0; i < uris.length; i++) {
-                if (mCanceled) {
-                    Log.w(LOG_TAG, "Canceled during importing (with storing data in database)");
-                    // TODO: implement cancel correctly.
-                    return;
-                }
-                final Uri uri = uris[i];
+            if (mCanceled) {
+                Log.w(LOG_TAG, "Canceled during importing (with storing data in database)");
+                // TODO: implement cancel correctly.
+                return;
+            }
 
-                final VCardSourceDetector detector = detectorList.get(i);
-                final int vcardType =  detector.getEstimatedType();  
-                final String charset = detector.getEstimatedCharset();  // May be null.
+            final VCardEntryConstructor constructor =
+                    new VCardEntryConstructor(estimatedType, account, estimatedCharset);
+            final VCardEntryCommitter committer = new VCardEntryCommitter(mResolver);
+            constructor.addEntryHandler(committer);
+            constructor.addEntryHandler(new ProgressNotifier(id));
 
-                final VCardEntryConstructor constructor =
-                        new VCardEntryConstructor(vcardType, account, charset);
-                final VCardEntryCommitter committer = new VCardEntryCommitter(mResolver);
-                constructor.addEntryHandler(committer);
-                constructor.addEntryHandler(new ProgressNotifier(id));
-
-                if (!readOneVCard(uri, vcardType, charset, constructor)) {
-                        Log.e(LOG_TAG, "Failed to read \"" + uri.toString() + "\" " +
-                                "while first scan was successful.");
-                }
+            if (!readOneVCard(uri, estimatedType, estimatedCharset, constructor)) {
+                Log.e(LOG_TAG, "Failed to read \"" + uri.toString() + "\" " +
+                "while first scan was successful.");
+            }
                 final List<Uri> createdUris = committer.getCreatedUris();
                 if (createdUris != null && createdUris.size() > 0) {
                     mCreatedUris.addAll(createdUris);
                 } else {
                     Log.w(LOG_TAG, "Created Uris is null (src = " + uri.toString() + "\"");
                 }
-            }
         }
 
         private boolean readOneVCard(Uri uri, int vcardType, String charset,
@@ -330,7 +296,7 @@
             mNotificationManager.notify(id, notification);
         }
 
-        private void doFinishNotification(int id, Uri[] uris) {
+        private void doFinishNotification(int id, Uri uri) {
             final Notification notification = new Notification();
             notification.icon = android.R.drawable.stat_sys_download_done;
             final String title = mContext.getString(R.string.reading_vcard_finished_title);
@@ -342,10 +308,9 @@
                             RawContacts.CONTENT_URI, rawContactId));
             intent = new Intent(Intent.ACTION_VIEW, contactUri);
 
-            final String text = ((uris.length == 1) ? uris[0].getPath() : "");
             final PendingIntent pendingIntent =
                     PendingIntent.getActivity(mContext, 0, intent, 0);
-            notification.setLatestEventInfo(mContext, title, text, pendingIntent);
+            notification.setLatestEventInfo(mContext, title, "", pendingIntent);
             mNotificationManager.notify(id, notification);
         }
 
@@ -364,17 +329,29 @@
 
     private static class PendingInput {
         public final Account account;
-        public final Uri[] uris;
+        public final Uri uri;
+        public final int estimatedType;
+        public final String estimatedCharset;
+        public final boolean useV30;
+        public final int entryCount;
         public final int id;
 
-        public PendingInput(Account account, Uri[] uris, int id) {
+        public PendingInput(Account account,
+                Uri uri, int estimatedType, String estimatedCharset,
+                boolean useV30, int entryCount,   
+                int id) {
             this.account = account;
-            this.uris = uris;
+            this.uri = uri;
+            this.estimatedType = estimatedType;
+            this.estimatedCharset = estimatedCharset;
+            this.useV30 = useV30;
+            this.entryCount = entryCount;
             this.id = id;
         }
     }
 
-    // The two classes bellow must be called inside the synchronized block, using this context.
+    // The two classes bellow must be called inside the synchronized block, using this
+    // Activity as a Context.
     private boolean mNowRunning;
     private final Queue<PendingInput> mPendingInputs = new LinkedList<PendingInput>();
 
@@ -423,6 +400,16 @@
                     (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
         }
 
+        // TODO: use this.
+        final int[] estimatedTypeArray =
+            intent.getIntArrayExtra(ImportVCardActivity.ESTIMATED_VCARD_TYPE_ARRAY);
+        final String[] estimatedCharsetArray =
+            intent.getStringArrayExtra(ImportVCardActivity.ESTIMATED_CHARSET_ARRAY);
+        final boolean[] useV30Array =
+            intent.getBooleanArrayExtra(ImportVCardActivity.USE_V30_ARRAY);
+        final int[] entryCountArray =
+            intent.getIntArrayExtra(ImportVCardActivity.ENTRY_COUNT_ARRAY);
+        
         final Account account = tryGetAccount(intent);
         final Uri[] uris = tryGetUris(intent);
         if (uris == null) {
@@ -433,8 +420,30 @@
             return START_NOT_STICKY;
         }
 
+        int length = uris.length;
+        if (estimatedTypeArray.length < length) {
+            Log.w(LOG_TAG, String.format("estimatedTypeArray.length < length (%d, %d)",
+                    estimatedTypeArray.length, length));
+            length = estimatedTypeArray.length;
+        }
+        if (useV30Array.length < length) {
+            Log.w(LOG_TAG, String.format("useV30Array.length < length (%d, %d)",
+                    useV30Array.length, length));
+            length = useV30Array.length;
+        }
+        if (entryCountArray.length < length) {
+            Log.w(LOG_TAG, String.format("entryCountArray.length < length (%d, %d)",
+                    entryCountArray.length, length));
+            length = entryCountArray.length;
+        }
+
         synchronized (this) {
-            mPendingInputs.add(new PendingInput(account, uris, startId));
+            for (int i = 0; i < length; i++) {
+                mPendingInputs.add(new PendingInput(account,
+                        uris[i], estimatedTypeArray[i], estimatedCharsetArray[i],
+                        useV30Array[i], entryCountArray[i],
+                        startId));
+            }
             if (!mNowRunning) {
                 Toast.makeText(this, getString(R.string.vcard_importer_start_message),
                         Toast.LENGTH_LONG).show();
