diff --git a/app/core/utils.coffee b/app/core/utils.coffee
index 6b8236ae2..e69808462 100644
--- a/app/core/utils.coffee
+++ b/app/core/utils.coffee
@@ -206,3 +206,40 @@ module.exports.getCoursesPrice = getSponsoredSubsAmount = (courses, seats=20) ->
   else
     pricePerSeat = parseInt(totalPricePerSeat)
   seats * pricePerSeat
+
+module.exports.getCoursePraise = getCoursePraise = ->
+  praise = [
+    {
+      quote:  "The kids love it."
+      source: "Leo Joseph Tran, Athlos Leadership Academy"
+    },
+    {
+      quote: "My students have been using the site for a couple of weeks and they love it."
+      source: "Scott Hatfield, Computer Applications Teacher, School Technology Coordinator, Eastside Middle School"
+    },
+    {
+      quote: "Thanks for the captivating site. My eighth graders love it."
+      source: "Janet Cook, Ansbach Middle/High School"
+    },
+    {
+      quote: "My students have started working on CodeCombat and love it! I love that they are learning coding and problem solving skills without them even knowing it!!"
+      source: "Kristin Huff, Special Education Teacher, Webb City School District"
+    },
+    {
+      quote: "I recently introduced Code Combat to a few of my fifth graders and they are loving it!"
+      source: "Shauna Hamman, Fifth Grade Teacher, Four Peaks Elementary School"
+    },
+    {
+      quote: "Overall I think it's a fantastic service. Variables, arrays, loops, all covered in very fun and imaginative ways. Every kid who has tried it is a fan."
+      source: "Aibinder Andrew, Technology Teacher"
+    },
+    {
+      quote: "I love what you have created. The kids are so engaged."
+      source: "Desmond Smith, 4KS Academy"
+    },
+    {
+      quote: "My students love the website and I hope on having content structured around it in the near future."
+      source: "Michael Leonard, Science Teacher, Clearwater Central Catholic High School"
+    }
+  ]
+  praise[_.random(0, praise.length - 1)]
diff --git a/app/locale/bg.coffee b/app/locale/bg.coffee
index 3c3ffcd8f..6e11a054b 100644
--- a/app/locale/bg.coffee
+++ b/app/locale/bg.coffee
@@ -485,46 +485,46 @@ module.exports = nativeDescription: "български език", englishDescri
 #    subscribe_prepaid: "Click Subscribe to use prepaid code"
 #    using_prepaid: "Using prepaid code for monthly subscription"
 
-#  choose_hero:
-#    choose_hero: "Choose Your Hero"
-#    programming_language: "Programming Language"
-#    programming_language_description: "Which programming language do you want to use?"
-#    default: "Default"
-#    experimental: "Experimental"
-#    python_blurb: "Simple yet powerful, great for beginners and experts."
-#    javascript_blurb: "The language of the web. (Not the same as Java.)"
-#    coffeescript_blurb: "Nicer JavaScript syntax."
-#    clojure_blurb: "A modern Lisp."
-#    lua_blurb: "Game scripting language."
-#    io_blurb: "Simple but obscure."
-#    status: "Status"
-#    hero_type: "Type"
-#    weapons: "Weapons"
-#    weapons_warrior: "Swords - Short Range, No Magic"
-#    weapons_ranger: "Crossbows, Guns - Long Range, No Magic"
-#    weapons_wizard: "Wands, Staffs - Long Range, Magic"
-#    attack: "Damage" # Can also translate as "Attack"
-#    health: "Health"
-#    speed: "Speed"
-#    regeneration: "Regeneration"
-#    range: "Range" # As in "attack or visual range"
-#    blocks: "Blocks" # As in "this shield blocks this much damage"
-#    backstab: "Backstab" # As in "this dagger does this much backstab damage"
-#    skills: "Skills"
-#    attack_1: "Deals"
-#    attack_2: "of listed"
-#    attack_3: "weapon damage."
-#    health_1: "Gains"
-#    health_2: "of listed"
-#    health_3: "armor health."
-#    speed_1: "Moves at"
-#    speed_2: "meters per second."
-#    available_for_purchase: "Available for Purchase" # Shows up when you have unlocked, but not purchased, a hero in the hero store
-#    level_to_unlock: "Level to unlock:" # Label for which level you have to beat to unlock a particular hero (click a locked hero in the store to see)
-#    restricted_to_certain_heroes: "Only certain heroes can play this level."
+  choose_hero:
+    choose_hero: "Избери си герой"
+    programming_language: "Език за програмиране"
+    programming_language_description: "Кой език за програмиране би искал да използваш?"
+    default: "По подразбиране"
+    experimental: "Експериментално"
+    python_blurb: "Прост,но мощен, идеален за начинаещи и експерти."
+    javascript_blurb: "Езикът на мрежата. (Не е същия като Java.)"
+    coffeescript_blurb: "По-добър синтаксис от JavaScript."
+    clojure_blurb: "Модерен Lisp."
+    lua_blurb: "Скриптен език за игри."
+    io_blurb: "Прост, но неизвестен."
+    status: "Статус"
+    hero_type: "Тип"
+    weapons: "Оръжия"
+    weapons_warrior: "Мечове - Къс Обсег, Без Магия"
+    weapons_ranger: "Арбалети, Пистолети - Далечен Обсег, Без магия"
+    weapons_wizard: "Жезли, Принадлежности - Далечен Обсег, Магия"
+    attack: "Щета" # Може също да се преведе като "Атака"
+    health: "Здраве"
+    speed: "Скорост"
+    regeneration: "Възстановяване"
+    range: "Обсег" # както в  "обсег на атаката или визуален обсег"
+    blocks: "Защита" # както в "този щит може да те защити от много удари"
+    backstab: "Удар в гърба" #  както в "тази кама може да е много опасна при удар в гърба"
+    skills: "Умения"
+    attack_1: "Количество" 
+    attack_2: "на изброените"
+    attack_3: "щети от оръжия."
+    health_1: "Печалби" 
+    health_2: "от изброените"
+    health_3: "защитни брони."
+    speed_1: "Движения"
+    speed_2: "в метри за секунда"
+    available_for_purchase: "На разположение за закупуване" # Показва се когато сте достигнали, но не сте закупили герой от магазина за герои "
+    level_to_unlock: "Ниво на отключване:" # Етикет за нивото, което трябва да достигнеш за да отключиш определен герой (кликни на заключения герой в магазина за да видиш)
+    restricted_to_certain_heroes: "Само определени герои могат да играят това ниво."
 
 #  skill_docs:
