Index: account_page.php
===================================================================
--- account_page.php	(revision 13708)
+++ account_page.php	(working copy)
@@ -187,7 +187,7 @@
 					<span class="required"><?php if( $t_force_pw_reset ) { ?> * <?php } ?></span> <?php echo lang_get( 'current_password' ) ?>
 				</td>
 				<td>
-					<input class="input-sm" id="password-current" type="password" name="password_current" size="32" maxlength="<?php echo auth_get_password_max_size(); ?>" />
+					<input class="input-sm" id="password-current" type="password" name="password_current" size="32" maxlength="<?php echo auth_get_password_max_size(); ?>" required />
 				</td>
 			</tr>
 			<?php
@@ -197,7 +197,7 @@
 					<span class="required"><?php if( $t_force_pw_reset ) { ?> * <?php } ?></span> <?php echo lang_get( 'new_password' ) ?>
 				</td>
 				<td>
-					<input class="input-sm" id="password" type="password" name="password" size="32" maxlength="<?php echo auth_get_password_max_size(); ?>" />
+					<input class="input-sm" id="password" type="password" name="password" size="32" maxlength="<?php echo auth_get_password_max_size(); ?>" required />
 				</td>
 			</tr>
 			<tr>
@@ -205,7 +205,7 @@
 					<span class="required"><?php if( $t_force_pw_reset ) { ?> * <?php } ?></span> <?php echo lang_get( 'confirm_password' ) ?>
 				</td>
 				<td>
-					<input class="input-sm" id="password-confirm" type="password" name="password_confirm" size="32" maxlength="<?php echo auth_get_password_max_size(); ?>" />
+					<input class="input-sm" id="password-confirm" type="password" name="password_confirm" size="32" maxlength="<?php echo auth_get_password_max_size(); ?>" required />
 				</td>
 			</tr>
 			<?php
Index: account_prof_edit_page.php
===================================================================
--- account_prof_edit_page.php	(revision 13708)
+++ account_prof_edit_page.php	(working copy)
@@ -102,7 +102,7 @@
 		<span class="required">*</span><?php echo lang_get( 'platform' ) ?>
 	</th>
 	<td width="75%">
-		<input type="text" name="platform" class="input-sm" size="32" maxlength="32" value="<?php echo string_attribute( $v_platform ) ?>" />
+		<input type="text" name="platform" class="input-sm" size="32" maxlength="32" value="<?php echo string_attribute( $v_platform ) ?>" required />
 	</td>
 </tr>
 <tr>
@@ -110,7 +110,7 @@
 		<span class="required">*</span><?php echo lang_get( 'os' ) ?>
 	</th>
 	<td>
-		<input type="text" name="os" class="input-sm"  size="32" maxlength="32" value="<?php echo string_attribute( $v_os ) ?>" />
+		<input type="text" name="os" class="input-sm"  size="32" maxlength="32" value="<?php echo string_attribute( $v_os ) ?>" required />
 	</td>
 </tr>
 <tr>
@@ -118,7 +118,7 @@
 		<span class="required">*</span><?php echo lang_get( 'os_version' ) ?>
 	</th>
 	<td>
-		<input type="text" name="os_build" class="input-sm" size="16" maxlength="16" value="<?php echo string_attribute( $v_os_build ) ?>" />
+		<input type="text" name="os_build" class="input-sm" size="16" maxlength="16" value="<?php echo string_attribute( $v_os_build ) ?>" required />
 	</td>
 </tr>
 <tr>
Index: account_prof_menu_page.php
===================================================================
--- account_prof_menu_page.php	(revision 13708)
+++ account_prof_menu_page.php	(working copy)
@@ -114,7 +114,7 @@
 					<span class="required">*</span> <?php echo lang_get( 'platform' ) ?>
 				</td>
 				<td>
