diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb
index 20cb13e77469444f30640e87433ba9a243579e60..3075e7502f3d15aea43e9c1bc45692e281cfee93 100644
--- a/app/controllers/admin/users_controller.rb
+++ b/app/controllers/admin/users_controller.rb
@@ -14,7 +14,7 @@ class Admin::UsersController < Admin::ApplicationController
     @not_in_projects = @not_in_projects.without_user(admin_user) if admin_user.authorized_projects.present?
 
     # Projects he already own or joined
-    @projects = admin_user.authorized_projects.where('projects.id in (?)', admin_user.authorized_projects.map(&:id))
+    @projects = admin_user.authorized_projects
   end
 
   def team_update
diff --git a/app/models/group.rb b/app/models/group.rb
index 5d838d2b9b024c72792d0cfa3e29ca6a72f9a406..17671c3defe1ccfd88cb5a118666431003454497 100644
--- a/app/models/group.rb
+++ b/app/models/group.rb
@@ -13,6 +13,7 @@
 #
 
 class Group < Namespace
+
   def add_users_to_project_teams(user_ids, project_access)
     UsersProject.add_users_into_projects(
       projects.map(&:id),
diff --git a/app/models/issue.rb b/app/models/issue.rb
index 54d9af7e67e4d2ad2a26bbcf4d6a20573b25483f..0bc4226ca4e6ca65bd8dfbe94b821a789855123c 100644
--- a/app/models/issue.rb
+++ b/app/models/issue.rb
@@ -25,19 +25,9 @@ class Issue < ActiveRecord::Base
 
   acts_as_taggable_on :labels
 
-  class << self
-    def cared(user)
-      where('assignee_id = :user', user: user.id)
-    end
-
-    def authored(user)
-      where('author_id = :user', user: user.id)
-    end
-
-    def open_for(user)
-      opened.assigned(user)
-    end
-  end
+  scope :cared, ->(user) { where(assignee_id: user) }
+  scope :authored, ->(user) { where(author_id: user) }
+  scope :open_for, ->(user) { opened.assigned(user) }
 
   state_machine :state, initial: :opened do
     event :close do
diff --git a/app/models/key.rb b/app/models/key.rb
index 53eee511e13baa355b009c6b6599a71b0ac0fea8..ce62b802c0d99637c98db500f0d84762743e132b 100644
--- a/app/models/key.rb
+++ b/app/models/key.rb
@@ -23,7 +23,7 @@ class Key < ActiveRecord::Base
   before_validation :strip_white_space
 
   validates :title, presence: true, length: { within: 0..255 }
-  validates :key, presence: true, length: { within: 0..5000 }, format: { :with => /ssh-.{3} / }, uniqueness: true
+  validates :key, presence: true, length: { within: 0..5000 }, format: { with: /ssh-.{3} / }, uniqueness: true
   validate :fingerprintable_key
 
   delegate :name, :email, to: :user, prefix: true
@@ -48,7 +48,7 @@ class Key < ActiveRecord::Base
   end
 
   def is_deploy_key
-    !!project_id
+    project.present?
   end
 
   # projects that has this key
diff --git a/app/models/milestone.rb b/app/models/milestone.rb
index 2a9b9e4482c7796a01dc27f01bb352a90208555a..759f35313c6cf27f5c674eea17b8c0954c80cdc0 100644
--- a/app/models/milestone.rb
+++ b/app/models/milestone.rb
@@ -19,6 +19,7 @@ class Milestone < ActiveRecord::Base
   belongs_to :project
   has_many :issues
   has_many :merge_requests
+  has_many :participants, through: :issues, source: :assignee
 
   scope :active, -> { with_state(:active) }
   scope :closed, -> { with_state(:closed) }
@@ -48,10 +49,6 @@ class Milestone < ActiveRecord::Base
     end
   end
 
-  def participants
-    User.where(id: issues.pluck(:assignee_id))
-  end
-
   def open_items_count
     self.issues.opened.count + self.merge_requests.opened.count
   end
diff --git a/app/models/project.rb b/app/models/project.rb
index 0263ffefdf074a7597278e608c2187a87b945436..3b78f1005f30d88617c4e9c9b3b5232f8e50e03d 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -87,11 +87,12 @@ class Project < ActiveRecord::Base
 
   # Scopes
   scope :without_user, ->(user)  { where("id NOT IN (:ids)", ids: user.authorized_projects.map(&:id) ) }
-  scope :not_in_group, ->(group) { where("id NOT IN (:ids)", ids: group.project_ids ) }
   scope :without_team, ->(team) { team.projects.present? ? where("id NOT IN (:ids)", ids: team.projects.map(&:id)) : scoped  }
+  scope :not_in_group, ->(group) { where("id NOT IN (:ids)", ids: group.project_ids ) }
   scope :in_team, ->(team) { where("id IN (:ids)", ids: team.projects.map(&:id)) }
   scope :in_namespace, ->(namespace) { where(namespace_id: namespace.id) }
-  scope :sorted_by_activity, ->() { order("(SELECT max(events.created_at) FROM events WHERE events.project_id = projects.id) DESC") }
+  scope :in_group_namespace, -> { joins(:group) }
+  scope :sorted_by_activity, -> { order("(SELECT max(events.created_at) FROM events WHERE events.project_id = projects.id) DESC") }
   scope :personal, ->(user) { where(namespace_id: user.namespace_id) }
   scope :joined, ->(user) { where("namespace_id != ?", user.namespace_id) }
   scope :public_only, -> { where(public: true) }
@@ -156,7 +157,8 @@ class Project < ActiveRecord::Base
     unless creator.can_create_project?
       errors[:limit_reached] << ("Your own projects limit is #{creator.projects_limit}! Please contact administrator to increase it")
     end
-  rescue
+  rescue => ex
+    errors[:base] << ex.message
     errors[:base] << ("Can't check your ability to create project")
   end
 
diff --git a/app/models/user.rb b/app/models/user.rb
index dcbf58123fe4ae61bb97cc9478ebaae3beee7d08..6d797024e7339a62669b67e5b9e428955df0a229 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -59,11 +59,10 @@ class User < ActiveRecord::Base
   #
 
   # Namespace for personal projects
-  has_one :namespace,
-    dependent: :destroy,
-    foreign_key: :owner_id,
-    class_name: "Namespace",
-    conditions: 'type IS NULL'
+  has_one :namespace, dependent: :destroy, foreign_key: :owner_id, class_name: "Namespace", conditions: 'type IS NULL'
+
+  # Namespaces (owned groups and own namespace)
+  has_many :namespaces, foreign_key: :owner_id
 
   # Profile
   has_many :keys, dependent: :destroy
@@ -72,15 +71,11 @@ class User < ActiveRecord::Base
   has_many :groups, class_name: "Group", foreign_key: :owner_id
 
   # Teams
-  has_many :own_teams,
-    class_name: "UserTeam",
-    foreign_key: :owner_id,
-    dependent: :destroy
-
-  has_many :user_team_user_relationships, dependent: :destroy
-  has_many :user_teams, through: :user_team_user_relationships
+  has_many :own_teams,                       dependent: :destroy, class_name: "UserTeam", foreign_key: :owner_id
+  has_many :user_team_user_relationships,    dependent: :destroy
+  has_many :user_teams,                      through: :user_team_user_relationships
   has_many :user_team_project_relationships, through: :user_teams
-  has_many :team_projects, through: :user_team_project_relationships
+  has_many :team_projects,                   through: :user_team_project_relationships
 
   # Projects
   has_many :users_projects,           dependent: :destroy
@@ -88,14 +83,14 @@ class User < ActiveRecord::Base
   has_many :notes,                    dependent: :destroy, foreign_key: :author_id
   has_many :merge_requests,           dependent: :destroy, foreign_key: :author_id
   has_many :events,                   dependent: :destroy, foreign_key: :author_id,   class_name: "Event"
+  has_many :recent_events,                                 foreign_key: :author_id,   class_name: "Event", order: "id DESC"
   has_many :assigned_issues,          dependent: :destroy, foreign_key: :assignee_id, class_name: "Issue"
   has_many :assigned_merge_requests,  dependent: :destroy, foreign_key: :assignee_id, class_name: "MergeRequest"
-  has_many :projects, through: :users_projects
 
-  has_many :recent_events,
-    class_name: "Event",
-    foreign_key: :author_id,
-    order: "id DESC"
+  has_many :personal_projects,        through: :namespace, source: :projects
+  has_many :projects,                 through: :users_projects
+  has_many :own_projects,             foreign_key: :creator_id
+  has_many :owned_projects,           through: :namespaces, source: :projects
 
   #
   # Validations
@@ -109,9 +104,7 @@ class User < ActiveRecord::Base
             format: { with: Gitlab::Regex.username_regex,
                       message: "only letters, digits & '_' '-' '.' allowed. Letter should be first" }
 
-  validates :notification_level,
-    inclusion: { in: Notification.notification_levels },
-    presence: true
+  validates :notification_level, inclusion: { in: Notification.notification_levels }, presence: true
 
   validate :namespace_uniq, if: ->(user) { user.username_changed? }
 
@@ -145,6 +138,9 @@ class User < ActiveRecord::Base
   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) ) : scoped }
