diff --git a/plugins/artdisplay/artdisplay/CoverArtDatabase.py b/plugins/artdisplay/artdisplay/CoverArtDatabase.py
index b11b0c6..b1e7d4e 100644
--- a/plugins/artdisplay/artdisplay/CoverArtDatabase.py
+++ b/plugins/artdisplay/artdisplay/CoverArtDatabase.py
@@ -42,6 +42,29 @@ class CoverArtDatabase (object):
 		# FIXME: the following block of code is messy and needs to be redone ASAP
 		return art_folder + '/%s - %s.%s' % (artist.replace ('/', '-'), album.replace ('/', '-'), extension)	
 
+	def get_new_pixbuf (self, db, entry, callback):
+		if entry is None:
+			callback (entry, None)
+			return
+            
+		st_artist = db.entry_get (entry, rhythmdb.PROP_ARTIST)
+		st_album = db.entry_get (entry, rhythmdb.PROP_ALBUM)
+
+		# Handle special case
+		if st_album == "":
+			st_album = "Unknown"
+		if st_artist == "":
+			st_artist = "Unknown"
+
+		# If unknown artist and album there is no point continuing
+		if st_album == "Unknown" and st_artist == "Unknown":
+			callback (entry, None)
+			return
+
+		# Otherwise spawn (online) search-engine search
+		se = self.create_search ()
+		se.search (db, entry, self.on_search_engine_results, callback)
+
 	def get_pixbuf (self, db, entry, callback):
 		if entry is None:
 			callback (entry, None)
@@ -115,6 +138,13 @@ class CoverArtDatabase (object):
 		f.close ()
 		return location
 
+	def upload_artwork (self, artist, album, location):
+		f = file (location, 'rb')
+		if f == None:
+			return None
+		image_data = f.read ()
+		return self._create_artwork (artist, album, image_data)
+	
 	def on_image_data_received (self, image_data, search_engine, image_version, callback, best_match):
 		if image_data is None:
 			res = search_engine.search_next ()
diff --git a/plugins/artdisplay/artdisplay/__init__.py b/plugins/artdisplay/artdisplay/__init__.py
index 9113995..8e710df 100644
--- a/plugins/artdisplay/artdisplay/__init__.py
+++ b/plugins/artdisplay/artdisplay/__init__.py
@@ -48,6 +48,35 @@ class ArtDisplayPlugin (rb.Plugin):
 		self.current_entry = None
 		entry = sp.get_playing_entry ()
 		self.playing_entry_changed (sp, entry)
+		self.ui_str = """
+<ui>
+  <menubar name="MenuBar">
+    <menu name="EditMenu" action="Edit">
+      <menuitem name="ChangeCover" action="ChangeCover"/>
+    </menu>
+    <menu name="EditMenu" action="Edit">
+      <menuitem name="ReloadCover" action="ReloadCover"/>
+    </menu>
+  </menubar>
+</ui>
+"""
+		self.load_action = gtk.Action ('ChangeCover', _('_Change cover art'),
+					  _('Load new cover art from system'),
+					  'rb-cover-art')
+		self.load_activate_id = self.load_action.connect ('activate', self.load_cover)
+		self.reload_action = gtk.Action ('ReloadCover', _('_Reload cover art'),
+					  _('Load new cover art from Internet'),
+					  gtk.STOCK_REFRESH)
+		self.reload_activate_id = self.reload_action.connect ('activate', self.reload_cover)
+		self.action_group = gtk.ActionGroup ('ArtDisplayPluginActions')
+		self.action_group.add_action (self.load_action)
+		self.action_group.add_action (self.reload_action)
+    	
+		uim = shell.get_ui_manager ()
+		uim.insert_action_group (self.action_group, 0)
+		self.ui_id = uim.add_ui_from_string (self.ui_str);
+		uim.ensure_update ()
+
 	
 	def deactivate (self, shell):
 		self.shell = None
@@ -81,6 +110,25 @@ class ArtDisplayPlugin (rb.Plugin):
 		self.resize_in_progress = True
 		self.old_width = allocation.width
 
+	def load_cover (self, widget):
+		if self.current_entry == None:
+			return
+		db = self.shell.get_property ("db")
+		st_artist = db.entry_get (self.current_entry, rhythmdb.PROP_ARTIST)
+		st_album = db.entry_get (self.current_entry, rhythmdb.PROP_ALBUM)
+		if st_album == "Unknown" and st_artist == "Unknown":
+			return
+		dlg = gtk.FileChooserDialog(buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK))
+		response = dlg.run()
+		dlg.hide()
+		if response == gtk.RESPONSE_OK and dlg.get_filename() != None:
+			if self.art_db.upload_artwork(st_artist, st_album, dlg.get_filename()) != None:
+				self.refresh_entry ()
+		dlg.destroy()
+
+	def reload_cover (self, widget):
+		self.reload_entry ()
+
 	def do_resize(self):
 		if self.resize_in_progress:
 			self.resize_in_progress = False
@@ -99,6 +147,16 @@ class ArtDisplayPlugin (rb.Plugin):
 			# Intitates search in the database (which checks art cache, internet etc.)
 			self.current_entry = entry
 			self.art_db.get_pixbuf(db, entry, self.on_get_pixbuf_completed)
+	
+	def refresh_entry (self):
+		if self.current_entry != None:
+			db = self.shell.get_property ("db")
+			self.art_db.get_pixbuf (db, self.current_entry, self.on_get_pixbuf_completed)
+
+	def reload_entry (self):
+		if self.current_entry != None:
+			db = self.shell.get_property ("db")
+			self.art_db.get_new_pixbuf (db, self.current_entry, self.on_get_pixbuf_completed)
 
 	def on_get_pixbuf_completed(self, entry, pixbuf):
 		# Set the pixbuf for the entry returned from the art db