-					<input id="platform" type="text" name="platform" class="input-sm" size="32" maxlength="32" />
+					<input id="platform" type="text" name="platform" class="input-sm" size="32" maxlength="32" required />
 				</td>
 			</tr>
 			<tr>
@@ -122,7 +122,7 @@
 					<span class="required">*</span> <?php echo lang_get( 'os' ) ?>
 				</td>
 				<td>
-					<input id="os" type="text" name="os" class="input-sm" size="32" maxlength="32" />
+					<input id="os" type="text" name="os" class="input-sm" size="32" maxlength="32" required />
 				</td>
 			</tr>
 			<tr>
@@ -130,7 +130,7 @@
 					<span class="required">*</span> <?php echo lang_get( 'os_version' ) ?>
 				</td>
 				<td>
-					<input id="os-version" type="text" name="os_build" class="input-sm" size="16" maxlength="16" />
+					<input id="os-version" type="text" name="os_build" class="input-sm" size="16" maxlength="16" required />
 				</td>
 			</tr>
 			<tr>
Index: bug_change_status_page.php
===================================================================
--- bug_change_status_page.php	(revision 13708)
+++ bug_change_status_page.php	(working copy)
@@ -291,7 +291,7 @@
 		<td>
 <?php
 			if( $t_has_write_access ) {
-				print_custom_field_input( $t_def, $f_bug_id );
+				print_custom_field_input( $t_def, $f_bug_id, $t_require );
 			} elseif( custom_field_has_read_access( $t_id, $f_bug_id ) ) {
 				print_custom_field_value( $t_def, $t_id, $f_bug_id );
 			}
Index: bug_report_page.php
===================================================================
--- bug_report_page.php	(revision 13708)
+++ bug_report_page.php	(working copy)
@@ -542,7 +542,7 @@
 			<span class="required">*</span><label for="summary"><?php print_documentation_link( 'summary' ) ?></label>
 		</th>
 		<td>
-			<input <?php echo helper_get_tab_index() ?> type="text" id="summary" name="summary" size="105" maxlength="128" value="<?php echo string_attribute( $f_summary ) ?>" />
+			<input <?php echo helper_get_tab_index() ?> type="text" id="summary" name="summary" size="105" maxlength="128" value="<?php echo string_attribute( $f_summary ) ?>" required />
 		</td>
 	</tr>
 	<tr>
@@ -550,7 +550,7 @@
 			<span class="required">*</span><label for="description"><?php print_documentation_link( 'description' ) ?></label>
 		</th>
 		<td>
-			<textarea class="form-control" <?php echo helper_get_tab_index() ?> id="description" name="description" cols="80" rows="10"><?php echo string_textarea( $f_description ) ?></textarea>
+			<textarea class="form-control" <?php echo helper_get_tab_index() ?> id="description" name="description" cols="80" rows="10" required><?php echo string_textarea( $f_description ) ?></textarea>
 		</td>
 	</tr>
 
@@ -613,7 +613,7 @@
 			<?php } else { echo string_display( lang_get_defaulted( $t_def['name'] ) ); } ?>
 		</th>
 		<td>
-			<?php print_custom_field_input( $t_def, ( $f_master_bug_id === 0 ) ? null : $f_master_bug_id ) ?>
+			<?php print_custom_field_input( $t_def, ( $f_master_bug_id === 0 ) ? null : $f_master_bug_id, $t_def['require_report'] ) ?>
 		</td>
 	</tr>
 <?php
Index: bug_update_page.php
===================================================================
--- bug_update_page.php	(revision 13708)
+++ bug_update_page.php	(working copy)
@@ -709,7 +709,7 @@
 		echo '<span>', string_display( lang_get_defaulted( $t_def['name'] ) ), '</span>';
 		echo '</label>';
 		echo '</td><td colspan="5">';
-		print_custom_field_input( $t_def, $t_bug_id );
+		print_custom_field_input( $t_def, $t_bug_id, $t_def['require_update'] );
 		echo '</td></tr>';
 	}
 } # foreach( $t_related_custom_field_ids as $t_id )
