diff --git a/src/lib-sieve/plugins/copy/sieve-ext-copy.h b/src/lib-sieve/plugins/copy/sieve-ext-copy.h
index faf19dcb56a70e7393a0173e426f6620410b73ae..c550cadbd13fda49b2132a3d6ac82290d28a0f98 100644
--- a/src/lib-sieve/plugins/copy/sieve-ext-copy.h
+++ b/src/lib-sieve/plugins/copy/sieve-ext-copy.h
@@ -1,13 +1,16 @@
 #ifndef SIEVE_EXT_COPY_H
 #define SIEVE_EXT_COPY_H
 
+extern const struct sieve_extension_def copy_extension;
+
 /* sieve_ext_copy_get_extension():
  *   Get the extension struct for the copy extension.
  */
-static inline const struct sieve_extension *sieve_ext_copy_get_extension
-(struct sieve_instance *svinst)
+static inline int
+sieve_ext_copy_get_extension(struct sieve_instance *svinst,
+			     const struct sieve_extension **ext_r)
 {
-	return sieve_extension_get_by_name(svinst, "copy");
+	return sieve_extension_register(svinst, &copy_extension, FALSE, ext_r);
 }
 
 /* sieve_ext_copy_register_tag():
diff --git a/src/plugins/sieve-extprograms/sieve-extprograms-common.c b/src/plugins/sieve-extprograms/sieve-extprograms-common.c
index b797383c3c76917263903ce9b60c6b2e20c8fbc6..49188ffb8a393941af107f6629081ac0d20dbecb 100644
--- a/src/plugins/sieve-extprograms/sieve-extprograms-common.c
+++ b/src/plugins/sieve-extprograms/sieve-extprograms-common.c
@@ -60,6 +60,7 @@ bool sieve_extprograms_ext_load(const struct sieve_extension *ext,
 				void **context)
 {
 	struct sieve_instance *svinst = ext->svinst;
+	const struct sieve_extension *copy_ext = NULL;
 	const struct sieve_extension *var_ext = NULL;
 	struct sieve_extprograms_ext_context *extctx;
 	const char *extname = sieve_extension_name(ext);
@@ -82,6 +83,10 @@ bool sieve_extprograms_ext_load(const struct sieve_extension *ext,
 	input_eol = sieve_setting_get(
 		svinst, t_strdup_printf("sieve_%s_input_eol", extname));
 
+	if (sieve_extension_is(ext, sieve_ext_vnd_pipe)) {
+		if (sieve_ext_copy_get_extension(ext->svinst, &copy_ext) < 0)
+			return FALSE;
+	}
 	if (sieve_extension_is(ext, sieve_ext_vnd_execute)) {
 		if (sieve_ext_variables_get_extension(ext->svinst,
 						      &var_ext) < 0)
@@ -91,6 +96,7 @@ bool sieve_extprograms_ext_load(const struct sieve_extension *ext,
 	extctx = i_new(struct sieve_extprograms_ext_context, 1);
 	extctx->execute_timeout =
 		SIEVE_EXTPROGRAMS_DEFAULT_EXEC_TIMEOUT_SECS;
+	extctx->copy_ext = copy_ext;
 	extctx->var_ext = var_ext;
 
 	if (bin_dir == NULL && socket_dir == NULL) {
@@ -113,11 +119,6 @@ bool sieve_extprograms_ext_load(const struct sieve_extension *ext,
 		}
 	}
 
-	if (sieve_extension_is(ext, sieve_ext_vnd_pipe)) {
-		extctx->copy_ext =
-			sieve_ext_copy_get_extension(ext->svinst);
-	}
-
 	*context = extctx;
 	return TRUE;
 }