diff --git a/Changelog b/Changelog
index e17b3a4..401b050 100644
--- a/Changelog
+++ b/Changelog
@@ -1,3 +1,12 @@
+Changes for MarkUs 0.11.0:
+* Add simple hiding assignments from students
+  feature.
+
+Changes for MarkUs 0.10.1:
+* API helper script fixes (Ruby version).
+* I18n fixes.
+* JavaScript error fixing (quoting).
+
 Changes for MarkUs 0.10.0:
 * Use of Bundler to manage Gems dependencies.
 * Fixed UI bugs (marking state, released checkbox).
diff --git a/app/MARKUS_VERSION b/app/MARKUS_VERSION
index 81b25f5..590beee 100644
--- a/app/MARKUS_VERSION
+++ b/app/MARKUS_VERSION
@@ -1 +1 @@
-VERSION=0.10,PATCH_LEVEL=1
+VERSION=0.11,PATCH_LEVEL=0
diff --git a/app/controllers/assignments_controller.rb b/app/controllers/assignments_controller.rb
index 7df52a4..0a882b3 100644
--- a/app/controllers/assignments_controller.rb
+++ b/app/controllers/assignments_controller.rb
@@ -31,6 +31,10 @@ class AssignmentsController < ApplicationController
   
   def student_interface
     @assignment = Assignment.find(params[:id])
+    if @assignment.is_hidden
+      render :file => "public/404.html", :status => 404
+      return
+    end
     @student = current_user
     @grouping = @student.accepted_grouping_for(@assignment.id)
 
@@ -98,9 +102,11 @@ class AssignmentsController < ApplicationController
   # Displays "Manage Assignments" page for creating and editing 
   # assignment information
   def index
-    @assignments = Assignment.all(:order => :id)
     @grade_entry_forms = GradeEntryForm.all(:order => :id)
     if current_user.student?
+      @assignments = Assignment.find(:all, :conditions =>
+                                             { :is_hidden => false },
+                                           :order => :id)
       # get results for assignments for the current user
       @a_id_results = Hash.new()
       @assignments.each do |a|
@@ -131,8 +137,12 @@ class AssignmentsController < ApplicationController
       render :action => "student_assignment_list"
       return
     elsif current_user.ta?
+      # TAs can see all assignments
+      @assignments = Assignment.find(:all, :order => :id)
       render :action => "grader_index"
     else
+      # Admins can see all assignments
+      @assignments = Assignment.find(:all, :order => :id)
       render :action => 'index'
     end
   end
diff --git a/app/views/assignments/_form.html.erb b/app/views/assignments/_form.html.erb
index edf1e92..5b62289 100644
--- a/app/views/assignments/_form.html.erb
+++ b/app/views/assignments/_form.html.erb
@@ -84,14 +84,31 @@
 
    <%= f.label :repository_folder, t(:repository_folder)%>
    /<%= f.text_field :repository_folder%><br />
+
    <%= f.label :allow_web_submits, t("assignment.allow_web_submits") %>&nbsp;&nbsp;
-   <%= f.radio_button :allow_web_submits, true, :checked => @assignment.allow_web_submits %><%= f.label :allow_web_submits_true, t("answer_yes"), :class => "radio_label"%>&nbsp;&nbsp;
-  <%= f.radio_button :allow_web_submits, false, :checked => !@assignment.allow_web_submits %><%= f.label :allow_web_submits_false, t("answer_no"), :class => "radio_label"%><br />
-    <%= f.label :display_grader_names_to_students, t("assignment.display_grader_names_to_students") %>&nbsp;&nbsp;
-        <%= f.radio_button :display_grader_names_to_students, true, :checked => @assignment.display_grader_names_to_students %><%= f.label :display_grader_names_to_students_true, t("answer_yes"), :class => "radio_label"%>&nbsp;&nbsp;
-        <%= f.radio_button :display_grader_names_to_students, false, :checked => !@assignment.display_grader_names_to_students %><%= f.label :display_grader_names_to_students_false, t("answer_no"), :class => "radio_label"%>
+   <%= f.radio_button :allow_web_submits, true, :checked => @assignment.allow_web_submits %>
+   <%= f.label :allow_web_submits_true, t("answer_yes"), :class => "radio_label"%>&nbsp;&nbsp;
+   <%= f.radio_button :allow_web_submits, false, :checked => !@assignment.allow_web_submits %>
+   <%= f.label :allow_web_submits_false, t("answer_no"), :class => "radio_label"%><br />
 
