diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index f1b088c..fa141d6 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -29,8 +29,8 @@ module ApplicationHelper
   def_delegators :wiki_helper, :wikitoolbar_for, :heads_for_wiki_formatter
 
   # Return true if user is authorized for controller/action, otherwise false
-  def authorize_for(controller, action)
-    User.current.allowed_to?({:controller => controller, :action => action}, @project)
+  def authorize_for(controller, action, project = @project)
+    User.current.allowed_to?({:controller => controller, :action => action}, project)
   end
 
   # Display a link if user is authorized
@@ -422,7 +422,12 @@ module ApplicationHelper
     #     #52 -> Link to issue #52
     #   Changesets:
     #     r52 -> Link to revision 52
+    #     project:r52 -> Link to revision 52 of an other project, using project name or identifier
     #     commit:a85130f -> Link to scmid starting with a85130f
+    #     project:commit:a85130f -> Link to scmid starting with a85130f of an other project, using project name or identifier
+    #     If your project name contains spaces, use quotation marks :
+    #       "My Project":r52
+    #       "My Project":commit:a85130f
     #   Documents:
     #     document#17 -> Link to document with id 17
     #     document:Greetings -> Link to the document with title "Greetings"
@@ -441,15 +446,26 @@ module ApplicationHelper
     #     export:some/file -> Force the download of the file
     #  Forum messages:
     #     message#1218 -> Link to message with id 1218
