diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb
index 779e851..773c778 100644
--- a/app/controllers/issues_controller.rb
+++ b/app/controllers/issues_controller.rb
@@ -192,11 +192,13 @@ class IssuesController < ApplicationController
 
       respond_to do |format|
         format.html { redirect_back_or_default issue_path(@issue, previous_and_next_issue_ids_params) }
+        format.js { render :nothing => true }
         format.api  { render_api_ok }
       end
     else
       respond_to do |format|
         format.html { render :action => 'edit' }
+        format.js { render :nothing => true, :status => 422 }
         format.api  { render_validation_errors(@issue) }
       end
     end
@@ -380,7 +382,7 @@ class IssuesController < ApplicationController
   # Overrides Redmine::MenuManager::MenuController::ClassMethods for
   # when the "New issue" tab is enabled
   def current_menu_item
-    if Setting.new_item_menu_tab == '1' && [:new, :create].include?(action_name.to_sym) 
+    if Setting.new_item_menu_tab == '1' && [:new, :create].include?(action_name.to_sym)
       :new_issue
     else
       super
diff --git a/app/controllers/versions_controller.rb b/app/controllers/versions_controller.rb
index 84c7980..d990337 100644
--- a/app/controllers/versions_controller.rb
+++ b/app/controllers/versions_controller.rb
@@ -46,11 +46,12 @@ class VersionsController < ApplicationController
 
         @issues_by_version = {}
         if @selected_tracker_ids.any? && @versions.any?
+
           issues = Issue.visible.
             includes(:project, :tracker).
             preload(:status, :priority, :fixed_version).
             where(:tracker_id => @selected_tracker_ids, :project_id => project_ids, :fixed_version_id => @versions.map(&:id)).
-            order("#{Project.table_name}.lft, #{Tracker.table_name}.position, #{Issue.table_name}.id")
+            order(order_issues_by)
           @issues_by_version = issues.group_by(&:fixed_version)
         end
         @versions.reject! {|version| !project_ids.include?(version.project_id) && @issues_by_version[version].blank?}
@@ -67,7 +68,7 @@ class VersionsController < ApplicationController
         @issues = @version.fixed_issues.visible.
           includes(:status, :tracker, :priority).
           preload(:project).
-          reorder("#{Tracker.table_name}.position, #{Issue.table_name}.id").
+          reorder(order_issues_by).
           to_a
       }
       format.api
@@ -180,4 +181,12 @@ class VersionsController < ApplicationController
       @selected_tracker_ids = (default_trackers || selectable_trackers).collect {|t| t.id.to_s }
     end
   end
+
+  def order_issues_by
+    if Setting.manual_issue_position_in_versions == '1'
+      return "COALESCE(#{Issue.table_name}.position, 999999)"
+   else
+      return "#{Tracker.table_name}.position, #{Issue.table_name}.id"
+   end
+  end
 end
diff --git a/app/models/issue.rb b/app/models/issue.rb
index 4e32dce..6451c5c 100644
--- a/app/models/issue.rb
+++ b/app/models/issue.rb
@@ -56,7 +56,7 @@ class Issue < ActiveRecord::Base
 
   acts_as_activity_provider :scope => preload(:project, :author, :tracker, :status),
                             :author_key => :author_id
-
+  acts_as_positioned :scope => [:fixed_version_id]
   DONE_RATIO_OPTIONS = %w(issue_field issue_status)
 
   attr_accessor :deleted_attachment_ids
@@ -468,6 +468,9 @@ class Issue < ActiveRecord::Base
     :if => lambda {|issue, user| (issue.new_record? || issue.attributes_editable?(user)) &&
       user.allowed_to?(:manage_subtasks, issue.project)}
 
+  safe_attributes 'position',
+    :if => lambda {|issue, user| user.allowed_to?(:change_issue_position_in_version, issue.project)}
+
   safe_attributes 'deleted_attachment_ids',
     :if => lambda {|issue, user| issue.attachments_deletable?(user)}
 
@@ -776,7 +779,7 @@ class Issue < ActiveRecord::Base
 
   # Returns the names of attributes that are journalized when updating the issue
   def journalized_attribute_names
-    names = Issue.column_names - %w(id root_id lft rgt lock_version created_on updated_on closed_on)
+    names = Issue.column_names - %w(id root_id lft rgt lock_version position created_on updated_on closed_on)
     if tracker
       names -= tracker.disabled_core_fields
     end
@@ -1402,7 +1405,7 @@ class Issue < ActiveRecord::Base
     end
     Project.where(condition).having_trackers
   end
- 
+
   # Returns a scope of trackers that user can assign the issue to
   def allowed_target_trackers(user=User.current)
     self.class.allowed_target_trackers(project, user, tracker_id_was)
diff --git a/app/views/settings/_issues.html.erb b/app/views/settings/_issues.html.erb
index f29a6d4..610ea4a 100644
--- a/app/views/settings/_issues.html.erb
+++ b/app/views/settings/_issues.html.erb
@@ -13,6 +13,8 @@
 
 
<%= setting_check_box :display_subprojects_issues %>
 
+<%= setting_check_box :manual_issue_position_in_versions %>
+
 <%= setting_select :issue_done_ratio, Issue::DONE_RATIO_OPTIONS.collect {|i| [l("setting_issue_done_ratio_#{i}"), i]} %>
 
 <%= setting_multiselect :non_working_week_days, (1..7).map {|d| [day_name(d), d.to_s]}, :inline => true %>
@@ -20,6 +22,7 @@
 <%= setting_text_field :issues_export_limit, :size => 6 %>
 
 <%= setting_text_field :gantt_items_limit, :size => 6 %>
+