diff --git a/images/glance-icon.svg b/images/glance-icon.svg
new file mode 100644
index 0000000000000000000000000000000000000000..b9231badf79ba87de1bd81498dd9410bd68fd6ff
--- /dev/null
+++ b/images/glance-icon.svg
@@ -0,0 +1,364 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="76"
+   height="76"
+   viewBox="0 0 76 76"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.92.3 (unknown)"
+   sodipodi:docname="glance-icon.svg">
+  <defs
+     id="defs4">
+    <linearGradient
+       id="linearGradient5714"
+       inkscape:collect="always">
+      <stop
+         id="stop5708"
+         offset="0"
+         style="stop-color:#4c4c4c;stop-opacity:1" />
+      <stop
+         style="stop-color:#b3b3b3;stop-opacity:1"
+         offset="0.51795828"
+         id="stop5710" />
+      <stop
+         id="stop5712"
+         offset="1"
+         style="stop-color:#4c4c4c;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5243">
+      <stop
+         style="stop-color:#646464;stop-opacity:1"
+         offset="0"
+         id="stop5239" />
+      <stop
+         id="stop5695"
+         offset="0.51013786"
+         style="stop-color:#cbcbcb;stop-opacity:1" />
+      <stop
+         style="stop-color:#646464;stop-opacity:1"
+         offset="1"
+         id="stop5241" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4951"
+       inkscape:collect="always">
+      <stop
+         id="stop4941"
+         offset="0"
+         style="stop-color:#2f2d2d;stop-opacity:1" />
+      <stop
+         style="stop-color:#747171;stop-opacity:1"
+         offset="0.28813115"
+         id="stop4943" />
+      <stop
+         style="stop-color:#949494;stop-opacity:1"
+         offset="0.68082035"
+         id="stop4945" />
+      <stop
+         id="stop4947"
+         offset="0.92372292"
+         style="stop-color:#767676;stop-opacity:1" />
+      <stop
+         id="stop4949"
+         offset="1"
+         style="stop-color:#4a4a4a;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient4903">
+      <stop
+         style="stop-color:#d35151;stop-opacity:1"
+         offset="0"
+         id="stop4899" />
+      <stop
+         style="stop-color:#a12929;stop-opacity:1"
+         offset="1"
+         id="stop4901" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient4583">
+      <stop
+         style="stop-color:#d0d0d0;stop-opacity:1;"
+         offset="0"
+         id="stop4579" />
+      <stop
+         id="stop4829"
+         offset="0.51795828"
+         style="stop-color:#f3f3f3;stop-opacity:1" />
+      <stop
+         style="stop-color:#d0d0d0;stop-opacity:1"
+         offset="1"
+         id="stop4581" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient4548">
+      <stop
+         style="stop-color:#491313;stop-opacity:1"
+         offset="0"
+         id="stop4544" />
+      <stop
+         id="stop4573"
+         offset="0.28813115"
+         style="stop-color:#b03535;stop-opacity:1;" />
+      <stop
+         id="stop4566"
+         offset="0.68082035"
+         style="stop-color:#d45555;stop-opacity:1" />
+      <stop
+         style="stop-color:#b43838;stop-opacity:1;"
+         offset="0.92372292"
+         id="stop4575" />
+      <stop
+         style="stop-color:#751e1e;stop-opacity:1"
+         offset="1"
+         id="stop4546" />
+    </linearGradient>
+    <inkscape:path-effect
+       effect="lattice2"
+       gridpoint0="11.592444,996.71911"
+       gridpoint1="35.127751,996.71911"
+       gridpoint2="11.592444,1027.1932"
+       gridpoint3="35.127751,1027.1932"
+       gridpoint4="16.924299,995.25701"
+       gridpoint5="29.795895,995.25701"
+       gridpoint6="16.924299,1028.6553"
+       gridpoint7="29.795895,1028.6553"
+       gridpoint8x9="23.360096,995.25701"
+       gridpoint10x11="23.360096,1028.6553"
+       gridpoint12="10.488501,1003.6066"
+       gridpoint13="36.231693,1003.6066"
+       gridpoint14="10.488501,1020.3057"
+       gridpoint15="36.231693,1020.3057"
+       gridpoint16="14.621607,999.92001"
+       gridpoint17="32.098587,999.92001"
+       gridpoint18="14.621607,1023.9923"
+       gridpoint19="32.098587,1023.9923"
+       gridpoint20x21="23.57382,997.79952"
+       gridpoint22x23="23.57382,1026.1128"
+       gridpoint24x26="10.488501,1011.9561"
+       gridpoint25x27="36.231693,1011.9561"
+       gridpoint28x30="11.641311,1011.5534"
+       gridpoint29x31="35.078883,1011.5534"
+       gridpoint32x33x34x35="23.360096,1011.9561"
+       id="path-effect4523"
+       is_visible="true"
+       horizontal_mirror="true"
+       vertical_mirror="true"
+       live_update="true" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4548"
+       id="linearGradient4550"
+       x1="-764.1394"
+       y1="-703.29352"
+       x2="-764.13751"
+       y2="-695.84363"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.70729047,-0.70692305,0.70729047,-0.70692305,3.3303571,2.2142857)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4583"
+       id="linearGradient4827"
+       gradientUnits="userSpaceOnUse"
+       x1="8.1442518"
+       y1="1027.7595"
+       x2="37.86021"
+       y2="994.9917" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4903"
+       id="radialGradient4907"
+       cx="60.475803"
+       cy="1047.7606"
+       fx="60.475803"
+       fy="1047.7606"
+       r="2.5974979"
+       gradientTransform="matrix(1,0,0,1.0015613,0,-1.6360508)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4951"
+       id="linearGradient4550-3"
+       x1="-764.1394"
+       y1="-703.29352"
+       x2="-764.13751"
+       y2="-695.84363"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.33472316,-0.33454928,0.33472316,-0.33454928,19.080201,538.93987)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5243"
+       id="linearGradient5693"
+       gradientUnits="userSpaceOnUse"
+       x1="10.475944"
+       y1="1027.3356"
+       x2="37.21508"
+       y2="997.72546" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5714"
+       id="linearGradient5704"
+       gradientUnits="userSpaceOnUse"
+       x1="8.1442518"
+       y1="1027.7595"
+       x2="37.86021"
+       y2="994.9917"
+       gradientTransform="translate(0.48214281,0.57142853)" />
+    <filter
+       style="color-interpolation-filters:sRGB"
+       inkscape:label="Drop Shadow"
+       id="filter873">
+      <feFlood
+         flood-opacity="0.498039"
+         flood-color="rgb(58,58,58)"
+         result="flood"
+         id="feFlood863" />
+      <feComposite
+         in="flood"
+         in2="SourceGraphic"
+         operator="in"
+         result="composite1"
+         id="feComposite865" />
+      <feGaussianBlur
+         in="composite1"
+         stdDeviation="1.5"
+         result="blur"
+         id="feGaussianBlur867" />
+      <feOffset
+         dx="2"
+         dy="1"
+         result="offset"
+         id="feOffset869" />
+      <feComposite
+         in="SourceGraphic"
+         in2="offset"
+         operator="over"
+         result="composite2"
+         id="feComposite871" />
+    </filter>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="8.0000004"
+     inkscape:cx="-27.974053"
+     inkscape:cy="39.105712"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="2055"
+     inkscape:window-height="1384"
+     inkscape:window-x="768"
+     inkscape:window-y="545"
+     inkscape:window-maximized="0"
+     units="px"
+     width="8in"
+     fit-margin-top="1"
+     fit-margin-left="1"
+     fit-margin-right="1"
+     fit-margin-bottom="1" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="subject"
+     style="display:inline"
+     transform="translate(5.3096061,6.9533016)">
+    <path
+       transform="translate(0,-988.3622)"
+       inkscape:connector-curvature="0"
+       id="path4519"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:52.84394073px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.19627523px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 35.127751,1020.321 c -0.85307,0.6175 -3.794344,2.5411 -8.405728,3.2152 -4.237282,0.6193 -7.510294,-0.1822 -7.510294,-0.1822 -0.758623,1.2387 -1.377515,2.1712 -1.983197,2.8311 -0.527977,0.5752 -1.092703,1.0081 -1.092703,1.0081 -0.94173,-0.2193 -2.848777,-1.3786 -2.848777,-1.3786 0.435257,-0.7651 0.741568,-1.4071 1.088349,-2.256 0.301141,-0.7372 0.580984,-1.4623 0.580984,-1.4623 -0.947,-0.3801 -1.814457,-0.8135 -2.526436,-1.2341 -0.633878,-0.3745 -0.837505,-0.5412 -0.837505,-0.5412 0.0026,-1.4914 0,-4.5063 0,-4.5063 -0.2117,0.1278 0.476247,0.4972 2.190785,0.9028 1.581227,0.374 3.371549,0.5938 3.371549,0.5938 0.975183,-1.862 2.159371,-3.9819 3.79907,-6.7546 1.450755,-2.4532 2.56483,-4.2616 2.56483,-4.2616 -3.56501,0.011 -7.461009,0.4166 -10.105569,1.2065 -1.1597,0.3464 -1.656144,0.6493 -1.811829,0.8474 -0.145943,0.1856 -0.0088,0.2837 -0.0088,0.2837 -0.0017,-1.5044 0,-4.5344 0,-4.5344 0.639628,-0.7605 3.620193,-2.7002 8.129981,-3.4813 4.165488,-0.72139 7.365274,-0.036 7.365274,-0.036 0.876705,-1.33905 1.514339,-2.27537 2.125324,-2.9121 0.515133,-0.53684 1.089144,-0.94959 1.089144,-0.94959 0.97513,0.20301 2.87523,1.31454 2.87523,1.31454 -0.46478,0.83159 -0.732159,1.39304 -1.104455,2.27575 -0.318913,0.7562 -0.636729,1.5045 -0.636729,1.5045 1.09674,0.4606 2.081622,0.9975 2.843828,1.5483 0.680487,0.4917 0.84771,0.7361 0.84771,0.7361 0.0021,1.5234 0,4.5344 0,4.5344 0.284456,-0.287 -0.428887,-0.8116 -2.312399,-1.3182 -1.739347,-0.4679 -3.733945,-0.6962 -3.733945,-0.6962 -0.976221,1.8478 -2.25596,4.093 -3.870015,6.8271 -1.452997,2.4612 -2.541127,4.2589 -2.541127,4.2589 3.789244,0.072 7.709785,-0.2893 10.515548,-1.0083 1.196724,-0.3067 1.730342,-0.5652 1.900306,-0.7033 0.160696,-0.1306 0.04163,-0.178 0.04163,-0.178 -1e-6,1.5021 -1e-6,3.0042 -1e-6,4.5063 z"
+       inkscape:path-effect="#path-effect4523"
+       inkscape:original-d="M 36.231693,1021.1237 H 19.841244 l -4.383135,7.5316 -2.932378,-1.8212 3.333652,-5.7104 h -5.370882 v -4.9387 h 8.241525 l 4.599204,-7.8712 H 10.488501 v -4.9695 h 15.74224 l 4.722673,-8.08728 2.932378,1.82116 -3.67319,6.26612 h 6.019091 v 4.9695 H 27.31109 l -4.568335,7.8712 h 13.488938 z" />
+  </g>
+  <g
+     inkscape:label="magnifier"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(5.3096061,-981.4089)">
+    <g
+       id="g861"
+       style="filter:url(#filter873)">
+      <path
+         style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:url(#linearGradient5704);fill-opacity:1;fill-rule:nonzero;stroke:#646464;stroke-width:0.2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+         d="m 23.841518,990.9562 c -11.890034,0 -21.5722658,9.6822 -21.5722658,21.5722 0,11.8901 9.6822318,21.5703 21.5722658,21.5703 11.890034,0 21.572266,-9.6802 21.572266,-21.5703 0,-11.89 -9.682232,-21.5722 -21.572266,-21.5722 z m 0,4 c 9.728274,0 17.572266,7.844 17.572266,17.5722 0,9.7283 -7.843992,17.5703 -17.572266,17.5703 -9.728274,0 -17.5722658,-7.842 -17.5722658,-17.5703 0,-9.7282 7.8439918,-17.5722 17.5722658,-17.5722 z"
+         id="use4577"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:nodetypes="cczcczc"
+         inkscape:connector-curvature="0"
+         id="rect4159-1"
+         d="m 44.811167,1034.9939 -6.719567,-6.8007 c 0,0 0.615948,-0.6695 1.191872,-1.2367 0.575924,-0.5672 1.168103,-1.161 1.168103,-1.161 l 6.750817,6.8085 c 0,0 -0.878939,0.1633 -1.532415,0.8384 -0.653474,0.675 -0.85881,1.5515 -0.85881,1.5515 z"
+         style="fill:url(#linearGradient4550-3);fill-opacity:1;stroke:none;stroke-width:1.89298868;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         sodipodi:nodetypes="cczcczc"
+         inkscape:connector-curvature="0"
+         id="rect4159"
+         d="m 57.701459,1050.4067 -19.613575,-19.6033 c 0,0 0.80187,-1.9686 2.018832,-3.1671 1.216963,-1.1986 3.033973,-1.8831 3.033973,-1.8831 l 19.613575,19.6034 c 0,0 -1.857252,0.3451 -3.238088,1.7715 -1.380829,1.4265 -1.814717,3.2786 -1.814717,3.2786 z"
+         style="fill:url(#linearGradient4550);fill-opacity:1;stroke:none;stroke-width:4.00000048;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4157"
+         d="m 23.359375,990.38477 c -11.890034,0 -21.5722656,9.68223 -21.5722656,21.57223 0,11.8901 9.6822316,21.5703 21.5722656,21.5703 11.890034,0 21.572266,-9.6802 21.572266,-21.5703 0,-11.89 -9.682232,-21.57223 -21.572266,-21.57223 z m 0,4 c 9.728274,0 17.572266,7.84403 17.572266,17.57223 0,9.7283 -7.843992,17.5703 -17.572266,17.5703 -9.728274,0 -17.5722656,-7.842 -17.5722656,-17.5703 0,-9.7282 7.8439916,-17.57223 17.5722656,-17.57223 z"
+         style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:url(#linearGradient4827);fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient5693);stroke-width:0.2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+      <path
+         sodipodi:nodetypes="zzzzz"
+         inkscape:connector-curvature="0"
+         id="rect4159-9"
+         d="m 57.740698,1050.3705 c -0.109874,-0.1548 0.384617,-1.9386 1.862009,-3.3501 1.477392,-1.4116 2.965116,-1.7759 3.112671,-1.6296 0.147555,0.1463 -0.223945,1.7452 -1.604781,3.1716 -1.380829,1.4265 -3.260025,1.9629 -3.369899,1.8081 z"
+         style="fill:url(#radialGradient4907);fill-opacity:1;stroke:#a12929;stroke-width:0.1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    </g>
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="glint"
+     style="display:inline"
+     transform="translate(5.3096061,6.9533016)">
+    <path
+       style="fill:#d6d3ff;fill-opacity:0.79640718;stroke:none;stroke-width:0.24569809;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 11.639974,15.142361 c 2.750385,-4.654185 7.02082,-6.7892404 12.679558,-5.9576506 l 0.626727,1.0131236 c -5.152828,1.359853 -9.056922,2.478295 -12.679543,6.011839 z"
+       id="rect5697"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <use
+       x="0"
+       y="0"
+       xlink:href="#rect5697"
+       id="use5700"
+       transform="matrix(-0.73611824,0,0,-0.73611824,42.5275,46.617539)"
+       width="100%"
+       height="100%" />
+  </g>
+</svg>
diff --git a/images/make-png-icon b/images/make-png-icon
new file mode 100755
index 0000000000000000000000000000000000000000..6ea6dd26ada944292dd6efae0cfb4ded0c0923d5
--- /dev/null
+++ b/images/make-png-icon
@@ -0,0 +1,42 @@
+#! /bin/sh
+
+INKSCAPE="inkscape"
+PNGCRUSH="pngcrush"
+PNGCRUSH_ARGS="-q"
+SVG_INPUT="glance-icon.svg"
+PNG_OUTPUT="glance-icon.png"
+DPI="162" # works out to a 128x128 px PNG
+OUTDIR="../pyglance/glance/"
+
+command_unavailable() {
+	command -v "$1" > /dev/null
+	if [ $? = 0 ] ; then
+		return 1
+	fi
+	return 0
+}
+
+if command_unavailable "$INKSCAPE" ; then
+	echo "FATAL ERROR: \"$INKSCAPE\" is unavailable."
+	exit 1
+fi
+$INKSCAPE "$SVG_INPUT" --export-png="$PNG_OUTPUT" --without-gui --export-dpi="$DPI" | egrep -v '^(DPI|Background RRGGBBAA|Bitmap saved as): '
+if [ ! $? ]; then
+	echo "FATAL ERROR: \"$INKSCAPE\" failed."
+	exit 1
+fi
+
+if command_unavailable "$PNGCRUSH" ; then
+	echo "Notice: \"$PNGCRUSH\" is not available; the resulting icon will be a bit (~15%) larger than necessary"
+else
+	mv "$PNG_OUTPUT" "$PNG_OUTPUT.tmp"
+	"$PNGCRUSH" "$PNGCRUSH_ARGS" "$PNG_OUTPUT.tmp" "$PNG_OUTPUT" 
+	if [ ! $? ]; then
+		echo "Notice: \"$PNGCRUSH\" failed. The resulting icon will be a bit (~15%) larger than necessary"
+		cp "$PNG_OUTPUT.tmp" "$PNG_OUTPUT"
+	fi
+	rm "$PNG_OUTPUT.tmp"
+fi
+
+cp "$PNG_OUTPUT" "$OUTDIR"
+
diff --git a/pyglance/glance/glance-icon.png b/pyglance/glance/glance-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..adbd1f41eb59db6fcd889094be0de73bf690b2b9
Binary files /dev/null and b/pyglance/glance/glance-icon.png differ
diff --git a/pyglance/glance/gui_controller.py b/pyglance/glance/gui_controller.py
index ae6fc7d57681f2311f144a9520a5e71028dc749e..660fa1c5ca234f693de46d4151a8761686e9a97c 100644
--- a/pyglance/glance/gui_controller.py
+++ b/pyglance/glance/gui_controller.py
@@ -50,6 +50,11 @@ class GlanceGUIController (object) :
         self.model = gui_model.GlanceGUIModel()
         self.stats = gui_stats.GlanceGUIStats(self.model)
         self.figs  = gui_figs.GlanceGUIFigures(self.model)
+
+        # how about an icon?
+        from pkg_resources import resource_filename;
+        from PyQt5.QtGui import QIcon
+        self.qtApp.setWindowIcon(QIcon(resource_filename(__name__, "glance-icon.png")))
         
         # set things up to talk to each other
         self.model.registerErrorHandler(self)
diff --git a/pyglance/glance/gui_view.py b/pyglance/glance/gui_view.py
index 786821ca59ece4b388ba0513d6e299e7b90acae0..f765c69be46b57b7ba6441759c5d4cc0de9d4f99 100644
--- a/pyglance/glance/gui_view.py
+++ b/pyglance/glance/gui_view.py
@@ -14,7 +14,7 @@ from PyQt5.QtWidgets import QWidget, QTabWidget, QGridLayout, QLabel, QLineEdit,
                             QComboBox, QPushButton, QSizePolicy, QHeaderView, \
                             QCheckBox, QTableWidget, QFileDialog, QMessageBox, \
                             QTextEdit, QTableView
-from PyQt5.QtGui     import QIcon, QDoubleValidator, QValidator
+from PyQt5.QtGui     import QDoubleValidator, QValidator
 from PyQt5.QtCore    import QAbstractTableModel, Qt
 
 from functools import partial
@@ -110,10 +110,6 @@ class GlanceGUIView (QWidget) :
         # set our title with the version string
         self.setWindowTitle(versionString)
         
-        # to make Dave happy, give it an icon
-        from pkg_resources import resource_filename
-        self.setWindowIcon(QIcon(resource_filename(__name__, "pass.gif")))
-        
         # a place to hang onto our file specific widgets
         self.widgetInfo = { }
         
diff --git a/pyglance/glance/io.py b/pyglance/glance/io.py
index 2b8e67c5bd16bc6ab1bbd8502515a9c19c948460..f49d6ee16383b776a6c7c976e0f552bc91fb3c17 100644
--- a/pyglance/glance/io.py
+++ b/pyglance/glance/io.py
@@ -395,6 +395,19 @@ class nc (object):
     """
     
     _nc = None
+    _var_map = None
+
+    # walk down through all groups and get variable names and objects
+    def _walkgroups(self, start_at, prefix=None, ):
+        here_vars = start_at.variables.keys()
+        for var_name in here_vars:
+            temp_name = var_name if prefix is None or len(prefix) <= 0 else prefix + "/" + var_name
+            yield temp_name, start_at[var_name]
+        here_groups = start_at.groups.keys()
+        for group_name in here_groups:
+            grp_str = group_name if prefix is None or len(prefix) <= 0 else prefix + "/" + group_name
+            for more_var_name, more_var_obj in self._walkgroups(start_at.groups[group_name], prefix=grp_str):
+                yield more_var_name, more_var_obj
     
     def __init__(self, filename, allowWrite=False):
         
@@ -408,19 +421,25 @@ class nc (object):
         
         self._nc = netCDF4.Dataset(filename, mode)
         self.attributeCache = CaseInsensitiveAttributeCache(self)
+        self._var_map = { }
+        for var_name, var_obj in self._walkgroups(self._nc,) :
+            self._var_map[var_name] = var_obj
 
     def __call__(self):
-        "yield names of variables to be compared"
-        return self._nc.variables.keys()
-    
-    # this returns a numpy array with a copy of the full, scaled
-    # data for this variable, if the data type must be changed to allow
-    # for scaling it will be (so the return type may not reflect the
-    # type found in the original file)
+        """
+        yield names of variables in this file
+        """
+
+        return self._var_map.keys()
+
     def __getitem__(self, name):
-        
-        #print ("*** opening variable: " + name)
-        
+        """
+        this returns a numpy array with a copy of the full, scaled
+        data for this variable, if the data type must be changed to allow
+        for scaling it will be (so the return type may not reflect the
+        type found in the original file)
+        """
+
         # defaults
         data_type = np.float32 # TODO temporary this avoids type truncation issues, but is not a general solution
         
@@ -505,10 +524,11 @@ class nc (object):
     def close (self) :
         self._nc.close()
         self._nc = None
+        self._var_map = None
 
     def get_variable_object(self, name):
 
-        return self._nc.variables[name]
+        return self._var_map[name]
     
     def missing_value(self, name):
         
@@ -532,7 +552,8 @@ class nc (object):
         the created variable will be returned, or None if a variable could not
         be created
         """
-        
+
+        # TODO, this will not work with groups
         self._nc.nc_redef()
         
         # if the variable already exists, stop with a warning
@@ -596,6 +617,8 @@ class nc (object):
         if the attribute exists for the given variable, set it to the new value
         if the attribute does not exist for the given variable, create it and set it to the new value
         """
+        # TODO, this will not work with groups
+
         variableObject = self.get_variable_object(variableName)
         
         self._nc.nc_redef()