diff --git a/src/simutrans/gui/enlarge_map_frame.cc b/src/simutrans/gui/enlarge_map_frame.cc
index 9b3471b6c..4c56e188b 100644
--- a/src/simutrans/gui/enlarge_map_frame.cc
+++ b/src/simutrans/gui/enlarge_map_frame.cc
@@ -9,12 +9,15 @@
 #include "minimap.h"
 #include "welt.h"
 #include "components/gui_divider.h"
+#include "load_relief_frame.h"
+#include "messagebox.h"
 
 #include "../simdebug.h"
 #include "../world/simworld.h"
 #include "simwin.h"
 #include "../display/simimg.h"
 
+#include "../dataobj/height_map_loader.h"
 #include "../dataobj/settings.h"
 #include "../dataobj/translator.h"
 
@@ -37,6 +40,63 @@ koord enlarge_map_frame_t::koord_from_rotation(settings_t const* const sets, sin
 	}
 }
 
+bool enlarge_map_frame_t::update_from_heightfield(const char *filename)
+{
+	const sint8 min_h = env_t::default_settings.get_minimumheight();
+	const sint8 max_h = env_t::default_settings.get_maximumheight();
+
+	height_map_loader_t hml(min_h, max_h, env_t::height_conv_mode);
+	sint16 w, h;
+	sint8 *h_field=NULL;
+
+	if(hml.get_height_data_from_file(filename, (sint8)sets->get_groundwater(), h_field, w, h, false )) {
+		uint16 old_x = welt->get_size().x;
+		uint16 old_y = welt->get_size().y;
+		if(old_x>w||old_y>h) {
+			create_win( new news_img("\nThe size of heightfield file must be larger than this map\n") , w_info, magic_none );
+			inp_x_size.enable();
+			inp_y_size.enable();
+			sets->heightfield = "";
+			loaded_heightfield = false;
+			return false;
+		}
+		sets->set_size_x(w);
+		sets->set_size_y(h);
+		uint16 pre_x = min(sets->get_size_x(), map.get_width());
+		uint16 pre_y = min(sets->get_size_y(), map.get_height());
+
+		inp_x_size.set_value(sets->get_size_x());
+		inp_y_size.set_value(sets->get_size_y());
+
+		const int mx = sets->get_size_x()/pre_x;
+		const int my = sets->get_size_y()/pre_y;
+		for(  int y=0;  y<pre_y;  y++  ) {
+			for(  int x=0;  x<pre_x;  x++  ) {
+				if(  x<=old_x/mx  &&  y<=old_y/my  ){
+					if(  x==(old_x/mx)  ||  y==(old_y/my)  ){
+						// border
+						map.at(x,y) = color_idx_to_rgb(COL_WHITE);
+					}
+					else {
+						const koord pos(x*mx,y*my);
+						const sint16 height = welt->lookup_hgt( pos );
+						map.at(x,y) = minimap_t::calc_height_color(height, sets->get_groundwater());
+					}
+				}
+				else {
+					map.at(x,y) = minimap_t::calc_height_color( h_field[x*mx+y*my*w], sets->get_groundwater() );
+				}
+			}
+		}
+		map_preview.set_map_data(&map);
+		free(h_field);
+		loaded_heightfield = true;
+		return true;
+	}
+	dbg->message("gui_t::update_from_heightfield()", "can not read %s", filename);
+	loaded_heightfield = false;
+	return false;
+}
 
 enlarge_map_frame_t::enlarge_map_frame_t() :
 	gui_frame_t( translator::translate("enlarge map") ),
@@ -106,6 +166,10 @@ enlarge_map_frame_t::enlarge_map_frame_t() :
 
 	new_component<gui_divider_t>();
 
+	// read hightfield data
+	load_map.init(button_t::roundbox | button_t::flexible, "load map");
+	load_map.add_listener( this );
+	add_component( &load_map );
 	// start game
 	start_button.init( button_t::roundbox | button_t::flexible, "enlarge map");
 	start_button.add_listener( this );
