diff --git a/app/controllers/journals_controller.rb b/app/controllers/journals_controller.rb
index 6ea072a5fd3226852b8f5a62bb74af89631ea85e..c0816f155d059c915f6b33be5093d86f4e41ff87 100644
--- a/app/controllers/journals_controller.rb
+++ b/app/controllers/journals_controller.rb
@@ -1,44 +1,105 @@
-# This file is part of the acts_as_journalized plugin for the redMine
-# project management software
-#
-# Copyright (C) 2006-2008  Jean-Philippe Lang
+# Redmine - project management software
+# Copyright (C) 2006-2011  Jean-Philippe Lang
 #
 # This program is free software; you can redistribute it and/or
 # modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either journal 2
-# of the License, or (at your option) any later journal.
-#
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+# 
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 # GNU General Public License for more details.
-#
+# 
 # You should have received a copy of the GNU General Public License
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
 class JournalsController < ApplicationController
-  unloadable
-  before_filter :find_journal
+  before_filter :find_journal, :only => [:edit, :diff]
+  before_filter :find_issue, :only => [:new]
+  before_filter :find_optional_project, :only => [:index]
+  before_filter :authorize, :only => [:new, :edit, :diff]
+  accept_key_auth :index
+  menu_item :issues
+  
+  include QueriesHelper
+  include SortHelper
+
+  def index
+    retrieve_query
+    sort_init 'id', 'desc'
+    sort_update(@query.sortable_columns)
+    
+    if @query.valid?
+      @journals = @query.issue_journals(:order => "#{Journal.table_name}.created_at DESC", 
+                                        :limit => 25)
+    end
+    @title = (@project ? @project.name : Setting.app_title) + ": " + (@query.new_record? ? l(:label_changes_details) : @query.name)
+    render :layout => false, :content_type => 'application/atom+xml'
+  rescue ActiveRecord::RecordNotFound
+    render_404
+  end
 
+  # Used when replying to an issue or journal
+  def new
+    journal = Journal.find(params[:journal_id]) if params[:journal_id]
+    if journal
+      user = journal.user
+      text = journal.notes
+    else
+      user = @issue.author
+      text = @issue.description
+    end
+    # Replaces pre blocks with [...]
+    text = text.to_s.strip.gsub(%r{<pre>((.|\s)*?)</pre>}m, '[...]')
+    content = "#{ll(Setting.default_language, :text_user_wrote, user)}\n> "
+    content << text.gsub(/(\r?\n|\r\n?)/, "\n> ") + "\n\n"
+      
+    render(:update) { |page|
+      page.<< "$('notes').value = \"#{escape_javascript content}\";"
+      page.show 'update'
+      page << "Form.Element.focus('notes');"
+      page << "Element.scrollTo('update');"
+      page << "$('notes').scrollTop = $('notes').scrollHeight - $('notes').clientHeight;"
+    }
+  end
+  
   def edit
+    (render_403; return false) unless @journal.editable_by?(User.current)
     if request.post?
       @journal.update_attribute(:notes, params[:notes]) if params[:notes]
       @journal.destroy if @journal.details.empty? && @journal.notes.blank?
       call_hook(:controller_journals_edit_post, { :journal => @journal, :params => params})
       respond_to do |format|
         format.html { redirect_to :controller => @journal.journaled.class.name.pluralize.downcase,
-            :action => 'show', :id => @journal.journaled_id }
+          :action => 'show', :id => @journal.journaled_id }
         format.js { render :action => 'update' }
       end
+    else
+      respond_to do |format|
+        format.html {
+          # TODO: implement non-JS journal update
+          render :nothing => true 
+        }
+        format.js
+      end
     end
   end
-
-private
+  
+  private
+  
   def find_journal
     @journal = Journal.find(params[:id])
