diff --git a/gcc/cp/decl.cc b/gcc/cp/decl.cc
index 5ddb7eafa50..a81a7dd2e9e 100644
--- a/gcc/cp/decl.cc
+++ b/gcc/cp/decl.cc
@@ -2528,6 +2528,16 @@ duplicate_decls (tree newdecl, tree olddecl, bool hiding, bool was_hidden)
 	    }
 	}
 
+      /* Propagate purviewness and importingness as with
+	 set_instantiating_module.  */
+      if (modules_p ())
+	{
+	  if (DECL_MODULE_PURVIEW_P (new_result))
+	    DECL_MODULE_PURVIEW_P (old_result) = true;
+	  if (!DECL_MODULE_IMPORT_P (new_result))
+	    DECL_MODULE_IMPORT_P (old_result) = false;
+	}
+
       /* If the new declaration is a definition, update the file and
 	 line information on the declaration, and also make
 	 the old declaration the same definition.  */
diff --git a/gcc/testsuite/g++.dg/modules/merge-18_a.H b/gcc/testsuite/g++.dg/modules/merge-18_a.H
new file mode 100644
index 00000000000..8d86ad980ba
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/merge-18_a.H
@@ -0,0 +1,8 @@
+// PR c++/116803
+// { dg-additional-options "-fmodule-header" }
+// { dg-module-cmi {} }
+
+namespace ns {
+  template <typename T> void foo();
+  template <typename T> extern const int bar;
+}
diff --git a/gcc/testsuite/g++.dg/modules/merge-18_b.H b/gcc/testsuite/g++.dg/modules/merge-18_b.H
new file mode 100644
index 00000000000..2a762e2ac49
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/merge-18_b.H
@@ -0,0 +1,13 @@
+// PR c++/116803
+// { dg-additional-options "-fmodule-header -fdump-lang-module" }
+// { dg-module-cmi {} }
+
+import "merge-18_a.H";
+
+namespace ns {
+  template <typename T> void foo() {}
+  template <typename T> const int bar = 123;
+}
+
+// { dg-final { scan-lang-dump {Writing definition '::ns::template foo'} module } }
+// { dg-final { scan-lang-dump {Writing definition '::ns::template bar'} module } }
diff --git a/gcc/testsuite/g++.dg/modules/merge-18_c.C b/gcc/testsuite/g++.dg/modules/merge-18_c.C
new file mode 100644
index 00000000000..b90d85f7502
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/merge-18_c.C
@@ -0,0 +1,10 @@
+// PR c++/116803
+// { dg-module-do link }
+// { dg-additional-options "-fmodules-ts" }
+
+import "merge-18_b.H";
+
+int main() {
+  ns::foo<int>();
+  static_assert(ns::bar<int> == 123);
+}
