diff --git a/app/controllers/gathers_controller.rb b/app/controllers/gathers_controller.rb
index d8f4a87..3f7d949 100644
--- a/app/controllers/gathers_controller.rb
+++ b/app/controllers/gathers_controller.rb
@@ -63,6 +63,22 @@ class GathersController < ApplicationController
     redirect_to @gather
   end
 
+  def captain
+    raise AccessError unless @gatherer
+
+    if @gather.captain1.nil? and @gather.captain2 != @gatherer
+      @gather.update_attribute :captain1, @gatherer
+    elsif @gather.captain2.nil? and @gather.captain1 != @gatherer
+      @gather.update_attribute :captain2, @gatherer
+    elsif @gatherer == @gather.captain1
+      @gather.update_attribute :captain1, nil
+    elsif @gatherer == @gather.captain2
+      @gather.update_attribute :captain2, nil
+    end
+
+    redirect_to @gather
+  end
+
   private
 
   def get_gather
diff --git a/app/helpers/gathers_helper.rb b/app/helpers/gathers_helper.rb
index 90dbaee..44274de 100644
--- a/app/helpers/gathers_helper.rb
+++ b/app/helpers/gathers_helper.rb
@@ -1,8 +1,12 @@
 module GathersHelper
   def render_gather
     if @gather.status == Gather::STATE_RUNNING
-      headers['Gather'] = 'running'
-      
+      if @gather.is_full? and !@gather.is_ready? and @gather.captain1 != @gatherer and @gather.captain2 != @gatherer
+        headers['Gather'] = 'full'
+      else
+        headers['Gather'] = 'running'
+      end
+
       render partial: 'running', layout: false
     elsif @gather.status == Gather::STATE_VOTING
       if @gatherer and @gather.gatherer_votes.first(conditions: { user_id: cuser.id })
diff --git a/app/models/gather.rb b/app/models/gather.rb
index 21507a2..ac1e4ae 100644
--- a/app/models/gather.rb
+++ b/app/models/gather.rb
@@ -89,6 +89,17 @@ class Gather < ActiveRecord::Base
     5
   end
 
+  def is_full?
+    return gatherers.count == Gather::FULL
+  end
+
+  def is_ready?
+    if is_full? and !captain1.nil? and !captain2.nil?
+      return true
+    end
+    false
+  end
+
   def first
     Gather.where(:category_id => category_id).order("id ASC").first
   end
@@ -124,8 +135,6 @@ class Gather < ActiveRecord::Base
       g = Gather.new
       g.category = self.category
       g.save
-      self.captain1 = self.gatherers.most_voted[1]
-      self.captain2 = self.gatherers.most_voted[0]
       if self.gather_maps.count > 1
         self.map1 = self.gather_maps.ordered[0]
         self.map2 = self.gather_maps.ordered[1]
@@ -139,7 +148,7 @@ class Gather < ActiveRecord::Base
   end
 
   def check_captains
-    if captain1_id_changed? or captain2_id_changed? or admin
+    if status == STATE_RUNNING and is_ready? or admin
       self.turn = 1
       self.status = STATE_PICKING
       gatherers.each do |gatherer|
@@ -151,6 +160,13 @@ class Gather < ActiveRecord::Base
           gatherer.update_attributes(:team => nil, :skip_callbacks => true)
         end
       end
+
+      # Create a new shout msgs when the gather is full
+      Shoutmsg.new({
+        :shoutable_type => self.class.to_s,
+        :shoutable_id => self.id,
+        :text => I18n.t(:gather_start_shout)
+      }).save
     end
   end
 
diff --git a/app/models/gatherer.rb b/app/models/gatherer.rb
index 0b49f1b..45133c8 100644
--- a/app/models/gatherer.rb
+++ b/app/models/gatherer.rb
@@ -70,7 +70,7 @@ class Gatherer < ActiveRecord::Base
   validates :confirm, :acceptance => true, :unless => Proc.new {|gatherer| gatherer.user.gatherers.count >= 5}
   validate :validate_username
 
