diff --git a/companion.py b/companion.py
index d972496e..5bda6efe 100644
--- a/companion.py
+++ b/companion.py
@@ -349,74 +349,22 @@ def fixup(data):
 # Return a subset of the received data describing the current ship
 def ship(data):
 
-    # Add a leaf to a dictionary, creating empty dictionaries along the branch if necessary
-    def addleaf(data, to, props):
-
-        # special handling for completely empty trees
-        p = props[0]
-        if p in data and not data[p]:
-            to[p] = data[p]
-            return
-
-        # Does the leaf exist ?
-        tail = data
-        for p in props:
-            if not hasattr(data, 'get') or p not in tail:
-                return
+    def filter_ship(d):
+        filtered = {}
+        for k, v in d.iteritems():
+            if v == []:
+                pass	# just skip empty fields for brevity
+            elif k in ['alive', 'cargo', 'cockpitBreached', 'health', 'oxygenRemaining', 'rebuilds', 'starsystem', 'station']:
+                pass	# noisy
+            elif k in ['locDescription', 'locName'] or k.endswith('LocDescription') or k.endswith('LocName'):
+                pass	# also noisy, and redundant
+            elif k in ['dir', 'LessIsGood']:
+                pass	# dir is not ASCII - remove to simplify handling
+            elif hasattr(v, 'iteritems'):
+                filtered[k] = filter_ship(v)
             else:
-                tail = tail[p]
-
-        for p in props[:-1]:
-            if not hasattr(data, 'get') or p not in data:
-                return
-            elif p not in to:
-                to[p] = {}
-            elif not hasattr(to, 'get'):
-                return	# intermediate is not a dictionary - inconsistency!
-            data = data[p]
-            to = to[p]
-        p = props[-1]
-        to[p] = data[p]
+                filtered[k] = v
+        return filtered
 
     # subset of "ship" that's not noisy
-    description = {}
-    for props in [
-        ('cargo', 'capacity'),
-        ('free',),
-        ('fuel', 'main', 'capacity'),
-        ('fuel', 'reserve', 'capacity'),
-        ('id',),
-        ('name',),
-        ('shipID',),
-        ('shipName',),
-        ('value', 'hull'),
-        ('value', 'modules'),
-        ('value', 'unloaned'),
-    ]: addleaf(data['ship'], description, props)
-
-    if data['ship'].get('launchBays'):
-        description['launchBays'] = {}
-        for slot in data['ship'].get('launchBays', {}):
-            for subslot in data['ship']['launchBays'].get(slot, {}):
-                for prop in ['loadout', 'loadoutName', 'name']:
-                    addleaf(data['ship']['launchBays'], description['launchBays'], (slot, subslot, prop))
-
-    description['modules'] = {}
-    for slot in data['ship'].get('modules', {}):
-        for prop in data['ship']['modules'][slot]:
-            if prop == 'module':
-                for prop2 in ['free', 'id', 'name', 'on', 'priority', 'value', 'unloaned']:
-                    addleaf(data['ship']['modules'], description['modules'], (slot, prop, prop2))
-            elif prop == 'engineer':
-                for prop2 in ['engineerName', 'recipeLevel', 'recipeName']:
-                    addleaf(data['ship']['modules'], description['modules'], (slot, prop, prop2))
-            elif prop in ['modifications', 'WorkInProgress_modifications']:
-                for mod in data['ship']['modules'][slot].get(prop, {}):
-                    addleaf(data['ship']['modules'], description['modules'], (slot, prop, mod, 'value'))
-            elif prop == 'specialModifications':
-                if data['ship']['modules'][slot][prop]:
-                    addleaf(data['ship']['modules'], description['modules'], (slot, prop))
-            else:
-                addleaf(data['ship']['modules'], description['modules'], (slot, prop))
-
-    return description
+    return filter_ship(data['ship'])