<% i = 0 %>
-<% split_on = (@issue.custom_field_values.size / 2.0).ceil - 1 %>
+<% split_on = (@issue.editable_custom_field_values.size / 2.0).ceil - 1 %>
 <% @issue.editable_custom_field_values.each do |value| %>
   
<%= custom_field_tag_with_label :issue, value, :required => @issue.required_attribute?(value.custom_field_id) %>
 <% if i == split_on -%>
Index: app/views/mailer/issue_edit.html.erb
===================================================================
--- app/views/mailer/issue_edit.html.erb	(revision 11293)
+++ app/views/mailer/issue_edit.html.erb	(working copy)
@@ -1,11 +1,11 @@
 <%= l(:text_issue_updated, :id => "##{@issue.id}", :author => h(@journal.user)) %>
 
 
-<% details_to_strings(@journal.details, false, :only_path => false).each do |string| %>
+<% details_to_strings(@journal.details, false, :only_path => false, :user => @auser).each do |string| %>
   - <%= string %>
 
 <% end %>
 
 
 <%= textilizable(@journal, :notes, :only_path => false) %>
 
-<%= render :partial => 'issue', :formats => [:html], :locals => { :issue => @issue, :issue_url => @issue_url } %>
+<%= render :partial => 'issue', :formats => [:html], :locals => { :issue => @issue, :issue_url => @issue_url, :user => @auser } %>
Index: app/views/mailer/_issue.text.erb
===================================================================
--- app/views/mailer/_issue.text.erb	(revision 11293)
+++ app/views/mailer/_issue.text.erb	(working copy)
@@ -2,12 +2,25 @@
 <%= issue_url %>
 
 * <%=l(:field_author)%>: <%= issue.author %>
+<% unless issue.hidden_attribute?('status', user) %>
 * <%=l(:field_status)%>: <%= issue.status %>
+<% end %>
+<% unless issue.hidden_attribute?('priority', user) %>
 * <%=l(:field_priority)%>: <%= issue.priority %>
+<% end %>
+<% unless issue.disabled_core_fields.include?('assigned_to_id') || issue.hidden_attribute?('assigned_to_id', user) %>
 * <%=l(:field_assigned_to)%>: <%= issue.assigned_to %>
+<% end %>
+<% unless issue.disabled_core_fields.include?('category_id') || issue.hidden_attribute?('category_id', user) %>
 * <%=l(:field_category)%>: <%= issue.category %>
+<% end %>
+<% unless issue.disabled_core_fields.include?('fixed_version_id') || issue.hidden_attribute?('fixed_version_id', user) %>
 * <%=l(:field_fixed_version)%>: <%= issue.fixed_version %>
-<% issue.custom_field_values.each do |c| %>* <%= c.custom_field.name %>: <%= show_value(c) %>
+<% end %>
+<% issue.custom_field_values.each do |c| %>
+<% unless issue.hidden_attribute?(c.custom_field.id, user) %>
+* <%= c.custom_field.name %>: <%= show_value(c) %>
+<% end %>
 <% end -%>
 ----------------------------------------
 <%= issue.description %>
Index: app/views/mailer/issue_add.text.erb
===================================================================
--- app/views/mailer/issue_add.text.erb	(revision 11293)
+++ app/views/mailer/issue_add.text.erb	(working copy)
@@ -1,4 +1,4 @@
 <%= l(:text_issue_added, :id => "##{@issue.id}", :author => @issue.author) %>
 
 ----------------------------------------
-<%= render :partial => 'issue', :formats => [:text], :locals => { :issue => @issue, :issue_url => @issue_url } %>
+<%= render :partial => 'issue', :formats => [:text], :locals => { :issue => @issue, :issue_url => @issue_url, :user => @auser } %>
Index: app/views/mailer/_issue.html.erb
===================================================================
--- app/views/mailer/_issue.html.erb	(revision 11293)
+++ app/views/mailer/_issue.html.erb	(working copy)
@@ -2,13 +2,25 @@
 
 
 - <%=l(:field_author)%>: <%=h issue.author %>
 
