Index: sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-developer/archive.php
===================================================================
--- sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-developer/archive.php	(revision 2819)
+++ sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-developer/archive.php	(working copy)
@@ -16,6 +16,8 @@
 
 		<main id="main" class="site-main" role="main">
 
+			<?php taxonomy_archive_filter(); ?>
+
 			<?php if ( have_posts() ) : ?>
 
 
Index: sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-developer/inc/extras.php
===================================================================
--- sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-developer/inc/extras.php	(revision 2819)
+++ sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-developer/inc/extras.php	(working copy)
@@ -140,3 +140,57 @@
 }
 add_filter( 'the_title',         'wporg_filter_archive_title', 10, 2 );
 add_filter( 'single_post_title', 'wporg_filter_archive_title', 10, 2 );
+
+/**
+ * Removes the query string from get_pagenum_link() for loop pagination.
+ * Fixes pagination links like example.com/?foo=bar/page/2/.
+ *
+ * @param array  $args Arguments for the paginate_links() function.
+ * @return array       Arguments for the paginate_links() function.
+ */
+function wporg_loop_pagination_args( $args ) {
+	global $wp_rewrite;
+
+	/* Add the $base argument to the array if the user is using permalinks. */
+	if ( $wp_rewrite->using_permalinks() && !is_search() ) {
+		$pagenum = trailingslashit( preg_replace( '/\?.*/', '', get_pagenum_link() ) );
+		$pagination_base = $wp_rewrite->pagination_base;
+		
+		$args['base'] = user_trailingslashit(  $pagenum . "{$pagination_base}/%#%" );
+	}
+
+	return $args;
+}
+add_filter( 'loop_pagination_args', 'wporg_loop_pagination_args' );
+
+/**
+ * Removes 'page/1' from pagination links with a query string.
+ * 
+ * @param  string $page_links Page links HTML.
+ * @return string             Page links HTML.
+ */
+function wporg_loop_pagination( $page_links ) {
+	global $wp_rewrite;
+
+	$pagination_base = $wp_rewrite->pagination_base;
+	$request      = remove_query_arg( 'paged' );
+	$query_string = explode( '?', $request );
+
+	if ( isset( $query_string[1] ) ) {
+
+		$query_string = preg_quote( $query_string[1], '#' );
+	
+		/* Remove 'page/1' from the entire output since it's not needed. */
+		$page_links = preg_replace(
+			array(
+				"#(href=['\"].*?){$pagination_base}/1(\?{$query_string}['\"])#",  // 'page/1'
+				"#(href=['\"].*?){$pagination_base}/1/(\?{$query_string}['\"])#", // 'page/1/'
+			),
+			'$1$2',
+			$page_links
+		);
+	}
+
+	return $page_links;
+}
+add_filter( 'loop_pagination', 'wporg_loop_pagination' );
Index: sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-developer/inc/template-tags.php
===================================================================
--- sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-developer/inc/template-tags.php	(revision 2819)
+++ sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-developer/inc/template-tags.php	(working copy)
@@ -340,15 +340,22 @@
 	/**
 	 * Get an array of all parsed post types.
 	 *
+	 * @param string  $labels If set to 'labels' post types with their labels are returned.
 	 * @return array
 	 */
-	function get_parsed_post_types() {
-		return array(
-			'wp-parser-class',
-			'wp-parser-function',
-			'wp-parser-hook',
-			'wp-parser-method',
+	function get_parsed_post_types( $labels = '' ) {
+		$post_types =  array(
+			'wp-parser-class'    => __( 'Classes',   'wporg' ),
+			'wp-parser-function' => __( 'Functions', 'wporg' ),
+			'wp-parser-hook'     => __( 'Hooks',     'wporg' ),
+			'wp-parser-method'   => __( 'Methods',   'wporg' ),
 		);
+
+		if ( 'labels' !== $labels ) {
+			return array_keys( $post_types );
+		}
+
+		return $post_types;
 	}
 
 	/**
@@ -1371,4 +1378,48 @@
 
 		return $message;
 	}
+
+	/**
+	 * Displays a post type filter dropdown on taxonomy pages. 
+	 * 
+	 * @return string HTML filter form.
+	 */
+	function taxonomy_archive_filter() {
+		global $wp_rewrite;
+
+		$taxonomies = array( 'wp-parser-since', 'wp-parser-package', 'wp-parser-source-file' );
+		$taxonomy   = get_query_var( 'taxonomy' );
+		$term       = get_query_var( 'term' );
+
+		if ( !( is_tax() && in_array( $taxonomy, $taxonomies ) ) ) {
+			return;
+		}
+
+		$post_types  = get_parsed_post_types( 'labels' );
+		$post_types  = array( 'any' => __( 'Any type', 'wporg' ) ) + $post_types;
+
+		$qv_post_type = array_filter( (array) get_query_var( 'post_type' ) );
+		$qv_post_type = !empty( $qv_post_type ) ? $qv_post_type : array( 'any' );
+
+		$options = '';
+		foreach ( $post_types as $post_type => $label ) {
+			$selected = in_array( $post_type, $qv_post_type ) ? " selected='selected'" : '';
+			$options .= "\n\t<option$selected value='" . esc_attr( $post_type ) . "'>$label</option>";
+		}
+
+		$form = "<form method='get' class='archive-filter-form' action=''>";
+
+		if ( !$wp_rewrite->using_permalinks() ) {
+			// Add taxonomy and term when not using permalinks
+			$form .= "<input type='hidden' name='$taxonomy' value='$term'>";
+		}
+		
+		$form .= "<label for='archive-filter'>";
+		$form .= __( 'Filter by type:', 'wporg' ) . ' ';
+		$form .= '<select name="post_type[]" id="archive-filter">';
+		$form .= $options . '</select></label>';
+		$form .= "<input class='shiny-blue' type='submit' value='Filter' /></form>";
+
+		echo $form;
+	}
 }
Index: sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-developer/scss/main.scss
===================================================================
--- sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-developer/scss/main.scss	(revision 2819)
+++ sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-developer/scss/main.scss	(working copy)
@@ -673,6 +673,17 @@
 		}
 	}
 
+	.archive-filter-form {
+		margin: 5rem 0;
+		font-size: 1.5rem;
+		input[type="submit"] {
+			margin-left: .5em;
+			padding: 0.2em 0.5em;
+			line-height: 1.1;
+			font-size: 1.5rem;
+		}
+	}
+
 	.searchform {
 		overflow: hidden;
 		height: auto;
Index: sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-developer/stylesheets/main.css
===================================================================
--- sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-developer/stylesheets/main.css	(revision 2819)
+++ sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-developer/stylesheets/main.css	(working copy)
@@ -912,6 +912,16 @@
   font-size: 36px;
   line-height: 36px;
 }
+.devhub-wrap .archive-filter-form {
+  margin: 5rem 0;
+  font-size: 1.5rem;
+}
+.devhub-wrap .archive-filter-form input[type="submit"] {
+  margin-left: .5em;
+  padding: 0.2em 0.5em;
+  line-height: 1.1;
+  font-size: 1.5rem;
+}
 .devhub-wrap .searchform {
   overflow: hidden;
   height: auto;