+  scope :without_projects, -> { where('id NOT IN (SELECT DISTINCT(user_id) FROM users_projects)') }
+
   scope :potential_team_members, ->(team) { team.members.any? ? active.not_in_team(team) : active  }
 
   #
@@ -171,18 +167,6 @@ class User < ActiveRecord::Base
       end
     end
 
-    def not_in_project(project)
-      if project.users.present?
-        where("id not in (:ids)", ids: project.users.map(&:id) )
-      else
-        scoped
-      end
-    end
-
-    def without_projects
-      where('id NOT IN (SELECT DISTINCT(user_id) FROM users_projects)')
-    end
-
     def create_from_omniauth(auth, ldap = false)
       gitlab_auth.create_from_omniauth(auth, ldap)
     end
@@ -229,56 +213,36 @@ class User < ActiveRecord::Base
     end
   end
 
-  # Namespaces user has access to
-  def namespaces
-    namespaces = []
-
-    # Add user account namespace
-    namespaces << self.namespace if self.namespace
-
-    # Add groups you can manage
-    namespaces += groups.all
-
-    namespaces
-  end
-
   # Groups where user is an owner
   def owned_groups
     groups
   end
 
+  def owned_teams
+    own_teams
+  end
+
   # Groups user has access to
   def authorized_groups
