diff --git a/dlls/ntdll/unix/env.c b/dlls/ntdll/unix/env.c
index 5d5562e27c0b8d1b8615edf4d46df1e1bdcf8934..077c0058c8332accbb95b3778309ca3333dff414 100644
--- a/dlls/ntdll/unix/env.c
+++ b/dlls/ntdll/unix/env.c
@@ -2006,7 +2006,6 @@ static void init_peb( RTL_USER_PROCESS_PARAMETERS *params, void *module )
     peb->ImageSubSystem             = main_image_info.SubSystemType;
     peb->ImageSubSystemMajorVersion = main_image_info.MajorSubsystemVersion;
     peb->ImageSubSystemMinorVersion = main_image_info.MinorSubsystemVersion;
-    peb->SessionId                  = 1;
 
     if (NtCurrentTeb()->WowTebOffset)
     {
diff --git a/dlls/ntdll/unix/server.c b/dlls/ntdll/unix/server.c
index 5e3d7347a2413a22fb3812edac052c300ab3cc51..567f50d0ad7a52761ae03f18e575a3bd42678306 100644
--- a/dlls/ntdll/unix/server.c
+++ b/dlls/ntdll/unix/server.c
@@ -1513,6 +1513,7 @@ size_t server_init_process(void)
         ret = wine_server_call( req );
         pid               = reply->pid;
         tid               = reply->tid;
+        peb->SessionId    = reply->session_id;
         info_size         = reply->info_size;
         server_start_time = reply->server_start;
         supported_machines_count = wine_server_reply_size( reply ) / sizeof(*supported_machines);
diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h
index d73f493edd306c104dc6bd5746167c847e55ca57..32cbc928c7661b7bf459fd3e89d9c4d2f1ce2026 100644
--- a/include/wine/server_protocol.h
+++ b/include/wine/server_protocol.h
@@ -933,9 +933,9 @@ struct init_first_thread_reply
     process_id_t pid;
     thread_id_t  tid;
     timeout_t    server_start;
+    unsigned int session_id;
     data_size_t  info_size;
     /* VARARG(machines,ushorts); */
-    char __pad_28[4];
 };
 
 
@@ -6251,7 +6251,7 @@ union generic_reply
 
 /* ### protocol_version begin ### */
 
-#define SERVER_PROTOCOL_VERSION 720
+#define SERVER_PROTOCOL_VERSION 721
 
 /* ### protocol_version end ### */
 
diff --git a/server/directory.c b/server/directory.c
index 30d6945998474486146aaf2bacc69df8569d809a..ec8187b425af36257954ab3a7d4f1559e27672b4 100644
--- a/server/directory.c
+++ b/server/directory.c
@@ -462,7 +462,7 @@ void init_directories( struct fd *intl_fd )
 
     /* sessions */
     create_session( 0 );
-    create_session( 1 );
+    create_session( default_session_id );
 
     /* object types */
 
diff --git a/server/process.c b/server/process.c
index 9288bcc27d5cc886e816884c46a3feac64f21a2c..ad79a5ed640bd9ba9fa77473769333cf39bf267c 100644
--- a/server/process.c
+++ b/server/process.c
@@ -686,6 +686,7 @@ struct process *create_process( int fd, struct process *parent, unsigned int fla
         process->affinity = parent->affinity;
     }
     if (!process->handles || !process->token) goto error;
+    process->session_id = default_session_id;
 
     /* Assign a high security label to the token. The default would be medium
      * but Wine provides admin access to all applications right now so high
diff --git a/server/process.h b/server/process.h
index 0e1a83859d9d41330f9b6b5432e64551d1a7ebb7..55e4d6dced63528a3f0f20616565759538b5149d 100644
--- a/server/process.h
+++ b/server/process.h
@@ -51,6 +51,7 @@ struct process
     struct fd           *msg_fd;          /* fd for sendmsg/recvmsg */
     process_id_t         id;              /* id of the process */
     process_id_t         group_id;        /* group id of the process */
+    unsigned int         session_id;      /* session id */
     struct timeout_user *sigkill_timeout; /* timeout for final SIGKILL */
     unsigned short       machine;         /* client machine type */
     int                  unix_pid;        /* Unix pid for final SIGKILL */
@@ -142,4 +143,6 @@ static inline int is_process_init_done( struct process *process )
     return process->startup_state == STARTUP_DONE;
 }
 
+static const unsigned int default_session_id = 1;
+
 #endif  /* __WINE_SERVER_PROCESS_H */
diff --git a/server/protocol.def b/server/protocol.def
index 59ed56325031ab3c8761e15092fc2fdd49adcff1..ae9a54197a13a863f3947d5709b99cc4746807a4 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -911,6 +911,7 @@ typedef struct
     process_id_t pid;          /* process id of the new thread's process */
     thread_id_t  tid;          /* thread id of the new thread */
     timeout_t    server_start; /* server start time */
+    unsigned int session_id;   /* process session id */
     data_size_t  info_size;    /* total size of startup info */
     VARARG(machines,ushorts);  /* array of supported machines */
 @END
diff --git a/server/request.h b/server/request.h
index 63b09358612476fa6f8a4db6b9f0b3ae648c898a..342f8d159f15c818a1f2b44edb85d0f43ed39fc1 100644
--- a/server/request.h
+++ b/server/request.h
@@ -752,7 +752,8 @@ C_ASSERT( sizeof(struct init_first_thread_request) == 32 );
 C_ASSERT( FIELD_OFFSET(struct init_first_thread_reply, pid) == 8 );
 C_ASSERT( FIELD_OFFSET(struct init_first_thread_reply, tid) == 12 );
 C_ASSERT( FIELD_OFFSET(struct init_first_thread_reply, server_start) == 16 );
-C_ASSERT( FIELD_OFFSET(struct init_first_thread_reply, info_size) == 24 );
+C_ASSERT( FIELD_OFFSET(struct init_first_thread_reply, session_id) == 24 );
+C_ASSERT( FIELD_OFFSET(struct init_first_thread_reply, info_size) == 28 );
 C_ASSERT( sizeof(struct init_first_thread_reply) == 32 );
 C_ASSERT( FIELD_OFFSET(struct init_thread_request, unix_tid) == 12 );
 C_ASSERT( FIELD_OFFSET(struct init_thread_request, reply_fd) == 16 );
diff --git a/server/thread.c b/server/thread.c
index f9535a7b25b51898b34731193d36d94c36253a78..e0c520ee37c7439b255ddc2dbf677cad73b160de 100644
--- a/server/thread.c
+++ b/server/thread.c
@@ -1431,6 +1431,7 @@ DECL_HANDLER(init_first_thread)
 
     reply->pid          = get_process_id( process );
     reply->tid          = get_thread_id( current );
+    reply->session_id   = process->session_id;
     reply->info_size    = get_process_startup_info_size( process );
     reply->server_start = server_start_time;
     set_reply_data( supported_machines,
diff --git a/server/trace.c b/server/trace.c
index b3eea8464534c3960ba361cee596ebded54695b8..d5d58c215884c379874d9a805fc9def4fb05776f 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -1530,6 +1530,7 @@ static void dump_init_first_thread_reply( const struct init_first_thread_reply *
     fprintf( stderr, " pid=%04x", req->pid );
     fprintf( stderr, ", tid=%04x", req->tid );
     dump_timeout( ", server_start=", &req->server_start );
+    fprintf( stderr, ", session_id=%08x", req->session_id );
     fprintf( stderr, ", info_size=%u", req->info_size );
     dump_varargs_ushorts( ", machines=", cur_size );
 }