+   <%= f.label :display_grader_names_to_students,
+               t("assignment.display_grader_names_to_students") %>&nbsp;&nbsp;
+   <%= f.radio_button :display_grader_names_to_students, true,
+                      :checked => @assignment.display_grader_names_to_students %>
+   <%= f.label :display_grader_names_to_students_true, t("answer_yes"),
+               :class => "radio_label"%>&nbsp;&nbsp;
+   <%= f.radio_button :display_grader_names_to_students, false,
+                      :checked => !@assignment.display_grader_names_to_students %>
+   <%= f.label :display_grader_names_to_students_false, t("answer_no"), :class => "radio_label"%>
+   <br />
 
+   <%= f.label :is_hidden, t("assignment.is_hidden") %>&nbsp;&nbsp;
+   <%= f.radio_button :is_hidden, true,
+                      :checked => @assignment.is_hidden %>
+   <%= f.label :is_hidden_true, t("answer_yes"), :class => "radio_label"%>
+   <%= f.radio_button :is_hidden, false,
+                      :checked => !@assignment.is_hidden %>
+   <%= f.label :is_hidden_false, t("answer_no"), :class => "radio_label"%>
    <br />
    <br />
 </fieldset>
diff --git a/app/views/assignments/_list.html.erb b/app/views/assignments/_list.html.erb
index b9e3a3d..bbfa409 100644
--- a/app/views/assignments/_list.html.erb
+++ b/app/views/assignments/_list.html.erb
@@ -1,9 +1,9 @@
 <div class="section">
 
   <% if @assignments.empty? %>
-  
-    <p>t:(no_assignments)</p>
-    
+
+    <p><%= I18n.t(:no_assignments) %></p>
+
   <% else %>
 		
     <table><!-- listing assignments -->
diff --git a/app/views/assignments/_list_manage.html.erb b/app/views/assignments/_list_manage.html.erb
index 93e8754..f02e55d 100644
--- a/app/views/assignments/_list_manage.html.erb
+++ b/app/views/assignments/_list_manage.html.erb
@@ -8,12 +8,22 @@
     
 	    <% @assignments.each do |assignment| %>
         <li>
-          <%= link_to h(assignment.short_identifier)+": 
-              "+h(assignment.description), 
-              {:controller => controller, 
-               :action => action, 
-               :id => assignment},
-	             :class => "assignment_list"%>
+          <% if assignment.is_hidden %>
+            <%= link_to t("assignment.hidden",
+                            :assignment_text =>
+                            "#{h(assignment.short_identifier)}: #{h(assignment.description)}" ),
+                {:controller => controller, 
+                 :action => action, 
+                 :id => assignment},
+                 :class => "assignment_list"%>
+          <% else %>
+            <%= link_to h(assignment.short_identifier)+": 
+                "+h(assignment.description), 
+                {:controller => controller, 
+                 :action => action, 
+                 :id => assignment},
+                 :class => "assignment_list"%>
+          <% end %>
 	        <span class="info_due_date"><%= I18n.t(:due) %>
           <span class="info_date">  
             <%=h I18n.l(assignment.due_date, :format => :long_date ) %>
diff --git a/app/views/layouts/_sub_menu.html.erb b/app/views/layouts/_sub_menu.html.erb
index dbc1497..ed0808d 100755
--- a/app/views/layouts/_sub_menu.html.erb
+++ b/app/views/layouts/_sub_menu.html.erb
@@ -31,7 +31,9 @@
 
         <% # Display the assignment's short identifier
         %>
-        <span id="choose_an_assignment"><%=h(@assignment.short_identifier)%></span>
+        <span id="choose_an_assignment">
+          <%=h(@assignment.short_identifier)%>
+        </span>
       <% elsif !@grade_entry_form.nil? %>
  
         <% # Display the grade entry form's short identifier 