-#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    writable: "writable" # Hover over "attack" in Your Skils while playing a level to see most of this
 #    read_only: "read-only"
 #    action_name: "name"
 #    action_cooldown: "Takes"
diff --git a/app/locale/es-419.coffee b/app/locale/es-419.coffee
index 6fff30c71..f925aaf63 100644
--- a/app/locale/es-419.coffee
+++ b/app/locale/es-419.coffee
@@ -255,8 +255,8 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
     victory_new_item: "Objeto Nuevo"
     victory_viking_code_school: "Santo cielo, Holy smokes, el nivel que acabas de pasar era dificil! Si todavía no eres un desarrollador de software, deberías serlo. Acabas de conseguir una aceptación por vía rápida con la Escuela Vikinga de Có, donde tú puedes llevar tus habilidades al siguiente nivel y convertirteen un desarrollador web profesional en 14 semanas."
     victory_become_a_viking: "Conviértete en un Vikingo"
-#    victory_bloc: "Great work! Your skills are improving, and someone's taking notice. If you've considered becoming a software developer, this may be your lucky day. Bloc is an online bootcamp that pairs you 1-on-1 with an expert mentor who will help train you into a professional developer! By beating A Mayhem of Munchkins, you're now eligible for a $500 price reduction with the code: CCRULES"
-#    victory_bloc_cta: "Meet your mentor – learn about Bloc"
+#    victory_bloc: "¡Buen trabajo! Tus habilidades están mejorando, y alguien ya se dió cuenta. Si has considerado convertirte en un desarrollador de software, este podría ser tu día de suerte. Bloc es un online bootcamp que te pairs 1-on-1 with an expert mentor who will help train you into a professional developer! By beating A Mayhem of Munchkins, you're now eligible for a $500 price reduction with the code: CCRULES"
+    victory_bloc_cta: "Conoce a tu mentor – aprende acerca de Bloc"
     guide_title: "Guía"
     tome_minion_spells: "Hechizos de tus Secuaces" # Only in old-style levels.
     tome_read_only_spells: "Hechizos de Sólo Lectura" # Only in old-style levels.
@@ -438,19 +438,19 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
     payment_methods_blurb1: "Actualmente aceptamos tarjetas de credito y Alipay."
     payment_methods_blurb2: "Si necesitas una forma alternativa de pago, por favor contactarse"
 #    sale_already_subscribed: "You're already subscribed!"
-#    sale_blurb1: "Save 35%"
+    sale_blurb1: "Ahorra 35%"
 #    sale_blurb2: "off regular subscription price of $120 for a whole year!" # {changed}
 #    sale_button: "Sale!"
 #    sale_button_title: "Save 35% when you purchase a 1 year subscription"
-#    sale_click_here: "Click Here"
-#    sale_ends: "Ends"
+    sale_click_here: "Haz Click Aquí"
+    sale_ends: "Termina"
 #    sale_extended: "*Existing subscriptions will be extended by 1 year."
 #    sale_feature_here: "Here's what you'll get:"
 #    sale_feature2: "Access to 9 powerful <strong>new heroes</strong> with unique skills!"
 #    sale_feature4: "<strong>42,000 bonus gems</strong> awarded immediately!"
 #    sale_continue: "Ready to continue adventuring?"
-#    sale_limited_time: "Limited time offer!"
-#    sale_new_heroes: "New heroes!"
+    sale_limited_time: "¡Oferta por tiempo limitado!"
+    sale_new_heroes: "¡Nuevos héroes!"
 #    sale_title: "Back to School Sale"
 #    sale_view_button: "Buy 1 year subscription for"
     stripe_description: "Suscripción Mensual"
@@ -547,7 +547,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
 
   options:
     general_options: "Opciones Generales" # Check out the Options tab in the Game Menu while playing a level
-    volume_label: "Volumen"
+    volume_label: "Volúmen"
     music_label: "Música"
     music_description: "Música encendida/apagada."
     editor_config: "Config. de Editor"
@@ -582,7 +582,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
     press_paragraph_1_link: "paquete de prensa"
     press_paragraph_1_suffix: ". Todos los logos e imágenes pueden ser usados sin contactarnos directamente."
     team: "Equipo"
-    george_title: "CEO" # {change}
+    george_title: "Director Ejecutivo"
     george_blurb: "Negociante"
     scott_title: "Programador" # {change}
     scott_blurb: "Razonable"