-  after_create :start_gather, :if => Proc.new {|gatherer| gatherer.gather.gatherers.count == Gather::FULL}
+  after_create :start_gather, :if => Proc.new {|gatherer| gatherer.gather.is_ready?}
   after_create :notify_gatherers, :if => Proc.new {|gatherer| gatherer.gather.gatherers.count == Gather::NOTIFY}
   after_update :change_turn, :unless => Proc.new {|gatherer| gatherer.skip_callbacks == true}
   after_destroy :cleanup_votes
@@ -118,6 +118,12 @@ class Gatherer < ActiveRecord::Base
   end
 
   def cleanup_votes
+    if gather.captain1_id == id
+      gather.update_attribute :captain1, nil
+    elsif gather.captain2_id == id
+      gather.update_attribute :captain2, nil
+    end
+
     gather.map_votes.all(:conditions => {:user_id => user_id}).each { |g|  g.destroy }
     gather.server_votes.all(:conditions => {:user_id => user_id}).each { |g| g.destroy }
     gather.gatherer_votes.all(:conditions => {:user_id => user_id}).each { |g|  g.destroy }
diff --git a/app/models/shoutmsg.rb b/app/models/shoutmsg.rb
index 60e0d59..45d7a47 100644
--- a/app/models/shoutmsg.rb
+++ b/app/models/shoutmsg.rb
@@ -17,7 +17,6 @@ class Shoutmsg < ActiveRecord::Base
   attr_protected :id, :created_at, :updated_at, :user_id
 
   validates_length_of :text, :in => 1..100
-  validates_presence_of :user
 
   scope :recent,
     :include => :user,
diff --git a/app/views/gathers/_running.html.erb b/app/views/gathers/_running.html.erb
index de2d68f..3971c18 100644
--- a/app/views/gathers/_running.html.erb
+++ b/app/views/gathers/_running.html.erb
@@ -9,6 +9,13 @@
           <li<% if gatherer.status > 0 %> class="away"<% end %>>
             <%= flag gatherer.user.country %>
             <%= namelink gatherer.user %>
+
+            <% if gatherer == @gather.captain1 or gatherer == @gather.captain2 %>
+              <span class="captain">
+                <%= icon('star') %>
+              </span>
+            <% end %>
+
             <% if cuser and cuser.admin? %>
               <%= link_to gatherer, method: :delete, class: 'delete' do %>
                 <%= icon 'times' %>
diff --git a/app/views/gathers/_status.html.erb b/app/views/gathers/_status.html.erb
index 50a508d..12177c0 100644
--- a/app/views/gathers/_status.html.erb
+++ b/app/views/gathers/_status.html.erb
@@ -2,15 +2,28 @@
   <% if @gather.status == Gather::STATE_RUNNING %>
 
     <% if @gatherer and @gatherer.can_destroy? cuser %>
-      <p>Gather running, <%= Gather::FULL - @gather.gatherers.length %> more needed.</p>
-      <%= link_to 'Leave Gather', @gatherer, confirm: 'Are you sure?', method: :delete, class: 'button tiny' %>
+      <% if Gather::FULL == @gather.gatherers.length %>
+          <p>Gather is full but we are waiting on commanders. If you would like to command, please use the button below.</p>
+      <% else %>
+        <p>Gather running, <%= Gather::FULL - @gather.gatherers.length %> more needed.</p>
+      <% end %>
+
+      <%= form_tag "/gathers/captain/#{@gather.id}" do %>
+        <%= submit_tag (@gather.captain1 == @gatherer or @gather.captain2 == @gatherer) ? 'Stop Commanding' : 'Command a Team', class: 'button tiny' %>
+      <% end %>
+
+      <%= link_to 'Leave Gather', @gatherer, confirm: 'Are you sure?', method: :delete, class: 'button tiny leave-gather' %>
 
     <% elsif (g = Gatherer.new(gather: @gather, user: cuser)).can_create?(cuser) %>
       <%= form_for g do |f| %>
         <%= f.hidden_field :gather_id %>
         <%= f.hidden_field :user_id %>
 
