Index: src/wp-admin/customize.php
===================================================================
--- src/wp-admin/customize.php	(revision 40873)
+++ src/wp-admin/customize.php	(working copy)
@@ -135,8 +135,14 @@
 			<?php
 			$save_text = $wp_customize->is_theme_active() ? __( 'Save &amp; Publish' ) : __( 'Save &amp; Activate' );
 			$save_attrs = array();
-			if ( ! current_user_can( get_post_type_object( 'customize_changeset' )->cap->publish_posts ) ) {
-				$save_attrs['style'] = 'display: none';
+			if ( $wp_customize->changeset_post_id() ) {
+				if ( ! current_user_can( 'publish_post', $wp_customize->changeset_post_id() ) ) {
+					$save_attrs['style'] = 'display: none';
+				}
+			} else {
+				if ( ! current_user_can( get_post_type_object( 'customize_changeset' )->cap->publish_posts ) ) {
+					$save_attrs['style'] = 'display: none';
+				}
 			}
 			submit_button( $save_text, 'primary save', 'save', false, $save_attrs );
 			?>
Index: src/wp-includes/class-wp-customize-manager.php
===================================================================
--- src/wp-includes/class-wp-customize-manager.php	(revision 40873)
+++ src/wp-includes/class-wp-customize-manager.php	(working copy)
@@ -2135,7 +2135,7 @@
 				wp_send_json_error( 'bad_customize_changeset_status', 400 );
 			}
 			$is_publish = ( 'publish' === $changeset_status || 'future' === $changeset_status );
-			if ( $is_publish && ! current_user_can( get_post_type_object( 'customize_changeset' )->cap->publish_posts ) ) {
+			if ( $is_publish && ! current_user_can( 'publish_post', $changeset_post_id ) ) {
 				wp_send_json_error( 'changeset_publish_unauthorized', 403 );
 			}
 		}
Index: src/wp-includes/post.php
===================================================================
--- src/wp-includes/post.php	(revision 40873)
+++ src/wp-includes/post.php	(working copy)
@@ -175,23 +175,20 @@
 		'can_export' => false,
 		'delete_with_user' => false,
 		'supports' => array( 'title', 'author' ),
-		'capability_type' => 'customize_changeset',
+		'capability_type' => 'post',
 		'capabilities' => array(
 			'create_posts' => 'customize',
-			'delete_others_posts' => 'customize',
-			'delete_post' => 'customize',
-			'delete_posts' => 'customize',
-			'delete_private_posts' => 'customize',
-			'delete_published_posts' => 'customize',
-			'edit_others_posts' => 'customize',
-			'edit_post' => 'customize',
-			'edit_posts' => 'customize',
-			'edit_private_posts' => 'customize',
+			'delete_others_posts' => 'edit_theme_options',
+			'delete_posts' => 'edit_theme_options',
+			'delete_private_posts' => 'edit_theme_options',
+			'delete_published_posts' => 'edit_theme_options',
+			'edit_others_posts' => 'edit_theme_options',
+			'edit_posts' => 'edit_theme_options',
+			'edit_private_posts' => 'edit_theme_options',
 			'edit_published_posts' => 'do_not_allow',
-			'publish_posts' => 'customize',
-			'read' => 'read',
-			'read_post' => 'customize',
-			'read_private_posts' => 'customize',
+			'publish_posts' => 'edit_theme_options',
+			'read' => 'edit_theme_options',
+			'read_private_posts' => 'edit_theme_options',
 		),
 	) );
 
Index: tests/phpunit/tests/ajax/CustomizeManager.php
===================================================================
--- tests/phpunit/tests/ajax/CustomizeManager.php	(revision 40873)
+++ tests/phpunit/tests/ajax/CustomizeManager.php	(working copy)
@@ -150,6 +150,7 @@
 		$nonce = wp_create_nonce( 'save-customize_' . $wp_customize->get_stylesheet() );
 		$_POST['nonce'] = $_GET['nonce'] = $_REQUEST['nonce'] = $nonce;
 		$post_type_obj = get_post_type_object( 'customize_changeset' );
+		$previous_create_posts_cap = $post_type_obj->cap->create_posts;
 		$post_type_obj->cap->create_posts = 'create_customize_changesets';
 		$this->make_ajax_call( 'customize_save' );
 		$this->assertFalse( $this->_last_response_parsed['success'] );
@@ -157,7 +158,7 @@
 		$this->overridden_caps[ $post_type_obj->cap->create_posts ] = true;
 		$this->make_ajax_call( 'customize_save' );
 		$this->assertTrue( $this->_last_response_parsed['success'] );
-		$post_type_obj->cap->create_posts = 'customize'; // Restore.
+		$post_type_obj->cap->create_posts = $previous_create_posts_cap; // Restore.
 
 		// Changeset already published.
 		$wp_customize->set_post_value( 'blogname', 'Hello' );
@@ -164,11 +165,12 @@
 		$wp_customize->save_changeset_post( array( 'status' => 'publish' ) );
 		$this->make_ajax_call( 'customize_save' );
 		$this->assertFalse( $this->_last_response_parsed['success'] );
-		$this->assertEquals( 'changeset_already_published', $this->_last_response_parsed['data']['code'] );
+		$this->assertEquals( 'cannot_edit_changeset_post', $this->_last_response_parsed['data'] );
 		wp_update_post( array( 'ID' => $wp_customize->changeset_post_id(), 'post_status' => 'auto-draft' ) );
 
 		// User cannot edit.
 		$post_type_obj = get_post_type_object( 'customize_changeset' );
+		$previous_edit_post_cap = $post_type_obj->cap->edit_post;
 		$post_type_obj->cap->edit_post = 'edit_customize_changesets';
 		$this->make_ajax_call( 'customize_save' );
 		$this->assertFalse( $this->_last_response_parsed['success'] );
@@ -176,7 +178,7 @@
 		$this->overridden_caps[ $post_type_obj->cap->edit_post ] = true;
 		$this->make_ajax_call( 'customize_save' );
 		$this->assertTrue( $this->_last_response_parsed['success'] );
-		$post_type_obj->cap->edit_post = 'customize'; // Restore.
+		$post_type_obj->cap->edit_post = $previous_edit_post_cap; // Restore.
 
 		// Bad customize_changeset_data.
 		$_POST['customize_changeset_data'] = '[MALFORMED]';
@@ -193,6 +195,7 @@
 
 		// Disallowed publish posts if not allowed.
 		$post_type_obj = get_post_type_object( 'customize_changeset' );
+		$previous_publish_posts_cap = $post_type_obj->cap->publish_posts;
 		$post_type_obj->cap->publish_posts = 'publish_customize_changesets';
 		$_POST['customize_changeset_status'] = 'publish';
 		$this->make_ajax_call( 'customize_save' );
@@ -202,7 +205,7 @@
 		$this->make_ajax_call( 'customize_save' );
 		$this->assertFalse( $this->_last_response_parsed['success'] );
 		$this->assertEquals( 'changeset_publish_unauthorized', $this->_last_response_parsed['data'] );
-		$post_type_obj->cap->publish_posts = 'customize'; // Restore.
+		$post_type_obj->cap->publish_posts = $previous_publish_posts_cap; // Restore.
 
 		// Validate date.
 		$_POST['customize_changeset_status'] = 'draft';
