diff --git a/app/controllers/admin/dashboard_controller.rb b/app/controllers/admin/dashboard_controller.rb
index be19139c9b1113c19bfad3b4a4b1584ceff2b145..c491e5c75501e259c300ae4586ff6464337b87e0 100644
--- a/app/controllers/admin/dashboard_controller.rb
+++ b/app/controllers/admin/dashboard_controller.rb
@@ -1,7 +1,7 @@
 class Admin::DashboardController < Admin::ApplicationController
   def index
-    @projects = Project.order("created_at DESC").limit(10)
-    @users = User.order("created_at DESC").limit(10)
-    @groups = Group.order("created_at DESC").limit(10)
+    @projects = Project.limit(10)
+    @users = User.limit(10)
+    @groups = Group.limit(10)
   end
 end
diff --git a/app/controllers/admin/groups_controller.rb b/app/controllers/admin/groups_controller.rb
index 8c7d90a5d9fc2ff4fd6beb8b783960bcfc263730..ae610d4871c5701f742bb432fa75eab33db25f64 100644
--- a/app/controllers/admin/groups_controller.rb
+++ b/app/controllers/admin/groups_controller.rb
@@ -2,7 +2,7 @@ class Admin::GroupsController < Admin::ApplicationController
   before_filter :group, only: [:edit, :show, :update, :destroy, :project_update, :project_teams_update]
 
   def index
-    @groups = Group.order('name ASC')
+    @groups = Group.order_name
     @groups = @groups.search(params[:name]) if params[:name].present?
     @groups = @groups.page(params[:page]).per(20)
   end
diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb
index aea8545d38ebfcc08c0e845ddf2b2a9ae165a122..932bfc777e6e680e5176e2388559bef589076613 100644
--- a/app/controllers/admin/users_controller.rb
+++ b/app/controllers/admin/users_controller.rb
@@ -5,13 +5,13 @@ class Admin::UsersController < Admin::ApplicationController
     @users = User.filter(params[:filter])
     @users = @users.search(params[:name]) if params[:name].present?
     @users = @users.sort(@sort = params[:sort])
-    @users = @users.alphabetically.page(params[:page])
+    @users = @users.order_name.page(params[:page])
   end
 
   def show
     @personal_projects = user.personal_projects
     @joined_projects = user.projects.joined(@user)
-    @keys = user.keys.order('id DESC')
+    @keys = user.keys
   end
 
   def new
diff --git a/app/controllers/profiles/keys_controller.rb b/app/controllers/profiles/keys_controller.rb
index 88414b13564c13623c41ef31dc0a246b0e2c489d..4e2bd0a9b4b92c9730f6ec9522a8e2f1e6f992b3 100644
--- a/app/controllers/profiles/keys_controller.rb
+++ b/app/controllers/profiles/keys_controller.rb
@@ -3,7 +3,7 @@ class Profiles::KeysController < ApplicationController
   skip_before_filter :authenticate_user!, only: [:get_keys]
 
   def index
-    @keys = current_user.keys.order('id DESC')
+    @keys = current_user.keys
   end
 
   def show
diff --git a/app/models/broadcast_message.rb b/app/models/broadcast_message.rb
index 4d0c04bcc3d6dddf757a80f20ec6a17956dc64bb..05f5e9796959d577298a87dd0bc366f24d686865 100644
--- a/app/models/broadcast_message.rb
+++ b/app/models/broadcast_message.rb
@@ -14,6 +14,8 @@
 #
 
 class BroadcastMessage < ActiveRecord::Base
+  include Sortable
+
   validates :message, presence: true
   validates :starts_at, presence: true
   validates :ends_at, presence: true
diff --git a/app/models/concerns/internal_id.rb b/app/models/concerns/internal_id.rb
index 821ed54fb987568a3fd41c638709127e1fefccb1..e86357e3dee9bdbfb6fa5f16d2e4fa3cb03d5c41 100644
--- a/app/models/concerns/internal_id.rb
+++ b/app/models/concerns/internal_id.rb
@@ -1,5 +1,6 @@
 module InternalId
   extend ActiveSupport::Concern
+  include Sortable
 
   included do
     validate :set_iid, on: :create
