diff --git a/src/bp-core/admin/bp-core-admin-functions.php b/src/bp-core/admin/bp-core-admin-functions.php
index bffe2a7..d95879d 100644
--- a/src/bp-core/admin/bp-core-admin-functions.php
+++ b/src/bp-core/admin/bp-core-admin-functions.php
@@ -811,6 +811,26 @@ function bp_admin_do_wp_nav_menu_meta_box() {
 }
 
 /**
+ * In Emails post editor, add notice linking to token documentation on Codex.
+ *
+ * @since 2.5.0
+ */
+function bp_admin_email_add_codex_link() {
+	if ( get_current_screen()->post_type !== bp_get_email_post_type() ) {
+		return;
+	}
+
+	bp_core_add_admin_notice(
+		sprintf(
+			__( 'Phrases wrapped in braces <code>{{ }}</code> are email tokens. <a href="%s">Learn about the tokens on the BuddyPress Codex</a>.', 'buddypress' ),
+			esc_url( 'https://codex.buddypress.org/TODO' )
+		),
+		'error'
+	);
+}
+add_action( 'admin_head-post.php', 'bp_admin_email_add_codex_link' );
+
+/**
  * Restrict various items from view if editing a BuddyPress menu.
  *
  * If a person is editing a BP menu item, that person should not be able to
diff --git a/src/bp-core/admin/css/customizer-controls-rtl.css b/src/bp-core/admin/css/customizer-controls-rtl.css
new file mode 100644
index 0000000..f56c366
--- /dev/null
+++ b/src/bp-core/admin/css/customizer-controls-rtl.css
@@ -0,0 +1,10 @@
+.customize-control-range output {
+	background-color: #FFF;
+	border: 1px solid #DDD;
+	box-shadow: inset 0 1px 2px rgba( 0, 0, 0, 0.07 );
+	float: right;
+	margin-left: 10px;
+	margin-top: -4px;
+	min-width: 16px;
+	padding: 5px;
+}
diff --git a/src/bp-core/admin/css/customizer-controls.css b/src/bp-core/admin/css/customizer-controls.css
new file mode 100644
index 0000000..c5673f8
--- /dev/null
+++ b/src/bp-core/admin/css/customizer-controls.css
@@ -0,0 +1,10 @@
+.customize-control-range output {
+	background-color: #FFF;
+	border: 1px solid #DDD;
+	box-shadow: inset 0 1px 2px rgba( 0, 0, 0, 0.07 );
+	float: left;
+	margin-right: 10px;
+	margin-top: -4px;
+	min-width: 16px;
+	padding: 5px;
+}
diff --git a/src/bp-core/admin/js/customizer-controls.js b/src/bp-core/admin/js/customizer-controls.js
new file mode 100644
index 0000000..508d09c
--- /dev/null
+++ b/src/bp-core/admin/js/customizer-controls.js
@@ -0,0 +1,22 @@
+/**
+ * Customizer controls implementation.
+ *
+ * If you're looking to add JS for a specific panel or control, don't add it here.
+ * The file only implements generic Customizer control implementations.
+ *
+ * @since 2.5.0
+ */
+
+(function( $ ) {
+	$( window ).on( 'load', function() {
+		/**
+		 * <range> element: update label when value changes.
+		 *
+		 * @since 2.5.0
+		 */
+		$( '.customize-control-range input' ).on( 'input', function() {
+			var $this = $( this );
+			$this.siblings( 'output' ).text( $this.val() );
+		});
+	});
+})( jQuery );
diff --git a/src/bp-core/admin/js/customizer-receiver-emails.js b/src/bp-core/admin/js/customizer-receiver-emails.js
new file mode 100644
index 0000000..61d13e8
--- /dev/null
+++ b/src/bp-core/admin/js/customizer-receiver-emails.js
@@ -0,0 +1,115 @@
+/**
+ * Customizer implementation for Email.
+ *
+ * If you're looking to add JS for every instance of a control, don't add it here.
+ * The file only implements the Customizer controls for Emails.
+ *
+ * @since 2.5.0
+ */
+
+(function( $ ) {
+	wp.customize( 'bp_email_options[email_bg]', function( value ) {
+		value.bind(function( newval ) {
+			if ( newval.length ) {
+				$( '.email_bg' ).attr( 'bgcolor', newval );
+				$( 'hr' ).attr( 'color', newval );
+			}
+		});
+	});
+
+	wp.customize( 'bp_email_options[header_bg]', function( value ) {
+		value.bind(function( newval ) {
+			if ( newval.length ) {
+				$( '.header_bg' ).attr( 'bgcolor', newval );
+			}
+		});
+	});
+
+	wp.customize( 'bp_email_options[header_text_size]', function( value ) {
+		value.bind(function( newval ) {
+			if ( newval.length ) {
+				$( '.header_text_size' ).css( 'font-size', newval + 'px' );
+			}
+		});
+	});
+
+	wp.customize( 'bp_email_options[header_text_color]', function( value ) {
+		value.bind(function( newval ) {
+			if ( newval.length ) {
+				$( '.header_text_color' ).css( 'color', newval );
+			}
+		});
+	});
+
+	wp.customize( 'bp_email_options[highlight_color]', function( value ) {
+		value.bind(function( newval ) {
+			if ( newval.length ) {
+				$( '.header_bg' ).css( 'border-top-color', newval );
+				$( 'a' ).css( 'color', newval );
+				$( 'hr' ).attr( 'color', newval );
+			}
+		});
+	});
+
+	wp.customize( 'bp_email_options[body_bg]', function( value ) {
+		value.bind(function( newval ) {
+			if ( newval.length ) {
+				$( '.body_bg' ).attr( 'bgcolor', newval );
+			}
+		});
+	});
+
+	wp.customize( 'bp_email_options[body_text_size]', function( value ) {
+		value.bind(function( newval ) {
+			if ( newval.length ) {
+				// 1.618 = golden mean.
+				$( '.body_text_size' )
+					.css( 'font-size', newval + 'px' )
+					.css( 'line-height', Math.floor( newval * 1.618 ) + 'px' );
+
+				// 1.35 = default body_text_size multipler. Gives default heading of 20px.
+				$( '.welcome' ).css( 'font-size', Math.floor( newval * 1.35 ) + 'px' );
+			}
+		});
+	});
+
+	wp.customize( 'bp_email_options[body_text_color]', function( value ) {
+		value.bind(function( newval ) {
+			if ( newval.length ) {
+				$( '.body_text_color' ).css( 'color', newval );
+			}
+		});
+	});
+
+	wp.customize( 'bp_email_options[footer_bg]', function( value ) {
+		value.bind(function( newval ) {
+			if ( newval.length ) {
+				$( '.footer_bg' ).attr( 'bgcolor', newval );
+			}
+		});
+	});
+
+	wp.customize( 'bp_email_options[footer_text_size]', function( value ) {
+		value.bind(function( newval ) {
+			if ( newval.length ) {
+				$( '.footer_text_size' )
+					.css( 'font-size', newval + 'px' )
+					.css( 'line-height', Math.floor( newval * 1.618 ) + 'px' );
+			}
+		});
+	});
+
+	wp.customize( 'bp_email_options[footer_text_color]', function( value ) {
+		value.bind(function( newval ) {
+			if ( newval.length ) {
+				$( '.footer_text_color' ).css( 'color', newval );
+			}
+		});
+	});
+
+	wp.customize( 'bp_email_options[footer_text]', function( value ) {
+		value.bind(function( newval ) {
+			$( '.footer_text' ).text( newval );
+		});
+	});
+})( jQuery );
diff --git a/src/bp-core/bp-core-admin.php b/src/bp-core/bp-core-admin.php
index 25cc48b..026335c 100644
--- a/src/bp-core/bp-core-admin.php
+++ b/src/bp-core/bp-core-admin.php
@@ -295,7 +295,14 @@ class BP_Admin {
 			'bp_core_admin_tools'
 		);
 
