diff --git a/src/com/android/telecomm/CallServiceRepository.java b/src/com/android/telecomm/CallServiceRepository.java
index 6dad6eb..93f133f 100644
--- a/src/com/android/telecomm/CallServiceRepository.java
+++ b/src/com/android/telecomm/CallServiceRepository.java
@@ -68,6 +68,7 @@
     private final Runnable mLookupTerminator = new Runnable() {
         @Override
         public void run() {
+            Log.d(TAG, "Timed out processing providers");
             terminateLookup();
         }
     };
diff --git a/src/com/android/telecomm/CallServiceSelectorRepository.java b/src/com/android/telecomm/CallServiceSelectorRepository.java
index 4186a5d..d384604 100644
--- a/src/com/android/telecomm/CallServiceSelectorRepository.java
+++ b/src/com/android/telecomm/CallServiceSelectorRepository.java
@@ -58,6 +58,7 @@
     private final Runnable mLookupTerminator = new Runnable() {
         @Override
         public void run() {
+            Log.d(TAG, "Timed out processing selectors");
             terminateLookup();
         }
     };
diff --git a/src/com/android/telecomm/LogUtil.java b/src/com/android/telecomm/LogUtil.java
new file mode 100644
index 0000000..9690251
--- /dev/null
+++ b/src/com/android/telecomm/LogUtil.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright 2014, 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.telecomm;
+
+import android.util.Log;
+
+import java.util.IllegalFormatException;
+import java.util.Locale;
+
+/**
+ * Manages logging for the entire module.
+ */
+public class LogUtil {
+
+    // Generic tag for all In Call logging
+    private static final String TAG = "Telecomm";
+
+    public static final boolean FORCE_LOGGING = true; /* STOP SHIP if true */
+    public static final boolean DEBUG = isLoggable(Log.DEBUG);
+    public static final boolean VERBOSE = isLoggable(Log.VERBOSE);
+
+    private LogUtil() {}
+
+    public static boolean isLoggable(int level) {
+        return FORCE_LOGGING || Log.isLoggable(TAG, level);
+    }
+
+    public static void d(String prefix, String format, Object... args) {
+        if (DEBUG) {
+            Log.d(TAG, buildMessage(prefix, format, args));
+        }
+    }
+
+    public static void d(Object objectPrefix, String format, Object... args) {
+        if (DEBUG) {
+            Log.d(TAG, buildMessage(getPrefixFromObject(objectPrefix), format, args));
+        }
+    }
+
+    public static void v(String prefix, String format, Object... args) {
+        if (VERBOSE) {
+            Log.v(TAG, buildMessage(prefix, format, args));
+        }
+    }
+
+    public static void v(Object objectPrefix, String format, Object... args) {
+        if (VERBOSE) {
+            Log.v(TAG, buildMessage(getPrefixFromObject(objectPrefix), format, args));
+        }
+    }
+
+    public static void w(String prefix, String format, Object... args) {
+        if (isLoggable(Log.WARN)) {
+            Log.w(TAG, buildMessage(prefix, format, args));
+        }
+    }
+
+    public static void w(Object objectPrefix, String format, Object... args) {
+        if (isLoggable(Log.WARN)) {
+            Log.w(TAG, buildMessage(getPrefixFromObject(objectPrefix), format, args));
+        }
+    }
+
+    public static void e(String prefix, Throwable tr, String format, Object... args) {
+        if (isLoggable(Log.ERROR)) {
+            Log.e(TAG, buildMessage(prefix, format, args), tr);
+        }
+    }
+
+    public static void e(Object objectPrefix, Throwable tr, String format, Object... args) {
+        if (isLoggable(Log.ERROR)) {
+            Log.e(TAG, buildMessage(getPrefixFromObject(objectPrefix), format, args), tr);
+        }
+    }
+
+    public static void wtf(String prefix, Throwable tr, String format, Object... args) {
+        Log.wtf(TAG, buildMessage(prefix, format, args), tr);
+    }
+
+    public static void wtf(Object objectPrefix, Throwable tr, String format, Object... args) {
+        Log.wtf(TAG, buildMessage(getPrefixFromObject(objectPrefix), format, args), tr);
+    }
+
+    public static void wtf(String prefix, String format, Object... args) {
+        Log.wtf(TAG, buildMessage(prefix, format, args));
+    }
+
+    public static void wtf(Object objectPrefix, String format, Object... args) {
+        Log.wtf(TAG, buildMessage(getPrefixFromObject(objectPrefix), format, args));
+    }
+
+    private static String getPrefixFromObject(Object obj) {
+        return obj == null ? "<null>" : obj.getClass().getSimpleName();
+    }
+
+    private static String buildMessage(String prefix, String format, Object... args) {
+        String msg;
+        try {
+            msg = (args == null || args.length == 0) ? format
+                    : String.format(Locale.US, format, args);
+        } catch (IllegalFormatException ife) {
+            wtf("LogUtil", "IllegalFormatException: formatString='%s' numArgs=%d", format,
+                    args.length);
+            msg = format + " (An error occurred while formatting the message.)";
+        }
+        return String.format(Locale.US, "%s: %s", prefix, msg);
+    }
+}
diff --git a/src/com/android/telecomm/Switchboard.java b/src/com/android/telecomm/Switchboard.java
index 077e605..7587419 100644
--- a/src/com/android/telecomm/Switchboard.java
+++ b/src/com/android/telecomm/Switchboard.java
@@ -337,6 +337,7 @@
         while (iterator.hasNext()) {
             Call call = iterator.next();
             if (call.getAgeInMilliseconds() >= newCallTimeoutMs) {
+                Log.d(TAG, "Call " + call.getId() + " timed out.");
                 mOutgoingCallsManager.abort(call);
                 calls.remove(call);
 
diff --git a/src/com/android/telecomm/Timeouts.java b/src/com/android/telecomm/Timeouts.java
index a69319d..05c26db 100644
--- a/src/com/android/telecomm/Timeouts.java
+++ b/src/com/android/telecomm/Timeouts.java
@@ -36,7 +36,7 @@
      *     allowed to span over.
      */
     public static long getProviderLookupMs() {
-        return get("provider_lookup_ms", 100);
+        return get("provider_lookup_ms", 1000);
     }
 
     /**
@@ -44,7 +44,7 @@
      *     allowed to span over.
      */
     public static long getSelectorLookupMs() {
-        return get("selector_lookup_ms", 100);
+        return get("selector_lookup_ms", 1000);
     }
 
     /**