-    (render_403; return false) unless @journal.editable_by?(User.current)
-    @project = @journal.project
+    @project = @journal.journalized.project
+  rescue ActiveRecord::RecordNotFound
+    render_404
+  end
+
+  # TODO: duplicated in IssuesController
+  def find_issue
+    @issue = Issue.find(params[:id], :include => [:project, :tracker, :status, :author, :priority, :category])
+    @project = @issue.project
   rescue ActiveRecord::RecordNotFound
     render_404
   end
diff --git a/app/models/issue.rb b/app/models/issue.rb
index 90fdacbdb4721726a06a82607482aadf43697b46..aed7600299190ce736d2d92b9089ef27d8c7949f 100644
--- a/app/models/issue.rb
+++ b/app/models/issue.rb
@@ -39,7 +39,14 @@ class Issue < ActiveRecord::Base
   acts_as_watchable
 
   acts_as_journalized :event_title => Proc.new {|o| "#{o.tracker.name} ##{o.journaled_id} (#{o.status}): #{o.subject}"},
-                      :event_type => Proc.new {|o| 'issue' + (o.closed? ? ' closed' : '')}
+                      :event_type => Proc.new {|o|
+                                                t = 'issue'
+                                                if o.changes.empty?
+                                                  t << '-note' unless o.initial?
+                                                else
+                                                  t << (IssueStatus.find_by_id(o.new_value_for(:status_id)).try(:is_closed?) ? '-closed' : '-edit')
+                                                end
+                                                t }
 
   register_on_journal_formatter(:id, 'parent_id')
   register_on_journal_formatter(:named_association, 'project_id', 'status_id', 'tracker_id', 'assigned_to_id',
diff --git a/app/views/journals/_notes_form.rhtml b/app/views/journals/_notes_form.rhtml
index 8344d938abcbb208152c3e9ec1d99418b49a5a40..610260b387decc71eb97707fd7f0f8494552e63d 100644
--- a/app/views/journals/_notes_form.rhtml
+++ b/app/views/journals/_notes_form.rhtml
@@ -3,6 +3,16 @@
                                               :rows => (@journal.notes.blank? ? 10 : [[10, @journal.notes.length / 50].max, 100].min) %>
     <%= call_hook(:view_journals_notes_form_after_notes, { :journal => @journal}) %>
     <p><%= submit_tag l(:button_save) %>
+    <%= link_to_remote l(:label_preview), 
+                       { :url => preview_issue_path(:project_id => @project, :id => @journal.issue),
+                         :method => 'post',
+                         :update => "journal_#{@journal.id}_preview",
+                         :with => "Form.serialize('journal-#{@journal.id}-form')",
+                         :complete => "Element.scrollTo('journal_#{@journal.id}_preview')"
+                       }, :accesskey => accesskey(:preview) %>
+    |
     <%= link_to l(:button_cancel), '#', :onclick => "Element.remove('journal-#{@journal.id}-form'); " +
                                                     "Element.show('journal-#{@journal.id}-notes'); return false;" %></p>
+
+    <div id="journal_<%= @journal.id %>_preview" class="wiki"></div>
 <% end %>
diff --git a/app/views/journals/diff.html.erb b/app/views/journals/diff.html.erb
deleted file mode 100644
index 21b8755e76caa5a1b1cc8dd6182349a8016bce97..0000000000000000000000000000000000000000
--- a/app/views/journals/diff.html.erb
+++ /dev/null
@@ -1,10 +0,0 @@
-<h2><%=h @issue.tracker %> #<%= @issue.id %></h2>
-<p><%= authoring @journal.created_on, @journal.user, :label => :label_updated_time_by %></p>
-
-<div class="text-diff">
-<%= simple_format_without_paragraph @diff.to_html %>
-</div>
-
-<p><%= link_to l(:button_back), issue_path(@issue), :onclick => 'history.back(); return false;' %></p>
-
-<% html_title "#{@issue.tracker.name} ##{@issue.id}: #{@issue.subject}" %>
diff --git a/test/functional/journals_controller_test.rb b/test/functional/journals_controller_test.rb
index 73c81fa31b85742e948ffbd5aa46a8eb2809c837..ac3bf88a00d3f743f1c2366aa9f587490969476c 100644
--- a/test/functional/journals_controller_test.rb
+++ b/test/functional/journals_controller_test.rb
@@ -56,4 +56,32 @@ class JournalsControllerTest < ActionController::TestCase
     assert_select_rjs :remove, 'change-2'
     assert_nil Journal.find_by_id(2)
   end
+
+  def test_index
+    get :index, :project_id => 1
+    assert_response :success
+    assert_not_nil assigns(:journals)
+    assert_equal 'application/atom+xml', @response.content_type
+  end
+  
+  def test_reply_to_issue
+    @request.session[:user_id] = 2
+    get :new, :id => 6
+    assert_response :success
+    assert_select_rjs :show, "update"
+  end
+  
+  def test_reply_to_issue_without_permission
+    @request.session[:user_id] = 7
+    get :new, :id => 6
+    assert_response 403
+  end
+
+  def test_reply_to_note
+    @request.session[:user_id] = 2
+    get :new, :id => 6, :journal_id => 4
+    assert_response :success
+    assert_select_rjs :show, "update"
+  end
+
 end
diff --git a/test/functional/repositories_filesystem_controller_test.rb b/test/functional/repositories_filesystem_controller_test.rb
index 5df8865678378df792a9b1703ffc3bbcb053a9f5..aeb5ab9bd6bbce5c5a197adf250facca0658bd5d 100644
--- a/test/functional/repositories_filesystem_controller_test.rb
+++ b/test/functional/repositories_filesystem_controller_test.rb
@@ -37,7 +37,7 @@ class RepositoriesFilesystemControllerTest < ActionController::TestCase
     @repository = Repository::Filesystem.create(
                       :project => Project.find(PRJ_ID),
                       :url     => REPOSITORY_PATH,
-                      :path_encoding => ''
+                      :path_encoding => nil
                       )
     assert @repository
   end
diff --git a/test/functional/search_controller_test.rb b/test/functional/search_controller_test.rb
index 9dd2b22287612266d54edbd0b0e85784133ef19e..bcc0b3e8c7d46894f0d6055d890696a8ed4dbea8 100644
--- a/test/functional/search_controller_test.rb
+++ b/test/functional/search_controller_test.rb
@@ -49,11 +49,12 @@ class SearchControllerTest < ActionController::TestCase
     get :index, :q => 'issue', :issues => 1
     assert_response :success
     assert_template 'index'
-    
+
     assert assigns(:results).include?(Issue.find(8))
     assert assigns(:results).include?(Issue.find(5))
-    assert_tag :dt, :attributes => { :class => /issue closed/ },
-                    :child => { :tag => 'a',  :content => /Closed/ }
+    assert_select "dt.issue" do
+      assert_select "a", :text => /Closed/
+    end
   end
   
   def test_search_project_and_subprojects
diff --git a/test/functional/wiki_controller_test.rb b/test/functional/wiki_controller_test.rb
index 1b1a81679a9ef7b54abb93c00fcaa6c121e5b32d..2a5f9802517dc99da0c409230649071c0d052fef 100644
--- a/test/functional/wiki_controller_test.rb
+++ b/test/functional/wiki_controller_test.rb
@@ -88,7 +88,7 @@ class WikiControllerTest < ActionController::TestCase
     page = Project.find(1).wiki.find_page('New page')
     assert !page.new_record?
     assert_not_nil page.content
-    assert_equal 'Created the page', page.content.comments
+    assert_equal 'Created the page', page.content.last_journal.notes
   end
   
   def test_create_page_with_attachments
@@ -128,7 +128,7 @@ class WikiControllerTest < ActionController::TestCase
     page = Wiki.find(1).pages.find_by_title('Another_page')
     assert_equal "edited", page.content.text
     assert_equal 2, page.content.version
-    assert_equal "my comments", page.content.comments
+    assert_equal "my comments", page.content.last_journal.notes
   end
 
   def test_update_page_with_failure
diff --git a/test/unit/lib/chili_project/database_test.rb b/test/unit/lib/chili_project/database_test.rb
index 485d9b75bf551c4ae4b5dc595746a0b2a625e8ca..d105c78b340f94693da80e800c2a361e555e9b54 100644
--- a/test/unit/lib/chili_project/database_test.rb
+++ b/test/unit/lib/chili_project/database_test.rb
@@ -16,12 +16,10 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
 require File.expand_path('../../../../test_helper', __FILE__)
-require 'sqlite3_api'
 
 class ChiliProject::DatabaseTest < ActiveSupport::TestCase
   setup do
     ChiliProject::Database.stubs(:adapter_name).returns "SQLite"
-    SQLite3::Driver::Native::API.stubs(:sqlite3_libversion).returns "3.6.12"
   end
 
   should "return the correct identifier" do
@@ -34,13 +32,31 @@ class ChiliProject::DatabaseTest < ActiveSupport::TestCase
     assert_equal true, ChiliProject::Database.sqlite?
   end
 
-  should "return a version string" do
-    assert_equal "3.6.12", ChiliProject::Database.version
+  should "return a version string for SQLite3" do
+    begin
+      ChiliProject::Database.stubs(:adapter_name).returns "SQLite"
+
+      # if we run the tests on sqlite, just stub the version method
+      if Object.const_defined? 'SQLite3'
+        SQLite3::Driver::Native::API.stubs(:sqlite3_libversion).returns "1.2.3"
+      else
+        # if we don't have any sqlite3 module, stub the whole module
+        module ::SQLite3; module Driver; module Native; module API
+          def self.sqlite3_libversion; "1.2.3"; end
+        end; end; end; end
+        created_stub = true
+      end
+
+      assert_equal "1.2.3", ChiliProject::Database.version
+      assert_equal "1.2.3", ChiliProject::Database.version(true)
+    ensure
+      # Clean up after us
+      Object.instance_eval{remove_const :SQLite3 } if created_stub
+    end
   end
 
-  should "return long version string for raw==true" do
+  should "return a version string for PostgreSQL" do
     ChiliProject::Database.stubs(:adapter_name).returns "PostgreSQL"
-
     raw_version = "PostgreSQL 8.3.11 on x86_64-pc-linux-gnu, compiled by GCC gcc-4.3.real (Debian 4.3.2-1.1) 4.3.2"
     ActiveRecord::Base.connection.stubs(:select_value).returns raw_version
 
@@ -48,4 +64,12 @@ class ChiliProject::DatabaseTest < ActiveSupport::TestCase
     assert_equal raw_version, ChiliProject::Database.version(true)
   end
 
+  should "return a version string for MySQL" do
+    ChiliProject::Database.stubs(:adapter_name).returns "MySQL"
+    ActiveRecord::Base.connection.stubs(:select_value).returns "5.1.2"
+
+    assert_equal "5.1.2", ChiliProject::Database.version
+    assert_equal "5.1.2", ChiliProject::Database.version(true)
+  end
+
 end
diff --git a/vendor/plugins/acts_as_journalized/lib/acts_as_journalized.rb b/vendor/plugins/acts_as_journalized/lib/acts_as_journalized.rb
index 72f6b2bd2350e9e5d5bda771c20f00a1b1d13256..7a3b7b458a6a6c9f4a31714a6579f3d330e36730 100644
--- a/vendor/plugins/acts_as_journalized/lib/acts_as_journalized.rb
+++ b/vendor/plugins/acts_as_journalized/lib/acts_as_journalized.rb
@@ -172,6 +172,7 @@ module Redmine
                   :anchor => ("note-#{journal.anchor}" unless journal.initial?) }
               end
             end
+            options[:type] ||= self.name.underscore.dasherize # Make sure the name of the journalized model and not the name of the journal is used for events
             { :description => :notes, :author => :user }.reverse_merge options
           end
       end