diff -ru wesnoth source//menu_events.cpp wesnoth patch//menu_events.cpp
--- wesnoth source//menu_events.cpp	2012-04-02 05:02:02.162780787 -0500
+++ wesnoth patch//menu_events.cpp	2012-04-02 05:11:15.013483533 -0500
@@ -992,13 +992,8 @@
 	}
 
 	int wb_gold = resources::whiteboard->get_spent_gold_for(side_num);
-	if (current_team.gold() - wb_gold < current_team.recall_cost()) {
-		utils::string_map i18n_symbols;
-		i18n_symbols["cost"] = lexical_cast<std::string>(current_team.recall_cost());
-		std::string msg = vngettext(
-			"You must have at least 1 gold piece to recall a unit",
-			"You must have at least $cost gold pieces to recall a unit",
-			current_team.recall_cost(), i18n_symbols);
+	if (current_team.gold() - wb_gold < 1) {
+		std::string msg ("You must have at least 1 gold piece to recall a unit");
 		gui2::show_transient_message(gui_->video(), "", msg);
 		return;
 	}
@@ -1043,7 +1038,9 @@
 	recorder.add_recall(un.id(), recall_location, recall_from);
 	place_recruit(un, recall_location, recall_from, true, true);
 	statistics::recall_unit(un);
-	current_team.spend_gold(current_team.recall_cost());
+
+	int cost= un.recall_cost() || current_team.recall_cost();
+	current_team.spend_gold(cost);
 
 	bool shroud_cleared = clear_shroud(side_num);
 	if (shroud_cleared) {
@@ -1094,7 +1091,9 @@
 
 			const unit &un = *units_.find(action.recall_loc);
 			statistics::un_recall_unit(un);
-			current_team.spend_gold(-current_team.recall_cost());
+
+			int cost=un.recall_cost() || current_team.recall_cost();
+			current_team.spend_gold(-cost);
 
 			current_team.recall_list().push_back(un);
 			// invalidate before erasing allow us
@@ -1227,7 +1226,8 @@
 
 				place_recruit(un, loc, from, true, true);
 				statistics::recall_unit(un);
-				current_team.spend_gold(current_team.recall_cost());
+				int cost=un.recall_cost() || current_team.recall_cost();
+				current_team.spend_gold(cost);
 				gui_->invalidate(loc);
 				gui_->draw();
 				recorder.add_checksum_check(loc);
diff -ru wesnoth source//unit.cpp wesnoth patch//unit.cpp
--- wesnoth source//unit.cpp	2012-04-02 05:02:13.870838023 -0500
+++ wesnoth patch//unit.cpp	2012-04-02 05:14:19.142383704 -0500
@@ -163,6 +163,7 @@
            trait_names_(o.trait_names_),
            trait_descriptions_(o.trait_descriptions_),
            unit_value_(o.unit_value_),
+           unit_recall_value_(o.unit_recall_value_),
            goto_(o.goto_),
            interrupted_move_(o.interrupted_move_),
            flying_(o.flying_),
@@ -242,6 +243,7 @@
 	trait_names_(),
 	trait_descriptions_(),
 	unit_value_(),
+	unit_recall_value_(),
 	goto_(),
 	interrupted_move_(),
 	flying_(false),
@@ -343,6 +345,9 @@
 	if (const config::attribute_value *v = cfg.get("cost")) {
 		unit_value_ = *v;
 	}
+	if (const config::attribute_value *v = cfg.get("recall_cost")) {
+		unit_recall_value_ = *v;
+	}
 	if (const config::attribute_value *v = cfg.get("halo")) {
 		clear_haloes();
 		cfg_["halo"] = *v;
@@ -603,6 +608,7 @@
 	trait_names_(),
 	trait_descriptions_(),
 	unit_value_(),
+	unit_recall_value_(),
 	goto_(),
 	interrupted_move_(),
 	flying_(false),
@@ -852,6 +858,7 @@
 	emit_zoc_ = t->has_zoc();
 	attacks_ = t->attacks();
 	unit_value_ = t->cost();
+	unit_recall_value_ = t->recall_cost();
 	flying_ = t->movement_type().is_flying();
 
 	max_attacks_ = t->max_attacks();
@@ -1712,6 +1719,7 @@
 		cfg.add_child("attack",i->get_cfg());
 	}
 	cfg["cost"] = unit_value_;
+	cfg["recall_cost"] = unit_recall_value_;
 	cfg.clear_children("modifications");
 	cfg.add_child("modifications",modifications_);
 
diff -ru wesnoth source//unit.hpp wesnoth patch//unit.hpp
--- wesnoth source//unit.hpp	2012-04-02 05:02:18.122858816 -0500
+++ wesnoth patch//unit.hpp	2012-04-01 17:20:57.913139134 -0500
@@ -223,6 +223,7 @@
 	std::vector<std::string> get_traits_list() const;
 
 	int cost () const { return unit_value_; }
+	int recall_cost () const { return unit_recall_value_; }
 
 	const map_location &get_location() const { return loc_; }
 	/** To be called by unit_map or for temporary units only. */
@@ -444,6 +445,7 @@
 	std::vector<t_string> trait_descriptions_;
 
 	int unit_value_;
+	int unit_recall_value_;
 	map_location goto_, interrupted_move_;
 
 	bool flying_, is_fearless_, is_healthy_;