diff --git a/app/views/shared/_assignments_dropdown_menu.html.erb b/app/views/shared/_assignments_dropdown_menu.html.erb
index 0c8a991..dfb7e6c 100644
--- a/app/views/shared/_assignments_dropdown_menu.html.erb
+++ b/app/views/shared/_assignments_dropdown_menu.html.erb
@@ -20,15 +20,44 @@
           controller.controller_name == "grade_entry_forms" %>
       <% if @current_user.student? %>
         <li class="level2">
-          <%= link_to h(assignment.short_identifier), :controller => 'assignments', :action => 'student_interface', :id => assignment.id %>
+          <% 
+            # Don't show hidden assignments to students
+            if !assignment.is_hidden %>
+              <%= link_to h(assignment.short_identifier),
+                  :controller => 'assignments',
+                  :action => 'student_interface',
+                  :id => assignment.id %>
+          <% end %>
         </li>
       <% elsif @current_user.ta? %>
         <li class="level2">
-          <%= link_to h(assignment.short_identifier), :controller => 'submissions', :action => 'browse', :id => assignment.id %>
+          <% if assignment.is_hidden %>
+            <%= link_to t("assignment.hidden",
+                            :assignment_text => h(assignment.short_identifier)),
+                  :controller => 'submissions',
+                  :action => 'browse',
+                  :id => assignment.id %>
+          <% else %>
+            <%= link_to h(assignment.short_identifier),
+                  :controller => 'submissions',
+                  :action => 'browse',
+                  :id => assignment.id %>
+          <% end %>
 		</li>
       <% else %>
         <li class="level2">
-          <%= link_to h(assignment.short_identifier), :controller => 'assignments', :action => "edit", :id => assignment.id %>
+          <% if assignment.is_hidden %>
+            <%= link_to t("assignment.hidden",
+                            :assignment_text => h(assignment.short_identifier)),
+                  :controller => 'assignments',
+                  :action => "edit",
+                  :id => assignment.id %>
+          <% else %>
+            <%= link_to h(assignment.short_identifier),
+                  :controller => 'assignments',
+                  :action => "edit",
+                  :id => assignment.id %>
+          <% end %>
 		</li>
       <% end %>
     <% else %>
@@ -44,12 +73,37 @@
            else
              target_controller = controller.controller_name
            end %>
-        <% # If the current controller action is repo_browser, the drop down 
+        <% # If the current controller action is repo_browser, the drop down
            # menu for assignments should go to browse, and not repo_browser
            if controller.action_name == 'repo_browser'
              controller.action_name = 'browse'
-           end %> 
-		<%= link_to h(assignment.short_identifier), :controller => target_controller, :action => controller.action_name, :id => assignment.id %>
+           end %>
+        <%
+          # Don't show hidden assignments in the dropdown menu for students
+          # either. Append "(hidden)" for TAs and Admins.
+          if !@current_user.student? %>
+          <% if assignment.is_hidden %>
+            <%= link_to t("assignment.hidden", :assignment_text =>
+                                      h(assignment.short_identifier)),
+                    :controller => target_controller,
+                    :action => controller.action_name,
+                    :id => assignment.id %>
+          <% else %>
+            <%= link_to h(assignment.short_identifier),
+                    :controller => target_controller,
+                    :action => controller.action_name,
+                    :id => assignment.id %>
+          <% end %>
+        <%
+          # student user, so show only non-hidden assignments
+          else %>
+          <% if !assignment.is_hidden %>
+            <%= link_to h(assignment.short_identifier),
+                    :controller => target_controller,
+                    :action => controller.action_name,
+                    :id => assignment.id %>
+          <% end %>
+        <% end %>
       </li>
     <% end %>
   <% else %>
diff --git a/config/locales/en.yml b/config/locales/en.yml
index c71f5da..fc83e03 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -109,6 +109,7 @@ en:
       errors:               "Errors"
       results_loss_warning: "Note: This will erase any marking and annotations already done.\n\nAre you sure you want to proceed?"
     assignment:
+        hidden: "%{assignment_text} (hidden)"
         assignment: "Assignment %{short_identifier}"
         name:           "Assignment Name"
         update_success:        "Successfully updated the assignment"
