diff --git a/VERSION b/VERSION
index 0a3b55e..f6e5575 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.0.172
+1.0.173
diff --git a/common/change_gds_cell.py b/common/change_gds_cell.py
index 7e2c22a..ddb4e4d 100755
--- a/common/change_gds_cell.py
+++ b/common/change_gds_cell.py
@@ -106,6 +106,9 @@
                 sys.exit(1)
 
             bstring = celldata[dataptr + 4: dataptr + reclen]
+            # Odd length strings end in null byte which needs to be removed
+            if bstring[-1] == 0:
+                bstring = bstring[:-1]
             strname = bstring.decode('ascii')
             if strname == cellname:
                 print('Cell ' + cellname + ' found at position ' + str(saveptr))
@@ -163,6 +166,9 @@
                 sys.exit(1)
 
             bstring = gdsdata[dataptr + 4: dataptr + reclen]
+            # Odd length strings end in null byte which needs to be removed
+            if bstring[-1] == 0:
+                bstring = bstring[:-1]
             strname = bstring.decode('ascii')
             if strname == cellname:
                 print('Cell ' + cellname + ' found at position ' + str(saveptr))
diff --git a/common/find_gds_prefix.py b/common/find_gds_prefix.py
new file mode 100755
index 0000000..aeab8cc
--- /dev/null
+++ b/common/find_gds_prefix.py
@@ -0,0 +1,102 @@
+#!/usr/bin/env python3
+#
+# Script to read a GDS file, and find the given cellname if it has the
+# standard random two-character prefix generated by magic when writing
+# out a vendor GDS, and report the prefix.  No changes are made to any
+# file.
+
+import os
+import sys
+
+def usage():
+    print('find_gds_prefix.py <cell_name> <path_to_cell_gds>')
+
+if __name__ == '__main__':
+    debug = False
+
+    if len(sys.argv) == 1:
+        print("No options given to find_gds_prefix.py.")
+        usage()
+        sys.exit(0)
+
+    optionlist = []
+    arguments = []
+
+    for option in sys.argv[1:]:
+        if option.find('-', 0) == 0:
+            optionlist.append(option)
+        else:
+            arguments.append(option)
+
+    if len(arguments) != 2:
+        print("Wrong number of arguments given to find_gds_prefix.py.")
+        usage()
+        sys.exit(0)
+
+    for option in optionlist:
+        if option == '-debug':
+            debug = True
+
+    cellname = arguments[0]
+    cellsource = arguments[1]
+
+    cellsrcdir = os.path.split(cellsource)[0]
+    cellinfile = os.path.split(cellsource)[1]
+
+    print('Reading GDS file looking for prefixed cell ' + cellname)
+    with open(cellsource, 'rb') as ifile:
+        celldata = ifile.read()
+
+    #----------------------------------------------------------------------
+    # Assume that celldata contains the cell in question.
+    # Find the extend of the data from 'beginstr' to 'endstr'
+    #----------------------------------------------------------------------
+    
+    datalen = len(celldata)
+    dataptr = 0
+    found = False
+    while dataptr < datalen:
+        # Read stream records up to 'beginstr'
+        bheader = celldata[dataptr:dataptr + 2]
+        reclen = int.from_bytes(bheader, 'big')
+        if reclen == 0:
+            print('Error: found zero-length record at position ' + str(dataptr))
+            break
+
+        rectype = celldata[dataptr + 2]
+        datatype = celldata[dataptr + 3]
+
+        brectype = rectype.to_bytes(1, byteorder='big')
+        bdatatype = datatype.to_bytes(1, byteorder='big')
+
+        if rectype == 5:            # beginstr
+            saveptr = dataptr
+
+        elif rectype == 6:            # strname
+            if datatype != 6:
+                print('Error: Structure name record is not a string!')
+                sys.exit(1)
+
+            bstring = celldata[dataptr + 4: dataptr + reclen]
+            # Odd length strings end in null byte which needs to be removed
+            if bstring[-1] == 0:
+                bstring = bstring[:-1]
+            strname = bstring.decode('ascii')
+            if strname[3:] == cellname:
+                print('Cell ' + strname + ' found at position ' + str(saveptr))
+                print('Prefix: ' + strname[0:2])
+                found = True
+                break
+            elif strname == cellname:
+                print('Unprefixed cell ' + strname + ' found at position ' + str(saveptr))
+            elif debug:
+                print('Cell ' + strname + ' position ' + str(dataptr) + ' (ignored)')
+
+        # Advance the pointer past the data
+        dataptr += reclen
+
+    if not found:
+        print('Failed to find a prefixed cell ' + cellname)
+        sys.exit(1)
+
+    exit(0)
