diff --git a/src/runtime/internal/Component.ts b/src/runtime/internal/Component.ts
index 10588a0804..7d2a92fa1b 100644
--- a/src/runtime/internal/Component.ts
+++ b/src/runtime/internal/Component.ts
@@ -1,7 +1,7 @@
import { add_render_callback, flush, schedule_update, dirty_components } from './scheduler';
import { current_component, set_current_component } from './lifecycle';
import { blank_object, is_function, run, run_all, noop } from './utils';
-import { children } from './dom';
+import { children, detach } from './dom';
import { transition_in } from './transitions';
interface Fragment {
@@ -146,8 +146,10 @@ export function init(component, options, instance, create_fragment, not_equal, p
if (options.target) {
if (options.hydrate) {
+ const nodes = children(options.target);
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
- $$.fragment && $$.fragment!.l(children(options.target));
+ $$.fragment && $$.fragment!.l(nodes);
+ nodes.forEach(detach);
} else {
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
$$.fragment && $$.fragment!.c();
diff --git a/test/hydration/samples/top-level-cleanup-2/_after.html b/test/hydration/samples/top-level-cleanup-2/_after.html
new file mode 100644
index 0000000000..8dca56dd88
--- /dev/null
+++ b/test/hydration/samples/top-level-cleanup-2/_after.html
@@ -0,0 +1 @@
+
Hello world
\ No newline at end of file
diff --git a/test/hydration/samples/top-level-cleanup-2/_before.html b/test/hydration/samples/top-level-cleanup-2/_before.html
new file mode 100644
index 0000000000..fdc2379f63
--- /dev/null
+++ b/test/hydration/samples/top-level-cleanup-2/_before.html
@@ -0,0 +1,2 @@
+This should be thrown away
+hello
\ No newline at end of file
diff --git a/test/hydration/samples/top-level-cleanup-2/_config.js b/test/hydration/samples/top-level-cleanup-2/_config.js
new file mode 100644
index 0000000000..ff8b4c5632
--- /dev/null
+++ b/test/hydration/samples/top-level-cleanup-2/_config.js
@@ -0,0 +1 @@
+export default {};
diff --git a/test/hydration/samples/top-level-cleanup-2/main.svelte b/test/hydration/samples/top-level-cleanup-2/main.svelte
new file mode 100644
index 0000000000..8dca56dd88
--- /dev/null
+++ b/test/hydration/samples/top-level-cleanup-2/main.svelte
@@ -0,0 +1 @@
+Hello world
\ No newline at end of file
diff --git a/test/hydration/samples/top-level-cleanup/_after.html b/test/hydration/samples/top-level-cleanup/_after.html
new file mode 100644
index 0000000000..8dca56dd88
--- /dev/null
+++ b/test/hydration/samples/top-level-cleanup/_after.html
@@ -0,0 +1 @@
+Hello world
\ No newline at end of file
diff --git a/test/hydration/samples/top-level-cleanup/_before.html b/test/hydration/samples/top-level-cleanup/_before.html
new file mode 100644
index 0000000000..c7e4bba233
--- /dev/null
+++ b/test/hydration/samples/top-level-cleanup/_before.html
@@ -0,0 +1 @@
+This should be thrown away
\ No newline at end of file
diff --git a/test/hydration/samples/top-level-cleanup/_config.js b/test/hydration/samples/top-level-cleanup/_config.js
new file mode 100644
index 0000000000..ff8b4c5632
--- /dev/null
+++ b/test/hydration/samples/top-level-cleanup/_config.js
@@ -0,0 +1 @@
+export default {};
diff --git a/test/hydration/samples/top-level-cleanup/main.svelte b/test/hydration/samples/top-level-cleanup/main.svelte
new file mode 100644
index 0000000000..8dca56dd88
--- /dev/null
+++ b/test/hydration/samples/top-level-cleanup/main.svelte
@@ -0,0 +1 @@
+Hello world
\ No newline at end of file