diff --git a/build.gradle b/build.gradle
index 47b3ab240d..5593a56f6e 100644
--- a/build.gradle
+++ b/build.gradle
@@ -41,6 +41,8 @@ allprojects {
                 includeGroupByRegex 'com\\.github\\.BillCarsonFr'
                 // PhotoView
                 includeGroupByRegex 'com\\.github\\.chrisbanes'
+                // PFLockScreen-Android
+                includeGroupByRegex 'com\\.github\\.thealeksandr'
             }
         }
         maven {
diff --git a/vector/build.gradle b/vector/build.gradle
index 2b033790bc..0d654438f5 100644
--- a/vector/build.gradle
+++ b/vector/build.gradle
@@ -346,6 +346,7 @@ dependencies {
     implementation 'me.saket:better-link-movement-method:2.2.0'
     implementation 'com.google.android:flexbox:1.1.1'
     implementation "androidx.autofill:autofill:$autofill_version"
+    implementation 'com.github.thealeksandr:PFLockScreen-Android:1.0.0-beta7'
 
     // Custom Tab
     implementation 'androidx.browser:browser:1.2.0'
diff --git a/vector/src/debug/java/im/vector/riotx/features/debug/DebugMenuActivity.kt b/vector/src/debug/java/im/vector/riotx/features/debug/DebugMenuActivity.kt
index a197a6f93e..29ed6d101c 100644
--- a/vector/src/debug/java/im/vector/riotx/features/debug/DebugMenuActivity.kt
+++ b/vector/src/debug/java/im/vector/riotx/features/debug/DebugMenuActivity.kt
@@ -36,6 +36,7 @@ import im.vector.riotx.core.utils.allGranted
 import im.vector.riotx.core.utils.checkPermissions
 import im.vector.riotx.core.utils.toast
 import im.vector.riotx.features.debug.sas.DebugSasEmojiActivity
+import im.vector.riotx.features.pin.PinActivity
 import im.vector.riotx.features.qrcode.QrCodeScannerActivity
 import kotlinx.android.synthetic.debug.activity_debug_menu.*
 import timber.log.Timber
@@ -81,6 +82,11 @@ class DebugMenuActivity : VectorBaseActivity() {
         startActivity(Intent(this, DebugSasEmojiActivity::class.java))
     }
 
+    @OnClick(R.id.debug_open_pin_code)
+    fun openPinCode() {
+        startActivity(PinActivity.newIntent(this))
+    }
+
     @OnClick(R.id.debug_test_notification)
     fun testNotification() {
         val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
diff --git a/vector/src/debug/res/layout/activity_debug_menu.xml b/vector/src/debug/res/layout/activity_debug_menu.xml
index 6578258e70..d0e94f49a4 100644
--- a/vector/src/debug/res/layout/activity_debug_menu.xml
+++ b/vector/src/debug/res/layout/activity_debug_menu.xml
@@ -61,6 +61,13 @@
                 android:layout_height="wrap_content"
                 android:text="Crash the app" />
 
+            <com.google.android.material.button.MaterialButton
+                android:id="@+id/debug_open_pin_code"
+                style="@style/VectorButtonStyle"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="Open pin code screen" />
+
             <com.google.android.material.button.MaterialButton
                 android:id="@+id/debug_scan_qr_code"
                 style="@style/VectorButtonStyle"
diff --git a/vector/src/main/AndroidManifest.xml b/vector/src/main/AndroidManifest.xml
index 344a10e75b..32ba828d36 100644
--- a/vector/src/main/AndroidManifest.xml
+++ b/vector/src/main/AndroidManifest.xml
@@ -205,6 +205,7 @@
 
         <activity android:name=".features.terms.ReviewTermsActivity" />
         <activity android:name=".features.widgets.WidgetActivity" />
+        <activity android:name=".features.pin.PinActivity" />
 
         <!-- Services -->
 
diff --git a/vector/src/main/java/im/vector/riotx/core/di/FragmentModule.kt b/vector/src/main/java/im/vector/riotx/core/di/FragmentModule.kt
index 8e4f95ed54..9efe0e6adb 100644
--- a/vector/src/main/java/im/vector/riotx/core/di/FragmentModule.kt
+++ b/vector/src/main/java/im/vector/riotx/core/di/FragmentModule.kt
@@ -66,6 +66,7 @@ import im.vector.riotx.features.login.LoginSplashFragment
 import im.vector.riotx.features.login.LoginWaitForEmailFragment
 import im.vector.riotx.features.login.LoginWebFragment
 import im.vector.riotx.features.login.terms.LoginTermsFragment
+import im.vector.riotx.features.pin.PinFragment
 import im.vector.riotx.features.qrcode.QrCodeScannerFragment
 import im.vector.riotx.features.reactions.EmojiChooserFragment
 import im.vector.riotx.features.reactions.EmojiSearchResultFragment
@@ -534,4 +535,9 @@ interface FragmentModule {
     @IntoMap
     @FragmentKey(ContactsBookFragment::class)
     fun bindPhoneBookFragment(fragment: ContactsBookFragment): Fragment
+
+    @Binds
+    @IntoMap
+    @FragmentKey(PinFragment::class)
+    fun bindPinFragment(fragment: PinFragment): Fragment
 }
diff --git a/vector/src/main/java/im/vector/riotx/features/navigation/DefaultNavigator.kt b/vector/src/main/java/im/vector/riotx/features/navigation/DefaultNavigator.kt
index 8267ba4c99..7d17545309 100644
--- a/vector/src/main/java/im/vector/riotx/features/navigation/DefaultNavigator.kt
+++ b/vector/src/main/java/im/vector/riotx/features/navigation/DefaultNavigator.kt
@@ -52,6 +52,7 @@ import im.vector.riotx.features.invite.InviteUsersToRoomActivity
 import im.vector.riotx.features.media.AttachmentData
 import im.vector.riotx.features.media.BigImageViewerActivity
 import im.vector.riotx.features.media.VectorAttachmentViewerActivity
+import im.vector.riotx.features.pin.PinActivity
 import im.vector.riotx.features.roomdirectory.RoomDirectoryActivity
 import im.vector.riotx.features.roomdirectory.createroom.CreateRoomActivity
 import im.vector.riotx.features.roomdirectory.roompreview.RoomPreviewActivity
@@ -250,6 +251,7 @@ class DefaultNavigator @Inject constructor(
                 }
     }
 
+
     override fun openTerms(fragment: Fragment, serviceType: TermsService.ServiceType, baseUrl: String, token: String?, requestCode: Int) {
         val intent = ReviewTermsActivity.intent(fragment.requireContext(), serviceType, baseUrl, token)
         fragment.startActivityForResult(intent, requestCode)
@@ -272,6 +274,11 @@ class DefaultNavigator @Inject constructor(
         context.startActivity(WidgetActivity.newIntent(context, widgetArgs))
     }
 
+    override fun openPinCode(activity: Activity, requestCode: Int) {
+        val intent = PinActivity.newIntent(activity)
+        activity.startActivity(intent)
+    }
+
     override fun openMediaViewer(activity: Activity,
                                  roomId: String,
                                  mediaData: AttachmentData,
diff --git a/vector/src/main/java/im/vector/riotx/features/navigation/Navigator.kt b/vector/src/main/java/im/vector/riotx/features/navigation/Navigator.kt
index 2d817183be..7ffef9aa34 100644
--- a/vector/src/main/java/im/vector/riotx/features/navigation/Navigator.kt
+++ b/vector/src/main/java/im/vector/riotx/features/navigation/Navigator.kt
@@ -78,6 +78,8 @@ interface Navigator {
 
     fun openBigImageViewer(activity: Activity, sharedElement: View?, matrixItem: MatrixItem)
 
+    fun openPinCode(activity: Activity, requestCode: Int = ReviewTermsActivity.TERMS_REQUEST_CODE)
+
     fun openTerms(fragment: Fragment,
                   serviceType: TermsService.ServiceType,
                   baseUrl: String,
diff --git a/vector/src/main/java/im/vector/riotx/features/pin/PinAction.kt b/vector/src/main/java/im/vector/riotx/features/pin/PinAction.kt
new file mode 100644
index 0000000000..fd8aac90bb
--- /dev/null
+++ b/vector/src/main/java/im/vector/riotx/features/pin/PinAction.kt
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 2020 New Vector Ltd
+ *
+ * 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 im.vector.riotx.features.pin
+
+import im.vector.riotx.core.platform.VectorViewModelAction
+
+sealed class PinAction : VectorViewModelAction
diff --git a/vector/src/main/java/im/vector/riotx/features/pin/PinActivity.kt b/vector/src/main/java/im/vector/riotx/features/pin/PinActivity.kt
new file mode 100644
index 0000000000..27322c1539
--- /dev/null
+++ b/vector/src/main/java/im/vector/riotx/features/pin/PinActivity.kt
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2020 New Vector Ltd
+ *
+ * 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 im.vector.riotx.features.pin
+
+import android.content.Context
+import android.content.Intent
+import androidx.appcompat.widget.Toolbar
+import im.vector.riotx.R
+import im.vector.riotx.core.extensions.addFragment
+import im.vector.riotx.core.platform.ToolbarConfigurable
+import im.vector.riotx.core.platform.VectorBaseActivity
+
+class PinActivity : VectorBaseActivity(), ToolbarConfigurable {
+
+    companion object {
+
+        fun newIntent(context: Context): Intent {
+            return Intent(context, PinActivity::class.java)
+        }
+    }
+
+    override fun getLayoutRes() = R.layout.activity_simple
+
+    override fun initUiAndData() {
+        if (isFirstCreation()) {
+            addFragment(R.id.simpleFragmentContainer, PinFragment::class.java)
+        }
+    }
+
+    override fun configure(toolbar: Toolbar) {
+        configureToolbar(toolbar)
+    }
+}
diff --git a/vector/src/main/java/im/vector/riotx/features/pin/PinFragment.kt b/vector/src/main/java/im/vector/riotx/features/pin/PinFragment.kt
new file mode 100644
index 0000000000..07c426a31d
--- /dev/null
+++ b/vector/src/main/java/im/vector/riotx/features/pin/PinFragment.kt
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2020 New Vector Ltd
+ *
+ * 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 im.vector.riotx.features.pin
+
+import android.os.Bundle
+import android.view.View
+import com.airbnb.mvrx.fragmentViewModel
+import com.airbnb.mvrx.withState
+import im.vector.riotx.R
+import im.vector.riotx.core.platform.VectorBaseFragment
+import timber.log.Timber
+import javax.inject.Inject
+
+class PinFragment @Inject constructor(
+        private val viewModelFactory: PinViewModel.Factory
+) : VectorBaseFragment(), PinViewModel.Factory by viewModelFactory {
+
+    private val viewModel: PinViewModel by fragmentViewModel()
+
+    override fun getLayoutResId() = R.layout.fragment_pin
+
+    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+        super.onViewCreated(view, savedInstanceState)
+        // Initialize your view, subscribe to viewModel...
+    }
+
+    override fun onDestroyView() {
+        super.onDestroyView()
+        // Clear your view, unsubscribe...
+    }
+
+    override fun invalidate() = withState(viewModel) { state ->
+        Timber.v("Invalidate $state")
+    }
+}
diff --git a/vector/src/main/java/im/vector/riotx/features/pin/PinViewModel.kt b/vector/src/main/java/im/vector/riotx/features/pin/PinViewModel.kt
new file mode 100644
index 0000000000..9a5cdfd8f9
--- /dev/null
+++ b/vector/src/main/java/im/vector/riotx/features/pin/PinViewModel.kt
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2020 New Vector Ltd
+ *
+ * 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 im.vector.riotx.features.pin
+
+import com.airbnb.mvrx.ActivityViewModelContext
+import com.airbnb.mvrx.FragmentViewModelContext
+import com.airbnb.mvrx.MvRxViewModelFactory
+import com.airbnb.mvrx.ViewModelContext
+import com.squareup.inject.assisted.Assisted
+import com.squareup.inject.assisted.AssistedInject
+import im.vector.riotx.core.platform.EmptyViewEvents
+import im.vector.riotx.core.platform.VectorViewModel
+import timber.log.Timber
+
+class PinViewModel @AssistedInject constructor(@Assisted initialState: PinViewState)
+    : VectorViewModel<PinViewState, PinAction, EmptyViewEvents>(initialState) {
+
+    @AssistedInject.Factory
+    interface Factory {
+        fun create(initialState: PinViewState): PinViewModel
+    }
+
+    companion object : MvRxViewModelFactory<PinViewModel, PinViewState> {
+
+        @JvmStatic
+        override fun create(viewModelContext: ViewModelContext, state: PinViewState): PinViewModel? {
+            val factory = when (viewModelContext) {
+                is FragmentViewModelContext -> viewModelContext.fragment as? Factory
+                is ActivityViewModelContext -> viewModelContext.activity as? Factory
+            }
+            return factory?.create(state) ?: error("You should let your activity/fragment implements Factory interface")
+        }
+    }
+
+    override fun handle(action: PinAction) {
+        Timber.v("$action not handled by viewModel")
+    }
+}
diff --git a/vector/src/main/java/im/vector/riotx/features/pin/PinViewState.kt b/vector/src/main/java/im/vector/riotx/features/pin/PinViewState.kt
new file mode 100644
index 0000000000..45eb9f72c2
--- /dev/null
+++ b/vector/src/main/java/im/vector/riotx/features/pin/PinViewState.kt
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 2020 New Vector Ltd
+ *
+ * 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 im.vector.riotx.features.pin
+
+import com.airbnb.mvrx.MvRxState
+
+data class PinViewState(val flag: Boolean = false) : MvRxState
diff --git a/vector/src/main/res/layout/fragment_pin.xml b/vector/src/main/res/layout/fragment_pin.xml
new file mode 100644
index 0000000000..31742cce30
--- /dev/null
+++ b/vector/src/main/res/layout/fragment_pin.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/rootConstraintLayout"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <TextView
+        android:id="@+id/message"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="PinFragment"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>