@@ -148,7 +212,28 @@ bool enlarge_map_frame_t::action_triggered( gui_action_creator_t *comp,value_t v
 	}
 	else if(comp==&start_button) {
 		destroy_all_win( true );
-		welt->enlarge_map(sets, NULL);
+		dbg->message("enlarge_map_frame_t::action_triggered()","enlarge with loaded heightfield? %s",loaded_heightfield?"true":"false");
+		if(loaded_heightfield) {
+			welt->load_heightfield(sets, false);
+		} else {
+			welt->enlarge_map(sets, NULL);
+		}
+	}
+	else if(comp==&load_map) {
+		if(!loaded_heightfield){
+			inp_x_size.disable();
+			inp_y_size.disable();
+			sets->heightfield = "";
+			load_relief_frame_t* lrf = new load_relief_frame_t(sets);
+			create_win(lrf, w_info, magic_load_t );
+			win_set_pos(lrf, scr_coord(display_get_width() - lrf->get_windowsize().w-10, env_t::iconsize.h));
+			loaded_heightfield = true;
+		} else {
+			inp_x_size.enable();
+			inp_y_size.enable();
+			sets->heightfield = "";
+			loaded_heightfield = false;
+		}
 	}
 	else {
 		return false;
@@ -163,8 +248,15 @@ void enlarge_map_frame_t::draw(scr_coord pos, scr_size size)
 		// map was rotated while we are active ... => rotate too!
 		sets->rotate90();
 		sets->set_size( sets->get_size_y(), sets->get_size_x() );
-		update_preview();
+		if( sets->heightfield.size()==0 || !loaded_heightfield ) {
+			loaded_heightfield = false;
+			inp_x_size.enable();
+			inp_y_size.enable();
+			sets->heightfield = "";
+		}
 	}
+	update_preview();
+	load_map.pressed = loaded_heightfield;
 
 	gui_frame_t::draw(pos, size);
 }
