diff --git src/wp-content/themes/twentyseventeen/functions.php src/wp-content/themes/twentyseventeen/functions.php
index 1bcb95f..19770b3 100644
--- src/wp-content/themes/twentyseventeen/functions.php
+++ src/wp-content/themes/twentyseventeen/functions.php
@@ -123,10 +123,33 @@ function twentyseventeen_setup() {
 
 		'posts' => array(
 			'home',
-			'about',
-			'contact',
-			'blog',
-			'homepage-section',
+			'about' => array(
+				'thumbnail' => '{{featured-image-2}}',
+			),
+			'contact' => array(
+				'thumbnail' => '{{featured-image-1}}',
+			),
+			'blog' => array(
+				'thumbnail' => '{{featured-image-3}}',
+			),
+			'homepage-section' => array(
+				'thumbnail' => '{{featured-image-1}}',
+			),
+		),
+
+		'attachments' => array(
+			'featured-image-1' => array(
+				'post_title' => _x( 'Espresso', 'Theme starter content' ),
+				'file' => 'assets/images/espresso.jpg',
+			),
+			'featured-image-2' => array(
+				'post_title' => _x( 'Sandwich', 'Theme starter content' ),
+				'file' => 'assets/images/sandwich.jpg',
+			),
+			'featured-image-3' => array(
+				'post_title' => _x( 'Coffee', 'Theme starter content' ),
+				'file' => 'assets/images/coffee.jpg',
+			),
 		),
 
 		'options' => array(
diff --git src/wp-includes/class-wp-customize-manager.php src/wp-includes/class-wp-customize-manager.php
index ec7c251..f906922 100644
--- src/wp-includes/class-wp-customize-manager.php
+++ src/wp-includes/class-wp-customize-manager.php
@@ -916,6 +916,7 @@ final class WP_Customize_Manager {
 		}
 
 		$sidebars_widgets = isset( $starter_content['widgets'] ) && ! empty( $this->widgets ) ? $starter_content['widgets'] : array();
+		$attachments = isset( $starter_content['attachments'] ) && ! empty( $this->nav_menus ) ? $starter_content['attachments'] : array();
 		$posts = isset( $starter_content['posts'] ) && ! empty( $this->nav_menus ) ? $starter_content['posts'] : array();
 		$options = isset( $starter_content['options'] ) ? $starter_content['options'] : array();
 		$nav_menus = isset( $starter_content['nav_menus'] ) && ! empty( $this->nav_menus ) ? $starter_content['nav_menus'] : array();
@@ -965,9 +966,81 @@ final class WP_Customize_Manager {
 			}
 		}
 
+		$nav_menus_created_posts = array();
+
+		// Attachments are technically posts but handled differently.
+		if ( ! empty( $attachments ) ) {
+			// Such is The WordPress Way.
+			require_once( ABSPATH . 'wp-admin/includes/file.php' );
+			require_once( ABSPATH . 'wp-admin/includes/media.php' );
+			require_once( ABSPATH . 'wp-admin/includes/image.php' );
+
+			$attachment_ids = array();
+
+			foreach ( $attachments as $symbol => $attachment ) {
+				if ( empty( $attachment['file'] ) ) {
+					continue;
+				}
+
+				// @todo Prevent loading sideloading attachment again if it was already loaded for this theme.
+				$file_array = array();
+				if ( preg_match( '#^https?://$#', $attachment['file'] ) ) {
+					$file_array['name'] = basename( wp_parse_url( $attachment['file'], PHP_URL_PATH ) );
+					$file_array['tmp_name'] = download_url( $attachment['file_url'] );
+					if ( is_wp_error( $file_array['tmp_name'] ) ) {
+						continue;
+					}
+				} else {
+					$file_array['name'] = basename( $attachment['file'] );
+					$file_path = null;
+					if ( file_exists( $attachment['file'] ) ) {
+						$file_path = $attachment['file']; // Could be absolute path to file in plugin.
+					} elseif ( is_child_theme() && file_exists( get_stylesheet_directory() . '/' . $attachment['file'] ) ) {
+						$file_path = get_stylesheet_directory() . '/' . $attachment['file'];
+					} elseif ( file_exists( get_template_directory() . '/' . $attachment['file'] ) ) {
+						$file_path = get_template_directory() . '/' . $attachment['file'];
+					} else {
+						continue;
+					}
+
+					// Copy file to temp location so that original file won't get deleted from theme after sideloading.
+					$tmpfname = wp_tempnam( basename( $file_path ) );
+					if ( $tmpfname && copy( $file_path, $tmpfname ) ) {
+						$file_array['tmp_name'] = $tmpfname;
+					}
+				}
+
+				if ( empty( $file_array['tmp_name'] ) ) {
+					continue;
+				}
+
+				/*
+				 * Skip files that don't have the allowed extensions.
+				 * @todo Use wp_get_mime_types() here?
+				 */
+				if ( ! preg_match( '/.(jpe?g|jpe|gif|png)$/i', $file_array['name'] ) ) {
+					continue;
+				}
+
+				$attachment_post_data = array_merge(
+					wp_array_slice_assoc( $attachment, array( 'post_title', 'post_content', 'post_excerpt' ) ),
+					array(
+						'post_status' => 'auto-draft', // So attachment will be garbage collected in a week if changeset is never published.
+					)
+				);
+
+				$attachment_id = media_handle_sideload( $file_array, 0, null, $attachment_post_data );
+				if ( is_wp_error( $attachment_id ) ) {
+					continue;
+				}
+
+				$attachment_ids[ $symbol ] = $attachment_id;
+				$nav_menus_created_posts = array_merge( $nav_menus_created_posts, array_values( $attachment_ids ) );
+			}
+		}
+
 		// Posts & pages.
 		if ( ! empty( $posts ) ) {
-			$nav_menus_created_posts = array();
 			if ( ! empty( $changeset_data['nav_menus_created_posts']['value'] ) ) {
 				$nav_menus_created_posts = $changeset_data['nav_menus_created_posts']['value'];
 			}
@@ -1004,19 +1077,34 @@ final class WP_Customize_Manager {
 					continue;
 				}
 
+				// Translate the featured image symbol
+				if ( ! empty( $posts[ $post_symbol ]['thumbnail'] )
+					&& preg_match( '/^{{(?P<symbol>.+)}}$/', $posts[ $post_symbol ]['thumbnail'], $matches )
+					&& isset( $attachment_ids[ $matches['symbol'] ] ) ) {
+					$posts[ $post_symbol ]['meta_input']['_thumbnail_id'] = $attachment_ids[ $matches['symbol'] ];
+				}
+
+				if ( ! empty( $posts[ $post_symbol ]['template'] ) ) {
+					$posts[ $post_symbol ]['meta_input']['_wp_page_template'] = $posts[ $post_symbol ]['template'];
+				}
+
 				$r = $this->nav_menus->insert_auto_draft_post( $posts[ $post_symbol ] );
 				if ( $r instanceof WP_Post ) {
 					$posts[ $post_symbol ]['ID'] = $r->ID;
 				}
 			}
 
-			// The nav_menus_created_posts setting is why nav_menus component is dependency for adding posts.
+			$nav_menus_created_posts = array_merge( $nav_menus_created_posts, wp_list_pluck( $posts, 'ID' ) );
+		}
+
+		// The nav_menus_created_posts setting is why nav_menus component is dependency for adding posts.
+		if ( ! empty( $this->nav_menus ) && ! empty( $nav_menus_created_posts ) ) {
 			$setting_id = 'nav_menus_created_posts';
-			if ( empty( $changeset_data[ $setting_id ] ) || ! empty( $changeset_data[ $setting_id ]['starter_content'] ) ) {
-				$nav_menus_created_posts = array_unique( array_merge( $nav_menus_created_posts, wp_list_pluck( $posts, 'ID' ) ) );
-				$this->set_post_value( $setting_id, array_values( $nav_menus_created_posts ) );
-				$this->pending_starter_content_settings_ids[] = $setting_id;
+			if ( ! empty( $changeset_data[ $setting_id ]['value'] ) ) {
+				$nav_menus_created_posts = array_merge( $nav_menus_created_posts, $changeset_data[ $setting_id ]['value'] );
 			}
+			$this->set_post_value( $setting_id, array_unique( array_values( $nav_menus_created_posts ) ) );
+			$this->pending_starter_content_settings_ids[] = $setting_id;
 		}
 
 		// Nav menus.
diff --git src/wp-includes/class-wp-customize-nav-menus.php src/wp-includes/class-wp-customize-nav-menus.php
index 7ce9e18..1305a14 100644
--- src/wp-includes/class-wp-customize-nav-menus.php
+++ src/wp-includes/class-wp-customize-nav-menus.php
@@ -1191,8 +1191,10 @@ final class WP_Customize_Nav_Menus {
 		$post_ids = $setting->post_value();
 		if ( ! empty( $post_ids ) ) {
 			foreach ( $post_ids as $post_id ) {
+				$target_status = 'attachment' === get_post_type( $post_id ) ? 'inherit' : 'publish';
+
 				// Note that wp_publish_post() cannot be used because unique slugs need to be assigned.
-				wp_update_post( array( 'ID' => $post_id, 'post_status' => 'publish' ) );
+				wp_update_post( array( 'ID' => $post_id, 'post_status' => $target_status ) );
 			}
 		}
 	}
diff --git src/wp-includes/post.php src/wp-includes/post.php
index d3c68ca..620d1e4 100644
--- src/wp-includes/post.php
+++ src/wp-includes/post.php
@@ -3058,7 +3058,7 @@ function wp_insert_post( $postarr, $wp_error = false ) {
 	}
 
 	$post_status = empty( $postarr['post_status'] ) ? 'draft' : $postarr['post_status'];
-	if ( 'attachment' === $post_type && ! in_array( $post_status, array( 'inherit', 'private', 'trash' ) ) ) {
+	if ( 'attachment' === $post_type && ! in_array( $post_status, array( 'inherit', 'private', 'trash', 'auto-draft' ), true ) ) {
 		$post_status = 'inherit';
 	}
 
diff --git src/wp-includes/theme.php src/wp-includes/theme.php
index 13bf9ca..8e2690f 100644
--- src/wp-includes/theme.php
+++ src/wp-includes/theme.php
@@ -2012,11 +2012,27 @@ function get_theme_starter_content() {
 				}
 				break;
 
-			// Everything else should map at the next level.
-			default :
-				foreach( $config[ $type ] as $i => $item ) {
-					if ( is_array( $item ) ) {
-						$content[ $type ][ $i ] = $item;
+			// Attachments are posts but have special treatment.
+			case 'attachments' :
+				foreach ( $config[ $type ] as $id => $item ) {
+					if ( ! empty( $item['file'] ) ) {
+						$content[ $type ][ $id ] = $item;
+					}
+				}
+				break;
+
+			// All that's left now are posts (besides attachments). Not a default case for the sake of clarity and future work.
+			case 'posts' :
+				foreach ( $config[ $type ] as $id => $item ) {
+					if ( is_array( $item ) && ! empty( $core_content[ $type ] ) && ! empty( $core_content[ $type ][ $id ] ) ) {
+						$content[ $type ][ $id ] = $core_content[ $type ][ $id ];
+
+						// Extra fields - currently locked down because they require special treatment.
+						foreach ( $item as $key => $value ) {
+							if ( 'thumbnail' === $key || 'template' === $key ) {
+								$content[ $type ][ $id ][ $key ] = $value;
+							}
+						}
 					} elseif ( is_string( $item ) && ! empty( $core_content[ $type ] ) && ! empty( $core_content[ $type ][ $item ] ) ) {
 						$content[ $type ][ $item ] = $core_content[ $type ][ $item ];
 					}