Index: core/cfdefs/cfdef_standard.php
===================================================================
--- core/cfdefs/cfdef_standard.php	(revision 13708)
+++ core/cfdefs/cfdef_standard.php	(working copy)
@@ -280,9 +280,10 @@
  * print_custom_field_input
  * @param array $p_field_def          Custom field definition.
  * @param mixed $p_custom_field_value Custom field value.
+ * @param string $p_required          The "required" attribute to add to the field
  * @return void
  */
-function cfdef_input_list( array $p_field_def, $p_custom_field_value ) {
+function cfdef_input_list( array $p_field_def, $p_custom_field_value, $p_required = '' ) {
 	$t_values = explode( '|', custom_field_prepare_possible_values( $p_field_def['possible_values'] ) );
 	$t_list_size = $t_possible_values_count = count( $t_values );
 
@@ -295,9 +296,9 @@
 	}
 
 	if( $p_field_def['type'] == CUSTOM_FIELD_TYPE_MULTILIST ) {
-		echo '<select ' . helper_get_tab_index() . ' id="custom_field_' . $p_field_def['id'] . '" name="custom_field_' . $p_field_def['id'] . '[]" size="' . $t_list_size . '" multiple="multiple">';
+		echo '<select ' . helper_get_tab_index() . ' id="custom_field_' . $p_field_def['id'] . '" name="custom_field_' . $p_field_def['id'] . '[]" size="' . $t_list_size . '" multiple="multiple"' . $p_required .'>';
 	} else {
-		echo '<select ' . helper_get_tab_index() . ' id="custom_field_' . $p_field_def['id'] . '" name="custom_field_' . $p_field_def['id'] . '" size="' . $t_list_size . '">';
+		echo '<select ' . helper_get_tab_index() . ' id="custom_field_' . $p_field_def['id'] . '" name="custom_field_' . $p_field_def['id'] . '" size="' . $t_list_size . '"' . $p_required .'>';
 	}
 
 	$t_selected_values = explode( '|', $p_custom_field_value );
@@ -315,9 +316,10 @@
  * print_custom_field_input
  * @param array $p_field_def          Custom field definition.
  * @param mixed $p_custom_field_value Custom field value.
+ * @param string $p_required          The "required" attribute to add to the field
  * @return void
  */
-function cfdef_input_checkbox( array $p_field_def, $p_custom_field_value ) {
+function cfdef_input_checkbox( array $p_field_def, $p_custom_field_value, $p_required = '' ) {
 	$t_values = explode( '|', custom_field_prepare_possible_values( $p_field_def['possible_values'] ) );
 	$t_checked_values = explode( '|', $p_custom_field_value );
 	for( $i = 0; $i < count( $t_values ); $i++ ) {
@@ -324,7 +326,7 @@
 		$t_input_id = 'custom_field_' . $p_field_def['id'] . '_value_' . $i;
 		$t_input_name = 'custom_field_' . $p_field_def['id'] . '[]';
 		echo '<label for="' . $t_input_id . '">' . "\n";
-		echo '<input class="ace" id="' . $t_input_id . '" ' . helper_get_tab_index() . ' type="checkbox" name="' . $t_input_name . '" value="' . string_attribute( $t_values[$i] ) . '"';
+		echo '<input class="ace" id="' . $t_input_id . '" ' . helper_get_tab_index() . ' type="checkbox" name="' . $t_input_name . '" value="' . string_attribute( $t_values[$i] ) . '"' . $p_required;
 		check_checked( $t_checked_values, $t_values[$i] );
 		echo " />\n";
 		echo '<span class="lbl">&#160;' . string_display_line( $t_values[$i] ) . '</label>' . "\n";
@@ -336,9 +338,10 @@
  * print_custom_field_input
  * @param array $p_field_def          Custom field definition.
  * @param mixed $p_custom_field_value Custom field value.
+ * @param string $p_required          The "required" attribute to add to the field
  * @return void
  */
-function cfdef_input_radio( array $p_field_def, $p_custom_field_value ) {
+function cfdef_input_radio( array $p_field_def, $p_custom_field_value, $p_required = '' ) {
 	$t_values = explode( '|', custom_field_prepare_possible_values( $p_field_def['possible_values'] ) );
 
 	$t_len = strlen( $p_custom_field_value );
@@ -352,7 +355,7 @@
 		$t_input_id = 'custom_field_' . $p_field_def['id'] . '_value_' . $i;
 		$t_input_name = 'custom_field_' . $p_field_def['id'];
 		echo '<label for="' . $t_input_id . '">';
-		echo '<input class="ace" id="' . $t_input_id . '" ' . helper_get_tab_index() . ' type="radio" name="' . $t_input_name . '" value="' . string_attribute( $t_values[$i] ) . '"';
+		echo '<input class="ace" id="' . $t_input_id . '" ' . helper_get_tab_index() . ' type="radio" name="' . $t_input_name . '" value="' . string_attribute( $t_values[$i] ) . '"' . $p_required;
 		check_checked( $t_checked_value, $t_values[$i] );
 		echo " />\n";
 		echo '<span class="lbl">&#160;' . string_display_line( $t_values[$i] ) . '</span>' . "\n";
@@ -364,10 +367,11 @@
  * print_custom_field_input
  * @param array $p_field_def          Custom field definition.
  * @param mixed $p_custom_field_value Custom field value.
+ * @param string $p_required          The "required" attribute to add to the field
  * @return void
  */
-function cfdef_input_textbox( array $p_field_def, $p_custom_field_value ) {
-	echo '<input ' . helper_get_tab_index() . ' type="text" id="custom_field_' . $p_field_def['id'] . '" name="custom_field_' . $p_field_def['id'] . '" size="80"';
+function cfdef_input_textbox( array $p_field_def, $p_custom_field_value, $p_required = '' ) {
+	echo '<input ' . helper_get_tab_index() . ' type="text" id="custom_field_' . $p_field_def['id'] . '" name="custom_field_' . $p_field_def['id'] . '" size="80"' . $p_required;
 	if( 0 < $p_field_def['length_max'] ) {
 		echo ' maxlength="' . $p_field_def['length_max'] . '"';
 	} else {
@@ -380,10 +384,11 @@
  * print_custom_field_input
  * @param array $p_field_def          Custom field definition.
  * @param mixed $p_custom_field_value Custom field value.
+ * @param string $p_required          The "required" attribute to add to the field
  * @return void
  */
-function cfdef_input_textarea( array $p_field_def, $p_custom_field_value ) {
-	echo '<textarea class="form-control" ' . helper_get_tab_index() . ' id="custom_field_' . $p_field_def['id'] . '" name="custom_field_' . $p_field_def['id'] . '"';
+function cfdef_input_textarea( array $p_field_def, $p_custom_field_value, $p_required = '' ) {
+	echo '<textarea class="form-control" ' . helper_get_tab_index() . ' id="custom_field_' . $p_field_def['id'] . '" name="custom_field_' . $p_field_def['id'] . '"' . $p_required;
 	echo ' cols="70" rows="8">' . $p_custom_field_value .'</textarea>';
 }
 
@@ -392,9 +397,10 @@
  *
  * @param string $p_field_def          The custom field definition.
  * @param string $p_custom_field_value The custom field value to print.
+ * @param string $p_required          The "required" attribute to add to the field
  * @return void
  */
-function cfdef_input_date( $p_field_def, $p_custom_field_value ) {
+function cfdef_input_date( $p_field_def, $p_custom_field_value, $p_required = '' ) {
 	print_date_selection_set( 'custom_field_' . $p_field_def['id'], config_get( 'short_date_format' ), $p_custom_field_value, false, true );
 }
 
Index: core/custom_field_api.php
===================================================================
--- core/custom_field_api.php	(revision 13708)
+++ core/custom_field_api.php	(working copy)
@@ -1372,10 +1372,11 @@
  * NOTE: This probably belongs in the print_api.php
  * @param array   $p_field_def Custom field definition.
  * @param integer $p_bug_id    A bug identifier.
+ * @param boolean $p_required  True if the field is required for form submission
  * @return void
  * @access public
  */
-function print_custom_field_input( array $p_field_def, $p_bug_id = null ) {
+function print_custom_field_input( array $p_field_def, $p_bug_id = null, $p_required = false ) {
 	if( null === $p_bug_id ) {
 		$t_custom_field_value = custom_field_default_to_value( $p_field_def['default_value'], $p_field_def['type'] );
 	} else {
@@ -1392,7 +1393,7 @@
 
 	global $g_custom_field_type_definition;
 	if( isset( $g_custom_field_type_definition[$p_field_def['type']]['#function_print_input'] ) ) {
-		call_user_func( $g_custom_field_type_definition[$p_field_def['type']]['#function_print_input'], $p_field_def, $t_custom_field_value );
+		call_user_func( $g_custom_field_type_definition[$p_field_def['type']]['#function_print_input'], $p_field_def, $t_custom_field_value, $p_required ? ' required ' : '' );
 		print_hidden_input( custom_field_presence_field_name( $p_field_def['id'] ), '1' );
 	} else {
 		trigger_error( ERROR_CUSTOM_FIELD_INVALID_DEFINITION, ERROR );
Index: manage_proj_create_page.php
===================================================================
--- manage_proj_create_page.php	(revision 13708)
+++ manage_proj_create_page.php	(working copy)
@@ -101,7 +101,7 @@
 					<span class="required">*</span> <?php echo lang_get( 'project_name' ) ?>
 				</td>
 				<td>
-					<input type="text" id="project-name" name="name" class="input-sm" size="60" maxlength="128" />
+					<input type="text" id="project-name" name="name" class="input-sm" size="60" maxlength="128" required />
 				</td>
 			</tr>
 			<tr>
Index: manage_proj_edit_page.php
===================================================================
--- manage_proj_edit_page.php	(revision 13708)
+++ manage_proj_edit_page.php	(working copy)
@@ -116,7 +116,7 @@
 					<span class="required">*</span> <?php echo lang_get( 'project_name' ) ?>
 				</td>
 				<td>
-					<input type="text" id="project-name" name="name" class="input-sm" size="60" maxlength="128" value="<?php echo string_attribute( $t_row['name'] ) ?>" />
+					<input type="text" id="project-name" name="name" class="input-sm" size="60" maxlength="128" value="<?php echo string_attribute( $t_row['name'] ) ?>" required />
 				</td>
 			</tr>
 			<tr>
@@ -849,7 +849,7 @@
 				   <span class="required">*</span> <?php echo lang_get( 'username' ) ?>
 				</td>
 				<td>
-					<select id="project-add-users-username" name="user_id[]" class="input-sm" multiple="multiple" size="10"><?php
+					<select id="project-add-users-username" name="user_id[]" class="input-sm" multiple="multiple" size="10" required><?php
 						foreach( $t_users AS $t_user_id=>$t_display_name ) {
 							echo '<option value="', $t_user_id, '">', $t_display_name, '</option>';
 						} ?>
Index: manage_tags_page.php
===================================================================
--- manage_tags_page.php	(revision 13708)
+++ manage_tags_page.php	(working copy)
@@ -208,7 +208,7 @@
 					<span class="required">*</span> <?php echo lang_get( 'tag_name' ) ?>
 				</td>
 				<td>
-					<input type="text" id="tag-name" name="name" class="input-sm" size="40" maxlength="100" />
+					<input type="text" id="tag-name" name="name" class="input-sm" size="40" maxlength="100" required />
 					<small><?php echo sprintf( lang_get( 'tag_separate_by' ), config_get( 'tag_separator' ) ); ?></small>
 				</td>
 			</tr>
Index: news_edit_page.php
===================================================================
--- news_edit_page.php	(revision 13708)
+++ news_edit_page.php	(working copy)
@@ -116,7 +116,7 @@
 					<span class="required">*</span> <?php echo lang_get( 'headline' ) ?>
 				</td>
 				<td>
-					<input type="text" id="news-update-headline" name="headline" class="input-sm" size="64" maxlength="64" value="<?php echo $v_headline ?>" />
+					<input type="text" id="news-update-headline" name="headline" class="input-sm" size="64" maxlength="64" value="<?php echo $v_headline ?>" required />
 				</td>
 			</tr>
 			<tr>
@@ -124,7 +124,7 @@
 					<span class="required">*</span> <?php echo lang_get( 'body' ) ?>
 				</td>
 				<td>
-					<textarea class="form-control" id="news-update-body" name="body" cols="60" rows="10"><?php echo $v_body ?></textarea>
+					<textarea class="form-control" id="news-update-body" name="body" cols="60" rows="10" required><?php echo $v_body ?></textarea>
 				</td>
 			</tr>
 			<tr>
Index: news_menu_page.php
===================================================================
--- news_menu_page.php	(revision 13708)
+++ news_menu_page.php	(working copy)
@@ -75,7 +75,7 @@
 					<span class="required">*</span> <?php echo lang_get( 'headline' ) ?>
 				</td>
 				<td>
-					<input type="text" id="news-headline" name="headline" class="input-sm" size="64" maxlength="64" />
+					<input type="text" id="news-headline" name="headline" class="input-sm" size="64" maxlength="64" required />
 				</td>
 			</tr>
 			<tr>
@@ -83,7 +83,7 @@
 					<span class="required">*</span> <?php echo lang_get( 'body' ) ?>
 				</td>
 				<td>
-					<textarea class="form-control" id="news-body" name="body" cols="60" rows="8"></textarea>
+					<textarea class="form-control" id="news-body" name="body" cols="60" rows="8" required></textarea>
 				</td>
 			</tr>
 			<tr>
Index: proj_doc_add_page.php
===================================================================
--- proj_doc_add_page.php	(revision 13708)
+++ proj_doc_add_page.php	(working copy)
@@ -80,7 +80,7 @@
 		<span class="required">*</span> <?php echo lang_get( 'title' ) ?>
 	</th>
 	<td width="75%">
-		<input type="text" name="title" class="input-sm" size="70" maxlength="250" />
+		<input type="text" name="title" class="input-sm" size="70" maxlength="250" required />
 	</td>
 </tr>
 <tr>
@@ -98,7 +98,7 @@
 		<?php print_max_filesize( $t_max_file_size ); ?>
 	</td>
 	<td>
-		<input type="hidden" name="max_file_size" value="<?php echo $t_max_file_size ?>" />
+		<input type="hidden" name="max_file_size" value="<?php echo $t_max_file_size ?>" required />
 		<input name="file" type="file" size="70" />
 	</td>
 </tr>
Index: proj_doc_edit_page.php
===================================================================
--- proj_doc_edit_page.php	(revision 13708)
+++ proj_doc_edit_page.php	(working copy)
@@ -102,7 +102,7 @@
 		<span class="required">*</span> <?php echo lang_get( 'title' ) ?>
 	</th>
 	<td width="80%">
-		<input type="text" name="title" class="input-sm" size="70" maxlength="250" value="<?php echo $v_title ?>" />
+		<input type="text" name="title" class="input-sm" size="70" maxlength="250" value="<?php echo $v_title ?>" required />
 	</td>
 </tr>
 <tr>
