diff --git a/src/wp-includes/capabilities.php b/src/wp-includes/capabilities.php
index 6b1a672..25da5e2 100644
--- a/src/wp-includes/capabilities.php
+++ b/src/wp-includes/capabilities.php
@@ -511,7 +511,7 @@ function map_meta_cap( $cap, $user_id ) {
 				break;
 			}
 
-			if ( 'delete_term' === $cap && ( $term->term_id == get_option( 'default_' . $term->taxonomy ) ) ) {
+			if ( 'delete_term' === $cap && ( $term->term_id == get_option( 'default_' . $term->taxonomy ) || $term->term_id == get_option( 'default_taxonomy_' . $term->taxonomy ) ) ) {
 				$caps[] = 'do_not_allow';
 				break;
 			}
diff --git a/src/wp-includes/class-wp-taxonomy.php b/src/wp-includes/class-wp-taxonomy.php
index ef6f1a0..7c5a402 100644
--- a/src/wp-includes/class-wp-taxonomy.php
+++ b/src/wp-includes/class-wp-taxonomy.php
@@ -205,6 +205,15 @@ final class WP_Taxonomy {
 	public $rest_controller_class;
 
 	/**
+	 * The default term name. If you pass an array you have to set
+	 * 'name' and optionally slug' and 'description'.
+	 *
+	 * @since 5.0.0
+	 * @var array|string
+	 */
+	public $default_term;
+
+	/**
 	 * Whether it is a built-in taxonomy.
 	 *
 	 * @since 4.7.0
@@ -273,6 +282,7 @@ final class WP_Taxonomy {
 			'show_in_rest'          => false,
 			'rest_base'             => false,
 			'rest_controller_class' => false,
+			'default_term'          => null,
 			'_builtin'              => false,
 		);
 
@@ -370,6 +380,14 @@ final class WP_Taxonomy {
 			}
 		}
 
+		// Default taxonomy term.
+		if ( ! empty( $args['default_term'] ) ) {
+			if ( ! is_array( $args['default_term'] ) ) {
+				$args['default_term'] = array( 'name' => $args['default_term'] );
+			}
+			$args['default_term'] = wp_parse_args( $args['default_term'], array( 'name' => '', 'slug' => '', 'description' => '' ) );
+		}
+
 		foreach ( $args as $property_name => $property_value ) {
 			$this->$property_name = $property_value;
 		}
diff --git a/src/wp-includes/post.php b/src/wp-includes/post.php
index 39e1891..7cd0588 100644
--- a/src/wp-includes/post.php
+++ b/src/wp-includes/post.php
@@ -3573,6 +3573,15 @@ function wp_insert_post( $postarr, $wp_error = false ) {
 		wp_set_post_tags( $post_ID, $postarr['tags_input'] );
 	}
 
+	// Add default term for all associated custom taxonomies.
+	if ( 'auto-draft' != $post_status ) {
+		foreach ( get_object_taxonomies( $post_type, 'object' ) as $taxonomy => $tax_object ) {
+			if ( ! empty( $tax_object->default_term ) && ( empty( $postarr['tax_input'] ) || ! isset( $postarr['tax_input'][ $taxonomy ] ) ) ) {
+				$postarr['tax_input'][ $taxonomy ] = array();
+			}
+		}
+	}
+
 	// New-style support for all custom taxonomies.
 	if ( ! empty( $postarr['tax_input'] ) ) {
 		foreach ( $postarr['tax_input'] as $taxonomy => $tags ) {
diff --git a/src/wp-includes/taxonomy.php b/src/wp-includes/taxonomy.php
index 4744dd4..d791e66 100644
--- a/src/wp-includes/taxonomy.php
+++ b/src/wp-includes/taxonomy.php
@@ -324,6 +324,7 @@ function is_taxonomy_hierarchical( $taxonomy ) {
  * @since 4.7.0 Introduced `show_in_rest`, 'rest_base' and 'rest_controller_class'
  *              arguments to register the Taxonomy in REST API.
  * @since 5.0.0 Introduced `meta_box_sanitize_cb` argument.
+ * @since 5.0.0 Introduced `default_term` argument.
  *
  * @global array $wp_taxonomies Registered taxonomies.
  *
@@ -394,6 +395,13 @@ function is_taxonomy_hierarchical( $taxonomy ) {
  *                                                to post types, which confirms that the objects are published before
  *                                                counting them. Default _update_generic_term_count() for taxonomies
  *                                                attached to other object types, such as users.
+ *     @type string|array  $default_term {
+ *         Default term to be used for the taxonomy.
+ *
+ *         @type string $name         Name of default term.
+ *         @type string $slug         Slug for default term (default empty).
+ *         @type string $description  Description for default term (default empty).
+ *     }
  *     @type bool          $_builtin              This taxonomy is a "built-in" taxonomy. INTERNAL USE ONLY!
  *                                                Default false.
  * }
@@ -420,6 +428,24 @@ function register_taxonomy( $taxonomy, $object_type, $args = array() ) {
 
 	$taxonomy_object->add_hooks();
 
+	// Add default term.
+	if ( ! empty( $taxonomy_object->default_term ) ) {
+		if ( $term = term_exists( $taxonomy_object->default_term['name'], $taxonomy ) ) {
+			update_option('default_taxonomy_' . $taxonomy_object->name, $term['term_id'] );
+		}
+		else {
+			$term = wp_insert_term( $taxonomy_object->default_term['name'], $taxonomy, array(
+				'slug' => sanitize_title( $taxonomy_object->default_term['slug'] ),
+				'description' => $taxonomy_object->default_term['description']
+			));
+
+			// Update term id in options.
+			if ( ! is_wp_error( $term ) ) {
+				update_option('default_taxonomy_' . $taxonomy_object->name, $term['term_id']);
+			}
+		}
+	}
+
 	/**
 	 * Fires after a taxonomy is registered.
 	 *
@@ -2375,6 +2401,14 @@ function wp_set_object_terms( $object_id, $terms, $taxonomy, $append = false ) {
 		$terms = array( $terms );
 	}
 
+	// Add default term
+	$taxonomy_obj = get_taxonomy( $taxonomy );
+
+	// Default term for this taxonomy.
+	if ( empty( $terms ) && ! empty ( $taxonomy_obj->default_term ) && ! empty( $default_term_id = get_option( 'default_taxonomy_' . $taxonomy ) ) ) {
+		$terms[] = (int) $default_term_id;
+	}
+
 	if ( ! $append ) {
 		$old_tt_ids = wp_get_object_terms(
 			$object_id, $taxonomy, array(
diff --git a/tests/phpunit/tests/taxonomy.php b/tests/phpunit/tests/taxonomy.php
index d651b12..bcaac7e 100644
--- a/tests/phpunit/tests/taxonomy.php
+++ b/tests/phpunit/tests/taxonomy.php
@@ -926,4 +926,44 @@ class Tests_Taxonomy extends WP_UnitTestCase {
 
 		$this->assertEquals( $problematic_term, $term_name );
 	}
+
+	/**
+	 * Test default term for custom taxonomy.
+	 *
+	 * @ticket 43517
+	 */
+	function test_default_term_for_custom_taxonomy() {
+
+		wp_set_current_user( self::factory()->user->create( array( 'role' => 'editor' ) ) );
+
+		$tax = 'custom-tax';
+
+		// Create custom taxonomy to test with.
+		register_taxonomy( $tax, 'post', array(
+			'hierarchical' => true,
+			'public' => true,
+			'default_term' => array( 'name' => 'Default category', 'slug' => 'default-category' )
+		) );
+
+		// Add post.
+		$post_id = wp_insert_post(
+			array(
+				'post_title' => 'Foo',
+				'post_type' => 'post',
+			)
+		);
+		$term = wp_get_post_terms( $post_id, $tax );
+		$this->assertSame( get_option( 'default_taxonomy_' . $tax ), $term[0]->term_id );
+
+		// Add custom post.
+		register_post_type( 'post-custom-tax', array( 'taxonomies' => array( $tax ) ) );
+		$post_id = wp_insert_post(
+			array(
+				'post_title' => 'Foo',
+				'post_type' => 'post-custom-tax',
+			)
+		);
+		$term = wp_get_post_terms( $post_id, $tax );
+		$this->assertSame( get_option( 'default_taxonomy_' . $tax ), $term[0]->term_id );
+	}
 }
