diff --git a/clone.pages.inc b/clone.pages.inc
index d8722119c4e2c9b15ba33723875f7eb87209066f..40995e69e1a8fdb7a9f561532c32353fff627d58 100644
--- a/clone.pages.inc
+++ b/clone.pages.inc
@@ -28,7 +28,44 @@ function clone_settings() {
     '#options' => array(0 => t('No'), 1 => t('Yes')),
     '#default_value' => (int) variable_get('clone_menu_links', 0),
     '#description' => t('Should any menu link for a node also be cloned?'),
-  ); 
+  );
+  
+  $form['replacements'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Replacement Patterns'),
+  );
+  
+  $form['replacements']['clone_menu_links_format'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Cloned menu links title format'),
+    '#description' => t('Enter the title for any cloned menu links. The default is "Clone of !title" (without the quotes.) Note that !title will be replaced by the original menu link title.'),
+    '#default_value' => variable_get('clone_menu_links_format', 'Clone of !title'),
+  );
+
+  $form['replacements']['clone_format'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Cloned node title format'),
+    '#description' => t('Enter the title for the new page. The default is "Clone of !title" (without the quotes.) Note that !title will be replaced by the original page title.'),
+    '#default_value' => variable_get('clone_format', 'Clone of !title'),
+  );
+  
+  if (module_exists('token')) {
+    /* update description and default value of the clone format textfield */
+    $form['replacements']['clone_format']['#description'] = t('Enter the title for the new page. The default is "Clone of [title-raw]" You can use any of the token replacement patterns listed below. !title is equivalent to [title-raw].');
+    $form['replacements']['clone_format']['#default_value'] = variable_get('clone_format', 'Clone of [title-raw]');
+    
+    /* display the token help form */
+    $form['replacements']['token_help'] = array(
+      '#title' => t('Token Replacement patterns'),
+      '#type' => 'fieldset',
+      '#collapsible' => TRUE,
+      '#collapsed' => TRUE,
+      '#description' => t('Prefer raw-text replacements for text to avoid problems with HTML entities!'),
+    );
+    $form['replacements']['token_help']['help'] = array(
+      '#value' => theme('token_help', 'node'),
+    );
+  }
 
   $form['publishing'] = array(
     '#type' => 'fieldset',
@@ -106,6 +143,29 @@ function clone_node_confirm_submit($form, &$form_state) {
   $form_state['redirect'] = 'node/'. $new_nid .'/edit';
 }
 
+/**
+ * Generate a menu title for a newly cloned menu link when passed the original node object
+ * Attempts to leverage Token module as per http://drupal.org/node/294442
+ * Will default to a simple replacement "Clone of !title" where !title is the title of the original menu link
+ */
+function clone_node_generate_menu_link_title($node) {
+
+  $old_link = $node->menu;
+  $link_title = '';
+  
+  if(module_exists('token')) {
+  /* if the Token module is enabled we use it */
+    $format = variable_get('clone_menu_links_format', 'Clone of !title');
+    $link_title = token_replace($format, 'node', $node);
+  }
+  
+  /* if the $title variable contains !title, replace it with the old link title */
+  $link_title = t($link_title, array('!title' => $old_link['link_title']));
+  
+  $link_title = check_plain($link_title);
+
+  return $link_title;
+}
 
 /**
  * Create a new menu link cloned from another node.
@@ -118,7 +178,7 @@ function clone_node_clone_menu_link($node) {
     node_invoke_nodeapi($node, 'prepare');
     if (!empty($node->menu['mlid'])) {
       $old_link = $node->menu;
-      $link['link_title'] = t('Clone of !title', array('!title' => $old_link['link_title']));
+      $link['link_title'] = clone_node_generate_menu_link_title($node);
       $link['plid'] = $old_link['plid'];
       $link['menu_name'] = $old_link['menu_name'];
       $link['weight'] = $old_link['weight'];
@@ -130,6 +190,32 @@ function clone_node_clone_menu_link($node) {
 }
 
 /**
+ * Generate a title for a newly cloned node when passed the original node object
+ *
+ * Attempts to leverage Token module as per http://drupal.org/node/294442
+ * Will default to a simple replacement "Clone of !title" where !title is the title of the original node
+ */
+function clone_node_generate_node_title($node) {
+  
+  $title = '';
+  
+  if(module_exists('token')) {
+  /* if the Token module is enabled we use it */
+    $format = variable_get('clone_format', 'Clone of [title-raw]');
+    /* if the clone_format variable contains !title, replace it with [title-raw] */
+    $format = t($format, array('!title' => '[title-raw]'));
+    $title = token_replace($format, 'node', $node);
+  } else {
+  /* else we use the t() function to enable a basic replacement for !title */
+    $format = variable_get('clone_format', 'Clone of !title');
+    $title = t($format, array('!title' => $node->title));
+  }
+  $title = check_plain($title);
+  
+  return $title;
+}
+
+/**
  *  Clones a node - prepopulate a node editing form
  */
 function clone_node_prepopulate($original_node) {
@@ -152,10 +238,10 @@ function clone_node_prepopulate($original_node) {
       }
       $node->path = NULL;
       $node->files = array();
-      $node->title = t('Clone of !title', array('!title' => $node->title));
+      $node->title = clone_node_generate_node_title($original_node);
       // Add an extra property as a flag.
       $node->clone_from_original_nid = $original_node->nid;
-      drupal_set_title(check_plain($node->title));
+      drupal_set_title($node->title);
 
       if (variable_get('clone_reset_'. $node->type, FALSE)) {
         $node_options = variable_get('node_options_'. $node->type, array('status', 'promote'));
@@ -199,7 +285,7 @@ function clone_node_save($nid) {
       }
       $node->path = NULL;
       $node->files = array();
-      $node->title = t('Clone of !title', array('!title' => $node->title));
+      $node->title = clone_node_generate_node_title($original_node);
       // Add an extra property as a flag.
       $node->clone_from_original_nid = $original_node->nid;
 
