diff --git a/app/controllers/projects/application_controller.rb b/app/controllers/projects/application_controller.rb
new file mode 100644
index 0000000000000000000000000000000000000000..7e4776d2d753d7a1f215e2f2e1f44cc29f2dae33
--- /dev/null
+++ b/app/controllers/projects/application_controller.rb
@@ -0,0 +1,11 @@
+class Projects::ApplicationController < ApplicationController
+
+  before_filter :authorize_admin_team_member!
+
+  protected
+
+  def user_team
+    @team ||= UserTeam.find_by_path(params[:id])
+  end
+
+end
diff --git a/app/controllers/projects/teams_controller.rb b/app/controllers/projects/teams_controller.rb
new file mode 100644
index 0000000000000000000000000000000000000000..c04835ed153583c202d9a4e5a8fac2dae5ec8f42
--- /dev/null
+++ b/app/controllers/projects/teams_controller.rb
@@ -0,0 +1,27 @@
+class Projects::TeamsController < Projects::ApplicationController
+
+  def avaliable
+    @teams = current_user.is_admin? ? UserTeam.scoped : current_user.user_teams
+    @teams = @teams.without_project(project)
+    unless @teams.any?
+      redirect_to project_team_index_path(project), notice: "No avaliable teams for assigment."
+    end
+  end
+
+  def assign
+    unless params[:team_id].blank?
+      team = UserTeam.find(params[:team_id])
+      access = params[:greatest_project_access]
+      team.assign_to_project(project, access)
+    end
+    redirect_to project_team_index_path(project)
+  end
+
+  def resign
+    team = project.user_teams.find_by_path(params[:id])
+    team.resign_from_project(project)
+
+    redirect_to project_team_index_path(project)
+  end
+
+end
diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb
index dbd47998eb1a8e205dc6cba260bce368c492bc9f..c6cb9129499ac0419bdbc793691b40c60de92c35 100644
--- a/app/helpers/projects_helper.rb
+++ b/app/helpers/projects_helper.rb
@@ -3,6 +3,10 @@ module ProjectsHelper
     @project.users_projects.sort_by(&:project_access).reverse.group_by(&:project_access)
   end
 
+  def grouper_project_teams(project)
+    @project.user_team_project_relationships.sort_by(&:greatest_access).reverse.group_by(&:greatest_access)
+  end
+
   def remove_from_project_team_message(project, user)
     "You are going to remove #{user.name} from #{project.name} project team. Are you sure?"
   end
diff --git a/app/models/user_team.rb b/app/models/user_team.rb
index 2e2f75060c3203ac5754880d6f949835a461ecad..0442123fc24798e7b2494f8f9c434408779940a6 100644
--- a/app/models/user_team.rb
+++ b/app/models/user_team.rb
@@ -16,6 +16,8 @@ class UserTeam < ActiveRecord::Base
                       message: "only letters, digits & '_' '-' '.' allowed. Letter should be first" }
 
   scope :with_member, ->(user){ joins(:user_team_user_relationships).where(user_team_user_relationships: {user_id: user.id}) }
+  scope :with_project, ->(project){ joins(:user_team_project_relationships).where(user_team_project_relationships: {project_id: project})}
+  scope :without_project, ->(project){ where("id NOT IN (:ids)", ids: with_project(project))}
   scope :created_by, ->(user){ where(owner_id: user) }
 
   class << self
diff --git a/app/models/user_team_project_relationship.rb b/app/models/user_team_project_relationship.rb
index 4413c492a6d9b0b696a402f621cc28ec8d4e33e2..1b0368c7eccb6864ebc672a7e4492ca8e7be0d4c 100644
--- a/app/models/user_team_project_relationship.rb
+++ b/app/models/user_team_project_relationship.rb
@@ -10,6 +10,10 @@ class UserTeamProjectRelationship < ActiveRecord::Base
 
   scope :with_project, ->(project){ where(project_id: project.id) }
 
+  def team_name
+    user_team.name
+  end
+
   private
 
   def check_greatest_access
diff --git a/app/views/projects/_project_head.html.haml b/app/views/projects/_project_head.html.haml
index 94052650694b284251343ff63bd5eea4d1815131..cc2155028593365ce02469421fd19f62827129ee 100644
--- a/app/views/projects/_project_head.html.haml
+++ b/app/views/projects/_project_head.html.haml
@@ -3,7 +3,7 @@
     = link_to project_path(@project), class: "activities-tab tab" do
       %i.icon-home
       Show
-  = nav_link(controller: :team_members) do
+  = nav_link(controller: [:team_members, :teams]) do
     = link_to project_team_index_path(@project), class: "team-tab tab" do
       %i.icon-user
       Team
