diff --git a/includes/session.inc b/includes/session.inc
index 25aa3475e9..745e308358 100644
--- a/includes/session.inc
+++ b/includes/session.inc
@@ -371,10 +371,20 @@ function drupal_session_regenerate() {
 
   if (drupal_session_started()) {
     $old_session_id = session_id();
+    // PHP 7.3 requires that we close session before setting new session ID.
+    $original_session_saving = drupal_save_session();
+    drupal_save_session(FALSE);
+    session_write_close();
+    drupal_session_started(FALSE);
   }
   session_id(drupal_random_key());
 
   if (isset($old_session_id)) {
+    // Preserve and restore user object, as starting session will reset it.
+    $original_user = $user;
+    drupal_session_start();
+    $user = $original_user;
+    drupal_save_session($original_session_saving);
     $params = session_get_cookie_params();
     $expire = $params['lifetime'] ? REQUEST_TIME + $params['lifetime'] : 0;
     setcookie(session_name(), session_id(), $expire, $params['path'], $params['domain'], $params['secure'], $params['httponly']);
