<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>app/views/timelog/_date_range.rhtml</filename>
    </added>
    <added>
      <filename>lib/redmine/core_ext.rb</filename>
    </added>
    <added>
      <filename>lib/redmine/core_ext/string.rb</filename>
    </added>
    <added>
      <filename>lib/redmine/core_ext/string/conversions.rb</filename>
    </added>
    <added>
      <filename>public/images/changeset.png</filename>
    </added>
    <added>
      <filename>public/images/comments.png</filename>
    </added>
    <added>
      <filename>public/images/document.png</filename>
    </added>
    <added>
      <filename>public/images/message.png</filename>
    </added>
    <added>
      <filename>public/images/news.png</filename>
    </added>
    <added>
      <filename>public/images/ticket.png</filename>
    </added>
    <added>
      <filename>public/images/ticket_checked.png</filename>
    </added>
    <added>
      <filename>public/images/ticket_edit.png</filename>
    </added>
    <added>
      <filename>public/images/wiki_edit.png</filename>
    </added>
    <added>
      <filename>test/functional/queries_controller_test.rb</filename>
    </added>
    <added>
      <filename>test/functional/repositories_bazaar_controller_test.rb</filename>
    </added>
    <added>
      <filename>test/unit/time_entry_test.rb</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -56,6 +56,8 @@ class AccountController &lt; ApplicationController
         flash.now[:error] = l(:notice_account_invalid_creditentials)
       end
     end
+  rescue User::OnTheFlyCreationFailure
+    flash.now[:error] = 'Redmine could not retrieve the required information from the LDAP to create your account. Please, contact your Redmine administrator.'
   end
 
   # Log out current user and redirect to welcome page</diff>
      <filename>app/controllers/account_controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -150,6 +150,7 @@ class ApplicationController &lt; ActionController::Base
   def render_feed(items, options={})    
     @items = items || []
     @items.sort! {|x,y| y.event_datetime &lt;=&gt; x.event_datetime }
+    @items = @items.slice(0, Setting.feeds_limit.to_i)
     @title = options[:title] || Setting.app_title
     render :template =&gt; &quot;common/feed.atom.rxml&quot;, :layout =&gt; false, :content_type =&gt; 'application/atom+xml'
   end</diff>
      <filename>app/controllers/application.rb</filename>
    </modified>
    <modified>
      <diff>@@ -73,6 +73,8 @@ class IssuesController &lt; ApplicationController
       # Send html if the query is not valid
       render(:template =&gt; 'issues/index.rhtml', :layout =&gt; !request.xhr?)
     end
+  rescue ActiveRecord::RecordNotFound
+    render_404
   end
   
   def changes
@@ -87,6 +89,8 @@ class IssuesController &lt; ApplicationController
     end
     @title = (@project ? @project.name : Setting.app_title) + &quot;: &quot; + (@query.new_record? ? l(:label_changes_details) : @query.name)
     render :layout =&gt; false, :content_type =&gt; 'application/atom+xml'
+  rescue ActiveRecord::RecordNotFound
+    render_404
   end
   
   def show
@@ -136,7 +140,9 @@ class IssuesController &lt; ApplicationController
       requested_status = IssueStatus.find_by_id(params[:issue][:status_id])
       # Check that the user is allowed to apply the requested status
       @issue.status = (@allowed_statuses.include? requested_status) ? requested_status : default_status
-      @custom_values = @project.custom_fields_for_issues(@issue.tracker).collect { |x| CustomValue.new(:custom_field =&gt; x, :customized =&gt; @issue, :value =&gt; params[&quot;custom_fields&quot;][x.id.to_s]) }
+      @custom_values = @project.custom_fields_for_issues(@issue.tracker).collect { |x| CustomValue.new(:custom_field =&gt; x, 
+                                                                                                       :customized =&gt; @issue,
+                                                                                                       :value =&gt; (params[:custom_fields] ? params[:custom_fields][x.id.to_s] : nil)) }
       @issue.custom_values = @custom_values
       if @issue.save
         attach_files(@issue, params[:attachments])
@@ -338,8 +344,8 @@ class IssuesController &lt; ApplicationController
   end
   
   def preview
-    issue = @project.issues.find_by_id(params[:id])
-    @attachements = issue.attachments if issue
+    @issue = @project.issues.find_by_id(params[:id]) unless params[:id].blank?
+    @attachements = @issue.attachments if @issue
     @text = params[:notes] || (params[:issue] ? params[:issue][:description] : nil)
     render :partial =&gt; 'common/preview'
   end
@@ -384,7 +390,10 @@ private
   # Retrieve query from session or build a new query
   def retrieve_query
     if !params[:query_id].blank?
-      @query = Query.find(params[:query_id], :conditions =&gt; {:project_id =&gt; (@project ? @project.id : nil)})
+      cond = &quot;project_id IS NULL&quot;
+      cond &lt;&lt; &quot; OR project_id = #{@project.id}&quot; if @project
+      @query = Query.find(params[:query_id], :conditions =&gt; cond)
+      @query.project = @project
       session[:query] = {:id =&gt; @query.id, :project_id =&gt; @query.project_id}
     else
       if params[:set_filter] || session[:query].nil? || session[:query][:project_id] != (@project ? @project.id : nil)
@@ -404,6 +413,7 @@ private
       else
         @query = Query.find_by_id(session[:query][:id]) if session[:query][:id]
         @query ||= Query.new(:name =&gt; &quot;_&quot;, :project =&gt; @project, :filters =&gt; session[:query][:filters])
+        @query.project = @project
       end
     end
   end</diff>
      <filename>app/controllers/issues_controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -66,20 +66,20 @@ class ProjectsController &lt; ApplicationController
                                   :conditions =&gt; &quot;parent_id IS NULL AND status = #{Project::STATUS_ACTIVE}&quot;,
                                   :order =&gt; 'name')
     @project = Project.new(params[:project])