-    text = text.gsub(%r{([\s\(,\-\>]|^)(!)?(attachment|document|version|commit|source|export|message)?((#|r)(\d+)|(:)([^"\s<>][^\s<>]*?|"[^"]+?"))(?=(?=[[:punct:]]\W)|,|\s|<|$)}) do |m|
-      leading, esc, prefix, sep, oid = $1, $2, $3, $5 || $7, $6 || $8
+    text = text.gsub(%r{([\s\(,\-\>]|^)(!)?(attachment|document|version|(\"[^:<>\r\n\b]+\":|[^:<>\s\r\n\b]+:)?(commit)|source|export|message)?((#|(\"[^:<>\r\n\b]+\":|[^:<>\s\r\n\b]+:)?(r))(\d+)|(:)([^"\s<>][^:\s\r\n\b<>]*?|"[^"]+?"))(?=(?=[[:punct:]]\W)|,|\s|<|$)}) do |m|
+      leading, esc, prefix, sep, revproj, oid = $1, $2, $5 || $3, $11 || $9 || $7, $4 || $8, $10 || $12
       link = nil
       if esc.nil?
         if prefix.nil? && sep == 'r'
-          if project && (changeset = project.changesets.find_by_revision(oid))
-            link = link_to("r#{oid}", {:only_path => only_path, :controller => 'repositories', :action => 'revision', :id => project, :rev => oid},
-                                      :class => 'changeset',
-                                      :title => truncate_single_line(changeset.comments, :length => 100))
+          if revproj.nil?
+            if project && (changeset = project.changesets.find_by_revision(oid))
+              link = link_to("r#{oid}", {:only_path => only_path, :controller => 'repositories', :action => 'revision', :id => project, :rev => oid},
+                                        :class => 'changeset',
+                                        :title => truncate_single_line(changeset.comments, :length => 100))
+            end
+          else
+            revproj.gsub!(/[\:"]/,'')
+            link_project = Project.find_by_name(h(revproj)) || Project.find_by_identifier(h(revproj))
+            if link_project && (changeset = link_project.changesets.find_by_revision(oid))              
+              title = truncate_single_line(changeset.comments, :length => 100) if authorize_for('repositories', 'revision', link_project)
+              link = link_to h("#{revproj}:r#{oid}"), {:only_path => only_path, :controller => 'repositories', :action => 'revision', :id => link_project, :rev => oid},
+                                                      :class => 'changeset',
+                                                      :title => title
+            end            
           end
         elsif sep == '#'
           oid = oid.to_i
@@ -497,10 +513,21 @@ module ApplicationHelper
                                               :class => 'version'
             end
           when 'commit'
-            if project && (changeset = project.changesets.find(:first, :conditions => ["scmid LIKE ?", "#{name}%"]))
-              link = link_to h("#{name}"), {:only_path => only_path, :controller => 'repositories', :action => 'revision', :id => project, :rev => changeset.revision},
-                                           :class => 'changeset',
-                                           :title => truncate_single_line(changeset.comments, :length => 100)
+            if revproj.nil?
+              if project && (changeset = project.changesets.find(:first, :conditions => ["scmid LIKE ?", "#{name}%"]))
+                link = link_to h("#{name}"), {:only_path => only_path, :controller => 'repositories', :action => 'revision', :id => project, :rev => changeset.revision},
+                                             :class => 'changeset',
+                                             :title => truncate_single_line(changeset.comments, :length => 100)
+              end
+            else
+              revproj.gsub!(/[\:"]/,'')
+              link_project = Project.find_by_name(h(revproj)) || Project.find_by_identifier(h(revproj))
+              if link_project && (changeset = link_project.changesets.find(:first, :conditions => ["scmid LIKE ?", "#{name}%"]))
+                title = truncate_single_line(changeset.comments, :length => 100) if authorize_for('repositories', 'revision', link_project)
+                link = link_to h("#{revproj}:#{name}"), {:only_path => only_path, :controller => 'repositories', :action => 'revision', :id => link_project, :rev => changeset.revision},
+                                                        :class => 'changeset',
+                                                        :title => title
+              end
             end
           when 'source', 'export'
             if project && project.repository
@@ -521,7 +548,7 @@ module ApplicationHelper
           end
         end
       end
-      leading + (link || "#{prefix}#{sep}#{oid}")
+      leading + (link || (revproj ? "#{revproj}:" : "") + "#{prefix}#{sep}#{oid}")
     end
 
     text
diff --git a/public/help/wiki_syntax_detailed.html b/public/help/wiki_syntax_detailed.html
index 1131950..5047da4 100644
--- a/public/help/wiki_syntax_detailed.html
+++ b/public/help/wiki_syntax_detailed.html
@@ -49,6 +49,14 @@
             <li>Link to a changeset with a non-numeric hash: <strong>commit:c6f4d0fd</strong> (displays c6f4d0fd).  Added in <a href="/repositories/revision/1?rev=1236" class="changeset" title="Merged Git support branch (r1200 to r1226).">r1236</a>.</li>
         </ul>
 
+        <p>You can also link to changesets of an other project repository:</p>
+
+        <ul>
+            <li>Link to a changeset of SandBox project: <strong>sandbox:r758</strong> (displays <a href="/repositories/revision/1?rev=758" class="changeset" title="Search engine now only searches objects the user is allowed to view.">sandbox:r758</a>)</li>
+            <li>Link to a changeset of SandBox project with a non-numeric hash: <strong>sandbox:commit:c6f4d0fd</strong> (displays sandbox:c6f4d0fd).</li>
+            <li>If your project name contains spaces, use quotation marks : <strong>"My Project":r758</strong> or <strong>"My Project":commit:c6f4d0fd</strong></li>
+        </ul>
+
         <p>Wiki links:</p>
 
         <ul>
diff --git a/test/fixtures/changes.yml b/test/fixtures/changes.yml
index ae606f2..1a00697 100644
--- a/test/fixtures/changes.yml
+++ b/test/fixtures/changes.yml
@@ -20,4 +20,18 @@ changes_003:
   path: /test/some/path/in/the/repo
   from_path:
   from_revision:
+changes_009:
+  id: 9
+  changeset_id: 108
+  action: M
+  path: /test/some/path/in/the/repo
+  from_path:
+  from_revision:
+changes_0010:
+  id: 10
+  changeset_id: 109
+  action: M
+  path: /test/some/path/in/the/repo
+  from_path:
+  from_revision:
   
\ No newline at end of file
diff --git a/test/fixtures/changesets.yml b/test/fixtures/changesets.yml
index 420623d..3135fda 100644
--- a/test/fixtures/changesets.yml
+++ b/test/fixtures/changesets.yml
@@ -80,4 +80,22 @@ changesets_008:
   user_id: 3
   repository_id: 10
   committer: dlopper
+changesets_009:
+  commit_date: 2007-04-11
+  committed_on: 2007-04-11 15:14:44 +02:00
+  revision: 1
+  id: 108
+  comments: My very first commit
+  repository_id: 12
+  committer: dlopper
+  user_id: 3
+changesets_010:
+  commit_date: 2007-04-12
+  committed_on: 2007-04-12 15:14:44 +02:00
+  revision: 2
+  id: 109
+  comments: 'This commit fixes #5'
+  repository_id: 12
+  committer: dlopper
+  user_id: 3
   
\ No newline at end of file
diff --git a/test/fixtures/repositories.yml b/test/fixtures/repositories.yml
index c551058..207c1a5 100644
--- a/test/fixtures/repositories.yml
+++ b/test/fixtures/repositories.yml
@@ -15,3 +15,12 @@ repositories_002:
   password: ""
   login: ""
   type: Subversion
+
+repositories_003:
+  project_id: 3
+  url: svn://localhost/test
+  id: 12
+  root_url: svn://localhost
+  password: ""
+  login: ""
+  type: Subversion
diff --git a/test/unit/helpers/application_helper_test.rb b/test/unit/helpers/application_helper_test.rb
index 2dc5067..4df0f2c 100644
--- a/test/unit/helpers/application_helper_test.rb
+++ b/test/unit/helpers/application_helper_test.rb
@@ -31,6 +31,9 @@ class ApplicationHelperTest < HelperTestCase
 
   def setup
     super
+    @admin = User.find(1)
+    @jsmith = User.find(2)
+    @dlopper = User.find(3)
   end
   
   def test_auto_links
@@ -126,7 +129,13 @@ class ApplicationHelperTest < HelperTestCase
                                    :class => 'changeset', :title => 'My very first commit')
     changeset_link2 = link_to('r2', {:controller => 'repositories', :action => 'revision', :id => 'ecookbook', :rev => 2},
                                     :class => 'changeset', :title => 'This commit fixes #1, #2 and references #1 & #3')
-    
+
+    changeset_link_other_project_id = link_to('subproject1:r1', {:controller => 'repositories', :action => 'revision', :id => 'subproject1', :rev => 1},
+                                    :class => 'changeset', :title => 'My very first commit')
+
+    changeset_link_other_project_name = link_to('eCookbook Subproject 1:r2', {:controller => 'repositories', :action => 'revision', :id => 'subproject1', :rev => 2},
+                                    :class => 'changeset', :title => 'This commit fixes #5')
+
     document_link = link_to('Test document', {:controller => 'documents', :action => 'show', :id => 1},
                                              :class => 'document')
     
@@ -146,6 +155,9 @@ class ApplicationHelperTest < HelperTestCase
       'r1.'                         => "#{changeset_link}.",
       'r1, r2'                      => "#{changeset_link}, #{changeset_link2}",
       'r1,r2'                       => "#{changeset_link},#{changeset_link2}",
+      'subproject1:r1'              => "#{changeset_link_other_project_id}",
+      'subproject1:r1.'            => "#{changeset_link_other_project_id}.",
+      'subproject1:r1,"eCookbook Subproject 1":r2'            => "#{changeset_link_other_project_id},#{changeset_link_other_project_name}",
       # documents
       'document#1'                  => document_link,
       'document:"Test document"'    => document_link,
@@ -184,7 +196,11 @@ class ApplicationHelperTest < HelperTestCase
       "http://foo.bar/FAQ#3"       => '<a class="external" href="http://foo.bar/FAQ#3">http://foo.bar/FAQ#3</a>',
     }
     @project = Project.find(1)
+    User.current = @admin
+    
     to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text) }
+
+    User.current = nil
   end
   
   def test_wiki_links
@@ -277,7 +293,7 @@ EXPECTED
               }
     to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text) }
   end
-  
+
   def test_wiki_horizontal_rule
     assert_equal '<hr />', textilizable('---')
     assert_equal '<p>Dashes: ---</p>', textilizable('Dashes: ---')
