diff --git a/src/target/image.c b/src/target/image.c
index d20f9df270fd96dc4e7ac4ce6c8f573802e46f85..5ecbb81d10fb0cb8acfdfad6e178a0799acf00a4 100644
--- a/src/target/image.c
+++ b/src/target/image.c
@@ -231,8 +231,7 @@ int image_ihex_buffer_complete(image_t *image)
 			for (i = 0; i < image->num_sections; i++)
 			{
 				image->sections[i].private = section[i].private;
-				image->sections[i].base_address = section[i].base_address +
-					((image->base_address_set) ? image->base_address : 0);
+				image->sections[i].base_address = section[i].base_address;
 				image->sections[i].size = section[i].size;
 				image->sections[i].flags = section[i].flags;
 			}
@@ -589,8 +588,7 @@ int image_mot_buffer_complete(image_t *image)
 			for (i = 0; i < image->num_sections; i++)
 			{
 				image->sections[i].private = section[i].private;
-				image->sections[i].base_address = section[i].base_address +
-					((image->base_address_set) ? image->base_address : 0);
+				image->sections[i].base_address = section[i].base_address;
 				image->sections[i].size = section[i].size;
 				image->sections[i].flags = section[i].flags;
 			}
@@ -647,11 +645,6 @@ int image_open(image_t *image, char *url, char *type_string)
 		image->sections[0].base_address = 0x0;
 		image->sections[0].size = image_binary->fileio.size;
 		image->sections[0].flags = 0;
-		
-		if (image->base_address_set == 1)
-			image->sections[0].base_address = image->base_address;
-		
-		return ERROR_OK;
 	}
 	else if (image->type == IMAGE_IHEX)
 	{
@@ -741,6 +734,21 @@ int image_open(image_t *image, char *url, char *type_string)
 		image->sections = NULL;
 		image->type_private = NULL;
 	}
+
+	if (image->base_address_set)
+	{
+		// relocate
+		int section;
+		for (section=0; section < image->num_sections; section++)
+		{
+			image->sections[section].base_address+=image->base_address;
+		}
+		// we're done relocating. The two statements below are mainly
+		// for documenation purposes: stop anyone from empirically
+		// thinking they should use these values henceforth.
+		image->base_address=0;
+		image->base_address_set=0;
+	}
 	
 	return retval;
 };