-    @project.enabled_module_names = Redmine::AccessControl.available_project_modules
     if request.get?
       @custom_values = ProjectCustomField.find(:all, :order =&gt; &quot;#{CustomField.table_name}.position&quot;).collect { |x| CustomValue.new(:custom_field =&gt; x, :customized =&gt; @project) }
       @project.trackers = Tracker.all
       @project.is_public = Setting.default_projects_public?
+      @project.enabled_module_names = Redmine::AccessControl.available_project_modules
     else
       @project.custom_fields = CustomField.find(params[:custom_field_ids]) if params[:custom_field_ids]
       @custom_values = ProjectCustomField.find(:all, :order =&gt; &quot;#{CustomField.table_name}.position&quot;).collect { |x| CustomValue.new(:custom_field =&gt; x, :customized =&gt; @project, :value =&gt; (params[:custom_fields] ? params[&quot;custom_fields&quot;][x.id.to_s] : nil)) }
       @project.custom_values = @custom_values
+      @project.enabled_module_names = params[:enabled_modules]
       if @project.save
-        @project.enabled_module_names = params[:enabled_modules]
         flash[:notice] = l(:notice_successful_create)
         redirect_to :controller =&gt; 'admin', :action =&gt; 'projects'
-	    end		
+	  end		
     end	
   end
 	
@@ -204,7 +204,10 @@ class ProjectsController &lt; ApplicationController
   end
   
   def list_files
-    @versions = @project.versions.sort.reverse
+    sort_init &quot;#{Attachment.table_name}.filename&quot;, &quot;asc&quot;
+    sort_update
+    @versions = @project.versions.find(:all, :include =&gt; :attachments, :order =&gt; sort_clause).sort.reverse
+    render :layout =&gt; !request.xhr?
   end
   
   # Show changelog for @project
@@ -338,8 +341,9 @@ class ProjectsController &lt; ApplicationController
                            :include =&gt; [:tracker, :status, :assigned_to, :priority, :project], 
                            :conditions =&gt; [&quot;((start_date BETWEEN ? AND ?) OR (due_date BETWEEN ? AND ?)) AND #{Issue.table_name}.tracker_id IN (#{@selected_tracker_ids.join(',')})&quot;, @calendar.startdt, @calendar.enddt, @calendar.startdt, @calendar.enddt]
                            ) unless @selected_tracker_ids.empty?
+      events += Version.find(:all, :include =&gt; :project,
+                                   :conditions =&gt; [&quot;effective_date BETWEEN ? AND ?&quot;, @calendar.startdt, @calendar.enddt])
     end
-    events += @project.versions.find(:all, :conditions =&gt; [&quot;effective_date BETWEEN ? AND ?&quot;, @calendar.startdt, @calendar.enddt])
     @calendar.events = events
     
     render :layout =&gt; false if request.xhr?
@@ -383,8 +387,9 @@ class ProjectsController &lt; ApplicationController
                            :include =&gt; [:tracker, :status, :assigned_to, :priority, :project], 
                            :conditions =&gt; [&quot;(((start_date&gt;=? and start_date&lt;=?) or (due_date&gt;=? and due_date&lt;=?) or (start_date&lt;? and due_date&gt;?)) and start_date is not null and due_date is not null and #{Issue.table_name}.tracker_id in (#{@selected_tracker_ids.join(',')}))&quot;, @date_from, @date_to, @date_from, @date_to, @date_from, @date_to]
                            ) unless @selected_tracker_ids.empty?
+      @events += Version.find(:all, :include =&gt; :project,
+                                    :conditions =&gt; [&quot;effective_date BETWEEN ? AND ?&quot;, @date_from, @date_to])
     end
-    @events += @project.versions.find(:all, :conditions =&gt; [&quot;effective_date BETWEEN ? AND ?&quot;, @date_from, @date_to])
     @events.sort! {|x,y| x.start_date &lt;=&gt; y.start_date }
     
     if params[:format]=='pdf'</diff>
      <filename>app/controllers/projects_controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -18,19 +18,14 @@
 class QueriesController &lt; ApplicationController
   layout 'base'
   menu_item :issues
-  before_filter :find_project, :authorize
-
-  def index
-    @queries = @project.queries.find(:all, 
-                                     :order =&gt; &quot;name ASC&quot;,
-                                     :conditions =&gt; [&quot;is_public = ? or user_id = ?&quot;, true, (User.current.logged? ? User.current.id : 0)])
-  end
+  before_filter :find_query, :except =&gt; :new
+  before_filter :find_optional_project, :only =&gt; :new
   
   def new
     @query = Query.new(params[:query])
-    @query.project = @project
+    @query.project = params[:query_is_for_all] ? nil : @project
     @query.user = User.current
-    @query.is_public = false unless current_role.allowed_to?(:manage_public_queries)
+    @query.is_public = false unless (@query.project &amp;&amp; current_role.allowed_to?(:manage_public_queries)) || User.current.admin?
     @query.column_names = nil if params[:default_columns]
     
     params[:fields].each do |field|
@@ -52,7 +47,8 @@ class QueriesController &lt; ApplicationController
         @query.add_filter(field, params[:operators][field], params[:values][field])
       end if params[:fields]
       @query.attributes = params[:query]
-      @query.is_public = false unless current_role.allowed_to?(:manage_public_queries)
+      @query.project = nil if params[:query_is_for_all]
+      @query.is_public = false unless (@query.project &amp;&amp; current_role.allowed_to?(:manage_public_queries)) || User.current.admin?
       @query.column_names = nil if params[:default_columns]
       
       if @query.save
@@ -64,18 +60,21 @@ class QueriesController &lt; ApplicationController
 
   def destroy
     @query.destroy if request.post?
-    redirect_to :controller =&gt; 'queries', :project_id =&gt; @project
+    redirect_to :controller =&gt; 'issues', :action =&gt; 'index', :project_id =&gt; @project, :set_filter =&gt; 1
   end
   
 private
-  def find_project
-    if params[:id]
-      @query = Query.find(params[:id])
-      @project = @query.project
-      render_403 unless @query.editable_by?(User.current)
-    else
-      @project = Project.find(params[:project_id])
-    end
+  def find_query
+    @query = Query.find(params[:id])
+    @project = @query.project
+    render_403 unless @query.editable_by?(User.current)
+  rescue ActiveRecord::RecordNotFound
+    render_404
+  end
+  
+  def find_optional_project
+    @project = Project.find(params[:project_id]) if params[:project_id]
+    User.current.allowed_to?(:save_queries, @project, :global =&gt; true)
   rescue ActiveRecord::RecordNotFound
     render_404
   end</diff>
      <filename>app/controllers/queries_controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -19,8 +19,8 @@ require 'SVG/Graph/Bar'
 require 'SVG/Graph/BarHorizontal'
 require 'digest/sha1'
 
-class ChangesetNotFound &lt; Exception
-end
+class ChangesetNotFound &lt; Exception; end
+class InvalidRevisionParam &lt; Exception; end
 
 class RepositoriesController &lt; ApplicationController
   layout 'base'
@@ -51,8 +51,8 @@ class RepositoriesController &lt; ApplicationController
   def show
     # check if new revisions have been committed in the repository
     @repository.fetch_changesets if Setting.autofetch_changesets?
-    # get entries for the browse frame
-    @entries = @repository.entries('')    
+    # root entries
+    @entries = @repository.entries('', @rev)    
     # latest changesets
     @changesets = @repository.changesets.find(:all, :limit =&gt; 10, :order =&gt; &quot;committed_on DESC&quot;)
     show_error_not_found unless @entries || @changesets.any?
@@ -65,7 +65,8 @@ class RepositoriesController &lt; ApplicationController
     if request.xhr?
       @entries ? render(:partial =&gt; 'dir_list_content') : render(:nothing =&gt; true)
     else
-      show_error_not_found unless @entries
+      show_error_not_found and return unless @entries
+      render :action =&gt; 'browse'
     end
   rescue Redmine::Scm::Adapters::CommandFailed =&gt; e
     show_error_command_failed(e.message)
@@ -95,6 +96,12 @@ class RepositoriesController &lt; ApplicationController
   end
   
   def entry
+    @entry = @repository.scm.entry(@path, @rev)
+    show_error_not_found and return unless @entry
+    
+    # If the entry is a dir, show the browser
+    browse and return if @entry.is_dir?
+    
     @content = @repository.scm.cat(@path, @rev)
     show_error_not_found and return unless @content
     if 'raw' == params[:format] || @content.is_binary_data?
@@ -135,7 +142,6 @@ class RepositoriesController &lt; ApplicationController
   end
   
   def diff
-    @rev_to = params[:rev_to]
     @diff_type = params[:type] || User.current.pref[:diff_type] || 'inline'
     @diff_type = 'inline' unless %w(inline sbs).include?(@diff_type)
     
@@ -180,6 +186,8 @@ private
     render_404
   end
   
+  REV_PARAM_RE = %r{^[a-f0-9]*$}
+  
   def find_repository
     @project = Project.find(params[:id])
     @repository = @project.repository
@@ -187,8 +195,12 @@ private
     @path = params[:path].join('/') unless params[:path].nil?
     @path ||= ''
     @rev = params[:rev]
+    @rev_to = params[:rev_to]
+    raise InvalidRevisionParam unless @rev.to_s.match(REV_PARAM_RE) &amp;&amp; @rev.to_s.match(REV_PARAM_RE)
   rescue ActiveRecord::RecordNotFound
     render_404
+  rescue InvalidRevisionParam
+    show_error_not_found
   end
 
   def show_error_not_found
@@ -255,6 +267,9 @@ private
     commits_data = commits_data + [0]*(10 - commits_data.length) if commits_data.length&lt;10
     changes_data = changes_data + [0]*(10 - changes_data.length) if changes_data.length&lt;10
     
+    # Remove email adress in usernames
+    fields = fields.collect {|c| c.gsub(%r{&lt;.+@.+&gt;}, '') }
+    
     graph = SVG::Graph::BarHorizontal.new(
       :height =&gt; 300,
       :width =&gt; 500,</diff>
      <filename>app/controllers/repositories_controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -26,6 +26,8 @@ class TimelogController &lt; ApplicationController
   include SortHelper
   helper :issues
   include TimelogHelper
+  helper :custom_fields
+  include CustomFieldsHelper
   
   def report
     @available_criterias = { 'project' =&gt; {:sql =&gt; &quot;#{TimeEntry.table_name}.project_id&quot;,
@@ -45,37 +47,40 @@ class TimelogController &lt; ApplicationController
                                           :label =&gt; :label_tracker},
                              'activity' =&gt; {:sql =&gt; &quot;#{TimeEntry.table_name}.activity_id&quot;,
                                            :klass =&gt; Enumeration,
-                                           :label =&gt; :label_activity}
+                                           :label =&gt; :label_activity},
+                             'issue' =&gt; {:sql =&gt; &quot;#{TimeEntry.table_name}.issue_id&quot;,
+                                         :klass =&gt; Issue,
+                                         :label =&gt; :label_issue}
                            }
     
+    # Add list and boolean custom fields as available criterias
+    @project.all_custom_fields.select {|cf| %w(list bool).include? cf.field_format }.each do |cf|
+      @available_criterias[&quot;cf_#{cf.id}&quot;] = {:sql =&gt; &quot;(SELECT c.value FROM custom_values c WHERE c.custom_field_id = #{cf.id} AND c.customized_type = 'Issue' AND c.customized_id = issues.id)&quot;,
+                                             :format =&gt; cf.field_format,
+                                             :label =&gt; cf.name}
+    end
+    
     @criterias = params[:criterias] || []
     @criterias = @criterias.select{|criteria| @available_criterias.has_key? criteria}
     @criterias.uniq!
     @criterias = @criterias[0,3]
     
-    @columns = (params[:period] &amp;&amp; %w(year month week).include?(params[:period])) ? params[:period] : 'month'
+    @columns = (params[:columns] &amp;&amp; %w(year month week day).include?(params[:columns])) ? params[:columns] : 'month'
     
-    if params[:date_from]
-      begin; @date_from = params[:date_from].to_date; rescue; end
-    end
-    if params[:date_to]
-      begin; @date_to = params[:date_to].to_date; rescue; end
-    end
-    @date_from ||= Date.civil(Date.today.year, 1, 1)
-    @date_to ||= (Date.civil(Date.today.year, Date.today.month, 1) &gt;&gt; 1) - 1
+    retrieve_date_range
     
     unless @criterias.empty?
       sql_select = @criterias.collect{|criteria| @available_criterias[criteria][:sql] + &quot; AS &quot; + criteria}.join(', ')
       sql_group_by = @criterias.collect{|criteria| @available_criterias[criteria][:sql]}.join(', ')
       
-      sql = &quot;SELECT #{sql_select}, tyear, tmonth, tweek, SUM(hours) AS hours&quot;
+      sql = &quot;SELECT #{sql_select}, tyear, tmonth, tweek, spent_on, SUM(hours) AS hours&quot;
       sql &lt;&lt; &quot; FROM #{TimeEntry.table_name}&quot;
       sql &lt;&lt; &quot; LEFT JOIN #{Issue.table_name} ON #{TimeEntry.table_name}.issue_id = #{Issue.table_name}.id&quot;
       sql &lt;&lt; &quot; LEFT JOIN #{Project.table_name} ON #{TimeEntry.table_name}.project_id = #{Project.table_name}.id&quot;
       sql &lt;&lt; &quot; WHERE (%s)&quot; % @project.project_condition(Setting.display_subprojects_issues?)
       sql &lt;&lt; &quot; AND (%s)&quot; % Project.allowed_to_condition(User.current, :view_time_entries)
-      sql &lt;&lt; &quot; AND spent_on BETWEEN '%s' AND '%s'&quot; % [ActiveRecord::Base.connection.quoted_date(@date_from.to_time), ActiveRecord::Base.connection.quoted_date(@date_to.to_time)]
-      sql &lt;&lt; &quot; GROUP BY #{sql_group_by}, tyear, tmonth, tweek&quot;
+      sql &lt;&lt; &quot; AND spent_on BETWEEN '%s' AND '%s'&quot; % [ActiveRecord::Base.connection.quoted_date(@from.to_time), ActiveRecord::Base.connection.quoted_date(@to.to_time)]
+      sql &lt;&lt; &quot; GROUP BY #{sql_group_by}, tyear, tmonth, tweek, spent_on&quot;
       
       @hours = ActiveRecord::Base.connection.select_all(sql)
       
@@ -87,90 +92,51 @@ class TimelogController &lt; ApplicationController
           row['month'] = &quot;#{row['tyear']}-#{row['tmonth']}&quot;
         when 'week'
           row['week'] = &quot;#{row['tyear']}-#{row['tweek']}&quot;
+        when 'day'
+          row['day'] = &quot;#{row['spent_on']}&quot;
         end
       end
       
       @total_hours = @hours.inject(0) {|s,k| s = s + k['hours'].to_f}
-    end
-       
-    @periods = []
-    date_from = @date_from
-    # 100 columns max
-    while date_from &lt; @date_to &amp;&amp; @periods.length &lt; 100
-      case @columns
-      when 'year'
-        @periods &lt;&lt; &quot;#{date_from.year}&quot;
-        date_from = date_from &gt;&gt; 12
-      when 'month'
-        @periods &lt;&lt; &quot;#{date_from.year}-#{date_from.month}&quot;
-        date_from = date_from &gt;&gt; 1
-      when 'week'
-        @periods &lt;&lt; &quot;#{date_from.year}-#{date_from.cweek}&quot;
-        date_from = date_from + 7
+      
+      @periods = []
+      # Date#at_beginning_of_ not supported in Rails 1.2.x
+      date_from = @from.to_time
+      # 100 columns max
+      while date_from &lt;= @to.to_time &amp;&amp; @periods.length &lt; 100
+        case @columns
+        when 'year'
+          @periods &lt;&lt; &quot;#{date_from.year}&quot;
+          date_from = (date_from + 1.year).at_beginning_of_year
+        when 'month'
+          @periods &lt;&lt; &quot;#{date_from.year}-#{date_from.month}&quot;
+          date_from = (date_from + 1.month).at_beginning_of_month
+        when 'week'
+          @periods &lt;&lt; &quot;#{date_from.year}-#{date_from.to_date.cweek}&quot;
+          date_from = (date_from + 7.day).at_beginning_of_week
+        when 'day'
+          @periods &lt;&lt; &quot;#{date_from.to_date}&quot;
+          date_from = date_from + 1.day
+        end
       end
     end
     
-    render :layout =&gt; false if request.xhr?
+    respond_to do |format|
+      format.html { render :layout =&gt; !request.xhr? }
+      format.csv  { send_data(report_to_csv(@criterias, @periods, @hours).read, :type =&gt; 'text/csv; header=present', :filename =&gt; 'timelog.csv') }
+    end
   end
   
   def details
     sort_init 'spent_on', 'desc'
     sort_update
-
-    @free_period = false
-    @from, @to = nil, nil
-
-    if params[:period_type] == '1' || (params[:period_type].nil? &amp;&amp; !params[:period].nil?)
-      case params[:period].to_s
-      when 'today'
-        @from = @to = Date.today
-      when 'yesterday'
-        @from = @to = Date.today - 1
-      when 'current_week'
-        @from = Date.today - (Date.today.cwday - 1)%7
-        @to = @from + 6
-      when 'last_week'
-        @from = Date.today - 7 - (Date.today.cwday - 1)%7
-        @to = @from + 6
-      when '7_days'
-        @from = Date.today - 7
-        @to = Date.today
-      when 'current_month'
-        @from = Date.civil(Date.today.year, Date.today.month, 1)
-        @to = (@from &gt;&gt; 1) - 1
-      when 'last_month'
-        @from = Date.civil(Date.today.year, Date.today.month, 1) &lt;&lt; 1
-        @to = (@from &gt;&gt; 1) - 1
-      when '30_days'
-        @from = Date.today - 30
-        @to = Date.today
-      when 'current_year'
-        @from = Date.civil(Date.today.year, 1, 1)
-        @to = Date.civil(Date.today.year, 12, 31)
-      end
-    elsif params[:period_type] == '2' || (params[:period_type].nil? &amp;&amp; (!params[:from].nil? || !params[:to].nil?))
-      begin; @from = params[:from].to_s.to_date unless params[:from].blank?; rescue; end
-      begin; @to = params[:to].to_s.to_date unless params[:to].blank?; rescue; end
-      @free_period = true
-    else
-      # default
-    end
-    
-    @from, @to = @to, @from if @from &amp;&amp; @to &amp;&amp; @from &gt; @to
     
     cond = ARCondition.new
     cond &lt;&lt; (@issue.nil? ? @project.project_condition(Setting.display_subprojects_issues?) :
                            [&quot;#{TimeEntry.table_name}.issue_id = ?&quot;, @issue.id])
     
-    if @from
-      if @to
-        cond &lt;&lt; ['spent_on BETWEEN ? AND ?', @from, @to]
-      else
-        cond &lt;&lt; ['spent_on &gt;= ?', @from]
-      end
-    elsif @to
-      cond &lt;&lt; ['spent_on &lt;= ?', @to]
-    end
+    retrieve_date_range
+    cond &lt;&lt; ['spent_on BETWEEN ? AND ?', @from, @to]
 
     TimeEntry.visible_by(User.current) do
       respond_to do |format|
@@ -185,6 +151,7 @@ class TimelogController &lt; ApplicationController
                                     :limit  =&gt;  @entry_pages.items_per_page,
                                     :offset =&gt;  @entry_pages.current.offset)
           @total_hours = TimeEntry.sum(:hours, :include =&gt; :project, :conditions =&gt; cond.conditions).to_f
+
           render :layout =&gt; !request.xhr?
         }
         format.csv {
@@ -205,7 +172,7 @@ class TimelogController &lt; ApplicationController
     @time_entry.attributes = params[:time_entry]
     if request.post? and @time_entry.save
       flash[:notice] = l(:notice_successful_update)
-      redirect_to :action =&gt; 'details', :project_id =&gt; @time_entry.project
+      redirect_to(params[:back_url] || {:action =&gt; 'details', :project_id =&gt; @time_entry.project})
       return
     end    
     @activities = Enumeration::get_values('ACTI')
@@ -238,4 +205,50 @@ private
   rescue ActiveRecord::RecordNotFound
     render_404
   end
+  
+  # Retrieves the date range based on predefined ranges or specific from/to param dates
+  def retrieve_date_range
+    @free_period = false
+    @from, @to = nil, nil
+
+    if params[:period_type] == '1' || (params[:period_type].nil? &amp;&amp; !params[:period].nil?)
+      case params[:period].to_s
+      when 'today'
+        @from = @to = Date.today
+      when 'yesterday'
+        @from = @to = Date.today - 1
+      when 'current_week'
+        @from = Date.today - (Date.today.cwday - 1)%7
+        @to = @from + 6
+      when 'last_week'
+        @from = Date.today - 7 - (Date.today.cwday - 1)%7
+        @to = @from + 6
+      when '7_days'
+        @from = Date.today - 7
+        @to = Date.today
+      when 'current_month'
+        @from = Date.civil(Date.today.year, Date.today.month, 1)
+        @to = (@from &gt;&gt; 1) - 1
+      when 'last_month'
+        @from = Date.civil(Date.today.year, Date.today.month, 1) &lt;&lt; 1
+        @to = (@from &gt;&gt; 1) - 1
+      when '30_days'
+        @from = Date.today - 30
+        @to = Date.today
+      when 'current_year'
+        @from = Date.civil(Date.today.year, 1, 1)
+        @to = Date.civil(Date.today.year, 12, 31)
+      end
+    elsif params[:period_type] == '2' || (params[:period_type].nil? &amp;&amp; (!params[:from].nil? || !params[:to].nil?))
+      begin; @from = params[:from].to_s.to_date unless params[:from].blank?; rescue; end
+      begin; @to = params[:to].to_s.to_date unless params[:to].blank?; rescue; end
+      @free_period = true
+    else
+      # default
+    end
+    
+    @from, @to = @to, @from if @from &amp;&amp; @to &amp;&amp; @from &gt; @to
+    @from ||= (TimeEntry.minimum(:spent_on, :include =&gt; :project, :conditions =&gt; @project.project_condition(Setting.display_subprojects_issues?)) || Date.today) - 1
+    @to   ||= (TimeEntry.maximum(:spent_on, :include =&gt; :project, :conditions =&gt; @project.project_condition(Setting.display_subprojects_issues?)) || Date.today)
+  end
 end</diff>
      <filename>app/controllers/timelog_controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -83,7 +83,8 @@ class UsersController &lt; ApplicationController
       end
       if @user.update_attributes(params[:user])
         flash[:notice] = l(:notice_successful_update)
-        redirect_to :action =&gt; 'list'
+        # Give a string to redirect_to otherwise it would use status param as the response code
+        redirect_to(url_for(:action =&gt; 'list', :status =&gt; params[:status], :page =&gt; params[:page]))
       end
     end
     @auth_sources = AuthSource.find(:all)</diff>
      <filename>app/controllers/users_controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -207,8 +207,10 @@ module ApplicationHelper
         rf = Regexp.new(filename,  Regexp::IGNORECASE)
         # search for the picture in attachments
         if found = attachments.detect { |att| att.filename =~ rf }
-          image_url = url_for :only_path =&gt; only_path, :controller =&gt; 'attachments', :action =&gt; 'download', :id =&gt; found.id
-          &quot;!#{style}#{image_url}!&quot;
+          image_url = url_for :only_path =&gt; only_path, :controller =&gt; 'attachments', :action =&gt; 'download', :id =&gt; found
+          desc = found.description.to_s.gsub(/^([^\(\)]*).*$/, &quot;\\1&quot;)
+          alt = desc.blank? ? nil : &quot;(#{desc})&quot;
+          &quot;!#{style}#{image_url}#{alt}!&quot;
         else
           &quot;!#{style}#{filename}!&quot;
         end
@@ -425,6 +427,10 @@ module ApplicationHelper
     form_for(name, object, options.merge({ :builder =&gt; TabularFormBuilder, :lang =&gt; current_language}), &amp;proc)
   end
   
+  def back_url_hidden_field_tag
+    hidden_field_tag 'back_url', (params[:back_url] || request.env['HTTP_REFERER'])
+  end
+  
   def check_all_links(form_name)
     link_to_function(l(:button_check_all), &quot;checkAll('#{form_name}', true)&quot;) +
     &quot; | &quot; +
@@ -463,9 +469,22 @@ module ApplicationHelper
   end
   
   def calendar_for(field_id)
+    include_calendar_headers_tags
     image_tag(&quot;calendar.png&quot;, {:id =&gt; &quot;#{field_id}_trigger&quot;,:class =&gt; &quot;calendar-trigger&quot;}) +
     javascript_tag(&quot;Calendar.setup({inputField : '#{field_id}', ifFormat : '%Y-%m-%d', button : '#{field_id}_trigger' });&quot;)
   end
+
+  def include_calendar_headers_tags
+    unless @calendar_headers_tags_included
+      @calendar_headers_tags_included = true
+      content_for :header_tags do
+        javascript_include_tag('calendar/calendar') +
+        javascript_include_tag(&quot;calendar/lang/calendar-#{current_language}.js&quot;) +
+        javascript_include_tag('calendar/calendar-setup') +
+        stylesheet_link_tag('calendar')
+      end
+    end
+  end
   
   def wikitoolbar_for(field_id)
     return '' unless Setting.text_formatting == 'textile'</diff>
      <filename>app/helpers/application_helper.rb</filename>
    </modified>
    <modified>
      <diff>@@ -32,6 +32,19 @@ module IssuesHelper
       &quot;&lt;strong&gt;#{@cached_label_assigned_to}&lt;/strong&gt;: #{issue.assigned_to}&lt;br /&gt;&quot; +
       &quot;&lt;strong&gt;#{@cached_label_priority}&lt;/strong&gt;: #{issue.priority.name}&quot;
   end
+  
+  def sidebar_queries
+    unless @sidebar_queries
+      # User can see public queries and his own queries
+      visible = ARCondition.new([&quot;is_public = ? OR user_id = ?&quot;, true, (User.current.logged? ? User.current.id : 0)])
+      # Project specific queries and global queries
+      visible &lt;&lt; (@project.nil? ? [&quot;project_id IS NULL&quot;] : [&quot;project_id IS NULL OR project_id = ?&quot;, @project.id])
+      @sidebar_queries = Query.find(:all, 
+                                    :order =&gt; &quot;name ASC&quot;,
+                                    :conditions =&gt; visible.conditions)
+    end
+    @sidebar_queries
+  end
 
   def show_detail(detail, no_html=false)
     case detail.property</diff>
      <filename>app/helpers/issues_helper.rb</filename>
    </modified>
    <modified>
      <diff>@@ -58,8 +58,11 @@ module RepositoriesHelper
   end
   
   def with_leading_slash(path)
-    path ||= ''
-    path.starts_with?('/') ? path : &quot;/#{path}&quot;
+    path.to_s.starts_with?('/') ? path : &quot;/#{path}&quot;
+  end
+  
+  def without_leading_slash(path)
+    path.gsub(%r{^/+}, '')
   end
 
   def subversion_field_tags(form, repository)</diff>
      <filename>app/helpers/repositories_helper.rb</filename>
    </modified>
    <modified>
      <diff>@@ -76,4 +76,60 @@ module TimelogHelper
     export.rewind
     export
   end
+  
+  def format_criteria_value(criteria, value)
+    value.blank? ? l(:label_none) : ((k = @available_criterias[criteria][:klass]) ? k.find_by_id(value.to_i) : format_value(value, @available_criterias[criteria][:format]))
+  end
+  
+  def report_to_csv(criterias, periods, hours)
+    export = StringIO.new
+    CSV::Writer.generate(export, l(:general_csv_separator)) do |csv|
+      # Column headers
+      headers = criterias.collect {|criteria| l(@available_criterias[criteria][:label]) }
+      headers += periods
+      headers &lt;&lt; l(:label_total)
+      csv &lt;&lt; headers.collect {|c| to_utf8(c) }
+      # Content
+      report_criteria_to_csv(csv, criterias, periods, hours)
+      # Total row
+      row = [ l(:label_total) ] + [''] * (criterias.size - 1)
+      total = 0
+      periods.each do |period|
+        sum = sum_hours(select_hours(hours, @columns, period.to_s))
+        total += sum
+        row &lt;&lt; (sum &gt; 0 ? &quot;%.2f&quot; % sum : '')
+      end
+      row &lt;&lt; &quot;%.2f&quot; %total
+      csv &lt;&lt; row
+    end
+    export.rewind
+    export
+  end
+  
+  def report_criteria_to_csv(csv, criterias, periods, hours, level=0)
+    hours.collect {|h| h[criterias[level]].to_s}.uniq.each do |value|
+      hours_for_value = select_hours(hours, criterias[level], value)
+      next if hours_for_value.empty?
+      row = [''] * level
+      row &lt;&lt; to_utf8(format_criteria_value(criterias[level], value))
+      row += [''] * (criterias.length - level - 1)
+      total = 0
+      periods.each do |period|
+        sum = sum_hours(select_hours(hours_for_value, @columns, period.to_s))
+        total += sum
+        row &lt;&lt; (sum &gt; 0 ? &quot;%.2f&quot; % sum : '')
+      end
+      row &lt;&lt; &quot;%.2f&quot; %total
+      csv &lt;&lt; row
+      
+      if criterias.length &gt; level + 1
+        report_criteria_to_csv(csv, criterias, periods, hours_for_value, level + 1)
+      end
+    end
+  end
+  
+  def to_utf8(s)
+    @ic ||= Iconv.new(l(:general_csv_encoding), 'UTF-8')
+    begin; @ic.iconv(s.to_s); rescue; s.to_s; end
+  end
 end</diff>
      <filename>app/helpers/timelog_helper.rb</filename>
    </modified>
    <modified>
      <diff>@@ -22,4 +22,16 @@ module UsersHelper
                         [l(:status_registered), 2],
                         [l(:status_locked), 3]], selected)
   end
+  
+  def change_status_link(user)
+    url = {:action =&gt; 'edit', :id =&gt; user, :page =&gt; params[:page], :status =&gt; params[:status]}
+    
+    if user.locked?
+      link_to l(:button_unlock), url.merge(:user =&gt; {:status =&gt; User::STATUS_ACTIVE}), :method =&gt; :post, :class =&gt; 'icon icon-unlock'
+    elsif user.registered?
+      link_to l(:button_activate), url.merge(:user =&gt; {:status =&gt; User::STATUS_ACTIVE}), :method =&gt; :post, :class =&gt; 'icon icon-unlock'
+    else
+      link_to l(:button_lock), url.merge(:user =&gt; {:status =&gt; User::STATUS_LOCKED}), :method =&gt; :post, :class =&gt; 'icon icon-lock'
+    end
+  end
 end</diff>
      <filename>app/helpers/users_helper.rb</filename>
    </modified>
    <modified>
      <diff>@@ -35,48 +35,48 @@ class Attachment &lt; ActiveRecord::Base
     errors.add_to_base :too_long if self.filesize &gt; Setting.attachment_max_size.to_i.kilobytes
   end
 
-	def file=(incomming_file)
-		unless incomming_file.nil?
-			@temp_file = incomming_file
-			if @temp_file.size &gt; 0
-				self.filename = sanitize_filename(@temp_file.original_filename)
-				self.disk_filename = DateTime.now.strftime(&quot;%y%m%d%H%M%S&quot;) + &quot;_&quot; + self.filename
-				self.content_type = @temp_file.content_type.to_s.chomp
-				self.filesize = @temp_file.size
-			end
-		end
-	end
-	
-	def file
-	 nil
-	end
-	
-	# Copy temp file to its final location
-	def before_save
-		if @temp_file &amp;&amp; (@temp_file.size &gt; 0)
-			logger.debug(&quot;saving '#{self.diskfile}'&quot;)
-			File.open(diskfile, &quot;wb&quot;) do |f| 
-				f.write(@temp_file.read)
-			end
-			self.digest = Digest::MD5.hexdigest(File.read(diskfile))
-		end
-		# Don't save the content type if it's longer than the authorized length
-		if self.content_type &amp;&amp; self.content_type.length &gt; 255
-		  self.content_type = nil
-		end
-	end
-	
-	# Deletes file on the disk
-	def after_destroy
-		if self.filename?
-			File.delete(diskfile) if File.exist?(diskfile)
-		end
-	end
+  def file=(incoming_file)
+    unless incoming_file.nil?
+      @temp_file = incoming_file
+      if @temp_file.size &gt; 0
+        self.filename = sanitize_filename(@temp_file.original_filename)
+        self.disk_filename = DateTime.now.strftime(&quot;%y%m%d%H%M%S&quot;) + &quot;_&quot; + self.filename
+        self.content_type = @temp_file.content_type.to_s.chomp
+        self.filesize = @temp_file.size
+      end
+    end
+  end
 	
-	# Returns file's location on disk
-	def diskfile
-		&quot;#{@@storage_path}/#{self.disk_filename}&quot;
-	end
+  def file
+    nil
+  end
+
+  # Copy temp file to its final location
+  def before_save
+    if @temp_file &amp;&amp; (@temp_file.size &gt; 0)
+      logger.debug(&quot;saving '#{self.diskfile}'&quot;)
+      File.open(diskfile, &quot;wb&quot;) do |f| 
+        f.write(@temp_file.read)
+      end
+      self.digest = Digest::MD5.hexdigest(File.read(diskfile))
+    end
+    # Don't save the content type if it's longer than the authorized length
+    if self.content_type &amp;&amp; self.content_type.length &gt; 255
+      self.content_type = nil
+    end
+  end
+
+  # Deletes file on the disk
+  def after_destroy
+    if self.filename?
+      File.delete(diskfile) if File.exist?(diskfile)
+    end
+  end
+
+  # Returns file's location on disk
+  def diskfile
+    &quot;#{@@storage_path}/#{self.disk_filename}&quot;
+  end
   
   def increment_download
     increment!(:downloads)
@@ -87,18 +87,17 @@ class Attachment &lt; ActiveRecord::Base
   end
   
   def image?
-    self.filename =~ /\.(jpeg|jpg|gif|png)$/i
+    self.filename =~ /\.(jpe?g|gif|png)$/i
   end
   
 private
   def sanitize_filename(value)
-      # get only the filename, not the whole path
-      just_filename = value.gsub(/^.*(\\|\/)/, '')
-      # NOTE: File.basename doesn't work right with Windows paths on Unix
-      # INCORRECT: just_filename = File.basename(value.gsub('\\\\', '/')) 
+    # get only the filename, not the whole path
+    just_filename = value.gsub(/^.*(\\|\/)/, '')
+    # NOTE: File.basename doesn't work right with Windows paths on Unix
+    # INCORRECT: just_filename = File.basename(value.gsub('\\\\', '/')) 
 
-      # Finally, replace all non alphanumeric, underscore or periods with underscore
-      @filename = just_filename.gsub(/[^\w\.\-]/,'_') 
+    # Finally, replace all non alphanumeric, hyphens or periods with underscore
+    @filename = just_filename.gsub(/[^\w\.\-]/,'_') 
   end
-    
 end</diff>
      <filename>app/models/attachment.rb</filename>
    </modified>
    <modified>
      <diff>@@ -35,6 +35,10 @@ class Changeset &lt; ActiveRecord::Base
   validates_uniqueness_of :revision, :scope =&gt; :repository_id
   validates_uniqueness_of :scmid, :scope =&gt; :repository_id, :allow_nil =&gt; true
   
+  def revision=(r)
+    write_attribute :revision, (r.nil? ? nil : r.to_s)
+  end
+  
   def comments=(comment)
     write_attribute(:comments, comment.strip)
   end</diff>
      <filename>app/models/changeset.rb</filename>
    </modified>
    <modified>
      <diff>@@ -93,7 +93,11 @@ class Issue &lt; ActiveRecord::Base
     self.priority = nil
     write_attribute(:priority_id, pid)
   end
-
+  
+  def estimated_hours=(h)
+    write_attribute :estimated_hours, (h.is_a?(String) ? h.to_hours : h)
+  end
+  
   def validate
     if self.due_date.nil? &amp;&amp; @attributes['due_date'] &amp;&amp; !@attributes['due_date'].empty?
       errors.add :due_date, :activerecord_error_not_a_date
@@ -153,6 +157,8 @@ class Issue &lt; ActiveRecord::Base
     # Close duplicates if the issue was closed
     if @issue_before_change &amp;&amp; !@issue_before_change.closed? &amp;&amp; self.closed?
       duplicates.each do |duplicate|
+        # Reload is need in case the duplicate was updated by a previous duplicate
+        duplicate.reload
         # Don't re-close it if it's already closed
         next if duplicate.closed?
         # Same user and notes
@@ -237,4 +243,8 @@ class Issue &lt; ActiveRecord::Base
       yield
     end
   end
+  
+  def to_s
+    &quot;#{tracker} ##{id}: #{subject}&quot;
+  end
 end</diff>
      <filename>app/models/issue.rb</filename>
    </modified>
    <modified>
      <diff>@@ -33,6 +33,7 @@ class Journal &lt; ActiveRecord::Base
   acts_as_event :title =&gt; Proc.new {|o| &quot;#{o.issue.tracker.name} ##{o.issue.id}: #{o.issue.subject}&quot; + ((s = o.new_status) ? &quot; (#{s})&quot; : '') },
                 :description =&gt; :notes,
                 :author =&gt; :user,
+                :type =&gt; Proc.new {|o| (s = o.new_status) &amp;&amp; s.is_closed? ? 'issue-closed' : 'issue-edit' },
                 :url =&gt; Proc.new {|o| {:controller =&gt; 'issues', :action =&gt; 'show', :id =&gt; o.issue.id, :anchor =&gt; &quot;change-#{o.id}&quot;}}
 
   def save</diff>
      <filename>app/models/journal.rb</filename>
    </modified>
    <modified>
      <diff>@@ -28,6 +28,7 @@ class Message &lt; ActiveRecord::Base
                      :date_column =&gt; 'created_on'
   acts_as_event :title =&gt; Proc.new {|o| &quot;#{o.board.name}: #{o.subject}&quot;},
                 :description =&gt; :content,
+                :type =&gt; Proc.new {|o| o.parent_id.nil? ? 'message' : 'reply'},
                 :url =&gt; Proc.new {|o| {:controller =&gt; 'messages', :action =&gt; 'show', :board_id =&gt; o.board_id, :id =&gt; o.id}}
   
   attr_protected :locked, :sticky</diff>
      <filename>app/models/message.rb</filename>
    </modified>
    <modified>
      <diff>@@ -21,6 +21,8 @@ class MessageObserver &lt; ActiveRecord::Observer
     recipients = ([message.root] + message.root.children).collect {|m| m.author.mail if m.author &amp;&amp; m.author.active?}
     # send notification to the board watchers
     recipients += message.board.watcher_recipients
+    # send notification to project members who want to be notified
+    recipients += message.board.project.recipients
     recipients = recipients.compact.uniq
     Mailer.deliver_message_posted(message, recipients) if !recipients.empty? &amp;&amp; Setting.notified_events.include?('message_posted')
   end</diff>
      <filename>app/models/message_observer.rb</filename>
    </modified>
    <modified>
      <diff>@@ -33,7 +33,7 @@ class Project &lt; ActiveRecord::Base
   has_many :documents, :dependent =&gt; :destroy
   has_many :news, :dependent =&gt; :delete_all, :include =&gt; :author
   has_many :issue_categories, :dependent =&gt; :delete_all, :order =&gt; &quot;#{IssueCategory.table_name}.name&quot;
-  has_many :boards, :order =&gt; &quot;position ASC&quot;
+  has_many :boards, :dependent =&gt; :destroy, :order =&gt; &quot;position ASC&quot;
   has_one :repository, :dependent =&gt; :destroy
   has_many :changesets, :through =&gt; :repository
   has_one :wiki, :dependent =&gt; :destroy
@@ -75,12 +75,14 @@ class Project &lt; ActiveRecord::Base
     conditions = nil
     if include_subprojects &amp;&amp; !active_children.empty?
       ids = [id] + active_children.collect {|c| c.id}
-      conditions = [&quot;#{Issue.table_name}.project_id IN (#{ids.join(',')})&quot;]
+      conditions = [&quot;#{Project.table_name}.id IN (#{ids.join(',')})&quot;]
     end
-    conditions ||= [&quot;#{Issue.table_name}.project_id = ?&quot;, id]
+    conditions ||= [&quot;#{Project.table_name}.id = ?&quot;, id]
     # Quick and dirty fix for Rails 2 compatibility
     Issue.send(:with_scope, :find =&gt; { :conditions =&gt; conditions }) do 
-      yield
+      Version.send(:with_scope, :find =&gt; { :conditions =&gt; conditions }) do
+        yield
+      end
     end 
   end
 </diff>
      <filename>app/models/project.rb</filename>
    </modified>
    <modified>
      <diff>@@ -116,6 +116,11 @@ class Query &lt; ActiveRecord::Base
     set_language_if_valid(User.current.language)
   end
   
+  def after_initialize
+    # Store the fact that project is nil (used in #editable_by?)
+    @is_for_all = project.nil?
+  end
+  
   def validate
     filters.each_key do |field|
       errors.add label_for(field), :activerecord_error_blank unless 
@@ -128,8 +133,10 @@ class Query &lt; ActiveRecord::Base
   
   def editable_by?(user)
     return false unless user
-    return true if !is_public &amp;&amp; self.user_id == user.id
-    is_public &amp;&amp; user.allowed_to?(:manage_public_queries, project)
+    # Admin can edit them all and regular users can edit their private queries
+    return true if user.admin? || (!is_public &amp;&amp; self.user_id == user.id)
+    # Members can not edit public queries that are for all project (only admin is allowed to)
+    is_public &amp;&amp; !@is_for_all &amp;&amp; user.allowed_to?(:manage_public_queries, project)
   end
   
   def available_filters
@@ -139,7 +146,7 @@ class Query &lt; ActiveRecord::Base
     
     @available_filters = { &quot;status_id&quot; =&gt; { :type =&gt; :list_status, :order =&gt; 1, :values =&gt; IssueStatus.find(:all, :order =&gt; 'position').collect{|s| [s.name, s.id.to_s] } },       
                            &quot;tracker_id&quot; =&gt; { :type =&gt; :list, :order =&gt; 2, :values =&gt; trackers.collect{|s| [s.name, s.id.to_s] } },                                                                                                                
-                           &quot;priority_id&quot; =&gt; { :type =&gt; :list, :order =&gt; 3, :values =&gt; Enumeration.find(:all, :conditions =&gt; ['opt=?','IPRI']).collect{|s| [s.name, s.id.to_s] } },
+                           &quot;priority_id&quot; =&gt; { :type =&gt; :list, :order =&gt; 3, :values =&gt; Enumeration.find(:all, :conditions =&gt; ['opt=?','IPRI'], :order =&gt; 'position').collect{|s| [s.name, s.id.to_s] } },
                            &quot;subject&quot; =&gt; { :type =&gt; :text, :order =&gt; 8 },  
                            &quot;created_on&quot; =&gt; { :type =&gt; :date_past, :order =&gt; 9 },                        
                            &quot;updated_on&quot; =&gt; { :type =&gt; :date_past, :order =&gt; 10 },
@@ -294,7 +301,7 @@ class Query &lt; ActiveRecord::Base
         # custom field
         db_table = CustomValue.table_name
         db_field = 'value'
-        sql &lt;&lt; &quot;#{Issue.table_name}.id IN (SELECT #{db_table}.customized_id FROM #{db_table} where #{db_table}.customized_type='Issue' AND #{db_table}.customized_id=#{Issue.table_name}.id AND #{db_table}.custom_field_id=#{$1} AND &quot;
+        sql &lt;&lt; &quot;#{Issue.table_name}.id IN (SELECT #{Issue.table_name}.id FROM #{Issue.table_name} LEFT OUTER JOIN #{db_table} ON #{db_table}.customized_type='Issue' AND #{db_table}.customized_id=#{Issue.table_name}.id AND #{db_table}.custom_field_id=#{$1} WHERE &quot;
       else
         # regular field
         db_table = Issue.table_name
@@ -313,9 +320,9 @@ class Query &lt; ActiveRecord::Base
       when &quot;!&quot;
         sql = sql + &quot;(#{db_table}.#{db_field} IS NULL OR #{db_table}.#{db_field} NOT IN (&quot; + v.collect{|val| &quot;'#{connection.quote_string(val)}'&quot;}.join(&quot;,&quot;) + &quot;))&quot;
       when &quot;!*&quot;
-        sql = sql + &quot;#{db_table}.#{db_field} IS NULL&quot;
+        sql = sql + &quot;#{db_table}.#{db_field} IS NULL OR #{db_table}.#{db_field} = ''&quot;
       when &quot;*&quot;
-        sql = sql + &quot;#{db_table}.#{db_field} IS NOT NULL&quot;
+        sql = sql + &quot;#{db_table}.#{db_field} IS NOT NULL AND #{db_table}.#{db_field} &lt;&gt; ''&quot;
       when &quot;&gt;=&quot;
         sql = sql + &quot;#{db_table}.#{db_field} &gt;= #{v.first.to_i}&quot;
       when &quot;&lt;=&quot;</diff>
      <filename>app/models/query.rb</filename>
    </modified>
    <modified>
      <diff>@@ -35,7 +35,8 @@ class Repository::Cvs &lt; Repository
   end
   
   def entries(path=nil, identifier=nil)
-    entries=scm.entries(path, identifier)
+    rev = identifier.nil? ? nil : changesets.find_by_revision(identifier)
+    entries = scm.entries(path, rev.nil? ? nil : rev.committed_on)
     if entries
       entries.each() do |entry|
         unless entry.lastrev.nil? || entry.lastrev.identifier
@@ -137,12 +138,18 @@ class Repository::Cvs &lt; Repository
       end
       
       # Renumber new changesets in chronological order
-      c = changesets.find(:first, :order =&gt; 'committed_on DESC, id DESC', :conditions =&gt; &quot;revision NOT LIKE '_%'&quot;)
-      next_rev = c.nil? ? 1 : (c.revision.to_i + 1)
       changesets.find(:all, :order =&gt; 'committed_on ASC, id ASC', :conditions =&gt; &quot;revision LIKE '_%'&quot;).each do |changeset|
-        changeset.update_attribute :revision, next_rev
-        next_rev += 1
+        changeset.update_attribute :revision, next_revision_number
       end
     end # transaction
   end
+  
+  private
+  
+  # Returns the next revision number to assign to a CVS changeset
+  def next_revision_number
+    # Need to retrieve existing revision numbers to sort them as integers
+    @current_revision_number ||= (connection.select_values(&quot;SELECT revision FROM #{Changeset.table_name} WHERE repository_id = #{id} AND revision NOT LIKE '_%'&quot;).collect(&amp;:to_i).max || 0)
+    @current_revision_number += 1
+  end
 end</diff>
      <filename>app/models/repository/cvs.rb</filename>
    </modified>
    <modified>
      <diff>@@ -29,7 +29,8 @@ class Repository::Darcs &lt; Repository
   end
   
   def entries(path=nil, identifier=nil)
-    entries=scm.entries(path, identifier)
+    patch = identifier.nil? ? nil : changesets.find_by_revision(identifier)
+    entries = scm.entries(path, patch.nil? ? nil : patch.scmid)
     if entries
       entries.each do |entry|
         # Search the DB for the entry's last change</diff>
      <filename>app/models/repository/darcs.rb</filename>
    </modified>
    <modified>
      <diff>@@ -34,6 +34,11 @@ class Repository::Mercurial &lt; Repository
     if entries
       entries.each do |entry|
         next unless entry.is_file?
+        # Set the filesize unless browsing a specific revision
+        if identifier.nil?
+          full_path = File.join(root_url, entry.path)
+          entry.size = File.stat(full_path).size if File.file?(full_path)
+        end
         # Search the DB for the entry's last change
         change = changes.find(:first, :conditions =&gt; [&quot;path = ?&quot;, scm.with_leading_slash(entry.path)], :order =&gt; &quot;#{Changeset.table_name}.committed_on DESC&quot;)
         if change
@@ -53,7 +58,9 @@ class Repository::Mercurial &lt; Repository
       # latest revision found in database
       db_revision = latest_changeset ? latest_changeset.revision.to_i : -1
       # latest revision in the repository
-      scm_revision = scm_info.lastrev.identifier.to_i
+      latest_revision = scm_info.lastrev
+      return if latest_revision.nil?
+      scm_revision = latest_revision.identifier.to_i
       if db_revision &lt; scm_revision
         logger.debug &quot;Fetching changesets for repository #{url}&quot; if logger &amp;&amp; logger.debug?
         identifier_from = db_revision + 1</diff>
      <filename>app/models/repository/mercurial.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,5 @@
 # redMine - project management software
-# Copyright (C) 2006-2007  Jean-Philippe Lang
+# Copyright (C) 2006-2008  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
@@ -39,6 +39,10 @@ class TimeEntry &lt; ActiveRecord::Base
     errors.add :issue_id, :activerecord_error_invalid if (issue_id &amp;&amp; !issue) || (issue &amp;&amp; project!=issue.project)
   end
   
+  def hours=(h)
+    write_attribute :hours, (h.is_a?(String) ? h.to_hours : h)
+  end
+  
   # tyear, tmonth, tweek assigned where setting spent_on attributes
   # these attributes make time aggregations easier
   def spent_on=(date)</diff>
      <filename>app/models/time_entry.rb</filename>
    </modified>
    <modified>
      <diff>@@ -18,6 +18,9 @@
 require &quot;digest/sha1&quot;
 
 class User &lt; ActiveRecord::Base
+
+  class OnTheFlyCreationFailure &lt; Exception; end
+
   # Account statuses
   STATUS_ANONYMOUS  = 0
   STATUS_ACTIVE     = 1
@@ -105,15 +108,17 @@ class User &lt; ActiveRecord::Base
         onthefly.language = Setting.default_language
         if onthefly.save
           user = find(:first, :conditions =&gt; [&quot;login=?&quot;, login])
-          logger.info(&quot;User '#{user.login}' created on the fly.&quot;) if logger
+          logger.info(&quot;User '#{user.login}' created from the LDAP&quot;) if logger
+        else
+          logger.error(&quot;User '#{onthefly.login}' found in LDAP but could not be created (#{onthefly.errors.full_messages.join(', ')})&quot;) if logger
+          raise OnTheFlyCreationFailure.new
         end
       end
     end    
     user.update_attribute(:last_login_on, Time.now) if user
     user
-    
-    rescue =&gt; text
-      raise text
+  rescue =&gt; text
+    raise text
   end
 	
   # Return user's full name for display
@@ -222,17 +227,26 @@ class User &lt; ActiveRecord::Base
   # action can be:
   # * a parameter-like Hash (eg. :controller =&gt; 'projects', :action =&gt; 'edit')
   # * a permission Symbol (eg. :edit_project)
-  def allowed_to?(action, project)
-    # No action allowed on archived projects
-    return false unless project.active?
-    # No action allowed on disabled modules
-    return false unless project.allows_to?(action)
-    # Admin users are authorized for anything else
-    return true if admin?
-    
-    role = role_for_project(project)
-    return false unless role
-    role.allowed_to?(action) &amp;&amp; (project.is_public? || role.member?)
+  def allowed_to?(action, project, options={})
+    if project
+      # No action allowed on archived projects
+      return false unless project.active?
+      # No action allowed on disabled modules
+      return false unless project.allows_to?(action)
+      # Admin users are authorized for anything else
+      return true if admin?
+      
+      role = role_for_project(project)
+      return false unless role
+      role.allowed_to?(action) &amp;&amp; (project.is_public? || role.member?)
+      
+    elsif options[:global]
+      # authorize if user has at least one role that has this permission
+      roles = memberships.collect {|m| m.role}.uniq
+      roles.detect {|r| r.allowed_to?(action)}
+    else
+      false
+    end
   end
   
   def self.current=(user)</diff>
      <filename>app/models/user.rb</filename>
    </modified>
    <modified>
      <diff>@@ -32,6 +32,7 @@ class WikiContent &lt; ActiveRecord::Base
     acts_as_event :title =&gt; Proc.new {|o| &quot;#{l(:label_wiki_edit)}: #{o.page.title} (##{o.version})&quot;},
                   :description =&gt; :comments,
                   :datetime =&gt; :updated_on,
+                  :type =&gt; 'wiki-page',
                   :url =&gt; Proc.new {|o| {:controller =&gt; 'wiki', :id =&gt; o.page.wiki.project_id, :page =&gt; o.page.title, :version =&gt; o.version}}
 
     def text=(plain)</diff>
      <filename>app/models/wiki_content.rb</filename>
    </modified>
    <modified>
      <diff>@@ -35,10 +35,3 @@
 
 &lt;%= submit_tag l(:button_submit) %&gt;
 &lt;% end %&gt;
-
-&lt;% content_for :header_tags do %&gt;
-&lt;%= javascript_include_tag 'calendar/calendar' %&gt;
-&lt;%= javascript_include_tag &quot;calendar/lang/calendar-#{current_language}.js&quot; %&gt;
-&lt;%= javascript_include_tag 'calendar/calendar-setup' %&gt;
-&lt;%= stylesheet_link_tag 'calendar' %&gt;
-&lt;% end %&gt;</diff>
      <filename>app/views/account/register.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -19,12 +19,15 @@ while day &lt;= calendar.enddt %&gt;
       elsif day == i.due_date
 		image_tag('arrow_to.png') 
       end %&gt;
-  &lt;%= h(&quot;#{i.project.name} -&quot;) unless @project &amp;&amp; @project == i.project %&gt;
+  &lt;%= h(&quot;#{i.project} -&quot;) unless @project &amp;&amp; @project == i.project %&gt;
   &lt;%= link_to_issue i %&gt;: &lt;%= h(truncate(i.subject, 30)) %&gt;
   &lt;span class=&quot;tip&quot;&gt;&lt;%= render_issue_tooltip i %&gt;&lt;/span&gt;
   &lt;/div&gt;
   &lt;% else %&gt;
-  &lt;%= link_to_version i, :class =&gt; &quot;icon icon-package&quot; %&gt;
+  &lt;span class=&quot;icon icon-package&quot;&gt;  
+    &lt;%= h(&quot;#{i.project} -&quot;) unless @project &amp;&amp; @project == i.project %&gt;
+    &lt;%= link_to_version i%&gt;
+  &lt;/span&gt;
   &lt;% end %&gt;
 &lt;% end %&gt;
 &lt;/td&gt;</diff>
      <filename>app/views/common/_calendar.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -49,10 +49,3 @@
 &lt;% end %&gt;
 
 &lt;%= wikitoolbar_for 'issue_description' %&gt;
-
-&lt;% content_for :header_tags do %&gt;
-    &lt;%= javascript_include_tag 'calendar/calendar' %&gt;
-    &lt;%= javascript_include_tag &quot;calendar/lang/calendar-#{current_language}.js&quot; %&gt;
-    &lt;%= javascript_include_tag 'calendar/calendar-setup' %&gt;
-    &lt;%= stylesheet_link_tag 'calendar' %&gt;
-&lt;% end %&gt;</diff>
      <filename>app/views/issues/_form.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,5 @@
 &lt;% for journal in journals %&gt;
-    &lt;div id=&quot;change-&lt;%= journal.id %&gt;&quot;&gt;
+    &lt;div id=&quot;change-&lt;%= journal.id %&gt;&quot; class=&quot;journal&quot;&gt;
 	&lt;h4&gt;&lt;div style=&quot;float:right;&quot;&gt;&lt;%= link_to &quot;##{journal.indice}&quot;, :anchor =&gt; &quot;note-#{journal.indice}&quot; %&gt;&lt;/div&gt;
 	&lt;%= content_tag('a', '', :name =&gt; &quot;note-#{journal.indice}&quot;)%&gt;
 	&lt;%= format_time(journal.created_on) %&gt; - &lt;%= journal.user.name %&gt;&lt;/h4&gt;</diff>
      <filename>app/views/issues/_history.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -1,13 +1,14 @@
 &lt;h3&gt;&lt;%= l(:label_issue_plural) %&gt;&lt;/h3&gt;
 &lt;%= link_to l(:label_issue_view_all), { :controller =&gt; 'issues', :action =&gt; 'index', :project_id =&gt; @project, :set_filter =&gt; 1 } %&gt;&lt;br /&gt;
+&lt;% if @project %&gt;
 &lt;%= link_to l(:field_summary), :controller =&gt; 'reports', :action =&gt; 'issue_report', :id =&gt; @project %&gt;&lt;br /&gt;
 &lt;%= link_to l(:label_change_log), :controller =&gt; 'projects', :action =&gt; 'changelog', :id =&gt; @project %&gt;
+&lt;% end %&gt;
 
+&lt;% unless sidebar_queries.empty? -%&gt;
 &lt;h3&gt;&lt;%= l(:label_query_plural) %&gt;&lt;/h3&gt;
 
-&lt;% queries = @project.queries.find(:all, 
-                                   :order =&gt; &quot;name ASC&quot;,
-                                   :conditions =&gt; [&quot;is_public = ? or user_id = ?&quot;, true, (User.current.logged? ? User.current.id : 0)])
-   queries.each do |query| %&gt;
+&lt;% sidebar_queries.each do |query| -%&gt;
 &lt;%= link_to query.name, :controller =&gt; 'issues', :action =&gt; 'index', :project_id =&gt; @project, :query_id =&gt; query %&gt;&lt;br /&gt;
-&lt;% end %&gt;
+&lt;% end -%&gt;
+&lt;% end -%&gt;</diff>
      <filename>app/views/issues/_sidebar.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -47,10 +47,3 @@
 
 &lt;p&gt;&lt;%= submit_tag l(:button_submit) %&gt;
 &lt;% end %&gt;
-
-&lt;% content_for :header_tags do %&gt;
-    &lt;%= javascript_include_tag 'calendar/calendar' %&gt;
-    &lt;%= javascript_include_tag &quot;calendar/lang/calendar-#{current_language}.js&quot; %&gt;
-    &lt;%= javascript_include_tag 'calendar/calendar-setup' %&gt;
-    &lt;%= stylesheet_link_tag 'calendar' %&gt;
-&lt;% end %&gt;</diff>
      <filename>app/views/issues/bulk_edit.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -18,7 +18,7 @@
                          :update =&gt; &quot;content&quot;,
                        }, :class =&gt; 'icon icon-reload'  %&gt;
                        
-    &lt;% if current_role &amp;&amp; current_role.allowed_to?(:save_queries) %&gt;
+    &lt;% if User.current.allowed_to?(:save_queries, @project, :global =&gt; true) %&gt;
     &lt;%= link_to l(:button_save), {}, :onclick =&gt; &quot;$('query_form').submit(); return false;&quot;, :class =&gt; 'icon icon-save' %&gt;
     &lt;% end %&gt;
     &lt;/p&gt;
@@ -54,7 +54,7 @@
 
 &lt;% content_for :sidebar do %&gt;
     &lt;%= render :partial =&gt; 'issues/sidebar' %&gt;
-&lt;% end if @project%&gt;
+&lt;% end %&gt;
 
 &lt;% content_for :header_tags do %&gt;
     &lt;%= auto_discovery_link_tag(:atom, {:query_id =&gt; @query, :format =&gt; 'atom', :page =&gt; nil, :key =&gt; User.current.rss_key}, :title =&gt; l(:label_issue_plural)) %&gt;</diff>
      <filename>app/views/issues/index.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -8,7 +8,7 @@
     &lt;/div&gt;
     &lt;%= submit_tag l(:button_create) %&gt;
     &lt;%= link_to_remote l(:label_preview), 
-                       { :url =&gt; { :controller =&gt; 'issues', :action =&gt; 'preview', :project_id =&gt; @project, :id =&gt; @issue },
+                       { :url =&gt; { :controller =&gt; 'issues', :action =&gt; 'preview', :project_id =&gt; @project },
                          :method =&gt; 'post',
                          :update =&gt; 'preview',
                          :with =&gt; &quot;Form.serialize('issue-form')&quot;,</diff>
      <filename>app/views/issues/new.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -13,7 +13,7 @@
         &lt;h3&gt;&lt;%=h @issue.subject %&gt;&lt;/h3&gt;
         &lt;p class=&quot;author&quot;&gt;
         &lt;%= authoring @issue.created_on, @issue.author %&gt;.
-        &lt;%= l(:label_updated_time, distance_of_time_in_words(Time.now, @issue.updated_on)) if @issue.created_on != @issue.updated_on %&gt;.
+        &lt;%= l(:label_updated_time, distance_of_time_in_words(Time.now, @issue.updated_on)) + '.' if @issue.created_on != @issue.updated_on %&gt;
         &lt;/p&gt;
 
 &lt;table width=&quot;100%&quot;&gt;</diff>
      <filename>app/views/issues/show.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -26,7 +26,7 @@
   &lt;/div&gt;
   &lt;div class=&quot;message reply&quot;&gt;
   &lt;h4&gt;&lt;%=h message.subject %&gt; - &lt;%= authoring message.created_on, message.author %&gt;&lt;/h4&gt;
-  &lt;div class=&quot;wiki&quot;&gt;&lt;%= textilizable message.content %&gt;&lt;/div&gt;
+  &lt;div class=&quot;wiki&quot;&gt;&lt;%= textilizable message, :content, :attachments =&gt; message.attachments %&gt;&lt;/div&gt;
   &lt;%= link_to_attachments message.attachments, :no_author =&gt; true %&gt;
   &lt;/div&gt;
 &lt;% end %&gt;</diff>
      <filename>app/views/messages/show.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -25,7 +25,7 @@
 &lt;div id=&quot;preview&quot; class=&quot;wiki&quot;&gt;&lt;/div&gt;
 &lt;/div&gt;
 
-&lt;p&gt;&lt;em&gt;&lt;% unless @news.summary.empty? %&gt;&lt;%=h @news.summary %&gt;&lt;br /&gt;&lt;% end %&gt;
+&lt;p&gt;&lt;em&gt;&lt;% unless @news.summary.blank? %&gt;&lt;%=h @news.summary %&gt;&lt;br /&gt;&lt;% end %&gt;
 &lt;span class=&quot;author&quot;&gt;&lt;%= authoring @news.created_on, @news.author %&gt;&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;
 &lt;div class=&quot;wiki&quot;&gt;
 &lt;%= textilizable(@news.description) %&gt;</diff>
      <filename>app/views/news/show.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -46,11 +46,3 @@
 &lt;/fieldset&gt;
 &lt;% end %&gt;
 &lt;!--[eoform:project]--&gt;
-
-
-&lt;% content_for :header_tags do %&gt;
-&lt;%= javascript_include_tag 'calendar/calendar' %&gt;
-&lt;%= javascript_include_tag &quot;calendar/lang/calendar-#{current_language}.js&quot; %&gt;
-&lt;%= javascript_include_tag 'calendar/calendar-setup' %&gt;
-&lt;%= stylesheet_link_tag 'calendar' %&gt;
-&lt;% end %&gt;</diff>
      <filename>app/views/projects/_form.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -6,7 +6,7 @@
 &lt;h3&gt;&lt;%= format_activity_day(day) %&gt;&lt;/h3&gt;
 &lt;dl&gt;
 &lt;% @events_by_day[day].sort {|x,y| y.event_datetime &lt;=&gt; x.event_datetime }.each do |e| -%&gt;
-  &lt;dt class=&quot;&lt;%= e.class.name.downcase %&gt;&quot;&gt;&lt;span class=&quot;time&quot;&gt;&lt;%= format_time(e.event_datetime, false) %&gt;&lt;/span&gt;
+  &lt;dt class=&quot;&lt;%= e.event_type %&gt;&quot;&gt;&lt;span class=&quot;time&quot;&gt;&lt;%= format_time(e.event_datetime, false) %&gt;&lt;/span&gt;
   &lt;%= content_tag('span', h(e.project), :class =&gt; 'project') if @project.nil? || @project != e.project %&gt; &lt;%= link_to h(truncate(e.event_title, 100)), e.event_url %&gt;&lt;/dt&gt;
   &lt;dd&gt;&lt;% unless e.event_description.blank? -%&gt;
   &lt;span class=&quot;description&quot;&gt;&lt;%= format_activity_description(e.event_description) %&gt;&lt;/span&gt;&lt;br /&gt;</diff>
      <filename>app/views/projects/activity.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -1,14 +1,16 @@
 &lt;h2&gt;&lt;%=l(:label_confirmation)%&gt;&lt;/h2&gt;
-&lt;div class=&quot;box&quot;&gt;
-&lt;center&gt;
-&lt;p&gt;&lt;strong&gt;&lt;%=h @project_to_destroy.name %&gt;&lt;/strong&gt;&lt;br /&gt;
-&lt;%=l(:text_project_destroy_confirmation)%&gt;&lt;/p&gt;
+&lt;div class=&quot;warning&quot;&gt;
+&lt;p&gt;&lt;strong&gt;&lt;%=h @project_to_destroy %&gt;&lt;/strong&gt;&lt;br /&gt;
+&lt;%=l(:text_project_destroy_confirmation)%&gt;
 
+&lt;% if @project_to_destroy.children.any? %&gt;
+&lt;br /&gt;&lt;%= l(:text_subprojects_destroy_warning, content_tag('strong', h(@project_to_destroy.children.sort.collect{|p| p.to_s}.join(', ')))) %&gt;
+&lt;% end %&gt;
+&lt;/p&gt;
 &lt;p&gt;
     &lt;% form_tag({:controller =&gt; 'projects', :action =&gt; 'destroy', :id =&gt; @project_to_destroy}) do %&gt;
-    &lt;%= hidden_field_tag &quot;confirm&quot;, 1 %&gt;
+    &lt;label&gt;&lt;%= check_box_tag 'confirm', 1 %&gt; &lt;%= l(:general_text_Yes) %&gt;&lt;/label&gt;
     &lt;%= submit_tag l(:button_delete) %&gt;
     &lt;% end %&gt;
 &lt;/p&gt;
-&lt;/center&gt;
-&lt;/div&gt;
\ No newline at end of file
+&lt;/div&gt;</diff>
      <filename>app/views/projects/destroy.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -70,10 +70,13 @@ top = headers_height + 8
 @events.each do |i| %&gt;
     &lt;div style=&quot;position: absolute;line-height:1.2em;height:16px;top:&lt;%= top %&gt;px;left:4px;overflow:hidden;&quot;&gt;&lt;small&gt;    
     &lt;% if i.is_a? Issue %&gt;
-      	&lt;%= h(&quot;#{i.project.name} -&quot;) unless @project &amp;&amp; @project == i.project %&gt;
+      	&lt;%= h(&quot;#{i.project} -&quot;) unless @project &amp;&amp; @project == i.project %&gt;
       	&lt;%= link_to_issue i %&gt;:	&lt;%=h i.subject %&gt;
   	&lt;% else %&gt;
-      	&lt;%= link_to_version i, :class =&gt; &quot;icon icon-package&quot; %&gt;
+		&lt;span class=&quot;icon icon-package&quot;&gt;
+	      	&lt;%= h(&quot;#{i.project} -&quot;) unless @project &amp;&amp; @project == i.project %&gt;
+	      	&lt;%= link_to_version i %&gt;
+		&lt;/span&gt;
   	&lt;% end %&gt;  	
   	&lt;/small&gt;&lt;/div&gt;
     &lt;% top = top + 20
@@ -197,7 +200,8 @@ top = headers_height + 10
     %&gt;
     &lt;div style=&quot;top:&lt;%= top %&gt;px;left:&lt;%= i_left %&gt;px;width:15px;&quot; class=&quot;task milestone&quot;&gt;&amp;nbsp;&lt;/div&gt;
 	&lt;div style=&quot;top:&lt;%= top %&gt;px;left:&lt;%= i_left + 12 %&gt;px;background:#fff;&quot; class=&quot;task&quot;&gt;
-	&lt;strong&gt;&lt;%= i.name %&gt;&lt;/strong&gt;
+		&lt;%= h(&quot;#{i.project} -&quot;) unless @project &amp;&amp; @project == i.project %&gt;
+		&lt;strong&gt;&lt;%=h i %&gt;&lt;/strong&gt;
 	&lt;/div&gt;
 &lt;% end %&gt;
 	&lt;% top = top + 20</diff>
      <filename>app/views/projects/gantt.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -9,10 +9,10 @@
 &lt;table class=&quot;list&quot;&gt;
   &lt;thead&gt;&lt;tr&gt;
     &lt;th&gt;&lt;%=l(:field_version)%&gt;&lt;/th&gt;
-    &lt;th&gt;&lt;%=l(:field_filename)%&gt;&lt;/th&gt;
-    &lt;th&gt;&lt;%=l(:label_date)%&gt;&lt;/th&gt;
-    &lt;th&gt;&lt;%=l(:field_filesize)%&gt;&lt;/th&gt;
-    &lt;th&gt;&lt;%=l(:label_downloads_abbr)%&gt;&lt;/th&gt;
+    &lt;%= sort_header_tag(&quot;#{Attachment.table_name}.filename&quot;, :caption =&gt; l(:field_filename)) %&gt;
+    &lt;%= sort_header_tag(&quot;#{Attachment.table_name}.created_on&quot;, :caption =&gt; l(:label_date), :default_order =&gt; 'desc') %&gt;
+    &lt;%= sort_header_tag(&quot;#{Attachment.table_name}.filesize&quot;, :caption =&gt; l(:field_filesize), :default_order =&gt; 'desc') %&gt;
+    &lt;%= sort_header_tag(&quot;#{Attachment.table_name}.downloads&quot;, :caption =&gt; l(:label_downloads_abbr), :default_order =&gt; 'desc') %&gt;
     &lt;th&gt;MD5&lt;/th&gt;
     &lt;% if delete_allowed %&gt;&lt;th&gt;&lt;/th&gt;&lt;% end %&gt;
   &lt;/tr&gt;&lt;/thead&gt;</diff>
      <filename>app/views/projects/list_files.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -59,19 +59,19 @@ function toggle_multi_select(field) {
 &lt;table width=&quot;100%&quot;&gt;
 &lt;tr&gt;
 &lt;td&gt;
-&lt;table style=&quot;padding:0;&quot;&gt;
+&lt;table&gt;
 &lt;% query.available_filters.sort{|a,b| a[1][:order]&lt;=&gt;b[1][:order]}.each do |filter| %&gt;
     &lt;% field = filter[0]
        options = filter[1] %&gt;
-    &lt;tr &lt;%= 'style=&quot;display:none;&quot;' unless query.has_filter?(field) %&gt; id=&quot;tr_&lt;%= field %&gt;&quot;&gt;
-    &lt;td valign=&quot;top&quot; style=&quot;width:200px;&quot;&gt;
+    &lt;tr &lt;%= 'style=&quot;display:none;&quot;' unless query.has_filter?(field) %&gt; id=&quot;tr_&lt;%= field %&gt;&quot; class=&quot;filter&quot;&gt;
+    &lt;td style=&quot;width:200px;&quot;&gt;
         &lt;%= check_box_tag 'fields[]', field, query.has_filter?(field), :onclick =&gt; &quot;toggle_filter('#{field}');&quot;, :id =&gt; &quot;cb_#{field}&quot; %&gt;
         &lt;label for=&quot;cb_&lt;%= field %&gt;&quot;&gt;&lt;%= filter[1][:name] || l((&quot;field_&quot;+field.to_s.gsub(/\_id$/, &quot;&quot;)).to_sym) %&gt;&lt;/label&gt;
     &lt;/td&gt;
-    &lt;td valign=&quot;top&quot; style=&quot;width:150px;&quot;&gt;
+    &lt;td style=&quot;width:150px;&quot;&gt;
         &lt;%= select_tag &quot;operators[#{field}]&quot;, options_for_select(operators_for_select(options[:type]), query.operator_for(field)), :id =&gt; &quot;operators_#{field}&quot;, :onchange =&gt; &quot;toggle_operator('#{field}');&quot;, :class =&gt; &quot;select-small&quot;, :style =&gt; &quot;vertical-align: top;&quot; %&gt;
     &lt;/td&gt;
-    &lt;td valign=&quot;top&quot;&gt;    
+    &lt;td&gt;    
     &lt;div id=&quot;div_values_&lt;%= field %&gt;&quot; style=&quot;display:none;&quot;&gt;
     &lt;% case options[:type]
     when :list, :list_optional, :list_status, :list_subprojects %&gt;
@@ -93,7 +93,7 @@ function toggle_multi_select(field) {
 &lt;% end %&gt;
 &lt;/table&gt;
 &lt;/td&gt;
-&lt;td align=&quot;right&quot; valign=&quot;top&quot;&gt;
+&lt;td class=&quot;add-filter&quot;&gt;
 &lt;%= l(:label_filter_add) %&gt;:
 &lt;%= select_tag 'add_filter_select', options_for_select([[&quot;&quot;,&quot;&quot;]] + query.available_filters.sort{|a,b| a[1][:order]&lt;=&gt;b[1][:order]}.collect{|field| [ field[1][:name] || l((&quot;field_&quot;+field[0].to_s.gsub(/\_id$/, &quot;&quot;)).to_sym), field[0]] unless query.has_filter?(field[0])}.compact), :onchange =&gt; &quot;add_filter();&quot;, :class =&gt; &quot;select-small&quot; %&gt;
 &lt;/td&gt;</diff>
      <filename>app/views/queries/_filters.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -6,11 +6,16 @@
 &lt;p&gt;&lt;label for=&quot;query_name&quot;&gt;&lt;%=l(:field_name)%&gt;&lt;/label&gt;
 &lt;%= text_field 'query', 'name', :size =&gt; 80 %&gt;&lt;/p&gt;
 
-&lt;% if current_role.allowed_to?(:manage_public_queries) %&gt;
-  &lt;p&gt;&lt;label for=&quot;query_is_public&quot;&gt;&lt;%=l(:field_is_public)%&gt;&lt;/label&gt;
-  &lt;%= check_box 'query', 'is_public' %&gt;&lt;/p&gt;
+&lt;% if User.current.admin? || (@project &amp;&amp; current_role.allowed_to?(:manage_public_queries)) %&gt;
+&lt;p&gt;&lt;label for=&quot;query_is_public&quot;&gt;&lt;%=l(:field_is_public)%&gt;&lt;/label&gt;
+&lt;%= check_box 'query', 'is_public',
+      :onchange =&gt; (User.current.admin? ? nil : 'if (this.checked) {$(&quot;query_is_for_all&quot;).checked = false; $(&quot;query_is_for_all&quot;).disabled = true;} else {$(&quot;query_is_for_all&quot;).disabled = false;}') %&gt;&lt;/p&gt;
 &lt;% end %&gt;
 
+&lt;p&gt;&lt;label for=&quot;query_is_for_all&quot;&gt;&lt;%=l(:field_is_for_all)%&gt;&lt;/label&gt;
+&lt;%= check_box_tag 'query_is_for_all', 1, @query.project.nil?,
+      :disabled =&gt; (!@query.new_record? &amp;&amp; (@query.project.nil? || (@query.is_public? &amp;&amp; !User.current.admin?))) %&gt;&lt;/p&gt;
+
 &lt;p&gt;&lt;label for=&quot;query_default_columns&quot;&gt;&lt;%=l(:label_default_columns)%&gt;&lt;/label&gt;
 &lt;%= check_box_tag 'default_columns', 1, @query.has_default_columns?, :id =&gt; 'query_default_columns',
       :onclick =&gt; 'if (this.checked) {Element.hide(&quot;columns&quot;)} else {Element.show(&quot;columns&quot;)}' %&gt;&lt;/p&gt;</diff>
      <filename>app/views/queries/_form.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -49,7 +49,7 @@
 &lt;td&gt;&lt;div class=&quot;square action_&lt;%= change.action %&gt;&quot;&gt;&lt;/div&gt; &lt;%= change.path %&gt; &lt;%= &quot;(#{change.revision})&quot; unless change.revision.blank?  %&gt;&lt;/td&gt;
 &lt;td align=&quot;right&quot;&gt;
 &lt;% if change.action == &quot;M&quot; %&gt;
-&lt;%= link_to l(:label_view_diff), :action =&gt; 'diff', :id =&gt; @project, :path =&gt; change.path, :rev =&gt; @changeset.revision %&gt;
+&lt;%= link_to l(:label_view_diff), :action =&gt; 'diff', :id =&gt; @project, :path =&gt; without_leading_slash(change.path), :rev =&gt; @changeset.revision %&gt;
 &lt;% end %&gt;
 &lt;/td&gt;
 &lt;/tr&gt;</diff>
      <filename>app/views/repositories/revision.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,6 @@
 &lt;table class=&quot;list time-entries&quot;&gt;
 &lt;thead&gt;
+&lt;tr&gt;
 &lt;%= sort_header_tag('spent_on', :caption =&gt; l(:label_date), :default_order =&gt; 'desc') %&gt;
 &lt;%= sort_header_tag('user_id', :caption =&gt; l(:label_member)) %&gt;
 &lt;%= sort_header_tag('activity_id', :caption =&gt; l(:label_activity)) %&gt;
@@ -8,6 +9,7 @@
 &lt;th&gt;&lt;%= l(:field_comments) %&gt;&lt;/th&gt;
 &lt;%= sort_header_tag('hours', :caption =&gt; l(:field_hours)) %&gt;
 &lt;th&gt;&lt;/th&gt;
+&lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;% entries.each do |entry| -%&gt;
@@ -35,5 +37,5 @@
 &lt;/td&gt;
 &lt;/tr&gt;
 &lt;% end -%&gt;
-&lt;/tbdoy&gt;
+&lt;/tbody&gt;
 &lt;/table&gt;</diff>
      <filename>app/views/timelog/_list.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -1,14 +1,16 @@
-&lt;% @hours.collect {|h| h[criterias[level]]}.uniq.each do |value| %&gt;
+&lt;% @hours.collect {|h| h[criterias[level]].to_s}.uniq.each do |value| %&gt;
 &lt;% hours_for_value = select_hours(hours, criterias[level], value) -%&gt;
 &lt;% next if hours_for_value.empty? -%&gt;
 &lt;tr class=&quot;&lt;%= cycle('odd', 'even') %&gt; &lt;%= 'last-level' unless criterias.length &gt; level+1 %&gt;&quot;&gt;
 &lt;%= '&lt;td&gt;&lt;/td&gt;' * level %&gt;
-&lt;td&gt;&lt;%= value.nil? ? l(:label_none) : @available_criterias[criterias[level]][:klass].find_by_id(value) %&gt;&lt;/td&gt;
+&lt;td&gt;&lt;%= format_criteria_value(criterias[level], value) %&gt;&lt;/td&gt;
 &lt;%= '&lt;td&gt;&lt;/td&gt;' * (criterias.length - level - 1) -%&gt;
+  &lt;% total = 0 -%&gt;
   &lt;% @periods.each do |period| -%&gt;
-    &lt;% sum = sum_hours(select_hours(hours_for_value, @columns, period.to_s)) %&gt;
+    &lt;% sum = sum_hours(select_hours(hours_for_value, @columns, period.to_s)); total += sum -%&gt;
     &lt;td class=&quot;hours&quot;&gt;&lt;%= html_hours(&quot;%.2f&quot; % sum) if sum &gt; 0 %&gt;&lt;/td&gt;
   &lt;% end -%&gt;
+  &lt;td class=&quot;hours&quot;&gt;&lt;%= html_hours(&quot;%.2f&quot; % total) if total &gt; 0 %&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;% if criterias.length &gt; level+1 -%&gt;
   &lt;%= render(:partial =&gt; 'report_criteria', :locals =&gt; {:criterias =&gt; criterias, :hours =&gt; hours_for_value, :level =&gt; (level + 1)}) %&gt;</diff>
      <filename>app/views/timelog/_report_criteria.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,4 @@
 &lt;div class=&quot;contextual&quot;&gt;
-&lt;%= link_to(l(:label_report), {:controller =&gt; 'timelog', :action =&gt; 'report', :project_id =&gt; @project}, :class =&gt; 'icon icon-report') %&gt;
 &lt;%= link_to_if_authorized l(:button_log_time), {:controller =&gt; 'timelog', :action =&gt; 'edit', :project_id =&gt; @project, :issue_id =&gt; @issue}, :class =&gt; 'icon icon-time' %&gt;
 &lt;/div&gt;
 
@@ -12,23 +11,7 @@
 &lt;% form_remote_tag( :url =&gt; {}, :method =&gt; :get, :update =&gt; 'content' ) do %&gt;
 &lt;%= hidden_field_tag 'project_id', params[:project_id] %&gt;
 &lt;%= hidden_field_tag 'issue_id', params[:issue_id] if @issue %&gt;
-
-&lt;fieldset&gt;&lt;legend&gt;&lt;%= l(:label_date_range) %&gt;&lt;/legend&gt;
-&lt;p&gt;
-&lt;%= radio_button_tag 'period_type', '1', !@free_period %&gt;
-&lt;%= select_tag 'period', options_for_period_select(params[:period]),
-                         :onchange =&gt; 'this.form.onsubmit();',
-                         :onfocus =&gt; '$(&quot;period_type_1&quot;).checked = true;' %&gt;
-&lt;/p&gt;
-&lt;p&gt;
-&lt;%= radio_button_tag 'period_type', '2', @free_period %&gt;
-&lt;%= l(:label_date_from) %&gt;
-&lt;%= text_field_tag 'from', @from, :size =&gt; 10, :onfocus =&gt; '$(&quot;period_type_2&quot;).checked = true;' %&gt; &lt;%= calendar_for('from') %&gt;
-&lt;%= l(:label_date_to) %&gt;
-&lt;%= text_field_tag 'to', @to, :size =&gt; 10, :onfocus =&gt; '$(&quot;period_type_2&quot;).checked = true;' %&gt; &lt;%= calendar_for('to') %&gt;
-&lt;%= submit_tag l(:button_apply), :name =&gt; nil, :onclick =&gt; '$(&quot;period_type_2&quot;).checked = true;' %&gt;
-&lt;/p&gt;
-&lt;/fieldset&gt;
+&lt;%= render :partial =&gt; 'date_range' %&gt;
 &lt;% end %&gt;
 
 &lt;div class=&quot;total-hours&quot;&gt;
@@ -45,9 +28,4 @@
 &lt;/p&gt;
 &lt;% end %&gt;
 
-&lt;% content_for :header_tags do %&gt;
-    &lt;%= javascript_include_tag 'calendar/calendar' %&gt;
-    &lt;%= javascript_include_tag &quot;calendar/lang/calendar-#{current_language}.js&quot; %&gt;
-    &lt;%= javascript_include_tag 'calendar/calendar-setup' %&gt;
-    &lt;%= stylesheet_link_tag 'calendar' %&gt;
-&lt;% end %&gt;
+&lt;% html_title l(:label_spent_time), l(:label_details) %&gt;</diff>
      <filename>app/views/timelog/details.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -2,6 +2,7 @@
 
 &lt;% labelled_tabular_form_for :time_entry, @time_entry, :url =&gt; {:action =&gt; 'edit', :project_id =&gt; @time_entry.project} do |f| %&gt;
 &lt;%= error_messages_for 'time_entry' %&gt;
+&lt;%= back_url_hidden_field_tag %&gt;
 
 &lt;div class=&quot;box&quot;&gt;
 &lt;p&gt;&lt;%= f.text_field :issue_id, :size =&gt; 6 %&gt; &lt;em&gt;&lt;%= h(&quot;#{@time_entry.issue.tracker.name} ##{@time_entry.issue.id}: #{@time_entry.issue.subject}&quot;) if @time_entry.issue %&gt;&lt;/em&gt;&lt;/p&gt;
@@ -14,10 +15,3 @@
 &lt;%= submit_tag l(:button_save) %&gt;
 
 &lt;% end %&gt;
-
-&lt;% content_for :header_tags do %&gt;
-&lt;%= javascript_include_tag 'calendar/calendar' %&gt;
-&lt;%= javascript_include_tag &quot;calendar/lang/calendar-#{current_language}.js&quot; %&gt;
-&lt;%= javascript_include_tag 'calendar/calendar-setup' %&gt;
-&lt;%= stylesheet_link_tag 'calendar' %&gt;
-&lt;% end %&gt;
\ No newline at end of file</diff>
      <filename>app/views/timelog/edit.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -1,36 +1,32 @@
 &lt;div class=&quot;contextual&quot;&gt;
-&lt;%= link_to(l(:label_details), {:controller =&gt; 'timelog', :action =&gt; 'details', :project_id =&gt; @project}, :class =&gt; 'icon icon-details') %&gt;
 &lt;%= link_to_if_authorized l(:button_log_time), {:controller =&gt; 'timelog', :action =&gt; 'edit', :project_id =&gt; @project, :issue_id =&gt; @issue}, :class =&gt; 'icon icon-time' %&gt;
 &lt;/div&gt;
 
 &lt;h2&gt;&lt;%= l(:label_spent_time) %&gt;&lt;/h2&gt;
 
-&lt;% form_remote_tag(:url =&gt; {:project_id =&gt; @project}, :update =&gt; 'content') do %&gt;
+&lt;% form_remote_tag(:url =&gt; {}, :update =&gt; 'content') do %&gt;
   &lt;% @criterias.each do |criteria| %&gt;
-    &lt;%= hidden_field_tag 'criterias[]', criteria %&gt;
+    &lt;%= hidden_field_tag 'criterias[]', criteria, :id =&gt; nil %&gt;
   &lt;% end %&gt;
-  &lt;fieldset&gt;&lt;legend&gt;&lt;%= l(:label_date_range) %&gt;&lt;/legend&gt;
-  &lt;p&gt;
-  &lt;%= l(:label_date_from) %&gt;
-  &lt;%= text_field_tag 'date_from', @date_from, :size =&gt; 10 %&gt;&lt;%= calendar_for('date_from') %&gt;
-  &lt;%= l(:label_date_to) %&gt;
-  &lt;%= text_field_tag 'date_to', @date_to, :size =&gt; 10 %&gt;&lt;%= calendar_for('date_to') %&gt;
-  &lt;%= l(:label_details) %&gt;
-  &lt;%= select_tag 'period', options_for_select([[l(:label_year), 'year'],
-                                               [l(:label_month), 'month'],
-                                               [l(:label_week), 'week']], @columns) %&gt;
-  &amp;nbsp;
-  &lt;%= submit_tag l(:button_apply) %&gt;
-  &lt;/p&gt;
-  &lt;/fieldset&gt;
+  &lt;%= hidden_field_tag 'project_id', params[:project_id] %&gt;
+  &lt;%= render :partial =&gt; 'date_range' %&gt;
 
-  &lt;p&gt;&lt;%= l(:button_add) %&gt;: &lt;%= select_tag('criterias[]', options_for_select([[]] + (@available_criterias.keys - @criterias).collect{|k| [l(@available_criterias[k][:label]), k]}),
+  &lt;p&gt;&lt;%= l(:label_details) %&gt;: &lt;%= select_tag 'columns', options_for_select([[l(:label_year), 'year'],
+                                                                            [l(:label_month), 'month'],
+                                                                            [l(:label_week), 'week'],
+                                                                            [l(:label_day_plural).titleize, 'day']], @columns),
+                                                        :onchange =&gt; &quot;this.form.onsubmit();&quot; %&gt;
+
+  &lt;%= l(:button_add) %&gt;: &lt;%= select_tag('criterias[]', options_for_select([[]] + (@available_criterias.keys - @criterias).collect{|k| [l(@available_criterias[k][:label]), k]}),
                                                           :onchange =&gt; &quot;this.form.onsubmit();&quot;,
                                                           :style =&gt; 'width: 200px',
+                                                          :id =&gt; nil,
                                                           :disabled =&gt; (@criterias.length &gt;= 3)) %&gt;
-     &lt;%= link_to_remote l(:button_clear), {:url =&gt; {:project_id =&gt; @project, :date_from =&gt; @date_from, :date_to =&gt; @date_to, :period =&gt; @columns}, :update =&gt; 'content'},
-                                          :class =&gt; 'icon icon-reload' %&gt;&lt;/p&gt;
-  
+     &lt;%= link_to_remote l(:button_clear), {:url =&gt; {:project_id =&gt; @project, :period_type =&gt; params[:period_type], :period =&gt; params[:period], :from =&gt; @from, :to =&gt; @to, :columns =&gt; @columns},
+                                           :update =&gt; 'content'
+                                          }, :class =&gt; 'icon icon-reload' %&gt;&lt;/p&gt;
+&lt;% end %&gt;
+
 &lt;% unless @criterias.empty? %&gt;
 &lt;div class=&quot;total-hours&quot;&gt;
 &lt;p&gt;&lt;%= l(:label_total) %&gt;: &lt;%= html_hours(lwr(:label_f_hour, @total_hours)) %&gt;&lt;/p&gt;
@@ -41,11 +37,13 @@
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;% @criterias.each do |criteria| %&gt;
-  &lt;th width=&quot;15%&quot;&gt;&lt;%= l(@available_criterias[criteria][:label]) %&gt;&lt;/th&gt;
+  &lt;th&gt;&lt;%= l(@available_criterias[criteria][:label]) %&gt;&lt;/th&gt;
 &lt;% end %&gt;
+&lt;% columns_width = (40 / (@periods.length+1)).to_i %&gt;
 &lt;% @periods.each do |period| %&gt;
-  &lt;th width=&quot;&lt;%= ((100 - @criterias.length * 15 - 15 ) / @periods.length).to_i %&gt;%&quot;&gt;&lt;%= period %&gt;&lt;/th&gt;
+  &lt;th class=&quot;period&quot; width=&quot;&lt;%= columns_width %&gt;%&quot;&gt;&lt;%= period %&gt;&lt;/th&gt;
 &lt;% end %&gt;
+  &lt;th class=&quot;total&quot; width=&quot;&lt;%= columns_width %&gt;%&quot;&gt;&lt;%= l(:label_total) %&gt;&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
@@ -53,20 +51,22 @@
   &lt;tr class=&quot;total&quot;&gt;
   &lt;td&gt;&lt;%= l(:label_total) %&gt;&lt;/td&gt;
   &lt;%= '&lt;td&gt;&lt;/td&gt;' * (@criterias.size - 1) %&gt;
+  &lt;% total = 0 -%&gt;
   &lt;% @periods.each do |period| -%&gt;
-    &lt;% sum = sum_hours(select_hours(@hours, @columns, period.to_s)) %&gt;
+    &lt;% sum = sum_hours(select_hours(@hours, @columns, period.to_s)); total += sum -%&gt;
     &lt;td class=&quot;hours&quot;&gt;&lt;%= html_hours(&quot;%.2f&quot; % sum) if sum &gt; 0 %&gt;&lt;/td&gt;
   &lt;% end -%&gt;
+  &lt;td class=&quot;hours&quot;&gt;&lt;%= html_hours(&quot;%.2f&quot; % total) if total &gt; 0 %&gt;&lt;/td&gt;
   &lt;/tr&gt;
 &lt;/tbody&gt;
 &lt;/table&gt;
-&lt;% end %&gt;
+
+&lt;p class=&quot;other-formats&quot;&gt;
+&lt;%= l(:label_export_to) %&gt;
+&lt;span&gt;&lt;%= link_to 'CSV', params.merge({:format =&gt; 'csv'}), :class =&gt; 'csv' %&gt;&lt;/span&gt;
+&lt;/p&gt;
 &lt;% end %&gt;
 &lt;% end %&gt;
 
-&lt;% content_for :header_tags do %&gt;
-&lt;%= javascript_include_tag 'calendar/calendar' %&gt;
-&lt;%= javascript_include_tag &quot;calendar/lang/calendar-#{current_language}.js&quot; %&gt;
-&lt;%= javascript_include_tag 'calendar/calendar-setup' %&gt;
-&lt;%= stylesheet_link_tag 'calendar' %&gt;
-&lt;% end %&gt;
+&lt;% html_title l(:label_spent_time), l(:label_report) %&gt;
+</diff>
      <filename>app/views/timelog/report.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -30,10 +30,3 @@
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;!--[eoform:user]--&gt;
-
-&lt;% content_for :header_tags do %&gt;
-&lt;%= javascript_include_tag 'calendar/calendar' %&gt;
-&lt;%= javascript_include_tag &quot;calendar/lang/calendar-#{current_language}.js&quot; %&gt;
-&lt;%= javascript_include_tag 'calendar/calendar-setup' %&gt;
-&lt;%= stylesheet_link_tag 'calendar' %&gt;
-&lt;% end %&gt;
\ No newline at end of file</diff>
      <filename>app/views/users/_form.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -33,17 +33,7 @@
 	&lt;td align=&quot;center&quot;&gt;&lt;%= image_tag('true.png') if user.admin? %&gt;&lt;/td&gt;
 	&lt;td class=&quot;created_on&quot; align=&quot;center&quot;&gt;&lt;%= format_time(user.created_on) %&gt;&lt;/td&gt;
 	&lt;td class=&quot;last_login_on&quot; align=&quot;center&quot;&gt;&lt;%= format_time(user.last_login_on) unless user.last_login_on.nil? %&gt;&lt;/td&gt;
-    &lt;td&gt;
-    &lt;small&gt;
-    &lt;% if user.locked? -%&gt;
-        &lt;%= link_to l(:button_unlock), {:action =&gt; 'edit', :id =&gt; user, :user =&gt; {:status =&gt; User::STATUS_ACTIVE}}, :method =&gt; :post, :class =&gt; 'icon icon-unlock' %&gt;
-    &lt;% elsif user.registered? -%&gt;
-        &lt;%= link_to l(:button_activate), {:action =&gt; 'edit', :id =&gt; user, :user =&gt; {:status =&gt; User::STATUS_ACTIVE}}, :method =&gt; :post, :class =&gt; 'icon icon-unlock' %&gt;
-    &lt;% else -%&gt;
-        &lt;%= link_to l(:button_lock), {:action =&gt; 'edit', :id =&gt; user, :user =&gt; {:status =&gt; User::STATUS_LOCKED}}, :method =&gt; :post, :class =&gt; 'icon icon-lock' %&gt;
-    &lt;% end -%&gt;
-    &lt;/small&gt;
-    &lt;/td&gt;
+    &lt;td&gt;&lt;small&gt;&lt;%= change_status_link(user) %&gt;&lt;/small&gt;&lt;/td&gt;
   &lt;/tr&gt;
 &lt;% end -%&gt;
   &lt;/tbody&gt;</diff>
      <filename>app/views/users/list.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -6,10 +6,3 @@
 &lt;p&gt;&lt;%= f.text_field :wiki_page_title, :label =&gt; :label_wiki_page, :size =&gt; 60, :disabled =&gt; @project.wiki.nil? %&gt;&lt;/p&gt;
 &lt;p&gt;&lt;%= f.text_field :effective_date, :size =&gt; 10 %&gt;&lt;%= calendar_for('version_effective_date') %&gt;&lt;/p&gt;
 &lt;/div&gt;
-
-&lt;% content_for :header_tags do %&gt;
-&lt;%= javascript_include_tag 'calendar/calendar' %&gt;
-&lt;%= javascript_include_tag &quot;calendar/lang/calendar-#{current_language}.js&quot; %&gt;
-&lt;%= javascript_include_tag 'calendar/calendar-setup' %&gt;
-&lt;%= stylesheet_link_tag 'calendar' %&gt;
-&lt;% end %&gt;</diff>
      <filename>app/views/versions/_form.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -4,6 +4,9 @@
 # you don't control web/app server and can't set it the proper way
 # ENV['RAILS_ENV'] ||= 'production'
 
+# Specifies gem version of Rails to use when vendor/rails is not present
+RAILS_GEM_VERSION = '2.0.2' unless defined? RAILS_GEM_VERSION
+
 # Bootstrap the Rails environment, frameworks, and default configuration
 require File.join(File.dirname(__FILE__), 'boot')
 </diff>
      <filename>config/environment.rb</filename>
    </modified>
    <modified>
      <diff>@@ -5,6 +5,38 @@ Copyright (C) 2006-2008  Jean-Philippe Lang
 http://www.redmine.org/
 
 
+== 2008-04-28 v0.7.0
+
+* Forces Redmine to use rails 2.0.2 gem when vendor/rails is not present
+* Queries can be marked as 'For all projects'. Such queries will be available on all projects and on the global issue list.
+* Add predefined date ranges to the time report
+* Time report can be done at issue level
+* Various timelog report enhancements
+* Accept the following formats for &quot;hours&quot; field: 1h, 1 h, 1 hour, 2 hours, 30m, 30min, 1h30, 1h30m, 1:30
+* Display the context menu above and/or to the left of the click if needed
+* Make the admin project files list sortable
+* Mercurial: display working directory files sizes unless browsing a specific revision
+* Preserve status filter and page number when using lock/unlock/activate links on the users list
+* Redmine.pm support for LDAP authentication
+* Better error message and AR errors in log for failed LDAP on-the-fly user creation
+* Redirected user to where he is coming from after logging hours
+* Warn user that subprojects are also deleted when deleting a project
+* Include subprojects versions on calendar and gantt
+* Notify project members when a message is posted if they want to receive notifications
+* Fixed: Feed content limit setting has no effect
+* Fixed: Priorities not ordered when displayed as a filter in issue list
+* Fixed: can not display attached images inline in message replies
+* Fixed: Boards are not deleted when project is deleted
+* Fixed: trying to preview a new issue raises an exception with postgresql
+* Fixed: single file 'View difference' links do not work because of duplicate slashes in url
+* Fixed: inline image not displayed when including a wiki page
+* Fixed: CVS duplicate key violation
+* Fixed: ActiveRecord::StaleObjectError exception on closing a set of circular duplicate issues
+* Fixed: custom field filters behaviour
+* Fixed: Postgresql 8.3 compatibility
+* Fixed: Links to repository directories don't work
+
+
 == 2008-03-29 v0.7.0-rc1
 
 * Overall activity view and feed added, link is available on the project list</diff>
      <filename>doc/CHANGELOG</filename>
    </modified>
    <modified>
      <diff>@@ -8,8 +8,8 @@ against redmine database
 =head1 SYNOPSIS
 
 This module allow anonymous users to browse public project and
-registred users to browse and commit their project. authentication is
-done on the redmine database.
+registred users to browse and commit their project. Authentication is
+done against the redmine database or the LDAP configured in redmine.
 
 This method is far simpler than the one with pam_* and works with all
 database without an hassle but you need to have apache/mod_perl on the
@@ -29,6 +29,11 @@ On debian/ubuntu you must do :
 
   aptitude install libapache-dbi-perl libapache2-mod-perl2 libdbd-mysql-perl
 
+If your Redmine users use LDAP authentication, you will also need
+Authen::Simple::LDAP (and IO::Socket::SSL if LDAPS is used):
+
+  aptitude install libauthen-simple-ldap-perl libio-socket-ssl-perl
+
 =head1 CONFIGURATION
 
    ## if the module isn't in your perl path
@@ -90,6 +95,8 @@ use strict;
 
 use DBI;
 use Digest::SHA1;
+# optional module for LDAP authentication
+my $CanUseLDAPAuth = eval(&quot;use Authen::Simple::LDAP; 1&quot;);
 
 use Apache2::Module;
 use Apache2::Access;
@@ -140,7 +147,7 @@ sub is_public_project {
 
     my $dbh = connect_database($r);
     my $sth = $dbh-&gt;prepare(
-	&quot;SELECT * FROM projects WHERE projects.identifier=? and projects.is_public=true;&quot;
+        &quot;SELECT * FROM projects WHERE projects.identifier=? and projects.is_public=true;&quot;
     );
 
     $sth-&gt;execute($project_id);
@@ -176,17 +183,37 @@ sub is_member {
   my $pass_digest = Digest::SHA1::sha1_hex($redmine_pass);
 
   my $sth = $dbh-&gt;prepare(
-      &quot;SELECT hashed_password FROM members, projects, users WHERE projects.id=members.project_id AND users.id=members.user_id AND users.status=1 AND login=? AND identifier=?;&quot;
+      &quot;SELECT hashed_password, auth_source_id FROM members, projects, users WHERE projects.id=members.project_id AND users.id=members.user_id AND users.status=1 AND login=? AND identifier=?;&quot;
   );
   $sth-&gt;execute($redmine_user, $project_id);
 
   my $ret;
   while (my @row = $sth-&gt;fetchrow_array) {
-      if ($row[0] eq $pass_digest) {
-	  $ret = 1;
-	  last;
+      unless ($row[1]) {
+          if ($row[0] eq $pass_digest) {
+              $ret = 1;
+              last;
+          }
+      } elsif ($CanUseLDAPAuth) {
+          my $sthldap = $dbh-&gt;prepare(
+              &quot;SELECT host,port,tls,account,account_password,base_dn,attr_login from auth_sources WHERE id = ?;&quot;
+          );
+          $sthldap-&gt;execute($row[1]);
+          while (my @rowldap = $sthldap-&gt;fetchrow_array) {
+            my $ldap = Authen::Simple::LDAP-&gt;new(
+                host    =&gt;      ($rowldap[2] == 1 || $rowldap[2] eq &quot;t&quot;) ? &quot;ldaps://$rowldap[0]&quot; : $rowldap[0],
+                port    =&gt;      $rowldap[1],
+                basedn  =&gt;      $rowldap[5],
+                binddn  =&gt;      $rowldap[3] ? $rowldap[3] : &quot;&quot;,
+                bindpw  =&gt;      $rowldap[4] ? $rowldap[4] : &quot;&quot;,
+                filter  =&gt;      &quot;(&quot;.$rowldap[6].&quot;=%s)&quot;
+            );
+            $ret = 1 if ($ldap-&gt;authenticate($redmine_user, $redmine_pass));
+          }
+          $sthldap-&gt;finish();
       }
   }
+  $sth-&gt;finish();
   $dbh-&gt;disconnect();
 
   $ret;</diff>
      <filename>extra/svn/Redmine.pm</filename>
    </modified>
    <modified>
      <diff>@@ -48,8 +48,8 @@ general_text_no: '&#1085;&#1077;'
 general_text_yes: '&#1076;&#1072;'
 general_lang_name: 'Bulgarian'
 general_csv_separator: ','
-general_csv_encoding: cp1251
-general_pdf_encoding: cp1251
+general_csv_encoding: UTF-8
+general_pdf_encoding: UTF-8
 general_day_names: &#1055;&#1086;&#1085;&#1077;&#1076;&#1077;&#1083;&#1085;&#1080;&#1082;,&#1042;&#1090;&#1086;&#1088;&#1085;&#1080;&#1082;,&#1057;&#1088;&#1103;&#1076;&#1072;,&#1063;&#1077;&#1090;&#1074;&#1098;&#1088;&#1090;&#1098;&#1082;,&#1055;&#1077;&#1090;&#1098;&#1082;,&#1057;&#1098;&#1073;&#1086;&#1090;&#1072;,&#1053;&#1077;&#1076;&#1077;&#1083;&#1103;
 general_first_day_of_week: '1'
 
@@ -57,11 +57,11 @@ notice_account_updated: &#1055;&#1088;&#1086;&#1092;&#1080;&#1083;&#1098;&#1090; &#1077; &#1086;&#1073;&#1085;&#1086;&#1074;&#1077;&#1085; &#1091;&#1089;&#1087;&#1077;&#1096;&#1085;&#1086;.
 notice_account_invalid_creditentials: &#1053;&#1077;&#1074;&#1072;&#1083;&#1080;&#1076;&#1077;&#1085; &#1087;&#1086;&#1090;&#1088;&#1077;&#1073;&#1080;&#1090;&#1077;&#1083; &#1080;&#1083;&#1080; &#1087;&#1072;&#1088;&#1086;&#1083;&#1072;.
 notice_account_password_updated: &#1055;&#1072;&#1088;&#1086;&#1083;&#1072;&#1090;&#1072; &#1077; &#1091;&#1089;&#1087;&#1077;&#1096;&#1085;&#1086; &#1087;&#1088;&#1086;&#1084;&#1077;&#1085;&#1077;&#1085;&#1072;.
 notice_account_wrong_password: &#1043;&#1088;&#1077;&#1096;&#1085;&#1072; &#1087;&#1072;&#1088;&#1086;&#1083;&#1072;
-notice_account_register_done: &#1040;&#1082;&#1072;&#1091;&#1085;&#1090;&#1098;&#1090; &#1077; &#1089;&#1098;&#1079;&#1076;&#1072;&#1076;&#1077;&#1085; &#1091;&#1089;&#1087;&#1077;&#1096;&#1085;&#1086;.
-notice_account_unknown_email: &#1053;&#1077;&#1087;&#1086;&#1079;&#1085;&#1072;&#1090; &#1087;&#1086;&#1090;&#1088;&#1077;&#1073;&#1080;&#1090;&#1077;&#1083;.
-notice_can_t_change_password: &#1058;&#1086;&#1079;&#1080; &#1072;&#1082;&#1072;&#1091;&#1085;&#1090; &#1077; &#1089; &#1074;&#1098;&#1085;&#1096;&#1077;&#1085; &#1084;&#1077;&#1090;&#1086;&#1076; &#1079;&#1072; &#1086;&#1090;&#1086;&#1088;&#1080;&#1079;&#1072;&#1094;&#1080;&#1103;. &#1053;&#1077;&#1074;&#1098;&#1079;&#1084;&#1086;&#1078;&#1085;&#1072; &#1089;&#1084;&#1103;&#1085;&#1072; &#1085;&#1072; &#1087;&#1072;&#1088;&#1086;&#1083;&#1072;&#1090;&#1072;.
+notice_account_register_done: &#1055;&#1088;&#1086;&#1092;&#1080;&#1083;&#1098;&#1090; &#1077; &#1089;&#1098;&#1079;&#1076;&#1072;&#1076;&#1077;&#1085; &#1091;&#1089;&#1087;&#1077;&#1096;&#1085;&#1086;.
+notice_account_unknown_email: &#1053;&#1077;&#1087;&#1086;&#1079;&#1085;&#1072;&#1090; e-mail.
+notice_can_t_change_password: &#1058;&#1086;&#1079;&#1080; &#1087;&#1088;&#1086;&#1092;&#1080;&#1083; &#1077; &#1089; &#1074;&#1098;&#1085;&#1096;&#1077;&#1085; &#1084;&#1077;&#1090;&#1086;&#1076; &#1079;&#1072; &#1086;&#1090;&#1086;&#1088;&#1080;&#1079;&#1072;&#1094;&#1080;&#1103;. &#1053;&#1077;&#1074;&#1098;&#1079;&#1084;&#1086;&#1078;&#1085;&#1072; &#1089;&#1084;&#1103;&#1085;&#1072; &#1085;&#1072; &#1087;&#1072;&#1088;&#1086;&#1083;&#1072;&#1090;&#1072;.
 notice_account_lost_email_sent: &#1048;&#1079;&#1087;&#1088;&#1072;&#1090;&#1077;&#1085; &#1074;&#1080; &#1077; e-mail &#1089; &#1080;&#1085;&#1089;&#1090;&#1088;&#1091;&#1082;&#1094;&#1080;&#1080; &#1079;&#1072; &#1080;&#1079;&#1073;&#1086;&#1088; &#1085;&#1072; &#1085;&#1086;&#1074;&#1072; &#1087;&#1072;&#1088;&#1086;&#1083;&#1072;.
-notice_account_activated: &#1040;&#1082;&#1072;&#1091;&#1085;&#1090;&#1098;&#1090; &#1074;&#1080; &#1077; &#1072;&#1082;&#1090;&#1080;&#1074;&#1080;&#1088;&#1072;&#1085;. &#1042;&#1077;&#1095;&#1077; &#1084;&#1086;&#1078;&#1077; &#1076;&#1072; &#1074;&#1083;&#1077;&#1079;&#1077;&#1090;&#1077;.
+notice_account_activated: &#1055;&#1088;&#1086;&#1092;&#1080;&#1083;&#1098;&#1090; &#1074;&#1080; &#1077; &#1072;&#1082;&#1090;&#1080;&#1074;&#1080;&#1088;&#1072;&#1085;. &#1042;&#1077;&#1095;&#1077; &#1084;&#1086;&#1078;&#1077; &#1076;&#1072; &#1074;&#1083;&#1077;&#1079;&#1077;&#1090;&#1077; &#1074; &#1089;&#1080;&#1089;&#1090;&#1077;&#1084;&#1072;&#1090;&#1072;.
 notice_successful_create: &#1059;&#1089;&#1087;&#1077;&#1096;&#1085;&#1086; &#1089;&#1098;&#1079;&#1076;&#1072;&#1074;&#1072;&#1085;&#1077;.
 notice_successful_update: &#1059;&#1089;&#1087;&#1077;&#1096;&#1085;&#1086; &#1086;&#1073;&#1085;&#1086;&#1074;&#1103;&#1074;&#1072;&#1085;&#1077;.
 notice_successful_delete: &#1059;&#1089;&#1087;&#1077;&#1096;&#1085;&#1086; &#1080;&#1079;&#1090;&#1088;&#1080;&#1074;&#1072;&#1085;&#1077;.
@@ -78,8 +78,8 @@ error_scm_command_failed: &quot;&#1043;&#1088;&#1077;&#1096;&#1082;&#1072; &#1087;&#1088;&#1080; &#1086;&#1087;&#1080;&#1090; &#1079;&#1072; &#1082;&#1086;&#1084;&#1091;&#1085;&#1080;&#1082;&#1072;&#1094;
 
 mail_subject_lost_password: &#1042;&#1072;&#1096;&#1072;&#1090;&#1072; &#1087;&#1072;&#1088;&#1086;&#1083;&#1072; (%s)
 mail_body_lost_password: '&#1047;&#1072; &#1076;&#1072; &#1089;&#1084;&#1077;&#1085;&#1080;&#1090;&#1077; &#1087;&#1072;&#1088;&#1086;&#1083;&#1072;&#1090;&#1072; &#1089;&#1080;, &#1080;&#1079;&#1087;&#1086;&#1083;&#1079;&#1074;&#1072;&#1081;&#1090;&#1077; &#1089;&#1083;&#1077;&#1076;&#1085;&#1080;&#1103; &#1083;&#1080;&#1085;&#1082;:'
-mail_subject_register: &#1040;&#1082;&#1090;&#1080;&#1074;&#1072;&#1094;&#1080;&#1103; &#1085;&#1072; &#1072;&#1082;&#1072;&#1091;&#1085;&#1090; (%s)
-mail_body_register: '&#1047;&#1072; &#1076;&#1072; &#1072;&#1082;&#1090;&#1080;&#1074;&#1080;&#1088;&#1072;&#1090;&#1077; &#1072;&#1082;&#1072;&#1091;&#1085;&#1090;&#1072; &#1089;&#1080; &#1080;&#1079;&#1087;&#1086;&#1083;&#1079;&#1074;&#1072;&#1081;&#1090;&#1077; &#1089;&#1083;&#1077;&#1076;&#1085;&#1080;&#1103; &#1083;&#1080;&#1085;&#1082;:'
+mail_subject_register: &#1040;&#1082;&#1090;&#1080;&#1074;&#1072;&#1094;&#1080;&#1103; &#1085;&#1072; &#1087;&#1088;&#1086;&#1092;&#1080;&#1083; (%s)
+mail_body_register: '&#1047;&#1072; &#1076;&#1072; &#1072;&#1082;&#1090;&#1080;&#1074;&#1080;&#1088;&#1072;&#1090;&#1077; &#1087;&#1088;&#1086;&#1092;&#1080;&#1083;&#1072; &#1089;&#1080; &#1080;&#1079;&#1087;&#1086;&#1083;&#1079;&#1074;&#1072;&#1081;&#1090;&#1077; &#1089;&#1083;&#1077;&#1076;&#1085;&#1080;&#1103; &#1083;&#1080;&#1085;&#1082;:'
 
 gui_validation_error: 1 &#1075;&#1088;&#1077;&#1096;&#1082;&#1072;
 gui_validation_error_plural: %d &#1075;&#1088;&#1077;&#1096;&#1082;&#1080;
@@ -113,11 +113,11 @@ field_notes: &#1041;&#1077;&#1083;&#1077;&#1078;&#1082;&#1072;
 field_is_closed: &#1047;&#1072;&#1090;&#1074;&#1086;&#1088;&#1077;&#1085;&#1072; &#1079;&#1072;&#1076;&#1072;&#1095;&#1072;
 field_is_default: &#1057;&#1090;&#1072;&#1090;&#1091;&#1089; &#1087;&#1086; &#1087;&#1086;&#1076;&#1088;&#1072;&#1079;&#1073;&#1080;&#1088;&#1072;&#1085;&#1077;
 field_tracker: &#1058;&#1088;&#1072;&#1082;&#1077;&#1088;
-field_subject: &#1058;&#1077;&#1084;&#1072;
+field_subject: &#1054;&#1090;&#1085;&#1086;&#1089;&#1085;&#1086;
 field_due_date: &#1050;&#1088;&#1072;&#1081;&#1085;&#1072; &#1076;&#1072;&#1090;&#1072;
 field_assigned_to: &#1042;&#1098;&#1079;&#1083;&#1086;&#1078;&#1077;&#1085;&#1072; &#1085;&#1072;
 field_priority: &#1055;&#1088;&#1080;&#1086;&#1088;&#1080;&#1090;&#1077;&#1090;
-field_fixed_version: Target version
+field_fixed_version: &#1055;&#1083;&#1072;&#1085;&#1091;&#1074;&#1072;&#1085;&#1072; &#1074;&#1077;&#1088;&#1089;&#1080;&#1103;
 field_user: &#1055;&#1086;&#1090;&#1088;&#1077;&#1073;&#1080;&#1090;&#1077;&#1083;
 field_role: &#1056;&#1086;&#1083;&#1103;
 field_homepage: &#1053;&#1072;&#1095;&#1072;&#1083;&#1085;&#1072; &#1089;&#1090;&#1088;&#1072;&#1085;&#1080;&#1094;&#1072;
@@ -138,7 +138,7 @@ field_version: &#1042;&#1077;&#1088;&#1089;&#1080;&#1103;
 field_type: &#1058;&#1080;&#1087;
 field_host: &#1061;&#1086;&#1089;&#1090;
 field_port: &#1055;&#1086;&#1088;&#1090;
-field_account: &#1040;&#1082;&#1072;&#1091;&#1085;&#1090;
+field_account: &#1055;&#1088;&#1086;&#1092;&#1080;&#1083;
 field_base_dn: Base DN
 field_attr_login: Login attribute
 field_attr_firstname: Firstname attribute
@@ -163,7 +163,7 @@ field_delay: &#1054;&#1090;&#1084;&#1077;&#1089;&#1090;&#1074;&#1072;&#1085;&#1077;
 field_assignable: &#1042;&#1098;&#1079;&#1084;&#1086;&#1078;&#1085;&#1086; &#1077; &#1074;&#1098;&#1079;&#1083;&#1072;&#1075;&#1072;&#1085;&#1077; &#1085;&#1072; &#1079;&#1072;&#1076;&#1072;&#1095;&#1080; &#1079;&#1072; &#1090;&#1072;&#1079;&#1080; &#1088;&#1086;&#1083;&#1103;
 field_redirect_existing_links: &#1055;&#1088;&#1077;&#1085;&#1072;&#1089;&#1086;&#1095;&#1074;&#1072;&#1085;&#1077; &#1085;&#1072; &#1089;&#1098;&#1097;&#1077;&#1089;&#1090;&#1074;&#1091;&#1074;&#1072;&#1097;&#1080; &#1083;&#1080;&#1085;&#1082;&#1086;&#1074;&#1077;
 field_estimated_hours: &#1048;&#1079;&#1095;&#1080;&#1089;&#1083;&#1077;&#1085;&#1086; &#1074;&#1088;&#1077;&#1084;&#1077;
-field_default_value: &#1057;&#1090;&#1072;&#1090;&#1091;&#1089; &#1087;&#1086; &#1087;&#1086;&#1076;&#1088;&#1072;&#1079;&#1073;&#1080;&#1088;&#1072;&#1085;&#1077;
+field_default_value: &#1057;&#1090;&#1086;&#1081;&#1085;&#1086;&#1089;&#1090; &#1087;&#1086; &#1087;&#1086;&#1076;&#1088;&#1072;&#1079;&#1073;&#1080;&#1088;&#1072;&#1085;&#1077;
 
 setting_app_title: &#1047;&#1072;&#1075;&#1083;&#1072;&#1074;&#1080;&#1077;
 setting_app_subtitle: &#1054;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077;
@@ -171,15 +171,15 @@ setting_welcome_text: &#1044;&#1086;&#1087;&#1098;&#1083;&#1085;&#1080;&#1090;&#1077;&#1083;&#1077;&#1085; &#1090;&#1077;&#1082;&#1089;&#1090;
 setting_default_language: &#1045;&#1079;&#1080;&#1082; &#1087;&#1086; &#1087;&#1086;&#1076;&#1088;&#1072;&#1079;&#1073;&#1080;&#1088;&#1072;&#1085;&#1077;
 setting_login_required: &#1048;&#1079;&#1080;&#1089;&#1082;&#1074;&#1072;&#1085;&#1077; &#1079;&#1072; &#1074;&#1093;&#1086;&#1076; &#1074; &#1089;&#1080;&#1089;&#1090;&#1077;&#1084;&#1072;&#1090;&#1072;
 setting_self_registration: &#1056;&#1077;&#1075;&#1080;&#1089;&#1090;&#1088;&#1072;&#1094;&#1080;&#1103; &#1086;&#1090; &#1087;&#1086;&#1090;&#1088;&#1077;&#1073;&#1080;&#1090;&#1077;&#1083;&#1080;
-setting_attachment_max_size: &#1052;&#1072;&#1082;&#1089;&#1080;&#1084;&#1072;&#1083;&#1085;&#1086; &#1075;&#1086;&#1083;&#1103;&#1084; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085; &#1092;&#1072;&#1081;&#1083;
+setting_attachment_max_size: &#1052;&#1072;&#1082;&#1089;&#1080;&#1084;&#1072;&#1083;&#1085;&#1072; &#1075;&#1086;&#1083;&#1077;&#1084;&#1080;&#1085;&#1072; &#1085;&#1072; &#1087;&#1088;&#1080;&#1082;&#1072;&#1095;&#1077;&#1085; &#1092;&#1072;&#1081;&#1083;
 setting_issues_export_limit: &#1051;&#1080;&#1084;&#1080;&#1090; &#1079;&#1072; &#1077;&#1082;&#1089;&#1087;&#1086;&#1088;&#1090; &#1085;&#1072; &#1079;&#1072;&#1076;&#1072;&#1095;&#1080;
 setting_mail_from: E-mail &#1072;&#1076;&#1088;&#1077;&#1089; &#1079;&#1072; &#1077;&#1084;&#1080;&#1089;&#1080;&#1080;
 setting_host_name: &#1061;&#1086;&#1089;&#1090;
 setting_text_formatting: &#1060;&#1086;&#1088;&#1084;&#1072;&#1090;&#1080;&#1088;&#1072;&#1085;&#1077; &#1085;&#1072; &#1090;&#1077;&#1082;&#1089;&#1090;&#1072;
 setting_wiki_compression: Wiki &#1082;&#1086;&#1084;&#1087;&#1088;&#1077;&#1089;&#1080;&#1088;&#1072;&#1085;&#1077; &#1085;&#1072; &#1080;&#1089;&#1090;&#1086;&#1088;&#1080;&#1103;&#1090;&#1072;
 setting_feeds_limit: &#1051;&#1080;&#1084;&#1080;&#1090; &#1085;&#1072; Feeds
-setting_autofetch_changesets: &#1040;&#1074;&#1090;&#1086;&#1084;&#1072;&#1090;&#1080;&#1095;&#1085;&#1086; &#1086;&#1073;&#1088;&#1072;&#1073;&#1086;&#1090;&#1074;&#1072;&#1085;&#1077; &#1085;&#1072; commits &#1074; &#1093;&#1088;&#1072;&#1085;&#1080;&#1083;&#1080;&#1097;&#1077;&#1090;&#1086;
-setting_sys_api_enabled: &#1056;&#1072;&#1079;&#1088;&#1077;&#1096;&#1072;&#1074;&#1072;&#1085;&#1077; &#1085;&#1072; WS &#1079;&#1072; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1077;&#1085;&#1080;&#1077; &#1085;&#1072; &#1093;&#1088;&#1072;&#1085;&#1080;&#1083;&#1080;&#1097;&#1077;&#1090;&#1086;
+setting_autofetch_changesets: &#1040;&#1074;&#1090;&#1086;&#1084;&#1072;&#1090;&#1080;&#1095;&#1085;&#1086; &#1086;&#1073;&#1088;&#1072;&#1073;&#1086;&#1090;&#1074;&#1072;&#1085;&#1077; &#1085;&#1072; &#1088;&#1077;&#1074;&#1080;&#1079;&#1080;&#1080;&#1090;&#1077;
+setting_sys_api_enabled: &#1056;&#1072;&#1079;&#1088;&#1077;&#1096;&#1072;&#1074;&#1072;&#1085;&#1077; &#1085;&#1072; WS &#1079;&#1072; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1077;&#1085;&#1080;&#1077;
 setting_commit_ref_keywords: &#1054;&#1090;&#1073;&#1077;&#1083;&#1103;&#1079;&#1074;&#1072;&#1097;&#1080; &#1082;&#1083;&#1102;&#1095;&#1086;&#1074;&#1080; &#1076;&#1091;&#1084;&#1080;
 setting_commit_fix_keywords: &#1055;&#1088;&#1080;&#1082;&#1083;&#1102;&#1095;&#1074;&#1072;&#1097;&#1080; &#1082;&#1083;&#1102;&#1095;&#1086;&#1074;&#1080; &#1076;&#1091;&#1084;&#1080;
 setting_autologin: &#1040;&#1074;&#1090;&#1086;&#1084;&#1072;&#1090;&#1080;&#1095;&#1077;&#1085; &#1074;&#1093;&#1086;&#1076;
@@ -231,7 +231,7 @@ label_password_lost: &#1047;&#1072;&#1073;&#1088;&#1072;&#1074;&#1077;&#1085;&#1072; &#1087;&#1072;&#1088;&#1086;&#1083;&#1072;
 label_home: &#1053;&#1072;&#1095;&#1072;&#1083;&#1086;
 label_my_page: &#1051;&#1080;&#1095;&#1085;&#1072; &#1089;&#1090;&#1088;&#1072;&#1085;&#1080;&#1094;&#1072;
 label_my_account: &#1055;&#1088;&#1086;&#1092;&#1080;&#1083;
-label_my_projects: &#1052;&#1086;&#1080;&#1090;&#1077; &#1087;&#1088;&#1086;&#1077;&#1082;&#1090;&#1080;
+label_my_projects: &#1055;&#1088;&#1086;&#1077;&#1082;&#1090;&#1080;, &#1074; &#1082;&#1086;&#1080;&#1090;&#1086; &#1091;&#1095;&#1072;&#1089;&#1090;&#1074;&#1072;&#1084;
 label_administration: &#1040;&#1076;&#1084;&#1080;&#1085;&#1080;&#1089;&#1090;&#1088;&#1072;&#1094;&#1080;&#1103;
 label_login: &#1042;&#1093;&#1086;&#1076;
 label_logout: &#1048;&#1079;&#1093;&#1086;&#1076;
@@ -375,8 +375,8 @@ label_f_hour_plural: %.2f &#1095;&#1072;&#1089;&#1072;
 label_time_tracking: &#1054;&#1090;&#1076;&#1077;&#1083;&#1103;&#1085;&#1077; &#1085;&#1072; &#1074;&#1088;&#1077;&#1084;&#1077;
 label_change_plural: &#1055;&#1088;&#1086;&#1084;&#1077;&#1085;&#1080;
 label_statistics: &#1057;&#1090;&#1072;&#1090;&#1080;&#1089;&#1090;&#1080;&#1082;&#1080;
-label_commits_per_month: Commits &#1079;&#1072; &#1084;&#1077;&#1089;&#1077;&#1094;
-label_commits_per_author: Commits &#1079;&#1072; &#1072;&#1074;&#1090;&#1086;&#1088;
+label_commits_per_month: &#1056;&#1077;&#1074;&#1080;&#1079;&#1080;&#1080; &#1087;&#1086; &#1084;&#1077;&#1089;&#1077;&#1094;&#1080;
+label_commits_per_author: &#1056;&#1077;&#1074;&#1080;&#1079;&#1080;&#1080; &#1087;&#1086; &#1072;&#1074;&#1090;&#1086;&#1088;
 label_view_diff: &#1042;&#1080;&#1078; &#1088;&#1072;&#1079;&#1083;&#1080;&#1082;&#1080;&#1090;&#1077;
 label_diff_inline: &#1093;&#1086;&#1088;&#1080;&#1079;&#1086;&#1085;&#1090;&#1072;&#1083;&#1085;&#1086;
 label_diff_side_by_side: &#1074;&#1077;&#1088;&#1090;&#1080;&#1082;&#1072;&#1083;&#1085;&#1086;
@@ -389,7 +389,7 @@ label_applied_status: &#1055;&#1088;&#1086;&#1084;&#1077;&#1085;&#1080; &#1089;&#1090;&#1072;&#1090;&#1091;&#1089;&#1072; &#1085;&#1072;
 label_loading: &#1047;&#1072;&#1088;&#1077;&#1078;&#1076;&#1072;&#1085;&#1077;...
 label_relation_new: &#1053;&#1086;&#1074;&#1072; &#1088;&#1077;&#1083;&#1072;&#1094;&#1080;&#1103;
 label_relation_delete: &#1048;&#1079;&#1090;&#1088;&#1080;&#1074;&#1072;&#1085;&#1077; &#1085;&#1072; &#1088;&#1077;&#1083;&#1072;&#1094;&#1080;&#1103;
-label_relates_to: &#1057;&#1074;&#1098;&#1088;&#1079;&#1072;&#1085;&#1072; &#1089;&#1098;&#1089;
+label_relates_to: &#1089;&#1074;&#1098;&#1088;&#1079;&#1072;&#1085;&#1072; &#1089;&#1098;&#1089;
 label_duplicates: &#1076;&#1091;&#1073;&#1083;&#1080;&#1088;&#1072;
 label_blocks: &#1073;&#1083;&#1086;&#1082;&#1080;&#1088;&#1072;
 label_blocked_by: &#1073;&#1083;&#1086;&#1082;&#1080;&#1088;&#1072;&#1085;&#1072; &#1086;&#1090;
@@ -427,10 +427,10 @@ label_updated_time: &#1054;&#1073;&#1085;&#1086;&#1074;&#1077;&#1085;&#1072; &#1087;&#1088;&#1077;&#1076;&#1080; %s
 label_jump_to_a_project: &#1055;&#1088;&#1086;&#1077;&#1082;&#1090;...
 
 button_login: &#1042;&#1093;&#1086;&#1076;
-button_submit: &#1055;&#1088;&#1080;&#1083;&#1086;&#1078;&#1080;
+button_submit: &#1055;&#1088;&#1080;&#1082;&#1072;&#1095;&#1074;&#1072;&#1085;&#1077;
 button_save: &#1047;&#1072;&#1087;&#1080;&#1089;
-button_check_all: &#1052;&#1072;&#1088;&#1082;&#1080;&#1088;&#1072;&#1081; &#1074;&#1089;&#1080;&#1095;&#1082;&#1080;
-button_uncheck_all: &#1048;&#1079;&#1095;&#1080;&#1089;&#1090;&#1080; &#1074;&#1089;&#1080;&#1095;&#1082;&#1080;
+button_check_all: &#1048;&#1079;&#1073;&#1086;&#1088; &#1085;&#1072; &#1074;&#1089;&#1080;&#1095;&#1082;&#1080;
+button_uncheck_all: &#1048;&#1079;&#1095;&#1080;&#1089;&#1090;&#1074;&#1072;&#1085;&#1077; &#1085;&#1072; &#1074;&#1089;&#1080;&#1095;&#1082;&#1080;
 button_delete: &#1048;&#1079;&#1090;&#1088;&#1080;&#1074;&#1072;&#1085;&#1077;
 button_create: &#1057;&#1098;&#1079;&#1076;&#1072;&#1074;&#1072;&#1085;&#1077;
 button_test: &#1058;&#1077;&#1089;&#1090;
@@ -481,9 +481,9 @@ text_length_between: &#1054;&#1090; %d &#1076;&#1086; %d &#1089;&#1080;&#1084;&#1074;&#1086;&#1083;&#1072;.
 text_tracker_no_workflow: &#1053;&#1103;&#1084;&#1072; &#1076;&#1077;&#1092;&#1080;&#1085;&#1080;&#1088;&#1072;&#1085; &#1088;&#1072;&#1073;&#1086;&#1090;&#1077;&#1085; &#1087;&#1088;&#1086;&#1094;&#1077;&#1089; &#1079;&#1072; &#1090;&#1086;&#1079;&#1080; &#1090;&#1088;&#1072;&#1082;&#1077;&#1088;
 text_unallowed_characters: &#1053;&#1077;&#1087;&#1086;&#1079;&#1074;&#1086;&#1083;&#1077;&#1085;&#1080; &#1089;&#1080;&#1084;&#1074;&#1086;&#1083;&#1080;
 text_comma_separated: &#1055;&#1086;&#1079;&#1074;&#1086;&#1083;&#1077;&#1085;&#1086; &#1077; &#1080;&#1079;&#1073;&#1088;&#1086;&#1103;&#1074;&#1072;&#1085;&#1077; (&#1089; &#1088;&#1072;&#1079;&#1076;&#1077;&#1083;&#1080;&#1090;&#1077;&#1083; &#1079;&#1072;&#1087;&#1077;&#1090;&#1072;&#1103;).
-text_issues_ref_in_commit_messages: &#1054;&#1090;&#1073;&#1077;&#1083;&#1103;&#1079;&#1074;&#1072;&#1085;&#1077; &#1080; &#1087;&#1088;&#1080;&#1082;&#1083;&#1102;&#1095;&#1074;&#1072;&#1085;&#1077; &#1085;&#1072; &#1079;&#1072;&#1076;&#1072;&#1095;&#1080; &#1086;&#1090; commit &#1089;&#1098;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1103;
-text_issue_added: &#1055;&#1091;&#1073;&#1083;&#1080;&#1082;&#1091;&#1074;&#1072;&#1085;&#1072; &#1077; &#1085;&#1086;&#1074;&#1072; &#1079;&#1072;&#1076;&#1072;&#1095;&#1072; &#1089; &#1085;&#1086;&#1084;&#1077;&#1088; %s (by %s).
-text_issue_updated: &#1047;&#1072;&#1076;&#1072;&#1095;&#1072; %s &#1077; &#1086;&#1073;&#1085;&#1086;&#1074;&#1077;&#1085;&#1072; (by %s).
+text_issues_ref_in_commit_messages: &#1054;&#1090;&#1073;&#1077;&#1083;&#1103;&#1079;&#1074;&#1072;&#1085;&#1077; &#1080; &#1087;&#1088;&#1080;&#1082;&#1083;&#1102;&#1095;&#1074;&#1072;&#1085;&#1077; &#1085;&#1072; &#1079;&#1072;&#1076;&#1072;&#1095;&#1080; &#1086;&#1090; &#1088;&#1077;&#1074;&#1080;&#1079;&#1080;&#1080;
+text_issue_added: &#1055;&#1091;&#1073;&#1083;&#1080;&#1082;&#1091;&#1074;&#1072;&#1085;&#1072; &#1077; &#1085;&#1086;&#1074;&#1072; &#1079;&#1072;&#1076;&#1072;&#1095;&#1072; &#1089; &#1085;&#1086;&#1084;&#1077;&#1088; %s (&#1086;&#1090; %s).
+text_issue_updated: &#1047;&#1072;&#1076;&#1072;&#1095;&#1072; %s &#1077; &#1086;&#1073;&#1085;&#1086;&#1074;&#1077;&#1085;&#1072; (&#1086;&#1090; %s).
 text_wiki_destroy_confirmation: &#1057;&#1080;&#1075;&#1091;&#1088;&#1085;&#1080; &#1083;&#1080; &#1089;&#1090;&#1077;, &#1095;&#1077; &#1080;&#1089;&#1082;&#1072;&#1090;&#1077; &#1076;&#1072; &#1080;&#1079;&#1090;&#1088;&#1080;&#1077;&#1090;&#1077; &#1090;&#1086;&#1074;&#1072; Wiki &#1080; &#1094;&#1103;&#1083;&#1086;&#1090;&#1086; &#1084;&#1091; &#1089;&#1098;&#1076;&#1098;&#1088;&#1078;&#1072;&#1085;&#1080;&#1077;?
 text_issue_category_destroy_question: &#1048;&#1084;&#1072; &#1079;&#1072;&#1076;&#1072;&#1095;&#1080; (%d) &#1086;&#1073;&#1074;&#1098;&#1088;&#1079;&#1072;&#1085;&#1080; &#1089; &#1090;&#1072;&#1079;&#1080; &#1082;&#1072;&#1090;&#1077;&#1075;&#1086;&#1088;&#1080;&#1103;. &#1050;&#1072;&#1082;&#1074;&#1086; &#1097;&#1077; &#1080;&#1079;&#1073;&#1077;&#1088;&#1077;&#1090;&#1077;?
 text_issue_category_destroy_assignments: &#1055;&#1088;&#1077;&#1084;&#1072;&#1093;&#1074;&#1072;&#1085;&#1077; &#1085;&#1072; &#1074;&#1088;&#1098;&#1079;&#1082;&#1080;&#1090;&#1077; &#1089; &#1082;&#1072;&#1090;&#1077;&#1075;&#1086;&#1088;&#1080;&#1103;&#1090;&#1072;
@@ -515,11 +515,11 @@ enumeration_issue_priorities: &#1055;&#1088;&#1080;&#1086;&#1088;&#1080;&#1090;&#1077;&#1090;&#1080; &#1085;&#1072; &#1079;&#1072;&#1076;&#1072;&#1095;&#1080;
 enumeration_doc_categories: &#1050;&#1072;&#1090;&#1077;&#1075;&#1086;&#1088;&#1080;&#1080; &#1076;&#1086;&#1082;&#1091;&#1084;&#1077;&#1085;&#1090;&#1080;
 enumeration_activities: &#1044;&#1077;&#1081;&#1085;&#1086;&#1089;&#1090;&#1080; (time tracking)
 label_file_plural: &#1060;&#1072;&#1081;&#1083;&#1086;&#1074;&#1077;
-label_changeset_plural: Changesets
+label_changeset_plural: &#1056;&#1077;&#1074;&#1080;&#1079;&#1080;&#1080;
 field_column_names: &#1050;&#1086;&#1083;&#1086;&#1085;&#1080;
 label_default_columns: &#1055;&#1086; &#1087;&#1086;&#1076;&#1088;&#1072;&#1079;&#1073;&#1080;&#1088;&#1072;&#1085;&#1077;
 setting_issue_list_default_columns: &#1055;&#1086;&#1082;&#1072;&#1079;&#1074;&#1072;&#1085;&#1080; &#1082;&#1086;&#1083;&#1086;&#1085;&#1080; &#1087;&#1086; &#1087;&#1086;&#1076;&#1088;&#1072;&#1079;&#1073;&#1080;&#1088;&#1072;&#1085;&#1077;
-setting_repositories_encodings: &#1050;&#1086;&#1076;&#1086;&#1074;&#1080; &#1090;&#1072;&#1073;&#1083;&#1080;&#1094;&#1080; &#1085;&#1072; &#1093;&#1088;&#1072;&#1085;&#1080;&#1083;&#1080;&#1097;&#1072;&#1090;&#1072;
+setting_repositories_encodings: &#1050;&#1086;&#1076;&#1086;&#1074;&#1080; &#1090;&#1072;&#1073;&#1083;&#1080;&#1094;&#1080;
 notice_no_issue_selected: &quot;&#1053;&#1103;&#1084;&#1072; &#1080;&#1079;&#1073;&#1088;&#1072;&#1085;&#1080; &#1079;&#1072;&#1076;&#1072;&#1095;&#1080;.&quot;
 label_bulk_edit_selected_issues: &#1056;&#1077;&#1076;&#1072;&#1082;&#1090;&#1080;&#1088;&#1072;&#1085;&#1077; &#1085;&#1072; &#1079;&#1072;&#1076;&#1072;&#1095;&#1080;
 label_no_change_option: (&#1041;&#1077;&#1079; &#1087;&#1088;&#1086;&#1084;&#1103;&#1085;&#1072;)
@@ -536,20 +536,20 @@ label_user_mail_option_none: &quot;&#1057;&#1072;&#1084;&#1086; &#1079;&#1072; &#1085;&#1072;&#1073;&#1083;&#1102;&#1076;&#1072;&#1074;&#1072;&#1085;&#1080; &#1080;&#1083;&#1080; &#1074; &#1082;
 setting_emails_footer: &#1055;&#1086;&#1076;&#1090;&#1077;&#1082;&#1089;&#1090; &#1079;&#1072; e-mail
 label_float: &#1044;&#1088;&#1086;&#1073;&#1085;&#1086;
 button_copy: &#1050;&#1086;&#1087;&#1080;&#1088;&#1072;&#1085;&#1077;
-mail_body_account_information_external: &#1052;&#1086;&#1078;&#1077;&#1090;&#1077; &#1076;&#1072; &#1080;&#1079;&#1087;&#1086;&#1083;&#1079;&#1074;&#1072;&#1090;&#1077; &#1074;&#1072;&#1096;&#1080;&#1103; &quot;%s&quot; &#1072;&#1082;&#1072;&#1091;&#1085;&#1090; &#1079;&#1072; &#1074;&#1093;&#1086;&#1076;.
-mail_body_account_information: &#1048;&#1085;&#1092;&#1086;&#1088;&#1084;&#1072;&#1094;&#1080;&#1103;&#1090;&#1072; &#1079;&#1072; &#1072;&#1082;&#1072;&#1091;&#1085;&#1090;&#1072;
+mail_body_account_information_external: &#1052;&#1086;&#1078;&#1077;&#1090;&#1077; &#1076;&#1072; &#1080;&#1079;&#1087;&#1086;&#1083;&#1079;&#1074;&#1072;&#1090;&#1077; &#1074;&#1072;&#1096;&#1080;&#1103; &quot;%s&quot; &#1087;&#1088;&#1086;&#1092;&#1080;&#1083; &#1079;&#1072; &#1074;&#1093;&#1086;&#1076;.
+mail_body_account_information: &#1048;&#1085;&#1092;&#1086;&#1088;&#1084;&#1072;&#1094;&#1080;&#1103;&#1090;&#1072; &#1079;&#1072; &#1087;&#1088;&#1086;&#1092;&#1080;&#1083;&#1072; &#1074;&#1080;
 setting_protocol: &#1055;&#1088;&#1086;&#1090;&#1086;&#1082;&#1086;&#1083;
 label_user_mail_no_self_notified: &quot;&#1053;&#1077; &#1080;&#1089;&#1082;&#1072;&#1084; &#1080;&#1079;&#1074;&#1077;&#1089;&#1090;&#1080;&#1103; &#1079;&#1072; &#1080;&#1079;&#1074;&#1098;&#1088;&#1096;&#1077;&#1085;&#1080; &#1086;&#1090; &#1084;&#1077;&#1085; &#1087;&#1088;&#1086;&#1084;&#1077;&#1085;&#1080;&quot;
 setting_time_format: &#1060;&#1086;&#1088;&#1084;&#1072;&#1090; &#1085;&#1072; &#1095;&#1072;&#1089;&#1072;
-label_registration_activation_by_email: &#1072;&#1082;&#1090;&#1080;&#1074;&#1080;&#1088;&#1072;&#1085;&#1077; &#1085;&#1072; &#1072;&#1082;&#1072;&#1091;&#1085;&#1090;&#1072; &#1087;&#1086; email
-mail_subject_account_activation_request: &#1047;&#1072;&#1103;&#1074;&#1082;&#1072; &#1079;&#1072; &#1072;&#1082;&#1090;&#1080;&#1074;&#1080;&#1088;&#1072;&#1085;&#1077; &#1085;&#1072; &#1072;&#1082;&#1072;&#1091;&#1085;&#1090; &#1074; %s
+label_registration_activation_by_email: &#1072;&#1082;&#1090;&#1080;&#1074;&#1080;&#1088;&#1072;&#1085;&#1077; &#1085;&#1072; &#1087;&#1088;&#1086;&#1092;&#1080;&#1083;&#1072; &#1087;&#1086; email
+mail_subject_account_activation_request: &#1047;&#1072;&#1103;&#1074;&#1082;&#1072; &#1079;&#1072; &#1072;&#1082;&#1090;&#1080;&#1074;&#1080;&#1088;&#1072;&#1085;&#1077; &#1085;&#1072; &#1087;&#1088;&#1086;&#1092;&#1080;&#1083; &#1074; %s
 mail_body_account_activation_request: '&#1048;&#1084;&#1072; &#1085;&#1086;&#1074;&#1086;&#1088;&#1077;&#1075;&#1080;&#1089;&#1090;&#1088;&#1080;&#1088;&#1072;&#1085; &#1087;&#1086;&#1090;&#1088;&#1077;&#1073;&#1080;&#1090;&#1077;&#1083; (%s), &#1086;&#1095;&#1072;&#1082;&#1074;&#1072;&#1097; &#1074;&#1072;&#1096;&#1077;&#1090;&#1086; &#1086;&#1076;&#1086;&#1073;&#1088;&#1077;&#1085;&#1080;&#1077;:'
 label_registration_automatic_activation: &#1072;&#1074;&#1090;&#1086;&#1084;&#1072;&#1090;&#1080;&#1095;&#1085;&#1086; &#1072;&#1082;&#1090;&#1080;&#1074;&#1080;&#1088;&#1072;&#1085;&#1077;
 label_registration_manual_activation: &#1088;&#1098;&#1095;&#1085;&#1086; &#1072;&#1082;&#1090;&#1080;&#1074;&#1080;&#1088;&#1072;&#1085;&#1077;
-notice_account_pending: &quot;&#1040;&#1082;&#1072;&#1091;&#1085;&#1090;&#1098;&#1090; &#1042;&#1080; &#1077; &#1089;&#1098;&#1079;&#1076;&#1072;&#1076;&#1077;&#1085; &#1080; &#1086;&#1095;&#1072;&#1082;&#1074;&#1072; &#1086;&#1076;&#1086;&#1073;&#1088;&#1077;&#1085;&#1080;&#1077; &#1086;&#1090; &#1072;&#1076;&#1084;&#1080;&#1085;&#1080;&#1089;&#1090;&#1088;&#1072;&#1090;&#1086;&#1088;.&quot;
+notice_account_pending: &quot;&#1055;&#1088;&#1086;&#1092;&#1080;&#1083;&#1098;&#1090; &#1042;&#1080; &#1077; &#1089;&#1098;&#1079;&#1076;&#1072;&#1076;&#1077;&#1085; &#1080; &#1086;&#1095;&#1072;&#1082;&#1074;&#1072; &#1086;&#1076;&#1086;&#1073;&#1088;&#1077;&#1085;&#1080;&#1077; &#1086;&#1090; &#1072;&#1076;&#1084;&#1080;&#1085;&#1080;&#1089;&#1090;&#1088;&#1072;&#1090;&#1086;&#1088;.&quot;
 field_time_zone: &#1063;&#1072;&#1089;&#1086;&#1074;&#1072; &#1079;&#1086;&#1085;&#1072;
 text_caracters_minimum: &#1052;&#1080;&#1085;&#1080;&#1084;&#1091;&#1084; %d &#1089;&#1080;&#1084;&#1074;&#1086;&#1083;&#1072;.
-setting_bcc_recipients: Blind carbon copy (bcc) &#1087;&#1086;&#1083;&#1091;&#1095;&#1072;&#1090;&#1077;&#1083;&#1080;
+setting_bcc_recipients: &#1055;&#1086;&#1083;&#1091;&#1095;&#1072;&#1090;&#1077;&#1083;&#1080; &#1085;&#1072; &#1089;&#1082;&#1088;&#1080;&#1090;&#1086; &#1082;&#1086;&#1087;&#1080;&#1077; (bcc)
 button_annotate: &#1040;&#1085;&#1086;&#1090;&#1072;&#1094;&#1080;&#1103;
 label_issues_by: &#1047;&#1072;&#1076;&#1072;&#1095;&#1080; &#1087;&#1086; %s
 field_searchable: &#1057; &#1074;&#1098;&#1079;&#1084;&#1086;&#1078;&#1085;&#1086;&#1089;&#1090; &#1079;&#1072; &#1090;&#1098;&#1088;&#1089;&#1077;&#1085;&#1077;
@@ -566,54 +566,55 @@ label_general: &#1054;&#1089;&#1085;&#1086;&#1074;&#1085;&#1080;
 label_repository_plural: &#1061;&#1088;&#1072;&#1085;&#1080;&#1083;&#1080;&#1097;&#1072;
 label_associated_revisions: &#1040;&#1089;&#1086;&#1094;&#1080;&#1080;&#1088;&#1072;&#1085;&#1080; &#1088;&#1077;&#1074;&#1080;&#1079;&#1080;&#1080;
 setting_user_format: &#1055;&#1086;&#1090;&#1088;&#1077;&#1073;&#1080;&#1090;&#1077;&#1083;&#1089;&#1082;&#1080; &#1092;&#1086;&#1088;&#1084;&#1072;&#1090;
-text_status_changed_by_changeset: Applied in changeset %s.
-label_more: More
-text_issues_destroy_confirmation: 'Are you sure you want to delete the selected issue(s) ?'
-label_scm: SCM
-text_select_project_modules: 'Select modules to enable for this project:'
-label_issue_added: Issue added
-label_issue_updated: Issue updated
-label_document_added: Document added
-label_message_posted: Message added
-label_file_added: File added
-label_news_added: News added
-project_module_boards: Boards
-project_module_issue_tracking: Issue tracking
+text_status_changed_by_changeset: &#1055;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1086; &#1089; &#1088;&#1077;&#1074;&#1080;&#1079;&#1080;&#1103; %s.
+label_more: &#1054;&#1097;&#1077;
+text_issues_destroy_confirmation: '&#1057;&#1080;&#1075;&#1091;&#1088;&#1085;&#1080; &#1083;&#1080; &#1089;&#1090;&#1077;, &#1095;&#1077; &#1080;&#1089;&#1082;&#1072;&#1090;&#1077; &#1076;&#1072; &#1080;&#1079;&#1090;&#1088;&#1080;&#1077;&#1090;&#1077; &#1080;&#1079;&#1073;&#1088;&#1072;&#1085;&#1080;&#1090;&#1077; &#1079;&#1072;&#1076;&#1072;&#1095;&#1080;?'
+label_scm: SCM (&#1057;&#1080;&#1089;&#1090;&#1077;&#1084;&#1072; &#1079;&#1072; &#1082;&#1086;&#1085;&#1090;&#1088;&#1086;&#1083; &#1085;&#1072; &#1082;&#1086;&#1076;&#1072;)
+text_select_project_modules: '&#1048;&#1079;&#1073;&#1077;&#1088;&#1077;&#1090;&#1077; &#1072;&#1082;&#1090;&#1080;&#1074;&#1085;&#1080;&#1090;&#1077; &#1084;&#1086;&#1076;&#1091;&#1083;&#1080; &#1079;&#1072; &#1090;&#1086;&#1079;&#1080; &#1087;&#1088;&#1086;&#1077;&#1082;&#1090;:'
+label_issue_added: &#1044;&#1086;&#1073;&#1072;&#1074;&#1077;&#1085;&#1072; &#1079;&#1072;&#1076;&#1072;&#1095;&#1072;
+label_issue_updated: &#1054;&#1073;&#1085;&#1086;&#1074;&#1077;&#1085;&#1072; &#1079;&#1072;&#1076;&#1072;&#1095;&#1072;
+label_document_added: &#1044;&#1086;&#1073;&#1072;&#1074;&#1077;&#1085; &#1076;&#1086;&#1082;&#1091;&#1084;&#1077;&#1085;&#1090;
+label_message_posted: &#1044;&#1086;&#1073;&#1072;&#1074;&#1077;&#1085;&#1086; &#1089;&#1098;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;
+label_file_added: &#1044;&#1086;&#1073;&#1072;&#1074;&#1077;&#1085; &#1092;&#1072;&#1081;&#1083;
+label_news_added: &#1044;&#1086;&#1073;&#1072;&#1074;&#1077;&#1085;&#1072; &#1085;&#1086;&#1074;&#1080;&#1085;&#1072;
+project_module_boards: &#1060;&#1086;&#1088;&#1091;&#1084;&#1080;
+project_module_issue_tracking: &#1058;&#1088;&#1072;&#1082;&#1080;&#1085;&#1075;
 project_module_wiki: Wiki
-project_module_files: Files
-project_module_documents: Documents
-project_module_repository: Repository
-project_module_news: News
-project_module_time_tracking: Time tracking
-text_file_repository_writable: File repository writable
-text_default_administrator_account_changed: Default administrator account changed
-text_rmagick_available: RMagick available (optional)
-button_configure: Configure
-label_plugins: Plugins
-label_ldap_authentication: LDAP authentication
+project_module_files: &#1060;&#1072;&#1081;&#1083;&#1086;&#1074;&#1077;
+project_module_documents: &#1044;&#1086;&#1082;&#1091;&#1084;&#1077;&#1085;&#1090;&#1080;
+project_module_repository: &#1061;&#1088;&#1072;&#1085;&#1080;&#1083;&#1080;&#1097;&#1077;
+project_module_news: &#1053;&#1086;&#1074;&#1080;&#1085;&#1080;
+project_module_time_tracking: &#1054;&#1090;&#1076;&#1077;&#1083;&#1103;&#1085;&#1077; &#1085;&#1072; &#1074;&#1088;&#1077;&#1084;&#1077;
+text_file_repository_writable: &#1042;&#1098;&#1079;&#1084;&#1086;&#1078;&#1085;&#1086;&#1089;&#1090; &#1079;&#1072; &#1087;&#1080;&#1089;&#1072;&#1085;&#1077; &#1074; &#1093;&#1088;&#1072;&#1085;&#1080;&#1083;&#1080;&#1097;&#1077;&#1090;&#1086; &#1089; &#1092;&#1072;&#1081;&#1083;&#1086;&#1074;&#1077;
+text_default_administrator_account_changed: &#1057;&#1084;&#1077;&#1085;&#1077;&#1085; &#1092;&#1072;&#1073;&#1088;&#1080;&#1095;&#1085;&#1080;&#1103; &#1072;&#1076;&#1084;&#1080;&#1085;&#1080;&#1089;&#1090;&#1088;&#1072;&#1090;&#1086;&#1088;&#1089;&#1082;&#1080; &#1087;&#1088;&#1086;&#1092;&#1080;&#1083;
+text_rmagick_available: &#1053;&#1072;&#1083;&#1080;&#1095;&#1077;&#1085; RMagick (&#1087;&#1086; &#1080;&#1079;&#1073;&#1086;&#1088;)
+button_configure: &#1050;&#1086;&#1085;&#1092;&#1080;&#1075;&#1091;&#1088;&#1080;&#1088;&#1072;&#1085;&#1077;
+label_plugins: &#1055;&#1083;&#1098;&#1075;&#1080;&#1085;&#1080;
+label_ldap_authentication: LDAP &#1086;&#1090;&#1086;&#1088;&#1080;&#1079;&#1072;&#1094;&#1080;&#1103;
 label_downloads_abbr: D/L
-label_this_month: this month
-label_last_n_days: last %d days
-label_all_time: all time
-label_this_year: this year
-label_date_range: Date range
-label_last_week: last week
-label_yesterday: yesterday
-label_last_month: last month
-label_add_another_file: Add another file
-label_optional_description: Optional description
-text_destroy_time_entries_question: %.02f hours were reported on the issues you are about to delete. What do you want to do ?
-error_issue_not_found_in_project: 'The issue was not found or does not belong to this project'
-text_assign_time_entries_to_project: Assign reported hours to the project
-text_destroy_time_entries: Delete reported hours
-text_reassign_time_entries: 'Reassign reported hours to this issue:'
-setting_activity_days_default: Days displayed on project activity
-label_chronological_order: In chronological order
-field_comments_sorting: Display comments
-label_reverse_chronological_order: In reverse chronological order
-label_preferences: Preferences
-setting_display_subprojects_issues: Display subprojects issues on main projects by default
-label_overall_activity: Overall activity
-setting_default_projects_public: New projects are public by default
-error_scm_annotate: &quot;The entry does not exist or can not be annotated.&quot;
-label_planning: Planning
+label_this_month: &#1090;&#1077;&#1082;&#1091;&#1097;&#1080;&#1103; &#1084;&#1077;&#1089;&#1077;&#1094;
+label_last_n_days: &#1087;&#1086;&#1089;&#1083;&#1077;&#1076;&#1085;&#1080;&#1090;&#1077; %d &#1076;&#1085;&#1080;
+label_all_time: &#1074;&#1089;&#1080;&#1095;&#1082;&#1080;
+label_this_year: &#1090;&#1077;&#1082;&#1091;&#1097;&#1072;&#1090;&#1072; &#1075;&#1086;&#1076;&#1080;&#1085;&#1072;
+label_date_range: &#1055;&#1077;&#1088;&#1080;&#1086;&#1076;
+label_last_week: &#1087;&#1086;&#1089;&#1083;&#1077;&#1076;&#1085;&#1072;&#1090;&#1072; &#1089;&#1077;&#1076;&#1084;&#1080;&#1094;&#1072;
+label_yesterday: &#1074;&#1095;&#1077;&#1088;&#1072;
+label_last_month: &#1087;&#1086;&#1089;&#1083;&#1077;&#1076;&#1085;&#1080;&#1103; &#1084;&#1077;&#1089;&#1077;&#1094;
+label_add_another_file: &#1044;&#1086;&#1073;&#1072;&#1074;&#1103;&#1085;&#1077; &#1085;&#1072; &#1076;&#1088;&#1091;&#1075; &#1092;&#1072;&#1081;&#1083;
+label_optional_description: &#1053;&#1077;&#1079;&#1072;&#1076;&#1098;&#1083;&#1078;&#1080;&#1090;&#1077;&#1083;&#1085;&#1086; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077;
+text_destroy_time_entries_question: %.02f &#1095;&#1072;&#1089;&#1072; &#1089;&#1072; &#1086;&#1090;&#1076;&#1077;&#1083;&#1077;&#1085;&#1080; &#1085;&#1072; &#1079;&#1072;&#1076;&#1072;&#1095;&#1080;&#1090;&#1077;, &#1082;&#1086;&#1080;&#1090;&#1086; &#1080;&#1089;&#1082;&#1072;&#1090;&#1077; &#1076;&#1072; &#1080;&#1079;&#1090;&#1088;&#1080;&#1077;&#1090;&#1077;. &#1050;&#1072;&#1082;&#1074;&#1086; &#1080;&#1079;&#1073;&#1080;&#1088;&#1072;&#1090;&#1077;?
+error_issue_not_found_in_project: '&#1047;&#1072;&#1076;&#1072;&#1095;&#1072;&#1090;&#1072; &#1085;&#1077; &#1077; &#1085;&#1072;&#1084;&#1077;&#1088;&#1077;&#1085;&#1072; &#1080;&#1083;&#1080; &#1085;&#1077; &#1087;&#1088;&#1080;&#1085;&#1072;&#1076;&#1083;&#1077;&#1078;&#1080; &#1085;&#1072; &#1090;&#1086;&#1079;&#1080; &#1087;&#1088;&#1086;&#1077;&#1082;&#1090;'
+text_assign_time_entries_to_project: &#1055;&#1088;&#1077;&#1093;&#1074;&#1098;&#1088;&#1083;&#1103;&#1085;&#1077; &#1085;&#1072; &#1086;&#1090;&#1076;&#1077;&#1083;&#1077;&#1085;&#1086;&#1090;&#1086; &#1074;&#1088;&#1077;&#1084;&#1077; &#1082;&#1098;&#1084; &#1087;&#1088;&#1086;&#1077;&#1082;&#1090;
+text_destroy_time_entries: &#1048;&#1079;&#1090;&#1088;&#1080;&#1074;&#1072;&#1085;&#1077; &#1085;&#1072; &#1086;&#1090;&#1076;&#1077;&#1083;&#1077;&#1085;&#1086;&#1090;&#1086; &#1074;&#1088;&#1077;&#1084;&#1077;
+text_reassign_time_entries: '&#1055;&#1088;&#1077;&#1093;&#1074;&#1098;&#1088;&#1083;&#1103;&#1085;&#1077; &#1085;&#1072; &#1086;&#1090;&#1076;&#1077;&#1083;&#1077;&#1085;&#1086;&#1090;&#1086; &#1074;&#1088;&#1077;&#1084;&#1077; &#1082;&#1098;&#1084; &#1079;&#1072;&#1076;&#1072;&#1095;&#1072;:'
+setting_activity_days_default: &#1041;&#1088;&#1086;&#1081; &#1076;&#1085;&#1080; &#1087;&#1086;&#1082;&#1072;&#1079;&#1074;&#1072;&#1085;&#1080; &#1085;&#1072; &#1090;&#1072;&#1073; &#1044;&#1077;&#1081;&#1085;&#1086;&#1089;&#1090;
+label_chronological_order: &#1061;&#1088;&#1086;&#1085;&#1086;&#1083;&#1086;&#1075;&#1080;&#1095;&#1077;&#1085; &#1088;&#1077;&#1076;
+field_comments_sorting: &#1057;&#1086;&#1088;&#1090;&#1080;&#1088;&#1072;&#1085;&#1077; &#1085;&#1072; &#1082;&#1086;&#1084;&#1077;&#1085;&#1090;&#1072;&#1088;&#1080;&#1090;&#1077;
+label_reverse_chronological_order: &#1054;&#1073;&#1088;&#1072;&#1090;&#1077;&#1085; &#1093;&#1088;&#1086;&#1085;&#1086;&#1083;&#1086;&#1075;&#1080;&#1095;&#1077;&#1085; &#1088;&#1077;&#1076;
+label_preferences: &#1055;&#1088;&#1077;&#1076;&#1087;&#1086;&#1095;&#1080;&#1090;&#1072;&#1085;&#1080;&#1103;
+setting_display_subprojects_issues: &#1055;&#1086;&#1082;&#1072;&#1079;&#1074;&#1072;&#1085;&#1077; &#1085;&#1072; &#1087;&#1086;&#1076;&#1087;&#1088;&#1086;&#1077;&#1082;&#1090;&#1080;&#1090;&#1077; &#1074; &#1087;&#1088;&#1086;&#1077;&#1082;&#1090;&#1080;&#1090;&#1077; &#1087;&#1086; &#1087;&#1086;&#1076;&#1088;&#1072;&#1079;&#1073;&#1080;&#1088;&#1072;&#1085;&#1077;
+label_overall_activity: &#1062;&#1103;&#1083;&#1086;&#1089;&#1090;&#1085;&#1072; &#1076;&#1077;&#1081;&#1085;&#1086;&#1089;&#1090;
+setting_default_projects_public: &#1053;&#1086;&#1074;&#1080;&#1090;&#1077; &#1087;&#1088;&#1086;&#1077;&#1082;&#1090;&#1080; &#1089;&#1072; &#1087;&#1091;&#1073;&#1083;&#1080;&#1095;&#1085;&#1080; &#1087;&#1086; &#1087;&#1086;&#1076;&#1088;&#1072;&#1079;&#1073;&#1080;&#1088;&#1072;&#1085;&#1077;
+error_scm_annotate: &quot;&#1054;&#1073;&#1077;&#1082;&#1090;&#1098;&#1090; &#1085;&#1077; &#1089;&#1098;&#1097;&#1077;&#1089;&#1090;&#1074;&#1091;&#1074;&#1072; &#1080;&#1083;&#1080; &#1085;&#1077; &#1084;&#1086;&#1078;&#1077; &#1076;&#1072; &#1073;&#1098;&#1076;&#1077; &#1072;&#1085;&#1086;&#1090;&#1080;&#1088;&#1072;&#1085;.&quot;
+label_planning: &#1055;&#1083;&#1072;&#1085;&#1080;&#1088;&#1072;&#1085;&#1077;
+text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'</diff>
      <filename>lang/bg.yml</filename>
    </modified>
    <modified>
      <diff>@@ -10,16 +10,16 @@ actionview_datehelper_select_month_prefix:
 actionview_datehelper_select_year_prefix: 
 actionview_datehelper_time_in_words_day: 1 den
 actionview_datehelper_time_in_words_day_plural: %d dny
-actionview_datehelper_time_in_words_hour_about: asi hodinu
-actionview_datehelper_time_in_words_hour_about_plural: asi %d hodin
-actionview_datehelper_time_in_words_hour_about_single: asi hodinu
-actionview_datehelper_time_in_words_minute: 1 minuta
-actionview_datehelper_time_in_words_minute_half: p&#367;l minuty
-actionview_datehelper_time_in_words_minute_less_than: m&#233;n&#283; ne&#382; minutu
-actionview_datehelper_time_in_words_minute_plural: %d minut
-actionview_datehelper_time_in_words_minute_single: 1 minuta
-actionview_datehelper_time_in_words_second_less_than: m&#233;n&#283; ne&#382; sekunda
-actionview_datehelper_time_in_words_second_less_than_plural: m&#233;n&#283; ne&#382; %d sekund
+actionview_datehelper_time_in_words_hour_about: asi hodinou
+actionview_datehelper_time_in_words_hour_about_plural: asi %d hodinami
+actionview_datehelper_time_in_words_hour_about_single: asi hodinou
+actionview_datehelper_time_in_words_minute: 1 minutou
+actionview_datehelper_time_in_words_minute_half: p&#367;l minutou
+actionview_datehelper_time_in_words_minute_less_than: m&#233;n&#283; ne&#382; minutou
+actionview_datehelper_time_in_words_minute_plural: %d minutami
+actionview_datehelper_time_in_words_minute_single: 1 minutou
+actionview_datehelper_time_in_words_second_less_than: m&#233;n&#283; ne&#382; sekundou
+actionview_datehelper_time_in_words_second_less_than_plural: m&#233;n&#283; ne&#382; %d sekundami
 actionview_instancetag_blank_option: Pros&#237;m vyberte
 
 activerecord_error_inclusion: nen&#237; zahrnuto v seznamu
@@ -98,7 +98,7 @@ mail_body_account_activation_request: Byl zaregistrov&#225;n nov&#253; u&#382;ivatel &quot;%s&quot;. A
 gui_validation_error: 1 chyba
 gui_validation_error_plural: %d chyb(y)
 
-field_name: Jm&#233;no
+field_name: N&#225;zev
 field_description: Popis
 field_summary: P&#345;ehled
 field_is_required: Povinn&#233; pole
@@ -306,7 +306,7 @@ label_attribute: Atribut
 label_attribute_plural: Atributy
 label_download: %d Download
 label_download_plural: %d Downloads
-label_no_data: &#381;&#225;dn&#225; data k zobrazen&#237;
+label_no_data: &#381;&#225;dn&#233; polo&#382;ky
 label_change_status: Zm&#283;nit stav
 label_history: Historie
 label_attachment: Soubor
@@ -480,8 +480,8 @@ label_sort_by: Se&#345;adit podle %s
 label_send_test_email: Poslat testovac&#237; email
 label_feeds_access_key_created_on: P&#345;&#237;stupov&#253; kl&#237;&#269; pro RSS byl vytvo&#345;en p&#345;ed %s
 label_module_plural: Moduly
-label_added_time_by: 'P&#345;id&#225;no p&#345;ed: %s %s'
-label_updated_time: 'Aktualizov&#225;no p&#345;ed: %s'
+label_added_time_by: 'P&#345;id&#225;no u&#382;ivatelem %s p&#345;ed %s'
+label_updated_time: 'Aktualizov&#225;no p&#345;ed %s'
 label_jump_to_a_project: Zvolit projekt...
 label_file_plural: Soubory
 label_changeset_plural: Changesety
@@ -586,7 +586,7 @@ text_no_configuration_data: &quot;Role, fronty, stavy &#250;kol&#367; ani workflow nebyly zat
 text_load_default_configuration: Nahr&#225;t v&#253;choz&#237; konfiguraci
 text_status_changed_by_changeset: Pou&#382;ito v changesetu %s.
 text_issues_destroy_confirmation: 'Opravdu si p&#345;ejete odstranit v&#353;echny zvolen&#233; &#250;koly?'
-text_select_project_modules: 'Zvolte moduly aktivn&#237; v tomto projektu:'
+text_select_project_modules: 'Aktivn&#237; moduly v tomto projektu:'
 text_default_administrator_account_changed: V&#253;choz&#237; nastaven&#237; administr&#225;torsk&#233;ho &#250;&#269;tu zm&#283;n&#283;no
 text_file_repository_writable: Povolen z&#225;pis do repository
 text_rmagick_available: RMagick k dispozici (voliteln&#233;)
@@ -620,5 +620,6 @@ default_activity_development: V&#253;voj
 enumeration_issue_priorities: Priority &#250;kol&#367;
 enumeration_doc_categories: Kategorie dokument&#367;
 enumeration_activities: Aktivity (sledov&#225;n&#237; &#269;asu)
-error_scm_annotate: &quot;The entry does not exist or can not be annotated.&quot;
-label_planning: Planning
+error_scm_annotate: &quot;Polo&#382;ka neexistuje nebo nem&#367;&#382;e b&#253;t komentov&#225;na.&quot;
+label_planning: Pl&#225;nov&#225;n&#237;
+text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'</diff>
      <filename>lang/cs.yml</filename>
    </modified>
    <modified>
      <diff>@@ -619,3 +619,4 @@ label_overall_activity: Overordnet aktivitet
 setting_default_projects_public: Nye projekter er offentlige som default
 error_scm_annotate: &quot;The entry does not exist or can not be annotated.&quot;
 label_planning: Planl&#230;gning
+text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'</diff>
      <filename>lang/da.yml</filename>
    </modified>
    <modified>
      <diff>@@ -71,7 +71,7 @@ notice_locking_conflict: Datum wurde von einem anderen Benutzer ge&#228;ndert.
 notice_not_authorized: Sie sind nicht berechtigt, auf diese Seite zuzugreifen.
 notice_email_sent: Eine E-Mail wurde an %s gesendet.
 notice_email_error: Beim Senden einer E-Mail ist ein Fehler aufgetreten (%s).
-notice_feeds_access_key_reseted: Ihr RSS-Zugriffsschl&#252;ssel wurde zur&#252;ckgesetzt.
+notice_feeds_access_key_reseted: Ihr Atom-Zugriffsschl&#252;ssel wurde zur&#252;ckgesetzt.
 notice_failed_to_save_issues: &quot;%d von %d ausgew&#228;hlten Tickets konnte(n) nicht gespeichert werden: %s.&quot;
 notice_no_issue_selected: &quot;Kein Ticket ausgew&#228;hlt! Bitte w&#228;hlen Sie die Tickets, die Sie bearbeiten m&#246;chten.&quot;
 notice_account_pending: &quot;Ihr Konto wurde erstellt und wartet jetzt auf die Genehmigung des Administrators.&quot;
@@ -80,6 +80,7 @@ notice_default_data_loaded: Die Standard-Konfiguration wurde erfolgreich geladen
 error_can_t_load_default_data: &quot;Die Standard-Konfiguration konnte nicht geladen werden: %s&quot;
 error_scm_not_found: Eintrag und/oder Revision besteht nicht im Projektarchiv.
 error_scm_command_failed: &quot;Beim Zugriff auf das Projektarchiv ist ein Fehler aufgetreten: %s&quot;
+error_scm_annotate: &quot;Der Eintrag existiert nicht oder kann nicht annotiert werden.&quot;
 error_issue_not_found_in_project: 'Das Ticket wurde nicht gefunden oder geh&#246;rt nicht zu diesem Projekt.'
 
 mail_subject_lost_password: Ihr %s Kennwort
@@ -120,8 +121,8 @@ field_project: Projekt
 field_issue: Ticket
 field_status: Status
 field_notes: Kommentare
-field_is_closed: Problem erledigt
-field_is_default: Default
+field_is_closed: Ticket geschlossen
+field_is_default: Standardeinstellung
 field_tracker: Tracker
 field_subject: Thema
 field_due_date: Abgabedatum
@@ -133,8 +134,8 @@ field_role: Rolle
 field_homepage: Projekt-Homepage
 field_is_public: &#214;ffentlich
 field_parent: Unterprojekt von
-field_is_in_chlog: Ansicht im Change-Log
-field_is_in_roadmap: Ansicht in der Roadmap
+field_is_in_chlog: Im Change-Log anzeigen
+field_is_in_roadmap: In der Roadmap anzeigen
 field_login: Mitgliedsname
 field_mail_notification: Mailbenachrichtigung
 field_admin: Administrator
@@ -177,6 +178,7 @@ field_column_names: Spalten
 field_time_zone: Zeitzone
 field_searchable: Durchsuchbar
 field_default_value: Standardwert
+field_comments_sorting: Kommentare anzeigen
 
 setting_app_title: Applikations-Titel
 setting_app_subtitle: Applikations-Untertitel
@@ -191,7 +193,8 @@ setting_bcc_recipients: E-Mails als Blindkopie (BCC) senden
 setting_host_name: Hostname
 setting_text_formatting: Textformatierung
 setting_wiki_compression: Wiki-Historie komprimieren
-setting_feeds_limit: Feed-Inhalt begrenzen
+setting_feeds_limit: Max. Anzahl Eintr&#228;ge pro Atom-Feed
+setting_default_projects_public: Neue Projekte sind standardm&#228;&#223;ig &#246;ffentlich
 setting_autofetch_changesets: Changesets automatisch abrufen
 setting_sys_api_enabled: Webservice zur Verwaltung der Projektarchive benutzen
 setting_commit_ref_keywords: Schl&#252;sselw&#246;rter (Beziehungen)
@@ -206,6 +209,8 @@ setting_emails_footer: E-Mail-Fu&#223;zeile
 setting_protocol: Protokoll
 setting_per_page_options: Objekte pro Seite
 setting_user_format: Benutzer-Anzeigeformat
+setting_activity_days_default: Anzahl Tage pro Seite der Projekt-Aktivit&#228;t
+setting_display_subprojects_issues: Tickets von Unterprojekten im Hauptprojekt anzeigen
 
 project_module_issue_tracking: Ticket-Verfolgung
 project_module_time_tracking: Zeiterfassung
@@ -227,7 +232,7 @@ label_project_latest: Neueste Projekte
 label_issue: Ticket
 label_issue_new: Neues Ticket
 label_issue_plural: Tickets
-label_issue_view_all: Alle Tickets ansehen
+label_issue_view_all: Alle Tickets anzeigen
 label_issues_by: Tickets von %s
 label_issue_added: Ticket hinzugef&#252;gt
 label_issue_updated: Ticket aktualisiert
@@ -277,6 +282,7 @@ label_last_updates: zuletzt aktualisiert
 label_last_updates_plural: %d zuletzt aktualisierten
 label_registered_on: Angemeldet am
 label_activity: Aktivit&#228;t
+label_overall_activity: Aktivit&#228;t aller Projekte anzeigen
 label_new: Neu
 label_logged_as: Angemeldet als
 label_environment: Environment
@@ -320,7 +326,7 @@ label_version: Version
 label_version_new: Neue Version
 label_version_plural: Versionen
 label_confirmation: Best&#228;tigung
-label_export_to: Export zu
+label_export_to: &quot;Auch abrufbar als:&quot;
 label_read: Lesen...
 label_public_projects: &#214;ffentliche Projekte
 label_open_issues: offen
@@ -345,7 +351,7 @@ label_months_from: Monate ab
 label_gantt: Gantt
 label_internal: Intern
 label_last_changes: %d letzte &#196;nderungen
-label_change_view_all: Alle &#196;nderungen ansehen
+label_change_view_all: Alle &#196;nderungen anzeigen
 label_personalize_page: Diese Seite anpassen
 label_comment: Kommentar
 label_comment_plural: Kommentare
@@ -469,7 +475,7 @@ label_date_to: Bis
 label_language_based: Sprachabh&#228;ngig
 label_sort_by: Sortiert nach %s
 label_send_test_email: Test-E-Mail senden
-label_feeds_access_key_created_on: RSS-Zugriffsschl&#252;ssel vor %s erstellt
+label_feeds_access_key_created_on: Atom-Zugriffsschl&#252;ssel vor %s erstellt
 label_module_plural: Module
 label_added_time_by: Von %s vor %s hinzugef&#252;gt
 label_updated_time: Vor %s aktualisiert
@@ -500,6 +506,10 @@ label_ldap_authentication: LDAP-Authentifizierung
 label_downloads_abbr: D/L
 label_optional_description: Beschreibung (optional)
 label_add_another_file: Eine weitere Datei hinzuf&#252;gen
+label_preferences: Pr&#228;ferenzen
+label_chronological_order: in zeitlicher Reihenfolge
+label_reverse_chronological_order: in umgekehrter zeitlicher Reihenfolge
+label_planning: Terminplanung
 
 button_login: Anmelden
 button_submit: OK
@@ -518,7 +528,7 @@ button_lock: Sperren
 button_unlock: Entsperren
 button_download: Download
 button_list: Liste
-button_view: Ansehen
+button_view: Anzeigen
 button_move: Verschieben
 button_back: Zur&#252;ck
 button_cancel: Abbrechen
@@ -535,7 +545,7 @@ button_reset: Zur&#252;cksetzen
 button_rename: Umbenennen
 button_change_password: Kennwort &#228;ndern
 button_copy: Kopieren
-button_annotate: Mit Anmerkungen versehen
+button_annotate: Annotieren
 button_update: Aktualisieren
 button_configure: Konfigurieren
 
@@ -608,13 +618,4 @@ default_activity_development: Entwicklung
 enumeration_issue_priorities: Ticket-Priorit&#228;ten
 enumeration_doc_categories: Dokumentenkategorien
 enumeration_activities: Aktivit&#228;ten (Zeiterfassung)
-setting_activity_days_default: Days displayed on project activity
-label_chronological_order: In chronological order
-field_comments_sorting: Display comments
-label_reverse_chronological_order: In reverse chronological order
-label_preferences: Preferences
-setting_display_subprojects_issues: Display subprojects issues on main projects by default
-label_overall_activity: Overall activity
-setting_default_projects_public: New projects are public by default
-error_scm_annotate: &quot;The entry does not exist or can not be annotated.&quot;
-label_planning: Planning
+text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'</diff>
      <filename>lang/de.yml</filename>
    </modified>
    <modified>
      <diff>@@ -557,6 +557,7 @@ text_select_mail_notifications: Select actions for which email notifications sho
 text_regexp_info: eg. ^[A-Z0-9]+$
 text_min_max_length_info: 0 means no restriction
 text_project_destroy_confirmation: Are you sure you want to delete this project and related data ?
+text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'
 text_workflow_edit: Select a role and a tracker to edit the workflow
 text_are_you_sure: Are you sure ?
 text_journal_changed: changed from %s to %s</diff>
      <filename>lang/en.yml</filename>
    </modified>
    <modified>
      <diff>@@ -333,8 +333,8 @@ label_revision_plural: Revisiones
 label_added: a&#241;adido
 label_modified: modificado
 label_deleted: suprimido
-label_latest_revision: La revisi&#243;n m&#225;s actual
-label_latest_revision_plural: Las revisiones m&#225;s actuales
+label_latest_revision: &#218;ltima revisi&#243;n
+label_latest_revision_plural: &#218;ltimas revisiones
 label_view_revisions: Ver las revisiones
 label_max_size: Tama&#241;o m&#225;ximo
 label_on: de
@@ -372,7 +372,7 @@ label_view_diff: Ver diferencias
 label_diff_inline: en l&#237;nea
 label_diff_side_by_side: cara a cara
 label_options: Opciones
-label_copy_workflow_from: Copiar workflow desde
+label_copy_workflow_from: Copiar flujo de trabajo desde
 label_permissions_report: Informe de permisos
 label_watched_issues: Peticiones monitorizadas 
 label_related_issues: Peticiones relacionadas
@@ -432,7 +432,7 @@ button_move: Mover
 button_back: Atr&#225;s
 button_cancel: Cancelar
 button_activate: Activar
-button_sort: Clasificar
+button_sort: Ordenar
 button_log_time: Tiempo dedicado
 button_rollback: Volver a esta versi&#243;n
 button_watch: Monitorizar
@@ -448,7 +448,7 @@ status_locked: bloqueado
 text_select_mail_notifications: Seleccionar los eventos a notificar
 text_regexp_info: eg. ^[A-Z0-9]+$
 text_min_max_length_info: 0 para ninguna restricci&#243;n
-text_project_destroy_confirmation: &#191; Est&#225;s seguro de querer eliminar el proyecto ?
+text_project_destroy_confirmation: &#191;Est&#225;s seguro de querer eliminar el proyecto?
 text_workflow_edit: Seleccionar un flujo de trabajo para actualizar
 text_are_you_sure: &#191; Est&#225;s seguro ?
 text_journal_changed: cambiado de %s a %s
@@ -460,7 +460,7 @@ text_tip_task_begin_end_day: tarea que comienza y termina este d&#237;a
 text_project_identifier_info: 'Letras min&#250;sculas (a-z), n&#250;meros y signos de puntuaci&#243;n permitidos.&lt;br /&gt;Una vez guardado, el identificador no puede modificarse.'
 text_caracters_maximum: %d car&#225;cteres como m&#225;ximo.
 text_length_between: Longitud entre %d y %d car&#225;cteres.
-text_tracker_no_workflow: No hay ning&#250;n workflow definido para este tracker
+text_tracker_no_workflow: No hay ning&#250;n flujo de trabajo definido para este tracker
 text_unallowed_characters: Car&#225;cteres no permitidos
 text_comma_separated: M&#250;ltiples valores permitidos (separados por coma).
 text_issues_ref_in_commit_messages: Referencia y petici&#243;n de correcci&#243;n en los mensajes
@@ -559,64 +559,65 @@ field_searchable: Incluir en las b&#250;squedas
 label_display_per_page: 'Por p&#225;gina: %s'
 setting_per_page_options: Objetos por p&#225;gina
 label_age: Edad
-notice_default_data_loaded: Default configuration successfully loaded.
-text_load_default_configuration: Load the default configuration
-text_no_configuration_data: &quot;Roles, trackers, issue statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded.&quot;
-error_can_t_load_default_data: &quot;Default configuration could not be loaded: %s&quot;
-button_update: Update
-label_change_properties: Change properties
+notice_default_data_loaded: Configuraci&#243;n por defecto cargada correctamente.
+text_load_default_configuration: Cargar la configuraci&#243;n por defecto
+text_no_configuration_data: &quot;Todav&#237;a no se han configurado roles, ni trackers, ni estados y flujo de trabajo asociado a peticiones. Se recomiendo encarecidamente cargar la configuraci&#243;n por defecto. Una vez cargada, podr&#225; modificarla.&quot; 
+error_can_t_load_default_data: &quot;No se ha podido cargar la configuraci&#243;n por defecto: %s&quot; 
+button_update: Actualizar
+label_change_properties: Cambiar propiedades
 label_general: General
-label_repository_plural: Repositories
-label_associated_revisions: Associated revisions
-setting_user_format: Users display format
-text_status_changed_by_changeset: Applied in changeset %s.
-label_more: More
-text_issues_destroy_confirmation: 'Are you sure you want to delete the selected issue(s) ?'
+label_repository_plural: Repositorios
+label_associated_revisions: Revisiones asociadas
+setting_user_format: Formato de nombre de usuario
+text_status_changed_by_changeset: Aplicado en los cambios %s
+label_more: M&#225;s
+text_issues_destroy_confirmation: '&#191;Seguro que quiere borrar las peticiones seleccionadas?'
 label_scm: SCM
-text_select_project_modules: 'Select modules to enable for this project:'
-label_issue_added: Issue added
-label_issue_updated: Issue updated
-label_document_added: Document added
-label_message_posted: Message added
-label_file_added: File added
-label_news_added: News added
-project_module_boards: Boards
-project_module_issue_tracking: Issue tracking
+text_select_project_modules: 'Seleccione los m&#243;dulos a activar para este proyecto:'
+label_issue_added: Petici&#243;n a&#241;adida
+label_issue_updated: Petici&#243;n actualizada
+label_document_added: Documento a&#241;adido
+label_message_posted: Mensaje a&#241;adido
+label_file_added: Fichero a&#241;adido
+label_news_added: Noticia a&#241;adida
+project_module_boards: Foros
+project_module_issue_tracking: Peticiones
 project_module_wiki: Wiki
-project_module_files: Files
-project_module_documents: Documents
-project_module_repository: Repository
-project_module_news: News
-project_module_time_tracking: Time tracking
-text_file_repository_writable: File repository writable
-text_default_administrator_account_changed: Default administrator account changed
-text_rmagick_available: RMagick available (optional)
-button_configure: Configure
+project_module_files: Ficheros
+project_module_documents: Documentos
+project_module_repository: Repositorio
+project_module_news: Noticias
+project_module_time_tracking: Control de tiempo
+text_file_repository_writable: Se puede escribir en el repositorio
+text_default_administrator_account_changed: Cuenta de administrador por defecto modificada
+text_rmagick_available: RMagick disponible (opcional)
+button_configure: Configurar
 label_plugins: Plugins
-label_ldap_authentication: LDAP authentication
+label_ldap_authentication: Autenticaci&#243;n LDAP
 label_downloads_abbr: D/L
-label_this_month: this month
-label_last_n_days: last %d days
-label_all_time: all time
-label_this_year: this year
-label_date_range: Date range
-label_last_week: last week
-label_yesterday: yesterday
-label_last_month: last month
-label_add_another_file: Add another file
-label_optional_description: Optional description
-text_destroy_time_entries_question: %.02f hours were reported on the issues you are about to delete. What do you want to do ?
-error_issue_not_found_in_project: 'The issue was not found or does not belong to this project'
-text_assign_time_entries_to_project: Assign reported hours to the project
-text_destroy_time_entries: Delete reported hours
-text_reassign_time_entries: 'Reassign reported hours to this issue:'
-setting_activity_days_default: Days displayed on project activity
-label_chronological_order: In chronological order
-field_comments_sorting: Display comments
-label_reverse_chronological_order: In reverse chronological order
-label_preferences: Preferences
-setting_display_subprojects_issues: Display subprojects issues on main projects by default
-label_overall_activity: Overall activity
-setting_default_projects_public: New projects are public by default
-error_scm_annotate: &quot;The entry does not exist or can not be annotated.&quot;
-label_planning: Planning
+label_this_month: este mes
+label_last_n_days: &#250;ltimos %d d&#237;as
+label_all_time: todo el tiempo
+label_this_year: este a&#241;o
+label_date_range: Rango de fechas
+label_last_week: &#250;ltima semana
+label_yesterday: ayer
+label_last_month: &#250;ltimo mes
+label_add_another_file: A&#241;adir otro fichero
+label_optional_description: Descripci&#243;n opcional
+text_destroy_time_entries_question: Existen %.02f horas asignadas a la petici&#243;n que quiere borrar. &#191;Qu&#233; quiere hacer ?
+error_issue_not_found_in_project: 'La petici&#243;n no se encuentra o no est&#225; asociada a este proyecto'
+text_assign_time_entries_to_project: Asignar las horas al proyecto
+text_destroy_time_entries: Borrar las horas
+text_reassign_time_entries: 'Reasignar las horas a esta petici&#243;n:'
+setting_activity_days_default: D&#237;as a mostrar en la actividad de proyecto
+label_chronological_order: En orden cronol&#243;gico
+field_comments_sorting: Mostrar comentarios
+label_reverse_chronological_order: En orden cronol&#243;gico inverso
+label_preferences: Preferencias
+setting_display_subprojects_issues: Mostrar peticiones de un subproyecto en el proyecto padre por defecto 
+label_overall_activity: Actividad global
+setting_default_projects_public: Los proyectos nuevos son p&#250;blicos por defecto 
+error_scm_annotate: &quot;No existe la entrada o no ha podido ser anotada&quot;
+label_planning: Planificaci&#243;n
+text_subprojects_destroy_warning: 'Sus subprojectos: %s tambi&#233;n se eliminar&#225;n' </diff>
      <filename>lang/es.yml</filename>
    </modified>
    <modified>
      <diff>@@ -614,6 +614,7 @@ field_comments_sorting: N&#228;yt&#228; kommentit
 label_reverse_chronological_order: K&#228;&#228;nteisess&#228; aikaj&#228;rjestyksess&#228;
 label_preferences: Asetukset
 setting_default_projects_public: Uudet projektit ovat oletuksena julkisia
-label_overall_activity: Kokonaisaktiviteetti
-error_scm_annotate: &quot;The entry does not exist or can not be annotated.&quot;
-label_planning: Planning
+label_overall_activity: Kokonaishistoria
+error_scm_annotate: &quot;Merkint&#228;&#228; ei ole tai siihen ei voi lis&#228;t&#228; selityksi&#228;.&quot;
+label_planning: Suunnittelu
+text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'</diff>
      <filename>lang/fi.yml</filename>
    </modified>
    <modified>
      <diff>@@ -556,7 +556,8 @@ status_locked: v&#233;rouill&#233;
 text_select_mail_notifications: Actions pour lesquelles une notification par e-mail est envoy&#233;e
 text_regexp_info: ex. ^[A-Z0-9]+$
 text_min_max_length_info: 0 pour aucune restriction
-text_project_destroy_confirmation: Etes-vous s&#251;r de vouloir supprimer ce projet et tout ce qui lui est rattach&#233; ?
+text_project_destroy_confirmation: Etes-vous s&#251;r de vouloir supprimer ce projet et toutes ses donn&#233;es ?
+text_subprojects_destroy_warning: 'Ses sous-projets: %s seront &#233;galement supprim&#233;s.'
 text_workflow_edit: S&#233;lectionner un tracker et un r&#244;le pour &#233;diter le workflow
 text_are_you_sure: Etes-vous s&#251;r ?
 text_journal_changed: chang&#233; de %s &#224; %s</diff>
      <filename>lang/fr.yml</filename>
    </modified>
    <modified>
      <diff>@@ -76,7 +76,7 @@ notice_failed_to_save_issues: &quot;&#1504;&#1499;&#1513;&#1512;&#1514; &#1489;&#1513;&#1502;&#1497;&#1512;&#1514; %d &#1504;&#1493;&#1513;&#1488;\&#1497;&#1501; &#1489; %d &#1504;
 notice_no_issue_selected: &quot;&#1500;&#1488; &#1504;&#1489;&#1495;&#1512; &#1488;&#1507; &#1504;&#1493;&#1513;&#1488;! &#1489;&#1495;&#1512; &#1489;&#1489;&#1511;&#1513;&#1492; &#1488;&#1514; &#1492;&#1504;&#1493;&#1513;&#1488;&#1497;&#1501; &#1513;&#1489;&#1512;&#1510;&#1493;&#1504;&#1498; &#1500;&#1506;&#1512;&#1493;&#1498;.&quot;
 
 error_scm_not_found: &#1499;&#1504;&#1497;&#1505;&#1492; &#1493;\&#1488;&#1493; &#1490;&#1497;&#1512;&#1505;&#1488; &#1488;&#1497;&#1504;&#1501; &#1511;&#1497;&#1497;&#1502;&#1497;&#1501; &#1489;&#1502;&#1488;&#1490;&#1512;.
-error_scm_command_failed: &quot;An error occurred when trying to access the repository: %s&quot;
+error_scm_command_failed: &quot;&#1488;&#1512;&#1506;&#1492; &#1513;&#1490;&#1497;&#1488;&#1492; &#1489;&#1506;&#1514; &#1504;&#1497;&#1505;&#1493;&#1503; &#1490;&#1497;&#1513;&#1492; &#1500;&#1502;&#1488;&#1490;&#1512;: %s&quot;
 
 mail_subject_lost_password: &#1505;&#1497;&#1505;&#1502;&#1514; &#1492;-%s &#1513;&#1500;&#1498;
 mail_body_lost_password: '&#1500;&#1513;&#1497;&#1504;&#1493; &#1505;&#1497;&#1505;&#1502;&#1514; &#1492;-Redmine &#1513;&#1500;&#1498;,&#1500;&#1495;&#1509; &#1506;&#1500; &#1492;&#1511;&#1497;&#1513;&#1493;&#1512; &#1492;&#1489;&#1488;:'
@@ -98,7 +98,7 @@ field_filesize: &#1490;&#1493;&#1491;&#1500;
 field_downloads: &#1492;&#1493;&#1512;&#1491;&#1493;&#1514;
 field_author: &#1499;&#1493;&#1514;&#1489;
 field_created_on: &#1504;&#1493;&#1510;&#1512;
-field_updated_on: &#1506;&#1493;&#1491;&#1490;&#1503;
+field_updated_on: &#1506;&#1493;&#1491;&#1499;&#1503;
 field_field_format: &#1508;&#1493;&#1512;&#1502;&#1496;
 field_is_for_all: &#1500;&#1499;&#1500; &#1492;&#1508;&#1512;&#1493;&#1497;&#1511;&#1496;&#1497;&#1501;
 field_possible_values: &#1506;&#1512;&#1499;&#1497;&#1501; &#1488;&#1508;&#1513;&#1512;&#1497;&#1497;&#1501;
@@ -119,7 +119,7 @@ field_subject: &#1513;&#1501; &#1504;&#1493;&#1513;&#1488;
 field_due_date: &#1514;&#1488;&#1512;&#1497;&#1498; &#1505;&#1497;&#1493;&#1501;
 field_assigned_to: &#1502;&#1493;&#1510;&#1489; &#1500;
 field_priority: &#1506;&#1491;&#1497;&#1508;&#1493;&#1514;
-field_fixed_version: Target version
+field_fixed_version: &#1490;&#1497;&#1512;&#1505;&#1488;&#1514; &#1497;&#1506;&#1491;
 field_user: &#1502;&#1514;&#1513;&#1502;&#1513;
 field_role: &#1514;&#1508;&#1511;&#1497;&#1491;
 field_homepage: &#1491;&#1507; &#1492;&#1489;&#1497;&#1514;
@@ -140,7 +140,7 @@ field_version: &#1490;&#1497;&#1512;&#1505;&#1488;
 field_type: &#1505;&#1493;&#1490;
 field_host: &#1513;&#1512;&#1514;
 field_port: &#1508;&#1493;&#1512;&#1496;
-field_account: &#1495;&#1513;&#1489;&#1493;&#1501;
+field_account: &#1495;&#1513;&#1489;&#1493;&#1503;
 field_base_dn: &#1489;&#1505;&#1497;&#1505; DN
 field_attr_login: &#1514;&#1499;&#1493;&#1504;&#1514; &#1492;&#1514;&#1495;&#1489;&#1512;&#1493;&#1514;
 field_attr_firstname: &#1514;&#1499;&#1493;&#1504;&#1514; &#1513;&#1501; &#1508;&#1512;&#1496;&#1497;&#1501;
@@ -182,7 +182,7 @@ setting_text_formatting: &#1506;&#1497;&#1510;&#1493;&#1489; &#1496;&#1511;&#1505;&#1496;
 setting_wiki_compression: &#1499;&#1497;&#1493;&#1493;&#1509; &#1492;&#1497;&#1505;&#1496;&#1493;&#1512;&#1497;&#1514; WIKI
 setting_feeds_limit: &#1490;&#1489;&#1493;&#1500; &#1514;&#1493;&#1499;&#1503; &#1492;&#1494;&#1504;&#1493;&#1514;
 setting_autofetch_changesets: &#1502;&#1513;&#1497;&#1499;&#1492; &#1488;&#1493;&#1496;&#1493;&#1502;&#1514;&#1497; &#1513;&#1500; &#1506;&#1497;&#1491;&#1499;&#1493;&#1504;&#1497;&#1501;
-setting_sys_api_enabled: Enable WS for repository management
+setting_sys_api_enabled: &#1488;&#1508;&#1513;&#1512; WS &#1500;&#1504;&#1497;&#1492;&#1493;&#1500; &#1492;&#1502;&#1488;&#1490;&#1512;
 setting_commit_ref_keywords: &#1502;&#1497;&#1500;&#1493;&#1514; &#1502;&#1508;&#1514;&#1495; &#1502;&#1511;&#1513;&#1512;&#1493;&#1514;
 setting_commit_fix_keywords: &#1502;&#1497;&#1500;&#1493;&#1514; &#1502;&#1508;&#1514;&#1495; &#1502;&#1514;&#1511;&#1504;&#1493;&#1514;
 setting_autologin: &#1495;&#1497;&#1489;&#1493;&#1512; &#1488;&#1493;&#1496;&#1493;&#1502;&#1496;&#1497;
@@ -233,7 +233,7 @@ label_information_plural: &#1502;&#1497;&#1491;&#1506;
 label_please_login: &#1492;&#1514;&#1495;&#1489;&#1512; &#1489;&#1489;&#1511;&#1513;&#1492;
 label_register: &#1492;&#1512;&#1513;&#1502;&#1492;
 label_password_lost: &#1488;&#1489;&#1491;&#1492; &#1492;&#1505;&#1497;&#1505;&#1502;&#1492;?
-label_home: &#1491;&#1498; &#1492;&#1489;&#1497;&#1514;
+label_home: &#1491;&#1507; &#1492;&#1489;&#1497;&#1514;
 label_my_page: &#1492;&#1491;&#1507; &#1513;&#1500;&#1497;
 label_my_account: &#1492;&#1513;&#1489;&#1493;&#1503; &#1513;&#1500;&#1497;
 label_my_projects: &#1492;&#1508;&#1512;&#1493;&#1497;&#1511;&#1496;&#1497;&#1501; &#1513;&#1500;&#1497;
@@ -259,7 +259,7 @@ label_subproject_plural: &#1514;&#1514;-&#1508;&#1512;&#1493;&#1497;&#1511;&#1496;&#1497;&#1501;
 label_min_max_length: &#1488;&#1493;&#1512;&#1498; &#1502;&#1497;&#1504;&#1497;&#1502;&#1488;&#1500;&#1497; - &#1502;&#1511;&#1505;&#1497;&#1502;&#1488;&#1500;&#1497;
 label_list: &#1512;&#1513;&#1497;&#1502;&#1492;
 label_date: &#1514;&#1488;&#1512;&#1497;&#1498;
-label_integer: &#1502;&#1505;&#1508;&#1512; &#1513;&#1500;&#1497;&#1501;
+label_integer: &#1502;&#1505;&#1508;&#1512; &#1513;&#1500;&#1501;
 label_boolean: &#1506;&#1512;&#1498; &#1489;&#1493;&#1500;&#1497;&#1488;&#1504;&#1497;
 label_string: &#1496;&#1511;&#1505;&#1496;
 label_text: &#1496;&#1511;&#1505;&#1496; &#1488;&#1512;&#1493;&#1498;
@@ -269,7 +269,7 @@ label_download: &#1492;&#1493;&#1512;&#1491;&#1492; %d
 label_download_plural: %d &#1492;&#1493;&#1512;&#1491;&#1493;&#1514;
 label_no_data: &#1488;&#1497;&#1503; &#1502;&#1497;&#1491;&#1506; &#1500;&#1492;&#1510;&#1497;&#1490;
 label_change_status: &#1513;&#1504;&#1492; &#1502;&#1510;&#1489;
-label_history: &#1492;&#1497;&#1491;&#1496;&#1493;&#1512;&#1497;&#1492;
+label_history: &#1492;&#1497;&#1505;&#1496;&#1493;&#1512;&#1497;&#1492;
 label_attachment: &#1511;&#1493;&#1489;&#1509;
 label_attachment_new: &#1511;&#1493;&#1489;&#1509; &#1495;&#1491;&#1513;
 label_attachment_delete: &#1502;&#1495;&#1511; &#1511;&#1493;&#1489;&#1509;
@@ -279,7 +279,7 @@ label_report_plural: &#1491;&#1493;&quot;&#1495;&#1493;&#1514;
 label_news: &#1495;&#1491;&#1513;&#1493;&#1514;
 label_news_new: &#1492;&#1493;&#1505;&#1507; &#1495;&#1491;&#1513;&#1493;&#1514;
 label_news_plural: &#1495;&#1491;&#1513;&#1493;&#1514;
-label_news_latest: &#1495;&#1491;&#1513;&#1493;&#1514; &#1495;&#1491;&#1513;&#1493;&#1514;
+label_news_latest: &#1495;&#1491;&#1513;&#1493;&#1514; &#1488;&#1495;&#1512;&#1493;&#1504;&#1493;&#1514;
 label_news_view_all: &#1510;&#1508;&#1492; &#1489;&#1499;&#1500; &#1492;&#1495;&#1491;&#1513;&#1493;&#1514;
 label_change_log: &#1491;&#1493;&quot;&#1495; &#1513;&#1497;&#1504;&#1493;&#1497;&#1497;&#1501;
 label_settings: &#1492;&#1490;&#1491;&#1512;&#1493;&#1514;
@@ -419,7 +419,7 @@ label_reply_plural: &#1492;&#1513;&#1489;&#1493;&#1514;
 label_send_information: &#1513;&#1500;&#1495; &#1502;&#1497;&#1491;&#1506; &#1506;&#1500; &#1495;&#1513;&#1489;&#1493;&#1503; &#1500;&#1502;&#1513;&#1514;&#1502;&#1513;
 label_year: &#1513;&#1504;&#1492;
 label_month: &#1495;&#1493;&#1491;&#1513;
-label_week: &#1513;&#1489;&#1493;
+label_week: &#1513;&#1489;&#1493;&#1506;
 label_date_from: &#1502;&#1488;&#1514;
 label_date_to: &#1488;&#1500;
 label_language_based: &#1502;&#1489;&#1493;&#1505;&#1505; &#1513;&#1508;&#1492;
@@ -444,7 +444,7 @@ button_save: &#1513;&#1502;&#1493;&#1512;
 button_check_all: &#1489;&#1495;&#1512; &#1492;&#1499;&#1500;
 button_uncheck_all: &#1489;&#1495;&#1512; &#1499;&#1500;&#1493;&#1501;
 button_delete: &#1502;&#1495;&#1511;
-button_create: &#1510;&#1493;&#1511;
+button_create: &#1510;&#1493;&#1512;
 button_test: &#1489;&#1491;&#1493;&#1511;
 button_edit: &#1506;&#1512;&#1493;&#1498;
 button_add: &#1492;&#1493;&#1505;&#1507;
@@ -454,13 +454,13 @@ button_clear: &#1504;&#1511;&#1492;
 button_lock: &#1504;&#1506;&#1500;
 button_unlock: &#1489;&#1496;&#1500; &#1504;&#1506;&#1497;&#1500;&#1492;
 button_download: &#1492;&#1493;&#1512;&#1491;
-button_list: &#1511;&#1513;&#1497;&#1502;&#1492;
+button_list: &#1512;&#1513;&#1497;&#1502;&#1492;
 button_view: &#1510;&#1508;&#1492;
 button_move: &#1492;&#1494;&#1494;
 button_back: &#1492;&#1511;&#1493;&#1491;&#1501;
 button_cancel: &#1489;&#1496;&#1495;
 button_activate: &#1492;&#1508;&#1506;&#1500;
-button_sort: &#1502;&#1497;&#1503;
+button_sort: &#1502;&#1497;&#1497;&#1503;
 button_log_time: &#1494;&#1502;&#1503; &#1500;&#1493;&#1490;
 button_rollback: &#1495;&#1494;&#1493;&#1512; &#1500;&#1490;&#1497;&#1512;&#1505;&#1488; &#1494;&#1493;
 button_watch: &#1510;&#1508;&#1492;
@@ -526,94 +526,95 @@ default_activity_development: &#1508;&#1497;&#1514;&#1493;&#1495;
 enumeration_issue_priorities: &#1506;&#1491;&#1497;&#1508;&#1493;&#1514; &#1504;&#1493;&#1513;&#1488;&#1497;&#1501;
 enumeration_doc_categories: &#1511;&#1496;&#1490;&#1493;&#1512;&#1497;&#1493;&#1514; &#1502;&#1505;&#1502;&#1499;&#1497;&#1501;
 enumeration_activities: &#1508;&#1506;&#1497;&#1500;&#1493;&#1497;&#1493;&#1514; (&#1502;&#1506;&#1511;&#1489; &#1488;&#1495;&#1512; &#1494;&#1502;&#1504;&#1497;&#1501;)
-label_search_titles_only: Search titles only
-label_nobody: nobody
-button_change_password: Change password
-text_user_mail_option: &quot;For unselected projects, you will only receive notifications about things you watch or you're involved in (eg. issues you're the author or assignee).&quot;
-label_user_mail_option_selected: &quot;For any event on the selected projects only...&quot;
-label_user_mail_option_all: &quot;For any event on all my projects&quot;
-label_user_mail_option_none: &quot;Only for things I watch or I'm involved in&quot;
-setting_emails_footer: Emails footer
-label_float: Float
-button_copy: Copy
-mail_body_account_information_external: You can use your &quot;%s&quot; account to log in.
-mail_body_account_information: Your account information
-setting_protocol: Protocol
-label_user_mail_no_self_notified: &quot;I don't want to be notified of changes that I make myself&quot;
-setting_time_format: Time format
-label_registration_activation_by_email: account activation by email
-mail_subject_account_activation_request: %s account activation request
-mail_body_account_activation_request: 'A new user (%s) has registered. His account his pending your approval:'
-label_registration_automatic_activation: automatic account activation
-label_registration_manual_activation: manual account activation
-notice_account_pending: &quot;Your account was created and is now pending administrator approval.&quot;
-field_time_zone: Time zone
-text_caracters_minimum: Must be at least %d characters long.
-setting_bcc_recipients: Blind carbon copy recipients (bcc)
-button_annotate: Annotate
-label_issues_by: Issues by %s
-field_searchable: Searchable
-label_display_per_page: 'Per page: %s'
-setting_per_page_options: Objects per page options
-label_age: Age
-notice_default_data_loaded: Default configuration successfully loaded.
-text_load_default_configuration: Load the default configuration
-text_no_configuration_data: &quot;Roles, trackers, issue statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded.&quot;
-error_can_t_load_default_data: &quot;Default configuration could not be loaded: %s&quot;
-button_update: Update
-label_change_properties: Change properties
-label_general: General
-label_repository_plural: Repositories
-label_associated_revisions: Associated revisions
-setting_user_format: Users display format
-text_status_changed_by_changeset: Applied in changeset %s.
-label_more: More
-text_issues_destroy_confirmation: 'Are you sure you want to delete the selected issue(s) ?'
+label_search_titles_only: &#1495;&#1508;&#1513; &#1489;&#1499;&#1493;&#1514;&#1512;&#1493;&#1514; &#1489;&#1500;&#1489;&#1491;
+label_nobody: &#1488;&#1507; &#1488;&#1495;&#1491;
+button_change_password: &#1513;&#1504;&#1492; &#1505;&#1497;&#1505;&#1502;&#1488;
+text_user_mail_option: &quot;&#1489;&#1508;&#1512;&#1493;&#1497;&#1511;&#1496;&#1497;&#1501; &#1513;&#1500;&#1488; &#1489;&#1495;&#1512;&#1514;, &#1488;&#1514;&#1492; &#1512;&#1511; &#1514;&#1511;&#1489;&#1500; &#1492;&#1514;&#1512;&#1506;&#1493;&#1514; &#1506;&#1500; &#1513;&#1488;&#1514;&#1492; &#1510;&#1493;&#1508;&#1492; &#1488;&#1493; &#1511;&#1513;&#1493;&#1512; &#1488;&#1500;&#1497;&#1492;&#1501; (&#1500;&#1491;&#1493;&#1490;&#1502;&#1488;:&#1504;&#1493;&#1513;&#1488;&#1497;&#1501; &#1513;&#1488;&#1514;&#1492; &#1492;&#1497;&#1493;&#1510;&#1512; &#1513;&#1500;&#1492;&#1501; &#1488;&#1493; &#1502;&#1493;&#1510;&#1489;&#1497;&#1501; &#1488;&#1500;&#1497;&#1498;).&quot;
+label_user_mail_option_selected: &quot;&#1500;&#1499;&#1500; &#1488;&#1497;&#1512;&#1493;&#1506; &#1489;&#1508;&#1512;&#1493;&#1497;&#1511;&#1496;&#1497;&#1501; &#1513;&#1489;&#1495;&#1512;&#1514;&#1497; &#1489;&#1500;&#1489;&#1491;...&quot;
+label_user_mail_option_all: &quot;&#1500;&#1499;&#1500; &#1488;&#1497;&#1512;&#1493;&#1506; &#1489;&#1499;&#1500; &#1492;&#1508;&#1512;&#1493;&#1497;&#1511;&#1496;&#1497;&#1501; &#1513;&#1500;&#1497;&quot;
+label_user_mail_option_none: &quot;&#1512;&#1511; &#1500;&#1504;&#1493;&#1513;&#1488;&#1497;&#1501; &#1513;&#1488;&#1504;&#1497; &#1510;&#1493;&#1508;&#1492; &#1488;&#1493; &#1511;&#1513;&#1493;&#1512; &#1488;&#1500;&#1497;&#1492;&#1501;&quot;
+setting_emails_footer: &#1514;&#1495;&#1514;&#1497;&#1514; &#1491;&#1493;&#1488;&quot;&#1500;
+label_float: &#1510;&#1507;
+button_copy: &#1492;&#1506;&#1514;&#1511;
+mail_body_account_information_external: &#1488;&#1514;&#1492; &#1497;&#1499;&#1493;&#1500; &#1500;&#1492;&#1513;&#1514;&#1502;&#1513; &#1489;&#1495;&#1513;&#1489;&#1493;&#1503; &quot;%s&quot; &#1499;&#1491;&#1497; &#1500;&#1492;&#1514;&#1495;&#1489;&#1512;
+mail_body_account_information: &#1508;&#1512;&#1496;&#1497; &#1492;&#1495;&#1513;&#1489;&#1493;&#1503; &#1513;&#1500;&#1498;
+setting_protocol: &#1508;&#1512;&#1493;&#1496;&#1493;&#1511;&#1493;&#1500;
+label_user_mail_no_self_notified: &quot;&#1488;&#1504;&#1497; &#1500;&#1488; &#1512;&#1493;&#1510;&#1492; &#1513;&#1497;&#1493;&#1491;&#1497;&#1506;&#1493; &#1500;&#1497; &#1506;&#1500; &#1513;&#1497;&#1504;&#1493;&#1497;&#1497;&#1501; &#1513;&#1488;&#1504;&#1497; &#1502;&#1489;&#1510;&#1506;&quot;
+setting_time_format: &#1508;&#1493;&#1512;&#1502;&#1496; &#1494;&#1502;&#1503;
+label_registration_activation_by_email: &#1492;&#1508;&#1506;&#1500; &#1495;&#1513;&#1489;&#1493;&#1503; &#1489;&#1488;&#1502;&#1510;&#1506;&#1493;&#1514; &#1491;&#1493;&#1488;&quot;&#1500;
+mail_subject_account_activation_request: &#1489;&#1511;&#1513;&#1514; &#1492;&#1508;&#1506;&#1500;&#1492; &#1500;&#1495;&#1513;&#1489;&#1493;&#1503; %s
+mail_body_account_activation_request: '&#1502;&#1513;&#1514;&#1502;&#1513; &#1495;&#1491;&#1513; (%s) &#1504;&#1512;&#1513;&#1501;. &#1492;&#1495;&#1513;&#1489;&#1493;&#1503; &#1513;&#1500;&#1493; &#1502;&#1495;&#1499;&#1492; &#1500;&#1488;&#1497;&#1513;&#1493;&#1512; &#1513;&#1500;&#1498;:'
+label_registration_automatic_activation: &#1492;&#1508;&#1506;&#1500;&#1514; &#1495;&#1513;&#1489;&#1493;&#1503; &#1488;&#1493;&#1496;&#1493;&#1502;&#1496;&#1497;&#1514;
+label_registration_manual_activation: &#1492;&#1508;&#1506;&#1500;&#1514; &#1495;&#1513;&#1489;&#1493;&#1503; &#1497;&#1491;&#1504;&#1497;&#1514;
+notice_account_pending: &quot;&#1492;&#1495;&#1513;&#1489;&#1493;&#1503; &#1513;&#1500;&#1498; &#1504;&#1493;&#1510;&#1512; &#1493;&#1506;&#1514;&#1492; &#1502;&#1495;&#1499;&#1492; &#1500;&#1488;&#1497;&#1513;&#1493;&#1512; &#1502;&#1504;&#1492;&#1500; &#1492;&#1502;&#1506;&#1512;&#1499;&#1514;.&quot;
+field_time_zone: &#1488;&#1497;&#1494;&#1493;&#1512; &#1494;&#1502;&#1503;
+text_caracters_minimum: &#1495;&#1497;&#1497;&#1489; &#1500;&#1492;&#1497;&#1493;&#1514; &#1500;&#1508;&#1495;&#1493;&#1514; &#1489;&#1488;&#1493;&#1512;&#1498; &#1513;&#1500; %d &#1514;&#1493;&#1493;&#1497;&#1501;.
+setting_bcc_recipients: &#1502;&#1493;&#1505;&#1514;&#1512; (bcc)
+button_annotate: &#1492;&#1493;&#1505;&#1507; &#1514;&#1497;&#1488;&#1493;&#1512; &#1502;&#1505;&#1490;&#1512;&#1514;
+label_issues_by: &#1504;&#1493;&#1513;&#1488;&#1497;&#1501; &#1513;&#1500; %s
+field_searchable: &#1504;&#1497;&#1514;&#1503; &#1500;&#1495;&#1497;&#1508;&#1493;&#1513;
+label_display_per_page: '&#1500;&#1499;&#1500; &#1491;&#1507;: %s'
+setting_per_page_options: &#1488;&#1508;&#1513;&#1512;&#1493;&#1497;&#1493;&#1514; &#1488;&#1493;&#1489;&#1497;&#1511;&#1496;&#1497;&#1501; &#1500;&#1508;&#1497; &#1491;&#1507;
+label_age: &#1490;&#1497;&#1500;
+notice_default_data_loaded: &#1488;&#1508;&#1513;&#1512;&#1493;&#1497;&#1493;&#1514; &#1489;&#1512;&#1497;&#1512;&#1514; &#1502;&#1495;&#1491;&#1500; &#1502;&#1493;&#1508;&#1506;&#1500;&#1493;&#1514;.
+text_load_default_configuration: &#1496;&#1506;&#1503; &#1488;&#1514; &#1488;&#1508;&#1513;&#1512;&#1493;&#1497;&#1493;&#1514; &#1489;&#1512;&#1497;&#1512;&#1514; &#1492;&#1502;&#1495;&#1491;&#1500;
+text_no_configuration_data: &quot;Roles, trackers, issue statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. &#1497;&#1492;&#1497;&#1492; &#1489;&#1488;&#1508;&#1513;&#1512;&#1493;&#1514;&#1498; &#1500;&#1513;&#1504;&#1493;&#1514;&#1493; &#1500;&#1488;&#1495;&#1512; &#1513;&#1497;&#1496;&#1506;&#1503;.&quot;
+error_can_t_load_default_data: &quot;&#1488;&#1508;&#1513;&#1512;&#1493;&#1497;&#1493;&#1514; &#1489;&#1512;&#1497;&#1512;&#1514; &#1492;&#1502;&#1495;&#1491;&#1500; &#1500;&#1488; &#1492;&#1510;&#1500;&#1497;&#1495;&#1493; &#1500;&#1492;&#1497;&#1496;&#1506;&#1503;: %s&quot;
+button_update: &#1506;&#1491;&#1499;&#1503;
+label_change_properties: &#1513;&#1504;&#1492; &#1502;&#1488;&#1508;&#1497;&#1497;&#1504;&#1497;&#1501;
+label_general: &#1499;&#1500;&#1500;&#1497;
+label_repository_plural: &#1502;&#1488;&#1490;&#1512;&#1497;&#1501;
+label_associated_revisions: &#1513;&#1497;&#1504;&#1493;&#1497;&#1497;&#1501; &#1511;&#1513;&#1493;&#1512;&#1497;&#1501;
+setting_user_format: &#1508;&#1493;&#1512;&#1502;&#1496; &#1492;&#1510;&#1490;&#1514; &#1502;&#1513;&#1514;&#1502;&#1513;&#1497;&#1501;
+text_status_changed_by_changeset: &#1492;&#1493;&#1495;&#1500; &#1489;&#1505;&#1491;&#1512;&#1514; &#1492;&#1513;&#1497;&#1504;&#1493;&#1497;&#1497;&#1501; %s.
+label_more: &#1506;&#1493;&#1491;
+text_issues_destroy_confirmation: '&#1492;&#1488;&#1501; &#1488;&#1514;\&#1492; &#1489;&#1496;&#1493;&#1495; &#1513;&#1489;&#1512;&#1510;&#1493;&#1504;&#1498; &#1500;&#1502;&#1495;&#1493;&#1511; &#1488;&#1514; &#1492;&#1504;&#1493;&#1513;&#1488;\&#1497;&#1501; ?'
 label_scm: SCM
-text_select_project_modules: 'Select modules to enable for this project:'
-label_issue_added: Issue added
-label_issue_updated: Issue updated
-label_document_added: Document added
-label_message_posted: Message added
-label_file_added: File added
-label_news_added: News added
-project_module_boards: Boards
-project_module_issue_tracking: Issue tracking
+text_select_project_modules: '&#1489;&#1495;&#1512; &#1502;&#1493;&#1491;&#1493;&#1500;&#1497;&#1501; &#1500;&#1492;&#1495;&#1497;&#1500; &#1506;&#1500; &#1508;&#1511;&#1512;&#1493;&#1497;&#1511;&#1496; &#1494;&#1492;:'
+label_issue_added: &#1504;&#1493;&#1513;&#1488; &#1492;&#1493;&#1505;&#1507;
+label_issue_updated: &#1504;&#1493;&#1513;&#1488; &#1506;&#1493;&#1491;&#1499;&#1503;
+label_document_added: &#1502;&#1493;&#1505;&#1502;&#1498; &#1492;&#1493;&#1505;&#1507;
+label_message_posted: &#1492;&#1493;&#1491;&#1506;&#1492; &#1492;&#1493;&#1505;&#1508;&#1492;
+label_file_added: &#1511;&#1493;&#1489;&#1509; &#1492;&#1493;&#1505;&#1507;
+label_news_added: &#1495;&#1491;&#1513;&#1493;&#1514; &#1492;&#1493;&#1505;&#1508;&#1493;
+project_module_boards: &#1500;&#1493;&#1495;&#1493;&#1514;
+project_module_issue_tracking: &#1502;&#1506;&#1511;&#1489; &#1504;&#1493;&#1513;&#1488;&#1497;&#1501;
 project_module_wiki: Wiki
-project_module_files: Files
-project_module_documents: Documents
-project_module_repository: Repository
-project_module_news: News
-project_module_time_tracking: Time tracking
-text_file_repository_writable: File repository writable
-text_default_administrator_account_changed: Default administrator account changed
+project_module_files: &#1511;&#1489;&#1510;&#1497;&#1501;
+project_module_documents: &#1502;&#1505;&#1502;&#1499;&#1497;&#1501;
+project_module_repository: &#1502;&#1488;&#1490;&#1512;
+project_module_news: &#1495;&#1491;&#1513;&#1493;&#1514;
+project_module_time_tracking: &#1502;&#1506;&#1511;&#1489; &#1488;&#1495;&#1512; &#1494;&#1502;&#1504;&#1497;&#1501;
+text_file_repository_writable: &#1502;&#1488;&#1490;&#1512; &#1492;&#1511;&#1489;&#1510;&#1497;&#1501; &#1504;&#1497;&#1514;&#1503; &#1500;&#1499;&#1514;&#1497;&#1489;&#1492;
+text_default_administrator_account_changed: &#1502;&#1504;&#1492;&#1500; &#1492;&#1502;&#1506;&#1512;&#1499;&#1514; &#1489;&#1512;&#1497;&#1512;&#1514; &#1492;&#1502;&#1495;&#1491;&#1500; &#1513;&#1493;&#1504;&#1492;
 text_rmagick_available: RMagick available (optional)
-button_configure: Configure
-label_plugins: Plugins
-label_ldap_authentication: LDAP authentication
+button_configure: &#1488;&#1508;&#1513;&#1512;&#1493;&#1497;&#1493;&#1514;
+label_plugins: &#1508;&#1500;&#1488;&#1490;&#1497;&#1504;&#1497;&#1501;
+label_ldap_authentication: &#1488;&#1497;&#1502;&#1493;&#1514; LDAP
 label_downloads_abbr: D/L
-label_this_month: this month
-label_last_n_days: last %d days
-label_all_time: all time
-label_this_year: this year
-label_date_range: Date range
-label_last_week: last week
-label_yesterday: yesterday
-label_last_month: last month
-label_add_another_file: Add another file
-label_optional_description: Optional description
-text_destroy_time_entries_question: %.02f hours were reported on the issues you are about to delete. What do you want to do ?
-error_issue_not_found_in_project: 'The issue was not found or does not belong to this project'
-text_assign_time_entries_to_project: Assign reported hours to the project
-text_destroy_time_entries: Delete reported hours
-text_reassign_time_entries: 'Reassign reported hours to this issue:'
-setting_activity_days_default: Days displayed on project activity
-label_chronological_order: In chronological order
-field_comments_sorting: Display comments
-label_reverse_chronological_order: In reverse chronological order
-label_preferences: Preferences
-setting_display_subprojects_issues: Display subprojects issues on main projects by default
-label_overall_activity: Overall activity
-setting_default_projects_public: New projects are public by default
-error_scm_annotate: &quot;The entry does not exist or can not be annotated.&quot;
-label_planning: Planning
+label_this_month: &#1492;&#1495;&#1493;&#1491;&#1513;
+label_last_n_days: &#1489;-%d &#1497;&#1502;&#1497;&#1501; &#1488;&#1495;&#1512;&#1493;&#1504;&#1497;&#1501;
+label_all_time: &#1514;&#1502;&#1497;&#1491;
+label_this_year: &#1492;&#1513;&#1504;&#1492;
+label_date_range: &#1496;&#1493;&#1493;&#1495; &#1514;&#1488;&#1512;&#1497;&#1499;&#1497;&#1501;
+label_last_week: &#1513;&#1489;&#1493;&#1506; &#1513;&#1506;&#1489;&#1512;
+label_yesterday: &#1488;&#1514;&#1502;&#1493;&#1500;
+label_last_month: &#1495;&#1493;&#1491;&#1513; &#1513;&#1506;&#1489;&#1512;
+label_add_another_file: &#1492;&#1493;&#1505;&#1507; &#1506;&#1493;&#1491; &#1511;&#1493;&#1489;&#1509;
+label_optional_description: &#1514;&#1497;&#1488;&#1493;&#1512; &#1512;&#1513;&#1493;&#1514;
+text_destroy_time_entries_question: %.02f &#1513;&#1506;&#1493;&#1514; &#1491;&#1493;&#1493;&#1495;&#1493; &#1506;&#1500; &#1492;&#1504;&#1493;&#1513;&#1497;&#1501; &#1513;&#1488;&#1514;\&#1492; &#1506;&#1493;&#1502;&#1491;\&#1514; &#1500;&#1502;&#1495;&#1493;&#1511;. &#1502;&#1492; &#1489;&#1512;&#1510;&#1493;&#1504;&#1498; &#1500;&#1506;&#1513;&#1493;&#1514; ?
+error_issue_not_found_in_project: '&#1492;&#1504;&#1493;&#1513;&#1488;&#1497;&#1501; &#1500;&#1488; &#1504;&#1502;&#1510;&#1488;&#1493; &#1488;&#1493; &#1488;&#1497;&#1504;&#1501; &#1513;&#1497;&#1499;&#1497;&#1501; &#1500;&#1508;&#1512;&#1493;&#1497;&#1511;&#1496;'
+text_assign_time_entries_to_project: &#1492;&#1510;&#1489; &#1513;&#1506;&#1493;&#1514; &#1513;&#1491;&#1493;&#1493;&#1495;&#1493; &#1500;&#1508;&#1512;&#1493;&#1497;&#1511;&#1496; &#1492;&#1494;&#1492;
+text_destroy_time_entries: &#1502;&#1495;&#1511; &#1513;&#1506;&#1493;&#1514; &#1513;&#1491;&#1493;&#1493;&#1495;&#1493;
+text_reassign_time_entries: '&#1492;&#1510;&#1489; &#1502;&#1495;&#1491;&#1513; &#1513;&#1506;&#1493;&#1514; &#1513;&#1491;&#1493;&#1493;&#1495;&#1493; &#1500;&#1508;&#1512;&#1493;&#1497;&#1511;&#1496; &#1492;&#1494;&#1492;:'
+setting_activity_days_default: &#1497;&#1502;&#1497;&#1501; &#1492;&#1502;&#1493;&#1510;&#1490;&#1497;&#1501; &#1506;&#1500; &#1508;&#1506;&#1497;&#1500;&#1493;&#1514; &#1492;&#1508;&#1512;&#1493;&#1497;&#1511;&#1496;
+label_chronological_order: &#1489;&#1505;&#1491;&#1512; &#1499;&#1512;&#1493;&#1504;&#1493;&#1500;&#1493;&#1490;&#1497;
+field_comments_sorting: &#1492;&#1510;&#1490; &#1492;&#1506;&#1512;&#1493;&#1514;
+label_reverse_chronological_order: &#1489;&#1505;&#1491;&#1512; &#1499;&#1512;&#1493;&#1504;&#1493;&#1500;&#1493;&#1490;&#1497; &#1492;&#1508;&#1493;&#1498;
+label_preferences: &#1492;&#1506;&#1491;&#1508;&#1493;&#1514;
+setting_display_subprojects_issues: &#1492;&#1510;&#1490; &#1504;&#1493;&#1513;&#1488;&#1497;&#1501; &#1513;&#1500; &#1514;&#1514; &#1508;&#1512;&#1493;&#1497;&#1511;&#1496;&#1497;&#1501; &#1499;&#1489;&#1512;&#1497;&#1512;&#1514; &#1502;&#1495;&#1491;&#1500;
+label_overall_activity: &#1508;&#1506;&#1497;&#1500;&#1493;&#1514; &#1499;&#1493;&#1500;&#1500;&#1514;
+setting_default_projects_public: &#1508;&#1512;&#1493;&#1497;&#1511;&#1496;&#1497;&#1501; &#1495;&#1491;&#1513;&#1497;&#1501; &#1492;&#1497;&#1504;&#1501; &#1508;&#1493;&#1502;&#1489;&#1497;&#1497;&#1501; &#1499;&#1489;&#1512;&#1497;&#1512;&#1514; &#1502;&#1495;&#1491;&#1500;
+error_scm_annotate: &quot;&#1492;&#1499;&#1504;&#1497;&#1505;&#1492; &#1500;&#1488; &#1511;&#1497;&#1497;&#1502;&#1514; &#1488;&#1493; &#1513;&#1500;&#1488; &#1504;&#1497;&#1514;&#1503; &#1500;&#1514;&#1488;&#1512; &#1488;&#1493;&#1514;&#1492;.&quot;
+label_planning: &#1514;&#1499;&#1504;&#1493;&#1503;
+text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'</diff>
      <filename>lang/he.yml</filename>
    </modified>
    <modified>
      <diff>@@ -617,3 +617,4 @@ label_overall_activity: Overall activity
 setting_default_projects_public: New projects are public by default
 error_scm_annotate: &quot;The entry does not exist or can not be annotated.&quot;
 label_planning: Planning
+text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'</diff>
      <filename>lang/it.yml</filename>
    </modified>
    <modified>
      <diff>@@ -618,3 +618,4 @@ label_overall_activity: &#20840;&#12390;&#12398;&#27963;&#21205;
 setting_default_projects_public: &#12487;&#12501;&#12457;&#12523;&#12488;&#12391;&#26032;&#12375;&#12356;&#12503;&#12525;&#12472;&#12455;&#12463;&#12488;&#12399;&#20844;&#38283;&#12395;&#12377;&#12427;
 error_scm_annotate: &quot;&#12456;&#12531;&#12488;&#12522;&#12364;&#23384;&#22312;&#12375;&#12394;&#12356;&#12289;&#12418;&#12375;&#12367;&#12399;&#12450;&#12494;&#12486;&#12540;&#12488;&#12391;&#12365;&#12414;&#12379;&#12435;&#12290;&quot;
 label_planning: &#35336;&#30011;
+text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'</diff>
      <filename>lang/ja.yml</filename>
    </modified>
    <modified>
      <diff>@@ -617,3 +617,4 @@ label_overall_activity: Overall activity
 setting_default_projects_public: New projects are public by default
 error_scm_annotate: &quot;The entry does not exist or can not be annotated.&quot;
 label_planning: Planning
+text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'</diff>
      <filename>lang/ko.yml</filename>
    </modified>
    <modified>
      <diff>@@ -618,3 +618,4 @@ label_overall_activity: Overall activity
 setting_default_projects_public: New projects are public by default
 error_scm_annotate: &quot;The entry does not exist or can not be annotated.&quot;
 label_planning: Planning
+text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'</diff>
      <filename>lang/lt.yml</filename>
    </modified>
    <modified>
      <diff>@@ -618,3 +618,4 @@ label_overall_activity: Overall activity
 setting_default_projects_public: New projects are public by default
 error_scm_annotate: &quot;The entry does not exist or can not be annotated.&quot;
 label_planning: Planning
+text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'</diff>
      <filename>lang/nl.yml</filename>
    </modified>
    <modified>
      <diff>@@ -80,7 +80,7 @@ notice_default_data_loaded: Standardkonfigurasjonen lastet inn.
 error_can_t_load_default_data: &quot;Standardkonfigurasjonen kunne ikke lastes inn: %s&quot;
 error_scm_not_found: &quot;Elementet og/eller revisjonen eksisterer ikke i depoet.&quot;
 error_scm_command_failed: &quot;En feil oppstod under tilkobling til depoet: %s&quot;
-error_scm_annotate: &quot;Elementet eksisterer ikke, eller kan ikke annoteres.&quot;
+error_scm_annotate: &quot;Elementet eksisterer ikke, eller kan ikke noteres.&quot;
 error_issue_not_found_in_project: 'Saken eksisterer ikke, eller h&#248;rer ikke til dette prosjektet'
 
 mail_subject_lost_password: Ditt %s passord
@@ -137,7 +137,7 @@ field_parent: Underprosjekt til
 field_is_in_chlog: Vises i endringslogg
 field_is_in_roadmap: Vises i veikart
 field_login: Brukernavn
-field_mail_notification: E-post varsling
+field_mail_notification: E-post-varsling
 field_admin: Administrator
 field_last_login_on: Sist innlogget
 field_language: Spr&#229;k
@@ -165,7 +165,7 @@ field_url: URL
 field_start_page: Startside
 field_subproject: Underprosjekt
 field_hours: Timer
-field_activity: Activitet
+field_activity: Aktivitet
 field_spent_on: Dato
 field_identifier: Identifikasjon
 field_is_filter: Brukes som filter
@@ -282,7 +282,7 @@ label_last_updates: Sist oppdatert
 label_last_updates_plural: %d siste oppdaterte
 label_registered_on: Registrert
 label_activity: Aktivitet
-label_overall_activity: Total aktivitet
+label_overall_activity: All aktivitet
 label_new: Ny
 label_logged_as: Innlogget som
 label_environment: Milj&#248;
@@ -352,7 +352,7 @@ label_gantt: Gantt
 label_internal: Intern
 label_last_changes: siste %d endringer
 label_change_view_all: Vis alle endringer
-label_personalize_page: Tilrettelegg denne siden
+label_personalize_page: Tilpass denne siden
 label_comment: Kommentar
 label_comment_plural: Kommentarer
 label_comment_add: Legg til kommentar
@@ -545,7 +545,7 @@ button_reset: Nullstill
 button_rename: Endre navn
 button_change_password: Endre passord
 button_copy: Kopier
-button_annotate: Annot&#233;r
+button_annotate: Not&#233;r
 button_update: Oppdater
 button_configure: Konfigurer
 
@@ -557,6 +557,7 @@ text_select_mail_notifications: Velg hendelser som skal varsles med e-post.
 text_regexp_info: eg. ^[A-Z0-9]+$
 text_min_max_length_info: 0 betyr ingen begrensning
 text_project_destroy_confirmation: Er du sikker p&#229; at du vil slette dette prosjekter og alle relatert data ?
+text_subprojects_destroy_warning: 'Underprojekt(ene): %s vil ogs&#195;&#165; bli slettet.'
 text_workflow_edit: Velg en rolle og en sakstype for &#229; endre arbeidsflyten
 text_are_you_sure: Er du sikker ?
 text_journal_changed: endret fra %s til %s
@@ -565,7 +566,7 @@ text_journal_deleted: slettet
 text_tip_task_begin_day: oppgaven starter denne dagen
 text_tip_task_end_day: oppgaven avsluttes denne dagen
 text_tip_task_begin_end_day: oppgaven starter og avsluttes denne dagen
-text_project_identifier_info: 'Sm&#229; bokstaver (a-z), nummer og binde-/understrek tillat.&lt;br /&gt;Identifikatoren kan ikke endres etter den er lagret.'
+text_project_identifier_info: 'Sm&#229; bokstaver (a-z), nummer og bindestrek tillatt.&lt;br /&gt;Identifikatoren kan ikke endres etter den er lagret.'
 text_caracters_maximum: %d tegn maksimum.
 text_caracters_minimum: M&#229; v&#230;re minst %d tegn langt.
 text_length_between: Lengde mellom %d og %d tegn.
@@ -586,8 +587,8 @@ text_status_changed_by_changeset: Brukt i endringssett %s.
 text_issues_destroy_confirmation: 'Er du sikker p&#229; at du vil slette valgte sak(er) ?'
 text_select_project_modules: 'Velg moduler du vil aktivere for dette prosjektet:'
 text_default_administrator_account_changed: Standard administrator-konto er endret
-text_file_repository_writable: Fil-depotet er skrivbart
-text_rmagick_available: RMagick tilgjengelig (valgfritt)
+text_file_repository_writable: Fil-arkivet er skrivbart
+text_rmagick_available: RMagick er tilgjengelig (valgfritt)
 text_destroy_time_entries_question: %.02f timer er f&#248;rt p&#229; sakene du er i ferd med &#229; slette. Hva vil du gj&#248;re ?
 text_destroy_time_entries: Slett f&#248;rte timer
 text_assign_time_entries_to_project: Overf&#248;r f&#248;rte timer til prosjektet</diff>
      <filename>lang/no.yml</filename>
    </modified>
    <modified>
      <diff>@@ -617,3 +617,4 @@ label_overall_activity: Og&#243;lna aktywno&#347;&#263;
 setting_default_projects_public: Nowe projekty s&#261; domy&#347;lnie publiczne
 error_scm_annotate: &quot;Wpis nie istnieje lub nie mo&#380;na do niego dodawa&#263; adnotacji.&quot;
 label_planning: Planning
+text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'</diff>
      <filename>lang/pl.yml</filename>
    </modified>
    <modified>
      <diff>@@ -617,3 +617,4 @@ label_overall_activity: Overall activity
 setting_default_projects_public: New projects are public by default
 error_scm_annotate: &quot;The entry does not exist or can not be annotated.&quot;
 label_planning: Planning
+text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'</diff>
      <filename>lang/pt-br.yml</filename>
    </modified>
    <modified>
      <diff>@@ -617,3 +617,4 @@ label_overall_activity: Overall activity
 setting_default_projects_public: New projects are public by default
 error_scm_annotate: &quot;The entry does not exist or can not be annotated.&quot;
 label_planning: Planning
+text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'</diff>
      <filename>lang/pt.yml</filename>
    </modified>
    <modified>
      <diff>@@ -617,3 +617,4 @@ label_overall_activity: Overall activity
 setting_default_projects_public: New projects are public by default
 error_scm_annotate: &quot;The entry does not exist or can not be annotated.&quot;
 label_planning: Planning
+text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'</diff>
      <filename>lang/ro.yml</filename>
    </modified>
    <modified>
      <diff>@@ -619,5 +619,6 @@ label_preferences: &#1055;&#1088;&#1077;&#1076;&#1087;&#1086;&#1095;&#1090;&#1077;&#1085;&#1080;&#1103;
 setting_display_subprojects_issues: &#1054;&#1090;&#1086;&#1073;&#1088;&#1072;&#1078;&#1077;&#1085;&#1080;&#1077; &#1087;&#1086;&#1076;&#1087;&#1088;&#1086;&#1077;&#1082;&#1090;&#1086;&#1074; &#1087;&#1086; &#1091;&#1084;&#1086;&#1083;&#1095;&#1072;&#1085;&#1080;&#1102;
 label_overall_activity: &#1057;&#1074;&#1086;&#1076;&#1085;&#1072;&#1103; &#1072;&#1082;&#1090;&#1080;&#1074;&#1085;&#1086;&#1089;&#1090;&#1100;
 setting_default_projects_public: &#1053;&#1086;&#1074;&#1099;&#1077; &#1087;&#1088;&#1086;&#1077;&#1082;&#1090;&#1099; &#1103;&#1074;&#1083;&#1103;&#1102;&#1090;&#1089;&#1103; &#1087;&#1091;&#1073;&#1083;&#1080;&#1095;&#1085;&#1099;&#1084;&#1080;
-error_scm_annotate: &quot;The entry does not exist or can not be annotated.&quot;
-label_planning: Planning
+error_scm_annotate: &quot;&#1044;&#1072;&#1085;&#1085;&#1099;&#1077; &#1086;&#1090;&#1089;&#1091;&#1090;&#1089;&#1090;&#1074;&#1091;&#1102;&#1090; &#1080;&#1083;&#1080; &#1085;&#1077; &#1084;&#1086;&#1075;&#1091;&#1090; &#1073;&#1099;&#1090;&#1100; &#1087;&#1086;&#1076;&#1087;&#1080;&#1089;&#1072;&#1085;&#1099;.&quot;
+label_planning: &#1055;&#1083;&#1072;&#1085;&#1080;&#1088;&#1086;&#1074;&#1072;&#1085;&#1080;&#1077;
+text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'</diff>
      <filename>lang/ru.yml</filename>
    </modified>
    <modified>
      <diff>@@ -618,3 +618,4 @@ label_overall_activity: Overall activity
 setting_default_projects_public: New projects are public by default
 error_scm_annotate: &quot;The entry does not exist or can not be annotated.&quot;
 label_planning: Planning
+text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'</diff>
      <filename>lang/sr.yml</filename>
    </modified>
    <modified>
      <diff>@@ -618,3 +618,4 @@ label_overall_activity: Overall activity
 setting_default_projects_public: New projects are public by default
 error_scm_annotate: &quot;The entry does not exist or can not be annotated.&quot;
 label_planning: Planning
+text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'</diff>
      <filename>lang/sv.yml</filename>
    </modified>
    <modified>
      <diff>@@ -619,3 +619,4 @@ label_overall_activity: Overall activity
 setting_default_projects_public: New projects are public by default
 error_scm_annotate: &quot;The entry does not exist or can not be annotated.&quot;
 label_planning: Planning
+text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'</diff>
      <filename>lang/uk.yml</filename>
    </modified>
    <modified>
      <diff>@@ -618,3 +618,4 @@ default_activity_development: &#38283;&#30332;
 enumeration_issue_priorities: &#38917;&#30446;&#20778;&#20808;&#27402;
 enumeration_doc_categories: &#25991;&#20214;&#20998;&#39006;
 enumeration_activities: &#27963;&#21205; (&#26178;&#38291;&#36861;&#36452;)
+text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'</diff>
      <filename>lang/zh-tw.yml</filename>
    </modified>
    <modified>
      <diff>@@ -618,3 +618,4 @@ default_activity_development: &#24320;&#21457;
 enumeration_issue_priorities: &#38382;&#39064;&#20248;&#20808;&#32423;
 enumeration_doc_categories: &#25991;&#26723;&#31867;&#21035;
 enumeration_activities: &#27963;&#21160;&#65288;&#26102;&#38388;&#36319;&#36394;&#65289;
+text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'</diff>
      <filename>lang/zh.yml</filename>
    </modified>
    <modified>
      <diff>@@ -1134,7 +1134,7 @@ class RedCloth &lt; String
     ALLOWED_TAGS = %w(redpre pre code)
     
     def escape_html_tags(text)
-      text.gsub!(%r{&lt;((\/?)(\w+))}) {|m| ALLOWED_TAGS.include?($3) ? &quot;&lt;#{$1}&quot; : &quot;&amp;lt;#{$1}&quot; }
+      text.gsub!(%r{&lt;(\/?(\w+)[^&gt;\n]*)(&gt;?)}) {|m| ALLOWED_TAGS.include?($2) ? &quot;&lt;#{$1}#{$3}&quot; : &quot;&amp;lt;#{$1}#{'&amp;gt;' if $3}&quot; }
     end
 end
 </diff>
      <filename>lib/redcloth.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,6 +1,7 @@
 require 'redmine/access_control'
 require 'redmine/menu_manager'
 require 'redmine/mime_type'
+require 'redmine/core_ext'
 require 'redmine/themes'
 require 'redmine/plugin'
 </diff>
      <filename>lib/redmine.rb</filename>
    </modified>
    <modified>
      <diff>@@ -59,8 +59,17 @@ module Redmine
         # Returns the entry identified by path and revision identifier
         # or nil if entry doesn't exist in the repository
         def entry(path=nil, identifier=nil)
-          e = entries(path, identifier)
-          e ? e.first : nil
+          parts = path.to_s.split(%r{[\/\\]}).select {|n| !n.blank?}
+          search_path = parts[0..-2].join('/')
+          search_name = parts[-1]
+          if search_path.blank? &amp;&amp; search_name.blank?
+            # Root entry
+            Entry.new(:path =&gt; '', :kind =&gt; 'dir')
+          else
+            # Search for the entry in the parent directory
+            es = entries(search_path, identifier)
+            es ? es.detect {|e| e.name == search_name} : nil
+          end
         end
         
         # Returns an Entries collection</diff>
      <filename>lib/redmine/scm/adapters/abstract_adapter.rb</filename>
    </modified>
    <modified>
      <diff>@@ -44,18 +44,6 @@ module Redmine
           return nil
         end
         
-        # Returns the entry identified by path and revision identifier
-        # or nil if entry doesn't exist in the repository
-        def entry(path=nil, identifier=nil)
-          path ||= ''
-          parts = path.split(%r{[\/\\]}).select {|p| !p.blank?}
-          if parts.size &gt; 0
-            parent = parts[0..-2].join('/')
-            entries = entries(parent, identifier)
-            entries ? entries.detect {|e| e.name == parts.last} : nil
-          end
-        end
-        
         # Returns an Entries collection
         # or nil if the given path doesn't exist in the repository
         def entries(path=nil, identifier=nil)</diff>
      <filename>lib/redmine/scm/adapters/bazaar_adapter.rb</filename>
    </modified>
    <modified>
      <diff>@@ -55,15 +55,6 @@ module Redmine
         def get_previous_revision(revision)
           CvsRevisionHelper.new(revision).prevRev
         end
-        
-        # Returns the entry identified by path and revision identifier
-        # or nil if entry doesn't exist in the repository
-        # this method returns all revisions from one single SCM-Entry
-        def entry(path=nil, identifier=&quot;HEAD&quot;)
-          e = entries(path, identifier)
-          logger.debug(&quot;&lt;cvs-result&gt; #{e.first.inspect}&quot;) if e
-          e ? e.first : nil
-        end    
     
         # Returns an Entries collection
         # or nil if the given path doesn't exist in the repository
@@ -72,7 +63,9 @@ module Redmine
           logger.debug &quot;&lt;cvs&gt; entries '#{path}' with identifier '#{identifier}'&quot;
           path_with_project=&quot;#{url}#{with_leading_slash(path)}&quot;
           entries = Entries.new
-          cmd = &quot;#{CVS_BIN} -d #{root_url} rls -ed #{path_with_project}&quot;
+          cmd = &quot;#{CVS_BIN} -d #{root_url} rls -ed&quot;
+          cmd &lt;&lt; &quot; -D \&quot;#{time_to_cvstime(identifier)}\&quot;&quot; if identifier
+          cmd &lt;&lt; &quot; #{path_with_project}&quot;
           shellout(cmd) do |io|
             io.each_line(){|line|
               fields=line.chop.split('/',-1)</diff>
      <filename>lib/redmine/scm/adapters/cvs_adapter.rb</filename>
    </modified>
    <modified>
      <diff>@@ -40,20 +40,15 @@ module Redmine
           rev ? Info.new({:root_url =&gt; @url, :lastrev =&gt; rev.last}) : nil
         end
         
-        # Returns the entry identified by path and revision identifier
-        # or nil if entry doesn't exist in the repository
-        def entry(path=nil, identifier=nil)
-          e = entries(path, identifier)
-          e ? e.first : nil
-        end
-        
         # Returns an Entries collection
         # or nil if the given path doesn't exist in the repository
         def entries(path=nil, identifier=nil)
           path_prefix = (path.blank? ? '' : &quot;#{path}/&quot;)
           path = '.' if path.blank?
           entries = Entries.new          
-          cmd = &quot;#{DARCS_BIN} annotate --repodir #{@url} --xml-output #{path}&quot;
+          cmd = &quot;#{DARCS_BIN} annotate --repodir #{@url} --xml-output&quot;
+          cmd &lt;&lt; &quot; --match \&quot;hash #{identifier}\&quot;&quot; if identifier
+          cmd &lt;&lt; &quot; #{path}&quot;
           shellout(cmd) do |io|
             begin
               doc = REXML::Document.new(io)</diff>
      <filename>lib/redmine/scm/adapters/darcs_adapter.rb</filename>
    </modified>
    <modified>
      <diff>@@ -79,7 +79,7 @@ module Redmine
             rev = Revision.new({:identifier =&gt; changeset[:commit],
                                 :scmid =&gt; changeset[:commit],
                                 :author =&gt; changeset[:author],
-                                :time =&gt; Time.parse(changeset[:date]),
+                                :time =&gt; (changeset[:date] ? Time.parse(changeset[:date]) : nil),
                                 :message =&gt; changeset[:description],
                                 :paths =&gt; files
                                })
@@ -132,14 +132,6 @@ module Redmine
           entries.sort_by_name
         end
         
-        def entry(path=nil, identifier=nil)
-          path ||= ''
-          search_path = path.split('/')[0..-2].join('/')
-          entry_name = path.split('/').last
-          e = entries(search_path, identifier)
-          e ? e.detect{|entry| entry.name == entry_name} : nil
-        end
-        
         def revisions(path, identifier_from, identifier_to, options={})
           revisions = Revisions.new
           cmd = &quot;#{GIT_BIN} --git-dir #{target('')} log --raw &quot;</diff>
      <filename>lib/redmine/scm/adapters/git_adapter.rb</filename>
    </modified>
    <modified>
      <diff>@@ -59,14 +59,6 @@ module Redmine
           return nil if $? &amp;&amp; $?.exitstatus != 0
           entries.sort_by_name
         end
-  
-        def entry(path=nil, identifier=nil)
-          path ||= ''
-          search_path = path.split('/')[0..-2].join('/')
-          entry_name = path.split('/').last
-          e = entries(search_path, identifier)
-          e ? e.detect{|entry| entry.name == entry_name} : nil
-        end
           
         def revisions(path=nil, identifier_from=nil, identifier_to=nil, options={})
           revisions = Revisions.new
@@ -88,13 +80,7 @@ module Redmine
                 value = $2
                 if parsing_descr &amp;&amp; line_feeds &gt; 1
                   parsing_descr = false
-                  revisions &lt;&lt; Revision.new({:identifier =&gt; changeset[:changeset].split(':').first.to_i,
-                                             :scmid =&gt; changeset[:changeset].split(':').last,
-                                             :author =&gt; changeset[:user],
-                                             :time =&gt; Time.parse(changeset[:date]),
-                                             :message =&gt; changeset[:description],
-                                             :paths =&gt; changeset[:files].to_s.split.collect{|path| {:action =&gt; 'X', :path =&gt; &quot;/#{path}&quot;}}
-                  })
+                  revisions &lt;&lt; build_revision_from_changeset(changeset)
                   changeset = {}
                 end
                 if !parsing_descr
@@ -111,13 +97,8 @@ module Redmine
                 line_feeds += 1 if line.chomp.empty?
               end
             end
-            revisions &lt;&lt; Revision.new({:identifier =&gt; changeset[:changeset].split(':').first.to_i,
-                                       :scmid =&gt; changeset[:changeset].split(':').last,
-                                       :author =&gt; changeset[:user],
-                                       :time =&gt; Time.parse(changeset[:date]),
-                                       :message =&gt; changeset[:description],
-                                       :paths =&gt; changeset[:files].to_s.split.collect{|path| {:action =&gt; 'X', :path =&gt; &quot;/#{path}&quot;}}
-            })
+            # Add the last changeset if there is one left
+            revisions &lt;&lt; build_revision_from_changeset(changeset) if changeset[:date]
           end
           return nil if $? &amp;&amp; $?.exitstatus != 0
           revisions
@@ -171,6 +152,47 @@ module Redmine
           return nil if $? &amp;&amp; $?.exitstatus != 0
           blame
         end
+        
+        private
+        
+        # Builds a revision objet from the changeset returned by hg command
+        def build_revision_from_changeset(changeset)
+          rev_id = changeset[:changeset].to_s.split(':').first.to_i
+          
+          # Changes
+          paths = (rev_id == 0) ?
+            # Can't get changes for revision 0 with hg status
+            changeset[:files].to_s.split.collect{|path| {:action =&gt; 'A', :path =&gt; &quot;/#{path}&quot;}} :
+            status(rev_id)
+          
+          Revision.new({:identifier =&gt; rev_id,
+                        :scmid =&gt; changeset[:changeset].to_s.split(':').last,
+                        :author =&gt; changeset[:user],
+                        :time =&gt; Time.parse(changeset[:date]),
+                        :message =&gt; changeset[:description],
+                        :paths =&gt; paths
+                       })
+        end
+        
+        # Returns the file changes for a given revision
+        def status(rev_id)
+          cmd = &quot;#{HG_BIN} -R #{target('')} status --rev #{rev_id.to_i - 1}:#{rev_id.to_i}&quot;
+          result = []
+          shellout(cmd) do |io|
+            io.each_line do |line|
+              action, file = line.chomp.split
+              next unless action &amp;&amp; file
+              file.gsub!(&quot;\\&quot;, &quot;/&quot;)
+              case action
+              when 'R'
+                result &lt;&lt; { :action =&gt; 'D' , :path =&gt; &quot;/#{file}&quot; }
+              else
+                result &lt;&lt; { :action =&gt; action, :path =&gt; &quot;/#{file}&quot; }
+              end
+            end
+          end
+          result
+        end
       end
     end
   end</diff>
      <filename>lib/redmine/scm/adapters/mercurial_adapter.rb</filename>
    </modified>
    <modified>
      <diff>@@ -51,18 +51,11 @@ module Redmine
           return nil
         end
         
-        # Returns the entry identified by path and revision identifier
-        # or nil if entry doesn't exist in the repository
-        def entry(path=nil, identifier=nil)
-          e = entries(path, identifier)
-          e ? e.first : nil
-        end
-        
         # Returns an Entries collection
         # or nil if the given path doesn't exist in the repository
         def entries(path=nil, identifier=nil)
           path ||= ''
-          identifier = 'HEAD' unless identifier and identifier &gt; 0
+          identifier = (identifier and identifier.to_i &gt; 0) ? identifier.to_i : &quot;HEAD&quot;
           entries = Entries.new
           cmd = &quot;#{SVN_BIN} list --xml #{target(path)}@#{identifier}&quot;
           cmd &lt;&lt; credentials_string
@@ -94,8 +87,8 @@ module Redmine
     
         def revisions(path=nil, identifier_from=nil, identifier_to=nil, options={})
           path ||= ''
-          identifier_from = 'HEAD' unless identifier_from and identifier_from.to_i &gt; 0
-          identifier_to = 1 unless identifier_to and identifier_to.to_i &gt; 0
+          identifier_from = (identifier_from and identifier_from.to_i &gt; 0) ? identifier_from.to_i : &quot;HEAD&quot;
+          identifier_to = (identifier_to and identifier_to.to_i &gt; 0) ? identifier_to.to_i : 1
           revisions = Revisions.new
           cmd = &quot;#{SVN_BIN} log --xml -r #{identifier_from}:#{identifier_to}&quot;
           cmd &lt;&lt; credentials_string
@@ -131,11 +124,9 @@ module Redmine
         
         def diff(path, identifier_from, identifier_to=nil, type=&quot;inline&quot;)
           path ||= ''
-          if identifier_to and identifier_to.to_i &gt; 0
-            identifier_to = identifier_to.to_i 
-          else
-            identifier_to = identifier_from.to_i - 1
-          end
+          identifier_from = (identifier_from and identifier_from.to_i &gt; 0) ? identifier_from.to_i : ''
+          identifier_to = (identifier_to and identifier_to.to_i &gt; 0) ? identifier_to.to_i : (identifier_from.to_i - 1)
+          
           cmd = &quot;#{SVN_BIN} diff -r &quot;
           cmd &lt;&lt; &quot;#{identifier_to}:&quot;
           cmd &lt;&lt; &quot;#{identifier_from}&quot;</diff>
      <filename>lib/redmine/scm/adapters/subversion_adapter.rb</filename>
    </modified>
    <modified>
      <diff>@@ -77,21 +77,24 @@ module Redmine
         content_tag('dl', out)
       end
       
-      desc &quot;Include a wiki page. Example:\n\n  !{{include(Foo)}}&quot;
+      desc &quot;Include a wiki page. Example:\n\n  !{{include(Foo)}}\n\nor to include a page of a specific project wiki:\n\n  !{{include(projectname:Foo)}}&quot;
       macro :include do |obj, args|
-        if @project &amp;&amp; !@project.wiki.nil?
-          page = @project.wiki.find_page(args.first)
-          if page &amp;&amp; page.content
-            @included_wiki_pages ||= []
-            raise 'Circular inclusion detected' if @included_wiki_pages.include?(page.title)
-            @included_wiki_pages &lt;&lt; page.title
-            out = textilizable(page.content, :text)
-            @included_wiki_pages.pop
-            out
-          else
-            raise &quot;Page #{args.first} doesn't exist&quot;
-          end
+        project = @project
+        title = args.first.to_s
+        if title =~ %r{^([^\:]+)\:(.*)$}
+          project_identifier, title = $1, $2
+          project = Project.find_by_identifier(project_identifier) || Project.find_by_name(project_identifier)
         end
+        raise 'Unknow project' unless project &amp;&amp; User.current.allowed_to?(:view_wiki_pages, project)
+        raise 'No wiki for this project' unless !project.wiki.nil?
+        page = project.wiki.find_page(title)
+        raise &quot;Page #{args.first} doesn't exist&quot; unless page &amp;&amp; page.content
+        @included_wiki_pages ||= []
+        raise 'Circular inclusion detected' if @included_wiki_pages.include?(page.title)
+        @included_wiki_pages &lt;&lt; page.title
+        out = textilizable(page.content, :text, :attachments =&gt; page.attachments)
+        @included_wiki_pages.pop
+        out
       end
     end
   end</diff>
      <filename>lib/redmine/wiki_formatting/macros.rb</filename>
    </modified>
    <modified>
      <diff></diff>
      <filename>public/images/attachment.png</filename>
    </modified>
    <modified>
      <diff>@@ -93,14 +93,55 @@ ContextMenu.prototype = {
   },
   
   showMenu: function(e) {
-		$('context-menu').style['left'] = (Event.pointerX(e) + 'px');
-		$('context-menu').style['top'] = (Event.pointerY(e) + 'px');		
-		Element.update('context-menu', '');
-		new Ajax.Updater({success:'context-menu'}, this.url, 
+    var mouse_x = Event.pointerX(e);
+    var mouse_y = Event.pointerY(e);
+    var render_x = mouse_x;
+    var render_y = mouse_y;
+    var dims;
+    var menu_width;
+    var menu_height;
+    var window_width;
+    var window_height;
+    var max_width;
+    var max_height;
+
+    $('context-menu').style['left'] = (render_x + 'px');
+    $('context-menu').style['top'] = (render_y + 'px');		
+    Element.update('context-menu', '');
+
+    new Ajax.Updater({success:'context-menu'}, this.url, 
       {asynchronous:true,
        evalScripts:true,
        parameters:Form.serialize(Event.findElement(e, 'form')),
        onComplete:function(request){
+				 dims = $('context-menu').getDimensions();
+				 menu_width = dims.width;
+				 menu_height = dims.height;
+				 max_width = mouse_x + 2*menu_width;
+				 max_height = mouse_y + menu_height;
+			
+				 var ws = window_size();
+				 window_width = ws.width;
+				 window_height = ws.height;
+			
+				 /* display the menu above and/or to the left of the click if needed */
+				 if (max_width &gt; window_width) {
+				   render_x -= menu_width;
+				   $('context-menu').addClassName('reverse-x');
+				 } else {
+					 $('context-menu').removeClassName('reverse-x');
+				 }
+				 if (max_height &gt; window_height) {
+				   render_y -= menu_height;
+				   $('context-menu').addClassName('reverse-y');
+				 } else {
+					 $('context-menu').removeClassName('reverse-y');
+				 }
+				 if (render_x &lt;= 0) render_x = 1;
+				 if (render_y &lt;= 0) render_y = 1;
+				 $('context-menu').style['left'] = (render_x + 'px');
+				 $('context-menu').style['top'] = (render_y + 'px');
+				 
          Effect.Appear('context-menu', {duration: 0.20});
          if (window.parseStylesheets) { window.parseStylesheets(); } // IE
       }})
@@ -159,3 +200,19 @@ function toggleIssuesSelection(el) {
 		}
 	}
 }
+
+function window_size() {
+    var w;
+    var h;
+    if (window.innerWidth) {
+	w = window.innerWidth;
+	h = window.innerHeight;
+    } else if (document.documentElement) {
+	w = document.documentElement.clientWidth;
+	h = document.documentElement.clientHeight;
+    } else {
+	w = document.body.clientWidth;
+	h = document.body.clientHeight;
+    }
+    return {width: w, height: h};
+}</diff>
      <filename>public/javascripts/context_menu.js</filename>
    </modified>
    <modified>
      <diff>@@ -57,10 +57,7 @@ h4, .wiki h3 {font-size: 13px;padding: 2px 10px 1px 0px;margin-bottom: 5px; bord
 
 #content { width: 80%; background-color: #fff; margin: 0px; border-right: 1px solid #ddd; padding: 6px 10px 10px 10px; z-index: 10; height:600px; min-height: 600px;}
 * html #content{ width: 80%; padding-left: 0; margin-top: 0px; padding: 6px 10px 10px 10px;}
-html&gt;body #content {
-height: auto;
-min-height: 600px;
-} 
+html&gt;body #content { height: auto; min-height: 600px; overflow: auto; } 
 
 #main.nosidebar #sidebar{ display: none; }
 #main.nosidebar #content{ width: auto; border-right: 0; }
@@ -162,7 +159,13 @@ div.issue {background:#ffffdd; padding:6px; margin-bottom:6px;border: 1px solid
 p.breadcrumb { font-size: 0.9em; margin: 4px 0 4px 0;}
 p.subtitle { font-size: 0.9em; margin: -6px 0 12px 0; font-style: italic; } 
 
-fieldset#filters .buttons { text-align: right; font-size: 0.9em; margin: 0 4px 0px 0; }
+fieldset#filters { padding: 0.7em; }
+fieldset#filters p { margin: 1.2em 0 0.8em 2px; }
+fieldset#filters .buttons { font-size: 0.9em; }
+fieldset#filters table { border-collapse: collapse; }
+fieldset#filters table td { padding: 0; vertical-align: middle; }
+fieldset#filters tr.filter { height: 2em; }
+fieldset#filters td.add-filter { text-align: right; vertical-align: top; }
 
 div#issue-changesets {float:right; width:45%; margin-left: 1em; margin-bottom: 1em; background: #fff; padding-left: 1em; font-size: 90%;}
 div#issue-changesets .changeset { padding: 4px;}
@@ -170,11 +173,21 @@ div#issue-changesets .changeset { border-bottom: 1px solid #ddd; }
 div#issue-changesets p { margin-top: 0; margin-bottom: 1em;}
 
 div#activity dl { margin-left: 2em; }
-div#activity dd { margin-bottom: 1em; }
-div#activity dt { margin-bottom: 1px; }
+div#activity dd { margin-bottom: 1em; padding-left: 18px; }
+div#activity dt { margin-bottom: 1px; padding-left: 20px; line-height: 18px; background-position: 0 50%; background-repeat: no-repeat; }
 div#activity dt .time { color: #777; font-size: 80%; }
 div#activity dd .description { font-style: italic; }
 div#activity span.project:after { content: &quot; -&quot;; }
+div#activity dt.issue { background-image: url(../images/ticket.png); }
+div#activity dt.issue-edit { background-image: url(../images/ticket_edit.png); }
+div#activity dt.issue-closed { background-image: url(../images/ticket_checked.png); }
+div#activity dt.changeset { background-image: url(../images/changeset.png); }
+div#activity dt.news { background-image: url(../images/news.png); }
+div#activity dt.message { background-image: url(../images/message.png); }
+div#activity dt.reply { background-image: url(../images/comments.png); }
+div#activity dt.wiki-page { background-image: url(../images/wiki_edit.png); }
+div#activity dt.attachment { background-image: url(../images/attachment.png); }
+div#activity dt.document { background-image: url(../images/document.png); }
 
 div#roadmap fieldset.related-issues { margin-bottom: 1em; }
 div#roadmap fieldset.related-issues ul { margin-top: 0.3em; margin-bottom: 0.3em; }
@@ -186,7 +199,7 @@ div#version-summary { float:right; width:380px; margin-left: 16px; margin-bottom
 div#version-summary fieldset { margin-bottom: 1em; }
 div#version-summary .total-hours { text-align: right; }
 
-table#time-report td.hours { text-align: right; padding-right: 0.5em; }
+table#time-report td.hours, table#time-report th.period, table#time-report th.total { text-align: right; padding-right: 0.5em; }
 table#time-report tbody tr { font-style: italic; color: #777; }
 table#time-report tbody tr.last-level { font-style: normal; color: #555; }
 table#time-report tbody tr.total { font-style: normal; font-weight: bold; color: #555; background-color:#EEEEEE; }
@@ -195,7 +208,7 @@ table#time-report .hours-dec { font-size: 0.9em; }
 .total-hours { font-size: 110%; font-weight: bold; }
 .total-hours span.hours-int { font-size: 120%; }
 
-.autoscroll {overflow-x: auto; padding:1px; width:100%; margin-bottom: 1.2em;}
+.autoscroll {overflow-x: auto; padding:1px; margin-bottom: 1.2em;}
 #user_firstname, #user_lastname, #user_mail, #my_account_form select { width: 90%; }
 
 .pagination {font-size: 90%}
@@ -246,7 +259,7 @@ p.other-formats { text-align: right; font-size:0.9em; color: #666; }
 a.feed { background: url(../images/feed.png) no-repeat 1px 50%; padding: 2px 0px 3px 16px; }
 
 /***** Flash &amp; error messages ****/
-#errorExplanation, div.flash, .nodata {
+#errorExplanation, div.flash, .nodata, .warning {
     padding: 4px 4px 4px 30px;
     margin-bottom: 12px;
 	font-size: 1.1em;
@@ -269,7 +282,7 @@ div.flash.notice {
 	color: #005f00;
 }
 
-.nodata {
+.nodata, .warning {
     text-align: center;
 	background-color: #FFEBC1;
 	border-color: #FDBF3B;
@@ -575,7 +588,7 @@ vertical-align: middle;
 
 /***** Media print specific styles *****/
 @media print {
-  #top-menu, #header, #main-menu, #sidebar, #footer, .contextual { display:none; }
+  #top-menu, #header, #main-menu, #sidebar, #footer, .contextual, .other-formats { display:none; }
   #main { background: #fff; }
   #content { width: 99%; margin: 0; padding: 0; border: 0; background: #fff; }
 }</diff>
      <filename>public/stylesheets/application.css</filename>
    </modified>
    <modified>
      <diff>@@ -22,13 +22,13 @@
 	padding:1px;
 	z-index:9;
 }
-#context-menu li.folder ul {
-	position:absolute;
-	left:168px; /* IE6 */
-	top:-2px;
-}
+#context-menu li.folder ul { position:absolute; left:168px; /* IE6 */ top:-2px; }
 #context-menu li.folder&gt;ul { left:148px; }
 
+#context-menu.reverse-y li.folder&gt;ul { top:auto; bottom:0; }
+#context-menu.reverse-x li.folder ul { left:auto; right:168px; /* IE6 */ }
+#context-menu.reverse-x li.folder&gt;ul { right:148px; }
+
 #context-menu a {
 	border:1px solid white;
 	text-decoration:none;</diff>
      <filename>public/stylesheets/context_menu.css</filename>
    </modified>
    <modified>
      <diff>@@ -23,4 +23,17 @@ attachments_002:
   filesize: 28
   filename: document.txt
   author_id: 2
+attachments_003: 
+  created_on: 2006-07-19 21:07:27 +02:00
+  downloads: 0
+  content_type: image/gif
+  disk_filename: 060719210727_logo.gif
+  container_id: 4
+  digest: b91e08d0cf966d5c6ff411bd8c4cc3a2
+  id: 3
+  container_type: WikiPage
+  filesize: 280
+  filename: logo.gif
+  description: This is a logo
+  author_id: 2
   
\ No newline at end of file</diff>
      <filename>test/fixtures/attachments.yml</filename>
    </modified>
    <modified>
      <diff>@@ -3,7 +3,7 @@ custom_fields_001:
   name: Database
   min_length: 0
   regexp: &quot;&quot;
-  is_for_all: false
+  is_for_all: true
   type: IssueCustomField
   max_length: 0
   possible_values: MySQL|PostgreSQL|Oracle</diff>
      <filename>test/fixtures/custom_fields.yml</filename>
    </modified>
    <modified>
      <diff>@@ -1,7 +1,9 @@
 --- 
 queries_001: 
-  name: Multiple custom fields query
+  id: 1
   project_id: 1
+  is_public: true
+  name: Multiple custom fields query
   filters: |
     --- 
     cf_1: 
@@ -17,6 +19,51 @@ queries_001:
       - &quot;125&quot;
       :operator: &quot;=&quot;
 
-  id: 1
-  is_public: true
   user_id: 1
+  column_names: 
+queries_002: 
+  id: 2
+  project_id: 1
+  is_public: false
+  name: Private query for cookbook
+  filters: |
+    --- 
+    tracker_id: 
+      :values: 
+      - &quot;3&quot;
+      :operator: &quot;=&quot;
+    status_id: 
+      :values: 
+      - &quot;1&quot;
+      :operator: o
+
+  user_id: 3
+  column_names: 
+queries_003: 
+  id: 3
+  project_id: 
+  is_public: false
+  name: Private query for all projects
+  filters: |
+    --- 
+    tracker_id: 
+      :values: 
+      - &quot;3&quot;
+      :operator: &quot;=&quot;
+
+  user_id: 3
+  column_names: 
+queries_004: 
+  id: 4
+  project_id: 
+  is_public: true
+  name: Public query for all projects
+  filters: |
+    --- 
+    tracker_id: 
+      :values: 
+      - &quot;3&quot;
+      :operator: &quot;=&quot;
+
+  user_id: 2
+  column_names: </diff>
      <filename>test/fixtures/queries.yml</filename>
    </modified>
    <modified>
      <diff>@@ -57,7 +57,6 @@ roles_002:
     - :add_issue_notes
     - :move_issues
     - :delete_issues
-    - :manage_public_queries
     - :save_queries
     - :view_gantt
     - :view_calendar
@@ -94,7 +93,6 @@ roles_003:
     - :manage_issue_relations
     - :add_issue_notes
     - :move_issues
-    - :manage_public_queries
     - :save_queries
     - :view_gantt
     - :view_calendar</diff>
      <filename>test/fixtures/roles.yml</filename>
    </modified>
    <modified>
      <diff>@@ -15,7 +15,7 @@ time_entries_001:
   tyear: 2007
 time_entries_002: 
   created_on: 2007-03-23 14:11:04 +01:00
-  tweek: 12
+  tweek: 11
   tmonth: 3
   project_id: 1
   comments: &quot;&quot;
@@ -36,7 +36,7 @@ time_entries_003:
   updated_on: 2007-04-21 12:20:48 +02:00
   activity_id: 9
   spent_on: 2007-04-21
-  issue_id: 2
+  issue_id: 3
   id: 3
   hours: 1.0
   user_id: 1</diff>
      <filename>test/fixtures/time_entries.yml</filename>
    </modified>
    <modified>
      <diff>@@ -15,6 +15,8 @@ wiki_contents_002:
     h1. Another page
     
     This is a link to a ticket: #2
+    And this is an included page:
+    {{include(Page with an inline image)}}
   updated_on: 2007-03-08 00:18:07 +01:00
   page_id: 2
   id: 2
@@ -32,3 +34,17 @@ wiki_contents_003:
   version: 1
   author_id: 1
   comments: 
+wiki_contents_004: 
+  text: |-
+    h1. Page with an inline image
+    
+    This is an inline image:
+    
+    !logo.gif!
+  updated_on: 2007-03-08 00:18:07 +01:00
+  page_id: 4
+  id: 4
+  version: 1
+  author_id: 1
+  comments: 
+  
\ No newline at end of file</diff>
      <filename>test/fixtures/wiki_contents.yml</filename>
    </modified>
    <modified>
      <diff>@@ -14,4 +14,9 @@ wiki_pages_003:
   title: Start_page
   id: 3
   wiki_id: 2
+wiki_pages_004: 
+  created_on: 2007-03-08 00:18:07 +01:00
+  title: Page_with_an_inline_image
+  id: 4
+  wiki_id: 1
   
\ No newline at end of file</diff>
      <filename>test/fixtures/wiki_pages.yml</filename>
    </modified>
    <modified>
      <diff>@@ -181,6 +181,16 @@ class IssuesControllerTest &lt; Test::Unit::TestCase
     assert_equal 'Value for field 2', v.value
   end
   
+  def test_post_new_without_custom_fields_param
+    @request.session[:user_id] = 2
+    post :new, :project_id =&gt; 1, 
+               :issue =&gt; {:tracker_id =&gt; 1,
+                          :subject =&gt; 'This is the test_new issue',
+                          :description =&gt; 'This is the description',
+                          :priority_id =&gt; 5}
+    assert_redirected_to 'issues/show'
+  end
+  
   def test_copy_issue
     @request.session[:user_id] = 2
     get :new, :project_id =&gt; 1, :copy_from =&gt; 1
@@ -440,10 +450,11 @@ class IssuesControllerTest &lt; Test::Unit::TestCase
   end
   
   def test_destroy_issue_with_no_time_entries
+    assert_nil TimeEntry.find_by_issue_id(2)
     @request.session[:user_id] = 2
-    post :destroy, :id =&gt; 3
+    post :destroy, :id =&gt; 2
     assert_redirected_to 'projects/ecookbook/issues'
-    assert_nil Issue.find_by_id(3)
+    assert_nil Issue.find_by_id(2)
   end
 
   def test_destroy_issues_with_time_entries</diff>
      <filename>test/functional/issues_controller_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -54,6 +54,9 @@ class MessagesControllerTest &lt; Test::Unit::TestCase
   
   def test_post_new
     @request.session[:user_id] = 2
+    ActionMailer::Base.deliveries.clear
+    Setting.notified_events &lt;&lt; 'message_posted'
+    
     post :new, :board_id =&gt; 1,
                :message =&gt; { :subject =&gt; 'Test created message',
                              :content =&gt; 'Message body'}
@@ -63,6 +66,15 @@ class MessagesControllerTest &lt; Test::Unit::TestCase
     assert_equal 'Message body', message.content
     assert_equal 2, message.author_id
     assert_equal 1, message.board_id
+
+    mail = ActionMailer::Base.deliveries.last
+    assert_kind_of TMail::Mail, mail
+    assert_equal &quot;[#{message.board.project.name} - #{message.board.name}] Test created message&quot;, mail.subject
+    assert mail.body.include?('Message body')
+    # author
+    assert mail.bcc.include?('jsmith@somenet.foo')
+    # project member
+    assert mail.bcc.include?('dlopper@somenet.foo')
   end
   
   def test_get_edit</diff>
      <filename>test/functional/messages_controller_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -144,7 +144,7 @@ class ProjectsControllerTest &lt; Test::Unit::TestCase
                :content =&gt; /#{2.days.ago.to_date.day}/,
                :sibling =&gt; { :tag =&gt; &quot;dl&quot;,
                  :child =&gt; { :tag =&gt; &quot;dt&quot;,
-                   :attributes =&gt; { :class =&gt; 'journal' },
+                   :attributes =&gt; { :class =&gt; 'issue-edit' },
                    :child =&gt; { :tag =&gt; &quot;a&quot;,
                      :content =&gt; /(#{IssueStatus.find(2).name})/,
                    }</diff>
      <filename>test/functional/projects_controller_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -65,13 +65,24 @@ class RepositoriesCvsControllerTest &lt; Test::Unit::TestCase
     end
     
     def test_browse_directory
-      get :browse, :id =&gt; 1, :path =&gt; ['sources']
+      get :browse, :id =&gt; 1, :path =&gt; ['images']
       assert_response :success
       assert_template 'browse'
       assert_not_nil assigns(:entries)
-      entry = assigns(:entries).detect {|e| e.name == 'watchers_controller.rb'}
+      assert_equal ['add.png', 'delete.png', 'edit.png'], assigns(:entries).collect(&amp;:name)
+      entry = assigns(:entries).detect {|e| e.name == 'edit.png'}
+      assert_not_nil entry
       assert_equal 'file', entry.kind
-      assert_equal 'sources/watchers_controller.rb', entry.path
+      assert_equal 'images/edit.png', entry.path
+    end
+    
+    def test_browse_at_given_revision
+      Project.find(1).repository.fetch_changesets
+      get :browse, :id =&gt; 1, :path =&gt; ['images'], :rev =&gt; 1
+      assert_response :success
+      assert_template 'browse'
+      assert_not_nil assigns(:entries)
+      assert_equal ['delete.png', 'edit.png'], assigns(:entries).collect(&amp;:name)
     end
   
     def test_entry
@@ -90,6 +101,14 @@ class RepositoriesCvsControllerTest &lt; Test::Unit::TestCase
       get :entry, :id =&gt; 1, :path =&gt; ['sources', 'watchers_controller.rb'], :format =&gt; 'raw'
       assert_response :success
     end
+
+    def test_directory_entry
+      get :entry, :id =&gt; 1, :path =&gt; ['sources']
+      assert_response :success
+      assert_template 'browse'
+      assert_not_nil assigns(:entry)
+      assert_equal 'sources', assigns(:entry).name
+    end
     
     def test_diff
       Project.find(1).repository.fetch_changesets</diff>
      <filename>test/functional/repositories_cvs_controller_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -60,13 +60,22 @@ class RepositoriesDarcsControllerTest &lt; Test::Unit::TestCase
       assert_response :success
       assert_template 'browse'
       assert_not_nil assigns(:entries)
-      assert_equal 2, assigns(:entries).size
+      assert_equal ['delete.png', 'edit.png'], assigns(:entries).collect(&amp;:name)
       entry = assigns(:entries).detect {|e| e.name == 'edit.png'}
       assert_not_nil entry
       assert_equal 'file', entry.kind
       assert_equal 'images/edit.png', entry.path
     end
     
+    def test_browse_at_given_revision
+      Project.find(3).repository.fetch_changesets
+      get :browse, :id =&gt; 3, :path =&gt; ['images'], :rev =&gt; 1
+      assert_response :success
+      assert_template 'browse'
+      assert_not_nil assigns(:entries)
+      assert_equal ['delete.png'], assigns(:entries).collect(&amp;:name)
+    end
+    
     def test_changes
       get :changes, :id =&gt; 3, :path =&gt; ['images', 'edit.png']
       assert_response :success</diff>
      <filename>test/functional/repositories_darcs_controller_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,5 @@
 # redMine - project management software
-# Copyright (C) 2006-2007  Jean-Philippe Lang
+# Copyright (C) 2006-2008  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
@@ -61,13 +61,21 @@ class RepositoriesGitControllerTest &lt; Test::Unit::TestCase
       assert_response :success
       assert_template 'browse'
       assert_not_nil assigns(:entries)
-      assert_equal 2, assigns(:entries).size
+      assert_equal ['delete.png', 'edit.png'], assigns(:entries).collect(&amp;:name)
       entry = assigns(:entries).detect {|e| e.name == 'edit.png'}
       assert_not_nil entry
       assert_equal 'file', entry.kind
       assert_equal 'images/edit.png', entry.path
     end
     
+    def test_browse_at_given_revision
+      get :browse, :id =&gt; 3, :path =&gt; ['images'], :rev =&gt; '7234cb2750b63f47bff735edc50a1c0a433c2518'
+      assert_response :success
+      assert_template 'browse'
+      assert_not_nil assigns(:entries)
+      assert_equal ['delete.png'], assigns(:entries).collect(&amp;:name)
+    end
+
     def test_changes
       get :changes, :id =&gt; 3, :path =&gt; ['images', 'edit.png']
       assert_response :success
@@ -93,6 +101,14 @@ class RepositoriesGitControllerTest &lt; Test::Unit::TestCase
       assert @response.body.include?('WITHOUT ANY WARRANTY')
     end
   
+    def test_directory_entry
+      get :entry, :id =&gt; 3, :path =&gt; ['sources']
+      assert_response :success
+      assert_template 'browse'
+      assert_not_nil assigns(:entry)
+      assert_equal 'sources', assigns(:entry).name
+    end
+    
     def test_diff
       # Full diff of changeset 2f9c0091
       get :diff, :id =&gt; 3, :rev =&gt; '2f9c0091c754a91af7a9c478e36556b4bde8dcf7'</diff>
      <filename>test/functional/repositories_git_controller_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,5 @@
 # redMine - project management software
-# Copyright (C) 2006-2007  Jean-Philippe Lang
+# Copyright (C) 2006-2008  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
@@ -60,13 +60,21 @@ class RepositoriesMercurialControllerTest &lt; Test::Unit::TestCase
       assert_response :success
       assert_template 'browse'
       assert_not_nil assigns(:entries)
-      assert_equal 2, assigns(:entries).size
+      assert_equal ['delete.png', 'edit.png'], assigns(:entries).collect(&amp;:name)
       entry = assigns(:entries).detect {|e| e.name == 'edit.png'}
       assert_not_nil entry
       assert_equal 'file', entry.kind
       assert_equal 'images/edit.png', entry.path
     end
     
+    def test_browse_at_given_revision
+      get :browse, :id =&gt; 3, :path =&gt; ['images'], :rev =&gt; 0
+      assert_response :success
+      assert_template 'browse'
+      assert_not_nil assigns(:entries)
+      assert_equal ['delete.png'], assigns(:entries).collect(&amp;:name)
+    end
+    
     def test_changes
       get :changes, :id =&gt; 3, :path =&gt; ['images', 'edit.png']
       assert_response :success
@@ -91,7 +99,15 @@ class RepositoriesMercurialControllerTest &lt; Test::Unit::TestCase
       # File content
       assert @response.body.include?('WITHOUT ANY WARRANTY')
     end
-  
+
+    def test_directory_entry
+      get :entry, :id =&gt; 3, :path =&gt; ['sources']
+      assert_response :success
+      assert_template 'browse'
+      assert_not_nil assigns(:entry)
+      assert_equal 'sources', assigns(:entry).name
+    end
+    
     def test_diff
       # Full diff of changeset 4
       get :diff, :id =&gt; 3, :rev =&gt; 4</diff>
      <filename>test/functional/repositories_mercurial_controller_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,5 @@
 # redMine - project management software
-# Copyright (C) 2006-2007  Jean-Philippe Lang
+# Copyright (C) 2006-2008  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
@@ -58,11 +58,20 @@ class RepositoriesSubversionControllerTest &lt; Test::Unit::TestCase
       assert_response :success
       assert_template 'browse'
       assert_not_nil assigns(:entries)
+      assert_equal ['folder', '.project', 'helloworld.c', 'textfile.txt'], assigns(:entries).collect(&amp;:name)
       entry = assigns(:entries).detect {|e| e.name == 'helloworld.c'}
       assert_equal 'file', entry.kind
       assert_equal 'subversion_test/helloworld.c', entry.path
     end
-  
+
+    def test_browse_at_given_revision
+      get :browse, :id =&gt; 1, :path =&gt; ['subversion_test'], :rev =&gt; 4
+      assert_response :success
+      assert_template 'browse'
+      assert_not_nil assigns(:entries)
+      assert_equal ['folder', '.project', 'helloworld.c', 'helloworld.rb', 'textfile.txt'], assigns(:entries).collect(&amp;:name)
+    end
+      
     def test_entry
       get :entry, :id =&gt; 1, :path =&gt; ['subversion_test', 'helloworld.c']
       assert_response :success
@@ -80,6 +89,14 @@ class RepositoriesSubversionControllerTest &lt; Test::Unit::TestCase
       assert_response :success
     end
     
+    def test_directory_entry
+      get :entry, :id =&gt; 1, :path =&gt; ['subversion_test', 'folder']
+      assert_response :success
+      assert_template 'browse'
+      assert_not_nil assigns(:entry)
+      assert_equal 'folder', assigns(:entry).name
+    end
+    
     def test_diff
       get :diff, :id =&gt; 1, :rev =&gt; 3
       assert_response :success</diff>
      <filename>test/functional/repositories_subversion_controller_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -22,7 +22,7 @@ require 'timelog_controller'
 class TimelogController; def rescue_action(e) raise e end; end
 
 class TimelogControllerTest &lt; Test::Unit::TestCase
-  fixtures :projects, :roles, :members, :issues, :time_entries, :users, :trackers, :enumerations, :issue_statuses
+  fixtures :projects, :enabled_modules, :roles, :members, :issues, :time_entries, :users, :trackers, :enumerations, :issue_statuses, :custom_fields, :custom_values
 
   def setup
     @controller = TimelogController.new
@@ -78,30 +78,75 @@ class TimelogControllerTest &lt; Test::Unit::TestCase
     assert_response :success
     assert_template 'report'
   end
+
+  def test_report_all_time
+    get :report, :project_id =&gt; 1, :criterias =&gt; ['project', 'issue']
+    assert_response :success
+    assert_template 'report'
+    assert_not_nil assigns(:total_hours)
+    assert_equal &quot;162.90&quot;, &quot;%.2f&quot; % assigns(:total_hours)
+  end
+
+  def test_report_all_time_by_day
+    get :report, :project_id =&gt; 1, :criterias =&gt; ['project', 'issue'], :columns =&gt; 'day'
+    assert_response :success
+    assert_template 'report'
+    assert_not_nil assigns(:total_hours)
+    assert_equal &quot;162.90&quot;, &quot;%.2f&quot; % assigns(:total_hours)
+    assert_tag :tag =&gt; 'th', :content =&gt; '2007-03-12'
+  end
   
   def test_report_one_criteria
-    get :report, :project_id =&gt; 1, :period =&gt; 'week', :date_from =&gt; &quot;2007-04-01&quot;, :date_to =&gt; &quot;2007-04-30&quot;, :criterias =&gt; ['project']
+    get :report, :project_id =&gt; 1, :columns =&gt; 'week', :from =&gt; &quot;2007-04-01&quot;, :to =&gt; &quot;2007-04-30&quot;, :criterias =&gt; ['project']
     assert_response :success
     assert_template 'report'
     assert_not_nil assigns(:total_hours)
     assert_equal &quot;8.65&quot;, &quot;%.2f&quot; % assigns(:total_hours)
- end
+  end
   
   def test_report_two_criterias
-    get :report, :project_id =&gt; 1, :period =&gt; 'month', :date_from =&gt; &quot;2007-01-01&quot;, :date_to =&gt; &quot;2007-12-31&quot;, :criterias =&gt; [&quot;member&quot;, &quot;activity&quot;]
+    get :report, :project_id =&gt; 1, :columns =&gt; 'month', :from =&gt; &quot;2007-01-01&quot;, :to =&gt; &quot;2007-12-31&quot;, :criterias =&gt; [&quot;member&quot;, &quot;activity&quot;]
     assert_response :success
     assert_template 'report'
     assert_not_nil assigns(:total_hours)
     assert_equal &quot;162.90&quot;, &quot;%.2f&quot; % assigns(:total_hours)
   end
   
+  def test_report_custom_field_criteria
+    get :report, :project_id =&gt; 1, :criterias =&gt; ['project', 'cf_1']
+    assert_response :success
+    assert_template 'report'
+    assert_not_nil assigns(:total_hours)
+    assert_not_nil assigns(:criterias)
+    assert_equal 2, assigns(:criterias).size
+    assert_equal &quot;162.90&quot;, &quot;%.2f&quot; % assigns(:total_hours)
+    # Custom field column
+    assert_tag :tag =&gt; 'th', :content =&gt; 'Database'
+    # Custom field row
+    assert_tag :tag =&gt; 'td', :content =&gt; 'MySQL',
+                             :sibling =&gt; { :tag =&gt; 'td', :attributes =&gt; { :class =&gt; 'hours' },
+                                                         :child =&gt; { :tag =&gt; 'span', :attributes =&gt; { :class =&gt; 'hours hours-int' },
+                                                                                     :content =&gt; '1' }}
+  end
+  
   def test_report_one_criteria_no_result
-    get :report, :project_id =&gt; 1, :period =&gt; 'week', :date_from =&gt; &quot;1998-04-01&quot;, :date_to =&gt; &quot;1998-04-30&quot;, :criterias =&gt; ['project']
+    get :report, :project_id =&gt; 1, :columns =&gt; 'week', :from =&gt; &quot;1998-04-01&quot;, :to =&gt; &quot;1998-04-30&quot;, :criterias =&gt; ['project']
     assert_response :success
     assert_template 'report'
     assert_not_nil assigns(:total_hours)
     assert_equal &quot;0.00&quot;, &quot;%.2f&quot; % assigns(:total_hours)
- end
+  end
+ 
+  def test_report_csv_export
+    get :report, :project_id =&gt; 1, :columns =&gt; 'month', :from =&gt; &quot;2007-01-01&quot;, :to =&gt; &quot;2007-06-30&quot;, :criterias =&gt; [&quot;project&quot;, &quot;member&quot;, &quot;activity&quot;], :format =&gt; &quot;csv&quot;
+    assert_response :success
+    assert_equal 'text/csv', @response.content_type
+    lines = @response.body.chomp.split(&quot;\n&quot;)
+    # Headers
+    assert_equal 'Project,Member,Activity,2007-1,2007-2,2007-3,2007-4,2007-5,2007-6,Total', lines.first
+    # Total row
+    assert_equal 'Total,&quot;&quot;,&quot;&quot;,&quot;&quot;,&quot;&quot;,154.25,8.65,&quot;&quot;,&quot;&quot;,162.90', lines.last
+  end
 
   def test_details_at_project_level
     get :details, :project_id =&gt; 1
@@ -114,8 +159,8 @@ class TimelogControllerTest &lt; Test::Unit::TestCase
     assert_not_nil assigns(:total_hours)
     assert_equal &quot;162.90&quot;, &quot;%.2f&quot; % assigns(:total_hours)
     # display all time by default
-    assert_nil assigns(:from)
-    assert_nil assigns(:to)
+    assert_equal '2007-03-11'.to_date, assigns(:from)
+    assert_equal '2007-04-22'.to_date, assigns(:to)
   end
   
   def test_details_at_project_level_with_date_range
@@ -149,8 +194,8 @@ class TimelogControllerTest &lt; Test::Unit::TestCase
     assert_not_nil assigns(:total_hours)
     assert_equal 154.25, assigns(:total_hours)
     # display all time by default
-    assert_nil assigns(:from)
-    assert_nil assigns(:to)
+    assert_equal '2007-03-11'.to_date, assigns(:from)
+    assert_equal '2007-04-22'.to_date, assigns(:to)
   end
   
   def test_details_csv_export
@@ -158,6 +203,6 @@ class TimelogControllerTest &lt; Test::Unit::TestCase
     assert_response :success
     assert_equal 'text/csv', @response.content_type
     assert @response.body.include?(&quot;Date,User,Activity,Project,Issue,Tracker,Subject,Hours,Comment\n&quot;)
-    assert @response.body.include?(&quot;\n04/21/2007,redMine Admin,Design,eCookbook,2,Feature request,Add ingredients categories,1.0,\&quot;\&quot;\n&quot;)
+    assert @response.body.include?(&quot;\n04/21/2007,redMine Admin,Design,eCookbook,3,Bug,Error 281 when updating a recipe,1.0,\&quot;\&quot;\n&quot;)
   end
 end</diff>
      <filename>test/functional/timelog_controller_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -22,7 +22,7 @@ require 'wiki_controller'
 class WikiController; def rescue_action(e) raise e end; end
 
 class WikiControllerTest &lt; Test::Unit::TestCase
-  fixtures :projects, :users, :roles, :members, :enabled_modules, :wikis, :wiki_pages, :wiki_contents, :wiki_content_versions
+  fixtures :projects, :users, :roles, :members, :enabled_modules, :wikis, :wiki_pages, :wiki_contents, :wiki_content_versions, :attachments
   
   def setup
     @controller = WikiController.new
@@ -43,6 +43,10 @@ class WikiControllerTest &lt; Test::Unit::TestCase
     assert_response :success
     assert_template 'show'
     assert_tag :tag =&gt; 'h1', :content =&gt; /Another page/
+    # Included page with an inline image
+    assert_tag :tag =&gt; 'p', :content =&gt; /This is an inline image/
+    assert_tag :tag =&gt; 'img', :attributes =&gt; { :src =&gt; '/attachments/download/3',
+                                               :alt =&gt; 'This is a logo' }
   end
   
   def test_show_unexistent_page_without_edit_right
@@ -147,7 +151,7 @@ class WikiControllerTest &lt; Test::Unit::TestCase
     assert_template 'special_page_index'
     pages = assigns(:pages)
     assert_not_nil pages
-    assert_equal 2, pages.size
+    assert_equal Project.find(1).wiki.pages.size, pages.size
     assert_tag :tag =&gt; 'a', :attributes =&gt; { :href =&gt; '/wiki/ecookbook/CookBook_documentation' },
                             :content =&gt; /CookBook documentation/
   end</diff>
      <filename>test/functional/wiki_controller_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -41,22 +41,22 @@ class ChangesetTest &lt; Test::Unit::TestCase
   end
 
   def test_previous
-    changeset = Changeset.find_by_revision(3)
-    assert_equal Changeset.find_by_revision(2), changeset.previous
+    changeset = Changeset.find_by_revision('3')
+    assert_equal Changeset.find_by_revision('2'), changeset.previous
   end
 
   def test_previous_nil
-    changeset = Changeset.find_by_revision(1)
+    changeset = Changeset.find_by_revision('1')
     assert_nil changeset.previous
   end
 
   def test_next
-    changeset = Changeset.find_by_revision(2)
-    assert_equal Changeset.find_by_revision(3), changeset.next
+    changeset = Changeset.find_by_revision('2')
+    assert_equal Changeset.find_by_revision('3'), changeset.next
   end
 
   def test_next_nil
-    changeset = Changeset.find_by_revision(4)
+    changeset = Changeset.find_by_revision('4')
     assert_nil changeset.next
   end
 end</diff>
      <filename>test/unit/changeset_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -20,7 +20,7 @@ require File.dirname(__FILE__) + '/../../test_helper'
 class ApplicationHelperTest &lt; HelperTestCase
   include ApplicationHelper
   include ActionView::Helpers::TextHelper
-  fixtures :projects, :repositories, :changesets, :trackers, :issue_statuses, :issues, :documents, :versions, :wikis, :wiki_pages, :wiki_contents
+  fixtures :projects, :repositories, :changesets, :trackers, :issue_statuses, :issues, :documents, :versions, :wikis, :wiki_pages, :wiki_contents, :roles, :enabled_modules
 
   def setup
     super
@@ -134,8 +134,9 @@ class ApplicationHelperTest &lt; HelperTestCase
   
   def test_html_tags
     to_test = {
-      &quot;&lt;div&gt;content&lt;/div&gt;&quot; =&gt; &quot;&lt;p&gt;&amp;lt;div&gt;content&amp;lt;/div&gt;&lt;/p&gt;&quot;,
-      &quot;&lt;script&gt;some script;&lt;/script&gt;&quot; =&gt; &quot;&lt;p&gt;&amp;lt;script&gt;some script;&amp;lt;/script&gt;&lt;/p&gt;&quot;,
+      &quot;&lt;div&gt;content&lt;/div&gt;&quot; =&gt; &quot;&lt;p&gt;&amp;lt;div&amp;gt;content&amp;lt;/div&amp;gt;&lt;/p&gt;&quot;,
+      &quot;&lt;div class=\&quot;bold\&quot;&gt;content&lt;/div&gt;&quot; =&gt; &quot;&lt;p&gt;&amp;lt;div class=\&quot;bold\&quot;&amp;gt;content&amp;lt;/div&amp;gt;&lt;/p&gt;&quot;,
+      &quot;&lt;script&gt;some script;&lt;/script&gt;&quot; =&gt; &quot;&lt;p&gt;&amp;lt;script&amp;gt;some script;&amp;lt;/script&amp;gt;&lt;/p&gt;&quot;,
       # do not escape pre/code tags
       &quot;&lt;pre&gt;\nline 1\nline2&lt;/pre&gt;&quot; =&gt; &quot;&lt;pre&gt;\nline 1\nline2&lt;/pre&gt;&quot;,
       &quot;&lt;pre&gt;&lt;code&gt;\nline 1\nline2&lt;/code&gt;&lt;/pre&gt;&quot; =&gt; &quot;&lt;pre&gt;&lt;code&gt;\nline 1\nline2&lt;/code&gt;&lt;/pre&gt;&quot;,
@@ -167,6 +168,24 @@ class ApplicationHelperTest &lt; HelperTestCase
     assert_equal '&lt;p&gt;{{hello_world}}&lt;/p&gt;', textilizable(text)
   end
   
+  def test_macro_include
+    @project = Project.find(1)
+    # include a page of the current project wiki
+    text = &quot;{{include(Another page)}}&quot;
+    assert textilizable(text).match(/This is a link to a ticket/)
+    
+    @project = nil
+    # include a page of a specific project wiki
+    text = &quot;{{include(ecookbook:Another page)}}&quot;
+    assert textilizable(text).match(/This is a link to a ticket/)
+
+    text = &quot;{{include(ecookbook:)}}&quot;
+    assert textilizable(text).match(/CookBook documentation/)
+
+    text = &quot;{{include(unknowidentifier:somepage)}}&quot;
+    assert textilizable(text).match(/Unknow project/)
+  end
+  
   def test_date_format_default
     today = Date.today
     Setting.date_format = ''    </diff>
      <filename>test/unit/helpers/application_helper_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -20,6 +20,13 @@ require File.dirname(__FILE__) + '/../test_helper'
 class IssueTest &lt; Test::Unit::TestCase
   fixtures :projects, :users, :members, :trackers, :projects_trackers, :issue_statuses, :issue_categories, :enumerations, :issues, :custom_fields, :custom_values, :time_entries
 
+  def test_create
+    issue = Issue.new(:project_id =&gt; 1, :tracker_id =&gt; 1, :author_id =&gt; 3, :status_id =&gt; 1, :priority =&gt; Enumeration.get_values('IPRI').first, :subject =&gt; 'test_create', :description =&gt; 'IssueTest#test_create', :estimated_hours =&gt; '1:30')
+    assert issue.save
+    issue.reload
+    assert_equal 1.5, issue.estimated_hours
+  end
+  
   def test_category_based_assignment
     issue = Issue.create(:project_id =&gt; 1, :tracker_id =&gt; 1, :author_id =&gt; 3, :status_id =&gt; 1, :priority =&gt; Enumeration.get_values('IPRI').first, :subject =&gt; 'Assignment test', :description =&gt; 'Assignment test', :category_id =&gt; 1)
     assert_equal IssueCategory.find(1).assigned_to, issue.assigned_to
@@ -48,6 +55,8 @@ class IssueTest &lt; Test::Unit::TestCase
     IssueRelation.create(:issue_from =&gt; issue1, :issue_to =&gt; issue2, :relation_type =&gt; IssueRelation::TYPE_DUPLICATES)
     # And 3 is a dupe of 2
     IssueRelation.create(:issue_from =&gt; issue2, :issue_to =&gt; issue3, :relation_type =&gt; IssueRelation::TYPE_DUPLICATES)
+    # And 3 is a dupe of 1 (circular duplicates)
+    IssueRelation.create(:issue_from =&gt; issue1, :issue_to =&gt; issue3, :relation_type =&gt; IssueRelation::TYPE_DUPLICATES)
     
     assert issue1.reload.duplicates.include?(issue2)
     </diff>
      <filename>test/unit/issue_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -18,7 +18,7 @@
 require File.dirname(__FILE__) + '/../test_helper'
 
 class ProjectTest &lt; Test::Unit::TestCase
-  fixtures :projects, :issues, :issue_statuses, :journals, :journal_details, :users, :members, :roles, :projects_trackers, :trackers
+  fixtures :projects, :issues, :issue_statuses, :journals, :journal_details, :users, :members, :roles, :projects_trackers, :trackers, :boards
 
   def setup
     @ecookbook = Project.find(1)
@@ -84,12 +84,15 @@ class ProjectTest &lt; Test::Unit::TestCase
     assert_equal 2, @ecookbook.members.size
     # and 1 is locked
     assert_equal 3, Member.find(:all, :conditions =&gt; ['project_id = ?', @ecookbook.id]).size
+    # some boards
+    assert @ecookbook.boards.any?
     
     @ecookbook.destroy
     # make sure that the project non longer exists
     assert_raise(ActiveRecord::RecordNotFound) { Project.find(@ecookbook.id) }
-    # make sure all members have been removed
-    assert_equal 0, Member.find(:all, :conditions =&gt; ['project_id = ?', @ecookbook.id]).size
+    # make sure related data was removed
+    assert Member.find(:all, :conditions =&gt; ['project_id = ?', @ecookbook.id]).empty?
+    assert Board.find(:all, :conditions =&gt; ['project_id = ?', @ecookbook.id]).empty?
   end
   
   def test_subproject_ok</diff>
      <filename>test/unit/project_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,5 @@
 # redMine - project management software
-# Copyright (C) 2006-2007  Jean-Philippe Lang
+# Copyright (C) 2006-2008  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
@@ -18,12 +18,12 @@
 require File.dirname(__FILE__) + '/../test_helper'
 
 class QueryTest &lt; Test::Unit::TestCase
-  fixtures :projects, :users, :trackers, :issue_statuses, :issue_categories, :enumerations, :issues, :custom_fields, :custom_values, :queries
+  fixtures :projects, :users, :members, :roles, :trackers, :issue_statuses, :issue_categories, :enumerations, :issues, :custom_fields, :custom_values, :queries
 
   def test_query_with_multiple_custom_fields
     query = Query.find(1)
     assert query.valid?
-    assert query.statement.include?(&quot;custom_values.value IN ('MySQL')&quot;)
+    assert query.statement.include?(&quot;#{CustomValue.table_name}.value IN ('MySQL')&quot;)
     issues = Issue.find :all,:include =&gt; [ :assigned_to, :status, :tracker, :project, :priority ], :conditions =&gt; query.statement
     assert_equal 1, issues.length
     assert_equal Issue.find(3), issues.first
@@ -41,4 +41,34 @@ class QueryTest &lt; Test::Unit::TestCase
     c = q.columns.first
     assert q.has_column?(c)
   end
+  
+  def test_editable_by
+    admin = User.find(1)
+    manager = User.find(2)
+    developer = User.find(3)
+    
+    # Public query on project 1
+    q = Query.find(1)
+    assert q.editable_by?(admin)
+    assert q.editable_by?(manager)
+    assert !q.editable_by?(developer)
+
+    # Private query on project 1
+    q = Query.find(2)
+    assert q.editable_by?(admin)
+    assert !q.editable_by?(manager)
+    assert q.editable_by?(developer)
+
+    # Private query for all projects
+    q = Query.find(3)
+    assert q.editable_by?(admin)
+    assert !q.editable_by?(manager)
+    assert q.editable_by?(developer)
+
+    # Public query for all projects
+    q = Query.find(4)
+    assert q.editable_by?(admin)
+    assert !q.editable_by?(manager)
+    assert !q.editable_by?(developer)
+  end
 end</diff>
      <filename>test/unit/query_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -36,13 +36,13 @@ class RepositoryBazaarTest &lt; Test::Unit::TestCase
       
       assert_equal 4, @repository.changesets.count
       assert_equal 9, @repository.changes.count
-      assert_equal 'Initial import', @repository.changesets.find_by_revision(1).comments
+      assert_equal 'Initial import', @repository.changesets.find_by_revision('1').comments
     end
     
     def test_fetch_changesets_incremental
       @repository.fetch_changesets
       # Remove changesets with revision &gt; 5
-      @repository.changesets.find(:all, :conditions =&gt; 'revision &gt; 2').each(&amp;:destroy)
+      @repository.changesets.find(:all).each {|c| c.destroy if c.revision.to_i &gt; 2}
       @repository.reload
       assert_equal 2, @repository.changesets.count
       </diff>
      <filename>test/unit/repository_bazaar_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -35,13 +35,13 @@ class RepositoryDarcsTest &lt; Test::Unit::TestCase
       
       assert_equal 6, @repository.changesets.count
       assert_equal 13, @repository.changes.count
-      assert_equal &quot;Initial commit.&quot;, @repository.changesets.find_by_revision(1).comments
+      assert_equal &quot;Initial commit.&quot;, @repository.changesets.find_by_revision('1').comments
     end
     
     def test_fetch_changesets_incremental
       @repository.fetch_changesets
       # Remove changesets with revision &gt; 3
-      @repository.changesets.find(:all, :conditions =&gt; 'revision &gt; 3').each(&amp;:destroy)
+      @repository.changesets.find(:all).each {|c| c.destroy if c.revision.to_i &gt; 3}
       @repository.reload
       assert_equal 3, @repository.changesets.count
       </diff>
      <filename>test/unit/repository_darcs_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -35,13 +35,13 @@ class RepositoryMercurialTest &lt; Test::Unit::TestCase
       
       assert_equal 6, @repository.changesets.count
       assert_equal 11, @repository.changes.count
-      assert_equal &quot;Initial import.\nThe repository contains 3 files.&quot;, @repository.changesets.find_by_revision(0).comments
+      assert_equal &quot;Initial import.\nThe repository contains 3 files.&quot;, @repository.changesets.find_by_revision('0').comments
     end
     
     def test_fetch_changesets_incremental
       @repository.fetch_changesets
       # Remove changesets with revision &gt; 2
-      @repository.changesets.find(:all, :conditions =&gt; 'revision &gt; 2').each(&amp;:destroy)
+      @repository.changesets.find(:all).each {|c| c.destroy if c.revision.to_i &gt; 2}
       @repository.reload
       assert_equal 3, @repository.changesets.count
       </diff>
      <filename>test/unit/repository_mercurial_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -35,13 +35,13 @@ class RepositorySubversionTest &lt; Test::Unit::TestCase
       
       assert_equal 8, @repository.changesets.count
       assert_equal 16, @repository.changes.count
-      assert_equal 'Initial import.', @repository.changesets.find_by_revision(1).comments
+      assert_equal 'Initial import.', @repository.changesets.find_by_revision('1').comments
     end
     
     def test_fetch_changesets_incremental
       @repository.fetch_changesets
       # Remove changesets with revision &gt; 5
-      @repository.changesets.find(:all, :conditions =&gt; 'revision &gt; 5').each(&amp;:destroy)
+      @repository.changesets.find(:all).each {|c| c.destroy if c.revision.to_i &gt; 5}
       @repository.reload
       assert_equal 5, @repository.changesets.count
       </diff>
      <filename>test/unit/repository_subversion_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -25,11 +25,12 @@ module Redmine
       module ClassMethods
         def acts_as_event(options = {})
           return if self.included_modules.include?(Redmine::Acts::Event::InstanceMethods)
-          options[:datetime] ||= 'created_on'
-          options[:title] ||= 'title'
-          options[:description] ||= 'description'
-          options[:author] ||= 'author'
+          options[:datetime] ||= :created_on
+          options[:title] ||= :title
+          options[:description] ||= :description
+          options[:author] ||= :author
           options[:url] ||= {:controller =&gt; 'welcome'}
+          options[:type] ||= self.name.underscore.dasherize
           cattr_accessor :event_options
           self.event_options = options 
           send :include, Redmine::Acts::Event::InstanceMethods
@@ -41,11 +42,17 @@ module Redmine
           base.extend ClassMethods
         end
         
-        %w(datetime title description author).each do |attr|
+        %w(datetime title description author type).each do |attr|
           src = &lt;&lt;-END_SRC
             def event_#{attr}
               option = event_options[:#{attr}]
-              option.is_a?(Proc) ? option.call(self) : send(option)
+              if option.is_a?(Proc)
+                option.call(self)
+              elsif option.is_a?(Symbol)
+                send(option)
+              else
+                option
+              end
             end
           END_SRC
           class_eval src, __FILE__, __LINE__</diff>
      <filename>vendor/plugins/acts_as_event/lib/acts_as_event.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>be071deae29935ebb4dbcd3a7e445e290061b883</id>
    </parent>
  </parents>
  <author>
    <name>Jean-Philippe Lang</name>
    <email>jp_lang@yahoo.fr</email>
  </author>
  <url>http://github.com/edavis10/redmine/commit/10191813ec9b5671ffd58008fcc832379f811009</url>
  <id>10191813ec9b5671ffd58008fcc832379f811009</id>
  <committed-date>2008-04-28T03:36:12-07:00</committed-date>
  <authored-date>2008-04-28T03:36:12-07:00</authored-date>
  <message>Merged r1307 to r1369 from trunk.

git-svn-id: http://redmine.rubyforge.org/svn/branches/0.7-stable@1370 e93f8b46-1217-0410-a6f0-8f06a7374b81</message>
  <tree>1238124192c80d6d53ccb907580394c5bd1b9f96</tree>
  <committer>
    <name>Jean-Philippe Lang</name>
    <email>jp_lang@yahoo.fr</email>
  </committer>
</commit>