@@ -665,10 +665,10 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
     denied_2: "denegada."
     contact_1: "Por favor contáctenos"
     contact_2: "si tiene más preguntas."
-#    description_1: "We offer free subscriptions to teachers for evaluation purposes. You can find more information on our"
+#    description_1: "Ofrecemos free subscriptions to teachers for evaluation purposes. You can find more information on our"
     description_2: "página"
     description_3: "de maestros."
-#    description_4: "Please fill out this quick survey and we’ll email you setup instructions."
+#    description_4: "Por favor fill out this quick survey and we’ll email you setup instructions."
     email: "Dirección de email"
     school: "Nombre del colegio"
     location: "Nombre de la ciudad"
@@ -688,7 +688,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
     cla_url: "CLA"
     cla_suffix: "."
     cla_agree: "ACEPTO"
-#    owner_approve: "An owner will need to approve it before your changes will become visible."
+    owner_approve: "Un dueño necesitará aprobarlo antes de que tus cambios puedan ser visibles."
 
   contact:
     contact_us: "Contacta a CodeCombat"
@@ -779,12 +779,12 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
     introduction: "Mira las maneras en las que puedes involucrarte adelante y decide qué es más divertido. ¡Queremos trabajar contigo!"
     level_editor_prefix: "Usar CodeCombat"
     level_editor_suffix: "para crear y editar niveles. Los han creado niveles para sus clases, amigos, hackatones, estudiantes, familiares. Si crear un nuevo juego luce intimidante puedes ¡comenzar con base en uno nuestro!"
-    thang_editor_prefix: "Nosotros llamamos a las unidades del juego 'thangs'. Usa el"
+    thang_editor_prefix: "Nosotros llamamos a las unidades del juego 'Tiliches'. Usa el"
     thang_editor_suffix: "para modificar el arte de CodeCombat. Permite a las unidades lanzar proyectiles, altera la dirección de una animación, cambia los puntos de vida de una unidad o sube tu propio sprite de vectores."
     article_editor_prefix: "¿Ves algún error en nuestros documentos? ¿Quieres hacer algunas instrucciones para tus propias creaciones? Revisa el"
     article_editor_suffix: "y ayuda a los jugadores de CodeCombat conseguir lo más posible de su tiempo jugando."
     find_us: "Encuentranos en etsos sitios"
-#    social_github: "Check out all our code on GitHub"
+    social_github: "Checa todo nuestro código en el GitHub"
     social_blog: "Lee el blog de CodeCombat en Sett"
     social_discource: "Unite a la discusión en nuestro foro"
     social_facebook: "Me Gusta CodeCombat en Facebook"
@@ -806,7 +806,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
     my_clans: "Mis Clanes"
     clan_name: "Nombre del clan"
     name: "Nombre"
-#    chieftain: "Chieftain"
+    chieftain: "Cacique/Líder" #Chieftain/Leader literally
     type: "Tipo"
     edit_clan_name: "Editar el nombre del Clan"
     edit_clan_description: "Editar descripción del clan"
@@ -836,7 +836,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
     latest_achievement: "último logro"
     playtime: "Tiempo de juego"
     last_played: "Último jugado"
-#    leagues_explanation: "Play in a league against other clan members in these multiplayer arena instances."
+#    leagues_explanation: "Juega en una liga contra otros miembros del clan en these multiplayer arena instances."
 
   classes:
     archmage_title: "Archimago"
@@ -861,7 +861,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
   editor:
     main_title: "Editor de CodeCombat"
     article_title: "Editor de Artículo"
-    thang_title: "Editor de Thangs"
+    thang_title: "Editor de Tiliches"
     level_title: "Editor de Nivel"
     achievement_title: "Editor de logros"
     poll_title: "Editor de Encuesta"
@@ -884,23 +884,23 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
     wiki: "Wiki"
     live_chat: "Chat en vivo"
     thang_main: "Principal"
-    thang_spritesheets: "Spritesheets"
+    thang_spritesheets: "Hojas de figuras( para animaciones )"
     thang_colors: "Colores"
     level_some_options: "¿Algunas opciones?"
-    level_tab_thangs: "Thangs"
+    level_tab_thangs: "Tiliches" #Verificar cual es mejor: Cachivache, Tiliche, Artilugio, Bagatela, Cosa
     level_tab_scripts: "Scripts"
     level_tab_settings: "Opciones"
     level_tab_components: "Componentes"
     level_tab_systems: "Sistemas"
     level_tab_docs: "Documentación"
-    level_tab_thangs_title: "Thangs Actuales"
+    level_tab_thangs_title: "Tiliches Actuales"
     level_tab_thangs_all: "Todo"
     level_tab_thangs_conditions: "Condiciones Iniciales"
-    level_tab_thangs_add: "Agregar Thangs"
-#    level_tab_thangs_search: "Search thangs"
+    level_tab_thangs_add: "Agregar Tiliches"
+    level_tab_thangs_search: "Buscar thangs"
     add_components: "Agregar Componentes"
     component_configs: "Configuraciones del Componente"
-    config_thang: "Doble clic para configurar un thang"
+    config_thang: "Doble clic para configurar un Tiliche"
     delete: "Borrar"
     duplicate: "Duplicar"
     stop_duplicate: "Parar de Duplicar"
@@ -911,7 +911,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
     level_systems_tab_title: "Sistemas Actuales"
     level_systems_btn_new: "Crear Nuevo Sistema"
     level_systems_btn_add: "Agregar Sistema"
