diff --git a/src/com/android/settings/SetupWizardUtils.java b/src/com/android/settings/SetupWizardUtils.java
index d91ba13..0f93c67 100644
--- a/src/com/android/settings/SetupWizardUtils.java
+++ b/src/com/android/settings/SetupWizardUtils.java
@@ -33,24 +33,11 @@
 
     // From WizardManager (must match constants maintained there)
     public static final String EXTRA_SCRIPT_URI = "scriptUri";
-    public static final int NEXT_REQUEST = 10000;
 
     public static boolean isUsingWizardManager(Activity activity) {
         return activity.getIntent().hasExtra(EXTRA_SCRIPT_URI);
     }
 
-    /**
-     * Send the results of this activity to WizardManager, which will then send out the next
-     * scripted activity. WizardManager does not actually return an activity result, but if we
-     * invoke WizardManager without requesting a result, the framework will choose not to issue a
-     * call to onActivityResult with RESULT_CANCELED when navigating backward.
-     */
-    public static void sendResultsToSetupWizard(Activity activity, int resultCode) {
-        final Intent intent = activity.getIntent();
-        final Intent nextIntent = WizardManagerHelper.getNextIntent(intent, resultCode);
-        activity.startActivityForResult(nextIntent, NEXT_REQUEST);
-    }
-
     public static int getTheme(Intent intent) {
         if (WizardManagerHelper.isLightTheme(intent, true)) {
             return R.style.SetupWizardTheme_Light;
diff --git a/src/com/android/settings/wifi/WifiSetupActivity.java b/src/com/android/settings/wifi/WifiSetupActivity.java
index 7d7fe3b..321ecb6 100644
--- a/src/com/android/settings/wifi/WifiSetupActivity.java
+++ b/src/com/android/settings/wifi/WifiSetupActivity.java
@@ -125,7 +125,7 @@
         if (isWifiConnected()) {
             if (mAutoFinishOnConnection && mUserSelectedNetwork) {
                 Log.d(TAG, "Auto-finishing with connection");
-                finishOrNext(Activity.RESULT_OK);
+                finish(Activity.RESULT_OK);
                 // Require a user selection before auto-finishing next time we are here. The user
                 // can either connect to a different network or press "next" to proceed.
                 mUserSelectedNetwork = false;
@@ -195,18 +195,12 @@
     }
 
     /**
-     * Complete this activity and return the results to the caller. If using WizardManager, this
-     * will invoke the next scripted action; otherwise, we simply finish.
+     * Complete this activity and return the results to the caller.
      */
-    public void finishOrNext(int resultCode) {
-        Log.d(TAG, "finishOrNext resultCode=" + resultCode
-                + " isUsingWizardManager=" + SetupWizardUtils.isUsingWizardManager(this));
-        if (SetupWizardUtils.isUsingWizardManager(this)) {
-            SetupWizardUtils.sendResultsToSetupWizard(this, resultCode);
-        } else {
-            setResult(resultCode);
-            finish();
-        }
+    public void finish(int resultCode) {
+        Log.d(TAG, "finishing, resultCode=" + resultCode);
+        setResult(resultCode);
+        finish();
     }
 
     @Override
@@ -223,7 +217,7 @@
     @Override
     public void onNavigateNext() {
         if (mWifiConnected) {
-            finishOrNext(RESULT_OK);
+            finish(RESULT_OK);
         } else {
             // Warn of possible data charges if there is a network connection, or lack of updates
             // if there is none.
@@ -271,7 +265,7 @@
                                 @Override
                                 public void onClick(DialogInterface dialog, int id) {
                                     WifiSetupActivity activity = (WifiSetupActivity) getActivity();
-                                    activity.finishOrNext(RESULT_SKIP);
+                                    activity.finish(RESULT_SKIP);
                                 }
                             })
                     .setNegativeButton(R.string.wifi_dont_skip,
