Index: src/unit_animation.cpp
===================================================================
--- src/unit_animation.cpp	(revision 56322)
+++ src/unit_animation.cpp	(working copy)
@@ -360,7 +360,7 @@
 
 void unit_animation::fill_initial_animations( std::vector<unit_animation> & animations, const config & cfg)
 {
-	const image::locator default_image = image::locator(cfg["image"]);
+	const std::string default_image = cfg["image"];
 	std::vector<unit_animation>  animation_base;
 	std::vector<unit_animation>::const_iterator itor;
 	add_anims(animations,cfg);
@@ -523,15 +523,6 @@
 	BOOST_FOREACH(const animation_branch &ab, prepare_animation(cfg, "standing_anim"))
 	{
 		config anim = ab.merge();
-		anim["apply_to"] = "default";
-		anim["cycles"] = "false";
-		if (anim["layer"].empty()) anim["layer"] = default_layer;
-		if (anim["offscreen"].empty()) anim["offscreen"] = false;
-		animations.push_back(unit_animation(anim));
-	}
-	BOOST_FOREACH(const animation_branch &ab, prepare_animation(cfg, "standing_anim"))
-	{
-		config anim = ab.merge();
 		anim["apply_to"] = "standing";
 		anim["cycles"] = "true";
 		if (anim["layer"].empty()) anim["layer"] = default_layer;
@@ -601,7 +592,7 @@
 			anim["hits"] = true;
 			animations.push_back(unit_animation(anim));
 			animations.back().add_frame(225,frame_builder()
-					.image(animations.back().get_last_frame().parameters(0).image)
+					.image(animations.back().get_last_frame().parameters(0).image.get_filename())
 					.duration(225)
 					.blend("0.0,0.5:75,0.0:75,0.5:75,0.0",game_display::rgb(255,0,0)));
 		}
@@ -615,7 +606,7 @@
 				animations.push_back(unit_animation(tmp));
 				if(hit_type == "yes" || hit_type == "hit" || hit_type=="kill") {
 					animations.back().add_frame(225,frame_builder()
-							.image(animations.back().get_last_frame().parameters(0).image)
+							.image(animations.back().get_last_frame().parameters(0).image.get_filename())
 							.duration(225)
 							.blend("0.0,0.5:75,0.0:75,0.5:75,0.0",game_display::rgb(255,0,0)));
 				}
@@ -654,7 +645,7 @@
 		if (anim["layer"].empty()) anim["layer"] = default_layer;
 		animations.push_back(unit_animation(anim));
 		image::locator image_loc = animations.back().get_last_frame().parameters(0).image;
-		animations.back().add_frame(600,frame_builder().image(image_loc).duration(600).highlight("1~0:600"));
+		animations.back().add_frame(600,frame_builder().image(image_loc.get_filename()).duration(600).highlight("1~0:600"));
 		if(!cfg["die_sound"].empty()) {
 			animations.back().sub_anims_["_death_sound"] = particule();
 			animations.back().sub_anims_["_death_sound"].add_frame(1,frame_builder());
Index: src/unit_frame.cpp
===================================================================
--- src/unit_frame.cpp	(revision 56322)
+++ src/unit_frame.cpp	(working copy)
@@ -48,12 +48,54 @@
 		total += cur_halo->second;
 	}
 	return total;
+}
 
+progressive_image::progressive_image(const std::string & data,int duration) :
+	data_(),
+	input_(data)
+{
+		const std::vector<std::string> first_pass = utils::square_parenthetical_split(data);
+		const int time_chunk = std::max<int>(duration / (first_pass.size()?first_pass.size():1),1);
+
+		std::vector<std::string>::const_iterator tmp;
+		for(tmp=first_pass.begin();tmp != first_pass.end() ; ++tmp) {
+			std::vector<std::string> second_pass = utils::split(*tmp,':');
+			if(second_pass.size() > 1) {
+				data_.push_back(std::pair<image::locator,int>(second_pass[0],atoi(second_pass[1].c_str())));
+			} else {
+				data_.push_back(std::pair<image::locator,int>(second_pass[0],time_chunk));
+			}
+		}
 }
+int progressive_image::duration() const
+{
+	int total =0;
+	std::vector<std::pair<image::locator,int> >::const_iterator cur_halo;
+	for(cur_halo = data_.begin() ; cur_halo != data_.end() ; ++cur_halo) {
+		total += cur_halo->second;
+	}
+	return total;
+}
 
+const image::locator empty_image;
+
+const image::locator& progressive_image::get_current_element(int current_time) const
+{
+	int time = 0;
+	unsigned int sub_image = 0;
+	if(data_.empty()) return empty_image;
+	while(time < current_time&& sub_image < data_.size()) {
+		time += data_[sub_image].second;
+		++sub_image;
+
+	}
+	if(sub_image) sub_image--;
+	return data_[sub_image].first;
+}
+
 static const std::string empty_string;
 
-const std::string& progressive_string::get_current_element(int current_time)const
+const std::string& progressive_string::get_current_element(int current_time) const
 {
 	int time = 0;
 	unsigned int sub_halo = 0;
@@ -249,7 +291,10 @@
 	if (const config::attribute_value *v = cfg.get(frame_string + "duration")) {
 		duration(*v);
 	} else if (!cfg.get(frame_string + "end")) {
-		duration((progressive_string(halo_,1)).duration());
+		int halo_duration = (progressive_string(halo_,1)).duration();
+		int image_duration = (progressive_image(image_,1)).duration();
+		int image_diagonal_duration = (progressive_image(image_diagonal_,1)).duration();
+		duration(std::max(std::max(image_duration,image_diagonal_duration),halo_duration));
 		
 	} else {
 		duration(cfg[frame_string + "end"].to_int() - cfg[frame_string + "begin"].to_int());
@@ -262,13 +307,13 @@
 	}
 }
 
