diff --git a/drupalorg/drupalorg.module b/drupalorg/drupalorg.module
index ea54696..c456f61 100755
--- a/drupalorg/drupalorg.module
+++ b/drupalorg/drupalorg.module
@@ -1186,6 +1186,12 @@ function drupalorg_form_alter(&$form, $form_state, $form_id) {
       $form['taxonomy_forums']['#suffix'] = '<p>' . t('Forum: %forum', array('%forum' => preg_replace('/^[- ]*/', '', $form['taxonomy_forums'][LANGUAGE_NONE]['#options'][$form['taxonomy_forums'][LANGUAGE_NONE]['#default_value']]))) . '</p>';
     }
   }
+
+  // Validate full project short name.
+  if ($form_id == 'project_node_form') {
+    $language = $form['field_project_machine_name']['#language'];
+    $form['field_project_machine_name'][$language][0]['value']['#element_validate'][] = 'drupalorg_machine_name_validate';
+  }
 }
 
 /**
@@ -1261,6 +1267,21 @@ function drupalorg_profile_user_edit_validate($form, &$form_state) {
 }
 
 /**
+ * Perform a project short name for full projects.
+ * @see drupalorg_form_alter()
+ * @see http://www.php.net/manual/en/functions.user-defined.php
+ * @see https://drupal.org/node/2172891
+ */
+function drupalorg_machine_name_validate($element, &$form_state, $form) {
+  if ($form_state['values']['field_project_type'][$element['#language']][0]['value'] == 'full'
+    && !preg_match('/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$/', $element['#value'])) {
+    form_error($element, t('@title must follow <a href="@url">PHP naming convention</a>.', array(
+      '@title' => $element['#title'],
+      '@url' => 'http://www.php.net/manual/en/functions.user-defined.php')));
+  }
+}
+
+/**
  * Perform a case-insensitive check on usernames to prevent duplicates.
  *
  * @see user_account_form()
