diff --git form_example/form_example.module form_example/form_example.module
index e8f1e3b..c81de66 100644
--- form_example/form_example.module
+++ form_example/form_example.module
@@ -114,6 +114,17 @@ function form_example_menu() {
     'weight' => 10,
   );
 
+  $items['form_example/tutorial/11'] = array(
+    'title' => t('#11'),
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('form_example_tutorial_11'),
+    'access callback' => TRUE,
+    'description' => t('Tutorial 11: Form with file upload'),
+    'type' => MENU_LOCAL_TASK,
+    'file' => 'form_example_tutorial.inc',
+    'weight' => 11,
+  );
+
   return $items;
 }
 
diff --git form_example/form_example.test form_example/form_example.test
index 62a411a..d14ef5c 100644
--- form_example/form_example.test
+++ form_example/form_example.test
@@ -117,6 +117,15 @@ class FormExampleTestCase extends DrupalWebTestCase {
     $this->assertText(t('The form has been submitted. name="firstname lastname", year of birth=1955'));
     $this->assertText(t('Second name: name="firstname2 lastname2", year of birth=1956'));
     $this->assertText(t('And the favorite color is green'));
+
+    // #11
+    // Get sample images.
+    $images = $this->drupalGetTestFiles('image');
+
+    foreach ($images as $image) {
+      $this->drupalPost('form_example/tutorial/11', array('files[file]' => $image->filename), t('Submit'));
+      $this->assertText(t('The form has been submitted and the image has been saved, filename: @filename.', array('@filename' => $image->basename)));
+    }
   }
 
 }
diff --git form_example/form_example_tutorial.inc form_example/form_example_tutorial.inc
index a5579df..5b2c7b9 100644
--- form_example/form_example_tutorial.inc
+++ form_example/form_example_tutorial.inc
@@ -832,4 +832,76 @@ function form_example_tutorial_10_submit($form, &$form_state) {
     unset ($form_state['storage']);
     $form_state['redirect'] = 'node'; // Redirects the user to /node.
   }
+}
+
+//////////////// Tutorial Example 11 //////////////////////
+
+/**
+ * Example 10: A form with a file upload field.
+ *
+ * This example allows the user to upload a file to Drupal which is stored
+ * physically and with a reference in the database.
+ *
+ * @see form_example_tutorial_11_submit()
+ * @see form_example_tutorial_11_validate()
+ * @ingroup form_example
+ *
+ */
+function form_example_tutorial_11($form_state) {
+  // enctype="multipart/form-data" required by browsers to handle files.
+  $form = array(
+    '#attributes' => array('enctype' => "multipart/form-data"),
+  );
+
+  $form['file'] = array(
+    '#type' => 'file',
+  	'#title' => t('Image'),
+  	'#description' => t('Upload a file, allowed extensions: jpg, jpeg, png, gif'),
+  );
+
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Submit'),
+  );
+
+  return $form;
+}
+
+/**
+ * Validate handler for form_example_tutorial_11().
+ */
+function form_example_tutorial_11_validate($form, &$form_state) {
+	$file = file_save_upload('file', array(
+    'file_validate_is_image' => array(), // Validates file is really an image.
+    'file_validate_extensions' => array('png gif jpg jpeg'), // Validate extensions.
+  ));
+  // If the file passed validation:
+  if ($file) {
+    // Move the file, into the Drupal file system
+    if (file_move($file, $file->filename)) {
+      // Update the new file location in the database.
+      drupal_write_record('files', $file, 'fid');
+      // Save the file for use in the submit handler.
+      $form_state['storage']['file'] = $file;
+    }
+    else {
+      form_set_error('file', t('Failed to write the uploaded file the site\'s file folder.'));
+    }
+  }
+  else {
+    form_set_error('file', t('Invalid file, only images with the extension png, gif, jpg, jpeg are allowed'));
+  }
+}
+
+/**
+ * Submit handler for form_example_tutorial_11().
+ */
+function form_example_tutorial_11_submit($form, &$form_state) {
+  $file = $form_state['storage']['file'];
+  // We are done with the file, remove it from storage.
+  unset($form_state['storage']['file']);
+  // Make the storage of the file permanent
+  file_set_status($file, FILE_STATUS_PERMANENT);
+  // Set a response to the user.
+  drupal_set_message(t('The form has been submitted and the image has been saved, filename: @filename.', array('@filename' => $file->filename)));
 }
\ No newline at end of file
