diff --git a/app/assets/images/pages/clans/dashboard_preview.png b/app/assets/images/pages/clans/dashboard_preview.png
index ecd5f15f9..d45f8911f 100644
Binary files a/app/assets/images/pages/clans/dashboard_preview.png and b/app/assets/images/pages/clans/dashboard_preview.png differ
diff --git a/app/locale/en.coffee b/app/locale/en.coffee
index 818d35730..9ca9795e7 100644
--- a/app/locale/en.coffee
+++ b/app/locale/en.coffee
@@ -790,6 +790,7 @@
     make_private: "Make clan private"
     subs_only: "subscribers only"
     create_clan: "Create New Clan"
+    private_preview: "Preview"
     public_clans: "Public Clans"
     my_clans: "My Clans"
     clan_name: "Clan Name"
diff --git a/app/styles/clans/clan-details.sass b/app/styles/clans/clan-details.sass
index 0fda207bd..15bbda173 100644
--- a/app/styles/clans/clan-details.sass
+++ b/app/styles/clans/clan-details.sass
@@ -99,9 +99,23 @@
       background-color: blanchedalmond
       font-size: 10pt
 
-  .level-progression-campaign
+  .level-progression-concepts
+    color: #317EAC
     font-size: 12pt
     font-weight: bold
+    margin-top: 8px
+    margin-bottom: 4px
+
+  .level-progression-levels
+    color: #317EAC
+    font-size: 12pt
+    font-weight: bold
+    margin-top: 8px
+
+  .level-progression-campaign
+    font-size: 10pt
+    font-weight: bold
+    margin-bottom: 4px
     margin-top: 4px
 
   .progress-level-cell
diff --git a/app/templates/clans/clan-details.jade b/app/templates/clans/clan-details.jade
index 4242610c4..e57b58c64 100644
--- a/app/templates/clans/clan-details.jade
+++ b/app/templates/clans/clan-details.jade
@@ -118,15 +118,15 @@ block content
                 if isOwner && member.id !== clan.get('ownerID')
                   button.btn.btn-xs.btn-warning.remove-member-btn(data-id="#{member.id}", data-i18n="clans.rem_hero") Remove Hero
               td.progress-cell
-                p
-                  div.level-progression-campaign(style='color:#317EAC;') Concepts
-                  each concept in conceptsProgression
-                    if userConceptsMap[member.id] && userConceptsMap[member.id][concept] === 'complete'
-                      span.spr.progress-level-cell.progress-level-cell-complete(data-i18n="concepts." + concept)
-                    else if userConceptsMap[member.id] && userConceptsMap[member.id][concept] === 'started'
-                      span.spr.progress-level-cell.progress-level-cell-started(data-i18n="concepts." + concept)
-                    else
-                      span.spr.progress-level-cell.progress-level-cell-not-started(data-i18n="concepts." + concept)
+                .level-progression-concepts Concepts
+                each concept in conceptsProgression
+                  if userConceptsMap[member.id] && userConceptsMap[member.id][concept] === 'complete'
+                    span.spr.progress-level-cell.progress-level-cell-complete(data-i18n="concepts." + concept)
+                  else if userConceptsMap[member.id] && userConceptsMap[member.id][concept] === 'started'
+                    span.spr.progress-level-cell.progress-level-cell-started(data-i18n="concepts." + concept)
+                  else
+                    span.spr.progress-level-cell.progress-level-cell-not-started(data-i18n="concepts." + concept)
+                .level-progression-levels Levels
                 each campaign in campaignLevelProgressions
                   if lastUserCampaignLevelMap[member.id] && lastUserCampaignLevelMap[member.id][campaign.ID]
                     div.level-progression-campaign= campaign.name
diff --git a/app/templates/clans/clans.jade b/app/templates/clans/clans.jade
index d75f511cf..a0c14444d 100644
--- a/app/templates/clans/clans.jade
+++ b/app/templates/clans/clans.jade
@@ -10,7 +10,7 @@ block content
     input(type='checkbox').private-clan-checkbox
     span.spl(data-i18n="clans.make_private") Make clan private
     span.spl (
-    a.private-more-info(data-i18n="clans.subs_only") subscribers only
+    a.private-more-info(data-i18n="clans.private_preview")
     span )
   p
     button.btn.btn-success.create-clan-btn(data-i18n="clans.create_clan") Create New Clan
diff --git a/app/templates/teachers.jade b/app/templates/teachers.jade
index e540565c7..925f0510b 100644
--- a/app/templates/teachers.jade
+++ b/app/templates/teachers.jade
@@ -48,11 +48,25 @@ block content
         span.spl(data-i18n="teachers.monitor_progress_4")
       p(data-i18n="teachers.monitor_progress_5")
       h4(data-i18n="teachers.sub_includes_7")
-      p(data-i18n="teachers.private_clans_1")
+      ul
+        li 
+          strong Track concepts
+          span.spl learned by each student
+        li Track levels completed for each student
+        li 
+          span See your students'
+          strong.spl solutions
+        li Sort students by name or progress
+        li 
+          strong Requires invitation
+          span.spl to join
+      p
+        img(src='/images/pages/clans/dashboard_preview.png' height='400')
       p
         span.spr(data-i18n="teachers.private_clans_2")
         a(href='/clans', data-i18n="clans.clan")
         span(data-i18n="teachers.private_clans_3")