-    level_components_title: "Regresar a todos los Thangs"
+    level_components_title: "Regresar a todos los Tiliches"
     level_components_type: "Tipo"
     level_component_edit_title: "Editar Componente"
     level_component_config_schema: "Config Schema"
@@ -921,17 +921,17 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
     new_component_title: "Crear Nuevo Componente"
     new_component_field_system: "Sistema"
     new_article_title: "Crear un Nuevo Artículo"
-    new_thang_title: "Crear un Nuevo tipo de Thang"
+    new_thang_title: "Crear un Nuevo tipo de Tiliche"
     new_level_title: "Crear un Nuevo Nivel"
     new_article_title_login: "Ingresa para Crear un Nuevo Artículo"
-    new_thang_title_login: "Ingresa para crear un nuevo tipo de Thang"
+    new_thang_title_login: "Ingresa para crear un nuevo tipo de Tiliche"
     new_level_title_login: "Ingresa para Crear un Nuevo Nivel"
     new_achievement_title: "Crear un Nuevo Logro"
     new_achievement_title_login: "Ingresa para Crear un Nuevo Logro"
     new_poll_title: "Crear una nueva encuesta"
     new_poll_title_login: "Ingresa para crear una nueva encuesta"
     article_search_title: "Buscar Artículos aquí"
-    thang_search_title: "Buscar tipos de Thang aquí"
+    thang_search_title: "Buscar tipos de Tiliche aquí"
     level_search_title: "Buscar Niveles aquí"
     achievement_search_title: "Buscar logros"
     poll_search_title: "Buscar Encuesta"
@@ -943,8 +943,8 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
     pop_i18n: "Poblar I18N"
     tasks: "Tareas"
     clear_storage: "Borrar tus cambios locales"
-#    add_system_title: "Add Systems to Level"
-#    done_adding: "Done Adding"
+    add_system_title: "Agregar Sistemas al Level"
+    done_adding: "Se terminó de agregar"
 
   article:
     edit_btn_preview: "Vista previa"
@@ -1026,7 +1026,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
     my_matches: "Mis Partidas"
     simulate: "Simular"
     simulation_explanation: "¡Simulando tus juegos puedes mejorar tu posición más rápido!"
-#    simulation_explanation_leagues: "You will mainly help simulate games for allied players in your clans and courses."
+#    simulation_explanation_leagues: "Principalmente ayudarás a simular juegos for allied players in your clans and courses."
     simulate_games: "¡Simular Juegos!"
     simulate_all: "REINICIAR Y SIMULAR JUEGOS"
     games_simulated_by: "Juegos simulados por ti:"
@@ -1047,7 +1047,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
     rank_failed: "Fallo al Clasificar"
     rank_being_ranked: "Juego Siendo Clasificado"
     rank_last_submitted: "Presentado"
-    help_simulate: "Ayudar simulando juego?"
+    help_simulate: "¿Ayudar simulando juego?"
     code_being_simulated: "Tu nuevo código está siendo simulado por otros jugadores para clasificación. Esto se refrescará a medida que vengan nuevas partidas."
     no_ranked_matches_pre: "Sin partidas clasificadas para el "
     no_ranked_matches_post: " equipo! Juega en contra de algunos competidores y luego vuelve aquí para ver tu juego clasificado."
@@ -1077,7 +1077,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
     tournament_blurb_blog: "en nuestro blog"
     rules: "Reglas"
     winners: "Ganadores"
-#    league: "League"
+    league: "Liga"
 
   user:
     stats: "Estados"
@@ -1093,7 +1093,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
     no_achievements: "Sin Logros todavía."
     favorite_prefix: "Idioma favorito "
     favorite_postfix: "."
-    not_member_of_clans: "No se es miembro de ningún clan todavía."
+    not_member_of_clans: "No eres miembro de ningún clan todavía."
 
   achievements:
     last_earned: "Último Ganado"
@@ -1118,7 +1118,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
     no_recent_games: "No juegos jugados duramente las últimas dos semanas."
     payments: "Pagos"
     purchased: "Comprado"
-#    sale: "Sale"
+    sale: "Venta"
     subscription: "Suscripción"
     invoices: "Facturas"
     service_apple: "Apple"
@@ -1128,14 +1128,14 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
     price: "Precio"
     gems: "Gemas"
     active: "Activo"
-    subscribed: "Suscripto"
-    unsubscribed: "Insuscripto"
+    subscribed: "Suscrito"
+    unsubscribed: "Desuscrito"
     active_until: "Activo Hasta"
     cost: "Costo"
     next_payment: "Próximo Pago"
     card: "Tarjeta"
-    status_unsubscribed_active: "No estas suscripto y no se te cobrará, pero tu cuenta está activa por ahora."
-    status_unsubscribed: "Obtén acceso a nuevos niveles, heroés, items y gemas extras con la suscripción a CodeCombat!"
+    status_unsubscribed_active: "No estas suscrito y no se te cobrará, pero tu cuenta está activa por ahora."
+    status_unsubscribed: "¡Obtén acceso a nuevos niveles, héroes, items y gemas extras con la suscripción a CodeCombat!"
 
   account_invoices:
     amount: "Cantidad en dólares."
@@ -1181,13 +1181,13 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
     systems: "Sistemas"
     component: "Componente"
     components: "Componentes"
-    thang: "Thang"
-    thangs: "Thangs"
+    thang: "Tiliche"
+    thangs: "Tiliches"
     level_session: "Tu Sesión"
     opponent_session: "Sesión del Oponente"
     article: "Artícule"
     user_names: "Nombres de usuario"
