Index: content-reference.php
===================================================================
--- content-reference.php	(revision 901)
+++ content-reference.php	(working copy)
@@ -16,14 +16,19 @@
 	<section class="return"><p><strong>Return:</strong> <?php echo get_return(); ?></p></section>
 
 	<?php
-	$since = get_since();
-if ( ! empty( $since ) ) : ?>
-	<section class="since">
-		<p><strong>Since:</strong> WordPress <a href="<?php echo get_since_link( $since ); ?>"><?php echo esc_html( $since ); ?></a></p>
-	</section>
-<?php endif; ?>
+	$changelog_data = get_changelog_data();
+	if ( ! empty( $changelog_data ) ) :
+		?>
+		<section class="changelog">
+			<h4><?php _e( 'Changelog', 'wporg' ); ?></h4>
+			<ul>
+				<?php foreach ( $changelog_data as $version => $data ) : ?>
+					<li><?php _e( '<strong>Since:</strong> WordPress', 'wporg' ); ?> <a href="<?php echo esc_url( $data['since_url'] ); ?>"><?php echo esc_html( $version ); ?></a> <?php echo $data['description']; // escaped in get_changelog_data() ?></li>
+				<?php endforeach; ?>
+			</ul>
+		</section>
+	<?php endif;
 
-	<?php
 	$source_file = get_source_file();
 	if ( ! empty( $source_file ) ) :
 		?>
Index: inc/template-tags.php
===================================================================
--- inc/template-tags.php	(revision 901)
+++ inc/template-tags.php	(working copy)
@@ -591,31 +591,52 @@
 	}
 
 	/**
-	 * Retrieve URL to since version archive
+	 * Retrieve changelog data for the current post.
 	 *
-	 * @param string $name
+	 * @param null $post_id Post ID, defaults to the ID of the global $post.
 	 *
-	 * @return string
+	 * @return array Associative array of changelog data.
 	 */
-	function get_since_link( $name = null ) {
+	function get_changelog_data( $post_id = null ) {
+		$post_id = empty( $post_id ) ? get_the_ID() : $post_id;
 
-		$since_object = get_term_by( 'name', empty( $name ) ? get_since() : $name, 'wp-parser-since' );
+		// Since terms assigned to the post.
+		$since_terms = wp_get_post_terms( $post_id, 'wp-parser-since' );
 
-		return empty( $since_object ) ? '' : esc_url( get_term_link( $since_object ) );
+		// Since data stored in meta.
+		$since_meta = get_post_meta( $post_id, '_wp-parser_tags', true );
+
+		$data = array();
+
+		// Pair the term data with meta data.
+		foreach ( $since_terms as $since_term ) {
+			foreach ( $since_meta as $meta ) {
+				if ( $since_term->name == $meta['content'] ) {
+					$description = empty( $meta['description'] ) ? '' : '<span class="since-description">' . esc_html( $meta['description'] ) . '</span>';
+
+					$data[ $since_term->name ] = array(
+						'version'     => $since_term->name,
+						'description' => $description,
+						'since_url'   => get_term_link( $since_term )
+					);
+				}
+			}
+		}
+		return $data;
 	}
 
 	/**
-	 * Retrieve name of since version
+	 * Retrieve URL to a since version archive.
 	 *
-	 * @param int $post_id
+	 * @param string $name Since version, e.g. 'x.x.x'.
 	 *
-	 * @return string
+	 * @return string Since term archive URL.
 	 */
-	function get_since( $post_id = null ) {
+	function get_since_link( $name = null ) {
 
-		$since_object = wp_get_post_terms( empty( $post_id ) ? get_the_ID() : $post_id, 'wp-parser-since', array( 'fields' => 'names' ) );
+		$since_object = get_term_by( 'name', empty( $name ) ? get_since() : $name, 'wp-parser-since' );
 
-		return empty( $since_object ) ? '' : esc_html( $since_object[0] );
+		return empty( $since_object ) ? '' : esc_url( get_term_link( $since_object ) );
 	}
 
 	/**
