diff --git a/.release/release.sh b/.release/release.sh
index 9a6f2ab5f2c599eb17453906aaddeac5229d5903..5deea563c9fe0e164cc13aa65686395c36ed22bc 100755
--- a/.release/release.sh
+++ b/.release/release.sh
@@ -66,7 +66,7 @@ if [[ ${BASH_VERSINFO[0]} -lt 4 ]] || [[ ${BASH_VERSINFO[0]} -eq 4 && ${BASH_VER
 fi
 
 # Game versions for uploading
-declare -A game_flavors=( ["retail"]="mainline" ["classic"]="classic" ["bc"]="bcc" )
+declare -A game_flavors=( ["retail"]="mainline" ["classic"]="classic" ["bcc"]="bcc" )
 declare -A game_versions
 toc_version=
 
@@ -86,7 +86,7 @@ escape_substr() {
 filename_filter() {
 	local classic alpha beta invalid
 	[ -n "$skip_invalid" ] && invalid="&" || invalid="_"
-	if [[ "$game_type" != "retail" ]] && [[ "$game_type" != "classic" || "${si_project_version,,}" != *"-classic"* ]] && [[ "$game_type" != "bc" || "${si_project_version,,}" != *"-bc"* ]]; then
+	if [[ "$game_type" != "retail" ]] && [[ "$game_type" != "classic" || "${si_project_version,,}" != *"-classic"* ]] && [[ "$game_type" != "bcc" || "${si_project_version,,}" != *"-bcc"* || "${si_project_version,,}" != *"-tbcc"* ]]; then
 		# only append the game type if the tag doesn't include it
 		classic="-$game_type"
 	fi
@@ -184,9 +184,17 @@ while getopts ":celLzusop:dw:a:r:t:g:m:n:" opt; do
 		g) # Set the game type or version
 			OPTARG="${OPTARG,,}"
 			case "$OPTARG" in
-				retail|classic|bc) game_type="$OPTARG" ;; # game_version from toc
+				retail|classic|bcc) game_type="$OPTARG" ;; # game_version from toc
 				mainline) game_type="retail" ;;
-				bcc) game_type="bc" ;;
+				bc)
+					echo "Invalid argument for option \"-g\" ($OPTARG)" >&2
+					echo "" >&2
+					echo "The \"bc\" game type has been changed to \"bcc\" to match Blizzard." >&2
+					echo "This affects TOC interface lines (Interface-BC -> Interface-BCC) and" >&2
+					echo "build keywords (version-bc -> version-bcc)." >&2
+					echo "" >&2
+					exit 1
+					;;
 				*)
 					# Set game version (x.y.z)
 					# Build game type set from the last value if a list
@@ -200,7 +208,7 @@ while getopts ":celLzusop:dw:a:r:t:g:m:n:" opt; do
 						if [[ ${BASH_REMATCH[1]} == "1" && ${BASH_REMATCH[2]} == "13" ]]; then
 							game_type="classic"
 						elif [[ ${BASH_REMATCH[1]} == "2" && ${BASH_REMATCH[2]} == "5" ]]; then
-							game_type="bc"
+							game_type="bcc"
 						else
 							game_type="retail"
 						fi
@@ -972,7 +980,7 @@ if [[ -n "$toc_version" && -z "$game_type" ]]; then
 	# toc -> game type
 	case $toc_version in
 		113*) game_type="classic" ;;
-		205*) game_type="bc" ;;
+		205*) game_type="bcc" ;;
 		*) game_type="retail"
 	esac
 else
@@ -988,7 +996,7 @@ else
 	# Check for other interface lines
 	if [[ -z "$toc_version" ]] || \
 		 [[ "$game_type" == "classic" && "$toc_version" != "113"* ]] || \
-		 [[ "$game_type" == "bc" && "$toc_version" != "205"* ]] || \
+		 [[ "$game_type" == "bcc" && "$toc_version" != "205"* ]] || \
 		 [[ "$game_type" == "retail" && ("$toc_version" == "113"* || "$toc_version" == "205"*) ]]
 	then
 		toc_version="$game_type_toc_version"
@@ -996,7 +1004,7 @@ else
 			# Check @non-@ blocks
 			case $game_type in
 				classic) toc_version=$( sed -n '/@non-[-a-z]*@/,/@end-non-[-a-z]*@/{//b;p}' <<< "$toc_file" | awk '/#[[:blank:]]*## Interface:[[:blank:]]*(113)/ { print $NF; exit }' ) ;;
-				bc) toc_version=$( sed -n '/@non-[-a-z]*@/,/@end-non-[-a-z]*@/{//b;p}' <<< "$toc_file" | awk '/#[[:blank:]]*## Interface:[[:blank:]]*(205)/ { print $NF; exit }' ) ;;
+				bcc) toc_version=$( sed -n '/@non-[-a-z]*@/,/@end-non-[-a-z]*@/{//b;p}' <<< "$toc_file" | awk '/#[[:blank:]]*## Interface:[[:blank:]]*(205)/ { print $NF; exit }' ) ;;
 			esac
 			# This becomes the actual interface version after string replacements
 			root_toc_version="$toc_version"
