From 17e147e12210a7153d75eaf2ec003909c4a8e603 Mon Sep 17 00:00:00 2001
From: tch <mabente@paraguayeduca.org>
Date: Thu, 17 Dec 2009 10:45:15 -0300
Subject: [PATCH] gsm connection support, control panel section and device icon

---
 data/icons/module-modemconfiguration.svg           | 1272 ++++++++++++++++++++
 .../cpsection/modemconfiguration/__init__.py       |   22 +
 extensions/cpsection/modemconfiguration/model.py   |   43 +
 extensions/cpsection/modemconfiguration/view.py    |  142 +++
 extensions/deviceicon/network.py                   |  170 +++-
 src/jarabe/desktop/meshbox.py                      |   10 +-
 src/jarabe/model/network.py                        |  189 +++-
 7 files changed, 1825 insertions(+), 23 deletions(-)
 create mode 100644 data/icons/module-modemconfiguration.svg
 create mode 100644 extensions/cpsection/modemconfiguration/__init__.py
 create mode 100644 extensions/cpsection/modemconfiguration/model.py
 create mode 100644 extensions/cpsection/modemconfiguration/view.py

diff --git a/data/icons/module-modemconfiguration.svg b/data/icons/module-modemconfiguration.svg
new file mode 100644
index 0000000..b62a12e
--- /dev/null
+++ b/data/icons/module-modemconfiguration.svg
@@ -0,0 +1,1272 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
+"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
+<!-- Created with Sodipodi ("http://www.sodipodi.com/") -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://web.resource.org/cc/"
+   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"
+   sodipodi:docname="/home/latu/Desktop/Desarrollo/Cliente3G/Conexion3G.activity/activity/activity-Conexion3G.svg"
+   sodipodi:docbase="/home/latu/Desktop/Desarrollo/Cliente3G/Conexion3G.activity/activity/"
+   inkscape:version="0.43+devel"
+   sodipodi:version="0.34"
+   id="svg1288"
+   height="48px"
+   width="48px">
+  <defs
+     id="defs3">
+    <linearGradient
+       id="linearGradient6457"
+       inkscape:collect="always">
+      <stop
+         id="stop6459"
+         offset="0"
+         style="stop-color: rgb(255, 255, 255); stop-opacity: 1;" />
+      <stop
+         id="stop6461"
+         offset="1"
+         style="stop-color: rgb(255, 255, 255); stop-opacity: 0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient6444">
+      <stop
+         id="stop6446"
+         offset="0.0000000"
+         style="stop-color: rgb(184, 207, 231); stop-opacity: 1;" />
+      <stop
+         id="stop6448"
+         offset="1.0000000"
+         style="stop-color: rgb(114, 159, 207); stop-opacity: 1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient6187"
+       inkscape:collect="always">
+      <stop
+         id="stop6189"
+         offset="0"
+         style="stop-color: rgb(94, 94, 94); stop-opacity: 1;" />
+      <stop
+         id="stop6191"
+         offset="1"
+         style="stop-color: rgb(94, 94, 94); stop-opacity: 0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient6171"
+       inkscape:collect="always">
+      <stop
+         id="stop6173"
+         offset="0"
+         style="stop-color: rgb(255, 255, 255); stop-opacity: 1;" />
+      <stop
+         id="stop6175"
+         offset="1"
+         style="stop-color: rgb(255, 255, 255); stop-opacity: 0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient6151">
+      <stop
+         id="stop6153"
+         offset="0.0000000"
+         style="stop-color: rgb(224, 226, 226); stop-opacity: 1;" />
+      <stop
+         id="stop6155"
+         offset="1.0000000"
+         style="stop-color: rgb(191, 194, 194); stop-opacity: 1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient158">
+      <stop
+         style="stop-color: rgb(104, 104, 104); stop-opacity: 0;"
+         offset="0.0000000"
+         id="stop159" />
+      <stop
+         style="stop-color: rgb(104, 104, 104); stop-opacity: 1;"
+         offset="0.23762377"
+         id="stop162" />
+      <stop
+         style="stop-color: rgb(104, 104, 104); stop-opacity: 1;"
+         offset="0.78109992"
+         id="stop163" />
+      <stop
+         style="stop-color: rgb(104, 104, 104); stop-opacity: 0;"
+         offset="1.0000000"
+         id="stop160" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient272">
+      <stop
+         style="stop-color: rgb(71, 71, 71); stop-opacity: 0;"
+         offset="0.0000000"
+         id="stop273" />
+      <stop
+         style="stop-color: rgb(71, 71, 71); stop-opacity: 1;"
+         offset="0.10000000"
+         id="stop275" />
+      <stop
+         style="stop-color: rgb(71, 71, 71); stop-opacity: 1;"
+         offset="0.89999998"
+         id="stop276" />
+      <stop
+         style="stop-color: rgb(71, 71, 71); stop-opacity: 0;"
+         offset="1.0000000"
+         id="stop274" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient178">
+      <stop
+         style="stop-color: rgb(255, 255, 255); stop-opacity: 0;"
+         offset="0.0000000"
+         id="stop179" />
+      <stop
+         style="stop-color: rgb(255, 255, 255); stop-opacity: 0.706587;"
+         offset="0.10827128"
+         id="stop180" />
+      <stop
+         style="stop-color: rgb(255, 255, 255); stop-opacity: 0.706587;"
+         offset="0.92053902"
+         id="stop181" />
+      <stop
+         style="stop-color: rgb(255, 255, 255); stop-opacity: 0;"
+         offset="1.0000000"
+         id="stop182" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4543"
+       inkscape:collect="always">
+      <stop
+         id="stop4545"
+         offset="0"
+         style="stop-color: rgb(0, 0, 0); stop-opacity: 1;" />
+      <stop
+         id="stop4547"
+         offset="1"
+         style="stop-color: rgb(0, 0, 0); stop-opacity: 0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4509">
+      <stop
+         style="stop-color: rgb(0, 0, 0); stop-opacity: 1;"
+         offset="0.0000000"
+         id="stop4511" />
+      <stop
+         style="stop-color: rgb(0, 0, 0); stop-opacity: 0;"
+         offset="1.0000000"
+         id="stop4513" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4449"
+       inkscape:collect="always">
+      <stop
+         id="stop4451"
+         offset="0"
+         style="stop-color: rgb(255, 255, 255); stop-opacity: 1;" />
+      <stop
+         id="stop4453"
+         offset="1"
+         style="stop-color: rgb(255, 255, 255); stop-opacity: 0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4420"
+       inkscape:collect="always">
+      <stop
+         id="stop4422"
+         offset="0"
+         style="stop-color: rgb(255, 255, 255); stop-opacity: 1;" />
+      <stop
+         id="stop4424"
+         offset="1"
+         style="stop-color: rgb(255, 255, 255); stop-opacity: 0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4412"
+       inkscape:collect="always">
+      <stop
+         id="stop4414"
+         offset="0"
+         style="stop-color: rgb(255, 255, 255); stop-opacity: 1;" />
+      <stop
+         id="stop4416"
+         offset="1"
+         style="stop-color: rgb(255, 255, 255); stop-opacity: 0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4400">
+      <stop
+         id="stop4402"
+         offset="0"
+         style="stop-color: rgb(151, 151, 151); stop-opacity: 1;" />
+      <stop
+         id="stop4404"
+         offset="1.0000000"
+         style="stop-color: rgb(200, 200, 200); stop-opacity: 1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4386">
+      <stop
+         id="stop4388"
+         offset="0.0000000"
+         style="stop-color: rgb(210, 210, 210); stop-opacity: 1;" />
+      <stop
+         id="stop4390"
+         offset="1.0000000"
+         style="stop-color: rgb(223, 223, 223); stop-opacity: 1;" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="matrix(0.704136, 0, 0, 0.704136, -7.02064, 9.45973)"
+       gradientUnits="userSpaceOnUse"
+       y2="10.018264"
+       x2="23.233509"
+       y1="34.463955"
+       x1="24.349752"
+       id="linearGradient4392"
+       xlink:href="#linearGradient4386"
+       inkscape:collect="always" />
+    <linearGradient
+       gradientTransform="matrix(0.658413, 0, 0, 0.688766, -6.06109, 9.52172)"
+       gradientUnits="userSpaceOnUse"
+       y2="26.786800"
+       x2="22.311644"
+       y1="26.887815"
+       x1="27.324621"
+       id="linearGradient4418"
+       xlink:href="#linearGradient4412"
+       inkscape:collect="always" />
+    <linearGradient
+       gradientTransform="matrix(0.658413, 0, 0, 0.688766, -6.06109, 9.52172)"
+       gradientUnits="userSpaceOnUse"
+       y2="26.786800"
+       x2="22.311644"
+       y1="26.887815"
+       x1="27.324621"
+       id="linearGradient4426"
+       xlink:href="#linearGradient4420"
+       inkscape:collect="always" />
+    <linearGradient
+       gradientTransform="matrix(0.688766, 0, 0, 0.688766, -4.79569, 9.52172)"
+       y2="30.928421"
+       x2="16.364470"
+       y1="39.918777"
+       x1="16.364470"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient4459"
+       xlink:href="#linearGradient4449"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="30.928421"
+       x2="16.364470"
+       y1="39.918777"
+       x1="16.364470"
+       gradientTransform="matrix(0.688766, 0, 0, 0.688766, -3.41816, 9.52172)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient4463"
+       xlink:href="#linearGradient4449"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="30.928421"
+       x2="16.364470"
+       y1="39.918777"
+       x1="16.364470"
+       gradientTransform="matrix(0.688766, 0, 0, 0.688766, -2.04063, 9.52172)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient4467"
+       xlink:href="#linearGradient4449"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="30.928421"
+       x2="16.364470"
+       y1="39.918777"
+       x1="16.364470"
+       gradientTransform="matrix(0.688766, 0, 0, 0.688766, -0.6631, 9.52172)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient4471"
+       xlink:href="#linearGradient4449"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="30.928421"
+       x2="16.364470"
+       y1="39.918777"
+       x1="16.364470"
+       gradientTransform="matrix(0.688766, 0, 0, 0.688766, 0.714451, 9.52172)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient4475"
+       xlink:href="#linearGradient4449"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="30.928421"
+       x2="16.364470"
+       y1="39.918777"
+       x1="16.364470"
+       gradientTransform="matrix(0.688766, 0, 0, 0.688766, 2.09199, 9.52172)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient4479"
+       xlink:href="#linearGradient4449"
+       inkscape:collect="always" />
+    <linearGradient
+       gradientTransform="matrix(0.688766, 0, 0, 0.688766, -5.54704, 9.52172)"
+       y2="30.928421"
+       x2="16.364470"
+       y1="39.918777"
+       x1="16.364470"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient4495"
+       xlink:href="#linearGradient4509"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="30.928421"
+       x2="16.364470"
+       y1="39.918777"
+       x1="16.364470"
+       gradientTransform="matrix(0.688766, 0, 0, 0.688766, -4.16951, 9.52172)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient4497"
+       xlink:href="#linearGradient4509"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="30.928421"
+       x2="16.364470"
+       y1="39.918777"
+       x1="16.364470"
+       gradientTransform="matrix(0.688766, 0, 0, 0.688766, -2.79198, 9.52172)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient4499"
+       xlink:href="#linearGradient4509"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="30.928421"
+       x2="16.364470"
+       y1="39.918777"
+       x1="16.364470"
+       gradientTransform="matrix(0.688766, 0, 0, 0.688766, -1.41445, 9.52172)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient4501"
+       xlink:href="#linearGradient4509"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="30.928421"
+       x2="16.364470"
+       y1="39.918777"
+       x1="16.364470"
+       gradientTransform="matrix(0.688766, 0, 0, 0.688766, -0.0369197, 9.52172)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient4503"
+       xlink:href="#linearGradient4509"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="30.928421"
+       x2="16.364470"
+       y1="39.918777"
+       x1="16.364470"
+       gradientTransform="matrix(0.688766, 0, 0, 0.688766, 1.34067, 9.52172)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient4505"
+       xlink:href="#linearGradient4509"
+       inkscape:collect="always" />
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1, 0, 0, 0.394366, 1.02097e-14, 23.442)"
+       r="14.344166"
+       fy="38.706596"
+       fx="23.536554"
+       cy="38.706596"
+       cx="23.536554"
+       id="radialGradient4549"
+       xlink:href="#linearGradient4543"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="117.82710"
+       x2="15.343062"
+       y1="117.82710"
+       x1="1.6422368"
+       gradientTransform="matrix(2.74016, 0, 0, 0.364942, 31.378, -10.3527)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient5397"
+       xlink:href="#linearGradient158"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="372.57819"
+       x2="5.0856376"
+       y1="372.57819"
+       x1="0.61210024"
+       gradientTransform="matrix(8.1686, 0, 0, 0.22121, 31.378, -48.2741)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient5399"
+       xlink:href="#linearGradient272"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="372.57819"
+       x2="5.0856376"
+       y1="372.57819"
+       x1="0.61210024"
+       gradientTransform="matrix(8.1686, 0, 0, 0.228621, 31.378, -46.2669)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient5401"
+       xlink:href="#linearGradient272"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="117.82710"
+       x2="15.343062"
+       y1="117.82710"
+       x1="1.6422368"
+       gradientTransform="matrix(2.74016, 0, 0, 0.147685, 31.378, 14.8331)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient5403"
+       xlink:href="#linearGradient178"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="31.565634"
+       x2="37.140110"
+       y1="10.655476"
+       x1="25.515011"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6210"
+       xlink:href="#linearGradient6171"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="28.554563"
+       x2="38.547222"
+       y1="28.554563"
+       x1="32.587322"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6212"
+       xlink:href="#linearGradient6187"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="31.565634"
+       x2="37.140110"
+       y1="10.655476"
+       x1="25.515011"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6240"
+       xlink:href="#linearGradient6171"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="28.554563"
+       x2="38.547222"
+       y1="28.554563"
+       x1="32.587322"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6242"
+       xlink:href="#linearGradient6187"
+       inkscape:collect="always" />
+    <radialGradient
+       r="14.344166"
+       fy="38.706596"
+       fx="23.536554"
+       cy="38.706596"
+       cx="23.536554"
+       gradientTransform="matrix(1, 0, 0, 0.394366, -7.98147e-15, 23.442)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient6246"
+       xlink:href="#linearGradient4543"
+       inkscape:collect="always" />
+    <radialGradient
+       r="14.344166"
+       fy="38.706596"
+       fx="23.536554"
+       cy="38.706596"
+       cx="23.536554"
+       gradientTransform="matrix(1, 0, 0, 0.394366, 5.34295e-16, 23.442)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient6250"
+       xlink:href="#linearGradient4543"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="117.82710"
+       x2="15.343062"
+       y1="117.82710"
+       x1="1.6422368"
+       gradientTransform="matrix(2.74016, -3.34247e-32, -7.06832e-33, 0.364942, 31.378, -10.3527)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6262"
+       xlink:href="#linearGradient158"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="372.57819"
+       x2="5.0856376"
+       y1="372.57819"
+       x1="0.61210024"
+       gradientTransform="matrix(8.1686, -9.9641e-32, -4.28449e-33, 0.22121, 31.378, -48.2741)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6264"
+       xlink:href="#linearGradient272"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="372.57819"
+       x2="5.0856376"
+       y1="372.57819"
+       x1="0.61210024"
+       gradientTransform="matrix(8.1686, -9.9641e-32, -4.42803e-33, 0.228621, 31.378, -46.2669)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6266"
+       xlink:href="#linearGradient272"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="117.82710"
+       x2="15.343062"
+       y1="117.82710"
+       x1="1.6422368"
+       gradientTransform="matrix(2.74016, -3.34247e-32, -2.86043e-33, 0.147685, 31.378, 14.8331)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6268"
+       xlink:href="#linearGradient178"
+       inkscape:collect="always" />
+    <linearGradient
+       gradientTransform="matrix(0.953806, 0, 0, 1, 1.83218, -4.57479e-16)"
+       gradientUnits="userSpaceOnUse"
+       y2="26.435217"
+       x2="38.278458"
+       y1="19.061104"
+       x1="36.067482"
+       id="linearGradient6463"
+       xlink:href="#linearGradient6457"
+       inkscape:collect="always" />
+    <linearGradient
+       gradientTransform="matrix(0.969204, 0, 0, 1, -5.81595, -9.8995)"
+       y2="26.435217"
+       x2="38.278458"
+       y1="19.061104"
+       x1="36.067482"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6467"
+       xlink:href="#linearGradient6457"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4386"
+       id="linearGradient4059"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.704136, 0, 0, 0.704136, -7.02064, 9.45973)"
+       x1="24.349752"
+       y1="34.463955"
+       x2="23.233509"
+       y2="10.018264" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4420"
+       id="linearGradient4061"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.658413, 0, 0, 0.688766, -6.06109, 9.52172)"
+       x1="27.324621"
+       y1="26.887815"
+       x2="22.311644"
+       y2="26.786800" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4412"
+       id="linearGradient4063"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.658413, 0, 0, 0.688766, -6.06109, 9.52172)"
+       x1="27.324621"
+       y1="26.887815"
+       x2="22.311644"
+       y2="26.786800" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4449"
+       id="linearGradient4065"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.688766, 0, 0, 0.688766, -4.79569, 9.52172)"
+       x1="16.364470"
+       y1="39.918777"
+       x2="16.364470"
+       y2="30.928421" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4449"
+       id="linearGradient4067"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.688766, 0, 0, 0.688766, -3.41816, 9.52172)"
+       x1="16.364470"
+       y1="39.918777"
+       x2="16.364470"
+       y2="30.928421" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4449"
+       id="linearGradient4069"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.688766, 0, 0, 0.688766, -2.04063, 9.52172)"
+       x1="16.364470"
+       y1="39.918777"
+       x2="16.364470"
+       y2="30.928421" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4449"
+       id="linearGradient4071"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.688766, 0, 0, 0.688766, -0.6631, 9.52172)"
+       x1="16.364470"
+       y1="39.918777"
+       x2="16.364470"
+       y2="30.928421" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4449"
+       id="linearGradient4073"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.688766, 0, 0, 0.688766, 0.714451, 9.52172)"
+       x1="16.364470"
+       y1="39.918777"
+       x2="16.364470"
+       y2="30.928421" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4449"
+       id="linearGradient4075"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.688766, 0, 0, 0.688766, 2.09199, 9.52172)"
+       x1="16.364470"
+       y1="39.918777"
+       x2="16.364470"
+       y2="30.928421" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4509"
+       id="linearGradient4077"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.688766, 0, 0, 0.688766, -5.54704, 9.52172)"
+       x1="16.364470"
+       y1="39.918777"
+       x2="16.364470"
+       y2="30.928421" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4509"
+       id="linearGradient4079"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.688766, 0, 0, 0.688766, -4.16951, 9.52172)"
+       x1="16.364470"
+       y1="39.918777"
+       x2="16.364470"
+       y2="30.928421" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4509"
+       id="linearGradient4081"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.688766, 0, 0, 0.688766, -2.79198, 9.52172)"
+       x1="16.364470"
+       y1="39.918777"
+       x2="16.364470"
+       y2="30.928421" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4509"
+       id="linearGradient4083"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.688766, 0, 0, 0.688766, -1.41445, 9.52172)"
+       x1="16.364470"
+       y1="39.918777"
+       x2="16.364470"
+       y2="30.928421" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4509"
+       id="linearGradient4085"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.688766, 0, 0, 0.688766, -0.0369197, 9.52172)"
+       x1="16.364470"
+       y1="39.918777"
+       x2="16.364470"
+       y2="30.928421" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4509"
+       id="linearGradient4087"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.688766, 0, 0, 0.688766, 1.34067, 9.52172)"
+       x1="16.364470"
+       y1="39.918777"
+       x2="16.364470"
+       y2="30.928421" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4509"
+       id="linearGradient4127"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.688766, 0, 0, 0.688766, 1.34067, 9.52172)"
+       x1="16.364470"
+       y1="39.918777"
+       x2="16.364470"
+       y2="30.928421" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4509"
+       id="linearGradient4129"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.688766, 0, 0, 0.688766, -0.0369197, 9.52172)"
+       x1="16.364470"
+       y1="39.918777"
+       x2="16.364470"
+       y2="30.928421" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4509"
+       id="linearGradient4131"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.688766, 0, 0, 0.688766, -1.41445, 9.52172)"
+       x1="16.364470"
+       y1="39.918777"
+       x2="16.364470"
+       y2="30.928421" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4509"
+       id="linearGradient4133"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.688766, 0, 0, 0.688766, -2.79198, 9.52172)"
+       x1="16.364470"
+       y1="39.918777"
+       x2="16.364470"
+       y2="30.928421" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4509"
+       id="linearGradient4135"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.688766, 0, 0, 0.688766, -4.16951, 9.52172)"
+       x1="16.364470"
+       y1="39.918777"
+       x2="16.364470"
+       y2="30.928421" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4509"
+       id="linearGradient4137"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.688766, 0, 0, 0.688766, -5.54704, 9.52172)"
+       x1="16.364470"
+       y1="39.918777"
+       x2="16.364470"
+       y2="30.928421" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4449"
+       id="linearGradient4139"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.688766, 0, 0, 0.688766, 2.09199, 9.52172)"
+       x1="16.364470"
+       y1="39.918777"
+       x2="16.364470"
+       y2="30.928421" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4449"
+       id="linearGradient4141"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.688766, 0, 0, 0.688766, 0.714451, 9.52172)"
+       x1="16.364470"
+       y1="39.918777"
+       x2="16.364470"
+       y2="30.928421" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4449"
+       id="linearGradient4143"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.688766, 0, 0, 0.688766, -0.6631, 9.52172)"
+       x1="16.364470"
+       y1="39.918777"
+       x2="16.364470"
+       y2="30.928421" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4449"
+       id="linearGradient4145"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.688766, 0, 0, 0.688766, -2.04063, 9.52172)"
+       x1="16.364470"
+       y1="39.918777"
+       x2="16.364470"
+       y2="30.928421" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4449"
+       id="linearGradient4147"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.688766, 0, 0, 0.688766, -3.41816, 9.52172)"
+       x1="16.364470"
+       y1="39.918777"
+       x2="16.364470"
+       y2="30.928421" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4449"
+       id="linearGradient4149"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.688766, 0, 0, 0.688766, -4.79569, 9.52172)"
+       x1="16.364470"
+       y1="39.918777"
+       x2="16.364470"
+       y2="30.928421" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4420"
+       id="linearGradient4151"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.658413, 0, 0, 0.688766, -6.06109, 9.52172)"
+       x1="27.324621"
+       y1="26.887815"
+       x2="22.311644"
+       y2="26.786800" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4412"
+       id="linearGradient4153"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.658413, 0, 0, 0.688766, -6.06109, 9.52172)"
+       x1="27.324621"
+       y1="26.887815"
+       x2="22.311644"
+       y2="26.786800" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4386"
+       id="linearGradient4155"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.704136, 0, 0, 0.704136, -7.02064, 9.45973)"
+       x1="24.349752"
+       y1="34.463955"
+       x2="23.233509"
+       y2="10.018264" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6171"
+       id="linearGradient4192"
+       gradientUnits="userSpaceOnUse"
+       x1="25.515011"
+       y1="10.655476"
+       x2="37.140110"
+       y2="31.565634" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6187"
+       id="linearGradient4194"
+       gradientUnits="userSpaceOnUse"
+       x1="32.587322"
+       y1="28.554563"
+       x2="38.547222"
+       y2="28.554563" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6171"
+       id="linearGradient4210"
+       gradientUnits="userSpaceOnUse"
+       x1="25.515011"
+       y1="10.655476"
+       x2="37.140110"
+       y2="31.565634" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6187"
+       id="linearGradient4212"
+       gradientUnits="userSpaceOnUse"
+       x1="32.587322"
+       y1="28.554563"
+       x2="38.547222"
+       y2="28.554563" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6457"
+       id="linearGradient4214"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.953806, 0, 0, 1, 1.83218, -4.56286e-16)"
+       x1="36.067482"
+       y1="19.061104"
+       x2="38.278458"
+       y2="26.435217" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6187"
+       id="linearGradient4228"
+       gradientUnits="userSpaceOnUse"
+       x1="32.587322"
+       y1="28.554563"
+       x2="38.547222"
+       y2="28.554563" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4543"
+       id="radialGradient4272"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1, 0, 0, 0.394366, 5.34295e-16, 23.442)"
+       cx="23.536554"
+       cy="38.706596"
+       fx="23.536554"
+       fy="38.706596"
+       r="14.344166" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6171"
+       id="linearGradient4274"
+       gradientUnits="userSpaceOnUse"
+       x1="25.515011"
+       y1="10.655476"
+       x2="37.140110"
+       y2="31.565634" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6187"
+       id="linearGradient4276"
+       gradientUnits="userSpaceOnUse"
+       x1="32.587322"
+       y1="28.554563"
+       x2="38.547222"
+       y2="28.554563" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6457"
+       id="linearGradient4278"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.953806, 0, 0, 1, 1.83218, -4.5569e-16)"
+       x1="36.067482"
+       y1="19.061104"
+       x2="38.278458"
+       y2="26.435217" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4543"
+       id="radialGradient4296"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1, 0, 0, 0.394366, 6.52257e-16, 23.442)"
+       cx="23.536554"
+       cy="38.706596"
+       fx="23.536554"
+       fy="38.706596"
+       r="14.344166" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6171"
+       id="linearGradient4298"
+       gradientUnits="userSpaceOnUse"
+       x1="25.515011"
+       y1="10.655476"
+       x2="37.140110"
+       y2="31.565634" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6187"
+       id="linearGradient4300"
+       gradientUnits="userSpaceOnUse"
+       x1="32.587322"
+       y1="28.554563"
+       x2="38.547222"
+       y2="28.554563" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6457"
+       id="linearGradient4302"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.953806, 0, 0, 1, 1.83218, -8.92136e-16)"
+       x1="36.067482"
+       y1="19.061104"
+       x2="38.278458"
+       y2="26.435217" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4543"
+       id="radialGradient4318"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1, 0, 0, 0.394366, -1.17961e-16, 23.442)"
+       cx="23.536554"
+       cy="38.706596"
+       fx="23.536554"
+       fy="38.706596"
+       r="14.344166" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6171"
+       id="linearGradient4320"
+       gradientUnits="userSpaceOnUse"
+       x1="25.515011"
+       y1="10.655476"
+       x2="37.140110"
+       y2="31.565634" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6187"
+       id="linearGradient4322"
+       gradientUnits="userSpaceOnUse"
+       x1="32.587322"
+       y1="28.554563"
+       x2="38.547222"
+       y2="28.554563" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6457"
+       id="linearGradient4324"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.953806, 0, 0, 1, 1.83218, -1.32799e-15)"
+       x1="36.067482"
+       y1="19.061104"
+       x2="38.278458"
+       y2="26.435217" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4509"
+       id="linearGradient4351"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.688766, 0, 0, 0.688766, -4.16951, 9.52172)"
+       x1="16.364470"
+       y1="39.918777"
+       x2="16.364470"
+       y2="30.928421" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4509"
+       id="linearGradient4355"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.688766, 0, 0, 0.688766, -4.16951, 9.52172)"
+       x1="16.364470"
+       y1="39.918777"
+       x2="16.364470"
+       y2="30.928421" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4449"
+       id="linearGradient4359"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.688766, 0, 0, 0.688766, -4.79569, 9.52172)"
+       x1="16.364470"
+       y1="39.918777"
+       x2="16.364470"
+       y2="30.928421" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4449"
+       id="linearGradient4363"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.688766, 0, 0, 0.688766, -4.79569, 9.52172)"
+       x1="16.364470"
+       y1="39.918777"
+       x2="16.364470"
+       y2="30.928421" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4449"
+       id="linearGradient4367"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.688766, 0, 0, 0.688766, -4.79569, 9.52172)"
+       x1="16.364470"
+       y1="39.918777"
+       x2="16.364470"
+       y2="30.928421" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4509"
+       id="linearGradient4371"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.688766, 0, 0, 0.688766, -4.16951, 9.52172)"
+       x1="16.364470"
+       y1="39.918777"
+       x2="16.364470"
+       y2="30.928421" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4509"
+       id="linearGradient4375"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.688766, 0, 0, 0.688766, -4.16951, 9.52172)"
+       x1="16.364470"
+       y1="39.918777"
+       x2="16.364470"
+       y2="30.928421" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4509"
+       id="linearGradient4379"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.688766, 0, 0, 0.688766, -4.16951, 9.52172)"
+       x1="16.364470"
+       y1="39.918777"
+       x2="16.364470"
+       y2="30.928421" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4509"
+       id="linearGradient4383"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.688766, 0, 0, 0.688766, -5.54704, 9.52172)"
+       x1="16.364470"
+       y1="39.918777"
+       x2="16.364470"
+       y2="30.928421" />
+  </defs>
+  <sodipodi:namedview
+     fill="#204a87"
+     inkscape:showpageshadow="false"
+     showborder="true"
+     inkscape:window-y="51"
+     inkscape:window-x="116"
+     inkscape:window-height="1068"
+     inkscape:window-width="1030"
+     inkscape:document-units="px"
+     inkscape:grid-bbox="true"
+     showgrid="true"
+     inkscape:current-layer="layer1"
+     inkscape:cy="24"
+     inkscape:cx="24"
+     inkscape:zoom="13.988095"
+     inkscape:pageshadow="2"
+     inkscape:pageopacity="0.0"
+     borderopacity="0.81568627"
+     bordercolor="#666666"
+     pagecolor="#ffffff"
+     id="base"
+     gridempspacing="4" />
+  <metadata
+     id="metadata4">
+    <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>Workgroup</dc:title>
+        <dc:creator>
+          <cc:Agent>
+            <dc:title>Jakub Steiner</dc:title>
+          </cc:Agent>
+        </dc:creator>
+        <dc:source>http://jimmac.musichall.cz</dc:source>
+        <cc:license
+           rdf:resource="http://creativecommons.org/licenses/by/2.0/" />
+        <dc:subject>
+          <rdf:Bag>
+            <rdf:li>lan</rdf:li>
+            <rdf:li>workgroup</rdf:li>
+            <rdf:li>network</rdf:li>
+            <rdf:li>peer</rdf:li>
+          </rdf:Bag>
+        </dc:subject>
+        <dc:contributor>
+          <cc:Agent>
+            <dc:title>Garrett LeSage</dc:title>
+          </cc:Agent>
+        </dc:contributor>
+      </cc:Work>
+      <cc:License
+         rdf:about="http://creativecommons.org/licenses/by/2.0/">
+        <cc:permits
+           rdf:resource="http://web.resource.org/cc/Reproduction" />
+        <cc:permits
+           rdf:resource="http://web.resource.org/cc/Distribution" />
+        <cc:requires
+           rdf:resource="http://web.resource.org/cc/Notice" />
+        <cc:requires
+           rdf:resource="http://web.resource.org/cc/Attribution" />
+        <cc:permits
+           rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
+        <cc:requires
+           rdf:resource="http://web.resource.org/cc/ShareAlike" />
+      </cc:License>
+    </rdf:RDF>
+  </metadata>
+  <path
+     transform="matrix(0.994775,0,0,0.504437,2.062737,21.5656)"
+     d="M 37.88072 38.7066 A 14.34417 5.656854 0 1 0 9.192389 38.7066 A 14.34417 5.656854 0 1 0  37.88072 38.7066 z"
+     sodipodi:ry="5.6568542"
+     sodipodi:rx="14.344166"
+     sodipodi:cy="38.706596"
+     sodipodi:cx="23.536554"
+     id="path4244"
+     style="font-size:12;opacity:0.4;color:#000000;fill-opacity:0.0368;fill-rule:evenodd;stroke-dashoffset:0;"
+     sodipodi:type="arc"
+     inkscape:r_cx="true"
+     inkscape:r_cy="true" />
+  <rect
+     style="font-size:12;color:#000000;fill-opacity:0.0368;fill-rule:evenodd;stroke:#5e5e5e;stroke-width:1.836665;stroke-dashoffset:0;"
+     id="rect6216"
+     width="31.9577503"
+     height="6.57723284"
+     x="14.9798265"
+     y="34.610033"
+     rx="2.23386907"
+     ry="2.06891823"
+     inkscape:r_cx="true"
+     inkscape:r_cy="true" />
+  <rect
+     ry="4.22821856"
+     rx="4.56532911"
+     y="6.65627432"
+     x="14.9798265"
+     height="27.7626915"
+     width="31.9577503"
+     id="rect6218"
+     style="font-size:12;color:#000000;fill-opacity:0.0368;fill-rule:evenodd;stroke:#5e5e5e;stroke-width:1.836665;stroke-dashoffset:0;"
+     inkscape:r_cx="true"
+     inkscape:r_cy="true" />
+  <rect
+     ry="0.93960613"
+     rx="1.01451695"
+     y="10.8743858"
+     x="19.418328"
+     height="18.0874271"
+     width="24.8556874"
+     id="rect6220"
+     style="font-size:12;opacity:0.662857;color:#000000;fill-opacity:0.0368;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.708601;stroke-dashoffset:0;"
+     inkscape:r_cx="true"
+     inkscape:r_cy="true" />
+  <rect
+     style="font-size:12;color:#000000;fill:#ffffff;fill-rule:evenodd;stroke:#5e5e5e;stroke-width:1.836665;stroke-dashoffset:0;font-family:Bitstream Vera Sans;"
+     id="rect6222"
+     width="24.8556874"
+     height="18.0874271"
+     x="18.5306389"
+     y="9.94545269"
+     rx="1.01451695"
+     ry="0.93960625"
+     inkscape:r_cx="true"
+     inkscape:r_cy="true" />
+  <path
+     inkscape:r_cy="true"
+     inkscape:r_cx="true"
+     sodipodi:nodetypes="ccccccc"
+     id="path3626"
+     d="M 5.501559 32.19438 L 14.09312 32.2397 L 14.13029 28.09275 L 5.486979 28.04718 L 4.393265 28.8044 L 4.369441 31.46357 L 5.501559 32.19438 z "
+     style="font-size:12;fill-opacity:0;fill-rule:evenodd;stroke:#5e5e5e;stroke-width:0.974231;stroke-linecap:round;stroke-linejoin:round;" />
+  <rect
+     inkscape:r_cy="true"
+     inkscape:r_cx="true"
+     style="font-size:12;opacity:0.2;color:#000000;fill-opacity:0.0368;fill-rule:evenodd;stroke-dashoffset:0;"
+     id="rect4357"
+     width="1.81095675"
+     height="11.3847269"
+     x="11.8748981"
+     y="32.5087579"
+     transform="matrix(0.999981,6.17421e-3,-7.655214e-3,0.999971,0,0)" />
+  <path
+     sodipodi:type="spiral"
+     style="font-size:12;fill:none;fill-rule:evenodd;stroke:#000000;stroke-opacity:0.1618;stroke-width:0.5198;stroke-dasharray:none;"
+     id="path914"
+     sodipodi:cx="2.61538482"
+     sodipodi:cy="13.8461494"
+     sodipodi:expansion="1"
+     sodipodi:radius="4.40817022"
+     sodipodi:argument="-18.3390675"
+     sodipodi:t0="0"
+     d="M 2.615385 13.84615 C 2.766369 13.9826 2.600902 14.15861 2.435898 14.16666 C 2.087394 14.18367 1.91242 13.78183 1.974359 13.48717 C 2.083986 12.96567 2.678387 12.73503 3.153847 12.88461 C 3.847221 13.10275 4.139604 13.91138 3.897436 14.5641 C 3.576101 15.4302 2.546791 15.7855 1.717948 15.44871 C 0.67854 15.02637 0.259858 13.77368 0.692307 12.76923 C 1.214578 11.55615 2.692022 11.07385 3.871796 11.60256 C 5.258776 12.22413 5.804839 13.92713 5.179488 15.28205 C 4.459004 16.84309 2.529944 17.45301 0.999999 16.73077 C -0.735208 15.91162 -1.409055 13.75616 -0.589744 12.05128 C 0.327875 10.14182 2.709978 9.404 4.589745 10.32051 C 6.673504 11.33647 7.47534 13.9454 6.46154 16 "
+     transform="matrix(1.519545,0,0,1.415876,2.298103,3.983214)"
+     sodipodi:revolution="4" />
+  <text
+     style="fill:#000000;stroke:none;font-family:DejaVu Serif;font-style:italic;font-weight:normal;font-size:6;fill-opacity:0.3456;stroke-opacity:1;stroke-width:1pt;stroke-linejoin:miter;stroke-linecap:butt;text-anchor:middle;writing-mode:lr;"
+     x="23.7343745"
+     y="15.8241341"
+     id="text763"
+     sodipodi:linespacing="100%"
+     xml:space="default"
+     transform="scale(1.298271,0.989396)">
+    <tspan
+       x="23.734375"
+       y="15.8241339"
+       sodipodi:role="line"
+       id="tspan826"
+       style="fill:#000000;fill-opacity:0.3456;">www</tspan>
+  </text>
+</svg>
diff --git a/extensions/cpsection/modemconfiguration/__init__.py b/extensions/cpsection/modemconfiguration/__init__.py
new file mode 100644
index 0000000..b0703e2
--- /dev/null
+++ b/extensions/cpsection/modemconfiguration/__init__.py
@@ -0,0 +1,22 @@
+# Copyright (C) 2009 Martin Abente
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  US
+
+from gettext import gettext as _
+
+CLASS = 'ModemConfiguration'
+ICON = 'module-modemconfiguration'
+TITLE = _('Modem Configuration')
+
diff --git a/extensions/cpsection/modemconfiguration/model.py b/extensions/cpsection/modemconfiguration/model.py
new file mode 100644
index 0000000..d06db75
--- /dev/null
+++ b/extensions/cpsection/modemconfiguration/model.py
@@ -0,0 +1,43 @@
+# Copyright (C) 2009 Martin Abente
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  US
+
+from jarabe.model.network import StorageGsm
+
+storage = StorageGsm()
+
+def get_username(): 
+    return storage.get_username()
+
+def get_password():
+    return storage.get_password()
+
+def get_number():
+    return storage.get_number()
+
+def get_apn():
+    return storage.get_apn()
+
+def set_username(username):
+    storage.set_username(username)
+
+def set_password(password):
+    storage.set_password(password)
+
+def set_number(number):
+    storage.set_number(number)
+
+def set_apn(apn):
+    storage.set_apn(apn)
diff --git a/extensions/cpsection/modemconfiguration/view.py b/extensions/cpsection/modemconfiguration/view.py
new file mode 100644
index 0000000..3033463
--- /dev/null
+++ b/extensions/cpsection/modemconfiguration/view.py
@@ -0,0 +1,142 @@
+# Copyright (C) 2009 Martin Abente
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  US
+
+import os
+import logging
+from gettext import gettext as _
+
+import gtk
+import gobject
+
+from sugar.graphics import style
+
+from jarabe.controlpanel.sectionview import SectionView
+
+APPLY_TIMEOUT = 1000
+
+_LABEL = 0
+_MODEL_GET = 1
+_MODEL_SET = 2
+
+_ATTRIBUTES = {
+    'username'  : [_('Username'), 'get_username', 'set_username'],
+    'password'  : [_('Password'), 'get_password', 'set_password'],
+    'number'    : [_('Number'), 'get_number', 'set_number'],
+    'apn'       : [_('Apn'), 'get_apn', 'set_apn']
+}
+
+class MyEntry(gtk.Entry):
+    def __init__(self, model, attr_name):
+        gtk.Entry.__init__(self, 25)
+
+        self.sid = 0
+        self.is_valid = True
+        self.get_method = getattr(model, _ATTRIBUTES[attr_name][_MODEL_GET])
+        self.set_method = getattr(model, _ATTRIBUTES[attr_name][_MODEL_SET])
+        self.set_width_chars(25)
+
+class ModemConfiguration(SectionView):
+    def __init__(self, model, alerts=None):
+        SectionView.__init__(self)
+
+        self._model = model
+        self.restart_alerts = alerts
+        self._username_sid = 0
+        self._username_valid = True
+        self._password_valid = True
+        self._number_valid = True
+        self._apn_valid = True
+
+        self.set_border_width(style.DEFAULT_SPACING)
+        self.set_spacing(style.DEFAULT_SPACING)
+        self._group = gtk.SizeGroup(gtk.SIZE_GROUP_HORIZONTAL)
+
+        self._username_entry = self._setup_field("username")
+        self._password_entry = self._setup_field('password')
+        self._number_entry = self._setup_field('number')
+        self._apn_entry = self._setup_field('apn')
+
+        self.setup()
+
+    def _setup_field(self, attr_name):
+        box = gtk.HBox(spacing=style.DEFAULT_SPACING)
+      
+        label = gtk.Label(_ATTRIBUTES[attr_name][_LABEL] + ':')
+        label.modify_fg(gtk.STATE_NORMAL, style.COLOR_SELECTION_GREY.get_gdk_color())
+        box.pack_start(label)
+         
+        entry = MyEntry(self._model, attr_name)
+        box.pack_start(entry, False)
+        box.show_all()
+
+        self.pack_start(box, False)
+        return entry
+
+    def setup(self):
+        self._username_entry.set_text(self._model.get_username())
+        self._password_entry.set_text(self._model.get_password())
+        self._number_entry.set_text(self._model.get_number())
+        self._apn_entry.set_text(self._model.get_apn())
+
+        self._username_valid = True
+        self._password_valid = True
+        self._number_valid = True
+        self._apn_valid = True
+        self.needs_restart = False
+
+        self._username_change_handler = self._username_entry.connect( \
+                'changed', self.__changed_cb)
+        self._password_change_handler = self._password_entry.connect( \
+                'changed', self.__changed_cb)
+        self._number_change_handler = self._number_entry.connect( \
+                'changed', self.__changed_cb)
+        self._apn_change_handler = self._apn_entry.connect( \
+                'changed', self.__changed_cb)
+
+    def undo(self):
+        self._username_entry.disconnect(self._username_change_handler)
+        self._password_entry.disconnect(self._password_change_handler)
+        self._number_entry.disconnect(self._number_change_handler)
+        self._apn_entry.disconnect(self._apn_change_handler)
+        self._model.undo()
+
+    def _validate(self):
+        if self._username_entry._is_valid and self._password_entry._is_valid and self._number_entry._is_valid and self._apn_entry._is_valid:
+            self.props.is_valid = True
+        else:
+            self.props.is_valid = False
+
+    def __changed_cb(self, widget, data=None):
+        if widget.sid:
+            gobject.source_remove(widget.sid)
+        widget.sid = gobject.timeout_add(APPLY_TIMEOUT, 
+                                             self.__timeout_cb, widget)
+
+    def __timeout_cb(self, widget):
+        widget.sid = 0
+
+        if widget.get_text() == widget.get_method():
+            return False
+        try:
+            widget.set_method(widget.get_text())
+        except ValueError, detail:
+            widget.is_valid = False            
+        else:
+            widget.is_valid = True 
+            self.needs_restart = True
+        self._validate()
+        return False
+
diff --git a/extensions/deviceicon/network.py b/extensions/deviceicon/network.py
index dd1a70c..3a9b27f 100644
--- a/extensions/deviceicon/network.py
+++ b/extensions/deviceicon/network.py
@@ -1,6 +1,6 @@
 #
 # Copyright (C) 2008 One Laptop Per Child
