diff --git a/components/app_restore/BUILD.gn b/components/app_restore/BUILD.gn
index c0c807fff5c77..d04a662835c07 100644
--- a/components/app_restore/BUILD.gn
+++ b/components/app_restore/BUILD.gn
@@ -31,6 +31,8 @@ component("app_restore") {
     "full_restore_save_handler.h",
     "full_restore_utils.cc",
     "full_restore_utils.h",
+    "lacros_read_handler.cc",
+    "lacros_read_handler.h",
     "lacros_save_handler.cc",
     "lacros_save_handler.h",
     "restore_data.cc",
diff --git a/components/app_restore/app_restore_utils.cc b/components/app_restore/app_restore_utils.cc
index c5b6ccf5f08b7..2d51c21938e32 100644
--- a/components/app_restore/app_restore_utils.cc
+++ b/components/app_restore/app_restore_utils.cc
@@ -209,10 +209,11 @@ void OnLacrosWindowAdded(aura::Window* const window,
     return;
   }
 
+  full_restore::FullRestoreReadHandler::GetInstance()
+      ->OnLacrosBrowserWindowAdded(window, restored_browser_session_id);
+
   full_restore::FullRestoreSaveHandler::GetInstance()
       ->OnLacrosBrowserWindowAdded(window, browser_session_id);
-
-  // TODO(https://crbug.com/1239984): Restore Lacros windows.
 }
 
 }  // namespace app_restore
diff --git a/components/app_restore/full_restore_read_handler.cc b/components/app_restore/full_restore_read_handler.cc
index fd56e03438207..cefe1310856a9 100644
--- a/components/app_restore/full_restore_read_handler.cc
+++ b/components/app_restore/full_restore_read_handler.cc
@@ -15,9 +15,11 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/app_restore/app_launch_info.h"
 #include "components/app_restore/desk_template_read_handler.h"
+#include "components/app_restore/features.h"
 #include "components/app_restore/full_restore_file_handler.h"
 #include "components/app_restore/full_restore_info.h"
 #include "components/app_restore/full_restore_save_handler.h"
+#include "components/app_restore/lacros_read_handler.h"
 #include "components/app_restore/restore_data.h"
 #include "components/app_restore/window_info.h"
 #include "components/app_restore/window_properties.h"
@@ -33,6 +35,7 @@ namespace {
 //  apps.
 constexpr base::TimeDelta kFullRestoreEstimateDuration = base::Seconds(5);
 constexpr base::TimeDelta kFullRestoreARCEstimateDuration = base::Minutes(5);
+constexpr base::TimeDelta kFullRestoreLacrosEstimateDuration = base::Minutes(1);
 
 }  // namespace
 
@@ -139,6 +142,15 @@ void FullRestoreReadHandler::OnTaskDestroyed(int32_t task_id) {
     arc_read_handler_->OnTaskDestroyed(task_id);
 }
 