@@ -1374,8 +1382,9 @@ copy_directory_tree() {
 	_cdt_do_not_package=
 	_cdt_unchanged_patterns=
 	_cdt_classic=
+	_cdt_external=
 	OPTIND=1
-	while getopts :adi:lnpu:c: _cdt_opt "$@"; do
+	while getopts :adi:lnpu:c:e _cdt_opt "$@"; do
 		# shellcheck disable=2220
 		case $_cdt_opt in
 			a)	_cdt_alpha="true" ;;
@@ -1388,13 +1397,14 @@ copy_directory_tree() {
 			p)	_cdt_do_not_package="true" ;;
 			u)	_cdt_unchanged_patterns=$OPTARG ;;
 			c)	_cdt_classic=$OPTARG ;;
+			e)	_cdt_external="true" ;;
 		esac
 	done
 	shift $((OPTIND - 1))
 	_cdt_srcdir=$1
 	_cdt_destdir=$2
 
-	if [ -z "$_external_dir" ]; then
+	if [ -z "$_cdt_external" ]; then
 		start_group "Copying files into ${_cdt_destdir#$topdir/}:" "copy"
 	else # don't nest groups
 		echo "Copying files into ${_cdt_destdir#$topdir/}:"
@@ -1457,11 +1467,11 @@ copy_directory_tree() {
 							if [ -n "$_cdt_classic" ]; then
 								_cdt_filters+="|lua_filter retail"
 								_cdt_filters+="|lua_filter version-retail"
-								[ "$_cdt_classic" = "classic" ] && _cdt_filters+="|lua_filter version-bc"
-								[ "$_cdt_classic" = "bc" ] && _cdt_filters+="|lua_filter version-classic"
+								[ "$_cdt_classic" = "classic" ] && _cdt_filters+="|lua_filter version-bcc"
+								[ "$_cdt_classic" = "bcc" ] && _cdt_filters+="|lua_filter version-classic"
 							else
 								_cdt_filters+="|lua_filter version-classic"
-								_cdt_filters+="|lua_filter version-bc"
+								_cdt_filters+="|lua_filter version-bcc"
 							fi
 							[ -n "$_cdt_localization" ] && _cdt_filters+="|localization_filter"
 							;;
@@ -1473,11 +1483,11 @@ copy_directory_tree() {
 							if [ -n "$_cdt_classic" ]; then
 								_cdt_filters+="|xml_filter retail"
 								_cdt_filters+="|xml_filter version-retail"
-								[ "$_cdt_classic" = "classic" ] && _cdt_filters+="|xml_filter version-bc"
-								[ "$_cdt_classic" = "bc" ] && _cdt_filters+="|xml_filter version-classic"
+								[ "$_cdt_classic" = "classic" ] && _cdt_filters+="|xml_filter version-bcc"
+								[ "$_cdt_classic" = "bcc" ] && _cdt_filters+="|xml_filter version-classic"
 							else
 								_cdt_filters+="|xml_filter version-classic"
-								_cdt_filters+="|xml_filter version-bc"
+								_cdt_filters+="|xml_filter version-bcc"
 							fi
 							;;
 						*.toc)
@@ -1487,9 +1497,9 @@ copy_directory_tree() {
 							_cdt_filters+="|toc_filter debug ${_cdt_debug}"
 							_cdt_filters+="|toc_filter retail ${_cdt_classic:+true}"
 							_cdt_filters+="|toc_filter version-retail ${_cdt_classic:+true}"
-							_cdt_filters+="|toc_filter version-classic $([[ -z "$_cdt_classic" || "$_cdt_classic" == "bc" ]] && echo "true")"
-							_cdt_filters+="|toc_filter version-bc $([[ -z "$_cdt_classic" || "$_cdt_classic" == "classic" ]] && echo "true")"
-							_cdt_filters+="|toc_interface_filter"
+							_cdt_filters+="|toc_filter version-classic $([[ -z "$_cdt_classic" || "$_cdt_classic" == "bcc" ]] && echo "true")"
+							_cdt_filters+="|toc_filter version-bcc $([[ -z "$_cdt_classic" || "$_cdt_classic" == "classic" ]] && echo "true")"
+							[[ -z "$_cdt_external" && ! $file =~ -(Mainline|Classic|BCC).toc$ ]] && _cdt_filters+="|toc_interface_filter"
 							[ -n "$_cdt_localization" ] && _cdt_filters+="|localization_filter"
 							;;
 					esac
@@ -1655,7 +1665,7 @@ checkout_external() {
 		fi
 		# If a .pkgmeta file is present, process it for an "ignore" list.
 		parse_ignore "$_cqe_checkout_dir/.pkgmeta" "$_external_dir"
-		copy_directory_tree -dnp -i "$ignore" "$_cqe_checkout_dir" "$pkgdir/$_external_dir"
+		copy_directory_tree -dnpe -i "$ignore" "$_cqe_checkout_dir" "$pkgdir/$_external_dir"
 	)
 	# Remove the ".checkout" subdirectory containing the full checkout.
 	if [ -d "$_cqe_checkout_dir" ]; then
@@ -2154,7 +2164,7 @@ if [ -z "$skip_zipfile" ]; then
 	if [[ "${file_name}" == *"{game-type}"* ]] || [[ "$game_type" != "retail" && "${file_name}" == *"{classic}"* ]]; then
 		# append the game-type for clarity
 		archive_label="$archive_version-$game_type"
-		if [[ "$game_type" == "classic" && "${project_version,,}" == *"-classic"* ]] || [[ "$game_type" == "bc" && "${project_version,,}" == *"-bc"* ]]; then
+		if [[ "$game_type" == "classic" && "${project_version,,}" == *"-classic"* ]] || [[ "$game_type" == "bcc" && "${project_version,,}" == *"-bcc"* ]]; then
 			# this is mostly for BigWigs projects that tag classic separately (eg, v10-classic)
 			# to prevent the extra -classic without changing all our workflows
 			archive_label="$archive_version"
@@ -2255,7 +2265,7 @@ if [ -z "$skip_zipfile" ]; then
 				case $game_type in
 					retail) _cf_game_type_id=517 ;;
 					classic) _cf_game_type_id=67408 ;;
