diff --git a/special_menu_items.module b/special_menu_items.module
index ebebcf9..48ec93d 100644
--- a/special_menu_items.module
+++ b/special_menu_items.module
@@ -22,12 +22,24 @@ function special_menu_items_menu() {
     'type' => MENU_CALLBACK,
   );
 
+  $items['<nolink>/%menu_special'] = array(
+    'page callback' => 'drupal_not_found',
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+
   $items['<separator>'] = array(
     'page callback' => 'drupal_not_found',
     'access callback' => TRUE,
     'type' => MENU_CALLBACK,
   );
 
+  $items['<separator>/%menu_special'] = array(
+    'page callback' => 'drupal_not_found',
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+
   $items['admin/config/system/special_menu_items'] = array(
     'title' => 'Special Menu Items',
     'description' => 'Configure Special Menu Items.',
@@ -41,20 +53,30 @@ function special_menu_items_menu() {
 }
 
 /**
+ * Argument processor for <nolink/separator>/n menu items.
+ * Accepts any argument.
+ *
+ * @param $id
+ */
+function menu_special_load($id) {
+  return TRUE;
+}
+
+/**
  * Override of theme_link()
  * This function will render link if it is "nolink" or "separator". Otherwise it will call originally
  * overwritten menu_item_link function.
  */
 function special_menu_items_link(array $variables) {
-  if (in_array($variables['path'], array('<nolink>', '<separator>'))) {
-    switch ($variables['path']) {
+  if (preg_match('/^(<nolink>|<separator>).*$/', $variables['path'])) {
+    switch (substr($variables['path'], 0, 8)) {
       case '<nolink>':
         $tag = variable_get('special_menu_items_nolink_tag', '<span>');
         $title = $variables['options']['html'] ? $variables['text'] : check_plain($variables['text']);
         $variables['options']['attributes']['class'][] = 'nolink';
         break;
 
-      case '<separator>':
+      case '<separat':
         $tag = variable_get('special_menu_items_separator_tag', '<span>');
         $title = variable_get('special_menu_items_separator_value', '<hr>');
         $variables['options']['attributes']['class'][] = 'separator';
@@ -118,16 +140,40 @@ function special_menu_items_form_menu_edit_item_alter(&$form, &$form_state) {
  if (isset($form['link_path']['#default_value'])) {
    $default_value = $form['link_path']['#default_value'];
 
-   if (preg_match('/^<nolink>\/[0-9]+$/', $default_value)) {
+   if (preg_match('/^<nolink>\/.*$/', $default_value)) {
      $default_value = '<nolink>';
    }
-   elseif (preg_match('/^<separator>\/[0-9]+$/', $default_value)) {
+   elseif (preg_match('/^<separator>\/.*$/', $default_value)) {
      $default_value = '<separator>';
    }
 
    $form['link_path']['#default_value'] = $default_value;
    $form['link_path']['#description'] .=  ' ' . t('Enter "%nolink" to generate non-linkable item, enter "%separator" to generate separator item.', array('%nolink' => '<nolink>', '%separator' => '<separator>'));
   }
+
+  // Call our custom submit handler.
+  array_unshift($form['#submit'], 'special_menu_items_menu_edit_item_submit');
+}
+
+/**
+ * Submit handler for menu item edit form.
+ */
+function special_menu_items_menu_edit_item_submit($form, &$form_state) {
+
+  // Check for separator/nolink items and set a unique path for them for
+  // features compatibility.
+  if (preg_match('/^(<nolink>|<separator>)$/', $form_state['values']['link_path'])) {
+
+    // Preserve the existing link if present and it hasn't been changed between
+    // nolink/separator.
+    if ((isset($form_state['values']['original_item']) && isset($form_state['values']['original_item']['link_path'])) &&
+        (substr($form_state['values']['link_path'], 0, 8) == substr($form_state['values']['original_item']['link_path'], 0, 8))) {
+      $form_state['values']['link_path'] = $form_state['values']['original_item']['link_path'];
+    }
+    else { // This is a new item, generate a unique path.
+      $form_state['values']['link_path'] = $form_state['values']['link_path'] . '/' . uniqid();
+    }
+  }
 }
 
 /**
