diff --git a/src/com/android/phone/PhoneGlobals.java b/src/com/android/phone/PhoneGlobals.java
index d3e8829..6c658d3 100644
--- a/src/com/android/phone/PhoneGlobals.java
+++ b/src/com/android/phone/PhoneGlobals.java
@@ -66,6 +66,7 @@
 import com.android.phone.common.CallLogAsync;
 import com.android.phone.settings.SettingsConstants;
 import com.android.server.sip.SipService;
+import com.android.services.telephony.activation.SimActivationManager;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -145,6 +146,7 @@
     CallerInfoCache callerInfoCache;
     NotificationMgr notificationMgr;
     public PhoneInterfaceManager phoneMgr;
+    public SimActivationManager simActivationManager;
 
     private BluetoothManager bluetoothManager;
     private CallGatewayManager callGatewayManager;
@@ -441,6 +443,8 @@
         cdmaOtaScreenState = new OtaUtils.CdmaOtaScreenState();
         cdmaOtaInCallScreenUiState = new OtaUtils.CdmaOtaInCallScreenUiState();
 
+        simActivationManager = new SimActivationManager();
+
         // XXX pre-load the SimProvider so that it's ready
         resolver.getType(Uri.parse("content://icc/adn"));
 
diff --git a/src/com/android/services/telephony/activation/Activator.java b/src/com/android/services/telephony/activation/Activator.java
new file mode 100644
index 0000000..7dee5b3
--- /dev/null
+++ b/src/com/android/services/telephony/activation/Activator.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2015 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.services.telephony.activation;
+
+/**
+ * SIM Activation implementation generic interface.
+ */
+public interface Activator {
+    void onActivate();
+}
diff --git a/src/com/android/services/telephony/activation/OtaspActivator.java b/src/com/android/services/telephony/activation/OtaspActivator.java
new file mode 100644
index 0000000..11ba726
--- /dev/null
+++ b/src/com/android/services/telephony/activation/OtaspActivator.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2015 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.services.telephony.activation;
+
+/**
+ * Over-The-Air SIM Provisioning (OTASP) activation implementation.
+ *
+ * Handles OTASP activation requests and returns status updates as activation progresses.
+ */
+public class OtaspActivator implements Activator {
+    @Override
+    public void onActivate() {
+        // TODO: handle otasp activation
+    }
+}
diff --git a/src/com/android/services/telephony/activation/SimActivationActivity.java b/src/com/android/services/telephony/activation/SimActivationActivity.java
index 3833706..ae11a3f 100644
--- a/src/com/android/services/telephony/activation/SimActivationActivity.java
+++ b/src/com/android/services/telephony/activation/SimActivationActivity.java
@@ -23,6 +23,7 @@
 import android.os.Bundle;
 import android.telephony.TelephonyManager;
 
+import com.android.phone.PhoneGlobals;
 import com.android.services.telephony.Log;
 
 /**
@@ -45,19 +46,28 @@
     }
 
     private void runActivation(Intent intent) {
-        PendingIntent response = intent.getParcelableExtra(Intent.EXTRA_SIM_ACTIVATION_RESPONSE);
+        final PendingIntent response =
+                intent.getParcelableExtra(Intent.EXTRA_SIM_ACTIVATION_RESPONSE);
 
         Log.i(this, "Running activation w/ response " + response);
-        // TODO: Actually do activation
 
+        PhoneGlobals app = PhoneGlobals.getInstance();
+        app.simActivationManager.runActivation(SimActivationManager.Triggers.EXPLICIT_REQUEST,
+                new SimActivationManager.Response() {
+                    @Override
+                    public void onResponse(int status) {
+                        if (response != null) {
+                            try {
+                                response.send();
+                            } catch (CanceledException e) {
+                                Log.w(this, "Could not respond to SIM Activation.");
+                            }
+                        }
+                    }
+                });
+
+        // TODO: Set this status to the return value of runActivation
         // Return the response as an activity result and the pending intent.
-        setResult(TelephonyManager.SIM_ACTIVATION_RESULT_COMPLETE);
-        if (response != null) {
-            try {
-                response.send();
-            } catch (CanceledException e) {
-                Log.w(this, "Could not respond to SIM Activation.");
-            }
-        }
+        setResult(TelephonyManager.SIM_ACTIVATION_RESULT_IN_PROGRESS);
     }
 }
diff --git a/src/com/android/services/telephony/activation/SimActivationManager.java b/src/com/android/services/telephony/activation/SimActivationManager.java
new file mode 100644
index 0000000..ce9e508
--- /dev/null
+++ b/src/com/android/services/telephony/activation/SimActivationManager.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2015 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.services.telephony.activation;
+
+import android.app.PendingIntent;
+import android.telephony.TelephonyManager;
+
+/**
+ * Handles SIM activation requests and runs the appropriate activation process until it completes
+ * or fails. When done, sends back a response if needed.
+ */
+public class SimActivationManager {
+    public static final class Triggers {
+        public static final int SYSTEM_START = 1;
+        public static final int EXPLICIT_REQUEST = 2;
+    }
+
+    public interface Response {
+        /**
+         * @param status See {@link android.telephony.TelephonyManager} for SIM_ACTIVATION_RESULT_*
+         *               constants.
+         */
+        void onResponse(int status);
+    }
+
+    public void runActivation(int trigger, Response response) {
+        Activator activator = selectActivator(trigger);
+
+        activator.onActivate();
+
+        // TODO: Specify some way to determine if activation is even necessary.
+
+        // TODO: specify some way to return the result.
+
+        if (response != null) {
+            response.onResponse(TelephonyManager.SIM_ACTIVATION_RESULT_COMPLETE);
+        }
+    }
+
+    private Activator selectActivator(int trigger) {
+        // TODO: Select among all activator types
+
+        // For now, pick a do-nothing activator
+        return new Activator() {
+
+            /** ${inheritDoc} */
+                @Override
+            public void onActivate() {
+                // do something
+            }
+        };
+    }
+}