@@ -175,49 +267,52 @@ void enlarge_map_frame_t::draw(scr_coord pos, scr_size size)
  */
 void enlarge_map_frame_t::update_preview()
 {
-	// reset noise seed
-	setsimrand(0xFFFFFFFF, welt->get_settings().get_map_number());
-
-	// "welt" still knows the old size. The new size is saved in "sets".
 	uint16 old_x = welt->get_size().x;
 	uint16 old_y = welt->get_size().y;
-	uint16 pre_x = min(sets->get_size_x(), map.get_width());
-	uint16 pre_y = min(sets->get_size_y(), map.get_height());
-
-	const int mx = sets->get_size_x()/pre_x;
-	const int my = sets->get_size_y()/pre_y;
-
-	for(  int j=0;  j<pre_y;  j++  ) {
-		for(  int i=0;  i<pre_x;  i++  ) {
-			PIXVAL color;
-			koord pos(i*mx,j*my);
-
-			if(  pos.x<=old_x  &&  pos.y<=old_y  ){
-				if(  i==(old_x/mx)  ||  j==(old_y/my)  ){
-					// border
-					color = color_idx_to_rgb(COL_WHITE);
+	dbg->message("enlarge_map_frame_t::update_preview()", "update enlarge map preview, %s", sets->heightfield.c_str());
+	if( !update_from_heightfield(sets->heightfield.c_str()) || sets->heightfield.size()==0 ) {
+		// reset noise seed
+		setsimrand(0xFFFFFFFF, welt->get_settings().get_map_number());
+
+		// "welt" still knows the old size. The new size is saved in "sets".
+		uint16 pre_x = min(sets->get_size_x(), map.get_width());
+		uint16 pre_y = min(sets->get_size_y(), map.get_height());
+
+		const int mx = sets->get_size_x()/pre_x;
+		const int my = sets->get_size_y()/pre_y;
+
+		for(  int j=0;  j<pre_y;  j++  ) {
+			for(  int i=0;  i<pre_x;  i++  ) {
+				PIXVAL color;
+				koord pos(i*mx,j*my);
+
+				if(  pos.x<=old_x  &&  pos.y<=old_y  ){
+					if(  i==(old_x/mx)  ||  j==(old_y/my)  ){
+						// border
+						color = color_idx_to_rgb(COL_WHITE);
+					}
+					else {
+						const sint16 height = welt->lookup_hgt( pos );
+						color = minimap_t::calc_height_color(height, sets->get_groundwater());
+					}
 				}
 				else {
-					const sint16 height = welt->lookup_hgt( pos );
+					// new part
+					const sint16 height = karte_t::perlin_hoehe(sets, pos, koord(old_x,old_y) );
 					color = minimap_t::calc_height_color(height, sets->get_groundwater());
 				}
+				map.at(i,j) = color;
 			}
-			else {
-				// new part
-				const sint16 height = karte_t::perlin_hoehe(sets, pos, koord(old_x,old_y) );
-				color = minimap_t::calc_height_color(height, sets->get_groundwater());
-			}
-			map.at(i,j) = color;
 		}
-	}
-	for(  uint j=0;  j<map.get_height();  j++  ) {
-		for(  uint i=(j<pre_y ? pre_x : 0);  i<map.get_width();   i++  ) {
-			map.at(i,j) = color_idx_to_rgb(COL_GREY1);
+		for(  uint j=0;  j<map.get_height();  j++  ) {
+			for(  uint i=(j<pre_y ? pre_x : 0);  i<map.get_width();   i++  ) {
+				map.at(i,j) = color_idx_to_rgb(COL_GREY1);
+			}	
 		}
+		loaded_heightfield = false;
+		sets->heightfield = "";
+		map_preview.set_map_data(&map);
 	}
-	map_preview.set_map_data(&map);
-
-	sets->heightfield = "";
 
 	if(!changed_number_of_towns){// Interpolate number of towns.
 		sint32 new_area = sets->get_size_x() * sets->get_size_y();
diff --git a/src/simutrans/gui/enlarge_map_frame.h b/src/simutrans/gui/enlarge_map_frame.h
index 1cdf6e93b..e3244dd20 100644
--- a/src/simutrans/gui/enlarge_map_frame.h
+++ b/src/simutrans/gui/enlarge_map_frame.h
@@ -45,7 +45,9 @@ private:
 	gui_label_buf_t map_number_label;
 
 	button_t
-		start_button;
+		start_button,
+		load_map;
+	bool loaded_heightfield;
 
 	gui_label_buf_t
 		size_label; // memory requirement
@@ -56,7 +58,7 @@ public:
 
 	enlarge_map_frame_t();
 	~enlarge_map_frame_t();
-
+	bool update_from_heightfield(const char *filename);
 	/**
 	* Calculate the new Map-Preview. Initialize the new RNG!
 	* public, because also the climate dialog need it
diff --git a/src/simutrans/gui/load_relief_frame.cc b/src/simutrans/gui/load_relief_frame.cc
index 70dd70c65..5b23d81df 100644
--- a/src/simutrans/gui/load_relief_frame.cc
+++ b/src/simutrans/gui/load_relief_frame.cc
@@ -9,6 +9,7 @@
 #include "../world/simworld.h"
 #include "load_relief_frame.h"
 #include "welt.h"
+#include "enlarge_map_frame.h"
 #include "simwin.h"
 #include "../dataobj/translator.h"
 #include "../dataobj/settings.h"
@@ -55,6 +56,10 @@ bool load_relief_frame_t::item_action(const char *fullpath)
 		}
 
 		static_cast<welt_gui_t*>(new_world_gui)->update_preview(true);
+	} else {
+		dbg->message("load_relief_frame_t::item_action()","load file %s and enlarge map.", fullpath);
+		sets->heightfield = fullpath;
+		return true;
 	}
 
 	return false;
diff --git a/src/simutrans/gui/welt.cc b/src/simutrans/gui/welt.cc
index 2aa6b014c..0d8ec3531 100644
--- a/src/simutrans/gui/welt.cc
+++ b/src/simutrans/gui/welt.cc
@@ -532,7 +532,7 @@ bool welt_gui_t::action_triggered( gui_action_creator_t *comp,value_t v)
 		delete sets;
 		sets = NULL;
 		if(loaded_heightfield) {
-			welt->load_heightfield(&env_t::default_settings);
+			welt->load_heightfield(&env_t::default_settings,true);
 		}
 		else {
 			env_t::default_settings.heightfield = "";
diff --git a/src/simutrans/world/simworld.cc b/src/simutrans/world/simworld.cc
index 0b80d8d42..3e8cff76b 100644
--- a/src/simutrans/world/simworld.cc
+++ b/src/simutrans/world/simworld.cc
@@ -1741,10 +1741,11 @@ void karte_t::enlarge_map(settings_t const* sets, sint8 const* const h_field)
 	clear_random_mode( 0xFFFF );
 	set_random_mode( MAP_CREATE_RANDOM );
 
-	if(  new_world  &&  !settings.heightfield.empty()  ) {
+	dbg->message("karte_t::enlarge_map()","heightfield name is %s",settings.heightfield.c_str());
+	if(  !settings.heightfield.empty()  ) {
 		// init from file
-		for(int y=0; y<cached_grid_size.y; y++) {
-			for(int x=0; x<cached_grid_size.x; x++) {
+		for(  sint16 y = 0;  y<=new_size.y;  y++  ) {
+			for(  sint16 x = (y>old_size.y) ? 0 : old_size.x+1;  x<=new_size.x;  x++  ) {
 				grid_hgts[x + y*(cached_grid_size.x+1)] = h_field[x+(y*(sint32)cached_grid_size.x)]+1;
 			}
 			grid_hgts[cached_grid_size.x + y*(cached_grid_size.x+1)] = grid_hgts[cached_grid_size.x-1 + y*(cached_grid_size.x+1)];
@@ -5343,7 +5344,7 @@ uint8 karte_t::sp2num(player_t *player)
 }
 
 
-void karte_t::load_heightfield(settings_t* const sets)
+void karte_t::load_heightfield(settings_t* const sets, bool is_new_map)
 {
 	sint16 w, h;
 	sint8 *h_field = NULL;
@@ -5354,9 +5355,24 @@ void karte_t::load_heightfield(settings_t* const sets)
 
 	if(hml.get_height_data_from_file(sets->heightfield.c_str(), (sint8)(sets->get_groundwater()), h_field, w, h, false )) {
 		sets->set_size(w,h);
-		// create map
-		init(sets,h_field);
-		free(h_field);
+		// create new map or enlarge this map
+		if(  is_new_map  ) {
+			// create map
+			init(sets,h_field);
+			free(h_field);
+		} else {
+			if (cached_grid_size.x>w || cached_grid_size.y>h) {
+				// the loaded data is too small
+				dbg->error("karte_t::load_heightfield()","The size of heightfield file '%s' is too small! The size must be larger than (%i,%i).", sets->heightfield.c_str(),cached_grid_size.x,cached_grid_size.y);
+				create_win( new news_img("\nThe size of heightfield file is wrong.\n"), w_info, magic_none );
+				return;
+			}
+			dbg->message("karte_t::load_heightfield()","enlarge with heightfield file '%s'",sets->heightfield.c_str());
+			// enlarge map from this data
+			settings = *sets;
+			enlarge_map(&settings, h_field);
+			free(h_field);
+		}
 	}
 	else {
 		dbg->error("karte_t::load_heightfield()","Cant open file '%s'", sets->heightfield.c_str());
diff --git a/src/simutrans/world/simworld.h b/src/simutrans/world/simworld.h
index e24336ee2..9cefb679f 100644
--- a/src/simutrans/world/simworld.h
+++ b/src/simutrans/world/simworld.h
@@ -1196,7 +1196,7 @@ public:
 	 * Creates a map from a heightfield.
 	 * @param sets game settings.
 	 */
-	void load_heightfield(settings_t *sets);
+	void load_heightfield(settings_t *sets, bool is_new_map);
 
 	/**
 	 * Stops simulation and optionally closes the game.