-frame_builder & frame_builder::image(const image::locator& image ,const std::string & image_mod)
+frame_builder & frame_builder::image(const std::string& image ,const std::string & image_mod)
 {
 	image_ = image;
 	image_mod_ = image_mod;
 	return *this;
 }
-frame_builder & frame_builder::image_diagonal(const image::locator& image_diagonal,const std::string& image_mod)
+frame_builder & frame_builder::image_diagonal(const std::string& image_diagonal,const std::string& image_mod)
 {
 	image_diagonal_ = image_diagonal;
 	image_mod_ = image_mod;
@@ -366,8 +411,8 @@
 
 frame_parsed_parameters::frame_parsed_parameters(const frame_builder & builder, int duration) :
 	duration_(duration ? duration :builder.duration_),
-	image_(builder.image_),
-	image_diagonal_(builder.image_diagonal_),
+	image_(builder.image_,duration),
+	image_diagonal_(builder.image_diagonal_,duration),
 	image_mod_(builder.image_mod_),
 	halo_(builder.halo_,duration_),
 	halo_x_(builder.halo_x_,duration_),
@@ -394,7 +439,9 @@
 
 bool frame_parsed_parameters::does_not_change() const
 {
-	return halo_.does_not_change() &&
+	return image_.does_not_change() &&
+		image_diagonal_.does_not_change() &&
+		halo_.does_not_change() &&
 		halo_x_.does_not_change() &&
 		halo_y_.does_not_change() &&
 		blend_ratio_.does_not_change() &&
@@ -409,7 +456,9 @@
 }
 bool frame_parsed_parameters::need_update() const
 {
-	if(!halo_.does_not_change() ||
+	if(!image_.does_not_change() ||
+			!image_diagonal_.does_not_change() ||
+			!halo_.does_not_change() ||
 			!halo_x_.does_not_change() ||
 			!halo_y_.does_not_change() ||
 			!blend_ratio_.does_not_change() ||
@@ -430,8 +479,8 @@
 {
 	frame_parameters result;
 	result.duration = duration_;
-	result.image = image_;
-	result.image_diagonal = image_diagonal_;
+	result.image = image_.get_current_element(current_time);
+	result.image_diagonal = image_diagonal_.get_current_element(current_time);
 	result.image_mod = image_mod_;
 	result.halo = halo_.get_current_element(current_time);
 	result.halo_x = halo_x_.get_current_element(current_time);
@@ -490,6 +539,8 @@
 	}
 
 	if(duration != duration_) {
+		image_ = progressive_image(image_.get_original(),duration);
+		image_diagonal_ = progressive_image(image_diagonal_.get_original(),duration);
 		halo_ = progressive_string(halo_.get_original(),duration);
 		halo_x_ = progressive_int(halo_x_.get_original(),duration);
 		halo_y_ = progressive_int(halo_y_.get_original(),duration);
Index: src/unit_frame.hpp
===================================================================
--- src/unit_frame.hpp	(revision 56322)
+++ src/unit_frame.hpp	(working copy)
@@ -37,6 +37,18 @@
 		std::string input_;
 };
 
+class progressive_image {
+	public:
+		progressive_image(const std::string& data = "",int duration = 0);
+		int duration() const;
+		const image::locator & get_current_element(int time) const;
+		bool does_not_change() const { return data_.size() <= 1; }
+		std::string get_original() const { return input_; }
+	private:
+		std::vector<std::pair<image::locator,int> > data_;
+		std::string input_;
+};
+
 template <class T>
 class progressive_
 {
@@ -94,8 +106,8 @@
 		frame_builder(const config& cfg,const std::string &frame_string = "");
 		/** allow easy chained modifications will raised assert if used after initialization */
 		frame_builder & duration(const int duration);
-		frame_builder & image(const image::locator& image ,const std::string & image_mod="");
-		frame_builder & image_diagonal(const image::locator& image_diagonal,const std::string & image_mod="");
+		frame_builder & image(const std::string& image ,const std::string & image_mod="");
+		frame_builder & image_diagonal(const std::string& image_diagonal,const std::string & image_mod="");
 		frame_builder & sound(const std::string& sound);
 		frame_builder & text(const std::string& text,const  Uint32 text_color);
 		frame_builder & halo(const std::string &halo, const std::string &halo_x, const std::string& halo_y,const std::string& halo_mod);
@@ -115,8 +127,8 @@
 	private:
 		friend class frame_parsed_parameters;
 		int duration_;
-		image::locator image_;
-		image::locator image_diagonal_;
+		std::string image_;
+		std::string image_diagonal_;
 		std::string image_mod_;
 		std::string halo_;
 		std::string halo_x_;
@@ -162,8 +174,8 @@
 		bool need_update() const;
 	private:
 		int duration_;
-		image::locator image_;
-		image::locator image_diagonal_;
+		progressive_image image_;
+		progressive_image image_diagonal_;
 		std::string image_mod_;
 		progressive_string halo_;
 		progressive_int halo_x_;