diff --git a/app/models/concerns/sortable.rb b/app/models/concerns/sortable.rb
new file mode 100644
index 0000000000000000000000000000000000000000..49001cabc7c5f62b9a0c122075ffc98a91e83051
--- /dev/null
+++ b/app/models/concerns/sortable.rb
@@ -0,0 +1,32 @@
+# == Sortable concern
+#
+# Set default scope for ordering objects
+#
+module Sortable
+  extend ActiveSupport::Concern
+
+  included do
+    # By default all models should be ordered
+    # by created_at field starting from newest
+    default_scope { order(created_at: :desc, id: :desc) }
+    scope :order_name, -> { reorder(name: :asc) }
+    scope :order_recent, -> { reorder(created_at: :desc, id: :desc) }
+    scope :order_oldest, -> { reorder(created_at: :asc, id: :asc) }
+    scope :order_recent_updated, -> { reorder(updated_at: :desc, id: :desc) }
+    scope :order_oldest_updated, -> { reorder(updated_at: :asc, id: :asc) }
+  end
+
+  module ClassMethods
+    def sort(method)
+      case method.to_s
+      when 'name' then order_name_asc
+      when 'recent' then order_recent
+      when 'oldest' then order_oldest
+      when 'recent_updated' then order_recent_updated
+      when 'oldest_updated' then order_oldest_updated
+      else
+        self
+      end
+    end
+  end
+end
diff --git a/app/models/email.rb b/app/models/email.rb
index 57f476bd519124244d92de88f3192b66bf4e2e58..556b0e9586e72d8f23c99feaae8e53e17cfbc710 100644
--- a/app/models/email.rb
+++ b/app/models/email.rb
@@ -10,6 +10,8 @@
 #
 
 class Email < ActiveRecord::Base
+  include Sortable
+
   belongs_to :user
 
   validates :user_id, presence: true
diff --git a/app/models/event.rb b/app/models/event.rb
index 2a6c690ab912c558a5707e9885685c268e5bccc4..9a42d380f87e7e7873010dc995867a83dcbf63f8 100644
--- a/app/models/event.rb
+++ b/app/models/event.rb
@@ -15,6 +15,7 @@
 #
 
 class Event < ActiveRecord::Base
+  include Sortable
   default_scope { where.not(author_id: nil) }
 
   CREATED   = 1
diff --git a/app/models/hooks/web_hook.rb b/app/models/hooks/web_hook.rb
index c8fa9c509180f9d3a8cdfcab0fc8e03d1d9af200..defef7216f2c6f1f92450cb965ee958269e70150 100644
--- a/app/models/hooks/web_hook.rb
+++ b/app/models/hooks/web_hook.rb
@@ -16,6 +16,7 @@
 #
 
 class WebHook < ActiveRecord::Base
+  include Sortable
   include HTTParty
 
   default_value_for :push_events, true
diff --git a/app/models/identity.rb b/app/models/identity.rb
index 80e0e3a8a23102e8eecbdda9d1e6ff46bc4f6c2a..b2c3792d1ce35eb542728708381ed20c4741d3c7 100644
--- a/app/models/identity.rb
+++ b/app/models/identity.rb
@@ -9,6 +9,7 @@
 #
 
 class Identity < ActiveRecord::Base
+  include Sortable
   belongs_to :user
 
   validates :extern_uid, allow_blank: true, uniqueness: { scope: :provider }
diff --git a/app/models/key.rb b/app/models/key.rb
index d2d1af68822de794cd811ef8eaa4e5e2a611a726..e2e59296eedda139bfa1023660af63f6769399ae 100644
--- a/app/models/key.rb
+++ b/app/models/key.rb
@@ -15,6 +15,7 @@
 require 'digest/md5'
 
 class Key < ActiveRecord::Base
+  include Sortable
   include Gitlab::Popen
 
   belongs_to :user
diff --git a/app/models/label.rb b/app/models/label.rb
index 2b2b02e0645d3af641d1d63cbcb3ef864f66088c..c8f6a7cd48c4ca42a4c3189486aa11c12578ebeb 100644
--- a/app/models/label.rb
+++ b/app/models/label.rb
@@ -11,6 +11,8 @@
 #
 
 class Label < ActiveRecord::Base
+  include Sortable
+
   DEFAULT_COLOR = '#428BCA'
 
   belongs_to :project
diff --git a/app/models/member.rb b/app/models/member.rb
index 671ef466baaec1f955cbb0b753abc1b5318ed50a..fe3d2f40e87b773c47662f44f1ffe9d15ff25e06 100644
--- a/app/models/member.rb
+++ b/app/models/member.rb
@@ -14,6 +14,7 @@
 #
 
 class Member < ActiveRecord::Base
