diff -Naur -x .svn redmine/app/controllers/changeset_relations_controller.rb redmine-stable/app/controllers/changeset_relations_controller.rb
--- redmine/app/controllers/changeset_relations_controller.rb	1970-01-01 01:00:00.000000000 +0100
+++ redmine-stable/app/controllers/changeset_relations_controller.rb	2009-09-30 20:10:44.000000000 +0200
@@ -0,0 +1,55 @@
+class ChangesetRelationsController < ApplicationController
+
+
+  before_filter  :find_project, :authorize
+  
+  def new
+    @changeset = Changeset.find(:first, :conditions => {:revision => params[:changeset][:revision], :repository_id => @project.repository})
+    if  @changeset.nil?
+      @changeset = Changeset.new(:revision => params[:changeset][:revision])
+      @changeset.errors.add  l(:revision_not_found_error)
+    else
+      @changeset.issues << @issue
+      @changeset.save if request.post?
+    end
+    @issue.reload
+    respond_to do |format|
+      format.html { redirect_to :controller => 'issues', :action => 'show', :id => @issue }
+      format.js do
+        render :update do |page|
+          page.replace_html "changeset_list", :partial => 'issues/changeset_list', :locals => { :changesets => @issue.changesets}
+          page.replace_html "issue-changesets-list", :partial => 'issues/changesets', :locals => { :changesets => @issue.changesets}
+          if @changeset.errors.empty?
+            page << "$('changeset_revision').value = ''"
+          end
+        end
+      end
+    end
+  end
+  
+  def destroy
+    changeset = Changeset.find(params[:id])
+    if request.post? && ! changeset.nil? && changeset.issues.include?(@issue)
+      changeset.issues.delete(@issue)
+      @issue.reload
+    end
+    respond_to do |format|
+      format.html { redirect_to :controller => 'issues', :action => 'show', :id => @issue }
+      format.js do
+        render(:update) do |page|
+          page.replace_html "changeset_list", :partial => 'issues/changeset_list', :locals => { :changesets => @issue.changesets}
+          page.replace_html "issue-changesets-list", :partial => 'issues/changesets', :locals => { :changesets => @issue.changesets}
+        end
+      end
+    end
+  end
+
+
+  private
+  def find_project
+    @issue = Issue.find(params[:issue_id])
+    @project = @issue.project
+  rescue ActiveRecord::RecordNotFound
+    render_404
+  end
+end
diff -Naur -x .svn redmine/app/controllers/issues_controller.rb redmine-stable/app/controllers/issues_controller.rb
--- redmine/app/controllers/issues_controller.rb	2009-09-30 20:00:44.000000000 +0200
+++ redmine-stable/app/controllers/issues_controller.rb	2009-09-30 20:10:44.000000000 +0200
@@ -98,6 +98,8 @@
     @journals = @issue.journals.find(:all, :include => [:user, :details], :order => "#{Journal.table_name}.created_on ASC")
     @journals.each_with_index {|j,i| j.indice = i+1}
     @journals.reverse! if User.current.wants_comments_in_reverse_order?
+    @changesets = @issue.changesets
+    @changesets.reverse! if User.current.wants_comments_in_reverse_order?
     @allowed_statuses = @issue.new_statuses_allowed_to(User.current)
     @edit_allowed = User.current.allowed_to?(:edit_issues, @project)
     @priorities = Enumeration::get_values('IPRI')
diff -Naur -x .svn redmine/app/helpers/changeset_relations_helper.rb redmine-stable/app/helpers/changeset_relations_helper.rb
--- redmine/app/helpers/changeset_relations_helper.rb	1970-01-01 01:00:00.000000000 +0100
+++ redmine-stable/app/helpers/changeset_relations_helper.rb	2009-09-30 20:10:44.000000000 +0200
@@ -0,0 +1,2 @@
+module ChangesetRelationsHelper
+end
diff -Naur -x .svn redmine/app/views/changeset_relations/_form.html.erb redmine-stable/app/views/changeset_relations/_form.html.erb
--- redmine/app/views/changeset_relations/_form.html.erb	1970-01-01 01:00:00.000000000 +0100
+++ redmine-stable/app/views/changeset_relations/_form.html.erb	2009-09-30 20:10:44.000000000 +0200
@@ -0,0 +1,8 @@
+<%= error_messages_for 'changeset' %>
+
+<p><%= l(:label_revision) %> <%= f.text_field :revision, :size => 6 %>
+<%= submit_tag l(:button_add) %>
+<%= toggle_link l(:button_cancel), 'new-changeset-form'%>
+</p>
+
+<%= javascript_tag "setPredecessorFieldsVisibility();" %>
diff -Naur -x .svn redmine/app/views/issues/_changeset_list.rhtml redmine-stable/app/views/issues/_changeset_list.rhtml
--- redmine/app/views/issues/_changeset_list.rhtml	1970-01-01 01:00:00.000000000 +0100
+++ redmine-stable/app/views/issues/_changeset_list.rhtml	2009-09-30 20:10:44.000000000 +0200
@@ -0,0 +1,33 @@
+<div class="contextual">
+<% if authorize_for('changeset_relations', 'new') %>
+    <%= toggle_link l(:button_add), 'new-changeset-form'%>
+<% end %>
+</div>
+
+<p><strong><%=l(:label_associated_revisions)%></strong></p>
+
+<% if changesets.any? %>
+<table style="width:100%">
+<% changesets.each do |changeset| %>
+<tr>
+  <td><%= link_to("#{l(:label_revision)} #{changeset.revision}",
+                :controller => 'repositories', :action => 'revision', :id => changeset.project, :rev => changeset.revision) %>
+  </td>
+  <td><%= h changeset.author %></td>
+  <td><%= h truncate(changeset.comments.split("\n").first, 60) %></td>
+  <td><%= format_date(changeset.committed_on) %></td>
+  <td><%= link_to_remote(image_tag('delete.png'), { :url => {:controller => 'changeset_relations', :action => 'destroy', :issue_id => @issue, :id => changeset},
+                                                  :method => :post
+                                                }, :title => l(:label_changeset_delete)) if authorize_for('changeset_relations', 'destroy') %>
+  </td>
+</tr>
+<% end %>
+</table>
+<% end %>
+
+<% remote_form_for(:changeset, @changeset,
+                 :url => {:controller => 'changeset_relations', :action => 'new', :issue_id => @issue},
+                 :method => :post,
+                 :html => {:id => 'new-changeset-form', :style => (@changeset ? '' : 'display: none;')}) do |f| %>
+<%= render :partial => 'changeset_relations/form', :locals => {:f => f}%>
+<% end %>
diff -Naur -x .svn redmine/app/views/issues/show.rhtml redmine-stable/app/views/issues/show.rhtml
--- redmine/app/views/issues/show.rhtml	2009-09-30 20:00:45.000000000 +0200
+++ redmine-stable/app/views/issues/show.rhtml	2009-09-30 20:10:44.000000000 +0200
@@ -78,6 +78,13 @@
 </div>
 <% end %>
 