+      p Private clans require a subscription to create or join.
 
       h3(data-i18n="teachers.material_title")
       if me.get('chinaVersion')
@@ -78,19 +92,19 @@ block content
         tbody
           tr
             td Syntax
-            td If/Else
+            td If Statements
             td Arithmetic
             td Object Literals
           tr
             td Methods
             td Relational Operators
-            td While-loops
+            td While Loops
             td Remote Method Invocation
           tr
             td Parameters
             td Object Properties
-            td Break
-            td For-Loops
+            td Break Statements
+            td For Loops
           tr
             td Strings
             td Input Handling
diff --git a/app/views/clans/ClanDetailsView.coffee b/app/views/clans/ClanDetailsView.coffee
index 367664a85..0ffa55e40 100644
--- a/app/views/clans/ClanDetailsView.coffee
+++ b/app/views/clans/ClanDetailsView.coffee
@@ -133,22 +133,34 @@ module.exports = class ClanDetailsView extends RootView
     @memberSessions.fetch cache: false
 
   sortMembers: (highestUserLevelCountMap, userConceptsMap) ->
-    # Progress sort precedence: most concepts, most levels, name sort
+    # Progress sort precedence: most completed concepts, most started concepts, most levels, name sort
     return unless @members? and @memberSort?
     switch @memberSort
       when "nameDesc"
         @members.comparator = (a, b) -> return (b.get('name') or 'Anoner').localeCompare(a.get('name') or 'Anoner')
       when "progressAsc"
         @members.comparator = (a, b) ->
-          if Object.keys(userConceptsMap[a.id]).length < Object.keys(userConceptsMap[b.id]).length then return -1
-          else if Object.keys(userConceptsMap[a.id]).length > Object.keys(userConceptsMap[b.id]).length then return 1
+          aComplete = (concept for concept, state of userConceptsMap[a.id] when state is 'complete')
+          bComplete = (concept for concept, state of userConceptsMap[b.id] when state is 'complete')
+          aStarted = (concept for concept, state of userConceptsMap[a.id] when state is 'started')
+          bStarted = (concept for concept, state of userConceptsMap[b.id] when state is 'started')
+          if aComplete < bComplete then return -1
+          else if aComplete > bComplete then return 1
+          else if aStarted < bStarted then return -1
+          else if aStarted > bStarted then return 1
           if highestUserLevelCountMap[a.id] < highestUserLevelCountMap[b.id] then return -1
           else if highestUserLevelCountMap[a.id] > highestUserLevelCountMap[b.id] then return 1
           (a.get('name') or 'Anoner').localeCompare(b.get('name') or 'Anoner')
       when "progressDesc"
         @members.comparator = (a, b) ->
-          if Object.keys(userConceptsMap[a.id]).length > Object.keys(userConceptsMap[b.id]).length then return -1
-          else if Object.keys(userConceptsMap[a.id]).length < Object.keys(userConceptsMap[b.id]).length then return 1
+          aComplete = (concept for concept, state of userConceptsMap[a.id] when state is 'complete')
+          bComplete = (concept for concept, state of userConceptsMap[b.id] when state is 'complete')
+          aStarted = (concept for concept, state of userConceptsMap[a.id] when state is 'started')
+          bStarted = (concept for concept, state of userConceptsMap[b.id] when state is 'started')
+          if aComplete > bComplete then return -1
+          else if aComplete < bComplete then return 1
+          else if aStarted > bStarted then return -1
+          else if aStarted < bStarted then return 1
           if highestUserLevelCountMap[a.id] > highestUserLevelCountMap[b.id] then return -1
           else if highestUserLevelCountMap[a.id] < highestUserLevelCountMap[b.id] then return 1
           (b.get('name') or 'Anoner').localeCompare(a.get('name') or 'Anoner')
diff --git a/app/views/clans/ClansView.coffee b/app/views/clans/ClansView.coffee
index 126086f2c..50c3d806d 100644
--- a/app/views/clans/ClansView.coffee
+++ b/app/views/clans/ClansView.coffee
@@ -73,9 +73,15 @@ module.exports = class ClansView extends RootView
 
   setupPrivateInfoPopover: ->
     popoverTitle = "<h3>Private Clans</h3>"
-    popoverContent = "<p>Invite only</p>"
-    popoverContent += "<p>Detailed dashboard:</p>"
-    popoverContent += "<p><img src='/images/pages/clans/dashboard_preview.png' width='700'></p>"
+    popoverContent = "<ul>"
+    popoverContent += "<li><span style='font-weight:bold;'>Track concepts</span> learned by each member"
+    popoverContent += "<li>Track levels completed for each member"
+    popoverContent += "<li>See your members' <span style='font-weight:bold;'>solutions</span>"
+    popoverContent += "<li>Sort members by name or progress"
+    popoverContent += "<li><span style='font-weight:bold;'>Requires invitation</span> to join"
+    popoverContent += "</ul>"
+    popoverContent += "<p><img src='/images/pages/clans/dashboard_preview.png' height='400'></p>"
+    popoverContent += "<p>Private clans require a subscription to create or join.</p>"
     @$el.find('.private-more-info').popover(
       animation: true
       html: true