+  include Sortable
   include Notifiable
   include Gitlab::Access
 
diff --git a/app/models/merge_request_diff.rb b/app/models/merge_request_diff.rb
index a71122d5e0784e48e5116f67ed056d2b51e0890c..acac1ca4cf7ca2e3ccabbf70e754f6402d730e19 100644
--- a/app/models/merge_request_diff.rb
+++ b/app/models/merge_request_diff.rb
@@ -14,6 +14,8 @@
 require Rails.root.join("app/models/commit")
 
 class MergeRequestDiff < ActiveRecord::Base
+  include Sortable
+
   # Prevent store of diff
   # if commits amount more then 200
   COMMITS_SAFE_SIZE = 200
diff --git a/app/models/namespace.rb b/app/models/namespace.rb
index e7fd3024750cf6ebb44e8c9adfa5bc06ad6c1eec..ba0b2b71cf96e16f58f928da67ecaedc63f8b15d 100644
--- a/app/models/namespace.rb
+++ b/app/models/namespace.rb
@@ -14,6 +14,7 @@
 #
 
 class Namespace < ActiveRecord::Base
+  include Sortable
   include Gitlab::ShellAdapter
 
   has_many :projects, dependent: :destroy
diff --git a/app/models/note.rb b/app/models/note.rb
index 0b988cc3e0f409d63e240ae0beb3a7ac1b694d8e..a3f2980cebd236c585c180a46fa8091d67ca42d2 100644
--- a/app/models/note.rb
+++ b/app/models/note.rb
@@ -23,6 +23,7 @@ require 'file_size_validator'
 class Note < ActiveRecord::Base
   include Mentionable
 
+  default_scope { order(created_at: :asc, id: :asc) }
   default_value_for :system, false
 
   attr_mentionable :note
diff --git a/app/models/project.rb b/app/models/project.rb
index 390e1457ca1baed9e4e26cbf49bde419f86b258a..246479624eee335c2497d2149ccce633a567fc14 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -33,6 +33,7 @@ require 'carrierwave/orm/activerecord'
 require 'file_size_validator'
 
 class Project < ActiveRecord::Base
+  include Sortable
   include Gitlab::ShellAdapter
   include Gitlab::VisibilityLevel
   include Gitlab::ConfigHelper
@@ -53,7 +54,7 @@ class Project < ActiveRecord::Base
   attr_accessor :new_default_branch
 
   # Relations
-  belongs_to :creator,      foreign_key: 'creator_id', class_name: 'User'
+  belongs_to :creator, foreign_key: 'creator_id', class_name: 'User'
   belongs_to :group, -> { where(type: Group) }, foreign_key: 'namespace_id'
   belongs_to :namespace
 
@@ -86,7 +87,7 @@ class Project < ActiveRecord::Base
   has_many :merge_requests,     dependent: :destroy, foreign_key: 'target_project_id'
   # Merge requests from source project should be kept when source project was removed
   has_many :fork_merge_requests, foreign_key: 'source_project_id', class_name: MergeRequest
-  has_many :issues, -> { order 'issues.state DESC, issues.created_at DESC' }, dependent: :destroy
+  has_many :issues,             dependent: :destroy
   has_many :labels,             dependent: :destroy
   has_many :services,           dependent: :destroy
   has_many :events,             dependent: :destroy
@@ -139,14 +140,16 @@ class Project < ActiveRecord::Base
   mount_uploader :avatar, AttachmentUploader
 
   # Scopes
+  scope :sorted_by_activity, -> { reorder('projects.last_activity_at DESC') }
+  scope :sorted_by_stars, -> { reorder('projects.star_count DESC') }
+  scope :sorted_by_names, -> { joins(:namespace).reorder('namespaces.name ASC, projects.name ASC') }
+
   scope :without_user, ->(user)  { where('projects.id NOT IN (:ids)', ids: user.authorized_projects.map(&:id) ) }
   scope :without_team, ->(team) { team.projects.present? ? where('projects.id NOT IN (:ids)', ids: team.projects.map(&:id)) : scoped  }
   scope :not_in_group, ->(group) { where('projects.id NOT IN (:ids)', ids: group.project_ids ) }
   scope :in_team, ->(team) { where('projects.id IN (:ids)', ids: team.projects.map(&:id)) }
   scope :in_namespace, ->(namespace) { where(namespace_id: namespace.id) }
   scope :in_group_namespace, -> { joins(:group) }
