diff --git a/test/development/app-dir/hmr-parallel-routes/app/@bar/page.tsx b/test/development/app-dir/hmr-parallel-routes/app/@bar/page.tsx
new file mode 100644
index 0000000000..4289beab2d
--- /dev/null
+++ b/test/development/app-dir/hmr-parallel-routes/app/@bar/page.tsx
@@ -0,0 +1,3 @@
+export default function BarPage() {
+ return
Bar Page
+}
diff --git a/test/development/app-dir/hmr-parallel-routes/app/@foo/page.tsx b/test/development/app-dir/hmr-parallel-routes/app/@foo/page.tsx
new file mode 100644
index 0000000000..621a5e5618
--- /dev/null
+++ b/test/development/app-dir/hmr-parallel-routes/app/@foo/page.tsx
@@ -0,0 +1,3 @@
+export default function FooPage() {
+ return Foo Page
+}
diff --git a/test/development/app-dir/hmr-parallel-routes/app/layout.tsx b/test/development/app-dir/hmr-parallel-routes/app/layout.tsx
new file mode 100644
index 0000000000..199ec46b93
--- /dev/null
+++ b/test/development/app-dir/hmr-parallel-routes/app/layout.tsx
@@ -0,0 +1,14 @@
+import { ReactNode } from 'react'
+
+function Layout(props: { foo: ReactNode; bar: ReactNode }) {
+ return (
+
+
+ {props.foo}
+ {props.bar}
+
+
+ )
+}
+
+export default Layout
diff --git a/test/development/app-dir/hmr-parallel-routes/hmr-parallel-routes.test.ts b/test/development/app-dir/hmr-parallel-routes/hmr-parallel-routes.test.ts
new file mode 100644
index 0000000000..d6bb67f768
--- /dev/null
+++ b/test/development/app-dir/hmr-parallel-routes/hmr-parallel-routes.test.ts
@@ -0,0 +1,30 @@
+import { nextTestSetup } from 'e2e-utils'
+import { assertNoRedbox } from 'next-test-utils'
+
+describe('hmr-parallel-routes', () => {
+ const { next } = nextTestSetup({
+ files: __dirname,
+ })
+
+ it('should update parallel routes via HMR', async () => {
+ const browser = await next.browser('/')
+ expect(await browser.elementByCss('#bar').text()).toBe('Bar Page')
+ expect(await browser.elementByCss('#foo').text()).toBe('Foo Page')
+
+ await next.patchFile('app/@bar/page.tsx', (content) =>
+ content.replace('Bar Page', 'Bar Page Updated')
+ )
+
+ await assertNoRedbox(browser)
+
+ expect(await browser.elementByCss('#bar').text()).toBe('Bar Page Updated')
+
+ await next.patchFile('app/@foo/page.tsx', (content) =>
+ content.replace('Foo Page', 'Foo Page Updated')
+ )
+
+ await assertNoRedbox(browser)
+
+ expect(await browser.elementByCss('#foo').text()).toBe('Foo Page Updated')
+ })
+})
diff --git a/test/development/app-dir/hmr-parallel-routes/next.config.js b/test/development/app-dir/hmr-parallel-routes/next.config.js
new file mode 100644
index 0000000000..807126e4cf
--- /dev/null
+++ b/test/development/app-dir/hmr-parallel-routes/next.config.js
@@ -0,0 +1,6 @@
+/**
+ * @type {import('next').NextConfig}
+ */
+const nextConfig = {}
+
+module.exports = nextConfig