diff -rupN 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 06:01:50.816324823 -0500
@@ -992,13 +992,8 @@ void menu_handler::recall(int side_num,
 	}
 
 	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,11 @@ bool menu_handler::do_recall(const unit&
 	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();
+	if (cost == -1) //recall_cost undefined
+		cost = current_team.recall_cost();
+	current_team.spend_gold(cost);
 
 	bool shroud_cleared = clear_shroud(side_num);
 	if (shroud_cleared) {
@@ -1094,7 +1093,11 @@ void menu_handler::undo(int side_num)
 
 			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();
+			if (cost == -1) //recall_cost undefined
+				cost = current_team.recall_cost();
+			current_team.spend_gold(-cost);
 
 			current_team.recall_list().push_back(un);
 			// invalidate before erasing allow us
@@ -1227,7 +1230,10 @@ void menu_handler::redo(int side_num)
 
 				place_recruit(un, loc, from, true, true);
 				statistics::recall_unit(un);
-				current_team.spend_gold(current_team.recall_cost());
+				int cost = un.recall_cost();
+				if (cost == -1) //recall_cost undefined
+					cost = current_team.recall_cost();
+				current_team.spend_gold(cost);
 				gui_->invalidate(loc);
 				gui_->draw();
 				recorder.add_checksum_check(loc);
diff -rupN 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:51:08.193183193 -0500
@@ -163,6 +163,7 @@ unit::unit(const unit& o):
            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 @@ unit::unit(const config &cfg, bool use_t
 	trait_names_(),
 	trait_descriptions_(),
 	unit_value_(),
+	unit_recall_value_(-1),
 	goto_(),
 	interrupted_move_(),
 	flying_(false),
@@ -343,6 +345,9 @@ unit::unit(const config &cfg, bool use_t
 	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 @@ unit::unit(const unit_type *t, int side,
 	trait_names_(),
 	trait_descriptions_(),
 	unit_value_(),
+	unit_recall_value_(-1),
 	goto_(),
 	interrupted_move_(),
 	flying_(false),
@@ -852,6 +858,7 @@ void unit::advance_to(const config &old_
 	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 @@ void unit::write(config& cfg) const
 		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 -rupN 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 @@ public:
 	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 @@ private:
 	std::vector<t_string> trait_descriptions_;
 
 	int unit_value_;
+	int unit_recall_value_;
 	map_location goto_, interrupted_move_;
 
 	bool flying_, is_fearless_, is_healthy_;
diff -rupN wesnoth source//unit_types.cpp wesnoth patch//unit_types.cpp
--- wesnoth source//unit_types.cpp	2012-04-02 05:50:00.588852682 -0500
+++ wesnoth patch//unit_types.cpp	2012-04-02 06:16:17.152560125 -0500
@@ -565,6 +565,7 @@ unit_type::unit_type(const unit_type& o)
 	movement_(o.movement_),
 	max_attacks_(o.max_attacks_),
 	cost_(o.cost_),
+	recall_cost_(o.recall_cost_),
 	usage_(o.usage_),
 	undead_variation_(o.undead_variation_),
 	image_(o.image_),
@@ -612,6 +613,7 @@ unit_type::unit_type(config &cfg) :
 	movement_(0),
 	max_attacks_(0),
 	cost_(0),
+	recall_cost_(-1),
 	usage_(),
 	undead_variation_(),
 	image_(cfg["image"].str()),
@@ -774,6 +776,7 @@ void unit_type::build_help_index(const m
 	movement_ = cfg["movement"].to_int(1);
 	max_attacks_ = cfg["attacks"].to_int(1);
 	cost_ = cfg["cost"].to_int(1);
+	recall_cost_ = cfg["recall_cost"].to_int(-1);
 	usage_ = cfg_["usage"].str();
 	undead_variation_ = cfg_["undead_variation"].str();
 	image_ = cfg_["image"].str();
diff -rupN wesnoth source//unit_types.hpp wesnoth patch//unit_types.hpp
--- wesnoth source//unit_types.hpp	2012-04-02 05:49:46.048781602 -0500
+++ wesnoth patch//unit_types.hpp	2012-04-02 06:04:23.969073557 -0500
@@ -227,6 +227,7 @@ public:
 	int movement() const { return movement_; }
 	int max_attacks() const { return max_attacks_; }
 	int cost() const { return cost_; }
+	int recall_cost() const { return recall_cost_; }
 	const std::string& usage() const { return usage_; }
 	const std::string& image() const { return image_; }
 	const std::string& icon() const { return icon_; }
@@ -304,6 +305,7 @@ private:
     int movement_;
     int max_attacks_;
     int cost_;
+		int recall_cost_;
     std::string usage_;
     std::string undead_variation_;
 