-    thang_names: "Nombres de thang"
+    thang_names: "Nombres de Tiliche"
     files: "Archivos"
     top_simulators: "Mejores simuladores"
     source_document: "Documento fuente"
@@ -1211,35 +1211,35 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
     poll: "Encuesta"
     user_polls_record: "Historia de Visitas de Encuestas"
 
-#  concepts:
-#    advanced_strings: "Advanced Strings"
-#    algorithms: "Algorithms"
-#    arguments: "Arguments"
-#    arithmetic: "Arithmetic"
-#    arrays: "Arrays"
-#    basic_syntax: "Basic Syntax"
-#    boolean_logic: "Boolean Logic"
+  concepts:
+    advanced_strings: "Manipulación Avanzada de Cadenas" #used Advanced Strings Handling instead of Advanced Strings
+    algorithms: "Algoritmos"
+    arguments: "Argumentos"
+    arithmetic: "Aritmética"
+    arrays: "Arreglos"
+    basic_syntax: "Sintaxis Básica"
+    boolean_logic: "Lógica Booleana"
 #    break_statements: "Break Statements"
-#    classes: "Classes"
+    classes: "Clases"
 #    continue_statements: "Continue Statements"
-#    for_loops: "For Loops"
-#    functions: "Functions"
-#    graphics: "Graphics"
+    for_loops: "Ciclos For"
+    functions: "Funciones"
+    graphics: "Gráficos"
 #    if_statements: "If Statements"
 #    input_handling: "Input Handling"
-#    math_operations: "Math Operations"
+    math_operations: "Operaciones Matemáticas"
 #    object_literals: "Object Literals"
-#    parameters: "Parameters"
-#    strings: "Strings"
-#    variables: "Variables"
-#    vectors: "Vectors"
-#    while_loops: "Loops"
-#    recursion: "Recursion"
+    parameters: "Parámetros"
+    strings: "Cadenas"
+    variables: "Variables"
+    vectors: "Vectores"
+    while_loops: "Ciclos While"
+    recursion: "Recursividad"
 
   delta:
     added: "Agregado"
     modified: "Modificado"
-#    not_modified: "Not Modified"
+    not_modified: "No Modificado"
     deleted: "Borrado"
     moved_index: "Índice movido"
     text_diff: "Diferir Texto"
diff --git a/app/schemas/models/course.schema.coffee b/app/schemas/models/course.schema.coffee
index b47a45b21..84b7c78bf 100644
--- a/app/schemas/models/course.schema.coffee
+++ b/app/schemas/models/course.schema.coffee
@@ -7,6 +7,7 @@ _.extend CourseSchema.properties,
   campaignID: c.objectId()
   concepts: c.array {title: 'Programming Concepts', uniqueItems: true}, c.concept
   description: {type: 'string'}
+  duration: {trype: 'number', description: 'Approximate hours of content'}
   pricePerSeat: {type: 'number', description: 'Price per seat in USD cents.'}
   screenshot: c.url {title: 'URL', description: 'Link to course screenshot.'}
 
diff --git a/app/styles/courses/courses.sass b/app/styles/courses/courses.sass
new file mode 100644
index 000000000..b1d53ca05
--- /dev/null
+++ b/app/styles/courses/courses.sass
@@ -0,0 +1,68 @@
+#courses-view
+
+  .center
+    text-align: center
+
+  .code-input
+    width: 100%
+
+  .course-image
+    width: 100%
+
+  .course-panel
+    margin: 20px
+
+  .faq-blurb
+    font-size: 14px
+
+  .continue-dialog .modal-dialog
+    background-color: white
+    max-width: 400px
+
+    .instruction-label
+      font-size: 14pt
+    .or
+      margin-bottom: 20px
+      font-size: 14pt
+
+  .btn-enroll
+    margin-top: 20px
+
+  .center
+    text-align: center
+
+  .concepts-container
+    width: 200px
+
+  .contact-container
+    margin-top: 20px
+    text-align: center
+
+  .info-container
+    margin: 0% 10%
+    font-size: 18px
+
+  .monitoring-img-container
+    margin-top: 10px
+
+  .praise-caption
+    font-size: 14px
+
+  .praise-quote
+    font-size: 20px
+    font-style: italic
+
+  .progress-container
+    font-size: 20px
+
+  .img-quote
+    height: 160px
+
+  .popover
+    z-index: 1050
+    min-width: 400px
+
+    h3
+      background: transparent
+      border: 0
+      font-size: 30px
diff --git a/app/styles/courses/mock1/course-details.sass b/app/styles/courses/mock1/course-details.sass
index f5529e293..2f909406f 100644
--- a/app/styles/courses/mock1/course-details.sass
+++ b/app/styles/courses/mock1/course-details.sass
@@ -1,4 +1,4 @@
-#course-details-view
+#course-details-mock-view
 
   .section-selector
     margin-bottom: 0px
diff --git a/app/styles/courses/mock1/course-enroll.sass b/app/styles/courses/mock1/course-enroll.sass
index befeb2460..a8ddddc4f 100644
--- a/app/styles/courses/mock1/course-enroll.sass
+++ b/app/styles/courses/mock1/course-enroll.sass
@@ -1,4 +1,4 @@
-#course-enroll-view
+#course-enroll-mock-view
 
   .btn-buy
     margin: 20px 0px