-    @authorized_groups ||= begin
-                           groups = Group.where(id: self.authorized_projects.pluck(:namespace_id)).all
-                           groups = groups + self.groups
-                           groups.uniq
-                         end
+    @group_ids ||= (groups.pluck(:id) + authorized_projects.pluck(:namespace_id))
+    Group.where(id: @group_ids)
   end
 
 
   # Projects user has access to
   def authorized_projects
-    project_ids = users_projects.pluck(:project_id)
-    project_ids = project_ids | owned_projects.pluck(:id)
-    Project.where(id: project_ids)
+    @project_ids ||= (owned_projects.pluck(:id) + projects.pluck(:id)).uniq
+    Project.where(id: @project_ids)
   end
 
-  # Projects in user namespace
-  def personal_projects
-    Project.personal(self)
-  end
-
-  # Projects where user is an owner
-  def owned_projects
-    Project.where("(projects.namespace_id IN (:namespaces)) OR
-                  (projects.namespace_id IS NULL AND projects.creator_id = :user_id)",
-                  namespaces: namespaces.map(&:id), user_id: self.id)
+  def authorized_teams
+    @team_ids ||= (user_teams.pluck(:id) + own_teams.pluck(:id)).uniq
+    UserTeam.where(id: @team_ids)
   end
 
   # Team membership in authorized projects
   def tm_in_authorized_projects
-    UsersProject.where(project_id:  authorized_projects.map(&:id), user_id: self.id)
+    UsersProject.where(project_id: authorized_projects.map(&:id), user_id: self.id)
   end
 
   def is_admin?
@@ -344,28 +308,13 @@ class User < ActiveRecord::Base
   end
 
   def several_namespaces?
-    namespaces.size > 1
+    namespaces.many?
   end
 
   def namespace_id
     namespace.try :id
   end
 
-  def authorized_teams
-    @authorized_teams ||= begin
-                            ids = []
-                            ids << UserTeam.with_member(self).pluck('user_teams.id')
-                            ids << UserTeam.created_by(self).pluck('user_teams.id')
-                            ids.flatten
-
-                            UserTeam.where(id: ids)
-                          end
-  end
-
-  def owned_teams
-    UserTeam.where(owner_id: self.id)
-  end
-
   def name_with_username
     "#{name} (#{username})"
   end