diff --git a/src/dataforms_widget.py b/src/dataforms_widget.py
index a5bba4dc34ed873f4cb70e401ccf81a38f2a600f..ee06fb559df2d261e3b0fd23d285d7b1f77c089a 100644
--- a/src/dataforms_widget.py
+++ b/src/dataforms_widget.py
@@ -370,14 +370,32 @@ class SingleForm(gtk.Table, object):
 
 			elif field.type == 'list-multi':
 				# TODO: When more than few choices, make a list
-				widget = gtk.VBox()
-				for value, label in field.iter_options():
-					check = gtk.CheckButton(label, use_underline=False)
-					check.set_active(value in field.values)
-					check.connect('toggled', self.on_list_multi_checkbutton_toggled,
-						field, value)
-					widget.set_sensitive(readwrite)
+				if len(field.options) < 6:
+					# 5 option max: show checkbutton
+					widget = gtk.VBox()
+					for value, label in field.iter_options():
+						check = gtk.CheckButton(label, use_underline=False)
+						check.set_active(value in field.values)
+						check.connect('toggled',
+							self.on_list_multi_checkbutton_toggled, field, value)
 					widget.pack_start(check, expand=False)
+				else:
+					# more than 5 options: show combobox
+					def on_list_multi_treeview_changed(selection, f):
+						def for_selected(treemodel, path, iter):
+							vals.append(treemodel[iter][1])
+						vals = []
+						selection.selected_foreach(for_selected)
+						field.values = vals[:]
+					widget = gtk.ScrolledWindow()
+					widget.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+					tv = gtkgui_helpers.create_list_multi(field.options,
+						field.values)
+					widget.add(tv)
+					widget.set_size_request(-1, 120)
+					tv.get_selection().connect('changed',
+						on_list_multi_treeview_changed, field)
+				widget.set_sensitive(readwrite)
 
 			elif field.type == 'jid-single':
 				widget = gtk.Entry()
diff --git a/src/gtkgui_helpers.py b/src/gtkgui_helpers.py
index 6bc792a85d79b97178a571ba807289fb3df40e7d..6a8b1b1cfad944750e6458843a0ec6e7f3c6984e 100644
--- a/src/gtkgui_helpers.py
+++ b/src/gtkgui_helpers.py
@@ -863,7 +863,25 @@ def create_combobox(value_list, selected_value = None):
 	combobox.show_all()
 	return combobox
 
-def load_iconset(path, pixbuf2 = None, transport = False):
+def create_list_multi(value_list, selected_values=None):
+	'''Value_list is [(label1, value1), ]'''
+	liststore = gtk.ListStore(str, str)
+	treeview = gtk.TreeView(liststore)
+	treeview.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
+	treeview.set_headers_visible(False)
+	col = gtk.TreeViewColumn()
+	treeview.append_column(col)
+	cell = gtk.CellRendererText()
+	col.pack_start(cell, True)
+	col.set_attributes(cell, text=0)
+	for value in value_list:
+		iter = liststore.append(value)
+		if value[1] in selected_values:
+			treeview.get_selection().select_iter(iter)
+	treeview.show_all()
+	return treeview
+
+def load_iconset(path, pixbuf2=None, transport=False):
 	'''load full iconset from the given path, and add
 	pixbuf2 on top left of each static images'''
 	path += '/'