-        <p>Gather running, <%= Gather::FULL - @gather.gatherers.length %> more needed.</p>
+        <% if Gather::FULL == @gather.gatherers.length %>
+          <p>Gather is full but we are waiting on commanders. If you would like to command, please use the button below.</p>
+        <% else %>
+          <p>Gather running, <%= Gather::FULL - @gather.gatherers.length %> more needed.</p>
+        <% end %>
         <p>
           You can download custom maps via the 
           <%= link_to "Steam Workshop", "http://steamcommunity.com/workshop/browse?searchtext=&childpublishedfileid=0&section=items&appid=4920&browsesort=trend&requiredtags%5B%5D=level" %>.
diff --git a/app/views/gathers/show.html.erb b/app/views/gathers/show.html.erb
index 509c9d1..463415c 100644
--- a/app/views/gathers/show.html.erb
+++ b/app/views/gathers/show.html.erb
@@ -1,5 +1,6 @@
 <div id="jplayer"></div>
 <script type="text/javascript">
+  var gather_focus = true;
   var played = false;
   var leaving = true;
   <% if @gatherer and @gatherer.can_destroy? cuser %>
@@ -21,6 +22,8 @@
     });
   }
 
+  var gatherAlertInterval;
+
   $(document).ready(function() {
     $.PeriodicalUpdater("/gathers/" + <%= @gather.id %> + ".js", {
       method: "GET",
@@ -28,14 +31,27 @@
       minTimeout: 5000,
       maxTimeout: 15000,
       success: function(response, text, request) {
-        if (request.getResponseHeader('Gather') == 'voting') {
-          if (!played) {
+        if (request.getResponseHeader('Gather') == 'full') {
+          // Play notification while we wait on captains
+          if (!gatherAlertInterval) {
+            $('#jplayer').jPlayer({
+              ready: function() {
+                $(this).jPlayer('setMedia', {mp3: '/sounds/gather-alert.mp3'}).jPlayer("play");
+              },
+              loop: false
+            });
+            gatherAlertInterval = setInterval(function() { $("#jplayer").jPlayer("play"); }, 10000);
+          }
+        } else if (request.getResponseHeader('Gather') == 'picking' && !played) {
+          played = true
+
+          if (!gather_focus) {
             $("#jplayer").jPlayer({
               ready: function() {
                 $(this).jPlayer("setMedia", {
                   mp3: "http://www.ensl.org/sounds/gather-5.mp3"
                 }).jPlayer("play");
-                
+
                 var click = document.ontouchstart === undefined ? 'click' : 'touchstart';
                 var kickoff = function () {
                   $("#jplayer").jPlayer("play");
@@ -48,11 +64,10 @@
               volume: 0.6,
               swfPath: "/flash"
             });
-
-            played = true
           }
         }
         else if (response.length > 10) {
+          clearInterval(gatherAlertInterval);
           $("#jplayer").jPlayer("stop");
         }
       }
@@ -74,6 +89,7 @@
     var afk_timeout;
     var afk_time = 1000 * 60 * 15; // 15 minutes
     $(window).blur(function() {
+      gather_focus = false;
       afk_timeout = setTimeout(function() {
         if (gatherer_id > 0) {
           afk = true;
@@ -83,6 +99,12 @@
     });
 
     $(window).focus(function() {
+      gather_focus = true;
+
+      if (played) {
+        $("#jplayer").jPlayer("stop");
+      }
+
       if (afk) {
         updateGathererStatus('active');
         $.get("/gathers/" + <%= @gather.id %> + ".js");
@@ -128,11 +150,11 @@
       </div>
 
       <div class="info">
-        <h6>Captains</h6>
+        <h6>Commanders</h6>
         <ul>
-          <li>Vote for the <strong>best</strong> players</li>
-          <li>Captain 1 = 2nd most voted</li>
-          <li>Captain 2 = 1st most voted</li>
+          <li>Players choose to become commanders</li>
+          <li>Commanders will pick team players</li>
+          <li>Gather will not start without commanders</li>
         </ul>
       </div>
 
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 5120c82..c7937c7 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -21,6 +21,7 @@ en:
   contests_join: "Team successfully joined contest."
   contests_contester_update: "Contester was successfully updated."
   gather_create: "New Gather was started successfully."
+  gather_start_shout: "The gather is full and commanders are picking teams."
   gathers_join: "You have joined the Gather."
   gathers_user_pick: "You have successfully selected a player for your team."
   gatherers_update: "Gather player successfully updated."