diff --git a/conda-recipe/meta.yaml b/conda-recipe/meta.yaml
index 76ebe8304c8756f9ae5646997c244c63523460d0..682cfd40368c261dd8597529eff44683f4d88262 100644
--- a/conda-recipe/meta.yaml
+++ b/conda-recipe/meta.yaml
@@ -1,6 +1,6 @@
 package:
   name: nexus-passoft
-  version: "2023.4.3.0"
+  version: "2023.4.4.0"
 
 source:
   path: ../
diff --git a/nexus/__init__.py b/nexus/__init__.py
index b5481e17a23e07909aafffb8c22f704eaf565a3d..cb661680e72c6081e9826f7b47e815023bde5644 100644
--- a/nexus/__init__.py
+++ b/nexus/__init__.py
@@ -4,4 +4,4 @@
 
 __author__ = """IRIS PASSCAL"""
 __email__ = 'software-support@passcal.nmt.edu'
-__version__ = '2023.4.3.0'
+__version__ = '2023.4.4.0'
diff --git a/nexus/nexus.py b/nexus/nexus.py
index 5c7fa115726c357ff57a84206d728df9d9b8250b..377d34a35d66d8ebdc74e7bb0ee28418122d7bd4 100755
--- a/nexus/nexus.py
+++ b/nexus/nexus.py
@@ -657,21 +657,27 @@ class InventoryModel(QtCore.QAbstractItemModel):
         if node is not self._root_node:
             self.remove_row(node, self.parent(self.get_index(node)))
 
-    def add_inventory(self, inventory):
+    def add_inventory(self, inventory, net_r=False, stat_r=False, chan_r=False):
         '''
         Replaces data model with new inventory.
         If you want to add and inventory add before and call.
         '''
         self.clear_data()
+        # sort networks
+        inventory.networks.sort(key=lambda x: x.code, reverse=net_r)
         for net in inventory.networks:
             # Making a node inserts it so append_node is empty
             net_node = NetworkNode(net.code, net, self._root_node)
             self.append_node(net_node)
             net_index = self.get_index(net_node)
+            # sort stations
+            net.stations.sort(key=lambda x: x.code, reverse=stat_r)
             for sta in net.stations:
                 sta_node = StationNode(sta.code, sta, net_node)
                 self.append_node(sta_node, net_index)
                 sta_index = self.get_index(sta_node)
+                # sort channels
+                sta.channels.sort(key=lambda x: x.code, reverse=chan_r)
                 for chan in sta.channels:
                     chan_node = ChannelNode(chan.code, chan, sta_node)
                     self.append_node(chan_node, sta_index)
@@ -688,6 +694,13 @@ class NexusWindow(*load_ui("NexusWindow.ui")):
         super().__init__(parent)
         self.setupUi(self)
 
+        # default sort is ascending
+        self.sorting_dict = {
+            NetworkNode: False,
+            StationNode: False,
+            ChannelNode: False
+        }
+
         # Quick aliases
         global status_message
         status_message = self.status_message
@@ -710,6 +723,9 @@ class NexusWindow(*load_ui("NexusWindow.ui")):
 
         self.uiInventoryTree.selectionModel().currentChanged.connect(
             self.editor.setSelection)
+        self.uiInventoryTree.setContextMenuPolicy(Qt.CustomContextMenu)
+        self.uiInventoryTree.customContextMenuRequested.connect(
+            self.sorting_popup)
 
         # Actions
         self.actionScan_MiniSEED.triggered.connect(self.scan_ms_dialog)
@@ -731,6 +747,47 @@ class NexusWindow(*load_ui("NexusWindow.ui")):
         # test
         self.actionDebug.triggered.connect(self.debug)
 
+    def sorting_popup(self, point):
+        '''
+        Bring up menu to let user sort
+        inventory in ascending/descending order
+        '''
+        index = self.uiInventoryTree.indexAt(point)
+        node = self.inv_model.get_node(index)
+        node_type = ''
+        if isinstance(node, NetworkNode):
+            node_type = 'Networks'
+        elif isinstance(node, StationNode):
+            node_type = 'Stations'
+        elif isinstance(node, ChannelNode):
+            node_type = 'Channels'
+        menu = QtWidgets.QMenu(self)
+        sort_asc = QtGui.QAction(f"Sort {node_type} 0-Z")
+        sort_asc.triggered.connect(lambda: self.set_sorting_order('ascending', type(node)))
+        sort_desc = QtGui.QAction(f"Sort {node_type} Z-0")
+        sort_desc.triggered.connect(lambda: self.set_sorting_order('descending', type(node)))
+        menu.exec([sort_asc, sort_desc], self.uiInventoryTree.mapToGlobal(point))
+
+    def set_sorting_order(self, order, node):
+        '''
+        Repopulate inventory in ascending or
+        descending order
+        '''
+        sort_value = False if order == 'ascending' else True
+        self.sorting_dict[node] = sort_value
+        # keep scroll bar where it was after
+        # sorting inventory
+        scroll_value = self.uiInventoryTree.verticalScrollBar().value()
+        self.status_message('Sorting...')
+        self.inv_model.add_inventory(
+            self.inventory,
+            self.sorting_dict[NetworkNode],
+            self.sorting_dict[StationNode],
+            self.sorting_dict[ChannelNode])
+        self.reshape_tree()
+        self.uiInventoryTree.verticalScrollBar().setValue(scroll_value)
+        self.status_message('Sorting... Done.')
+
     def debug(self):
         pass
 
diff --git a/setup.py b/setup.py
index 9e54d29bfeab058fde9b35d39f82f759753d0835..5b7586c83e85956e71b6507ae607f25355689215 100644
--- a/setup.py
+++ b/setup.py
@@ -50,6 +50,6 @@ setup(
     packages=find_packages(include=['nexus']),
     test_suite='tests',
     url='https://git.passcal.nmt.edu/software_public/passoft/nexus',
-    version='2023.4.3.0',
+    version='2023.4.4.0',
     zip_safe=False,
 )