diff --git a/features.admin.inc b/features.admin.inc
index 4e12576..698e48d 100644
--- a/features.admin.inc
+++ b/features.admin.inc
@@ -104,23 +104,23 @@ function features_export_form($form, $form_state, $feature = NULL) {
     '#description' => t('Example: Image gallery') . ' (' . t('Do not begin name with numbers.') . ')',
     '#type' => 'textfield',
     '#default_value' => !empty($feature->info['name']) ? $feature->info['name'] : '',
-    '#attributes' => array('class' => array('feature-name')),
   );
   $form['info']['module_name'] = array(
-    '#type' => 'textfield',
+    '#type' => 'machine_name',
     '#title' => t('Machine-readable name'),
     '#description' => t('Example: image_gallery') . '<br/>' . t('May only contain lowercase letters, numbers and underscores. <strong>Try to avoid conflicts with the names of existing Drupal projects.</strong>'),
     '#required' => TRUE,
     '#default_value' => $feature_name,
-    '#attributes' => array('class' => array('feature-module-name')),
-    '#element_validate' => array('features_export_form_validate_field'),
+    '#machine_name' => array(
+      'exists' => 'features_export_form_module_name_exists',
+      'source' => array('info', 'name'),
+    ),
   );
-  // If recreating this feature, disable machine name field and blank out
-  // js-attachment classes to ensure the machine name cannot be changed.
+  // If recreating this feature, disable machine name field to ensure the
+  // machine name cannot be changed.
   if (isset($feature)) {
     $form['info']['module_name']['#value'] = $feature_name;
     $form['info']['module_name']['#disabled'] = TRUE;
-    $form['info']['name']['#attributes'] = array();
   }
   $form['info']['description'] = array(
     '#title' => t('Description'),
@@ -224,6 +224,13 @@ function features_export_form($form, $form_state, $feature = NULL) {
 }
 
 /**
+ * Machine name existence callback for the module name.
+ */
+function features_export_form_module_name_exists($value) {
+  return (bool) features_get_info('module', $value);
+}
+
+/**
  * Return the render array elements for the Components selection on the Export form
  * @param  array $feature    - feature associative array
  * @param  array $components - array of components in feature
@@ -779,16 +786,6 @@ function features_info_file_preview($form, &$form_state){
  */
 function features_export_form_validate_field($element, &$form_state) {
   switch ($element['#name']) {
-    case 'module_name':
-      if (!preg_match('!^[a-z0-9_]+$!', $element['#value'])) {
-        form_error($element, t('The machine-readable name must contain only lowercase letters, numbers, and underscores.'));
-      }
-      // If user is filling out the feature name for the first time and uses
-      // the name of an existing module throw an error.
-      else if (empty($element['#default_value']) && features_get_info('module', $element['#value'])) {
-        form_error($element, t('A module by the name @name already exists on your site. Please choose a different name.', array('@name' => $element['#value'])));
-      }
-      break;
     case 'project_status_url':
       if (!empty($element['#value']) && !valid_url($element['#value'])) {
         form_error($element, t('The URL %url is invalid. Please enter a fully-qualified URL, such as http://www.example.com/feed.xml.', array('%url' => $element['#value'])));
diff --git a/features.js b/features.js
index 877285c..b0fba2f 100644
--- a/features.js
+++ b/features.js
@@ -100,33 +100,6 @@ jQuery.fn.sortElements = (function(){
         }).trigger('change');
       });
 
-      // Export form machine-readable JS
-      $('.feature-name:not(.processed)', context).each(function() {
-        $('.feature-name')
-          .addClass('processed')
-          .after(' <small class="feature-module-name-suffix">&nbsp;</small>');
-        if ($('.feature-module-name').val() === $('.feature-name').val().toLowerCase().replace(/[^a-z0-9]+/g, '_').replace(/_+/g, '_') || $('.feature-module-name').val() === '') {
-          $('.feature-module-name').parents('.form-item').hide();
-          $('.feature-name').bind('keyup change', function() {
-            var machine = $(this).val().toLowerCase().replace(/[^a-z0-9]+/g, '_').replace(/_+/g, '_');
-            if (machine !== '_' && machine !== '') {
-              $('.feature-module-name').val(machine);
-              $('.feature-module-name-suffix').empty().append(' Machine name: ' + machine + ' [').append($('<a href="#">'+ Drupal.t('Edit') +'</a>').click(function() {
-                $('.feature-module-name').parents('.form-item').show();
-                $('.feature-module-name-suffix').hide();
-                $('.feature-name').unbind('keyup');
-                return false;
-              })).append(']');
-            }
-            else {
-              $('.feature-module-name').val(machine);
-              $('.feature-module-name-suffix').text('');
-            }
-          });
-          $('.feature-name').keyup();
-        }
-      });
-
       //View info dialog
       var infoDialog = $('#features-info-file');
       if (infoDialog.length != 0) {