diff --git a/app/styles/courses/mock1/courses.sass b/app/styles/courses/mock1/courses.sass
index 00934aba9..20457a5fe 100644
--- a/app/styles/courses/mock1/courses.sass
+++ b/app/styles/courses/mock1/courses.sass
@@ -1,4 +1,4 @@
-#courses-view
+#courses-mock-view
 
   .center
     text-align: center
diff --git a/app/templates/courses/courses.jade b/app/templates/courses/courses.jade
index 8b19bf898..e9f62e2f6 100644
--- a/app/templates/courses/courses.jade
+++ b/app/templates/courses/courses.jade
@@ -8,19 +8,136 @@ block content
     span *UNDER CONSTRUCTION, please send feedback to
     a.spl(href='mailto:team@codecombat.com') team@codecombat.com
 
-  h1(style='text-align: center;') Courses
+  br
+  if studentMode
+    +student-main
+  else
+    +teacher-main
   .container-fluid
-    .row(style='font-size: 20px;')
-      .col-md-3
-      .col-md-3 Name
-      .col-md-3 Description
-      .col-md-3 Concepts
-    each course in courses
-      .row(style='border-top: 1px solid gray; padding: 10px;')
-        .col-md-3
-          img(src="#{course.get('screenshot')}", style="width: 100%;")
-        .col-md-3
-          p= course.get('name')
-          a(href="/editor/campaign/#{course.get('campaignID')}") Campaign (levels)
-        .col-md-3= course.get('description')
-        .col-md-3= course.get('concepts').join(' ')
+    - var i = 0
+    while i < courses.length
+      .row
+        +course-block(courses[i], instances)
+        - i++
+        if i < courses.length
+          +course-block(courses[i], instances)
+          - i++
+
+mixin student-main
+  button.btn.btn-warning.btn-teacher Teachers Click Here
+  h1.center Courses on CodeCombat
+
+mixin teacher-main
+  button.btn.btn-warning.btn-student Students Click Here
+  h1.center Courses on CodeCombat
+  .info-container
+    p Courses are designed to introduce computer science concepts using CodeCombat's fun and engaging environment. CodeCombat levels are organized around key topics to encourage progressive learning, over the course of 5 hours.
+    .container-fluid
+      .row
+        .col-md-6
+          ul
+            li Learn more in less time
+            li No coding experience necesssary
+            li Easily monitor student progress
+            
+          p Purchase a course for your entire class. It's easy to sign up your students!
+          p.faq-blurb
+            span.spr See the courses
+            a.spr.courses-faq FAQ
+            span for more information.
+        .col-md-6
+          img.img-quote(src="/images/pages/courses/coco_complab.png")
+    p
+      .well.well-sm
+        div.praise-quote "#{praise.quote}"
+        div.praise-caption - #{praise.source}
+  h2.center Choose Your Course:
+
+mixin student-dialog(course)
+  .modal.continue-dialog(id="continueModal#{course.id}")
+    .modal-dialog
+      .modal-header
+        button.close(data-dismiss='modal')
+          span &times;
+        h3.modal-title= course.get('name')
+      .modal-body
+        .container-fluid
+          .row.button-row
+            .col-md-12
+              .well.well-sm
+                p
+                  div.instruction-label Enter an unlock code
+                .container-fluid
+                  .row
+                    .col-md-8
+                      input.code-input(type='text', placeholder="Enter unlock code")
+                    .col-md-4
+                      button.btn.btn-success.btn-enroll Enroll
+
+mixin teacher-dialog(course)
+  .modal.continue-dialog(id="continueModal#{course.id}")
+    .modal-dialog
+      .modal-header
+        button.close(data-dismiss='modal')
+          span &times;
+        h3.modal-title= course.get('name')
+      .modal-body
+        .container-fluid
+          if enrolledCourses[course.id]
+            .row.button-row.row-pick-class
+              .col-md-12
+                .well.well-sm
+                  p
+                    div.instruction-label Pick from your current classes
+                  .container-fluid
+                    .row
+                      .col-md-8
+                        select.form-control.select-session
+                          each inst in instances
+                            if inst.get('name')
+                              option(value="#{inst.id}")= inst.get('name')
+                            else
+                              option(value="#{inst.id}") *unnamed*
+                      .col-md-4
+                        button.btn.btn-success.btn-enter(data-course-id="#{course.id}") Enter
+            .row.button-row.center.row-pick-class
+              .col-md-12
+                div.or Or
+          .row.button-row.center
+            .col-md-12
+              button.btn.btn-success.btn-lg.btn-buy(data-course-id="#{course.id}") Buy this course
+
+mixin course-block(course)
+  if studentMode
+    +student-dialog(course)
+  else
+    +teacher-dialog(course)
+  .col-md-6
+    .well.panel.course-panel(class=enrolledCourses[course.id] ? 'panel-success' : 'panel-info')
+      .panel-heading
+        .panel-title 
+          span.spr #{course.get('name')}
+          strong #{enrolledCourses[course.id] ? '[ enrolled ]' : ''}
+      .panel-body
+        .container-fluid
+          .row
+            .col-md-12
+              p
+               img.course-image(src="#{course.get('screenshot')}")
+          .row.button-row
+            .col-md-6
+              strong Topics
+              ul
+                each concept in course.get('concepts')
+                  li(data-i18n="concepts." + concept)
+              strong Hours of content: #{course.get('duration')}
+            .col-md-6.center(style='margin-top: 40px;')
+              if studentMode
+                if enrolledCourses[course.id]
+                  a.btn.btn-lg.btn-success.btn-continue(href="/courses/#{course.id}?student=true") Continue
+                else
+                  button.btn.btn-lg.btn-success.btn-continue(data-toggle='modal', data-target="#continueModal#{course.id}") Enter
+              else if enrolledCourses[course.id]
+                button.btn.btn-lg.btn-success.btn-continue(data-toggle='modal', data-target="#continueModal#{course.id}") Continue
+              else
+                button.btn.btn-lg.btn-success.btn-buy(data-course-id="#{course.id}") #{course.get('pricePerSeat') === 0 ? 'Get FREE course' : 'Buy course'}
diff --git a/app/views/courses/CourseEnrollView.coffee b/app/views/courses/CourseEnrollView.coffee
index 1defe8cc8..5473e4db9 100644
--- a/app/views/courses/CourseEnrollView.coffee
+++ b/app/views/courses/CourseEnrollView.coffee
@@ -20,7 +20,7 @@ module.exports = class CourseEnrollView extends RootView
   subscriptions:
     'stripe:received-token': 'onStripeReceivedToken'
 