-					bc) _cf_game_type_id=73246 ;;
+					bcc) _cf_game_type_id=73246 ;;
 				esac
 				_cf_game_version_id=$( echo "$_cf_versions" | jq -c --argjson v "$_cf_game_type_id" 'map(select(.gameVersionTypeID == $v)) | max_by(.id) | [.id]' 2>/dev/null )
 				_cf_game_version=$( echo "$_cf_versions" | jq -r --argjson v "$_cf_game_type_id" 'map(select(.gameVersionTypeID == $v)) | max_by(.id) | .name' 2>/dev/null )
@@ -2420,7 +2430,11 @@ if [ -z "$skip_zipfile" ]; then
 	if [ -n "$upload_wago" ] ; then
 		_wago_support_property=""
 		for type in "${!game_versions[@]}"; do
-			_wago_support_property+="\"supported_${type}_patch\": \"${game_versions[$type]}\", "
+			if [[ "$type" == "bcc" ]]; then
+				_wago_support_property+="\"supported_bc_patch\": \"${game_versions[$type]}\", "
+			else
+				_wago_support_property+="\"supported_${type}_patch\": \"${game_versions[$type]}\", "
+			fi
 		done
 
 		_wago_stability="$file_type"
@@ -2541,6 +2555,9 @@ if [ -z "$skip_zipfile" ]; then
 		fi
 		_gh_metadata='{ "releases": ['"$_gh_metadata"'] }'
 
+		versionfile="$releasedir/release.json"
+		jq -c '.' <<< "$_gh_metadata" > "$versionfile" || echo "There was an error creating release.json" >&2
+
 		_gh_payload=$( cat <<-EOF
 		{
 		  "tag_name": "$tag",
@@ -2576,7 +2593,7 @@ if [ -z "$skip_zipfile" ]; then
 						-H "Authorization: token $github_token" \
 						"$_gh_metadata_url"
 				) && {
-					_gh_metadata=$( jq -s '.[0].releases + .[1].releases | unique_by(.filename) | { releases: [.[]] }' <<< "${_gh_previous_metadata} ${_gh_metadata}" )
+					jq -sc '.[0].releases + .[1].releases | unique_by(.filename) | { releases: [.[]] }' <<< "${_gh_previous_metadata} ${_gh_metadata}" > "$versionfile"
 				} || {
 					echo "Warning: Unable to update release.json ($?)"
 				}
@@ -2600,7 +2617,9 @@ if [ -z "$skip_zipfile" ]; then
 				if [ -f "$nolib_archive" ]; then
 					upload_github_asset "$release_id" "$nolib_archive_name" "$nolib_archive"
 				fi
-				jq -c <<< "$_gh_metadata" > "$releasedir/release.json" && upload_github_asset "$release_id" "release.json" "$releasedir/release.json"
+				if [ -s "$versionfile" ]; then
+					upload_github_asset "$release_id" "release.json" "$versionfile"
+				fi
 			else
 				echo "Error! ($result)"
 				if [ -s "$resultfile" ]; then
@@ -2613,6 +2632,7 @@ if [ -z "$skip_zipfile" ]; then
 		}
 
 		rm -f "$resultfile" 2>/dev/null
+		[ -z "$CI" ] && rm -f "$versionfile" 2>/dev/null
 		echo
 	fi
 fi