-		// Fudge the highlighted subnav item when on a BuddyPress admin page.
+		$hooks[] = add_theme_page(
+			_x( 'Emails', 'screen heading', 'buddypress' ),
+			_x( 'Emails', 'screen heading', 'buddypress' ),
+			$this->capability,
+			'bp-emails-customizer-redirect',
+			'bp_email_redirect_to_customizer'
+		);
+
 		foreach( $hooks as $hook ) {
 			add_action( "admin_head-$hook", 'bp_core_modify_admin_menu_highlight' );
 		}
@@ -906,6 +913,12 @@ class BP_Admin {
 				'file'         => $common_css,
 				'dependencies' => array(),
 			),
+
+			// 2.5
+			'bp-customizer-controls' => array(
+				'file'         => "{$url}customizer-controls{$min}.css",
+				'dependencies' => array(),
+			),
 		) );
 
 
@@ -938,9 +951,14 @@ class BP_Admin {
 		 * @param array $value Array of admin JS file information to register.
 		 */
 		$scripts = apply_filters( 'bp_core_admin_register_scripts', array(
+			// 2.5
+			'bp-customizer-controls' => array(
+				'file'         => "{$url}customizer-controls{$min}.js",
+				'dependencies' => array( 'jquery' ),
+				'footer'       => true,
+			),
 		) );
 
-
 		$version = bp_get_version();
 
 		foreach ( $scripts as $id => $script ) {
diff --git a/src/bp-core/bp-core-customizer-email.php b/src/bp-core/bp-core-customizer-email.php
new file mode 100644
index 0000000..5966626
--- /dev/null
+++ b/src/bp-core/bp-core-customizer-email.php
@@ -0,0 +1,456 @@
+<?php
+/**
+ * BuddyPress Customizer implementation for email.
+ *
+ * @since 2.5.0
+ *
+ * @package BuddyPress
+ * @subpackage Core
+ */
+
+// Exit if accessed directly.
+defined( 'ABSPATH' ) || exit;
+
+/**
+ * Initialize the Customizer for emails.
+ *
+ * @since 2.5.0
+ *
+ * @param WP_Customize_Manager $wp_customize The Customizer object.
+ */
+function bp_email_init_customizer( WP_Customize_Manager $wp_customize ) {
+	if ( ! bp_is_email_customizer() && ( ! defined( 'DOING_AJAX' ) || ! DOING_AJAX ) ) {
+		return;
+	}
+
+	$wp_customize->add_panel( 'bp_mailtpl', array(
+		'description' => __( 'Customize the appearance of emails sent by BuddyPress.', 'buddypress' ),
+		'title'       => _x( 'Emails', 'screen heading', 'buddypress' ),
+	) );
+
+	$sections = bp_email_get_customizer_sections();
+	foreach( $sections as $section_id => $args ) {
+		$wp_customize->add_section( $section_id, $args );
+	}
+
+	$settings = bp_email_get_customizer_settings();
+	foreach( $settings as $setting_id => $args ) {
+		$wp_customize->add_setting( $setting_id, $args );
+	}
+
+	/**
+	 * BP_Customizer_Control_Range class.
+	 */
+	require_once dirname( __FILE__ ) . '/classes/class-bp-customizer-control-range.php';
+
+	/**
+	 * Fires to let plugins register extra Customizer controls for emails.
+	 *
+	 * @since 2.5.0
+	 *
+	 * @param WP_Customize_Manager $wp_customize The Customizer object.
+	 */
+	do_action( 'bp_email_customizer_register_sections', $wp_customize );
+
+	$controls = bp_email_get_customizer_controls();
+	foreach ( $controls as $control_id => $args ) {
+		$wp_customize->add_control( new $args['class']( $wp_customize, $control_id, $args ) );
+	}
+
+
+	/*
+	 * Hook actions/filters for further configuration.
+	 */
+
+	add_filter( 'customize_section_active', 'bp_email_customizer_hide_sections', 12, 2 );
+
+	if ( is_customize_preview() ) {
+		/*
+		 * Enqueue scripts/styles for the Customizer's preview window.
+		 *
+		 * Scripts can't be registered in bp_core_register_common_styles() etc because
+		 * the Customizer loads very, very early.
+		 */
+		$bp  = buddypress();
+		$min = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
+
+		wp_enqueue_script(
+			'bp-customizer-receiver-emails',
+			"{$bp->plugin_url}bp-core/admin/js/customizer-receiver-emails{$min}.js",
+			array( 'customize-preview' ),
+			bp_get_version(),
+			true
+		);
+	}
+}
+add_action( 'bp_customize_register', 'bp_email_init_customizer' );
+
+/**
+ * Are we looking at the email customizer?
+ *
+ * @since 2.5.0
+ *
+ * @return bool
+ */
+function bp_is_email_customizer() {
+	return isset( $_GET['bp_customizer'] ) && $_GET['bp_customizer'] === 'email';
+}
+
+/**
+ * Only show email sections in the Customizer.
+ *
+ * @since 2.5.0
+ *
+ * @param $active Whether the Customizer section is active.
+ * @param WP_Customize_Section $section {@see WP_Customize_Section} instance.
+ * @return bool
+ */
+function bp_email_customizer_hide_sections( $active, $section ) {
+	if ( ! bp_is_email_customizer() ) {
+		return $active;
+	}
+
+	return in_array( $section->id, array_keys( bp_email_get_customizer_sections() ), true );
+}
+
+/**
+ * Get Customizer sections for emails.
+ *
+ * @since 2.5.0
+ *
+ * @return array
+ */
+function bp_email_get_customizer_sections() {
+
+	/**
+	 * Filter Customizer sections for emails.
+	 *
+	 * @since 2.5.0
+	 *
+	 * @param array $sections Email Customizer sections to add.
+	 */
+	return apply_filters( 'bp_email_get_customizer_sections', array(
+		'section_bp_mailtpl_header' => array(
+			'capability' => 'bp_moderate',
+			'panel'      => 'bp_mailtpl',
+			'title'      => _x( 'Header', 'email', 'buddypress' ),
+		),
+		'section_bp_mailtpl_body' => array(
+			'capability' => 'bp_moderate',
+			'panel'      => 'bp_mailtpl',
+			'title'      => _x( 'Body', 'email', 'buddypress' ),
+		),
+		'section_bp_mailtpl_footer' => array(
+			'capability' => 'bp_moderate',
+			'panel'      => 'bp_mailtpl',
+			'title'      => _x( 'Footer', 'email', 'buddypress' ),
+		),
+	) );
+}
+
+/**
+ * Get Customizer settings for emails.
+ *
+ * @since 2.5.0
+ *
+ * @return array
+ */
+function bp_email_get_customizer_settings() {
+	$defaults = bp_email_get_appearance_settings();
+
+	/**
+	 * Filter Customizer settings for emails.
+	 *
+	 * @since 2.5.0
+	 *
+	 * @param array $settings Email Customizer settings to add.
+	 */
+	return apply_filters( 'bp_email_get_customizer_settings', array(
+		'bp_email_options[email_bg]' => array(
+			'capability'        => 'bp_moderate',
+			'default'           => $defaults['email_bg'],
+			'sanitize_callback' => 'sanitize_hex_color',
+			'transport'         => 'postMessage',
+			'type'              => 'option',
+		),
+		'bp_email_options[header_bg]' => array(
+			'capability'        => 'bp_moderate',
+			'default'           => $defaults['header_bg'],
+			'sanitize_callback' => 'sanitize_hex_color',
+			'transport'         => 'postMessage',
+			'type'              => 'option',
+		),
+		'bp_email_options[header_text_size]' => array(
+			'capability'        => 'bp_moderate',
+			'default'           => $defaults['header_text_size'],
+			'sanitize_callback' => 'intval',
+			'transport'         => 'postMessage',
+			'type'              => 'option',
+		),
+		'bp_email_options[header_text_color]' => array(
+			'capability'        => 'bp_moderate',
+			'default'           => $defaults['header_text_color'],
+			'sanitize_callback' => 'sanitize_hex_color',
+			'transport'         => 'postMessage',
+			'type'              => 'option',
+		),
+		'bp_email_options[highlight_color]' => array(
+			'capability'        => 'bp_moderate',
+			'default'           => $defaults['highlight_color'],
+			'sanitize_callback' => 'sanitize_hex_color',
+			'transport'         => 'postMessage',
+			'type'              => 'option',
+		),
+		'bp_email_options[body_bg]' => array(
+			'capability'        => 'bp_moderate',
+			'default'           => $defaults['body_bg'],
+			'sanitize_callback' => 'sanitize_hex_color',
+			'transport'         => 'postMessage',
+			'type'              => 'option',
+		),
+		'bp_email_options[body_text_size]' => array(
+			'capability'        => 'bp_moderate',
+			'default'           => $defaults['body_text_size'],
+			'sanitize_callback' => 'intval',
+			'transport'         => 'postMessage',
+			'type'              => 'option',
+		),
+		'bp_email_options[body_text_color]' => array(
+			'capability'        => 'bp_moderate',
+			'default'           => $defaults['body_text_color'],
+			'sanitize_callback' => 'sanitize_hex_color',
+			'transport'         => 'postMessage',
+			'type'              => 'option',
+		),
+		'bp_email_options[footer_text]' => array(
+			'capability'        => 'bp_moderate',
+			'default'           => $defaults['footer_text'],
+			'sanitize_callback' => 'bp_sanitize_text_field_keep_linebreaks',
+			'transport'         => 'postMessage',
+			'type'              => 'option',
+		),
+		'bp_email_options[footer_bg]' => array(
+			'capability'        => 'bp_moderate',
+			'default'           => $defaults['footer_bg'],
+			'sanitize_callback' => 'sanitize_hex_color',
+			'transport'         => 'postMessage',
+			'type'              => 'option',
+		),
+		'bp_email_options[footer_text_size]' => array(
+			'capability'        => 'bp_moderate',
+			'default'           => $defaults['footer_text_size'],
+			'sanitize_callback' => 'intval',
+			'transport'         => 'postMessage',
+			'type'              => 'option',
+		),
+		'bp_email_options[footer_text_color]' => array(
+			'capability'        => 'bp_moderate',
+			'default'           => $defaults['footer_text_color'],
+			'sanitize_callback' => 'sanitize_hex_color',
+			'transport'         => 'postMessage',
+			'type'              => 'option',
+		),
+	) );
+}
+
+/**
+ * Get Customizer controls for emails.
+ *
+ * @since 2.5.0
+ *
+ * @return array
+ */
+function bp_email_get_customizer_controls() {
+
+	/**
+	 * Filter Customizer controls for emails.
+	 *
+	 * @since 2.5.0
+	 *
+	 * @param array $controls Email Customizer controls to add.
+	 */
+	return apply_filters( 'bp_email_get_customizer_controls', array(
+		'bp_mailtpl_email_bg' => array(
+			'class'    => 'WP_Customize_Color_Control',
+			'label'    => __( 'Email background color', 'buddypress' ),
+			'section'  => 'section_bp_mailtpl_header',
+			'settings' => 'bp_email_options[email_bg]',
+		),
+
+		'bp_mailtpl_header_bg' => array(
+			'class'    => 'WP_Customize_Color_Control',
+			'label'    => __( 'Header background color', 'buddypress' ),
+			'section'  => 'section_bp_mailtpl_header',
+			'settings' => 'bp_email_options[header_bg]',
+		),
+
+		'bp_mailtpl_highlight_color' => array(
+			'class'       => 'WP_Customize_Color_Control',
+			'description' => 'killer snack',
+			'label'       => __( 'Highlight color', 'buddypress' ),
+			'section'     => 'section_bp_mailtpl_header',
+			'settings'    => 'bp_email_options[highlight_color]',
+		),
+
+		'bp_mailtpl_header_text_color' => array(
+			'class'    => 'WP_Customize_Color_Control',
+			'label'    => __( 'Text color', 'buddypress' ),
+			'section'  => 'section_bp_mailtpl_header',
+			'settings' => 'bp_email_options[header_text_color]',
+		),
+
+		'bp_mailtpl_header_text_size' => array(
+			'class'    => 'BP_Customizer_Control_Range',
+			'label'    => __( 'Text size', 'buddypress' ),
+			'section'  => 'section_bp_mailtpl_header',
+			'settings' => 'bp_email_options[header_text_size]',
+
+			'input_attrs' => array(
+				'max'  => 100,
+				'min'  => 1,
+				'step' => 1,
+			),
+		),
+
+
+		'bp_mailtpl_body_bg' => array(
+			'class'    => 'WP_Customize_Color_Control',
+			'label'    => __( 'Background color', 'buddypress' ),
+			'section'  => 'section_bp_mailtpl_body',
+			'settings' => 'bp_email_options[body_bg]',
+		),
+
+
+		'bp_mailtpl_body_text_color' => array(
+			'class'    => 'WP_Customize_Color_Control',
+			'label'    => __( 'Text color', 'buddypress' ),
+			'section'  => 'section_bp_mailtpl_body',
+			'settings' => 'bp_email_options[body_text_color]',
+		),
+
+		'bp_mailtpl_body_text_size' => array(
+			'class'    => 'BP_Customizer_Control_Range',
+			'label'    => __( 'Text size', 'buddypress' ),
+			'section'  => 'section_bp_mailtpl_body',
+			'settings' => 'bp_email_options[body_text_size]',
+
+			'input_attrs' => array(
+				'max'  => 24,
+				'min'  => 8,
+				'step' => 1,
+			),
+		),
+
+
+		'bp_mailtpl_footer_text' => array(
+			'class'       => 'WP_Customize_Control',
+			'description' => __('Change the email footer here', 'buddypress' ),
+			'label'       => __( 'Footer text', 'buddypress' ),
+			'section'     => 'section_bp_mailtpl_footer',
+			'settings'    => 'bp_email_options[footer_text]',
+			'type'        => 'textarea',
+		),
+
+		'bp_mailtpl_footer_bg' => array(
+			'class'    => 'WP_Customize_Color_Control',
+			'label'    => __( 'Background color', 'buddypress' ),
+			'section'  => 'section_bp_mailtpl_footer',
+			'settings' => 'bp_email_options[footer_bg]',
+		),
+
+		'bp_mailtpl_footer_text_color' => array(
+			'class'    => 'WP_Customize_Color_Control',
+			'label'    => __( 'Text color', 'buddypress' ),
+			'section'  => 'section_bp_mailtpl_footer',
+			'settings' => 'bp_email_options[footer_text_color]',
+		),
+
+		'bp_mailtpl_footer_text_size' => array(
+			'class'    => 'BP_Customizer_Control_Range',
+			'label'    => __( 'Text size', 'buddypress' ),
+			'section'  => 'section_bp_mailtpl_footer',
+			'settings' => 'bp_email_options[footer_text_size]',
+
+			'input_attrs' => array(
+				'max'  => 24,
+				'min'  => 8,
+				'step' => 1,
+			),
+		),
+	) );
+}
+
+/**
+ * Return email appearance settings.
+ *
+ * @since 2.5.0
+ *
+ * @return array
+ */
+function bp_email_get_appearance_settings() {
+	$default_args = array(
+		'body_bg'           => '#FFFFFF',
+		'body_text_color'   => '#555555',
+		'body_text_size'    => 15,
+		'email_bg'          => '#F7F3F0',
+		'footer_bg'         => '#F7F3F0',
+		'footer_text_color' => '#525252',
+		'footer_text_size'  => 12,
+		'header_bg'         => '#F7F3F0',
+		'highlight_color'   => '#D84800',
+		'header_text_color' => '#000000',
+		'header_text_size'  => 30,
+
+		'footer_text' => sprintf(
+			/* translators: email disclaimer, e.g. "© 2016 Site Name". */
+			_x( '&copy; %s %s', 'email', 'buddypress' ),
+			date_i18n( 'Y' ),
+			bp_get_option( 'blogname' )
+		),
+	);
+
+	return bp_parse_args(
+		get_option( 'bp_email_options', array() ),
+		$default_args,
+		'email_appearance_settings'
+	);
+}
+
+/**
+ * Implements a JS redirect to the Customizer, previewing a randomly selected email.
+ *
+ * @since 2.5.0
+ */
+function bp_email_redirect_to_customizer() {
+	$email = get_posts( array(
+		'fields'           => 'ids',
+		'orderby'          => 'rand',
+		'post_status'      => 'publish',
+		'post_type'        => bp_get_email_post_type(),
+		'posts_per_page'   => 1,
+		'suppress_filters' => false,
+	) );
+
+	$preview_url = admin_url();
+
+	if ( $email ) {
+		$preview_url = get_post_permalink( $email[0] ) . '&bp_customizer=email';
+	}
+
+	$redirect_url = add_query_arg(
+		array(
+			'autofocus[panel]' => 'bp_mailtpl',
+			'bp_customizer'    => 'email',
+			'return'           => rawurlencode( admin_url() ),
+			'url'              => rawurlencode( $preview_url ),
+		),
+		admin_url( 'customize.php' )
+	);
+
+	printf(
+		'<script type="text/javascript">window.location = "%s";</script>',
+		$redirect_url
+	);
+
+	exit;
+}
diff --git a/src/bp-core/bp-core-filters.php b/src/bp-core/bp-core-filters.php
index 0d4b342..bb51373 100644
--- a/src/bp-core/bp-core-filters.php
+++ b/src/bp-core/bp-core-filters.php
@@ -1038,3 +1038,44 @@ function _bp_core_inject_bp_widget_css_class( $params ) {
 	return $params;
 }
 add_filter( 'dynamic_sidebar_params', '_bp_core_inject_bp_widget_css_class' );
+
+/**
+ * Add email link styles to rendered email template.
+ *
+ * This is only used when the email content has been merged into the email template.
+ *
+ * @since 2.5.0
+ *
+ * @param string $value Property value.
+ * @param string $property_name
+ * @param string $transform How the return value was transformed.
+ * @return string Updated value.
+ */
+function bp_email_add_link_color_to_template( $value, $property_name, $transform ) {
+	if ( $property_name !== 'template' || $transform !== 'add-content' ) {
+		return $value;
+	}
+
+	$settings    = bp_email_get_appearance_settings();
+	$replacement = 'style="color: ' . esc_attr( $settings['highlight_color'] ) . ';';
+
+	// Find all links.
+	preg_match_all( '#<a[^>]+>#i', $value, $links, PREG_SET_ORDER );
+	foreach ( $links as $link ) {
+		$new_link = $link = array_shift( $link );
+
+		// Add/modify style property.
+		if ( strpos( $link, 'style="' ) !== false ) {
+			$new_link = str_replace( 'style="', $replacement, $link );
+		} else {
+			$new_link = str_replace( '<a ', "<a {$replacement}\" ", $link );
+		}
+
+		if ( $new_link !== $link ) {
+			$value = str_replace( $link, $new_link, $value );
+		}
+	}
+
+	return $value;
+}
+add_filter( 'bp_email_get_property', 'bp_email_add_link_color_to_template', 6, 3 );
diff --git a/src/bp-core/bp-core-functions.php b/src/bp-core/bp-core-functions.php
index 69a914e..c1c2316 100644
--- a/src/bp-core/bp-core-functions.php
+++ b/src/bp-core/bp-core-functions.php
@@ -2591,3 +2591,30 @@ function bp_upload_dir() {
 
 	return $bp->upload_dir;
 }
+
+
+/** Customizer *****************************************************************/
+
+/**
+ * Utility function to sanitize text and strip all tags for Customiser callbacks.
+ *
+ * @since 2.5.0
+ *
+ * @param string $raw
+ * @return string
+ */
+function bp_sanitize_text_field_keep_linebreaks( $raw ) {
+	$input = str_replace( array( "\r", "\n", ), '%BPNEWLINE%', $raw );
+	$input = sanitize_text_field( $input );  // Strips tags.
+	$input = str_replace( '%BPNEWLINE%', "\n", $input );
+
+	/**
+	 * Filiters the sanitized text for Customiser callbacks.
+	 *
+	 * @since 2.5.0
+	 *
+	 * @param string $input Sanitized text.
+	 * @param string $raw Original text.
+	 */
+	return apply_filters( 'bp_sanitize_text_field_keep_linebreaks', $input, $raw );
+}
diff --git a/src/bp-core/classes/class-bp-customizer-control-range.php b/src/bp-core/classes/class-bp-customizer-control-range.php
new file mode 100644
index 0000000..c1252e9
--- /dev/null
+++ b/src/bp-core/classes/class-bp-customizer-control-range.php
@@ -0,0 +1,57 @@
+<?php
+/**
+ * Core component class.
+ *
+ * @package BuddyPress
+ * @subpackage Core
+ */
+
+// Exit if accessed directly.
+defined( 'ABSPATH' ) || exit;
+
+/**
+ * BuddyPress Customizer font size control.
+ *
+ * @since 2.5.0
+ */
+class BP_Customizer_Control_Range extends WP_Customize_Control {
+	/**
+	 * @var string
+	 */
+	public $type = 'range';
+
+	/**
+	 * Enqueue scripts/styles for the color picker.
+	 *
+	 * @since 2.5.0
+	 */
+	public function enqueue() {
+		wp_enqueue_script( 'bp-customizer-controls' );
+		wp_enqueue_style( 'bp-customizer-controls' );
+	}
+
+	/**
+	 * Render the control.
+	 *
+	 * @since 2.5.0
+	 */
+	public function render_content() {
+		$id    = 'customize-control-' . str_replace( '[', '-', str_replace( ']', '', $this->id ) );
+		$class = 'customize-control customize-control-' . $this->type;
+
+		?><li id="<?php echo esc_attr( $id ); ?>" class="<?php echo esc_attr( $class ); ?>">
+			<?php if ( $this->label ) : ?>
+				<label for="<?php echo esc_attr( "{$id}-range" ); ?>">
+					<span class="customize-control-title"><?php echo esc_html( $this->label ); ?></span>
+				</label>
+			<?php endif; ?>
+
+			<input type="range" id="<?php echo esc_attr( "{$id}-range" ); ?>" <?php $this->link(); $this->input_attrs(); ?> value="<?php echo esc_attr( $this->value() ); ?>" />
+			<output for="<?php echo esc_attr( "{$id}-range" ); ?>"><?php echo esc_html( $this->value() ); ?></output>
+
+			<?php if ( $this->description ) : ?>
+				<p><span class="description customize-control-description"><?php echo esc_html( $this->description ); ?></span></p>
+			<?php endif; ?>
+		</li><?php
+	}
+}
diff --git a/src/bp-loader.php b/src/bp-loader.php
index 77d5408..040cd1a 100644
--- a/src/bp-loader.php
+++ b/src/bp-loader.php
@@ -467,27 +467,28 @@ class BuddyPress {
 		require( $this->plugin_dir . 'bp-core/bp-core-theme-compatibility.php' );
 
 		// Require all of the BuddyPress core libraries
-		require( $this->plugin_dir . 'bp-core/bp-core-dependency.php'  );
-		require( $this->plugin_dir . 'bp-core/bp-core-actions.php'     );
-		require( $this->plugin_dir . 'bp-core/bp-core-caps.php'        );
-		require( $this->plugin_dir . 'bp-core/bp-core-cache.php'       );
-		require( $this->plugin_dir . 'bp-core/bp-core-cssjs.php'       );
-		require( $this->plugin_dir . 'bp-core/bp-core-update.php'      );
-		require( $this->plugin_dir . 'bp-core/bp-core-options.php'     );
-		require( $this->plugin_dir . 'bp-core/bp-core-classes.php'     );
-		require( $this->plugin_dir . 'bp-core/bp-core-taxonomy.php'    );
-		require( $this->plugin_dir . 'bp-core/bp-core-filters.php'     );
-		require( $this->plugin_dir . 'bp-core/bp-core-attachments.php' );
-		require( $this->plugin_dir . 'bp-core/bp-core-avatars.php'     );
-		require( $this->plugin_dir . 'bp-core/bp-core-widgets.php'     );
-		require( $this->plugin_dir . 'bp-core/bp-core-template.php'    );
-		require( $this->plugin_dir . 'bp-core/bp-core-adminbar.php'    );
-		require( $this->plugin_dir . 'bp-core/bp-core-buddybar.php'    );
-		require( $this->plugin_dir . 'bp-core/bp-core-catchuri.php'    );
-		require( $this->plugin_dir . 'bp-core/bp-core-component.php'   );
-		require( $this->plugin_dir . 'bp-core/bp-core-functions.php'   );
-		require( $this->plugin_dir . 'bp-core/bp-core-moderation.php'  );
-		require( $this->plugin_dir . 'bp-core/bp-core-loader.php'      );
+		require( $this->plugin_dir . 'bp-core/bp-core-dependency.php'       );
+		require( $this->plugin_dir . 'bp-core/bp-core-actions.php'          );
+		require( $this->plugin_dir . 'bp-core/bp-core-caps.php'             );
+		require( $this->plugin_dir . 'bp-core/bp-core-cache.php'            );
+		require( $this->plugin_dir . 'bp-core/bp-core-cssjs.php'            );
+		require( $this->plugin_dir . 'bp-core/bp-core-update.php'           );
+		require( $this->plugin_dir . 'bp-core/bp-core-options.php'          );
+		require( $this->plugin_dir . 'bp-core/bp-core-classes.php'          );
+		require( $this->plugin_dir . 'bp-core/bp-core-taxonomy.php'         );
+		require( $this->plugin_dir . 'bp-core/bp-core-filters.php'          );
+		require( $this->plugin_dir . 'bp-core/bp-core-attachments.php'      );
+		require( $this->plugin_dir . 'bp-core/bp-core-avatars.php'          );
+		require( $this->plugin_dir . 'bp-core/bp-core-widgets.php'          );
+		require( $this->plugin_dir . 'bp-core/bp-core-template.php'         );
+		require( $this->plugin_dir . 'bp-core/bp-core-adminbar.php'         );
+		require( $this->plugin_dir . 'bp-core/bp-core-buddybar.php'         );
+		require( $this->plugin_dir . 'bp-core/bp-core-catchuri.php'         );
+		require( $this->plugin_dir . 'bp-core/bp-core-component.php'        );
+		require( $this->plugin_dir . 'bp-core/bp-core-functions.php'        );
+		require( $this->plugin_dir . 'bp-core/bp-core-moderation.php'       );
+		require( $this->plugin_dir . 'bp-core/bp-core-loader.php'           );
+		require( $this->plugin_dir . 'bp-core/bp-core-customizer-email.php' );
 
 		// Skip or load deprecated content
 		if ( false !== $this->load_deprecated ) {
