diff --git a/invest-applet/invest/preferences.py b/invest-applet/invest/preferences.py
index 65d83dc..a87c826 100644
--- a/invest-applet/invest/preferences.py
+++ b/invest-applet/invest/preferences.py
@@ -3,6 +3,7 @@ from os.path import join
 import gtk, gobject, gconf
 import invest
 from gettext import gettext as _
+from quotes import NameRetriever
 
 import cPickle
 
@@ -20,20 +21,29 @@ class PrefsDialog:
 		self.ui.get_object("remove").connect('activate', self.on_remove_stock)
 		self.treeview.connect('key-press-event', self.on_tree_keypress)
 
-		self.typs = (str, str, float, float, float)
+		STORE_SYMBOL, STORE_LABEL, STORE_AMOUNT, STORE_PRICE, STORE_COMMISSION, STORE_NAMERETRIVER = range(6)
+		self.typs = (str, str, float, float, float, NameRetriever)		
 		self.names = (_("Symbol"), _("Label"), _("Amount"), _("Price"), _("Commission"))
 		store = gtk.ListStore(*self.typs)
-		store.set_sort_column_id(0, gtk.SORT_ASCENDING)
+		store.set_sort_column_id(STORE_SYMBOL, gtk.SORT_ASCENDING)
 		self.treeview.set_model(store)
 		self.model = store
 
 		def on_cell_edited(cell, path, new_text, col, typ):
-			try:
-				if col == 0:    # stock symbols must be uppercase
-					new_text = str.upper(new_text)
-				store[path][col] = typ(new_text)
-			except:
-				pass
+			if col == STORE_SYMBOL:
+				new_text = str.upper(new_text) # stock symbols must be uppercase
+				nr = NameRetriever(new_text)
+				nr.connect('completed', update_label, store[path])
+				nr.start()
+				store[path][STORE_NAMERETRIVER] = nr
+			if col == STORE_LABEL:
+				nr = store[path][STORE_NAMERETRIVER]
+				nr.cancel()
+			store[path][col] = typ(new_text)
+
+		def update_label(nr, store_path):
+			if nr.cancelled == False:    # set label only if NameRetriever has not been cancelled
+				store_path[STORE_LABEL] = nr.name
 
 		def get_cell_data(column, cell, model, iter, data):
 			typ, col = data
@@ -65,7 +75,7 @@ class PrefsDialog:
 			label = data["label"]
 			purchases = data["purchases"]
 			for purchase in purchases:
-				store.append([key, label, purchase["amount"], purchase["bought"], purchase["comission"]])
+				store.append([key, label, purchase["amount"], purchase["bought"], purchase["comission"], None])
 
 		try:
 			pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(join(invest.ART_DATA_DIR, "invest-16.png"), -1,-1)
@@ -111,7 +121,7 @@ class PrefsDialog:
 		pass
 
 	def on_add_stock(self, w):
-		iter = self.model.append(["GOOG", "Google Inc.", 0, 0, 0])
+		iter = self.model.append(["GOOG", "Google Inc.", 0, 0, 0, None])
 		path = self.model.get_path(iter)
 		self.treeview.set_cursor(path, self.treeview.get_column(0), True)
 
diff --git a/invest-applet/invest/quotes.py b/invest-applet/invest/quotes.py
index 3f1a096..edda8aa 100644
--- a/invest-applet/invest/quotes.py
+++ b/invest-applet/invest/quotes.py
@@ -61,6 +61,53 @@ class QuotesRetriever(Thread, _IdleObject):
 			self.retrieved = True
 		self.emit("completed")
 
+class NameRetriever(Thread, _IdleObject):
+	"""
+	Thread which uses gobject signals to return the name
+	of a stock symbol.
+	"""
+	__gsignals__ =  {
+			"completed": (
+				gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, []),
+			# FIXME: We don't monitor progress, yet ...
+			#"progress": (
+			#	gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, [
+			#	gobject.TYPE_FLOAT])        #percent complete
+			}
+
+	def __init__(self, ticker):
+		Thread.__init__(self)
+		_IdleObject.__init__(self)
+		self.ticker = ticker
+		self.retrieved = False
+		self.cancelled = False
+		self.name = []
+
+	def cancel(self):
+		"""
+		Threads in python are not cancellable, so we implement our own
+		cancellation logic
+		"""
+		invest.debug("Retriving name for ticker %s has been cancelled" % self.ticker)
+		self.cancelled = True
+
+	def run(self):
+		invest.debug('Retriving name for ticker: %s' % self.ticker)
+		quotes_url = "http://finance.yahoo.com/d/quotes.csv?s=%s&f=snc4l1&e=.csv" % (self.ticker)
+		try:
+			data_file = urlopen(quotes_url, proxies = invest.PROXY)
+			data = data_file.read()
+			invest.debug('Retrieved data: %s' % data)
+			self.name = data.split(',')[1].replace('"', '')			
+			data_file.close()
+		except Exception, msg:
+			invest.debug("Error while retrieving quotes data (url = %s): %s" % (quotes_url, msg))
+		else:
+			# set retrieved = True only if thread has not been cancelled
+			if self.cancelled == False:
+				self.retrieved = True
+				invest.debug('Retrieved name: %s' % self.name)
+		self.emit("completed")
 
 class QuoteUpdater(gtk.ListStore):
 	updated = False