-  constructor: (options, @courseID=0) ->
+  constructor: (options, @courseID) ->
     super options
     @courseID ?= options.courseID
     @seats = 20
@@ -99,7 +99,7 @@ module.exports = class CourseEnrollView extends RootView
 
   createClass: (token) ->
     data =
-      name: $('.class-name').val()
+      name: @className
       seats: @seats
       token: token
     data.courseID = @selectedCourse.id if @selectedCourse
diff --git a/app/views/courses/CoursesView.coffee b/app/views/courses/CoursesView.coffee
index aea87e7fe..fd8cc45a8 100644
--- a/app/views/courses/CoursesView.coffee
+++ b/app/views/courses/CoursesView.coffee
@@ -1,18 +1,95 @@
-RootView = require 'views/core/RootView'
-template = require 'templates/courses/courses'
+app = require 'core/application'
 CocoCollection = require 'collections/CocoCollection'
 Course = require 'models/Course'
+CourseInstance = require 'models/CourseInstance'
+RootView = require 'views/core/RootView'
+template = require 'templates/courses/courses'
+utils = require 'core/utils'
 
 module.exports = class CoursesView extends RootView
   id: 'courses-view'
   template: template
 
+  events:
+    'click .btn-buy': 'onClickBuy'
+    'click .btn-enroll': 'onClickEnroll'
+    'click .btn-enter': 'onClickEnter'
+    'click .btn-student': 'onClickStudent'
+    'click .btn-teacher': 'onClickTeacher'
+
   constructor: (options) ->
-    super options
+    super(options)
+    @praise = utils.getCoursePraise()
+    @studentMode = utils.getQueryVariable('student', false) or options.studentMode
     @courses = new CocoCollection([], { url: "/db/course", model: Course})
     @supermodel.loadCollection(@courses, 'courses')
+    @courseInstances = new CocoCollection([], { url: "/db/user/#{me.id}/course_instances", model: CourseInstance})
+    @listenToOnce @courseInstances, 'sync', @onCourseInstancesLoaded
+    @supermodel.loadCollection(@courseInstances, 'course_instances')
 
   getRenderData: ->
     context = super()
     context.courses = @courses.models ? []
+    context.enrolledCourses = @enrolledCourses ? {}
+    context.instances = @courseInstances.models ? []
+    context.praise = @praise
+    context.studentMode = @studentMode
     context
+
+  afterRender: ->
+    super()
+    @setupCoursesFAQPopover()
+
+  onCourseInstancesLoaded: ->
+    @enrolledCourses = {}
+    @enrolledCourses[courseInstance.get('courseID')] = true for courseInstance in @courseInstances.models
+
+  setupCoursesFAQPopover: ->
+    popoverTitle = "<h3>Courses FAQ<button type='button' class='close' onclick='$(&#39;.courses-faq&#39;).popover(&#39;hide&#39;);'>&times;</button></h3>"
+    popoverContent = "<p><strong>Q:</strong> What's the difference between these courses and the single player game?</p>"
+    popoverContent += "<p><strong>A:</strong> The single player game is designed for individuals, while the courses are designed for classes.</p>"
+    popoverContent += "<p>The single player game has items, gems, hero selection, leveling up, and in-app purchases.  Courses have classroom management features and streamlined student-focused level pacing.</p>"
+    @$el.find('.courses-faq').popover(
+      animation: true
+      html: true
+      placement: 'top'
+      trigger: 'click'
+      title: popoverTitle
+      content: popoverContent
+      container: @$el
+    ).on 'shown.bs.popover', =>
+      application.tracker?.trackEvent 'Subscription payment methods hover'
+
+  onClickBuy: (e) ->
+    courseID = $(e.target).data('course-id')
+    route = "/courses/enroll/#{courseID}"
+    viewClass = require 'views/courses/CourseEnrollView'
+    viewArgs = [{}, courseID]
+    navigationEvent = route: route, viewClass: viewClass, viewArgs: viewArgs
+    Backbone.Mediator.publish 'router:navigate', navigationEvent
+
+  onClickEnroll: (e) ->
+    alert('TODO: redeem course prepaid and navigate to correct course instance')
+
+  onClickEnter: (e) ->
+    $('.continue-dialog').modal('hide')
+    courseID = $(e.target).data('course-id')
+    courseInstanceID = $('.select-session').val()
+    viewClass = require 'views/courses/CourseDetailsView'
+    viewArgs = [{courseInstanceID:courseInstanceID}, courseID]
+    navigationEvent = route: "/courses/#{courseID}", viewClass: viewClass, viewArgs: viewArgs
+    Backbone.Mediator.publish 'router:navigate', navigationEvent
+
+  onClickStudent: (e) ->
+    route = "/courses?student=true"
+    viewClass = require 'views/courses/CoursesView'
+    viewArgs = [studentMode: true]
+    navigationEvent = route: route, viewClass: viewClass, viewArgs: viewArgs
+    Backbone.Mediator.publish 'router:navigate', navigationEvent
+
+  onClickTeacher: (e) ->
+    route = "/courses?student=false"
+    viewClass = require 'views/courses/CoursesView'
+    viewArgs = [studentMode: false]
+    navigationEvent = route: route, viewClass: viewClass, viewArgs: viewArgs
+    Backbone.Mediator.publish 'router:navigate', navigationEvent
diff --git a/app/views/courses/mock1/CourseDetailsView.coffee b/app/views/courses/mock1/CourseDetailsView.coffee
index 5cf91e0a6..90006c2c0 100644
--- a/app/views/courses/mock1/CourseDetailsView.coffee
+++ b/app/views/courses/mock1/CourseDetailsView.coffee
@@ -6,7 +6,7 @@ CocoCollection = require 'collections/CocoCollection'
 Campaign = require 'models/Campaign'
 
 module.exports = class CourseDetailsView extends RootView
