function migrate_tc_specs(&$source_db, &$target_db, &$tmp_table_name, &$users, &$migrator)
{
    $first_version = 1;
    $tc_mgr = new testcase($target_db);
    $map_tc_tcversion = array();
    $admin_id = 1;
    $items_processed = 0;
    // how many records are we going to tackle at a time
    // with basic benchmarking roughly 500 seemed to be slightly faster
    $step_amt = 500;
    print_msg("<b><center>Migrating Test Cases - Part I - " . date("H:i:s") . " -</center></b><br>");
    $tc_count = $migrator->get_tmp_table_count();
    // Make sure we have enough memory to do what we are about to do
    check_memory($tc_count);
    // testcase nodes have to be done separately from tcversions because the version
    // inserts a new node
    while ($items_processed < $tc_count) {
        $query = "SELECT * FROM {$tmp_table_name} ORDER BY id LIMIT {$items_processed},{$step_amt}";
        $items = $source_db->fetchRowsIntoMap($query, 'id');
        foreach ($items as $item_id => $idata) {
            // 20061208 - franciscom -
            // added abs()
            // added htmlentities()
            print_msg("TCID:{$item_id} - " . htmlentities($idata['title']) . "<br>");
            $status = $tc_mgr->create_tcase_only(0, $idata['title'], abs($idata['TCorder']), $item_id);
            ++$items_processed;
            if ($items_processed % FEEDBACK_STEP == 0) {
                print_msg('<br><span class="processed">Part I - Processed: ' . $items_processed . " - " . date("H:i:s") . "</span><br>", "FULL_FEEDBACK");
            }
        }
        print_msg("<br><span class='processed'>Going to process another {$step_amt} items</span>", "FULL_FEEDBACK");
    }
    print_msg("Finished Part I -" . date("H:i:s"));
    //---------------------------------------------------------------------------
    // now loop through again and do the versions... this is highly inefficient
    // to loop through the dataset another time but it works without big changes
    //---------------------------------------------------------------------------
    print_msg("<br> <b><center>Migrating Test Cases - Part II - " . date("H:i:s") . " -</center></b><br>");
    $items_processed = 0;
    while ($items_processed < $tc_count) {
        $query = "SELECT * FROM {$tmp_table_name} ORDER BY id LIMIT {$items_processed},{$step_amt}";
        $items = $source_db->fetchRowsIntoMap($query, 'id');
        foreach ($items as $item_id => $idata) {
            // Now create the TC version
            $author_id = intval(isset($users[$idata['author']]) ? $users[$idata['author']]['id'] : $admin_id);
            $x = $tc_mgr->create_tcversion($item_id, $first_version, $idata['summary'], $idata['steps'], $idata['exresult'], $author_id);
            $sql = "UPDATE tcversions SET creation_ts='" . $idata['create_date'] . "'";
            // update reviewer & review date
            $reviewer_id = intval(isset($users[$idata['reviewer']]) ? $users[$idata['reviewer']]['id'] : -1);
            if ($reviewer_id > 0) {
                $sql .= ",updater_id={$reviewer_id}" . ",modification_ts='" . $idata['modified_date'] . "'";
            }
            // 20070119 - franciscom - very big bug - missing where clause
            $sql .= " WHERE tcversions.id={$x['id']} ";
            //echo "<br>update query is $sql";
            $target_db->exec_query($sql);
            $map_tc_tcversion[$item_id] = $x['id'];
            // 20061208 - franciscom
            print_msg("TCID:{$item_id} - " . htmlentities($idata['title']) . " - TCVERSION_ID:{$x['id']}<br>", "FULL_FEEDBACK");
            ++$items_processed;
            if ($items_processed % FEEDBACK_STEP == 0) {
                print_msg('<br><span class="processed">Part II - Processed: ' . $items_processed . " - " . date("H:i:s") . "</span><br><br>");
            }
        }
        print_msg("<br><span class='processed'>Going to process another {$step_amt} items</span>", "FULL_FEEDBACK");
    }
    print_msg("Test Case Specifications MIGRATION ENDED ::: " . date("H:i:s") . "<br>");
    return $map_tc_tcversion;
}