diff --git a/src/com/android/settings/password/ChooseLockTypeDialogFragment.java b/src/com/android/settings/password/ChooseLockTypeDialogFragment.java
index ba69e64..13dc996 100644
--- a/src/com/android/settings/password/ChooseLockTypeDialogFragment.java
+++ b/src/com/android/settings/password/ChooseLockTypeDialogFragment.java
@@ -46,15 +46,13 @@
         implements OnClickListener {
 
     private static final String ARG_USER_ID = "userId";
-    private static final String ARG_EXCLUDE_LOCK = "excludeLock";
 
     private ScreenLockAdapter mAdapter;
     private ChooseLockGenericController mController;
 
-    public static ChooseLockTypeDialogFragment newInstance(int userId, String excludeLock) {
+    public static ChooseLockTypeDialogFragment newInstance(int userId) {
         Bundle args = new Bundle();
         args.putInt(ARG_USER_ID, userId);
-        args.putString(ARG_EXCLUDE_LOCK, excludeLock);
         ChooseLockTypeDialogFragment fragment = new ChooseLockTypeDialogFragment();
         fragment.setArguments(args);
         return fragment;
@@ -96,10 +94,6 @@
                 mController.getVisibleScreenLockTypes(
                         DevicePolicyManager.PASSWORD_QUALITY_SOMETHING,
                         false /* includeDisabled */);
-        String excludeLockName = getArguments().getString(ARG_EXCLUDE_LOCK);
-        if (excludeLockName != null) {
-            locks.remove(ScreenLockType.valueOf(excludeLockName));
-        }
         mAdapter = new ScreenLockAdapter(context, locks, mController);
         builder.setAdapter(mAdapter, this);
         builder.setTitle(R.string.setup_lock_settings_options_dialog_title);
diff --git a/src/com/android/settings/password/SetupChooseLockPassword.java b/src/com/android/settings/password/SetupChooseLockPassword.java
index bd935a2..b8ded5e 100644
--- a/src/com/android/settings/password/SetupChooseLockPassword.java
+++ b/src/com/android/settings/password/SetupChooseLockPassword.java
@@ -114,9 +114,7 @@
         }
 
         private void launchChooseLockGeneric() {
-            ScreenLockType currentLock = mIsAlphaMode
-                    ? ScreenLockType.PASSWORD : ScreenLockType.PIN;
-            ChooseLockTypeDialogFragment.newInstance(mUserId, currentLock.toString())
+            ChooseLockTypeDialogFragment.newInstance(mUserId)
                     .show(getChildFragmentManager(), null);
         }
 
@@ -130,6 +128,12 @@
 
         @Override
         public void onLockTypeSelected(ScreenLockType lock) {
+            ScreenLockType currentLockType = mIsAlphaMode ?
+                    ScreenLockType.PASSWORD : ScreenLockType.PIN;
+            if (currentLockType.equals(lock)) {
+                // ignore same lock type.
+                return;
+            }
             Intent activityIntent = getActivity().getIntent();
             Intent intent = new Intent(getContext(), SetupChooseLockGeneric.class);
 
diff --git a/tests/robotests/src/com/android/settings/password/ChooseLockTypeDialogFragmentTest.java b/tests/robotests/src/com/android/settings/password/ChooseLockTypeDialogFragmentTest.java
new file mode 100644
index 0000000..0a0734f
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/password/ChooseLockTypeDialogFragmentTest.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2017 Google Inc.
+ *
+ * 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.settings.password;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import android.app.AlertDialog;
+import android.app.Fragment;
+import android.content.Context;
+
+import com.android.settings.R;
+import com.android.settings.TestConfig;
+import com.android.settings.password.ChooseLockTypeDialogFragment.OnLockTypeSelectedListener;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.shadow.ShadowEventLogWriter;
+import com.android.settings.testutils.shadow.ShadowUserManager;
+import com.android.settings.testutils.shadow.ShadowUtils;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowAlertDialog;
+import org.robolectric.shadows.ShadowDialog;
+import org.robolectric.util.FragmentTestUtil;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(
+        manifest = TestConfig.MANIFEST_PATH,
+        sdk = TestConfig.SDK_VERSION,
+        shadows = {
+                ShadowEventLogWriter.class,
+                ShadowUserManager.class,
+                ShadowUtils.class
+        })
+public class ChooseLockTypeDialogFragmentTest {
+    private Context mContext;
+    private TestFragment mFragment;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mFragment = new TestFragment();
+        FragmentTestUtil.startFragment(mFragment);
+    }
+
+    @Test
+    public void testThatDialog_IsShown() {
+        AlertDialog latestDialog = startLockFragment();
+        assertNotNull(latestDialog);
+        ShadowDialog shadowDialog = Shadows.shadowOf(latestDialog);
+        // verify that we are looking at the expected dialog.
+        assertEquals(shadowDialog.getTitle(),
+                mContext.getString(R.string.setup_lock_settings_options_dialog_title));
+    }
+
+    @Test
+    public void testThat_OnClickListener_IsCalled() {
+        mFragment.mDelegate = mock(OnLockTypeSelectedListener.class);
+        AlertDialog lockDialog = startLockFragment();
+        ShadowAlertDialog shadowAlertDialog = Shadows.shadowOf(lockDialog);
+        shadowAlertDialog.clickOnItem(0);
+        verify(mFragment.mDelegate, times(1)).onLockTypeSelected(any(ScreenLockType.class));
+    }
+
+    @Test
+    public void testThat_OnClickListener_IsNotCalledWhenCancelled() {
+        mFragment.mDelegate = mock(OnLockTypeSelectedListener.class);
+        AlertDialog lockDialog = startLockFragment();
+        lockDialog.dismiss();
+        verify(mFragment.mDelegate, never()).onLockTypeSelected(any(ScreenLockType.class));
+    }
+
+
+    private AlertDialog startLockFragment() {
+        ChooseLockTypeDialogFragment chooseLockTypeDialogFragment =
+                ChooseLockTypeDialogFragment.newInstance(1234);
+        chooseLockTypeDialogFragment.show(mFragment.getChildFragmentManager(), null);
+        return ShadowAlertDialog.getLatestAlertDialog();
+    }
+
+
+    public static class TestFragment extends Fragment
+            implements OnLockTypeSelectedListener{
+        OnLockTypeSelectedListener mDelegate;
+        @Override
+        public void onLockTypeSelected(ScreenLockType lock) {
+            if (mDelegate != null) {
+                mDelegate.onLockTypeSelected(lock);
+            }
+        }
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/password/SetupChooseLockPasswordTest.java b/tests/robotests/src/com/android/settings/password/SetupChooseLockPasswordTest.java
index f7526db..5f4c16a 100644
--- a/tests/robotests/src/com/android/settings/password/SetupChooseLockPasswordTest.java
+++ b/tests/robotests/src/com/android/settings/password/SetupChooseLockPasswordTest.java
@@ -21,16 +21,17 @@
 import static org.robolectric.RuntimeEnvironment.application;
 import static org.robolectric.Shadows.shadowOf;
 
+import android.app.AlertDialog;
 import android.content.Intent;
 import android.os.Bundle;
 import android.widget.Button;
 
 import com.android.settings.R;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
 import com.android.settings.password.ChooseLockGeneric.ChooseLockGenericFragment;
 import com.android.settings.password.ChooseLockPassword.IntentBuilder;
 import com.android.settings.password.SetupChooseLockPassword.SetupChooseLockPasswordFragment;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.testutils.shadow.SettingsShadowResources;
 import com.android.settings.testutils.shadow.ShadowDynamicIndexableContentMonitor;
 import com.android.settings.testutils.shadow.ShadowEventLogWriter;
@@ -39,9 +40,11 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.Robolectric;
+import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowActivity;
 import org.robolectric.shadows.ShadowActivity.IntentForResult;
+import org.robolectric.shadows.ShadowAlertDialog;
 import org.robolectric.shadows.ShadowDialog;
 
 @RunWith(SettingsRobolectricTestRunner.class)
@@ -69,23 +72,23 @@
 
     @Test
     public void createActivity_withShowOptionsButtonExtra_shouldShowButton() {
-        Intent intent = SetupChooseLockPassword.modifyIntentForSetup(
-                application,
-                new IntentBuilder(application).build());
-        intent.putExtra(ChooseLockGenericFragment.EXTRA_SHOW_OPTIONS_BUTTON, true);
-        SetupChooseLockPassword activity =
-                Robolectric.buildActivity(SetupChooseLockPassword.class, intent).setup().get();
-
+        SetupChooseLockPassword activity = createSetupChooseLockPassword();
         Button optionsButton = activity.findViewById(R.id.screen_lock_options);
         assertThat(optionsButton).isNotNull();
-
-        ShadowActivity shadowActivity = shadowOf(activity);
         optionsButton.performClick();
-
         assertThat(ShadowDialog.getLatestDialog()).isNotNull();
     }
 
     @Test
+    public void allSecurityOptions_shouldBeShown_When_OptionsButtonIsClicked() {
+        SetupChooseLockPassword activity = createSetupChooseLockPassword();
+        activity.findViewById(R.id.screen_lock_options).performClick();
+        AlertDialog latestAlertDialog = ShadowAlertDialog.getLatestAlertDialog();
+        int count = Shadows.shadowOf(latestAlertDialog).getAdapter().getCount();
+        assertThat(count).named("List items shown").isEqualTo(3);
+    }
+
+    @Test
     public void createActivity_clickDifferentOption_extrasShouldBePropagated() {
         Bundle bundle = new Bundle();
         bundle.putString("foo", "bar");
@@ -111,4 +114,12 @@
         assertThat(chooseLockIntent.intent.getStringExtra("foo")).named("Foo extra")
                 .isEqualTo("bar");
     }
+
+    private SetupChooseLockPassword createSetupChooseLockPassword() {
+        Intent intent = SetupChooseLockPassword.modifyIntentForSetup(
+                application,
+                new IntentBuilder(application).build());
+        intent.putExtra(ChooseLockGenericFragment.EXTRA_SHOW_OPTIONS_BUTTON, true);
+        return Robolectric.buildActivity(SetupChooseLockPassword.class, intent).setup().get();
+    }
 }