+void FullRestoreReadHandler::OnLacrosBrowserWindowAdded(
+    aura::Window* const window,
+    uint32_t restored_browser_session_id) {
+  if (lacros_read_handler_) {
+    lacros_read_handler_->OnLacrosBrowserWindowAdded(
+        window, restored_browser_session_id);
+  }
+}
+
 void FullRestoreReadHandler::SetActiveProfilePath(
     const base::FilePath& profile_path) {
   active_profile_path_ = profile_path;
@@ -307,11 +319,21 @@ bool FullRestoreReadHandler::IsFullRestoreRunning() const {
     return false;
 
   base::TimeDelta elapsed_time = base::TimeTicks::Now() - it->second;
+
   // We estimate that full restore is still running if it has been less than
-  // five seconds since it started, or five minutes if there is at least one ARC
-  // app.
-  return arc_read_handler_ ? elapsed_time < kFullRestoreARCEstimateDuration
-                           : elapsed_time < kFullRestoreEstimateDuration;
+  // five minutes since it started, when there is at least one ARC app, since it
+  // might take long time to boot ARC.
+  if (arc_read_handler_)
+    return elapsed_time < kFullRestoreARCEstimateDuration;
+
+  // We estimate that full restore is still running if it has been less than
+  // one minute since it started, when Lacros is available.
+  if (lacros_read_handler_)
+    return elapsed_time < kFullRestoreLacrosEstimateDuration;
+
+  // We estimate that full restore is still running if it has been less than
+  // five seconds since it started.
+  return elapsed_time < kFullRestoreEstimateDuration;
 }
 
 void FullRestoreReadHandler::AddChromeBrowserLaunchInfoForTesting(
@@ -354,6 +376,11 @@ void FullRestoreReadHandler::OnGetRestoreData(
   if (restore_data) {
     profile_path_to_restore_data_[profile_path] = restore_data->Clone();
 
+    if (::full_restore::features::IsFullRestoreForLacrosEnabled()) {
+      lacros_read_handler_ =
+          std::make_unique<app_restore::LacrosReadHandler>(profile_path);
+    }
+
     for (auto it = restore_data->app_id_to_launch_list().begin();
          it != restore_data->app_id_to_launch_list().end(); it++) {
       const std::string& app_id = it->first;
@@ -370,6 +397,10 @@ void FullRestoreReadHandler::OnGetRestoreData(
         } else {
           window_id_to_app_restore_info_[window_id] =
               std::make_pair(profile_path, app_id);
+          // TODO(crbug.com/1239984): Remove restore data from
+          // `lacros_read_handler_` for ash browser apps.
+          if (lacros_read_handler_ && app_id != extension_misc::kChromeAppId)
+            lacros_read_handler_->AddRestoreData(app_id, window_id);
         }
       }
     }
diff --git a/components/app_restore/full_restore_read_handler.h b/components/app_restore/full_restore_read_handler.h
index 6b513725952e3..d5caea3eb8624 100644
--- a/components/app_restore/full_restore_read_handler.h
+++ b/components/app_restore/full_restore_read_handler.h
@@ -25,6 +25,7 @@
 
 namespace app_restore {
 struct AppLaunchInfo;
+class LacrosReadHandler;
 class RestoreData;
 struct WindowInfo;
 }  // namespace app_restore
@@ -92,6 +93,11 @@ class COMPONENT_EXPORT(APP_RESTORE) FullRestoreReadHandler
                      int32_t session_id) override;
   void OnTaskDestroyed(int32_t task_id) override;
 
+  // Invoked when Lacros window is created. `restored_browser_session_id` is the
+  // restored browser session id.
+  void OnLacrosBrowserWindowAdded(aura::Window* const window,
+                                  uint32_t restored_browser_session_id);
+
   void SetActiveProfilePath(const base::FilePath& profile_path);
 
   // Sets whether we should check the restore data for `profile_path`. If the
@@ -210,6 +216,8 @@ class COMPONENT_EXPORT(APP_RESTORE) FullRestoreReadHandler
 
   std::unique_ptr<app_restore::ArcReadHandler> arc_read_handler_;
 
+  std::unique_ptr<app_restore::LacrosReadHandler> lacros_read_handler_;
+
   // Records whether we need to check the restore data for the profile path. If
   // the profile path is recorded, we should check the restore data. Otherwise,
   // we don't need to check the restore data, because the restore process hasn't
diff --git a/components/app_restore/lacros_read_handler.cc b/components/app_restore/lacros_read_handler.cc
new file mode 100644
index 0000000000000..a183ea324094e
--- /dev/null
+++ b/components/app_restore/lacros_read_handler.cc
@@ -0,0 +1,34 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/app_restore/lacros_read_handler.h"
+
+#include "ash/constants/app_types.h"
+#include "components/app_restore/app_restore_utils.h"
+#include "ui/aura/client/aura_constants.h"
+#include "ui/aura/window.h"
+
+namespace app_restore {
+
+LacrosReadHandler::LacrosReadHandler(const base::FilePath& profile_path)
+    : profile_path_(profile_path) {}
+
+LacrosReadHandler::~LacrosReadHandler() = default;
+
+void LacrosReadHandler::AddRestoreData(const std::string& app_id,
+                                       int32_t window_id) {
+  restore_window_id_to_app_id_[window_id] = app_id;
+}
+
+void LacrosReadHandler::OnLacrosBrowserWindowAdded(
+    aura::Window* const window,
+    uint32_t restored_browser_session_id) {
+  if (window->GetProperty(aura::client::kAppType) ==
+      static_cast<int>(ash::AppType::LACROS)) {
+    lacros_window_id_to_restore_window_id_[app_restore::GetLacrosWindowId(
+        window)] = restored_browser_session_id;
+  }
+}
+
+}  // namespace app_restore
diff --git a/components/app_restore/lacros_read_handler.h b/components/app_restore/lacros_read_handler.h
new file mode 100644
index 0000000000000..45cae80fe3956
--- /dev/null
+++ b/components/app_restore/lacros_read_handler.h
@@ -0,0 +1,52 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_APP_RESTORE_LACROS_READ_HANDLER_H_
+#define COMPONENTS_APP_RESTORE_LACROS_READ_HANDLER_H_
+
+#include <map>
+
+#include "base/component_export.h"
+#include "base/files/file_path.h"
+
+namespace aura {
+class Window;
+}
+
+namespace app_restore {
+
+// LacrosSaveHandler is a helper class for FullRestoreReadHandler to restore
+// Lacros windows.
+// TODO(crbug.com/1239984): Restore Lacros windows.
+class COMPONENT_EXPORT(APP_RESTORE) LacrosReadHandler {
+ public:
+  LacrosReadHandler(const base::FilePath& profile_path);
+  LacrosReadHandler(const LacrosReadHandler&) = delete;
+  LacrosReadHandler& operator=(const LacrosReadHandler&) = delete;
+  ~LacrosReadHandler();
+
+  // Sets `app_id` and `window_id` to `restore_window_id_to_app_id_` to record
+  // that there is a restore data for `app_id` and `window_id`.
+  void AddRestoreData(const std::string& app_id, int32_t window_id);
+
+  // Invoked when Lacros window is created. `restored_browser_session_id` is the
+  // restored browser session id.
+  void OnLacrosBrowserWindowAdded(aura::Window* const window,
+                                  uint32_t restored_browser_session_id);
+
+ private:
+  // The user profile path for Lacros windows.
+  base::FilePath profile_path_;
+
+  // The map from the restore window id to the app id for Lacros windows.
+  std::map<int32_t, std::string> restore_window_id_to_app_id_;
+
+  // The map from the lacros window id to the restore window id for browser
+  // windows.
+  std::map<std::string, int32_t> lacros_window_id_to_restore_window_id_;
+};
+
+}  // namespace app_restore
+
+#endif  // COMPONENTS_APP_RESTORE_LACROS_READ_HANDLER_H_
diff --git a/components/app_restore/lacros_save_handler.h b/components/app_restore/lacros_save_handler.h
index 6eb88d478f64b..94bbe9057313f 100644
--- a/components/app_restore/lacros_save_handler.h
+++ b/components/app_restore/lacros_save_handler.h
@@ -22,8 +22,6 @@ namespace full_restore {
 
 // LacrosSaveHandler is a helper class for FullRestoreSaveHandler to handle
 // Lacros windows special cases, e.g. Lacros window id, etc.
-// TODO(crbug.com/1239984):
-// 1. Use the browser session id as the window id.
 class COMPONENT_EXPORT(APP_RESTORE) LacrosSaveHandler {
  public:
   explicit LacrosSaveHandler(const base::FilePath& profile_path);