diff --git a/packages/e2e-tests/test-applications/nextjs-app-dir/app/(nested-layout)/layout.tsx b/packages/e2e-tests/test-applications/nextjs-app-dir/app/(nested-layout)/layout.tsx
new file mode 100644
index 000000000000..ace0c2f086b7
--- /dev/null
+++ b/packages/e2e-tests/test-applications/nextjs-app-dir/app/(nested-layout)/layout.tsx
@@ -0,0 +1,12 @@
+import { PropsWithChildren } from 'react';
+
+export const dynamic = 'force-dynamic';
+
+export default function Layout({ children }: PropsWithChildren<{}>) {
+ return (
+
+ );
+}
diff --git a/packages/e2e-tests/test-applications/nextjs-app-dir/app/(nested-layout)/nested-layout/layout.tsx b/packages/e2e-tests/test-applications/nextjs-app-dir/app/(nested-layout)/nested-layout/layout.tsx
new file mode 100644
index 000000000000..ace0c2f086b7
--- /dev/null
+++ b/packages/e2e-tests/test-applications/nextjs-app-dir/app/(nested-layout)/nested-layout/layout.tsx
@@ -0,0 +1,12 @@
+import { PropsWithChildren } from 'react';
+
+export const dynamic = 'force-dynamic';
+
+export default function Layout({ children }: PropsWithChildren<{}>) {
+ return (
+
+ );
+}
diff --git a/packages/e2e-tests/test-applications/nextjs-app-dir/app/(nested-layout)/nested-layout/page.tsx b/packages/e2e-tests/test-applications/nextjs-app-dir/app/(nested-layout)/nested-layout/page.tsx
new file mode 100644
index 000000000000..8077c14d23ca
--- /dev/null
+++ b/packages/e2e-tests/test-applications/nextjs-app-dir/app/(nested-layout)/nested-layout/page.tsx
@@ -0,0 +1,11 @@
+export const dynamic = 'force-dynamic';
+
+export default function Page() {
+ return Hello World!
;
+}
+
+export async function generateMetadata() {
+ return {
+ title: 'I am generated metadata',
+ };
+}
diff --git a/packages/e2e-tests/test-applications/nextjs-app-dir/tests/connected-servercomponent-trace.test.ts b/packages/e2e-tests/test-applications/nextjs-app-dir/tests/connected-servercomponent-trace.test.ts
new file mode 100644
index 000000000000..4acc41814d3c
--- /dev/null
+++ b/packages/e2e-tests/test-applications/nextjs-app-dir/tests/connected-servercomponent-trace.test.ts
@@ -0,0 +1,50 @@
+import { expect, test } from '@playwright/test';
+import { waitForTransaction } from '../event-proxy-server';
+
+test('Will capture a connected trace for all server components and generation functions when visiting a page', async ({
+ page,
+}) => {
+ const someConnectedEvent = waitForTransaction('nextjs-13-app-dir', async transactionEvent => {
+ return (
+ transactionEvent?.transaction === 'Layout Server Component (/(nested-layout)/nested-layout)' ||
+ transactionEvent?.transaction === 'Layout Server Component (/(nested-layout))' ||
+ transactionEvent?.transaction === 'Page Server Component (/(nested-layout)/nested-layout)' ||
+ transactionEvent?.transaction === 'Page.generateMetadata (/(nested-layout)/nested-layout)'
+ );
+ });
+
+ const layout1Transaction = waitForTransaction('nextjs-13-app-dir', async transactionEvent => {
+ return (
+ transactionEvent?.transaction === 'Layout Server Component (/(nested-layout)/nested-layout)' &&
+ (await someConnectedEvent).contexts?.trace?.trace_id === transactionEvent.contexts?.trace?.trace_id
+ );
+ });
+
+ const layout2Transaction = waitForTransaction('nextjs-13-app-dir', async transactionEvent => {
+ return (
+ transactionEvent?.transaction === 'Layout Server Component (/(nested-layout))' &&
+ (await someConnectedEvent).contexts?.trace?.trace_id === transactionEvent.contexts?.trace?.trace_id
+ );
+ });
+
+ const pageTransaction = waitForTransaction('nextjs-13-app-dir', async transactionEvent => {
+ return (
+ transactionEvent?.transaction === 'Page Server Component (/(nested-layout)/nested-layout)' &&
+ (await someConnectedEvent).contexts?.trace?.trace_id === transactionEvent.contexts?.trace?.trace_id
+ );
+ });
+
+ const generateMetadataTransaction = waitForTransaction('nextjs-13-app-dir', async transactionEvent => {
+ return (
+ transactionEvent?.transaction === 'Page.generateMetadata (/(nested-layout)/nested-layout)' &&
+ (await someConnectedEvent).contexts?.trace?.trace_id === transactionEvent.contexts?.trace?.trace_id
+ );
+ });
+
+ await page.goto('/nested-layout');
+
+ expect(await layout1Transaction).toBeDefined();
+ expect(await layout2Transaction).toBeDefined();
+ expect(await pageTransaction).toBeDefined();
+ expect(await generateMetadataTransaction).toBeDefined();
+});
diff --git a/packages/nextjs/src/common/utils/commonObjectTracing.ts b/packages/nextjs/src/common/utils/commonObjectTracing.ts
new file mode 100644
index 000000000000..bb5cf130bab1
--- /dev/null
+++ b/packages/nextjs/src/common/utils/commonObjectTracing.ts
@@ -0,0 +1,23 @@
+import type { PropagationContext } from '@sentry/types';
+
+const commonMap = new WeakMap