+<% if !@project.repository.nil? && (authorize_for('changeset_relations', 'new') || @issue.changesets.any?) %>
+<hr />
+<div id="changeset_list">
+<%= render :partial => 'changeset_list', :locals => { :changesets => @issue.changesets} %>
+</div>
+<% end %>
+
 <% if User.current.allowed_to?(:add_issue_watchers, @project) ||
         (@issue.watchers.any? && User.current.allowed_to?(:view_issue_watchers, @project)) %>
 <hr />
@@ -91,8 +98,10 @@
 <% if @issue.changesets.any? && User.current.allowed_to?(:view_changesets, @project) %>
 <div id="issue-changesets">
 <h3><%=l(:label_associated_revisions)%></h3>
+<div id="issue-changesets-list">
 <%= render :partial => 'changesets', :locals => { :changesets => @issue.changesets} %>
 </div>
+</div>
 <% end %>
 
 <% if @journals.any? %>
diff -Naur -x .svn redmine/db/migrate/102_add_manage_changeset_relations_permission.rb redmine-stable/db/migrate/102_add_manage_changeset_relations_permission.rb
--- redmine/db/migrate/102_add_manage_changeset_relations_permission.rb	1970-01-01 01:00:00.000000000 +0100
+++ redmine-stable/db/migrate/102_add_manage_changeset_relations_permission.rb	2009-09-30 20:10:45.000000000 +0200
@@ -0,0 +1,13 @@
+class AddManageChangesetRelationsPermission < ActiveRecord::Migration
+  def self.up
+    Role.find(:all).each do |r|
+      r.add_permission!(:manage_changeset_relations) if r.has_permission?(:manage_issue_relations)
+    end
+  end
+
+  def self.down
+    Role.find(:all).each do |r|
+      r.remove_permission!(:manage_changeset_relations)
+    end
+  end
+end
diff -Naur -x .svn redmine/lang/en.yml redmine-stable/lang/en.yml
--- redmine/lang/en.yml	2009-09-30 20:00:50.000000000 +0200
+++ redmine-stable/lang/en.yml	2009-09-30 20:10:44.000000000 +0200
@@ -702,3 +702,4 @@
 enumeration_issue_priorities: Issue priorities
 enumeration_doc_categories: Document categories
 enumeration_activities: Activities (time tracking)
+revision_not_found_error: Revision not found at project SCM
diff -Naur -x .svn redmine/lib/redmine.rb redmine-stable/lib/redmine.rb
--- redmine/lib/redmine.rb	2009-09-30 20:00:54.000000000 +0200
+++ redmine-stable/lib/redmine.rb	2009-09-30 20:10:44.000000000 +0200
@@ -37,6 +37,7 @@
     map.permission :add_issues, {:issues => :new}
     map.permission :edit_issues, {:issues => [:edit, :reply, :bulk_edit]}
     map.permission :manage_issue_relations, {:issue_relations => [:new, :destroy]}
+    map.permission :manage_changeset_relations, {:changeset_relations => [:new, :destroy]}
     map.permission :add_issue_notes, {:issues => [:edit, :reply]}
     map.permission :edit_issue_notes, {:journals => :edit}, :require => :loggedin
     map.permission :edit_own_issue_notes, {:journals => :edit}, :require => :loggedin
diff -Naur -x .svn redmine/test/functional/changeset_relations_controller_test.rb redmine-stable/test/functional/changeset_relations_controller_test.rb
--- redmine/test/functional/changeset_relations_controller_test.rb	1970-01-01 01:00:00.000000000 +0100
+++ redmine-stable/test/functional/changeset_relations_controller_test.rb	2009-09-30 20:10:45.000000000 +0200
@@ -0,0 +1,8 @@
+require 'test_helper'
+
+class ChangesetRelationsControllerTest < ActionController::TestCase
+  # Replace this with your real tests.
+  test "the truth" do
+    assert true
+  end
+end