@@ -153,7 +154,8 @@ en:
             flexible: "Flexible"
         notice:
             change_marking_scheme_type: "Changing marking scheme will delete your criteria and marks."
-        allow_web_submits: "Allow Web Submits?"
+        allow_web_submits: "Allow Web submits?"
+        is_hidden: "Hide assignment from students?"
         display_grader_names_to_students: "Display grader names to students?"
         section_due_date_not_displayed: "Due dates are specific to sections."
         section_due_date_type: "Due dates are specified per section."
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
index 82398ff..c7766ff 100644
--- a/config/locales/fr.yml
+++ b/config/locales/fr.yml
@@ -109,6 +109,7 @@ fr:
       errors:               "Erreurs"
       results_loss_warning: "Attention : Cette action effacera vos annotations et évaluations.\n\n!Êtes vous sûr de vouloir continuer ?"
     assignment:
+        hidden: "%{assignment_text} (masqué)"
         assignment: "Projet %{short_identifier}"
         name:           "Nom du projet"
         update_success: "Projet mis à jour"
@@ -154,6 +155,7 @@ fr:
         notice:
             change_marking_scheme_type: "Changer le barème effacera vos critères et vos évaluations."
         allow_web_submits: "Envois via l'interface web ?"
+        is_hidden: "Cacher le projet aux étudiants ?"
         display_grader_names_to_students: "Afficher le nom du correcteur aux étudiants ?"
         section_due_date_not_displayed: "Les dates de retour sont spécifiques aux sections."
         section_due_date_type: "Les dates de retour sont spécifiées par section."
diff --git a/db/migrate/20110924144240_add_hidden_boolean_to_assignments_model.rb b/db/migrate/20110924144240_add_hidden_boolean_to_assignments_model.rb
new file mode 100644
index 0000000..7ab89ad
--- /dev/null
+++ b/db/migrate/20110924144240_add_hidden_boolean_to_assignments_model.rb
@@ -0,0 +1,11 @@
+class AddHiddenBooleanToAssignmentsModel < ActiveRecord::Migration
+  def self.up
+    # Boolean flag in order to be able to hide assignments from students.
+    # Default to visible assignments
+    add_column :assignments, :is_hidden, :boolean, :default => false
+  end
+
+  def self.down
+    remove_column :assignments, :is_hidden
+  end
+end
diff --git a/db/schema.rb b/db/schema.rb
index ba26555..0426e69 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -9,7 +9,7 @@
 #
 # It's strongly recommended to check this file into your version control system.
 
-ActiveRecord::Schema.define(:version => 20110313200240) do
+ActiveRecord::Schema.define(:version => 20110924144240) do
 
   create_table "annotation_categories", :force => true do |t|
     t.text     "annotation_category_name"
@@ -90,6 +90,7 @@ ActiveRecord::Schema.define(:version => 20110313200240) do
     t.boolean  "allow_remarks",                    :default => true,     :null => false
     t.datetime "remark_due_date"
     t.text     "remark_message"
+    t.boolean  "is_hidden",                        :default => false
   end
 
   add_index "assignments", ["short_identifier"], :name => "index_assignments_on_name", :unique => true
