diff --git a/InCallUI/src/com/android/incallui/CallCardFragment.java b/InCallUI/src/com/android/incallui/CallCardFragment.java
index 65a75d7..889ff49 100644
--- a/InCallUI/src/com/android/incallui/CallCardFragment.java
+++ b/InCallUI/src/com/android/incallui/CallCardFragment.java
@@ -117,7 +117,9 @@
 
     @Override
     public void setImage(Bitmap image) {
-        setDrawableToImageView(mPhoto, new BitmapDrawable(getResources(), image));
+        if (image != null) {
+            setDrawableToImageView(mPhoto, new BitmapDrawable(getResources(), image));
+        }
     }
 
     @Override
diff --git a/InCallUI/src/com/android/incallui/CallCardPresenter.java b/InCallUI/src/com/android/incallui/CallCardPresenter.java
index 5ab2529..1239695 100644
--- a/InCallUI/src/com/android/incallui/CallCardPresenter.java
+++ b/InCallUI/src/com/android/incallui/CallCardPresenter.java
@@ -18,7 +18,6 @@
 
 import android.graphics.drawable.Drawable;
 import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
 import android.os.AsyncTask;
 import android.text.TextUtils;
 import android.text.format.DateUtils;
@@ -29,12 +28,9 @@
 import com.android.incallui.InCallPresenter.InCallState;
 import com.android.incallui.InCallPresenter.InCallStateListener;
 import com.android.incallui.service.PhoneNumberService;
-import com.android.incallui.util.HttpFetcher;
 import com.android.services.telephony.common.AudioMode;
 import com.android.services.telephony.common.Call;
 
-import java.io.IOException;
-
 /**
  * Presenter for the Call Card Fragment.
  * <p>
@@ -307,13 +303,7 @@
                 @Override
                 protected Bitmap doInBackground(Void... params) {
                     // Fetch the image
-                    try {
-                        final byte[] image = HttpFetcher.getRequestAsByteArray(url);
-                        return BitmapFactory.decodeByteArray(image, 0, image.length);
-                    } catch (IOException e) {
-                        Log.e(TAG, "Unable to download/decode photo.", e);
-                    }
-                    return null;
+                    return mPhoneNumberService.fetchImage(url);
                 }
 
                 @Override
diff --git a/InCallUI/src/com/android/incallui/Log.java b/InCallUI/src/com/android/incallui/Log.java
index 029bace..bc57ed7 100644
--- a/InCallUI/src/com/android/incallui/Log.java
+++ b/InCallUI/src/com/android/incallui/Log.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2006 The Android Open Source Project
+ * 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.
diff --git a/InCallUI/src/com/android/incallui/service/PhoneNumberService.java b/InCallUI/src/com/android/incallui/service/PhoneNumberService.java
index 1e0cb95..4566388 100644
--- a/InCallUI/src/com/android/incallui/service/PhoneNumberService.java
+++ b/InCallUI/src/com/android/incallui/service/PhoneNumberService.java
@@ -16,12 +16,16 @@
 
 package com.android.incallui.service;
 
+import android.graphics.Bitmap;
+
 /**
  *
  */
 public interface PhoneNumberService {
     public void getPhoneNumberInfo(String phoneNumber, PhoneNumberServiceListener listener);
 
+    public Bitmap fetchImage(String url);
+
     public interface PhoneNumberServiceListener {
 
         /**
diff --git a/InCallUI/src/com/android/incallui/util/HttpFetcher.java b/InCallUI/src/com/android/incallui/util/HttpFetcher.java
deleted file mode 100644
index 6548a5a..0000000
--- a/InCallUI/src/com/android/incallui/util/HttpFetcher.java
+++ /dev/null
@@ -1,111 +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.incallui.util;
-
-import android.os.SystemClock;
-
-import com.android.incallui.Log;
-import com.google.common.io.Closeables;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.HttpURLConnection;
-import java.net.URL;
-
-/**
- * Utility for making http requests.
- */
-public class HttpFetcher {
-
-    private static final String TAG = HttpFetcher.class.getSimpleName();
-
-    /**
-     * Send a http request to the given url.
-     *
-     * @param urlString The url to request.
-     * @return The response body as a byte array.  Or {@literal null} if status code is not 2xx.
-     * @throws java.io.IOException when an error occurs.
-     */
-    public static byte[] getRequestAsByteArray(String urlString) throws IOException {
-        Log.d(TAG, "fetching " + urlString);
-        HttpURLConnection conn = null;
-        InputStream is = null;
-        boolean isError = false;
-        final long start = SystemClock.uptimeMillis();
-        try {
-            final URL url = new URL(urlString);
-            conn = (HttpURLConnection) url.openConnection();
-            Log.d(TAG, "response code: " + conn.getResponseCode());
-            // All 2xx codes are successful.
-            if (conn.getResponseCode() / 100 == 2) {
-                is = conn.getInputStream();
-            } else {
-                is = conn.getErrorStream();
-                isError = true;
-            }
-
-            final ByteArrayOutputStream baos = new ByteArrayOutputStream();
-            final byte[] buffer = new byte[1024];
-            int bytesRead;
-
-            while ((bytesRead = is.read(buffer)) != -1) {
-                baos.write(buffer, 0, bytesRead);
-            }
-
-            if (isError) {
-                handleBadResponse(urlString, baos.toByteArray());
-                return null;
-            }
-
-            final byte[] response = baos.toByteArray();
-            Log.d(TAG, "received " + response.length + " bytes");
-            final long end = SystemClock.uptimeMillis();
-            Log.d(TAG, "fetch took " + (end - start) + " ms");
-            return response;
-        } finally {
-            Closeables.closeQuietly(is);
-            if (conn != null) {
-                conn.disconnect();
-            }
-        }
-    }
-
-    /**
-     * Send a http request to the given url.
-     *
-     * @param urlString The url to request.
-     * @return The response body as a String. Or {@literal null} if status code is not 2xx.
-     * @throws java.io.IOException when an error occurs.
-     */
-    public static String getRequestAsString(String urlString) throws IOException {
-        final byte[] byteArr = getRequestAsByteArray(urlString);
-        if (byteArr == null) {
-            // Encountered error response... just return.
-            return null;
-        }
-        final String response = new String(byteArr);
-        Log.d(TAG, "response body: ");
-        Log.d(TAG, response);
-        return response;
-    }
-
-    private static void handleBadResponse(String url, byte[] response) {
-        Log.w(TAG, "Got bad response code from url: " + url);
-        Log.w(TAG, new String(response));
-    }
-}
