Index: app/controllers/journals_controller.rb
<+>UTF-8
===================================================================
diff --git a/app/controllers/journals_controller.rb b/app/controllers/journals_controller.rb
--- a/app/controllers/journals_controller.rb	(revision 41653:c704208ed465fcb5f84cbfa7b6d4050e229d081b)
+++ b/app/controllers/journals_controller.rb	(revision 41653+:c704208ed465+)
@@ -43,18 +43,18 @@
   end
 
   def diff
-    @issue = @journal.issue
+    @journalized = @journal.journalized
     if params[:detail_id].present?
       @detail = @journal.details.find_by_id(params[:detail_id])
     else
       @detail = @journal.details.detect {|d| d.property == 'attr' && d.prop_key == 'description'}
     end
-    unless @issue && @detail
+    unless @journalized && @detail
       render_404
       return false
     end
     if @detail.property == 'cf'
-      unless @detail.custom_field && @detail.custom_field.visible_by?(@issue.project, User.current)
+      unless @detail.custom_field && @detail.custom_field.visible_by?(@journalized.project, User.current)
         raise ::Unauthorized
       end
     end
Index: app/controllers/projects_controller.rb
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
--- a/app/controllers/projects_controller.rb	(revision 41653:c704208ed465fcb5f84cbfa7b6d4050e229d081b)
+++ b/app/controllers/projects_controller.rb	(revision 41653+:c704208ed465+)
@@ -20,6 +20,7 @@
 class ProjectsController < ApplicationController
   menu_item :overview
   menu_item :settings, :only => :settings
+  menu_item :project_history, :only => :history
   menu_item :projects, :only => [:index, :new, :copy, :create]
 
   before_action :find_project,
@@ -27,7 +28,7 @@
   before_action :authorize,
                 :except => [:index, :autocomplete, :list, :new, :create, :copy,
                             :archive, :unarchive,
-                            :destroy]
+                            :destroy, :history]
   before_action :authorize_global, :only => [:new, :create]
   before_action :require_admin, :only => [:copy, :archive, :unarchive]
   accept_rss_auth :index
@@ -212,6 +213,7 @@
   end
 
   def update
+    @project.init_journal(User.current)
     @project.safe_attributes = params[:project]
     if @project.save
       respond_to do |format|
@@ -292,6 +294,10 @@
     @project = nil
   end
 
+  def history
+    @journals = @project.visible_journals_with_index
+  end
+
   private
 
   # Returns the ProjectEntry scope for index
Index: app/helpers/journals_helper.rb
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/app/helpers/journals_helper.rb b/app/helpers/journals_helper.rb
--- a/app/helpers/journals_helper.rb	(revision 41653:c704208ed465fcb5f84cbfa7b6d4050e229d081b)
+++ b/app/helpers/journals_helper.rb	(revision 41653+:c704208ed465+)
@@ -29,7 +29,7 @@
   def render_journal_actions(issue, journal, options={})
     links = []
     dropbown_links = []
-    indice = journal.indice || @journal.issue.visible_journals_with_index.find{|j| j.id == @journal.id}.indice
+    indice = journal.indice || @journal.journalized.visible_journals_with_index.find{|j| j.id == @journal.id}.indice
 
     dropbown_links << copy_object_url_link(issue_url(issue, anchor: "note-#{indice}", only_path: false))
     if journal.notes.present?
Index: app/models/journal.rb
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/app/models/journal.rb b/app/models/journal.rb
--- a/app/models/journal.rb	(revision 41653:c704208ed465fcb5f84cbfa7b6d4050e229d081b)
+++ b/app/models/journal.rb	(revision 41653+:c704208ed465+)
@@ -24,6 +24,7 @@
   # added as a quick fix to allow eager loading of the polymorphic association
   # since always associated to an issue, for now
   belongs_to :issue, :foreign_key => :journalized_id
+  belongs_to :project, :foreign_key => :journalized_id
 
   belongs_to :user
   has_many :details, :class_name => "JournalDetail", :dependent => :delete_all, :inverse_of => :journal
Index: app/models/project.rb
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/app/models/project.rb b/app/models/project.rb
--- a/app/models/project.rb	(revision 41653:c704208ed465fcb5f84cbfa7b6d4050e229d081b)
+++ b/app/models/project.rb	(revision 41653+:c704208ed465+)
@@ -51,6 +51,8 @@
   has_one :repository, lambda {where(:is_default => true)}
   has_many :repositories, :dependent => :destroy
   has_many :changesets, :through => :repository
+  has_many :journals, :as => :journalized, :dependent => :destroy, :inverse_of => :journalized
+
   has_one :wiki, :dependent => :destroy
   # Custom field for the project issues
   has_and_belongs_to_many :issue_custom_fields,
@@ -87,6 +89,7 @@
              :if => proc {|project| project.saved_change_to_inherit_members?}
   after_save :remove_inherited_member_roles, :add_inherited_member_roles,
              :if => proc {|project| project.saved_change_to_parent_id?}
+  after_save :create_journal
   after_update :update_versions_from_hierarchy_change,
                :if => proc {|project| project.saved_change_to_parent_id?}
   before_destroy :delete_all_members
@@ -991,6 +994,41 @@
     end
   end
 