-# Copyright (C) 2009 Tomeu Vizoso, Simon Schampijer
+# Copyright (C) 2009 Tomeu Vizoso, Simon Schampijer, Martin Abente
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -63,6 +63,22 @@ _NM_DEVICE_STATE_IP_CONFIG = 7
 _NM_DEVICE_STATE_ACTIVATED = 8
 _NM_DEVICE_STATE_FAILED = 9
 
+_GSM_STATE_NOT_READY = 0
+_GSM_STATE_DISCONNECTED = 1
+_GSM_STATE_CONNECTING = 2
+_GSM_STATE_CONNECTED = 3
+
+_GSM_SIGNAL = 0
+_GSM_LABEL = 1
+_GSM_TEXT = 2
+
+_GSM_STATES = {
+    _GSM_STATE_NOT_READY : ['gsm-idle', '...', _('Please wait...')],
+    _GSM_STATE_DISCONNECTED : ['gsm-connect', _('Connect'), _('Disconnected')],
+    _GSM_STATE_CONNECTING : ['gsm-disconnect', _('Cancel'), _('Connecting...')],
+    _GSM_STATE_CONNECTED : ['gsm-disconnect', _('Disconnect'), _('Connected')]
+}
+
 def frequency_to_channel(frequency):
     ftoc = { 2412: 1, 2417: 2, 2422: 3, 2427: 4,
              2432: 5, 2437: 6, 2442: 7, 2447: 8,
@@ -201,6 +217,38 @@ class WiredPalette(Palette):
             ip_address_text = ""
         self._ip_address_label.set_text(ip_address_text)
 
+class GsmPalette(Palette):
+    __gtype_name__ = 'SugarGsmPalette'
+
+    __gsignals__ = {
+        'gsm-connect'         : (gobject.SIGNAL_RUN_FIRST,
+                                   gobject.TYPE_NONE, ([])),
+        'gsm-disconnect'      : (gobject.SIGNAL_RUN_FIRST,
+                                   gobject.TYPE_NONE, ([])),
+        'gsm-idle'         : (gobject.SIGNAL_RUN_FIRST,
+                                   gobject.TYPE_NONE, ([])),
+    }
+
+    def __init__(self):
+        Palette.__init__(self, label=_('GSM Device'))
+
+        self._current_signal = _GSM_STATES[_GSM_STATE_NOT_READY][_GSM_SIGNAL]
+        self._toggle_state_item = gtk.MenuItem(_GSM_STATES[_GSM_STATE_NOT_READY][_GSM_LABEL])
+        self._toggle_state_item.connect('activate', self._toggle_state_cb)
+        self.menu.append(self._toggle_state_item)
+        self._toggle_state_item.show()
+
+        self.props.secondary_text = _GSM_STATES[_GSM_STATE_NOT_READY][_GSM_TEXT]
+
+    def set_state(self, state):
+
+        if state in _GSM_STATES:
+            self._current_signal = _GSM_STATES[state][_GSM_SIGNAL]
+            self._toggle_state_item.get_child().set_label(_GSM_STATES[state][_GSM_LABEL])
+            self.props.secondary_text = _GSM_STATES[state][_GSM_TEXT]
+
+    def _toggle_state_cb(self, menuitem):
+        self.emit(self._current_signal)
 
 class WirelessDeviceView(ToolButton):
 
@@ -414,11 +462,11 @@ class WirelessDeviceView(ToolButton):
         color = client.get_string('/desktop/sugar/user/color')
         connection_name = _('%s\'s network %s') % (nick, color)
 
-        connection = network.find_connection(connection_name)
+        connection = network.find_connection_by_ssid(connection_name)
         if connection is None:
             settings = Settings()
             settings.connection.id = 'Auto ' + connection_name
-            settings.connection.uuid = unique_id()
+            uuid = settings.connection.uuid = unique_id()
             settings.connection.type = '802-11-wireless'
             settings.wireless.ssid = dbus.ByteArray(connection_name)
             settings.wireless.band = 'bg'
@@ -426,7 +474,7 @@ class WirelessDeviceView(ToolButton):
             settings.ip4_config = IP4Config()
             settings.ip4_config.method = 'link-local'
 
-            connection = network.add_connection(connection_name, settings)
+            connection = network.add_connection(uuid, settings)
 
         obj = self._bus.get_object(_NM_SERVICE, _NM_PATH)
         netmgr = dbus.Interface(obj, _NM_IFACE)
@@ -461,6 +509,103 @@ class WiredDeviceView(TrayIcon):
         self._palette.set_group_id('frame')
         self._palette.set_connected(speed, address)
 
+class GsmDeviceView(TrayIcon):
+
+    _ICON_NAME = 'gsm-device'
+    FRAME_POSITION_RELATIVE = 303
+
+    def __init__(self, device):
+        client = gconf.client_get_default()
+        color = xocolor.XoColor(client.get_string('/desktop/sugar/user/color'))
+
+        TrayIcon.__init__(self, icon_name=self._ICON_NAME, xo_color=color)
+
+        self._bus = dbus.SystemBus()
+        self._device = device
+
+        self.set_palette_invoker(FrameWidgetInvoker(self))
+        self._palette = GsmPalette()
+        self.set_palette(self._palette)
+        self._palette.set_group_id('frame')
+
+        props = dbus.Interface(self._device, 'org.freedesktop.DBus.Properties')
+        props.GetAll(_NM_DEVICE_IFACE, byte_arrays=True,
+                     reply_handler=self.__current_state_check_cb,
+                     error_handler=self.__current_state_check_error_cb)
+
+        self._palette.connect('gsm-connect', self.__gsm_connect_cb)
+        self._palette.connect('gsm-disconnect', self.__gsm_disconnect_cb)
+        self._palette.connect('gsm-idle', self.__gsm_idle_cb)
+
+        self._bus.add_signal_receiver(self.__state_changed_cb,
+                                      signal_name='StateChanged',
+                                      path=self._device.object_path,
+                                      dbus_interface=_NM_DEVICE_IFACE)
+
+    def __gsm_connect_cb(self, palette, data=None):
+
+        try:
+            connection = network.find_gsm_connection()
+            if connection is not None:
+                obj = self._bus.get_object(_NM_SERVICE, _NM_PATH)
+                netmgr = dbus.Interface(obj, _NM_IFACE)
+
+                netmgr.ActivateConnection(network.SETTINGS_SERVICE,
+                                          connection.path,
+                                          self._device.object_path,
+                                          '/')
+        except Exception, detail:
+            logging.error('Could not connect to gsm connection, %s', detail)
+
+    def __gsm_disconnect_cb(self, palette, data=None):
+
+        obj = self._bus.get_object(_NM_SERVICE, _NM_PATH)
+        netmgr = dbus.Interface(obj, _NM_IFACE)
+        netmgr_props = dbus.Interface(netmgr, 'org.freedesktop.DBus.Properties')
+        active_connections_o = netmgr_props.Get(_NM_IFACE, 'ActiveConnections')
+
+        for conn_o in active_connections_o:
+            obj = self._bus.get_object(_NM_IFACE, conn_o)
+            props = dbus.Interface(obj, 'org.freedesktop.DBus.Properties')
+            devices = props.Get(_NM_ACTIVE_CONN_IFACE, 'Devices')
+            if self._device.object_path in devices:
+                netmgr.DeactivateConnection(conn_o)
+                break
+
+    def __gsm_idle_cb(self, palette, data=None):
+        pass
+
+    def __state_changed_cb(self, new_state, old_state, reason):
+        self.__update_state(int(new_state))
+
+    def __current_state_check_cb(self, properties):
+        self.__update_state(int(properties['State']))
+
+    def __current_state_check_error_cb(self, err):
+        logging.error('Error getting gsm state %', err)
+
+    def __update_state(self, state):
+        gsm_state = None
+
+        if state is network.DEVICE_STATE_ACTIVATED:
+            gsm_state = _GSM_STATE_CONNECTED
+
+        elif state is network.DEVICE_STATE_DISCONNECTED:
+            gsm_state = _GSM_STATE_DISCONNECTED
+
+        elif state in [network.DEVICE_STATE_UNMANAGED, _NM_DEVICE_STATE_UNAVAILABLE, _NM_DEVICE_STATE_UNKNOWN]:
+            gsm_state = _GSM_STATE_NOT_READY
+
+        elif state in [_NM_DEVICE_STATE_PREPARE, _NM_DEVICE_STATE_CONFIG, _NM_DEVICE_STATE_IP_CONFIG]:
+            gsm_state = _GSM_STATE_CONNECTING
+
+        self._palette.set_state(gsm_state)
+
+    def disconnect(self):
+        self._bus.remove_signal_receiver(self.__state_changed_cb,
+                                         signal_name='StateChanged',
+                                         path=self._device.object_path,
+                                         dbus_interface=_NM_DEVICE_IFACE)
 
 class WirelessDeviceObserver(object):
     def __init__(self, device, tray):
@@ -526,6 +671,20 @@ class WiredDeviceObserver(object):
                 del self._device_view
                 self._device_view = None
 
+class GsmDeviceObserver(object):
+    def __init__(self, device, tray):
+        self._device = device
+        self._device_view = None
+        self._tray = tray
+
+        self._device_view = GsmDeviceView(device)
+        self._tray.add_device(self._device_view)
+
+    def disconnect(self):
+        self._device_view.disconnect()
+        self._tray.remove_device(self._device_view)
+        del self._device_view
+        self._device_view = None
 
 class NetworkManagerObserver(object):
     def __init__(self, tray):
@@ -569,6 +728,9 @@ class NetworkManagerObserver(object):
         elif device_type == network.DEVICE_TYPE_802_11_WIRELESS:
             device = WirelessDeviceObserver(nm_device, self._tray)
             self._devices[device_op] = device
+        elif device_type == network.DEVICE_TYPE_GSM_MODEM:
+            device = GsmDeviceObserver(nm_device, self._tray)
+            self._devices[device_op] = device
 
     def __device_added_cb(self, device_op):
         self._check_device(device_op)
diff --git a/src/jarabe/desktop/meshbox.py b/src/jarabe/desktop/meshbox.py
index 2c58fe6..8d953a0 100644
--- a/src/jarabe/desktop/meshbox.py
+++ b/src/jarabe/desktop/meshbox.py
@@ -111,7 +111,7 @@ class WirelessNetworkView(CanvasPulsingIcon):
         self.set_palette(self._palette)
         self._palette_icon.props.xo_color = self._color
 
-        if network.find_connection(self._name) is not None:
+        if network.find_connection_by_ssid(self._name) is not None:
             self.props.badge_name = "emblem-favorite"
             self._palette_icon.props.badge_name = "emblem-favorite"
         elif initial_ap.flags == network.NM_802_11_AP_FLAGS_PRIVACY:
@@ -213,7 +213,7 @@ class WirelessNetworkView(CanvasPulsingIcon):
             state = network.DEVICE_STATE_UNKNOWN
 
         if state == network.DEVICE_STATE_ACTIVATED:
-            connection = network.find_connection(self._name)
+            connection = network.find_connection_by_ssid(self._name)
             if connection:
                 if self._mode == network.NM_802_11_MODE_INFRA:
                     connection.set_connected()
@@ -330,11 +330,11 @@ class WirelessNetworkView(CanvasPulsingIcon):
         self._connect()
 
     def _connect(self):
-        connection = network.find_connection(self._name)
+        connection = network.find_connection_by_ssid(self._name)
         if connection is None:
             settings = Settings()
             settings.connection.id = 'Auto ' + self._name
-            settings.connection.uuid = unique_id()
+            uuid = settings.connection.uuid = unique_id()
             settings.connection.type = '802-11-wireless'
             settings.wireless.ssid = self._name
 
@@ -352,7 +352,7 @@ class WirelessNetworkView(CanvasPulsingIcon):
             if wireless_security is not None:
                 settings.wireless.security = '802-11-wireless-security'
 
-            connection = network.add_connection(self._name, settings)
+            connection = network.add_connection(uuid, settings)
 
         obj = self._bus.get_object(_NM_SERVICE, _NM_PATH)
         netmgr = dbus.Interface(obj, _NM_IFACE)
diff --git a/src/jarabe/model/network.py b/src/jarabe/model/network.py
index 10b73ab..00031ce 100644
--- a/src/jarabe/model/network.py
+++ b/src/jarabe/model/network.py
@@ -1,5 +1,5 @@
 # Copyright (C) 2008 Red Hat, Inc.
-# Copyright (C) 2009 Tomeu Vizoso, Simon Schampijer
+# Copyright (C) 2009 Tomeu Vizoso, Simon Schampijer, Martin Abente
 # Copyright (C) 2009 One Laptop per Child
 #
 # This program is free software; you can redistribute it and/or modify
@@ -23,12 +23,15 @@ import time
 import dbus
 import gobject
 import ConfigParser
+import gconf
 
 from sugar import dispatch
 from sugar import env
+from sugar.util import unique_id
 
 DEVICE_TYPE_802_3_ETHERNET = 1
 DEVICE_TYPE_802_11_WIRELESS = 2
+DEVICE_TYPE_GSM_MODEM = 3
 
 DEVICE_STATE_UNKNOWN = 0
 DEVICE_STATE_UNMANAGED = 1
@@ -41,6 +44,9 @@ DEVICE_STATE_IP_CONFIG = 7
 DEVICE_STATE_ACTIVATED = 8
 DEVICE_STATE_FAILED = 9
 
+NM_CONNECTION_TYPE_802_11_WIRELESS = '802-11-wireless'
+NM_CONNECTION_TYPE_GSM = 'gsm'
+
 NM_ACTIVE_CONNECTION_STATE_UNKNOWN = 0
 NM_ACTIVE_CONNECTION_STATE_ACTIVATING = 1
 NM_ACTIVE_CONNECTION_STATE_ACTIVATED = 2
@@ -80,6 +86,11 @@ NM_CONNECTION_IFACE = 'org.freedesktop.NetworkManagerSettings.Connection'
 NM_SECRETS_IFACE = 'org.freedesktop.NetworkManagerSettings.Connection.Secrets'
 NM_ACCESSPOINT_IFACE = 'org.freedesktop.NetworkManager.AccessPoint'
 
+GSM_USERNAME_PATH = '/sugar/nm/gsm/username'
+GSM_PASSWORD_PATH = '/sugar/nm/gsm/password'
+GSM_NUMBER_PATH = '/sugar/nm/gsm/number'
+GSM_APN_PATH = '/sugar/nm/gsm/apn'
+
 _nm_settings = None
 _conn_counter = 0
 
@@ -146,6 +157,44 @@ class IP4Config(object):
             ip4_config['method'] = self.method
         return ip4_config
 
+class Serial(object):
+    def __init__(self):
+        self.baud = None
+
+    def get_dict(self):
+        serial = {}
+
+        if self.baud is not None:
+            serial['baud'] = self.baud
+
+        return serial
+
+class Ppp(object):
+    def __init__(self):
+        pass
+
+    def get_dict(self):
+      ppp = {}
+      return ppp
+
+class Gsm(object):
+    def __init__(self):
+        self.apn = None
+        self.number = None
+        self.username = None
+
+    def get_dict(self):
+        gsm = {}
+
+        if self.apn is not None:
+            gsm['apn'] = self.apn
+        if self.number is not None:
+            gsm['number'] = self.number
+        if self.username is not None:
+            gsm['username'] = self.username
+
+        return gsm
+
 class Settings(object):
     def __init__(self):
         self.connection = Connection()
@@ -189,6 +238,35 @@ class Secrets(object):
 
         return settings
 
+class SettingsGsm(object):
+    def __init__(self):
+        self.connection = Connection()
+        self.ip4_config = IP4Config()
+        self.serial = Serial()
+        self.ppp = Ppp()
+        self.gsm = Gsm()
+
+    def get_dict(self):
+        settings = {}
+
+        settings['connection'] = self.connection.get_dict()
+        settings['serial'] = self.serial.get_dict()
+        settings['ppp'] = self.ppp.get_dict()
+        settings['gsm'] = self.gsm.get_dict()
+        settings['ipv4'] = self.ip4_config.get_dict()
+
+        return settings
+
+class SecretsGsm(object):
+    def __init__(self):
+        self.password = None
+
+    def get_dict(self):
+        secrets = {}
+        if self.password is not None:
+            secrets['password'] = self.password
+        return { 'gsm' : secrets }
+
 class NMSettings(dbus.service.Object):
     def __init__(self):
         bus = dbus.SystemBus()
@@ -207,8 +285,8 @@ class NMSettings(dbus.service.Object):
     def NewConnection(self, connection_path):
         pass
 
-    def add_connection(self, ssid, conn):
-        self.connections[ssid] = conn
+    def add_connection(self, uuid, conn):
+        self.connections[uuid] = conn
         conn.secrets_request.connect(self.__secrets_request_cb)
         self.NewConnection(conn.path)
 
@@ -248,11 +326,13 @@ class NMSettingsConnection(dbus.service.Object):
         if not self._settings.connection.autoconnect:
             self._settings.connection.autoconnect = True
             self._settings.connection.timestamp = int(time.time())
-            self.save()
+            if self._settings.connection.type == NM_CONNECTION_TYPE_802_11_WIRELESS:
+                self.save()
 
     def set_secrets(self, secrets):
         self._secrets = secrets
-        self.save()
+        if self._settings.connection.type == NM_CONNECTION_TYPE_802_11_WIRELESS:
+            self.save()
 
     def get_settings(self):
         return self._settings
@@ -441,6 +521,38 @@ class AccessPoint(gobject.GObject):
                                          path=self.model.object_path,
                                          dbus_interface=NM_ACCESSPOINT_IFACE)
 
