diff --git a/.gitignore b/.gitignore
index eafd6bd821fae3401c330577f0a4297ad31a8e7d..66a513df6264592497b095179cd329cc6196fc97 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,8 @@
 __pycache__
-irods-basicGUI/logs/*
\ No newline at end of file
+irods-basicGUI/logs/*
+
+# Build pipeline
+venv
+build
+dist
+irods-iBridgesGui.spec
\ No newline at end of file
diff --git a/gui/dataTransfer.py b/gui/dataTransfer.py
index 58560e3b48b34aa1a5836a33b6a4c34572f8fc4c..c332d9c803fb6a26a8346998b29ec7155fef891b 100644
--- a/gui/dataTransfer.py
+++ b/gui/dataTransfer.py
@@ -11,17 +11,19 @@ from irods.keywords import NO_PARA_OP_KW
 from utils.utils import getSize
 import os
 
+from gui.ui_files.dataTransferState import Ui_dataTransferState
 
 # Loading symbol generator
 # http://www.ajaxload.info/#preview
 
 
-class dataTransfer(QDialog):
+class dataTransfer(QDialog, Ui_dataTransferState):
     finished = pyqtSignal(bool, object)
 
     def __init__(self, ic, upload, localFsPath, irodsColl, irodsTreeIdx = None, resource = None):
         super(dataTransfer, self).__init__()
-        loadUi("gui/ui-files/dataTransferState.ui", self)
+        super(dataTransfer, self).setupUi(self)
+        #loadUi("gui/ui-files/dataTransferState.ui", self)
 
         self.ic = ic
         self.localFsPath = localFsPath
diff --git a/gui/elabUpload.py b/gui/elabUpload.py
index a4e1c2ef3c4d0ac84ce740749039750b6311d697..1c5e0a6cc4cef6b9cfaee5b8759f5f7d2cd645fa 100644
--- a/gui/elabUpload.py
+++ b/gui/elabUpload.py
@@ -1,6 +1,6 @@
 from utils.elabConnector import elabConnector
 from PyQt5 import QtCore, QtGui, QtWidgets
-from PyQt5.QtWidgets import QMessageBox, QTableWidgetItem, QFileSystemModel
+from PyQt5.QtWidgets import QMessageBox, QTableWidgetItem, QFileSystemModel, QWidget
 from PyQt5.QtCore import QObject, QThread, pyqtSignal
 from gui.checkableFsTree import checkableFsTreeModel
 
@@ -9,30 +9,34 @@ from utils.utils import getSize, walkToDict
 from irods.exception import CATALOG_ALREADY_HAS_ITEM_BY_THAT_NAME
 import logging
 
-class elabUpload():
-    def __init__(self, widget, ic):
-        self.widget = widget
+from gui.ui_files.tabELNData import Ui_tabELNData
+
+class elabUpload(QWidget, Ui_tabELNData):
+    def __init__(self, ic):
+        super(elabUpload, self).__init__()
+        super(elabUpload, self).setupUi(self)
+
         self.elab = None
         self.coll = None
         self.ic = ic
         # Return errors to:
-        self.errorLabel = widget.errorLabel
+        self.errorLabel = self.errorLabel
         #Gathering Eln configuration
-        self.elnTokenInput = widget.elnTokenInput
-        self.elnGroupTable = widget.elnGroupTable
-        self.elnExperimentTable = widget.elnExperimentTable
+        self.elnTokenInput = self.elnTokenInput
+        self.elnGroupTable = self.elnGroupTable
+        self.elnExperimentTable = self.elnExperimentTable
         #Config ok check
-        self.groupIdLabel = widget.groupIdLabel
-        self.experimentIdLabel = widget.experimentIdLabel
+        self.groupIdLabel = self.groupIdLabel
+        self.experimentIdLabel = self.experimentIdLabel
         #Selecting and uploading local files and folders
-        self.dirmodel = checkableFsTreeModel(widget.localFsTable)
-        widget.localFsTable.setModel(self.dirmodel)
-        self.localFsTable = widget.localFsTable
+        self.dirmodel = checkableFsTreeModel(self.localFsTable)
+        self.localFsTable.setModel(self.dirmodel)
+        self.localFsTable = self.localFsTable
         
-        self.elnUploadButton = widget.elnUploadButton
+        self.elnUploadButton = self.elnUploadButton
         #Showing result
-        self.elnPreviewBrowser = widget.elnPreviewBrowser
-        self.elnIrodsPath = widget.elnIrodsPath
+        self.elnPreviewBrowser = self.elnPreviewBrowser
+        self.elnIrodsPath = self.elnIrodsPath
 
         #defining events and listeners
         self.elnTokenInput.returnPressed.connect(self.connectElab)
@@ -57,12 +61,12 @@ class elabUpload():
                 row = row + 1
             self.elnGroupTable.resizeColumnsToContents()
             self.loadLocalFileView()
-            self.widget.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
+            self.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
         except Exception as e:
             logging.info("elabUpload: "+repr(e))
             self.errorLabel.setText(
                 "ELN ERROR: "+repr(e)+"\n Your permissions for your current active group might be blocked.")
-            self.widget.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
+            self.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
             return
     
     def selectExperiment(self, expId):
@@ -77,7 +81,7 @@ class elabUpload():
     def loadExperiments(self):
         self.errorLabel.clear()
         self.elnExperimentTable.setRowCount(0)
-        self.widget.setCursor(QtGui.QCursor(QtCore.Qt.WaitCursor))
+        self.setCursor(QtGui.QCursor(QtCore.Qt.WaitCursor))
         row = self.elnGroupTable.currentRow()
         if row > -1:
             groupId = self.elnGroupTable.item(row, 0).text()
@@ -104,11 +108,11 @@ class elabUpload():
                 logging.info("ElabUpload groupId "+str(groupId)+": "+repr(error))
                 self.errorLabel.setText(
                     "ELN ERROR: "+repr(e)+"\n You might not have permissions for that group.")
-                self.widget.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
+                self.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
                 return
 
         self.elnExperimentTable.resizeColumnsToContents()
-        self.widget.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
+        self.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
     
 
     def loadLocalFileView(self):
@@ -264,28 +268,32 @@ class Worker(QObject):
             logging.info("ElabUpload data upload and annotation worker: "+repr(e))
             print(repr(e))
 
-        self.annotateElab()
+        self.annotateElab({ "file size": str(self.size) + "MB" })
 
 
-    def annotateElab(self):
+    def annotateElab(self, metadata):
         self.errorLabel.setText("Linking data to Elabjournal experiment.")
         if self.ic.davrods and "yoda" in self.ic.session.host:
             self.elab.addMetadata(
                 self.ic.davrods+'/'+self.coll.path.split('home/')[1].strip(),
+                meta=metadata,
                 title='Data in iRODS')
         elif self.ic.davrods and "surfsara.nl" in self.ic.session.host:
                 self.elab.addMetadata(
                     self.ic.davrods+'/'+self.coll.path.split(
                         self.ic.session.zone)[1].strip('/'), 
+                    meta=metadata,
                     title='Data in iRODS')
         elif self.ic.davrods:
             self.elab.addMetadata(
                     self.ic.davrods+'/'+self.coll.path.strip('/'), 
+                    meta=metadata,
                     title='Data in iRODS')
         else:
             self.elab.addMetadata('{'+self.ic.session.host+', \n'\
                                     +self.ic.session.zone+', \n'\
                                     +self.ic.session.username+', \n'\
                                     +str(self.ic.session.port)+'}\n'+
-                                    self.coll.path, title='Data in iRODS')
+                                    self.coll.path, meta=metadata,
+                                    title='Data in iRODS')
     
diff --git a/gui/irodsBrowser.py b/gui/irodsBrowser.py
index d16dafede962f419170e790fd4bbd4a7d7208486..100a110b76a4c6ae6655ae3bf60dc77a1b9e893a 100644
--- a/gui/irodsBrowser.py
+++ b/gui/irodsBrowser.py
@@ -1,5 +1,5 @@
 from PyQt5 import QtWidgets
-from PyQt5.QtWidgets import QDialog, QFileDialog, QApplication, QMainWindow, QMessageBox, QPushButton
+from PyQt5.QtWidgets import QDialog, QFileDialog, QApplication, QMainWindow, QMessageBox, QPushButton, QWidget
 from PyQt5.uic import loadUi
 from PyQt5 import QtCore
 from PyQt5 import QtGui
@@ -7,52 +7,52 @@ from PyQt5 import QtGui
 from gui.popupWidgets import irodsCreateCollection
 from utils.utils import walkToDict, getDownloadDir
 import logging
+import sys
 
 from irods.exception import CollectionDoesNotExist, NetworkException
+from gui.ui_files.tabBrowser import Ui_tabBrowser
 
-import sys
-
+class irodsBrowser(QWidget, Ui_tabBrowser):
+    def __init__ (self, ic):
+        super(irodsBrowser, self).__init__()
+        super(irodsBrowser, self).setupUi(self)
 
-class irodsBrowser():
-    def __init__ (self, widget, ic):
-        
         self.ic = ic
-        self.widget = widget
-        self.widget.viewTabs.setCurrentIndex(0)
+        self.viewTabs.setCurrentIndex(0)
 
         #Browser table
-        self.widget.collTable.setColumnWidth(1,399)
-        self.widget.collTable.setColumnWidth(2,199)
-        self.widget.collTable.setColumnWidth(3,399)
-        self.widget.collTable.setColumnWidth(0,20)
+        self.collTable.setColumnWidth(1,399)
+        self.collTable.setColumnWidth(2,199)
+        self.collTable.setColumnWidth(3,399)
+        self.collTable.setColumnWidth(0,20)
 
         #Metadata table
-        self.widget.metadataTable.setColumnWidth(0,199)
-        self.widget.metadataTable.setColumnWidth(1,199)
-        self.widget.metadataTable.setColumnWidth(2,199)
+        self.metadataTable.setColumnWidth(0,199)
+        self.metadataTable.setColumnWidth(1,199)
+        self.metadataTable.setColumnWidth(2,199)
 
         #ACL table
-        self.widget.aclTable.setColumnWidth(0,299)
-        self.widget.aclTable.setColumnWidth(1,299)
+        self.aclTable.setColumnWidth(0,299)
+        self.aclTable.setColumnWidth(1,299)
 
         #if user is not admin nor datasteward, hide ACL buttons
         try:
             userType, userGroups = self.ic.getUserInfo()
         except NetworkException:
-            self.widget.errorLabel.setText(
+            self.errorLabel.setText(
                     "IRODS NETWORK ERROR: No Connection, please check network")
 
         if "rodsadmin" not in userType and \
            "datastewards" not in userGroups and \
            "training" not in userGroups:
 
-            self.widget.aclAddButton.hide()
-            self.widget.aclBox.setEnabled(False)
-            self.widget.recurseBox.setEnabled(False)
+            self.aclAddButton.hide()
+            self.aclBox.setEnabled(False)
+            self.recurseBox.setEnabled(False)
 
         #Resource table
-        self.widget.resourceTable.setColumnWidth(0,500)
-        self.widget.resourceTable.setColumnWidth(1,90)
+        self.resourceTable.setColumnWidth(0,500)
+        self.resourceTable.setColumnWidth(1,90)
 
         #iRODS defaults
         try:
@@ -61,7 +61,7 @@ class irodsBrowser():
             self.irodsRoot = self.ic.session.collections.get(
                     "/"+ic.session.zone+"/home/"+ic.session.username)
         except NetworkException:
-            self.widget.errorLabel.setText(
+            self.errorLabel.setText(
                     "IRODS NETWORK ERROR: No Connection, please check network")
 
         self.resetPath()
@@ -71,65 +71,65 @@ class irodsBrowser():
 
     def browse(self):
         #update main table when iRODS paht is changed upon 'Enter'
-        self.widget.inputPath.returnPressed.connect(self.loadTable)
-        self.widget.homeButton.clicked.connect(self.resetPath)
+        self.inputPath.returnPressed.connect(self.loadTable)
+        self.homeButton.clicked.connect(self.resetPath)
         #quick data upload and download (files only)
-        self.widget.UploadButton.clicked.connect(self.fileUpload)
-        self.widget.DownloadButton.clicked.connect(self.fileDownload)
+        self.UploadButton.clicked.connect(self.fileUpload)
+        self.DownloadButton.clicked.connect(self.fileDownload)
         #new collection
-        self.widget.createCollButton.clicked.connect(self.createCollection)
-        self.widget.dataDeleteButton.clicked.connect(self.deleteData)
-        self.widget.loadDeleteSelectionButton.clicked.connect(self.loadSelection)
+        self.createCollButton.clicked.connect(self.createCollection)
+        self.dataDeleteButton.clicked.connect(self.deleteData)
+        self.loadDeleteSelectionButton.clicked.connect(self.loadSelection)
         #functionality to lower tabs for metadata, acls and resources
-        self.widget.collTable.doubleClicked.connect(self.updatePath)
-        self.widget.collTable.clicked.connect(self.fillInfo)
-        self.widget.metadataTable.clicked.connect(self.editMetadata)
-        self.widget.aclTable.clicked.connect(self.editACL)
+        self.collTable.doubleClicked.connect(self.updatePath)
+        self.collTable.clicked.connect(self.fillInfo)
+        self.metadataTable.clicked.connect(self.editMetadata)
+        self.aclTable.clicked.connect(self.editACL)
         #actions to update iCat entries of metadata and acls
-        self.widget.metaAddButton.clicked.connect(self.addIcatMeta)
-        self.widget.metaUpdateButton.clicked.connect(self.updateIcatMeta)
-        self.widget.metaDeleteButton.clicked.connect(self.deleteIcatMeta)
-        self.widget.aclAddButton.clicked.connect(self.updateIcatAcl)
+        self.metaAddButton.clicked.connect(self.addIcatMeta)
+        self.metaUpdateButton.clicked.connect(self.updateIcatMeta)
+        self.metaDeleteButton.clicked.connect(self.deleteIcatMeta)
+        self.aclAddButton.clicked.connect(self.updateIcatAcl)
 
 
     # Util functions
     def __clearErrorLabel(self):
-        self.widget.errorLabel.clear()
+        self.errorLabel.clear()
 
 
     def __clearViewTabs(self):
-        self.widget.aclTable.setRowCount(0)
-        self.widget.metadataTable.setRowCount(0)
-        self.widget.resourceTable.setRowCount(0)
-        self.widget.previewBrowser.clear()
+        self.aclTable.setRowCount(0)
+        self.metadataTable.setRowCount(0)
+        self.resourceTable.setRowCount(0)
+        self.previewBrowser.clear()
 
 
     def __fillResc(self, value, path):
-        self.widget.resourceTable.setRowCount(0)
+        self.resourceTable.setRowCount(0)
         newPath = "/"+path.strip("/")+"/"+value.strip("/")
         if not value.endswith("/") and self.ic.session.data_objects.exists(newPath):
             resources = self.ic.listResources()
-            self.widget.resourceTable.setRowCount(len(resources))
+            self.resourceTable.setRowCount(len(resources))
             obj = self.ic.session.data_objects.get(
                     "/"+path.strip("/")+"/"+value.strip("/")
                     )
             replicas = [resc.resource_name for resc in obj.replicas]
             for i in range(len(resources)):
-                self.widget.resourceTable.setItem(i, 0, 
+                self.resourceTable.setItem(i, 0, 
                         QtWidgets.QTableWidgetItem(resources[i]))
                 if resources[i] in replicas:
                     item = QtWidgets.QTableWidgetItem()
                     item.setCheckState(QtCore.Qt.Checked)
                     item.setFlags(QtCore.Qt.ItemIsEnabled)
-                    self.widget.resourceTable.setItem(i, 1, item)
-        self.widget.resourceTable.resizeColumnsToContents()
+                    self.resourceTable.setItem(i, 1, item)
+        self.resourceTable.resizeColumnsToContents()
 
 
     def __fillACLs(self, value, path):
-        self.widget.aclTable.setRowCount(0)
-        self.widget.aclUserField.clear()
-        self.widget.aclZoneField.clear()
-        self.widget.aclBox.setCurrentText("----")
+        self.aclTable.setRowCount(0)
+        self.aclUserField.clear()
+        self.aclZoneField.clear()
+        self.aclBox.setCurrentText("----")
 
         newPath = "/"+path.strip("/")+"/"+value.strip("/")
         acls = []
@@ -144,22 +144,22 @@ class irodsBrowser():
                         )
             acls = self.ic.session.permissions.get(item)
 
-        self.widget.aclTable.setRowCount(len(acls))
+        self.aclTable.setRowCount(len(acls))
         row = 0
         for acl in acls:
-            self.widget.aclTable.setItem(row, 0, QtWidgets.QTableWidgetItem(acl.user_name))
-            self.widget.aclTable.setItem(row, 1,QtWidgets.QTableWidgetItem(acl.user_zone))
-            self.widget.aclTable.setItem(row, 2,
+            self.aclTable.setItem(row, 0, QtWidgets.QTableWidgetItem(acl.user_name))
+            self.aclTable.setItem(row, 1,QtWidgets.QTableWidgetItem(acl.user_zone))
+            self.aclTable.setItem(row, 2,
                 QtWidgets.QTableWidgetItem(acl.access_name.split(' ')[0].replace('modify', 'write')))
             row = row+1
 
-        self.widget.aclTable.resizeColumnsToContents()
+        self.aclTable.resizeColumnsToContents()
 
 
     def __fillMetadata(self, value, path):
-        self.widget.metaKeyField.clear()
-        self.widget.metaValueField.clear()
-        self.widget.metaUnitsField.clear()
+        self.metaKeyField.clear()
+        self.metaValueField.clear()
+        self.metaUnitsField.clear()
 
         newPath = "/"+path.strip("/")+"/"+value.strip("/")
         metadata = []
@@ -173,17 +173,17 @@ class irodsBrowser():
                     "/"+path.strip("/")+"/"+value.strip("/")
                     )
             metadata = obj.metadata.items()
-        self.widget.metadataTable.setRowCount(len(metadata))
+        self.metadataTable.setRowCount(len(metadata))
         row = 0
         for item in metadata:
-            self.widget.metadataTable.setItem(row, 0,
+            self.metadataTable.setItem(row, 0,
                     QtWidgets.QTableWidgetItem(item.name))
-            self.widget.metadataTable.setItem(row, 1,
+            self.metadataTable.setItem(row, 1,
                     QtWidgets.QTableWidgetItem(item.value))
-            self.widget.metadataTable.setItem(row, 2,
+            self.metadataTable.setItem(row, 2,
                     QtWidgets.QTableWidgetItem(item.units))
             row = row+1
-        self.widget.metadataTable.resizeColumnsToContents()
+        self.metadataTable.resizeColumnsToContents()
 
 
     def __fillPreview(self, value, path):
@@ -198,7 +198,7 @@ class irodsBrowser():
                       [o.name for o in coll.data_objects]
 
             previewString = '\n'.join(content)
-            self.widget.previewBrowser.append(previewString)
+            self.previewBrowser.append(previewString)
         elif self.ic.session.data_objects.exists(newPath): # object
             # get mimetype
             mimetype = value.split(".")[len(value.split("."))-1]
@@ -212,15 +212,15 @@ class irodsBrowser():
                         for i in range(20):
                             out.append(readObj.read(50))
                     previewString = ''.join([line.decode('utf-8') for line in out])
-                    self.widget.previewBrowser.append(previewString)
+                    self.previewBrowser.append(previewString)
                 except Exception as e:
-                    self.widget.previewBrowser.append(
-                        "No Preview for: " + "/"+self.widget.inputPath.text().strip("/")+"/"+value.strip("/"))
-                    self.widget.previewBrowser.append(repr(e))
-                    self.widget.previewBrowser.append("Storage resource might be down.")
+                    self.previewBrowser.append(
+                        "No Preview for: " + "/"+self.inputPath.text().strip("/")+"/"+value.strip("/"))
+                    self.previewBrowser.append(repr(e))
+                    self.previewBrowser.append("Storage resource might be down.")
             else:
-                self.widget.previewBrowser.append(
-                    "No Preview for: " + "/"+self.widget.inputPath.text().strip("/")+"/"+value.strip("/"))
+                self.previewBrowser.append(
+                    "No Preview for: " + "/"+self.inputPath.text().strip("/")+"/"+value.strip("/"))
 
 
     def loadTable(self):
@@ -228,39 +228,39 @@ class irodsBrowser():
         try:
             self.__clearErrorLabel()
             self.__clearViewTabs()
-            newPath = "/"+self.widget.inputPath.text().strip("/")
+            newPath = "/"+self.inputPath.text().strip("/")
             if self.ic.session.collections.exists(newPath):
                 coll = self.ic.session.collections.get(newPath)
-                self.widget.collTable.setRowCount(len(coll.data_objects)+len(coll.subcollections))
+                self.collTable.setRowCount(len(coll.data_objects)+len(coll.subcollections))
                 row = 0
                 for subcoll in coll.subcollections:
-                    self.widget.collTable.setItem(row, 1, QtWidgets.QTableWidgetItem(subcoll.name+"/"))
-                    self.widget.collTable.setItem(row, 2, QtWidgets.QTableWidgetItem(""))
-                    self.widget.collTable.setItem(row, 3, QtWidgets.QTableWidgetItem(""))
-                    self.widget.collTable.setItem(row, 0, QtWidgets.QTableWidgetItem(""))
+                    self.collTable.setItem(row, 1, QtWidgets.QTableWidgetItem(subcoll.name+"/"))
+                    self.collTable.setItem(row, 2, QtWidgets.QTableWidgetItem(""))
+                    self.collTable.setItem(row, 3, QtWidgets.QTableWidgetItem(""))
+                    self.collTable.setItem(row, 0, QtWidgets.QTableWidgetItem(""))
                     row = row+1
                 for obj in coll.data_objects:
-                    self.widget.collTable.setItem(row, 1, QtWidgets.QTableWidgetItem(obj.name))
-                    self.widget.collTable.setItem(
+                    self.collTable.setItem(row, 1, QtWidgets.QTableWidgetItem(obj.name))
+                    self.collTable.setItem(
                         row, 2, QtWidgets.QTableWidgetItem(str(obj.size)))
-                    self.widget.collTable.setItem(
+                    self.collTable.setItem(
                         row, 3, QtWidgets.QTableWidgetItem(str(obj.checksum)))
-                    self.widget.collTable.setItem(
+                    self.collTable.setItem(
                         row, 4, QtWidgets.QTableWidgetItem(str(obj.modify_time)))
-                    self.widget.collTable.setItem(row, 0, QtWidgets.QTableWidgetItem(""))
+                    self.collTable.setItem(row, 0, QtWidgets.QTableWidgetItem(""))
                     row = row+1
-                self.widget.collTable.resizeColumnsToContents()
+                self.collTable.resizeColumnsToContents()
             else:
-                self.widget.collTable.setRowCount(0)
-                self.widget.errorLabel.setText("Collection does not exist.")
+                self.collTable.setRowCount(0)
+                self.errorLabel.setText("Collection does not exist.")
         except NetworkException:
             logging.exception("Something went wrong")
-            self.widget.errorLabel.setText(
+            self.errorLabel.setText(
                     "IRODS NETWORK ERROR: No Connection, please check network")
 
 
     def resetPath(self):
-        self.widget.inputPath.setText(self.irodsRoot.path)
+        self.inputPath.setText(self.irodsRoot.path)
         self.loadTable()
 
 
@@ -269,13 +269,13 @@ class irodsBrowser():
         self.__clearErrorLabel()
         col = index.column()
         row = index.row()
-        if self.widget.collTable.item(row, 0).text() != '':
-            parent = self.widget.collTable.item(row, 0).text()
+        if self.collTable.item(row, 0).text() != '':
+            parent = self.collTable.item(row, 0).text()
         else:
-            parent = self.widget.inputPath.text()
-        value = self.widget.collTable.item(row, 1).text()
+            parent = self.inputPath.text()
+        value = self.collTable.item(row, 1).text()
         if value.endswith("/"): #collection
-            self.widget.inputPath.setText("/"+parent.strip("/")+"/"+value.strip("/"))
+            self.inputPath.setText("/"+parent.strip("/")+"/"+value.strip("/"))
             self.loadTable()
 
 
@@ -283,19 +283,18 @@ class irodsBrowser():
     def fillInfo(self, index):
         self.__clearErrorLabel()
         self.__clearViewTabs()
-
-        self.widget.metadataTable.setRowCount(0)
-        self.widget.aclTable.setRowCount(0)
-        self.widget.resourceTable.setRowCount(0)
+        self.metadataTable.setRowCount(0)
+        self.aclTable.setRowCount(0)
+        self.resourceTable.setRowCount(0)
         
         col = index.column()
         row = index.row()
         self.currentBrowserRow = row
-        value = self.widget.collTable.item(row, col).text()
-        if self.widget.collTable.item(row, 0).text() != '':
-            path = self.widget.collTable.item(row, 0).text()
+        value = self.collTable.item(row, col).text()
+        if self.collTable.item(row, 0).text() != '':
+            path = self.collTable.item(row, 0).text()
         else:
-            path = self.widget.inputPath.text()
+            path = self.inputPath.text()
         self.__clearViewTabs()
         try:
             self.__fillPreview(value, path)
@@ -304,17 +303,17 @@ class irodsBrowser():
             self.__fillResc(value, path)
         except Exception as e:
             logging.info('ERROR in Browser',exc_info=True)
-            self.widget.errorLabel.setText(repr(e))
+            self.errorLabel.setText(repr(e))
 
 
     def loadSelection(self):
         #loads selection from main table into delete tab
-        self.widget.setCursor(QtGui.QCursor(QtCore.Qt.WaitCursor))
-        self.widget.deleteSelectionBrowser.clear()
-        parent = self.widget.inputPath.text()
-        row = self.widget.collTable.currentRow()
+        self.setCursor(QtGui.QCursor(QtCore.Qt.WaitCursor))
+        self.deleteSelectionBrowser.clear()
+        parent = self.inputPath.text()
+        row = self.collTable.currentRow()
         if row > -1:
-            cell = self.widget.collTable.item(row, 1).text()
+            cell = self.collTable.item(row, 1).text()
             path = "/"+parent.strip("/")+"/"+cell.strip("/")
             try:
                 if self.ic.session.collections.exists(path):
@@ -322,30 +321,30 @@ class irodsBrowser():
                 elif self.ic.session.data_objects.exists(path):
                     irodsDict = {self.ic.session.data_objects.get(path).path: []}
                 else:
-                    self.widget.errorLabel.setText("Load: nothing selected.")
+                    self.errorLabel.setText("Load: nothing selected.")
                     pass
 
                 for key in list(irodsDict.keys())[:20]:
-                    self.widget.deleteSelectionBrowser.append(key)
+                    self.deleteSelectionBrowser.append(key)
                     if len(irodsDict[key]) > 0:
                         for item in irodsDict[key]:
-                            self.widget.deleteSelectionBrowser.append('\t'+item)
-                self.widget.deleteSelectionBrowser.append('...')
+                            self.deleteSelectionBrowser.append('\t'+item)
+                self.deleteSelectionBrowser.append('...')
             except NetworkException:
-                self.widget.errorLabel.setText(
+                self.errorLabel.setText(
                     "IRODS NETWORK ERROR: No Connection, please check network")
-                self.widget.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
-        self.widget.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
+                self.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
+        self.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
 
 
     def deleteData(self):
         #Deletes all data in the deleteSelectionBrowser
-        self.widget.errorLabel.clear()
-        data = self.widget.deleteSelectionBrowser.toPlainText().split('\n')
+        self.errorLabel.clear()
+        data = self.deleteSelectionBrowser.toPlainText().split('\n')
         if data[0] != '':
             deleteItem = data[0].strip()
             quit_msg = "Delete all data in \n\n"+deleteItem+'\n'
-            reply = QMessageBox.question(self.widget, 'Message', quit_msg, QMessageBox.Yes, QMessageBox.No)
+            reply = QMessageBox.question(self, 'Message', quit_msg, QMessageBox.Yes, QMessageBox.No)
             if reply == QMessageBox.Yes:
                 try:
                     if self.ic.session.collections.exists(deleteItem):
@@ -353,15 +352,15 @@ class irodsBrowser():
                     else:
                         item = self.ic.session.data_objects.get(deleteItem)
                     self.ic.deleteData(item)
-                    self.widget.deleteSelectionBrowser.clear()
+                    self.deleteSelectionBrowser.clear()
                     self.loadTable()
-                    self.widget.errorLabel.clear()
+                    self.errorLabel.clear()
 
                 except Exception as error:
-                    self.widget.errorLabel.setText("ERROR DELETE DATA: "+repr(error))
+                    self.errorLabel.setText("ERROR DELETE DATA: "+repr(error))
 
     def createCollection(self):
-        parent = "/"+self.widget.inputPath.text().strip("/")
+        parent = "/"+self.inputPath.text().strip("/")
         creteCollWidget = irodsCreateCollection(parent, self.ic)
         creteCollWidget.exec_()
         self.loadTable()
@@ -369,121 +368,121 @@ class irodsBrowser():
 
     def fileUpload(self):
         from utils.utils import getSize
-        dialog = QFileDialog(self.widget)
-        fileSelect = QFileDialog.getOpenFileName(self.widget,
+        dialog = QFileDialog(self)
+        fileSelect = QFileDialog.getOpenFileName(self,
                         "Open File", "","All Files (*);;Python Files (*.py)")
         size = getSize([fileSelect[0]])
-        buttonReply = QMessageBox.question(self.widget, 'Message Box', "Upload " + fileSelect[0],
+        buttonReply = QMessageBox.question(self, 'Message Box', "Upload " + fileSelect[0],
                                            QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
         if buttonReply == QMessageBox.Yes:
             try:
-                parentColl = self.ic.session.collections.get("/"+self.widget.inputPath.text().strip("/"))
+                parentColl = self.ic.session.collections.get("/"+self.inputPath.text().strip("/"))
                 print("Upload "+fileSelect[0]+" to "+parentColl.path+" on resource "+self.ic.defaultResc)
                 self.ic.uploadData(fileSelect[0], parentColl,
                         None, size, force=True)
                 self.loadTable()
             except NetworkException:
-                self.widget.errorLabel.setText(
+                self.errorLabel.setText(
                     "IRODS NETWORK ERROR: No Connection, please check network")
             except Exception as error:
                 print("ERROR upload :", fileSelect[0], "failed; \n\t", repr(error))
-                self.widget.errorLabel.setText(repr(error))
+                self.errorLabel.setText(repr(error))
         else:
             pass
 
     def fileDownload(self):
         #If table is filled
-        if self.widget.collTable.item(self.currentBrowserRow, 1) != None:
-            objName = self.widget.collTable.item(self.currentBrowserRow, 1).text()
-            if self.widget.collTable.item(self.currentBrowserRow, 0).text() == '':
-                parent = self.widget.inputPath.text()
+        if self.collTable.item(self.currentBrowserRow, 1) != None:
+            objName = self.collTable.item(self.currentBrowserRow, 1).text()
+            if self.collTable.item(self.currentBrowserRow, 0).text() == '':
+                parent = self.inputPath.text()
             else:
-                parent = self.widget.collTable.item(self.currentBrowserRow, 0).text()
+                parent = self.collTable.item(self.currentBrowserRow, 0).text()
             try:
                 if self.ic.session.data_objects.exists(parent+'/'+objName):
                     downloadDir = getDownloadDir()
-                    buttonReply = QMessageBox.question(self.widget,
+                    buttonReply = QMessageBox.question(self,
                                 'Message Box',
                                 'Download\n'+parent+'/'+objName+'\tto\n'+downloadDir)
                     if buttonReply == QMessageBox.Yes:
                         obj = self.ic.session.data_objects.get(parent+'/'+objName)
                         self.ic.downloadData(obj, downloadDir, obj.size)
-                        self.widget.errorLabel.setText("File downloaded to: "+downloadDir)
+                        self.errorLabel.setText("File downloaded to: "+downloadDir)
             except NetworkException:
-                self.widget.errorLabel.setText(
+                self.errorLabel.setText(
                     "IRODS NETWORK ERROR: No Connection, please check network")
             except Exception as error:
                 print("ERROR download :", parent+'/'+objName, "failed; \n\t", repr(error))
-                self.widget.errorLabel.setText(repr(error))
+                self.errorLabel.setText(repr(error))
 
 
     #@QtCore.pyqtSlot(QtCore.QModelIndex)
     def editMetadata(self, index):
         self.__clearErrorLabel()
-        self.widget.metaValueField.clear()
-        self.widget.metaUnitsField.clear()
+        self.metaValueField.clear()
+        self.metaUnitsField.clear()
         row = index.row()
-        key = self.widget.metadataTable.item(row, 0).text()
-        value = self.widget.metadataTable.item(row, 1).text()
-        units = self.widget.metadataTable.item(row, 2).text()
-        self.widget.metaKeyField.setText(key)
-        self.widget.metaValueField.setText(value)
-        self.widget.metaUnitsField.setText(units)
+        key = self.metadataTable.item(row, 0).text()
+        value = self.metadataTable.item(row, 1).text()
+        units = self.metadataTable.item(row, 2).text()
+        self.metaKeyField.setText(key)
+        self.metaValueField.setText(value)
+        self.metaUnitsField.setText(units)
         self.currentMetadata = (key, value, units)
 
 
     #@QtCore.pyqtSlot(QtCore.QModelIndex)
     def editACL(self, index):
         self.__clearErrorLabel()
-        self.widget.aclUserField.clear()
-        self.widget.aclZoneField.clear()
-        self.widget.aclBox.setCurrentText("----")
+        self.aclUserField.clear()
+        self.aclZoneField.clear()
+        self.aclBox.setCurrentText("----")
         row = index.row()
-        user = self.widget.aclTable.item(row, 0).text()
-        zone = self.widget.aclTable.item(row, 1).text()
-        acl = self.widget.aclTable.item(row, 2).text()
-        self.widget.aclUserField.setText(user)
-        self.widget.aclZoneField.setText(zone)
-        self.widget.aclBox.setCurrentText(acl)
+        user = self.aclTable.item(row, 0).text()
+        zone = self.aclTable.item(row, 1).text()
+        acl = self.aclTable.item(row, 2).text()
+        self.aclUserField.setText(user)
+        self.aclZoneField.setText(zone)
+        self.aclBox.setCurrentText(acl)
         self.currentAcl = (user, acl)
 
 
     def updateIcatAcl(self):
-        self.widget.errorLabel.clear()
-        user = self.widget.aclUserField.text()
-        rights = self.widget.aclBox.currentText()
-        recursive = self.widget.recurseBox.currentText() == 'True'
-        if self.widget.collTable.item(self.currentBrowserRow, 0).text() == '':
-            parent = self.widget.inputPath.text()
+        self.errorLabel.clear()
+        user = self.aclUserField.text()
+        rights = self.aclBox.currentText()
+        recursive = self.recurseBox.currentText() == 'True'
+        if self.collTable.item(self.currentBrowserRow, 0).text() == '':
+            parent = self.inputPath.text()
         else:
-            parent = self.widget.collTable.item(self.currentBrowserRow, 0).text()
-        cell = self.widget.collTable.item(self.currentBrowserRow, 1).text()
-        zone = self.widget.aclZoneField.text()
+            parent = self.collTable.item(self.currentBrowserRow, 0).text()
+        cell = self.collTable.item(self.currentBrowserRow, 1).text()
+        zone = self.aclZoneField.text()
         try:
             self.ic.setPermissions(rights, user, "/"+parent.strip("/")+"/"+cell.strip("/"), zone, recursive)
             self.__fillACLs(cell, parent)
 
         except NetworkException:
-            self.widget.errorLabel.setText(
+            self.errorLabel.setText(
                     "IRODS NETWORK ERROR: No Connection, please check network")
 
         except Exception as error:
-            self.widget.errorLabel.setText(repr(error))
+            self.errorLabel.setText(repr(error))
 
 
     def updateIcatMeta(self):
-        self.widget.errorLabel.clear()
-        newKey = self.widget.metaKeyField.text()
-        newVal = self.widget.metaValueField.text()
-        newUnits = self.widget.metaUnitsField.text()
+        self.errorLabel.clear()
+        newKey = self.metaKeyField.text()
+        newVal = self.metaValueField.text()
+        newUnits = self.metaUnitsField.text()
         try:
             if not (newKey == "" or newVal == ""):
-                if self.widget.collTable.item(self.currentBrowserRow, 0).text() == '':
-                    parent = self.widget.inputPath.text()
+                if self.collTable.item(self.currentBrowserRow, 0).text() == '':
+                    parent = self.inputPath.text()
                 else:
-                    parent = self.widget.collTable.item(self.currentBrowserRow, 0).text()
+                    parent = self.collTable.item(self.currentBrowserRow, 0).text()
 
-                cell = self.widget.collTable.item(self.currentBrowserRow, 1).text()
+                cell = self.collTable.item(self.currentBrowserRow, 1).text()
                 if cell.endswith("/"):
                     item = self.ic.session.collections.get("/"+parent.strip("/")+"/"+cell.strip("/"))
                 else:
@@ -493,25 +492,25 @@ class irodsBrowser():
                 self.__fillResc(cell, parent)
 
         except NetworkException:
-            self.widget.errorLabel.setText(
+            self.errorLabel.setText(
                     "IRODS NETWORK ERROR: No Connection, please check network")
         except Exception as error:
-            self.widget.errorLabel.setText(repr(error))
+            self.errorLabel.setText(repr(error))
 
 
     def addIcatMeta(self):
-        self.widget.errorLabel.clear()
-        newKey = self.widget.metaKeyField.text()
-        newVal = self.widget.metaValueField.text()
-        newUnits = self.widget.metaUnitsField.text()
+        self.errorLabel.clear()
+        newKey = self.metaKeyField.text()
+        newVal = self.metaValueField.text()
+        newUnits = self.metaUnitsField.text()
         if not (newKey == "" or newVal == ""):
             try:
-                if self.widget.collTable.item(self.currentBrowserRow, 0).text() == '':
-                    parent = self.widget.inputPath.text()
+                if self.collTable.item(self.currentBrowserRow, 0).text() == '':
+                    parent = self.inputPath.text()
                 else:
-                    parent = self.widget.collTable.item(self.currentBrowserRow, 0).text()
+                    parent = self.collTable.item(self.currentBrowserRow, 0).text()
 
-                cell = self.widget.collTable.item(self.currentBrowserRow, 1).text()
+                cell = self.collTable.item(self.currentBrowserRow, 1).text()
                 if cell.endswith("/"):
                     item = self.ic.session.collections.get("/"+parent.strip("/")+"/"+cell.strip("/"))
                 else:
@@ -520,26 +519,26 @@ class irodsBrowser():
                 self.__fillMetadata(cell, parent)
                 self.__fillResc(cell, parent)
             except NetworkException:
-                self.widget.errorLabel.setText(
+                self.errorLabel.setText(
                     "IRODS NETWORK ERROR: No Connection, please check network")
 
             except Exception as error:
-                self.widget.errorLabel.setText(repr(error))
+                self.errorLabel.setText(repr(error))
 
 
     def deleteIcatMeta(self):
-        self.widget.errorLabel.clear()
-        key = self.widget.metaKeyField.text()
-        val = self.widget.metaValueField.text()
-        units = self.widget.metaUnitsField.text()
+        self.errorLabel.clear()
+        key = self.metaKeyField.text()
+        val = self.metaValueField.text()
+        units = self.metaUnitsField.text()
         try:
             if not (key == "" or val == ""):
-                if self.widget.collTable.item(self.currentBrowserRow, 0).text() == '':
-                    parent = self.widget.inputPath.text()
+                if self.collTable.item(self.currentBrowserRow, 0).text() == '':
+                    parent = self.inputPath.text()
                 else:
-                    parent = self.widget.collTable.item(self.currentBrowserRow, 0).text()
+                    parent = self.collTable.item(self.currentBrowserRow, 0).text()
 
-                cell = self.widget.collTable.item(self.currentBrowserRow, 1).text()
+                cell = self.collTable.item(self.currentBrowserRow, 1).text()
                 if cell.endswith("/"):
                     item = self.ic.session.collections.get("/"+parent.strip("/")+"/"+cell.strip("/"))
                 else:
@@ -547,9 +546,9 @@ class irodsBrowser():
                 self.ic.deleteMetadata([item], key, val, units)
                 self.__fillMetadata(cell, parent)
         except NetworkException:
-            self.widget.errorLabel.setText(
+            self.errorLabel.setText(
                     "IRODS NETWORK ERROR: No Connection, please check network")
 
         except Exception as error:
-            self.widget.errorLabel.setText(repr(error))
+            self.errorLabel.setText(repr(error))
 
diff --git a/gui/irodsCreateTicket.py b/gui/irodsCreateTicket.py
index 8678c334fda1c3539497103193836f2fb98668df..3fbe1e5993ff66479e8874fdfa8e764906c76412 100644
--- a/gui/irodsCreateTicket.py
+++ b/gui/irodsCreateTicket.py
@@ -1,64 +1,68 @@
 from PyQt5 import QtGui, QtCore
+from PyQt5.QtWidgets import QWidget
+
 from gui.irodsTreeView  import IrodsModel
+from gui.ui_files.tabTicketCreate import Ui_tabticketCreate
 
-class irodsCreateTicket():
-    def __init__(self, widget, ic, ienv):
 
-        self.ic = ic
-        self.widget = widget
+class irodsCreateTicket(QWidget, Ui_tabticketCreate):
+    def __init__(self, ic, ienv):
+        super(irodsCreateTicket, self).__init__()
+        super(irodsCreateTicket, self).setupUi(self)
 
-        self.irodsmodel = IrodsModel(ic, self.widget.irodsFsTreeView)
-        self.widget.irodsFsTreeView.setModel(self.irodsmodel)
+        self.ic = ic
+        self.irodsmodel = IrodsModel(ic, self.irodsFsTreeView)
+        self.irodsFsTreeView.setModel(self.irodsmodel)
         self.irodsRootColl = '/'+ic.session.zone
         self.irodsmodel.setHorizontalHeaderLabels([self.irodsRootColl,
                                               'Level', 'iRODS ID',
                                               'parent ID', 'type'])
-        self.widget.irodsFsTreeView.expanded.connect(self.irodsmodel.refreshSubTree)
-        self.widget.irodsFsTreeView.clicked.connect(self.irodsmodel.refreshSubTree)
+        self.irodsFsTreeView.expanded.connect(self.irodsmodel.refreshSubTree)
+        self.irodsFsTreeView.clicked.connect(self.irodsmodel.refreshSubTree)
         self.irodsmodel.initTree()
 
-        self.widget.irodsFsTreeView.setHeaderHidden(True)
-        self.widget.irodsFsTreeView.header().setDefaultSectionSize(180)
-        self.widget.irodsFsTreeView.setColumnHidden(1, True)
-        self.widget.irodsFsTreeView.setColumnHidden(2, True)
-        self.widget.irodsFsTreeView.setColumnHidden(3, True)
-        self.widget.irodsFsTreeView.setColumnHidden(4, True)
+        self.irodsFsTreeView.setHeaderHidden(True)
+        self.irodsFsTreeView.header().setDefaultSectionSize(180)
+        self.irodsFsTreeView.setColumnHidden(1, True)
+        self.irodsFsTreeView.setColumnHidden(2, True)
+        self.irodsFsTreeView.setColumnHidden(3, True)
+        self.irodsFsTreeView.setColumnHidden(4, True)
 
-        self.widget.createTicketButton.clicked.connect(self.createTicket)
+        self.createTicketButton.clicked.connect(self.createTicket)
 
     def createTicket(self):
-        self.widget.infoLabel.clear()
-        self.widget.ticketInfoBrowser.clear()
-        self.widget.setCursor(QtGui.QCursor(QtCore.Qt.WaitCursor))
-        self.widget.createTicketButton.setEnabled(False)
+        self.infoLabel.clear()
+        self.ticketInfoBrowser.clear()
+        self.setCursor(QtGui.QCursor(QtCore.Qt.WaitCursor))
+        self.createTicketButton.setEnabled(False)
 
         #gather info
         idx, path = self.irodsmodel.get_checked()
         if path == None or self.ic.session.data_objects.exists(path):
-            self.widget.infoLabel.setText("ERROR: Please select a collection.")
-            self.widget.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
-            self.widget.createTicketButton.setEnabled(True)
+            self.infoLabel.setText("ERROR: Please select a collection.")
+            self.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
+            self.createTicketButton.setEnabled(True)
             return
 
         acls = [(acl.user_name, acl.access_name) for acl in self.ic.getPermissions(path)]
         if (self.ic.session.username, "own") in acls:
-            date = self.widget.calendar.selectedDate()
+            date = self.calendar.selectedDate()
             #format of time string for irods: 2012-05-07.23:00:00
             expiryString = str(date.toPyDate())+'.23:59:59'
             ticket, expiryDate = self.ic.createTicket(path, expiryString)
-            self.widget.ticketInfoBrowser.append("iRODS server: \t"+self.ic.session.host)
-            self.widget.ticketInfoBrowser.append("iRODS path:\t"+path)
-            self.widget.ticketInfoBrowser.append("iRODS Ticket:\t"+ticket)
+            self.ticketInfoBrowser.append("iRODS server: \t"+self.ic.session.host)
+            self.ticketInfoBrowser.append("iRODS path:\t"+path)
+            self.ticketInfoBrowser.append("iRODS Ticket:\t"+ticket)
             if self.ic.__name__ == "irodsConnector":
-                self.widget.ticketInfoBrowser.append("Expiry date:\tNot set (linux only)")
+                self.ticketInfoBrowser.append("Expiry date:\tNot set (linux only)")
             else:
-                self.widget.ticketInfoBrowser.append("Expiry date:\t"+expiryDate)
+                self.ticketInfoBrowser.append("Expiry date:\t"+expiryDate)
 
         else:
-            self.widget.infoLabel.setText("ERROR: Insufficient rights, you need to be owner.")
-            self.widget.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
-            self.widget.createTicketButton.setEnabled(True)
+            self.infoLabel.setText("ERROR: Insufficient rights, you need to be owner.")
+            self.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
+            self.createTicketButton.setEnabled(True)
             return
     
-        self.widget.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
-        self.widget.createTicketButton.setEnabled(True)
+        self.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
+        self.createTicketButton.setEnabled(True)
diff --git a/gui/irodsDataCompression.py b/gui/irodsDataCompression.py
index 8d4860452d4418f5d0ed3fe3abf5660fb6819517..7598c08bf72888dfa7995b70e934a573bafba4f0 100644
--- a/gui/irodsDataCompression.py
+++ b/gui/irodsDataCompression.py
@@ -1,18 +1,19 @@
-from gui.irodsTreeView  import IrodsModel
-from gui.popupWidgets import irodsIndexPopup
-
-from PyQt5.QtWidgets import QMessageBox
-from PyQt5.uic import loadUi
+from PyQt5.QtWidgets import QMessageBox, QWidget
 from PyQt5.QtCore import QObject, QThread, pyqtSlot, pyqtSignal
 from PyQt5 import QtGui, QtCore
-
 from os import path, getcwd
 import json
+import sys
 
-class irodsDataCompression():
-    def __init__(self, widget, ic, ienv):
+from gui.irodsTreeView  import IrodsModel
+from gui.popupWidgets import irodsIndexPopup
+from gui.ui_files.tabDataCompression import Ui_tabDataCompression
+
+class irodsDataCompression(QWidget, Ui_tabDataCompression):
+    def __init__(self, ic, ienv):
+        super(irodsDataCompression, self).__init__()
+        super(irodsDataCompression, self).setupUi(self)
         self.ic = ic
-        self.widget = widget
         self.ienv = ienv
         rescs = self.ic.listResources()
         if ic.defaultResc not in rescs:
@@ -21,41 +22,46 @@ class irodsDataCompression():
                            +'\nDataCompression view not setup.')
             return
 
-        ruleFiles = [path.join(getcwd(),'rules/tarCollection.r'), 
-                     path.join(getcwd(),'rules/tarReadIndex.r'), 
-                     path.join(getcwd(),'rules/tarExtract.r')]
+        if getattr(sys, 'frozen', False):
+            self.basefolder = path.join(path.dirname(path.realpath(sys.argv[0])), path.pardir)
+        else:
+            self.basefolder = path.dirname(path.realpath(sys.argv[0]))
+
+        ruleFiles = [path.join(self.basefolder,'rules/tarCollection.r'), 
+                     path.join(self.basefolder,'rules/tarReadIndex.r'), 
+                     path.join(self.basefolder,'rules/tarExtract.r')]
         for rule in ruleFiles:
             if not path.isfile(rule):
                 self.infoPopup('ERROR rules not configured:\n'+rule\
                            +'\nDataCompression view not setup.')
                 return
 
-        self.widget.irodsZoneLabel1.setText("/"+self.ic.session.zone+":")
-        self.widget.irodsZoneLabel2.setText("/"+self.ic.session.zone+":")
+        self.irodsZoneLabel1.setText("/"+self.ic.session.zone+":")
+        self.irodsZoneLabel2.setText("/"+self.ic.session.zone+":")
         self.irodsRootColl = '/'+ic.session.zone
-        index = self.widget.decompressRescButton.findText(ic.defaultResc)
-        self.widget.decompressRescButton.setCurrentIndex(index)
+        index = self.decompressRescButton.findText(ic.defaultResc)
+        self.decompressRescButton.setCurrentIndex(index)
 
         #irodsCollectionTree
-        self.collectionTreeModel = self.setupFsTree(self.widget.irodsCollectionTree)
-        self.widget.irodsCollectionTree.expanded.connect(self.collectionTreeModel.refreshSubTree)
-        #self.widget.irodsCollectionTree.clicked.connect(self.collectionTreeModel.refreshSubTree)
+        self.collectionTreeModel = self.setupFsTree(self.irodsCollectionTree)
+        self.irodsCollectionTree.expanded.connect(self.collectionTreeModel.refreshSubTree)
+        #self.irodsCollectionTree.clicked.connect(self.collectionTreeModel.refreshSubTree)
         #irodsCompressionTree
-        self.compressionTreeModel = self.setupFsTree(self.widget.irodsCompressionTree)
-        self.widget.irodsCompressionTree.expanded.connect(self.compressionTreeModel.refreshSubTree)
-        #self.widget.irodsCompressionTree.clicked.connect(self.compressionTreeModel.refreshSubTree)
+        self.compressionTreeModel = self.setupFsTree(self.irodsCompressionTree)
+        self.irodsCompressionTree.expanded.connect(self.compressionTreeModel.refreshSubTree)
+        #self.irodsCompressionTree.clicked.connect(self.compressionTreeModel.refreshSubTree)
         #resource buttons
-        self.setupResourceButton(self.widget.compressRescButton)
-        self.setupResourceButton(self.widget.decompressRescButton)
+        self.setupResourceButton(self.compressRescButton)
+        self.setupResourceButton(self.decompressRescButton)
 
         #Create/Unpack/Index buttons
-        self.widget.createButton.clicked.connect(self.createDataBundle)
-        self.widget.unpackButton.clicked.connect(self.unpackDataBundle)
-        self.widget.indexButton.clicked.connect(self.getIndex)
+        self.createButton.clicked.connect(self.createDataBundle)
+        self.unpackButton.clicked.connect(self.unpackDataBundle)
+        self.indexButton.clicked.connect(self.getIndex)
         
 
     def infoPopup(self, message):
-        QMessageBox.information(self.widget, 'Information', message)
+        QMessageBox.information(self, 'Information', message)
 
 
     def setupFsTree(self, treeView):
@@ -87,39 +93,39 @@ class irodsDataCompression():
             button.setCurrentIndex(index)
 
     def enableButtons(self, enable):
-        self.widget.compressRescButton.setEnabled(enable)
-        self.widget.decompressRescButton.setEnabled(enable)
+        self.compressRescButton.setEnabled(enable)
+        self.decompressRescButton.setEnabled(enable)
         #Create/Unpack/Index buttons
-        self.widget.createButton.setEnabled(enable)
-        self.widget.unpackButton.setEnabled(enable)
-        self.widget.indexButton.setEnabled(enable)
+        self.createButton.setEnabled(enable)
+        self.unpackButton.setEnabled(enable)
+        self.indexButton.setEnabled(enable)
 
 
     def createDataBundle(self):
-        self.widget.setCursor(QtGui.QCursor(QtCore.Qt.WaitCursor))
+        self.setCursor(QtGui.QCursor(QtCore.Qt.WaitCursor))
         self.enableButtons(False)
 
-        self.widget.createStatusLabel.clear()
-        ruleFile = path.join(getcwd(),'rules/tarCollection.r')
+        self.createStatusLabel.clear()
+        ruleFile = path.join(self.basefolder,'rules/tarCollection.r')
         idx, source = self.collectionTreeModel.get_checked()
 
         if not self.ic.session.collections.exists(source):
-            self.widget.createStatusLabel.setText("ERROR: No collection selected.")
-            self.widget.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
+            self.createStatusLabel.setText("ERROR: No collection selected.")
+            self.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
             self.enableButtons(True)
             return
 
         #data bundling only allowed for collections in home/user
         if len(source.split('/')) < 5:
-            self.widget.createStatusLabel.setText(
+            self.createStatusLabel.setText(
                     "ERROR: Selected collection is not a user collection.")
-            self.widget.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
+            self.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
             self.enableButtons(True)
             return
 
-        compress = self.widget.compressCheckBox.isChecked()
-        remove = self.widget.removeCheckBox.isChecked()
-        migrateResc = self.widget.compressRescButton.currentText()
+        compress = self.compressCheckBox.isChecked()
+        remove = self.removeCheckBox.isChecked()
+        migrateResc = self.compressRescButton.currentText()
         params = {
                 '*coll': '"'+source+'"',
                 '*resource': '"'+migrateResc+'"',
@@ -128,7 +134,7 @@ class irodsDataCompression():
                 }
 
         self.threadCreate = QThread()
-        self.widget.createStatusLabel.setText("STATUS: compressing "+source)
+        self.createStatusLabel.setText("STATUS: compressing "+source)
         self.worker = dataBundleCreateExtract(self.ic, ruleFile, params, "create")
         self.worker.moveToThread(self.threadCreate)
         self.threadCreate.started.connect(self.worker.run)
@@ -140,55 +146,55 @@ class irodsDataCompression():
 
 
     def dataCreateExtractFinished(self, success, message, operation):
-        self.widget.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
+        self.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
         self.enableButtons(True)
         stdout, stderr = message
         if success and operation == "create":
             idx, source = self.collectionTreeModel.get_checked()
-            self.widget.createStatusLabel.setText("STATUS: Created " + str(stdout))
+            self.createStatusLabel.setText("STATUS: Created " + str(stdout))
             parentIdx = self.collectionTreeModel.getParentIdx(idx)
             self.collectionTreeModel.refreshSubTree(parentIdx)
         elif not success and operation == "create":
-            self.widget.createStatusLabel.setText("ERROR: Create failed: " + str(stderr))
+            self.createStatusLabel.setText("ERROR: Create failed: " + str(stderr))
         elif success and operation == "extract":
             idx, source = self.compressionTreeModel.get_checked()
             stdout, stderr = message
-            self.widget.unpackStatusLabel.setText("STATUS: Extracted " + str(stdout))
+            self.unpackStatusLabel.setText("STATUS: Extracted " + str(stdout))
             parentIdx = self.compressionTreeModel.getParentIdx(idx)
             self.compressionTreeModel.refreshSubTree(parentIdx)
         elif not success and operation == "extract":
-            self.widget.unpackStatusLabel.setText("ERROR: Create failed: " + str(stderr))
+            self.unpackStatusLabel.setText("ERROR: Create failed: " + str(stderr))
 
 
     def unpackDataBundle(self):
-        self.widget.setCursor(QtGui.QCursor(QtCore.Qt.WaitCursor))
+        self.setCursor(QtGui.QCursor(QtCore.Qt.WaitCursor))
         idx, source = self.compressionTreeModel.get_checked()
 
         if not idx or (not source.endswith(".irods.tar") and not source.endswith(".irods.zip")):
-            self.widget.unpackStatusLabel.setText("ERROR: No *.irods.tar or *.irods.zip selected")
-            self.widget.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
+            self.unpackStatusLabel.setText("ERROR: No *.irods.tar or *.irods.zip selected")
+            self.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
             return
         extractPath = path.dirname(source)+'/'+path.basename(source).split('.irods')[0]
         if self.ic.session.collections.exists(extractPath):
             extractColl = self.ic.session.collections.get(extractPath)
             if extractColl.subcollections != [] or extractColl.data_objects != []:
-                self.widget.unpackStatusLabel.setText("ERROR: Destination not empty: "+extractPath)
-                self.widget.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
+                self.unpackStatusLabel.setText("ERROR: Destination not empty: "+extractPath)
+                self.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
                 return
 
         self.enableButtons(False)
 
-        self.widget.unpackStatusLabel.clear()
-        ruleFile = path.join(getcwd(),'rules/tarExtract.r')
+        self.unpackStatusLabel.clear()
+        ruleFile = path.join(self.basefolder,'rules/tarExtract.r')
 
-        migrateResc = self.widget.decompressRescButton.currentText()
+        migrateResc = self.decompressRescButton.currentText()
         params = {
                 '*obj': '"'+source+'"',
                 '*resource': '"'+migrateResc+'"',
                 }
 
         self.threadExtract = QThread()
-        self.widget.unpackStatusLabel.setText("STATUS: extracting "+source)
+        self.unpackStatusLabel.setText("STATUS: extracting "+source)
         self.worker = dataBundleCreateExtract(self.ic, ruleFile, params, "extract")
         self.worker.moveToThread(self.threadExtract)
         self.threadExtract.started.connect(self.worker.run)
@@ -200,23 +206,23 @@ class irodsDataCompression():
 
 
     def getIndex(self):
-        self.widget.unpackStatusLabel.clear()
-        ruleFile = path.join(getcwd(),'rules/tarReadIndex.r')
+        self.unpackStatusLabel.clear()
+        ruleFile = path.join(self.basefolder,'rules/tarReadIndex.r')
 
         idx, source = self.compressionTreeModel.get_checked()
         if source == None:
-            self.widget.unpackStatusLabel.setText("ERROR: No *.irods.tar or *.irods.zip selected")
+            self.unpackStatusLabel.setText("ERROR: No *.irods.tar or *.irods.zip selected")
             return
         if not source.endswith(".irods.tar") and not source.endswith(".irods.zip"):
-            self.widget.unpackStatusLabel.setText("ERROR: No *.irods.tar or *.irods.zip selected")
+            self.unpackStatusLabel.setText("ERROR: No *.irods.tar or *.irods.zip selected")
             return
 
         params = {
                 '*path': '"'+source+'"'
                 }
         stdout, stderr = self.ic.executeRule(ruleFile, params)
-        self.widget.unpackStatusLabel.setText("INFO: Loaded Index of "+source)
-        indexPopup = irodsIndexPopup(self.ic, stdout[1:], source, self.widget.unpackStatusLabel)
+        self.unpackStatusLabel.setText("INFO: Loaded Index of "+source)
+        indexPopup = irodsIndexPopup(self.ic, stdout[1:], source, self.unpackStatusLabel)
         indexPopup.exec_()
 
 
diff --git a/gui/irodsInfo.py b/gui/irodsInfo.py
index 6b00abc59174cf52ebedcf828c3c2d745482cb8e..2a4da6e61aa03d10c3a136db04be0b4a0e028fac 100644
--- a/gui/irodsInfo.py
+++ b/gui/irodsInfo.py
@@ -2,36 +2,36 @@ from PyQt5 import QtWidgets
 from PyQt5 import QtCore
 from PyQt5 import QtGui
 
-class irodsInfo():
-    def __init__(self, widget, ic):
+from gui.ui_files.tabInfo import Ui_tabInfo
 
+class irodsInfo(QtWidgets.QWidget, Ui_tabInfo):
+    def __init__(self, ic):
+        super(irodsInfo, self).__init__()
+        super(irodsInfo, self).setupUi(self)        
         self.ic = ic
-        self.widget = widget
-
-        self.widget.refreshButton.clicked.connect(self.refreshInfo)
+        self.refreshButton.clicked.connect(self.refreshInfo)
         self.refreshInfo()
 
 
     def refreshInfo(self):
-
-        self.widget.rescTable.setRowCount(0)
-        self.widget.setCursor(QtGui.QCursor(QtCore.Qt.WaitCursor))
+        self.rescTable.setRowCount(0)
+        self.setCursor(QtGui.QCursor(QtCore.Qt.WaitCursor))
 
         #irods Zone
-        self.widget.zoneLabel.setText(self.ic.session.zone)
+        self.zoneLabel.setText(self.ic.session.zone)
         #irods user
-        self.widget.userLabel.setText(self.ic.session.username)
+        self.userLabel.setText(self.ic.session.username)
         #irods user type and groups
         userType, userGroups = self.ic.getUserInfo()
         groupNames = [x for x in userGroups if not isinstance(x, int)]
-        self.widget.typeLabel.setText(userType[0])
-        self.widget.groupsLabel.setText('\n'.join(groupNames))
+        self.typeLabel.setText(userType[0])
+        self.groupsLabel.setText('\n'.join(groupNames))
         #defaul resource
-        self.widget.rescLabel.setText(self.ic.defaultResc)
+        self.rescLabel.setText(self.ic.defaultResc)
         
         #irods server and version
-        self.widget.serverLabel.setText(self.ic.session.host)
-        self.widget.versionLabel.setText(
+        self.serverLabel.setText(self.ic.session.host)
+        self.versionLabel.setText(
             '.'.join(str(num) for num in self.ic.session.server_version))
         #irods resources
         resourceNames = self.ic.listResources()
@@ -43,13 +43,13 @@ class irodsInfo():
             else:
                 resources.append((name, "no information"))
 
-        self.widget.rescTable.setRowCount(len(resources))
+        self.rescTable.setRowCount(len(resources))
         row = 0
         for rescName, rescSize in resources:
             resc = self.ic.getResource(rescName)
-            self.widget.rescTable.setItem(row, 0, QtWidgets.QTableWidgetItem(rescName))
-            self.widget.rescTable.setItem(row, 1, QtWidgets.QTableWidgetItem(rescSize))
-            self.widget.rescTable.setItem(row, 2, QtWidgets.QTableWidgetItem(resc.status))
+            self.rescTable.setItem(row, 0, QtWidgets.QTableWidgetItem(rescName))
+            self.rescTable.setItem(row, 1, QtWidgets.QTableWidgetItem(rescSize))
+            self.rescTable.setItem(row, 2, QtWidgets.QTableWidgetItem(resc.status))
             row = row + 1
-        self.widget.rescTable.resizeColumnsToContents()
-        self.widget.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
+        self.rescTable.resizeColumnsToContents()
+        self.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
diff --git a/gui/irodsSearch.py b/gui/irodsSearch.py
index bd1d1d98ea2b303b1a9a5bdc0616b2a3554efec6..97d35939da130dcfc21a323d06eb75b6c0bb9b95 100644
--- a/gui/irodsSearch.py
+++ b/gui/irodsSearch.py
@@ -2,13 +2,17 @@ from PyQt5 import QtWidgets, QtGui, QtCore
 from PyQt5.QtWidgets import QDialog, QMessageBox
 from PyQt5.uic import loadUi
 import os
+
 from utils.utils import getDownloadDir
+from gui.ui_files.searchDialog import Ui_searchDialog
 import logging
 
-class irodsSearch(QDialog):
+
+class irodsSearch(QDialog, Ui_searchDialog):
     def __init__(self, ic, collTable):
         super(irodsSearch, self).__init__()
-        loadUi("gui/ui-files/searchDialog.ui", self)
+        super(irodsSearch, self).setupUi(self)
+        #loadUi("gui/ui-files/searchDialog.ui", self)
         self.ic = ic
         self.keys = [self.key1, self.key2, self.key3, self.key4, self.key5]
         self.vals = [self.val1, self.val2, self.val3, self.val4, self.val5]
diff --git a/gui/irodsTicketLogin.py b/gui/irodsTicketLogin.py
index ed2858d5c2a1e2a81d4d9d00337f00f7023e13ed..7b7e4ec0563edd8c4f5c7c1e47c27af9acaee66c 100644
--- a/gui/irodsTicketLogin.py
+++ b/gui/irodsTicketLogin.py
@@ -1,47 +1,49 @@
 from PyQt5 import QtWidgets
-from PyQt5.QtWidgets import QMainWindow, QHeaderView, QMessageBox
+from PyQt5.QtWidgets import QMainWindow, QHeaderView, QMessageBox, QWidget
 from PyQt5 import QtCore
-from PyQt5.uic import loadUi
+import os
+
 from utils.irodsConnectorAnonymous import irodsConnectorAnonymous
 from gui.checkableFsTree import checkableFsTreeModel
 from gui.popupWidgets import createDirectory
 from gui.dataTransfer import dataTransfer
+from gui.ui_files.tabTicketAccess import Ui_tabTicketAccess
 
-import os
 
-class irodsTicketLogin():
-    def __init__(self, widget):
+class irodsTicketLogin(QWidget, Ui_tabTicketAccess):
+    def __init__(self):
+        super(irodsTicketLogin, self).__init__()
+        super(irodsTicketLogin, self).setupUi(self)
         self.ic = None
         self.coll = None
-        self.widget = widget
 
         # QTreeViews
-        self.dirmodel = checkableFsTreeModel(self.widget.localFsTreeView)
-        self.widget.localFsTreeView.setModel(self.dirmodel)
+        self.dirmodel = checkableFsTreeModel(self.localFsTreeView)
+        self.localFsTreeView.setModel(self.dirmodel)
         # Hide all columns except the Name
-        self.widget.localFsTreeView.setColumnHidden(1, True)
-        self.widget.localFsTreeView.setColumnHidden(2, True)
-        self.widget.localFsTreeView.setColumnHidden(3, True)
-        self.widget.localFsTreeView.header().setSectionResizeMode(QHeaderView.ResizeToContents)
+        self.localFsTreeView.setColumnHidden(1, True)
+        self.localFsTreeView.setColumnHidden(2, True)
+        self.localFsTreeView.setColumnHidden(3, True)
+        self.localFsTreeView.header().setSectionResizeMode(QHeaderView.ResizeToContents)
         home_location = QtCore.QStandardPaths.standardLocations(
                                QtCore.QStandardPaths.HomeLocation)[0]
         index = self.dirmodel.setRootPath(home_location)
-        self.widget.localFsTreeView.setCurrentIndex(index)
+        self.localFsTreeView.setCurrentIndex(index)
         self.dirmodel.initial_expand()
 
-        self.widget.connectButton.clicked.connect(self.irodsSession)
-        self.widget.homeButton.clicked.connect(self.loadTable)
-        self.widget.createDirectoryButton.clicked.connect(self.createFolder)
-        self.widget.downloadButton.clicked.connect(self.download)
-        self.widget.downloadAllButton.clicked.connect(self.downloadAll)
-        self.widget.collTable.doubleClicked.connect(self.browse)
-        self.widget.collTable.clicked.connect(self.fillInfo)
+        self.connectButton.clicked.connect(self.irodsSession)
+        self.homeButton.clicked.connect(self.loadTable)
+        self.createDirectoryButton.clicked.connect(self.createFolder)
+        self.downloadButton.clicked.connect(self.download)
+        self.downloadAllButton.clicked.connect(self.downloadAll)
+        self.collTable.doubleClicked.connect(self.browse)
+        self.collTable.clicked.connect(self.fillInfo)
         self.enableButtons(False)
-        self.widget.connectButton.setEnabled(True)
+        self.connectButton.setEnabled(True)
 
 
     def irodsSession(self):
-        self.widget.infoLabel.clear()
+        self.infoLabel.clear()
         host = self.widget.serverEdit.text().strip()
         path = self.widget.pathEdit.text().strip()
         token = self.widget.ticketEdit.text().strip()
@@ -52,56 +54,56 @@ class irodsTicketLogin():
             self.loadTable()
             self.enableButtons(True)
         except Exception as e:
-            self.widget.infoLabel.setText("LOGIN ERROR: Check ticket and iRODS path.\n"+repr(e))
+            self.infoLabel.setText("LOGIN ERROR: Check ticket and iRODS path.\n"+repr(e))
 
 
     def enableButtons(self, enable):
-        self.widget.connectButton.setEnabled(enable)
-        self.widget.homeButton.setEnabled(enable)
-        self.widget.createDirectoryButton.setEnabled(enable)
-        self.widget.downloadButton.setEnabled(enable)
-        self.widget.downloadAllButton.setEnabled(enable)
-        self.widget.localFsTreeView.setEnabled(enable)
+        self.connectButton.setEnabled(enable)
+        self.homeButton.setEnabled(enable)
+        self.createDirectoryButton.setEnabled(enable)
+        self.downloadButton.setEnabled(enable)
+        self.downloadAllButton.setEnabled(enable)
+        self.localFsTreeView.setEnabled(enable)
 
     
     def loadTable(self, update = None):
-        self.widget.infoLabel.clear()
+        self.infoLabel.clear()
         if self.coll == None:
-            self.widget.infoLabel.setText("No data avalaible. Check ticket and iRODS path.")
+            self.infoLabel.setText("No data avalaible. Check ticket and iRODS path.")
             return
         if update == None or update == False:
             update = self.coll
 
-        self.widget.collTable.setRowCount(0)
-        self.widget.collTable.setRowCount(len(update.subcollections)+len(update.data_objects))
+        self.collTable.setRowCount(0)
+        self.collTable.setRowCount(len(update.subcollections)+len(update.data_objects))
         row = 0
         for subcoll in update.subcollections:
-            self.widget.collTable.setItem(row, 0, 
+            self.collTable.setItem(row, 0, 
                     QtWidgets.QTableWidgetItem(os.path.dirname(subcoll.path)))
-            self.widget.collTable.setItem(row, 1, 
+            self.collTable.setItem(row, 1, 
                     QtWidgets.QTableWidgetItem(subcoll.name+"/"))
-            self.widget.collTable.setItem(1, 2, QtWidgets.QTableWidgetItem(""))
-            self.widget.collTable.setItem(1, 3, QtWidgets.QTableWidgetItem(""))
+            self.collTable.setItem(1, 2, QtWidgets.QTableWidgetItem(""))
+            self.collTable.setItem(1, 3, QtWidgets.QTableWidgetItem(""))
             row = row + 1
         for obj in update.data_objects:
-            self.widget.collTable.setItem(row, 0,
+            self.collTable.setItem(row, 0,
                     QtWidgets.QTableWidgetItem(os.path.dirname(obj.path)))
-            self.widget.collTable.setItem(row, 1, QtWidgets.QTableWidgetItem(obj.name))
-            self.widget.collTable.setItem(row, 2, QtWidgets.QTableWidgetItem(str(obj.size)))
-            self.widget.collTable.setItem(row, 3, QtWidgets.QTableWidgetItem(str(obj.checksum)))
-            self.widget.collTable.setItem(row, 4, 
+            self.collTable.setItem(row, 1, QtWidgets.QTableWidgetItem(obj.name))
+            self.collTable.setItem(row, 2, QtWidgets.QTableWidgetItem(str(obj.size)))
+            self.collTable.setItem(row, 3, QtWidgets.QTableWidgetItem(str(obj.checksum)))
+            self.collTable.setItem(row, 4, 
                     QtWidgets.QTableWidgetItem(str(obj.modify_time)))
             row = row+1
-        self.widget.collTable.resizeColumnsToContents()
+        self.collTable.resizeColumnsToContents()
 
 
     def browse(self, index):
-        self.widget.infoLabel.clear()
+        self.infoLabel.clear()
         col = index.column()
         row = index.row()
-        if self.widget.collTable.item(row, 0).text() != '':
-            path = self.widget.collTable.item(row, 0).text()
-            item = self.widget.collTable.item(row, 1).text()
+        if self.collTable.item(row, 0).text() != '':
+            path = self.collTable.item(row, 0).text()
+            item = self.collTable.item(row, 1).text()
             if item.endswith('/'):
                 item = item[:-1]
             if self.ic.session.collections.exists(path+'/'+item):
@@ -110,16 +112,16 @@ class irodsTicketLogin():
 
 
     def fillInfo(self, index):
-        self.widget.previewBrowser.clear()
-        self.widget.metadataTable.setRowCount(0)
+        self.previewBrowser.clear()
+        self.metadataTable.setRowCount(0)
         row = index.row()
-        value = self.widget.collTable.item(row, 1).text()
-        path = self.widget.collTable.item(row, 0).text()
+        value = self.collTable.item(row, 1).text()
+        path = self.collTable.item(row, 0).text()
         try:
             self.__fillPreview(value, path)
             self.__fillMetadata(value, path)
         except Exception as e:
-            self.widget.infoLabel.setText(repr(e))
+            self.infoLabel.setText(repr(e))
             raise
 
 
@@ -132,7 +134,7 @@ class irodsTicketLogin():
                       ['\n', 'Data:', '-----------------']+\
                       [o.name for o in coll.data_objects]
             previewString = '\n'.join(content)
-            self.widget.previewBrowser.append(previewString)
+            self.previewBrowser.append(previewString)
         else: # object
             subcoll = self.ic.session.collections.get(path)
             obj = [o for o in subcoll.data_objects if o.name == value][0]
@@ -145,13 +147,13 @@ class irodsTicketLogin():
                         for i in range(20):
                             out.append(readObj.read(50))
                     previewString = ''.join([line.decode('utf-8') for line in out])
-                    self.widget.previewBrowser.append(previewString)
+                    self.previewBrowser.append(previewString)
                 except Exception as e:
-                    self.widget.previewBrowser.append(obj.path)
-                    self.widget.previewBrowser.append(repr(e))
-                    self.widget.previewBrowser.append("Storage resource might be down.")
+                    self.previewBrowser.append(obj.path)
+                    self.previewBrowser.append(repr(e))
+                    self.previewBrowser.append("Storage resource might be down.")
             else:
-                self.widget.previewBrowser.append("No preview for "+obj.path)
+                self.previewBrowser.append("No preview for "+obj.path)
 
 
     def __fillMetadata(self, value, path):
@@ -166,24 +168,24 @@ class irodsTicketLogin():
             subcoll = self.ic.session.collections.get(path)
             obj = [o for o in subcoll.data_objects if o.name == value][0]
             metadata = obj.metadata.items()
-        self.widget.metadataTable.setRowCount(len(metadata))
+        self.metadataTable.setRowCount(len(metadata))
         row = 0
         for item in metadata:
-            self.widget.metadataTable.setItem(row, 0,
+            self.metadataTable.setItem(row, 0,
                     QtWidgets.QTableWidgetItem(item.name))
-            self.widget.metadataTable.setItem(row, 1,
+            self.metadataTable.setItem(row, 1,
                     QtWidgets.QTableWidgetItem(item.value))
-            self.widget.metadataTable.setItem(row, 2,
+            self.metadataTable.setItem(row, 2,
                     QtWidgets.QTableWidgetItem(item.units))
             row = row+1
-        self.widget.metadataTable.resizeColumnsToContents()
+        self.metadataTable.resizeColumnsToContents()
 
 
     def createFolder(self):
-        self.widget.infoLabel.clear()
+        self.infoLabel.clear()
         parent = self.dirmodel.get_checked()
         if parent == None:
-            self.widget.infoLabel.setText("No parent folder selected.")
+            self.infoLabel.setText("No parent folder selected.")
         else:
             createDirWidget = createDirectory(parent)
             createDirWidget.exec_()
@@ -197,28 +199,28 @@ class irodsTicketLogin():
     def download(self, allData = False):
         #irods data
         self.enableButtons(False)
-        self.widget.infoLabel.clear()
+        self.infoLabel.clear()
         if allData:
             collPath = os.path.dirname(self.coll.path)
             dataName = self.coll.name.strip('/')
-        elif self.widget.collTable.selectedIndexes():
-            row = self.widget.collTable.selectedIndexes()[0].row()
+        elif self.collTable.selectedIndexes():
+            row = self.collTable.selectedIndexes()[0].row()
             if row == -1:
-                self.widget.infoLabel.setText("No iRODS data selected.")
+                self.infoLabel.setText("No iRODS data selected.")
                 self.enableButtons(True)
                 return
             else:
-                collPath = self.widget.collTable.item(row, 0).text()
-                dataName = self.widget.collTable.item(row, 1).text().strip('/')
+                collPath = self.collTable.item(row, 0).text()
+                dataName = self.collTable.item(row, 1).text().strip('/')
         else:
-            self.widget.infoLabel.setText("No iRODS data selected.")
+            self.infoLabel.setText("No iRODS data selected.")
             self.enableButtons(True)
             return
 
         #fielsystem data
         destination = self.dirmodel.get_checked()
         if destination == None or os.path.isfile(destination):
-            self.widget.infoLabel.setText("No download folder selected.")
+            self.infoLabel.setText("No download folder selected.")
             self.enableButtons(True)
             return
         
@@ -235,7 +237,7 @@ class irodsTicketLogin():
         #Refreshes iRODS sub tree ad irodsIdx (set "None" if to skip)
         #Saves upload parameters if check box is set
         if succes == True:
-            self.widget.infoLabel.setText("INFO UPLOAD/DOWLOAD: completed.")
+            self.infoLabel.setText("INFO UPLOAD/DOWLOAD: completed.")
         self.uploadWindow = None # Release
         self.enableButtons(True)
 
diff --git a/gui/irodsUpDownload.py b/gui/irodsUpDownload.py
index 53435e7fce4b8db14b577ad9fe619c7a040b1de0..37e92e2d60c799b086827cc85d81272ea38fbf60 100644
--- a/gui/irodsUpDownload.py
+++ b/gui/irodsUpDownload.py
@@ -1,109 +1,111 @@
-from PyQt5.QtWidgets import QMainWindow, QHeaderView, QMessageBox
+from PyQt5.QtWidgets import QMainWindow, QHeaderView, QMessageBox, QWidget
 from PyQt5 import QtCore
 import os
 
+from utils.utils import getSize, saveIenv
 from gui.checkableFsTree import checkableFsTreeModel
 from gui.irodsTreeView  import IrodsModel
-from utils.utils import getSize, saveIenv
 from gui.continousUpload import contUpload
-
 from gui.popupWidgets import irodsCreateCollection, createDirectory
 from gui.dataTransfer import dataTransfer
+from gui.ui_files.tabUpDownload import Ui_tabUpDownload
+
+class irodsUpDownload(QWidget, Ui_tabUpDownload):
+    def __init__(self, ic, ienv):
+        super(irodsUpDownload, self).__init__()
+        super(irodsUpDownload, self).setupUi(self)
 
-class irodsUpDownload():
-    def __init__(self, widget, ic, ienv):
         self.ic = ic
-        self.widget = widget
         self.ienv = ienv
         self.syncing = False # syncing or not
 
         rescs = self.ic.listResources()
 
         # QTreeViews
-        self.dirmodel = checkableFsTreeModel(self.widget.localFsTreeView)
-        self.widget.localFsTreeView.setModel(self.dirmodel)
+        self.dirmodel = checkableFsTreeModel(self.localFsTreeView)
+        self.localFsTreeView.setModel(self.dirmodel)
         # Hide all columns except the Name
-        self.widget.localFsTreeView.setColumnHidden(1, True)
-        self.widget.localFsTreeView.setColumnHidden(2, True)
-        self.widget.localFsTreeView.setColumnHidden(3, True)
-        self.widget.localFsTreeView.header().setSectionResizeMode(QHeaderView.ResizeToContents)
+        self.localFsTreeView.setColumnHidden(1, True)
+        self.localFsTreeView.setColumnHidden(2, True)
+        self.localFsTreeView.setColumnHidden(3, True)
+        self.localFsTreeView.header().setSectionResizeMode(QHeaderView.ResizeToContents)
         home_location = QtCore.QStandardPaths.standardLocations(
                                QtCore.QStandardPaths.HomeLocation)[0]
         index = self.dirmodel.setRootPath(home_location)
-        self.widget.localFsTreeView.setCurrentIndex(index)
+        self.localFsTreeView.setCurrentIndex(index)
         self.dirmodel.initial_expand()
         
         # iRODS  zone info
-        self.widget.irodsZoneLabel.setText("/"+self.ic.session.zone+":")
+        self.irodsZoneLabel.setText("/"+self.ic.session.zone+":")
         # iRODS tree
-        self.irodsmodel = IrodsModel(ic, self.widget.irodsFsTreeView)
-        self.widget.irodsFsTreeView.setModel(self.irodsmodel)
+        self.irodsmodel = IrodsModel(ic, self.irodsFsTreeView)
+        self.irodsFsTreeView.setModel(self.irodsmodel)
         self.irodsRootColl = '/'+ic.session.zone
         self.irodsmodel.setHorizontalHeaderLabels([self.irodsRootColl,
                                               'Level', 'iRODS ID',
                                               'parent ID', 'type'])
 
-        self.widget.irodsFsTreeView.expanded.connect(self.irodsmodel.refreshSubTree)
-        self.widget.irodsFsTreeView.clicked.connect(self.irodsmodel.refreshSubTree)
+        self.irodsFsTreeView.expanded.connect(self.irodsmodel.refreshSubTree)
+        self.irodsFsTreeView.clicked.connect(self.irodsmodel.refreshSubTree)
         self.irodsmodel.initTree()
 
-        self.widget.irodsFsTreeView.setHeaderHidden(True)
-        self.widget.irodsFsTreeView.header().setDefaultSectionSize(180)
-        self.widget.irodsFsTreeView.setColumnHidden(1, True)
-        self.widget.irodsFsTreeView.setColumnHidden(2, True)
-        self.widget.irodsFsTreeView.setColumnHidden(3, True)
-        self.widget.irodsFsTreeView.setColumnHidden(4, True)
+        self.irodsFsTreeView.setHeaderHidden(True)
+        self.irodsFsTreeView.header().setDefaultSectionSize(180)
+        self.irodsFsTreeView.setColumnHidden(1, True)
+        self.irodsFsTreeView.setColumnHidden(2, True)
+        self.irodsFsTreeView.setColumnHidden(3, True)
+        self.irodsFsTreeView.setColumnHidden(4, True)
 
         # Buttons
-        self.widget.UploadButton.clicked.connect(self.upload)
-        self.widget.DownloadButton.clicked.connect(self.download)
-        #self.widget.ContUplBut.clicked.connect(self.cont_upload)
-        self.widget.ContUplBut.setHidden(True) #fFor first release hide special buttons
-        self.widget.uplSetGB_2.setHidden(True)
-        self.widget.createFolderButton.clicked.connect(self.createFolder)
-        self.widget.createCollButton.clicked.connect(self.createCollection)
+        self.UploadButton.clicked.connect(self.upload)
+        self.DownloadButton.clicked.connect(self.download)
+        #self.ContUplBut.clicked.connect(self.cont_upload)
+        self.ContUplBut.setHidden(True) #fFor first release hide special buttons
+        self.uplSetGB_2.setHidden(True)
+        self.createFolderButton.clicked.connect(self.createFolder)
+        self.createCollButton.clicked.connect(self.createCollection)
 
         # Resource selector
         available_resources = self.ic.listResources()
-        self.widget.resourceBox.clear()
-        self.widget.resourceBox.addItems(available_resources)
+        self.resourceBox.clear()
+        self.resourceBox.addItems(available_resources)
         if ("default_resource_name" in ienv) and \
                 (ienv["default_resource_name"] != "") and \
                 (ienv["default_resource_name"] in available_resources):
-            index = self.widget.resourceBox.findText(ienv["default_resource_name"])
-            self.widget.resourceBox.setCurrentIndex(index)
+            index = self.resourceBox.findText(ienv["default_resource_name"])
+            self.resourceBox.setCurrentIndex(index)
 
         # Continious upload settings
         if ienv["irods_host"] in ["scomp1461.wur.nl", "npec-icat.irods.surfsara.nl"]:
-            #self.widget.uplSetGB_2.setVisible(True)
+            #self.uplSetGB_2.setVisible(True)
             if ("ui_remLocalcopy" in ienv):
-                self.widget.rLocalcopyCB.setChecked(ienv["ui_remLocalcopy"])
+                self.rLocalcopyCB.setChecked(ienv["ui_remLocalcopy"])
             if ("ui_uplMode" in ienv):
                 uplMode =  ienv["ui_uplMode"]
                 if uplMode == "f500":
-                    self.widget.uplF500RB.setChecked(True)
+                    self.uplF500RB.setChecked(True)
                 elif uplMode == "meta":
-                    self.widget.uplMetaRB.setChecked(True)
+                    self.uplMetaRB.setChecked(True)
                 else:
-                    self.widget.uplAllRB.setChecked(True)
-            #self.widget.rLocalcopyCB.stateChanged.connect(self.saveUIset)
-            #self.widget.uplF500RB.toggled.connect(self.saveUIset)
-            #self.widget.uplMetaRB.toggled.connect(self.saveUIset)
-            #self.widget.uplAllRB.toggled.connect(self.saveUIset)
+                    self.uplAllRB.setChecked(True)
+            #self.rLocalcopyCB.stateChanged.connect(self.saveUIset)
+            #self.uplF500RB.toggled.connect(self.saveUIset)
+            #self.uplMetaRB.toggled.connect(self.saveUIset)
+            #self.uplAllRB.toggled.connect(self.saveUIset)
         else:
-            self.widget.uplSetGB_2.hide()
-            self.widget.ContUplBut.hide()
+            self.uplSetGB_2.hide()
+            self.ContUplBut.hide()
 
 
     def enableButtons(self, enable):
-        self.widget.UploadButton.setEnabled(enable)
-        self.widget.DownloadButton.setEnabled(enable)
-        self.widget.ContUplBut.setEnabled(enable)
-        self.widget.uplSetGB_2.setEnabled(enable)
-        self.widget.createFolderButton.setEnabled(enable)
-        self.widget.createCollButton.setEnabled(enable)
-        self.widget.localFsTreeView.setEnabled(enable)
-        self.widget.localFsTreeView.setEnabled(enable)
+        self.UploadButton.setEnabled(enable)
+        self.DownloadButton.setEnabled(enable)
+        self.ContUplBut.setEnabled(enable)
+        self.uplSetGB_2.setEnabled(enable)
+        self.createFolderButton.setEnabled(enable)
+        self.createCollButton.setEnabled(enable)
+        self.localFsTreeView.setEnabled(enable)
+        self.localFsTreeView.setEnabled(enable)
 
 
     def infoPopup(self, message):
@@ -117,15 +119,15 @@ class irodsUpDownload():
 
 
     def getResource(self):
-        return self.widget.resourceBox.currentText()
+        return self.resourceBox.currentText()
 
     def getRemLocalCopy(self):
-        return self.widget.rLocalcopyCB.isChecked()
+        return self.rLocalcopyCB.isChecked()
 
     def getUplMode(self):
-        if self.widget.uplF500RB.isChecked():
+        if self.uplF500RB.isChecked():
             uplMode = "f500"
-        elif self.widget.uplMetaRB.isChecked():
+        elif self.uplMetaRB.isChecked():
             uplMode = "meta"
         else: # Default
             uplMode = "all"
@@ -135,7 +137,7 @@ class irodsUpDownload():
     def createFolder(self):
         parent = self.dirmodel.get_checked()
         if parent == None:
-            self.widget.errorLabel.setText("No parent folder selected.")
+            self.errorLabel.setText("No parent folder selected.")
         else:
             createDirWidget = createDirectory(parent)
             createDirWidget.exec_()
@@ -145,7 +147,7 @@ class irodsUpDownload():
     def createCollection(self):
         idx, parent = self.irodsmodel.get_checked()
         if parent == None:
-            self.widget.errorLabel.setText("No parent collection selected.")
+            self.errorLabel.setText("No parent collection selected.")
         else:
             creteCollWidget = irodsCreateCollection(parent, self.ic)
             creteCollWidget.exec_()
@@ -155,15 +157,15 @@ class irodsUpDownload():
     # Upload a file/folder to IRODS and refresh the TreeView
     def upload(self):
         self.enableButtons(False)
-        self.widget.errorLabel.clear()
+        self.errorLabel.clear()
         (fsSource, irodsDestIdx, irodsDestPath) = self.getPathsFromTrees()
         if fsSource == None or irodsDestPath == None: 
-            self.widget.errorLabel.setText(
+            self.errorLabel.setText(
                     "ERROR Up/Download: Please select source and destination.")
             self.enableButtons(True)
             return
         if not self.ic.session.collections.exists(irodsDestPath):
-            self.widget.errorLabel.setText(
+            self.errorLabel.setText(
                     "ERROR UPLOAD: iRODS destination is file, must be collection.")
             self.enableButtons(True)
             return
@@ -180,25 +182,25 @@ class irodsUpDownload():
         if succes == True:
             if irodsIdx != None:
                 self.irodsmodel.refreshSubTree(irodsIdx)
-            if self.widget.saveSettings.isChecked():
+            if self.saveSettings.isChecked():
                 print("FINISH UPLOAD/DOWNLOAD: saving ui parameters.")
                 self.saveUIset()
-            self.widget.errorLabel.setText("INFO UPLOAD/DOWLOAD: completed.")
+            self.errorLabel.setText("INFO UPLOAD/DOWLOAD: completed.")
         self.uploadWindow = None # Release
         self.enableButtons(True)
 
 
     def download(self):
         self.enableButtons(False)
-        self.widget.errorLabel.clear()
+        self.errorLabel.clear()
         (fsDest, irodsSourceIdx, irodsSourcePath) = self.getPathsFromTrees()
         if fsDest == None or irodsSourcePath == None:
-            self.widget.errorLabel.setText(
+            self.errorLabel.setText(
                     "ERROR Up/Download: Please select source and destination.")
             self.enableButtons(True)
             return
         if os.path.isfile(fsDest):
-            self.widget.errorLabel.setText(
+            self.errorLabel.setText(
                     "ERROR DOWNLOAD: Local Destination is file, must be folder.")
             self.enableButtons(True)
             return
diff --git a/gui/mainmenu.py b/gui/mainmenu.py
index f731212f3412d081c39446665e5d2652cc4ed94e..a6d49b7a9cbe61b04add50816951f3fc696f9bf6 100644
--- a/gui/mainmenu.py
+++ b/gui/mainmenu.py
@@ -1,9 +1,10 @@
 from PyQt5 import QtWidgets
-from PyQt5.QtWidgets import QDialog, QFileDialog, QApplication, QMainWindow, QMessageBox, QPushButton
+from PyQt5.QtWidgets import QDialog, QFileDialog, QApplication, QMainWindow, QMessageBox, QPushButton, QWidget
 from PyQt5.uic import loadUi
 from PyQt5 import QtCore
 from PyQt5 import QtGui
 
+
 from gui.popupWidgets import irodsCreateCollection
 from gui.irodsBrowser import irodsBrowser
 from gui.elabUpload import elabUpload
@@ -16,11 +17,15 @@ from gui.irodsTicketLogin import irodsTicketLogin
 from utils.utils import saveIenv
 
 import sys
+from gui.ui_files.MainMenu import Ui_MainWindow
+
 
-class mainmenu(QMainWindow):
+class mainmenu(QMainWindow, Ui_MainWindow):
     def __init__(self, widget, ic, ienv):
         super(mainmenu, self).__init__()
-        loadUi("gui/ui-files/MainMenu.ui", self)
+        super(mainmenu, self).setupUi(self)
+        #loadUi("gui/ui_files/MainMenu.ui", self)
+
         self.ic = ic
         self.widget = widget #stackedWidget
         self.ienv = ienv
@@ -32,9 +37,9 @@ class mainmenu(QMainWindow):
         if not ienv or not ic:
             self.actionSearch.setEnabled(False)
             self.actionSaveConfig.setEnabled(False)
-            ticketAccessWidget = loadUi("gui/ui-files/tabTicketAccess.ui")
-            self.tabWidget.addTab(ticketAccessWidget, "Ticket Access")
-            self.ticketAccessTab = irodsTicketLogin(ticketAccessWidget)
+            self.ticketAccessTab = irodsTicketLogin()
+            #ticketAccessWidget = loadUi("gui/ui_files/tabTicketAccess.ui")
+            self.tabWidget.addTab(self.ticketAccessTab, "Ticket Access")
 
         else:
             self.actionSearch.triggered.connect(self.search)
@@ -42,41 +47,36 @@ class mainmenu(QMainWindow):
             #self.actionExportMetadata.triggered.connect(self.exportMeta)
 
             #needed for Search
-            self.browserWidget = loadUi("gui/ui-files/tabBrowser.ui")
-            self.tabWidget.addTab(self.browserWidget, "Browser")
-            self.irodsBrowser = irodsBrowser(self.browserWidget, ic)
-
+            self.irodsBrowser = irodsBrowser(ic)
+            self.tabWidget.addTab(self.irodsBrowser, "Browser")
             if ("ui_tabs" in ienv) and (ienv["ui_tabs"] != ""): 
-    
                 # Setup up/download tab, index 1
                 if ("tabUpDownload" in ienv["ui_tabs"]):
-                    updownloadWidget = loadUi("gui/ui-files/tabUpDownload.ui")
-                    self.tabWidget.addTab(updownloadWidget, "Up and Download")
-                    self.updownload = irodsUpDownload(updownloadWidget, ic, self.ienv)
+                    self.updownload = irodsUpDownload(ic, self.ienv)
+                    self.tabWidget.addTab(self.updownload, "Up and Download")
     
                 # Elabjournal tab, index 2
                 if ("tabELNData" in ienv["ui_tabs"]):
-                    elabUploadWidget = loadUi("gui/ui-files/tabELNData.ui")
-                    self.tabWidget.addTab(elabUploadWidget, "ELN Data upload")
-                    self.elnTab = elabUpload(elabUploadWidget, ic)
+                    self.elnTab = elabUpload(ic)
+                    #elabUploadWidget = loadUi("gui/ui_files/tabELNData.ui")
+                    self.tabWidget.addTab(self.elnTab, "ELN Data upload")
     
                 # Data compression tab, index 3
                 if ("tabDataCompression" in ienv["ui_tabs"]):
-                    dataCompressWidget = loadUi("gui/ui-files/tabDataCompression.ui")
-                    self.tabWidget.addTab(dataCompressWidget, "Compress/bundle data")
-                    self.compressionTab = irodsDataCompression(dataCompressWidget, ic, self.ienv)
+                    self.compressionTab = irodsDataCompression(ic, self.ienv)
+                    #dataCompressWidget = loadUi("gui/ui_files/tabDataCompression.ui")
+                    self.tabWidget.addTab(self.compressionTab, "Compress/bundle data")
     
                 # Grant access by tickets, index 4
                 if ("tabCreateTicket" in ienv["ui_tabs"]):
-                    createTicketWidget = loadUi("gui/ui-files/tabTicketCreate.ui")
-                    self.tabWidget.addTab(createTicketWidget, "Create access tokens")
-                    self.createTicket = irodsCreateTicket(createTicketWidget, ic, self.ienv)
+                    self.createTicket = irodsCreateTicket(ic, self.ienv)
+                    #createTicketWidget = loadUi("gui/ui_files/tabTicketCreate.ui")
+                    self.tabWidget.addTab(self.createTicket, "Create access tokens")
     
             #general info
-            self.infoWidget = loadUi("gui/ui-files/tabInfo.ui")
-            self.tabWidget.addTab(self.infoWidget, "Info")
-            self.irodsInfo = irodsInfo(self.infoWidget, ic)
-    
+            self.irodsInfo = irodsInfo(ic)
+            #self.infoWidget = loadUi("gui/ui_files/tabInfo.ui")
+            self.tabWidget.addTab(self.irodsInfo, "Info")
             self.tabWidget.setCurrentIndex(0)
 
     #connect functions
@@ -110,7 +110,7 @@ class mainmenu(QMainWindow):
             pass
 
     def search(self):
-        search = irodsSearch(self.ic, self.browserWidget.collTable)
+        search = irodsSearch(self.ic, self.irodsBrowser.collTable)
         search.exec_()
 
 
diff --git a/gui/popupWidgets.py b/gui/popupWidgets.py
index b74b6242177077bf42dc007558d5f8795bff5283..c1b7c5a6de7f8020edd555bb00848151dfdef115 100644
--- a/gui/popupWidgets.py
+++ b/gui/popupWidgets.py
@@ -10,10 +10,14 @@ import json
 import datetime
 import logging
 
-class irodsCreateCollection(QDialog):
+from gui.ui_files.createCollection import Ui_createCollection
+from gui.ui_files.irodsIndexPopup import Ui_irodsIndexPopup
+
+class irodsCreateCollection(QDialog, Ui_createCollection):
     def __init__(self, parent, ic):
         super(irodsCreateCollection, self).__init__()
-        loadUi("gui/ui-files/createCollection.ui", self)
+        super(irodsCreateCollection, self).setupUi(self)
+        #loadUi("gui/ui-files/createCollection.ui", self)
         self.setWindowTitle("Create iRODS collection")
         self.ic = ic
         self.parent = parent
@@ -33,10 +37,11 @@ class irodsCreateCollection(QDialog):
                     self.errorLabel.setText("ERROR: insufficient rights.")
 
 
-class createDirectory(QDialog):
+class createDirectory(QDialog, Ui_createCollection):
     def __init__(self, parent):
         super(createDirectory, self).__init__()
-        loadUi("gui/ui-files/createCollection.ui", self)
+        super(createDirectory, self).setupUi(self)
+        #loadUi("gui/ui-files/createCollection.ui", self)
         self.setWindowTitle("Create directory")
         self.parent = parent
         self.label.setText(self.parent+os.sep)
@@ -55,10 +60,11 @@ class createDirectory(QDialog):
                     self.errorLabel.setText("ERROR: insufficient rights.")
 
 
-class irodsIndexPopup(QDialog):
+class irodsIndexPopup(QDialog, Ui_irodsIndexPopup):
     def __init__(self, ic, irodsTarIndexFileList, tarFilePath, statusLabel):
         super(irodsIndexPopup, self).__init__()
-        loadUi("gui/ui-files/irodsIndexPopup.ui", self)
+        super(irodsIndexPopup, self).setupUi(self)
+        #loadUi("gui/ui-files/irodsIndexPopup.ui", self)
         self.setWindowTitle("iRODS Tar/Zip index.")
         self.indexLabel.setText("Index of " + tarFilePath + ":")
         self.tabWidget.setCurrentIndex(0)
diff --git a/gui/ui_files/MainMenu.py b/gui/ui_files/MainMenu.py
new file mode 100644
index 0000000000000000000000000000000000000000..6d780061453d8aa0577abc400701fdf79baa804f
--- /dev/null
+++ b/gui/ui_files/MainMenu.py
@@ -0,0 +1,115 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\MainMenu.ui'
+#
+# Created by: PyQt5 UI code generator 5.15.4
+#
+# WARNING: Any manual changes made to this file will be lost when pyuic5 is
+# run again.  Do not edit this file unless you know what you are doing.
+
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_MainWindow(object):
+    def setupUi(self, MainWindow):
+        MainWindow.setObjectName("MainWindow")
+        MainWindow.resize(1300, 850)
+        MainWindow.setMinimumSize(QtCore.QSize(1300, 850))
+        MainWindow.setStyleSheet("QWidget\n"
+"{\n"
+"    color: rgb(86, 184, 139);\n"
+"    background-color: rgb(54, 54, 54);\n"
+"    selection-background-color: rgb(58, 152, 112);\n"
+"}\n"
+"\n"
+"QLabel#globalErrorLabel\n"
+"{\n"
+"    color: rgb(217, 174, 23);\n"
+"}\n"
+"\n"
+"QTabBar::tab:top:selected {\n"
+"    background-color: rgb(58, 152, 112);\n"
+"    color: rgb(54, 54, 54);\n"
+"}\n"
+"")
+        self.centralwidget = QtWidgets.QWidget(MainWindow)
+        self.centralwidget.setStyleSheet("")
+        self.centralwidget.setObjectName("centralwidget")
+        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
+        self.verticalLayout.setObjectName("verticalLayout")
+        self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
+        self.tabWidget.setMinimumSize(QtCore.QSize(600, 300))
+        self.tabWidget.setObjectName("tabWidget")
+        self.verticalLayout.addWidget(self.tabWidget)
+        self.globalErrorLabel = QtWidgets.QLabel(self.centralwidget)
+        self.globalErrorLabel.setStyleSheet("")
+        self.globalErrorLabel.setText("")
+        self.globalErrorLabel.setObjectName("globalErrorLabel")
+        self.verticalLayout.addWidget(self.globalErrorLabel)
+        MainWindow.setCentralWidget(self.centralwidget)
+        self.menubar = QtWidgets.QMenuBar(MainWindow)
+        self.menubar.setGeometry(QtCore.QRect(0, 0, 1300, 21))
+        self.menubar.setObjectName("menubar")
+        self.menuMenu = QtWidgets.QMenu(self.menubar)
+        font = QtGui.QFont()
+        font.setPointSize(13)
+        font.setBold(False)
+        font.setWeight(50)
+        self.menuMenu.setFont(font)
+        self.menuMenu.setObjectName("menuMenu")
+        self.menuOptions = QtWidgets.QMenu(self.menubar)
+        font = QtGui.QFont()
+        font.setPointSize(13)
+        self.menuOptions.setFont(font)
+        self.menuOptions.setObjectName("menuOptions")
+        MainWindow.setMenuBar(self.menubar)
+        self.statusbar = QtWidgets.QStatusBar(MainWindow)
+        self.statusbar.setObjectName("statusbar")
+        MainWindow.setStatusBar(self.statusbar)
+        self.actionCloseSession = QtWidgets.QAction(MainWindow)
+        font = QtGui.QFont()
+        self.actionCloseSession.setFont(font)
+        self.actionCloseSession.setObjectName("actionCloseSession")
+        self.actionExit = QtWidgets.QAction(MainWindow)
+        font = QtGui.QFont()
+        self.actionExit.setFont(font)
+        self.actionExit.setObjectName("actionExit")
+        self.actionSearch = QtWidgets.QAction(MainWindow)
+        font = QtGui.QFont()
+        self.actionSearch.setFont(font)
+        self.actionSearch.setObjectName("actionSearch")
+        self.actionSaveConfig = QtWidgets.QAction(MainWindow)
+        font = QtGui.QFont()
+        self.actionSaveConfig.setFont(font)
+        self.actionSaveConfig.setObjectName("actionSaveConfig")
+        self.menuMenu.addAction(self.actionCloseSession)
+        self.menuMenu.addAction(self.actionExit)
+        self.menuOptions.addAction(self.actionSearch)
+        self.menuOptions.addAction(self.actionSaveConfig)
+        self.menubar.addAction(self.menuMenu.menuAction())
+        self.menubar.addAction(self.menuOptions.menuAction())
+
+        self.retranslateUi(MainWindow)
+        self.tabWidget.setCurrentIndex(-1)
+        QtCore.QMetaObject.connectSlotsByName(MainWindow)
+
+    def retranslateUi(self, MainWindow):
+        _translate = QtCore.QCoreApplication.translate
+        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
+        self.menuMenu.setTitle(_translate("MainWindow", "Menu"))
+        self.menuOptions.setTitle(_translate("MainWindow", "Options"))
+        self.actionCloseSession.setText(_translate("MainWindow", "Close Session"))
+        self.actionExit.setText(_translate("MainWindow", "Exit"))
+        self.actionSearch.setText(_translate("MainWindow", "Search"))
+        self.actionSaveConfig.setText(_translate("MainWindow", "Save configuration"))
+
+
+if __name__ == "__main__":
+    import sys
+    app = QtWidgets.QApplication(sys.argv)
+    MainWindow = QtWidgets.QMainWindow()
+    ui = Ui_MainWindow()
+    ui.setupUi(MainWindow)
+    MainWindow.show()
+    sys.exit(app.exec_())
diff --git a/gui/ui-files/MainMenu.ui b/gui/ui_files/MainMenu.ui
similarity index 100%
rename from gui/ui-files/MainMenu.ui
rename to gui/ui_files/MainMenu.ui
diff --git a/gui/ui_files/createCollection.py b/gui/ui_files/createCollection.py
new file mode 100644
index 0000000000000000000000000000000000000000..3ae10c78692fb53cccb28b8b374576d2180f57f6
--- /dev/null
+++ b/gui/ui_files/createCollection.py
@@ -0,0 +1,74 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\createCollection.ui'
+#
+# Created by: PyQt5 UI code generator 5.15.4
+#
+# WARNING: Any manual changes made to this file will be lost when pyuic5 is
+# run again.  Do not edit this file unless you know what you are doing.
+
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_createCollection(object):
+    def setupUi(self, createCollection):
+        createCollection.setObjectName("createCollection")
+        createCollection.resize(500, 200)
+        createCollection.setMinimumSize(QtCore.QSize(500, 200))
+        createCollection.setMaximumSize(QtCore.QSize(500, 200))
+        createCollection.setStyleSheet("QWidget\n"
+"{\n"
+"    color: rgb(86, 184, 139);\n"
+"    background-color: rgb(54, 54, 54);\n"
+"}\n"
+"\n"
+"QLabel#errorLabel\n"
+"{\n"
+"    color: rgb(217, 174, 23);\n"
+"}")
+        self.verticalLayout = QtWidgets.QVBoxLayout(createCollection)
+        self.verticalLayout.setObjectName("verticalLayout")
+        self.horizontalLayout = QtWidgets.QHBoxLayout()
+        self.horizontalLayout.setObjectName("horizontalLayout")
+        self.label = QtWidgets.QLabel(createCollection)
+        self.label.setObjectName("label")
+        self.horizontalLayout.addWidget(self.label)
+        spacerItem = QtWidgets.QSpacerItem(10, 20, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout.addItem(spacerItem)
+        self.collPathLine = QtWidgets.QLineEdit(createCollection)
+        self.collPathLine.setObjectName("collPathLine")
+        self.horizontalLayout.addWidget(self.collPathLine)
+        self.verticalLayout.addLayout(self.horizontalLayout)
+        self.errorLabel = QtWidgets.QLabel(createCollection)
+        self.errorLabel.setStyleSheet("")
+        self.errorLabel.setText("")
+        self.errorLabel.setObjectName("errorLabel")
+        self.verticalLayout.addWidget(self.errorLabel)
+        spacerItem1 = QtWidgets.QSpacerItem(20, 10, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
+        self.verticalLayout.addItem(spacerItem1)
+        self.buttonBox = QtWidgets.QDialogButtonBox(createCollection)
+        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
+        self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok)
+        self.buttonBox.setObjectName("buttonBox")
+        self.verticalLayout.addWidget(self.buttonBox)
+
+        self.retranslateUi(createCollection)
+        self.buttonBox.accepted.connect(createCollection.accept)
+        self.buttonBox.rejected.connect(createCollection.reject)
+        QtCore.QMetaObject.connectSlotsByName(createCollection)
+
+    def retranslateUi(self, createCollection):
+        _translate = QtCore.QCoreApplication.translate
+        createCollection.setWindowTitle(_translate("createCollection", "New Collection"))
+        self.label.setText(_translate("createCollection", "iRODS path                                      /"))
+
+
+if __name__ == "__main__":
+    import sys
+    app = QtWidgets.QApplication(sys.argv)
+    createCollection = QtWidgets.QDialog()
+    ui = Ui_createCollection()
+    ui.setupUi(createCollection)
+    createCollection.show()
+    sys.exit(app.exec_())
diff --git a/gui/ui-files/createCollection.ui b/gui/ui_files/createCollection.ui
similarity index 94%
rename from gui/ui-files/createCollection.ui
rename to gui/ui_files/createCollection.ui
index 10ae8953fc34c4ad582ca1c6d60cb20dee78391e..4ce3653246505bcd017f92741d1b9d647d23dbd1 100644
--- a/gui/ui-files/createCollection.ui
+++ b/gui/ui_files/createCollection.ui
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <ui version="4.0">
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog">
+ <class>createCollection</class>
+ <widget class="QDialog" name="createCollection">
   <property name="geometry">
    <rect>
     <x>0</x>
@@ -111,7 +111,7 @@ QLabel#errorLabel
   <connection>
    <sender>buttonBox</sender>
    <signal>accepted()</signal>
-   <receiver>Dialog</receiver>
+   <receiver>createCollection</receiver>
    <slot>accept()</slot>
    <hints>
     <hint type="sourcelabel">
@@ -127,7 +127,7 @@ QLabel#errorLabel
   <connection>
    <sender>buttonBox</sender>
    <signal>rejected()</signal>
-   <receiver>Dialog</receiver>
+   <receiver>createCollection</receiver>
    <slot>reject()</slot>
    <hints>
     <hint type="sourcelabel">
diff --git a/gui/ui_files/dataTransferState.py b/gui/ui_files/dataTransferState.py
new file mode 100644
index 0000000000000000000000000000000000000000..4eb9ff04c50c6f4eb54edc0379cc0ef006230292
--- /dev/null
+++ b/gui/ui_files/dataTransferState.py
@@ -0,0 +1,107 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\dataTransferState.ui'
+#
+# Created by: PyQt5 UI code generator 5.15.4
+#
+# WARNING: Any manual changes made to this file will be lost when pyuic5 is
+# run again.  Do not edit this file unless you know what you are doing.
+
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_dataTransferState(object):
+    def setupUi(self, dataTransferState):
+        dataTransferState.setObjectName("dataTransferState")
+        dataTransferState.resize(443, 206)
+        dataTransferState.setStyleSheet("QWidget\n"
+"{\n"
+"    color: rgb(86, 184, 139);\n"
+"    background-color: rgb(54, 54, 54);\n"
+"    selection-background-color: rgb(58, 152, 112);\n"
+"}")
+        self.gridLayout_2 = QtWidgets.QGridLayout(dataTransferState)
+        self.gridLayout_2.setObjectName("gridLayout_2")
+        self.groupBox = QtWidgets.QGroupBox(dataTransferState)
+        self.groupBox.setTitle("")
+        self.groupBox.setObjectName("groupBox")
+        self.gridLayout = QtWidgets.QGridLayout(self.groupBox)
+        self.gridLayout.setObjectName("gridLayout")
+        self.cancelBtn = QtWidgets.QPushButton(self.groupBox)
+        self.cancelBtn.setObjectName("cancelBtn")
+        self.gridLayout.addWidget(self.cancelBtn, 1, 3, 1, 1)
+        self.confirmBtn = QtWidgets.QPushButton(self.groupBox)
+        self.confirmBtn.setObjectName("confirmBtn")
+        self.gridLayout.addWidget(self.confirmBtn, 1, 4, 1, 1)
+        self.statusLbl = QtWidgets.QLabel(self.groupBox)
+        self.statusLbl.setObjectName("statusLbl")
+        self.gridLayout.addWidget(self.statusLbl, 0, 3, 1, 1)
+        self.gridLayout_2.addWidget(self.groupBox, 4, 0, 1, 4)
+        self.verticalLayout = QtWidgets.QVBoxLayout()
+        self.verticalLayout.setObjectName("verticalLayout")
+        self.loadingLbl = QtWidgets.QLabel(dataTransferState)
+        self.loadingLbl.setMinimumSize(QtCore.QSize(100, 100))
+        self.loadingLbl.setText("")
+        self.loadingLbl.setObjectName("loadingLbl")
+        self.verticalLayout.addWidget(self.loadingLbl)
+        self.gridLayout_2.addLayout(self.verticalLayout, 0, 2, 4, 2)
+        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
+        self.numDiffLabel = QtWidgets.QLabel(dataTransferState)
+        self.numDiffLabel.setObjectName("numDiffLabel")
+        self.horizontalLayout_2.addWidget(self.numDiffLabel)
+        self.ChecksumLbl = QtWidgets.QLabel(dataTransferState)
+        self.ChecksumLbl.setFrameShape(QtWidgets.QFrame.NoFrame)
+        self.ChecksumLbl.setObjectName("ChecksumLbl")
+        self.horizontalLayout_2.addWidget(self.ChecksumLbl)
+        spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout_2.addItem(spacerItem)
+        self.ChecksumSizeLbl = QtWidgets.QLabel(dataTransferState)
+        self.ChecksumSizeLbl.setObjectName("ChecksumSizeLbl")
+        self.horizontalLayout_2.addWidget(self.ChecksumSizeLbl)
+        spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout_2.addItem(spacerItem1)
+        self.gridLayout_2.addLayout(self.horizontalLayout_2, 0, 0, 2, 1)
+        self.horizontalLayout = QtWidgets.QHBoxLayout()
+        self.horizontalLayout.setObjectName("horizontalLayout")
+        self.numAddLabel = QtWidgets.QLabel(dataTransferState)
+        self.numAddLabel.setObjectName("numAddLabel")
+        self.horizontalLayout.addWidget(self.numAddLabel)
+        self.newFiles = QtWidgets.QLabel(dataTransferState)
+        self.newFiles.setObjectName("newFiles")
+        self.horizontalLayout.addWidget(self.newFiles)
+        spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout.addItem(spacerItem2)
+        self.newFSizeLbl = QtWidgets.QLabel(dataTransferState)
+        self.newFSizeLbl.setObjectName("newFSizeLbl")
+        self.horizontalLayout.addWidget(self.newFSizeLbl)
+        spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout.addItem(spacerItem3)
+        self.gridLayout_2.addLayout(self.horizontalLayout, 2, 0, 2, 1)
+
+        self.retranslateUi(dataTransferState)
+        QtCore.QMetaObject.connectSlotsByName(dataTransferState)
+
+    def retranslateUi(self, dataTransferState):
+        _translate = QtCore.QCoreApplication.translate
+        dataTransferState.setWindowTitle(_translate("dataTransferState", "Dialog"))
+        self.cancelBtn.setText(_translate("dataTransferState", "Cancel"))
+        self.confirmBtn.setText(_translate("dataTransferState", "Upload"))
+        self.statusLbl.setText(_translate("dataTransferState", "Loading"))
+        self.numDiffLabel.setText(_translate("dataTransferState", "0"))
+        self.ChecksumLbl.setText(_translate("dataTransferState", "Items to update (overwrite)"))
+        self.ChecksumSizeLbl.setText(_translate("dataTransferState", "0"))
+        self.numAddLabel.setText(_translate("dataTransferState", "0"))
+        self.newFiles.setText(_translate("dataTransferState", "New items   "))
+        self.newFSizeLbl.setText(_translate("dataTransferState", "0"))
+
+
+if __name__ == "__main__":
+    import sys
+    app = QtWidgets.QApplication(sys.argv)
+    dataTransferState = QtWidgets.QDialog()
+    ui = Ui_dataTransferState()
+    ui.setupUi(dataTransferState)
+    dataTransferState.show()
+    sys.exit(app.exec_())
diff --git a/gui/ui-files/dataTransferState.ui b/gui/ui_files/dataTransferState.ui
similarity index 98%
rename from gui/ui-files/dataTransferState.ui
rename to gui/ui_files/dataTransferState.ui
index d97ab256d3d43112c13f4dfb82831c3913e48f96..905ebd7d01d54636c5cc7e25357f53b107391224 100644
--- a/gui/ui-files/dataTransferState.ui
+++ b/gui/ui_files/dataTransferState.ui
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <ui version="4.0">
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog">
+ <class>dataTransferState</class>
+ <widget class="QDialog" name="dataTransferState">
   <property name="geometry">
    <rect>
     <x>0</x>
diff --git a/gui/ui_files/irodsIndexPopup.py b/gui/ui_files/irodsIndexPopup.py
new file mode 100644
index 0000000000000000000000000000000000000000..fc947a5b51dec5c1edf27d5666e67ba06d40a1c3
--- /dev/null
+++ b/gui/ui_files/irodsIndexPopup.py
@@ -0,0 +1,163 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\irodsIndexPopup.ui'
+#
+# Created by: PyQt5 UI code generator 5.15.4
+#
+# WARNING: Any manual changes made to this file will be lost when pyuic5 is
+# run again.  Do not edit this file unless you know what you are doing.
+
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_irodsIndexPopup(object):
+    def setupUi(self, irodsIndexPopup):
+        irodsIndexPopup.setObjectName("irodsIndexPopup")
+        irodsIndexPopup.resize(1000, 480)
+        irodsIndexPopup.setStyleSheet("QWidget\n"
+"{\n"
+"    color: rgb(86, 184, 139);\n"
+"    background-color: rgb(54, 54, 54);\n"
+"    selection-background-color: rgb(58, 152, 112);\n"
+"}\n"
+"\n"
+"QTabWidget\n"
+"{\n"
+"    background-color: rgb(54, 54, 54);\n"
+"    selection-background-color: rgb(58, 152, 112);\n"
+"}\n"
+"\n"
+"QTabBar::tab:top:selected {\n"
+"    background-color: rgb(58, 152, 112);\n"
+"    color: rgb(54, 54, 54);\n"
+"}\n"
+"\n"
+"QTableWidget\n"
+"{\n"
+"background-color: rgb(85, 87, 83);\n"
+"selection-background-color: rgb(58, 152, 112);\n"
+"}\n"
+"\n"
+"QLabel#indexLabel\n"
+"{\n"
+"    background-color: rgb(85, 87, 83);\n"
+"}\n"
+"\n"
+"QLabel#collLabel\n"
+"{\n"
+"    background-color: rgb(85, 87, 83);\n"
+"}\n"
+"\n"
+"QLabel#errorLabel\n"
+"{\n"
+"    color: rgb(217, 174, 23);\n"
+"}\n"
+"\n"
+"QPushButton#closeButton\n"
+"{\n"
+"    background-color: rgb(54, 54, 54);\n"
+"    color: rgb(58, 152, 112);\n"
+"}")
+        self.verticalLayout = QtWidgets.QVBoxLayout(irodsIndexPopup)
+        self.verticalLayout.setObjectName("verticalLayout")
+        self.tabWidget = QtWidgets.QTabWidget(irodsIndexPopup)
+        self.tabWidget.setStyleSheet("")
+        self.tabWidget.setObjectName("tabWidget")
+        self.tab_2 = QtWidgets.QWidget()
+        self.tab_2.setObjectName("tab_2")
+        self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.tab_2)
+        self.verticalLayout_3.setObjectName("verticalLayout_3")
+        spacerItem = QtWidgets.QSpacerItem(20, 10, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Maximum)
+        self.verticalLayout_3.addItem(spacerItem)
+        self.collLabel = QtWidgets.QLabel(self.tab_2)
+        self.collLabel.setText("")
+        self.collLabel.setObjectName("collLabel")
+        self.verticalLayout_3.addWidget(self.collLabel)
+        spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Maximum)
+        self.verticalLayout_3.addItem(spacerItem1)
+        self.dataObjectTable = QtWidgets.QTableWidget(self.tab_2)
+        self.dataObjectTable.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents)
+        self.dataObjectTable.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
+        self.dataObjectTable.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection)
+        self.dataObjectTable.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
+        self.dataObjectTable.setObjectName("dataObjectTable")
+        self.dataObjectTable.setColumnCount(4)
+        self.dataObjectTable.setRowCount(0)
+        item = QtWidgets.QTableWidgetItem()
+        self.dataObjectTable.setHorizontalHeaderItem(0, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.dataObjectTable.setHorizontalHeaderItem(1, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.dataObjectTable.setHorizontalHeaderItem(2, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.dataObjectTable.setHorizontalHeaderItem(3, item)
+        self.verticalLayout_3.addWidget(self.dataObjectTable)
+        self.tabWidget.addTab(self.tab_2, "")
+        self.tab = QtWidgets.QWidget()
+        self.tab.setObjectName("tab")
+        self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.tab)
+        self.verticalLayout_2.setObjectName("verticalLayout_2")
+        spacerItem2 = QtWidgets.QSpacerItem(20, 10, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Maximum)
+        self.verticalLayout_2.addItem(spacerItem2)
+        self.indexLabel = QtWidgets.QLabel(self.tab)
+        self.indexLabel.setText("")
+        self.indexLabel.setObjectName("indexLabel")
+        self.verticalLayout_2.addWidget(self.indexLabel)
+        spacerItem3 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Maximum)
+        self.verticalLayout_2.addItem(spacerItem3)
+        self.textBrowser = QtWidgets.QTextBrowser(self.tab)
+        self.textBrowser.setObjectName("textBrowser")
+        self.verticalLayout_2.addWidget(self.textBrowser)
+        self.tabWidget.addTab(self.tab, "")
+        self.verticalLayout.addWidget(self.tabWidget)
+        self.horizontalLayout = QtWidgets.QHBoxLayout()
+        self.horizontalLayout.setObjectName("horizontalLayout")
+        spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout.addItem(spacerItem4)
+        self.extractButton = QtWidgets.QPushButton(irodsIndexPopup)
+        self.extractButton.setObjectName("extractButton")
+        self.horizontalLayout.addWidget(self.extractButton)
+        self.closeButton = QtWidgets.QPushButton(irodsIndexPopup)
+        font = QtGui.QFont()
+        font.setBold(True)
+        font.setWeight(75)
+        self.closeButton.setFont(font)
+        self.closeButton.setDefault(True)
+        self.closeButton.setObjectName("closeButton")
+        self.horizontalLayout.addWidget(self.closeButton)
+        self.verticalLayout.addLayout(self.horizontalLayout)
+        self.errorLabel = QtWidgets.QLabel(irodsIndexPopup)
+        self.errorLabel.setText("")
+        self.errorLabel.setObjectName("errorLabel")
+        self.verticalLayout.addWidget(self.errorLabel)
+
+        self.retranslateUi(irodsIndexPopup)
+        self.tabWidget.setCurrentIndex(1)
+        QtCore.QMetaObject.connectSlotsByName(irodsIndexPopup)
+
+    def retranslateUi(self, irodsIndexPopup):
+        _translate = QtCore.QCoreApplication.translate
+        irodsIndexPopup.setWindowTitle(_translate("irodsIndexPopup", "Form"))
+        item = self.dataObjectTable.horizontalHeaderItem(0)
+        item.setText(_translate("irodsIndexPopup", "Name"))
+        item = self.dataObjectTable.horizontalHeaderItem(1)
+        item.setText(_translate("irodsIndexPopup", "Owner"))
+        item = self.dataObjectTable.horizontalHeaderItem(2)
+        item.setText(_translate("irodsIndexPopup", "Size"))
+        item = self.dataObjectTable.horizontalHeaderItem(3)
+        item.setText(_translate("irodsIndexPopup", "Creation Date"))
+        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("irodsIndexPopup", "Data Objects"))
+        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("irodsIndexPopup", "JSON"))
+        self.extractButton.setText(_translate("irodsIndexPopup", "Extract Selected"))
+        self.closeButton.setText(_translate("irodsIndexPopup", "Close"))
+
+
+if __name__ == "__main__":
+    import sys
+    app = QtWidgets.QApplication(sys.argv)
+    irodsIndexPopup = QtWidgets.QWidget()
+    ui = Ui_irodsIndexPopup()
+    ui.setupUi(irodsIndexPopup)
+    irodsIndexPopup.show()
+    sys.exit(app.exec_())
diff --git a/gui/ui-files/irodsIndexPopup.ui b/gui/ui_files/irodsIndexPopup.ui
similarity index 98%
rename from gui/ui-files/irodsIndexPopup.ui
rename to gui/ui_files/irodsIndexPopup.ui
index 1e2e0fd3f5b72d7bb8871bdffec78d59f3813035..eb0db47e887ecc392e0f0abbfc6280db5b69f7d1 100644
--- a/gui/ui-files/irodsIndexPopup.ui
+++ b/gui/ui_files/irodsIndexPopup.ui
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <ui version="4.0">
- <class>Form</class>
- <widget class="QWidget" name="Form">
+ <class>irodsIndexPopup</class>
+ <widget class="QWidget" name="irodsIndexPopup">
   <property name="geometry">
    <rect>
     <x>0</x>
diff --git a/gui/ui_files/irodsLogin.py b/gui/ui_files/irodsLogin.py
new file mode 100644
index 0000000000000000000000000000000000000000..b37abdd6a8ee15f8c509b7b9c6caf0bea71afc96
--- /dev/null
+++ b/gui/ui_files/irodsLogin.py
@@ -0,0 +1,149 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\irodsLogin.ui'
+#
+# Created by: PyQt5 UI code generator 5.15.4
+#
+# WARNING: Any manual changes made to this file will be lost when pyuic5 is
+# run again.  Do not edit this file unless you know what you are doing.
+
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_irodsLogin(object):
+    def setupUi(self, irodsLogin):
+        irodsLogin.setObjectName("irodsLogin")
+        irodsLogin.resize(770, 332)
+        irodsLogin.setMinimumSize(QtCore.QSize(770, 320))
+        irodsLogin.setStyleSheet("QWidget\n"
+"{\n"
+"    background-color: rgb(54, 54, 54);\n"
+"    color: rgb(86, 184, 139);\n"
+"}\n"
+"\n"
+"QLineEdit\n"
+"{\n"
+"    background-color: rgb(85, 87, 83);\n"
+"}\n"
+"\n"
+"QRadioButton\n"
+"{\n"
+"    border-bottom-color: rgb(206, 92, 0);\n"
+"}\n"
+"\n"
+"QLabel#passError, QLabel#envError, QLabel#icommandsError\n"
+"{\n"
+"    color: rgb(217, 174, 23);\n"
+"}")
+        self.gridLayoutWidget = QtWidgets.QWidget(irodsLogin)
+        self.gridLayoutWidget.setGeometry(QtCore.QRect(10, 10, 741, 251))
+        self.gridLayoutWidget.setObjectName("gridLayoutWidget")
+        self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget)
+        self.gridLayout.setContentsMargins(0, 0, 0, 0)
+        self.gridLayout.setObjectName("gridLayout")
+        self.labelTitle = QtWidgets.QLabel(self.gridLayoutWidget)
+        font = QtGui.QFont()
+        font.setPointSize(20)
+        font.setBold(True)
+        font.setWeight(75)
+        self.labelTitle.setFont(font)
+        self.labelTitle.setObjectName("labelTitle")
+        self.gridLayout.addWidget(self.labelTitle, 0, 0, 1, 1)
+        self.selectIcommandsButton = QtWidgets.QRadioButton(self.gridLayoutWidget)
+        font = QtGui.QFont()
+        font.setPointSize(13)
+        self.selectIcommandsButton.setFont(font)
+        self.selectIcommandsButton.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
+        self.selectIcommandsButton.setStyleSheet("")
+        self.selectIcommandsButton.setObjectName("selectIcommandsButton")
+        self.gridLayout.addWidget(self.selectIcommandsButton, 2, 0, 1, 1)
+        self.passError = QtWidgets.QLabel(self.gridLayoutWidget)
+        self.passError.setStyleSheet("")
+        self.passError.setText("")
+        self.passError.setObjectName("passError")
+        self.gridLayout.addWidget(self.passError, 10, 2, 1, 1)
+        self.envFileLable = QtWidgets.QLabel(self.gridLayoutWidget)
+        self.envFileLable.setObjectName("envFileLable")
+        self.gridLayout.addWidget(self.envFileLable, 6, 0, 1, 1)
+        self.passwordLabel = QtWidgets.QLabel(self.gridLayoutWidget)
+        self.passwordLabel.setObjectName("passwordLabel")
+        self.gridLayout.addWidget(self.passwordLabel, 9, 0, 1, 1)
+        spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.gridLayout.addItem(spacerItem, 1, 0, 1, 1)
+        self.envError = QtWidgets.QLabel(self.gridLayoutWidget)
+        self.envError.setMaximumSize(QtCore.QSize(16777215, 16777215))
+        self.envError.setStyleSheet("")
+        self.envError.setText("")
+        self.envError.setObjectName("envError")
+        self.gridLayout.addWidget(self.envError, 8, 2, 1, 1)
+        self.standardButton = QtWidgets.QRadioButton(self.gridLayoutWidget)
+        font = QtGui.QFont()
+        font.setPointSize(13)
+        self.standardButton.setFont(font)
+        self.standardButton.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
+        self.standardButton.setStyleSheet("")
+        self.standardButton.setChecked(True)
+        self.standardButton.setObjectName("standardButton")
+        self.gridLayout.addWidget(self.standardButton, 4, 0, 1, 1)
+        self.icommandsError = QtWidgets.QLabel(self.gridLayoutWidget)
+        self.icommandsError.setStyleSheet("")
+        self.icommandsError.setText("")
+        self.icommandsError.setObjectName("icommandsError")
+        self.gridLayout.addWidget(self.icommandsError, 2, 2, 1, 1)
+        spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Maximum)
+        self.gridLayout.addItem(spacerItem1, 5, 0, 1, 1)
+        self.envbox = QtWidgets.QComboBox(self.gridLayoutWidget)
+        self.envbox.setObjectName("envbox")
+        self.gridLayout.addWidget(self.envbox, 6, 1, 1, 2)
+        self.passwordField = QtWidgets.QLineEdit(self.gridLayoutWidget)
+        self.passwordField.setStyleSheet("background-color: rgb(85, 87, 83);")
+        self.passwordField.setText("")
+        self.passwordField.setClearButtonEnabled(True)
+        self.passwordField.setObjectName("passwordField")
+        self.gridLayout.addWidget(self.passwordField, 9, 1, 1, 2)
+        self.horizontalLayoutWidget = QtWidgets.QWidget(irodsLogin)
+        self.horizontalLayoutWidget.setGeometry(QtCore.QRect(10, 260, 741, 61))
+        self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")
+        self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget)
+        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
+        self.horizontalLayout.setObjectName("horizontalLayout")
+        self.ticketButton = QtWidgets.QPushButton(self.horizontalLayoutWidget)
+        self.ticketButton.setObjectName("ticketButton")
+        self.horizontalLayout.addWidget(self.ticketButton)
+        spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout.addItem(spacerItem2)
+        self.connectButton = QtWidgets.QPushButton(self.horizontalLayoutWidget)
+        font = QtGui.QFont()
+        font.setPointSize(13)
+        font.setBold(True)
+        font.setWeight(75)
+        self.connectButton.setFont(font)
+        self.connectButton.setAutoDefault(True)
+        self.connectButton.setDefault(True)
+        self.connectButton.setObjectName("connectButton")
+        self.horizontalLayout.addWidget(self.connectButton)
+
+        self.retranslateUi(irodsLogin)
+        QtCore.QMetaObject.connectSlotsByName(irodsLogin)
+
+    def retranslateUi(self, irodsLogin):
+        _translate = QtCore.QCoreApplication.translate
+        irodsLogin.setWindowTitle(_translate("irodsLogin", "Dialog"))
+        self.labelTitle.setText(_translate("irodsLogin", "iRODS Login"))
+        self.selectIcommandsButton.setText(_translate("irodsLogin", "Up-/Download with icommands (linux only.):"))
+        self.envFileLable.setText(_translate("irodsLogin", "      iRODS environment file:"))
+        self.passwordLabel.setText(_translate("irodsLogin", "      Password"))
+        self.standardButton.setText(_translate("irodsLogin", "Standard Up-/Download"))
+        self.ticketButton.setText(_translate("irodsLogin", "Login with ticket"))
+        self.connectButton.setText(_translate("irodsLogin", "Connect"))
+
+
+if __name__ == "__main__":
+    import sys
+    app = QtWidgets.QApplication(sys.argv)
+    irodsLogin = QtWidgets.QDialog()
+    ui = Ui_irodsLogin()
+    ui.setupUi(irodsLogin)
+    irodsLogin.show()
+    sys.exit(app.exec_())
diff --git a/gui/ui-files/irodsLogin.ui b/gui/ui_files/irodsLogin.ui
similarity index 98%
rename from gui/ui-files/irodsLogin.ui
rename to gui/ui_files/irodsLogin.ui
index b029755e1ada8a74124dfe426d29a3dabc9918b7..08164eaf3e0ec5c7d7593b6180edaefb875f2139 100644
--- a/gui/ui-files/irodsLogin.ui
+++ b/gui/ui_files/irodsLogin.ui
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <ui version="4.0">
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog">
+ <class>irodsLogin</class>
+ <widget class="QDialog" name="irodsLogin">
   <property name="geometry">
    <rect>
     <x>0</x>
diff --git a/gui/ui_files/searchDialog.py b/gui/ui_files/searchDialog.py
new file mode 100644
index 0000000000000000000000000000000000000000..dbc1a8c51dcc156d1b9e3f9b9167b52c12eb9926
--- /dev/null
+++ b/gui/ui_files/searchDialog.py
@@ -0,0 +1,236 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\searchDialog.ui'
+#
+# Created by: PyQt5 UI code generator 5.15.4
+#
+# WARNING: Any manual changes made to this file will be lost when pyuic5 is
+# run again.  Do not edit this file unless you know what you are doing.
+
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_searchDialog(object):
+    def setupUi(self, searchDialog):
+        searchDialog.setObjectName("searchDialog")
+        searchDialog.resize(800, 800)
+        searchDialog.setMinimumSize(QtCore.QSize(800, 800))
+        searchDialog.setStyleSheet("QWidget\n"
+"{\n"
+"    color: rgb(86, 184, 139);\n"
+"    background-color: rgb(54, 54, 54);\n"
+"    selection-background-color: rgb(58, 152, 112);\n"
+"}\n"
+"\n"
+"QTableWidget\n"
+"{\n"
+"background-color: rgb(85, 87, 83);\n"
+"selection-background-color: rgb(58, 152, 112);\n"
+"}\n"
+"\n"
+"QLineEdit\n"
+"{\n"
+"background-color: rgb(85, 87, 83);\n"
+"}\n"
+"\n"
+"QPushButton:disabled{\n"
+"    background-color: rgb(136, 138, 133);\n"
+"}\n"
+"\n"
+"QPushButton#downloadButton, QPushButton#selectSearchButton, QPushButton#startSearchButton\n"
+"{\n"
+"    color: rgb(54, 54, 54);\n"
+"    background-color: rgb(58, 152, 112);\n"
+"}\n"
+"\n"
+"QPushButton#searchExitButton\n"
+"{\n"
+"color: rgb(58, 152, 112);\n"
+"background-color: rgb(54, 54, 54);\n"
+"}\n"
+"\n"
+"QLabel#errorLabel\n"
+"{\n"
+"    color: rgb(217, 174, 23);\n"
+"}\n"
+"")
+        self.verticalLayout_2 = QtWidgets.QVBoxLayout(searchDialog)
+        self.verticalLayout_2.setObjectName("verticalLayout_2")
+        self.gridLayout = QtWidgets.QGridLayout()
+        self.gridLayout.setObjectName("gridLayout")
+        self.val5 = QtWidgets.QLineEdit(searchDialog)
+        self.val5.setObjectName("val5")
+        self.gridLayout.addWidget(self.val5, 7, 1, 1, 1)
+        self.key4 = QtWidgets.QLineEdit(searchDialog)
+        self.key4.setStyleSheet("")
+        self.key4.setObjectName("key4")
+        self.gridLayout.addWidget(self.key4, 6, 0, 1, 1)
+        self.key1 = QtWidgets.QLineEdit(searchDialog)
+        self.key1.setStyleSheet("")
+        self.key1.setObjectName("key1")
+        self.gridLayout.addWidget(self.key1, 3, 0, 1, 1)
+        self.val4 = QtWidgets.QLineEdit(searchDialog)
+        self.val4.setObjectName("val4")
+        self.gridLayout.addWidget(self.val4, 6, 1, 1, 1)
+        self.key5 = QtWidgets.QLineEdit(searchDialog)
+        self.key5.setStyleSheet("")
+        self.key5.setObjectName("key5")
+        self.gridLayout.addWidget(self.key5, 7, 0, 1, 1)
+        self.label_4 = QtWidgets.QLabel(searchDialog)
+        self.label_4.setObjectName("label_4")
+        self.gridLayout.addWidget(self.label_4, 2, 1, 1, 1)
+        self.val1 = QtWidgets.QLineEdit(searchDialog)
+        self.val1.setObjectName("val1")
+        self.gridLayout.addWidget(self.val1, 3, 1, 1, 1)
+        self.key2 = QtWidgets.QLineEdit(searchDialog)
+        self.key2.setStyleSheet("")
+        self.key2.setObjectName("key2")
+        self.gridLayout.addWidget(self.key2, 4, 0, 1, 1)
+        self.val2 = QtWidgets.QLineEdit(searchDialog)
+        self.val2.setObjectName("val2")
+        self.gridLayout.addWidget(self.val2, 4, 1, 1, 1)
+        self.key3 = QtWidgets.QLineEdit(searchDialog)
+        self.key3.setStyleSheet("")
+        self.key3.setText("")
+        self.key3.setObjectName("key3")
+        self.gridLayout.addWidget(self.key3, 5, 0, 1, 1)
+        self.val3 = QtWidgets.QLineEdit(searchDialog)
+        self.val3.setObjectName("val3")
+        self.gridLayout.addWidget(self.val3, 5, 1, 1, 1)
+        self.label_3 = QtWidgets.QLabel(searchDialog)
+        self.label_3.setObjectName("label_3")
+        self.gridLayout.addWidget(self.label_3, 2, 0, 1, 1)
+        self.verticalLayout_2.addLayout(self.gridLayout)
+        self.label_2 = QtWidgets.QLabel(searchDialog)
+        self.label_2.setObjectName("label_2")
+        self.verticalLayout_2.addWidget(self.label_2)
+        self.pathPattern = QtWidgets.QLineEdit(searchDialog)
+        self.pathPattern.setStyleSheet("")
+        self.pathPattern.setText("")
+        self.pathPattern.setObjectName("pathPattern")
+        self.verticalLayout_2.addWidget(self.pathPattern)
+        self.label = QtWidgets.QLabel(searchDialog)
+        self.label.setObjectName("label")
+        self.verticalLayout_2.addWidget(self.label)
+        self.objPattern = QtWidgets.QLineEdit(searchDialog)
+        self.objPattern.setStyleSheet("")
+        self.objPattern.setObjectName("objPattern")
+        self.verticalLayout_2.addWidget(self.objPattern)
+        self.label_5 = QtWidgets.QLabel(searchDialog)
+        self.label_5.setObjectName("label_5")
+        self.verticalLayout_2.addWidget(self.label_5)
+        self.checksumPattern = QtWidgets.QLineEdit(searchDialog)
+        self.checksumPattern.setStyleSheet("")
+        self.checksumPattern.setText("")
+        self.checksumPattern.setObjectName("checksumPattern")
+        self.verticalLayout_2.addWidget(self.checksumPattern)
+        spacerItem = QtWidgets.QSpacerItem(20, 10, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
+        self.verticalLayout_2.addItem(spacerItem)
+        self.startSearchButton = QtWidgets.QPushButton(searchDialog)
+        font = QtGui.QFont()
+        font.setBold(True)
+        font.setWeight(75)
+        self.startSearchButton.setFont(font)
+        self.startSearchButton.setStyleSheet("")
+        self.startSearchButton.setDefault(True)
+        self.startSearchButton.setObjectName("startSearchButton")
+        self.verticalLayout_2.addWidget(self.startSearchButton)
+        spacerItem1 = QtWidgets.QSpacerItem(20, 10, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
+        self.verticalLayout_2.addItem(spacerItem1)
+        self.verticalLayout = QtWidgets.QVBoxLayout()
+        self.verticalLayout.setObjectName("verticalLayout")
+        self.horizontalLayout = QtWidgets.QHBoxLayout()
+        self.horizontalLayout.setObjectName("horizontalLayout")
+        self.label_6 = QtWidgets.QLabel(searchDialog)
+        font = QtGui.QFont()
+        font.setPointSize(13)
+        font.setBold(True)
+        font.setWeight(75)
+        self.label_6.setFont(font)
+        self.label_6.setObjectName("label_6")
+        self.horizontalLayout.addWidget(self.label_6)
+        self.verticalLayout.addLayout(self.horizontalLayout)
+        self.searchResultTable = QtWidgets.QTableWidget(searchDialog)
+        self.searchResultTable.setStyleSheet("")
+        self.searchResultTable.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents)
+        self.searchResultTable.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
+        self.searchResultTable.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection)
+        self.searchResultTable.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
+        self.searchResultTable.setObjectName("searchResultTable")
+        self.searchResultTable.setColumnCount(3)
+        self.searchResultTable.setRowCount(0)
+        item = QtWidgets.QTableWidgetItem()
+        self.searchResultTable.setHorizontalHeaderItem(0, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.searchResultTable.setHorizontalHeaderItem(1, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.searchResultTable.setHorizontalHeaderItem(2, item)
+        self.verticalLayout.addWidget(self.searchResultTable)
+        spacerItem2 = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
+        self.verticalLayout.addItem(spacerItem2)
+        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
+        self.selectSearchButton = QtWidgets.QPushButton(searchDialog)
+        font = QtGui.QFont()
+        font.setBold(True)
+        font.setWeight(75)
+        self.selectSearchButton.setFont(font)
+        self.selectSearchButton.setStyleSheet("")
+        self.selectSearchButton.setObjectName("selectSearchButton")
+        self.horizontalLayout_2.addWidget(self.selectSearchButton)
+        self.downloadButton = QtWidgets.QPushButton(searchDialog)
+        font = QtGui.QFont()
+        font.setBold(True)
+        font.setWeight(75)
+        self.downloadButton.setFont(font)
+        self.downloadButton.setStyleSheet("")
+        self.downloadButton.setObjectName("downloadButton")
+        self.horizontalLayout_2.addWidget(self.downloadButton)
+        self.searchExitButton = QtWidgets.QPushButton(searchDialog)
+        font = QtGui.QFont()
+        font.setBold(True)
+        font.setWeight(75)
+        self.searchExitButton.setFont(font)
+        self.searchExitButton.setStyleSheet("")
+        self.searchExitButton.setObjectName("searchExitButton")
+        self.horizontalLayout_2.addWidget(self.searchExitButton)
+        self.verticalLayout.addLayout(self.horizontalLayout_2)
+        self.verticalLayout_2.addLayout(self.verticalLayout)
+        self.errorLabel = QtWidgets.QLabel(searchDialog)
+        self.errorLabel.setText("")
+        self.errorLabel.setObjectName("errorLabel")
+        self.verticalLayout_2.addWidget(self.errorLabel)
+
+        self.retranslateUi(searchDialog)
+        QtCore.QMetaObject.connectSlotsByName(searchDialog)
+
+    def retranslateUi(self, searchDialog):
+        _translate = QtCore.QCoreApplication.translate
+        searchDialog.setWindowTitle(_translate("searchDialog", "Dialog"))
+        self.label_4.setText(_translate("searchDialog", "Value (optional)"))
+        self.label_3.setText(_translate("searchDialog", "Key"))
+        self.label_2.setText(_translate("searchDialog", "Collection name (wildcard \'%\')"))
+        self.label.setText(_translate("searchDialog", "Object name (wildcard \'%\')"))
+        self.label_5.setText(_translate("searchDialog", "Checksum (wildcard \'%\')"))
+        self.startSearchButton.setText(_translate("searchDialog", "Search"))
+        self.label_6.setText(_translate("searchDialog", "Results:"))
+        item = self.searchResultTable.horizontalHeaderItem(0)
+        item.setText(_translate("searchDialog", "Path"))
+        item = self.searchResultTable.horizontalHeaderItem(1)
+        item.setText(_translate("searchDialog", "Name"))
+        item = self.searchResultTable.horizontalHeaderItem(2)
+        item.setText(_translate("searchDialog", "Checksum"))
+        self.selectSearchButton.setText(_translate("searchDialog", "Select and Close"))
+        self.downloadButton.setText(_translate("searchDialog", "Download Selection"))
+        self.searchExitButton.setText(_translate("searchDialog", "Close"))
+
+
+if __name__ == "__main__":
+    import sys
+    app = QtWidgets.QApplication(sys.argv)
+    searchDialog = QtWidgets.QDialog()
+    ui = Ui_searchDialog()
+    ui.setupUi(searchDialog)
+    searchDialog.show()
+    sys.exit(app.exec_())
diff --git a/gui/ui-files/searchDialog.ui b/gui/ui_files/searchDialog.ui
similarity index 99%
rename from gui/ui-files/searchDialog.ui
rename to gui/ui_files/searchDialog.ui
index 1ef16799162bc3a6f82e165d26399ead33e28fd9..e36dd28c17c995c0ecc9caa0337ab6a9b5c8fa01 100644
--- a/gui/ui-files/searchDialog.ui
+++ b/gui/ui_files/searchDialog.ui
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <ui version="4.0">
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog">
+ <class>searchDialog</class>
+ <widget class="QDialog" name="searchDialog">
   <property name="geometry">
    <rect>
     <x>0</x>
diff --git a/gui/ui_files/tabBrowser.py b/gui/ui_files/tabBrowser.py
new file mode 100644
index 0000000000000000000000000000000000000000..2063b148abfedb1242d921bc0657442e7345e548
--- /dev/null
+++ b/gui/ui_files/tabBrowser.py
@@ -0,0 +1,406 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\tabBrowser.ui'
+#
+# Created by: PyQt5 UI code generator 5.15.4
+#
+# WARNING: Any manual changes made to this file will be lost when pyuic5 is
+# run again.  Do not edit this file unless you know what you are doing.
+
+
+from os.path import dirname, join, pardir, realpath
+import sys
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_tabBrowser(object):
+    def setupUi(self, tabBrowser):
+        tabBrowser.setObjectName("tabBrowser")
+        tabBrowser.resize(1278, 781)
+        tabBrowser.setStyleSheet("QWidget\n"
+"{\n"
+"    color: rgb(86, 184, 139);\n"
+"    background-color: rgb(54, 54, 54);\n"
+"    selection-background-color: rgb(58, 152, 112);\n"
+"}\n"
+"\n"
+"QTabWidget\n"
+"{\n"
+"background-color: rgb(85, 87, 83);\n"
+"}\n"
+"\n"
+"QTableWidget\n"
+"{\n"
+"background-color: rgb(85, 87, 83);\n"
+"selection-background-color: rgb(58, 152, 112);\n"
+"}\n"
+"\n"
+"QLabel#errorLabel\n"
+"{\n"
+"color: rgb(217, 174, 23);\n"
+"}\n"
+"\n"
+"QLineEdit#inputPath\n"
+"{\n"
+"background-color: rgb(85, 87, 83);\n"
+"}\n"
+"\n"
+"QPushButton#dataDeleteButton\n"
+"{\n"
+"background-color: rgb(164, 0, 0);\n"
+"color: rgb(46, 52, 54);\n"
+"}")
+        self.verticalLayout = QtWidgets.QVBoxLayout(tabBrowser)
+        self.verticalLayout.setObjectName("verticalLayout")
+        self.gridLayout = QtWidgets.QGridLayout()
+        self.gridLayout.setObjectName("gridLayout")
+        self.inputPath = QtWidgets.QLineEdit(tabBrowser)
+        font = QtGui.QFont()
+        font.setPointSize(16)
+        self.inputPath.setFont(font)
+        self.inputPath.setStyleSheet("")
+        self.inputPath.setEchoMode(QtWidgets.QLineEdit.Normal)
+        self.inputPath.setPlaceholderText("")
+        self.inputPath.setClearButtonEnabled(True)
+        self.inputPath.setObjectName("inputPath")
+        self.gridLayout.addWidget(self.inputPath, 0, 1, 1, 1)
+        self.createCollButton = QtWidgets.QPushButton(tabBrowser)
+        self.createCollButton.setObjectName("createCollButton")
+        self.gridLayout.addWidget(self.createCollButton, 0, 5, 1, 1)
+        self.label_2 = QtWidgets.QLabel(tabBrowser)
+        font = QtGui.QFont()
+        font.setPointSize(16)
+        font.setBold(True)
+        font.setWeight(75)
+        self.label_2.setFont(font)
+        self.label_2.setObjectName("label_2")
+        self.gridLayout.addWidget(self.label_2, 0, 0, 1, 1)
+        self.homeButton = QtWidgets.QPushButton(tabBrowser)
+        self.homeButton.setText("")
+        icon = QtGui.QIcon()
+        if getattr(sys, 'frozen', False):
+                icon.addPixmap(QtGui.QPixmap(join(dirname(realpath(sys.argv[0])), pardir) + "/icons/home.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        else:
+                icon.addPixmap(QtGui.QPixmap(dirname(realpath(sys.argv[0])) + "/icons/home.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        self.homeButton.setIcon(icon)
+        self.homeButton.setObjectName("homeButton")
+        self.gridLayout.addWidget(self.homeButton, 0, 2, 1, 1)
+        self.UploadButton = QtWidgets.QPushButton(tabBrowser)
+        self.UploadButton.setObjectName("UploadButton")
+        self.gridLayout.addWidget(self.UploadButton, 1, 5, 1, 1)
+        self.DownloadButton = QtWidgets.QPushButton(tabBrowser)
+        self.DownloadButton.setObjectName("DownloadButton")
+        self.gridLayout.addWidget(self.DownloadButton, 1, 2, 1, 1)
+        self.verticalLayout.addLayout(self.gridLayout)
+        spacerItem = QtWidgets.QSpacerItem(20, 10, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
+        self.verticalLayout.addItem(spacerItem)
+        self.collTable = QtWidgets.QTableWidget(tabBrowser)
+        self.collTable.setMinimumSize(QtCore.QSize(0, 250))
+        self.collTable.setStyleSheet("")
+        self.collTable.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents)
+        self.collTable.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
+        self.collTable.setAlternatingRowColors(False)
+        self.collTable.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection)
+        self.collTable.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
+        self.collTable.setObjectName("collTable")
+        self.collTable.setColumnCount(5)
+        self.collTable.setRowCount(0)
+        item = QtWidgets.QTableWidgetItem()
+        item.setText("Path")
+        self.collTable.setHorizontalHeaderItem(0, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.collTable.setHorizontalHeaderItem(1, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.collTable.setHorizontalHeaderItem(2, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.collTable.setHorizontalHeaderItem(3, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.collTable.setHorizontalHeaderItem(4, item)
+        self.verticalLayout.addWidget(self.collTable)
+        spacerItem1 = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
+        self.verticalLayout.addItem(spacerItem1)
+        self.viewTabs = QtWidgets.QTabWidget(tabBrowser)
+        self.viewTabs.setStyleSheet("")
+        self.viewTabs.setObjectName("viewTabs")
+        self.preview = QtWidgets.QWidget()
+        font = QtGui.QFont()
+        font.setBold(False)
+        font.setWeight(50)
+        self.preview.setFont(font)
+        self.preview.setAutoFillBackground(False)
+        self.preview.setObjectName("preview")
+        self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.preview)
+        self.verticalLayout_2.setObjectName("verticalLayout_2")
+        self.previewBrowser = QtWidgets.QTextBrowser(self.preview)
+        self.previewBrowser.setObjectName("previewBrowser")
+        self.verticalLayout_2.addWidget(self.previewBrowser)
+        self.viewTabs.addTab(self.preview, "")
+        self.metadata = QtWidgets.QWidget()
+        self.metadata.setObjectName("metadata")
+        self.horizontalLayout = QtWidgets.QHBoxLayout(self.metadata)
+        self.horizontalLayout.setObjectName("horizontalLayout")
+        self.metadataTable = QtWidgets.QTableWidget(self.metadata)
+        self.metadataTable.setMinimumSize(QtCore.QSize(600, 300))
+        self.metadataTable.setStyleSheet("")
+        self.metadataTable.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents)
+        self.metadataTable.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
+        self.metadataTable.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection)
+        self.metadataTable.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
+        self.metadataTable.setObjectName("metadataTable")
+        self.metadataTable.setColumnCount(3)
+        self.metadataTable.setRowCount(0)
+        item = QtWidgets.QTableWidgetItem()
+        self.metadataTable.setHorizontalHeaderItem(0, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.metadataTable.setHorizontalHeaderItem(1, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.metadataTable.setHorizontalHeaderItem(2, item)
+        self.horizontalLayout.addWidget(self.metadataTable)
+        self.gridLayout_2 = QtWidgets.QGridLayout()
+        self.gridLayout_2.setObjectName("gridLayout_2")
+        spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.gridLayout_2.addItem(spacerItem2, 9, 0, 1, 1)
+        self.metaUnitsField = QtWidgets.QLineEdit(self.metadata)
+        self.metaUnitsField.setObjectName("metaUnitsField")
+        self.gridLayout_2.addWidget(self.metaUnitsField, 6, 2, 1, 1)
+        self.label_6 = QtWidgets.QLabel(self.metadata)
+        self.label_6.setObjectName("label_6")
+        self.gridLayout_2.addWidget(self.label_6, 4, 1, 1, 1)
+        self.metaUpdateButton = QtWidgets.QPushButton(self.metadata)
+        font = QtGui.QFont()
+        font.setBold(True)
+        font.setWeight(75)
+        self.metaUpdateButton.setFont(font)
+        self.metaUpdateButton.setObjectName("metaUpdateButton")
+        self.gridLayout_2.addWidget(self.metaUpdateButton, 7, 1, 1, 1)
+        self.metaKeyField = QtWidgets.QLineEdit(self.metadata)
+        self.metaKeyField.setObjectName("metaKeyField")
+        self.gridLayout_2.addWidget(self.metaKeyField, 6, 0, 1, 1)
+        self.metaAddButton = QtWidgets.QPushButton(self.metadata)
+        font = QtGui.QFont()
+        font.setBold(True)
+        font.setWeight(75)
+        self.metaAddButton.setFont(font)
+        self.metaAddButton.setObjectName("metaAddButton")
+        self.gridLayout_2.addWidget(self.metaAddButton, 7, 0, 1, 1)
+        self.label_3 = QtWidgets.QLabel(self.metadata)
+        font = QtGui.QFont()
+        font.setPointSize(20)
+        font.setBold(True)
+        font.setWeight(75)
+        self.label_3.setFont(font)
+        self.label_3.setObjectName("label_3")
+        self.gridLayout_2.addWidget(self.label_3, 0, 0, 1, 1)
+        self.label_5 = QtWidgets.QLabel(self.metadata)
+        self.label_5.setObjectName("label_5")
+        self.gridLayout_2.addWidget(self.label_5, 4, 2, 1, 1)
+        self.label_4 = QtWidgets.QLabel(self.metadata)
+        self.label_4.setObjectName("label_4")
+        self.gridLayout_2.addWidget(self.label_4, 4, 0, 1, 1)
+        self.metaDeleteButton = QtWidgets.QPushButton(self.metadata)
+        font = QtGui.QFont()
+        font.setBold(True)
+        font.setWeight(75)
+        self.metaDeleteButton.setFont(font)
+        self.metaDeleteButton.setObjectName("metaDeleteButton")
+        self.gridLayout_2.addWidget(self.metaDeleteButton, 7, 2, 1, 1)
+        self.metaValueField = QtWidgets.QLineEdit(self.metadata)
+        self.metaValueField.setObjectName("metaValueField")
+        self.gridLayout_2.addWidget(self.metaValueField, 6, 1, 1, 1)
+        self.horizontalLayout.addLayout(self.gridLayout_2)
+        self.viewTabs.addTab(self.metadata, "")
+        self.accession = QtWidgets.QWidget()
+        self.accession.setObjectName("accession")
+        self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.accession)
+        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
+        self.aclTable = QtWidgets.QTableWidget(self.accession)
+        self.aclTable.setMinimumSize(QtCore.QSize(600, 0))
+        self.aclTable.setStyleSheet("")
+        self.aclTable.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents)
+        self.aclTable.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
+        self.aclTable.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection)
+        self.aclTable.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
+        self.aclTable.setObjectName("aclTable")
+        self.aclTable.setColumnCount(3)
+        self.aclTable.setRowCount(0)
+        item = QtWidgets.QTableWidgetItem()
+        self.aclTable.setHorizontalHeaderItem(0, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.aclTable.setHorizontalHeaderItem(1, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.aclTable.setHorizontalHeaderItem(2, item)
+        self.horizontalLayout_2.addWidget(self.aclTable)
+        self.gridLayout_4 = QtWidgets.QGridLayout()
+        self.gridLayout_4.setObjectName("gridLayout_4")
+        self.label_10 = QtWidgets.QLabel(self.accession)
+        self.label_10.setObjectName("label_10")
+        self.gridLayout_4.addWidget(self.label_10, 4, 2, 1, 1)
+        self.aclAddButton = QtWidgets.QPushButton(self.accession)
+        font = QtGui.QFont()
+        font.setBold(True)
+        font.setWeight(75)
+        self.aclAddButton.setFont(font)
+        self.aclAddButton.setObjectName("aclAddButton")
+        self.gridLayout_4.addWidget(self.aclAddButton, 7, 3, 1, 1)
+        self.label_11 = QtWidgets.QLabel(self.accession)
+        font = QtGui.QFont()
+        font.setPointSize(20)
+        font.setBold(True)
+        font.setWeight(75)
+        self.label_11.setFont(font)
+        self.label_11.setObjectName("label_11")
+        self.gridLayout_4.addWidget(self.label_11, 0, 0, 1, 1)
+        self.label_7 = QtWidgets.QLabel(self.accession)
+        self.label_7.setObjectName("label_7")
+        self.gridLayout_4.addWidget(self.label_7, 4, 3, 1, 1)
+        self.aclBox = QtWidgets.QComboBox(self.accession)
+        self.aclBox.setObjectName("aclBox")
+        self.aclBox.addItem("")
+        self.aclBox.addItem("")
+        self.aclBox.addItem("")
+        self.aclBox.addItem("")
+        self.aclBox.addItem("")
+        self.gridLayout_4.addWidget(self.aclBox, 6, 2, 1, 1)
+        self.aclUserField = QtWidgets.QLineEdit(self.accession)
+        self.aclUserField.setObjectName("aclUserField")
+        self.gridLayout_4.addWidget(self.aclUserField, 6, 0, 1, 1)
+        self.label_13 = QtWidgets.QLabel(self.accession)
+        self.label_13.setObjectName("label_13")
+        self.gridLayout_4.addWidget(self.label_13, 4, 0, 1, 1)
+        self.recurseBox = QtWidgets.QComboBox(self.accession)
+        self.recurseBox.setObjectName("recurseBox")
+        self.recurseBox.addItem("")
+        self.recurseBox.addItem("")
+        self.gridLayout_4.addWidget(self.recurseBox, 6, 3, 1, 1)
+        spacerItem3 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.gridLayout_4.addItem(spacerItem3, 8, 0, 1, 1)
+        self.aclZoneField = QtWidgets.QLineEdit(self.accession)
+        self.aclZoneField.setObjectName("aclZoneField")
+        self.gridLayout_4.addWidget(self.aclZoneField, 6, 1, 1, 1)
+        self.label_8 = QtWidgets.QLabel(self.accession)
+        self.label_8.setObjectName("label_8")
+        self.gridLayout_4.addWidget(self.label_8, 4, 1, 1, 1)
+        self.horizontalLayout_2.addLayout(self.gridLayout_4)
+        self.viewTabs.addTab(self.accession, "")
+        self.resources = QtWidgets.QWidget()
+        self.resources.setObjectName("resources")
+        self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.resources)
+        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
+        self.resourceTable = QtWidgets.QTableWidget(self.resources)
+        self.resourceTable.setStyleSheet("")
+        self.resourceTable.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents)
+        self.resourceTable.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
+        self.resourceTable.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection)
+        self.resourceTable.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
+        self.resourceTable.setObjectName("resourceTable")
+        self.resourceTable.setColumnCount(2)
+        self.resourceTable.setRowCount(0)
+        item = QtWidgets.QTableWidgetItem()
+        self.resourceTable.setHorizontalHeaderItem(0, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.resourceTable.setHorizontalHeaderItem(1, item)
+        self.horizontalLayout_3.addWidget(self.resourceTable)
+        self.viewTabs.addTab(self.resources, "")
+        self.delete_2 = QtWidgets.QWidget()
+        self.delete_2.setObjectName("delete_2")
+        self.horizontalLayout_6 = QtWidgets.QHBoxLayout(self.delete_2)
+        self.horizontalLayout_6.setObjectName("horizontalLayout_6")
+        self.deleteSelectionBrowser = QtWidgets.QTextBrowser(self.delete_2)
+        self.deleteSelectionBrowser.setObjectName("deleteSelectionBrowser")
+        self.horizontalLayout_6.addWidget(self.deleteSelectionBrowser)
+        self.verticalLayout_5 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_5.setObjectName("verticalLayout_5")
+        self.loadDeleteSelectionButton = QtWidgets.QPushButton(self.delete_2)
+        self.loadDeleteSelectionButton.setObjectName("loadDeleteSelectionButton")
+        self.verticalLayout_5.addWidget(self.loadDeleteSelectionButton)
+        spacerItem4 = QtWidgets.QSpacerItem(20, 30, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
+        self.verticalLayout_5.addItem(spacerItem4)
+        self.dataDeleteButton = QtWidgets.QPushButton(self.delete_2)
+        font = QtGui.QFont()
+        font.setPointSize(13)
+        font.setBold(True)
+        font.setWeight(75)
+        self.dataDeleteButton.setFont(font)
+        self.dataDeleteButton.setStyleSheet("")
+        self.dataDeleteButton.setObjectName("dataDeleteButton")
+        self.verticalLayout_5.addWidget(self.dataDeleteButton)
+        self.horizontalLayout_6.addLayout(self.verticalLayout_5)
+        self.viewTabs.addTab(self.delete_2, "")
+        self.verticalLayout.addWidget(self.viewTabs)
+        self.errorLabel = QtWidgets.QLabel(tabBrowser)
+        self.errorLabel.setStyleSheet("")
+        self.errorLabel.setText("")
+        self.errorLabel.setObjectName("errorLabel")
+        self.verticalLayout.addWidget(self.errorLabel)
+
+        self.retranslateUi(tabBrowser)
+        self.viewTabs.setCurrentIndex(3)
+        QtCore.QMetaObject.connectSlotsByName(tabBrowser)
+
+    def retranslateUi(self, tabBrowser):
+        _translate = QtCore.QCoreApplication.translate
+        tabBrowser.setWindowTitle(_translate("tabBrowser", "Form"))
+        self.inputPath.setText(_translate("tabBrowser", "/zoneName/home/user"))
+        self.createCollButton.setText(_translate("tabBrowser", "Create Collection"))
+        self.label_2.setText(_translate("tabBrowser", "iRODS path: "))
+        self.UploadButton.setText(_translate("tabBrowser", "File Upload"))
+        self.DownloadButton.setText(_translate("tabBrowser", "File Download"))
+        item = self.collTable.horizontalHeaderItem(1)
+        item.setText(_translate("tabBrowser", "Name"))
+        item = self.collTable.horizontalHeaderItem(2)
+        item.setText(_translate("tabBrowser", "Size"))
+        item = self.collTable.horizontalHeaderItem(3)
+        item.setText(_translate("tabBrowser", "Checksum"))
+        item = self.collTable.horizontalHeaderItem(4)
+        item.setText(_translate("tabBrowser", "Last modified"))
+        self.viewTabs.setTabText(self.viewTabs.indexOf(self.preview), _translate("tabBrowser", "Preview"))
+        item = self.metadataTable.horizontalHeaderItem(0)
+        item.setText(_translate("tabBrowser", "Key"))
+        item = self.metadataTable.horizontalHeaderItem(1)
+        item.setText(_translate("tabBrowser", "Value"))
+        item = self.metadataTable.horizontalHeaderItem(2)
+        item.setText(_translate("tabBrowser", "Units"))
+        self.label_6.setText(_translate("tabBrowser", "Value"))
+        self.metaUpdateButton.setText(_translate("tabBrowser", "Update"))
+        self.metaAddButton.setText(_translate("tabBrowser", "Add"))
+        self.label_3.setText(_translate("tabBrowser", "Edit"))
+        self.label_5.setText(_translate("tabBrowser", "Units"))
+        self.label_4.setText(_translate("tabBrowser", "Key"))
+        self.metaDeleteButton.setText(_translate("tabBrowser", "Delete"))
+        self.viewTabs.setTabText(self.viewTabs.indexOf(self.metadata), _translate("tabBrowser", "Metadata"))
+        item = self.aclTable.horizontalHeaderItem(0)
+        item.setText(_translate("tabBrowser", "User name"))
+        item = self.aclTable.horizontalHeaderItem(1)
+        item.setText(_translate("tabBrowser", "Zone"))
+        item = self.aclTable.horizontalHeaderItem(2)
+        item.setText(_translate("tabBrowser", "Permission type"))
+        self.label_10.setText(_translate("tabBrowser", "Permission type"))
+        self.aclAddButton.setText(_translate("tabBrowser", "Add"))
+        self.label_11.setText(_translate("tabBrowser", "Edit"))
+        self.label_7.setText(_translate("tabBrowser", "Recursive"))
+        self.aclBox.setItemText(0, _translate("tabBrowser", "----"))
+        self.aclBox.setItemText(1, _translate("tabBrowser", "null"))
+        self.aclBox.setItemText(2, _translate("tabBrowser", "read"))
+        self.aclBox.setItemText(3, _translate("tabBrowser", "write"))
+        self.aclBox.setItemText(4, _translate("tabBrowser", "own"))
+        self.label_13.setText(_translate("tabBrowser", "User name"))
+        self.recurseBox.setItemText(0, _translate("tabBrowser", "False"))
+        self.recurseBox.setItemText(1, _translate("tabBrowser", "True"))
+        self.label_8.setText(_translate("tabBrowser", "UserZone"))
+        self.viewTabs.setTabText(self.viewTabs.indexOf(self.accession), _translate("tabBrowser", "Permissions"))
+        item = self.resourceTable.horizontalHeaderItem(0)
+        item.setText(_translate("tabBrowser", "Resource name"))
+        self.viewTabs.setTabText(self.viewTabs.indexOf(self.resources), _translate("tabBrowser", "Resources"))
+        self.loadDeleteSelectionButton.setText(_translate("tabBrowser", "Load"))
+        self.dataDeleteButton.setText(_translate("tabBrowser", "Delete"))
+        self.viewTabs.setTabText(self.viewTabs.indexOf(self.delete_2), _translate("tabBrowser", "Delete"))
+
+
+if __name__ == "__main__":
+    import sys
+    app = QtWidgets.QApplication(sys.argv)
+    tabBrowser = QtWidgets.QWidget()
+    ui = Ui_tabBrowser()
+    ui.setupUi(tabBrowser)
+    tabBrowser.show()
+    sys.exit(app.exec_())
diff --git a/gui/ui-files/tabBrowser.ui b/gui/ui_files/tabBrowser.ui
similarity index 99%
rename from gui/ui-files/tabBrowser.ui
rename to gui/ui_files/tabBrowser.ui
index 806679f02c1f60f3b616ffea09d65cf09023d0aa..5b11c4a83b3e2e241a50145f67c7cf9ffdc7ff1f 100644
--- a/gui/ui-files/tabBrowser.ui
+++ b/gui/ui_files/tabBrowser.ui
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <ui version="4.0">
- <class>Form</class>
- <widget class="QWidget" name="Form">
+ <class>tabBrowser</class>
+ <widget class="QWidget" name="tabBrowser">
   <property name="geometry">
    <rect>
     <x>0</x>
diff --git a/gui/ui_files/tabDataCompression.py b/gui/ui_files/tabDataCompression.py
new file mode 100644
index 0000000000000000000000000000000000000000..13a494e95f0cfc1b46f337dd24ac340172bdc7f2
--- /dev/null
+++ b/gui/ui_files/tabDataCompression.py
@@ -0,0 +1,181 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\tabDataCompression.ui'
+#
+# Created by: PyQt5 UI code generator 5.15.4
+#
+# WARNING: Any manual changes made to this file will be lost when pyuic5 is
+# run again.  Do not edit this file unless you know what you are doing.
+
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_tabDataCompression(object):
+    def setupUi(self, tabDataCompression):
+        tabDataCompression.setObjectName("tabDataCompression")
+        tabDataCompression.resize(640, 528)
+        tabDataCompression.setStyleSheet("QWidget\n"
+"{\n"
+"    color: rgb(86, 184, 139);\n"
+"    background-color: rgb(54, 54, 54);\n"
+"    selection-background-color: rgb(58, 152, 112);\n"
+"}\n"
+"\n"
+"QTreeView\n"
+"{\n"
+"background-color: rgb(85, 87, 83);\n"
+"}\n"
+"\n"
+"QLabel#createStatusLabel\n"
+"{\n"
+"color: rgb(217, 174, 23);\n"
+"}\n"
+"\n"
+"QLabel#unpackStatusLabel\n"
+"{\n"
+"color: rgb(217, 174, 23);\n"
+"}\n"
+"")
+        self.verticalLayout_3 = QtWidgets.QVBoxLayout(tabDataCompression)
+        self.verticalLayout_3.setObjectName("verticalLayout_3")
+        self.label_2 = QtWidgets.QLabel(tabDataCompression)
+        font = QtGui.QFont()
+        font.setPointSize(13)
+        font.setBold(True)
+        font.setWeight(75)
+        self.label_2.setFont(font)
+        self.label_2.setObjectName("label_2")
+        self.verticalLayout_3.addWidget(self.label_2)
+        spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.verticalLayout_3.addItem(spacerItem)
+        self.irodsZoneLabel1 = QtWidgets.QLabel(tabDataCompression)
+        self.irodsZoneLabel1.setText("")
+        self.irodsZoneLabel1.setObjectName("irodsZoneLabel1")
+        self.verticalLayout_3.addWidget(self.irodsZoneLabel1)
+        self.horizontalLayout = QtWidgets.QHBoxLayout()
+        self.horizontalLayout.setObjectName("horizontalLayout")
+        self.irodsCollectionTree = QtWidgets.QTreeView(tabDataCompression)
+        self.irodsCollectionTree.setMinimumSize(QtCore.QSize(0, 150))
+        self.irodsCollectionTree.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
+        self.irodsCollectionTree.setSelectionMode(QtWidgets.QAbstractItemView.NoSelection)
+        self.irodsCollectionTree.setObjectName("irodsCollectionTree")
+        self.horizontalLayout.addWidget(self.irodsCollectionTree)
+        self.verticalLayout = QtWidgets.QVBoxLayout()
+        self.verticalLayout.setObjectName("verticalLayout")
+        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
+        self.label = QtWidgets.QLabel(tabDataCompression)
+        self.label.setObjectName("label")
+        self.horizontalLayout_2.addWidget(self.label)
+        self.compressRescButton = QtWidgets.QComboBox(tabDataCompression)
+        self.compressRescButton.setObjectName("compressRescButton")
+        self.horizontalLayout_2.addWidget(self.compressRescButton)
+        self.verticalLayout.addLayout(self.horizontalLayout_2)
+        spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.verticalLayout.addItem(spacerItem1)
+        self.compressCheckBox = QtWidgets.QCheckBox(tabDataCompression)
+        self.compressCheckBox.setObjectName("compressCheckBox")
+        self.verticalLayout.addWidget(self.compressCheckBox)
+        self.removeCheckBox = QtWidgets.QCheckBox(tabDataCompression)
+        self.removeCheckBox.setObjectName("removeCheckBox")
+        self.verticalLayout.addWidget(self.removeCheckBox)
+        spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.verticalLayout.addItem(spacerItem2)
+        self.createButton = QtWidgets.QPushButton(tabDataCompression)
+        font = QtGui.QFont()
+        font.setBold(True)
+        font.setWeight(75)
+        self.createButton.setFont(font)
+        self.createButton.setObjectName("createButton")
+        self.verticalLayout.addWidget(self.createButton)
+        self.horizontalLayout.addLayout(self.verticalLayout)
+        self.verticalLayout_3.addLayout(self.horizontalLayout)
+        spacerItem3 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.verticalLayout_3.addItem(spacerItem3)
+        self.createStatusLabel = QtWidgets.QLabel(tabDataCompression)
+        self.createStatusLabel.setStyleSheet("")
+        self.createStatusLabel.setText("")
+        self.createStatusLabel.setObjectName("createStatusLabel")
+        self.verticalLayout_3.addWidget(self.createStatusLabel)
+        spacerItem4 = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.verticalLayout_3.addItem(spacerItem4)
+        self.label_3 = QtWidgets.QLabel(tabDataCompression)
+        font = QtGui.QFont()
+        font.setPointSize(13)
+        font.setBold(True)
+        font.setWeight(75)
+        self.label_3.setFont(font)
+        self.label_3.setObjectName("label_3")
+        self.verticalLayout_3.addWidget(self.label_3)
+        spacerItem5 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.verticalLayout_3.addItem(spacerItem5)
+        self.irodsZoneLabel2 = QtWidgets.QLabel(tabDataCompression)
+        self.irodsZoneLabel2.setText("")
+        self.irodsZoneLabel2.setObjectName("irodsZoneLabel2")
+        self.verticalLayout_3.addWidget(self.irodsZoneLabel2)
+        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
+        self.irodsCompressionTree = QtWidgets.QTreeView(tabDataCompression)
+        self.irodsCompressionTree.setMinimumSize(QtCore.QSize(0, 150))
+        self.irodsCompressionTree.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
+        self.irodsCompressionTree.setSelectionMode(QtWidgets.QAbstractItemView.NoSelection)
+        self.irodsCompressionTree.setObjectName("irodsCompressionTree")
+        self.horizontalLayout_3.addWidget(self.irodsCompressionTree)
+        self.verticalLayout_2 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_2.setObjectName("verticalLayout_2")
+        self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
+        self.label_4 = QtWidgets.QLabel(tabDataCompression)
+        self.label_4.setObjectName("label_4")
+        self.horizontalLayout_4.addWidget(self.label_4)
+        self.decompressRescButton = QtWidgets.QComboBox(tabDataCompression)
+        self.decompressRescButton.setObjectName("decompressRescButton")
+        self.horizontalLayout_4.addWidget(self.decompressRescButton)
+        self.verticalLayout_2.addLayout(self.horizontalLayout_4)
+        spacerItem6 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.verticalLayout_2.addItem(spacerItem6)
+        self.indexButton = QtWidgets.QPushButton(tabDataCompression)
+        self.indexButton.setObjectName("indexButton")
+        self.verticalLayout_2.addWidget(self.indexButton)
+        self.unpackButton = QtWidgets.QPushButton(tabDataCompression)
+        font = QtGui.QFont()
+        font.setBold(True)
+        font.setWeight(75)
+        self.unpackButton.setFont(font)
+        self.unpackButton.setObjectName("unpackButton")
+        self.verticalLayout_2.addWidget(self.unpackButton)
+        self.horizontalLayout_3.addLayout(self.verticalLayout_2)
+        self.verticalLayout_3.addLayout(self.horizontalLayout_3)
+        self.unpackStatusLabel = QtWidgets.QLabel(tabDataCompression)
+        self.unpackStatusLabel.setText("")
+        self.unpackStatusLabel.setObjectName("unpackStatusLabel")
+        self.verticalLayout_3.addWidget(self.unpackStatusLabel)
+        spacerItem7 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.verticalLayout_3.addItem(spacerItem7)
+
+        self.retranslateUi(tabDataCompression)
+        QtCore.QMetaObject.connectSlotsByName(tabDataCompression)
+
+    def retranslateUi(self, tabDataCompression):
+        _translate = QtCore.QCoreApplication.translate
+        tabDataCompression.setWindowTitle(_translate("tabDataCompression", "Form"))
+        self.label_2.setText(_translate("tabDataCompression", "Compress/Bundle Collections:"))
+        self.label.setText(_translate("tabDataCompression", "Migrate data bundle to:"))
+        self.compressCheckBox.setText(_translate("tabDataCompression", "Compress data"))
+        self.removeCheckBox.setText(_translate("tabDataCompression", "Remove collection"))
+        self.createButton.setText(_translate("tabDataCompression", "Create tar/zip"))
+        self.label_3.setText(_translate("tabDataCompression", "Decompress tar/zip files:"))
+        self.label_4.setText(_translate("tabDataCompression", "Migrate extracted data to:"))
+        self.indexButton.setText(_translate("tabDataCompression", "Index"))
+        self.unpackButton.setText(_translate("tabDataCompression", "Extract tar/zip"))
+
+
+if __name__ == "__main__":
+    import sys
+    app = QtWidgets.QApplication(sys.argv)
+    tabDataCompression = QtWidgets.QWidget()
+    ui = Ui_tabDataCompression()
+    ui.setupUi(tabDataCompression)
+    tabDataCompression.show()
+    sys.exit(app.exec_())
diff --git a/gui/ui-files/tabDataCompression.ui b/gui/ui_files/tabDataCompression.ui
similarity index 98%
rename from gui/ui-files/tabDataCompression.ui
rename to gui/ui_files/tabDataCompression.ui
index 2eed0119f017ae778d85aca6cc5ded5632b82969..5a77070be31b017a2a5537032277c24e07863aa1 100644
--- a/gui/ui-files/tabDataCompression.ui
+++ b/gui/ui_files/tabDataCompression.ui
@@ -1,13 +1,13 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <ui version="4.0">
- <class>Form</class>
- <widget class="QWidget" name="Form">
+ <class>tabDataCompression</class>
+ <widget class="QWidget" name="tabDataCompression">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>640</width>
-    <height>502</height>
+    <height>528</height>
    </rect>
   </property>
   <property name="windowTitle">
diff --git a/gui/ui_files/tabELNData.py b/gui/ui_files/tabELNData.py
new file mode 100644
index 0000000000000000000000000000000000000000..451a59602ffe2b058032c7a4c1448eee9bddc507
--- /dev/null
+++ b/gui/ui_files/tabELNData.py
@@ -0,0 +1,223 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\tabELNData.ui'
+#
+# Created by: PyQt5 UI code generator 5.15.4
+#
+# WARNING: Any manual changes made to this file will be lost when pyuic5 is
+# run again.  Do not edit this file unless you know what you are doing.
+
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_tabELNData(object):
+    def setupUi(self, tabELNData):
+        tabELNData.setObjectName("tabELNData")
+        tabELNData.resize(1234, 776)
+        tabELNData.setStyleSheet("QWidget\n"
+"{\n"
+"    color: rgb(86, 184, 139);\n"
+"    background-color: rgb(54, 54, 54);\n"
+"    selection-background-color: rgb(58, 152, 112);\n"
+"}\n"
+"\n"
+"QTableWidget\n"
+"{\n"
+"    background-color: rgb(85, 87, 83);\n"
+"}\n"
+"\n"
+"QTextBrowser\n"
+"{\n"
+"    background-color: rgb(85, 87, 83);\n"
+"}\n"
+"\n"
+"QTreeView\n"
+"{\n"
+"    background-color: rgb(85, 87, 83);\n"
+"}\n"
+"\n"
+"QLineEdit#elnTokenInput\n"
+"{\n"
+"    background-color: rgb(85, 87, 83);\n"
+"}\n"
+"QLabel#errorLabel{\n"
+"  \n"
+"    color: rgb(217, 174, 23);\n"
+"}")
+        self.verticalLayout = QtWidgets.QVBoxLayout(tabELNData)
+        self.verticalLayout.setObjectName("verticalLayout")
+        self.label_9 = QtWidgets.QLabel(tabELNData)
+        font = QtGui.QFont()
+        font.setPointSize(15)
+        self.label_9.setFont(font)
+        self.label_9.setObjectName("label_9")
+        self.verticalLayout.addWidget(self.label_9)
+        self.horizontalLayout_7 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_7.setObjectName("horizontalLayout_7")
+        self.label_12 = QtWidgets.QLabel(tabELNData)
+        self.label_12.setObjectName("label_12")
+        self.horizontalLayout_7.addWidget(self.label_12)
+        self.elnTokenInput = QtWidgets.QLineEdit(tabELNData)
+        self.elnTokenInput.setStyleSheet("")
+        self.elnTokenInput.setObjectName("elnTokenInput")
+        self.horizontalLayout_7.addWidget(self.elnTokenInput)
+        self.verticalLayout.addLayout(self.horizontalLayout_7)
+        spacerItem = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.verticalLayout.addItem(spacerItem)
+        self.horizontalLayout_8 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_8.setObjectName("horizontalLayout_8")
+        self.elnGroupTable = QtWidgets.QTableWidget(tabELNData)
+        self.elnGroupTable.setMinimumSize(QtCore.QSize(200, 200))
+        self.elnGroupTable.setStyleSheet("")
+        self.elnGroupTable.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContentsOnFirstShow)
+        self.elnGroupTable.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
+        self.elnGroupTable.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection)
+        self.elnGroupTable.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
+        self.elnGroupTable.setObjectName("elnGroupTable")
+        self.elnGroupTable.setColumnCount(2)
+        self.elnGroupTable.setRowCount(0)
+        item = QtWidgets.QTableWidgetItem()
+        self.elnGroupTable.setHorizontalHeaderItem(0, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.elnGroupTable.setHorizontalHeaderItem(1, item)
+        self.horizontalLayout_8.addWidget(self.elnGroupTable)
+        spacerItem1 = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout_8.addItem(spacerItem1)
+        self.elnExperimentTable = QtWidgets.QTableWidget(tabELNData)
+        self.elnExperimentTable.setMinimumSize(QtCore.QSize(400, 200))
+        self.elnExperimentTable.setStyleSheet("")
+        self.elnExperimentTable.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents)
+        self.elnExperimentTable.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
+        self.elnExperimentTable.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection)
+        self.elnExperimentTable.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
+        self.elnExperimentTable.setObjectName("elnExperimentTable")
+        self.elnExperimentTable.setColumnCount(3)
+        self.elnExperimentTable.setRowCount(0)
+        item = QtWidgets.QTableWidgetItem()
+        self.elnExperimentTable.setHorizontalHeaderItem(0, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.elnExperimentTable.setHorizontalHeaderItem(1, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.elnExperimentTable.setHorizontalHeaderItem(2, item)
+        self.horizontalLayout_8.addWidget(self.elnExperimentTable)
+        self.verticalLayout_9 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_9.setObjectName("verticalLayout_9")
+        self.horizontalLayout_8.addLayout(self.verticalLayout_9)
+        self.verticalLayout.addLayout(self.horizontalLayout_8)
+        spacerItem2 = QtWidgets.QSpacerItem(20, 10, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.verticalLayout.addItem(spacerItem2)
+        self.formLayout = QtWidgets.QFormLayout()
+        self.formLayout.setObjectName("formLayout")
+        self.label_14 = QtWidgets.QLabel(tabELNData)
+        font = QtGui.QFont()
+        font.setPointSize(13)
+        self.label_14.setFont(font)
+        self.label_14.setObjectName("label_14")
+        self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label_14)
+        self.groupIdLabel = QtWidgets.QLabel(tabELNData)
+        font = QtGui.QFont()
+        font.setPointSize(13)
+        self.groupIdLabel.setFont(font)
+        self.groupIdLabel.setText("")
+        self.groupIdLabel.setObjectName("groupIdLabel")
+        self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.groupIdLabel)
+        self.label_15 = QtWidgets.QLabel(tabELNData)
+        font = QtGui.QFont()
+        font.setPointSize(13)
+        self.label_15.setFont(font)
+        self.label_15.setObjectName("label_15")
+        self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label_15)
+        self.experimentIdLabel = QtWidgets.QLabel(tabELNData)
+        font = QtGui.QFont()
+        font.setPointSize(13)
+        self.experimentIdLabel.setFont(font)
+        self.experimentIdLabel.setText("")
+        self.experimentIdLabel.setObjectName("experimentIdLabel")
+        self.formLayout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.experimentIdLabel)
+        self.verticalLayout.addLayout(self.formLayout)
+        self.horizontalLayout_9 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_9.setObjectName("horizontalLayout_9")
+        self.localFsTable = QtWidgets.QTreeView(tabELNData)
+        self.localFsTable.setMinimumSize(QtCore.QSize(500, 0))
+        self.localFsTable.setStyleSheet("")
+        self.localFsTable.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents)
+        self.localFsTable.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
+        self.localFsTable.setSelectionMode(QtWidgets.QAbstractItemView.NoSelection)
+        self.localFsTable.setObjectName("localFsTable")
+        self.horizontalLayout_9.addWidget(self.localFsTable)
+        spacerItem3 = QtWidgets.QSpacerItem(10, 20, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout_9.addItem(spacerItem3)
+        self.elnUploadButton = QtWidgets.QPushButton(tabELNData)
+        self.elnUploadButton.setObjectName("elnUploadButton")
+        self.horizontalLayout_9.addWidget(self.elnUploadButton)
+        spacerItem4 = QtWidgets.QSpacerItem(10, 20, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout_9.addItem(spacerItem4)
+        self.elnPathLabel = QtWidgets.QVBoxLayout()
+        self.elnPathLabel.setObjectName("elnPathLabel")
+        self.horizontalLayout_10 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_10.setObjectName("horizontalLayout_10")
+        self.label_16 = QtWidgets.QLabel(tabELNData)
+        font = QtGui.QFont()
+        font.setPointSize(13)
+        font.setBold(True)
+        font.setWeight(75)
+        self.label_16.setFont(font)
+        self.label_16.setObjectName("label_16")
+        self.horizontalLayout_10.addWidget(self.label_16)
+        self.elnIrodsPath = QtWidgets.QLineEdit(tabELNData)
+        font = QtGui.QFont()
+        font.setPointSize(13)
+        self.elnIrodsPath.setFont(font)
+        self.elnIrodsPath.setObjectName("elnIrodsPath")
+        self.horizontalLayout_10.addWidget(self.elnIrodsPath)
+        self.elnPathLabel.addLayout(self.horizontalLayout_10)
+        self.elnPreviewBrowser = QtWidgets.QTextBrowser(tabELNData)
+        self.elnPreviewBrowser.setMinimumSize(QtCore.QSize(0, 200))
+        self.elnPreviewBrowser.setStyleSheet("")
+        self.elnPreviewBrowser.setObjectName("elnPreviewBrowser")
+        self.elnPathLabel.addWidget(self.elnPreviewBrowser)
+        spacerItem5 = QtWidgets.QSpacerItem(20, 10, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
+        self.elnPathLabel.addItem(spacerItem5)
+        self.horizontalLayout_9.addLayout(self.elnPathLabel)
+        self.verticalLayout.addLayout(self.horizontalLayout_9)
+        spacerItem6 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
+        self.verticalLayout.addItem(spacerItem6)
+        self.errorLabel = QtWidgets.QLabel(tabELNData)
+        self.errorLabel.setText("")
+        self.errorLabel.setObjectName("errorLabel")
+        self.verticalLayout.addWidget(self.errorLabel)
+
+        self.retranslateUi(tabELNData)
+        QtCore.QMetaObject.connectSlotsByName(tabELNData)
+
+    def retranslateUi(self, tabELNData):
+        _translate = QtCore.QCoreApplication.translate
+        tabELNData.setWindowTitle(_translate("tabELNData", "Form"))
+        self.label_9.setText(_translate("tabELNData", "Upload data to iRODS and link to an ELN Experiment"))
+        self.label_12.setText(_translate("tabELNData", "ELN token (wur.elabjournal.com;12345)"))
+        item = self.elnGroupTable.horizontalHeaderItem(0)
+        item.setText(_translate("tabELNData", "Group ID"))
+        item = self.elnGroupTable.horizontalHeaderItem(1)
+        item.setText(_translate("tabELNData", "Group Name"))
+        item = self.elnExperimentTable.horizontalHeaderItem(0)
+        item.setText(_translate("tabELNData", "Experiment ID"))
+        item = self.elnExperimentTable.horizontalHeaderItem(1)
+        item.setText(_translate("tabELNData", "Experiment Name"))
+        item = self.elnExperimentTable.horizontalHeaderItem(2)
+        item.setText(_translate("tabELNData", "Owner Name"))
+        self.label_14.setText(_translate("tabELNData", "Project"))
+        self.label_15.setText(_translate("tabELNData", "Experiment"))
+        self.elnUploadButton.setText(_translate("tabELNData", "Upload"))
+        self.label_16.setText(_translate("tabELNData", "iRODS Path (adjust for YODA)"))
+        self.elnIrodsPath.setText(_translate("tabELNData", "/zone/home/user"))
+
+
+if __name__ == "__main__":
+    import sys
+    app = QtWidgets.QApplication(sys.argv)
+    tabELNData = QtWidgets.QWidget()
+    ui = Ui_tabELNData()
+    ui.setupUi(tabELNData)
+    tabELNData.show()
+    sys.exit(app.exec_())
diff --git a/gui/ui-files/tabELNData.ui b/gui/ui_files/tabELNData.ui
similarity index 99%
rename from gui/ui-files/tabELNData.ui
rename to gui/ui_files/tabELNData.ui
index 441e76f75868f36a737e7830ea7878b7b1e0719b..0bb990cacbba04d26909700c68b6216efeda97e7 100644
--- a/gui/ui-files/tabELNData.ui
+++ b/gui/ui_files/tabELNData.ui
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <ui version="4.0">
- <class>Form</class>
- <widget class="QWidget" name="Form">
+ <class>tabELNData</class>
+ <widget class="QWidget" name="tabELNData">
   <property name="geometry">
    <rect>
     <x>0</x>
diff --git a/gui/ui_files/tabFederations.py b/gui/ui_files/tabFederations.py
new file mode 100644
index 0000000000000000000000000000000000000000..58e8717febabd6b12f623904cbb259d0716ac6ea
--- /dev/null
+++ b/gui/ui_files/tabFederations.py
@@ -0,0 +1,88 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\tabFederations.ui'
+#
+# Created by: PyQt5 UI code generator 5.15.4
+#
+# WARNING: Any manual changes made to this file will be lost when pyuic5 is
+# run again.  Do not edit this file unless you know what you are doing.
+
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_tabFederations(object):
+    def setupUi(self, tabFederations):
+        tabFederations.setObjectName("tabFederations")
+        tabFederations.resize(1278, 754)
+        tabFederations.setStyleSheet("QWidget\n"
+"{\n"
+"    color: rgb(86, 184, 139);\n"
+"    background-color: rgb(54, 54, 54);\n"
+"    selection-background-color: rgb(58, 152, 112);\n"
+"}\n"
+"\n"
+"QTreewidget\n"
+"{\n"
+"    background-color: rgb(85, 87, 83);\n"
+"}\n"
+"\n"
+"QTableWidget\n"
+"{\n"
+"    background-color: rgb(85, 87, 83);\n"
+"}")
+        self.verticalLayout = QtWidgets.QVBoxLayout(tabFederations)
+        self.verticalLayout.setObjectName("verticalLayout")
+        self.tableWidget = QtWidgets.QTableWidget(tabFederations)
+        self.tableWidget.setStyleSheet("")
+        self.tableWidget.setObjectName("tableWidget")
+        self.tableWidget.setColumnCount(1)
+        self.tableWidget.setRowCount(0)
+        item = QtWidgets.QTableWidgetItem()
+        self.tableWidget.setHorizontalHeaderItem(0, item)
+        self.verticalLayout.addWidget(self.tableWidget)
+        spacerItem = QtWidgets.QSpacerItem(20, 10, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
+        self.verticalLayout.addItem(spacerItem)
+        self.horizontalLayout_5 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_5.setObjectName("horizontalLayout_5")
+        self.treeWidget = QtWidgets.QTreeWidget(tabFederations)
+        self.treeWidget.setStyleSheet("")
+        self.treeWidget.setObjectName("treeWidget")
+        self.horizontalLayout_5.addWidget(self.treeWidget)
+        self.verticalLayout_7 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_7.setObjectName("verticalLayout_7")
+        self.pushButton = QtWidgets.QPushButton(tabFederations)
+        self.pushButton.setText("")
+        self.pushButton.setObjectName("pushButton")
+        self.verticalLayout_7.addWidget(self.pushButton)
+        self.pushButton_2 = QtWidgets.QPushButton(tabFederations)
+        self.pushButton_2.setText("")
+        self.pushButton_2.setObjectName("pushButton_2")
+        self.verticalLayout_7.addWidget(self.pushButton_2)
+        self.horizontalLayout_5.addLayout(self.verticalLayout_7)
+        self.treeWidget_2 = QtWidgets.QTreeWidget(tabFederations)
+        self.treeWidget_2.setStyleSheet("")
+        self.treeWidget_2.setObjectName("treeWidget_2")
+        self.horizontalLayout_5.addWidget(self.treeWidget_2)
+        self.verticalLayout.addLayout(self.horizontalLayout_5)
+
+        self.retranslateUi(tabFederations)
+        QtCore.QMetaObject.connectSlotsByName(tabFederations)
+
+    def retranslateUi(self, tabFederations):
+        _translate = QtCore.QCoreApplication.translate
+        tabFederations.setWindowTitle(_translate("tabFederations", "Form"))
+        item = self.tableWidget.horizontalHeaderItem(0)
+        item.setText(_translate("tabFederations", "Federated Zones"))
+        self.treeWidget.headerItem().setText(0, _translate("tabFederations", "Home iRODS"))
+        self.treeWidget_2.headerItem().setText(0, _translate("tabFederations", "Federated iRODS"))
+
+
+if __name__ == "__main__":
+    import sys
+    app = QtWidgets.QApplication(sys.argv)
+    tabFederations = QtWidgets.QWidget()
+    ui = Ui_tabFederations()
+    ui.setupUi(tabFederations)
+    tabFederations.show()
+    sys.exit(app.exec_())
diff --git a/gui/ui-files/tabFederations.ui b/gui/ui_files/tabFederations.ui
similarity index 96%
rename from gui/ui-files/tabFederations.ui
rename to gui/ui_files/tabFederations.ui
index d1ed11d1ed87840521359488c78e9a47ae3cae77..527145b6d083bb8e1fd91d8c97e61987e6c0b87d 100644
--- a/gui/ui-files/tabFederations.ui
+++ b/gui/ui_files/tabFederations.ui
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <ui version="4.0">
- <class>Form</class>
- <widget class="QWidget" name="Form">
+ <class>tabFederations</class>
+ <widget class="QWidget" name="tabFederations">
   <property name="geometry">
    <rect>
     <x>0</x>
diff --git a/gui/ui_files/tabInfo.py b/gui/ui_files/tabInfo.py
new file mode 100644
index 0000000000000000000000000000000000000000..ca36e7c48ea294f151bd1f2d873ab1ebd2eece33
--- /dev/null
+++ b/gui/ui_files/tabInfo.py
@@ -0,0 +1,187 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\tabInfo.ui'
+#
+# Created by: PyQt5 UI code generator 5.15.4
+#
+# WARNING: Any manual changes made to this file will be lost when pyuic5 is
+# run again.  Do not edit this file unless you know what you are doing.
+
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_tabInfo(object):
+    def setupUi(self, tabInfo):
+        tabInfo.setObjectName("tabInfo")
+        tabInfo.resize(640, 480)
+        tabInfo.setStyleSheet("QWidget\n"
+"{\n"
+"    color: rgb(86, 184, 139);\n"
+"    background-color: rgb(54, 54, 54);\n"
+"    selection-background-color: rgb(58, 152, 112);\n"
+"}\n"
+"\n"
+"QTableWidget\n"
+"{\n"
+"    background-color: rgb(85, 87, 83);\n"
+"}\n"
+"\n"
+"QTextBrowser\n"
+"{\n"
+"    background-color: rgb(85, 87, 83);\n"
+"}\n"
+"\n"
+"")
+        self.horizontalLayout = QtWidgets.QHBoxLayout(tabInfo)
+        self.horizontalLayout.setObjectName("horizontalLayout")
+        self.gridLayout = QtWidgets.QGridLayout()
+        self.gridLayout.setObjectName("gridLayout")
+        self.serverLabel = QtWidgets.QLabel(tabInfo)
+        self.serverLabel.setText("")
+        self.serverLabel.setObjectName("serverLabel")
+        self.gridLayout.addWidget(self.serverLabel, 13, 2, 1, 1)
+        self.label_6 = QtWidgets.QLabel(tabInfo)
+        self.label_6.setText("")
+        self.label_6.setObjectName("label_6")
+        self.gridLayout.addWidget(self.label_6, 9, 0, 1, 1)
+        self.label_7 = QtWidgets.QLabel(tabInfo)
+        font = QtGui.QFont()
+        font.setPointSize(13)
+        font.setBold(True)
+        font.setWeight(75)
+        self.label_7.setFont(font)
+        self.label_7.setObjectName("label_7")
+        self.gridLayout.addWidget(self.label_7, 11, 0, 1, 1)
+        spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.gridLayout.addItem(spacerItem, 6, 0, 1, 1)
+        spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.gridLayout.addItem(spacerItem1, 15, 0, 1, 1)
+        self.label_2 = QtWidgets.QLabel(tabInfo)
+        self.label_2.setObjectName("label_2")
+        self.gridLayout.addWidget(self.label_2, 13, 0, 1, 1)
+        self.versionLabel_2 = QtWidgets.QLabel(tabInfo)
+        self.versionLabel_2.setObjectName("versionLabel_2")
+        self.gridLayout.addWidget(self.versionLabel_2, 14, 0, 1, 1)
+        self.versionLabel = QtWidgets.QLabel(tabInfo)
+        self.versionLabel.setText("")
+        self.versionLabel.setObjectName("versionLabel")
+        self.gridLayout.addWidget(self.versionLabel, 14, 2, 1, 1)
+        self.groupsLabel = QtWidgets.QLabel(tabInfo)
+        self.groupsLabel.setText("")
+        self.groupsLabel.setObjectName("groupsLabel")
+        self.gridLayout.addWidget(self.groupsLabel, 7, 2, 1, 1)
+        spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.gridLayout.addItem(spacerItem2, 17, 2, 1, 1)
+        self.label_4 = QtWidgets.QLabel(tabInfo)
+        self.label_4.setObjectName("label_4")
+        self.gridLayout.addWidget(self.label_4, 4, 0, 1, 1)
+        self.label = QtWidgets.QLabel(tabInfo)
+        font = QtGui.QFont()
+        font.setPointSize(13)
+        font.setBold(True)
+        font.setWeight(75)
+        self.label.setFont(font)
+        self.label.setObjectName("label")
+        self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
+        spacerItem3 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.gridLayout.addItem(spacerItem3, 1, 0, 1, 1)
+        self.label_5 = QtWidgets.QLabel(tabInfo)
+        self.label_5.setObjectName("label_5")
+        self.gridLayout.addWidget(self.label_5, 7, 0, 1, 1)
+        self.zoneLabel = QtWidgets.QLabel(tabInfo)
+        self.zoneLabel.setText("")
+        self.zoneLabel.setObjectName("zoneLabel")
+        self.gridLayout.addWidget(self.zoneLabel, 3, 2, 1, 1)
+        self.userLabel = QtWidgets.QLabel(tabInfo)
+        self.userLabel.setText("")
+        self.userLabel.setObjectName("userLabel")
+        self.gridLayout.addWidget(self.userLabel, 4, 2, 1, 1)
+        spacerItem4 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.gridLayout.addItem(spacerItem4, 12, 0, 1, 1)
+        self.typeLabel = QtWidgets.QLabel(tabInfo)
+        self.typeLabel.setText("")
+        self.typeLabel.setObjectName("typeLabel")
+        self.gridLayout.addWidget(self.typeLabel, 5, 2, 1, 1)
+        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
+        spacerItem5 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout_3.addItem(spacerItem5)
+        self.refreshButton = QtWidgets.QPushButton(tabInfo)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(True)
+        font.setWeight(75)
+        self.refreshButton.setFont(font)
+        self.refreshButton.setObjectName("refreshButton")
+        self.horizontalLayout_3.addWidget(self.refreshButton)
+        self.gridLayout.addLayout(self.horizontalLayout_3, 18, 2, 1, 1)
+        spacerItem6 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.gridLayout.addItem(spacerItem6, 10, 0, 1, 1)
+        self.label_9 = QtWidgets.QLabel(tabInfo)
+        self.label_9.setObjectName("label_9")
+        self.gridLayout.addWidget(self.label_9, 16, 0, 1, 1)
+        self.label_3 = QtWidgets.QLabel(tabInfo)
+        self.label_3.setObjectName("label_3")
+        self.gridLayout.addWidget(self.label_3, 3, 0, 1, 1)
+        self.label_10 = QtWidgets.QLabel(tabInfo)
+        self.label_10.setObjectName("label_10")
+        self.gridLayout.addWidget(self.label_10, 5, 0, 1, 1)
+        self.rescTable = QtWidgets.QTableWidget(tabInfo)
+        self.rescTable.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
+        self.rescTable.setSelectionMode(QtWidgets.QAbstractItemView.NoSelection)
+        self.rescTable.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
+        self.rescTable.setObjectName("rescTable")
+        self.rescTable.setColumnCount(3)
+        self.rescTable.setRowCount(0)
+        item = QtWidgets.QTableWidgetItem()
+        self.rescTable.setHorizontalHeaderItem(0, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.rescTable.setHorizontalHeaderItem(1, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.rescTable.setHorizontalHeaderItem(2, item)
+        self.gridLayout.addWidget(self.rescTable, 16, 2, 1, 1)
+        self.label_8 = QtWidgets.QLabel(tabInfo)
+        self.label_8.setObjectName("label_8")
+        self.gridLayout.addWidget(self.label_8, 8, 0, 1, 1)
+        self.rescLabel = QtWidgets.QLabel(tabInfo)
+        self.rescLabel.setText("")
+        self.rescLabel.setObjectName("rescLabel")
+        self.gridLayout.addWidget(self.rescLabel, 8, 2, 1, 1)
+        self.horizontalLayout.addLayout(self.gridLayout)
+        spacerItem7 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout.addItem(spacerItem7)
+
+        self.retranslateUi(tabInfo)
+        QtCore.QMetaObject.connectSlotsByName(tabInfo)
+
+    def retranslateUi(self, tabInfo):
+        _translate = QtCore.QCoreApplication.translate
+        tabInfo.setWindowTitle(_translate("tabInfo", "Form"))
+        self.label_7.setText(_translate("tabInfo", "Server Information"))
+        self.label_2.setText(_translate("tabInfo", "Server"))
+        self.versionLabel_2.setText(_translate("tabInfo", "Version"))
+        self.label_4.setText(_translate("tabInfo", "Username"))
+        self.label.setText(_translate("tabInfo", "Client Information"))
+        self.label_5.setText(_translate("tabInfo", "User\'s groups"))
+        self.refreshButton.setText(_translate("tabInfo", "Refresh"))
+        self.label_9.setText(_translate("tabInfo", "Resources"))
+        self.label_3.setText(_translate("tabInfo", "Zone"))
+        self.label_10.setText(_translate("tabInfo", "Usertype"))
+        item = self.rescTable.horizontalHeaderItem(0)
+        item.setText(_translate("tabInfo", "Name"))
+        item = self.rescTable.horizontalHeaderItem(1)
+        item.setText(_translate("tabInfo", "Free space in GB"))
+        item = self.rescTable.horizontalHeaderItem(2)
+        item.setText(_translate("tabInfo", "Status"))
+        self.label_8.setText(_translate("tabInfo", "Default resource"))
+
+
+if __name__ == "__main__":
+    import sys
+    app = QtWidgets.QApplication(sys.argv)
+    tabInfo = QtWidgets.QWidget()
+    ui = Ui_tabInfo()
+    ui.setupUi(tabInfo)
+    tabInfo.show()
+    sys.exit(app.exec_())
diff --git a/gui/ui-files/tabInfo.ui b/gui/ui_files/tabInfo.ui
similarity index 99%
rename from gui/ui-files/tabInfo.ui
rename to gui/ui_files/tabInfo.ui
index e8550bc2b348671749f01c924fe9b45364cc2ab6..95af9c59e59dd365f029dc99c5b2734f77c519e9 100644
--- a/gui/ui-files/tabInfo.ui
+++ b/gui/ui_files/tabInfo.ui
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <ui version="4.0">
- <class>Form</class>
- <widget class="QWidget" name="Form">
+ <class>tabInfo</class>
+ <widget class="QWidget" name="tabInfo">
   <property name="geometry">
    <rect>
     <x>0</x>
diff --git a/gui/ui_files/tabPage.py b/gui/ui_files/tabPage.py
new file mode 100644
index 0000000000000000000000000000000000000000..933b5c2afc234f4d01b042b66841abfd311b1b6a
--- /dev/null
+++ b/gui/ui_files/tabPage.py
@@ -0,0 +1,61 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\tabPage.ui'
+#
+# Created by: PyQt5 UI code generator 5.15.4
+#
+# WARNING: Any manual changes made to this file will be lost when pyuic5 is
+# run again.  Do not edit this file unless you know what you are doing.
+
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_tabPage(object):
+    def setupUi(self, tabPage):
+        tabPage.setObjectName("tabPage")
+        tabPage.resize(1278, 754)
+        tabPage.setStyleSheet("QWidget\n"
+"{\n"
+"    color: rgb(86, 184, 139);\n"
+"    background-color: rgb(54, 54, 54);\n"
+"    selection-background-color: rgb(58, 152, 112);\n"
+"}\n"
+"\n"
+"QTreeWidget\n"
+"{\n"
+"    background-color: rgb(85, 87, 83);\n"
+"}")
+        self.refreshButton = QtWidgets.QPushButton(tabPage)
+        self.refreshButton.setGeometry(QtCore.QRect(70, 70, 89, 25))
+        self.refreshButton.setObjectName("refreshButton")
+        self.page_testIrodsTree = QtWidgets.QTreeView(tabPage)
+        self.page_testIrodsTree.setGeometry(QtCore.QRect(20, 120, 452, 386))
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.page_testIrodsTree.sizePolicy().hasHeightForWidth())
+        self.page_testIrodsTree.setSizePolicy(sizePolicy)
+        self.page_testIrodsTree.setStyleSheet("")
+        self.page_testIrodsTree.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents)
+        self.page_testIrodsTree.setSelectionMode(QtWidgets.QAbstractItemView.NoSelection)
+        self.page_testIrodsTree.setHeaderHidden(True)
+        self.page_testIrodsTree.setObjectName("page_testIrodsTree")
+
+        self.retranslateUi(tabPage)
+        QtCore.QMetaObject.connectSlotsByName(tabPage)
+
+    def retranslateUi(self, tabPage):
+        _translate = QtCore.QCoreApplication.translate
+        tabPage.setWindowTitle(_translate("tabPage", "Form"))
+        self.refreshButton.setText(_translate("tabPage", "Refresh"))
+
+
+if __name__ == "__main__":
+    import sys
+    app = QtWidgets.QApplication(sys.argv)
+    tabPage = QtWidgets.QWidget()
+    ui = Ui_tabPage()
+    ui.setupUi(tabPage)
+    tabPage.show()
+    sys.exit(app.exec_())
diff --git a/gui/ui-files/tabPage.ui b/gui/ui_files/tabPage.ui
similarity index 96%
rename from gui/ui-files/tabPage.ui
rename to gui/ui_files/tabPage.ui
index ef863b7a4ca8c23f06dacdbdca12435542979250..685a42092421b0ed0ce3182c4bd9678ad885201b 100644
--- a/gui/ui-files/tabPage.ui
+++ b/gui/ui_files/tabPage.ui
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <ui version="4.0">
- <class>Form</class>
- <widget class="QWidget" name="Form">
+ <class>tabPage</class>
+ <widget class="QWidget" name="tabPage">
   <property name="geometry">
    <rect>
     <x>0</x>
diff --git a/gui/ui_files/tabTicketAccess.py b/gui/ui_files/tabTicketAccess.py
new file mode 100644
index 0000000000000000000000000000000000000000..026348b78b2e097def46cded48a12b55d722478c
--- /dev/null
+++ b/gui/ui_files/tabTicketAccess.py
@@ -0,0 +1,244 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\tabTicketAccess.ui'
+#
+# Created by: PyQt5 UI code generator 5.15.4
+#
+# WARNING: Any manual changes made to this file will be lost when pyuic5 is
+# run again.  Do not edit this file unless you know what you are doing.
+
+
+from os.path import dirname, join, pardir, realpath
+import sys
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_tabTicketAccess(object):
+    def setupUi(self, tabTicketAccess):
+        tabTicketAccess.setObjectName("tabTicketAccess")
+        tabTicketAccess.resize(943, 728)
+        tabTicketAccess.setStyleSheet("QWidget\n"
+"{\n"
+"    color: rgb(86, 184, 139);\n"
+"    background-color: rgb(54, 54, 54);\n"
+"    selection-background-color: rgb(58, 152, 112);\n"
+"}\n"
+"\n"
+"QTableWidget\n"
+"{\n"
+"    background-color: rgb(85, 87, 83);\n"
+"}\n"
+"\n"
+"QTreeView\n"
+"{\n"
+"  background-color: rgb(85, 87, 83);    \n"
+"\n"
+"}\n"
+"\n"
+"QLineEdit\n"
+"{\n"
+"background-color: rgb(85, 87, 83);\n"
+"}\n"
+"\n"
+"QLabel#infoLabel\n"
+"{\n"
+"    color: rgb(217, 174, 23);\n"
+"}\n"
+"\n"
+"\n"
+"")
+        self.verticalLayout = QtWidgets.QVBoxLayout(tabTicketAccess)
+        self.verticalLayout.setObjectName("verticalLayout")
+        self.formLayout = QtWidgets.QFormLayout()
+        self.formLayout.setObjectName("formLayout")
+        self.label_3 = QtWidgets.QLabel(tabTicketAccess)
+        self.label_3.setObjectName("label_3")
+        self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label_3)
+        self.serverEdit = QtWidgets.QLineEdit(tabTicketAccess)
+        self.serverEdit.setObjectName("serverEdit")
+        self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.serverEdit)
+        self.label_2 = QtWidgets.QLabel(tabTicketAccess)
+        self.label_2.setObjectName("label_2")
+        self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label_2)
+        self.pathEdit = QtWidgets.QLineEdit(tabTicketAccess)
+        self.pathEdit.setObjectName("pathEdit")
+        self.formLayout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.pathEdit)
+        self.label = QtWidgets.QLabel(tabTicketAccess)
+        self.label.setObjectName("label")
+        self.formLayout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.label)
+        self.ticketEdit = QtWidgets.QLineEdit(tabTicketAccess)
+        self.ticketEdit.setObjectName("ticketEdit")
+        self.formLayout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.ticketEdit)
+        self.horizontalLayout = QtWidgets.QHBoxLayout()
+        self.horizontalLayout.setObjectName("horizontalLayout")
+        self.connectButton = QtWidgets.QPushButton(tabTicketAccess)
+        self.connectButton.setMinimumSize(QtCore.QSize(30, 30))
+        self.connectButton.setObjectName("connectButton")
+        self.horizontalLayout.addWidget(self.connectButton)
+        spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout.addItem(spacerItem)
+        self.formLayout.setLayout(3, QtWidgets.QFormLayout.FieldRole, self.horizontalLayout)
+        self.verticalLayout.addLayout(self.formLayout)
+        self.infoLabel = QtWidgets.QLabel(tabTicketAccess)
+        self.infoLabel.setText("")
+        self.infoLabel.setObjectName("infoLabel")
+        self.verticalLayout.addWidget(self.infoLabel)
+        spacerItem1 = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.MinimumExpanding)
+        self.verticalLayout.addItem(spacerItem1)
+        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
+        self.verticalLayout_6 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_6.setObjectName("verticalLayout_6")
+        self.horizontalLayout_5 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_5.setObjectName("horizontalLayout_5")
+        self.homeButton = QtWidgets.QPushButton(tabTicketAccess)
+        self.homeButton.setText("")
+        icon = QtGui.QIcon()
+        if getattr(sys, 'frozen', False):
+                icon.addPixmap(QtGui.QPixmap(join(dirname(realpath(sys.argv[0])), pardir) + "/icons/home.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        else:
+                icon.addPixmap(QtGui.QPixmap(dirname(realpath(sys.argv[0])) + "/icons/home.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        self.homeButton.setIcon(icon)
+        self.homeButton.setObjectName("homeButton")
+        self.horizontalLayout_5.addWidget(self.homeButton)
+        spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout_5.addItem(spacerItem2)
+        self.downloadAllButton = QtWidgets.QPushButton(tabTicketAccess)
+        self.downloadAllButton.setObjectName("downloadAllButton")
+        self.horizontalLayout_5.addWidget(self.downloadAllButton)
+        self.verticalLayout_6.addLayout(self.horizontalLayout_5)
+        self.collTable = QtWidgets.QTableWidget(tabTicketAccess)
+        self.collTable.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents)
+        self.collTable.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
+        self.collTable.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection)
+        self.collTable.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
+        self.collTable.setObjectName("collTable")
+        self.collTable.setColumnCount(5)
+        self.collTable.setRowCount(0)
+        item = QtWidgets.QTableWidgetItem()
+        self.collTable.setHorizontalHeaderItem(0, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.collTable.setHorizontalHeaderItem(1, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.collTable.setHorizontalHeaderItem(2, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.collTable.setHorizontalHeaderItem(3, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.collTable.setHorizontalHeaderItem(4, item)
+        self.verticalLayout_6.addWidget(self.collTable)
+        self.horizontalLayout_3.addLayout(self.verticalLayout_6)
+        self.verticalLayout_4 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_4.setObjectName("verticalLayout_4")
+        spacerItem3 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.verticalLayout_4.addItem(spacerItem3)
+        self.downloadButton = QtWidgets.QPushButton(tabTicketAccess)
+        self.downloadButton.setText("")
+        icon1 = QtGui.QIcon()
+        if getattr(sys, 'frozen', False):
+                icon1.addPixmap(QtGui.QPixmap(join(dirname(realpath(sys.argv[0])), pardir) + "/icons/arrow-right.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        else:
+                icon1.addPixmap(QtGui.QPixmap(dirname(realpath(sys.argv[0])) + "/icons/arrow-right.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        self.downloadButton.setIcon(icon1)
+        self.downloadButton.setIconSize(QtCore.QSize(30, 30))
+        self.downloadButton.setObjectName("downloadButton")
+        self.verticalLayout_4.addWidget(self.downloadButton)
+        spacerItem4 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.verticalLayout_4.addItem(spacerItem4)
+        self.horizontalLayout_3.addLayout(self.verticalLayout_4)
+        self.verticalLayout_5 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_5.setObjectName("verticalLayout_5")
+        self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
+        spacerItem5 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout_4.addItem(spacerItem5)
+        self.createDirectoryButton = QtWidgets.QPushButton(tabTicketAccess)
+        self.createDirectoryButton.setObjectName("createDirectoryButton")
+        self.horizontalLayout_4.addWidget(self.createDirectoryButton)
+        self.verticalLayout_5.addLayout(self.horizontalLayout_4)
+        self.localFsTreeView = QtWidgets.QTreeView(tabTicketAccess)
+        self.localFsTreeView.setSelectionMode(QtWidgets.QAbstractItemView.NoSelection)
+        self.localFsTreeView.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectItems)
+        self.localFsTreeView.setObjectName("localFsTreeView")
+        self.verticalLayout_5.addWidget(self.localFsTreeView)
+        self.horizontalLayout_3.addLayout(self.verticalLayout_5)
+        self.verticalLayout.addLayout(self.horizontalLayout_3)
+        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
+        spacerItem6 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout_2.addItem(spacerItem6)
+        self.verticalLayout.addLayout(self.horizontalLayout_2)
+        spacerItem7 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Maximum)
+        self.verticalLayout.addItem(spacerItem7)
+        self.tabWidget = QtWidgets.QTabWidget(tabTicketAccess)
+        self.tabWidget.setObjectName("tabWidget")
+        self.tab = QtWidgets.QWidget()
+        self.tab.setObjectName("tab")
+        self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.tab)
+        self.verticalLayout_3.setObjectName("verticalLayout_3")
+        self.previewBrowser = QtWidgets.QTextBrowser(self.tab)
+        self.previewBrowser.setObjectName("previewBrowser")
+        self.verticalLayout_3.addWidget(self.previewBrowser)
+        self.tabWidget.addTab(self.tab, "")
+        self.tab_2 = QtWidgets.QWidget()
+        self.tab_2.setObjectName("tab_2")
+        self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.tab_2)
+        self.verticalLayout_2.setObjectName("verticalLayout_2")
+        self.metadataTable = QtWidgets.QTableWidget(self.tab_2)
+        self.metadataTable.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
+        self.metadataTable.setSelectionMode(QtWidgets.QAbstractItemView.NoSelection)
+        self.metadataTable.setObjectName("metadataTable")
+        self.metadataTable.setColumnCount(3)
+        self.metadataTable.setRowCount(0)
+        item = QtWidgets.QTableWidgetItem()
+        self.metadataTable.setHorizontalHeaderItem(0, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.metadataTable.setHorizontalHeaderItem(1, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.metadataTable.setHorizontalHeaderItem(2, item)
+        self.verticalLayout_2.addWidget(self.metadataTable)
+        self.tabWidget.addTab(self.tab_2, "")
+        self.verticalLayout.addWidget(self.tabWidget)
+        spacerItem8 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Maximum)
+        self.verticalLayout.addItem(spacerItem8)
+
+        self.retranslateUi(tabTicketAccess)
+        self.tabWidget.setCurrentIndex(1)
+        QtCore.QMetaObject.connectSlotsByName(tabTicketAccess)
+
+    def retranslateUi(self, tabTicketAccess):
+        _translate = QtCore.QCoreApplication.translate
+        tabTicketAccess.setWindowTitle(_translate("tabTicketAccess", "Form"))
+        self.label_3.setText(_translate("tabTicketAccess", "iRODS server: "))
+        self.label_2.setText(_translate("tabTicketAccess", "iRODS path: "))
+        self.label.setText(_translate("tabTicketAccess", "Ticket:"))
+        self.connectButton.setText(_translate("tabTicketAccess", "Connect"))
+        self.downloadAllButton.setText(_translate("tabTicketAccess", "Download all"))
+        item = self.collTable.horizontalHeaderItem(0)
+        item.setText(_translate("tabTicketAccess", "Path"))
+        item = self.collTable.horizontalHeaderItem(1)
+        item.setText(_translate("tabTicketAccess", "Name"))
+        item = self.collTable.horizontalHeaderItem(2)
+        item.setText(_translate("tabTicketAccess", "Size"))
+        item = self.collTable.horizontalHeaderItem(3)
+        item.setText(_translate("tabTicketAccess", "Checksum"))
+        item = self.collTable.horizontalHeaderItem(4)
+        item.setText(_translate("tabTicketAccess", "Last modified"))
+        self.createDirectoryButton.setText(_translate("tabTicketAccess", "Create Directory"))
+        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("tabTicketAccess", "Preview"))
+        item = self.metadataTable.horizontalHeaderItem(0)
+        item.setText(_translate("tabTicketAccess", "Key"))
+        item = self.metadataTable.horizontalHeaderItem(1)
+        item.setText(_translate("tabTicketAccess", "Value"))
+        item = self.metadataTable.horizontalHeaderItem(2)
+        item.setText(_translate("tabTicketAccess", "Units"))
+        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("tabTicketAccess", "Metadata"))
+
+
+if __name__ == "__main__":
+    import sys
+    app = QtWidgets.QApplication(sys.argv)
+    tabTicketAccess = QtWidgets.QWidget()
+    ui = Ui_tabTicketAccess()
+    ui.setupUi(tabTicketAccess)
+    tabTicketAccess.show()
+    sys.exit(app.exec_())
diff --git a/gui/ui-files/tabTicketAccess.ui b/gui/ui_files/tabTicketAccess.ui
similarity index 99%
rename from gui/ui-files/tabTicketAccess.ui
rename to gui/ui_files/tabTicketAccess.ui
index e2a2c2002439b1f94ec43e5653c30fa5ada2ed8f..3e1085874a58b2e97d1d7648fb43c331f3859a99 100644
--- a/gui/ui-files/tabTicketAccess.ui
+++ b/gui/ui_files/tabTicketAccess.ui
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <ui version="4.0">
- <class>Form</class>
- <widget class="QWidget" name="Form">
+ <class>tabTicketAccess</class>
+ <widget class="QWidget" name="tabTicketAccess">
   <property name="geometry">
    <rect>
     <x>0</x>
diff --git a/gui/ui_files/tabTicketCreate.py b/gui/ui_files/tabTicketCreate.py
new file mode 100644
index 0000000000000000000000000000000000000000..d8ef0dcf3f8aeca08875c86d9c5346aece19ce8b
--- /dev/null
+++ b/gui/ui_files/tabTicketCreate.py
@@ -0,0 +1,119 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\tabTicketCreate.ui'
+#
+# Created by: PyQt5 UI code generator 5.15.4
+#
+# WARNING: Any manual changes made to this file will be lost when pyuic5 is
+# run again.  Do not edit this file unless you know what you are doing.
+
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_tabticketCreate(object):
+    def setupUi(self, tabticketCreate):
+        tabticketCreate.setObjectName("tabticketCreate")
+        tabticketCreate.resize(1021, 650)
+        tabticketCreate.setStyleSheet("QWidget\n"
+"{\n"
+"    color: rgb(86, 184, 139);\n"
+"    background-color: rgb(54, 54, 54);\n"
+"    selection-background-color: rgb(58, 152, 112);\n"
+"}\n"
+"\n"
+"QCalendarWidget\n"
+"{\n"
+"    background-color: rgb(85, 87, 83);\n"
+"}\n"
+"\n"
+"QTreeView{\n"
+"    background-color: rgb(85, 87, 83);\n"
+"}\n"
+"\n"
+"QLabel#infoLabel{\n"
+"    color: rgb(217, 174, 23);\n"
+"}")
+        self.horizontalLayout = QtWidgets.QHBoxLayout(tabticketCreate)
+        self.horizontalLayout.setObjectName("horizontalLayout")
+        self.gridLayout = QtWidgets.QGridLayout()
+        self.gridLayout.setObjectName("gridLayout")
+        self.gridLayout_2 = QtWidgets.QGridLayout()
+        self.gridLayout_2.setObjectName("gridLayout_2")
+        spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.gridLayout_2.addItem(spacerItem, 10, 0, 1, 1)
+        spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.gridLayout_2.addItem(spacerItem1, 7, 0, 1, 1)
+        self.label_2 = QtWidgets.QLabel(tabticketCreate)
+        font = QtGui.QFont()
+        font.setPointSize(13)
+        self.label_2.setFont(font)
+        self.label_2.setObjectName("label_2")
+        self.gridLayout_2.addWidget(self.label_2, 0, 0, 1, 1)
+        spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.gridLayout_2.addItem(spacerItem2, 3, 0, 1, 1)
+        self.createTicketButton = QtWidgets.QPushButton(tabticketCreate)
+        self.createTicketButton.setObjectName("createTicketButton")
+        self.gridLayout_2.addWidget(self.createTicketButton, 4, 0, 1, 1)
+        self.calendar = QtWidgets.QCalendarWidget(tabticketCreate)
+        self.calendar.setMinimumDate(QtCore.QDate(2020, 9, 14))
+        self.calendar.setGridVisible(False)
+        self.calendar.setHorizontalHeaderFormat(QtWidgets.QCalendarWidget.ShortDayNames)
+        self.calendar.setVerticalHeaderFormat(QtWidgets.QCalendarWidget.NoVerticalHeader)
+        self.calendar.setObjectName("calendar")
+        self.gridLayout_2.addWidget(self.calendar, 2, 0, 1, 1)
+        self.label = QtWidgets.QLabel(tabticketCreate)
+        font = QtGui.QFont()
+        font.setPointSize(13)
+        font.setBold(True)
+        font.setWeight(75)
+        self.label.setFont(font)
+        self.label.setObjectName("label")
+        self.gridLayout_2.addWidget(self.label, 6, 0, 1, 1)
+        self.ticketInfoBrowser = QtWidgets.QTextBrowser(tabticketCreate)
+        font = QtGui.QFont()
+        font.setFamily("Courier New")
+        font.setPointSize(10)
+        self.ticketInfoBrowser.setFont(font)
+        self.ticketInfoBrowser.setObjectName("ticketInfoBrowser")
+        self.gridLayout_2.addWidget(self.ticketInfoBrowser, 9, 0, 1, 1)
+        spacerItem3 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Maximum)
+        self.gridLayout_2.addItem(spacerItem3, 5, 0, 1, 1)
+        self.infoLabel = QtWidgets.QLabel(tabticketCreate)
+        self.infoLabel.setText("")
+        self.infoLabel.setObjectName("infoLabel")
+        self.gridLayout_2.addWidget(self.infoLabel, 11, 0, 1, 1)
+        self.formLayout = QtWidgets.QFormLayout()
+        self.formLayout.setObjectName("formLayout")
+        self.gridLayout_2.addLayout(self.formLayout, 8, 0, 1, 1)
+        spacerItem4 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.gridLayout_2.addItem(spacerItem4, 1, 0, 1, 1)
+        self.gridLayout.addLayout(self.gridLayout_2, 0, 2, 1, 1)
+        spacerItem5 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
+        self.gridLayout.addItem(spacerItem5, 0, 1, 1, 1)
+        self.irodsFsTreeView = QtWidgets.QTreeView(tabticketCreate)
+        self.irodsFsTreeView.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
+        self.irodsFsTreeView.setSelectionMode(QtWidgets.QAbstractItemView.NoSelection)
+        self.irodsFsTreeView.setObjectName("irodsFsTreeView")
+        self.gridLayout.addWidget(self.irodsFsTreeView, 0, 0, 1, 1)
+        self.horizontalLayout.addLayout(self.gridLayout)
+
+        self.retranslateUi(tabticketCreate)
+        QtCore.QMetaObject.connectSlotsByName(tabticketCreate)
+
+    def retranslateUi(self, tabticketCreate):
+        _translate = QtCore.QCoreApplication.translate
+        tabticketCreate.setWindowTitle(_translate("tabticketCreate", "Form"))
+        self.label_2.setText(_translate("tabticketCreate", "Expiration date: (linux only)"))
+        self.createTicketButton.setText(_translate("tabticketCreate", "Create Ticket"))
+        self.label.setText(_translate("tabticketCreate", "Ticket Information: "))
+
+
+if __name__ == "__main__":
+    import sys
+    app = QtWidgets.QApplication(sys.argv)
+    tabticketCreate = QtWidgets.QWidget()
+    ui = Ui_tabticketCreate()
+    ui.setupUi(tabticketCreate)
+    tabticketCreate.show()
+    sys.exit(app.exec_())
diff --git a/gui/ui-files/tabTicketCreate.ui b/gui/ui_files/tabTicketCreate.ui
similarity index 98%
rename from gui/ui-files/tabTicketCreate.ui
rename to gui/ui_files/tabTicketCreate.ui
index dbf149e485cdf130adf5cfdef7d889eb5e3aac45..e4a367800a8ba84319a4aabbf0060c9fcd0e89e1 100644
--- a/gui/ui-files/tabTicketCreate.ui
+++ b/gui/ui_files/tabTicketCreate.ui
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <ui version="4.0">
- <class>Form</class>
- <widget class="QWidget" name="Form">
+ <class>tabticketCreate</class>
+ <widget class="QWidget" name="tabticketCreate">
   <property name="geometry">
    <rect>
     <x>0</x>
diff --git a/gui/ui_files/tabUpDownload.py b/gui/ui_files/tabUpDownload.py
new file mode 100644
index 0000000000000000000000000000000000000000..098fc7bb5b9417d534a4051ec4c4622c6c191f61
--- /dev/null
+++ b/gui/ui_files/tabUpDownload.py
@@ -0,0 +1,296 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\tabUpDownload.ui'
+#
+# Created by: PyQt5 UI code generator 5.15.4
+#
+# WARNING: Any manual changes made to this file will be lost when pyuic5 is
+# run again.  Do not edit this file unless you know what you are doing.
+
+
+from os.path import dirname, join, pardir, realpath
+import sys
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_tabUpDownload(object):
+    def setupUi(self, tabUpDownload):
+        tabUpDownload.setObjectName("tabUpDownload")
+        tabUpDownload.resize(1234, 776)
+        tabUpDownload.setStyleSheet("QWidget\n"
+"{\n"
+"    color: rgb(86, 184, 139);\n"
+"    background-color: rgb(54, 54, 54);\n"
+"    selection-background-color: rgb(58, 152, 112);\n"
+"}\n"
+"\n"
+"QGroupBox\n"
+"{\n"
+"    background-color: rgb(85, 87, 83);\n"
+"}\n"
+"\n"
+"QTreeView\n"
+"{\n"
+"    background-color: rgb(85, 87, 83);\n"
+"}\n"
+"\n"
+"\n"
+"QPushButton#ContUplBut\n"
+"{\n"
+"    image : url(icons/nosync.png) stretch stretch;\n"
+"}\n"
+"\n"
+"QRadioButton#uplAllRB, QRadioButton#uplMetaRB, QRadioButton#uplF500RB, QCheckBox#rLocalcopyCB, QCheckBox#saveSettings\n"
+"{\n"
+"    background-color: rgb(85, 87, 83);\n"
+"}\n"
+"QLabel#errorLabel\n"
+"{\n"
+"    color: rgb(217, 174, 23);\n"
+"}")
+        self.layoutWidget = QtWidgets.QWidget(tabUpDownload)
+        self.layoutWidget.setGeometry(QtCore.QRect(10, 10, 1231, 771))
+        self.layoutWidget.setObjectName("layoutWidget")
+        self.verticalLayout_11 = QtWidgets.QVBoxLayout(self.layoutWidget)
+        self.verticalLayout_11.setSizeConstraint(QtWidgets.QLayout.SetDefaultConstraint)
+        self.verticalLayout_11.setContentsMargins(0, 0, 0, 0)
+        self.verticalLayout_11.setObjectName("verticalLayout_11")
+        self.horizontalLayout_5 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_5.setObjectName("horizontalLayout_5")
+        self.verticalLayout_5 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_5.setSizeConstraint(QtWidgets.QLayout.SetDefaultConstraint)
+        self.verticalLayout_5.setSpacing(2)
+        self.verticalLayout_5.setObjectName("verticalLayout_5")
+        self.label_19 = QtWidgets.QLabel(self.layoutWidget)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.label_19.sizePolicy().hasHeightForWidth())
+        self.label_19.setSizePolicy(sizePolicy)
+        font = QtGui.QFont()
+        font.setPointSize(13)
+        font.setBold(True)
+        font.setWeight(75)
+        self.label_19.setFont(font)
+        self.label_19.setAlignment(QtCore.Qt.AlignCenter)
+        self.label_19.setObjectName("label_19")
+        self.verticalLayout_5.addWidget(self.label_19)
+        self.horizontalLayout_13 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_13.setObjectName("horizontalLayout_13")
+        self.createFolderButton = QtWidgets.QPushButton(self.layoutWidget)
+        self.createFolderButton.setObjectName("createFolderButton")
+        self.horizontalLayout_13.addWidget(self.createFolderButton)
+        spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout_13.addItem(spacerItem)
+        self.verticalLayout_5.addLayout(self.horizontalLayout_13)
+        self.localFsTreeView = QtWidgets.QTreeView(self.layoutWidget)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.localFsTreeView.sizePolicy().hasHeightForWidth())
+        self.localFsTreeView.setSizePolicy(sizePolicy)
+        self.localFsTreeView.setStyleSheet("")
+        self.localFsTreeView.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustIgnored)
+        self.localFsTreeView.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
+        self.localFsTreeView.setSelectionMode(QtWidgets.QAbstractItemView.NoSelection)
+        self.localFsTreeView.setHeaderHidden(True)
+        self.localFsTreeView.setObjectName("localFsTreeView")
+        self.verticalLayout_5.addWidget(self.localFsTreeView)
+        self.verticalLayout_5.setStretch(2, 1)
+        self.horizontalLayout_5.addLayout(self.verticalLayout_5)
+        spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout_5.addItem(spacerItem1)
+        self.verticalLayout_15 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_15.setObjectName("verticalLayout_15")
+        spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.verticalLayout_15.addItem(spacerItem2)
+        self.label_2 = QtWidgets.QLabel(self.layoutWidget)
+        self.label_2.setObjectName("label_2")
+        self.verticalLayout_15.addWidget(self.label_2)
+        self.resourceBox = QtWidgets.QComboBox(self.layoutWidget)
+        self.resourceBox.setLayoutDirection(QtCore.Qt.LeftToRight)
+        self.resourceBox.setObjectName("resourceBox")
+        self.resourceBox.addItem("")
+        self.verticalLayout_15.addWidget(self.resourceBox)
+        spacerItem3 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.verticalLayout_15.addItem(spacerItem3)
+        self.gridLayout_7 = QtWidgets.QGridLayout()
+        self.gridLayout_7.setObjectName("gridLayout_7")
+        spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.gridLayout_7.addItem(spacerItem4, 0, 2, 1, 1)
+        self.ContUplBut = QtWidgets.QPushButton(self.layoutWidget)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.ContUplBut.sizePolicy().hasHeightForWidth())
+        self.ContUplBut.setSizePolicy(sizePolicy)
+        self.ContUplBut.setMinimumSize(QtCore.QSize(100, 70))
+        self.ContUplBut.setText("")
+        self.ContUplBut.setIconSize(QtCore.QSize(50, 50))
+        self.ContUplBut.setObjectName("ContUplBut")
+        self.gridLayout_7.addWidget(self.ContUplBut, 5, 1, 1, 1)
+        self.UploadButton = QtWidgets.QPushButton(self.layoutWidget)
+        self.UploadButton.setMinimumSize(QtCore.QSize(100, 0))
+        self.UploadButton.setText("")
+        icon = QtGui.QIcon()
+        if getattr(sys, 'frozen', False):
+                icon.addPixmap(QtGui.QPixmap(join(dirname(realpath(sys.argv[0])), pardir) + "/icons/arrow-right.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        else:
+                icon.addPixmap(QtGui.QPixmap(dirname(realpath(sys.argv[0])) + "/icons/arrow-right.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        self.UploadButton.setIcon(icon)
+        self.UploadButton.setIconSize(QtCore.QSize(50, 50))
+        self.UploadButton.setObjectName("UploadButton")
+        self.gridLayout_7.addWidget(self.UploadButton, 0, 1, 1, 1)
+        self.DownloadButton = QtWidgets.QPushButton(self.layoutWidget)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.DownloadButton.sizePolicy().hasHeightForWidth())
+        self.DownloadButton.setSizePolicy(sizePolicy)
+        self.DownloadButton.setMinimumSize(QtCore.QSize(100, 0))
+        self.DownloadButton.setText("")
+        icon1 = QtGui.QIcon()
+        if getattr(sys, 'frozen', False):
+                icon1.addPixmap(QtGui.QPixmap(join(dirname(realpath(sys.argv[0])), pardir) + "/icons/arrow-left.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        else:
+                icon1.addPixmap(QtGui.QPixmap(dirname(realpath(sys.argv[0])) + "/icons/arrow-left.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        self.DownloadButton.setIcon(icon1)
+        self.DownloadButton.setIconSize(QtCore.QSize(50, 50))
+        self.DownloadButton.setObjectName("DownloadButton")
+        self.gridLayout_7.addWidget(self.DownloadButton, 3, 1, 1, 1)
+        spacerItem5 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.gridLayout_7.addItem(spacerItem5, 0, 0, 1, 1)
+        spacerItem6 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.gridLayout_7.addItem(spacerItem6, 4, 1, 1, 1)
+        spacerItem7 = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Maximum)
+        self.gridLayout_7.addItem(spacerItem7, 1, 1, 1, 1)
+        self.verticalLayout_15.addLayout(self.gridLayout_7)
+        spacerItem8 = QtWidgets.QSpacerItem(20, 80, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
+        self.verticalLayout_15.addItem(spacerItem8)
+        spacerItem9 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.verticalLayout_15.addItem(spacerItem9)
+        self.horizontalLayout_5.addLayout(self.verticalLayout_15)
+        spacerItem10 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout_5.addItem(spacerItem10)
+        self.verticalLayout_16 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_16.setObjectName("verticalLayout_16")
+        self.label_20 = QtWidgets.QLabel(self.layoutWidget)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Minimum)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.label_20.sizePolicy().hasHeightForWidth())
+        self.label_20.setSizePolicy(sizePolicy)
+        font = QtGui.QFont()
+        font.setPointSize(13)
+        font.setBold(True)
+        font.setWeight(75)
+        self.label_20.setFont(font)
+        self.label_20.setTextFormat(QtCore.Qt.PlainText)
+        self.label_20.setAlignment(QtCore.Qt.AlignCenter)
+        self.label_20.setObjectName("label_20")
+        self.verticalLayout_16.addWidget(self.label_20)
+        self.horizontalLayout_15 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_15.setObjectName("horizontalLayout_15")
+        self.irodsZoneLabel = QtWidgets.QLabel(self.layoutWidget)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.irodsZoneLabel.sizePolicy().hasHeightForWidth())
+        self.irodsZoneLabel.setSizePolicy(sizePolicy)
+        self.irodsZoneLabel.setObjectName("irodsZoneLabel")
+        self.horizontalLayout_15.addWidget(self.irodsZoneLabel)
+        spacerItem11 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout_15.addItem(spacerItem11)
+        self.createCollButton = QtWidgets.QPushButton(self.layoutWidget)
+        self.createCollButton.setObjectName("createCollButton")
+        self.horizontalLayout_15.addWidget(self.createCollButton)
+        self.verticalLayout_16.addLayout(self.horizontalLayout_15)
+        self.irodsFsTreeView = QtWidgets.QTreeView(self.layoutWidget)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.irodsFsTreeView.sizePolicy().hasHeightForWidth())
+        self.irodsFsTreeView.setSizePolicy(sizePolicy)
+        self.irodsFsTreeView.setStyleSheet("")
+        self.irodsFsTreeView.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents)
+        self.irodsFsTreeView.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
+        self.irodsFsTreeView.setSelectionMode(QtWidgets.QAbstractItemView.NoSelection)
+        self.irodsFsTreeView.setHeaderHidden(True)
+        self.irodsFsTreeView.setObjectName("irodsFsTreeView")
+        self.verticalLayout_16.addWidget(self.irodsFsTreeView)
+        self.verticalLayout_16.setStretch(2, 1)
+        self.horizontalLayout_5.addLayout(self.verticalLayout_16)
+        self.horizontalLayout_5.setStretch(0, 1)
+        self.horizontalLayout_5.setStretch(4, 1)
+        self.verticalLayout_11.addLayout(self.horizontalLayout_5)
+        spacerItem12 = QtWidgets.QSpacerItem(20, 10, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
+        self.verticalLayout_11.addItem(spacerItem12)
+        self.errorLabel = QtWidgets.QLabel(self.layoutWidget)
+        self.errorLabel.setText("")
+        self.errorLabel.setObjectName("errorLabel")
+        self.verticalLayout_11.addWidget(self.errorLabel)
+        spacerItem13 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.verticalLayout_11.addItem(spacerItem13)
+        self.uplSetGB_2 = QtWidgets.QGroupBox(self.layoutWidget)
+        self.uplSetGB_2.setEnabled(True)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Minimum)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.uplSetGB_2.sizePolicy().hasHeightForWidth())
+        self.uplSetGB_2.setSizePolicy(sizePolicy)
+        self.uplSetGB_2.setMinimumSize(QtCore.QSize(0, 50))
+        self.uplSetGB_2.setStyleSheet("")
+        self.uplSetGB_2.setObjectName("uplSetGB_2")
+        self.gridLayout_4 = QtWidgets.QGridLayout(self.uplSetGB_2)
+        self.gridLayout_4.setObjectName("gridLayout_4")
+        self.uplMetaRB = QtWidgets.QRadioButton(self.uplSetGB_2)
+        self.uplMetaRB.setObjectName("uplMetaRB")
+        self.gridLayout_4.addWidget(self.uplMetaRB, 0, 1, 1, 1)
+        self.uplAllRB = QtWidgets.QRadioButton(self.uplSetGB_2)
+        self.uplAllRB.setChecked(True)
+        self.uplAllRB.setObjectName("uplAllRB")
+        self.gridLayout_4.addWidget(self.uplAllRB, 0, 0, 1, 1)
+        self.rLocalcopyCB = QtWidgets.QCheckBox(self.uplSetGB_2)
+        self.rLocalcopyCB.setEnabled(False)
+        self.rLocalcopyCB.setObjectName("rLocalcopyCB")
+        self.gridLayout_4.addWidget(self.rLocalcopyCB, 1, 0, 1, 1)
+        self.uplF500RB = QtWidgets.QRadioButton(self.uplSetGB_2)
+        self.uplF500RB.setEnabled(False)
+        self.uplF500RB.setObjectName("uplF500RB")
+        self.gridLayout_4.addWidget(self.uplF500RB, 0, 2, 1, 1)
+        self.saveSettings = QtWidgets.QCheckBox(self.uplSetGB_2)
+        self.saveSettings.setObjectName("saveSettings")
+        self.gridLayout_4.addWidget(self.saveSettings, 2, 0, 1, 1)
+        self.verticalLayout_11.addWidget(self.uplSetGB_2)
+        self.verticalLayout_11.setStretch(0, 2)
+        self.verticalLayout_11.setStretch(4, 1)
+
+        self.retranslateUi(tabUpDownload)
+        QtCore.QMetaObject.connectSlotsByName(tabUpDownload)
+
+    def retranslateUi(self, tabUpDownload):
+        _translate = QtCore.QCoreApplication.translate
+        tabUpDownload.setWindowTitle(_translate("tabUpDownload", "Form"))
+        self.label_19.setText(_translate("tabUpDownload", "LOCAL"))
+        self.createFolderButton.setText(_translate("tabUpDownload", "Create Folder"))
+        self.label_2.setText(_translate("tabUpDownload", "Select storage type:"))
+        self.resourceBox.setItemText(0, _translate("tabUpDownload", "Resources"))
+        self.label_20.setText(_translate("tabUpDownload", "IRODS"))
+        self.irodsZoneLabel.setText(_translate("tabUpDownload", "Zone"))
+        self.createCollButton.setText(_translate("tabUpDownload", "Create Collection"))
+        self.uplSetGB_2.setTitle(_translate("tabUpDownload", "Upload settings"))
+        self.uplMetaRB.setText(_translate("tabUpDownload", "Metadata based"))
+        self.uplAllRB.setText(_translate("tabUpDownload", "All files"))
+        self.rLocalcopyCB.setText(_translate("tabUpDownload", "Remove  local copy"))
+        self.uplF500RB.setText(_translate("tabUpDownload", "F500"))
+        self.saveSettings.setText(_translate("tabUpDownload", "Save Settings for next session"))
+
+
+if __name__ == "__main__":
+    import sys
+    app = QtWidgets.QApplication(sys.argv)
+    tabUpDownload = QtWidgets.QWidget()
+    ui = Ui_tabUpDownload()
+    ui.setupUi(tabUpDownload)
+    tabUpDownload.show()
+    sys.exit(app.exec_())
diff --git a/gui/ui-files/tabUpDownload.ui b/gui/ui_files/tabUpDownload.ui
similarity index 99%
rename from gui/ui-files/tabUpDownload.ui
rename to gui/ui_files/tabUpDownload.ui
index c714cc093762b89560989a57c33692f5917a1317..ec2bf9e4eca85244323f6cbacc918681bf1ebed3 100644
--- a/gui/ui-files/tabUpDownload.ui
+++ b/gui/ui_files/tabUpDownload.ui
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <ui version="4.0">
- <class>Form</class>
- <widget class="QWidget" name="Form">
+ <class>tabUpDownload</class>
+ <widget class="QWidget" name="tabUpDownload">
   <property name="geometry">
    <rect>
     <x>0</x>
diff --git a/gui/icons/arrow-left.png b/icons/arrow-left.png
similarity index 100%
rename from gui/icons/arrow-left.png
rename to icons/arrow-left.png
diff --git a/gui/icons/arrow-right.png b/icons/arrow-right.png
similarity index 100%
rename from gui/icons/arrow-right.png
rename to icons/arrow-right.png
diff --git a/gui/icons/home.png b/icons/home.png
similarity index 100%
rename from gui/icons/home.png
rename to icons/home.png
diff --git a/gui/icons/irods-basicGUI_Login.png b/icons/irods-basicGUI_Login.png
similarity index 100%
rename from gui/icons/irods-basicGUI_Login.png
rename to icons/irods-basicGUI_Login.png
diff --git a/gui/icons/loading_circle.gif b/icons/loading_circle.gif
similarity index 100%
rename from gui/icons/loading_circle.gif
rename to icons/loading_circle.gif
diff --git a/gui/icons/nosync.png b/icons/nosync.png
similarity index 100%
rename from gui/icons/nosync.png
rename to icons/nosync.png
diff --git a/gui/icons/syncing.png b/icons/syncing.png
similarity index 100%
rename from gui/icons/syncing.png
rename to icons/syncing.png
diff --git a/irods-iBridgesGui.ico b/irods-iBridgesGui.ico
new file mode 100644
index 0000000000000000000000000000000000000000..6aa25f2fb3e63295ac9f3febaaace75d782e445f
Binary files /dev/null and b/irods-iBridgesGui.ico differ
diff --git a/irods-iBridgesGui.py b/irods-iBridgesGui.py
index ccb00d3368a2e2d40daf1ffe5d70a445558add7a..4cf6ce5323cb2837cc3add3b4d8435223738c326 100755
--- a/irods-iBridgesGui.py
+++ b/irods-iBridgesGui.py
@@ -22,12 +22,15 @@ from irods.exception import CollectionDoesNotExist
 from gui.mainmenu import mainmenu
 from gui.irodsTicketLogin import irodsTicketLogin
 from utils.utils import networkCheck, setup_logger
+from gui.ui_files.irodsLogin import Ui_irodsLogin
 
-class irodsLogin(QDialog):
+
+class irodsLogin(QDialog, Ui_irodsLogin):
     def __init__(self):
         super(irodsLogin, self).__init__()
-        loadUi("gui/ui-files/irodsLogin.ui", self)
-        
+        super(irodsLogin, self).setupUi(self)
+        #loadUi("gui/ui-files/irodsLogin.ui", self)
+
         self.irodsEnvPath = os.path.expanduser('~')+ os.sep +".irods"
         setup_logger(self.irodsEnvPath, "iBridgesGui")
         if not os.path.isdir(self.irodsEnvPath):
diff --git a/pyinstaller_script.py b/pyinstaller_script.py
new file mode 100644
index 0000000000000000000000000000000000000000..db7bfd4ace57d469613ade6df8089146cf7a480d
--- /dev/null
+++ b/pyinstaller_script.py
@@ -0,0 +1,133 @@
+from genericpath import isfile
+from subprocess import Popen, run, PIPE, STDOUT
+from shutil import copytree, rmtree
+
+from glob import glob
+from os import getcwd, mkdir, path, remove, sep
+from platform import system
+
+
+"""
+Pipeline to create pyinstaller executables.
+not using the --onefile options because than windows has to upack the exe before it can run. 
+This makes it rougly 30 seconds slower than the current variant. 
+"""
+
+# Run command in shell, stdout is printed to the screen
+def run_cmd(cmd):
+    if system()[0].upper() == "W": # windows
+        ps = run(cmd, stderr=STDOUT, shell=True, universal_newlines=True)
+    else:
+        ps = run(cmd, stderr=STDOUT, shell=True, universal_newlines=True, executable="/bin/bash")
+    # Print all errors
+    if ps.stderr != None:
+        print(f"commandline error: {ps.stderr}")
+        raise Exception("shell run error")
+
+
+# Convert the .ui files to .py files
+def ui_to_py(ui_folder, python):
+    # python -m PyQt5.uic.pyuic -x main.ui -o mainUI.py
+    for ui_file in glob(ui_folder + '*.ui'):
+        filename, ext = path.splitext(ui_file)
+        print(f"Converting {filename} to .py")
+        run_cmd(f"""{python} -m PyQt5.uic.pyuic -x {ui_file} -o {filename +".py"}""")
+
+        # Find and replace the pixelmap references... They are hardcoded
+        # Also have to go up one directory for the executable, its ugly! 
+        with open(filename +".py", 'r') as file:
+            lines = file.readlines()
+            modified_lines = {}
+            for linenum, line in enumerate(lines):
+                if """QtGui.QPixmap(\"""" in line: 
+                    abs_fchar = line.find("\"")
+                    abs_lchar = line.find(".", abs_fchar) + 2
+
+                    new_line = line[0:abs_fchar] + "dirname(realpath(sys.argv[0])) + \"" + line[abs_lchar:]
+                    exeline = line[0:abs_fchar] + "join(dirname(realpath(sys.argv[0])), pardir) + \"" + line[abs_lchar:]
+                    modified_lines[linenum] = (new_line, exeline)
+
+        if len(modified_lines) > 0:
+            lineofset = 0
+            spacing = "        " #distance of one tab
+            for linenum, text in modified_lines.items():
+                lines[(linenum + lineofset)] = spacing + text[0]
+                lines.insert(linenum + lineofset, f"{spacing}else:\n")
+                lines.insert(linenum + lineofset, spacing + text[1])
+                lines.insert(linenum + lineofset, f"{spacing}if getattr(sys, 'frozen', False):\n")
+                lineofset = lineofset + 3
+
+            lines.insert(10, "import sys\n")
+            lines.insert(10, "from os.path import dirname, join, pardir, realpath\n")
+            with open(filename +".py", 'w') as file:
+                file.writelines(lines)
+
+
+# Remove the locally stored .py versions of the files
+def remove_pyui_files(ui_folder):
+    pyuifiles = glob(ui_folder + '*.py')
+    if len(pyuifiles) > 0:
+        for file in pyuifiles:
+            print(f"Removing {file}")
+            remove(file)
+
+
+# Overwrite one folder with all content
+def replace_folder(source, destination):
+    if path.exists(destination) and path.isdir(destination):
+        rmtree(destination)
+    copytree(source, destination)
+
+
+if __name__ == "__main__":
+    icons_folder = f"{getcwd()}{sep}icons"
+    ui_folder = f"{getcwd()}{sep}gui{sep}ui_files{sep}"
+    rules_folder = f"{getcwd()}{sep}rules"
+    venv = f"{getcwd()}{sep}venv"
+
+    # Seperator for sending multiple commands in one commandline call
+    if system()[0].upper() == "W": # windows
+        cmd_sep = "&&"
+        python = "python" # python version 
+    else: # Linux
+        cmd_sep = ";"
+        python = "python3"
+
+    # Step 1 Convert .ui files to .py files
+    # Remove py files if they already exist, recompiling is the best way to ensure they are up to date
+    remove_pyui_files(ui_folder)
+    ui_to_py(ui_folder, python)
+
+    # Step 2: Pyinstallers includes all dependencies in the environment, so we use a venv
+    # Step 2a, Ensure the folder for the venv exists 
+    if (not path.exists(venv)) or (not path.isdir(venv)):
+        mkdir(venv)
+    
+    # Step 2b, Create the venv if needed
+    if system()[0].upper() == "W": # windows
+        venv_activate = f"{venv}{sep}Scripts{sep}activate.bat"
+    else:
+        venv_activate = f"source {venv}/bin/activate"
+    if (not path.exists(venv_activate)) or (not path.isfile(venv_activate)):
+        run_cmd(f"{python} -m venv {venv}")
+        run_cmd(f"{venv_activate} {cmd_sep} python -m pip install --upgrade pip")	      
+        run_cmd(f"{venv_activate} {cmd_sep} pip install -r requirements.txt")
+
+    # Step 3, Activate venv and tun pyinstaller
+    run_cmd(f"{venv_activate} {cmd_sep} pyinstaller --clean --noconfirm --icon irods-iBridgesGui.ico irods-iBridgesGui.py")
+    dist_folder = f"{getcwd()}{sep}dist"
+
+
+    # Step 4, Copy rules, icons folder to dist folder, replace if exists.
+    dist_icons = f"{dist_folder}{sep}icons"
+    dist_rules = f"{dist_folder}{sep}rules"
+    replace_folder(icons_folder, dist_icons)
+    replace_folder(rules_folder, dist_rules)
+    
+   
+    confirmation = input("Do you want to cleanup the build environment (Y/N): ")
+    if confirmation[0].upper() == 'Y':
+        #remove_pyui_files(ui_folder)
+        rmtree(getcwd() + sep + "build")
+        #remove(getcwd() + "dist")
+        remove(getcwd() + sep + "irods-iBridgesGui.spec")
\ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
index 2a8fa7ac5bae85a7bdf76894972e4d205195ee3e..9af42fff7d7a20190a6f3aef84384df96dad5d09 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -3,3 +3,4 @@ elabjournal==0.0.19
 PyQt5==5.15.4
 python-irodsclient==1.0.0
 watchdog==2.1.5
+pyinstaller==4.5.1
\ No newline at end of file
diff --git a/utils/elabConnector.py b/utils/elabConnector.py
index d340bf547adce737495de61f2718f85ec8fda358..eebac6a48eaa5bf59c6b4165fd97bea3d5c62bae 100644
--- a/utils/elabConnector.py
+++ b/utils/elabConnector.py
@@ -153,6 +153,12 @@ class elabConnector():
         except:
             raise
 
-    def addMetadata(self, info, title='Title'):
+    def addMetadata(self, url, meta=None, title='Title'):
+        info = '<a href="' + url + '">Experiment data in iRODS</a>'
+        if not meta == None:
+            info = info + '<br><table style="width: 500px;" cellspacing="1" cellpadding="1" border="1"><tbody>'
+            for key, value in meta.items():
+                info = info + '<tr><td>' + key + '</td><td>' + value + '</td></tr>'
+            info = info + '</tbody></table>'
         self.experiment.add(info, title)
         return True
diff --git a/utils/irodsConnector.py b/utils/irodsConnector.py
index 79f11824659793d1be06be58896d5c8bd1f985fe..1a4b872b3f1ae846cd0da476beae677218d643d1 100644
--- a/utils/irodsConnector.py
+++ b/utils/irodsConnector.py
@@ -383,7 +383,7 @@ class irodsConnector():
                 sourcePath = os.path.join(source, o)
                 if len(o.split(os.sep)) > 1:
                     subColl = self.session.collections.create(
-                                destination.path+'/'+os.path.basename(source)+'/'+os.path.dirname(o))
+                                destination.path+'/'+os.path.basename(source)+'/'+os.path.dirname(o).replace(os.sep,'/'))
                 else:
                     subColl = self.session.collections.create(
                             destination.path+'/'+os.path.basename(source))
@@ -565,7 +565,7 @@ class irodsConnector():
         if not coll == None:
             for root, subcolls, obj in coll.walk():
                 for o in obj:
-                    listColl.append(os.path.join(root.path.split(coll.path)[1], o.name).strip('/'))
+                    listColl.append(os.path.join(root.path.split(coll.path)[1], o.name).strip('/').replace("/", os.sep))
 
         diff = []
         same = []
@@ -603,7 +603,7 @@ class irodsConnector():
                     #md5
                     with open(os.path.join(dirPath, locPartialPath), "rb") as f:
                         stream = f.read()
-                        md5 = hashlib.md5(stream).hexdigest();
+                        md5 = hashlib.md5(stream).hexdigest()
                     if objCheck != md5:
                         diff.append((coll.path + '/' + iPartialPath, os.path.join(dirPath, locPartialPath)))
                     else:
@@ -733,14 +733,19 @@ class irodsConnector():
         stderr = []
         if len(out.MsParam_PI) > 0:
             try:
-                stdout = [o.decode() 
-                    for o in (out.MsParam_PI[0].inOutStruct.stdoutBuf.buf.strip(b'\x00')).split(b'\n')]
-                stderr = [o.decode() 
-                    for o in (out.MsParam_PI[0].inOutStruct.stderrBuf.buf.strip(b'\x00')).split(b'\n')]
+                if out.MsParam_PI[0].inOutStruct.stdoutBuf.buf != None:
+                    stdout = [o.decode() 
+                        for o in (out.MsParam_PI[0].inOutStruct.stdoutBuf.buf.strip(b'\x00')).split(b'\n')]
+                else:
+                    stdout = ""
+                if out.MsParam_PI[0].inOutStruct.stderrBuf.buf != None:
+                    stderr = [o.decode() 
+                        for o in (out.MsParam_PI[0].inOutStruct.stderrBuf.buf.strip(b'\x00')).split(b'\n')]
+                else:
+                    stdout = ""
             except AttributeError:
                 logging.info('RULE EXECUTION ERROR: '+str(stdout+stderr), exc_info=True)
-                return stdout, stderr
-        
+                return "", ""
         return stdout, stderr
 
 
diff --git a/utils/irodsConnectorIcommands.py b/utils/irodsConnectorIcommands.py
index 154044bbc188547808011e29785911667ce8e727..94bcf88cd92d8ac4516b19a721d7b2e092950bde 100644
--- a/utils/irodsConnectorIcommands.py
+++ b/utils/irodsConnectorIcommands.py
@@ -1,18 +1,18 @@
-from irods.session      import iRODSSession
-from irods.access       import iRODSAccess
-from irods.exception    import CATALOG_ALREADY_HAS_ITEM_BY_THAT_NAME, CAT_NO_ACCESS_PERMISSION
-from irods.exception    import CAT_SUCCESS_BUT_WITH_NO_INFO, CAT_INVALID_ARGUMENT, CAT_INVALID_USER
-from irods.exception    import CollectionDoesNotExist
-from irods.ticket       import Ticket
-
-from irods.models       import Collection, DataObject, Resource, ResourceMeta, CollectionMeta, DataObjectMeta
-from irods.models       import User, UserGroup
+from irods.session import iRODSSession
+from irods.access import iRODSAccess
+from irods.exception import CATALOG_ALREADY_HAS_ITEM_BY_THAT_NAME, CAT_NO_ACCESS_PERMISSION
+from irods.exception import CAT_SUCCESS_BUT_WITH_NO_INFO, CAT_INVALID_ARGUMENT, CAT_INVALID_USER
+from irods.exception import CollectionDoesNotExist
+from irods.ticket import Ticket
+
+from irods.models import Collection, DataObject, Resource, ResourceMeta, CollectionMeta, DataObjectMeta
+from irods.models import User, UserGroup
 from irods.column import Like, Between, In
 import irods.keywords as kw
 from irods.rule import Rule
 
 import subprocess
-from subprocess         import Popen, PIPE
+from subprocess import Popen, PIPE
 import json
 import os
 from base64 import b64decode