-  id: 'course-details-view'
+  id: 'course-details-mock-view'
   template: template
 
   events:
diff --git a/app/views/courses/mock1/CourseEnrollView.coffee b/app/views/courses/mock1/CourseEnrollView.coffee
index ae745068a..139e878d2 100644
--- a/app/views/courses/mock1/CourseEnrollView.coffee
+++ b/app/views/courses/mock1/CourseEnrollView.coffee
@@ -3,7 +3,7 @@ RootView = require 'views/core/RootView'
 template = require 'templates/courses/mock1/course-enroll'
 
 module.exports = class CourseEnrollView extends RootView
-  id: 'course-enroll-view'
+  id: 'course-enroll-mock-view'
   template: template
 
   events:
diff --git a/app/views/courses/mock1/CoursesView.coffee b/app/views/courses/mock1/CoursesView.coffee
index ad9b204bd..7a498d0c3 100644
--- a/app/views/courses/mock1/CoursesView.coffee
+++ b/app/views/courses/mock1/CoursesView.coffee
@@ -4,7 +4,7 @@ RootView = require 'views/core/RootView'
 template = require 'templates/courses/mock1/courses'
 
 module.exports = class CoursesView extends RootView
-  id: 'courses-view'
+  id: 'courses-mock-view'
   template: template
 
   events:
diff --git a/scripts/mongodb/updateCourses.js b/scripts/mongodb/updateCourses.js
index 13e123193..7b831971b 100644
--- a/scripts/mongodb/updateCourses.js
+++ b/scripts/mongodb/updateCourses.js
@@ -4,10 +4,9 @@
 // mongo <address>:<port>/<database> <script file> -u <username> -p <password>
 
 // NOTE: uses name as unique identifier, so changing the name will insert a new course
-// NOTE: concepts should match actual campaign levels
 // NOTE: pricePerSeat in USD cents
 
-var documents =
+var courses =
 [
   {
     name: "Introduction to Computer Science",
@@ -15,6 +14,7 @@ var documents =
     campaignID: ObjectId("55b29efd1cd6abe8ce07db0d"),
     concepts: ['basic_syntax', 'arguments', 'while_loops', 'strings', 'variables'],
     description: "Learn basic syntax, while loops, and the CodeCombat environment.",
+    duration: NumberInt(1),
     pricePerSeat: NumberInt(0),
     screenshot: "/images/pages/courses/101_info.png"
   },
@@ -24,6 +24,7 @@ var documents =
     campaignID: ObjectId("55b29efd1cd6abe8ce07db0d"),
     concepts: ['basic_syntax', 'arguments', 'while_loops', 'strings', 'variables', 'if_statements'],
     description: "Introduce Arguments, Variables, If Statements, and Arithmetic.",
+    duration: NumberInt(5),
     pricePerSeat: NumberInt(400),
     screenshot: "/images/pages/courses/102_info.png"
   },
@@ -33,16 +34,30 @@ var documents =
     campaignID: ObjectId("55b29efd1cd6abe8ce07db0d"),
     concepts: ['if_statements', 'arithmetic'],
     description: "Learn how to handle input.",
+    duration: NumberInt(5),
     pricePerSeat: NumberInt(400),
     screenshot: "/images/pages/courses/103_info.png"
   }
 ];
 
-for (var i = 0; i < documents.length; i++) {
-  var doc = documents[i];
-  db.courses.update({name: doc.name}, doc, {upsert: true});
+print("Finding course concepts..");
+for (var i = 0; i < courses.length; i++) {
+  var concepts = {};
+  var cursor = db.campaigns.find({_id: courses[i].campaignID}, {'levels': 1});
+  if (cursor.hasNext()) {
+    var doc = cursor.next();
+    for (var levelID in doc.levels) {
+      for (var j = 0; j < doc.levels[levelID].concepts.length; j++) {
+        concepts[doc.levels[levelID].concepts[j]] = true;
+      }
+    }
+  }
+  courses[i].concepts = Object.keys(concepts);
 }
 
-function log(str) {
-  print(new Date().toISOString() + " " + str);
+print("Updating courses..");
+for (var i = 0; i < courses.length; i++) {
+  db.courses.update({name: courses[i].name}, courses[i], {upsert: true});
 }
+
+print("Done.");