+class StorageGsm(object):
+    def __init__(self):
+        self.client = gconf.client_get_default()
+
+    def get_username(self): 
+        return self.verified(self.client.get_string(GSM_USERNAME_PATH))
+
+    def get_password(self): 
+        return self.verified(self.client.get_string(GSM_PASSWORD_PATH))
+
+    def get_number(self): 
+        return self.verified(self.client.get_string(GSM_NUMBER_PATH))
+
+    def get_apn(self): 
+        return self.verified(self.client.get_string(GSM_APN_PATH))
+
+    def set_username(self, username):
+        self.client.set_string(GSM_USERNAME_PATH, username)
+
+    def set_password(self, password):
+        self.client.set_string(GSM_PASSWORD_PATH, password)
+
+    def set_number(self, number):
+        self.client.set_string(GSM_NUMBER_PATH, number)
+
+    def set_apn(self, apn):
+        self.client.set_string(GSM_APN_PATH, apn)
+
+    def verified(self, value):
+        if value is None:
+            return ''
+        return value
 
 def get_settings():
     global _nm_settings
@@ -452,24 +564,28 @@ def get_settings():
         load_connections()
     return _nm_settings
 
-def find_connection(ssid):
+def find_connection_by_ssid(ssid):
     connections = get_settings().connections