-- <%=l(:field_status)%>: <%=h issue.status %>
 
-- <%=l(:field_priority)%>: <%=h issue.priority %>
 
-- <%=l(:field_assigned_to)%>: <%=h issue.assigned_to %>
 
-- <%=l(:field_category)%>: <%=h issue.category %>
 
-- <%=l(:field_fixed_version)%>: <%=h issue.fixed_version %>
 
+<% unless issue.hidden_attribute?('status', user) %>
+  - <%=l(:field_status)%>: <%=h issue.status %>
 
+<% end %>
+<% unless issue.hidden_attribute?('priority', user) %>
+  - <%=l(:field_priority)%>: <%=h issue.priority %>
 
+<% end %>
+<% unless issue.disabled_core_fields.include?('assigned_to_id') || issue.hidden_attribute?('assigned_to_id', user) %>
+  - <%=l(:field_assigned_to)%>: <%=h issue.assigned_to %>
 
+<% end %>
+<% unless issue.disabled_core_fields.include?('category_id') || issue.hidden_attribute?('category_id', user) %>
+  - <%=l(:field_category)%>: <%=h issue.category %>
 
+<% end %>
+<% unless issue.disabled_core_fields.include?('fixed_version_id') || issue.hidden_attribute?('fixed_version_id', user) %>
+  - <%=l(:field_fixed_version)%>: <%=h issue.fixed_version %>
 
+<% end %>
 <% issue.custom_field_values.each do |c| %>
-  - <%=h c.custom_field.name %>: <%=h show_value(c) %>
 
+  <% unless issue.hidden_attribute?(c.custom_field.id, user) %>
+    - <%=h c.custom_field.name %>: <%=h show_value(c) %>
 
+  <% end %>
 <% end %>
 
 
Index: app/views/mailer/issue_add.html.erb
===================================================================
--- app/views/mailer/issue_add.html.erb	(revision 11293)
+++ app/views/mailer/issue_add.html.erb	(working copy)
@@ -1,3 +1,3 @@
 <%= l(:text_issue_added, :id => "##{@issue.id}", :author => h(@issue.author)) %>
 
-<%= render :partial => 'issue', :formats => [:html], :locals => { :issue => @issue, :issue_url => @issue_url } %>
+<%= render :partial => 'issue', :formats => [:html], :locals => { :issue => @issue, :issue_url => @issue_url, :user => @auser } %>
Index: app/views/mailer/issue_edit.text.erb
===================================================================
--- app/views/mailer/issue_edit.text.erb	(revision 11293)
+++ app/views/mailer/issue_edit.text.erb	(working copy)
@@ -1,6 +1,6 @@
 <%= l(:text_issue_updated, :id => "##{@issue.id}", :author => @journal.user) %>
 
-<% details_to_strings(@journal.details, true).each do |string| -%>
+<% details_to_strings(@journal.details, true, :user => @auser).each do |string| -%>
 <%= string %>
 <% end -%>
 
@@ -9,4 +9,4 @@
 
 <% end -%>
 ----------------------------------------
-<%= render :partial => 'issue', :formats => [:text], :locals => { :issue => @issue, :issue_url => @issue_url } %>
+<%= render :partial => 'issue', :formats => [:text], :locals => { :issue => @issue, :issue_url => @issue_url, :user => @auser } %>
Index: lib/plugins/acts_as_watchable/lib/acts_as_watchable.rb
===================================================================
--- lib/plugins/acts_as_watchable/lib/acts_as_watchable.rb	(revision 11293)
+++ lib/plugins/acts_as_watchable/lib/acts_as_watchable.rb	(working copy)
@@ -81,6 +81,17 @@
           notified_watchers.collect(&:mail)
         end
 
