diff --git a/common/listboxchoice.py b/common/listboxchoice.py
new file mode 100755
index 0000000..df6b895
--- /dev/null
+++ b/common/listboxchoice.py
@@ -0,0 +1,58 @@
+#!/ef/efabless/opengalaxy/venv/bin/python3
+#
+# Simple listbox with scrollbar and select button
+
+import re
+import tkinter
+from tkinter import ttk
+
+class ListBoxChoice(ttk.Frame):
+    def __init__(self, parent, fontsize=11, *args, **kwargs):
+        ttk.Frame.__init__(self, parent, *args, **kwargs)
+        s = ttk.Style()
+        s.configure('normal.TButton', font=('Helvetica', fontsize), border = 3, relief = 'raised')
+
+    def populate(self, title, list=[]):
+        self.value = None
+        self.list = list[:]
+        
+        ttk.Label(self, text=title).pack(padx=5, pady=5)
+
+        listFrame = ttk.Frame(self)
+        listFrame.pack(side='top', padx=5, pady=5, fill='both', expand='true')
+        
+        scrollBar = ttk.Scrollbar(listFrame)
+        scrollBar.pack(side='right', fill='y')
+        self.listBox = tkinter.Listbox(listFrame, selectmode='single')
+        self.listBox.pack(side='left', fill='x', expand='true')
+        scrollBar.config(command=self.listBox.yview)
+        self.listBox.config(yscrollcommand=scrollBar.set)
+        self.list.sort(key=natsort_key)
+        for item in self.list:
+            self.listBox.insert('end', item)
+
+        if len(self.list) == 0:
+            self.listBox.insert('end', '(no items)')
+        else:
+            buttonFrame = ttk.Frame(self)
+            buttonFrame.pack(side='bottom')
+
+            selectButton = ttk.Button(buttonFrame, text="Select", command=self._select,
+			style='normal.TButton')
+            selectButton.pack(side='left', padx = 5)
+            listFrame.bind("<Return>", self._select)
+
+    def natsort_key(s, _nsre=re.compile('([0-9]+)')):
+        # 'natural' sort function.  To make this alphabetical independently of
+        # capitalization, use "else text.lower()" instead of "else text" below.
+        return [int(text) if text.isdigit() else text for text in _nsre.split(s)]
+
+    def _select(self, event=None):
+        try:
+            firstIndex = self.listBox.curselection()[0]
+            self.value = self.list[int(firstIndex)]
+        except IndexError:
+            self.value = None
+
+    def value(self):
+        return self.value
