diff --git a/build.sh b/build.sh
index b682c90..32ca344 100755
--- a/build.sh
+++ b/build.sh
@@ -43,6 +43,7 @@ buildp_dispatch_pkg_state() {
 	case "${_msg}" in
 	disabled_pkg)	: $((BUILD_NSKIP+=1)); rtl_log_msg vnfo "$(printf "Skipping disabled package \`%s.'" "${_pkg_name}")"; ;;
 	missing_pkg)	rtl_log_msg failexit "Error: package \`${_pkg_name}' missing in build.vars."; ;;
+	msg_pkg)	shift 3; rtl_log_msg vucc "$(printf "%s/%s: %s" "${_group_name}" "${_pkg_name}" "${*}")"; ;;
 	skipped_pkg)	: $((BUILD_NSKIP+=1)); rtl_log_msg vnfo "$(printf "Skipping finished package \`%s.'" "${_pkg_name}")"; ;;
 	start_pkg)	rtl_log_msg info "$(printf "[%03d/%03d] Starting \`%s' build..." "${4}" "${5}" "${_pkg_name}")"; ;;
 	step_pkg)	rtl_log_msg vucc "$(printf "Finished build step %s of package \`%s'." "${4}" "${_pkg_name}")"; ;;
@@ -65,7 +66,7 @@ buildp_dispatch_pkg_state() {
 buildp_dispatch() {
 	local _msg="${1}"; shift;
 	case "${_msg}" in
-	disabled_pkg|finish_pkg|missing_pkg|skipped_pkg|start_pkg|start_pkg_child|step_pkg)
+	disabled_pkg|finish_pkg|missing_pkg|msg_pkg|skipped_pkg|start_pkg|start_pkg_child|step_pkg)
 		buildp_dispatch_pkg_state "${_msg}" "${@}"; ;;
 	finish_group|start_group)
 		buildp_dispatch_group_state "${_msg}" "${@}"; ;;
diff --git a/subr/ex_pkg_dispatch.subr b/subr/ex_pkg_dispatch.subr
index c1eab55..489ed63 100644
--- a/subr/ex_pkg_dispatch.subr
+++ b/subr/ex_pkg_dispatch.subr
@@ -61,6 +61,8 @@ exp_pkg_dispatch_group() {
 			fi; ;;
 		fail)	: $((EXP_PKG_DISPATCH_NJOBS-=1)); _rc=1;
 			"${_dispatch_fn}" fail_pkg ${_pipe_msg#fail }; ;;
+		msg_pkg)
+			"${_dispatch_fn}" msg_pkg ${_pipe_msg#msg_pkg }; ;;
 		step)	"${_dispatch_fn}" step_pkg ${_pipe_msg#step }; ;;
 		esac; done <>"${_pipe_path}";
 		if [ -n "${EXP_PKG_NAMES}" ] && [ "${_rc}" -eq 0 ]; then
diff --git a/vars/invariants_zipdist.vars b/vars/invariants_zipdist.vars
index eb47d24..0963399 100644
--- a/vars/invariants_zipdist.vars
+++ b/vars/invariants_zipdist.vars
@@ -5,7 +5,8 @@
 pkg_invariants_zipdist_all() {
 	local _dist_fname="" _pkg_name="" _pkglist_fname="${PREFIX}/pkglist.native";
 	if rtl_lmatch "${ARG_DIST}" "zipdist" ","; then
-		rtl_log_msg info "Building deployable distribution ZIP archive...";
+		echo "msg_pkg invariants invariants_zipdist Building deployable distribution ZIP archive..." >&3;
+		rtl_log_msg info "Finished building deployable distribution ZIP archive.";
 		for _pkg_name in $(cat "${_pkglist_fname}"); do
 			if ! stat "${BUILD_WORKDIR}/${_pkg_name}-native-${DEFAULT_TARGET}" >/dev/null 2>&1; then
 				rtl_log_msg failexit "Error: missing package build directory for package \`${_pkg_name}'.";
@@ -29,14 +30,17 @@ pkg_invariants_zipdist_all() {
 			--target="${DEFAULT_TARGET}"				\
 			--tmproot="${BUILD_WORKDIR}/zipdist/tmproot"		\
 			--zipfile="${PREFIX}/${_dist_fname}";
+		echo "msg_pkg invariants invariants_zipdist Finished building deployable distribution ZIP archive." >&3;
 		rtl_log_msg info "Finished building deployable distribution ZIP archive.";
 		if [ -n "${DEFAULT_ZIPDIST_SIGN_GPG_KEY}" ]\
 		&& [ -x "$(which gpg 2>/dev/null)" ]\
 		&& gpg --list-keys "${DEFAULT_ZIPDIST_SIGN_GPG_KEY}" >/dev/null 2>&1; then
+			echo "msg_pkg invariants invariants_zipdist Signing deployable distribution ZIP archive..." >&3;
 			rtl_log_msg info "Signing deployable distribution ZIP archive...";
 			gpg --armor --passphrase-file /dev/null			\
 				--local-user "${DEFAULT_ZIPDIST_SIGN_GPG_KEY}"	\
 				--sign "${PREFIX}/${_dist_fname}";
+			echo "msg_pkg invariants invariants_zipdist Signed deployable distribution ZIP archive." >&3;
 			rtl_log_msg info "Signed deployable distribution ZIP archive.";
 		fi;
 	fi;