diff --git a/public/stylesheets/main.css b/public/stylesheets/main.css
index 91c027b..2ce2fca 100644
--- a/public/stylesheets/main.css
+++ b/public/stylesheets/main.css
@@ -1260,7 +1260,7 @@ span.info_date{
 a.assignment_list{
   font-size: 1.2em;
   display: inline-block;
-  min-width: 15em;
+  min-width: 20em;
 }
 
 span.title{
diff --git a/test/blueprints/blueprints.rb b/test/blueprints/blueprints.rb
index 42bea96..d484061 100644
--- a/test/blueprints/blueprints.rb
+++ b/test/blueprints/blueprints.rb
@@ -73,6 +73,7 @@ Assignment.blueprint do
   tokens_per_day {10}
   assign_graders_to_criteria {false}
   assignment_stat {AssignmentStat.make}
+  is_hidden {false}
 end
 
 AssignmentFile.blueprint do
diff --git a/test/functional/assignments_controller_test.rb b/test/functional/assignments_controller_test.rb
index ca78549..21a9438 100644
--- a/test/functional/assignments_controller_test.rb
+++ b/test/functional/assignments_controller_test.rb
@@ -1108,4 +1108,91 @@ class AssignmentsControllerTest < AuthenticatedControllerTest
 
   end # context assignment past due date, pre collection date
 
+  # MarkUs 0.11.0 tests (hidden assignments)
+  context "On a setup with hidden and visible assignments" do
+    setup do
+      clear_fixtures
+      @hidden_assignment = Assignment.make( :is_hidden => true )
+      @visible_assignment = Assignment.make
+      @third_assignment = Assignment.make
+      @drop_down_raw_regexp = String.new('<li class="level2">\s*' +
+                '<a href="[^"]*">\s*%s\s*</a>\s*</li>')
+    end
+
+    context "a logged in admin" do
+      setup do
+        @admin = Admin.make
+      end
+      should "see hidden assignments flagged as such" do
+        assert_not_nil @hidden_assignment.submission_rule
+        assert_not_nil @visible_assignment.submission_rule
+        response = get_as(@admin, :index)
+        # inject match-token where %s was in raw_regexp
+        match_regexp = @drop_down_raw_regexp % Regexp.escape(
+                                        I18n.t("assignment.hidden",
+                                          :assignment_text =>
+                                          @hidden_assignment.short_identifier) )
+        no_match_regexp = @drop_down_raw_regexp % Regexp.escape( 
+                                            @hidden_assignment.short_identifier )
+        # regexp in order to make sure the JS drop-down menu contains
+        # the "(hidden)" suffix
+        drop_down_regexp_match = Regexp.new( match_regexp )
+        assert_not_nil drop_down_regexp_match.match(response.body)
+        # sanity check for regexp (i.e. should not match response without
+        # the "(hidden)" suffix
+        drop_down_regexp_no_match = Regexp.new( no_match_regexp )
+        assert_nil drop_down_regexp_no_match.match(response.body)
+        # in the assignment list hidden assignments should be suffixed
+        # with "(hidden)"
+        assignment_list_regexp = Regexp.new( Regexp.escape(I18n.t("assignment.hidden",
+                :assignment_text =>
+                  "#{@hidden_assignment.short_identifier}: " +
+                  "#{@hidden_assignment.description}") ))
+        assert_not_nil assignment_list_regexp.match(response.body)
+      end
+    end
+
+    context "a logged in student" do
+      setup do
+        @student = Student.make
+      end
+
+      should "not be able to see hidden assignments" do
+        response = get_as(@student, :index)
+        # Sanity check for regexp. I.e. we don't want to not match
+        # due to a broken regexp.
+        do_match = @drop_down_raw_regexp %
+                Regexp.escape(@third_assignment.short_identifier)
+        drop_down_regexp_match = Regexp.new( do_match )
+        assert_not_nil drop_down_regexp_match.match(response.body)
+
+        # Hidden assignments should not show up in the drop-down
+        no_match = @drop_down_raw_regexp %
+                Regexp.escape(@hidden_assignment.short_identifier)
+        drop_down_regexp_no_match = Regexp.new( no_match )
+        assert_nil drop_down_regexp_no_match.match(response.body)
+
+        # In the assignment list hidden assignments should
+        # not show up as well.
+        assignment_list_regexp = Regexp.new(
+                  "#{@hidden_assignment.short_identifier}: " +
+                  "#{@hidden_assignment.description}" )
+        assert_nil assignment_list_regexp.match(response.body)
+
+        # Make sure the JS drop-down menu does not contain
+        # hidden assignments when looking at another non-hidden
+        # assignment.
+        response = get_as(@student, :student_interface,
+                            :id => @visible_assignment.id)
+        assert_not_nil drop_down_regexp_match.match(response.body)
+        assert_nil drop_down_regexp_no_match.match(response.body)
+      end
+
+      should "not be able to access a hidden assignment via its id" do
+        get_as(@student, :student_interface, :id => @hidden_assignment.id)
+        assert_response :not_found
+      end
+    end
+  end
+
 end