diff --git a/app/views/projects/teams/avaliable.html.haml b/app/views/projects/teams/avaliable.html.haml
new file mode 100644
index 0000000000000000000000000000000000000000..814e216d6adf81bdf5090776b8b0c4727f931aef
--- /dev/null
+++ b/app/views/projects/teams/avaliable.html.haml
@@ -0,0 +1,22 @@
+= render "projects/project_head"
+
+%h3.page_title
+  = "Assign project to team of users"
+%hr
+%p.slead
+  Read more about assign to team of users #{link_to "here", '#', class: 'vlink'}.
+= form_tag assign_project_teams_path(@project), method: 'post' do
+  %p.slead Choose Team of users you want to assign:
+  .padded
+    = label_tag :team_id, "Team"
+    .input= select_tag(:team_id, options_from_collection_for_select(@teams, :id, :name), prompt: "Select team", class: "chosen xxlarge", required: true)
+  %p.slead Choose greatest user acces in team you want to assign:
+  .padded
+    = label_tag :team_ids, "Permission"
+    .input= select_tag :greatest_project_access, options_for_select(UserTeam.access_roles), {class: "project-access-select chosen span3" }
+
+
+  .actions
+    = submit_tag 'Assign', class: "btn save-btn"
+    = link_to "Cancel", project_team_index_path(@project), class: "btn cancel-btn"
+
diff --git a/app/views/team_members/_show_team.html.haml b/app/views/team_members/_show_team.html.haml
new file mode 100644
index 0000000000000000000000000000000000000000..da0262efda53510dae75f3cab7d496c9b1b0835c
--- /dev/null
+++ b/app/views/team_members/_show_team.html.haml
@@ -0,0 +1,15 @@
+- team = team_rel.user_team
+- allow_admin = can? current_user, :admin_team_member, @project
+%li{id: dom_id(team), class: "user_team_row team_#{team.id}"}
+  .row
+    .span6
+      %strong= link_to team.name, team_path(team), title: team.name, class: "dark"
+      %br
+      %small.cgray Members: #{team.members.count}
+
+    .span5.right
+      .right
+        - if allow_admin
+          .left
+            = link_to resign_project_team_path(@project, team), method: :delete, confirm: "Are you shure?", class: "btn danger small" do
+              %i.icon-minus.icon-white
diff --git a/app/views/team_members/_teams.html.haml b/app/views/team_members/_teams.html.haml
new file mode 100644
index 0000000000000000000000000000000000000000..156fdd1befa13df95e66b40e15e2991e94e3fff8
--- /dev/null
+++ b/app/views/team_members/_teams.html.haml
@@ -0,0 +1,16 @@
+- grouper_project_teams(@project).each do |access, teams|
+  .ui-box
+    %h5.title
+      = UserTeam.access_roles.key(access).pluralize
+      %small= teams.size
+    %ul.well-list
+      - teams.sort_by(&:team_name).each do |tofr|
+        = render(partial: 'team_members/show_team', locals: {team_rel: tofr})
+
+
+:javascript
+  $(function(){
+    $('.repo-access-select, .project-access-select').live("change", function() {
+      $(this.form).submit();
+    });
+  })
diff --git a/app/views/team_members/import.html.haml b/app/views/team_members/import.html.haml
index de82f4162481fa52af1923817a4225995f8392b2..135db946041da3c953f5c92f0b5ceacd681e8845 100644
--- a/app/views/team_members/import.html.haml
+++ b/app/views/team_members/import.html.haml
@@ -4,7 +4,7 @@
   = "Import team from another project"
 %hr
 %p.slead
-  Read more about team import #{link_to "here", '#', class: 'vlink'}.
+  Read more about project team import #{link_to "here", '#', class: 'vlink'}.
 = form_tag apply_import_project_team_members_path(@project), method: 'post' do
   %p.slead Choose project you want to use as team source:
   .padded
diff --git a/app/views/team_members/index.html.haml b/app/views/team_members/index.html.haml
index 8ba13939a304df1c4d5878cbd9d2c21d13173608..f694ccbca93550e4a4514f06b85768539146cc4f 100644
--- a/app/views/team_members/index.html.haml
+++ b/app/views/team_members/index.html.haml
@@ -10,11 +10,24 @@
     %span.right
       = link_to import_project_team_members_path(@project), class: "btn small grouped", title: "Import team from another project" do
         Import team from another project
+      = link_to avaliable_project_teams_path(@project), class: "btn small grouped", title: "Assign project to team of users" do
+        Assign project to Team of users
       = link_to new_project_team_member_path(@project), class: "btn success small grouped", title: "New Team Member" do
         New Team Member
-%hr
 
+%hr
 
 .clearfix
 %div.team-table
   = render partial: "team_members/team", locals: {project: @project}
+
+
+%h3.page_title
+  Assigned teams
+  (#{@project.user_teams.count})
+
+%hr
+
+.clearfix
+%div.team-table
+  = render partial: "team_members/teams", locals: {project: @project}
diff --git a/config/routes.rb b/config/routes.rb
index e8af16387bc021e54616b22cd235c3ff7fd6175a..a19ab14f605a80e98aa21d6e8b43f2ab95db8794 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -269,6 +269,18 @@ Gitlab::Application.routes.draw do
       end
     end
 
+    scope module: :projects do
+      resources :teams, only: [] do
+        collection do
+          get :avaliable
+          post :assign
+        end
+        member do
+          delete :resign
+        end
+      end
+    end
+
     resources :notes, only: [:index, :create, :destroy] do
       collection do
         post :preview