function panels_clone_display($did, $new = TRUE, $save = FALSE) {
  // since objects are always passed by reference in php5, need to do this to ensure the original object,
  // if $did is an object, is untouched by the cloning operation
  if (!is_object($did)) { 
    $old_display = panels_load_display($did);
  }
  else {
    $old_display = $did;
  }
  $display->content = panels_clone_panes($display->content, $new);
  $display = drupal_clone($old_display);
  if ($save) {
    panels_save_display($display);
  }
  return $display;
}

function panels_clone_panes($panes, $new) {
  $counter = 0;
  foreach ($panes as $pid => $pane) {
    $panes[$pid] = panels_clone_pane($pane, $new ? 'new-' . ++$counter : $pid);
  }
  return $panes;
}

function panels_clone_pane($old_pane, $pid = NULL) {
  $pane = drupal_clone($old_pane);
  if (!is_null($pid)) {
    $pane->pid = $pid;
  }
  return $pane;
}