+  # Returns the journals that are visible to user with their index
+  # Used to display the issue history
+  def visible_journals_with_index(user=User.current)
+    result = journals.
+      preload(:details).
+      preload(:user => :email_address).
+      reorder(:created_on, :id).to_a
+
+    result.each_with_index {|j, i| j.indice = i + 1}
+
+    unless user.allowed_to?(:view_private_notes, project)
+      result.select! do |journal|
+        !journal.private_notes? || journal.user == user
+      end
+    end
+    Journal.preload_journals_details_custom_fields(result)
+    result.select! {|journal| journal.notes? || journal.visible_details.any?}
+    result
+  end
+
+  def init_journal(user, notes = "")
+    @current_journal ||= Journal.new(:journalized => self, :user => user, :notes => notes)
+  end
+
+  # Returns the current journal or nil if it's not initialized
+  def current_journal
+    @current_journal
+  end
+
+  # Returns the names of attributes that are journalized when updating the issue
+  def journalized_attribute_names
+    names = Project.column_names - %w(id lft rgt created_on updated_on closed_on)
+    names
+  end
+
   private
 
   def update_inherited_members
@@ -1295,4 +1333,12 @@
     end
     update_attribute :status, STATUS_ARCHIVED
   end
+
+  # Saves the changes in a Journal
+  # Called after_save
+  def create_journal
+    if current_journal
+      current_journal.save
+    end
+  end
 end
Index: app/views/journals/diff.html.erb
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/app/views/journals/diff.html.erb b/app/views/journals/diff.html.erb
--- a/app/views/journals/diff.html.erb	(revision 41653:c704208ed465fcb5f84cbfa7b6d4050e229d081b)
+++ b/app/views/journals/diff.html.erb	(revision 41653+:c704208ed465+)
@@ -1,11 +1,11 @@
-<h2><%= @issue.tracker %> #<%= @issue.id %></h2>
+<h2><%= link_to @journalized %></h2>
 <p><%= authoring @journal.created_on, @journal.user, :label => :label_updated_time_by %></p>
 
 <pre class="text-diff"><%= @diff.to_html %></pre>
 
 <p>
-  <%= link_to(l(:button_back), issue_path(@issue),
+  <%= link_to(l(:button_back), '#',
               :onclick => 'if (document.referrer != "") {history.back(); return false;}') %>
 </p>
 
-<% html_title "#{@issue.tracker.name} ##{@issue.id}: #{@issue.subject}" %>
+<% html_title @journalized %>
Index: app/views/projects/history.html.erb
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/app/views/projects/history.html.erb b/app/views/projects/history.html.erb
new file mode 100644
--- /dev/null	(revision 41653+:c704208ed465+)
+++ b/app/views/projects/history.html.erb	(revision 41653+:c704208ed465+)
@@ -0,0 +1,22 @@
+<% for journal in @journals %>
+  <div id="change-<%= journal.id %>" class="<%= journal.css_classes %>">
+    <div id="note-<%= journal.indice %>">
+      <div class="contextual">
+        <a href="#note-<%= journal.indice %>" class="journal-link">#<%= journal.indice %></a>
+      </div>
+      <h4 class='note-header'>
+        <%= avatar(journal.user) %>
+        <%= authoring journal.created_on, journal.user, :label => :label_updated_time_by %>
+      </h4>
+
+      <% if journal.details.any? %>
+        <ul class="details">
+          <% details_to_strings(journal.visible_details).each do |string| %>
+            <li><%= string %></li>
+          <% end %>
+        </ul>
+      <% end %>
+    </div>
+  </div>
+  <%= call_hook(:view_project_history_journal_bottom, { :journal => journal }) %>
+<% end %>
Index: config/locales/en.yml
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/config/locales/en.yml b/config/locales/en.yml
--- a/config/locales/en.yml	(revision 41653:c704208ed465fcb5f84cbfa7b6d4050e229d081b)
+++ b/config/locales/en.yml	(revision 41653+:c704208ed465+)
@@ -598,6 +598,8 @@
   label_project: Project
   label_project_new: New project
   label_project_plural: Projects
+  label_project_history: History
+
   label_x_projects:
     zero:  no projects
     one:   1 project
Index: config/locales/fa.yml
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/config/locales/fa.yml b/config/locales/fa.yml
--- a/config/locales/fa.yml	(revision 41653:c704208ed465fcb5f84cbfa7b6d4050e229d081b)
+++ b/config/locales/fa.yml	(revision 41653+:c704208ed465+)
@@ -552,6 +552,7 @@
   label_project: پروژه
   label_project_new: پروژه جدید
   label_project_plural: پروژه‌ها
+  label_project_history: سابقه پروژه
   label_x_projects:
     zero:  بدون پروژه
     one:   "۱ پروژه"
Index: config/routes.rb
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/config/routes.rb b/config/routes.rb
--- a/config/routes.rb	(revision 41653:c704208ed465fcb5f84cbfa7b6d4050e229d081b)
+++ b/config/routes.rb	(revision 41653+:c704208ed465+)
@@ -265,6 +265,8 @@
   get 'projects/:id/activity', :to => 'activities#index', :as => :project_activity
   get 'activity', :to => 'activities#index'
 
+  get 'projects/:id/history', :to => 'projects#history', :as => :project_history
+
   # repositories routes
   get 'projects/:id/repository/:repository_id/statistics', :to => 'repositories#stats'
   get 'projects/:id/repository/:repository_id/graph', :to => 'repositories#graph'
