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_tutorial.inc form_example/form_example_tutorial.inc
index a5579df..34bb127 100644
--- form_example/form_example_tutorial.inc
+++ form_example/form_example_tutorial.inc
@@ -832,4 +832,78 @@ 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, file id: @fid and location @filepath',
+    array('@fid' => $file->fid, '@filepath' => $file->filepath)
+  ));
 }
\ No newline at end of file