-    if ssid in connections:
-        return connections[ssid]
-    else:
-        return None
 
-def add_connection(ssid, settings, secrets=None):
+    for conn_index in connections:
+        connection = connections[conn_index]
+        if connection._settings.connection.type == NM_CONNECTION_TYPE_802_11_WIRELESS:
+            if connection._settings.wireless.ssid == ssid:
+                return connection
+
+    return None
+
+def add_connection(uuid, settings, secrets=None):
     global _conn_counter
 
     path = NM_SETTINGS_PATH + '/' + str(_conn_counter)
     _conn_counter += 1
 
     conn = NMSettingsConnection(path, settings, secrets)
-    _nm_settings.add_connection(ssid, conn)
+    _nm_settings.add_connection(uuid, conn)
     return conn
 
-def load_connections():
+def load_wifi_connections():
     profile_path = env.get_profile_path()
     config_path = os.path.join(profile_path, 'nm', 'connections.cfg')
 
@@ -534,4 +650,49 @@ def load_connections():
         except ConfigParser.Error:
             logging.exception('Error reading section')
         else:
-            add_connection(ssid, settings, secrets)
+            add_connection(uuid, settings, secrets)
+
+def load_gsm_connection():
+    storage = StorageGsm()       
+    settings = SettingsGsm()
+    secrets = SecretsGsm()
+
+    try:
+        settings.gsm.username = storage.get_username()
+        settings.gsm.number = storage.get_number()
+        settings.gsm.apn = storage.get_apn()
+        password = storage.get_password()
+
+    except ValueError:
+        logging.error("While loading gsm connection from settings")
+
+    else:
+        if password != '':
+            secrets.password = password
+
+        settings.connection.id = 'gsm'
+        settings.connection.type = NM_CONNECTION_TYPE_GSM
+        uuid = settings.connection.uuid = unique_id()
+        settings.connection.autoconnect = False
+        settings.ip4_config.method = 'auto'
+        settings.serial.baud = 115200
+
+        try:
+            add_connection(uuid, settings, secrets)
+        except Exception:
+            logging.error("While adding the gsm connection")
+        
+
+def load_connections():
+    load_wifi_connections()
+    load_gsm_connection()
+
+def find_gsm_connection():
+    connections = get_settings().connections
+
+    for conn_index in connections:
+        connection = connections[conn_index]
+        if connection._settings.connection.type == NM_CONNECTION_TYPE_GSM:
+            return connection
+
+    return None
-- 
1.6.0.4

