diff --git .changelog.php .changelog.php
index e69de29..4964d1a 100644
--- .changelog.php
+++ .changelog.php
@@ -0,0 +1,172 @@
+<?php
+/**
+ * Tool to generate the BP Legacy's changelog
+ *
+ * Requires:
+ * - PHP 5.4
+ * - BuddyPress Git repo:
+ *  - git://buddypress.git.wordpress.org/
+ *  - or https://github.com/buddypress/BuddyPress.git
+ */
+
+/**
+ * Major releases
+ *
+ * Each time a new major release tag is created on trac
+ * Insert a new entry to this array containing the name
+ * of the tag and the corresponding changeset reference.
+ *
+ * NB: this may be inexact sometimes as revisions are also
+ * incremented while working on a previous release's branch
+ */
+$releases = array(
+	"1.7.0" => 6899,
+	"1.8.0" => 7280,
+	"1.9.0" => 7683,
+	"2.0.0" => 8278,
+	"2.1.0" => 9031,
+	"2.2.0" => 9440,
+	"2.3.0" => 9911,
+);
+
+/**
+ * Important changesets
+ *
+ * After any significative commit involving templates
+ * insert a new entry to this array containing the
+ * changeset reference of the commit.
+ *
+ * eg: The introduction of bp_activity_show_filters()
+ */
+$important_changesets = array(
+	8428,
+);
+
+/**
+ * Codex entries
+ *
+ * When a new codex page is detailing some explanation about
+ * the introduced changes, add new entries to this array
+ */
+$codex_pages = array(
+	'https://codex.buddypress.org/themes/activity-dropdown-filters-in-templates/' => array( 8428 ),
+);
+
+// Building the changelog
+$changelog = new stdClass;
+$changelog->author = 'The BuddyPress Contributors';
+
+// Update this after each release
+$changelog->vesion = '2.4.0';
+
+// Init the templates listing
+$changelog->templates = array();
+
+// Init the template's changes
+$changes              = array();
+
+// To strip legacy path from templates
+$bp_legacy_path = 'src/bp-templates/bp-legacy/buddypress/';
+
+// Path to the generated changelog
+$output = 'src/bp-templates/bp-legacy/changelog.json';
+
+
+$git_commits = shell_exec( 'git log --name-only --pretty=format:"||%s|%b|" src/bp-templates/bp-legacy/buddypress' );
+
+$commits = explode( '||', $git_commits );
+
+if ( ! is_array( $commits ) ) {
+	fwrite( STDOUT, "Error: could not generate the changelog, are you using git?\n" );
+	exit( 2 );
+}
+
+// Remove the old file
+if ( file_exists( $output ) ) {
+	@unlink( $output );
+}
+
+foreach( $commits as $commit ) {
+	$parts = explode( '|', $commit );
+	$log = $parts[0];
+
+	preg_match( '/trunk@(\d*)/', $parts[1], $match );
+
+	if ( ! $match[1] ) {
+		continue;
+	}
+
+	$revision = $match[1];
+
+	// Defaults to release if nothing found in releases
+	// It has been introduced in current release
+	$version  = $changelog->vesion;
+
+	foreach ( $releases as $key => $changeset ) {
+		if ( $changeset > $revision ) {
+			$version = $key;
+			break;
+		}
+	}
+
+	// Reset changeset's importance
+	$importance = 'low';
+
+	// How important is this change?
+	if ( in_array( $revision, $important_changesets ) ) {
+		$importance = 'high';
+	}
+
+	// Codex Page ?
+	$codex_page = false;
+
+	foreach ( $codex_pages as $codex_link => $crevision ) {
+		if ( in_array( $revision, $crevision ) ) {
+			$codex_page = $codex_link;
+		}
+	}
+
+	$files = explode( "\n", trim( $parts[2], "\n" ) );
+
+	foreach ( $files as $file ) {
+		$changes[ str_replace( $bp_legacy_path, '', $file ) ][] = (object) array(
+			'version'    => $version,
+			'revision'   => $revision,
+			'importance' => $importance,
+			'log'        => $log,
+			'codex_page' => $codex_page,
+		);
+	}
+}
+
+if ( empty( $changes ) ) {
+	fwrite( STDOUT, "Error: could not generate the changelog.\n" );
+	exit( 2 );
+}
+
+ksort( $changes );
+
+foreach ( $changes as $template => $logs )  {
+	$entry = new stdClass;
+
+	$entry->template = $template;
+
+	// Get version when the template was last edited
+	$edited = reset( $logs );
+	$entry->edited = $edited->version;
+
+	// Attach logs
+	$entry->changes = $logs;
+
+	$changelog->templates[] = $entry;
+}
+
+$created = file_put_contents( $output, json_encode( $changelog, JSON_PRETTY_PRINT ) );
+
+if ( ! $created ) {
+	fwrite( STDOUT, "Error: could not generate the changelog.\n" );
+	exit( 2 );
+} else {
+	fwrite( STDOUT, "Success: Changelog generated.\n" );
+	exit( 0 );
+}
diff --git Gruntfile.js Gruntfile.js
index 0445052..4389d52 100644
--- Gruntfile.js
+++ Gruntfile.js
@@ -222,6 +222,9 @@ module.exports = function( grunt ) {
 				command: 'svn export --force https://github.com/buddypress/BP-Default.git/trunk bp-themes/bp-default',
 				cwd: BUILD_DIR,
 				stdout: false
+			},
+			templates_changelog: {
+				command: 'php .changelog.php'
 			}
 		},
 		jsvalidate:{
@@ -278,4 +281,7 @@ module.exports = function( grunt ) {
 
 	// Default task.
 	grunt.registerTask( 'default', ['src'] );
+
+	// BP Legacy templates changelog task.
+	grunt.registerTask( 'templates_changelog', 'exec:templates_changelog' );
 };
