diff --git a/templates/base/base.html b/templates/base/base.html
index c93bcef..9b1c6c7 100644
--- a/templates/base/base.html
+++ b/templates/base/base.html
@@ -12,6 +12,7 @@
   <link rel="alternate" type="application/rss+xml" title="PostgreSQL News" href="{{link_root}}/news.rss" />
   <link rel="alternate" type="application/rss+xml" title="PostgreSQL Events" href="{{link_root}}/events.rss" />
   <script type="text/javascript" src="/media/js/styleswitcher.js"></script>
+  <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
   <script type="text/javascript">
   var _gaq = _gaq || [];
   _gaq.push(['_setAccount', 'UA-1345454-1']);
diff --git a/templates/featurematrix/featurematrix.html b/templates/featurematrix/featurematrix.html
index a2e4a95..54d733e 100644
--- a/templates/featurematrix/featurematrix.html
+++ b/templates/featurematrix/featurematrix.html
@@ -1,6 +1,69 @@
 {%extends "base/page.html"%}
 {%block title%}Feature Matrix{%endblock%}
 {%block extrahead%}
+<script type="text/javascript">
+  //<![CDATA[
+    $(document).ready(function(){
+      var eol_versions = ["7.4","8.0","8.1","8.2","8.3"];
+
+      // Create form to contain filter checkboxes
+      $('table').before('<form id="version_filter"><fieldset><legend>Filter by version</legend></fieldset></form><br/>');
+
+      // Generate a list of versions based on table column headers
+      $('table tr:first th').not('th:nth-child(1)').each(function(){
+        var version_class = $(this).text().replace('.', '');
+
+        // Only mark a box as checked if no in the EOL list
+        var checked = (eol_versions.indexOf($(this).text()) == -1 ? 'checked="checked"' : '');
+        
+        $('form#version_filter fieldset').append('<label for="' + version_class + '">' + $(this).text()
+          + '</label><input class="version" ' + checked + ' type="checkbox" id="toggle_' + version_class + '"/ value="' + 
+          $(this).text() + '"/>&nbsp;');
+      });
+      
+      // Add a checkbox to hide rows where all values are the same between
+      // displayed versions.
+      $('form#version_filter fieldset').append(' | <input type="checkbox" id="hide_unchanged" /><label for="hide_unchanged">Hide unchanged features</label>');
+      
+      // Show/hide column based on clicked checkbox value
+      function filter_version(checkbox)
+      {
+        var column=$("table tr:first th").index($("table tr:first th:contains('" + checkbox.val() + "')")) + 1;
+        $("table th:nth-child(" + column + "), table td:nth-child(" + column + ")").toggle(checkbox.is(":checked")).toggleClass('hidden');
+        hide_unchanged();
+      }
+      
+      // Show/hide rows if all values are the same in displayed cells
+      function hide_unchanged()
+      {
+        var hide_unchanged=$('form#version_filter input#hide_unchanged').is(':checked');
+        $('table tr').has('td').each(function(){
+          var row_values=$(this).children('td').not('.colFirst, .hidden');
+          var yes_count=row_values.filter(":contains('Yes')").length;
+          var no_count=row_values.filter(":contains('No')").length;
+          var obsolete_count=row_values.filter(":contains('Obsolete')").length;
+          $(this).toggle(hide_unchanged == false || (yes_count != row_values.length && no_count != row_values.length && obsolete_count != row_values.length));
+        });
+      }
+      
+      // Upon loading the page, apply the filter based on EOL versions that are
+      // unchecked.
+      $('form#version_filter input.version').not(':checked').each(function(){
+        filter_version($(this));
+      });
+      
+      // Apply filter based on change in check status of clicked version filter.
+      $('form#version_filter input.version').on("change", function(){
+        filter_version($(this));
+      });
+      
+      // Show/hide unchanged feature rows when checkbox clicked.
+      $('form#version_filter input#hide_unchanged').on("change", function(){
+        hide_unchanged();
+      });
+    });
+  //]]>
+</script>
 <style type="text/css">
 td.fm_no { background-color: #ffdddd !important; }
 td.fm_yes {  background-color: #ddffdd !important; }