-  scope :sorted_by_activity, -> { reorder('projects.last_activity_at DESC') }
-  scope :sorted_by_stars, -> { reorder('projects.star_count DESC') }
   scope :personal, ->(user) { where(namespace_id: user.namespace_id) }
   scope :joined, ->(user) { where('namespace_id != ?', user.namespace_id) }
   scope :public_only, -> { where(visibility_level: Project::PUBLIC) }
diff --git a/app/models/service.rb b/app/models/service.rb
index 15948e63e41afd5468ed783a1a485d10feadd8e7..caabe8e971d3abaf4b0816d488facf02697a69cb 100644
--- a/app/models/service.rb
+++ b/app/models/service.rb
@@ -15,6 +15,7 @@
 # To add new service you should build a class inherited from Service
 # and implement a set of methods
 class Service < ActiveRecord::Base
+  include Sortable
   serialize :properties, JSON
 
   default_value_for :active, false
diff --git a/app/models/snippet.rb b/app/models/snippet.rb
index a3222d298922d084745ce26a7470fd5a284879b1..82c1ab94446d071ef16b3209b6019bef225becf0 100644
--- a/app/models/snippet.rb
+++ b/app/models/snippet.rb
@@ -16,6 +16,7 @@
 #
 
 class Snippet < ActiveRecord::Base
+  include Sortable
   include Linguist::BlobHelper
   include Gitlab::VisibilityLevel
 
diff --git a/app/models/user.rb b/app/models/user.rb
index 552a37c95337fb1eba1839f8b03ffa2ea83539e2..41c5244032056c75919fadad4cdef265aefb6dae 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -49,6 +49,7 @@ require 'carrierwave/orm/activerecord'
 require 'file_size_validator'
 
 class User < ActiveRecord::Base
+  include Sortable
   include Gitlab::ConfigHelper
   include TokenAuthenticatable
   extend Gitlab::ConfigHelper
@@ -176,7 +177,6 @@ class User < ActiveRecord::Base
   scope :admins, -> { where(admin:  true) }
   scope :blocked, -> { with_state(:blocked) }
   scope :active, -> { with_state(:active) }
-  scope :alphabetically, -> { order('name ASC') }
   scope :in_team, ->(team){ where(id: team.member_ids) }
   scope :not_in_team, ->(team){ where('users.id NOT IN (:ids)', ids: team.member_ids) }
   scope :not_in_project, ->(project) { project.users.present? ? where("id not in (:ids)", ids: project.users.map(&:id) ) : all }
@@ -290,7 +290,7 @@ class User < ActiveRecord::Base
   def authorized_groups
     @authorized_groups ||= begin
                              group_ids = (groups.pluck(:id) + authorized_projects.pluck(:namespace_id))
-                             Group.where(id: group_ids).order('namespaces.name ASC')
+                             Group.where(id: group_ids)
                            end
   end
 
@@ -301,7 +301,7 @@ class User < ActiveRecord::Base
                                project_ids = personal_projects.pluck(:id)
                                project_ids.push(*groups_projects.pluck(:id))
                                project_ids.push(*projects.pluck(:id).uniq)
-                               Project.where(id: project_ids).joins(:namespace).order('namespaces.name ASC')
+                               Project.where(id: project_ids)
                              end
   end
 
diff --git a/lib/api/issues.rb b/lib/api/issues.rb
index d2828b24c369c63bc0eff1b8f130dca03d439f24..e2c2cd4c3dad51c724abe1aff19fdadb55b97a18 100644
--- a/lib/api/issues.rb
+++ b/lib/api/issues.rb
@@ -39,7 +39,6 @@ module API
         issues = current_user.issues
         issues = filter_issues_state(issues, params[:state]) unless params[:state].nil?
         issues = filter_issues_labels(issues, params[:labels]) unless params[:labels].nil?
-        issues = issues.order('issues.id DESC')
 
         present paginate(issues), with: Entities::Issue
       end
@@ -70,7 +69,6 @@ module API
         unless params[:milestone].nil?
           issues = filter_issues_milestone(issues, params[:milestone])
         end
-        issues = issues.order('issues.id DESC')
 
         present paginate(issues), with: Entities::Issue
       end