+        # Returns an array of watchers
+        def watcher_recipient_users
+          notified = watcher_users.active
+          notified.reject! {|user| user.mail_notification == 'none'}
+
+          if respond_to?(:visible?)
+            notified.reject! {|user| !visible?(user)}
+          end
+          notified
+        end
+
         module ClassMethods; end
       end
     end
Index: lib/redmine/export/pdf.rb
===================================================================
--- lib/redmine/export/pdf.rb	(revision 10764)
+++ lib/redmine/export/pdf.rb	(working copy)
@@ -520,17 +520,17 @@
         pdf.Ln
 
         left = []
-        left << [l(:field_status), issue.status]
-        left << [l(:field_priority), issue.priority]
-        left << [l(:field_assigned_to), issue.assigned_to] unless issue.disabled_core_fields.include?('assigned_to_id')
-        left << [l(:field_category), issue.category] unless issue.disabled_core_fields.include?('category_id')
-        left << [l(:field_fixed_version), issue.fixed_version] unless issue.disabled_core_fields.include?('fixed_version_id')
+        left << [l(:field_status), issue.status] unless issue.hidden_attribute?('status')
+        left << [l(:field_priority), issue.priority] unless issue.hidden_attribute?('priority')
+        left << [l(:field_assigned_to), issue.assigned_to] unless issue.disabled_core_fields.include?('assigned_to_id') or issue.hidden_attribute?('assigned_to_id')
+        left << [l(:field_category), issue.category] unless issue.disabled_core_fields.include?('category_id') or issue.hidden_attribute?('category_id')
+        left << [l(:field_fixed_version), issue.fixed_version] unless issue.disabled_core_fields.include?('fixed_version_id') or issue.hidden_attribute?('fixed_version_id')
 
         right = []
-        right << [l(:field_start_date), format_date(issue.start_date)] unless issue.disabled_core_fields.include?('start_date')
-        right << [l(:field_due_date), format_date(issue.due_date)] unless issue.disabled_core_fields.include?('due_date')
-        right << [l(:field_done_ratio), "#{issue.done_ratio}%"] unless issue.disabled_core_fields.include?('done_ratio')
-        right << [l(:field_estimated_hours), l_hours(issue.estimated_hours)] unless issue.disabled_core_fields.include?('estimated_hours')
+        right << [l(:field_start_date), format_date(issue.start_date)] unless issue.disabled_core_fields.include?('start_date') or issue.hidden_attribute?('start_date')
+        right << [l(:field_due_date), format_date(issue.due_date)] unless issue.disabled_core_fields.include?('due_date') or issue.hidden_attribute?('due_date')
+        right << [l(:field_done_ratio), "#{issue.done_ratio}%"] unless issue.disabled_core_fields.include?('done_ratio') or issue.hidden_attribute?('done_ratio')
+        right << [l(:field_estimated_hours), l_hours(issue.estimated_hours)] unless issue.disabled_core_fields.include?('estimated_hours') or issue.hidden_attribute?('estimated_hours')
         right << [l(:label_spent_time), l_hours(issue.total_spent_hours)] if User.current.allowed_to?(:view_time_entries, issue.project)
 
         rows = left.size > right.size ? left.size : right.size
@@ -541,9 +541,9 @@
           right << nil
         end
 
-        half = (issue.custom_field_values.size / 2.0).ceil
-        issue.custom_field_values.each_with_index do |custom_value, i|
-          (i < half ? left : right) << [custom_value.custom_field.name, show_value(custom_value)]
+        half = (issue.viewable_custom_field_values.size / 2.0).ceil
+        issue.viewable_custom_field_values.each_with_index do |custom_value, i|
+          (i < half ? left : right) << [custom_value.custom_field.name, show_value(custom_value)] unless issue.hidden_attribute?(custom_value.custom_field.name)
         end
 
         rows = left.size > right.size ? left.size : right.size